claude-mux 0.30.13 → 0.30.14
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.
- package/CLAUDE.md +14 -3
- package/dist/fleet-places.d.ts +7 -1
- package/dist/fleet-places.d.ts.map +1 -1
- package/dist/fleet-places.js +14 -1
- package/dist/fleet-places.js.map +1 -1
- package/dist/server/dictation-marks.d.ts.map +1 -1
- package/dist/server/dictation-marks.js +23 -1
- package/dist/server/dictation-marks.js.map +1 -1
- package/dist/transcript/parser.d.ts +7 -0
- package/dist/transcript/parser.d.ts.map +1 -1
- package/dist/transcript/parser.js +19 -3
- package/dist/transcript/parser.js.map +1 -1
- package/dist/transcript/past-sessions.d.ts.map +1 -1
- package/dist/transcript/past-sessions.js +4 -1
- package/dist/transcript/past-sessions.js.map +1 -1
- package/dist/utils/version.d.ts +1 -1
- package/dist/utils/version.js +1 -1
- package/dist/web/client/_app/immutable/chunks/{sULMfRFG.js → B4FaHfAQ.js} +2 -2
- package/dist/web/client/_app/immutable/chunks/{sULMfRFG.js.map → B4FaHfAQ.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{W5_HMZ5E.js → B5Hkb2u5.js} +2 -2
- package/dist/web/client/_app/immutable/chunks/{W5_HMZ5E.js.map → B5Hkb2u5.js.map} +1 -1
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/BQzv8cqz.js → dist/web/client/_app/immutable/chunks/BOpEbBRb.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/BQzv8cqz.js.map → dist/web/client/_app/immutable/chunks/BOpEbBRb.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{Q5yhzux8.js → BeYjnogg.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/Q5yhzux8.js.map → dist/web/client/_app/immutable/chunks/BeYjnogg.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{VceCNUd7.js → C00rm3mY.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/VceCNUd7.js.map → dist/web/client/_app/immutable/chunks/C00rm3mY.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{CtjkAirr.js → CKg7gbPm.js} +9 -9
- package/dist/web/client/_app/immutable/chunks/CKg7gbPm.js.map +1 -0
- package/dist/web/client/_app/immutable/chunks/CPEphjdk.js +4 -0
- package/dist/web/client/_app/immutable/chunks/CPEphjdk.js.map +1 -0
- package/dist/web/client/_app/immutable/chunks/{BQQ3-rqs.js → CPlFo88J.js} +2 -2
- package/dist/web/client/_app/immutable/chunks/{BQQ3-rqs.js.map → CPlFo88J.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{BvX4FYxp.js → CtnjySwS.js} +2 -2
- package/dist/web/client/_app/immutable/chunks/{BvX4FYxp.js.map → CtnjySwS.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{XgSsj0QY.js → D3EW0jRH.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/XgSsj0QY.js.map → dist/web/client/_app/immutable/chunks/D3EW0jRH.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{CtlIfY1C.js → D3umr-Qr.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/CtlIfY1C.js.map → dist/web/client/_app/immutable/chunks/D3umr-Qr.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{CM0CI9GL.js → D8-_Y-M6.js} +3 -3
- package/dist/web/client/_app/immutable/chunks/{CM0CI9GL.js.map → D8-_Y-M6.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{cvsGFvDx.js → DDvK7Qo9.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/cvsGFvDx.js.map → dist/web/client/_app/immutable/chunks/DDvK7Qo9.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{CiU8KBun.js → _VFi-7U7.js} +2 -2
- package/dist/web/client/_app/immutable/chunks/{CiU8KBun.js.map → _VFi-7U7.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{DlENCZqZ.js → mQ6hkLuy.js} +2 -2
- package/dist/web/client/_app/immutable/chunks/{DlENCZqZ.js.map → mQ6hkLuy.js.map} +1 -1
- package/dist/web/client/_app/immutable/entry/{app.BwTbN8wB.js → app.CTFza_OS.js} +3 -3
- package/{web/.svelte-kit/output/client/_app/immutable/entry/app.BwTbN8wB.js.map → dist/web/client/_app/immutable/entry/app.CTFza_OS.js.map} +1 -1
- package/dist/web/client/_app/immutable/entry/start.B-zlkyrt.js +2 -0
- package/dist/web/client/_app/immutable/entry/start.B-zlkyrt.js.map +1 -0
- package/{web/.svelte-kit/output/client/_app/immutable/nodes/0.BnHV-ElR.js → dist/web/client/_app/immutable/nodes/0.Cztuq8Ih.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{0.BnHV-ElR.js.map → 0.Cztuq8Ih.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{1.Dc3ryOCf.js → 1.BOOL0V7K.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{1.Dc3ryOCf.js.map → 1.BOOL0V7K.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{2.DUrpAceY.js → 2.CArUpZNe.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{2.DUrpAceY.js.map → 2.CArUpZNe.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{3.BaCofjAn.js → 3.DSvIWalA.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{3.BaCofjAn.js.map → 3.DSvIWalA.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{4.v1wYkrvS.js → 4.H6RMG_cy.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{4.v1wYkrvS.js.map → 4.H6RMG_cy.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{5.Bn4A77jK.js → 5.BHSt0Suo.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{5.Bn4A77jK.js.map → 5.BHSt0Suo.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{6.C2hEoITj.js → 6.CzLoA0w7.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{6.C2hEoITj.js.map → 6.CzLoA0w7.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{7.BcHOjWdp.js → 7.fqq2vVa9.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{7.BcHOjWdp.js.map → 7.fqq2vVa9.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{8.D7NtqIYy.js → 8.DNFFjTla.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{8.D7NtqIYy.js.map → 8.DNFFjTla.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{9.D-211z9-.js → 9.0kMPrp2-.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{9.D-211z9-.js.map → 9.0kMPrp2-.js.map} +1 -1
- package/dist/web/client/_app/version.json +1 -1
- package/dist/web/server/chunks/{0-CvglVGCY.js → 0-B_KxXX-N.js} +14 -14
- package/dist/web/server/chunks/{0-CvglVGCY.js.map → 0-B_KxXX-N.js.map} +1 -1
- package/dist/web/server/chunks/{1-D-gJDFrG.js → 1-BmEKuUDK.js} +4 -4
- package/dist/web/server/chunks/{1-D-gJDFrG.js.map → 1-BmEKuUDK.js.map} +1 -1
- package/dist/web/server/chunks/{2-BCmEU5Qq.js → 2-BJ3dzws2.js} +13 -13
- package/dist/web/server/chunks/{2-BCmEU5Qq.js.map → 2-BJ3dzws2.js.map} +1 -1
- package/dist/web/server/chunks/{3-CHn5Kw-T.js → 3-CLYKGzT3.js} +10 -10
- package/dist/web/server/chunks/{3-CHn5Kw-T.js.map → 3-CLYKGzT3.js.map} +1 -1
- package/dist/web/server/chunks/{4-Cxg7VcZ7.js → 4-CsoWHVgX.js} +12 -12
- package/dist/web/server/chunks/{4-Cxg7VcZ7.js.map → 4-CsoWHVgX.js.map} +1 -1
- package/dist/web/server/chunks/{5-DSgvnHF_.js → 5-oPM6ncgT.js} +9 -9
- package/dist/web/server/chunks/{5-DSgvnHF_.js.map → 5-oPM6ncgT.js.map} +1 -1
- package/dist/web/server/chunks/{6-B0rymWRR.js → 6-gvgju2ZN.js} +5 -5
- package/dist/web/server/chunks/{6-B0rymWRR.js.map → 6-gvgju2ZN.js.map} +1 -1
- package/dist/web/server/chunks/{7-CNomBJux.js → 7-D8hylKrz.js} +10 -10
- package/dist/web/server/chunks/{7-CNomBJux.js.map → 7-D8hylKrz.js.map} +1 -1
- package/dist/web/server/chunks/{8-TYbX-1bO.js → 8-Br4hTtby.js} +12 -12
- package/dist/web/server/chunks/{8-TYbX-1bO.js.map → 8-Br4hTtby.js.map} +1 -1
- package/dist/web/server/chunks/{9-XGQQvTLc.js → 9-9uvmfsEs.js} +9 -9
- package/dist/web/server/chunks/{9-XGQQvTLc.js.map → 9-9uvmfsEs.js.map} +1 -1
- package/dist/web/server/chunks/{_layout.svelte-yrPX5VFm.js → _layout.svelte-DamAAFpK.js} +58 -37
- package/dist/web/server/chunks/_layout.svelte-DamAAFpK.js.map +1 -0
- package/dist/web/server/chunks/{_page.svelte-C_kFA0Lq.js → _page.svelte-DFE4jmT9.js} +4 -4
- package/dist/web/server/chunks/{_page.svelte-C_kFA0Lq.js.map → _page.svelte-DFE4jmT9.js.map} +1 -1
- package/dist/web/server/chunks/{_page.svelte-DvxpwsgS.js → _page.svelte-DHPGbCS1.js} +6 -6
- package/dist/web/server/chunks/{_page.svelte-DvxpwsgS.js.map → _page.svelte-DHPGbCS1.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-Dz01Gvhk.js → _server.ts-0RT4n9LX.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-Dz01Gvhk.js.map → _server.ts-0RT4n9LX.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-D2Tvcncu.js → _server.ts-3kbpguQ1.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-D2Tvcncu.js.map → _server.ts-3kbpguQ1.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-TN_Ka6cR.js → _server.ts-4m17ESHV.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-TN_Ka6cR.js.map → _server.ts-4m17ESHV.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-Bj1Eewby.js → _server.ts-8Bs2jUgD.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-Bj1Eewby.js.map → _server.ts-8Bs2jUgD.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-BWVtnpJh.js → _server.ts-95cbXKdT.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-BWVtnpJh.js.map → _server.ts-95cbXKdT.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-CyOA1rOq.js → _server.ts-B56-XF-Z.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-CyOA1rOq.js.map → _server.ts-B56-XF-Z.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-1ZhqL5o8.js → _server.ts-BAC_No-1.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-1ZhqL5o8.js.map → _server.ts-BAC_No-1.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-ji7L8HUR.js → _server.ts-BCpfYsYw.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-ji7L8HUR.js.map → _server.ts-BCpfYsYw.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-9iRpDv9e.js → _server.ts-BGToJuLp.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-9iRpDv9e.js.map → _server.ts-BGToJuLp.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-DQJ-tygD.js → _server.ts-BW87LYkE.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-DQJ-tygD.js.map → _server.ts-BW87LYkE.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-VgbTPrqV.js → _server.ts-BXjUy61V.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-VgbTPrqV.js.map → _server.ts-BXjUy61V.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-FoPsfjo3.js → _server.ts-BYyaN7ik.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-FoPsfjo3.js.map → _server.ts-BYyaN7ik.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-CNBy2p2U.js → _server.ts-Bjzi1JAu.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-CNBy2p2U.js.map → _server.ts-Bjzi1JAu.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-CSK1ReRS.js → _server.ts-CBU5vhD8.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-CSK1ReRS.js.map → _server.ts-CBU5vhD8.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-Cv8SUkC5.js → _server.ts-CG-7TORV.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-Cv8SUkC5.js.map → _server.ts-CG-7TORV.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-DPctaiWC.js → _server.ts-COCrEIiW.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-DPctaiWC.js.map → _server.ts-COCrEIiW.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-C7uhdF7Y.js → _server.ts-CPCsEz_B.js} +4 -4
- package/dist/web/server/chunks/{_server.ts-C7uhdF7Y.js.map → _server.ts-CPCsEz_B.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-DsyqZudf.js → _server.ts-CPGa_LDW.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-DsyqZudf.js.map → _server.ts-CPGa_LDW.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-B9RfKfyc.js → _server.ts-CT1m86tm.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-B9RfKfyc.js.map → _server.ts-CT1m86tm.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-CwFbAWCg.js → _server.ts-CXzAFIps.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-CwFbAWCg.js.map → _server.ts-CXzAFIps.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-DHuyjZQx.js → _server.ts-C_H2gKKu.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-DHuyjZQx.js.map → _server.ts-C_H2gKKu.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-DVgdt6Zu.js → _server.ts-CjH9MxGk.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-DVgdt6Zu.js.map → _server.ts-CjH9MxGk.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-DrFiP32b.js → _server.ts-CrQk3PtI.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-DrFiP32b.js.map → _server.ts-CrQk3PtI.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-CA8nszPb.js → _server.ts-Cy5Matw4.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-CA8nszPb.js.map → _server.ts-Cy5Matw4.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-CovkmnvY.js → _server.ts-D9PPu5p4.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-CovkmnvY.js.map → _server.ts-D9PPu5p4.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-vhti5VvF.js → _server.ts-DGvNQ4Mq.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-vhti5VvF.js.map → _server.ts-DGvNQ4Mq.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-iK8ih9Bi.js → _server.ts-DJOSnwXV.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-iK8ih9Bi.js.map → _server.ts-DJOSnwXV.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-DK-6ddNq.js → _server.ts-DPoluZc6.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-DK-6ddNq.js.map → _server.ts-DPoluZc6.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-BozsVs8t.js → _server.ts-DS6kibxL.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-BozsVs8t.js.map → _server.ts-DS6kibxL.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-DozhhYwq.js → _server.ts-DUl0ucUP.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-DozhhYwq.js.map → _server.ts-DUl0ucUP.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-78nODRDJ.js → _server.ts-DWj22oj9.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-78nODRDJ.js.map → _server.ts-DWj22oj9.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-CA1j9wWk.js → _server.ts-DZrVaelC.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-CA1j9wWk.js.map → _server.ts-DZrVaelC.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-CzcknkWq.js → _server.ts-DrG3j6Ao.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-CzcknkWq.js.map → _server.ts-DrG3j6Ao.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-AAllMdwT.js → _server.ts-Dwy38J9J.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-AAllMdwT.js.map → _server.ts-Dwy38J9J.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-CgChlIKq.js → _server.ts-DxGjRezI.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-CgChlIKq.js.map → _server.ts-DxGjRezI.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-KbQyErIR.js → _server.ts-XMUjHO61.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-KbQyErIR.js.map → _server.ts-XMUjHO61.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-DGTSZoLn.js → _server.ts-dvT2bXEB.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-DGTSZoLn.js.map → _server.ts-dvT2bXEB.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-BxscGs8D.js → _server.ts-m835uDm6.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-BxscGs8D.js.map → _server.ts-m835uDm6.js.map} +1 -1
- package/dist/web/server/chunks/{checkbox-DiJTAtHi.js → checkbox-BYzlWW56.js} +2 -2
- package/dist/web/server/chunks/{checkbox-DiJTAtHi.js.map → checkbox-BYzlWW56.js.map} +1 -1
- package/dist/web/server/chunks/{create-id-DpoSQWrl.js → create-id-s6T_m-1j.js} +3 -3
- package/dist/web/server/chunks/{create-id-DpoSQWrl.js.map → create-id-s6T_m-1j.js.map} +1 -1
- package/dist/web/server/chunks/{discover-DjR28OqK.js → discover-DykzHz0t.js} +2 -2
- package/dist/web/server/chunks/{discover-DjR28OqK.js.map → discover-DykzHz0t.js.map} +1 -1
- package/dist/web/server/chunks/{drafts.svelte-DsFAtH-s.js → drafts.svelte-c94J-DBB.js} +3 -3
- package/dist/web/server/chunks/{drafts.svelte-DsFAtH-s.js.map → drafts.svelte-c94J-DBB.js.map} +1 -1
- package/dist/web/server/chunks/{end-session-BbBa9yD0.js → end-session-Czy_WW42.js} +2 -2
- package/dist/web/server/chunks/{end-session-BbBa9yD0.js.map → end-session-Czy_WW42.js.map} +1 -1
- package/dist/web/server/chunks/{files-4i3igWea.js → files-DNH191y7.js} +2 -2
- package/dist/web/server/chunks/{files-4i3igWea.js.map → files-DNH191y7.js.map} +1 -1
- package/dist/web/server/chunks/{fleet-DZJSFWuH.js → fleet-CWHlZjSd.js} +4 -4
- package/dist/web/server/chunks/{fleet-DZJSFWuH.js.map → fleet-CWHlZjSd.js.map} +1 -1
- package/dist/web/server/chunks/{git-D9dLEKUF.js → git-CHO9UIOQ.js} +13 -5
- package/dist/web/server/chunks/git-CHO9UIOQ.js.map +1 -0
- package/dist/web/server/chunks/{git-history-De9t0yF-.js → git-history-CxyH4jQb.js} +2 -2
- package/dist/web/server/chunks/{git-history-De9t0yF-.js.map → git-history-CxyH4jQb.js.map} +1 -1
- package/dist/web/server/chunks/{hooks.server-C3Uglne7.js → hooks.server-DgHxEf6H.js} +6 -6
- package/dist/web/server/chunks/{hooks.server-C3Uglne7.js.map → hooks.server-DgHxEf6H.js.map} +1 -1
- package/dist/web/server/chunks/{message-queue-sFcJCRjz.js → message-queue-DhLshpoF.js} +13 -2
- package/dist/web/server/chunks/message-queue-DhLshpoF.js.map +1 -0
- package/dist/web/server/chunks/{project-CbPa8Mu7.js → project-CBPdIh2n.js} +2 -2
- package/dist/web/server/chunks/{project-CbPa8Mu7.js.map → project-CBPdIh2n.js.map} +1 -1
- package/dist/web/server/chunks/{project-icons-CSb1bfT9.js → project-icons-bWhaFSVy.js} +4 -4
- package/dist/web/server/chunks/{project-icons-CSb1bfT9.js.map → project-icons-bWhaFSVy.js.map} +1 -1
- package/dist/web/server/chunks/{push-BJ7P9DGd.js → push-LMlCp4Lc.js} +5 -5
- package/dist/web/server/chunks/{push-BJ7P9DGd.js.map → push-LMlCp4Lc.js.map} +1 -1
- package/dist/web/server/chunks/{remote-control-C1d9R3w4.js → remote-control-BvYkVDhx.js} +2 -2
- package/dist/web/server/chunks/{remote-control-C1d9R3w4.js.map → remote-control-BvYkVDhx.js.map} +1 -1
- package/dist/web/server/chunks/{start-session-CKbupnLS.js → start-session-HljgutDe.js} +3 -3
- package/dist/web/server/chunks/{start-session-CKbupnLS.js.map → start-session-HljgutDe.js.map} +1 -1
- package/dist/web/server/chunks/{version-BqEJmw2g.js → version-ox9yLZ0P.js} +2 -2
- package/dist/web/server/chunks/version-ox9yLZ0P.js.map +1 -0
- package/dist/web/server/chunks/{web-preview-Bi5fjydK.js → web-preview-H5eiWlBD.js} +2 -2
- package/dist/web/server/chunks/{web-preview-Bi5fjydK.js.map → web-preview-H5eiWlBD.js.map} +1 -1
- package/dist/web/server/chunks/{ws-handlers-zemeJ8Si.js → ws-handlers-k_sOue-0.js} +6 -5
- package/dist/web/server/chunks/ws-handlers-k_sOue-0.js.map +1 -0
- package/dist/web/server/chunks/{ws-managers-C5VXKb_r.js → ws-managers-D2qC6Gla.js} +2 -2
- package/dist/web/server/chunks/{ws-managers-C5VXKb_r.js.map → ws-managers-D2qC6Gla.js.map} +1 -1
- package/dist/web/server/chunks/{ws-messages-jOSwT1Yq.js → ws-messages-B81v2RXg.js} +7 -2
- package/dist/web/server/chunks/ws-messages-B81v2RXg.js.map +1 -0
- package/dist/web/server/index.js +2 -2
- package/dist/web/server/index.js.map +1 -1
- package/dist/web/server/manifest.js +53 -53
- package/dist/web/server/manifest.js.map +1 -1
- package/package.json +1 -1
- package/src/fleet-places.ts +17 -1
- package/src/server/dictation-marks.ts +24 -1
- package/src/transcript/parser.ts +20 -3
- package/src/transcript/past-sessions.ts +3 -1
- package/src/utils/version.ts +1 -1
- package/tests/fleet-places.test.ts +20 -0
- package/tests/server/dictation-marks.test.ts +16 -0
- package/tests/transcript/parser.test.ts +34 -0
- package/tests/transcript/past-sessions.test.ts +5 -0
- package/web/.svelte-kit/adapter-bun/chunks/git.js +13 -4
- package/web/.svelte-kit/adapter-bun/chunks/git.js.map +1 -1
- package/web/.svelte-kit/adapter-bun/chunks/internal2.js +1 -1
- package/web/.svelte-kit/adapter-bun/chunks/internal2.js.map +1 -1
- package/web/.svelte-kit/adapter-bun/chunks/message-queue.js +14 -1
- package/web/.svelte-kit/adapter-bun/chunks/message-queue.js.map +1 -1
- package/web/.svelte-kit/adapter-bun/chunks/version.js +1 -1
- package/web/.svelte-kit/adapter-bun/chunks/version.js.map +1 -1
- package/web/.svelte-kit/adapter-bun/chunks/ws-handlers.js +2 -1
- package/web/.svelte-kit/adapter-bun/chunks/ws-handlers.js.map +1 -1
- package/web/.svelte-kit/adapter-bun/chunks/ws-messages.js +6 -1
- package/web/.svelte-kit/adapter-bun/chunks/ws-messages.js.map +1 -1
- package/web/.svelte-kit/adapter-bun/entries/pages/_layout.svelte.js +72 -45
- package/web/.svelte-kit/adapter-bun/entries/pages/_layout.svelte.js.map +1 -1
- package/web/.svelte-kit/adapter-bun/manifest-full.js +1 -1
- package/web/.svelte-kit/adapter-bun/manifest.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/0.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/1.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/2.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/3.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/4.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/5.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/6.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/7.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/8.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/9.js +1 -1
- package/web/.svelte-kit/generated/server/internal.js +1 -1
- package/web/.svelte-kit/output/client/.vite/manifest.json +237 -237
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{sULMfRFG.js → B4FaHfAQ.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{sULMfRFG.js.map → B4FaHfAQ.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{W5_HMZ5E.js → B5Hkb2u5.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{W5_HMZ5E.js.map → B5Hkb2u5.js.map} +1 -1
- package/{dist/web/client/_app/immutable/chunks/BQzv8cqz.js → web/.svelte-kit/output/client/_app/immutable/chunks/BOpEbBRb.js} +2 -2
- package/{dist/web/client/_app/immutable/chunks/BQzv8cqz.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/BOpEbBRb.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{Q5yhzux8.js → BeYjnogg.js} +2 -2
- package/{dist/web/client/_app/immutable/chunks/Q5yhzux8.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/BeYjnogg.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{VceCNUd7.js → C00rm3mY.js} +2 -2
- package/{dist/web/client/_app/immutable/chunks/VceCNUd7.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/C00rm3mY.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{CtjkAirr.js → CKg7gbPm.js} +9 -9
- package/web/.svelte-kit/output/client/_app/immutable/chunks/CKg7gbPm.js.map +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/CPEphjdk.js +4 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/CPEphjdk.js.map +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{BQQ3-rqs.js → CPlFo88J.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{BQQ3-rqs.js.map → CPlFo88J.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{BvX4FYxp.js → CtnjySwS.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{BvX4FYxp.js.map → CtnjySwS.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{XgSsj0QY.js → D3EW0jRH.js} +2 -2
- package/{dist/web/client/_app/immutable/chunks/XgSsj0QY.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/D3EW0jRH.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{CtlIfY1C.js → D3umr-Qr.js} +2 -2
- package/{dist/web/client/_app/immutable/chunks/CtlIfY1C.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/D3umr-Qr.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{CM0CI9GL.js → D8-_Y-M6.js} +3 -3
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{CM0CI9GL.js.map → D8-_Y-M6.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{cvsGFvDx.js → DDvK7Qo9.js} +2 -2
- package/{dist/web/client/_app/immutable/chunks/cvsGFvDx.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/DDvK7Qo9.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{CiU8KBun.js → _VFi-7U7.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{CiU8KBun.js.map → _VFi-7U7.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{DlENCZqZ.js → mQ6hkLuy.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{DlENCZqZ.js.map → mQ6hkLuy.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/entry/{app.BwTbN8wB.js → app.CTFza_OS.js} +3 -3
- package/{dist/web/client/_app/immutable/entry/app.BwTbN8wB.js.map → web/.svelte-kit/output/client/_app/immutable/entry/app.CTFza_OS.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.B-zlkyrt.js +2 -0
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.B-zlkyrt.js.map +1 -0
- package/{dist/web/client/_app/immutable/nodes/0.BnHV-ElR.js → web/.svelte-kit/output/client/_app/immutable/nodes/0.Cztuq8Ih.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{0.BnHV-ElR.js.map → 0.Cztuq8Ih.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{1.Dc3ryOCf.js → 1.BOOL0V7K.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{1.Dc3ryOCf.js.map → 1.BOOL0V7K.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.DUrpAceY.js → 2.CArUpZNe.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.DUrpAceY.js.map → 2.CArUpZNe.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{3.BaCofjAn.js → 3.DSvIWalA.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{3.BaCofjAn.js.map → 3.DSvIWalA.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/4.H6RMG_cy.js +2 -0
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{4.v1wYkrvS.js.map → 4.H6RMG_cy.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/5.BHSt0Suo.js +2 -0
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{5.Bn4A77jK.js.map → 5.BHSt0Suo.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{6.C2hEoITj.js → 6.CzLoA0w7.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{6.C2hEoITj.js.map → 6.CzLoA0w7.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{7.BcHOjWdp.js → 7.fqq2vVa9.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{7.BcHOjWdp.js.map → 7.fqq2vVa9.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/8.DNFFjTla.js +2 -0
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{8.D7NtqIYy.js.map → 8.DNFFjTla.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/9.0kMPrp2-.js +2 -0
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{9.D-211z9-.js.map → 9.0kMPrp2-.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/version.json +1 -1
- package/web/.svelte-kit/output/server/chunks/git.js +13 -4
- package/web/.svelte-kit/output/server/chunks/git.js.map +1 -1
- package/web/.svelte-kit/output/server/chunks/internal2.js +1 -1
- package/web/.svelte-kit/output/server/chunks/internal2.js.map +1 -1
- package/web/.svelte-kit/output/server/chunks/message-queue.js +14 -1
- package/web/.svelte-kit/output/server/chunks/message-queue.js.map +1 -1
- package/web/.svelte-kit/output/server/chunks/version.js +1 -1
- package/web/.svelte-kit/output/server/chunks/version.js.map +1 -1
- package/web/.svelte-kit/output/server/chunks/ws-handlers.js +2 -1
- package/web/.svelte-kit/output/server/chunks/ws-handlers.js.map +1 -1
- package/web/.svelte-kit/output/server/chunks/ws-messages.js +6 -1
- package/web/.svelte-kit/output/server/chunks/ws-messages.js.map +1 -1
- package/web/.svelte-kit/output/server/entries/pages/_layout.svelte.js +72 -45
- package/web/.svelte-kit/output/server/entries/pages/_layout.svelte.js.map +1 -1
- package/web/.svelte-kit/output/server/manifest-full.js +1 -1
- package/web/.svelte-kit/output/server/manifest.js +1 -1
- package/web/.svelte-kit/output/server/nodes/0.js +1 -1
- package/web/.svelte-kit/output/server/nodes/1.js +1 -1
- package/web/.svelte-kit/output/server/nodes/2.js +1 -1
- package/web/.svelte-kit/output/server/nodes/3.js +1 -1
- package/web/.svelte-kit/output/server/nodes/4.js +1 -1
- package/web/.svelte-kit/output/server/nodes/5.js +1 -1
- package/web/.svelte-kit/output/server/nodes/6.js +1 -1
- package/web/.svelte-kit/output/server/nodes/7.js +1 -1
- package/web/.svelte-kit/output/server/nodes/8.js +1 -1
- package/web/.svelte-kit/output/server/nodes/9.js +1 -1
- package/web/src/lib/components/AllSessionsPanel.svelte +9 -1
- package/web/src/lib/components/FolderPicker.svelte +49 -21
- package/dist/web/client/_app/immutable/chunks/CtjkAirr.js.map +0 -1
- package/dist/web/client/_app/immutable/chunks/Dck--FBb.js +0 -4
- package/dist/web/client/_app/immutable/chunks/Dck--FBb.js.map +0 -1
- package/dist/web/client/_app/immutable/entry/start.B2ZPizAt.js +0 -2
- package/dist/web/client/_app/immutable/entry/start.B2ZPizAt.js.map +0 -1
- package/dist/web/server/chunks/_layout.svelte-yrPX5VFm.js.map +0 -1
- package/dist/web/server/chunks/git-D9dLEKUF.js.map +0 -1
- package/dist/web/server/chunks/message-queue-sFcJCRjz.js.map +0 -1
- package/dist/web/server/chunks/version-BqEJmw2g.js.map +0 -1
- package/dist/web/server/chunks/ws-handlers-zemeJ8Si.js.map +0 -1
- package/dist/web/server/chunks/ws-messages-jOSwT1Yq.js.map +0 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/CtjkAirr.js.map +0 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/Dck--FBb.js +0 -4
- package/web/.svelte-kit/output/client/_app/immutable/chunks/Dck--FBb.js.map +0 -1
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.B2ZPizAt.js +0 -2
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.B2ZPizAt.js.map +0 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/4.v1wYkrvS.js +0 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/5.Bn4A77jK.js +0 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/8.D7NtqIYy.js +0 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/9.D-211z9-.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sULMfRFG.js","sources":["../../../../../../../node_modules/.bun/svelte-toolbelt@0.10.6+ec0a64a97e9eb16b/node_modules/svelte-toolbelt/dist/utils/on-mount-effect.svelte.js","../../../../../../../node_modules/.bun/bits-ui@2.20.2+2df16ea90105ef5c/node_modules/bits-ui/dist/bits/utilities/arrow/arrow.svelte","../../../../../../../node_modules/.bun/bits-ui@2.20.2+2df16ea90105ef5c/node_modules/bits-ui/dist/bits/utilities/floating-layer/components/floating-layer-arrow.svelte","../../../../../../../node_modules/.bun/bits-ui@2.20.2+2df16ea90105ef5c/node_modules/bits-ui/dist/internal/timeout-fn.js","../../../../../../../node_modules/.bun/bits-ui@2.20.2+2df16ea90105ef5c/node_modules/bits-ui/dist/bits/tooltip/tooltip.svelte.js","../../../../../../../node_modules/.bun/bits-ui@2.20.2+2df16ea90105ef5c/node_modules/bits-ui/dist/bits/tooltip/components/tooltip.svelte","../../../../../../../node_modules/.bun/bits-ui@2.20.2+2df16ea90105ef5c/node_modules/bits-ui/dist/bits/tooltip/components/tooltip-content.svelte","../../../../../../../node_modules/.bun/bits-ui@2.20.2+2df16ea90105ef5c/node_modules/bits-ui/dist/bits/tooltip/components/tooltip-trigger.svelte","../../../../../../../node_modules/.bun/bits-ui@2.20.2+2df16ea90105ef5c/node_modules/bits-ui/dist/bits/tooltip/components/tooltip-arrow.svelte","../../../../../../../node_modules/.bun/bits-ui@2.20.2+2df16ea90105ef5c/node_modules/bits-ui/dist/bits/tooltip/components/tooltip-provider.svelte","../../../../../../src/lib/stores/terminal.svelte.ts","../../../../../../../node_modules/.bun/ansi_up@6.0.6/node_modules/ansi_up/ansi_up.js","../../../../../../src/lib/terminal/ansi.ts","../../../../../../src/lib/components/TerminalView.svelte","../../../../../../src/lib/actions/clickOutside.ts","../../../../../../../src/transcript/context.ts","../../../../../../src/lib/components/ContextGauge.svelte","../../../../../../src/lib/components/RailStats.svelte","../../../../../../src/lib/components/VoiceMeter.svelte","../../../../../../../src/utils/image-types.ts","../../../../../../src/lib/components/QueueStrip.svelte","../../../../../../src/lib/components/VoiceButton.svelte","../../../../../../src/lib/components/KeyTray.svelte","../../../../../../src/lib/components/SessionSheet.svelte","../../../../../../src/lib/components/ui/tooltip/tooltip-portal.svelte","../../../../../../src/lib/components/ui/tooltip/tooltip-content.svelte","../../../../../../src/lib/components/ui/tooltip/tooltip-provider.svelte","../../../../../../src/lib/components/ui/tooltip/tooltip-trigger.svelte","../../../../../../src/lib/components/ui/tooltip/tooltip.svelte","../../../../../../src/lib/components/Hint.svelte","../../../../../../../src/claude/model-name.ts","../../../../../../src/lib/components/CommandList.svelte","../../../../../../src/lib/components/CommandPalette.svelte","../../../../../../src/lib/gamepad.svelte.ts","../../../../../../src/lib/stores/viewModes.svelte.ts","../../../../../../src/lib/components/ui/sheet/sheet-overlay.svelte","../../../../../../src/lib/components/ui/sheet/sheet-portal.svelte","../../../../../../src/lib/components/ui/sheet/sheet-content.svelte","../../../../../../src/lib/components/ui/sheet/sheet-title.svelte","../../../../../../src/lib/components/ui/sheet/sheet.svelte","../../../../../../src/lib/components/side-panel/SidePanel.svelte","../../../../../../src/lib/components/side-panel/PanelToggle.svelte","../../../../../../src/lib/components/RemoteControlMenu.svelte","../../../../../../src/lib/stores/sidePanel.svelte.ts","../../../../../../src/lib/side-panel/layout.ts","../../../../../../src/routes/session/[target]/+page.svelte"],"sourcesContent":["import { untrack } from \"svelte\";\nexport function onMountEffect(fn) {\n $effect(() => {\n const cleanup = untrack(() => fn());\n return cleanup;\n });\n}\n","<script lang=\"ts\">\n\timport { mergeProps } from \"svelte-toolbelt\";\n\timport type { ArrowProps } from \"./types.js\";\n\timport { useId } from \"../../../internal/use-id.js\";\n\n\tlet {\n\t\tid = useId(),\n\t\tchildren,\n\t\tchild,\n\t\twidth = 10,\n\t\theight = 5,\n\t\t...restProps\n\t}: ArrowProps = $props();\n\n\tconst mergedProps = $derived(mergeProps(restProps, { id }));\n</script>\n\n{#if child}\n\t{@render child({ props: mergedProps })}\n{:else}\n\t<span {...mergedProps}>\n\t\t{#if children}\n\t\t\t{@render children?.()}\n\t\t{:else}\n\t\t\t<svg {width} {height} viewBox=\"0 0 30 10\" preserveAspectRatio=\"none\" data-arrow=\"\">\n\t\t\t\t<polygon points=\"0,0 30,0 15,10\" fill=\"currentColor\" />\n\t\t\t</svg>\n\t\t{/if}\n\t</span>\n{/if}\n","<script lang=\"ts\">\n\timport { boxWith, mergeProps } from \"svelte-toolbelt\";\n\timport { FloatingArrowState } from \"../use-floating-layer.svelte.js\";\n\timport { Arrow, type ArrowProps } from \"../../arrow/index.js\";\n\timport { useId } from \"../../../../internal/use-id.js\";\n\n\tlet { id = useId(), ref = $bindable(null), ...restProps }: ArrowProps = $props();\n\n\tconst arrowState = FloatingArrowState.create({\n\t\tid: boxWith(() => id),\n\t\tref: boxWith(\n\t\t\t() => ref,\n\t\t\t(v) => (ref = v)\n\t\t),\n\t});\n\n\tconst mergedProps = $derived(mergeProps(restProps, arrowState.props));\n</script>\n\n<Arrow {...mergedProps} />\n","import { onDestroyEffect } from \"svelte-toolbelt\";\nexport class TimeoutFn {\n #interval;\n #cb;\n #timer = null;\n constructor(cb, interval) {\n this.#cb = cb;\n this.#interval = interval;\n this.stop = this.stop.bind(this);\n this.start = this.start.bind(this);\n onDestroyEffect(this.stop);\n }\n #clear() {\n if (this.#timer !== null) {\n window.clearTimeout(this.#timer);\n this.#timer = null;\n }\n }\n stop() {\n this.#clear();\n }\n start(...args) {\n this.#clear();\n this.#timer = window.setTimeout(() => {\n this.#timer = null;\n this.#cb(...args);\n }, this.#interval);\n }\n}\n","import { onMountEffect, attachRef, DOMContext, simpleBox, boxWith, } from \"svelte-toolbelt\";\nimport { on } from \"svelte/events\";\nimport { Context, watch } from \"runed\";\nimport { isElement, isFocusVisible } from \"../../internal/is.js\";\nimport { createBitsAttrs, boolToEmptyStrOrUndef, getDataTransitionAttrs, } from \"../../internal/attrs.js\";\nimport { TimeoutFn } from \"../../internal/timeout-fn.js\";\nimport { SafePolygon } from \"../../internal/safe-polygon.svelte.js\";\nimport { PresenceManager } from \"../../internal/presence-manager.svelte.js\";\nexport const tooltipAttrs = createBitsAttrs({\n component: \"tooltip\",\n parts: [\"content\", \"trigger\"],\n});\nconst TooltipProviderContext = new Context(\"Tooltip.Provider\");\nconst TooltipRootContext = new Context(\"Tooltip.Root\");\nclass TooltipTriggerRegistryState {\n triggers = $state(new Map());\n activeTriggerId = $state(null);\n activeTriggerNode = $derived.by(() => {\n const activeTriggerId = this.activeTriggerId;\n if (activeTriggerId === null)\n return null;\n return this.triggers.get(activeTriggerId)?.node ?? null;\n });\n activePayload = $derived.by(() => {\n const activeTriggerId = this.activeTriggerId;\n if (activeTriggerId === null)\n return null;\n return this.triggers.get(activeTriggerId)?.payload ?? null;\n });\n register = (record) => {\n const next = new Map(this.triggers);\n next.set(record.id, record);\n this.triggers = next;\n this.#coerceActiveTrigger();\n };\n update = (record) => {\n const next = new Map(this.triggers);\n next.set(record.id, record);\n this.triggers = next;\n this.#coerceActiveTrigger();\n };\n unregister = (id) => {\n if (!this.triggers.has(id))\n return;\n const next = new Map(this.triggers);\n next.delete(id);\n this.triggers = next;\n if (this.activeTriggerId === id) {\n this.activeTriggerId = null;\n }\n };\n setActiveTrigger = (id) => {\n if (id === null) {\n this.activeTriggerId = null;\n return;\n }\n if (!this.triggers.has(id)) {\n this.activeTriggerId = null;\n return;\n }\n this.activeTriggerId = id;\n };\n get = (id) => {\n return this.triggers.get(id);\n };\n has = (id) => {\n return this.triggers.has(id);\n };\n getFirstTriggerId = () => {\n const firstEntry = this.triggers.entries().next();\n if (firstEntry.done)\n return null;\n return firstEntry.value[0];\n };\n #coerceActiveTrigger = () => {\n const activeTriggerId = this.activeTriggerId;\n if (activeTriggerId === null)\n return;\n if (!this.triggers.has(activeTriggerId)) {\n this.activeTriggerId = null;\n }\n };\n}\nclass TooltipTetherState {\n registry = new TooltipTriggerRegistryState();\n root = $state(null);\n}\n// oxlint-disable-next-line no-unused-vars\nexport class TooltipTether {\n #state = new TooltipTetherState();\n get state() {\n return this.#state;\n }\n open(triggerId) {\n if (!this.#state.registry.has(triggerId)) {\n return;\n }\n this.#state.registry.setActiveTrigger(triggerId);\n this.#state.root?.setActiveTrigger(triggerId);\n this.#state.root?.handleOpen();\n }\n close() {\n this.#state.root?.handleClose();\n }\n get isOpen() {\n return this.#state.root?.opts.open.current ?? false;\n }\n}\nexport function createTooltipTether() {\n return new TooltipTether();\n}\nexport class TooltipProviderState {\n static create(opts) {\n return TooltipProviderContext.set(new TooltipProviderState(opts));\n }\n opts;\n isOpenDelayed = $state(true);\n isPointerInTransit = simpleBox(false);\n #timerFn;\n #openTooltip = $state(null);\n constructor(opts) {\n this.opts = opts;\n this.#timerFn = new TimeoutFn(() => {\n this.isOpenDelayed = true;\n }, this.opts.skipDelayDuration.current);\n onMountEffect(() => on(window, \"scroll\", (e) => {\n const activeTooltip = this.#openTooltip;\n if (!activeTooltip)\n return;\n const triggerNode = activeTooltip.triggerNode;\n if (!triggerNode)\n return;\n const target = e.target;\n if (!(target instanceof Element || target instanceof Document))\n return;\n if (target.contains(triggerNode)) {\n activeTooltip.handleClose();\n }\n }, \n // An element's scroll does not bubble, so only the capture phase sees it.\n { capture: true, passive: true }));\n }\n #startTimer = () => {\n const skipDuration = this.opts.skipDelayDuration.current;\n if (skipDuration === 0) {\n // no grace period — reset immediately so next trigger waits the full delay\n this.isOpenDelayed = true;\n return;\n }\n else {\n this.#timerFn.start();\n }\n };\n #clearTimer = () => {\n this.#timerFn.stop();\n };\n onOpen = (tooltip) => {\n if (this.#openTooltip && this.#openTooltip !== tooltip) {\n this.#openTooltip.handleClose();\n }\n this.#clearTimer();\n this.isOpenDelayed = false;\n this.#openTooltip = tooltip;\n };\n onClose = (tooltip) => {\n if (this.#openTooltip === tooltip) {\n this.#openTooltip = null;\n this.#startTimer();\n }\n };\n isTooltipOpen = (tooltip) => {\n return this.#openTooltip === tooltip;\n };\n}\nexport class TooltipRootState {\n static create(opts) {\n return TooltipRootContext.set(new TooltipRootState(opts, TooltipProviderContext.get()));\n }\n opts;\n provider;\n delayDuration = $derived.by(() => this.opts.delayDuration.current ?? this.provider.opts.delayDuration.current);\n disableHoverableContent = $derived.by(() => this.opts.disableHoverableContent.current ??\n this.provider.opts.disableHoverableContent.current);\n disableCloseOnTriggerClick = $derived.by(() => this.opts.disableCloseOnTriggerClick.current ??\n this.provider.opts.disableCloseOnTriggerClick.current);\n disabled = $derived.by(() => this.opts.disabled.current ?? this.provider.opts.disabled.current);\n ignoreNonKeyboardFocus = $derived.by(() => this.opts.ignoreNonKeyboardFocus.current ??\n this.provider.opts.ignoreNonKeyboardFocus.current);\n registry;\n tether;\n contentNode = $state(null);\n contentPresence;\n #wasOpenDelayed = $state(false);\n #timerFn;\n stateAttr = $derived.by(() => {\n if (!this.opts.open.current)\n return \"closed\";\n return this.#wasOpenDelayed ? \"delayed-open\" : \"instant-open\";\n });\n constructor(opts, provider) {\n this.opts = opts;\n this.provider = provider;\n this.tether = opts.tether.current?.state ?? null;\n this.registry = this.tether?.registry ?? new TooltipTriggerRegistryState();\n this.#timerFn = new TimeoutFn(() => {\n this.#wasOpenDelayed = true;\n this.opts.open.current = true;\n }, this.delayDuration ?? 0);\n if (this.tether) {\n this.tether.root = this;\n onMountEffect(() => {\n return () => {\n if (this.tether?.root === this) {\n this.tether.root = null;\n }\n };\n });\n }\n this.contentPresence = new PresenceManager({\n open: this.opts.open,\n ref: boxWith(() => this.contentNode),\n onComplete: () => {\n this.opts.onOpenChangeComplete.current(this.opts.open.current);\n },\n });\n watch(() => this.delayDuration, () => {\n if (this.delayDuration === undefined)\n return;\n this.#timerFn = new TimeoutFn(() => {\n this.#wasOpenDelayed = true;\n this.opts.open.current = true;\n }, this.delayDuration);\n });\n watch(() => this.opts.open.current, (isOpen) => {\n if (isOpen) {\n this.ensureActiveTrigger();\n this.provider.onOpen(this);\n }\n else {\n this.provider.onClose(this);\n }\n }, { lazy: true });\n watch(() => this.opts.triggerId.current, (triggerId) => {\n if (triggerId === this.registry.activeTriggerId)\n return;\n this.registry.setActiveTrigger(triggerId);\n });\n watch(() => this.registry.activeTriggerId, (activeTriggerId) => {\n if (this.opts.triggerId.current === activeTriggerId)\n return;\n this.opts.triggerId.current = activeTriggerId;\n });\n }\n handleOpen = () => {\n this.#timerFn.stop();\n this.#wasOpenDelayed = false;\n this.ensureActiveTrigger();\n this.opts.open.current = true;\n };\n handleClose = () => {\n this.#timerFn.stop();\n this.opts.open.current = false;\n };\n /** Stops a pending delayed open without touching the open state. */\n cancelPendingOpen = () => {\n this.#timerFn.stop();\n };\n #handleDelayedOpen = () => {\n this.#timerFn.stop();\n const shouldSkipDelay = !this.provider.isOpenDelayed;\n const delayDuration = this.delayDuration ?? 0;\n // if no delay needed (either skip delay active or delay is 0), open immediately\n if (shouldSkipDelay || delayDuration === 0) {\n this.#wasOpenDelayed = false;\n this.opts.open.current = true;\n }\n else {\n // use timer for actual delays\n this.#timerFn.start();\n }\n };\n onTriggerEnter = (triggerId) => {\n this.setActiveTrigger(triggerId);\n this.#handleDelayedOpen();\n };\n onTriggerLeave = () => {\n if (this.disableHoverableContent) {\n this.handleClose();\n }\n else {\n this.#timerFn.stop();\n }\n };\n ensureActiveTrigger = () => {\n if (this.registry.activeTriggerId !== null &&\n this.registry.has(this.registry.activeTriggerId)) {\n return;\n }\n if (this.opts.triggerId.current !== null &&\n this.registry.has(this.opts.triggerId.current)) {\n this.registry.setActiveTrigger(this.opts.triggerId.current);\n return;\n }\n const firstTriggerId = this.registry.getFirstTriggerId();\n this.registry.setActiveTrigger(firstTriggerId);\n };\n setActiveTrigger = (triggerId) => {\n this.registry.setActiveTrigger(triggerId);\n };\n registerTrigger = (trigger) => {\n this.registry.register(trigger);\n if (trigger.disabled &&\n this.registry.activeTriggerId === trigger.id &&\n this.opts.open.current) {\n this.handleClose();\n }\n };\n updateTrigger = (trigger) => {\n this.registry.update(trigger);\n if (trigger.disabled &&\n this.registry.activeTriggerId === trigger.id &&\n this.opts.open.current) {\n this.handleClose();\n }\n };\n unregisterTrigger = (id) => {\n const isActive = this.registry.activeTriggerId === id;\n this.registry.unregister(id);\n if (isActive && this.opts.open.current) {\n this.handleClose();\n }\n };\n isActiveTrigger = (triggerId) => {\n return this.registry.activeTriggerId === triggerId;\n };\n get triggerNode() {\n return this.registry.activeTriggerNode;\n }\n get activePayload() {\n return this.registry.activePayload;\n }\n get activeTriggerId() {\n return this.registry.activeTriggerId;\n }\n}\nexport class TooltipTriggerState {\n static create(opts) {\n if (opts.tether.current) {\n return new TooltipTriggerState(opts, null, opts.tether.current.state);\n }\n return new TooltipTriggerState(opts, TooltipRootContext.get(), null);\n }\n opts;\n root;\n tether;\n attachment;\n #isPointerDown = simpleBox(false);\n #hasPointerMoveOpened = $state(false);\n domContext;\n #transitCheckTimeout = null;\n #mounted = false;\n #lastRegisteredId = null;\n constructor(opts, root, tether) {\n this.opts = opts;\n this.root = root;\n this.tether = tether;\n this.domContext = new DOMContext(opts.ref);\n this.attachment = attachRef(this.opts.ref, (v) => this.#register(v));\n watch(() => this.opts.id.current, () => {\n this.#register(this.opts.ref.current);\n });\n watch(() => this.opts.payload.current, () => {\n this.#register(this.opts.ref.current);\n });\n watch(() => this.opts.disabled.current, () => {\n this.#register(this.opts.ref.current);\n });\n onMountEffect(() => {\n this.#mounted = true;\n this.#register(this.opts.ref.current);\n return () => {\n const root = this.#getRoot();\n const id = this.#lastRegisteredId;\n if (id) {\n if (this.tether) {\n this.tether.registry.unregister(id);\n }\n else {\n root?.unregisterTrigger(id);\n }\n }\n this.#lastRegisteredId = null;\n this.#mounted = false;\n };\n });\n }\n #getRoot = () => {\n return this.tether?.root ?? this.root;\n };\n #isDisabled = () => {\n const root = this.#getRoot();\n return this.opts.disabled.current || Boolean(root?.disabled);\n };\n #register = (node) => {\n if (!this.#mounted)\n return;\n const id = this.opts.id.current;\n const payload = this.opts.payload.current;\n const disabled = this.opts.disabled.current;\n if (this.#lastRegisteredId && this.#lastRegisteredId !== id) {\n const root = this.#getRoot();\n if (this.tether) {\n this.tether.registry.unregister(this.#lastRegisteredId);\n }\n else {\n root?.unregisterTrigger(this.#lastRegisteredId);\n }\n }\n const triggerRecord = {\n id,\n node,\n payload,\n disabled,\n };\n const root = this.#getRoot();\n if (this.tether) {\n if (this.tether.registry.has(id)) {\n this.tether.registry.update(triggerRecord);\n }\n else {\n this.tether.registry.register(triggerRecord);\n }\n if (disabled &&\n this.tether.registry.activeTriggerId === id &&\n root?.opts.open.current) {\n root.handleClose();\n }\n }\n else {\n if (root?.registry.has(id)) {\n root.updateTrigger(triggerRecord);\n }\n else {\n root?.registerTrigger(triggerRecord);\n }\n }\n this.#lastRegisteredId = id;\n };\n #clearTransitCheck = () => {\n if (this.#transitCheckTimeout !== null) {\n clearTimeout(this.#transitCheckTimeout);\n this.#transitCheckTimeout = null;\n }\n };\n handlePointerUp = () => {\n this.#isPointerDown.current = false;\n };\n #onpointerup = () => {\n if (this.#isDisabled())\n return;\n this.#isPointerDown.current = false;\n };\n #onpointerdown = () => {\n if (this.#isDisabled())\n return;\n const root = this.#getRoot();\n // close on pointerdown regardless of button so right/middle click dismiss the\n // tooltip too, and so a pending open timer is cancelled before `contextmenu` fires\n if (root && !root.disableCloseOnTriggerClick) {\n if (root.opts.open.current) {\n root.handleClose();\n }\n else {\n root.cancelPendingOpen();\n }\n }\n this.#isPointerDown.current = true;\n this.domContext.getDocument().addEventListener(\"pointerup\", () => {\n this.handlePointerUp();\n }, { once: true });\n };\n #onpointerenter = (e) => {\n const root = this.#getRoot();\n if (!root)\n return;\n if (this.#isDisabled()) {\n if (root.opts.open.current) {\n root.handleClose();\n }\n return;\n }\n if (e.pointerType === \"touch\")\n return;\n // if in transit, wait briefly to see if user is actually heading to old content or staying here\n if (root.provider.isPointerInTransit.current) {\n this.#clearTransitCheck();\n this.#transitCheckTimeout = window.setTimeout(() => {\n // if still in transit after delay, user is likely staying on this trigger\n if (root.provider.isPointerInTransit.current) {\n root.provider.isPointerInTransit.current = false;\n root.onTriggerEnter(this.opts.id.current);\n this.#hasPointerMoveOpened = true;\n }\n }, 250);\n return;\n }\n root.onTriggerEnter(this.opts.id.current);\n this.#hasPointerMoveOpened = true;\n };\n #onpointermove = (e) => {\n const root = this.#getRoot();\n if (!root)\n return;\n if (this.#isDisabled()) {\n if (root.opts.open.current) {\n root.handleClose();\n }\n return;\n }\n if (e.pointerType === \"touch\")\n return;\n if (this.#hasPointerMoveOpened)\n return;\n // moving within trigger means we're definitely not in transit anymore\n this.#clearTransitCheck();\n root.provider.isPointerInTransit.current = false;\n root.onTriggerEnter(this.opts.id.current);\n this.#hasPointerMoveOpened = true;\n };\n #onpointerleave = (e) => {\n const root = this.#getRoot();\n if (!root)\n return;\n if (this.#isDisabled())\n return;\n this.#clearTransitCheck();\n if (!root.isActiveTrigger(this.opts.id.current)) {\n this.#hasPointerMoveOpened = false;\n return;\n }\n const relatedTarget = e.relatedTarget;\n // when moving to a sibling trigger and skip delay is active, don't close —\n // the sibling's enter handler will switch the active trigger instantly.\n // if skipDelayDuration is 0 there's no grace period, so close now and let\n // the sibling wait through the full delay (and re-animate).\n if (isElement(relatedTarget)) {\n for (const record of root.registry.triggers.values()) {\n if (record.node !== relatedTarget)\n continue;\n if (root.provider.opts.skipDelayDuration.current > 0) {\n this.#hasPointerMoveOpened = false;\n return;\n }\n root.handleClose();\n this.#hasPointerMoveOpened = false;\n return;\n }\n }\n root.onTriggerLeave();\n this.#hasPointerMoveOpened = false;\n };\n #onfocus = (e) => {\n const root = this.#getRoot();\n if (!root)\n return;\n if (this.#isPointerDown.current)\n return;\n if (this.#isDisabled()) {\n if (root.opts.open.current) {\n root.handleClose();\n }\n return;\n }\n if (root.ignoreNonKeyboardFocus && !isFocusVisible(e.currentTarget))\n return;\n root.setActiveTrigger(this.opts.id.current);\n root.handleOpen();\n };\n #onblur = () => {\n const root = this.#getRoot();\n if (!root || this.#isDisabled())\n return;\n root.handleClose();\n };\n #onclick = () => {\n const root = this.#getRoot();\n if (!root || root.disableCloseOnTriggerClick || this.#isDisabled())\n return;\n root.handleClose();\n };\n props = $derived.by(() => {\n const root = this.#getRoot();\n const isOpenForTrigger = Boolean(root?.opts.open.current && root.isActiveTrigger(this.opts.id.current));\n const isDisabled = this.#isDisabled();\n return {\n id: this.opts.id.current,\n \"aria-describedby\": isOpenForTrigger ? root?.contentNode?.id : undefined,\n \"data-state\": isOpenForTrigger ? root?.stateAttr : \"closed\",\n \"data-disabled\": boolToEmptyStrOrUndef(isDisabled),\n \"data-delay-duration\": `${root?.delayDuration ?? 0}`,\n [tooltipAttrs.trigger]: \"\",\n tabindex: isDisabled ? undefined : this.opts.tabindex.current,\n disabled: this.opts.disabled.current,\n onpointerup: this.#onpointerup,\n onpointerdown: this.#onpointerdown,\n onpointerenter: this.#onpointerenter,\n onpointermove: this.#onpointermove,\n onpointerleave: this.#onpointerleave,\n onfocus: this.#onfocus,\n onblur: this.#onblur,\n onclick: this.#onclick,\n ...this.attachment,\n };\n });\n}\nexport class TooltipContentState {\n static create(opts) {\n return new TooltipContentState(opts, TooltipRootContext.get());\n }\n opts;\n root;\n attachment;\n constructor(opts, root) {\n this.opts = opts;\n this.root = root;\n this.attachment = attachRef(this.opts.ref, (v) => (this.root.contentNode = v));\n new SafePolygon({\n triggerNode: () => this.root.triggerNode,\n contentNode: () => this.root.contentNode,\n enabled: () => this.root.opts.open.current && !this.root.disableHoverableContent,\n transitIntentTimeout: 180,\n ignoredTargets: () => {\n // only skip closing for sibling triggers when there's a skip-delay grace period;\n // with skipDelayDuration=0 the close+reopen is intentional (full delay + re-animation)\n if (this.root.provider.opts.skipDelayDuration.current === 0)\n return [];\n const nodes = [];\n const activeTriggerNode = this.root.triggerNode;\n for (const record of this.root.registry.triggers.values()) {\n if (record.node && record.node !== activeTriggerNode) {\n nodes.push(record.node);\n }\n }\n return nodes;\n },\n onPointerExit: () => {\n if (this.root.provider.isTooltipOpen(this.root)) {\n this.root.handleClose();\n }\n },\n });\n }\n onInteractOutside = (e) => {\n if (isElement(e.target) &&\n this.root.triggerNode?.contains(e.target) &&\n this.root.disableCloseOnTriggerClick) {\n e.preventDefault();\n return;\n }\n this.opts.onInteractOutside.current(e);\n if (e.defaultPrevented)\n return;\n this.root.handleClose();\n };\n onEscapeKeydown = (e) => {\n this.opts.onEscapeKeydown.current?.(e);\n if (e.defaultPrevented)\n return;\n this.root.handleClose();\n };\n onOpenAutoFocus = (e) => {\n e.preventDefault();\n };\n onCloseAutoFocus = (e) => {\n e.preventDefault();\n };\n get shouldRender() {\n return this.root.contentPresence.shouldRender;\n }\n snippetProps = $derived.by(() => ({ open: this.root.opts.open.current }));\n props = $derived.by(() => ({\n id: this.opts.id.current,\n \"data-state\": this.root.stateAttr,\n \"data-disabled\": boolToEmptyStrOrUndef(this.root.disabled),\n ...getDataTransitionAttrs(this.root.contentPresence.transitionStatus),\n style: {\n outline: \"none\",\n },\n [tooltipAttrs.content]: \"\",\n ...this.attachment,\n }));\n popperProps = {\n onInteractOutside: this.onInteractOutside,\n onEscapeKeydown: this.onEscapeKeydown,\n onOpenAutoFocus: this.onOpenAutoFocus,\n onCloseAutoFocus: this.onCloseAutoFocus,\n };\n}\n","<script lang=\"ts\" module>\n\ttype T = unknown;\n</script>\n\n<script lang=\"ts\" generics=\"T = never\">\n\timport { boxWith } from \"svelte-toolbelt\";\n\timport type { TooltipRootProps } from \"../types.js\";\n\timport { TooltipRootState } from \"../tooltip.svelte.js\";\n\timport FloatingLayer from \"../../utilities/floating-layer/components/floating-layer.svelte\";\n\timport { noop } from \"../../../internal/noop.js\";\n\n\tlet {\n\t\topen = $bindable(false),\n\t\ttriggerId = $bindable<string | null>(null),\n\t\tonOpenChange = noop,\n\t\tonOpenChangeComplete = noop,\n\t\tdisabled,\n\t\tdelayDuration,\n\t\tdisableCloseOnTriggerClick,\n\t\tdisableHoverableContent,\n\t\tignoreNonKeyboardFocus,\n\t\ttether,\n\t\tchildren,\n\t}: TooltipRootProps<T> = $props();\n\n\tconst rootState = TooltipRootState.create({\n\t\topen: boxWith(\n\t\t\t() => open,\n\t\t\t(v) => {\n\t\t\t\topen = v;\n\t\t\t\tonOpenChange(v);\n\t\t\t}\n\t\t),\n\t\ttriggerId: boxWith(\n\t\t\t() => triggerId,\n\t\t\t(v) => {\n\t\t\t\ttriggerId = v;\n\t\t\t}\n\t\t),\n\t\tdelayDuration: boxWith(() => delayDuration),\n\t\tdisableCloseOnTriggerClick: boxWith(() => disableCloseOnTriggerClick),\n\t\tdisableHoverableContent: boxWith(() => disableHoverableContent),\n\t\tignoreNonKeyboardFocus: boxWith(() => ignoreNonKeyboardFocus),\n\t\tdisabled: boxWith(() => disabled),\n\t\tonOpenChangeComplete: boxWith(() => onOpenChangeComplete),\n\t\ttether: boxWith(() => tether),\n\t});\n</script>\n\n<FloatingLayer tooltip>\n\t{@render children?.({\n\t\topen: rootState.opts.open.current,\n\t\ttriggerId: rootState.activeTriggerId,\n\t\tpayload: rootState.activePayload as [T] extends [never] ? null : T | null,\n\t})}\n</FloatingLayer>\n","<script lang=\"ts\">\n\timport { boxWith, mergeProps } from \"svelte-toolbelt\";\n\timport type { TooltipContentProps } from \"../types.js\";\n\timport { TooltipContentState } from \"../tooltip.svelte.js\";\n\timport { createId } from \"../../../internal/create-id.js\";\n\timport PopperLayer from \"../../utilities/popper-layer/popper-layer.svelte\";\n\timport { getFloatingContentCSSVars } from \"../../../internal/floating-svelte/floating-utils.svelte.js\";\n\timport PopperLayerForceMount from \"../../utilities/popper-layer/popper-layer-force-mount.svelte\";\n\timport { noop } from \"../../../internal/noop.js\";\n\n\tconst uid = $props.id();\n\n\tlet {\n\t\tchildren,\n\t\tchild,\n\t\tid = createId(uid),\n\t\tref = $bindable(null),\n\t\tside = \"top\",\n\t\tsideOffset = 0,\n\t\talign = \"center\",\n\t\tavoidCollisions = true,\n\t\tarrowPadding = 0,\n\t\tsticky = \"partial\",\n\t\tstrategy,\n\t\thideWhenDetached = false,\n\t\tcustomAnchor,\n\t\tcollisionPadding = 0,\n\t\tonInteractOutside = noop,\n\t\tonEscapeKeydown = noop,\n\t\tforceMount = false,\n\t\tstyle,\n\t\t...restProps\n\t}: TooltipContentProps = $props();\n\n\tconst contentState = TooltipContentState.create({\n\t\tid: boxWith(() => id),\n\t\tref: boxWith(\n\t\t\t() => ref,\n\t\t\t(v) => (ref = v)\n\t\t),\n\t\tonInteractOutside: boxWith(() => onInteractOutside),\n\t\tonEscapeKeydown: boxWith(() => onEscapeKeydown),\n\t});\n\n\tconst floatingProps = $derived({\n\t\tside,\n\t\tsideOffset,\n\t\talign,\n\t\tavoidCollisions,\n\t\tarrowPadding,\n\t\tsticky,\n\t\thideWhenDetached,\n\t\tcollisionPadding,\n\t\tstrategy,\n\t\tcustomAnchor: customAnchor ?? contentState.root.triggerNode,\n\t});\n\n\tconst mergedProps = $derived(mergeProps(restProps, floatingProps, contentState.props));\n</script>\n\n{#if forceMount}\n\t<PopperLayerForceMount\n\t\t{...mergedProps}\n\t\t{...contentState.popperProps}\n\t\tenabled={contentState.root.opts.open.current}\n\t\t{id}\n\t\ttrapFocus={false}\n\t\tloop={false}\n\t\tpreventScroll={false}\n\t\tforceMount={true}\n\t\tref={contentState.opts.ref}\n\t\ttooltip={true}\n\t\tshouldRender={contentState.shouldRender}\n\t\tcontentPointerEvents={contentState.root.disableHoverableContent ? \"none\" : \"auto\"}\n\t>\n\t\t{#snippet popper({ props, wrapperProps })}\n\t\t\t{@const finalWrapperProps = mergeProps(wrapperProps, {\n\t\t\t\tstyle: {\n\t\t\t\t\tpointerEvents: contentState.root.disableHoverableContent ? \"none\" : undefined,\n\t\t\t\t},\n\t\t\t})}\n\t\t\t{@const finalProps = mergeProps(\n\t\t\t\tprops,\n\t\t\t\t{ style: getFloatingContentCSSVars(\"tooltip\") },\n\t\t\t\t{ style }\n\t\t\t)}\n\t\t\t{#if child}\n\t\t\t\t{@render child({\n\t\t\t\t\tprops: finalProps,\n\t\t\t\t\twrapperProps: finalWrapperProps,\n\t\t\t\t\t...contentState.snippetProps,\n\t\t\t\t})}\n\t\t\t{:else}\n\t\t\t\t<div {...finalWrapperProps}>\n\t\t\t\t\t<div {...finalProps}>\n\t\t\t\t\t\t{@render children?.()}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t{/snippet}\n\t</PopperLayerForceMount>\n{:else if !forceMount}\n\t<PopperLayer\n\t\t{...mergedProps}\n\t\t{...contentState.popperProps}\n\t\topen={contentState.root.opts.open.current}\n\t\t{id}\n\t\ttrapFocus={false}\n\t\tloop={false}\n\t\tpreventScroll={false}\n\t\tforceMount={false}\n\t\tref={contentState.opts.ref}\n\t\ttooltip={true}\n\t\tshouldRender={contentState.shouldRender}\n\t\tcontentPointerEvents={contentState.root.disableHoverableContent ? \"none\" : \"auto\"}\n\t>\n\t\t{#snippet popper({ props, wrapperProps })}\n\t\t\t{@const finalWrapperProps = mergeProps(wrapperProps, {\n\t\t\t\tstyle: {\n\t\t\t\t\tpointerEvents: contentState.root.disableHoverableContent ? \"none\" : undefined,\n\t\t\t\t},\n\t\t\t})}\n\t\t\t{@const finalProps = mergeProps(\n\t\t\t\tprops,\n\t\t\t\t{ style: getFloatingContentCSSVars(\"tooltip\") },\n\t\t\t\t{ style }\n\t\t\t)}\n\t\t\t{#if child}\n\t\t\t\t{@render child({\n\t\t\t\t\tprops: finalProps,\n\t\t\t\t\twrapperProps: finalWrapperProps,\n\t\t\t\t\t...contentState.snippetProps,\n\t\t\t\t})}\n\t\t\t{:else}\n\t\t\t\t<div {...finalWrapperProps}>\n\t\t\t\t\t<div {...finalProps}>\n\t\t\t\t\t\t{@render children?.()}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t{/snippet}\n\t</PopperLayer>\n{/if}\n","<script lang=\"ts\" module>\n\ttype T = unknown;\n</script>\n\n<script lang=\"ts\" generics=\"T = never\">\n\timport { boxWith, mergeProps } from \"svelte-toolbelt\";\n\timport type { TooltipTriggerProps } from \"../types.js\";\n\timport { TooltipTriggerState } from \"../tooltip.svelte.js\";\n\timport { createId } from \"../../../internal/create-id.js\";\n\n\tconst uid = $props.id();\n\n\tlet {\n\t\tchildren,\n\t\tchild,\n\t\tid = createId(uid),\n\t\tdisabled = false,\n\t\tpayload,\n\t\ttether,\n\t\ttype = \"button\",\n\t\ttabindex = 0,\n\t\tref = $bindable(null),\n\t\t...restProps\n\t}: TooltipTriggerProps<T> = $props();\n\n\tconst triggerState = TooltipTriggerState.create({\n\t\tid: boxWith(() => id),\n\t\tdisabled: boxWith(() => disabled ?? false),\n\t\ttabindex: boxWith(() => tabindex ?? 0),\n\t\tpayload: boxWith(() => payload),\n\t\ttether: boxWith(() => tether),\n\t\tref: boxWith(\n\t\t\t() => ref,\n\t\t\t(v) => (ref = v)\n\t\t),\n\t});\n\n\tconst mergedProps = $derived(mergeProps(restProps, triggerState.props, { type }));\n</script>\n\n{#if child}\n\t{@render child({ props: mergedProps })}\n{:else}\n\t<button {...mergedProps}>\n\t\t{@render children?.()}\n\t</button>\n{/if}\n","<script lang=\"ts\">\n\timport type { TooltipArrowProps } from \"../types.js\";\n\timport FloatingLayerArrow from \"../../utilities/floating-layer/components/floating-layer-arrow.svelte\";\n\n\tlet { ref = $bindable(null), ...restProps }: TooltipArrowProps = $props();\n</script>\n\n<FloatingLayerArrow bind:ref {...restProps} />\n","<script lang=\"ts\">\n\timport { boxWith } from \"svelte-toolbelt\";\n\timport type { TooltipProviderProps } from \"../types.js\";\n\timport { TooltipProviderState } from \"../tooltip.svelte.js\";\n\n\tlet {\n\t\tchildren,\n\t\tdelayDuration = 700,\n\t\tdisableCloseOnTriggerClick = false,\n\t\tdisableHoverableContent = false,\n\t\tdisabled = false,\n\t\tignoreNonKeyboardFocus = false,\n\t\tskipDelayDuration = 300,\n\t}: TooltipProviderProps = $props();\n\n\tTooltipProviderState.create({\n\t\tdelayDuration: boxWith(() => delayDuration),\n\t\tdisableCloseOnTriggerClick: boxWith(() => disableCloseOnTriggerClick),\n\t\tdisableHoverableContent: boxWith(() => disableHoverableContent),\n\t\tdisabled: boxWith(() => disabled),\n\t\tignoreNonKeyboardFocus: boxWith(() => ignoreNonKeyboardFocus),\n\t\tskipDelayDuration: boxWith(() => skipDelayDuration),\n\t});\n</script>\n\n{@render children?.()}\n","import { browser } from '$app/environment';\nimport { ReliableWebSocket } from './websocket-base.svelte';\n\n/** History lines fetched on attach and per \"load more\" step. */\nexport const HISTORY_CHUNK = 200;\n/** Max history lines kept in memory while the view sits at the bottom. */\nconst KEEP_AT_BOTTOM = 400;\n\ninterface ScreenMsg {\n\ttype: 'screen';\n\tlines: string[];\n\thistorySize: number;\n\talt: boolean;\n\tcols: number;\n\trows: number;\n}\ninterface HistoryMsg {\n\ttype: 'history';\n\tstart: number;\n\tlines: string[];\n\thistorySize: number;\n}\ninterface ResetMsg {\n\ttype: 'reset';\n\thistorySize: number;\n\talt: boolean;\n\tcols: number;\n\trows: number;\n}\ntype TerminalMsg = ScreenMsg | HistoryMsg | ResetMsg;\n\n/**\n * Terminal view model.\n *\n * The server streams two regions: `screen` (visible pane, replaced on every\n * change) and `history` (lines that scrolled off the top — immutable, addressed\n * by absolute index, delivered as contiguous chunks). We hold one contiguous\n * history block [historyStart, historyStart + history.length) that always ends\n * at `historySize`, i.e. right above the screen. Because history only grows by\n * appending, content the user is reading never shifts; the page simply leaves\n * scrollTop alone while the user is scrolled up.\n */\nclass TerminalStore extends ReliableWebSocket {\n\t/** Visible pane rows (ANSI) */\n\tscreen = $state<string[]>([]);\n\t/** Contiguous history block ending at historySize */\n\thistory = $state<string[]>([]);\n\t/** Absolute index of history[0] */\n\thistoryStart = $state(0);\n\t/** Server's #{history_size}: absolute index just past the last history line */\n\thistorySize = $state(0);\n\t/** Pane is in alternate-screen mode (vim/less/Claude fullscreen TUI): no usable history */\n\talt = $state(false);\n\tcols = $state(0);\n\trows = $state(0);\n\tloadingMore = $state(false);\n\t/** Total history lines appended since attach (page diffs it to count unseen lines) */\n\tappended = $state(0);\n\n\t/** Page tells us whether the view is pinned to the bottom (so we may trim history) */\n\tatBottom = true;\n\n\tprivate target: string | null = null;\n\t/** The path the target's machine is reached through: '' here, `/fleet/<id>` elsewhere. */\n\tprivate base = '';\n\t/** What the socket reaches; a new base to the same address keeps it (see `TranscriptStore.setSession()`). */\n\tprivate address = '';\n\tprivate resizeTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate lastSentSize: { cols: number; rows: number } | null = null;\n\tprivate pendingHistory: (() => void) | null = null;\n\n\tprotected getWsUrl(): string {\n\t\tconst protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\n\t\tconst encodedTarget = encodeURIComponent(this.target!);\n\t\treturn `${protocol}//${window.location.host}${this.base}/api/sessions/${encodedTarget}/stream`;\n\t}\n\n\tprotected getLogPrefix(): string {\n\t\treturn '[terminal]';\n\t}\n\n\tprotected shouldReconnect(): boolean {\n\t\treturn this.target !== null;\n\t}\n\n\t/** Oldest line is loaded — nothing more to fetch */\n\tget historyAtStart(): boolean {\n\t\treturn this.alt || this.historyStart <= 0;\n\t}\n\n\tget historyEnd(): number {\n\t\treturn this.historyStart + this.history.length;\n\t}\n\n\tprotected handleMessage(event: MessageEvent): void {\n\t\tlet data: TerminalMsg;\n\t\ttry {\n\t\t\tdata = JSON.parse(event.data);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tswitch (data.type) {\n\t\t\tcase 'screen':\n\t\t\t\tthis.applyScreen(data);\n\t\t\t\tbreak;\n\t\t\tcase 'history':\n\t\t\t\tthis.applyHistory(data);\n\t\t\t\tbreak;\n\t\t\tcase 'reset':\n\t\t\t\tthis.applyReset(data);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate applyScreen(msg: ScreenMsg): void {\n\t\tthis.screen = msg.lines;\n\t\tthis.historySize = msg.historySize;\n\t\tthis.alt = msg.alt;\n\t\tthis.cols = msg.cols;\n\t\tthis.rows = msg.rows;\n\t\tif (msg.alt && this.history.length) {\n\t\t\tthis.history = [];\n\t\t\tthis.historyStart = msg.historySize;\n\t\t}\n\t\t// Initial tail is pushed by the server on attach; after a reset we ask for it ourselves.\n\t}\n\n\tprivate applyReset(msg: ResetMsg): void {\n\t\tthis.history = [];\n\t\tthis.historyStart = msg.historySize;\n\t\tthis.historySize = msg.historySize;\n\t\tthis.alt = msg.alt;\n\t\tthis.cols = msg.cols;\n\t\tthis.rows = msg.rows;\n\t\tthis.resolvePending();\n\t\tif (!msg.alt && msg.historySize > 0) {\n\t\t\tthis.requestHistory(msg.historySize, HISTORY_CHUNK);\n\t\t}\n\t}\n\n\tprivate applyHistory(msg: HistoryMsg): void {\n\t\tconst { start, lines } = msg;\n\t\tconst end = start + lines.length;\n\t\tthis.historySize = Math.max(this.historySize, msg.historySize);\n\t\tconst isLoadMore = this.loadingMore;\n\n\t\tif (lines.length === 0) {\n\t\t\t// nothing (e.g. requested before index 0)\n\t\t} else if (this.history.length === 0) {\n\t\t\tthis.history = lines;\n\t\t\tthis.historyStart = start;\n\t\t} else {\n\t\t\tconst curStart = this.historyStart;\n\t\t\tconst curEnd = curStart + this.history.length;\n\t\t\tif (start <= curEnd && end > curEnd) {\n\t\t\t\t// Append (trim overlap)\n\t\t\t\tconst fresh = lines.slice(curEnd - start);\n\t\t\t\tthis.history.push(...fresh);\n\t\t\t\tthis.appended += fresh.length;\n\t\t\t\tif (this.atBottom && this.history.length > KEEP_AT_BOTTOM) {\n\t\t\t\t\tconst drop = this.history.length - KEEP_AT_BOTTOM;\n\t\t\t\t\tthis.history.splice(0, drop);\n\t\t\t\t\tthis.historyStart += drop;\n\t\t\t\t}\n\t\t\t} else if (end >= curStart && start < curStart) {\n\t\t\t\t// Prepend (trim overlap)\n\t\t\t\tconst fresh = lines.slice(0, curStart - start);\n\t\t\t\tthis.history.unshift(...fresh);\n\t\t\t\tthis.historyStart = start;\n\t\t\t} else if (start > curEnd) {\n\t\t\t\t// Gap: we missed a delta (reconnect). Restart from this chunk.\n\t\t\t\tthis.history = lines;\n\t\t\t\tthis.historyStart = start;\n\t\t\t\tthis.appended += lines.length;\n\t\t\t}\n\t\t\t// else: fully inside what we have, or entirely before — ignore\n\t\t}\n\t\tif (isLoadMore) {\n\t\t\tthis.loadingMore = false;\n\t\t\tthis.resolvePending();\n\t\t}\n\t}\n\n\tprivate resolvePending(): void {\n\t\tconst resolve = this.pendingHistory;\n\t\tthis.pendingHistory = null;\n\t\tresolve?.();\n\t}\n\n\tprivate requestHistory(before: number, count: number): void {\n\t\tthis.send(JSON.stringify({ type: 'history_request', before, count }));\n\t}\n\n\t/**\n\t * Single entry point for terminal state. Pass a tmux target to view it,\n\t * or `null` to detach. Owns WS lifecycle, output clearing, and history\n\t * reset as one transaction so callers don't reason about connection state.\n\t * `base` names the target's machine (`machineBase()`), since targets\n\t * repeat across machines.\n\t */\n\tsetTarget(target: string | null | undefined, base = '', address = base): void {\n\t\tif (!browser) return;\n\t\tconst next = target ?? null;\n\n\t\t// Same target: either no-op, or reattach the WS without clearing output.\n\t\t// Preserves the buffer across transient disconnects (network blip, server reload).\n\t\tif (this.target === next && this.address === address) {\n\t\t\tthis.base = base;\n\t\t\tif (next === null) return;\n\t\t\tif (this.ws) return;\n\t\t\tthis.doConnect();\n\t\t\treturn;\n\t\t}\n\n\t\t// Switching target (or first attach): tear down old WS and reset view state.\n\t\tif (this.ws) {\n\t\t\tthis.target = null; // suppress reconnect in doDisconnect\n\t\t\tthis.doDisconnect();\n\t\t}\n\t\tif (this.resizeTimer) {\n\t\t\tclearTimeout(this.resizeTimer);\n\t\t\tthis.resizeTimer = null;\n\t\t}\n\t\tthis.lastSentSize = null;\n\t\tthis.clearView();\n\t\tthis.target = next;\n\t\tthis.base = base;\n\t\tthis.address = address;\n\n\t\tif (next) this.doConnect();\n\t}\n\n\tprivate clearView(): void {\n\t\tthis.screen = [];\n\t\tthis.history = [];\n\t\tthis.historyStart = 0;\n\t\tthis.historySize = 0;\n\t\tthis.alt = false;\n\t\tthis.loadingMore = false;\n\t\tthis.atBottom = true;\n\t\tthis.appended = 0;\n\t\tthis.resolvePending();\n\t}\n\n\t/** Resolves when the older chunk arrives. Returns null if no request was sent. */\n\trequestMoreHistory(count = HISTORY_CHUNK): Promise<void> | null {\n\t\tif (this.loadingMore) return null;\n\t\tif (this.historyAtStart) return null;\n\t\tif (!this.ws || this.ws.readyState !== WebSocket.OPEN) return null;\n\t\tthis.loadingMore = true;\n\t\tthis.requestHistory(this.historyStart, count);\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tthis.pendingHistory = resolve;\n\t\t});\n\t}\n\n\t/** Drop history beyond what we keep at the bottom (called when the user returns to bottom). */\n\ttrimToBottom(): void {\n\t\tif (this.history.length > KEEP_AT_BOTTOM) {\n\t\t\tconst drop = this.history.length - KEEP_AT_BOTTOM;\n\t\t\tthis.history.splice(0, drop);\n\t\t\tthis.historyStart += drop;\n\t\t}\n\t}\n\n\tsendResize(cols: number, rows: number): void {\n\t\tif (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\n\n\t\t// Skip if same as last sent\n\t\tif (this.lastSentSize?.cols === cols && this.lastSentSize?.rows === rows) return;\n\n\t\t// Debounce\n\t\tif (this.resizeTimer) clearTimeout(this.resizeTimer);\n\n\t\tthis.resizeTimer = setTimeout(() => {\n\t\t\tif (this.ws && this.ws.readyState === WebSocket.OPEN) {\n\t\t\t\tthis.ws.send(JSON.stringify({ type: 'resize', cols, rows }));\n\t\t\t\tthis.lastSentSize = { cols, rows };\n\t\t\t}\n\t\t\tthis.resizeTimer = null;\n\t\t}, 150);\n\t}\n}\n\nexport const terminalStore = new TerminalStore();\n","\"use strict\";\nvar __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\nvar PacketKind;\n(function (PacketKind) {\n PacketKind[PacketKind[\"EOS\"] = 0] = \"EOS\";\n PacketKind[PacketKind[\"Text\"] = 1] = \"Text\";\n PacketKind[PacketKind[\"Incomplete\"] = 2] = \"Incomplete\";\n PacketKind[PacketKind[\"ESC\"] = 3] = \"ESC\";\n PacketKind[PacketKind[\"Unknown\"] = 4] = \"Unknown\";\n PacketKind[PacketKind[\"SGR\"] = 5] = \"SGR\";\n PacketKind[PacketKind[\"OSCURL\"] = 6] = \"OSCURL\";\n})(PacketKind || (PacketKind = {}));\nexport class AnsiUp {\n constructor() {\n this.VERSION = \"6.0.6\";\n this.setup_palettes();\n this._use_classes = false;\n this.bold = false;\n this.faint = false;\n this.italic = false;\n this.underline = false;\n this.fg = this.bg = null;\n this._buffer = '';\n this._url_allowlist = { 'http': 1, 'https': 1 };\n this._escape_html = true;\n this.boldStyle = 'font-weight:bold';\n this.faintStyle = 'opacity:0.7';\n this.italicStyle = 'font-style:italic';\n this.underlineStyle = 'text-decoration:underline';\n }\n set use_classes(arg) {\n this._use_classes = arg;\n }\n get use_classes() {\n return this._use_classes;\n }\n set url_allowlist(arg) {\n this._url_allowlist = arg;\n }\n get url_allowlist() {\n return this._url_allowlist;\n }\n set escape_html(arg) {\n this._escape_html = arg;\n }\n get escape_html() {\n return this._escape_html;\n }\n set boldStyle(arg) { this._boldStyle = arg; }\n get boldStyle() { return this._boldStyle; }\n set faintStyle(arg) { this._faintStyle = arg; }\n get faintStyle() { return this._faintStyle; }\n set italicStyle(arg) { this._italicStyle = arg; }\n get italicStyle() { return this._italicStyle; }\n set underlineStyle(arg) { this._underlineStyle = arg; }\n get underlineStyle() { return this._underlineStyle; }\n setup_palettes() {\n this.ansi_colors =\n [\n [\n { rgb: [0, 0, 0], class_name: \"ansi-black\" },\n { rgb: [187, 0, 0], class_name: \"ansi-red\" },\n { rgb: [0, 187, 0], class_name: \"ansi-green\" },\n { rgb: [187, 187, 0], class_name: \"ansi-yellow\" },\n { rgb: [0, 0, 187], class_name: \"ansi-blue\" },\n { rgb: [187, 0, 187], class_name: \"ansi-magenta\" },\n { rgb: [0, 187, 187], class_name: \"ansi-cyan\" },\n { rgb: [255, 255, 255], class_name: \"ansi-white\" }\n ],\n [\n { rgb: [85, 85, 85], class_name: \"ansi-bright-black\" },\n { rgb: [255, 85, 85], class_name: \"ansi-bright-red\" },\n { rgb: [0, 255, 0], class_name: \"ansi-bright-green\" },\n { rgb: [255, 255, 85], class_name: \"ansi-bright-yellow\" },\n { rgb: [85, 85, 255], class_name: \"ansi-bright-blue\" },\n { rgb: [255, 85, 255], class_name: \"ansi-bright-magenta\" },\n { rgb: [85, 255, 255], class_name: \"ansi-bright-cyan\" },\n { rgb: [255, 255, 255], class_name: \"ansi-bright-white\" }\n ]\n ];\n this.palette_256 = [];\n this.ansi_colors.forEach(palette => {\n palette.forEach(rec => {\n this.palette_256.push(rec);\n });\n });\n let levels = [0, 95, 135, 175, 215, 255];\n for (let r = 0; r < 6; ++r) {\n for (let g = 0; g < 6; ++g) {\n for (let b = 0; b < 6; ++b) {\n let col = { rgb: [levels[r], levels[g], levels[b]], class_name: 'truecolor' };\n this.palette_256.push(col);\n }\n }\n }\n let grey_level = 8;\n for (let i = 0; i < 24; ++i, grey_level += 10) {\n let gry = { rgb: [grey_level, grey_level, grey_level], class_name: 'truecolor' };\n this.palette_256.push(gry);\n }\n }\n escape_txt_for_html(txt) {\n if (!this._escape_html)\n return txt;\n return txt.replace(/[&<>\"']/gm, (str) => {\n if (str === \"&\")\n return \"&\";\n if (str === \"<\")\n return \"<\";\n if (str === \">\")\n return \">\";\n if (str === \"\\\"\")\n return \""\";\n if (str === \"'\")\n return \"'\";\n });\n }\n append_buffer(txt) {\n var str = this._buffer + txt;\n this._buffer = str;\n }\n get_next_packet() {\n var pkt = {\n kind: PacketKind.EOS,\n text: '',\n url: ''\n };\n var len = this._buffer.length;\n if (len == 0)\n return pkt;\n var pos = this._buffer.indexOf(\"\\x1B\");\n if (pos == -1) {\n pkt.kind = PacketKind.Text;\n pkt.text = this._buffer;\n this._buffer = '';\n return pkt;\n }\n if (pos > 0) {\n pkt.kind = PacketKind.Text;\n pkt.text = this._buffer.slice(0, pos);\n this._buffer = this._buffer.slice(pos);\n return pkt;\n }\n if (pos == 0) {\n if (len < 3) {\n pkt.kind = PacketKind.Incomplete;\n return pkt;\n }\n var next_char = this._buffer.charAt(1);\n if ((next_char != '[') && (next_char != ']') && (next_char != '(')) {\n pkt.kind = PacketKind.ESC;\n pkt.text = this._buffer.slice(0, 1);\n this._buffer = this._buffer.slice(1);\n return pkt;\n }\n if (next_char == '[') {\n if (!this._csi_regex) {\n this._csi_regex = rgx(templateObject_1 || (templateObject_1 = __makeTemplateObject([\"\\n ^ # beginning of line\\n #\\n # First attempt\\n (?: # legal sequence\\n \\u001B[ # CSI\\n ([<-?]?) # private-mode char\\n ([d;]*) # any digits or semicolons\\n ([ -/]? # an intermediate modifier\\n [@-~]) # the command\\n )\\n | # alternate (second attempt)\\n (?: # illegal sequence\\n \\u001B[ # CSI\\n [ -~]* # anything legal\\n ([\\0-\\u001F:]) # anything illegal\\n )\\n \"], [\"\\n ^ # beginning of line\\n #\\n # First attempt\\n (?: # legal sequence\\n \\\\x1b\\\\[ # CSI\\n ([\\\\x3c-\\\\x3f]?) # private-mode char\\n ([\\\\d;]*) # any digits or semicolons\\n ([\\\\x20-\\\\x2f]? # an intermediate modifier\\n [\\\\x40-\\\\x7e]) # the command\\n )\\n | # alternate (second attempt)\\n (?: # illegal sequence\\n \\\\x1b\\\\[ # CSI\\n [\\\\x20-\\\\x7e]* # anything legal\\n ([\\\\x00-\\\\x1f:]) # anything illegal\\n )\\n \"])));\n }\n let match = this._buffer.match(this._csi_regex);\n if (match === null) {\n pkt.kind = PacketKind.Incomplete;\n return pkt;\n }\n if (match[4]) {\n pkt.kind = PacketKind.ESC;\n pkt.text = this._buffer.slice(0, 1);\n this._buffer = this._buffer.slice(1);\n return pkt;\n }\n if ((match[1] != '') || (match[3] != 'm'))\n pkt.kind = PacketKind.Unknown;\n else\n pkt.kind = PacketKind.SGR;\n pkt.text = match[2];\n var rpos = match[0].length;\n this._buffer = this._buffer.slice(rpos);\n return pkt;\n }\n else if (next_char == ']') {\n if (len < 4) {\n pkt.kind = PacketKind.Incomplete;\n return pkt;\n }\n if ((this._buffer.charAt(2) != '8')\n || (this._buffer.charAt(3) != ';')) {\n pkt.kind = PacketKind.ESC;\n pkt.text = this._buffer.slice(0, 1);\n this._buffer = this._buffer.slice(1);\n return pkt;\n }\n if (!this._osc_st) {\n this._osc_st = rgxG(templateObject_2 || (templateObject_2 = __makeTemplateObject([\"\\n (?: # legal sequence\\n (\\u001B\\\\) # ESC | # alternate\\n (\\u0007) # BEL (what xterm did)\\n )\\n | # alternate (second attempt)\\n ( # illegal sequence\\n [\\0-\\u0006] # anything illegal\\n | # alternate\\n [\\b-\\u001A] # anything illegal\\n | # alternate\\n [\\u001C-\\u001F] # anything illegal\\n )\\n \"], [\"\\n (?: # legal sequence\\n (\\\\x1b\\\\\\\\) # ESC \\\\\\n | # alternate\\n (\\\\x07) # BEL (what xterm did)\\n )\\n | # alternate (second attempt)\\n ( # illegal sequence\\n [\\\\x00-\\\\x06] # anything illegal\\n | # alternate\\n [\\\\x08-\\\\x1a] # anything illegal\\n | # alternate\\n [\\\\x1c-\\\\x1f] # anything illegal\\n )\\n \"])));\n }\n this._osc_st.lastIndex = 0;\n {\n let match = this._osc_st.exec(this._buffer);\n if (match === null) {\n pkt.kind = PacketKind.Incomplete;\n return pkt;\n }\n if (match[3]) {\n pkt.kind = PacketKind.ESC;\n pkt.text = this._buffer.slice(0, 1);\n this._buffer = this._buffer.slice(1);\n return pkt;\n }\n }\n {\n let match = this._osc_st.exec(this._buffer);\n if (match === null) {\n pkt.kind = PacketKind.Incomplete;\n return pkt;\n }\n if (match[3]) {\n pkt.kind = PacketKind.ESC;\n pkt.text = this._buffer.slice(0, 1);\n this._buffer = this._buffer.slice(1);\n return pkt;\n }\n }\n if (!this._osc_regex) {\n this._osc_regex = rgx(templateObject_3 || (templateObject_3 = __makeTemplateObject([\"\\n ^ # beginning of line\\n #\\n \\u001B]8; # OSC Hyperlink\\n [ -:<-~]* # params (excluding ;)\\n ; # end of params\\n ([!-~]{0,512}) # URL capture\\n (?: # ST\\n (?:\\u001B\\\\) # ESC | # alternate\\n (?:\\u0007) # BEL (what xterm did)\\n )\\n ([ -~]+) # TEXT capture\\n \\u001B]8;; # OSC Hyperlink End\\n (?: # ST\\n (?:\\u001B\\\\) # ESC | # alternate\\n (?:\\u0007) # BEL (what xterm did)\\n )\\n \"], [\"\\n ^ # beginning of line\\n #\\n \\\\x1b\\\\]8; # OSC Hyperlink\\n [\\\\x20-\\\\x3a\\\\x3c-\\\\x7e]* # params (excluding ;)\\n ; # end of params\\n ([\\\\x21-\\\\x7e]{0,512}) # URL capture\\n (?: # ST\\n (?:\\\\x1b\\\\\\\\) # ESC \\\\\\n | # alternate\\n (?:\\\\x07) # BEL (what xterm did)\\n )\\n ([\\\\x20-\\\\x7e]+) # TEXT capture\\n \\\\x1b\\\\]8;; # OSC Hyperlink End\\n (?: # ST\\n (?:\\\\x1b\\\\\\\\) # ESC \\\\\\n | # alternate\\n (?:\\\\x07) # BEL (what xterm did)\\n )\\n \"])));\n }\n let match = this._buffer.match(this._osc_regex);\n if (match === null) {\n pkt.kind = PacketKind.ESC;\n pkt.text = this._buffer.slice(0, 1);\n this._buffer = this._buffer.slice(1);\n return pkt;\n }\n pkt.kind = PacketKind.OSCURL;\n pkt.url = match[1];\n pkt.text = match[2];\n var rpos = match[0].length;\n this._buffer = this._buffer.slice(rpos);\n return pkt;\n }\n else if (next_char == '(') {\n pkt.kind = PacketKind.Unknown;\n this._buffer = this._buffer.slice(3);\n return pkt;\n }\n }\n }\n ansi_to_html(txt) {\n this.append_buffer(txt);\n var blocks = [];\n while (true) {\n var packet = this.get_next_packet();\n if ((packet.kind == PacketKind.EOS)\n || (packet.kind == PacketKind.Incomplete))\n break;\n if ((packet.kind == PacketKind.ESC)\n || (packet.kind == PacketKind.Unknown))\n continue;\n if (packet.kind == PacketKind.Text)\n blocks.push(this.transform_to_html(this.with_state(packet)));\n else if (packet.kind == PacketKind.SGR)\n this.process_ansi(packet);\n else if (packet.kind == PacketKind.OSCURL)\n blocks.push(this.process_hyperlink(packet));\n }\n return blocks.join(\"\");\n }\n with_state(pkt) {\n return { bold: this.bold, faint: this.faint, italic: this.italic, underline: this.underline, fg: this.fg, bg: this.bg, text: pkt.text };\n }\n process_ansi(pkt) {\n let sgr_cmds = pkt.text.split(';');\n while (sgr_cmds.length > 0) {\n let sgr_cmd_str = sgr_cmds.shift();\n let num = parseInt(sgr_cmd_str, 10);\n if (isNaN(num) || num === 0) {\n this.fg = null;\n this.bg = null;\n this.bold = false;\n this.faint = false;\n this.italic = false;\n this.underline = false;\n }\n else if (num === 1) {\n this.bold = true;\n }\n else if (num === 2) {\n this.faint = true;\n }\n else if (num === 3) {\n this.italic = true;\n }\n else if (num === 4) {\n this.underline = true;\n }\n else if (num === 21) {\n this.bold = false;\n }\n else if (num === 22) {\n this.faint = false;\n this.bold = false;\n }\n else if (num === 23) {\n this.italic = false;\n }\n else if (num === 24) {\n this.underline = false;\n }\n else if (num === 39) {\n this.fg = null;\n }\n else if (num === 49) {\n this.bg = null;\n }\n else if ((num >= 30) && (num < 38)) {\n this.fg = this.ansi_colors[0][(num - 30)];\n }\n else if ((num >= 40) && (num < 48)) {\n this.bg = this.ansi_colors[0][(num - 40)];\n }\n else if ((num >= 90) && (num < 98)) {\n this.fg = this.ansi_colors[1][(num - 90)];\n }\n else if ((num >= 100) && (num < 108)) {\n this.bg = this.ansi_colors[1][(num - 100)];\n }\n else if (num === 38 || num === 48) {\n if (sgr_cmds.length > 0) {\n let is_foreground = (num === 38);\n let mode_cmd = sgr_cmds.shift();\n if (mode_cmd === '5' && sgr_cmds.length > 0) {\n let palette_index = parseInt(sgr_cmds.shift(), 10);\n if (palette_index >= 0 && palette_index <= 255) {\n if (is_foreground)\n this.fg = this.palette_256[palette_index];\n else\n this.bg = this.palette_256[palette_index];\n }\n }\n if (mode_cmd === '2' && sgr_cmds.length > 2) {\n let r = parseInt(sgr_cmds.shift(), 10);\n let g = parseInt(sgr_cmds.shift(), 10);\n let b = parseInt(sgr_cmds.shift(), 10);\n if ((r >= 0 && r <= 255) && (g >= 0 && g <= 255) && (b >= 0 && b <= 255)) {\n let c = { rgb: [r, g, b], class_name: 'truecolor' };\n if (is_foreground)\n this.fg = c;\n else\n this.bg = c;\n }\n }\n }\n }\n }\n }\n transform_to_html(fragment) {\n let txt = fragment.text;\n if (txt.length === 0)\n return txt;\n txt = this.escape_txt_for_html(txt);\n if (!fragment.bold && !fragment.italic && !fragment.faint && !fragment.underline && fragment.fg === null && fragment.bg === null)\n return txt;\n let styles = [];\n let classes = [];\n let fg = fragment.fg;\n let bg = fragment.bg;\n if (fragment.bold)\n styles.push(this._boldStyle);\n if (fragment.faint)\n styles.push(this._faintStyle);\n if (fragment.italic)\n styles.push(this._italicStyle);\n if (fragment.underline)\n styles.push(this._underlineStyle);\n if (!this._use_classes) {\n if (fg)\n styles.push(`color:rgb(${fg.rgb.join(',')})`);\n if (bg)\n styles.push(`background-color:rgb(${bg.rgb})`);\n }\n else {\n if (fg) {\n if (fg.class_name !== 'truecolor') {\n classes.push(`${fg.class_name}-fg`);\n }\n else {\n styles.push(`color:rgb(${fg.rgb.join(',')})`);\n }\n }\n if (bg) {\n if (bg.class_name !== 'truecolor') {\n classes.push(`${bg.class_name}-bg`);\n }\n else {\n styles.push(`background-color:rgb(${bg.rgb.join(',')})`);\n }\n }\n }\n let class_string = '';\n let style_string = '';\n if (classes.length)\n class_string = ` class=\"${classes.join(' ')}\"`;\n if (styles.length)\n style_string = ` style=\"${styles.join(';')}\"`;\n return `<span${style_string}${class_string}>${txt}</span>`;\n }\n ;\n process_hyperlink(pkt) {\n let parts = pkt.url.split(':');\n if (parts.length < 1)\n return '';\n if (!this._url_allowlist[parts[0]])\n return '';\n let result = `<a href=\"${this.escape_txt_for_html(pkt.url)}\">${this.escape_txt_for_html(pkt.text)}</a>`;\n return result;\n }\n}\nfunction rgx(tmplObj, ...subst) {\n let regexText = tmplObj.raw[0];\n let wsrgx = /^\\s+|\\s+\\n|\\s*#[\\s\\S]*?\\n|\\n/gm;\n let txt2 = regexText.replace(wsrgx, '');\n return new RegExp(txt2);\n}\nfunction rgxG(tmplObj, ...subst) {\n let regexText = tmplObj.raw[0];\n let wsrgx = /^\\s+|\\s+\\n|\\s*#[\\s\\S]*?\\n|\\n/gm;\n let txt2 = regexText.replace(wsrgx, '');\n return new RegExp(txt2, 'g');\n}\nvar templateObject_1, templateObject_2, templateObject_3;\n","import { AnsiUp } from 'ansi_up';\n\nconst ansi = new AnsiUp();\nansi.use_classes = true;\n\n// OSC 8 hyperlinks: ESC ] 8 ; params ; URI ST TEXT ESC ] 8 ; ; ST\n// ST is either ESC \\ or BEL (\\x07). ansi_up doesn't parse these, so\n// extract them, run ansi_up on the text, then re-wrap in <a>.\nconst OSC8_RE = /\\x1b\\]8;[^;\\x07\\x1b]*;([^\\x07\\x1b]*)(?:\\x1b\\\\|\\x07)([\\s\\S]*?)\\x1b\\]8;;(?:\\x1b\\\\|\\x07)/g;\n\n// CSI / OSC / other escapes, for plain-text rendering\nconst ANSI_STRIP_RE = /\\x1b\\[[0-9;?]*[ -/]*[@-~]|\\x1b\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)|\\x1b[@-Z\\\\-_]/g;\n\nfunction escapeAttr(s: string): string {\n\treturn s.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<').replace(/>/g, '>');\n}\n\nfunction isSafeUrl(u: string): boolean {\n\treturn /^(https?:|mailto:|ftp:)/i.test(u);\n}\n\n/** ANSI text → HTML (ansi_up class-based colors + OSC 8 links). */\nexport function ansiToHtml(input: string): string {\n\tconst links: string[] = [];\n\tconst marked = input.replace(OSC8_RE, (_m, uri: string, text: string) => {\n\t\tconst i = links.push(uri) - 1;\n\t\treturn `\\x00CMX${i}S\\x00${text}\\x00CMX${i}E\\x00`;\n\t});\n\tlet html = ansi.ansi_to_html(marked);\n\thtml = html.replace(/\\x00CMX(\\d+)S\\x00([\\s\\S]*?)\\x00CMX\\1E\\x00/g, (_m, i, inner) => {\n\t\tconst uri = links[Number(i)] ?? '';\n\t\tif (!isSafeUrl(uri)) return inner;\n\t\treturn `<a href=\"${escapeAttr(uri)}\" target=\"_blank\" rel=\"noopener noreferrer\">${inner}</a>`;\n\t});\n\treturn html;\n}\n\n/**\n * Render one terminal line in isolation. ansi_up carries SGR state across\n * calls; a leading reset keeps lines independent so cached HTML stays valid.\n */\nexport function ansiLineToHtml(line: string): string {\n\treturn ansiToHtml('\\x1b[0m' + line);\n}\n\nexport function stripAnsi(input: string): string {\n\treturn input.replace(ANSI_STRIP_RE, '');\n}\n","<script lang=\"ts\">\n\timport { ansiLineToHtml, stripAnsi } from '$lib/terminal/ansi';\n\n\tinterface Props {\n\t\t/** History lines (ANSI), oldest first. Immutable per index → rendered once, reused via keyed each. */\n\t\thistory: string[];\n\t\t/** Absolute index of history[0] — used as the stable key base. */\n\t\thistoryStart: number;\n\t\t/** Visible pane rows (ANSI). Re-rendered on every change. */\n\t\tscreen: string[];\n\t\t/** Render with ANSI colors (true) or strip escapes (false). */\n\t\tthemed?: boolean;\n\t\t/**\n\t\t * While true, the view keeps showing the snapshot taken when it flipped\n\t\t * on (iOS drops the copy callout on any DOM mutation under a selection).\n\t\t */\n\t\tfrozen?: boolean;\n\t}\n\n\tlet { history, historyStart, screen, themed = true, frozen = false }: Props = $props();\n\n\tlet snapHistory = $state<string[]>([]);\n\tlet snapStart = $state(0);\n\tlet snapScreen = $state<string[]>([]);\n\tlet wasFrozen = false;\n\n\t$effect(() => {\n\t\tif (frozen && !wasFrozen) {\n\t\t\tsnapHistory = [...history];\n\t\t\tsnapStart = historyStart;\n\t\t\tsnapScreen = [...screen];\n\t\t}\n\t\twasFrozen = frozen;\n\t});\n\n\tconst shownHistory = $derived(frozen ? snapHistory : history);\n\tconst shownStart = $derived(frozen ? snapStart : historyStart);\n\tconst shownScreen = $derived(frozen ? snapScreen : screen);\n\n\t// Screen is small (pane rows); one string → one render per tick.\n\tconst screenHtml = $derived(\n\t\tthemed ? shownScreen.map(ansiLineToHtml).join('\\n') : shownScreen.map(stripAnsi).join('\\n')\n\t);\n</script>\n\n<pre class=\"terminal-view\" class:themed>{#each shownHistory as line, i (shownStart + i)}{#if themed}{@html ansiLineToHtml(line)}{:else}{stripAnsi(line)}{/if}{'\\n'}{/each}{#if themed}{@html screenHtml}{:else}{screenHtml}{/if}</pre>\n\n<style>\n\t.terminal-view {\n\t\tmargin: 0;\n\t\tfont-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;\n\t\tfont-size: 13px;\n\t\tline-height: 1.4;\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t\tbackground: #000;\n\t\tcolor: #fff;\n\t}\n\n\t.terminal-view {\n\t\tmargin: 0;\n\t\tfont-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;\n\t\tfont-size: 13px;\n\t\tline-height: 1.4;\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t\tbackground: #000;\n\t\tcolor: #fff;\n\t}\n\n\t/* ansi_up class-based colors */\n\t.terminal-view :global(.ansi-black-fg) { color: #555; }\n\t.terminal-view :global(.ansi-red-fg) { color: #f87171; }\n\t.terminal-view :global(.ansi-green-fg) { color: #4ade80; }\n\t.terminal-view :global(.ansi-yellow-fg) { color: #fbbf24; }\n\t.terminal-view :global(.ansi-blue-fg) { color: #60a5fa; }\n\t.terminal-view :global(.ansi-magenta-fg) { color: #c084fc; }\n\t.terminal-view :global(.ansi-cyan-fg) { color: #22d3ee; }\n\t.terminal-view :global(.ansi-white-fg) { color: #e5e7eb; }\n\n\t.terminal-view :global(.ansi-bright-black-fg) { color: #6b7280; }\n\t.terminal-view :global(.ansi-bright-red-fg) { color: #fca5a5; }\n\t.terminal-view :global(.ansi-bright-green-fg) { color: #86efac; }\n\t.terminal-view :global(.ansi-bright-yellow-fg) { color: #fde68a; }\n\t.terminal-view :global(.ansi-bright-blue-fg) { color: #93c5fd; }\n\t.terminal-view :global(.ansi-bright-magenta-fg) { color: #d8b4fe; }\n\t.terminal-view :global(.ansi-bright-cyan-fg) { color: #67e8f9; }\n\t.terminal-view :global(.ansi-bright-white-fg) { color: #fff; }\n\n\t.terminal-view :global(.ansi-black-bg) { background-color: #000; }\n\t.terminal-view :global(.ansi-red-bg) { background-color: #b91c1c; }\n\t.terminal-view :global(.ansi-green-bg) { background-color: #15803d; }\n\t.terminal-view :global(.ansi-yellow-bg) { background-color: #a16207; }\n\t.terminal-view :global(.ansi-blue-bg) { background-color: #1d4ed8; }\n\t.terminal-view :global(.ansi-magenta-bg) { background-color: #7e22ce; }\n\t.terminal-view :global(.ansi-cyan-bg) { background-color: #0e7490; }\n\t.terminal-view :global(.ansi-white-bg) { background-color: #e5e7eb; }\n\n\t.terminal-view :global(.ansi-bold) { font-weight: 700; }\n\t.terminal-view :global(.ansi-dim) { opacity: 0.7; }\n\t.terminal-view :global(.ansi-italic) { font-style: italic; }\n\t.terminal-view :global(.ansi-underline) { text-decoration: underline; }\n\t.terminal-view :global(.ansi-strikethrough) { text-decoration: line-through; }\n\n\t.terminal-view :global(a) {\n\t\tcolor: inherit;\n\t\ttext-decoration: underline;\n\t\ttext-decoration-style: dotted;\n\t}\n\t.terminal-view :global(a:hover) {\n\t\ttext-decoration-style: solid;\n\t}\n</style>\n","export interface ClickOutsideOptions {\n\tonOutside: () => void;\n\tenabled?: boolean;\n}\n\nexport interface ClickOutsideAction {\n\tdestroy(): void;\n\tupdate(opts: ClickOutsideOptions): void;\n}\n\nconst ATTACH_DELAY_MS = 10;\n\nexport function clickOutside(node: HTMLElement, options: ClickOutsideOptions): ClickOutsideAction {\n\tlet opts = options;\n\tlet attached = false;\n\tlet pendingTimer: ReturnType<typeof setTimeout> | null = null;\n\n\tfunction onDocumentEvent(e: Event): void {\n\t\tif (!node.contains(e.target as Node)) {\n\t\t\topts.onOutside();\n\t\t}\n\t}\n\n\tfunction detach(): void {\n\t\tif (pendingTimer) {\n\t\t\tclearTimeout(pendingTimer);\n\t\t\tpendingTimer = null;\n\t\t}\n\t\tif (attached) {\n\t\t\tdocument.removeEventListener('click', onDocumentEvent);\n\t\t\tdocument.removeEventListener('contextmenu', onDocumentEvent);\n\t\t\tattached = false;\n\t\t}\n\t}\n\n\tfunction sync(): void {\n\t\tconst wantAttached = opts.enabled ?? true;\n\t\tif (wantAttached && !attached && !pendingTimer) {\n\t\t\tpendingTimer = setTimeout(() => {\n\t\t\t\tpendingTimer = null;\n\t\t\t\tdocument.addEventListener('click', onDocumentEvent);\n\t\t\t\tdocument.addEventListener('contextmenu', onDocumentEvent);\n\t\t\t\tattached = true;\n\t\t\t}, ATTACH_DELAY_MS);\n\t\t} else if (!wantAttached) {\n\t\t\tdetach();\n\t\t}\n\t}\n\n\tsync();\n\n\treturn {\n\t\tdestroy(): void {\n\t\t\tdetach();\n\t\t},\n\t\tupdate(next: ClickOutsideOptions): void {\n\t\t\topts = next;\n\t\t\tsync();\n\t\t}\n\t};\n}\n","/**\n * Context-window accounting for a session.\n *\n * Claude Code never writes a percentage anywhere we can read, but it does\n * write the raw `usage` of every API response into the transcript, and the\n * arithmetic behind its own status line is simple enough to mirror: the\n * tokens occupying the window are the input tokens plus both cache counters\n * of the most recent response, measured against the model's window.\n */\n\nimport { asRecord, readNumber, readString } from \"./json.js\";\n\nconst WINDOW_200K = 200_000;\nconst WINDOW_1M = 1_000_000;\n\n/**\n * Windows by model, keyed on the id Claude Code writes into the transcript.\n * A provider may wrap that id (\"us.anthropic.claude-opus-5-v1:0\"), so the\n * known names are matched as substrings.\n *\n * A model in neither list stays unknown rather than being assumed: this table\n * ages against a Claude Code that upgrades on its own schedule, and a 540k\n * context reported as 270% of a guessed window is worse than no percentage.\n */\nconst WINDOWS: { window: number; models: string[] }[] = [\n {\n window: WINDOW_1M,\n models: [\n \"claude-sonnet-5\",\n \"claude-opus-4-7\",\n \"claude-opus-4-8\",\n \"claude-opus-5\",\n \"claude-fable-5\",\n \"claude-mythos-5\",\n ],\n },\n {\n window: WINDOW_200K,\n models: [\n \"claude-3-\",\n \"claude-haiku-4-5\",\n \"claude-sonnet-4-0\",\n \"claude-sonnet-4-5\",\n \"claude-sonnet-4-6\",\n \"claude-opus-4-0\",\n \"claude-opus-4-1\",\n \"claude-opus-4-5\",\n \"claude-opus-4-6\",\n ],\n },\n];\n\nexport interface ContextUsage {\n /** Model that served the response, as written in the transcript. */\n model: string;\n /** Tokens occupying the context window on the last API call. */\n tokens: number;\n /** That model's window in tokens, or null when the model is unknown. */\n window: number | null;\n}\n\nexport function contextWindowFor(model: string): number | null {\n const id = model.toLowerCase();\n // The `[1m]` suffix is the explicit opt-in offered for models that reach a\n // 1M window without having one natively.\n if (id.includes(\"[1m]\")) return WINDOW_1M;\n for (const entry of WINDOWS) {\n if (entry.models.some((known) => id.includes(known))) return entry.window;\n }\n return null;\n}\n\n/** Share of the window in use, or null when the window is unknown. */\nexport function contextPercent(usage: ContextUsage): number | null {\n return usage.window === null ? null : Math.round((usage.tokens / usage.window) * 100);\n}\n\n/** Read the context usage off an assistant record's `message`. */\nexport function readContextUsage(message: Record<string, unknown>): ContextUsage | null {\n const usage = asRecord(message.usage);\n if (!usage) return null;\n const tokens =\n readNumber(usage, \"input_tokens\") +\n readNumber(usage, \"cache_creation_input_tokens\") +\n readNumber(usage, \"cache_read_input_tokens\");\n // Synthetic messages never reached the API and carry a zeroed usage, which\n // would otherwise read as a context that had just emptied itself.\n if (tokens === 0) return null;\n const model = readString(message.model) ?? \"\";\n return { model, tokens, window: contextWindowFor(model) };\n}\n","<script lang=\"ts\">\n\timport type { Snippet } from 'svelte';\n\timport { clickOutside } from '$lib/actions/clickOutside';\n\timport { compact } from '$lib/format';\n\timport { edgeColor, THRESHOLDS } from '$lib/severity';\n\timport { contextPercent, type ContextUsage } from '../../../../src/transcript/context.js';\n\n\tinterface Props {\n\t\tcontext: ContextUsage | null;\n\t\t/** Mounted on the rail — the line routes over it. */\n\t\tnotch?: Snippet;\n\t}\n\n\tlet { context, notch }: Props = $props();\n\n\tlet open = $state(false);\n\tlet strip = $state<HTMLElement | null>(null);\n\tlet svgEl = $state<SVGSVGElement | null>(null);\n\tlet rightEl = $state<HTMLElement | null>(null);\n\tlet path = $state('');\n\tlet length = $state(0);\n\n\tconst used = $derived(context ? (contextPercent(context) ?? null) : null);\n\tconst left100 = $derived(used === null ? null : Math.max(0, 100 - used));\n\tconst color = $derived(edgeColor(used ?? 0));\n\n\t/**\n\t * Where the rail turns amber, and roughly where Claude starts compacting.\n\t * Read from the edge scale so the mark, the note and the rail's own colour\n\t * can never disagree about the number.\n\t */\n\tconst COMPACT_AT = THRESHOLDS.edge.warning;\n\n\t/**\n\t * The rail is one path: it turns the card's top corners and arcs over the\n\t * button mounted on it, so the fill's head is never hidden behind anything.\n\t */\n\tfunction build() {\n\t\tif (!strip || !svgEl) return;\n\t\tconst box = svgEl.getBoundingClientRect();\n\t\tconst width = box.width;\n\t\tif (width <= 0) return;\n\n\t\tconst card = strip.parentElement;\n\t\tconst radius = card\n\t\t\t? Math.min(20, parseFloat(getComputedStyle(card).borderTopLeftRadius) || 0)\n\t\t\t: 0;\n\t\tconst base = 1;\n\t\tconst clear = 5;\n\n\t\tconst knob = rightEl?.getBoundingClientRect();\n\t\tconst from = knob ? knob.left - box.left - clear : 0;\n\t\tconst to = knob ? knob.right - box.left + clear : 0;\n\t\tconst detour = knob !== undefined && knob.width > 0 && to > radius && from < width - radius;\n\n\t\tlet d =\n\t\t\tradius > 0 ? `M0 ${radius + base} A${radius} ${radius} 0 0 1 ${radius} ${base}` : `M0 ${base}`;\n\t\tif (detour) {\n\t\t\tconst r = (to - from) / 2;\n\t\t\td +=\n\t\t\t\t` L${from.toFixed(1)} ${base}` +\n\t\t\t\t` A${r.toFixed(1)} ${r.toFixed(1)} 0 0 1 ${to.toFixed(1)} ${base}`;\n\t\t}\n\t\td +=\n\t\t\tradius > 0\n\t\t\t\t? ` L${(width - radius).toFixed(1)} ${base} A${radius} ${radius} 0 0 1 ${width.toFixed(1)} ${radius + base}`\n\t\t\t\t: ` L${width.toFixed(1)} ${base}`;\n\n\t\tpath = d;\n\t\t// The rail turns the card's corner, so it needs as much height as that\n\t\t// corner is deep. Fixing it at 13px only ever suited a 12px radius —\n\t\t// anything rounder got the arc squashed into the strip.\n\t\tconst depth = Math.max(13, radius + base);\n\t\tsvgEl.setAttribute('viewBox', `0 0 ${width.toFixed(1)} ${depth}`);\n\t\tsvgEl.style.height = `${depth}px`;\n\t\t// Measured off a throwaway path so the reading never depends on when the\n\t\t// bound path element last rendered.\n\t\tconst probe = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\t\tprobe.setAttribute('d', d);\n\t\tsvgEl.appendChild(probe);\n\t\tlength = probe.getTotalLength();\n\t\tprobe.remove();\n\t}\n\n\t$effect(() => {\n\t\tif (!strip) return;\n\t\tbuild();\n\t\tconst ro = new ResizeObserver(build);\n\t\tro.observe(strip);\n\t\tif (rightEl) ro.observe(rightEl);\n\t\treturn () => ro.disconnect();\n\t});\n\n\n</script>\n\n<svelte:window onkeydown={(e) => e.key === 'Escape' && (open = false)} />\n\n<div class=\"strip\" bind:this={strip}>\n\t<button\n\t\ttype=\"button\"\n\t\tclass=\"line\"\n\t\taria-expanded={open}\n\t\taria-label={left100 === null\n\t\t\t? 'Context usage. Open details.'\n\t\t\t: `Context: ${left100}% left. Open details.`}\n\t\tonclick={() => (open = !open)}\n\t>\n\t\t<svg bind:this={svgEl} aria-hidden=\"true\">\n\t\t\t<path class=\"track\" d={path} />\n\t\t\t<path\n\t\t\t\tclass=\"fill\"\n\t\t\t\td={path}\n\t\t\t\tstyle=\"stroke: {color}; stroke-dasharray: {length}; stroke-dashoffset: {length *\n\t\t\t\t\t(1 - (used ?? 0) / 100)}\"\n\t\t\t/>\n\t\t</svg>\n\t</button>\n\n\t<div class=\"mount-right\" bind:this={rightEl}>{@render notch?.()}</div>\n\n\t{#if open}\n\t\t<div\n\t\t\tclass=\"pop\"\n\t\t\trole=\"dialog\"\n\t\t\taria-label=\"Context details\"\n\t\t\tuse:clickOutside={{ enabled: open, onOutside: () => (open = false) }}\n\t\t>\n\t\t\t<div class=\"pop-head\">\n\t\t\t\t<span class=\"pop-title\">Context</span>\n\t\t\t\t<span class=\"pop-big\">\n\t\t\t\t\t{#if left100 === null}{context ? compact(context.tokens) : '—'}{:else}{left100}<em>% left</em>{/if}\n\t\t\t\t</span>\n\t\t\t</div>\n\n\t\t\t{#if context && context.window && used !== null}\n\t\t\t\t<!-- the rail, unrolled: the popover shows the proportion it was\n\t\t\t\t opened to explain, rather than restating it as a word -->\n\t\t\t\t<div class=\"meter\">\n\t\t\t\t\t<div class=\"meter-fill\" style=\"width: {Math.min(100, used)}%; background: {color}\"></div>\n\t\t\t\t\t<div class=\"meter-mark\" style=\"left: {COMPACT_AT}%\"></div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"ends\">\n\t\t\t\t\t<span>{compact(context.tokens)} used</span>\n\t\t\t\t\t<span>{compact(context.window)}</span>\n\t\t\t\t</div>\n\t\t\t{:else if context}\n\t\t\t\t<div class=\"ends ends-solo\">\n\t\t\t\t\t<span>{compact(context.tokens)} in the last response</span>\n\t\t\t\t</div>\n\t\t\t{/if}\n\n\t\t\t{#if context}\n\t\t\t\t<div class=\"pop-foot\">\n\t\t\t\t\t<span class=\"model\">{context.model || 'unknown model'}</span>\n\t\t\t\t</div>\n\t\t\t{/if}\n\n\t\t\t{#if !context}\n\t\t\t\t<p class=\"pop-note\">\n\t\t\t\t\tNothing measured yet. The first response from Claude reports what the window holds.\n\t\t\t\t</p>\n\t\t\t{:else if !context.window}\n\t\t\t\t<p class=\"pop-note\">\n\t\t\t\t\tNo context window on record for this model, so there is no percentage to show.\n\t\t\t\t</p>\n\t\t\t{:else if used !== null && used >= COMPACT_AT}\n\t\t\t\t<p class=\"pop-note warn\">\n\t\t\t\t\tClaude compacts the conversation soon. Anything you want kept, say it now.\n\t\t\t\t</p>\n\t\t\t{:else}\n\t\t\t\t<p class=\"pop-note\">Claude compacts on its own near the mark, around {COMPACT_AT}%.</p>\n\t\t\t{/if}\n\t\t</div>\n\t{/if}\n</div>\n\n<style>\n\t.strip {\n\t\tposition: absolute;\n\t\tinset: -1px -1px auto -1px;\n\t\theight: 13px;\n\t\tz-index: 3;\n\t}\n\n\t.line {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\t/* Only the rail takes the click. The strip is taller than the line so\n\t\t the corner arc can draw, and anything below it belongs to the row\n\t\t underneath — which is the status line, whose buttons must win. */\n\t\tinset: 0 0 auto 0;\n\t\theight: 10px;\n\t\twidth: 100%;\n\t\tpadding: 0;\n\t\tborder: 0;\n\t\tbackground: transparent;\n\t\tcursor: pointer;\n\t}\n\t.line:focus-visible {\n\t\toutline: 2px solid #fbbf24;\n\t\toutline-offset: 3px;\n\t}\n\n\tsvg {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t\twidth: 100%;\n\t\theight: 13px;\n\t\toverflow: visible;\n\t\t/* Drawn as tall as the corner it turns, which overflows the button's\n\t\t hit band — decoration must not swallow the row below's clicks. */\n\t\tpointer-events: none;\n\t}\n\tpath {\n\t\tfill: none;\n\t\tstroke-width: 2;\n\t\tstroke-linecap: round;\n\t\tstroke-linejoin: round;\n\t}\n\t.track {\n\t\tstroke: rgba(245, 245, 244, 0.07);\n\t}\n\t.fill {\n\t\ttransition:\n\t\t\tstroke-dashoffset 0.35s ease,\n\t\t\tstroke 0.35s ease;\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.fill {\n\t\t\ttransition: none;\n\t\t}\n\t}\n\n\t/* centred on the rail's baseline, which is where the arc is drawn; the\n\t voice meter hangs off it, above the button */\n\t.mount-right {\n\t\tposition: absolute;\n\t\ttop: -20px;\n\t\tright: 15px;\n\t\tdisplay: flex;\n\t}\n\t.mount-right:empty {\n\t\tdisplay: none;\n\t}\n\n\t.pop {\n\t\tposition: absolute;\n\t\tleft: 12px;\n\t\tright: 12px;\n\t\tbottom: 10px;\n\t\tmax-width: 340px;\n\t\tbackground: #1a1a1c;\n\t\tborder: 1px solid #313135;\n\t\tborder-radius: 12px;\n\t\tpadding: 14px 15px 13px;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 10px;\n\t\tbox-shadow: 0 18px 40px rgba(0, 0, 0, 0.6);\n\t\tcolor: #f5f5f4;\n\t}\n\t.pop-head {\n\t\tdisplay: flex;\n\t\talign-items: baseline;\n\t\tjustify-content: space-between;\n\t\tgap: 12px;\n\t}\n\t.pop-title {\n\t\tfont-size: 10px;\n\t\tletter-spacing: 0.16em;\n\t\ttext-transform: uppercase;\n\t\tcolor: #78716c;\n\t}\n\t.pop-big {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 26px;\n\t\tline-height: 1;\n\t\tfont-variant-numeric: tabular-nums;\n\t}\n\t.pop-big em {\n\t\tfont-style: normal;\n\t\tfont-size: 13px;\n\t\tcolor: #a8a29e;\n\t\tmargin-left: 2px;\n\t}\n\n\t/* The rail this popover belongs to is a line that fills, so the popover\n\t shows the same line at full size rather than restating it in words. */\n\t.meter {\n\t\tposition: relative;\n\t\theight: 8px;\n\t\tborder-radius: 4px;\n\t\tbackground: rgba(245, 245, 244, 0.08);\n\t\toverflow: hidden;\n\t}\n\t.meter-fill {\n\t\tposition: absolute;\n\t\tinset: 0 auto 0 0;\n\t\tborder-radius: 4px;\n\t\ttransition: width 0.35s ease;\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.meter-fill {\n\t\t\ttransition: none;\n\t\t}\n\t}\n\t/* Where the rail turns amber — the one number on the bar worth marking. */\n\t.meter-mark {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\twidth: 1px;\n\t\tbackground: rgba(10, 10, 11, 0.75);\n\t}\n\n\t/* Figures sit under the end of the bar they describe, so the bar reads as\n\t the sentence and these are only its endpoints. */\n\t.ends {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\talign-items: baseline;\n\t\tgap: 8px;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 11px;\n\t\tfont-variant-numeric: tabular-nums;\n\t\tcolor: #a8a29e;\n\t}\n\t.ends-solo {\n\t\tjustify-content: flex-start;\n\t}\n\n\t.pop-foot {\n\t\tdisplay: flex;\n\t\tborder-top: 1px solid #2a2a2e;\n\t\tpadding-top: 10px;\n\t}\n\t.model {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 11px;\n\t\tcolor: #a8a29e;\n\t\tbackground: #232326;\n\t\tborder-radius: 5px;\n\t\tpadding: 3px 8px;\n\t}\n\n\t.pop-note {\n\t\tfont-size: 12px;\n\t\tline-height: 1.5;\n\t\tcolor: #78716c;\n\t\tmargin: 0;\n\t\ttext-wrap: pretty;\n\t}\n\t.pop-note.warn {\n\t\tcolor: #fbbf24;\n\t}\n</style>\n","<script lang=\"ts\">\n\timport { money } from '$lib/format';\n\timport { edgeColor, SEVERITY } from '$lib/severity';\n\timport { sessionStore } from '$lib/stores/sessions.svelte';\n\timport { usageStore } from '$lib/stores/usage.svelte';\n\n\t/** Load only says something once the box is struggling. */\n\tconst LOAD_FLOOR = 85;\n\n\t$effect(() => usageStore.subscribe());\n\n\tconst quota = $derived(usageStore.quota);\n\tconst stats = $derived(sessionStore.systemStats);\n\t/** Spend has no bar — it is not a share of anything — so it takes the label. */\n\tconst today = $derived(usageStore.today);\n\n\tinterface Chip {\n\t\tkey: string;\n\t\ttext: string;\n\t\tpercent: number;\n\t\t/** Colour, graded by the server where the server grades it. */\n\t\tcolor: string;\n\t}\n\n\t/** Labels share a length so the bars can share a width. */\n\tfunction shortLabel(label: string): string {\n\t\tconst text = label.toLowerCase();\n\t\tif (text.includes('session')) return '5h';\n\t\tconst model = text.match(/(opus|sonnet|haiku|fable|mythos)/)?.[1];\n\t\tif (model) return model;\n\t\tif (text.includes('week')) return 'wk';\n\t\treturn text.replace(/\\s*limit$/, '').split(/\\s+/)[0];\n\t}\n\n\tconst chips = $derived.by(() => {\n\t\tconst out: Chip[] = [];\n\t\tfor (const limit of quota?.available ? quota.limits : []) {\n\t\t\tout.push({\n\t\t\t\tkey: limit.kind,\n\t\t\t\ttext: `${shortLabel(limit.label)} ${Math.round(limit.percent)}%`,\n\t\t\t\tpercent: limit.percent,\n\t\t\t\t// The server grades plan limits itself, and the sidebar shows that\n\t\t\t\t// grade — recomputing here is how the two start disagreeing.\n\t\t\t\tcolor: limit.severity === 'normal' ? edgeColor(0) : SEVERITY[limit.severity].color\n\t\t\t});\n\t\t}\n\t\tif (stats) {\n\t\t\tif (stats.cpu >= LOAD_FLOOR)\n\t\t\t\tout.push({\n\t\t\t\t\tkey: 'cpu',\n\t\t\t\t\ttext: `cpu ${Math.round(stats.cpu)}%`,\n\t\t\t\t\tpercent: stats.cpu,\n\t\t\t\t\tcolor: edgeColor(stats.cpu)\n\t\t\t\t});\n\t\t\tif (stats.ram >= LOAD_FLOOR)\n\t\t\t\tout.push({\n\t\t\t\t\tkey: 'ram',\n\t\t\t\t\ttext: `ram ${Math.round(stats.ram)}%`,\n\t\t\t\t\tpercent: stats.ram,\n\t\t\t\t\tcolor: edgeColor(stats.ram)\n\t\t\t\t});\n\t\t}\n\t\treturn out;\n\t});\n</script>\n\n\n{#if chips.length > 0}\n\t<a class=\"tkey usage\" href=\"/usage\" title={chips.map((c) => c.text).join(' · ')}>\n\t\t<span class=\"bars\">\n\t\t\t{#each chips as chip (chip.key)}\n\t\t\t\t<span class=\"bar\" aria-label={chip.text}>\n\t\t\t\t\t<span style=\"width: {Math.min(100, chip.percent)}%; background: {chip.color}\"></span>\n\t\t\t\t</span>\n\t\t\t{/each}\n\t\t</span>\n\t\t<span>{today === null ? 'Usage' : money(today, true)}</span>\n\t</a>\n{/if}\n\n<style>\n\t/* A tile among tiles: the row is keycaps, so a loose glyph reads as dirt.\n\t It borrows the row's own .tkey shape and spends its face on the meters\n\t instead of an icon — the figures are one tap away, on /usage. */\n\t.usage {\n\t\ttext-decoration: none;\n\t\tgap: 3px;\n\t}\n\t.bars {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 3px;\n\t\twidth: 26px;\n\t}\n\t.bar {\n\t\tdisplay: block;\n\t\theight: 2px;\n\t\tborder-radius: 1px;\n\t\tbackground: rgba(245, 245, 244, 0.16);\n\t\toverflow: hidden;\n\t}\n\t.bar span {\n\t\tdisplay: block;\n\t\theight: 100%;\n\t\tborder-radius: 1px;\n\t}\n\n\t/* A phone has no width to spare, so the tile narrows to its contents —\n\t which is why the label is the shortest true thing it can say. */\n\t@media (max-width: 899px) {\n\t\t.usage {\n\t\t\tmin-width: 0;\n\t\t\tpadding: 0 5px;\n\t\t}\n\t\t.bars {\n\t\t\twidth: 24px;\n\t\t}\n\t}\n</style>\n","<script lang=\"ts\" module>\n\t/** One way to end a take: where what was said goes. */\n\texport interface VoiceAction {\n\t\tlabel: string;\n\t\ttitle: string;\n\t\ticon: string;\n\t\trun: () => void;\n\t}\n</script>\n\n<script lang=\"ts\">\n\timport { formatElapsed } from '$lib/format';\n\timport { voiceStore } from '$lib/stores/voice.svelte';\n\n\tinterface Props {\n\t\ttarget: string | null;\n\t\t/**\n\t\t * The ways out of a recording that keep it, in the order the composer\n\t\t * offers them for typed text: the panel is where the eye is during a\n\t\t * take, so it carries the same verbs rather than sending the thumb back\n\t\t * down for them.\n\t\t */\n\t\tactions?: VoiceAction[];\n\t}\n\n\tlet { target, actions = [] }: Props = $props();\n\n\tconst BARS = 12;\n\n\t/**\n\t * Recording state, hung above the microphone it belongs to: level, clock,\n\t * and the way out. Anchored to the button's right edge so a phone never\n\t * pushes it off screen.\n\t */\n\tconst owned = $derived(voiceStore.isOwnedBy(target));\n\tconst showing = $derived(owned && voiceStore.isActive);\n\tconst status = $derived(owned ? voiceStore.status : 'idle');\n\tconst lit = $derived(Math.min(BARS, Math.round(voiceStore.level.rms * 26)));\n\tconst clipping = $derived(voiceStore.level.peak >= 0.98);\n\tconst tooSoft = $derived(voiceStore.level.peak < 0.04);\n\n\t/** Read off the store's own start, so a meter that mounts mid-take is right. */\n\tlet now = $state(Date.now());\n\n\t$effect(() => {\n\t\tif (status !== 'recording') return;\n\t\tconst id = setInterval(() => (now = Date.now()), 500);\n\t\treturn () => clearInterval(id);\n\t});\n\n\tconst elapsed = $derived(\n\t\tvoiceStore.startedAt === null ? '0:00' : formatElapsed((now - voiceStore.startedAt) / 1000)\n\t);\n</script>\n\n{#if showing}\n\t<div class=\"meter\" class:clipping>\n\t\t<span\n\t\t\tclass=\"bars\"\n\t\t\ttitle={clipping\n\t\t\t\t? 'Clipping — too loud'\n\t\t\t\t: tooSoft\n\t\t\t\t\t? 'Too soft — speak louder or raise gain'\n\t\t\t\t\t: `Level ${(voiceStore.level.rms * 100).toFixed(0)}%`}\n\t\t>\n\t\t\t{#each Array(BARS) as _, i (i)}\n\t\t\t\t<span class=\"bar\" class:on={i < lit} style=\"--i: {i}\"></span>\n\t\t\t{/each}\n\t\t</span>\n\t\t<span class=\"clock\">\n\t\t\t{status === 'recording' ? elapsed : 'transcribing'}\n\t\t</span>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"btn drop\"\n\t\t\taria-label=\"Discard recording\"\n\t\t\ttitle=\"Discard recording / transcription\"\n\t\t\tonclick={() => void voiceStore.cancel()}\n\t\t>\n\t\t\t<iconify-icon icon=\"mdi:close\"></iconify-icon>\n\t\t</button>\n\t\t{#if status === 'recording'}\n\t\t\t{#each actions as action, i (action.label)}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"btn\"\n\t\t\t\t\tclass:keep={i === 0}\n\t\t\t\t\tclass:also={i > 0}\n\t\t\t\t\taria-label={action.label}\n\t\t\t\t\ttitle={action.title}\n\t\t\t\t\tonclick={action.run}\n\t\t\t\t>\n\t\t\t\t\t<iconify-icon icon={action.icon}></iconify-icon>\n\t\t\t\t</button>\n\t\t\t{/each}\n\t\t{/if}\n\t</div>\n{/if}\n\n<style>\n\t.meter {\n\t\tposition: absolute;\n\t\tbottom: calc(100% + 8px);\n\t\tright: 0;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\theight: 44px;\n\t\tpadding: 0 5px 0 12px;\n\t\tbackground: #1a1a1a;\n\t\tborder: 1px solid #333;\n\t\tborder-radius: 22px;\n\t\twhite-space: nowrap;\n\t\tbox-shadow: 0 6px 18px rgba(0, 0, 0, 0.45);\n\t}\n\t.clipping {\n\t\tborder-color: rgba(220, 38, 38, 0.6);\n\t}\n\n\t.bars {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 2px;\n\t\theight: 16px;\n\t}\n\t.bar {\n\t\twidth: 2px;\n\t\theight: calc(5px + var(--i) * 0.9px);\n\t\tborder-radius: 1px;\n\t\tbackground: #3f3c39;\n\t}\n\t.bar.on {\n\t\tbackground: #34d399;\n\t}\n\t.bar.on:nth-child(n + 9) {\n\t\tbackground: #fbbf24;\n\t}\n\t.bar.on:nth-child(n + 12) {\n\t\tbackground: #f87171;\n\t}\n\n\t.clock {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 11px;\n\t\tfont-variant-numeric: tabular-nums;\n\t\tcolor: #a8a29e;\n\t}\n\n\t/* Every verb is the same key, sized for a thumb rather than a cursor —\n\t the panel is read at arm's length on a phone, mid-sentence. */\n\t.btn {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 34px;\n\t\theight: 34px;\n\t\tborder-radius: 50%;\n\t\tborder: 0;\n\t\tbackground: transparent;\n\t\tfont-size: 20px;\n\t\tcursor: pointer;\n\t\ttouch-action: manipulation;\n\t}\n\t.drop {\n\t\tcolor: #fca5a5;\n\t}\n\t.drop:hover {\n\t\tbackground: rgba(220, 38, 38, 0.18);\n\t}\n\t.keep {\n\t\tcolor: #34d399;\n\t}\n\t.keep:hover {\n\t\tbackground: rgba(22, 163, 74, 0.2);\n\t}\n\t.also {\n\t\tcolor: #d6d3d1;\n\t}\n\t.also:hover {\n\t\tbackground: rgba(255, 255, 255, 0.1);\n\t}\n</style>\n","/** The image formats the dashboard serves and draws, by extension. Browser-safe: no node imports. */\nconst IMAGE_MIME_TYPES: Record<string, string> = {\n\t'.png': 'image/png',\n\t'.jpg': 'image/jpeg',\n\t'.jpeg': 'image/jpeg',\n\t'.gif': 'image/gif',\n\t'.webp': 'image/webp'\n};\n\n/** The image MIME type for a path, or null when it is not an image the dashboard serves. */\nexport function imageMimeFor(path: string): string | null {\n\tconst dot = path.lastIndexOf('.');\n\t// Like path.extname: a leading dot names a dotfile, not an extension.\n\tif (dot <= path.lastIndexOf('/') + 1) return null;\n\treturn IMAGE_MIME_TYPES[path.slice(dot).toLowerCase()] ?? null;\n}\n","<script lang=\"ts\">\n\t/**\n\t * Everything waiting to reach the agent, in one place, attached to the top\n\t * edge of the composer: text typed into the pane's own prompt box, which\n\t * must be sent or cleared before anything else can go in (a paste would\n\t * join the two); claude-mux's own queue (it can be reordered, edited,\n\t * steered into the running turn, or dropped); then what sits in Claude\n\t * Code's in-pane queue, which only Claude Code can reorder and which offers\n\t * the one action it has — send now.\n\t *\n\t * The layout follows t3code's QueuedRunsControl\n\t * (https://github.com/pingdotgg/t3code, apps/web/src/components/chat/QueuedRunsControl.tsx,\n\t * MIT, © T3 Tools Inc.), adapted to a server-held queue.\n\t */\n\timport * as Collapsible from '$lib/components/ui/collapsible';\n\timport type { QueuedMessageInfo } from '$shared/types/ws-messages.js';\n\timport { STEERS, type SteerMode } from '$lib/constants';\n\n\tconst STEER_MODES = Object.keys(STEERS) as SteerMode[];\n\timport { imageMimeFor } from '$shared/utils/image-types.js';\n\n\tlet {\n\t\ttarget,\n\t\tbase = '',\n\t\tsessionId = null,\n\t\tqueue,\n\t\tpaneQueue = [],\n\t\tbusy = false,\n\t\teditingId = null,\n\t\tpaneDraft = null,\n\t\tcomposerHasText = false,\n\t\tonEdit,\n\t\tonSendDraft,\n\t\tonClearDraft\n\t}: {\n\t\ttarget: string;\n\t\t/** The relay path to the session's machine, '' for this one. */\n\t\tbase?: string;\n\t\t/** Attachments are stored per session id, which the thumbnails are fetched by. */\n\t\tsessionId?: string | null;\n\t\tqueue: QueuedMessageInfo[];\n\t\t/** Messages typed into Claude Code's own queue, read off the pane. */\n\t\tpaneQueue?: string[];\n\t\t/** A turn is running, so a steer or send-now has somewhere to go. */\n\t\tbusy?: boolean;\n\t\t/** The item the composer is editing, drawn as such. */\n\t\teditingId?: string | null;\n\t\t/** What is typed in the pane's prompt box, where the terminal is not on screen to show it. */\n\t\tpaneDraft?: string | null;\n\t\t/** The composer holds a message the typed text stands in the way of. */\n\t\tcomposerHasText?: boolean;\n\t\tonEdit: (item: QueuedMessageInfo) => void;\n\t\t/** Submit the pane's typed text as it stands. */\n\t\tonSendDraft?: () => void;\n\t\t/** Empty the pane's prompt box. */\n\t\tonClearDraft?: () => void;\n\t} = $props();\n\n\tlet open = $state(true);\n\tlet error = $state<string | null>(null);\n\t/** The item being dragged by its grip, and the slot it would land in. */\n\tlet drag = $state<{ id: string; from: number; to: number } | null>(null);\n\tlet listEl: HTMLElement | null = $state(null);\n\t/** The rows' vertical midpoints, measured once when a drag starts. */\n\tlet midpoints: number[] = [];\n\n\tconst total = $derived(queue.length + paneQueue.length + (paneDraft ? 1 : 0));\n\tconst api = $derived(`${base}/api/sessions/${encodeURIComponent(target)}`);\n\n\tasync function call(path: string, method: string, body?: object): Promise<void> {\n\t\terror = null;\n\t\tconst res = await fetch(`${api}/${path}`, {\n\t\t\tmethod,\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tbody: body ? JSON.stringify(body) : undefined\n\t\t});\n\t\tif (!res.ok) {\n\t\t\tconst data = (await res.json().catch(() => ({}))) as { error?: string };\n\t\t\terror = data.error ?? res.statusText;\n\t\t}\n\t}\n\n\t// By id: the drain may send the head between this render and the request.\n\tconst remove = (id: string) => call('queue', 'DELETE', { id });\n\tconst move = (fromIndex: number, toIndex: number) => {\n\t\tif (toIndex < 0 || toIndex >= queue.length || toIndex === fromIndex) return;\n\t\tvoid call('queue', 'PATCH', { id: queue[fromIndex].id, toIndex });\n\t};\n\tconst steer = (id: string, mode: SteerMode) => call('steer', 'POST', { id, mode });\n\tconst sendNow = () => call('send-now', 'POST');\n\n\tfunction onGripKey(e: KeyboardEvent, index: number) {\n\t\tif (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n\t\t\te.preventDefault();\n\t\t\tmove(index, index + (e.key === 'ArrowUp' ? -1 : 1));\n\t\t}\n\t}\n\n\t/** The slot a pointer at this height falls into: the last row whose midpoint it is past. */\n\tfunction slotAt(y: number): number {\n\t\tlet slot = 0;\n\t\tfor (const [i, mid] of midpoints.entries()) if (y > mid) slot = i;\n\t\treturn slot;\n\t}\n\n\tfunction onGripDown(e: PointerEvent, item: QueuedMessageInfo, index: number) {\n\t\tif (e.button !== 0) return;\n\t\t(e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n\t\tconst rows = listEl ? Array.from(listEl.querySelectorAll<HTMLElement>('[data-queue-row]')) : [];\n\t\tmidpoints = rows.map((row) => {\n\t\t\tconst r = row.getBoundingClientRect();\n\t\t\treturn r.top + r.height / 2;\n\t\t});\n\t\tdrag = { id: item.id, from: index, to: index };\n\t}\n\tfunction onGripMove(e: PointerEvent) {\n\t\tif (drag) drag.to = slotAt(e.clientY);\n\t}\n\tfunction onGripUp() {\n\t\tif (!drag) return;\n\t\tconst { from, to } = drag;\n\t\tdrag = null;\n\t\tmove(from, to);\n\t}\n\n\tconst fileName = (path: string) => path.split('/').pop() ?? path;\n\tconst thumbUrl = (id: string, path: string) =>\n\t\t`${base}/api/sessions/${encodeURIComponent(id)}/attach?path=${encodeURIComponent(path)}`;\n</script>\n\n{#if total > 0}\n\t<Collapsible.Root bind:open class=\"qs\">\n\t\t<div class=\"qs-head\">\n\t\t\t<Collapsible.Trigger class=\"qs-toggle\">\n\t\t\t\t<iconify-icon icon={open ? 'mdi:chevron-down' : 'mdi:chevron-right'}></iconify-icon>\n\t\t\t\tQueued ({total})\n\t\t\t</Collapsible.Trigger>\n\t\t\t{#if error}<span class=\"qs-error\" role=\"alert\">{error}</span>{/if}\n\t\t</div>\n\t\t<Collapsible.Content>\n\t\t\t<ul class=\"qs-list\" bind:this={listEl}>\n\t\t\t\t{#if paneDraft}\n\t\t\t\t\t<!-- Outside the list's drag order: it is not in any queue, and nothing\n\t\t\t\t\t can be pasted in until it goes. -->\n\t\t\t\t\t<li class=\"qs-row in-box\">\n\t\t\t\t\t\t<span class=\"qs-grip\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:console-line\"></iconify-icon>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<div class=\"qs-body\">\n\t\t\t\t\t\t\t<p class=\"qs-text\">\n\t\t\t\t\t\t\t\t<span class=\"qs-tag\">typed in the pane</span>\n\t\t\t\t\t\t\t\t{#if composerHasText}<span class=\"qs-tag blocks\">send or clear it first</span>{/if}\n\t\t\t\t\t\t\t\t{paneDraft}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"qs-actions\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"qs-btn\"\n\t\t\t\t\t\t\t\ttitle=\"Send what is typed in the pane\"\n\t\t\t\t\t\t\t\taria-label=\"Send\"\n\t\t\t\t\t\t\t\tonclick={() => onSendDraft?.()}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:send\"></iconify-icon>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"qs-btn qs-remove\"\n\t\t\t\t\t\t\t\ttitle=\"Clear the pane's prompt box\"\n\t\t\t\t\t\t\t\taria-label=\"Clear\"\n\t\t\t\t\t\t\t\tonclick={() => onClearDraft?.()}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:close\"></iconify-icon>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</li>\n\t\t\t\t{/if}\n\t\t\t\t{#each queue as item, i (item.id)}\n\t\t\t\t\t{@const dropHere = drag && drag.id !== item.id && drag.to === i}\n\t\t\t\t\t<li\n\t\t\t\t\t\tclass=\"qs-row\"\n\t\t\t\t\t\tdata-queue-row\n\t\t\t\t\t\tclass:editing={item.id === editingId}\n\t\t\t\t\t\tclass:dragging={drag?.id === item.id}\n\t\t\t\t\t\tclass:drop-above={dropHere && drag!.from > i}\n\t\t\t\t\t\tclass:drop-below={dropHere && drag!.from < i}\n\t\t\t\t\t>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"qs-grip\"\n\t\t\t\t\t\t\ttitle=\"Drag, or use the arrow keys, to reorder\"\n\t\t\t\t\t\t\taria-label={`Reorder message ${i + 1} of ${queue.length}`}\n\t\t\t\t\t\t\tdisabled={queue.length < 2}\n\t\t\t\t\t\t\tonkeydown={(e) => onGripKey(e, i)}\n\t\t\t\t\t\t\tonpointerdown={(e) => onGripDown(e, item, i)}\n\t\t\t\t\t\t\tonpointermove={onGripMove}\n\t\t\t\t\t\t\tonpointerup={onGripUp}\n\t\t\t\t\t\t\tonpointercancel={() => (drag = null)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:drag-vertical\"></iconify-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<div class=\"qs-body\">\n\t\t\t\t\t\t\t{#if item.attachments?.length}\n\t\t\t\t\t\t\t\t<div class=\"qs-thumbs\">\n\t\t\t\t\t\t\t\t\t{#each item.attachments as path (path)}\n\t\t\t\t\t\t\t\t\t\t{#if imageMimeFor(path) && sessionId}\n\t\t\t\t\t\t\t\t\t\t\t<img class=\"qs-thumb\" src={thumbUrl(sessionId, path)} alt={fileName(path)} title={fileName(path)} />\n\t\t\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"qs-thumb qs-file\" title={fileName(path)}>\n\t\t\t\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:file-outline\"></iconify-icon>\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t<p class=\"qs-text\">\n\t\t\t\t\t\t\t\t{#if item.kind === 'control'}<span class=\"qs-tag\">dashboard</span>{/if}\n\t\t\t\t\t\t\t\t{#if item.id === editingId}<span class=\"qs-tag edit\">editing</span>{/if}\n\t\t\t\t\t\t\t\t{item.text}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"qs-actions\">\n\t\t\t\t\t\t\t{#if item.kind === 'user'}\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"qs-btn\"\n\t\t\t\t\t\t\t\t\ttitle=\"Edit in the composer\"\n\t\t\t\t\t\t\t\t\taria-label=\"Edit\"\n\t\t\t\t\t\t\t\t\tonclick={() => onEdit(item)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:pencil-outline\"></iconify-icon>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t{#if busy}\n\t\t\t\t\t\t\t\t\t{#each STEER_MODES as mode (mode)}\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"qs-btn\"\n\t\t\t\t\t\t\t\t\t\t\ttitle={STEERS[mode].title}\n\t\t\t\t\t\t\t\t\t\t\taria-label={STEERS[mode].label}\n\t\t\t\t\t\t\t\t\t\t\tonclick={() => void steer(item.id, mode)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<iconify-icon icon={STEERS[mode].icon}></iconify-icon>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"qs-btn qs-remove\"\n\t\t\t\t\t\t\t\ttitle=\"Remove from the queue\"\n\t\t\t\t\t\t\t\taria-label=\"Remove\"\n\t\t\t\t\t\t\t\tonclick={() => void remove(item.id)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:close\"></iconify-icon>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</li>\n\t\t\t\t{/each}\n\t\t\t\t{#each paneQueue as text, i (i + text)}\n\t\t\t\t\t<li class=\"qs-row in-pane\">\n\t\t\t\t\t\t<span class=\"qs-grip\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:console-line\"></iconify-icon>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<div class=\"qs-body\">\n\t\t\t\t\t\t\t<p class=\"qs-text\"><span class=\"qs-tag\">in Claude's queue</span>{text}</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{#if busy && i === 0}\n\t\t\t\t\t\t\t<!-- Claude Code hands its whole queue over at once, so the\n\t\t\t\t\t\t\t action sits on the first row and covers them all. -->\n\t\t\t\t\t\t\t<div class=\"qs-actions\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"qs-btn qs-wide\"\n\t\t\t\t\t\t\t\t\ttitle=\"Hand Claude's queue to the running turn now\"\n\t\t\t\t\t\t\t\t\tonclick={() => void sendNow()}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:send-clock-outline\"></iconify-icon>Send now\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</li>\n\t\t\t\t{/each}\n\t\t\t</ul>\n\t\t</Collapsible.Content>\n\t</Collapsible.Root>\n{/if}\n\n<style>\n\t/* A shelf on the composer's top edge: narrower than the card, the same\n\t surface, so it reads as part of the composer rather than the transcript. */\n\t:global(.qs) {\n\t\tmargin: 0 14px;\n\t\tbackground: #1a1a1b;\n\t\tborder: 1px solid #2a2a2c;\n\t\tborder-bottom: 0;\n\t\tborder-radius: 12px 12px 0 0;\n\t\tpadding: 4px 6px 6px;\n\t\tanimation: shelf-in 140ms ease-out;\n\t}\n\t@media (min-width: 900px) {\n\t\t:global(.qs) {\n\t\t\twidth: calc(100% - 28px);\n\t\t\tmax-width: calc(62rem - 28px);\n\t\t\tmargin: 0 auto;\n\t\t}\n\t}\n\n\t.qs-head {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tmin-height: 26px;\n\t}\n\t:global(.qs-toggle) {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 4px;\n\t\tpadding: 2px 6px 2px 2px;\n\t\tborder: 0;\n\t\tborder-radius: 6px;\n\t\tbackground: transparent;\n\t\tcolor: #a8a29e;\n\t\tfont-size: 12px;\n\t\tcursor: pointer;\n\t}\n\t:global(.qs-toggle:hover) {\n\t\tcolor: #e7e5e4;\n\t}\n\t:global(.qs-toggle:focus-visible) {\n\t\toutline: 2px solid #f59e0b;\n\t\toutline-offset: 1px;\n\t}\n\t.qs-error {\n\t\tcolor: #f87171;\n\t\tfont-size: 11px;\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\n\t.qs-list {\n\t\tlist-style: none;\n\t\tmargin: 2px 0 0;\n\t\tpadding: 0;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 2px;\n\t\tmax-height: 30vh;\n\t\toverflow-y: auto;\n\t}\n\t.qs-row {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tgap: 4px;\n\t\tpadding: 4px 4px 4px 0;\n\t\tborder-radius: 8px;\n\t\tborder-top: 2px solid transparent;\n\t\tborder-bottom: 2px solid transparent;\n\t}\n\t.qs-row:hover {\n\t\tbackground: #222224;\n\t}\n\t.qs-row.editing {\n\t\tbackground: #1f2a22;\n\t}\n\t.qs-row.dragging {\n\t\topacity: 0.5;\n\t}\n\t.qs-row.drop-above {\n\t\tborder-top-color: #57534e;\n\t}\n\t.qs-row.drop-below {\n\t\tborder-bottom-color: #57534e;\n\t}\n\t.qs-row.in-pane .qs-text {\n\t\tcolor: #8a8580;\n\t}\n\t.qs-tag.blocks {\n\t\tbackground: #3a2a0c;\n\t\tcolor: #fbbf24;\n\t}\n\n\t.qs-grip {\n\t\tflex: none;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 22px;\n\t\theight: 28px;\n\t\tborder: 0;\n\t\tborder-radius: 6px;\n\t\tbackground: transparent;\n\t\tcolor: #57534e;\n\t\tfont-size: 16px;\n\t\tcursor: grab;\n\t\ttouch-action: none;\n\t}\n\t.qs-grip:disabled {\n\t\tcursor: default;\n\t}\n\t.qs-grip:focus-visible {\n\t\toutline: 2px solid #f59e0b;\n\t\tcolor: #e7e5e4;\n\t}\n\t.qs-row.in-pane .qs-grip,\n\t.qs-row.in-box .qs-grip {\n\t\tcursor: default;\n\t\tfont-size: 13px;\n\t}\n\n\t.qs-body {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\tpadding-top: 5px;\n\t}\n\t.qs-text {\n\t\tmargin: 0;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 12px;\n\t\tline-height: 1.45;\n\t\tcolor: #d6d3d1;\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t\tdisplay: -webkit-box;\n\t\t-webkit-box-orient: vertical;\n\t\t-webkit-line-clamp: 2;\n\t\tline-clamp: 2;\n\t\toverflow: hidden;\n\t}\n\t.qs-tag {\n\t\tmargin-right: 6px;\n\t\tpadding: 0 5px;\n\t\tborder-radius: 4px;\n\t\tbackground: #2a2a2c;\n\t\tcolor: #a8a29e;\n\t\tfont-size: 10.5px;\n\t}\n\t.qs-tag.edit {\n\t\tbackground: #14532d;\n\t\tcolor: #d6f5e0;\n\t}\n\n\t.qs-thumbs {\n\t\tdisplay: flex;\n\t\tgap: 4px;\n\t\tmargin-bottom: 4px;\n\t}\n\t.qs-thumb {\n\t\twidth: 32px;\n\t\theight: 32px;\n\t\tborder-radius: 5px;\n\t\tobject-fit: cover;\n\t\tbackground: #2a2a2c;\n\t}\n\t.qs-file {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tcolor: #a8a29e;\n\t}\n\n\t.qs-actions {\n\t\tflex: none;\n\t\tdisplay: flex;\n\t\tgap: 2px;\n\t}\n\t.qs-btn {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tgap: 4px;\n\t\tmin-width: 30px;\n\t\theight: 28px;\n\t\tpadding: 0 6px;\n\t\tborder: 0;\n\t\tborder-radius: 6px;\n\t\tbackground: transparent;\n\t\tcolor: #a8a29e;\n\t\tfont-size: 15px;\n\t\tcursor: pointer;\n\t}\n\t.qs-btn:hover {\n\t\tbackground: #2e2926;\n\t\tcolor: #e7e5e4;\n\t}\n\t.qs-btn:focus-visible {\n\t\toutline: 2px solid #f59e0b;\n\t\toutline-offset: 1px;\n\t}\n\t.qs-remove:hover {\n\t\tbackground: #3a1a1a;\n\t\tcolor: #f87171;\n\t}\n\t.qs-wide {\n\t\tfont-size: 12px;\n\t}\n\t.qs-wide iconify-icon {\n\t\tfont-size: 15px;\n\t}\n\n\t@keyframes shelf-in {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: translateY(4px);\n\t\t}\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:global(.qs) {\n\t\t\tanimation: none;\n\t\t}\n\t}\n</style>\n","<script lang=\"ts\">\n\timport { Button } from '$lib/components/ui/button';\n\timport { Checkbox } from '$lib/components/ui/checkbox';\n\timport { longPress } from '$lib/actions/longPress';\n\timport { clickOutside } from '$lib/actions/clickOutside';\n\timport { voiceStore, type VoiceLanguage } from '$lib/stores/voice.svelte';\n\timport { listAudioInputs, type AudioInputDevice } from '$lib/voice/recorder';\n\n\tinterface Props {\n\t\ttarget: string | null;\n\t\t/**\n\t\t * The tap. The composer owns the take and what becomes of the words, so\n\t\t * this button, the hotkey and the gamepad all go through its one toggle.\n\t\t */\n\t\tonToggle: () => void;\n\t}\n\n\tlet { target, onToggle }: Props = $props();\n\n\tconst supported = $derived(voiceStore.supported);\n\t// Voice is a single-mic singleton owned by the page that started it; non-owner\n\t// pages render as idle so stray clicks/hotkeys/Esc can't hijack it.\n\tconst isOwner = $derived(voiceStore.isOwnedBy(target));\n\tconst busyElsewhere = $derived(voiceStore.isActive && !isOwner);\n\tconst status = $derived(isOwner ? voiceStore.status : 'idle');\n\tconst errorMsg = $derived(isOwner ? voiceStore.error : null);\n\n\tconst MAX_RECORDING_MS = 10 * 60 * 1000;\n\tconst LONG_TRANSCRIBE_MS = 5000;\n\n\tlet isLongTranscribe = $state(false);\n\tlet menuOpen = $state(false);\n\tlet devices = $state<AudioInputDevice[]>([]);\n\n\t$effect(() => {\n\t\tif (status !== 'transcribing') {\n\t\t\tisLongTranscribe = false;\n\t\t\treturn;\n\t\t}\n\t\tconst id = setTimeout(() => {\n\t\t\tisLongTranscribe = true;\n\t\t}, LONG_TRANSCRIBE_MS);\n\t\treturn () => clearTimeout(id);\n\t});\n\n\t// A take left running is stopped, and kept, before it outgrows what one upload carries.\n\t$effect(() => {\n\t\tif (status !== 'recording') return;\n\t\tconst auto = setTimeout(toggleVoice, MAX_RECORDING_MS);\n\t\treturn () => clearTimeout(auto);\n\t});\n\n\tfunction toggleVoice(): void {\n\t\tif (!busyElsewhere && target) onToggle();\n\t}\n\n\tasync function openMenu(): Promise<void> {\n\t\ttry {\n\t\t\tdevices = await listAudioInputs();\n\t\t} catch {\n\t\t\tdevices = [];\n\t\t}\n\t\tmenuOpen = true;\n\t}\n\n\tfunction canOpenMenu(): boolean {\n\t\treturn !busyElsewhere && (status === 'idle' || status === 'error');\n\t}\n\n\tfunction handleContextMenu(e: MouseEvent): void {\n\t\tif (!canOpenMenu()) return;\n\t\te.preventDefault();\n\t\tvoid openMenu();\n\t}\n\n\tconst buttonTitle = $derived.by(() => {\n\t\tif (busyElsewhere) {\n\t\t\treturn `Voice ${voiceStore.status} on ${voiceStore.ownerTarget}. Switch to that session to control it.`;\n\t\t}\n\t\tif (errorMsg) return errorMsg;\n\t\tif (status === 'transcribing')\n\t\t\treturn isLongTranscribe\n\t\t\t\t? 'First-run setup. ✕ or Esc to cancel.'\n\t\t\t\t: 'Transcribing. ✕ or Esc to cancel.';\n\t\tif (status === 'recording')\n\t\t\treturn 'Tap or F2/Pause/Ctrl+` to stop. ✕ or Esc to discard.';\n\t\treturn 'Tap or focus input then F2/Pause/Ctrl+` to record. Long-press or right-click for settings.';\n\t});\n\n\tfunction setLanguage(lang: VoiceLanguage): void {\n\t\tvoiceStore.language = lang;\n\t}\n\n\tfunction setDevice(e: Event): void {\n\t\tconst value = (e.target as HTMLSelectElement).value;\n\t\tvoiceStore.deviceId = value || null;\n\t}\n\n\tfunction setAutoSubmit(checked: boolean | 'indeterminate'): void {\n\t\tvoiceStore.autoSubmit = checked === true;\n\t}\n\n\tfunction setGain(e: Event): void {\n\t\tconst value = parseFloat((e.target as HTMLInputElement).value);\n\t\tif (!Number.isNaN(value)) voiceStore.gain = value;\n\t}\n\n\tfunction setNoiseSuppression(checked: boolean | 'indeterminate'): void {\n\t\tvoiceStore.noiseSuppression = checked === true;\n\t}\n\n\tfunction showUnsupportedReason(): void {\n\t\tconst reason = voiceStore.unsupportedReason ?? 'Voice not supported.';\n\t\talert(reason);\n\t}\n</script>\n\n<div\n\tclass=\"voice-btn-wrapper round\"\n\toncontextmenu={supported ? handleContextMenu : undefined}\n\trole=\"presentation\"\n\tuse:longPress={{\n\t\tonTrigger: () => void openMenu(),\n\t\tenabled: () => supported && canOpenMenu()\n\t}}\n\tuse:clickOutside={{\n\t\tenabled: menuOpen,\n\t\tonOutside: () => (menuOpen = false)\n\t}}\n>\n\t{#if !supported}\n\t\t<Button\n\t\t\tvariant=\"secondary\"\n\t\t\tsize=\"toolbar\"\n\t\t\tclass=\"flex-1 voice-btn unsupported\"\n\t\t\tonclick={showUnsupportedReason}\n\t\t\ttitle={voiceStore.unsupportedReason ?? 'Voice not supported'}\n\t\t>\n\t\t\t<iconify-icon icon=\"mdi:microphone-off\"></iconify-icon>\n\t\t\t<span>Mic</span>\n\t\t</Button>\n\t{:else}\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"voice-round {status}\"\n\t\t\tdisabled={!target || busyElsewhere}\n\t\t\tonclick={() => void toggleVoice()}\n\t\t\ttitle={buttonTitle}\n\t\t\taria-label={buttonTitle}\n\t\t>\n\t\t\t{#if busyElsewhere}\n\t\t\t\t<iconify-icon icon=\"mdi:microphone-off\"></iconify-icon>\n\t\t\t{:else if status === 'transcribing'}\n\t\t\t\t<iconify-icon icon=\"mdi:loading\" class=\"spin\"></iconify-icon>\n\t\t\t{:else if status === 'error'}\n\t\t\t\t<iconify-icon icon=\"mdi:microphone-off\"></iconify-icon>\n\t\t\t{:else}\n\t\t\t\t<iconify-icon icon=\"mdi:microphone\"></iconify-icon>\n\t\t\t{/if}\n\t\t</button>\n\t{/if}\n\n\t\t{#if menuOpen}\n\t\t\t<div class=\"voice-menu\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"voice-menu-close\"\n\t\t\t\t\taria-label=\"Close settings\"\n\t\t\t\t\tonclick={() => (menuOpen = false)}\n\t\t\t\t>\n\t\t\t\t\t<iconify-icon icon=\"mdi:close\"></iconify-icon>\n\t\t\t\t</button>\n\t\t\t\t<div class=\"setting-row\">\n\t\t\t\t\t<span class=\"setting-label\">Language</span>\n\t\t\t\t\t<div class=\"lang-row\">\n\t\t\t\t\t\t{#each ['auto', 'en', 'pt'] as const as lang}\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant={voiceStore.language === lang ? 'success' : 'secondary'}\n\t\t\t\t\t\t\t\tsize=\"toolbar\"\n\t\t\t\t\t\t\t\tclass=\"flex-1\"\n\t\t\t\t\t\t\t\tonclick={() => setLanguage(lang)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{lang.toUpperCase()}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<label class=\"setting-row inline\">\n\t\t\t\t\t<Checkbox\n\t\t\t\t\t\tchecked={voiceStore.autoSubmit}\n\t\t\t\t\t\tonCheckedChange={setAutoSubmit}\n\t\t\t\t\t/>\n\t\t\t\t\t<span class=\"setting-label inline\">Send when the recording stops</span>\n\t\t\t\t</label>\n\n\t\t\t\t<div class=\"setting-row\">\n\t\t\t\t\t<label class=\"setting-label\" for=\"voice-gain\">\n\t\t\t\t\t\tGain ×{voiceStore.gain.toFixed(1)}\n\t\t\t\t\t</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"voice-gain\"\n\t\t\t\t\t\ttype=\"range\"\n\t\t\t\t\t\tmin=\"1\"\n\t\t\t\t\t\tmax=\"6\"\n\t\t\t\t\t\tstep=\"0.5\"\n\t\t\t\t\t\tvalue={voiceStore.gain}\n\t\t\t\t\t\toninput={setGain}\n\t\t\t\t\t\tclass=\"gain-slider\"\n\t\t\t\t\t/>\n\t\t\t\t\t<p class=\"setting-hint\">Boost quiet voice. Higher = louder + more noise.</p>\n\t\t\t\t</div>\n\n\t\t\t\t<label class=\"setting-row inline\">\n\t\t\t\t\t<Checkbox\n\t\t\t\t\t\tchecked={voiceStore.noiseSuppression}\n\t\t\t\t\t\tonCheckedChange={setNoiseSuppression}\n\t\t\t\t\t/>\n\t\t\t\t\t<span class=\"setting-label inline\">Noise suppression (off helps very quiet speech)</span>\n\t\t\t\t</label>\n\n\t\t\t\t<div class=\"setting-row\">\n\t\t\t\t\t<label class=\"setting-label\" for=\"voice-device\">Microphone</label>\n\t\t\t\t\t<select\n\t\t\t\t\t\tid=\"voice-device\"\n\t\t\t\t\t\tclass=\"device-select\"\n\t\t\t\t\t\tvalue={voiceStore.deviceId ?? ''}\n\t\t\t\t\t\tonchange={setDevice}\n\t\t\t\t\t>\n\t\t\t\t\t\t<option value=\"\">System default</option>\n\t\t\t\t\t\t{#each devices as d (d.deviceId)}\n\t\t\t\t\t\t\t<option value={d.deviceId}>{d.label}</option>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</select>\n\t\t\t\t\t{#if devices.length === 0}\n\t\t\t\t\t\t<p class=\"setting-hint\">Allow mic access first to see device names.</p>\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t{/if}\n\t</div>\n\n<style>\n\t.voice-btn-wrapper {\n\t\tposition: relative;\n\t\tdisplay: flex;\n\t\tflex: 1;\n\t}\n\n\t.voice-btn-wrapper.round {\n\t\tflex: none;\n\t\twidth: 42px;\n\t\theight: 42px;\n\t}\n\n\t.voice-round {\n\t\twidth: 42px;\n\t\theight: 42px;\n\t\tborder-radius: 50%;\n\t\tborder: 1px solid #333;\n\t\tbackground: #222;\n\t\tcolor: #f5f5f4;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tfont-size: 19px;\n\t\tcursor: pointer;\n\t\ttouch-action: none;\n\t\tuser-select: none;\n\t\t/* punches the rail's channel out of the panel behind it */\n\t\tbox-shadow: 0 0 0 4px #111;\n\t}\n\t.voice-round:hover:not(:disabled) {\n\t\tbackground: #333;\n\t}\n\t.voice-round:disabled {\n\t\topacity: 0.5;\n\t\tcursor: default;\n\t}\n\t.voice-round.recording,\n\t.voice-round.error {\n\t\tbackground: #b91c1c;\n\t\tborder-color: #b91c1c;\n\t\tcolor: #fff;\n\t}\n\n\t:global(.voice-btn) {\n\t\ttouch-action: none;\n\t\tuser-select: none;\n\t\twidth: 100%;\n\t}\n\n\t.spin {\n\t\tanimation: voice-spin 1s linear infinite;\n\t\tdisplay: inline-block;\n\t}\n\n\t@keyframes voice-spin {\n\t\tto { transform: rotate(360deg); }\n\t}\n\n\t.voice-menu {\n\t\tposition: absolute;\n\t\tbottom: calc(100% + 6px);\n\t\tright: 0;\n\t\twidth: 18rem;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 0.85rem;\n\t\tpadding: 0.8rem;\n\t\tbackground: #1a1a1a;\n\t\tborder: 1px solid #333;\n\t\tborder-radius: 6px;\n\t\tbox-shadow: 0 6px 18px rgba(0, 0, 0, 0.4);\n\t\tz-index: var(--z-floating);\n\t}\n\n\t.voice-menu-close {\n\t\tposition: absolute;\n\t\ttop: 0.3rem;\n\t\tright: 0.3rem;\n\t\twidth: 1.6rem;\n\t\theight: 1.6rem;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tbackground: transparent;\n\t\tborder: 0;\n\t\tborder-radius: 4px;\n\t\tcolor: #aaa;\n\t\tfont-size: 1rem;\n\t\tcursor: pointer;\n\t\tpadding: 0;\n\t}\n\n\t.voice-menu-close:hover {\n\t\tbackground: #2a2a2a;\n\t\tcolor: #eee;\n\t}\n\n\t.setting-row {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 0.4rem;\n\t}\n\n\t.setting-row.inline {\n\t\tflex-direction: row;\n\t\talign-items: center;\n\t\tgap: 0.5rem;\n\t\tcursor: pointer;\n\t}\n\n\t.setting-label {\n\t\tfont-size: 0.72rem;\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.06em;\n\t\tcolor: #aaa;\n\t}\n\n\t.setting-label.inline {\n\t\ttext-transform: none;\n\t\tletter-spacing: normal;\n\t\tcolor: #ddd;\n\t\tfont-size: 0.85rem;\n\t}\n\n\t.lang-row {\n\t\tdisplay: flex;\n\t\tgap: 0.35rem;\n\t}\n\n\t.gain-slider {\n\t\twidth: 100%;\n\t\taccent-color: #84cc16;\n\t}\n\n\t.device-select {\n\t\twidth: 100%;\n\t\tpadding: 0.4rem 0.5rem;\n\t\tbackground: #222;\n\t\tcolor: #eee;\n\t\tborder: 1px solid #444;\n\t\tborder-radius: 4px;\n\t\tfont-size: 0.85rem;\n\t}\n\n\t.setting-hint {\n\t\tfont-size: 0.7rem;\n\t\tcolor: #888;\n\t\tmargin: 0;\n\t}\n</style>\n","<script lang=\"ts\">\n\t/**\n\t * The keys that drive the pane, in a well cut into the composer.\n\t *\n\t * One grid, one unit: every key is 42×30 or a whole-number span of it, so\n\t * nothing is sized by its own label. The arrow cluster keeps the two cells\n\t * beside Up empty — that gap is what makes an inverted T read as arrows in\n\t * peripheral vision, and filling it is what made the old 4×2 block\n\t * unreadable.\n\t *\n\t * Words for named keys, glyphs for direction. Chords use tmux's own `C-x`\n\t * notation, because that is the vocabulary this app already speaks.\n\t */\n\tinterface Props {\n\t\topen: boolean;\n\t\tctrlCount: number;\n\t\taltCount: number;\n\t\tonKeys: (keys: string) => void;\n\t\tonCycleCtrl: () => void;\n\t\tonCycleAlt: () => void;\n\t\t/** Put the draft in the prompt without submitting it. */\n\t\tonPutInPrompt: () => void;\n\t\t/** Take Claude Code's own suggestion: Tab, then Enter. */\n\t\tonAcceptSuggestion: () => void;\n\t\t/** Wipe whatever sits in the pane's prompt box. */\n\t\tonClearPrompt: () => void;\n\t}\n\n\tlet {\n\t\topen,\n\t\tctrlCount,\n\t\taltCount,\n\t\tonKeys,\n\t\tonCycleCtrl,\n\t\tonCycleAlt,\n\t\tonPutInPrompt,\n\t\tonAcceptSuggestion,\n\t\tonClearPrompt\n\t}: Props = $props();\n\n\tconst armed = $derived(ctrlCount > 0 || altCount > 0);\n\n\t/** Hold an arrow to repeat it, the way a real key repeats. */\n\tconst REPEAT_DELAY = 400;\n\tconst REPEAT_EVERY = 60;\n\tlet holdTimer: ReturnType<typeof setTimeout> | null = null;\n\tlet repeatTimer: ReturnType<typeof setInterval> | null = null;\n\n\tfunction startRepeat(keys: string) {\n\t\tstopRepeat();\n\t\tholdTimer = setTimeout(() => {\n\t\t\trepeatTimer = setInterval(() => onKeys(keys), REPEAT_EVERY);\n\t\t}, REPEAT_DELAY);\n\t}\n\n\tfunction stopRepeat() {\n\t\tif (holdTimer) clearTimeout(holdTimer);\n\t\tif (repeatTimer) clearInterval(repeatTimer);\n\t\tholdTimer = null;\n\t\trepeatTimer = null;\n\t}\n\n\t// Pointer capture can end without an up or a leave — and the tray itself is\n\t// removed by Ctrl+. or by leaving the session — so the timers need a\n\t// teardown that does not depend on the pointer reaching a handler.\n\t$effect(() => stopRepeat);\n\n\t/** The cluster, in the order a keyboard draws it. */\n\tconst ARROWS: { keys: string; cls: string; icon: string; label: string }[] = [\n\t\t{ keys: 'Up', cls: 'k-up', icon: 'mdi:arrow-up', label: 'Up' },\n\t\t{ keys: 'Left', cls: 'k-left', icon: 'mdi:arrow-left', label: 'Left' },\n\t\t{ keys: 'Down', cls: 'k-down', icon: 'mdi:arrow-down', label: 'Down' },\n\t\t{ keys: 'Right', cls: 'k-right', icon: 'mdi:arrow-right', label: 'Right' }\n\t];\n\n\tconst CHORDS = ['C-c', 'C-l', 'C-r', 'C-u', 'C-w'];\n\n\t/** The rest of what the More popover used to hide, so nothing is lost with it. */\n\tconst EXTRAS: { label: string; keys: string }[] = [\n\t\t{ label: 'bksp', keys: 'BSpace' },\n\t\t{ label: 'space', keys: 'Space' },\n\t\t{ label: 'y', keys: 'y' },\n\t\t{ label: '⇧tab', keys: 'BTab' }\n\t];\n</script>\n\n{#if open}\n\t<div class=\"tray\" class:armed>\n\t\t<div class=\"tray-body\">\n\t\t\t<div class=\"keys\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"k\"\n\t\t\t\t\tclass:on={ctrlCount > 0}\n\t\t\t\t\tonclick={onCycleCtrl}\n\t\t\t\t\ttitle=\"Arm Ctrl — the next Enter sends your line as a Ctrl sequence\"\n\t\t\t\t>\n\t\t\t\t\tctrl\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"k\"\n\t\t\t\t\tclass:on={altCount > 0}\n\t\t\t\t\tonclick={onCycleAlt}\n\t\t\t\t\ttitle=\"Arm Alt — the next Enter sends your line as a Meta sequence\"\n\t\t\t\t>\n\t\t\t\t\talt\n\t\t\t\t</button>\n\t\t\t\t<button type=\"button\" class=\"k\" onclick={() => onKeys('Escape')}>esc</button>\n\t\t\t\t<button type=\"button\" class=\"k\" onclick={() => onKeys('Tab')}>tab</button>\n\t\t\t\t<button type=\"button\" class=\"k k-pgup\" onclick={() => onKeys('PageUp')}>pgup</button>\n\t\t\t\t<button type=\"button\" class=\"k k-pgdn\" onclick={() => onKeys('PageDown')}>pgdn</button>\n\n\t\t\t\t{#each ARROWS as arrow (arrow.keys)}\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"k {arrow.cls}\"\n\t\t\t\t\t\taria-label={arrow.label}\n\t\t\t\t\t\tonclick={() => onKeys(arrow.keys)}\n\t\t\t\t\t\tonpointerdown={() => startRepeat(arrow.keys)}\n\t\t\t\t\t\tonpointerup={stopRepeat}\n\t\t\t\t\t\tonpointerleave={stopRepeat}\n\t\t\t\t\t\tonpointercancel={stopRepeat}\n\t\t\t\t\t>\n\t\t\t\t\t\t<iconify-icon icon={arrow.icon}></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t{/each}\n\n\t\t\t\t<button type=\"button\" class=\"k wide k-a\" onclick={onPutInPrompt}>\n\t\t\t\t\t<iconify-icon icon=\"mdi:tray-arrow-up\"></iconify-icon>Put in prompt\n\t\t\t\t</button>\n\t\t\t\t<button type=\"button\" class=\"k wide k-b\" onclick={onAcceptSuggestion}>\n\t\t\t\t\t<iconify-icon icon=\"mdi:star-four-points-outline\"></iconify-icon>Accept suggestion\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class=\"side\">\n\t\t\t\t<div class=\"extras\">\n\t\t\t\t\t{#each EXTRAS as extra (extra.label)}\n\t\t\t\t\t\t<button type=\"button\" class=\"k\" onclick={() => onKeys(extra.keys)}>{extra.label}</button>\n\t\t\t\t\t{/each}\n\t\t\t\t\t<button type=\"button\" class=\"k\" onclick={onClearPrompt}>clear</button>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"chords\">\n\t\t\t\t\t<span class=\"cap\">chords</span>\n\t\t\t\t\t<div class=\"crow\">\n\t\t\t\t\t\t{#each CHORDS as chord (chord)}\n\t\t\t\t\t\t\t<button type=\"button\" class=\"k\" onclick={() => onKeys(chord)}>{chord}</button>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class=\"cap cap-gap\">jump</span>\n\t\t\t\t\t<div class=\"crow\">\n\t\t\t\t\t\t<button type=\"button\" class=\"k\" onclick={() => onKeys('Home')}>home</button>\n\t\t\t\t\t\t<button type=\"button\" class=\"k\" onclick={() => onKeys('End')}>end</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<button type=\"button\" class=\"k k-ent\" aria-label=\"Enter\" onclick={() => onKeys('Enter')}>\n\t\t\t<iconify-icon icon=\"mdi:keyboard-return\"></iconify-icon>\n\t\t</button>\n\t</div>\n{/if}\n\n<style>\n\t/* A well cut into the card: darker than it, not lighter, so the keys are\n\t the only lit things in it. */\n\t.tray {\n\t\tposition: relative;\n\t\t/* The chords column answers to how wide the tray actually is. The\n\t\t viewport is the wrong question: a resizable sidebar sits between the\n\t\t window's edge and this card. */\n\t\tcontainer-type: inline-size;\n\t\tbackground: #08080a;\n\t\tborder-radius: 15px 15px 0 0;\n\t\tborder-bottom: 1px solid #202023;\n\t\tbox-shadow: inset 0 2px 5px rgba(0, 0, 0, 0.6);\n\t\tpadding: 12px 10px;\n\t\tdisplay: flex;\n\t\tgap: 12px;\n\t\talign-items: stretch;\n\t}\n\t/* Everything except Enter, which the tray keeps on its own right edge. */\n\t.tray-body {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\tgap: 12px 14px;\n\t\talign-items: flex-start;\n\t}\n\t/* An armed modifier lights the well's lower edge, beside the status line\n\t that names it — so a tray you glance past still shows it is armed. */\n\t.tray.armed::after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\tleft: 14px;\n\t\tright: 14px;\n\t\tbottom: -1px;\n\t\theight: 1px;\n\t\tbackground: linear-gradient(90deg, transparent, #fbbf24, transparent);\n\t\topacity: 0.65;\n\t}\n\n\t/* The grid holds its 42px unit wherever there is room for it, and gives the\n\t unit up rather than the layout on a phone too narrow for eight of them. */\n\t.keys {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(8, minmax(0, 42px));\n\t\tgrid-auto-rows: 30px;\n\t\tgap: 4px;\n\t\tflex: 1 1 300px;\n\t\tmax-width: 364px;\n\t}\n\n\t.tray .k {\n\t\tborder: 0;\n\t\tborder-radius: 6px;\n\t\tbackground: #212124;\n\t\tcolor: #a8a29e;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 11px;\n\t\tletter-spacing: 0.02em;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tgap: 6px;\n\t\tpadding: 0 8px;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmin-width: 0;\n\t\tcursor: pointer;\n\t\ttouch-action: manipulation;\n\t\ttransition:\n\t\t\tbackground 0.1s,\n\t\t\tcolor 0.1s;\n\t}\n\t.tray .k :global(iconify-icon) {\n\t\tfont-size: 15px;\n\t}\n\t.tray .k:hover {\n\t\tbackground: #2c2c31;\n\t\tcolor: #f5f5f4;\n\t}\n\t.tray .k.on {\n\t\tbackground: #3a2d0d;\n\t\tcolor: #fbbf24;\n\t}\n\t.tray .k.wide {\n\t\tjustify-content: flex-start;\n\t}\n\n\t.k-pgup {\n\t\tgrid-area: 1 / 5 / 2 / 7;\n\t}\n\t.k-pgdn {\n\t\tgrid-area: 1 / 7 / 2 / 9;\n\t}\n\t/* the cluster's empty shoulders are deliberate — see the note above */\n\t.k-up {\n\t\tgrid-area: 2 / 2;\n\t}\n\t.k-left {\n\t\tgrid-area: 3 / 1;\n\t}\n\t.k-down {\n\t\tgrid-area: 3 / 2;\n\t}\n\t.k-right {\n\t\tgrid-area: 3 / 3;\n\t}\n\t.k-a {\n\t\tgrid-area: 2 / 4 / 3 / 9;\n\t}\n\t.k-b {\n\t\tgrid-area: 3 / 4 / 4 / 9;\n\t}\n\t/* Enter leaves the grid for the tray's own right edge, full height, in the\n\t green the composer already uses for submitting — so a thumb reaching for\n\t it aims at a corner rather than at one cell among forty, and finds the\n\t same green in the same corner whether the tray is open or shut. */\n\t.tray .k-ent {\n\t\tflex: none;\n\t\twidth: 54px;\n\t\theight: auto;\n\t\talign-self: stretch;\n\t\tborder-radius: 12px;\n\t\tbackground: #15803d;\n\t\tcolor: #f0fdf4;\n\t}\n\t.tray .k-ent:hover {\n\t\tbackground: #16a34a;\n\t\tcolor: #f0fdf4;\n\t}\n\t.tray .k-ent :global(iconify-icon) {\n\t\tfont-size: 22px;\n\t}\n\n\t/* Width goes to the keys the More popover used to hide, not to stretching\n\t the cluster — a wider arrow key is not a better arrow key. */\n\t.side {\n\t\tflex: 1;\n\t\t/* Narrower than this and it wraps below the cluster instead of\n\t\t collapsing into a sliver beside it. */\n\t\tmin-width: 220px;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 9px;\n\t}\n\t/* The rest of the old More popover, kept visible rather than nested. */\n\t.extras {\n\t\tdisplay: flex;\n\t\tgap: 4px;\n\t\tflex-wrap: wrap;\n\t}\n\n\t.chords {\n\t\tdisplay: none;\n\t\tflex-direction: column;\n\t\tgap: 5px;\n\t\tpadding-top: 3px;\n\t\tborder-top: 1px solid #1b1b1f;\n\t}\n\t.cap {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 9px;\n\t\tletter-spacing: 0.16em;\n\t\ttext-transform: uppercase;\n\t\tcolor: #44403c;\n\t}\n\t.cap-gap {\n\t\tpadding-top: 6px;\n\t}\n\t.crow {\n\t\tdisplay: flex;\n\t\tgap: 4px;\n\t\tflex-wrap: wrap;\n\t}\n\t/* 364px of key grid, a 14px gap and the side column's 220px floor. */\n\t@container (min-width: 620px) {\n\t\t.chords {\n\t\t\tdisplay: flex;\n\t\t}\n\t\t/* Wide enough for the chords column, and the tray is taller than the\n\t\t keys that fill it. A thumb is not reaching across a desktop for\n\t\t Enter, so it stops at the height of the key grid — three rows and\n\t\t their gaps — and sits on the grid's own last row. */\n\t\t.tray .k-ent {\n\t\t\talign-self: flex-end;\n\t\t\theight: 98px;\n\t\t}\n\t}\n\n\t.extras .k,\n\t.chords .k {\n\t\twidth: auto;\n\t\theight: 30px;\n\t\tmin-width: 44px;\n\t}\n</style>\n","<script lang=\"ts\">\n\t/**\n\t * What the page header used to be: the other live sessions, the four rare\n\t * pane actions, and the kill.\n\t *\n\t * It lives above the composer's status line rather than at the top of the\n\t * screen, because switching session is a thing you do with a thumb like\n\t * everything else here. The terminal toggle keeps a glyph of its own on\n\t * the status line — it is the one header action used often enough to\n\t * deserve one.\n\t */\n\timport { clickOutside } from '$lib/actions/clickOutside';\n\timport SessionStateIndicator from './SessionStateIndicator.svelte';\n\timport { sessionStateVisual, indicatorStateOf } from '$shared/session-state.js';\n\timport type { ChordAction } from '$lib/stores/sidebarActions.svelte';\n\timport {\n\t\tsessionStore,\n\t\tgetSessionDisplayName,\n\t\ttype Session\n\t} from '$lib/stores/sessions.svelte';\n\timport { goto } from '$app/navigation';\n\n\tinterface Props {\n\t\topen: boolean;\n\t\t/** The session this composer belongs to, so it can mark itself current. */\n\t\tcurrentTarget: string | null;\n\t\tactions: ChordAction[];\n\t\tonKill: () => void;\n\t\tonClose: () => void;\n\t}\n\n\tlet { open, currentTarget, actions, onKill, onClose }: Props = $props();\n\n\t/** Live Claude sessions, the current one first. */\n\tconst siblings = $derived(\n\t\tsessionStore.sessions\n\t\t\t.filter((s: Session) => s.pane_alive !== false && s.tmux_target)\n\t\t\t.sort((a: Session, b: Session) =>\n\t\t\t\ta.tmux_target === currentTarget ? -1 : b.tmux_target === currentTarget ? 1 : 0\n\t\t\t)\n\t\t\t.slice(0, 8)\n\t);\n\n\tfunction open_(session: Session) {\n\t\tonClose();\n\t\tif (session.tmux_target) void goto(`/session/${encodeURIComponent(session.tmux_target)}`);\n\t}\n</script>\n\n{#if open}\n\t<div\n\t\tclass=\"sheet\"\n\t\trole=\"dialog\"\n\t\taria-label=\"Session\"\n\t\tuse:clickOutside={{ enabled: open, onOutside: onClose }}\n\t>\n\t\t<span class=\"cap\">sessions</span>\n\t\t{#each siblings as session (session.id)}\n\t\t\t{@const shown = indicatorStateOf(session)}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"row\"\n\t\t\t\tclass:cur={session.tmux_target === currentTarget}\n\t\t\t\tonclick={() => open_(session)}\n\t\t\t>\n\t\t\t\t<SessionStateIndicator state={shown} size=\"sm\" />\n\t\t\t\t<span class=\"name\">{getSessionDisplayName(session)}</span>\n\t\t\t\t<span class=\"sub\">{sessionStateVisual(shown).label}</span>\n\t\t\t</button>\n\t\t{/each}\n\n\t\t{#if actions.length > 0}\n\t\t\t<div class=\"div\"></div>\n\t\t\t<div class=\"acts\">\n\t\t\t\t{#each actions as action (action.label)}\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"act\"\n\t\t\t\t\t\ttitle={action.label}\n\t\t\t\t\t\taria-label={action.label}\n\t\t\t\t\t\tonclick={() => {\n\t\t\t\t\t\t\taction.run();\n\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<iconify-icon icon={action.icon}></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t{/each}\n\t\t\t</div>\n\t\t{/if}\n\n\t\t<div class=\"div\"></div>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"row kill\"\n\t\t\tonclick={() => {\n\t\t\t\tonKill();\n\t\t\t\tonClose();\n\t\t\t}}\n\t\t>\n\t\t\t<iconify-icon icon=\"mdi:power\"></iconify-icon>\n\t\t\t<span class=\"name\">Kill pane</span>\n\t\t</button>\n\t</div>\n{/if}\n\n<style>\n\t.sheet {\n\t\tposition: absolute;\n\t\tleft: 10px;\n\t\tright: 10px;\n\t\tbottom: calc(100% + 8px);\n\t\tmax-width: 330px;\n\t\tbackground: #1a1a1c;\n\t\tborder: 1px solid #313135;\n\t\tborder-radius: 14px;\n\t\tbox-shadow: 0 20px 44px rgba(0, 0, 0, 0.62);\n\t\tpadding: 7px;\n\t\tz-index: 9;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 2px;\n\t\t/* Scrolls on its own past this, and never hands a swipe on to the\n\t\t transcript underneath. */\n\t\tmax-height: min(70dvh, 520px);\n\t\toverflow-y: auto;\n\t\toverscroll-behavior: contain;\n\t}\n\t.cap {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 9.5px;\n\t\tletter-spacing: 0.15em;\n\t\ttext-transform: uppercase;\n\t\tcolor: #57534e;\n\t\tpadding: 7px 9px 5px;\n\t}\n\t.row {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 10px;\n\t\tpadding: 8px 9px;\n\t\tborder: 0;\n\t\tborder-radius: 9px;\n\t\tbackground: none;\n\t\twidth: 100%;\n\t\tjustify-content: flex-start;\n\t\ttext-align: left;\n\t\tcolor: #a8a29e;\n\t\tfont-size: 13.5px;\n\t\tcursor: pointer;\n\t}\n\t.row:hover {\n\t\tbackground: #232326;\n\t\tcolor: #f5f5f4;\n\t}\n\t.row.cur {\n\t\tbackground: #202024;\n\t\tcolor: #f5f5f4;\n\t}\n\t.name {\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\t.sub {\n\t\tmargin-left: auto;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 10px;\n\t\tcolor: #57534e;\n\t\tflex: none;\n\t}\n\t/* Kill sits alone below a rule, where a mis-tap can't reach it. */\n\t.row.kill {\n\t\tcolor: #c98080;\n\t}\n\t.row.kill:hover {\n\t\tbackground: #2c1b1b;\n\t\tcolor: #f2b8b8;\n\t}\n\t.div {\n\t\theight: 1px;\n\t\tbackground: #2a2a2e;\n\t\tmargin: 5px 2px;\n\t}\n\t.acts {\n\t\tdisplay: flex;\n\t\tgap: 3px;\n\t\tpadding: 2px;\n\t}\n\t.act {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\theight: 38px;\n\t\tborder: 0;\n\t\tborder-radius: 9px;\n\t\tbackground: #202024;\n\t\tcolor: #a8a29e;\n\t\tfont-size: 18px;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tcursor: pointer;\n\t}\n\t.act:hover {\n\t\tbackground: #292930;\n\t\tcolor: #f5f5f4;\n\t}\n</style>\n","<script lang=\"ts\">\n\timport { Tooltip as TooltipPrimitive } from \"bits-ui\";\n\n\tlet { ...restProps }: TooltipPrimitive.PortalProps = $props();\n</script>\n\n<TooltipPrimitive.Portal {...restProps} />\n","<script lang=\"ts\">\n\timport { Tooltip as TooltipPrimitive } from \"bits-ui\";\n\timport { cn } from \"$lib/utils.js\";\n\timport type { WithoutChildrenOrChild } from \"$lib/utils.js\";\n\timport TooltipPortal from \"./tooltip-portal.svelte\";\n\timport type { ComponentProps } from \"svelte\";\n\n\tlet {\n\t\tref = $bindable(null),\n\t\tclass: className,\n\t\tsideOffset = 0,\n\t\tside = \"top\",\n\t\tchildren,\n\t\tarrowClasses,\n\t\tportalProps,\n\t\t...restProps\n\t}: TooltipPrimitive.ContentProps & {\n\t\tarrowClasses?: string;\n\t\tportalProps?: WithoutChildrenOrChild<ComponentProps<typeof TooltipPortal>>;\n\t} = $props();\n</script>\n\n<TooltipPortal {...portalProps}>\n\t<TooltipPrimitive.Content\n\t\tbind:ref\n\t\tdata-slot=\"tooltip-content\"\n\t\t{sideOffset}\n\t\t{side}\n\t\tclass={cn(\n\t\t\t\"inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-(--z-floating) **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 z-(--z-floating) w-fit max-w-xs origin-(--bits-tooltip-content-transform-origin) bg-foreground text-background\",\n\t\t\tclassName\n\t\t)}\n\t\t{...restProps}\n\t>\n\t\t{@render children?.()}\n\t\t<TooltipPrimitive.Arrow>\n\t\t\t{#snippet child({ props })}\n\t\t\t\t<div\n\t\t\t\t\tclass={cn(\n\t\t\t\t\t\t\"size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] z-(--z-floating) bg-foreground fill-foreground\",\n\t\t\t\t\t\t\"data-[side=top]:translate-x-1/2 data-[side=top]:translate-y-[calc(-50%+2px)]\",\n\t\t\t\t\t\t\"data-[side=bottom]:-translate-x-1/2 data-[side=bottom]:-translate-y-[calc(-50%+1px)]\",\n\t\t\t\t\t\t\"data-[side=right]:translate-x-[calc(50%+2px)] data-[side=right]:translate-y-1/2\",\n\t\t\t\t\t\t\"data-[side=left]:-translate-y-[calc(50%-3px)]\",\n\t\t\t\t\t\tarrowClasses\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t></div>\n\t\t\t{/snippet}\n\t\t</TooltipPrimitive.Arrow>\n\t</TooltipPrimitive.Content>\n</TooltipPortal>\n","<script lang=\"ts\">\n\timport { Tooltip as TooltipPrimitive } from \"bits-ui\";\n\n\tlet { delayDuration = 0, ...restProps }: TooltipPrimitive.ProviderProps = $props();\n</script>\n\n<TooltipPrimitive.Provider {delayDuration} {...restProps} />\n","<script lang=\"ts\" generics=\"T = never\">\n\timport { Tooltip as TooltipPrimitive } from \"bits-ui\";\n\n\tlet { ref = $bindable(null), ...restProps }: TooltipPrimitive.TriggerProps<T> = $props();\n</script>\n\n<TooltipPrimitive.Trigger bind:ref data-slot=\"tooltip-trigger\" {...restProps} />\n","<script lang=\"ts\" generics=\"T = never\">\n\timport { Tooltip as TooltipPrimitive } from \"bits-ui\";\n\n\tlet { open = $bindable(false), ...restProps }: TooltipPrimitive.RootProps<T> = $props();\n</script>\n\n<TooltipPrimitive.Root bind:open {...restProps} />\n","<script lang=\"ts\">\n\t/**\n\t * An icon button that says what it does, and which key does it, on hover.\n\t *\n\t * The composer's controls are all glyphs with no caption, so the shortcut\n\t * has to live somewhere — a tooltip is the only place left that costs no\n\t * room. Built on the shadcn tooltip, delegating the trigger to this\n\t * button so nothing nests inside anything else.\n\t *\n\t * A finger has no hover to leave, so on a touch screen the tooltip's own\n\t * trigger opens a label that then sits there until you tap somewhere else.\n\t * There, the hold is the question and the tap is the answer: press and the\n\t * label appears for as long as you hold it, and the action does not run;\n\t * tap and the action runs with nothing drawn. Held, then, means \"what is\n\t * this?\" — the same gesture the mic already answers with its settings.\n\t */\n\timport * as Tooltip from '$lib/components/ui/tooltip';\n\timport { longPress } from '$lib/actions/longPress';\n\n\tinterface Props {\n\t\ticon: string;\n\t\t/** What the control does, in the words a person would use. */\n\t\tlabel: string;\n\t\t/** The keys that do the same thing, e.g. `Ctrl K`. Omit when there are none. */\n\t\tkeys?: string | null;\n\t\tclass?: string;\n\t\tonclick: () => void;\n\t}\n\n\tlet { icon, label, keys = null, class: klass = '', onclick }: Props = $props();\n\n\t/**\n\t * A screen driven by a finger: no hover to leave, and a pointer too coarse\n\t * to have one. Both halves are needed — a headless browser reports no\n\t * hover either, and there the tooltip should behave as it always has.\n\t */\n\tlet touch = $state(false);\n\t$effect(() => {\n\t\tconst mq = window.matchMedia('(hover: none) and (pointer: coarse)');\n\t\tconst sync = () => (touch = mq.matches);\n\t\tsync();\n\t\tmq.addEventListener('change', sync);\n\t\treturn () => mq.removeEventListener('change', sync);\n\t});\n\n\tlet open = $state(false);\n\t/** How long a hold has to last before it counts as a question. */\n\tconst HOLD_MS = 350;\n</script>\n\n<Tooltip.Root\n\tbind:open={() => open, (v) => { if (!touch) open = v; }}\n>\n\t<Tooltip.Trigger>\n\t\t{#snippet child({ props })}\n\t\t\t<button\n\t\t\t\t{...props}\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass={klass}\n\t\t\t\taria-label={keys ? `${label} (${keys})` : label}\n\t\t\t\t{onclick}\n\t\t\t\tuse:longPress={{\n\t\t\t\t\tms: HOLD_MS,\n\t\t\t\t\tenabled: () => touch,\n\t\t\t\t\tonTrigger: () => (open = true),\n\t\t\t\t\tonRelease: () => (open = false)\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<iconify-icon {icon}></iconify-icon>\n\t\t\t</button>\n\t\t{/snippet}\n\t</Tooltip.Trigger>\n\t<Tooltip.Content side=\"top\" sideOffset={8}>\n\t\t<span class=\"tip\">\n\t\t\t{label}\n\t\t\t{#if keys}<kbd>{keys}</kbd>{/if}\n\t\t</span>\n\t</Tooltip.Content>\n</Tooltip.Root>\n\n<style>\n\t.tip {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\twhite-space: nowrap;\n\t}\n\tkbd {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 10px;\n\t\tletter-spacing: 0.06em;\n\t\tpadding: 1px 5px;\n\t\tborder-radius: 4px;\n\t\tbackground: rgba(255, 255, 255, 0.14);\n\t}\n</style>\n","/**\n * The name Claude Code shows for a model, from the id the API logs.\n *\n * The transcript records the model on every assistant line as the API names\n * it — `claude-fable-5-1`, `claude-haiku-4-5-20251001` — and the dashboard\n * wants what the terminal's own status line says: \"Fable 5.1\", \"Haiku 4.5\".\n * The id is a family word, a version broken into dash-separated parts, and\n * sometimes a release date; the name is the family capitalised and the\n * version joined with dots. Anything that does not fit that shape is shown\n * as it is, so an id from a newer family still means something.\n */\n\n/** A trailing 8-digit release date, as in `claude-haiku-4-5-20251001`. */\nconst RELEASE_DATE = /-\\d{8}$/;\n\n/** A `[1m]` suffix Claude Code appends for the long-context variant. */\nconst CONTEXT_SUFFIX = /\\[(\\d+[mk])\\]$/i;\n\nexport function modelDisplayName(id: string | null | undefined): string | null {\n if (!id) return null;\n let rest = id.trim();\n if (!rest) return null;\n\n let context = \"\";\n const suffix = rest.match(CONTEXT_SUFFIX);\n if (suffix) {\n context = ` (${suffix[1].toUpperCase()})`;\n rest = rest.slice(0, -suffix[0].length);\n }\n\n // Bedrock and Vertex ids carry a region or vendor prefix: `us.anthropic.claude-…`.\n rest = rest.slice(rest.lastIndexOf(\".\") + 1).replace(RELEASE_DATE, \"\");\n const parts = rest.split(\"-\").filter(Boolean);\n if (parts[0]?.toLowerCase() === \"claude\") parts.shift();\n\n const family = parts.shift();\n if (!family || !/^[a-z]+$/i.test(family)) return id;\n const version = parts.filter((part) => /^\\d+$/.test(part));\n const tail = parts.filter((part) => !/^\\d+$/.test(part));\n if (version.length !== parts.length - tail.length) return id;\n\n const name = family[0].toUpperCase() + family.slice(1).toLowerCase();\n const pieces = [name];\n if (version.length > 0) pieces.push(version.join(\".\"));\n if (tail.length > 0) pieces.push(tail.join(\"-\"));\n return pieces.join(\" \") + context;\n}\n","<script lang=\"ts\">\n\timport { tick } from 'svelte';\n\timport { scoreCommand } from '$shared/utils/fuzzy.js';\n\n\ttype Kind = 'builtin' | 'command' | 'skill' | 'agent';\n\tinterface Cmd {\n\t\tname: string;\n\t\tinsert: string;\n\t\tkind: Kind;\n\t\tsource: string;\n\t\tdescription: string;\n\t}\n\n\tlet {\n\t\tcwd,\n\t\tbase = '',\n\t\tpinned = [],\n\t\tquery = '',\n\t\tonselect\n\t}: {\n\t\tcwd?: string | null;\n\t\t/** The relay path to the machine `cwd` is on, '' for this one. */\n\t\tbase?: string;\n\t\tpinned?: string[];\n\t\tquery?: string;\n\t\tonselect: (insert: string) => void;\n\t} = $props();\n\n\tlet commands = $state<Cmd[]>([]);\n\tlet loading = $state(false);\n\tlet error = $state<string | null>(null);\n\tlet activeIndex = $state(0);\n\tlet listEl = $state<HTMLDivElement | null>(null);\n\tlet loadedFor: string | null | undefined = undefined;\n\n\tconst KIND_LABEL: Record<Kind, string> = {\n\t\tbuiltin: 'built-in',\n\t\tcommand: 'command',\n\t\tskill: 'skill',\n\t\tagent: 'agent'\n\t};\n\tconst KIND_COLOR: Record<Kind, string> = {\n\t\tbuiltin: 'text-stone-400',\n\t\tcommand: 'text-sky-400',\n\t\tskill: 'text-emerald-400',\n\t\tagent: 'text-fuchsia-400'\n\t};\n\n\t/** What the list was loaded for: the cwd, on the machine it is on. */\n\tconst key = $derived(`${base}:${cwd}`);\n\n\texport async function reload(force = false) {\n\t\tif (!force && loadedFor === key && commands.length) return;\n\t\tloading = true;\n\t\terror = null;\n\t\ttry {\n\t\t\tconst qs = cwd ? `?cwd=${encodeURIComponent(cwd)}` : '';\n\t\t\tconst res = await fetch(`${base}/api/commands${qs}`);\n\t\t\tif (!res.ok) throw new Error(`HTTP ${res.status}`);\n\t\t\tconst data = await res.json();\n\t\t\tcommands = data.commands ?? [];\n\t\t\tloadedFor = key;\n\t\t} catch (e) {\n\t\t\terror = e instanceof Error ? e.message : String(e);\n\t\t} finally {\n\t\t\tloading = false;\n\t\t}\n\t}\n\n\t// Load on mount and whenever the cwd, or the machine it is on, changes\n\t$effect(() => {\n\t\tkey;\n\t\tvoid reload();\n\t});\n\n\tconst filtered = $derived.by(() => {\n\t\tconst q = query.trim();\n\t\tconst pinSet = new Set(pinned);\n\t\tconst scored = commands\n\t\t\t.map((c) => {\n\t\t\t\tconst score = scoreCommand(c, q);\n\t\t\t\treturn score == null ? null : { c, score };\n\t\t\t})\n\t\t\t.filter((x): x is { c: Cmd; score: number } => x != null);\n\t\tif (q) {\n\t\t\tscored.sort((a, b) => b.score - a.score);\n\t\t} else {\n\t\t\t// No query: pinned first, then by kind, then alpha\n\t\t\tconst kindOrder: Record<Kind, number> = { command: 0, skill: 1, agent: 2, builtin: 3 };\n\t\t\tscored.sort((a, b) => {\n\t\t\t\tconst pa = pinSet.has(a.c.insert) ? 0 : 1;\n\t\t\t\tconst pb = pinSet.has(b.c.insert) ? 0 : 1;\n\t\t\t\tif (pa !== pb) return pa - pb;\n\t\t\t\tif (pa === 0) return pinned.indexOf(a.c.insert) - pinned.indexOf(b.c.insert);\n\t\t\t\tconst ko = kindOrder[a.c.kind] - kindOrder[b.c.kind];\n\t\t\t\tif (ko !== 0) return ko;\n\t\t\t\treturn a.c.name.localeCompare(b.c.name);\n\t\t\t});\n\t\t}\n\t\treturn scored.map((x) => x.c);\n\t});\n\n\t$effect(() => {\n\t\t// reset highlight whenever results change\n\t\tfiltered;\n\t\tactiveIndex = 0;\n\t\tvoid tick().then(() => listEl?.scrollTo({ top: 0 }));\n\t});\n\n\tfunction choose(c: Cmd) {\n\t\tonselect(c.insert);\n\t}\n\n\t/** Pick the highlighted entry. Returns false when there is nothing to pick. */\n\texport function chooseActive(): boolean {\n\t\tconst c = filtered[activeIndex];\n\t\tif (!c) return false;\n\t\tchoose(c);\n\t\treturn true;\n\t}\n\n\t/**\n\t * Keyboard navigation for a host input. Returns true when the event was\n\t * consumed (arrow navigation or selection), false to let the host handle it.\n\t */\n\texport function handleKeydown(e: KeyboardEvent): boolean {\n\t\tif (e.key === 'ArrowDown') {\n\t\t\te.preventDefault();\n\t\t\tactiveIndex = Math.min(activeIndex + 1, filtered.length - 1);\n\t\t\tscrollActiveIntoView();\n\t\t\treturn true;\n\t\t}\n\t\tif (e.key === 'ArrowUp') {\n\t\t\te.preventDefault();\n\t\t\tactiveIndex = Math.max(activeIndex - 1, 0);\n\t\t\tscrollActiveIntoView();\n\t\t\treturn true;\n\t\t}\n\t\tif (e.key === 'Enter' || e.key === 'Tab') {\n\t\t\tif (!filtered.length) return false;\n\t\t\te.preventDefault();\n\t\t\treturn chooseActive();\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction scrollActiveIntoView() {\n\t\ttick().then(() => {\n\t\t\tlistEl?.querySelector<HTMLElement>(`[data-idx=\"${activeIndex}\"]`)?.scrollIntoView({ block: 'nearest' });\n\t\t});\n\t}\n\n\tfunction sourceLabel(c: Cmd): string {\n\t\tif (c.source === 'builtin') return '';\n\t\treturn c.source;\n\t}\n</script>\n\n<div bind:this={listEl} class=\"min-h-0 flex-1 overflow-y-auto overscroll-contain\">\n\t{#if loading && !commands.length}\n\t\t<div class=\"p-4 text-sm text-stone-400\">Loading…</div>\n\t{:else if error}\n\t\t<div class=\"p-4 text-sm text-red-400\">Failed to load: {error}</div>\n\t{:else if !filtered.length}\n\t\t<div class=\"p-4 text-sm text-stone-400\">No matches</div>\n\t{:else}\n\t\t{#each filtered as c, i (c.name + c.source)}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tdata-idx={i}\n\t\t\t\tclass=\"flex w-full flex-col items-start gap-0.5 border-b border-[#262626] px-3 py-2 text-left hover:bg-[#262626] {i === activeIndex ? 'bg-[#2a2a2a]' : ''}\"\n\t\t\t\tonclick={() => choose(c)}\n\t\t\t\tonpointerenter={() => (activeIndex = i)}\n\t\t\t>\n\t\t\t\t<div class=\"flex w-full items-center gap-2\">\n\t\t\t\t\t<span class=\"truncate font-mono text-sm\">{c.name}</span>\n\t\t\t\t\t<span class=\"ml-auto shrink-0 text-[10px] uppercase tracking-wide {KIND_COLOR[c.kind]}\">{KIND_LABEL[c.kind]}</span>\n\t\t\t\t\t{#if sourceLabel(c)}\n\t\t\t\t\t\t<span class=\"shrink-0 text-[10px] text-stone-500\">{sourceLabel(c)}</span>\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t\t{#if c.description}\n\t\t\t\t\t<div class=\"line-clamp-2 w-full text-xs text-stone-400\">{c.description}</div>\n\t\t\t\t{/if}\n\t\t\t</button>\n\t\t{/each}\n\t{/if}\n</div>\n<div class=\"border-t border-[#333] px-3 py-1 text-[10px] text-stone-500\">\n\t{filtered.length}/{commands.length} · ↑↓ navigate · Enter insert\n</div>\n","<script lang=\"ts\">\n\timport * as Dialog from '$lib/components/ui/dialog';\n\timport { tick } from 'svelte';\n\timport CommandList from './CommandList.svelte';\n\n\tlet {\n\t\topen = $bindable(false),\n\t\tcwd,\n\t\tbase = '',\n\t\tpinned = [],\n\t\tonselect\n\t}: {\n\t\topen: boolean;\n\t\tcwd?: string | null;\n\t\t/** The relay path to the machine `cwd` is on, '' for this one. */\n\t\tbase?: string;\n\t\tpinned?: string[];\n\t\tonselect: (insert: string) => void;\n\t} = $props();\n\n\tlet query = $state('');\n\tlet inputEl = $state<HTMLInputElement | null>(null);\n\tlet list = $state<CommandList | null>(null);\n\n\t$effect(() => {\n\t\tif (open) {\n\t\t\tquery = '';\n\t\t\ttick().then(() => inputEl?.focus());\n\t\t}\n\t});\n\n\tfunction choose(insert: string) {\n\t\tonselect(insert);\n\t\topen = false;\n\t}\n\n\tfunction onKeydown(e: KeyboardEvent) {\n\t\tlist?.handleKeydown(e);\n\t}\n</script>\n\n<Dialog.Root bind:open>\n\t<Dialog.Content\n\t\tclass=\"flex h-[85dvh] max-h-[85dvh] w-[calc(100%-1rem)] max-w-xl flex-col gap-0 overflow-hidden border-[#333] bg-[#1a1a1a] p-0 text-stone-100 sm:max-w-xl\"\n\t\tshowCloseButton={false}\n\t>\n\t\t<Dialog.Title class=\"sr-only\">Commands</Dialog.Title>\n\t\t<Dialog.Description class=\"sr-only\">Search slash commands, skills and agents</Dialog.Description>\n\t\t<div class=\"flex items-center gap-2 border-b border-[#333] px-3 py-2\">\n\t\t\t<iconify-icon icon=\"mdi:magnify\" class=\"shrink-0 text-stone-400\" style=\"font-size: 18px;\"></iconify-icon>\n\t\t\t<input\n\t\t\t\tbind:this={inputEl}\n\t\t\t\tbind:value={query}\n\t\t\t\tonkeydown={onKeydown}\n\t\t\t\ttype=\"text\"\n\t\t\t\tplaceholder=\"Search commands, skills, agents…\"\n\t\t\t\tautocomplete=\"off\"\n\t\t\t\tautocapitalize=\"off\"\n\t\t\t\tspellcheck=\"false\"\n\t\t\t\tenterkeyhint=\"go\"\n\t\t\t\tclass=\"min-w-0 flex-1 bg-transparent text-base text-stone-100 outline-none placeholder:text-stone-500\"\n\t\t\t/>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"shrink-0 rounded p-1 text-stone-400 hover:bg-[#333] hover:text-stone-100\"\n\t\t\t\ttitle=\"Refresh\"\n\t\t\t\tonclick={() => list?.reload(true)}\n\t\t\t>\n\t\t\t\t<iconify-icon icon=\"mdi:refresh\" style=\"font-size: 18px;\"></iconify-icon>\n\t\t\t</button>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-label=\"Close\"\n\t\t\t\tclass=\"shrink-0 rounded p-1 text-stone-400 hover:bg-[#333] hover:text-stone-100\"\n\t\t\t\tonclick={() => (open = false)}\n\t\t\t>\n\t\t\t\t<iconify-icon icon=\"mdi:close\" style=\"font-size: 18px;\"></iconify-icon>\n\t\t\t</button>\n\t\t</div>\n\n\t\t<CommandList bind:this={list} {cwd} {base} {pinned} {query} onselect={choose} />\n\t</Dialog.Content>\n</Dialog.Root>\n","import { browser } from '$app/environment';\n\nexport type GamepadButton =\n\t| 'A'\n\t| 'B'\n\t| 'X'\n\t| 'Y'\n\t| 'L1'\n\t| 'R1'\n\t| 'L2'\n\t| 'R2'\n\t| 'Back'\n\t| 'Start'\n\t| 'L3'\n\t| 'R3'\n\t| 'DpadUp'\n\t| 'DpadDown'\n\t| 'DpadLeft'\n\t| 'DpadRight'\n\t| 'Home';\n\nexport type GamepadHandler =\n\t| (() => void)\n\t| { press?: () => void; release?: () => void; repeat?: boolean };\nexport type GamepadHandlers = Partial<Record<GamepadButton, GamepadHandler>>;\nexport type GamepadAxesCallback = (axes: readonly number[]) => void;\n\nexport const STICK_DEADZONE = 0.15;\n\nconst BUTTON_INDEX: Record<number, GamepadButton> = {\n\t0: 'A',\n\t1: 'B',\n\t2: 'X',\n\t3: 'Y',\n\t4: 'L1',\n\t5: 'R1',\n\t6: 'L2',\n\t7: 'R2',\n\t8: 'Back',\n\t9: 'Start',\n\t10: 'L3',\n\t11: 'R3',\n\t12: 'DpadUp',\n\t13: 'DpadDown',\n\t14: 'DpadLeft',\n\t15: 'DpadRight',\n\t16: 'Home'\n};\n\nconst DEFAULT_REPEAT = new Set<GamepadButton>([\n\t'DpadUp',\n\t'DpadDown',\n\t'DpadLeft',\n\t'DpadRight'\n]);\n\nconst REPEAT_INITIAL_MS = 400;\nconst REPEAT_INTERVAL_MS = 80;\n\nfunction pressFn(h: GamepadHandler | undefined): (() => void) | undefined {\n\tif (!h) return undefined;\n\treturn typeof h === 'function' ? h : h.press;\n}\n\nfunction releaseFn(h: GamepadHandler | undefined): (() => void) | undefined {\n\tif (!h || typeof h === 'function') return undefined;\n\treturn h.release;\n}\n\nfunction shouldRepeat(name: GamepadButton, h: GamepadHandler | undefined): boolean {\n\tif (h && typeof h !== 'function' && typeof h.repeat === 'boolean') return h.repeat;\n\treturn DEFAULT_REPEAT.has(name);\n}\n\nexport type UseGamepadOpts = {\n\tbuttons?: () => GamepadHandlers;\n\taxes?: () => GamepadAxesCallback;\n\tenabled?: () => boolean;\n};\n\nexport function useGamepad(opts: UseGamepadOpts) {\n\tif (!browser) return;\n\tconst buttons = opts.buttons;\n\tconst axes = opts.axes;\n\tconst enabled = opts.enabled ?? (() => true);\n\n\t$effect(() => {\n\t\tlet raf = 0;\n\t\tlet active = false;\n\t\tconst pressed = new Set<number>();\n\t\tconst repeatStartTimers = new Map<number, ReturnType<typeof setTimeout>>();\n\t\tconst repeatIntervals = new Map<number, ReturnType<typeof setInterval>>();\n\n\t\tfunction clearRepeat(idx: number) {\n\t\t\tconst s = repeatStartTimers.get(idx);\n\t\t\tif (s) {\n\t\t\t\tclearTimeout(s);\n\t\t\t\trepeatStartTimers.delete(idx);\n\t\t\t}\n\t\t\tconst i = repeatIntervals.get(idx);\n\t\t\tif (i) {\n\t\t\t\tclearInterval(i);\n\t\t\t\trepeatIntervals.delete(idx);\n\t\t\t}\n\t\t}\n\n\t\tfunction scheduleRepeat(idx: number, name: GamepadButton) {\n\t\t\tconst start = setTimeout(() => {\n\t\t\t\trepeatStartTimers.delete(idx);\n\t\t\t\tif (!pressed.has(idx)) return;\n\t\t\t\tconst tick = setInterval(() => {\n\t\t\t\t\tif (!enabled()) return;\n\t\t\t\t\tpressFn(buttons?.()[name])?.();\n\t\t\t\t}, REPEAT_INTERVAL_MS);\n\t\t\t\trepeatIntervals.set(idx, tick);\n\t\t\t}, REPEAT_INITIAL_MS);\n\t\t\trepeatStartTimers.set(idx, start);\n\t\t}\n\n\t\tfunction poll() {\n\t\t\traf = requestAnimationFrame(poll);\n\t\t\tif (!enabled()) return;\n\t\t\tconst pads = navigator.getGamepads?.();\n\t\t\tif (!pads) return;\n\t\t\tconst pad = Array.from(pads).find((p) => p && p.connected);\n\t\t\tif (!pad) return;\n\n\t\t\tif (buttons) {\n\t\t\t\tconst map = buttons();\n\t\t\t\tpad.buttons.forEach((btn, idx) => {\n\t\t\t\t\tconst name = BUTTON_INDEX[idx];\n\t\t\t\t\tif (!name) return;\n\t\t\t\t\tconst isDown = btn.pressed;\n\t\t\t\t\tconst wasDown = pressed.has(idx);\n\t\t\t\t\tconst handler = map[name];\n\t\t\t\t\tif (isDown && !wasDown) {\n\t\t\t\t\t\tpressed.add(idx);\n\t\t\t\t\t\tpressFn(handler)?.();\n\t\t\t\t\t\tif (shouldRepeat(name, handler)) scheduleRepeat(idx, name);\n\t\t\t\t\t} else if (!isDown && wasDown) {\n\t\t\t\t\t\tpressed.delete(idx);\n\t\t\t\t\t\tclearRepeat(idx);\n\t\t\t\t\t\treleaseFn(handler)?.();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (axes) axes()(pad.axes);\n\t\t}\n\n\t\tfunction start() {\n\t\t\tif (active) return;\n\t\t\tactive = true;\n\t\t\traf = requestAnimationFrame(poll);\n\t\t}\n\t\tfunction stop() {\n\t\t\tif (!active) return;\n\t\t\tactive = false;\n\t\t\tcancelAnimationFrame(raf);\n\t\t\trepeatStartTimers.forEach(clearTimeout);\n\t\t\trepeatStartTimers.clear();\n\t\t\trepeatIntervals.forEach(clearInterval);\n\t\t\trepeatIntervals.clear();\n\t\t\tpressed.clear();\n\t\t}\n\n\t\tconst onConnect = () => start();\n\t\tconst onDisconnect = () => {\n\t\t\tif (navigator.getGamepads?.().some((p) => p && p.connected)) return;\n\t\t\tstop();\n\t\t};\n\n\t\twindow.addEventListener('gamepadconnected', onConnect);\n\t\twindow.addEventListener('gamepaddisconnected', onDisconnect);\n\t\tif (navigator.getGamepads?.().some((p) => p && p.connected)) start();\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener('gamepadconnected', onConnect);\n\t\t\twindow.removeEventListener('gamepaddisconnected', onDisconnect);\n\t\t\tstop();\n\t\t};\n\t});\n}\n","import { createPersisted } from './persisted';\n\nexport type ViewMode = 'transcript' | 'terminal';\n\nconst DEFAULT_MODE: ViewMode = 'transcript';\nconst persisted = createPersisted<Record<string, ViewMode>>('claude-mux-view-modes', {});\n\n// Which view (transcript or raw terminal) the user last chose, per pane target.\n// The URL still wins when it carries `?view=`; this only supplies the default\n// for a session opened without one, so each session reopens the way it was left.\nclass ViewModesStore {\n\tprivate state = $state<Record<string, ViewMode>>(persisted.load());\n\n\tget(target: string | null): ViewMode {\n\t\tif (!target) return DEFAULT_MODE;\n\t\treturn this.state[target] ?? DEFAULT_MODE;\n\t}\n\n\tset(target: string | null, mode: ViewMode): void {\n\t\tif (!target) return;\n\t\tif (this.state[target] === mode) return;\n\t\tif (mode === DEFAULT_MODE) delete this.state[target];\n\t\telse this.state[target] = mode;\n\t\tpersisted.save(this.state);\n\t}\n}\n\nexport const viewModesStore = new ViewModesStore();\n","<script lang=\"ts\">\n\timport { Dialog as SheetPrimitive } from \"bits-ui\";\n\timport { cn } from \"$lib/utils.js\";\n\n\tlet {\n\t\tref = $bindable(null),\n\t\tclass: className,\n\t\t...restProps\n\t}: SheetPrimitive.OverlayProps = $props();\n</script>\n\n<SheetPrimitive.Overlay\n\tbind:ref\n\tdata-slot=\"sheet-overlay\"\n\tclass={cn(\n\t\t\"bg-black/10 supports-backdrop-filter:backdrop-blur-xs fixed inset-0 z-(--z-modal) duration-100 data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n\t\tclassName\n\t)}\n\t{...restProps}\n/>\n","<script lang=\"ts\">\n\timport { Dialog as SheetPrimitive } from \"bits-ui\";\n\n\tlet { ...restProps }: SheetPrimitive.PortalProps = $props();\n</script>\n\n<SheetPrimitive.Portal {...restProps} />\n","<script lang=\"ts\" module>\n\texport type Side = \"top\" | \"right\" | \"bottom\" | \"left\";\n</script>\n\n<script lang=\"ts\">\n\timport { Dialog as SheetPrimitive } from \"bits-ui\";\n\timport XIcon from '@lucide/svelte/icons/x';\n\timport { Button } from \"$lib/components/ui/button/index.js\";\n\timport { cn, type WithoutChildrenOrChild } from \"$lib/utils.js\";\n\timport SheetOverlay from \"./sheet-overlay.svelte\";\n\timport SheetPortal from \"./sheet-portal.svelte\";\n\timport type { Snippet } from \"svelte\";\n\timport type { ComponentProps } from \"svelte\";\n\n\tlet {\n\t\tref = $bindable(null),\n\t\tclass: className,\n\t\tside = \"right\",\n\t\tshowCloseButton = true,\n\t\tportalProps,\n\t\tchildren,\n\t\t...restProps\n\t}: WithoutChildrenOrChild<SheetPrimitive.ContentProps> & {\n\t\tportalProps?: WithoutChildrenOrChild<ComponentProps<typeof SheetPortal>>;\n\t\tside?: Side;\n\t\tshowCloseButton?: boolean;\n\t\tchildren: Snippet;\n\t} = $props();\n</script>\n\n<SheetPortal {...portalProps}>\n\t<SheetOverlay />\n\t<SheetPrimitive.Content\n\t\tbind:ref\n\t\tdata-slot=\"sheet-content\"\n\t\tdata-side={side}\n\t\tclass={cn(\n\t\t\t\"bg-popover text-popover-foreground fixed z-(--z-modal) flex flex-col gap-4 bg-clip-padding text-sm shadow-lg transition duration-200 ease-in-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-[side=bottom]:data-open:slide-in-from-bottom-10 data-[side=left]:data-open:slide-in-from-left-10 data-[side=right]:data-open:slide-in-from-right-10 data-[side=top]:data-open:slide-in-from-top-10 data-closed:animate-out data-closed:fade-out-0 data-[side=bottom]:data-closed:slide-out-to-bottom-10 data-[side=left]:data-closed:slide-out-to-left-10 data-[side=right]:data-closed:slide-out-to-right-10 data-[side=top]:data-closed:slide-out-to-top-10\",\n\t\t\tclassName\n\t\t)}\n\t\t{...restProps}\n\t>\n\t\t{@render children?.()}\n\t\t{#if showCloseButton}\n\t\t\t<SheetPrimitive.Close data-slot=\"sheet-close\">\n\t\t\t\t{#snippet child({ props })}\n\t\t\t\t\t<Button variant=\"ghost\" class=\"absolute top-3 right-3\" size=\"icon-sm\" {...props}>\n\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t<span class=\"sr-only\">Close</span>\n\t\t\t\t\t</Button>\n\t\t\t\t{/snippet}\n\t\t\t</SheetPrimitive.Close>\n\t\t{/if}\n\t</SheetPrimitive.Content>\n</SheetPortal>\n","<script lang=\"ts\">\n\timport { Dialog as SheetPrimitive } from \"bits-ui\";\n\timport { cn } from \"$lib/utils.js\";\n\n\tlet {\n\t\tref = $bindable(null),\n\t\tclass: className,\n\t\t...restProps\n\t}: SheetPrimitive.TitleProps = $props();\n</script>\n\n<SheetPrimitive.Title\n\tbind:ref\n\tdata-slot=\"sheet-title\"\n\tclass={cn(\"text-foreground text-base font-medium\", className)}\n\t{...restProps}\n/>\n","<script lang=\"ts\">\n\timport { Dialog as SheetPrimitive } from \"bits-ui\";\n\n\tlet { open = $bindable(false), ...restProps }: SheetPrimitive.RootProps = $props();\n</script>\n\n<SheetPrimitive.Root bind:open {...restProps} />\n","<script lang=\"ts\">\n\t/**\n\t * The side panel's header and its panes. The header names every pane as a\n\t * tab, so the session's status line needs only the one button that opens\n\t * the panel. One pane shows at a time, but a\n\t * pane stays mounted once opened (hidden, not destroyed), so its scroll\n\t * and selection survive switching to another and back. Whether this sits\n\t * in a column beside the session or in a sheet over it is the page's call.\n\t */\n\timport type { Session } from '$lib/stores/sessions.svelte';\n\timport { PANES, paneKeys, MAXIMIZE_KEYS, CLOSE_KEYS, type PaneAction } from '$lib/side-panel/panes';\n\timport { readPaneParams } from '$lib/side-panel/url';\n\timport Hint from '$lib/components/Hint.svelte';\n\timport DiffBadge from '$lib/components/DiffBadge.svelte';\n\n\tlet {\n\t\tkind,\n\t\topen,\n\t\ttarget,\n\t\tbase,\n\t\tmachineHost,\n\t\tsession,\n\t\tquery,\n\t\tmaximized,\n\t\tcanMaximize,\n\t\tonSelect,\n\t\tonSetParams,\n\t\tonToggleMaximize,\n\t\tonClose,\n\t\tonMention,\n\t\tonOpenPane\n\t}: {\n\t\t/** The pane showing. */\n\t\tkind: string;\n\t\t/** False while the column is closed but kept mounted: no pane is active then. */\n\t\topen: boolean;\n\t\ttarget: string;\n\t\t/** Where the session's machine's API is reached: '' here, `/fleet/<id>` for another machine. */\n\t\tbase: string;\n\t\t/** The host name that reaches another machine's ports, or null for the origin's own session. */\n\t\tmachineHost: string | null;\n\t\tsession: Session | null;\n\t\t/** The page's query, for the params each pane owns. */\n\t\tquery: URLSearchParams;\n\t\tmaximized: boolean;\n\t\t/** Maximize applies to the inline column; a sheet has nothing to grow into. */\n\t\tcanMaximize: boolean;\n\t\t/** Show another pane. */\n\t\tonSelect: (kind: string) => void;\n\t\tonSetParams: (kind: string, own: Record<string, string | null>, opts?: { push?: boolean }) => void;\n\t\tonToggleMaximize: () => void;\n\t\tonClose: () => void;\n\t\tonMention: (text: string) => void;\n\t\t/** A pane asking for another one, with that pane's own params. */\n\t\tonOpenPane: (kind: string, own: Record<string, string | null>) => void;\n\t} = $props();\n\n\tlet mounted = $state<string[]>([]);\n\t$effect(() => {\n\t\tif (!mounted.includes(kind)) mounted = [...mounted, kind];\n\t});\n\n\tlet actions = $state<Record<string, PaneAction[]>>({});\n\n</script>\n\n<div class=\"panel\">\n\t<header>\n\t\t<div class=\"tabs\" role=\"tablist\" aria-label=\"Side panel\">\n\t\t\t{#each PANES as pane (pane.kind)}\n\t\t\t\t{@const reason = pane.unavailable?.(session) ?? null}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\trole=\"tab\"\n\t\t\t\t\tclass=\"tab\"\n\t\t\t\t\tclass:on={pane.kind === kind}\n\t\t\t\t\taria-selected={pane.kind === kind}\n\t\t\t\t\tdisabled={reason !== null}\n\t\t\t\t\ttitle={reason ?? `${pane.label} (${paneKeys(pane)})`}\n\t\t\t\t\tonclick={() => onSelect(pane.kind)}\n\t\t\t\t>\n\t\t\t\t\t<iconify-icon icon={pane.icon}></iconify-icon>\n\t\t\t\t\t<span class=\"tab-label\">{pane.label}</span>\n\t\t\t\t\t<span class=\"count\"><DiffBadge changes={pane.count?.(session)} /></span>\n\t\t\t\t</button>\n\t\t\t{/each}\n\t\t</div>\n\t\t<span class=\"sp\"></span>\n\t\t{#each actions[kind] ?? [] as action (action.label)}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"act\"\n\t\t\t\tclass:on={action.pressed}\n\t\t\t\taria-pressed={action.pressed}\n\t\t\t\tdisabled={action.disabled}\n\t\t\t\ttitle={action.label}\n\t\t\t\taria-label={action.label}\n\t\t\t\tonclick={action.run}\n\t\t\t>\n\t\t\t\t<iconify-icon icon={action.icon}></iconify-icon>\n\t\t\t</button>\n\t\t{/each}\n\t\t{#if canMaximize}\n\t\t\t<Hint\n\t\t\t\ticon={maximized ? 'mdi:arrow-collapse' : 'mdi:arrow-expand'}\n\t\t\t\tlabel={maximized ? 'Restore' : 'Maximize'}\n\t\t\t\tkeys={MAXIMIZE_KEYS}\n\t\t\t\tclass=\"act\"\n\t\t\t\tonclick={onToggleMaximize}\n\t\t\t/>\n\t\t{/if}\n\t\t<Hint icon=\"mdi:close\" label=\"Close panel\" keys={CLOSE_KEYS} class=\"act\" onclick={onClose} />\n\t</header>\n\t<div class=\"bodies\">\n\t\t{#each PANES.filter((p) => mounted.includes(p.kind)) as pane (pane.kind)}\n\t\t\t<!-- Hidden by visibility rather than display, which would lose its scroll. -->\n\t\t\t<div class=\"body\" class:off={pane.kind !== kind} inert={pane.kind !== kind}>\n\t\t\t\t<pane.body\n\t\t\t\t\t{session}\n\t\t\t\t\t{target}\n\t\t\t\t\t{base}\n\t\t\t\t\t{machineHost}\n\t\t\t\t\tparams={readPaneParams(query, pane.params)}\n\t\t\t\t\tsetParams={(own, opts) => onSetParams(pane.kind, own, opts)}\n\t\t\t\t\tsetActions={(list) => (actions[pane.kind] = list)}\n\t\t\t\t\tactive={open && pane.kind === kind}\n\t\t\t\t\tmention={onMention}\n\t\t\t\t\topenPane={onOpenPane}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t{/each}\n\t</div>\n</div>\n\n<style>\n\t.panel {\n\t\tcontainer-type: inline-size;\n\t\theight: 100%;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tmin-width: 0;\n\t\tbackground: #111111;\n\t\tcolor: #e7e5e4;\n\t}\n\theader {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tmin-height: 44px;\n\t\tpadding: 6px 8px;\n\t\tborder-bottom: 1px solid #222;\n\t\tflex: none;\n\t}\n\t/* Every pane is a tab; only the one showing spells its name where room is short. */\n\t.tabs {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 2px;\n\t\tmin-width: 0;\n\t}\n\t.tab {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\theight: 30px;\n\t\tpadding: 0 8px;\n\t\tborder: 0;\n\t\tborder-radius: 7px;\n\t\tbackground: transparent;\n\t\tcolor: #a8a29e;\n\t\tfont: inherit;\n\t\tfont-size: 13px;\n\t\twhite-space: nowrap;\n\t\tcursor: pointer;\n\t}\n\t.tab iconify-icon {\n\t\tfont-size: 16px;\n\t}\n\t.tab:hover:not(:disabled) {\n\t\tbackground: #1f1f1f;\n\t\tcolor: #f5f5f4;\n\t}\n\t.tab:disabled {\n\t\topacity: 0.4;\n\t\tcursor: default;\n\t}\n\t.tab.on {\n\t\tbackground: #232326;\n\t\tcolor: #f5f5f4;\n\t\tfont-weight: 600;\n\t}\n\t.tab:not(.on) .tab-label {\n\t\tdisplay: none;\n\t}\n\t.count {\n\t\tdisplay: inline-flex;\n\t\tfont-weight: 400;\n\t}\n\t.tab:not(.on) .count {\n\t\tdisplay: none;\n\t}\n\t@container (min-width: 40rem) {\n\t\t.tab:not(.on) .tab-label,\n\t\t.tab:not(.on) .count {\n\t\t\tdisplay: inline-flex;\n\t\t}\n\t}\n\t@media (pointer: coarse) {\n\t\t.tab {\n\t\t\theight: 38px;\n\t\t\tpadding: 0 10px;\n\t\t}\n\t}\n\t.sp {\n\t\tflex: 1;\n\t}\n\theader :global(.act) {\n\t\twidth: 30px;\n\t\theight: 30px;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tborder: 0;\n\t\tborder-radius: 7px;\n\t\tbackground: transparent;\n\t\tcolor: #a8a29e;\n\t\tfont-size: 16px;\n\t\tcursor: pointer;\n\t}\n\theader :global(.act:hover:not(:disabled)) {\n\t\tbackground: #1f1f1f;\n\t\tcolor: #f5f5f4;\n\t}\n\theader :global(.act:disabled) {\n\t\topacity: 0.4;\n\t\tcursor: default;\n\t}\n\theader :global(.act.on) {\n\t\tbackground: #232326;\n\t\tcolor: #f5f5f4;\n\t}\n\t.bodies {\n\t\tflex: 1;\n\t\tmin-height: 0;\n\t\tposition: relative;\n\t}\n\t.body {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t\toverflow: auto;\n\t}\n\t.body.off {\n\t\tvisibility: hidden;\n\t}\n</style>\n","<script lang=\"ts\">\n\t/**\n\t * The side panel's one control in the session's status line: it opens the\n\t * panel on the pane last shown and closes it again. Which pane shows is\n\t * chosen in the panel's own header, where there is room to name them. The\n\t * lines the session has changed ride on it, since that is the reason the\n\t * panel is most often opened.\n\t */\n\timport type { Session } from '$lib/stores/sessions.svelte';\n\timport { CLOSE_KEYS } from '$lib/side-panel/panes';\n\timport { Toggle } from '$lib/components/ui/toggle';\n\timport * as Tooltip from '$lib/components/ui/tooltip';\n\timport DiffBadge from '$lib/components/DiffBadge.svelte';\n\n\tlet {\n\t\topen,\n\t\tsession,\n\t\tonToggle\n\t}: {\n\t\topen: boolean;\n\t\tsession: Session;\n\t\tonToggle: () => void;\n\t} = $props();\n\n\tconst label = $derived(open ? 'Close side panel' : 'Open side panel');\n</script>\n\n<Tooltip.Root>\n\t<Tooltip.Trigger>\n\t\t{#snippet child({ props })}\n\t\t\t<span {...props} class=\"tt\">\n\t\t\t\t<Toggle variant=\"outline\" size=\"xs\" pressed={open} aria-label={label} onPressedChange={onToggle}>\n\t\t\t\t\t<iconify-icon icon=\"mdi:dock-right\"></iconify-icon>\n\t\t\t\t\t<DiffBadge changes={session.changes} />\n\t\t\t\t</Toggle>\n\t\t\t</span>\n\t\t{/snippet}\n\t</Tooltip.Trigger>\n\t<Tooltip.Content side=\"top\" sideOffset={8}>\n\t\t<span class=\"tip\">{label}<kbd>{CLOSE_KEYS}</kbd></span>\n\t</Tooltip.Content>\n</Tooltip.Root>\n\n<style>\n\t.tt {\n\t\tdisplay: inline-flex;\n\t\tflex: none;\n\t}\n\t.tt :global([data-slot='toggle']) {\n\t\tborder-color: #2a2a2c;\n\t\tcolor: #a8a29e;\n\t\tfont-family: var(--font-mono);\n\t}\n\t.tt :global([data-slot='toggle'][data-state='on']) {\n\t\tbackground: #232326;\n\t\tborder-color: #3f3f46;\n\t\tcolor: #f5f5f4;\n\t}\n\t.tt iconify-icon {\n\t\tfont-size: 13px;\n\t}\n\t.tip {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\twhite-space: nowrap;\n\t}\n\tkbd {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 10px;\n\t\tletter-spacing: 0.06em;\n\t\tpadding: 1px 5px;\n\t\tborder-radius: 4px;\n\t\tbackground: rgba(255, 255, 255, 0.14);\n\t}\n</style>\n","<script lang=\"ts\">\n\t/**\n\t * Remote Control for the session on the page: one button in the status\n\t * line that opens what fits the state. Off, it offers to turn it on; on,\n\t * to open the session in the Claude app, copy its link, or turn it off.\n\t *\n\t * Turning either way goes through the pane and only shows once the poll\n\t * sees it, so between the ask and that the button says it is pending.\n\t */\n\timport * as Popover from '$lib/components/ui/popover';\n\timport type { ChordAction } from '$lib/stores/sidebarActions.svelte';\n\n\tinterface Props {\n\t\t/** The session's Remote Control link, or null while it is off. */\n\t\turl: string | null;\n\t\t/** The way it was asked to turn, until the poll sees it turn. */\n\t\tpending: 'on' | 'off' | null;\n\t\t/** What fits the state, built by the page so the chord menu offers the same. */\n\t\tactions: ChordAction[];\n\t}\n\n\tlet { url, pending, actions }: Props = $props();\n\n\tlet open = $state(false);\n\n\tconst label = $derived(\n\t\tpending ? `Turning Remote Control ${pending}…` : `Remote Control is ${url ? 'on' : 'off'}`\n\t);\n\n\tfunction pick(action: ChordAction) {\n\t\topen = false;\n\t\taction.run();\n\t}\n</script>\n\n<Popover.Root bind:open>\n\t<Popover.Trigger class=\"mini rc-trigger\" aria-label={label} title={label} data-on={url ? '' : undefined} data-pending={pending ?? undefined}>\n\t\t<iconify-icon icon={url ? 'mdi:cellphone-link' : 'mdi:cellphone-link-off'}></iconify-icon>\n\t</Popover.Trigger>\n\t<Popover.Content side=\"top\" align=\"end\" sideOffset={8} role=\"menu\" class=\"rc-menu w-60 max-w-[85vw] border-[#333] bg-[#1a1a1a] p-1\">\n\t\t<div class=\"rc-head\" role=\"presentation\">\n\t\t\t<span class=\"rc-dot\" data-on={url ? '' : undefined} data-pending={pending ?? undefined}></span>\n\t\t\t{label}\n\t\t</div>\n\t\t{#each actions as action (action.label)}\n\t\t\t<button type=\"button\" role=\"menuitem\" class=\"rc-item\" class:danger={action.danger} disabled={action.disabled} onclick={() => pick(action)}>\n\t\t\t\t<iconify-icon icon={action.icon}></iconify-icon>\n\t\t\t\t{action.label}\n\t\t\t</button>\n\t\t{/each}\n\t</Popover.Content>\n</Popover.Root>\n\n<style>\n\t/* On reads in the sidebar's Remote Control indigo, so the two agree. */\n\t:global(.rc-trigger[data-on]) {\n\t\tcolor: #818cf8 !important;\n\t}\n\t:global(.rc-trigger[data-pending] iconify-icon),\n\t.rc-dot[data-pending] {\n\t\tanimation: rc-wait 1.2s steps(2, jump-none) infinite;\n\t}\n\t@keyframes rc-wait {\n\t\tfrom {\n\t\t\topacity: 1;\n\t\t}\n\t\tto {\n\t\t\topacity: 0.35;\n\t\t}\n\t}\n\t.rc-head {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tpadding: 6px 8px 8px;\n\t\tfont-size: 11px;\n\t\tletter-spacing: 0.02em;\n\t\tcolor: #a8a29e;\n\t}\n\t.rc-dot {\n\t\twidth: 6px;\n\t\theight: 6px;\n\t\tborder-radius: 50%;\n\t\tbackground: #57534e;\n\t\tflex: none;\n\t}\n\t.rc-dot[data-on] {\n\t\tbackground: #818cf8;\n\t}\n\t.rc-item {\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\tmin-height: 34px;\n\t\talign-items: center;\n\t\tgap: 10px;\n\t\tborder-radius: 6px;\n\t\tpadding: 0 8px;\n\t\tfont-size: 13px;\n\t\tcolor: #e7e5e4;\n\t\ttext-align: left;\n\t\tcursor: pointer;\n\t}\n\t.rc-item iconify-icon {\n\t\tfont-size: 16px;\n\t\tcolor: #a8a29e;\n\t}\n\t.rc-item:hover:not(:disabled) {\n\t\tbackground: #262626;\n\t}\n\t.rc-item:disabled {\n\t\topacity: 0.45;\n\t\tcursor: default;\n\t}\n\t.rc-item.danger,\n\t.rc-item.danger iconify-icon {\n\t\tcolor: #fca5a5;\n\t}\n\t@media (pointer: coarse) {\n\t\t.rc-item {\n\t\t\tmin-height: 44px;\n\t\t}\n\t}\n</style>\n","import { createPersisted } from './persisted';\n\n/** What a session's side panel keeps between visits; the URL holds which pane is open. */\nexport interface PanelPrefs {\n\t/** The inline column's width in px, set by a drag; unset means the default width. */\n\twidth?: number;\n\t/** The panel takes the whole page. */\n\tmaximized?: boolean;\n\t/** The pane last opened, which the close key reopens. */\n\tlast?: string;\n}\n\nconst persisted = createPersisted<Record<string, PanelPrefs>>('claude-mux-side-panel', {});\n\n/** The side panel's per-session preferences, keyed by pane target. */\nclass SidePanelStore {\n\tprivate state = $state<Record<string, PanelPrefs>>(persisted.load());\n\n\tget(target: string | null): PanelPrefs {\n\t\treturn (target && this.state[target]) || {};\n\t}\n\n\tupdate(target: string | null, patch: PanelPrefs): void {\n\t\tif (!target) return;\n\t\tthis.state[target] = { ...this.state[target], ...patch };\n\t\tpersisted.save(this.state);\n\t}\n}\n\nexport const sidePanelStore = new SidePanelStore();\n","/**\n * The side panel's sizes. The column sits beside the session (transcript and\n * composer) on a wide screen and becomes a sheet over it below\n * INLINE_MEDIA_QUERY's width.\n */\n\nconst REM = 16;\n\n/** Narrower than this, the panel is a sheet rather than a column. */\nexport const INLINE_MEDIA_QUERY = '(min-width: 1181px)';\n/** Narrower than this, the sheet takes the whole screen. */\nexport const PHONE_MEDIA_QUERY = '(max-width: 640px)';\n\n/** The default width, until a drag sets one. */\nexport const DEFAULT_WIDTH_CSS = 'clamp(28rem, 48vw, 44rem)';\nexport const PANEL_MIN_PX = 26 * REM;\n/** The session column — transcript and composer — is never squeezed below this. */\nexport const SESSION_MIN_PX = 28 * REM;\n/** The divider between the two columns. */\nexport const DIVIDER_PX = 6;\n\n/**\n * The width a drag to `pointerX` asks for, or null when it would squeeze the\n * session column below its minimum (the drag is then refused and the panel\n * keeps its width). Narrower than the panel's own minimum clamps to it.\n */\nexport function dragWidth(pointerX: number, rowRight: number, rowWidth: number): number | null {\n\tconst width = Math.max(PANEL_MIN_PX, Math.round(rowRight - pointerX - DIVIDER_PX / 2));\n\treturn rowWidth - width - DIVIDER_PX < SESSION_MIN_PX ? null : width;\n}\n","<script lang=\"ts\">\n\timport { page } from '$app/stores';\n\timport { goto, afterNavigate } from '$app/navigation';\n\timport { browser } from '$app/environment';\n\timport { reportClient } from '$lib/client-log';\n\timport { onDestroy, onMount, tick } from 'svelte';\n\timport { terminalStore } from '$lib/stores/terminal.svelte';\n\timport { sessionStore, getSessionDisplayName, attentionPrefix, postVisit } from '$lib/stores/sessions.svelte';\n\timport SessionStateIndicator from '$lib/components/SessionStateIndicator.svelte';\n\timport { sessionStateVisual, indicatorStateOf, isUnread, type IndicatorState } from '$shared/session-state.js';\n\timport { preferences } from '$lib/stores/preferences.svelte';\n\timport { Button } from '$lib/components/ui/button';\n\timport * as AlertDialog from '$lib/components/ui/alert-dialog';\n\timport * as Popover from '$lib/components/ui/popover';\n\timport TerminalView from '$lib/components/TerminalView.svelte';\n\timport TranscriptView from '$lib/components/TranscriptView.svelte';\n\timport { appendQuote } from '$lib/quote';\n\timport { transcriptStore } from '$lib/stores/transcript.svelte';\n\timport ContextGauge from '$lib/components/ContextGauge.svelte';\n\timport RailStats from '$lib/components/RailStats.svelte';\n\timport VoiceMeter, { type VoiceAction } from '$lib/components/VoiceMeter.svelte';\n\timport QueueStrip from '$lib/components/QueueStrip.svelte';\n\timport type { QueuedMessageInfo } from '$shared/types/ws-messages.js';\n\timport VoiceButton from '$lib/components/VoiceButton.svelte';\n\timport KeyTray from '$lib/components/KeyTray.svelte';\n\timport SessionSheet from '$lib/components/SessionSheet.svelte';\n\timport { drawer } from '$lib/stores/drawer.svelte';\n\timport Hint from '$lib/components/Hint.svelte';\n\timport * as Tooltip from '$lib/components/ui/tooltip';\n\timport { modelDisplayName } from '$shared/claude/model-name.js';\n\timport { serverStore } from '$lib/stores/servers.svelte';\n\timport { blockedReason, fleetStore, routeMachine, sessionApiAt } from '$lib/stores/fleet.svelte';\n\timport { clock } from '$lib/stores/clock.svelte';\n\timport { parseSessionPath, sessionPath } from '$lib/session-route';\n\timport { formatRef } from '$lib/split-refs';\n\timport CommandPalette from '$lib/components/CommandPalette.svelte';\n\timport CommandList from '$lib/components/CommandList.svelte';\n\timport RenameSessionDialog from '$lib/components/RenameSessionDialog.svelte';\n\timport { voiceStore } from '$lib/stores/voice.svelte';\n\timport { caretOf, insertSaid, keepsCaret, putCaret } from '$lib/dictation';\n\timport { draftsStore } from '$lib/stores/drafts.svelte';\n\timport { attachmentsStore, type Attachment } from '$lib/stores/attachments.svelte';\n\timport { untrack } from 'svelte';\n\timport { swipe } from '$lib/actions/swipe';\n\timport { STORAGE_KEYS, MOD_LABEL, STEERS, type SteerMode } from '$lib/constants';\n\timport { useGamepad, STICK_DEADZONE } from '$lib/gamepad.svelte';\n\timport { sidebarActionsStore, type ChordAction } from '$lib/stores/sidebarActions.svelte';\n\timport { viewModesStore } from '$lib/stores/viewModes.svelte';\n\timport * as Sheet from '$lib/components/ui/sheet';\n\timport ResizeDivider from '$lib/components/ResizeDivider.svelte';\n\timport SidePanel from '$lib/components/side-panel/SidePanel.svelte';\n\timport PanelToggle from '$lib/components/side-panel/PanelToggle.svelte';\n\timport RemoteControlMenu from '$lib/components/RemoteControlMenu.svelte';\n\timport { copyWithToast } from '$lib/side-panel/clipboard';\n\timport { toast } from 'svelte-sonner';\n\timport type { RewindAction } from '$shared/tmux/rewind.js';\n\timport { sidePanelStore } from '$lib/stores/sidePanel.svelte';\n\timport { PANES, PANE_KINDS, PANE_PARAMS, paneDef, panelKeyAction } from '$lib/side-panel/panes';\n\timport { MediaQuery } from 'svelte/reactivity';\n\timport { panelQuery, readPanel } from '$lib/side-panel/url';\n\timport type { Listing, TranscriptChanges } from '$lib/side-panel/changes';\n\timport {\n\t\tINLINE_MEDIA_QUERY,\n\t\tPHONE_MEDIA_QUERY,\n\t\tDEFAULT_WIDTH_CSS,\n\t\tPANEL_MIN_PX,\n\t\tSESSION_MIN_PX,\n\t\tDIVIDER_PX,\n\t\tdragWidth\n\t} from '$lib/side-panel/layout';\n\n\tconst target = $derived($page.params.target ? decodeURIComponent($page.params.target) : null);\n\tconst voiceEnabled = $derived(Boolean($page.data.voiceEnabled));\n\n\t/**\n\t * The machine the route names, `/m/<host>/session/<target>`. Its calls go\n\t * through this server's relay (`base`); this machine's own, named or not,\n\t * go straight here.\n\t */\n\tconst route = routeMachine(() => $page.params.machine ?? null);\n\tconst base = $derived(route.base);\n\tconst remoteHost = $derived(route.remoteHost);\n\tconst machineHost = $derived(route.machineHost);\n\t/** Why this page cannot act on the session's machine (offline, or too old for the relay), or null. */\n\tconst machineBlocked = $derived(route.machine ? blockedReason(route.machine, clock.now) : null);\n\t/**\n\t * The session as every per-session store keeps it (drafts, attachments,\n\t * views, voice): its target here, `host@target` on another machine,\n\t * since targets repeat across machines.\n\t */\n\tconst ref = $derived(target ? formatRef({ host: remoteHost, target }) : null);\n\t/** A session's API on this page's machine, by id or tmux target. */\n\tconst api = (id: string) => sessionApiAt(base, id);\n\n\tconst currentSession = $derived(route.session(target));\n\n\t// A plain (non-Claude) pane: a shell or a dev server, on whichever machine the route names.\n\tconst tmuxPane = $derived(route.pane(target) ?? null);\n\tconst isClaudeSession = $derived(currentSession != null);\n\tconst isPlainPane = $derived(!isClaudeSession && tmuxPane != null);\n\tconst claudeSessionDead = $derived(\n\t\tisClaudeSession && !!currentSession?.tmux_target && currentSession?.pane_alive === false\n\t);\n\t/**\n\t * Another machine's session is missing when the origin, whose socket\n\t * carries every machine it follows, has answered without it. That holds a\n\t * while before it counts: a session started from the sidebar is on the\n\t * page before its machine lists it.\n\t */\n\tconst REMOTE_MISSING_GRACE_MS = 10_000;\n\tconst remoteGone = $derived(!!remoteHost && !isClaudeSession && !isPlainPane && sessionStore.receivedData);\n\tlet remoteMissing = $state(false);\n\t$effect(() => {\n\t\tvoid ref;\n\t\tremoteMissing = false;\n\t\tif (!remoteGone) return;\n\t\tconst settle = setTimeout(() => (remoteMissing = true), REMOTE_MISSING_GRACE_MS);\n\t\treturn () => clearTimeout(settle);\n\t});\n\tconst targetMissing = $derived(\n\t\tremoteHost\n\t\t\t? remoteMissing\n\t\t\t: sessionStore.listed && !isClaudeSession && !isPlainPane\n\t);\n\tconst paneIsDead = $derived(claudeSessionDead || targetMissing);\n\tconst isAlive = $derived(!paneIsDead && (isClaudeSession || isPlainPane));\n\t// Dead panes and plain (non-Claude) panes are row states, not Claude states.\n\tconst indicatorState = $derived<IndicatorState>(\n\t\tpaneIsDead ? 'dead' : isPlainPane ? 'plain' : currentSession ? indicatorStateOf(currentSession) : 'idle'\n\t);\n\t// Browser tab: the state emoji rides in front of the name, so a background\n\t// tab says whether the session wants a human without being opened, and\n\t// the count before it says how many sessions anywhere want one or are done.\n\tconst attention = $derived(attentionPrefix(fleetStore.answering));\n\tconst pageTitle = $derived(\n\t\t`${attention}${sessionStateVisual(indicatorState).emoji} ${\n\t\t\tcurrentSession ? getSessionDisplayName(currentSession) : (target || 'Session')\n\t\t}`\n\t);\n\n\t// The unread \"Done\" watermark: opening the session stamps it, and so does\n\t// a turn that finishes while the page is in front of someone — the same\n\t// visit clears the badge on every other browser. Split panes are this page\n\t// in a frame, so they count too. Adapted from t3code's ChatView visit\n\t// effect (MIT, © T3 Tools Inc.).\n\tlet pageVisible = $state(browser && document.visibilityState === 'visible');\n\tonMount(() => {\n\t\tconst onVisibility = () => (pageVisible = document.visibilityState === 'visible');\n\t\tdocument.addEventListener('visibilitychange', onVisibility);\n\t\treturn () => document.removeEventListener('visibilitychange', onVisibility);\n\t});\n\t/**\n\t * The session this page last stamped, and the finished turn it had then:\n\t * one post per completion, not per broadcast. A \"Mark unread\" from another\n\t * browser leaves the turn as it was, so this page does not undo it.\n\t */\n\tlet lastVisit: { id: string; turn: number | null } | null = null;\n\t$effect(() => {\n\t\tconst s = currentSession;\n\t\tif (!s || !pageVisible) return;\n\t\tconst turn = s.turn_completed_at ?? null;\n\t\tconst fresh = lastVisit?.id !== s.id;\n\t\tif (!fresh && (!isUnread(s) || lastVisit!.turn === turn)) return;\n\t\tlastVisit = { id: s.id, turn };\n\t\tpostVisit(base, s.id);\n\t});\n\t// Inline status next to the title. Skip bare states (idle/busy/etc.)\n\t// since the state symbol + color already convey them; only show when\n\t// there's information the symbol can't carry.\n\tconst statusText = $derived.by(() => {\n\t\tif (paneIsDead) return 'pane closed';\n\t\tif (isPlainPane) return tmuxPane?.command || null;\n\t\treturn currentSession?.current_action || null;\n\t});\n\n\t// Transcript view exists only for Claude sessions (the JSONL is Claude Code's own log).\n\tconst canTranscript = $derived(isClaudeSession && (currentSession?.agent ?? 'claude') === 'claude');\n\t// Each view has its own URL: `?view=terminal` is the raw mirror. Without the\n\t// param, the session reopens in whichever view it was last left in.\n\t/**\n\t * This page is one pane of a split, drawn inside the split page's iframe.\n\t * The composer then carries the pane's controls — swap, zoom, close — and\n\t * asks the page outside for them with postMessage; the page outside only\n\t * ever tells this one whether it holds the focus.\n\t */\n\tconst embed = $derived($page.url.searchParams.has('embed'));\n\tlet paneFocused = $state(false);\n\tlet paneSide = $state<'a' | 'b' | null>(null);\n\n\tfunction tellPane(action: 'focus' | 'focus-other' | 'swap' | 'zoom' | 'close' | 'ready' | 'switch') {\n\t\tif (!embed || window.parent === window) return;\n\t\twindow.parent.postMessage({ type: 'claude-mux:pane', action }, location.origin);\n\t}\n\n\tonMount(() => {\n\t\tif (!embed) return;\n\t\tserverStore.init();\n\t\tconst onMessage = (e: MessageEvent) => {\n\t\t\tif (e.source !== window.parent) return;\n\t\t\tconst msg = e.data as { type?: string; focused?: boolean; side?: 'a' | 'b' } | null;\n\t\t\tif (msg?.type !== 'claude-mux:focus') return;\n\t\t\tpaneFocused = msg.focused === true;\n\t\t\tpaneSide = msg.side ?? null;\n\t\t};\n\t\t// Any interaction inside the pane is a claim on the focus.\n\t\tconst onPointer = () => tellPane('focus');\n\t\tconst onKeys = (e: KeyboardEvent) => {\n\t\t\tif ((e.ctrlKey || e.metaKey) && (e.key === '1' || e.key === '2')) {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst wanted = e.key === '1' ? 'a' : 'b';\n\t\t\t\ttellPane(wanted === paneSide ? 'focus' : 'focus-other');\n\t\t\t} else if ((e.ctrlKey || e.metaKey) && !e.altKey && !e.shiftKey && e.key.toLowerCase() === 'k') {\n\t\t\t\t// The switcher lives in the drawer, which belongs to the page outside.\n\t\t\t\te.preventDefault();\n\t\t\t\ttellPane('switch');\n\t\t\t}\n\t\t};\n\t\twindow.addEventListener('message', onMessage);\n\t\twindow.addEventListener('pointerdown', onPointer, true);\n\t\twindow.addEventListener('focus', onPointer);\n\t\twindow.addEventListener('keydown', onKeys, true);\n\t\ttellPane('ready');\n\t\treturn () => {\n\t\t\twindow.removeEventListener('message', onMessage);\n\t\t\twindow.removeEventListener('pointerdown', onPointer, true);\n\t\t\twindow.removeEventListener('focus', onPointer);\n\t\t\twindow.removeEventListener('keydown', onKeys, true);\n\t\t};\n\t});\n\n\tconst viewMode = $derived.by(() => {\n\t\tif (!canTranscript) return 'terminal';\n\t\tconst param = $page.url.searchParams.get('view');\n\t\tif (param === 'terminal' || param === 'transcript') return param;\n\t\treturn viewModesStore.get(ref);\n\t});\n\n\tfunction toggleView() {\n\t\tconst next = viewMode === 'transcript' ? 'terminal' : 'transcript';\n\t\tviewModesStore.set(ref, next);\n\t\tconst params = new URLSearchParams($page.url.searchParams);\n\t\tif (next === 'terminal') params.set('view', 'terminal');\n\t\telse params.delete('view');\n\t\tnavigateQuery(params);\n\t}\n\n\t/** Go to this page with `query`, keeping scroll and focus. */\n\tfunction navigateQuery(query: URLSearchParams, replaceState = false) {\n\t\tconst q = query.toString();\n\t\tgoto(`${$page.url.pathname}${q ? `?${q}` : ''}`, { noScroll: true, keepFocus: true, replaceState });\n\t}\n\n\t/**\n\t * The side panel: a column beside the session on a wide screen, a sheet\n\t * over it below 1180px (full-screen on a phone). Which pane shows lives in\n\t * the URL (`?panel=<kind>` and the pane's own params); its width, maximize,\n\t * and the pane last shown live in localStorage, per session.\n\t */\n\t/** The pane the URL asks for, unless it cannot apply to this session (a plain pane, say). */\n\tconst panelKind = $derived.by(() => {\n\t\tconst kind = readPanel($page.url.searchParams, PANE_KINDS);\n\t\treturn kind && !paneDef(kind)?.unavailable?.(currentSession ?? null) ? kind : null;\n\t});\n\tconst panelPrefs = $derived(sidePanelStore.get(ref));\n\tconst inlineQuery = new MediaQuery(INLINE_MEDIA_QUERY);\n\tconst phoneQuery = new MediaQuery(PHONE_MEDIA_QUERY);\n\tconst panelInline = $derived(inlineQuery.current);\n\tconst panelPhone = $derived(phoneQuery.current);\n\t/**\n\t * The pane the inline column last showed for this session. Closing hides\n\t * the column rather than unmounting it, so reopening finds every pane as\n\t * it was left.\n\t */\n\tlet panelKept = $state<{ ref: string | null; kind: string } | null>(null);\n\t$effect(() => {\n\t\tif (panelKind) panelKept = { ref, kind: panelKind };\n\t});\n\tconst panelColumnKind = $derived(\n\t\tpanelKind ?? (panelKept?.ref === ref ? panelKept.kind : null)\n\t);\n\tconst panelMaximized = $derived(panelInline && panelKind !== null && panelPrefs.maximized === true);\n\t/** The column's width mid-drag; saved to the session's prefs when the drag ends. */\n\tlet panelDragWidth = $state<number | null>(null);\n\tlet panelResizing = $state(false);\n\tlet sessionRow = $state<HTMLElement | null>(null);\n\tconst panelWidth = $derived(panelDragWidth ?? panelPrefs.width);\n\tconst panelWidthCss = $derived(panelWidth ? `${panelWidth}px` : DEFAULT_WIDTH_CSS);\n\n\t/** Show `kind`'s pane (or close the panel, for null). Opening and closing push history. */\n\tfunction openPanel(kind: string | null) {\n\t\tif (kind === panelKind) return;\n\t\tif (kind) sidePanelStore.update(ref, { last: kind });\n\t\tnavigateQuery(panelQuery($page.url.searchParams, kind, PANE_PARAMS));\n\t}\n\n\t/** A pane's key: pressed for the pane showing it closes the panel, otherwise it switches. Returns whether it did anything. */\n\tfunction togglePane(kind: string): boolean {\n\t\tif (paneDef(kind)?.unavailable?.(currentSession ?? null)) return false;\n\t\topenPanel(panelKind === kind ? null : kind);\n\t\treturn true;\n\t}\n\n\t/** The panel's own toggle: close it, or open it on the pane last shown. */\n\tfunction togglePanel(): boolean {\n\t\tif (!panelKind) return togglePane((paneDef(panelPrefs.last ?? null) ?? PANES[0]).kind);\n\t\topenPanel(null);\n\t\treturn true;\n\t}\n\n\tfunction setPaneParams(kind: string, own: Record<string, string | null>, opts?: { push?: boolean }) {\n\t\tif (kind !== panelKind) return;\n\t\tnavigateQuery(panelQuery($page.url.searchParams, kind, PANE_PARAMS, own), !opts?.push);\n\t}\n\n\t/** A pane's \"Mention\": the text joins the end of the draft, and a sheet steps aside so the composer shows. */\n\tfunction mentionInComposer(text: string) {\n\t\tconst gap = textInput && !/\\s$/.test(textInput) ? ' ' : '';\n\t\ttextInput = `${textInput}${gap}${text} `;\n\t\tif (!panelInline && panelKind) openPanel(null);\n\t\tvoid tick().then(() => {\n\t\t\tautoResize();\n\t\t\ttextareaElement?.focus();\n\t\t});\n\t}\n\n\t/** The composer takes the focus with the caret after everything in it. */\n\tfunction focusComposerEnd() {\n\t\tvoid tick().then(() => {\n\t\t\tautoResize();\n\t\t\tif (!textareaElement) return;\n\t\t\ttextareaElement.focus();\n\t\t\tconst end = textareaElement.value.length;\n\t\t\ttextareaElement.setSelectionRange(end, end);\n\t\t\ttextareaElement.scrollTop = textareaElement.scrollHeight;\n\t\t\tsyncCaret();\n\t\t});\n\t}\n\n\t/** The transcript's \"Add to prompt\": the selection joins the draft as a quote, and the reply goes under it. */\n\tfunction quoteInComposer(text: string) {\n\t\ttextInput = appendQuote(textInput, text);\n\t\tfocusComposerEnd();\n\t}\n\n\t/** A link that opens the side panel on `kind`, with that pane's own params. */\n\tfunction paneLink(kind: string, own: Record<string, string | null>): string {\n\t\treturn `${$page.url.pathname}?${panelQuery($page.url.searchParams, kind, PANE_PARAMS, own)}`;\n\t}\n\n\t/** A pull request or issue (`owner/name#n`) opened beside the session in the GitHub pane. */\n\tfunction openGithub(ref: string) {\n\t\tnavigateQuery(panelQuery($page.url.searchParams, 'github', PANE_PARAMS, { ref }));\n\t}\n\n\t/** Where a transcript tool row opens the file it touched: the Files pane, at that line. */\n\tfunction fileLink(path: string, line: number | null): string {\n\t\treturn paneLink('files', { file: path, line: line ? String(line) : null });\n\t}\n\n\t/** Where a turn's change summary opens the Changes pane: the session source, that turn, a file. */\n\tfunction changesLink(n: number, file: string | null): string {\n\t\treturn paneLink('changes', { source: 'session', turn: String(n), file });\n\t}\n\n\t/**\n\t * The turns that edited files, for the transcript's per-turn summaries.\n\t * Earlier turns never change, so this is read on opening a session and\n\t * again only when a turn ends (the session goes idle), not when one starts;\n\t * and once more a moment after, since the log can trail the Stop hook.\n\t */\n\tlet turnChanges = $state<{ id: string; changes: TranscriptChanges } | null>(null);\n\tconst changesSessionId = $derived(currentSession?.id ?? null);\n\tconst turnEnded = $derived(\n\t\tcurrentSession?.state === 'idle' ? (currentSession.turn_completed_at ?? 0) : null\n\t);\n\tconst sessionChanges = $derived(\n\t\tturnChanges && turnChanges.id === changesSessionId ? turnChanges.changes : null\n\t);\n\t$effect(() => {\n\t\tconst id = changesSessionId;\n\t\tif (!id) return;\n\t\tconst fallbackRoot = untrack(() => currentSession?.git_root ?? currentSession?.cwd ?? null);\n\t\tif (turnEnded === null && untrack(() => turnChanges?.id) === id) return;\n\t\tlet stale = false;\n\t\tconst load = () =>\n\t\t\tfetch(`${api(id)}/changes?source=session`)\n\t\t\t\t.then((res) => (res.ok ? (res.json() as Promise<Listing>) : null))\n\t\t\t\t.then((body) => {\n\t\t\t\t\tif (stale || !body) return;\n\t\t\t\t\tconst changes = {\n\t\t\t\t\t\tturns: body.turns ?? [],\n\t\t\t\t\t\tprompts: new Set(body.prompts ?? []),\n\t\t\t\t\t\troot: body.root ?? fallbackRoot\n\t\t\t\t\t};\n\t\t\t\t\tturnChanges = { id, changes };\n\t\t\t\t})\n\t\t\t\t.catch(() => {});\n\t\tvoid load();\n\t\tconst again = turnEnded === null ? null : setTimeout(load, 3000);\n\t\treturn () => {\n\t\t\tstale = true;\n\t\t\tif (again) clearTimeout(again);\n\t\t};\n\t});\n\n\t/** Returns whether it did anything. */\n\tfunction toggleMaximize(): boolean {\n\t\tif (!panelInline || !panelKind) return false;\n\t\tsidePanelStore.update(ref, { maximized: !panelPrefs.maximized });\n\t\treturn true;\n\t}\n\n\tfunction resizePanel(e: PointerEvent) {\n\t\tif (!sessionRow) return;\n\t\tconst rect = sessionRow.getBoundingClientRect();\n\t\tconst width = dragWidth(e.clientX, rect.right, rect.width);\n\t\t// A width that would crush the session column is refused, not clamped.\n\t\tif (width !== null) panelDragWidth = width;\n\t}\n\n\tfunction endPanelResize() {\n\t\tif (panelDragWidth !== null) sidePanelStore.update(ref, { width: panelDragWidth });\n\t\tpanelDragWidth = null;\n\t}\n\n\t/** The keys that toggle a pane, close or reopen the panel, and maximize it. */\n\tfunction handlePanelKeys(e: KeyboardEvent): boolean {\n\t\tconst action = e.defaultPrevented ? null : panelKeyAction(e);\n\t\tif (!action) return false;\n\t\tlet done: boolean;\n\t\tif (action === 'maximize') done = toggleMaximize();\n\t\telse if (action === 'toggle') done = togglePanel();\n\t\telse done = togglePane(action.kind);\n\t\t// A key that changed nothing is left to whatever else wants it.\n\t\tif (done) e.preventDefault();\n\t\treturn done;\n\t}\n\n\tlet textInput = $state('');\n\t/** Ctrl/⌘ is held, so the primary button shows what Enter would do with it. */\n\tlet heldDelivery = $state<'steer' | 'now' | null>(null);\n\t/**\n\t * What was last dictated into the draft. While the draft still holds it the\n\t * message is sent as spoken, so its turn is badged; a draft rewritten or\n\t * swapped for another session's stops matching, with nothing to reset.\n\t */\n\tlet said = $state<string | null>(null);\n\tconst dictated = $derived(said !== null && textInput.includes(said));\n\t/**\n\t * A queued message loaded into the composer. What was typed before is put\n\t * aside and comes back once the edit is saved or cancelled.\n\t */\n\tlet editing = $state<{ ref: string; api: string; id: string; draft: string } | null>(null);\n\t/** Said once, when an edit outlived the message it was editing. */\n\tlet editNotice = $state<string | null>(null);\n\tlet showConfirmKill = $state(false);\n\tlet showConfirmRestart = $state(false);\n\tlet moreOpen = $state(false);\n\tlet commandsOpen = $state(false);\n\tlet attachPickerOpen = $state(false);\n\tlet attachStackOpen = $state(false);\n\tlet ctrlCount = $state(0);\n\tlet altCount = $state(0);\n\n\t/** The key tray, and the sheet that replaced the page header. */\n\tlet trayOpen = $state(false);\n\tlet sheetOpen = $state(false);\n\tlet chordMenuOpen = $state(false);\n\tlet chordIndex = $state(0);\n\tlet chordItems = $state<ChordAction[]>([]);\n\tlet chordTitle = $state('');\n\tlet chordStickArmed = $state(false);\n\tlet chordStickX = $state(0);\n\tlet chordStickY = $state(0);\n\tlet showCopied = $state(false);\n\tconst CHORD_STICK_DEADZONE = 0.3;\n\tconst CHORD_RING_THRESHOLD = 0.7;\n\tconst CHORD_RING_RADII = [130, 220];\n\tconst CHORD_CURSOR_RADIUS_PX = 240;\n\tconst CHORD_MAX_PER_RING = 12;\n\tlet chordInnerCount = $state(0);\n\tconst chordRings = $derived.by(() => {\n\t\tconst items = chordItems;\n\t\tif (chordInnerCount <= 0 || chordInnerCount >= items.length) return [items];\n\t\treturn [items.slice(0, chordInnerCount), items.slice(chordInnerCount)];\n\t});\n\tconst chordPositions = $derived(\n\t\tchordRings.flatMap((ring, ringIdx) => {\n\t\t\tconst r = CHORD_RING_RADII[ringIdx] ?? CHORD_RING_RADII[CHORD_RING_RADII.length - 1];\n\t\t\treturn ring.map((_, i) => {\n\t\t\t\tconst angle = (i / ring.length) * Math.PI * 2 - Math.PI / 2;\n\t\t\t\treturn { x: Math.cos(angle) * r, y: Math.sin(angle) * r };\n\t\t\t});\n\t\t})\n\t);\n\n\tconst headerActions: ChordAction[] = $derived([\n\t\t...(isAlive && canTranscript\n\t\t\t? [\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: viewMode === 'transcript' ? 'Terminal view' : 'Transcript view',\n\t\t\t\t\t\ticon: viewMode === 'transcript' ? 'mdi:console' : 'mdi:message-text-outline',\n\t\t\t\t\t\trun: () => toggleView()\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t: []),\n\t\t...(isAlive\n\t\t\t? [\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: 'Copy cmd',\n\t\t\t\t\t\ticon: showCopied ? 'mdi:check' : 'mdi:content-copy',\n\t\t\t\t\t\trun: () => copyTmuxCmd(),\n\t\t\t\t\t\tflashing: showCopied\n\t\t\t\t\t},\n\t\t\t\t\t{ label: 'Fit screen', icon: 'mdi:fit-to-screen', run: () => handleResize() },\n\t\t\t\t\t{ label: 'Refresh', icon: 'mdi:refresh', run: () => location.reload() }\n\t\t\t\t]\n\t\t\t: []),\n\t\t...(isAlive && isClaudeSession\n\t\t\t? [{ label: 'Restart Claude', icon: 'mdi:restart', run: () => (showConfirmRestart = true) }]\n\t\t\t: []),\n\t\t{ label: 'Kill pane', icon: 'mdi:power', run: () => (showConfirmKill = true), danger: true }\n\t]);\n\n\t/**\n\t * Remote Control's actions, drawn by the status line's menu and spliced\n\t * into the gamepad's chord menu, so the two offer the same rows. Kept out\n\t * of `headerActions` because that menu draws them itself. Turning is greyed\n\t * out in the menu while an ask is pending; `turnRemoteControl` ignores a\n\t * second ask either way.\n\t */\n\tconst rcActions: ChordAction[] = $derived.by(() => {\n\t\tif (!isAlive || !isClaudeSession) return [];\n\t\tconst url = currentSession?.rc_url;\n\t\tconst disabled = rcPending !== null;\n\t\tif (!url)\n\t\t\treturn [{ label: 'Turn on Remote Control', icon: 'mdi:cellphone-link', disabled, run: () => turnRemoteControl(true) }];\n\t\treturn [\n\t\t\t{ label: 'Open in Claude app', icon: 'mdi:open-in-new', run: () => window.open(url, '_blank', 'noopener') },\n\t\t\t{ label: 'Copy link', icon: 'mdi:link-variant', run: () => void copyWithToast(url, 'Link copied') },\n\t\t\t{\n\t\t\t\tlabel: 'Turn off Remote Control',\n\t\t\t\ticon: 'mdi:cellphone-link-off',\n\t\t\t\tdanger: true,\n\t\t\t\tdisabled,\n\t\t\t\trun: () => turnRemoteControl(false)\n\t\t\t}\n\t\t];\n\t});\n\n\tconst ctrlActions: ChordAction[] = [\n\t\t{ label: 'Ctrl+L', icon: 'mdi:eraser', run: () => void sendKeys('C-l') },\n\t\t{ label: 'Ctrl+U', icon: 'mdi:backspace-outline', run: () => void sendKeys('C-u') },\n\t\t{ label: 'Ctrl+W', icon: 'mdi:delete-sweep-outline', run: () => void sendKeys('C-w') },\n\t\t{ label: 'Ctrl+C', icon: 'mdi:stop', run: () => void sendKeys('C-c') },\n\t\t{ label: 'Ctrl+R', icon: 'mdi:magnify', run: () => void sendKeys('C-r') }\n\t];\n\n\tconst slashActions: ChordAction[] = [\n\t\t{ label: '/clear', icon: 'mdi:broom', run: () => runText('/clear') },\n\t\t{ label: '/compact', icon: 'mdi:archive-arrow-down', run: () => runText('/compact') },\n\t\t{ label: '/resume', icon: 'mdi:play-circle-outline', run: () => runText('/resume') },\n\t\t{ label: '/memory', icon: 'mdi:memory', run: () => runText('/memory') },\n\t\t{ label: '/init', icon: 'mdi:rocket-launch-outline', run: () => runText('/init') },\n\t\t{ label: '/grill-me', icon: 'mdi:fire', run: () => runText('/grill-me') },\n\t\t{ label: '/grill-with-docs', icon: 'mdi:fire-circle', run: () => runText('/grill-with-docs') },\n\t\t{ label: '/tdd', icon: 'mdi:test-tube', run: () => runText('/tdd') },\n\t\t{ label: '/diagnose', icon: 'mdi:stethoscope', run: () => runText('/diagnose') },\n\t\t{ label: '/simplify', icon: 'mdi:vector-difference-ab', run: () => runText('/simplify') },\n\t\t{ label: '/frontend-design', icon: 'mdi:palette-outline', run: () => runText('/frontend-design') },\n\t\t{ label: '/ak:linus', icon: 'mdi:code-tags-check', run: () => runText('/ak:linus') },\n\t\t{ label: '/ak:replan', icon: 'mdi:clipboard-text-outline', run: () => runText('/ak:replan') },\n\t\t{ label: '/ak:redelta', icon: 'mdi:compare', run: () => runText('/ak:redelta') },\n\t\t{ label: '/ak:triage', icon: 'mdi:sort-variant', run: () => runText('/ak:triage') },\n\t\t{ label: '/ak:verify', icon: 'mdi:check-decagram', run: () => runText('/ak:verify') },\n\t\t{ label: '/ak:bcheck', icon: 'mdi:checkbox-marked-circle-outline', run: () => runText('/ak:bcheck') },\n\t\t{ label: '/ak:p1', icon: 'mdi:numeric-1-circle', run: () => runText('/ak:p1') },\n\t\t{ label: '/ak:p2', icon: 'mdi:numeric-2-circle', run: () => runText('/ak:p2') }\n\t];\n\n\tfunction chunk<T>(arr: T[], size: number): T[][] {\n\t\tconst out: T[][] = [];\n\t\tfor (let i = 0; i < arr.length; i += size) out.push(arr.slice(i, i + size));\n\t\treturn out;\n\t}\n\n\tconst attachments = $derived(attachmentsStore.get(ref));\n\tlet cameraInput: HTMLInputElement | null = $state(null);\n\tlet galleryInput: HTMLInputElement | null = $state(null);\n\tlet filesInput: HTMLInputElement | null = $state(null);\n\tlet isTouchDevice = $state(false);\n\tlet dropActive = $state(false);\n\n\tconst canSend = $derived(attachments.every((a) => a.status === 'ready'));\n\tconst readyPaths = $derived(\n\t\tattachments.filter((a) => a.status === 'ready' && a.path).map((a) => a.path!)\n\t);\n\tconst hasDraft = $derived(textInput.trim().length > 0 || readyPaths.length > 0);\n\t/** Claude Code's ghost-text proposal in the pane's prompt box, if any. */\n\tconst suggestion = $derived(\n\t\tcurrentSession?.draft_kind === 'suggestion' ? (currentSession?.draft_input ?? null) : null\n\t);\n\t/** The action button names what it will do rather than always saying \"send\". */\n\tconst actionKind = $derived.by(() => {\n\t\tif (modArmed) return 'keys' as const;\n\t\tif (!hasDraft) {\n\t\t\treturn suggestion != null ? ('accept' as const) : ('enter' as const);\n\t\t}\n\t\tif (editing) return 'save' as const;\n\t\tif (isIdle) return 'send' as const;\n\t\t// Holding Ctrl/⌘ turns the button into what Enter does with it held.\n\t\treturn isBusy && heldDelivery ? heldDelivery : ('queue' as const);\n\t});\n\n\tconst ACTIONS = {\n\t\tkeys: { label: 'Keys', icon: 'mdi:arrow-up-bold' },\n\t\taccept: { label: 'Accept', icon: 'mdi:keyboard-tab' },\n\t\tenter: { label: 'Enter', icon: 'mdi:keyboard-return' },\n\t\tsend: { label: 'Send', icon: 'mdi:arrow-up' },\n\t\tqueue: { label: 'Queue', icon: 'mdi:playlist-plus' },\n\t\t...STEERS,\n\t\tsave: { label: 'Save', icon: 'mdi:content-save-outline' }\n\t} as const;\n\t/** An armed modifier names the sequence it will send, not the verb. */\n\tconst actionLabel = $derived(\n\t\tactionKind === 'keys'\n\t\t\t? [ctrlCount > 0 ? 'Ctrl' : '', altCount > 0 ? 'Alt' : ''].filter(Boolean).join('+')\n\t\t\t: ACTIONS[actionKind].label\n\t);\n\tconst actionIcon = $derived(ACTIONS[actionKind].icon);\n\tconst hasAttachments = $derived(attachments.length > 0);\n\tconst anyFailed = $derived(attachments.some((a) => a.status === 'failed'));\n\tconst anyUploading = $derived(attachments.some((a) => a.status === 'uploading'));\n\t/** The pane is asking for a keypress, so the face toggle asks for attention. */\n\tconst wantsKeypress = $derived(\n\t\tcurrentSession?.state === 'waiting' || currentSession?.state === 'permission'\n\t);\n\t$effect(() => {\n\t\tif (!hasAttachments) attachStackOpen = false;\n\t});\n\n\n\n\tconst isBusy = $derived((currentSession?.state ?? 'idle') === 'busy');\n\tconst isIdle = $derived((currentSession?.state ?? 'idle') === 'idle');\n\n\t/** What tmux calls the arrows the browser reports. */\n\tconst ARROW_KEYS: Record<string, string> = {\n\t\tArrowUp: 'Up',\n\t\tArrowDown: 'Down',\n\t\tArrowLeft: 'Left',\n\t\tArrowRight: 'Right'\n\t};\n\n\t/**\n\t * Shortcuts for the controls that have no caption to name them.\n\t *\n\t * Deliberately avoids Ctrl+J and Ctrl+W, which Chrome keeps for itself and\n\t * will not hand back however hard the page asks.\n\t */\n\tfunction handleGlobalKeys(e: KeyboardEvent) {\n\t\tif (handleChooserKeys(e)) return;\n\t\tif (!e.repeat && handlePanelKeys(e)) return;\n\t\t// The voice key works wherever focus is; the composer handles it\n\t\t// itself when it has focus, and marks the event so it is not taken twice.\n\t\tif (!e.defaultPrevented && !e.repeat && isVoiceHotkey(e)) {\n\t\t\te.preventDefault();\n\t\t\tvoid toggleVoice();\n\t\t\treturn;\n\t\t}\n\t\tif (!(e.ctrlKey || e.metaKey) || e.altKey) return;\n\t\tconst key = e.key.toLowerCase();\n\t\t// Ctrl+K belongs to the drawer's fleet switcher; commands take the slash they start with.\n\t\tif (key === '/') {\n\t\t\te.preventDefault();\n\t\t\tcommandsOpen = !commandsOpen;\n\t\t} else if (key === '.') {\n\t\t\te.preventDefault();\n\t\t\ttrayOpen = !trayOpen;\n\t\t} else if (key === 'e' && isAlive && canTranscript) {\n\t\t\te.preventDefault();\n\t\t\ttoggleView();\n\t\t}\n\t}\n\n\t/**\n\t * The dialog the pane is drawing, as the poll read it. The server gates\n\t * this on the state the hooks report — or, for a dialog a local command\n\t * such as `/model` opens while the session is idle, on the pane naming its\n\t * own keys — so a numbered list in Claude's prose never arrives here.\n\t */\n\tconst paneChoice = $derived(currentSession?.pane_choice ?? null);\n\n\t/**\n\t * The pane has a dialog's text field open — the free-text row, or an\n\t * option's notes. An empty Enter there would decline the question, so\n\t * the composer leaves it to the card's own field.\n\t */\n\tconst paneTyping = $derived(paneChoice?.typing === true || paneChoice?.noting === true);\n\n\t/** Anything drawn over the page that answers to the keyboard itself. */\n\tconst overlayOpen = $derived(\n\t\tcommandsOpen || moreOpen || trayOpen || sheetOpen || chordMenuOpen || attachPickerOpen ||\n\t\t\tattachStackOpen\n\t);\n\n\t/** Element types that keep their own keystrokes. */\n\tconst TYPING_TAGS = /^(INPUT|TEXTAREA|SELECT)$/;\n\n\t/**\n\t * Answer the pane's dialog from the keyboard while nothing else wants the\n\t * keys: no draft, and focus on no field. Enter takes the row the pane has\n\t * highlighted, Escape declines, and the arrows walk it — the same keys the\n\t * dialog answers to in the terminal. Returns whether the key was spent here.\n\t */\n\tfunction handleChooserKeys(e: KeyboardEvent): boolean {\n\t\tif (!paneChoice || hasDraft || paneTyping || overlayOpen) return false;\n\t\tif (e.ctrlKey || e.metaKey || e.altKey) return false;\n\t\tconst el = e.target as HTMLElement | null;\n\t\tif (el?.isContentEditable || TYPING_TAGS.test(el?.tagName ?? '')) return false;\n\t\tconst key = e.key === 'Enter' || e.key === 'Escape' ? e.key : ARROW_KEYS[e.key];\n\t\tif (!key) return false;\n\t\te.preventDefault();\n\t\t// Enter on the highlighted free-text row would decline the question:\n\t\t// the card's field is where its answer goes.\n\t\tif (key === 'Enter' && paneChoice.options.find((o) => o.selected)?.text) {\n\t\t\tfocusDialogField();\n\t\t\treturn true;\n\t\t}\n\t\tvoid sendKeys(key);\n\t\treturn true;\n\t}\n\n\t/** Hands the keyboard to the dialog card's own text field. */\n\tfunction focusDialogField() {\n\t\toutputElement?.querySelector<HTMLInputElement>('[data-dialog-input]')?.focus();\n\t}\n\n\t/**\n\t * The rare half of the old page header, folded into the session sheet.\n\t *\n\t * Derived from `headerActions` rather than restated, so the sheet and the\n\t * gamepad chord menu can never drift apart. The composer draws the view\n\t * toggle and the kill as controls of their own, so those two come out.\n\t */\n\tconst sheetActions = $derived([\n\t\t...(isClaudeSession\n\t\t\t? [\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: 'Rename',\n\t\t\t\t\t\ticon: 'mdi:pencil',\n\t\t\t\t\t\trun: () => (renameId = currentSession?.id ?? null)\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t: []),\n\t\t...headerActions.filter(\n\t\t\t(a) => !a.danger && a.label !== 'Terminal view' && a.label !== 'Transcript view'\n\t\t)\n\t]);\n\t// Tap candidate: modifier keydown with no intervening key → arm on keyup\n\tlet ctrlTapCandidate = false;\n\tlet altTapCandidate = false;\n\t/** The model on the latest reply, named the way the terminal names it. */\n\tconst modelName = $derived(modelDisplayName(transcriptStore.model));\n\tconst paneUpdate = $derived(currentSession?.pane_update ?? null);\n\tconst UPDATE_LABEL = {\n\t\tinstalled: 'Update installed · restart to apply',\n\t\tavailable: 'Update available',\n\t\tfailed: 'Auto-update failed'\n\t} as const;\n\tconst queue = $derived(currentSession?.queue ?? []);\n\tconst queueCount = $derived(queue.length);\n\tfunction findEntry(id: string): HTMLElement | null {\n\t\treturn outputElement?.querySelector<HTMLElement>(`[data-entry-id=\"${CSS.escape(id)}\"]`) ?? null;\n\t}\n\n\t/** How many older slices to pull in looking for an entry before giving up. */\n\tconst REVEAL_PAGES = 40;\n\n\t/**\n\t * Scroll the transcript to an entry (a turn's prompt, a tool row) and open it if it folds. A long session holds only its tail, so\n\t * an entry the socket never sent is asked for, slice by slice, until it is\n\t * on the page or the history runs out.\n\t */\n\tasync function revealEntry(id: string) {\n\t\tlet el = findEntry(id);\n\t\tfor (let i = 0; !el && i < REVEAL_PAGES && transcriptStore.firstIndex > 0; i++) {\n\t\t\tawait transcriptStore.loadEarlier();\n\t\t\tawait tick();\n\t\t\tel = findEntry(id);\n\t\t}\n\t\tif (!el) return;\n\t\tif (el instanceof HTMLDetailsElement) el.open = true;\n\t\tuserScrolledUp = true;\n\t\tel.scrollIntoView({ block: 'center', behavior: 'smooth' });\n\t}\n\n\t/**\n\t * A pane asked to show an entry in the transcript (the Changes pane's\n\t * \"Show in transcript\"). From the terminal, switch to the transcript; a\n\t * sheet over the transcript gets out of the way. The entry is revealed\n\t * once the transcript has its first snapshot.\n\t */\n\tlet pendingReveal = $state<string | null>(null);\n\t$effect(() => {\n\t\tfunction onReveal(e: Event) {\n\t\t\tconst id = (e as CustomEvent<{ id: string }>).detail?.id;\n\t\t\tif (!id || !canTranscript) return;\n\t\t\tif (!panelInline && panelKind) openPanel(null);\n\t\t\tif (viewMode !== 'transcript') toggleView();\n\t\t\tpendingReveal = id;\n\t\t}\n\t\twindow.addEventListener('claude-mux:reveal-entry', onReveal);\n\t\treturn () => window.removeEventListener('claude-mux:reveal-entry', onReveal);\n\t});\n\t$effect(() => {\n\t\tconst id = pendingReveal;\n\t\tif (!id || viewMode !== 'transcript' || !transcriptStore.receivedData) return;\n\t\tpendingReveal = null;\n\t\tvoid tick().then(() => revealEntry(id));\n\t});\n\n\t/** The transcript's live status row is showing (its height affects scroll). */\n\tconst liveRowVisible = $derived(\n\t\tviewMode === 'transcript' && !isIdle\n\t);\n\n\t// Clear whatever is typed in Claude's prompt: Ctrl+E (end of line) then\n\t// Ctrl+U repeatedly (delete to line start; repeats walk up multiline input).\n\t// Extra Ctrl+U on an empty prompt is a no-op, so over-sending is safe.\n\tconst CLEAR_PROMPT_KEYS = 'C-e ' + Array(12).fill('C-u').join(' ');\n\n\tconst moreKeys: { label: string; keys: string; icon: string }[] = [\n\t\t{ label: 'Bksp', keys: 'BSpace', icon: 'mdi:backspace' },\n\t\t{ label: 'Left', keys: 'Left', icon: 'mdi:arrow-left' },\n\t\t{ label: 'Right', keys: 'Right', icon: 'mdi:arrow-right' },\n\t\t{ label: 'Space', keys: 'Space', icon: 'mdi:keyboard-space' },\n\t\t{ label: 'Yes', keys: 'y', icon: 'mdi:check' },\n\t\t{ label: 'Tab', keys: 'Tab', icon: 'mdi:keyboard-tab' },\n\t\t{ label: 'S-Tab', keys: 'BTab', icon: 'mdi:keyboard-tab-reverse' },\n\t\t{ label: 'Enter', keys: 'Enter', icon: 'mdi:keyboard-return' },\n\t\t{ label: 'PgUp', keys: 'PageUp', icon: 'mdi:chevron-double-up' },\n\t\t{ label: 'PgDn', keys: 'PageDown', icon: 'mdi:chevron-double-down' },\n\t\t{ label: 'Home', keys: 'Home', icon: 'mdi:page-first' },\n\t\t{ label: 'End', keys: 'End', icon: 'mdi:page-last' },\n\t\t{ label: 'Clear', keys: CLEAR_PROMPT_KEYS, icon: 'mdi:eraser' },\n\t];\n\n\t// Pinned commands — shown first in the command palette (Cmds button)\n\tconst pinnedCommands = [\n\t\t'/clear',\n\t\t'/rc',\n\t\t'/ak:linus',\n\t\t'/ak:replan',\n\t\t'/ak:redelta',\n\t\t'/ak:triage',\n\t\t'/ak:verify',\n\t\t'/ak:bcheck',\n\t\t'/ak:p1',\n\t\t'/ak:p2',\n\t];\n\n\tfunction fillInput(text: string) {\n\t\ttextInput = textInput ? textInput + ' ' + text : text;\n\t\t// Picked from the dialog: don't immediately re-open the inline slash popup for it.\n\t\tslashDismissedFor = `${textInput.length - text.length}:${text}`;\n\t\tcommandsOpen = false;\n\t\t// Delay focus until after popover closes so it isn't stolen\n\t\tsetTimeout(() => {\n\t\t\tif (textareaElement) {\n\t\t\t\ttextareaElement.focus();\n\t\t\t\tconst end = textareaElement.value.length;\n\t\t\t\ttextareaElement.setSelectionRange(end, end);\n\t\t\t\tsyncCaret();\n\t\t\t\tautoResize();\n\t\t\t}\n\t\t}, 100);\n\t}\n\tlet outputElement: HTMLDivElement | null = $state(null);\n\tlet textareaElement: HTMLTextAreaElement | null = $state(null);\n\tlet userScrolledUp = $state(false);\n\tlet showSelectionCopied = $state(false);\n\tlet selectedText = $state('');\n\tlet measureCanvas: HTMLCanvasElement | null = null;\n\n\t// Freeze terminal rendering while user has text selected (iOS dismisses\n\t// the copy callout on any DOM mutation under the selection)\n\tlet hasSelection = $state(false);\n\n\t$effect(() => {\n\t\tif (!browser) return;\n\t\tconst handler = () => {\n\t\t\tconst sel = window.getSelection();\n\t\t\tconst text = sel?.toString() || '';\n\t\t\tconst selActive = !!(text.length > 0 && outputElement?.contains(sel?.anchorNode ?? null));\n\t\t\tif (selActive) selectedText = text;\n\t\t\thasSelection = selActive;\n\t\t};\n\t\tdocument.addEventListener('selectionchange', handler);\n\t\treturn () => document.removeEventListener('selectionchange', handler);\n\t});\n\n\t// \"New lines below\" indicator: history lines appended since the user scrolled up\n\tlet seenAppended = $state(0);\n\t// Only one view is attached at a time, so a single counter serves both.\n\tconst appendedNow = $derived(\n\t\tviewMode === 'transcript' ? transcriptStore.appended : terminalStore.appended\n\t);\n\tconst unseenLines = $derived(\n\t\tuserScrolledUp ? Math.max(0, appendedNow - seenAppended) : 0\n\t);\n\n\t// Measure monospace character dimensions using canvas\n\tfunction measureFont(): { width: number; height: number } {\n\t\tif (!browser) return { width: 7.8, height: 18.2 };\n\n\t\tif (!measureCanvas) measureCanvas = document.createElement('canvas');\n\t\tconst ctx = measureCanvas.getContext('2d');\n\t\tif (!ctx) return { width: 7.8, height: 18.2 };\n\n\t\t// Match CSS: font-family from .output, font-size: 13px, line-height: 1.4\n\t\tctx.font = \"13px 'SF Mono', Monaco, 'Cascadia Code', monospace\";\n\t\tconst width = ctx.measureText('M').width;\n\t\tconst height = 13 * 1.4; // 18.2px\n\n\t\treturn { width, height };\n\t}\n\n\t// Calculate terminal dimensions from output element\n\tfunction calculateTerminalSize(): { cols: number; rows: number } | null {\n\t\tif (!outputElement) return null;\n\n\t\t// Padding is 16px on each side (from CSS .output)\n\t\tconst padding = 32;\n\t\tconst innerWidth = outputElement.clientWidth - padding;\n\t\tconst innerHeight = outputElement.clientHeight - padding;\n\n\t\tif (innerWidth <= 0 || innerHeight <= 0) return null;\n\n\t\tconst { width: charW, height: charH } = measureFont();\n\t\t// Subtract 1 col for safety margin (font rendering varies across devices)\n\t\tconst cols = Math.floor(innerWidth / charW) - 1;\n\t\tconst rows = Math.floor(innerHeight / charH);\n\n\t\tif (cols < 10 || rows < 3) return null;\n\t\treturn { cols, rows };\n\t}\n\n\t// Send resize to server\n\tfunction handleResize() {\n\t\tconst size = calculateTerminalSize();\n\t\tif (size) terminalStore.sendResize(size.cols, size.rows);\n\t}\n\n\t// Drive the terminal store from view state. setTarget owns WS, output,\n\t// and history reset together; only attach when target is confirmed alive\n\t// and the raw mirror is the active view.\n\t$effect(() => {\n\t\tterminalStore.setTarget(isAlive && viewMode === 'terminal' ? target : null, base, route.address);\n\t});\n\n\t// Same contract for the transcript store, keyed by session id.\n\t$effect(() => {\n\t\ttranscriptStore.setSession(\n\t\t\tisAlive && viewMode === 'transcript' ? (currentSession?.id ?? null) : null,\n\t\t\tnull,\n\t\t\tbase,\n\t\t\troute.address\n\t\t);\n\t});\n\n\t// New target: forget any scrolled-up state from the previous session so the\n\t// view always opens pinned to the latest output.\n\t$effect(() => {\n\t\tref;\n\t\tviewMode;\n\t\tuntrack(() => {\n\t\t\tuserScrolledUp = false;\n\t\t\tseenAppended = 0;\n\t\t\tterminalStore.atBottom = true;\n\t\t\t// Re-pin after a view switch: content height changes completely.\n\t\t\ttick().then(() => {\n\t\t\t\tif (outputElement) outputElement.scrollTop = outputElement.scrollHeight;\n\t\t\t});\n\t\t});\n\t});\n\n\tonDestroy(() => {\n\t\tterminalStore.setTarget(null);\n\t\ttranscriptStore.setSession(null);\n\t});\n\n\t// A subagent's \"Message <parent>\" lands here with `?compose`: the reader\n\t// came to type, so the box takes the focus and the param goes. A quote\n\t// made on the agent's page is already in this session's draft, so the\n\t// caret goes to its end.\n\t$effect(() => {\n\t\tif (!$page.url.searchParams.has('compose')) return;\n\t\t// The param goes either way: a pane with no composer up (terminal\n\t\t// view, a dead pane) should not grab the focus on some later visit.\n\t\tuntrack(() => {\n\t\t\tfocusComposerEnd();\n\t\t\tconst params = new URLSearchParams($page.url.searchParams);\n\t\t\tparams.delete('compose');\n\t\t\tconst query = params.toString();\n\t\t\tgoto(`${$page.url.pathname}${query ? `?${query}` : ''}`, {\n\t\t\t\treplaceState: true,\n\t\t\t\tnoScroll: true,\n\t\t\t\tkeepFocus: true\n\t\t\t});\n\t\t});\n\t});\n\n\t// The page has been seen showing one session while the URL named another,\n\t// and only sometimes. A beat after every navigation, compare the two and\n\t// write what the page believed to the server log, so the next report\n\t// comes with the state that produced it.\n\tafterNavigate(() => {\n\t\tsetTimeout(() => {\n\t\t\tconst urlTarget = parseSessionPath(location.pathname)?.ref.target ?? '';\n\t\t\tconst shown = currentSession?.tmux_target ?? target;\n\t\t\tif (urlTarget && shown && urlTarget !== shown) {\n\t\t\t\treportClient('stale', {\n\t\t\t\t\turlTarget,\n\t\t\t\t\ttarget,\n\t\t\t\t\tshown,\n\t\t\t\t\tcurrentSessionId: currentSession?.id ?? null,\n\t\t\t\t\tsessionsKnown: sessionStore.sessions.length,\n\t\t\t\t\ttargetInStore: sessionStore.sessions.some((s) => s.tmux_target === urlTarget),\n\t\t\t\t\tviewMode,\n\t\t\t\t\tisAlive,\n\t\t\t\t\ttranscriptAvailable: transcriptStore.available,\n\t\t\t\t\ttranscriptEntries: transcriptStore.entries.length,\n\t\t\t\t\tconnected: sessionStore.connected\n\t\t\t\t});\n\t\t\t}\n\t\t}, 800);\n\t});\n\n\t$effect(() => {\n\t\t// The landing page reopens this machine's last session, by target alone.\n\t\tif (!browser || !target || remoteHost) return;\n\t\ttry {\n\t\t\tif (isAlive) {\n\t\t\t\tlocalStorage.setItem(STORAGE_KEYS.lastSession, target);\n\t\t\t} else if (paneIsDead && localStorage.getItem(STORAGE_KEYS.lastSession) === target) {\n\t\t\t\tlocalStorage.removeItem(STORAGE_KEYS.lastSession);\n\t\t\t}\n\t\t} catch {\n\t\t\t// quota / private mode — resume just won't work this device\n\t\t}\n\t});\n\n\t// Load runs in $effect.pre so it precedes the save effect in the same flush;\n\t// otherwise a target switch would persist the previous textInput under the\n\t// new target.\n\t$effect.pre(() => {\n\t\tconst t = ref;\n\t\tuntrack(() => {\n\t\t\t// An edit belongs to its session: leaving it gives that session its\n\t\t\t// own draft back, and the queued message keeps its text.\n\t\t\tif (editing && editing.ref !== t) {\n\t\t\t\tdraftsStore.set(editing.ref, editing.draft);\n\t\t\t\tediting = null;\n\t\t\t}\n\t\t\teditNotice = null;\n\t\t\ttextInput = draftsStore.get(t);\n\t\t});\n\t\tvoid tick().then(autoResize);\n\t});\n\n\t$effect(() => {\n\t\tdraftsStore.set(ref, textInput);\n\t});\n\n\tfunction handleScroll() {\n\t\tif (!outputElement) return;\n\t\tconst { scrollTop, scrollHeight, clientHeight } = outputElement;\n\t\tconst nextScrolledUp = scrollHeight - scrollTop - clientHeight > 50;\n\t\tif (nextScrolledUp !== userScrolledUp) {\n\t\t\tuserScrolledUp = nextScrolledUp;\n\t\t\tterminalStore.atBottom = !nextScrolledUp;\n\t\t\t// Count \"new\" lines from the moment the user left the bottom\n\t\t\tseenAppended = appendedNow;\n\t\t\tif (!nextScrolledUp) terminalStore.trimToBottom();\n\t\t}\n\t\t// Whatever the reader stopped on is what we hold them to if the content\n\t\t// above them grows while they read.\n\t\tif (nextScrolledUp) captureAnchor();\n\n\t\t// Near the top: fetch an older chunk and keep the viewport anchored on the\n\t\t// same content (history only ever grows at the ends, so the distance from\n\t\t// the bottom is a stable anchor).\n\t\tif (scrollTop < 200 && !hasSelection && !terminalStore.historyAtStart) {\n\t\t\tconst pending = terminalStore.requestMoreHistory();\n\t\t\tif (pending) holdPlaceThrough(pending);\n\t\t}\n\t}\n\n\t/**\n\t * Chrome and Firefox hold the reader's place natively (CSS scroll anchoring)\n\t * when something above the viewport changes height — a tool result filling\n\t * into a card the reader has already scrolled past. Safari, and therefore\n\t * every browser on iOS, does not implement it, so there we keep the anchor\n\t * ourselves: the topmost row still on screen, and how far below the top of\n\t * the viewport it sat.\n\t */\n\tconst nativeScrollAnchoring = !browser || CSS.supports('overflow-anchor: auto');\n\tlet anchorNode: HTMLElement | null = null;\n\tlet anchorOffset = 0;\n\n\t/**\n\t * The transcript rows, which are the only thing worth anchoring to: the\n\t * terminal is a single <pre> with no per-row elements, and its one insertion\n\t * from above goes through holdPlaceThrough instead.\n\t */\n\tfunction anchorRows(): HTMLCollection | null {\n\t\treturn outputElement?.querySelector('.transcript')?.children ?? null;\n\t}\n\n\tfunction captureAnchor() {\n\t\tanchorNode = null;\n\t\tconst rows = nativeScrollAnchoring ? null : anchorRows();\n\t\tif (!rows || rows.length === 0 || !outputElement) return;\n\t\t// Rows are stacked in DOM order, so their edges are sorted: binary-search\n\t\t// for the topmost one still on screen rather than measuring every row\n\t\t// above the reader on every scroll event.\n\t\tconst top = outputElement.getBoundingClientRect().top;\n\t\tlet lo = 0;\n\t\tlet hi = rows.length - 1;\n\t\twhile (lo < hi) {\n\t\t\tconst mid = (lo + hi) >> 1;\n\t\t\tif (rows[mid].getBoundingClientRect().bottom > top) hi = mid;\n\t\t\telse lo = mid + 1;\n\t\t}\n\t\tanchorNode = rows[lo] as HTMLElement;\n\t\tanchorOffset = anchorNode.getBoundingClientRect().top - top;\n\t}\n\n\tfunction restoreAnchor() {\n\t\tif (nativeScrollAnchoring || !outputElement || !anchorNode?.isConnected) return;\n\t\tconst top = outputElement.getBoundingClientRect().top;\n\t\tconst drift = anchorNode.getBoundingClientRect().top - top - anchorOffset;\n\t\tif (Math.abs(drift) >= 1) outputElement.scrollTop += drift;\n\t}\n\n\t/**\n\t * Hold the reader's place across an insertion *above* them — older terminal\n\t * history, or the transcript's \"load earlier\". Both only ever grow at the\n\t * ends, so the distance to the bottom is a stable anchor; `pending` says\n\t * when the new content has arrived, and rAF lets it lay out first.\n\t */\n\tfunction holdPlaceThrough(pending: Promise<unknown>) {\n\t\tconst el = outputElement;\n\t\tif (!el) return;\n\t\tconst fromBottom = el.scrollHeight - el.scrollTop;\n\t\tpending.then(() =>\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tif (outputElement) outputElement.scrollTop = outputElement.scrollHeight - fromBottom;\n\t\t\t})\n\t\t);\n\t}\n\n\tfunction scrollToBottom() {\n\t\tif (!outputElement) return;\n\t\tuserScrolledUp = false;\n\t\tterminalStore.atBottom = true;\n\t\tseenAppended = appendedNow;\n\t\tterminalStore.trimToBottom();\n\t\ttick().then(() => {\n\t\t\tif (outputElement) outputElement.scrollTop = outputElement.scrollHeight;\n\t\t});\n\t}\n\n\t// Auto-scroll to bottom only if user hasn't scrolled up and no active selection.\n\t// While scrolled up we deliberately leave scrollTop alone: history only appends\n\t// below, so whatever the user is reading stays where it is.\n\t$effect(() => {\n\t\t// track output changes (screen redraws, appended history, and the initial\n\t\t// history tail / load-more prepends, which grow the block above the screen)\n\t\tterminalStore.screen;\n\t\tterminalStore.appended;\n\t\tterminalStore.history.length;\n\t\tterminalStore.historyStart;\n\t\ttranscriptStore.entries.length;\n\t\t// A boolean, not the action text: the latter changes on every 500ms\n\t\t// broadcast and would force a layout read/write twice a second.\n\t\tliveRowVisible;\n\t\tif (outputElement && !userScrolledUp && !hasSelection) {\n\t\t\tconst el = outputElement;\n\t\t\tel.scrollTop = el.scrollHeight;\n\t\t\t// Layout may still settle (fonts, viewport/keyboard changes on mobile): pin again next frame.\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tif (!userScrolledUp && !hasSelection) el.scrollTop = el.scrollHeight;\n\t\t\t});\n\t\t}\n\t});\n\n\t// Layout can change without any store update (toolbar/attachment rows,\n\t// keyboard on mobile, fonts loading, a tool result filling in a card that is\n\t// already on screen): keep the view pinned through those too.\n\t//\n\t// The observed set has to be re-synced when .output swaps its content.\n\t// Switching between the transcript and the terminal — including the restore\n\t// of the view this session was last in — replaces the child we watch, and an\n\t// observer left on the detached node never fires again, so the swap point\n\t// (viewMode) is a dependency: effects run after the DOM update, so the new\n\t// child is in place by the time this re-observes.\n\t$effect(() => {\n\t\tviewMode;\n\t\tconst el = outputElement;\n\t\tif (!el || typeof ResizeObserver === 'undefined') return;\n\t\tconst ro = new ResizeObserver(() => {\n\t\t\tif (hasSelection) return;\n\t\t\tif (userScrolledUp) restoreAnchor();\n\t\t\telse el.scrollTop = el.scrollHeight;\n\t\t});\n\t\tro.observe(el);\n\t\tfor (const child of el.children) ro.observe(child);\n\t\treturn () => ro.disconnect();\n\t});\n\n\tasync function postToPane(body: Record<string, unknown>) {\n\t\tif (!target) return;\n\t\tawait fetch(`${api(target)}/send`, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tbody: JSON.stringify(body)\n\t\t});\n\t}\n\n\tconst sendKeys = (keys: string) => postToPane({ keys });\n\n\t/** Types text into the pane as it is, with no Enter: a dialog's own text field. */\n\tconst sendPaneText = (text: string) => postToPane({ text, raw: true });\n\n\t/** Works Claude Code's rewind dialog in the pane; says why when it could not. */\n\tasync function rewind(action: RewindAction): Promise<boolean> {\n\t\tif (!target) return false;\n\t\tconst res = await fetch(`${api(target)}/rewind`, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tbody: JSON.stringify(action)\n\t\t}).catch(() => null);\n\t\tif (res?.ok) return true;\n\t\tconst why = (await res?.json().catch(() => null)) as { error?: string } | null;\n\t\ttoast.error(why?.error ?? 'Could not reach the pane');\n\t\treturn false;\n\t}\n\n\t// Send button with empty input: single tap → Enter, double tap → Tab+Enter\n\t// (accept suggestion). The single Enter is delayed briefly so a second tap\n\t// can upgrade it; keyboard Enter stays immediate (see handleKeydown).\n\tconst DOUBLE_TAP_MS = 300;\n\tlet emptyEnterTimer: ReturnType<typeof setTimeout> | null = null;\n\tasync function sendFromButton() {\n\t\tif (!target || !canSend) return;\n\t\tif (hasDraft) {\n\t\t\tawait sendText();\n\t\t\treturn;\n\t\t}\n\t\t// The dialog's text field is open: a bare Enter would decline it.\n\t\tif (paneTyping) return focusDialogField();\n\t\tif (emptyEnterTimer) {\n\t\t\tclearTimeout(emptyEnterTimer);\n\t\t\temptyEnterTimer = null;\n\t\t\tawait acceptSuggestion();\n\t\t\treturn;\n\t\t}\n\t\temptyEnterTimer = setTimeout(() => {\n\t\t\temptyEnterTimer = null;\n\t\t\tvoid sendKeys('Enter');\n\t\t}, DOUBLE_TAP_MS);\n\t}\n\n\tasync function sendText() {\n\t\tif (!target) return;\n\t\tif (!canSend) return;\n\t\tif (editing) {\n\t\t\tawait saveEdit();\n\t\t\treturn;\n\t\t}\n\t\tif (!hasDraft) {\n\t\t\t// Empty input: just send Enter key — unless the dialog's text field\n\t\t\t// is open, where an empty Enter declines the question.\n\t\t\tif (paneTyping) return focusDialogField();\n\t\t\tawait sendKeys('Enter');\n\t\t\treturn;\n\t\t}\n\t\t// An idle pane drawing a dialog (a local command's picker) would take\n\t\t// the text as keys and the Enter as a pick; the draft waits instead.\n\t\tif (isIdle && paneChoice) {\n\t\t\teditNotice = 'A dialog is open in the pane. Answer it in the card above, then send.';\n\t\t\treturn;\n\t\t}\n\t\t// Busy, or a dialog open: the message waits in the queue for its own turn.\n\t\tawait deliver(isIdle ? 'send' : 'queue');\n\t}\n\n\tinterface Composed {\n\t\t/** The session's key in the drafts and attachments stores. */\n\t\tref: string;\n\t\t/** Its API, so a reply that lands after a move still finds the session it left. */\n\t\tapi: string;\n\t\ttext: string;\n\t\tchipIds: string[];\n\t}\n\n\t/** What a send is about to deliver, taken before it awaits the server. */\n\tfunction composed(): Composed | null {\n\t\tif (!target || !ref) return null;\n\t\treturn { ref, api: api(target), text: textInput, chipIds: attachments.map((a) => a.localId) };\n\t}\n\n\t/**\n\t * Take a delivered message out of its session's composer. The send awaited\n\t * the server, so the user may be on another session by now, or have added to\n\t * this one: only the text and chips that went out are cleared, and in the\n\t * session they went to.\n\t */\n\tfunction clearSent(sent: Composed) {\n\t\tfor (const id of sent.chipIds) attachmentsStore.remove(sent.ref, id);\n\t\tif (sent.ref !== ref) {\n\t\t\tif (draftsStore.get(sent.ref) === sent.text) draftsStore.set(sent.ref, '');\n\t\t\treturn;\n\t\t}\n\t\tif (textInput !== sent.text) return;\n\t\ttextInput = '';\n\t\tif (textareaElement) textareaElement.style.height = 'auto';\n\t}\n\n\t/**\n\t * Hand a session a message through one of the routes that deliver one.\n\t * Resolves false, having said why, when the session did not take it.\n\t */\n\tasync function post(\n\t\tto: string,\n\t\troute: 'send' | 'queue' | 'steer',\n\t\tmessage: Record<string, unknown>\n\t): Promise<boolean> {\n\t\tconst res = await fetch(`${to}/${route}`, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tbody: JSON.stringify(message)\n\t\t});\n\t\tif (res.ok) return true;\n\t\tconst body = (await res.json().catch(() => ({}))) as { error?: string };\n\t\talert(`Could not ${route}: ${body.error ?? res.statusText}`);\n\t\treturn false;\n\t}\n\n\t/** A message composed elsewhere on the page — a grilling round's answers. */\n\tconst sendReply = async (text: string) => target != null && (await post(api(target), 'send', { text }));\n\n\t/** Put the draft in the pane's prompt box and leave the Enter to the pane. */\n\tasync function sendTextRaw() {\n\t\tif (!canSend || (!textInput && readyPaths.length === 0)) return;\n\t\tconst sent = composed();\n\t\tif (!sent) return;\n\t\tconst message = { text: sent.text, raw: true, attachments: readyPaths };\n\t\tif (await post(sent.api, 'send', message)) clearSent(sent);\n\t}\n\n\t/** Which way Remote Control was asked to turn, until the poll sees it turn. */\n\tlet rcPending = $state<'on' | 'off' | null>(null);\n\t/**\n\t * How long the pane gets to turn it before the ask is given up on. `/rc`\n\t * waits for a running turn to end, so this is the server's ask lifetime.\n\t */\n\tconst RC_PENDING_MS = 10 * 60_000;\n\t// An ask belongs to the session it was made in.\n\t$effect(() => {\n\t\tvoid ref;\n\t\trcPending = null;\n\t});\n\n\t/** Ask the session to turn Remote Control on or off; the poll sees the change. */\n\tasync function turnRemoteControl(on: boolean) {\n\t\tif (!target || rcPending) return;\n\t\tconst way = on ? 'on' : 'off';\n\t\trcPending = way;\n\t\tconst res = await fetch(`${api(target)}/rc`, {\n\t\t\tmethod: on ? 'POST' : 'DELETE'\n\t\t}).catch(() => null);\n\t\tif (!res?.ok) {\n\t\t\trcPending = null;\n\t\t\ttoast.error(`Could not turn Remote Control ${way}`);\n\t\t}\n\t}\n\n\t// A boolean, not the session: every broadcast is a new session object,\n\t// and depending on it would restart the timer below on each one.\n\tconst rcOn = $derived(!!currentSession?.rc_url);\n\t$effect(() => {\n\t\tconst wanted = rcPending;\n\t\tif (!wanted) return;\n\t\tif ((wanted === 'on') === rcOn) {\n\t\t\trcPending = null;\n\t\t\treturn;\n\t\t}\n\t\tconst timer = setTimeout(() => {\n\t\t\trcPending = null;\n\t\t\ttoast.error(`Remote Control did not turn ${wanted}`);\n\t\t}, RC_PENDING_MS);\n\t\treturn () => clearTimeout(timer);\n\t});\n\n\tasync function acceptSuggestion() {\n\t\tawait sendKeys('Tab Enter');\n\t}\n\n\t/**\n\t * The ways a draft reaches the session, whether it was typed or spoken:\n\t * `send` starts a turn, `queue` waits for the running one to end, `steer`\n\t * hands it to Claude Code to read when it next stops for input, and `now`\n\t * makes it read at once.\n\t */\n\ttype Delivery = 'send' | 'queue' | SteerMode;\n\n\t/** Deliver the draft; it leaves the composer only once the session has taken it. */\n\tasync function deliver(how: Delivery) {\n\t\tif (!canSend || !hasDraft) return;\n\t\tconst sent = composed();\n\t\tif (!sent) return;\n\t\tconst message = { text: sent.text, attachments: readyPaths, dictated };\n\t\t// The draft stays put on a refusal, so nothing typed or said is lost.\n\t\tconst taken =\n\t\t\thow === 'send' || how === 'queue'\n\t\t\t\t? await post(sent.api, how, message)\n\t\t\t\t: await post(sent.api, 'steer', { ...message, mode: how });\n\t\tif (taken) clearSent(sent);\n\t}\n\tconst steerText = () => deliver('steer');\n\tconst nowText = () => deliver('now');\n\n\t// ─── Editing a queued message ───────────────────────────────────────────\n\n\n\tfunction startEdit(item: QueuedMessageInfo) {\n\t\tif (!target || !ref) return;\n\t\tif (editing) cancelEdit();\n\t\tediting = { ref, api: api(target), id: item.id, draft: textInput };\n\t\teditNotice = null;\n\t\ttextInput = item.text;\n\t\tvoid tick().then(() => {\n\t\t\tautoResize();\n\t\t\ttextareaElement?.focus();\n\t\t});\n\t}\n\n\tfunction cancelEdit() {\n\t\tif (!editing) return;\n\t\ttextInput = editing.draft;\n\t\tediting = null;\n\t\tvoid tick().then(autoResize);\n\t}\n\n\t/**\n\t * The message left the queue while it was being edited — delivered, or\n\t * removed elsewhere. The edited text stays in the composer as a draft of\n\t * its own, ahead of whatever was put aside, so neither is lost.\n\t */\n\tfunction orphanEdit() {\n\t\tif (!editing) return;\n\t\tconst aside = editing.draft.trim();\n\t\tediting = null;\n\t\tif (aside) textInput = `${textInput}\\n\\n${aside}`;\n\t\teditNotice = 'That message was already sent, so your edit is kept here as a new draft.';\n\t}\n\n\tasync function saveEdit() {\n\t\tif (!editing || !textInput.trim()) return;\n\t\tconst { api: to, id } = editing;\n\t\tconst res = await fetch(`${to}/queue`, {\n\t\t\tmethod: 'PATCH',\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tbody: JSON.stringify({ id, text: textInput })\n\t\t});\n\t\tif (editing?.id !== id) return;\n\t\tif (res.ok) cancelEdit();\n\t\telse if (res.status === 404) orphanEdit();\n\t\telse {\n\t\t\tconst body = (await res.json().catch(() => ({}))) as { error?: string };\n\t\t\talert(`Could not save: ${body.error ?? res.statusText}`);\n\t\t}\n\t}\n\n\t// The broadcast drops an item the moment the drain sends it. A session\n\t// missing for a moment (a reconnect) says nothing about its queue.\n\t$effect(() => {\n\t\tif (\n\t\t\tediting &&\n\t\t\tediting.ref === ref &&\n\t\t\tcurrentSession &&\n\t\t\t!queue.some((m) => m.id === editing!.id)\n\t\t) {\n\t\t\tuntrack(orphanEdit);\n\t\t}\n\t});\n\n\tconst syncHeldDelivery = (e: KeyboardEvent) =>\n\t\t(heldDelivery = e.ctrlKey || e.metaKey ? (e.shiftKey ? 'now' : 'steer') : null);\n\n\n\t// ─── Attachments ────────────────────────────────────────────────────────\n\n\tfunction makeLocalId(): string {\n\t\treturn typeof crypto !== 'undefined' && 'randomUUID' in crypto\n\t\t\t? crypto.randomUUID()\n\t\t\t: `att-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n\t}\n\n\tasync function doUpload(owner: string, localId: string, file: File, signal: AbortSignal) {\n\t\tconst sessionId = currentSession?.id;\n\t\tif (!sessionId) {\n\t\t\tattachmentsStore.patch(owner, localId, { status: 'failed', error: 'No active session' });\n\t\t\treturn;\n\t\t}\n\t\tconst form = new FormData();\n\t\tform.append('file', file);\n\t\ttry {\n\t\t\tconst res = await fetch(`${api(sessionId)}/attach`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: form,\n\t\t\t\tsignal\n\t\t\t});\n\t\t\tif (!res.ok) {\n\t\t\t\tconst body = await res.json().catch(() => ({}));\n\t\t\t\tthrow new Error(body.error || `HTTP ${res.status}`);\n\t\t\t}\n\t\t\tconst data = (await res.json()) as { path: string; name: string; size: number; mime: string };\n\t\t\tattachmentsStore.patch(owner, localId, { status: 'ready', path: data.path, abort: undefined });\n\t\t} catch (err) {\n\t\t\tif (signal.aborted) return;\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\tattachmentsStore.patch(owner, localId, { status: 'failed', error: msg, abort: undefined });\n\t\t}\n\t}\n\n\tfunction uploadAttachment(file: File) {\n\t\tif (!ref) return;\n\t\tconst localId = makeLocalId();\n\t\tconst thumb = file.type.startsWith('image/') ? URL.createObjectURL(file) : undefined;\n\t\tconst abort = new AbortController();\n\t\tconst chip: Attachment = {\n\t\t\tlocalId,\n\t\t\tfile,\n\t\t\tname: file.name || `pasted-${Date.now()}`,\n\t\t\tsize: file.size,\n\t\t\tmime: file.type || 'application/octet-stream',\n\t\t\tstatus: 'uploading',\n\t\t\tthumb,\n\t\t\tabort\n\t\t};\n\t\tattachmentsStore.add(ref, chip);\n\t\tvoid doUpload(ref, localId, file, abort.signal);\n\t}\n\n\tfunction uploadFiles(files: FileList | File[] | null | undefined) {\n\t\tif (!files) return;\n\t\tfor (const f of Array.from(files)) uploadAttachment(f);\n\t}\n\n\tfunction retryAttachment(localId: string) {\n\t\tconst chip = attachments.find((a) => a.localId === localId);\n\t\tif (!ref || !chip || chip.status !== 'failed') return;\n\t\tconst abort = new AbortController();\n\t\tattachmentsStore.patch(ref, localId, { status: 'uploading', error: undefined, abort });\n\t\tvoid doUpload(ref, localId, chip.file, abort.signal);\n\t}\n\n\tfunction removeAttachment(localId: string) {\n\t\tconst chip = attachmentsStore.remove(ref, localId);\n\t\tif (chip?.status === 'ready' && chip.path && currentSession?.id) {\n\t\t\t// Best-effort server cleanup; chip is gone either way.\n\t\t\tvoid fetch(\n\t\t\t\t`${api(currentSession.id)}/attach?path=${encodeURIComponent(chip.path)}`,\n\t\t\t\t{ method: 'DELETE' }\n\t\t\t);\n\t\t}\n\t}\n\n\tfunction handlePaste(e: ClipboardEvent) {\n\t\tconst files = e.clipboardData?.files;\n\t\tif (files && files.length > 0) {\n\t\t\te.preventDefault();\n\t\t\tuploadFiles(files);\n\t\t}\n\t}\n\n\tfunction handlePickerInput(e: Event) {\n\t\tconst input = e.currentTarget as HTMLInputElement;\n\t\tuploadFiles(input.files);\n\t\tinput.value = '';\n\t\tattachPickerOpen = false;\n\t}\n\n\tfunction openPicker(which: 'camera' | 'gallery' | 'files') {\n\t\tattachPickerOpen = false;\n\t\tconst el = which === 'camera' ? cameraInput : which === 'gallery' ? galleryInput : filesInput;\n\t\t// Tick so popover close doesn't swallow the click on iOS.\n\t\tsetTimeout(() => el?.click(), 0);\n\t}\n\n\t// Touch detection + window-level drag-drop wiring.\n\tonMount(() => {\n\t\tif (!browser) return;\n\t\ttry {\n\t\t\tisTouchDevice = window.matchMedia('(pointer: coarse)').matches;\n\t\t} catch {\n\t\t\tisTouchDevice = 'ontouchstart' in window;\n\t\t}\n\n\t\tlet counter = 0;\n\t\tconst hasFiles = (e: DragEvent) =>\n\t\t\tArray.from(e.dataTransfer?.types ?? []).includes('Files');\n\t\tconst onEnter = (e: DragEvent) => {\n\t\t\tif (!hasFiles(e)) return;\n\t\t\tcounter++;\n\t\t\tif (counter === 1) dropActive = true;\n\t\t\te.preventDefault();\n\t\t};\n\t\tconst onLeave = (e: DragEvent) => {\n\t\t\tif (!hasFiles(e)) return;\n\t\t\tcounter--;\n\t\t\tif (counter <= 0) {\n\t\t\t\tcounter = 0;\n\t\t\t\tdropActive = false;\n\t\t\t}\n\t\t};\n\t\tconst onOver = (e: DragEvent) => {\n\t\t\tif (!hasFiles(e)) return;\n\t\t\te.preventDefault();\n\t\t\tif (e.dataTransfer) e.dataTransfer.dropEffect = 'copy';\n\t\t};\n\t\tconst onDrop = (e: DragEvent) => {\n\t\t\tif (!hasFiles(e)) return;\n\t\t\te.preventDefault();\n\t\t\tcounter = 0;\n\t\t\tdropActive = false;\n\t\t\tuploadFiles(e.dataTransfer?.files);\n\t\t};\n\t\twindow.addEventListener('dragenter', onEnter);\n\t\twindow.addEventListener('dragleave', onLeave);\n\t\twindow.addEventListener('dragover', onOver);\n\t\twindow.addEventListener('drop', onDrop);\n\t\treturn () => {\n\t\t\twindow.removeEventListener('dragenter', onEnter);\n\t\t\twindow.removeEventListener('dragleave', onLeave);\n\t\t\twindow.removeEventListener('dragover', onOver);\n\t\t\twindow.removeEventListener('drop', onDrop);\n\t\t};\n\t});\n\n\t/** The composer's own take is running, as opposed to a question field's. */\n\tconst speaking = $derived(\n\t\tvoiceEnabled && voiceStore.status === 'recording' && voiceStore.isOwnedBy(ref)\n\t);\n\n\t/**\n\t * End the composer's take and put what was said through `run`, the same\n\t * function a typed draft goes through: the words join the draft, and from\n\t * there voice has no path of its own. Without a `run` the setting decides\n\t * between sending and leaving the words in the box to be read first.\n\t * Resolves false when there was no take of the composer's to end.\n\t */\n\tasync function finishVoice(run?: () => unknown): Promise<boolean> {\n\t\tif (!speaking) return false;\n\t\tconst from = ref;\n\t\tconst heard = await voiceStore.stop();\n\t\tif (!heard || !from) return true;\n\t\tif (from !== ref) {\n\t\t\t// The page moved on while the words were being worked out: they wait\n\t\t\t// in the composer of the session they were said to.\n\t\t\tdraftsStore.set(from, insertSaid(draftsStore.get(from), heard.text, null).text);\n\t\t\treturn true;\n\t\t}\n\t\t// A spoken slash command still goes to the end: set before the draft, it\n\t\t// would take the draft as its arguments.\n\t\tconst spot = heard.command ? null : caretOf(textareaElement);\n\t\tconst next = insertSaid(textInput, heard.text, spot);\n\t\ttextInput = next.text;\n\t\t// A slash command renders as its own kind of turn, not as something said.\n\t\tsaid = heard.command ? null : heard.text;\n\t\tawait tick();\n\t\tautoResize();\n\t\tif (run) await run();\n\t\telse if (voiceStore.autoSubmit) await sendText();\n\t\telse if (spot) {\n\t\t\t// Left in the box to be read: the caret waits after the words for another take.\n\t\t\tputCaret(textareaElement, next.caret);\n\t\t\tsyncCaret();\n\t\t}\n\t\treturn true;\n\t}\n\n\t/** The microphone's one key: start a take, end it, or give up on its transcription. */\n\tasync function toggleVoice() {\n\t\tif (!ref || !voiceEnabled) return;\n\t\tif (voiceStore.isActive && !voiceStore.isOwnedBy(ref)) return;\n\t\tif (voiceStore.status === 'transcribing') voiceStore.cancelTranscribing();\n\t\telse if (voiceStore.status === 'recording') await finishVoice();\n\t\telse await voiceStore.startRecording(ref);\n\t}\n\n\t/** The ways to end a take that keep it: the composer's own verbs for a draft. */\n\tconst voiceActions = $derived.by((): VoiceAction[] => {\n\t\tconst first = editing ? ACTIONS.save : isIdle ? ACTIONS.send : ACTIONS.queue;\n\t\tconst actions: VoiceAction[] = [\n\t\t\t{ ...first, title: `Stop recording and ${first.label.toLowerCase()}`, run: () => void finishVoice(sendText) }\n\t\t];\n\t\tif (steerable) {\n\t\t\tactions.push(\n\t\t\t\t{ ...STEERS.steer, run: () => void finishVoice(steerText) },\n\t\t\t\t{ ...STEERS.now, run: () => void finishVoice(nowText) }\n\t\t\t);\n\t\t}\n\t\treturn actions;\n\t});\n\n\tfunction isVoiceHotkey(e: KeyboardEvent): boolean {\n\t\tif (!voiceEnabled) return false;\n\t\tif (e.altKey || e.metaKey || e.shiftKey) return false;\n\t\tif (e.code === 'F2' && !e.ctrlKey) return true;\n\t\tif (e.code === 'Pause' && !e.ctrlKey) return true;\n\t\tif (e.code === 'Backquote' && e.ctrlKey) return true;\n\t\treturn false;\n\t}\n\n\tfunction cycleCtrl() {\n\t\tctrlCount = (ctrlCount + 1) % 3;\n\t}\n\tfunction cycleAlt() {\n\t\taltCount = (altCount + 1) % 3;\n\t}\n\tconst modArmed = $derived(ctrlCount > 0 || altCount > 0);\n\t/** Steer is offered as its own control whenever there is a turn to steer into. */\n\t/** A turn is running and the composer is not busy with an edit, so a steer has somewhere to go. */\n\tconst steerable = $derived(isBusy && !editing);\n\tconst canSteer = $derived(steerable && hasDraft && !modArmed);\n\n\n\t/** One line, and it never doubles: the most important thing right now. */\n\tconst statusSay = $derived.by(() => {\n\t\tif (modArmed) {\n\t\t\tconst mods = [\n\t\t\t\tctrlCount > 0 ? `ctrl${ctrlCount > 1 ? ` ×${ctrlCount}` : ''}` : '',\n\t\t\t\taltCount > 0 ? `alt${altCount > 1 ? ` ×${altCount}` : ''}` : ''\n\t\t\t].filter(Boolean);\n\t\t\treturn `${mods.join(' + ')} armed`;\n\t\t}\n\t\tconst state = currentSession?.state ?? 'idle';\n\t\tconst label = sessionStateVisual(state).label.toLowerCase();\n\t\tif (state === 'permission') return label;\n\t\tif (state === 'waiting') return paneChoice?.question ?? label;\n\t\tconst parts: string[] = [];\n\t\tif (state === 'busy') parts.push(currentSession?.current_action || label);\n\t\telse parts.push(statusText || label);\n\t\tif (queueCount > 0) parts.push(`${queueCount} queued`);\n\t\treturn parts.filter(Boolean).join(' · ');\n\t});\n\tconst statusWants = $derived(modArmed || wantsKeypress);\n\n\t// Inline slash popup: when the word under the caret starts with \"/\" (anywhere\n\t// in the input), open the same command list as the Cmds button above the\n\t// input, filtered by the rest of that word. Picking an entry replaces just\n\t// that word; the rest of the input is left alone.\n\tlet slashList = $state<CommandList | null>(null);\n\tlet slashDismissedFor = $state<string | null>(null);\n\tlet caretPos = $state(0);\n\tfunction syncCaret() {\n\t\tif (textareaElement) caretPos = textareaElement.selectionStart ?? textInput.length;\n\t}\n\tconst slashToken = $derived.by(() => {\n\t\tconst text = textInput;\n\t\tconst pos = Math.min(caretPos, text.length);\n\t\tlet start = pos;\n\t\twhile (start > 0 && !/\\s/.test(text[start - 1])) start--;\n\t\tif (text[start] !== '/') return null;\n\t\tlet end = pos;\n\t\twhile (end < text.length && !/\\s/.test(text[end])) end++;\n\t\treturn { start, end, text: text.slice(start, end) };\n\t});\n\tconst slashKey = $derived(slashToken ? `${slashToken.start}:${slashToken.text}` : null);\n\tconst slashOpen = $derived(!modArmed && slashKey != null && slashKey !== slashDismissedFor);\n\tconst slashQuery = $derived(slashOpen && slashToken ? slashToken.text.slice(1) : '');\n\tfunction chooseSlash(insert: string) {\n\t\tconst tok = slashToken;\n\t\tif (!tok) return;\n\t\tconst before = textInput.slice(0, tok.start);\n\t\tconst after = textInput.slice(tok.end);\n\t\t// Trailing space closes the popup and matches Claude Code's own completion.\n\t\tconst sep = after.startsWith(' ') ? '' : ' ';\n\t\ttextInput = before + insert + sep + after;\n\t\tconst pos = before.length + insert.length + 1;\n\t\tslashDismissedFor = null;\n\t\tcaretPos = pos;\n\t\tvoid tick().then(() => {\n\t\t\tif (textareaElement) {\n\t\t\t\ttextareaElement.focus();\n\t\t\t\ttextareaElement.setSelectionRange(pos, pos);\n\t\t\t}\n\t\t\tautoResize();\n\t\t});\n\t}\n\tfunction dismissSlash() {\n\t\tslashDismissedFor = slashKey;\n\t}\n\n\tasync function runText(text: string) {\n\t\tif (target) await post(api(target), 'send', { text });\n\t}\n\n\tfunction chordStep(delta: number) {\n\t\tconst n = chordItems.length;\n\t\tif (n === 0) return;\n\t\tchordIndex = (chordIndex + delta + n) % n;\n\t\tchordStickArmed = true;\n\t}\n\n\tfunction openChord(items: ChordAction[], title: string, innerCount = 0) {\n\t\tchordItems = items;\n\t\tchordInnerCount = innerCount;\n\t\tchordIndex = 0;\n\t\tchordTitle = title;\n\t\tchordStickArmed = false;\n\t\tchordStickX = 0;\n\t\tchordStickY = 0;\n\t\tchordMenuOpen = true;\n\t}\n\tfunction closeChord() {\n\t\tchordMenuOpen = false;\n\t\tchordStickArmed = false;\n\t\tchordStickX = 0;\n\t\tchordStickY = 0;\n\t}\n\tfunction releaseChord() {\n\t\tif (chordStickArmed) chordItems[chordIndex]?.run();\n\t\tcloseChord();\n\t}\n\n\t$effect(() => {\n\t\tif (!browser) return;\n\t\tconst handler = (e: WheelEvent) => {\n\t\t\tif (!outputElement) return;\n\t\t\tconst t = e.target as Element | null;\n\t\t\tif (!t) return;\n\t\t\tif (outputElement.contains(t)) return;\n\t\t\t// Only hijack wheel from non-scrollable regions; leave native scroll alone.\n\t\t\tlet el: Element | null = t;\n\t\t\twhile (el && el !== document.body) {\n\t\t\t\tconst style = getComputedStyle(el);\n\t\t\t\tconst overflowY = style.overflowY;\n\t\t\t\tif ((overflowY === 'auto' || overflowY === 'scroll') && el.scrollHeight > el.clientHeight) return;\n\t\t\t\tel = el.parentElement;\n\t\t\t}\n\t\t\toutputElement.scrollTop += e.deltaY;\n\t\t};\n\t\twindow.addEventListener('wheel', handler, { passive: true });\n\t\treturn () => window.removeEventListener('wheel', handler);\n\t});\n\n\tuseGamepad({\n\t\tenabled: () => target != null,\n\t\taxes: () => (axes) => {\n\t\t\tconst lx = axes[0] ?? 0;\n\t\t\tconst ly = axes[1] ?? 0;\n\t\t\tif (chordMenuOpen) {\n\t\t\t\tchordStickX = lx;\n\t\t\t\tchordStickY = ly;\n\t\t\t\tconst mag = Math.hypot(lx, ly);\n\t\t\t\tif (mag < CHORD_STICK_DEADZONE || chordItems.length === 0) {\n\t\t\t\t\tchordStickArmed = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tchordStickArmed = true;\n\t\t\t\tconst rings = chordRings;\n\t\t\t\tconst ringIdx = rings.length > 1 && mag >= CHORD_RING_THRESHOLD ? 1 : 0;\n\t\t\t\tconst ring = rings[ringIdx];\n\t\t\t\tconst stickAngle = Math.atan2(ly, lx);\n\t\t\t\tconst norm = (stickAngle + Math.PI / 2 + Math.PI * 2) % (Math.PI * 2);\n\t\t\t\tconst localIdx = Math.round((norm / (Math.PI * 2)) * ring.length) % ring.length;\n\t\t\t\tlet offset = 0;\n\t\t\t\tfor (let i = 0; i < ringIdx; i++) offset += rings[i].length;\n\t\t\t\tchordIndex = offset + localIdx;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (Math.abs(ly) < STICK_DEADZONE) return;\n\t\t\tif (outputElement) outputElement.scrollTop += ly * 24;\n\t\t},\n\t\tbuttons: () => ({\n\t\t\tA: () => {\n\t\t\t\tif (chordMenuOpen) {\n\t\t\t\t\tchordItems[chordIndex]?.run();\n\t\t\t\t\tcloseChord();\n\t\t\t\t} else {\n\t\t\t\t\tvoid sendText();\n\t\t\t\t}\n\t\t\t},\n\t\t\tB: async () => {\n\t\t\t\tif (chordMenuOpen) return closeChord();\n\t\t\t\tif (voiceStore.isOwnedBy(ref)) {\n\t\t\t\t\tawait voiceStore.cancel();\n\t\t\t\t} else {\n\t\t\t\t\tvoid sendKeys('Escape');\n\t\t\t\t}\n\t\t\t},\n\t\t\tX: async () => {\n\t\t\t\tif (chordMenuOpen) return;\n\t\t\t\tawait toggleVoice();\n\t\t\t},\n\t\t\tY: () => {\n\t\t\t\tif (chordMenuOpen) return;\n\t\t\t\tcommandsOpen = !commandsOpen;\n\t\t\t},\n\t\t\tL1: () => history.back(),\n\t\t\tR1: () => history.forward(),\n\t\t\tL2: {\n\t\t\t\tpress: () => openChord([...ctrlActions, ...slashActions], 'Commands', ctrlActions.length),\n\t\t\t\trelease: releaseChord\n\t\t\t},\n\t\t\tR2: {\n\t\t\t\tpress: () =>\n\t\t\t\t\topenChord([...headerActions, ...rcActions, ...sidebarActionsStore.actions], 'Actions'),\n\t\t\t\trelease: releaseChord\n\t\t\t},\n\t\t\tDpadUp: () => {\n\t\t\t\tif (!chordMenuOpen) void sendKeys('Up');\n\t\t\t},\n\t\t\tDpadDown: () => {\n\t\t\t\tif (!chordMenuOpen) void sendKeys('Down');\n\t\t\t},\n\t\t\tDpadLeft: () => {\n\t\t\t\tif (chordMenuOpen) chordStep(-1);\n\t\t\t\telse void sendKeys('Left');\n\t\t\t},\n\t\t\tDpadRight: () => {\n\t\t\t\tif (chordMenuOpen) chordStep(1);\n\t\t\t\telse void sendKeys('Right');\n\t\t\t}\n\t\t})\n\t});\n\n\tasync function sendModSequence() {\n\t\tconst text = textInput;\n\t\tconst count = Math.max(ctrlCount, altCount);\n\t\tconst prefix = `${ctrlCount > 0 ? 'C-' : ''}${altCount > 0 ? 'M-' : ''}`;\n\t\tctrlCount = 0;\n\t\taltCount = 0;\n\t\tif (!text || !prefix) return;\n\t\tconst tokens: string[] = [];\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tfor (const c of text) {\n\t\t\t\ttokens.push(c === ' ' ? `${prefix}Space` : `${prefix}${c}`);\n\t\t\t}\n\t\t}\n\t\ttextInput = '';\n\t\tif (textareaElement) textareaElement.style.height = 'auto';\n\t\tawait sendKeys(tokens.join(' '));\n\t}\n\n\tasync function handleKeydown(e: KeyboardEvent) {\n\t\tif (!e.repeat && isVoiceHotkey(e)) {\n\t\t\te.preventDefault();\n\t\t\tctrlTapCandidate = false;\n\t\t\taltTapCandidate = false;\n\t\t\tawait toggleVoice();\n\t\t\treturn;\n\t\t}\n\t\tif (e.key === 'Control') {\n\t\t\tif (!e.repeat) ctrlTapCandidate = true;\n\t\t\treturn;\n\t\t}\n\t\tif (e.key === 'Alt') {\n\t\t\t// preventDefault suppresses browser menu-bar focus on Alt tap\n\t\t\te.preventDefault();\n\t\t\tif (!e.repeat) altTapCandidate = true;\n\t\t\treturn;\n\t\t}\n\t\tctrlTapCandidate = false;\n\t\taltTapCandidate = false;\n\n\t\tif (slashOpen) {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\te.preventDefault();\n\t\t\t\tdismissSlash();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (slashList?.handleKeydown(e)) return;\n\t\t}\n\n\t\tif (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\tif (editing) {\n\t\t\t\tcancelEdit();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (voiceStore.isOwnedBy(ref)) {\n\t\t\t\tawait voiceStore.cancel();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (modArmed) {\n\t\t\t\tctrlCount = 0;\n\t\t\t\taltCount = 0;\n\t\t\t} else {\n\t\t\t\tsendKeys('Escape');\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (e.key === 'Backspace' && textInput === '' && !modArmed) {\n\t\t\te.preventDefault();\n\t\t\tsendKeys('BSpace');\n\t\t\treturn;\n\t\t}\n\t\tif (ARROW_KEYS[e.key] && textInput === '' && !modArmed) {\n\t\t\te.preventDefault();\n\t\t\tsendKeys(ARROW_KEYS[e.key]);\n\t\t\treturn;\n\t\t}\n\t\tif (e.key === 'Tab' && textInput === '' && !modArmed && !e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey) {\n\t\t\te.preventDefault();\n\t\t\tsendKeys('Tab');\n\t\t\treturn;\n\t\t}\n\t\t// Shift+Enter alone is a new line; with Ctrl/⌘ it is the stronger steer.\n\t\tconst mod = e.ctrlKey || e.metaKey;\n\t\tif (e.key === 'Enter' && (!e.shiftKey || mod)) {\n\t\t\te.preventDefault();\n\t\t\t// A take has no draft yet, but its words are about to be one.\n\t\t\tconst steering = mod && (canSteer || (speaking && steerable));\n\t\t\tconst run = steering ? (e.shiftKey ? nowText : steerText) : sendText;\n\t\t\tif (await finishVoice(run)) return;\n\t\t\tif (modArmed) sendModSequence();\n\t\t\telse run();\n\t\t}\n\t}\n\n\t// Mobile soft keyboards (iOS especially) don't fire reliable repeated\n\t// keydown events for Backspace during long-press — they fire `beforeinput`\n\t// with inputType=\"deleteContentBackward\" each time, including at the\n\t// keyboard's accelerated repeat rate. Mirror handleKeydown's empty-input\n\t// Backspace forwarding here so long-press-to-delete works on mobile.\n\tfunction handleBeforeInput(e: InputEvent) {\n\t\tif (e.inputType === 'deleteContentBackward' && textInput === '' && !modArmed) {\n\t\t\te.preventDefault();\n\t\t\tvoid sendKeys('BSpace');\n\t\t}\n\t}\n\n\tfunction handleKeyup(e: KeyboardEvent) {\n\t\tif (e.key === 'Control' && ctrlTapCandidate) {\n\t\t\tctrlTapCandidate = false;\n\t\t\tcycleCtrl();\n\t\t}\n\t\tif (e.key === 'Alt' && altTapCandidate) {\n\t\t\taltTapCandidate = false;\n\t\t\tcycleAlt();\n\t\t}\n\t}\n\n\tfunction handleBlur() {\n\t\t// A modifier held across focus changes would miss its keyup and misfire later\n\t\tctrlTapCandidate = false;\n\t\taltTapCandidate = false;\n\t}\n\n\t/** One line of the composer's own type, and the ceiling its CSS allows. */\n\tconst FIELD_MIN = 24;\n\tconst FIELD_MAX = 112;\n\n\tfunction autoResize() {\n\t\tif (!textareaElement) return;\n\t\t// Reset to single row to measure actual content height\n\t\ttextareaElement.style.height = '0';\n\t\tconst newHeight = Math.max(FIELD_MIN, Math.min(textareaElement.scrollHeight, FIELD_MAX));\n\t\ttextareaElement.style.height = newHeight + 'px';\n\t}\n\n\tasync function killSession() {\n\t\tif (currentSession) {\n\t\t\tawait fetch(`${api(currentSession.id)}/kill`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({ pid: currentSession.pid, tmux_target: currentSession.tmux_target })\n\t\t\t});\n\t\t} else if (target) {\n\t\t\t// No session record (stale URL) — still attempt to kill the tmux pane by target\n\t\t\tawait fetch(`${api(target)}/kill`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({ pid: 0, tmux_target: target })\n\t\t\t});\n\t\t}\n\t\tshowConfirmKill = false;\n\t\tgoto('/');\n\t}\n\n\t/**\n\t * Quits Claude Code and reopens this conversation in the same pane — the\n\t * way to pick up an update or re-read skills without losing the session.\n\t */\n\tasync function restartSession(upgrade = false): Promise<{ startedAt?: number } | null> {\n\t\tif (!currentSession) return null;\n\t\tconst res = await fetch(`${api(currentSession.id)}/restart`, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tbody: JSON.stringify({ upgrade })\n\t\t});\n\t\tif (!res.ok) {\n\t\t\tconst body = (await res.json().catch(() => ({}))) as { error?: string };\n\t\t\talert(`Could not ${upgrade ? 'upgrade' : 'restart'} Claude Code: ${body.error ?? res.statusText}`);\n\t\t\treturn null;\n\t\t}\n\t\treturn (await res.json().catch(() => ({}))) as { startedAt?: number };\n\t}\n\n\t/**\n\t * Restart with Claude Code's own `/restart`, which a notice naming it says\n\t * the running version has: it replaces the process in place with\n\t * `--resume` of the same session, so the pane, the pid and the transcript\n\t * all stay. The text and its Enter go in as two sends with no read-back,\n\t * which would catch the box mid-restart and report the command as stuck.\n\t */\n\tasync function slashRestart() {\n\t\tif (!target) return;\n\t\tif (currentSession?.draft_input && currentSession.draft_kind !== 'suggestion') {\n\t\t\talert('Something is typed in the pane\\'s prompt box: send or clear it first.');\n\t\t\treturn;\n\t\t}\n\t\tawait sendPaneText('/restart');\n\t\tawait sendKeys('Enter');\n\t}\n\n\t/** The update notice says the running Claude Code restarts itself with `/restart`. */\n\tconst hasSlashRestart = $derived(paneUpdate?.kind === 'installed' && paneUpdate.text.includes('/restart'));\n\n\t/**\n\t * The session an upgrade was started in from here, until the server's own\n\t * word on it arrives. The server answers once the command is typed and\n\t * restarts when it has run; while it waits, and when it gives up without\n\t * restarting, the session's `upgrade` says so.\n\t */\n\tlet upgrading = $state<{ id: string; startedAt: number; clickedAt: number } | null>(null);\n\tconst upgrade = $derived(currentSession?.upgrade ?? null);\n\tconst UPGRADE_WAIT_MS = 6 * 60_000;\n\tasync function upgradeSession() {\n\t\tif (!currentSession) return;\n\t\tconst id = currentSession.id;\n\t\tconst started = await restartSession(true);\n\t\tif (started) upgrading = { id, startedAt: started.startedAt ?? 0, clickedAt: Date.now() };\n\t}\n\t$effect(() => {\n\t\tif (!upgrading || upgrading.id !== currentSession?.id) return;\n\t\t// The server's status for this run carries the `at` it answered with,\n\t\t// so an ended run is told from a running one without the page having\n\t\t// caught it running, and both clocks stay the server's.\n\t\tconst ours = upgrade && upgrade.at >= upgrading.startedAt ? upgrade : null;\n\t\tif (ours?.state === 'running') {\n\t\t\t// Still going: wait, but no longer than the server itself would.\n\t\t} else if (ours) {\n\t\t\tupgrading = null;\n\t\t\ttoast.error(ours.message ?? 'The upgrade did not restart Claude Code', {\n\t\t\t\tdescription: ours.output ?? undefined,\n\t\t\t\tduration: 30_000\n\t\t\t});\n\t\t\treturn;\n\t\t} else if (!paneUpdate?.command) {\n\t\t\t// No status and no notice: it restarted into the new version.\n\t\t\tupgrading = null;\n\t\t\treturn;\n\t\t}\n\t\tconst left = upgrading.clickedAt + UPGRADE_WAIT_MS - Date.now();\n\t\tconst giveUp = setTimeout(() => (upgrading = null), Math.max(0, left));\n\t\treturn () => clearTimeout(giveUp);\n\t});\n\n\tfunction copySelection() {\n\t\tconst text = selectedText;\n\t\tif (!text) return;\n\t\t// Use textarea + execCommand as primary method (works on iOS/Brave without HTTPS)\n\t\tconst textarea = document.createElement('textarea');\n\t\ttextarea.value = text;\n\t\ttextarea.setAttribute('readonly', '');\n\t\ttextarea.style.position = 'fixed';\n\t\ttextarea.style.left = '-9999px';\n\t\ttextarea.style.opacity = '0';\n\t\tdocument.body.appendChild(textarea);\n\t\ttextarea.select();\n\t\ttextarea.setSelectionRange(0, text.length); // iOS needs this\n\t\tdocument.execCommand('copy');\n\t\tdocument.body.removeChild(textarea);\n\t\tshowSelectionCopied = true;\n\t\tsetTimeout(() => { showSelectionCopied = false; }, 2000);\n\t}\n\n\tlet renameId = $state<string | null>(null);\n\n\tfunction copyTmuxCmd() {\n\t\tif (!target) return;\n\t\tconst cmd = `tmux attach -t \"${target.split(':')[0]}\"`;\n\t\tif (navigator.clipboard?.writeText) {\n\t\t\tnavigator.clipboard.writeText(cmd);\n\t\t} else {\n\t\t\t// Fallback for non-secure contexts (HTTP)\n\t\t\tconst textarea = document.createElement('textarea');\n\t\t\ttextarea.value = cmd;\n\t\t\ttextarea.style.position = 'fixed';\n\t\t\ttextarea.style.opacity = '0';\n\t\t\tdocument.body.appendChild(textarea);\n\t\t\ttextarea.select();\n\t\t\tdocument.execCommand('copy');\n\t\t\tdocument.body.removeChild(textarea);\n\t\t}\n\t\tshowCopied = true;\n\t\tsetTimeout(() => { showCopied = false; }, 2000);\n\t}\n\n\t</script>\n\n<svelte:window\n\tonkeydown={(e) => {\n\t\tsyncHeldDelivery(e);\n\t\thandleGlobalKeys(e);\n\t}}\n\tonkeyup={syncHeldDelivery}\n\tonblur={() => (heldDelivery = null)}\n/>\n\n<svelte:head>\n\t<title>{pageTitle}</title>\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\" />\n\t<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" />\n\t<link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin=\"anonymous\" />\n\t<link href=\"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap\" rel=\"stylesheet\" />\n</svelte:head>\n\n{#if chordMenuOpen}\n\t<div class=\"chord-overlay\">\n\t\t<div class=\"chord-panel\">\n\t\t\t<div class=\"chord-title\">{chordTitle}</div>\n\t\t\t<div class=\"chord-stage\">\n\t\t\t\t<div class=\"chord-ring\">\n\t\t\t\t\t{#each chordItems as item, i (item.label)}\n\t\t\t\t\t\t{@const pos = chordPositions[i] ?? { x: 0, y: 0 }}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"chord-item\"\n\t\t\t\t\t\t\tclass:armed={chordStickArmed && chordIndex === i}\n\t\t\t\t\t\t\tclass:danger={item.danger}\n\t\t\t\t\t\t\tstyle:--x=\"{pos.x}px\"\n\t\t\t\t\t\t\tstyle:--y=\"{pos.y}px\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<iconify-icon icon={item.icon}></iconify-icon>\n\t\t\t\t\t\t\t<span>{item.label}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t{/each}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"chord-deadzone\" class:inactive={!chordStickArmed}>\n\t\t\t\t\t<span>Cancel</span>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tclass=\"chord-cursor\"\n\t\t\t\t\tclass:armed={chordStickArmed}\n\t\t\t\t\tstyle:--cx=\"{chordStickX * CHORD_CURSOR_RADIUS_PX}px\"\n\t\t\t\t\tstyle:--cy=\"{chordStickY * CHORD_CURSOR_RADIUS_PX}px\"\n\t\t\t\t></div>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tclass=\"chord-status\"\n\t\t\t\tclass:danger={chordStickArmed && chordItems[chordIndex]?.danger}\n\t\t\t>\n\t\t\t\t{chordStickArmed ? chordItems[chordIndex]?.label ?? '' : 'Release to cancel'}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n{/if}\n\n<RenameSessionDialog\n\tsessionId={renameId}\n\tonClose={() => (renameId = null)}\n\tsessions={remoteHost ? (route.machine?.sessions ?? []) : undefined}\n\t{base}\n/>\n\n{#snippet attachMenu()}\n<Popover.Content side=\"top\" class=\"w-auto p-2 bg-[#1a1a1a] border-[#333]\">\n\t\t\t\t<div class=\"popover-grid\">\n\t{#if isTouchDevice}\n\t\t<Button variant=\"secondary\" size=\"toolbar\" class=\"min-w-14 min-h-12\" onclick={() => openPicker('camera')}>\n\t\t\t<iconify-icon icon=\"mdi:camera\"></iconify-icon>\n\t\t\t<span>Camera</span>\n\t\t</Button>\n\t{/if}\n\t<Button variant=\"secondary\" size=\"toolbar\" class=\"min-w-14 min-h-12\" onclick={() => openPicker('gallery')}>\n\t\t<iconify-icon icon=\"mdi:image-multiple\"></iconify-icon>\n\t\t<span>{isTouchDevice ? 'Gallery' : 'Image'}</span>\n\t</Button>\n\t<Button variant=\"secondary\" size=\"toolbar\" class=\"min-w-14 min-h-12\" onclick={() => openPicker('files')}>\n\t\t<iconify-icon icon=\"mdi:file-document-outline\"></iconify-icon>\n\t\t<span>Files</span>\n\t</Button>\n\t\t\t\t</div>\n\t\t\t</Popover.Content>\n{/snippet}\n\n{#snippet statusLine()}\n\t<div class=\"sl\">\n\t\t<SessionSheet\n\t\t\topen={sheetOpen}\n\t\t\tcurrentTarget={target}\n\t\t\tactions={sheetActions}\n\t\t\tonKill={() => (showConfirmKill = true)}\n\t\t\tonClose={() => (sheetOpen = false)}\n\t\t/>\n\t\t<SessionStateIndicator state={indicatorState} size=\"sm\" />\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"nm\"\n\t\t\tonclick={() => (sheetOpen = !sheetOpen)}\n\t\t\ttitle=\"Sessions, rename, and pane actions\"\n\t\t>\n\t\t\t<b>{currentSession ? getSessionDisplayName(currentSession) : target}</b>\n\t\t\t<iconify-icon icon=\"mdi:chevron-down\"></iconify-icon>\n\t\t</button>\n\t\t{#if embed && remoteHost}\n\t\t\t<!-- A pane may show another machine's session; its composer says which. -->\n\t\t\t<span class=\"mach\" title=\"Session runs on {remoteHost}\">{remoteHost}</span>\n\t\t{/if}\n\t\t{#if machineBlocked}\n\t\t\t<span class=\"sep\">·</span>\n\t\t\t<a class=\"say\" href=\"/machines\" title={machineBlocked}>\n\t\t\t\t<iconify-icon icon={route.machine?.online ? 'mdi:update' : 'mdi:lan-disconnect'}></iconify-icon>\n\t\t\t\t{machineBlocked}\n\t\t\t</a>\n\t\t{/if}\n\t\t{#if embed && paneFocused}\n\t\t\t<span class=\"foc\" title=\"The sidebar opens sessions here; ⌘/Ctrl 1 and 2 move the focus\">focus</span>\n\t\t{/if}\n\t\t{#if statusSay}\n\t\t\t<span class=\"sep\">·</span>\n\t\t\t<span class=\"say\" class:amber={statusWants}>{statusSay}</span>\n\t\t{/if}\n\t\t<!-- The model, as the terminal's own status line names it. It is read\n\t\t off the latest reply, so a /model change shows on the next one. -->\n\t\t{#if viewMode === 'transcript' && modelName}\n\t\t\t<span class=\"sep\">·</span>\n\t\t\t<span class=\"say model\" title=\"Model on the latest reply\">{modelName}</span>\n\t\t{/if}\n\t\t<!-- Claude Code announces its own updates only in the terminal's footer,\n\t\t so the transcript view says it here instead. -->\n\t\t{#if viewMode === 'transcript' && paneUpdate}\n\t\t\t<span class=\"sep\">·</span>\n\t\t\t{#if paneUpdate.kind === 'installed' && isAlive && isClaudeSession}\n\t\t\t\t<!-- The update is on disk; restarting is all it needs. Straight away\n\t\t\t\t when idle, behind the usual question when a turn would be cut off. -->\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"say upd installed\"\n\t\t\t\t\ttitle=\"{paneUpdate.text} — click to restart Claude Code now\"\n\t\t\t\t\tonclick={() =>\n\t\t\t\t\t\tisBusy\n\t\t\t\t\t\t\t? (showConfirmRestart = true)\n\t\t\t\t\t\t\t: void (hasSlashRestart ? slashRestart() : restartSession())}\n\t\t\t\t>\n\t\t\t\t\t<iconify-icon icon=\"mdi:restart\"></iconify-icon>\n\t\t\t\t\t{UPDATE_LABEL.installed}\n\t\t\t\t</button>\n\t\t\t{:else if paneUpdate.command && isAlive && isClaudeSession}\n\t\t\t\t<!-- The notice names its own fix. It is typed into Claude Code as a\n\t\t\t\t shell line, which only a session waiting for input will run. -->\n\t\t\t\t{@const running = upgrade?.state === 'running' || upgrading?.id === currentSession?.id}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"say upd installed\"\n\t\t\t\t\tdisabled={running || !isIdle}\n\t\t\t\t\ttitle={isIdle\n\t\t\t\t\t\t? `Run \"${paneUpdate.command}\" in this session, then restart Claude Code`\n\t\t\t\t\t\t: `${paneUpdate.text} — available once Claude Code is waiting for you`}\n\t\t\t\t\tonclick={() => void upgradeSession()}\n\t\t\t\t>\n\t\t\t\t\t<iconify-icon icon={running ? 'mdi:loading' : 'mdi:update'} class:spin={running}></iconify-icon>\n\t\t\t\t\t{running ? 'Upgrading…' : 'Update available · upgrade and restart'}\n\t\t\t\t</button>\n\t\t\t\t{#if upgrade && upgrade.state !== 'running'}\n\t\t\t\t\t<!-- Why the last upgrade left the session running the old version. -->\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"say upd failed\"\n\t\t\t\t\t\ttitle={[upgrade.message, upgrade.output].filter(Boolean).join('\\n\\n')}\n\t\t\t\t\t>\n\t\t\t\t\t\t<iconify-icon icon=\"mdi:alert-circle-outline\"></iconify-icon>\n\t\t\t\t\t\t{upgrade.state === 'unchanged'\n\t\t\t\t\t\t\t? 'upgrade did nothing'\n\t\t\t\t\t\t\t: upgrade.state === 'timeout'\n\t\t\t\t\t\t\t\t? 'upgrade timed out'\n\t\t\t\t\t\t\t\t: 'upgrade failed'}\n\t\t\t\t\t</span>\n\t\t\t\t{/if}\n\t\t\t{:else}\n\t\t\t\t<span class=\"say upd {paneUpdate.kind}\" title={paneUpdate.text}>\n\t\t\t\t\t<iconify-icon icon=\"mdi:update\"></iconify-icon>\n\t\t\t\t\t{UPDATE_LABEL[paneUpdate.kind]}\n\t\t\t\t</span>\n\t\t\t{/if}\n\t\t{/if}\n\t\t<span class=\"sl-sp\"></span>\n\t\t<!-- The old header's rare actions, back where they were, once there is\n\t\t room across for them. On a phone they stay in the sheet. -->\n\t\t{#each sheetActions as action (action.label)}\n\t\t\t<span class=\"wide-only\">\n\t\t\t\t<Hint icon={action.icon} label={action.label} class=\"mini\" onclick={action.run} />\n\t\t\t</span>\n\t\t{/each}\n\t\t{#if isAlive && isClaudeSession}\n\t\t\t<RemoteControlMenu url={currentSession?.rc_url ?? null} pending={rcPending} actions={rcActions} />\n\t\t{/if}\n\t\t{#if isClaudeSession}\n\t\t\t<PanelToggle open={panelKind !== null} session={currentSession!} onToggle={() => void togglePanel()} />\n\t\t{/if}\n\t\t{#if !embed}\n\t\t\t<Hint\n\t\t\t\ticon=\"mdi:menu\"\n\t\t\t\tlabel=\"Sessions and panels\"\n\t\t\t\tkeys={MOD_LABEL + ' B'}\n\t\t\t\tclass=\"mini menu-only\"\n\t\t\t\tonclick={() => drawer.toggle()}\n\t\t\t/>\n\t\t{/if}\n\t\t{#if isAlive && canTranscript}\n\t\t\t<Hint\n\t\t\t\ticon={viewMode === 'transcript' ? 'mdi:console' : 'mdi:message-text-outline'}\n\t\t\t\tlabel={viewMode === 'transcript' ? 'Terminal view' : 'Transcript view'}\n\t\t\t\tkeys={MOD_LABEL + ' E'}\n\t\t\t\tclass=\"mini\"\n\t\t\t\tonclick={() => toggleView()}\n\t\t\t/>\n\t\t{/if}\n\t\t{#if embed}\n\t\t\t<!-- The pane's own controls, asked of the page outside. Kept as one\n\t\t\t group so that when the row wraps they land together, right-aligned. -->\n\t\t\t<span class=\"pane-ctl\">\n\t\t\t\t<Hint icon=\"mdi:swap-horizontal\" label=\"Swap panes\" class=\"mini\" onclick={() => tellPane('swap')} />\n\t\t\t\t<Hint icon=\"mdi:arrow-expand\" label=\"Only this pane\" class=\"mini\" onclick={() => tellPane('zoom')} />\n\t\t\t\t<Hint icon=\"mdi:close\" label=\"Close this pane\" class=\"mini pane-close\" onclick={() => tellPane('close')} />\n\t\t\t</span>\n\t\t{/if}\n\t</div>\n{/snippet}\n\n{#snippet composerField()}\n\t\t\t<textarea\n\t\t\tbind:this={textareaElement}\n\t\t\tbind:value={textInput}\n\t\t\t{@attach keepsCaret}\n\t\t\tplaceholder={modArmed ? 'Type keys, Enter to send as mod sequence…' : 'Type a message...'}\n\t\t\trows={1}\n\t\t\tonkeydown={handleKeydown}\n\t\t\tonkeyup={(e) => { handleKeyup(e); syncCaret(); }}\n\t\t\tonbeforeinput={handleBeforeInput}\n\t\t\tonblur={handleBlur}\n\t\t\toninput={() => { syncCaret(); autoResize(); }}\n\t\t\tonclick={syncCaret}\n\t\t\tonfocus={syncCaret}\n\t\t\tonselect={syncCaret}\n\t\t\tonpaste={handlePaste}\n\t\t></textarea>\n{/snippet}\n\n<Tooltip.Provider delayDuration={250}>\n<div\n\tclass=\"session-row\"\n\tclass:panel-max={panelMaximized}\n\tbind:this={sessionRow}\n\tstyle:--panel-w={panelWidthCss}\n\tstyle:--panel-min=\"{PANEL_MIN_PX}px\"\n\tstyle:--session-min=\"{SESSION_MIN_PX}px\"\n\tstyle:--divider-w=\"{DIVIDER_PX}px\"\n>\n<div class=\"session-container\">\n\n\t<div class=\"output-wrap\">\n\t\t\t<div\n\t\t\t\tclass=\"output\"\n\t\t\t\tbind:this={outputElement}\n\t\t\t\tonscroll={handleScroll}\n\t\t\t\tuse:swipe={{\n\t\t\t\t\tenabled: () => isTouchDevice,\n\t\t\t\t\tthreshold: 64,\n\t\t\t\t\tonRight: () => drawer.toggle(),\n\t\t\t\t\tonLeft: () => { if (canTranscript) toggleView(); }\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t\t<input\n\t\t\tbind:this={cameraInput}\n\t\t\ttype=\"file\"\n\t\t\taccept=\"image/*\"\n\t\t\tcapture=\"environment\"\n\t\t\tmultiple\n\t\t\tclass=\"attach-input-hidden\"\n\t\t\tonchange={handlePickerInput}\n\t\t/>\n\t\t<input\n\t\t\tbind:this={galleryInput}\n\t\t\ttype=\"file\"\n\t\t\taccept=\"image/*,video/*\"\n\t\t\tmultiple\n\t\t\tclass=\"attach-input-hidden\"\n\t\t\tonchange={handlePickerInput}\n\t\t/>\n\t\t<input\n\t\t\tbind:this={filesInput}\n\t\t\ttype=\"file\"\n\t\t\tmultiple\n\t\t\tclass=\"attach-input-hidden\"\n\t\t\tonchange={handlePickerInput}\n\t\t/>\n\t\t{#if viewMode === 'transcript'}\n\t\t\t\t<!-- Keyed by session: what a card saw of one pane's dialog says nothing about the next. -->\n\t\t\t\t{#key ref}\n\t\t\t\t\t<TranscriptView\n\t\t\t\t\t\tentries={transcriptStore.entries}\n\t\t\t\t\t\tonLoadSubagent={(id) => transcriptStore.loadSubagent(id)}\n\t\t\t\t\t\t{fileLink}\n\t\t\t\t\t\tonQuote={quoteInComposer}\n\t\t\t\t\t\trepoSession={currentSession?.git_root ? currentSession.id : null}\n\t\t\t\t\t\tonOpenGithub={openGithub}\n\t\t\t\t\t\tagentLink={(id) => sessionPath({ host: remoteHost, target: target ?? '' }, `/agent/${encodeURIComponent(id)}`)}\n\t\t\t\t\t\tturnChanges={sessionChanges}\n\t\t\t\t\t\t{changesLink}\n\t\t\t\t\t\tavailable={transcriptStore.available}\n\t\t\t\t\t\tloaded={transcriptStore.receivedData}\n\t\t\t\t\t\tsessionState={currentSession?.state ?? null}\n\t\t\t\t\t\tcurrentAction={currentSession?.current_action ?? null}\n\t\t\t\t\t\tactivity={currentSession?.pane_activity ?? null}\n\t\t\t\t\t\tdelivered={currentSession?.delivered ?? []}\n\t\t\t\t\t\t{suggestion}\n\t\t\t\t\t\tonAcceptSuggestion={() => void acceptSuggestion()}\n\t\t\t\t\t\t{paneChoice}\n\t\t\t\t\t\tpaneLogin={currentSession?.pane_login ?? null}\n\t\t\t\t\t\tpaneRewind={currentSession?.pane_rewind ?? null}\n\t\t\t\t\t\tonRewind={rewind}\n\t\t\t\t\t\tsubagents={transcriptStore.subagentsByTask}\n\t\t\t\t\t\tonSendKeys={sendKeys}\n\t\t\t\t\t\tonSendPaneText={sendPaneText}\n\t\t\t\t\t\tdictateTarget={voiceEnabled ? ref : null}\n\t\t\t\t\t\t{base}\n\t\t\t\t\t\tolderCount={transcriptStore.firstIndex}\n\t\t\t\t\t\tloadingEarlier={transcriptStore.loadingEarlier}\n\t\t\t\t\t\tonLoadEarlier={() => holdPlaceThrough(transcriptStore.loadEarlier())}\n\t\t\t\t\t\tonSendReply={sendReply}\n\t\t\t\t\t/>\n\t\t\t\t{/key}\n\t\t\t\t{:else}\n\t\t\t\t\t<TerminalView\n\t\t\t\t\t\thistory={terminalStore.history}\n\t\t\t\t\t\thistoryStart={terminalStore.historyStart}\n\t\t\t\t\t\tscreen={terminalStore.screen}\n\t\t\t\t\t\tthemed={preferences.terminalTheming}\n\t\t\t\t\t\tfrozen={hasSelection}\n\t\t\t\t\t/>\n\t\t\t\t{/if}\n\t\t\t</div>\n\t\t\t{#if userScrolledUp}\n\t\t\t\t<button class=\"jump-bottom\" onclick={scrollToBottom} title=\"Jump to bottom\">\n\t\t\t\t\t<iconify-icon icon=\"mdi:arrow-down\"></iconify-icon>\n\t\t\t\t\t{#if unseenLines > 0}<span>{unseenLines} new</span>{/if}\n\t\t\t\t</button>\n\t\t\t{/if}\n\t\t</div>\n\n\t\t{#if target}\n\t\t<QueueStrip\n\t\t\t{target}\n\t\t\t{base}\n\t\t\tsessionId={currentSession?.id ?? null}\n\t\t\t{queue}\n\t\t\tpaneQueue={currentSession?.pane_queue ?? []}\n\t\t\tbusy={isBusy}\n\t\t\teditingId={editing?.ref === ref ? editing.id : null}\n\t\t\tpaneDraft={viewMode === 'transcript' && currentSession?.draft_kind === 'typed'\n\t\t\t\t? (currentSession?.draft_input ?? null)\n\t\t\t\t: null}\n\t\t\tcomposerHasText={textInput.trim().length > 0 || readyPaths.length > 0}\n\t\t\tonEdit={startEdit}\n\t\t\tonSendDraft={() => void sendKeys('Enter')}\n\t\t\tonClearDraft={() => void sendKeys(CLEAR_PROMPT_KEYS)}\n\t\t/>\n\t\t{/if}\n\n\t\t\t<div\n\t\t\t\tclass=\"cx\"\n\t\t\t\tclass:focused={embed && paneFocused}\n\t\t\t\tclass:embed\n\t\t\t\tuse:swipe={{\n\t\t\t\t\tenabled: () => isTouchDevice,\n\t\t\t\t\tonUp: () => (trayOpen = true),\n\t\t\t\t\tonDown: () => (trayOpen = false)\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<ContextGauge context={transcriptStore.context}>\n\t\t\t\t\t{#snippet notch()}\n\t\t\t\t\t\t<VoiceMeter target={ref} actions={voiceActions} />\n\t\t\t\t\t{/snippet}\n\t\t\t\t</ContextGauge>\n\n\t\t\t\t<KeyTray\n\t\t\t\t\topen={trayOpen}\n\t\t\t\t\t{ctrlCount}\n\t\t\t\t\t{altCount}\n\t\t\t\t\tonKeys={(keys) => void sendKeys(keys)}\n\t\t\t\t\tonCycleCtrl={cycleCtrl}\n\t\t\t\t\tonCycleAlt={cycleAlt}\n\t\t\t\t\tonPutInPrompt={() => void sendTextRaw()}\n\t\t\t\t\tonAcceptSuggestion={() => void acceptSuggestion()}\n\t\t\t\t\tonClearPrompt={() => void sendKeys(CLEAR_PROMPT_KEYS)}\n\t\t\t\t/>\n\n\t\t\t\t{@render statusLine()}\n\n\t\t\t\t<!-- The field and the footer share the width the rail leaves them. -->\n\t\t\t\t<div class=\"body\">\n\t\t\t\t\t<div class=\"lanes\">\n\n\t\t\t\t\t\t<!-- lane 1 — the middle: the field, or what replaces it -->\n\t\t\t\t\t\t<div class=\"mid\">\n\t\t\t\t\t\t\t{#if slashOpen}\n\t\t\t\t\t\t\t\t<div class=\"slash-popup\">\n\t\t\t\t\t\t\t\t\t<CommandList\n\t\t\t\t\t\t\t\t\t\tbind:this={slashList}\n\t\t\t\t\t\t\t\t\t\tcwd={currentSession?.cwd}\n\t\t\t\t\t\t\t\t\t\t{base}\n\t\t\t\t\t\t\t\t\t\tpinned={pinnedCommands}\n\t\t\t\t\t\t\t\t\t\tquery={slashQuery}\n\t\t\t\t\t\t\t\t\t\tonselect={chooseSlash}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{#if hasAttachments}\n\t\t\t\t\t\t\t\t<Popover.Root bind:open={attachStackOpen}>\n\t\t\t\t\t\t\t\t\t<Popover.Trigger\n\t\t\t\t\t\t\t\t\t\tclass=\"tattach\"\n\t\t\t\t\t\t\t\t\t\ttitle={`${attachments.length} attachment${attachments.length === 1 ? '' : 's'}`}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<iconify-icon\n\t\t\t\t\t\t\t\t\t\t\ticon={anyUploading ? 'mdi:loading' : 'mdi:paperclip'}\n\t\t\t\t\t\t\t\t\t\t\tclass={anyUploading ? 'attach-spin' : ''}\n\t\t\t\t\t\t\t\t\t\t></iconify-icon>\n\t\t\t\t\t\t\t\t\t\t<span class:attach-failed={anyFailed}>{attachments.length}</span>\n\t\t\t\t\t\t\t\t\t</Popover.Trigger>\n\t\t\t\t\t\t\t\t\t<Popover.Content\n\t\t\t\t\t\t\t\t\t\tside=\"top\"\n\t\t\t\t\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\t\t\t\t\tclass=\"w-72 p-2 bg-[#1a1a1a] border-[#333]\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div class=\"attach-list\">\n\t\t\t\t\t\t\t\t\t\t\t{#each attachments as att (att.localId)}\n\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"attach-item\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass:attach-item-failed={att.status === 'failed'}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttitle={att.status === 'failed' ? `Upload failed: ${att.error}` : att.name}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{#if att.thumb}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img class=\"attach-item-thumb\" src={att.thumb} alt=\"\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"attach-item-thumb attach-item-file\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:file-outline\"></iconify-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"attach-item-name\">{att.name}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{#if att.status === 'uploading'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<iconify-icon class=\"attach-spin\" icon=\"mdi:loading\"></iconify-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{:else if att.status === 'failed'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"attach-item-remove\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Retry\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={`Retry ${att.name}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonclick={() => retryAttachment(att.localId)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:refresh\"></iconify-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"attach-item-remove\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Remove\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={`Remove ${att.name}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonclick={() => removeAttachment(att.localId)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:close\"></iconify-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t{#if attachments.length > 1}\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" class=\"attach-clear\" onclick={() => attachmentsStore.clear(ref)}>\n\t\t\t\t\t\t\t\t\t\t\t\tRemove all\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t</Popover.Content>\n\t\t\t\t\t\t\t\t</Popover.Root>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{#if editing?.ref === ref}\n\t\t\t\t\t\t\t\t<div class=\"editbar\">\n\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:pencil-outline\"></iconify-icon>\n\t\t\t\t\t\t\t\t\t<span>Editing a queued message. Enter saves it in place.</span>\n\t\t\t\t\t\t\t\t\t<button type=\"button\" onclick={cancelEdit}>Cancel</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{:else if editNotice}\n\t\t\t\t\t\t\t\t<div class=\"editbar notice\" role=\"status\">\n\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:information-outline\"></iconify-icon>\n\t\t\t\t\t\t\t\t\t<span>{editNotice}</span>\n\t\t\t\t\t\t\t\t\t<button type=\"button\" onclick={() => (editNotice = null)}>Dismiss</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{@render composerField()}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- lane 2 — the footer, whose left edge never moves -->\n\t\t\t\t\t\t<div class=\"foot\">\n\t\t\t\t\t\t\t{#if hasSelection}\n\t\t\t\t\t\t\t\t<button type=\"button\" class=\"copy-sel\" onclick={copySelection}>\n\t\t\t\t\t\t\t\t\t<iconify-icon\n\t\t\t\t\t\t\t\t\t\ticon={showSelectionCopied ? 'mdi:check' : 'mdi:content-copy'}\n\t\t\t\t\t\t\t\t\t></iconify-icon>\n\t\t\t\t\t\t\t\t\t{showSelectionCopied ? 'Copied' : 'Copy'}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{#if isBusy}\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"interrupt\"\n\t\t\t\t\t\t\t\t\tonclick={() => void sendKeys('Escape')}\n\t\t\t\t\t\t\t\t\ttitle=\"Interrupt what Claude is doing\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:stop\"></iconify-icon><span>interrupt</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t<Popover.Root bind:open={attachPickerOpen}>\n\t\t\t\t\t\t\t\t<Popover.Trigger class=\"cx-g\" aria-label=\"Attach\">\n\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:paperclip\"></iconify-icon>\n\t\t\t\t\t\t\t\t</Popover.Trigger>\n\t\t\t\t\t\t\t\t{@render attachMenu()}\n\t\t\t\t\t\t\t</Popover.Root>\n\t\t\t\t\t\t\t<Hint\n\t\t\t\t\t\t\t\ticon=\"mdi:slash-forward\"\n\t\t\t\t\t\t\t\tlabel=\"Commands\"\n\t\t\t\t\t\t\t\tkeys={MOD_LABEL + ' /'}\n\t\t\t\t\t\t\t\tclass=\"cx-g\"\n\t\t\t\t\t\t\t\tonclick={() => (commandsOpen = true)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Popover.Root bind:open={moreOpen}>\n\t\t\t\t\t\t\t\t<Popover.Trigger class=\"cx-g\" title=\"More keys\">\n\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:dots-horizontal\"></iconify-icon>\n\t\t\t\t\t\t\t\t</Popover.Trigger>\n\t\t\t\t\t\t\t\t<Popover.Content\n\t\t\t\t\t\t\t\t\tside=\"top\"\n\t\t\t\t\t\t\t\t\tclass=\"w-auto max-w-[280px] p-2 bg-[#1a1a1a] border-[#333]\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div class=\"popover-grid\">\n\t\t\t\t\t\t\t\t\t\t{#each moreKeys as item (item.label)}\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"toolbar\"\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"min-w-14 min-h-12\"\n\t\t\t\t\t\t\t\t\t\t\t\tonclick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tsendKeys(item.keys);\n\t\t\t\t\t\t\t\t\t\t\t\t\tmoreOpen = false;\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<iconify-icon icon={item.icon}></iconify-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{item.label}</span>\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</Popover.Content>\n\t\t\t\t\t\t\t</Popover.Root>\n\t\t\t\t\t\t\t{#if !isBusy}\n\t\t\t\t\t\t\t\t<Hint\n\t\t\t\t\t\t\t\t\ticon=\"mdi:keyboard-esc\"\n\t\t\t\t\t\t\t\t\tlabel=\"Escape\"\n\t\t\t\t\t\t\t\t\tclass=\"cx-g esc-key\"\n\t\t\t\t\t\t\t\t\tonclick={() => void sendKeys('Escape')}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t<Hint\n\t\t\t\t\t\t\t\ticon=\"mdi:keyboard-outline\"\n\t\t\t\t\t\t\t\tlabel={trayOpen ? 'Hide keys' : 'Show keys'}\n\t\t\t\t\t\t\t\tkeys={MOD_LABEL + ' .'}\n\t\t\t\t\t\t\t\tclass=\"cx-g kb-toggle{trayOpen ? ' lit' : ''}{wantsKeypress || modArmed ? ' warn' : ''}\"\n\t\t\t\t\t\t\t\tonclick={() => (trayOpen = !trayOpen)}\n\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t<span class=\"foot-sp\"></span>\n\n\t\t\t\t\t\t\t<RailStats />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- the rail — the two controls a thumb reaches for, given the\n\t\t\t\t\t height of both lanes rather than the footer's alone -->\n\t\t\t\t\t<div class=\"rail\">\n\t\t\t\t\t\t{#if voiceEnabled}<VoiceButton target={ref} onToggle={() => void toggleVoice()} />{/if}\n\t\t\t\t\t\t<div class=\"act-wrap\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"act\"\n\t\t\t\t\t\t\t\tdisabled={!canSend}\n\t\t\t\t\t\t\t\taria-label={actionLabel}\n\t\t\t\t\t\t\t\ttitle={actionLabel}\n\t\t\t\t\t\t\t\tonclick={async () => {\n\t\t\t\t\t\t\t\t\tif (await finishVoice(sendText)) return;\n\t\t\t\t\t\t\t\t\tif (modArmed) await sendModSequence();\n\t\t\t\t\t\t\t\t\telse if (actionKind === 'steer' || actionKind === 'now') await deliver(actionKind);\n\t\t\t\t\t\t\t\t\telse await sendFromButton();\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<iconify-icon icon={actionIcon}></iconify-icon>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{#if canSteer}\n\t\t\t\t\t\t\t<!-- Its own button, so a phone has a way to steer that is not a\n\t\t\t\t\t\t\t held key or a long press. -->\n\t\t\t\t\t\t\t<div class=\"steers\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"act steer\"\n\t\t\t\t\t\t\t\t\tdisabled={!canSend}\n\t\t\t\t\t\t\t\t\taria-label=\"Steer\"\n\t\t\t\t\t\t\t\t\ttitle={`${STEERS.steer.title} (${MOD_LABEL}+Enter)`}\n\t\t\t\t\t\t\t\t\tonclick={() => void steerText()}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<iconify-icon icon={ACTIONS.steer.icon}></iconify-icon>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"act steer\"\n\t\t\t\t\t\t\t\t\tdisabled={!canSend}\n\t\t\t\t\t\t\t\t\taria-label=\"Now\"\n\t\t\t\t\t\t\t\t\ttitle={`${STEERS.now.title} (${MOD_LABEL}+Shift+Enter)`}\n\t\t\t\t\t\t\t\t\tonclick={() => void nowText()}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<iconify-icon icon={ACTIONS.now.icon}></iconify-icon>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n</div>\n\n{#snippet sidePanel(kind: string, open: boolean)}\n\t{#key ref}\n\t\t<SidePanel\n\t\t\t{kind}\n\t\t\t{open}\n\t\t\ttarget={target ?? ''}\n\t\t\t{base}\n\t\t\t{machineHost}\n\t\t\tsession={currentSession ?? null}\n\t\t\tquery={$page.url.searchParams}\n\t\t\tmaximized={panelMaximized}\n\t\t\tcanMaximize={panelInline}\n\t\t\tonSetParams={setPaneParams}\n\t\t\tonToggleMaximize={toggleMaximize}\n\t\t\tonSelect={openPanel}\n\t\t\tonClose={() => openPanel(null)}\n\t\t\tonMention={mentionInComposer}\n\t\t\tonOpenPane={(kind, own) => navigateQuery(panelQuery($page.url.searchParams, kind, PANE_PARAMS, own), false)}\n\t\t/>\n\t{/key}\n{/snippet}\n\n{#if panelInline}\n\t{#if panelColumnKind}\n\t\t<div class=\"panel-divider\" hidden={!panelKind}>\n\t\t\t<ResizeDivider\n\t\t\t\tbind:resizing={panelResizing}\n\t\t\t\ttitle=\"Drag to resize · double-click for the default width\"\n\t\t\t\tonmove={resizePanel}\n\t\t\t\tonend={endPanelResize}\n\t\t\t\tonreset={() => sidePanelStore.update(ref, { width: undefined })}\n\t\t\t/>\n\t\t</div>\n\t\t<aside class=\"side-panel\" aria-label=\"Side panel\" hidden={!panelKind}>\n\t\t\t{@render sidePanel(panelColumnKind, panelKind !== null)}\n\t\t\t{#if panelResizing}\n\t\t\t\t<!-- A pane may hold an iframe, which must not eat the pointer mid-drag. -->\n\t\t\t\t<div class=\"panel-shield\"></div>\n\t\t\t{/if}\n\t\t</aside>\n\t{/if}\n{:else}\n\t<Sheet.Root open={panelKind !== null} onOpenChange={(open) => { if (!open) openPanel(null); }}>\n\t\t<Sheet.Content\n\t\t\tside=\"right\"\n\t\t\tshowCloseButton={false}\n\t\t\tonOpenAutoFocus={(e) => e.preventDefault()}\n\t\t\tclass=\"side-sheet gap-0 p-0 {panelPhone ? 'phone' : ''}\"\n\t\t>\n\t\t\t<Sheet.Title class=\"sr-only\">Side panel</Sheet.Title>\n\t\t\t{#if panelKind}{@render sidePanel(panelKind, true)}{/if}\n\t\t</Sheet.Content>\n\t</Sheet.Root>\n{/if}\n</div>\n\n<CommandPalette bind:open={commandsOpen} cwd={currentSession?.cwd} {base} pinned={pinnedCommands} onselect={fillInput} />\n\n<AlertDialog.Root bind:open={showConfirmKill}>\n\t<AlertDialog.Content>\n\t\t<AlertDialog.Header>\n\t\t\t<AlertDialog.Title>Kill this {isClaudeSession ? 'session' : 'pane'}?</AlertDialog.Title>\n\t\t\t<AlertDialog.Description>{isClaudeSession ? 'This will terminate the Claude process.' : 'This will close the tmux pane.'}</AlertDialog.Description>\n\t\t</AlertDialog.Header>\n\t\t<AlertDialog.Footer>\n\t\t\t<AlertDialog.Cancel>Cancel</AlertDialog.Cancel>\n\t\t\t<AlertDialog.Action onclick={killSession} class=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\">Kill</AlertDialog.Action>\n\t\t</AlertDialog.Footer>\n\t</AlertDialog.Content>\n</AlertDialog.Root>\n\n<AlertDialog.Root bind:open={showConfirmRestart}>\n\t<AlertDialog.Content>\n\t\t<AlertDialog.Header>\n\t\t\t<AlertDialog.Title>Restart Claude Code?</AlertDialog.Title>\n\t\t\t<AlertDialog.Description>\n\t\t\t\tQuits Claude Code and reopens this conversation in the same pane with the same flags. Picks up a pending update and reloads skills and hooks.{#if isBusy} It is busy right now — what it is doing will be cut off.{/if}\n\t\t\t</AlertDialog.Description>\n\t\t</AlertDialog.Header>\n\t\t<AlertDialog.Footer>\n\t\t\t<AlertDialog.Cancel>Cancel</AlertDialog.Cancel>\n\t\t\t<AlertDialog.Action onclick={() => void restartSession()}>Restart</AlertDialog.Action>\n\t\t</AlertDialog.Footer>\n\t</AlertDialog.Content>\n</AlertDialog.Root>\n\n{#if dropActive}\n\t<div class=\"drop-overlay\">\n\t\t<iconify-icon icon=\"mdi:tray-arrow-down\"></iconify-icon>\n\t\t<span>Drop files to attach</span>\n\t</div>\n{/if}\n</Tooltip.Provider>\n\n<style>\n\t.chord-overlay {\n\t\tposition: fixed;\n\t\tinset: 0;\n\t\tdisplay: grid;\n\t\tplace-items: center;\n\t\tz-index: var(--z-overlay);\n\t\tpointer-events: none;\n\t\tbackground: radial-gradient(ellipse at center, rgba(0,0,0,0.65) 0%, rgba(0,0,0,0.92) 100%);\n\t\tfont-family: 'JetBrains Mono', ui-monospace, monospace;\n\t\tanimation: chord-fade-in 120ms ease-out;\n\t}\n\t@keyframes chord-fade-in {\n\t\tfrom { opacity: 0; transform: scale(0.96); }\n\t\tto { opacity: 1; transform: scale(1); }\n\t}\n\t.chord-panel {\n\t\tposition: relative;\n\t\tpadding: 1.25rem 1.5rem 1rem;\n\t\tbackground: linear-gradient(180deg, #14141a, #0a0a0d);\n\t\tborder: 1px solid rgba(226, 160, 82, 0.22);\n\t\tborder-radius: 14px;\n\t\tbox-shadow:\n\t\t\t0 0 0 1px rgba(226, 160, 82, 0.06),\n\t\t\t0 24px 60px rgba(0, 0, 0, 0.7),\n\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.04);\n\t}\n\t.chord-title {\n\t\tcolor: #e2a052;\n\t\tfont-size: 0.65rem;\n\t\tletter-spacing: 0.32em;\n\t\ttext-transform: uppercase;\n\t\ttext-align: center;\n\t\topacity: 0.7;\n\t\tmargin-bottom: 0.85rem;\n\t}\n\t.chord-stage {\n\t\tposition: relative;\n\t\tisolation: isolate;\n\t\twidth: 30rem;\n\t\theight: 30rem;\n\t}\n\t.chord-ring {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t}\n\t.chord-item {\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\tleft: 50%;\n\t\twidth: 4.5rem;\n\t\tmin-height: 4.5rem;\n\t\ttransform: translate(calc(-50% + var(--x, 0px)), calc(-50% + var(--y, 0px)));\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tgap: 0.25rem;\n\t\tpadding: 0.4rem 0.3rem;\n\t\tbackground: rgba(22, 22, 28, 0.65);\n\t\tborder: 1px solid rgba(255, 255, 255, 0.05);\n\t\tborder-radius: 50%;\n\t\tcolor: rgba(255, 255, 255, 0.5);\n\t\tfont-size: 0.55rem;\n\t\tletter-spacing: 0.03em;\n\t\ttext-align: center;\n\t\ttransition:\n\t\t\tborder-color 140ms,\n\t\t\tbackground 140ms,\n\t\t\tcolor 140ms,\n\t\t\tbox-shadow 140ms,\n\t\t\tscale 140ms cubic-bezier(0.2, 0.9, 0.2, 1);\n\t}\n\t.chord-item iconify-icon { font-size: 26px; }\n\t.chord-item.armed {\n\t\tbackground: linear-gradient(180deg, rgba(226,160,82,0.22), rgba(226,160,82,0.04));\n\t\tborder-color: rgba(226, 160, 82, 0.85);\n\t\tcolor: #fff;\n\t\tscale: 1.15;\n\t\tbox-shadow:\n\t\t\t0 0 28px rgba(226, 160, 82, 0.35),\n\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.08);\n\t}\n\t.chord-item.danger.armed {\n\t\tborder-color: rgba(239, 68, 68, 0.9);\n\t\tbackground: linear-gradient(180deg, rgba(239,68,68,0.22), rgba(239,68,68,0.04));\n\t\tcolor: #fecaca;\n\t\tbox-shadow: 0 0 28px rgba(239, 68, 68, 0.35);\n\t}\n\t.chord-deadzone {\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\tleft: 50%;\n\t\twidth: 6.5rem;\n\t\theight: 6.5rem;\n\t\ttransform: translate(-50%, -50%);\n\t\tborder-radius: 50%;\n\t\tborder: 1.5px dashed rgba(255, 255, 255, 0.18);\n\t\tdisplay: grid;\n\t\tplace-items: center;\n\t\tpointer-events: none;\n\t\tz-index: 2;\n\t\ttransition: border-color 180ms, background 180ms;\n\t}\n\t.chord-deadzone span {\n\t\tfont-size: 0.6rem;\n\t\tletter-spacing: 0.25em;\n\t\tcolor: rgba(255, 255, 255, 0.25);\n\t\topacity: 0;\n\t\ttransition: opacity 160ms, color 160ms;\n\t\ttext-transform: uppercase;\n\t}\n\t.chord-deadzone.inactive {\n\t\tborder-color: rgba(239, 68, 68, 0.55);\n\t\tbackground: radial-gradient(circle, rgba(239, 68, 68, 0.10) 0%, transparent 70%);\n\t}\n\t.chord-deadzone.inactive span {\n\t\topacity: 1;\n\t\tcolor: rgba(252, 165, 165, 0.85);\n\t}\n\t.chord-cursor {\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\tleft: 50%;\n\t\twidth: 14px;\n\t\theight: 14px;\n\t\tborder-radius: 50%;\n\t\ttransform: translate(calc(-50% + var(--cx, 0px)), calc(-50% + var(--cy, 0px)));\n\t\tbackground: rgba(239, 68, 68, 0.9);\n\t\tbox-shadow:\n\t\t\t0 0 10px rgba(239, 68, 68, 0.5),\n\t\t\t0 0 20px rgba(239, 68, 68, 0.25);\n\t\tpointer-events: none;\n\t\tz-index: 3;\n\t\twill-change: transform;\n\t\ttransition: background 100ms, box-shadow 100ms;\n\t}\n\t.chord-cursor.armed {\n\t\tbackground: #e2a052;\n\t\tbox-shadow:\n\t\t\t0 0 12px rgba(226, 160, 82, 0.9),\n\t\t\t0 0 28px rgba(226, 160, 82, 0.45);\n\t}\n\t.chord-cursor::before {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\tinset: -8px;\n\t\tborder-radius: 50%;\n\t\tborder: 1px solid currentColor;\n\t\topacity: 0.25;\n\t}\n\t.chord-status {\n\t\tmargin-top: 1rem;\n\t\ttext-align: center;\n\t\tfont-size: 0.72rem;\n\t\tletter-spacing: 0.18em;\n\t\ttext-transform: uppercase;\n\t\tcolor: rgba(255, 255, 255, 0.75);\n\t\tmin-height: 1rem;\n\t}\n\t.chord-status.danger {\n\t\tcolor: #fca5a5;\n\t}\n\n\t.session-row {\n\t\theight: 100%;\n\t\tdisplay: flex;\n\t\tmin-width: 0;\n\t\tbackground: #000;\n\t}\n\t.panel-divider[hidden],\n\t.side-panel[hidden] {\n\t\tdisplay: none;\n\t}\n\t.panel-divider {\n\t\tflex: none;\n\t\twidth: var(--divider-w);\n\t}\n\t.side-panel {\n\t\tposition: relative;\n\t\tflex: none;\n\t\twidth: var(--panel-w);\n\t\tmin-width: var(--panel-min);\n\t\tmax-width: calc(100% - var(--session-min) - var(--divider-w));\n\t\tborder-left: 1px solid #262626;\n\t}\n\t.panel-shield {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t}\n\t/* Maximized, the panel takes the page; the session stays mounted, out of sight. */\n\t.session-row.panel-max .session-container,\n\t.session-row.panel-max .panel-divider {\n\t\tdisplay: none;\n\t}\n\t.session-row.panel-max .side-panel {\n\t\tflex: 1;\n\t\twidth: auto;\n\t\tmax-width: none;\n\t\tborder-left: 0;\n\t}\n\t:global([data-slot='sheet-content'].side-sheet) {\n\t\twidth: min(44rem, 92vw);\n\t\tmax-width: none;\n\t\tbackground: #111111;\n\t\tborder-color: #262626;\n\t}\n\t:global([data-slot='sheet-content'].side-sheet.phone) {\n\t\twidth: 100vw;\n\t\tborder-left: 0;\n\t}\n\n\t.session-container {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\theight: 100%;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tbackground: #000;\n\t\toverflow: hidden;\n\t\toverscroll-behavior: none;\n\t\ttouch-action: pan-y;\n\t}\n\n\n\t.output-wrap {\n\t\tposition: relative;\n\t\tflex: 1;\n\t\tmin-height: 0;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t.jump-bottom {\n\t\tposition: absolute;\n\t\tright: 18px;\n\t\tbottom: 12px;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\tpadding: 6px 10px;\n\t\tborder-radius: 999px;\n\t\tborder: 1px solid #3a3a3a;\n\t\tbackground: rgba(30, 30, 30, 0.92);\n\t\tcolor: #e5e5e5;\n\t\tfont-size: 12px;\n\t\tcursor: pointer;\n\t\tbox-shadow: 0 2px 8px rgba(0, 0, 0, 0.5);\n\t\tz-index: 5;\n\t}\n\t.jump-bottom:hover {\n\t\tbackground: #2a2a2a;\n\t}\n\t.jump-bottom iconify-icon {\n\t\tfont-size: 16px;\n\t}\n\n\t.output {\n\t\tflex: 1;\n\t\toverflow-y: auto;\n\t\toverscroll-behavior: none;\n\t\ttouch-action: pan-y;\n\t\tpadding: 16px;\n\t\tmargin: 0;\n\t\tfont-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;\n\t\tfont-size: 13px;\n\t\tline-height: 1.4;\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t\tbackground: #000;\n\t\tcolor: #fff;\n\t}\n\t/* The transcript grows and shrinks under a live turn; a bar coming and\n\t going must not shift it sideways. Both edges, so it stays centred. */\n\t@media (hover: hover) and (pointer: fine) {\n\t\t.output {\n\t\t\tscrollbar-gutter: stable both-edges;\n\t\t}\n\t}\n\n\n\n\t.slash-popup {\n\t\tposition: absolute;\n\t\tleft: 8px;\n\t\tright: 8px;\n\t\tbottom: 100%;\n\t\tmargin-bottom: 6px;\n\t\tmax-height: min(50dvh, 420px);\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tbackground: #1a1a1a;\n\t\tborder: 1px solid #333;\n\t\tborder-radius: 8px;\n\t\toverflow: hidden;\n\t\tz-index: 10;\n\t\tbox-shadow: 0 -4px 12px rgba(0, 0, 0, 0.4);\n\t\tcolor: #f5f5f4;\n\t}\n\n\n\t.attach-list {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 4px;\n\t\tmax-height: 50vh;\n\t\toverflow-y: auto;\n\t}\n\t.attach-item {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tpadding: 4px;\n\t\tborder-radius: 6px;\n\t\tcolor: #d4e3ff;\n\t\tfont-size: 12px;\n\t}\n\t.attach-item:hover {\n\t\tbackground: rgba(255, 255, 255, 0.06);\n\t}\n\t.attach-item-failed {\n\t\tcolor: #ffd4d4;\n\t}\n\t.attach-item-thumb {\n\t\twidth: 40px;\n\t\theight: 40px;\n\t\tflex-shrink: 0;\n\t\tobject-fit: cover;\n\t\tborder-radius: 6px;\n\t\tbackground: #1f2c44;\n\t}\n\t.attach-item-file {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tfont-size: 22px;\n\t}\n\t.attach-item-name {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\t.attach-clear {\n\t\tmargin-top: 6px;\n\t\twidth: 100%;\n\t\tpadding: 6px;\n\t\tborder: 0;\n\t\tborder-radius: 6px;\n\t\tbackground: #2a2a2a;\n\t\tcolor: #ccc;\n\t\tfont-size: 12px;\n\t\tcursor: pointer;\n\t}\n\t.attach-clear:hover {\n\t\tbackground: #4a1d22;\n\t\tcolor: #ffd4d4;\n\t}\n\t.attach-spin {\n\t\tanimation: attach-spin 1s linear infinite;\n\t}\n\t@keyframes attach-spin {\n\t\tto { transform: rotate(360deg); }\n\t}\n\n\t.attach-input-hidden {\n\t\tposition: absolute;\n\t\tleft: -9999px;\n\t\twidth: 1px;\n\t\theight: 1px;\n\t\topacity: 0;\n\t\tpointer-events: none;\n\t}\n\n\t.drop-overlay {\n\t\tposition: fixed;\n\t\tinset: 0;\n\t\tbackground: rgba(20, 40, 80, 0.55);\n\t\tbackdrop-filter: blur(2px);\n\t\tz-index: var(--z-overlay);\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tpointer-events: none;\n\t\tborder: 3px dashed #4f8df7;\n\t\tcolor: #d4e3ff;\n\t\tfont-size: 20px;\n\t\tfont-weight: 600;\n\t\tgap: 12px;\n\t}\n\t.drop-overlay iconify-icon {\n\t\tfont-size: 48px;\n\t}\n\n\n\t.popover-grid {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(3, 1fr);\n\t\tgap: 6px;\n\t}\n\n\n\n\n\n\n\n\n\n\n\n\t/* ── Transcript composer ─────────────────────────────────────────────\n\t Three lanes and a rail. The status line and the footer are fixed\n\t furniture — the footer's left edge in particular never moves, so a thumb\n\t already travelling toward a control never has it swapped underneath.\n\t Only the middle lane changes what it contains, and the rail down the\n\t right holds the two controls that are worth a thumb's whole reach. */\n\t.cx {\n\t\tposition: relative;\n\t\tcontainer: composer / inline-size;\n\t\tbackground: #151516;\n\t\tborder: 1px solid #2a2a2c;\n\t\tborder-bottom: 0;\n\t\tborder-radius: 16px 16px 0 0;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tpadding-bottom: 8px;\n\t}\n\n\t/* ── lane 0 · the status line ───────────────────────────────────── */\n\t.sl {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 7px;\n\t\t/* The row is as tall as its tallest control, not as tall as its text:\n\t\t the buttons on the right are what a person aims at, and a 22px row\n\t\t caps them below the size a pointer can reliably land on. */\n\t\tmin-height: 28px;\n\t\t/* clears the context rail's 10px hit band, so the two rows never\n\t\t compete for the same click */\n\t\tpadding: 9px 8px 0 12px;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 10.5px;\n\t\tletter-spacing: 0.04em;\n\t\tcolor: #78716c;\n\t\tmin-width: 0;\n\t}\n\t.nm {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 4px;\n\t\tborder: 0;\n\t\tbackground: none;\n\t\tpadding: 0;\n\t\tcolor: #f5f5f4;\n\t\tfont: inherit;\n\t\tcursor: pointer;\n\t\tmin-width: 0;\n\t\tmax-width: 52%;\n\t}\n\t.nm b {\n\t\tfont-weight: 400;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\t.nm iconify-icon {\n\t\tfont-size: 12px;\n\t\topacity: 0.45;\n\t\tflex: none;\n\t}\n\t.nm:hover iconify-icon {\n\t\topacity: 0.9;\n\t}\n\t.sep {\n\t\tcolor: #3f3c39;\n\t\tflex: none;\n\t}\n\t.say {\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t\tmin-width: 0;\n\t}\n\t.say.amber {\n\t\tcolor: #fbbf24;\n\t}\n\t.say.upd {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 3px;\n\t\tcolor: #34d399;\n\t}\n\tbutton.say.upd {\n\t\tpadding: 1px 6px;\n\t\tborder: 1px solid #065f46;\n\t\tborder-radius: 6px;\n\t\tbackground: #052e22;\n\t\tfont: inherit;\n\t\tcursor: pointer;\n\t}\n\tbutton.say.upd:hover:not(:disabled) {\n\t\tbackground: #064e3b;\n\t}\n\tbutton.say.upd:disabled {\n\t\topacity: 0.55;\n\t\tcursor: default;\n\t}\n\t.say.upd.available {\n\t\tcolor: #a8a29e;\n\t}\n\t.say.upd.failed {\n\t\tcolor: #f87171;\n\t}\n\t.sl-sp {\n\t\tflex: 1;\n\t\tmin-width: 8px;\n\t}\n\t/* One pane of a split: the row may wrap in a narrow pane, and the pane's\n\t own controls travel as a group to the right of whichever line they land on. */\n\t.cx.embed .sl {\n\t\tflex-wrap: wrap;\n\t\trow-gap: 2px;\n\t}\n\t.pane-ctl {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 2px;\n\t\tmargin-left: auto;\n\t}\n\t.pane-ctl :global(.pane-close:hover) {\n\t\tcolor: #fca5a5;\n\t}\n\t.mach {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 10px;\n\t\tcolor: #818cf8;\n\t\tbackground: #1e1e3a;\n\t\tborder-radius: 4px;\n\t\tpadding: 0 5px;\n\t\twhite-space: nowrap;\n\t}\n\t.foc {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 9.5px;\n\t\tletter-spacing: 0.08em;\n\t\ttext-transform: uppercase;\n\t\tcolor: #f59e0b;\n\t}\n\t/* The focused pane says so on its composer, not over the conversation. */\n\t.cx.focused {\n\t\tborder-color: #5a4310;\n\t\tbox-shadow: inset 0 0 0 1px #3a2d0d;\n\t}\n\t/* 24×22 with the context rail's own hit band directly above is a target you\n\t aim at rather than one you hit — a miss high lands on the gauge. The\n\t glyph keeps its size; the button grows around it. */\n\t.sl :global(.mini) {\n\t\twidth: 30px;\n\t\theight: 28px;\n\t\tborder: 0;\n\t\tborder-radius: 6px;\n\t\tbackground: none;\n\t\tcolor: #78716c;\n\t\tfont-size: 15px;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex: none;\n\t\tcursor: pointer;\n\t}\n\t.sl :global(.mini:hover) {\n\t\tbackground: #202022;\n\t\tcolor: #f5f5f4;\n\t}\n\t/* A finger is not a cursor: it has no point to aim with and it covers the\n\t thing it is pressing. Where the pointer is coarse the row gives these\n\t controls the size a thumb actually lands on. */\n\t@media (pointer: coarse) {\n\t\t.sl {\n\t\t\tmin-height: 40px;\n\t\t\tgap: 4px;\n\t\t}\n\t\t.sl :global(.mini) {\n\t\t\twidth: 40px;\n\t\t\theight: 40px;\n\t\t}\n\t}\n\n\t/* The sidebar is always on screen once there is room for it. */\n\t@media (min-width: 769px) {\n\t\t/* `.sl .mini` sets display, so this has to match its specificity. */\n\t\t.sl :global(.menu-only) {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t/* The rail stands beside both lanes, so the field and the footer share a\n\t narrower column than the card. That width is what buys the mic and the\n\t action a thumb-sized target without the footer growing a second row. */\n\t.body {\n\t\tdisplay: flex;\n\t\talign-items: stretch;\n\t\tgap: 8px;\n\t\tpadding-right: 9px;\n\t}\n\t.lanes {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\t/* The footer's controls answer to the width the rail leaves them, which\n\t\t the viewport does not know: a sidebar sits between it and this card. */\n\t\tcontainer-type: inline-size;\n\t}\n\t/* The rail is furniture, not content: it sits at the foot and keeps one\n\t size whatever the middle lane grows into — a list of options, a field\n\t four lines deep. A send button as tall as the card is not a better\n\t target, only a stranger one. */\n\t.rail {\n\t\tflex: none;\n\t\talign-self: flex-end;\n\t\tdisplay: flex;\n\t\talign-items: stretch;\n\t\tgap: 6px;\n\t\tpadding: 8px 0 2px;\n\t\theight: 74px;\n\t}\n\n\t/* ── lane 1 · the middle ────────────────────────────────────────── */\n\t.mid {\n\t\tposition: relative;\n\t\tpadding: 8px 4px 0 13px;\n\t\tdisplay: flex;\n\t\tgap: 9px;\n\t\talign-items: flex-start;\n\t}\n\t.mid :global(textarea) {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\theight: 24px;\n\t\tmax-height: 112px;\n\t\tbackground: none;\n\t\tborder: 0;\n\t\tpadding: 0;\n\t\tcolor: #f5f5f4;\n\t\tfont-size: 15.5px;\n\t\tfont-family: inherit;\n\t\tline-height: 1.48;\n\t\tresize: none;\n\t\toverflow-y: auto;\n\t\toverflow-x: hidden;\n\t\tscrollbar-width: none;\n\t}\n\t.mid :global(textarea:focus) {\n\t\toutline: none;\n\t}\n\t.mid :global(textarea::placeholder) {\n\t\tcolor: #78716c;\n\t}\n\n\t.mid :global(.tattach) {\n\t\tflex: none;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 4px;\n\t\theight: 26px;\n\t\tpadding: 0 9px;\n\t\tborder: 0;\n\t\tborder-radius: 13px;\n\t\tbackground: #202022;\n\t\tcolor: #a8a29e;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 11.5px;\n\t\tcursor: pointer;\n\t}\n\t.mid :global(.tattach .attach-failed) {\n\t\tcolor: #f87171;\n\t}\n\n\t/* ── lane 2 · the footer ────────────────────────────────────────── */\n\t.foot {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 4px;\n\t\tmin-height: 42px;\n\t\tpadding: 2px 2px 0 11px;\n\t\t/* Every control on this row is `flex: none`, so a row too long for the\n\t\t card ran on under the rail instead of stopping at it. */\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t}\n\t.foot-sp {\n\t\tflex: 1;\n\t}\n\t/* Controls are bare glyphs that earn a fill only on hover or when lit,\n\t so exactly one thing on the composer is filled: the action. */\n\t.cx :global(.cx-g) {\n\t\tmin-width: 32px;\n\t\theight: 32px;\n\t\tborder: 0;\n\t\tborder-radius: 8px;\n\t\tbackground: none;\n\t\tcolor: #78716c;\n\t\tfont-size: 18px;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex: none;\n\t\tcursor: pointer;\n\t\ttransition:\n\t\t\tbackground 0.12s,\n\t\t\tcolor 0.12s;\n\t}\n\t.cx :global(.cx-g:hover) {\n\t\tbackground: #202022;\n\t\tcolor: #f5f5f4;\n\t}\n\t.cx :global(.cx-g.lit) {\n\t\tbackground: #202022;\n\t\tcolor: #f5f5f4;\n\t}\n\t.cx :global(.cx-g.warn) {\n\t\tcolor: #fbbf24;\n\t}\n\t/* Thumb-sized where the pointer is coarse. It has to follow the base rule:\n\t a media query carries no extra specificity, so written above it, it loses. */\n\t@media (pointer: coarse) {\n\t\t.cx :global(.cx-g) {\n\t\t\tmin-width: 40px;\n\t\t\theight: 40px;\n\t\t}\n\t}\n\n\t/* A desktop keyboard has Escape, but the field it is typed into keeps it,\n\t so the row carries the key itself. Only there: a phone reaches Escape\n\t through the keys tray, and the row has no width to spare for it. */\n\t.cx :global(.esc-key) {\n\t\tdisplay: none;\n\t}\n\t@media (min-width: 769px) {\n\t\t.cx :global(.esc-key) {\n\t\t\tdisplay: inline-flex;\n\t\t}\n\t\t/* The keys toggle belongs with the usage bars on a wide row — the left\n\t\t of the row is where the things you reach for while typing live. The\n\t\t spacer keeps order 0 and stays where it sits in the markup. */\n\t\t.cx :global(.kb-toggle) {\n\t\t\torder: 1;\n\t\t}\n\t\t.foot :global(.usage) {\n\t\t\torder: 2;\n\t\t}\n\t}\n\n\t/* While Claude works, Escape is the only key that matters, so it stops\n\t being the third tile in a row and says what it does. */\n\t.interrupt {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\theight: 32px;\n\t\tpadding: 0 11px;\n\t\tborder: 0;\n\t\tborder-radius: 8px;\n\t\tbackground: #3a2d0d;\n\t\tcolor: #fbbf24;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 11.5px;\n\t\tflex: none;\n\t\tcursor: pointer;\n\t}\n\t.interrupt:hover {\n\t\tbackground: #4a3a12;\n\t}\n\t/* Interrupt is the one control that arrives mid-row, and it arrives at the\n\t width where the spend readout has nowhere left to go. On a narrow card\n\t the glyph carries it: a stop sign in amber, on a bar where nothing else\n\t is amber, needs no caption. */\n\t@container (max-width: 420px) {\n\t\t.interrupt {\n\t\t\tpadding: 0 8px;\n\t\t}\n\t\t.interrupt span {\n\t\t\tdisplay: none;\n\t\t}\n\t\t/* The spend readout keeps its number and drops its sparkline, which is\n\t\t the half of it that cannot be read at this size anyway. */\n\t\t.cx :global(.usage .bars) {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t/* Spend is information, not an action, so it reads as text on the footer's\n\t own baseline rather than as another key. */\n\t.cx :global(.usage) {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\theight: 32px;\n\t\tpadding: 0 5px;\n\t\tborder-radius: 8px;\n\t\tbackground: none;\n\t\tcolor: #78716c;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 11px;\n\t\ttext-decoration: none;\n\t\tflex: none;\n\t}\n\t.cx :global(.usage:hover) {\n\t\tbackground: #202022;\n\t\tcolor: #a8a29e;\n\t}\n\t.cx :global(.usage .bars) {\n\t\twidth: 20px;\n\t}\n\n\t/* The round mic was drawn to sit on the context rail, where it punches a\n\t channel out of the panel behind it. On this rail it is one of two keys a\n\t thumb aims at, so it drops the ring and takes the rail's full height —\n\t a mic that is hard to hit is a mic that loses the sentence. */\n\t.rail :global(.voice-btn-wrapper.round),\n\t.rail :global(.voice-round) {\n\t\twidth: 46px;\n\t\theight: auto;\n\t\talign-self: stretch;\n\t}\n\t/* Record is its own verb, so the mic is filled like the action button is —\n\t red for record, green for send, and nothing else on the bar is filled. */\n\t.rail :global(.voice-round) {\n\t\tborder: 0;\n\t\tborder-radius: 12px;\n\t\tbackground: #b91c1c;\n\t\tcolor: #fff;\n\t\tfont-size: 21px;\n\t\tbox-shadow: none;\n\t}\n\t.rail :global(.voice-round:hover:not(:disabled)) {\n\t\tbackground: #dc2626;\n\t}\n\t.rail :global(.voice-round.recording),\n\t.rail :global(.voice-round.error) {\n\t\tbackground: #ef4444;\n\t}\n\n\t.act-wrap {\n\t\tposition: relative;\n\t\tdisplay: flex;\n\t\talign-items: stretch;\n\t\tflex: none;\n\t}\n\t/* The same rectangle in the same green as the tray's Enter, so the two\n\t ways to submit read as one control that happens to have two homes. */\n\t.act {\n\t\twidth: 46px;\n\t\theight: 100%;\n\t\tmin-height: 56px;\n\t\tborder: 1px solid transparent;\n\t\tborder-radius: 12px;\n\t\tbackground: #15803d;\n\t\tcolor: #f0fdf4;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tfont-size: 22px;\n\t\tcursor: pointer;\n\t\ttouch-action: manipulation;\n\t\tuser-select: none;\n\t\ttransition: background 0.12s;\n\t}\n\t.act:hover:not(:disabled) {\n\t\tbackground: #16a34a;\n\t}\n\t.act:disabled {\n\t\topacity: 0.5;\n\t\tcursor: default;\n\t}\n\t/* Steer sits beside the green send in the card's own grey: the second way\n\t in, not a rival to the first. */\n\t.act.steer {\n\t\tbackground: #292524;\n\t\tborder-color: #3a3532;\n\t\tcolor: #e7e5e4;\n\t}\n\t.act.steer:hover:not(:disabled) {\n\t\tbackground: #3a3532;\n\t}\n\t/* The two steers share one column of the rail, so a phone keeps its field. */\n\t.steers {\n\t\tflex: none;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 4px;\n\t}\n\t.steers .act {\n\t\tflex: 1;\n\t\theight: auto;\n\t\tmin-height: 0;\n\t}\n\n\t.editbar {\n\t\tflex-basis: 100%;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tfont-size: 12px;\n\t\tcolor: #86efac;\n\t}\n\t.editbar.notice {\n\t\tcolor: #a8a29e;\n\t}\n\t.editbar span {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n\t.editbar button {\n\t\theight: 26px;\n\t\tpadding: 0 10px;\n\t\tborder: 0;\n\t\tborder-radius: 6px;\n\t\tbackground: #292524;\n\t\tcolor: #e7e5e4;\n\t\tfont-size: 12px;\n\t\tcursor: pointer;\n\t}\n\t.editbar button:hover {\n\t\tbackground: #3a3532;\n\t}\n\n\n\t/* The header's rare actions return to the status line once there is room\n\t across for them; a phone reaches them through the sheet instead. The\n\t room is the composer's, not the viewport's: the side panel can leave\n\t the session a narrow column on a wide screen. */\n\t.wide-only {\n\t\tdisplay: none;\n\t}\n\t@container composer (min-width: 640px) {\n\t\t.wide-only {\n\t\t\tdisplay: inline-flex;\n\t\t}\n\t}\n\n\t/* Terminal mode's one control the transcript never needed: the pane's\n\t selection, which only exists while you are looking at the pane. */\n\t.copy-sel {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\theight: 32px;\n\t\tpadding: 0 11px;\n\t\tborder: 0;\n\t\tborder-radius: 8px;\n\t\tbackground: #14532d;\n\t\tcolor: #d6f5e0;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 11.5px;\n\t\tflex: none;\n\t\tcursor: pointer;\n\t}\n\t.copy-sel:hover {\n\t\tbackground: #166534;\n\t}\n\n\t/* A composer that runs the full width is a worse composer. */\n\t@media (min-width: 900px) {\n\t\t.cx {\n\t\t\twidth: 100%;\n\t\t\tmax-width: 62rem;\n\t\t\tmargin: 0 auto;\n\t\t}\n\t}\n</style>\n"],"names":["onMountEffect","fn","$.user_effect","untrack","id","$.prop","$$props","useId","width","height","restProps","$.rest_props","rest_excludes","mergedProps","$.derived","mergeProps","$.get","span","root_1","$.attribute_effect","svg","root","$.set_attribute","ref","arrowState","FloatingArrowState","boxWith","v","Arrow","TimeoutFn","#interval","#cb","#timer","cb","interval","onDestroyEffect","#clear","args","tooltipAttrs","createBitsAttrs","TooltipProviderContext","Context","TooltipRootContext","TooltipTriggerRegistryState","#triggers","$.state","$.proxy","value","#activeTriggerNode","activeTriggerId","#activePayload","record","next","#coerceActiveTrigger","firstEntry","TooltipProviderState","opts","simpleBox","#timerFn","#openTooltip","on","e","activeTooltip","triggerNode","target","#startTimer","#clearTimer","tooltip","$.set","TooltipRootState","#delayDuration","#disableHoverableContent","#disableCloseOnTriggerClick","#disabled","#ignoreNonKeyboardFocus","#wasOpenDelayed","#stateAttr","provider","PresenceManager","watch","isOpen","triggerId","#handleDelayedOpen","shouldSkipDelay","delayDuration","firstTriggerId","trigger","isActive","TooltipTriggerState","#isPointerDown","#hasPointerMoveOpened","#transitCheckTimeout","#mounted","#lastRegisteredId","tether","DOMContext","attachRef","#register","#getRoot","#isDisabled","node","payload","disabled","triggerRecord","#clearTransitCheck","#onpointerup","#onpointerdown","#onpointerenter","#onpointermove","#onpointerleave","relatedTarget","isElement","#onfocus","isFocusVisible","#onblur","#onclick","#props","isOpenForTrigger","isDisabled","boolToEmptyStrOrUndef","TooltipContentState","SafePolygon","nodes","activeTriggerNode","#snippetProps","getDataTransitionAttrs","open","onOpenChange","noop","onOpenChangeComplete","rootState","FloatingLayer","$$anchor","$.snippet","$.noop","uid","$.props_id","createId","side","sideOffset","align","avoidCollisions","arrowPadding","sticky","hideWhenDetached","collisionPadding","onInteractOutside","onEscapeKeydown","forceMount","contentState","floatingProps","popper","$$arg0","props","wrapperProps","finalWrapperProps","finalProps","getFloatingContentCSSVars","$0","div","div_1","node_3","$.child","$.reset","PopperLayerForceMount","$.spread_props","div_2","div_3","node_6","$.append","PopperLayer","$$render","consequent_1","consequent_3","type","tabindex","triggerState","button","FloatingLayerArrow","$$value","disableCloseOnTriggerClick","disableHoverableContent","ignoreNonKeyboardFocus","skipDelayDuration","HISTORY_CHUNK","KEEP_AT_BOTTOM","TerminalStore","ReliableWebSocket","#screen","protocol","encodedTarget","event","data","msg","start","lines","end","isLoadMore","curStart","curEnd","fresh","drop","resolve","before","count","base","address","cols","rows","terminalStore","__makeTemplateObject","cooked","raw","PacketKind","AnsiUp","arg","palette","rec","levels","r","g","b","col","grey_level","i","gry","txt","str","pkt","len","pos","next_char","rgx","templateObject_1","match","rpos","rgxG","templateObject_2","templateObject_3","blocks","packet","sgr_cmds","sgr_cmd_str","num","is_foreground","mode_cmd","palette_index","c","fragment","styles","classes","fg","bg","class_string","style_string","parts","tmplObj","subst","regexText","wsrgx","txt2","ansi","OSC8_RE","ANSI_STRIP_RE","escapeAttr","s","isSafeUrl","u","ansiToHtml","input","links","marked","_m","uri","text","html","inner","ansiLineToHtml","line","stripAnsi","themed","frozen","snapHistory","snapStart","snapScreen","wasFrozen","shownHistory","shownStart","shownScreen","screenHtml","pre","$.each","consequent","alternate","alternate_1","ATTACH_DELAY_MS","clickOutside","options","attached","pendingTimer","onDocumentEvent","detach","sync","wantAttached","contextPercent","usage","strip","svgEl","rightEl","path","length","used","left100","color","edgeColor","COMPACT_AT","THRESHOLDS","build","box","card","radius","clear","knob","from","to","detour","d","depth","probe","ro","root_9","path_1","path_2","$.sibling","$.bind_this","node_1","root_8","compact","div_4","$.first_child","fragment_2","div_5","div_6","div_7","span_1","text_2","$.only_child","span_2","text_3","div_8","root_2","span_3","text_4","consequent_2","div_9","root_3","span_4","text_5","p","root_4","p_1","root_5","p_2","root_6","p_3","root_7","text_6","consequent_6","consequent_5","consequent_4","$.action","$$node","$$action_arg","consequent_7","$.set_style","$.delegated","LOAD_FLOOR","usageStore","quota","stats","sessionStore","today","shortLabel","label","model","chips","out","limit","SEVERITY","a","chip","text_1","money","actions","BARS","owned","voiceStore","showing","status","lit","clipping","tooSoft","now","elapsed","formatElapsed","_","$.template_effect","classes_1","$.set_class","iconify_icon","node_2","action","button_1","iconify_icon_1","$.set_custom_element_data","classes_2","$$args","$.set_text","IMAGE_MIME_TYPES","imageMimeFor","dot","STEER_MODES","STEERS","sessionId","paneQueue","busy","editingId","paneDraft","composerHasText","error","drag","listEl","midpoints","total","api","call","method","body","res","remove","move","fromIndex","toIndex","steer","mode","sendNow","onGripKey","index","slotAt","y","slot","mid","onGripDown","item","row","onGripMove","onGripUp","fileName","thumbUrl","Collapsible_Root","Collapsible_Trigger","fragment_3","Collapsible_Content","ul","root_14","li","iconify_icon_2","iconify_icon_3","node_7","dropHere","li_1","root_11","button_2","iconify_icon_4","node_8","img","$1","$2","iconify_icon_5","node_10","span_5","node_12","button_3","fragment_5","iconify_icon_6","node_13","node_14","button_4","iconify_icon_7","consequent_8","button_5","iconify_icon_8","$.event","node_15","li_2","root_13","span_6","iconify_icon_9","node_16","root_12","button_6","iconify_icon_10","consequent_9","consequent_10","supported","isOwner","busyElsewhere","errorMsg","MAX_RECORDING_MS","LONG_TRANSCRIBE_MS","isLongTranscribe","menuOpen","devices","auto","toggleVoice","openMenu","listAudioInputs","canOpenMenu","handleContextMenu","buttonTitle","setLanguage","lang","setDevice","setAutoSubmit","checked","setGain","setNoiseSuppression","showUnsupportedReason","reason","Button","fragment_1","$.index","Checkbox","label_1","$.remove_input_defaults","label_2","node_4","select","option","node_5","option_1","option_1_value","$.init_select","select_value","$.select_option","longPress","armed","REPEAT_DELAY","REPEAT_EVERY","holdTimer","repeatTimer","startRepeat","keys","stopRepeat","ARROWS","CHORDS","EXTRAS","arrow","button_7","button_8","extra","button_9","button_10","chord","button_11","button_12","button_13","button_14","siblings","open_","session","goto","shown","indicatorStateOf","SessionStateIndicator","getSessionDisplayName","sessionStateVisual","TooltipPrimitive_Portal","TooltipPortal","cn","TooltipPrimitive_Content","child","TooltipPrimitive_Arrow","TooltipPrimitive_Provider","TooltipPrimitive_Trigger","TooltipPrimitive_Root","klass","touch","mq","HOLD_MS","bind_get","Tooltip_Root","Tooltip_Trigger","Tooltip_Content","kbd","RELEASE_DATE","CONTEXT_SUFFIX","modelDisplayName","rest","context","suffix","family","version","part","tail","pieces","pinned","query","commands","loading","activeIndex","loadedFor","KIND_LABEL","KIND_COLOR","key","reload","force","qs","filtered","q","pinSet","scored","score","scoreCommand","x","kindOrder","pa","pb","ko","tick","choose","chooseActive","handleKeydown","scrollActiveIntoView","sourceLabel","inputEl","list","insert","onKeydown","Dialog_Root","Dialog_Content","Dialog_Title","Dialog_Description","CommandList","STICK_DEADZONE","BUTTON_INDEX","DEFAULT_REPEAT","REPEAT_INITIAL_MS","REPEAT_INTERVAL_MS","pressFn","h","releaseFn","shouldRepeat","name","useGamepad","buttons","axes","enabled","raf","active","pressed","repeatStartTimers","repeatIntervals","clearRepeat","idx","scheduleRepeat","poll","pads","pad","map","btn","isDown","wasDown","handler","stop","onConnect","onDisconnect","DEFAULT_MODE","persisted","createPersisted","ViewModesStore","#state","viewModesStore","SheetPrimitive_Overlay","SheetPrimitive_Portal","showCloseButton","SheetPortal","SheetOverlay","SheetPrimitive_Content","XIcon","SheetPrimitive_Close","SheetPrimitive_Title","SheetPrimitive_Root","mounted","header","PANES","pane","DiffBadge","paneKeys","Hint","MAXIMIZE_KEYS","CLOSE_KEYS","readPaneParams","pane_body","own","Toggle","pick","Popover_Root","Popover_Trigger","Popover_Content","SidePanelStore","patch","sidePanelStore","REM","INLINE_MEDIA_QUERY","PHONE_MEDIA_QUERY","DEFAULT_WIDTH_CSS","PANEL_MIN_PX","SESSION_MIN_PX","DIVIDER_PX","dragWidth","pointerX","rowRight","rowWidth","attachMenu","openPicker","isTouchDevice","fragment_4","statusLine","root_17","SessionSheet","sheetOpen","sheetActions","showConfirmKill","indicatorState","remoteHost","embed","a_1","fragment_6","route","machineBlocked","paneFocused","fragment_7","statusWants","statusSay","fragment_8","modelName","viewMode","root_10","text_7","paneUpdate","UPDATE_LABEL","isBusy","showConfirmRestart","slashRestart","restartSession","running","upgrade","upgrading","currentSession","fragment_10","text_8","text_9","isIdle","upgradeSession","text_10","isAlive","isClaudeSession","span_7","root_15","RemoteControlMenu","rcPending","rcActions","panelKind","PanelToggle","togglePanel","consequent_11","MOD_LABEL","drawer","consequent_12","toggleView","canTranscript","consequent_13","span_8","root_16","node_21","tellPane","node_22","node_23","consequent_14","composerField","textarea_1","root_18","$.remove_textarea_child","textareaElement","$.attach","keepsCaret","modArmed","handleKeyup","syncCaret","handleBeforeInput","handleBlur","autoResize","handlePaste","textInput","$page","voiceEnabled","routeMachine","machineHost","blockedReason","clock","formatRef","sessionApiAt","tmuxPane","isPlainPane","claudeSessionDead","REMOTE_MISSING_GRACE_MS","remoteGone","remoteMissing","settle","targetMissing","paneIsDead","attention","attentionPrefix","fleetStore","pageTitle","pageVisible","onMount","onVisibility","lastVisit","turn","isUnread","postVisit","statusText","paneSide","serverStore","onMessage","onPointer","onKeys","wanted","param","params","navigateQuery","replaceState","kind","readPanel","PANE_KINDS","paneDef","panelPrefs","inlineQuery","MediaQuery","phoneQuery","panelInline","panelPhone","panelKept","panelColumnKind","panelMaximized","panelDragWidth","panelResizing","sessionRow","panelWidth","panelWidthCss","openPanel","panelQuery","PANE_PARAMS","togglePane","setPaneParams","mentionInComposer","gap","focusComposerEnd","quoteInComposer","appendQuote","paneLink","openGithub","fileLink","changesLink","file","turnChanges","changesSessionId","turnEnded","sessionChanges","fallbackRoot","stale","load","changes","again","toggleMaximize","resizePanel","rect","endPanelResize","handlePanelKeys","panelKeyAction","done","heldDelivery","said","dictated","editing","editNotice","moreOpen","commandsOpen","attachPickerOpen","attachStackOpen","ctrlCount","altCount","trayOpen","chordMenuOpen","chordIndex","chordItems","chordTitle","chordStickArmed","chordStickX","chordStickY","showCopied","CHORD_STICK_DEADZONE","CHORD_RING_THRESHOLD","CHORD_RING_RADII","CHORD_CURSOR_RADIUS_PX","chordInnerCount","chordRings","items","chordPositions","ring","ringIdx","angle","headerActions","copyTmuxCmd","handleResize","url","copyWithToast","turnRemoteControl","ctrlActions","sendKeys","slashActions","runText","attachments","attachmentsStore","cameraInput","galleryInput","filesInput","dropActive","canSend","readyPaths","hasDraft","suggestion","actionKind","ACTIONS","actionLabel","actionIcon","hasAttachments","anyFailed","anyUploading","wantsKeypress","ARROW_KEYS","handleGlobalKeys","handleChooserKeys","isVoiceHotkey","paneChoice","paneTyping","overlayOpen","TYPING_TAGS","el","o","focusDialogField","outputElement","renameId","ctrlTapCandidate","altTapCandidate","transcriptStore","queue","queueCount","findEntry","REVEAL_PAGES","revealEntry","userScrolledUp","pendingReveal","onReveal","liveRowVisible","CLEAR_PROMPT_KEYS","moreKeys","pinnedCommands","fillInput","slashDismissedFor","showSelectionCopied","selectedText","measureCanvas","hasSelection","sel","selActive","seenAppended","appendedNow","unseenLines","measureFont","ctx","calculateTerminalSize","padding","innerWidth","innerHeight","charW","charH","size","onDestroy","afterNavigate","urlTarget","parseSessionPath","reportClient","STORAGE_KEYS","$.user_pre_effect","t","draftsStore","handleScroll","scrollTop","scrollHeight","clientHeight","nextScrolledUp","captureAnchor","pending","holdPlaceThrough","nativeScrollAnchoring","anchorNode","anchorOffset","anchorRows","top","lo","hi","restoreAnchor","drift","fromBottom","scrollToBottom","postToPane","sendPaneText","rewind","why","toast","DOUBLE_TAP_MS","emptyEnterTimer","sendFromButton","sendText","acceptSuggestion","saveEdit","deliver","composed","clearSent","sent","post","message","sendReply","sendTextRaw","RC_PENDING_MS","way","rcOn","timer","how","steerText","nowText","startEdit","cancelEdit","orphanEdit","aside","m","syncHeldDelivery","makeLocalId","doUpload","owner","localId","signal","form","err","uploadAttachment","thumb","abort","uploadFiles","files","f","retryAttachment","removeAttachment","handlePickerInput","which","counter","hasFiles","onEnter","onLeave","onOver","onDrop","speaking","finishVoice","run","heard","insertSaid","spot","caretOf","putCaret","voiceActions","first","steerable","cycleCtrl","cycleAlt","canSteer","state","slashList","caretPos","slashToken","slashKey","slashOpen","slashQuery","chooseSlash","tok","after","sep","dismissSlash","chordStep","delta","n","openChord","title","innerCount","closeChord","releaseChord","overflowY","lx","ly","mag","rings","norm","localIdx","offset","sidebarActionsStore","sendModSequence","prefix","tokens","mod","FIELD_MIN","FIELD_MAX","newHeight","killSession","hasSlashRestart","UPGRADE_WAIT_MS","started","ours","left","giveUp","copySelection","textarea","cmd","$.window","$.head","$.document","root_20","text_11","root_19","span_9","text_12","div_10","text_13","classes_3","classes_4","styles_1","classes_5","consequent_15","RenameSessionDialog","node_25","Tooltip_Provider","div_11","fragment_16","sidePanel","SidePanel","div_12","div_13","div_14","input_1","input_2","input_3","node_28","TranscriptView","sessionPath","TerminalView","preferences","consequent_16","swipe","node_30","root_22","node_31","span_10","root_21","text_14","consequent_17","consequent_18","node_32","$3","$4","QueueStrip","consequent_19","div_15","node_33","ContextGauge","VoiceMeter","KeyTray","node_34","node_35","div_16","div_17","div_18","node_36","div_19","root_23","node_37","consequent_20","iconify_icon_11","fragment_26","span_11","text_15","$.clsx","Popover_Content_1","div_20","fragment_27","att","div_21","root_28","node_42","root_24","span_12","root_25","iconify_icon_12","consequent_21","alternate_2","span_13","text_16","node_43","iconify_icon_13","root_26","root_27","iconify_icon_14","consequent_23","iconify_icon_15","classes_9","node_44","root_29","consequent_24","consequent_25","div_22","root_32","iconify_icon_16","div_23","root_33","iconify_icon_17","span_14","text_17","consequent_27","node_46","div_24","node_47","root_34","iconify_icon_18","consequent_28","root_35","iconify_icon_19","consequent_29","Popover_Root_1","Popover_Trigger_1","iconify_icon_20","node_51","node_52","Popover_Root_2","Popover_Trigger_2","iconify_icon_21","Popover_Content_2","div_25","root_36","iconify_icon_22","fragment_31","span_15","text_19","consequent_30","node_57","RailStats","node_58","div_26","node_59","VoiceButton","consequent_31","div_27","iconify_icon_23","node_60","div_28","root_37","iconify_icon_24","iconify_icon_25","consequent_32","node_61","div_29","fragment_35","node_63","ResizeDivider","aside_1","node_64","div_30","root_38","consequent_33","consequent_34","Sheet_Root","Sheet_Content","Sheet_Title","consequent_36","consequent_35","alternate_3","classes_7","node_70","CommandPalette","AlertDialog_Root","AlertDialog_Content","AlertDialog_Header","AlertDialog_Title","AlertDialog_Description","AlertDialog_Footer","AlertDialog_Cancel","AlertDialog_Action","AlertDialog_Root_1","AlertDialog_Content_1","AlertDialog_Header_1","AlertDialog_Title_1","AlertDialog_Description_1","consequent_37","AlertDialog_Footer_1","AlertDialog_Cancel_1","AlertDialog_Action_1","div_31","root_41","iconify_icon_26","consequent_38","classes_6","styles_2"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,11]}
|
|
1
|
+
{"version":3,"file":"B4FaHfAQ.js","sources":["../../../../../../../node_modules/.bun/svelte-toolbelt@0.10.6+ec0a64a97e9eb16b/node_modules/svelte-toolbelt/dist/utils/on-mount-effect.svelte.js","../../../../../../../node_modules/.bun/bits-ui@2.20.2+2df16ea90105ef5c/node_modules/bits-ui/dist/bits/utilities/arrow/arrow.svelte","../../../../../../../node_modules/.bun/bits-ui@2.20.2+2df16ea90105ef5c/node_modules/bits-ui/dist/bits/utilities/floating-layer/components/floating-layer-arrow.svelte","../../../../../../../node_modules/.bun/bits-ui@2.20.2+2df16ea90105ef5c/node_modules/bits-ui/dist/internal/timeout-fn.js","../../../../../../../node_modules/.bun/bits-ui@2.20.2+2df16ea90105ef5c/node_modules/bits-ui/dist/bits/tooltip/tooltip.svelte.js","../../../../../../../node_modules/.bun/bits-ui@2.20.2+2df16ea90105ef5c/node_modules/bits-ui/dist/bits/tooltip/components/tooltip.svelte","../../../../../../../node_modules/.bun/bits-ui@2.20.2+2df16ea90105ef5c/node_modules/bits-ui/dist/bits/tooltip/components/tooltip-content.svelte","../../../../../../../node_modules/.bun/bits-ui@2.20.2+2df16ea90105ef5c/node_modules/bits-ui/dist/bits/tooltip/components/tooltip-trigger.svelte","../../../../../../../node_modules/.bun/bits-ui@2.20.2+2df16ea90105ef5c/node_modules/bits-ui/dist/bits/tooltip/components/tooltip-arrow.svelte","../../../../../../../node_modules/.bun/bits-ui@2.20.2+2df16ea90105ef5c/node_modules/bits-ui/dist/bits/tooltip/components/tooltip-provider.svelte","../../../../../../src/lib/stores/terminal.svelte.ts","../../../../../../../node_modules/.bun/ansi_up@6.0.6/node_modules/ansi_up/ansi_up.js","../../../../../../src/lib/terminal/ansi.ts","../../../../../../src/lib/components/TerminalView.svelte","../../../../../../src/lib/actions/clickOutside.ts","../../../../../../../src/transcript/context.ts","../../../../../../src/lib/components/ContextGauge.svelte","../../../../../../src/lib/components/RailStats.svelte","../../../../../../src/lib/components/VoiceMeter.svelte","../../../../../../../src/utils/image-types.ts","../../../../../../src/lib/components/QueueStrip.svelte","../../../../../../src/lib/components/VoiceButton.svelte","../../../../../../src/lib/components/KeyTray.svelte","../../../../../../src/lib/components/SessionSheet.svelte","../../../../../../src/lib/components/ui/tooltip/tooltip-portal.svelte","../../../../../../src/lib/components/ui/tooltip/tooltip-content.svelte","../../../../../../src/lib/components/ui/tooltip/tooltip-provider.svelte","../../../../../../src/lib/components/ui/tooltip/tooltip-trigger.svelte","../../../../../../src/lib/components/ui/tooltip/tooltip.svelte","../../../../../../src/lib/components/Hint.svelte","../../../../../../../src/claude/model-name.ts","../../../../../../src/lib/components/CommandList.svelte","../../../../../../src/lib/components/CommandPalette.svelte","../../../../../../src/lib/gamepad.svelte.ts","../../../../../../src/lib/stores/viewModes.svelte.ts","../../../../../../src/lib/components/ui/sheet/sheet-overlay.svelte","../../../../../../src/lib/components/ui/sheet/sheet-portal.svelte","../../../../../../src/lib/components/ui/sheet/sheet-content.svelte","../../../../../../src/lib/components/ui/sheet/sheet-title.svelte","../../../../../../src/lib/components/ui/sheet/sheet.svelte","../../../../../../src/lib/components/side-panel/SidePanel.svelte","../../../../../../src/lib/components/side-panel/PanelToggle.svelte","../../../../../../src/lib/components/RemoteControlMenu.svelte","../../../../../../src/lib/stores/sidePanel.svelte.ts","../../../../../../src/lib/side-panel/layout.ts","../../../../../../src/routes/session/[target]/+page.svelte"],"sourcesContent":["import { untrack } from \"svelte\";\nexport function onMountEffect(fn) {\n $effect(() => {\n const cleanup = untrack(() => fn());\n return cleanup;\n });\n}\n","<script lang=\"ts\">\n\timport { mergeProps } from \"svelte-toolbelt\";\n\timport type { ArrowProps } from \"./types.js\";\n\timport { useId } from \"../../../internal/use-id.js\";\n\n\tlet {\n\t\tid = useId(),\n\t\tchildren,\n\t\tchild,\n\t\twidth = 10,\n\t\theight = 5,\n\t\t...restProps\n\t}: ArrowProps = $props();\n\n\tconst mergedProps = $derived(mergeProps(restProps, { id }));\n</script>\n\n{#if child}\n\t{@render child({ props: mergedProps })}\n{:else}\n\t<span {...mergedProps}>\n\t\t{#if children}\n\t\t\t{@render children?.()}\n\t\t{:else}\n\t\t\t<svg {width} {height} viewBox=\"0 0 30 10\" preserveAspectRatio=\"none\" data-arrow=\"\">\n\t\t\t\t<polygon points=\"0,0 30,0 15,10\" fill=\"currentColor\" />\n\t\t\t</svg>\n\t\t{/if}\n\t</span>\n{/if}\n","<script lang=\"ts\">\n\timport { boxWith, mergeProps } from \"svelte-toolbelt\";\n\timport { FloatingArrowState } from \"../use-floating-layer.svelte.js\";\n\timport { Arrow, type ArrowProps } from \"../../arrow/index.js\";\n\timport { useId } from \"../../../../internal/use-id.js\";\n\n\tlet { id = useId(), ref = $bindable(null), ...restProps }: ArrowProps = $props();\n\n\tconst arrowState = FloatingArrowState.create({\n\t\tid: boxWith(() => id),\n\t\tref: boxWith(\n\t\t\t() => ref,\n\t\t\t(v) => (ref = v)\n\t\t),\n\t});\n\n\tconst mergedProps = $derived(mergeProps(restProps, arrowState.props));\n</script>\n\n<Arrow {...mergedProps} />\n","import { onDestroyEffect } from \"svelte-toolbelt\";\nexport class TimeoutFn {\n #interval;\n #cb;\n #timer = null;\n constructor(cb, interval) {\n this.#cb = cb;\n this.#interval = interval;\n this.stop = this.stop.bind(this);\n this.start = this.start.bind(this);\n onDestroyEffect(this.stop);\n }\n #clear() {\n if (this.#timer !== null) {\n window.clearTimeout(this.#timer);\n this.#timer = null;\n }\n }\n stop() {\n this.#clear();\n }\n start(...args) {\n this.#clear();\n this.#timer = window.setTimeout(() => {\n this.#timer = null;\n this.#cb(...args);\n }, this.#interval);\n }\n}\n","import { onMountEffect, attachRef, DOMContext, simpleBox, boxWith, } from \"svelte-toolbelt\";\nimport { on } from \"svelte/events\";\nimport { Context, watch } from \"runed\";\nimport { isElement, isFocusVisible } from \"../../internal/is.js\";\nimport { createBitsAttrs, boolToEmptyStrOrUndef, getDataTransitionAttrs, } from \"../../internal/attrs.js\";\nimport { TimeoutFn } from \"../../internal/timeout-fn.js\";\nimport { SafePolygon } from \"../../internal/safe-polygon.svelte.js\";\nimport { PresenceManager } from \"../../internal/presence-manager.svelte.js\";\nexport const tooltipAttrs = createBitsAttrs({\n component: \"tooltip\",\n parts: [\"content\", \"trigger\"],\n});\nconst TooltipProviderContext = new Context(\"Tooltip.Provider\");\nconst TooltipRootContext = new Context(\"Tooltip.Root\");\nclass TooltipTriggerRegistryState {\n triggers = $state(new Map());\n activeTriggerId = $state(null);\n activeTriggerNode = $derived.by(() => {\n const activeTriggerId = this.activeTriggerId;\n if (activeTriggerId === null)\n return null;\n return this.triggers.get(activeTriggerId)?.node ?? null;\n });\n activePayload = $derived.by(() => {\n const activeTriggerId = this.activeTriggerId;\n if (activeTriggerId === null)\n return null;\n return this.triggers.get(activeTriggerId)?.payload ?? null;\n });\n register = (record) => {\n const next = new Map(this.triggers);\n next.set(record.id, record);\n this.triggers = next;\n this.#coerceActiveTrigger();\n };\n update = (record) => {\n const next = new Map(this.triggers);\n next.set(record.id, record);\n this.triggers = next;\n this.#coerceActiveTrigger();\n };\n unregister = (id) => {\n if (!this.triggers.has(id))\n return;\n const next = new Map(this.triggers);\n next.delete(id);\n this.triggers = next;\n if (this.activeTriggerId === id) {\n this.activeTriggerId = null;\n }\n };\n setActiveTrigger = (id) => {\n if (id === null) {\n this.activeTriggerId = null;\n return;\n }\n if (!this.triggers.has(id)) {\n this.activeTriggerId = null;\n return;\n }\n this.activeTriggerId = id;\n };\n get = (id) => {\n return this.triggers.get(id);\n };\n has = (id) => {\n return this.triggers.has(id);\n };\n getFirstTriggerId = () => {\n const firstEntry = this.triggers.entries().next();\n if (firstEntry.done)\n return null;\n return firstEntry.value[0];\n };\n #coerceActiveTrigger = () => {\n const activeTriggerId = this.activeTriggerId;\n if (activeTriggerId === null)\n return;\n if (!this.triggers.has(activeTriggerId)) {\n this.activeTriggerId = null;\n }\n };\n}\nclass TooltipTetherState {\n registry = new TooltipTriggerRegistryState();\n root = $state(null);\n}\n// oxlint-disable-next-line no-unused-vars\nexport class TooltipTether {\n #state = new TooltipTetherState();\n get state() {\n return this.#state;\n }\n open(triggerId) {\n if (!this.#state.registry.has(triggerId)) {\n return;\n }\n this.#state.registry.setActiveTrigger(triggerId);\n this.#state.root?.setActiveTrigger(triggerId);\n this.#state.root?.handleOpen();\n }\n close() {\n this.#state.root?.handleClose();\n }\n get isOpen() {\n return this.#state.root?.opts.open.current ?? false;\n }\n}\nexport function createTooltipTether() {\n return new TooltipTether();\n}\nexport class TooltipProviderState {\n static create(opts) {\n return TooltipProviderContext.set(new TooltipProviderState(opts));\n }\n opts;\n isOpenDelayed = $state(true);\n isPointerInTransit = simpleBox(false);\n #timerFn;\n #openTooltip = $state(null);\n constructor(opts) {\n this.opts = opts;\n this.#timerFn = new TimeoutFn(() => {\n this.isOpenDelayed = true;\n }, this.opts.skipDelayDuration.current);\n onMountEffect(() => on(window, \"scroll\", (e) => {\n const activeTooltip = this.#openTooltip;\n if (!activeTooltip)\n return;\n const triggerNode = activeTooltip.triggerNode;\n if (!triggerNode)\n return;\n const target = e.target;\n if (!(target instanceof Element || target instanceof Document))\n return;\n if (target.contains(triggerNode)) {\n activeTooltip.handleClose();\n }\n }, \n // An element's scroll does not bubble, so only the capture phase sees it.\n { capture: true, passive: true }));\n }\n #startTimer = () => {\n const skipDuration = this.opts.skipDelayDuration.current;\n if (skipDuration === 0) {\n // no grace period — reset immediately so next trigger waits the full delay\n this.isOpenDelayed = true;\n return;\n }\n else {\n this.#timerFn.start();\n }\n };\n #clearTimer = () => {\n this.#timerFn.stop();\n };\n onOpen = (tooltip) => {\n if (this.#openTooltip && this.#openTooltip !== tooltip) {\n this.#openTooltip.handleClose();\n }\n this.#clearTimer();\n this.isOpenDelayed = false;\n this.#openTooltip = tooltip;\n };\n onClose = (tooltip) => {\n if (this.#openTooltip === tooltip) {\n this.#openTooltip = null;\n this.#startTimer();\n }\n };\n isTooltipOpen = (tooltip) => {\n return this.#openTooltip === tooltip;\n };\n}\nexport class TooltipRootState {\n static create(opts) {\n return TooltipRootContext.set(new TooltipRootState(opts, TooltipProviderContext.get()));\n }\n opts;\n provider;\n delayDuration = $derived.by(() => this.opts.delayDuration.current ?? this.provider.opts.delayDuration.current);\n disableHoverableContent = $derived.by(() => this.opts.disableHoverableContent.current ??\n this.provider.opts.disableHoverableContent.current);\n disableCloseOnTriggerClick = $derived.by(() => this.opts.disableCloseOnTriggerClick.current ??\n this.provider.opts.disableCloseOnTriggerClick.current);\n disabled = $derived.by(() => this.opts.disabled.current ?? this.provider.opts.disabled.current);\n ignoreNonKeyboardFocus = $derived.by(() => this.opts.ignoreNonKeyboardFocus.current ??\n this.provider.opts.ignoreNonKeyboardFocus.current);\n registry;\n tether;\n contentNode = $state(null);\n contentPresence;\n #wasOpenDelayed = $state(false);\n #timerFn;\n stateAttr = $derived.by(() => {\n if (!this.opts.open.current)\n return \"closed\";\n return this.#wasOpenDelayed ? \"delayed-open\" : \"instant-open\";\n });\n constructor(opts, provider) {\n this.opts = opts;\n this.provider = provider;\n this.tether = opts.tether.current?.state ?? null;\n this.registry = this.tether?.registry ?? new TooltipTriggerRegistryState();\n this.#timerFn = new TimeoutFn(() => {\n this.#wasOpenDelayed = true;\n this.opts.open.current = true;\n }, this.delayDuration ?? 0);\n if (this.tether) {\n this.tether.root = this;\n onMountEffect(() => {\n return () => {\n if (this.tether?.root === this) {\n this.tether.root = null;\n }\n };\n });\n }\n this.contentPresence = new PresenceManager({\n open: this.opts.open,\n ref: boxWith(() => this.contentNode),\n onComplete: () => {\n this.opts.onOpenChangeComplete.current(this.opts.open.current);\n },\n });\n watch(() => this.delayDuration, () => {\n if (this.delayDuration === undefined)\n return;\n this.#timerFn = new TimeoutFn(() => {\n this.#wasOpenDelayed = true;\n this.opts.open.current = true;\n }, this.delayDuration);\n });\n watch(() => this.opts.open.current, (isOpen) => {\n if (isOpen) {\n this.ensureActiveTrigger();\n this.provider.onOpen(this);\n }\n else {\n this.provider.onClose(this);\n }\n }, { lazy: true });\n watch(() => this.opts.triggerId.current, (triggerId) => {\n if (triggerId === this.registry.activeTriggerId)\n return;\n this.registry.setActiveTrigger(triggerId);\n });\n watch(() => this.registry.activeTriggerId, (activeTriggerId) => {\n if (this.opts.triggerId.current === activeTriggerId)\n return;\n this.opts.triggerId.current = activeTriggerId;\n });\n }\n handleOpen = () => {\n this.#timerFn.stop();\n this.#wasOpenDelayed = false;\n this.ensureActiveTrigger();\n this.opts.open.current = true;\n };\n handleClose = () => {\n this.#timerFn.stop();\n this.opts.open.current = false;\n };\n /** Stops a pending delayed open without touching the open state. */\n cancelPendingOpen = () => {\n this.#timerFn.stop();\n };\n #handleDelayedOpen = () => {\n this.#timerFn.stop();\n const shouldSkipDelay = !this.provider.isOpenDelayed;\n const delayDuration = this.delayDuration ?? 0;\n // if no delay needed (either skip delay active or delay is 0), open immediately\n if (shouldSkipDelay || delayDuration === 0) {\n this.#wasOpenDelayed = false;\n this.opts.open.current = true;\n }\n else {\n // use timer for actual delays\n this.#timerFn.start();\n }\n };\n onTriggerEnter = (triggerId) => {\n this.setActiveTrigger(triggerId);\n this.#handleDelayedOpen();\n };\n onTriggerLeave = () => {\n if (this.disableHoverableContent) {\n this.handleClose();\n }\n else {\n this.#timerFn.stop();\n }\n };\n ensureActiveTrigger = () => {\n if (this.registry.activeTriggerId !== null &&\n this.registry.has(this.registry.activeTriggerId)) {\n return;\n }\n if (this.opts.triggerId.current !== null &&\n this.registry.has(this.opts.triggerId.current)) {\n this.registry.setActiveTrigger(this.opts.triggerId.current);\n return;\n }\n const firstTriggerId = this.registry.getFirstTriggerId();\n this.registry.setActiveTrigger(firstTriggerId);\n };\n setActiveTrigger = (triggerId) => {\n this.registry.setActiveTrigger(triggerId);\n };\n registerTrigger = (trigger) => {\n this.registry.register(trigger);\n if (trigger.disabled &&\n this.registry.activeTriggerId === trigger.id &&\n this.opts.open.current) {\n this.handleClose();\n }\n };\n updateTrigger = (trigger) => {\n this.registry.update(trigger);\n if (trigger.disabled &&\n this.registry.activeTriggerId === trigger.id &&\n this.opts.open.current) {\n this.handleClose();\n }\n };\n unregisterTrigger = (id) => {\n const isActive = this.registry.activeTriggerId === id;\n this.registry.unregister(id);\n if (isActive && this.opts.open.current) {\n this.handleClose();\n }\n };\n isActiveTrigger = (triggerId) => {\n return this.registry.activeTriggerId === triggerId;\n };\n get triggerNode() {\n return this.registry.activeTriggerNode;\n }\n get activePayload() {\n return this.registry.activePayload;\n }\n get activeTriggerId() {\n return this.registry.activeTriggerId;\n }\n}\nexport class TooltipTriggerState {\n static create(opts) {\n if (opts.tether.current) {\n return new TooltipTriggerState(opts, null, opts.tether.current.state);\n }\n return new TooltipTriggerState(opts, TooltipRootContext.get(), null);\n }\n opts;\n root;\n tether;\n attachment;\n #isPointerDown = simpleBox(false);\n #hasPointerMoveOpened = $state(false);\n domContext;\n #transitCheckTimeout = null;\n #mounted = false;\n #lastRegisteredId = null;\n constructor(opts, root, tether) {\n this.opts = opts;\n this.root = root;\n this.tether = tether;\n this.domContext = new DOMContext(opts.ref);\n this.attachment = attachRef(this.opts.ref, (v) => this.#register(v));\n watch(() => this.opts.id.current, () => {\n this.#register(this.opts.ref.current);\n });\n watch(() => this.opts.payload.current, () => {\n this.#register(this.opts.ref.current);\n });\n watch(() => this.opts.disabled.current, () => {\n this.#register(this.opts.ref.current);\n });\n onMountEffect(() => {\n this.#mounted = true;\n this.#register(this.opts.ref.current);\n return () => {\n const root = this.#getRoot();\n const id = this.#lastRegisteredId;\n if (id) {\n if (this.tether) {\n this.tether.registry.unregister(id);\n }\n else {\n root?.unregisterTrigger(id);\n }\n }\n this.#lastRegisteredId = null;\n this.#mounted = false;\n };\n });\n }\n #getRoot = () => {\n return this.tether?.root ?? this.root;\n };\n #isDisabled = () => {\n const root = this.#getRoot();\n return this.opts.disabled.current || Boolean(root?.disabled);\n };\n #register = (node) => {\n if (!this.#mounted)\n return;\n const id = this.opts.id.current;\n const payload = this.opts.payload.current;\n const disabled = this.opts.disabled.current;\n if (this.#lastRegisteredId && this.#lastRegisteredId !== id) {\n const root = this.#getRoot();\n if (this.tether) {\n this.tether.registry.unregister(this.#lastRegisteredId);\n }\n else {\n root?.unregisterTrigger(this.#lastRegisteredId);\n }\n }\n const triggerRecord = {\n id,\n node,\n payload,\n disabled,\n };\n const root = this.#getRoot();\n if (this.tether) {\n if (this.tether.registry.has(id)) {\n this.tether.registry.update(triggerRecord);\n }\n else {\n this.tether.registry.register(triggerRecord);\n }\n if (disabled &&\n this.tether.registry.activeTriggerId === id &&\n root?.opts.open.current) {\n root.handleClose();\n }\n }\n else {\n if (root?.registry.has(id)) {\n root.updateTrigger(triggerRecord);\n }\n else {\n root?.registerTrigger(triggerRecord);\n }\n }\n this.#lastRegisteredId = id;\n };\n #clearTransitCheck = () => {\n if (this.#transitCheckTimeout !== null) {\n clearTimeout(this.#transitCheckTimeout);\n this.#transitCheckTimeout = null;\n }\n };\n handlePointerUp = () => {\n this.#isPointerDown.current = false;\n };\n #onpointerup = () => {\n if (this.#isDisabled())\n return;\n this.#isPointerDown.current = false;\n };\n #onpointerdown = () => {\n if (this.#isDisabled())\n return;\n const root = this.#getRoot();\n // close on pointerdown regardless of button so right/middle click dismiss the\n // tooltip too, and so a pending open timer is cancelled before `contextmenu` fires\n if (root && !root.disableCloseOnTriggerClick) {\n if (root.opts.open.current) {\n root.handleClose();\n }\n else {\n root.cancelPendingOpen();\n }\n }\n this.#isPointerDown.current = true;\n this.domContext.getDocument().addEventListener(\"pointerup\", () => {\n this.handlePointerUp();\n }, { once: true });\n };\n #onpointerenter = (e) => {\n const root = this.#getRoot();\n if (!root)\n return;\n if (this.#isDisabled()) {\n if (root.opts.open.current) {\n root.handleClose();\n }\n return;\n }\n if (e.pointerType === \"touch\")\n return;\n // if in transit, wait briefly to see if user is actually heading to old content or staying here\n if (root.provider.isPointerInTransit.current) {\n this.#clearTransitCheck();\n this.#transitCheckTimeout = window.setTimeout(() => {\n // if still in transit after delay, user is likely staying on this trigger\n if (root.provider.isPointerInTransit.current) {\n root.provider.isPointerInTransit.current = false;\n root.onTriggerEnter(this.opts.id.current);\n this.#hasPointerMoveOpened = true;\n }\n }, 250);\n return;\n }\n root.onTriggerEnter(this.opts.id.current);\n this.#hasPointerMoveOpened = true;\n };\n #onpointermove = (e) => {\n const root = this.#getRoot();\n if (!root)\n return;\n if (this.#isDisabled()) {\n if (root.opts.open.current) {\n root.handleClose();\n }\n return;\n }\n if (e.pointerType === \"touch\")\n return;\n if (this.#hasPointerMoveOpened)\n return;\n // moving within trigger means we're definitely not in transit anymore\n this.#clearTransitCheck();\n root.provider.isPointerInTransit.current = false;\n root.onTriggerEnter(this.opts.id.current);\n this.#hasPointerMoveOpened = true;\n };\n #onpointerleave = (e) => {\n const root = this.#getRoot();\n if (!root)\n return;\n if (this.#isDisabled())\n return;\n this.#clearTransitCheck();\n if (!root.isActiveTrigger(this.opts.id.current)) {\n this.#hasPointerMoveOpened = false;\n return;\n }\n const relatedTarget = e.relatedTarget;\n // when moving to a sibling trigger and skip delay is active, don't close —\n // the sibling's enter handler will switch the active trigger instantly.\n // if skipDelayDuration is 0 there's no grace period, so close now and let\n // the sibling wait through the full delay (and re-animate).\n if (isElement(relatedTarget)) {\n for (const record of root.registry.triggers.values()) {\n if (record.node !== relatedTarget)\n continue;\n if (root.provider.opts.skipDelayDuration.current > 0) {\n this.#hasPointerMoveOpened = false;\n return;\n }\n root.handleClose();\n this.#hasPointerMoveOpened = false;\n return;\n }\n }\n root.onTriggerLeave();\n this.#hasPointerMoveOpened = false;\n };\n #onfocus = (e) => {\n const root = this.#getRoot();\n if (!root)\n return;\n if (this.#isPointerDown.current)\n return;\n if (this.#isDisabled()) {\n if (root.opts.open.current) {\n root.handleClose();\n }\n return;\n }\n if (root.ignoreNonKeyboardFocus && !isFocusVisible(e.currentTarget))\n return;\n root.setActiveTrigger(this.opts.id.current);\n root.handleOpen();\n };\n #onblur = () => {\n const root = this.#getRoot();\n if (!root || this.#isDisabled())\n return;\n root.handleClose();\n };\n #onclick = () => {\n const root = this.#getRoot();\n if (!root || root.disableCloseOnTriggerClick || this.#isDisabled())\n return;\n root.handleClose();\n };\n props = $derived.by(() => {\n const root = this.#getRoot();\n const isOpenForTrigger = Boolean(root?.opts.open.current && root.isActiveTrigger(this.opts.id.current));\n const isDisabled = this.#isDisabled();\n return {\n id: this.opts.id.current,\n \"aria-describedby\": isOpenForTrigger ? root?.contentNode?.id : undefined,\n \"data-state\": isOpenForTrigger ? root?.stateAttr : \"closed\",\n \"data-disabled\": boolToEmptyStrOrUndef(isDisabled),\n \"data-delay-duration\": `${root?.delayDuration ?? 0}`,\n [tooltipAttrs.trigger]: \"\",\n tabindex: isDisabled ? undefined : this.opts.tabindex.current,\n disabled: this.opts.disabled.current,\n onpointerup: this.#onpointerup,\n onpointerdown: this.#onpointerdown,\n onpointerenter: this.#onpointerenter,\n onpointermove: this.#onpointermove,\n onpointerleave: this.#onpointerleave,\n onfocus: this.#onfocus,\n onblur: this.#onblur,\n onclick: this.#onclick,\n ...this.attachment,\n };\n });\n}\nexport class TooltipContentState {\n static create(opts) {\n return new TooltipContentState(opts, TooltipRootContext.get());\n }\n opts;\n root;\n attachment;\n constructor(opts, root) {\n this.opts = opts;\n this.root = root;\n this.attachment = attachRef(this.opts.ref, (v) => (this.root.contentNode = v));\n new SafePolygon({\n triggerNode: () => this.root.triggerNode,\n contentNode: () => this.root.contentNode,\n enabled: () => this.root.opts.open.current && !this.root.disableHoverableContent,\n transitIntentTimeout: 180,\n ignoredTargets: () => {\n // only skip closing for sibling triggers when there's a skip-delay grace period;\n // with skipDelayDuration=0 the close+reopen is intentional (full delay + re-animation)\n if (this.root.provider.opts.skipDelayDuration.current === 0)\n return [];\n const nodes = [];\n const activeTriggerNode = this.root.triggerNode;\n for (const record of this.root.registry.triggers.values()) {\n if (record.node && record.node !== activeTriggerNode) {\n nodes.push(record.node);\n }\n }\n return nodes;\n },\n onPointerExit: () => {\n if (this.root.provider.isTooltipOpen(this.root)) {\n this.root.handleClose();\n }\n },\n });\n }\n onInteractOutside = (e) => {\n if (isElement(e.target) &&\n this.root.triggerNode?.contains(e.target) &&\n this.root.disableCloseOnTriggerClick) {\n e.preventDefault();\n return;\n }\n this.opts.onInteractOutside.current(e);\n if (e.defaultPrevented)\n return;\n this.root.handleClose();\n };\n onEscapeKeydown = (e) => {\n this.opts.onEscapeKeydown.current?.(e);\n if (e.defaultPrevented)\n return;\n this.root.handleClose();\n };\n onOpenAutoFocus = (e) => {\n e.preventDefault();\n };\n onCloseAutoFocus = (e) => {\n e.preventDefault();\n };\n get shouldRender() {\n return this.root.contentPresence.shouldRender;\n }\n snippetProps = $derived.by(() => ({ open: this.root.opts.open.current }));\n props = $derived.by(() => ({\n id: this.opts.id.current,\n \"data-state\": this.root.stateAttr,\n \"data-disabled\": boolToEmptyStrOrUndef(this.root.disabled),\n ...getDataTransitionAttrs(this.root.contentPresence.transitionStatus),\n style: {\n outline: \"none\",\n },\n [tooltipAttrs.content]: \"\",\n ...this.attachment,\n }));\n popperProps = {\n onInteractOutside: this.onInteractOutside,\n onEscapeKeydown: this.onEscapeKeydown,\n onOpenAutoFocus: this.onOpenAutoFocus,\n onCloseAutoFocus: this.onCloseAutoFocus,\n };\n}\n","<script lang=\"ts\" module>\n\ttype T = unknown;\n</script>\n\n<script lang=\"ts\" generics=\"T = never\">\n\timport { boxWith } from \"svelte-toolbelt\";\n\timport type { TooltipRootProps } from \"../types.js\";\n\timport { TooltipRootState } from \"../tooltip.svelte.js\";\n\timport FloatingLayer from \"../../utilities/floating-layer/components/floating-layer.svelte\";\n\timport { noop } from \"../../../internal/noop.js\";\n\n\tlet {\n\t\topen = $bindable(false),\n\t\ttriggerId = $bindable<string | null>(null),\n\t\tonOpenChange = noop,\n\t\tonOpenChangeComplete = noop,\n\t\tdisabled,\n\t\tdelayDuration,\n\t\tdisableCloseOnTriggerClick,\n\t\tdisableHoverableContent,\n\t\tignoreNonKeyboardFocus,\n\t\ttether,\n\t\tchildren,\n\t}: TooltipRootProps<T> = $props();\n\n\tconst rootState = TooltipRootState.create({\n\t\topen: boxWith(\n\t\t\t() => open,\n\t\t\t(v) => {\n\t\t\t\topen = v;\n\t\t\t\tonOpenChange(v);\n\t\t\t}\n\t\t),\n\t\ttriggerId: boxWith(\n\t\t\t() => triggerId,\n\t\t\t(v) => {\n\t\t\t\ttriggerId = v;\n\t\t\t}\n\t\t),\n\t\tdelayDuration: boxWith(() => delayDuration),\n\t\tdisableCloseOnTriggerClick: boxWith(() => disableCloseOnTriggerClick),\n\t\tdisableHoverableContent: boxWith(() => disableHoverableContent),\n\t\tignoreNonKeyboardFocus: boxWith(() => ignoreNonKeyboardFocus),\n\t\tdisabled: boxWith(() => disabled),\n\t\tonOpenChangeComplete: boxWith(() => onOpenChangeComplete),\n\t\ttether: boxWith(() => tether),\n\t});\n</script>\n\n<FloatingLayer tooltip>\n\t{@render children?.({\n\t\topen: rootState.opts.open.current,\n\t\ttriggerId: rootState.activeTriggerId,\n\t\tpayload: rootState.activePayload as [T] extends [never] ? null : T | null,\n\t})}\n</FloatingLayer>\n","<script lang=\"ts\">\n\timport { boxWith, mergeProps } from \"svelte-toolbelt\";\n\timport type { TooltipContentProps } from \"../types.js\";\n\timport { TooltipContentState } from \"../tooltip.svelte.js\";\n\timport { createId } from \"../../../internal/create-id.js\";\n\timport PopperLayer from \"../../utilities/popper-layer/popper-layer.svelte\";\n\timport { getFloatingContentCSSVars } from \"../../../internal/floating-svelte/floating-utils.svelte.js\";\n\timport PopperLayerForceMount from \"../../utilities/popper-layer/popper-layer-force-mount.svelte\";\n\timport { noop } from \"../../../internal/noop.js\";\n\n\tconst uid = $props.id();\n\n\tlet {\n\t\tchildren,\n\t\tchild,\n\t\tid = createId(uid),\n\t\tref = $bindable(null),\n\t\tside = \"top\",\n\t\tsideOffset = 0,\n\t\talign = \"center\",\n\t\tavoidCollisions = true,\n\t\tarrowPadding = 0,\n\t\tsticky = \"partial\",\n\t\tstrategy,\n\t\thideWhenDetached = false,\n\t\tcustomAnchor,\n\t\tcollisionPadding = 0,\n\t\tonInteractOutside = noop,\n\t\tonEscapeKeydown = noop,\n\t\tforceMount = false,\n\t\tstyle,\n\t\t...restProps\n\t}: TooltipContentProps = $props();\n\n\tconst contentState = TooltipContentState.create({\n\t\tid: boxWith(() => id),\n\t\tref: boxWith(\n\t\t\t() => ref,\n\t\t\t(v) => (ref = v)\n\t\t),\n\t\tonInteractOutside: boxWith(() => onInteractOutside),\n\t\tonEscapeKeydown: boxWith(() => onEscapeKeydown),\n\t});\n\n\tconst floatingProps = $derived({\n\t\tside,\n\t\tsideOffset,\n\t\talign,\n\t\tavoidCollisions,\n\t\tarrowPadding,\n\t\tsticky,\n\t\thideWhenDetached,\n\t\tcollisionPadding,\n\t\tstrategy,\n\t\tcustomAnchor: customAnchor ?? contentState.root.triggerNode,\n\t});\n\n\tconst mergedProps = $derived(mergeProps(restProps, floatingProps, contentState.props));\n</script>\n\n{#if forceMount}\n\t<PopperLayerForceMount\n\t\t{...mergedProps}\n\t\t{...contentState.popperProps}\n\t\tenabled={contentState.root.opts.open.current}\n\t\t{id}\n\t\ttrapFocus={false}\n\t\tloop={false}\n\t\tpreventScroll={false}\n\t\tforceMount={true}\n\t\tref={contentState.opts.ref}\n\t\ttooltip={true}\n\t\tshouldRender={contentState.shouldRender}\n\t\tcontentPointerEvents={contentState.root.disableHoverableContent ? \"none\" : \"auto\"}\n\t>\n\t\t{#snippet popper({ props, wrapperProps })}\n\t\t\t{@const finalWrapperProps = mergeProps(wrapperProps, {\n\t\t\t\tstyle: {\n\t\t\t\t\tpointerEvents: contentState.root.disableHoverableContent ? \"none\" : undefined,\n\t\t\t\t},\n\t\t\t})}\n\t\t\t{@const finalProps = mergeProps(\n\t\t\t\tprops,\n\t\t\t\t{ style: getFloatingContentCSSVars(\"tooltip\") },\n\t\t\t\t{ style }\n\t\t\t)}\n\t\t\t{#if child}\n\t\t\t\t{@render child({\n\t\t\t\t\tprops: finalProps,\n\t\t\t\t\twrapperProps: finalWrapperProps,\n\t\t\t\t\t...contentState.snippetProps,\n\t\t\t\t})}\n\t\t\t{:else}\n\t\t\t\t<div {...finalWrapperProps}>\n\t\t\t\t\t<div {...finalProps}>\n\t\t\t\t\t\t{@render children?.()}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t{/snippet}\n\t</PopperLayerForceMount>\n{:else if !forceMount}\n\t<PopperLayer\n\t\t{...mergedProps}\n\t\t{...contentState.popperProps}\n\t\topen={contentState.root.opts.open.current}\n\t\t{id}\n\t\ttrapFocus={false}\n\t\tloop={false}\n\t\tpreventScroll={false}\n\t\tforceMount={false}\n\t\tref={contentState.opts.ref}\n\t\ttooltip={true}\n\t\tshouldRender={contentState.shouldRender}\n\t\tcontentPointerEvents={contentState.root.disableHoverableContent ? \"none\" : \"auto\"}\n\t>\n\t\t{#snippet popper({ props, wrapperProps })}\n\t\t\t{@const finalWrapperProps = mergeProps(wrapperProps, {\n\t\t\t\tstyle: {\n\t\t\t\t\tpointerEvents: contentState.root.disableHoverableContent ? \"none\" : undefined,\n\t\t\t\t},\n\t\t\t})}\n\t\t\t{@const finalProps = mergeProps(\n\t\t\t\tprops,\n\t\t\t\t{ style: getFloatingContentCSSVars(\"tooltip\") },\n\t\t\t\t{ style }\n\t\t\t)}\n\t\t\t{#if child}\n\t\t\t\t{@render child({\n\t\t\t\t\tprops: finalProps,\n\t\t\t\t\twrapperProps: finalWrapperProps,\n\t\t\t\t\t...contentState.snippetProps,\n\t\t\t\t})}\n\t\t\t{:else}\n\t\t\t\t<div {...finalWrapperProps}>\n\t\t\t\t\t<div {...finalProps}>\n\t\t\t\t\t\t{@render children?.()}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t{/snippet}\n\t</PopperLayer>\n{/if}\n","<script lang=\"ts\" module>\n\ttype T = unknown;\n</script>\n\n<script lang=\"ts\" generics=\"T = never\">\n\timport { boxWith, mergeProps } from \"svelte-toolbelt\";\n\timport type { TooltipTriggerProps } from \"../types.js\";\n\timport { TooltipTriggerState } from \"../tooltip.svelte.js\";\n\timport { createId } from \"../../../internal/create-id.js\";\n\n\tconst uid = $props.id();\n\n\tlet {\n\t\tchildren,\n\t\tchild,\n\t\tid = createId(uid),\n\t\tdisabled = false,\n\t\tpayload,\n\t\ttether,\n\t\ttype = \"button\",\n\t\ttabindex = 0,\n\t\tref = $bindable(null),\n\t\t...restProps\n\t}: TooltipTriggerProps<T> = $props();\n\n\tconst triggerState = TooltipTriggerState.create({\n\t\tid: boxWith(() => id),\n\t\tdisabled: boxWith(() => disabled ?? false),\n\t\ttabindex: boxWith(() => tabindex ?? 0),\n\t\tpayload: boxWith(() => payload),\n\t\ttether: boxWith(() => tether),\n\t\tref: boxWith(\n\t\t\t() => ref,\n\t\t\t(v) => (ref = v)\n\t\t),\n\t});\n\n\tconst mergedProps = $derived(mergeProps(restProps, triggerState.props, { type }));\n</script>\n\n{#if child}\n\t{@render child({ props: mergedProps })}\n{:else}\n\t<button {...mergedProps}>\n\t\t{@render children?.()}\n\t</button>\n{/if}\n","<script lang=\"ts\">\n\timport type { TooltipArrowProps } from \"../types.js\";\n\timport FloatingLayerArrow from \"../../utilities/floating-layer/components/floating-layer-arrow.svelte\";\n\n\tlet { ref = $bindable(null), ...restProps }: TooltipArrowProps = $props();\n</script>\n\n<FloatingLayerArrow bind:ref {...restProps} />\n","<script lang=\"ts\">\n\timport { boxWith } from \"svelte-toolbelt\";\n\timport type { TooltipProviderProps } from \"../types.js\";\n\timport { TooltipProviderState } from \"../tooltip.svelte.js\";\n\n\tlet {\n\t\tchildren,\n\t\tdelayDuration = 700,\n\t\tdisableCloseOnTriggerClick = false,\n\t\tdisableHoverableContent = false,\n\t\tdisabled = false,\n\t\tignoreNonKeyboardFocus = false,\n\t\tskipDelayDuration = 300,\n\t}: TooltipProviderProps = $props();\n\n\tTooltipProviderState.create({\n\t\tdelayDuration: boxWith(() => delayDuration),\n\t\tdisableCloseOnTriggerClick: boxWith(() => disableCloseOnTriggerClick),\n\t\tdisableHoverableContent: boxWith(() => disableHoverableContent),\n\t\tdisabled: boxWith(() => disabled),\n\t\tignoreNonKeyboardFocus: boxWith(() => ignoreNonKeyboardFocus),\n\t\tskipDelayDuration: boxWith(() => skipDelayDuration),\n\t});\n</script>\n\n{@render children?.()}\n","import { browser } from '$app/environment';\nimport { ReliableWebSocket } from './websocket-base.svelte';\n\n/** History lines fetched on attach and per \"load more\" step. */\nexport const HISTORY_CHUNK = 200;\n/** Max history lines kept in memory while the view sits at the bottom. */\nconst KEEP_AT_BOTTOM = 400;\n\ninterface ScreenMsg {\n\ttype: 'screen';\n\tlines: string[];\n\thistorySize: number;\n\talt: boolean;\n\tcols: number;\n\trows: number;\n}\ninterface HistoryMsg {\n\ttype: 'history';\n\tstart: number;\n\tlines: string[];\n\thistorySize: number;\n}\ninterface ResetMsg {\n\ttype: 'reset';\n\thistorySize: number;\n\talt: boolean;\n\tcols: number;\n\trows: number;\n}\ntype TerminalMsg = ScreenMsg | HistoryMsg | ResetMsg;\n\n/**\n * Terminal view model.\n *\n * The server streams two regions: `screen` (visible pane, replaced on every\n * change) and `history` (lines that scrolled off the top — immutable, addressed\n * by absolute index, delivered as contiguous chunks). We hold one contiguous\n * history block [historyStart, historyStart + history.length) that always ends\n * at `historySize`, i.e. right above the screen. Because history only grows by\n * appending, content the user is reading never shifts; the page simply leaves\n * scrollTop alone while the user is scrolled up.\n */\nclass TerminalStore extends ReliableWebSocket {\n\t/** Visible pane rows (ANSI) */\n\tscreen = $state<string[]>([]);\n\t/** Contiguous history block ending at historySize */\n\thistory = $state<string[]>([]);\n\t/** Absolute index of history[0] */\n\thistoryStart = $state(0);\n\t/** Server's #{history_size}: absolute index just past the last history line */\n\thistorySize = $state(0);\n\t/** Pane is in alternate-screen mode (vim/less/Claude fullscreen TUI): no usable history */\n\talt = $state(false);\n\tcols = $state(0);\n\trows = $state(0);\n\tloadingMore = $state(false);\n\t/** Total history lines appended since attach (page diffs it to count unseen lines) */\n\tappended = $state(0);\n\n\t/** Page tells us whether the view is pinned to the bottom (so we may trim history) */\n\tatBottom = true;\n\n\tprivate target: string | null = null;\n\t/** The path the target's machine is reached through: '' here, `/fleet/<id>` elsewhere. */\n\tprivate base = '';\n\t/** What the socket reaches; a new base to the same address keeps it (see `TranscriptStore.setSession()`). */\n\tprivate address = '';\n\tprivate resizeTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate lastSentSize: { cols: number; rows: number } | null = null;\n\tprivate pendingHistory: (() => void) | null = null;\n\n\tprotected getWsUrl(): string {\n\t\tconst protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\n\t\tconst encodedTarget = encodeURIComponent(this.target!);\n\t\treturn `${protocol}//${window.location.host}${this.base}/api/sessions/${encodedTarget}/stream`;\n\t}\n\n\tprotected getLogPrefix(): string {\n\t\treturn '[terminal]';\n\t}\n\n\tprotected shouldReconnect(): boolean {\n\t\treturn this.target !== null;\n\t}\n\n\t/** Oldest line is loaded — nothing more to fetch */\n\tget historyAtStart(): boolean {\n\t\treturn this.alt || this.historyStart <= 0;\n\t}\n\n\tget historyEnd(): number {\n\t\treturn this.historyStart + this.history.length;\n\t}\n\n\tprotected handleMessage(event: MessageEvent): void {\n\t\tlet data: TerminalMsg;\n\t\ttry {\n\t\t\tdata = JSON.parse(event.data);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tswitch (data.type) {\n\t\t\tcase 'screen':\n\t\t\t\tthis.applyScreen(data);\n\t\t\t\tbreak;\n\t\t\tcase 'history':\n\t\t\t\tthis.applyHistory(data);\n\t\t\t\tbreak;\n\t\t\tcase 'reset':\n\t\t\t\tthis.applyReset(data);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate applyScreen(msg: ScreenMsg): void {\n\t\tthis.screen = msg.lines;\n\t\tthis.historySize = msg.historySize;\n\t\tthis.alt = msg.alt;\n\t\tthis.cols = msg.cols;\n\t\tthis.rows = msg.rows;\n\t\tif (msg.alt && this.history.length) {\n\t\t\tthis.history = [];\n\t\t\tthis.historyStart = msg.historySize;\n\t\t}\n\t\t// Initial tail is pushed by the server on attach; after a reset we ask for it ourselves.\n\t}\n\n\tprivate applyReset(msg: ResetMsg): void {\n\t\tthis.history = [];\n\t\tthis.historyStart = msg.historySize;\n\t\tthis.historySize = msg.historySize;\n\t\tthis.alt = msg.alt;\n\t\tthis.cols = msg.cols;\n\t\tthis.rows = msg.rows;\n\t\tthis.resolvePending();\n\t\tif (!msg.alt && msg.historySize > 0) {\n\t\t\tthis.requestHistory(msg.historySize, HISTORY_CHUNK);\n\t\t}\n\t}\n\n\tprivate applyHistory(msg: HistoryMsg): void {\n\t\tconst { start, lines } = msg;\n\t\tconst end = start + lines.length;\n\t\tthis.historySize = Math.max(this.historySize, msg.historySize);\n\t\tconst isLoadMore = this.loadingMore;\n\n\t\tif (lines.length === 0) {\n\t\t\t// nothing (e.g. requested before index 0)\n\t\t} else if (this.history.length === 0) {\n\t\t\tthis.history = lines;\n\t\t\tthis.historyStart = start;\n\t\t} else {\n\t\t\tconst curStart = this.historyStart;\n\t\t\tconst curEnd = curStart + this.history.length;\n\t\t\tif (start <= curEnd && end > curEnd) {\n\t\t\t\t// Append (trim overlap)\n\t\t\t\tconst fresh = lines.slice(curEnd - start);\n\t\t\t\tthis.history.push(...fresh);\n\t\t\t\tthis.appended += fresh.length;\n\t\t\t\tif (this.atBottom && this.history.length > KEEP_AT_BOTTOM) {\n\t\t\t\t\tconst drop = this.history.length - KEEP_AT_BOTTOM;\n\t\t\t\t\tthis.history.splice(0, drop);\n\t\t\t\t\tthis.historyStart += drop;\n\t\t\t\t}\n\t\t\t} else if (end >= curStart && start < curStart) {\n\t\t\t\t// Prepend (trim overlap)\n\t\t\t\tconst fresh = lines.slice(0, curStart - start);\n\t\t\t\tthis.history.unshift(...fresh);\n\t\t\t\tthis.historyStart = start;\n\t\t\t} else if (start > curEnd) {\n\t\t\t\t// Gap: we missed a delta (reconnect). Restart from this chunk.\n\t\t\t\tthis.history = lines;\n\t\t\t\tthis.historyStart = start;\n\t\t\t\tthis.appended += lines.length;\n\t\t\t}\n\t\t\t// else: fully inside what we have, or entirely before — ignore\n\t\t}\n\t\tif (isLoadMore) {\n\t\t\tthis.loadingMore = false;\n\t\t\tthis.resolvePending();\n\t\t}\n\t}\n\n\tprivate resolvePending(): void {\n\t\tconst resolve = this.pendingHistory;\n\t\tthis.pendingHistory = null;\n\t\tresolve?.();\n\t}\n\n\tprivate requestHistory(before: number, count: number): void {\n\t\tthis.send(JSON.stringify({ type: 'history_request', before, count }));\n\t}\n\n\t/**\n\t * Single entry point for terminal state. Pass a tmux target to view it,\n\t * or `null` to detach. Owns WS lifecycle, output clearing, and history\n\t * reset as one transaction so callers don't reason about connection state.\n\t * `base` names the target's machine (`machineBase()`), since targets\n\t * repeat across machines.\n\t */\n\tsetTarget(target: string | null | undefined, base = '', address = base): void {\n\t\tif (!browser) return;\n\t\tconst next = target ?? null;\n\n\t\t// Same target: either no-op, or reattach the WS without clearing output.\n\t\t// Preserves the buffer across transient disconnects (network blip, server reload).\n\t\tif (this.target === next && this.address === address) {\n\t\t\tthis.base = base;\n\t\t\tif (next === null) return;\n\t\t\tif (this.ws) return;\n\t\t\tthis.doConnect();\n\t\t\treturn;\n\t\t}\n\n\t\t// Switching target (or first attach): tear down old WS and reset view state.\n\t\tif (this.ws) {\n\t\t\tthis.target = null; // suppress reconnect in doDisconnect\n\t\t\tthis.doDisconnect();\n\t\t}\n\t\tif (this.resizeTimer) {\n\t\t\tclearTimeout(this.resizeTimer);\n\t\t\tthis.resizeTimer = null;\n\t\t}\n\t\tthis.lastSentSize = null;\n\t\tthis.clearView();\n\t\tthis.target = next;\n\t\tthis.base = base;\n\t\tthis.address = address;\n\n\t\tif (next) this.doConnect();\n\t}\n\n\tprivate clearView(): void {\n\t\tthis.screen = [];\n\t\tthis.history = [];\n\t\tthis.historyStart = 0;\n\t\tthis.historySize = 0;\n\t\tthis.alt = false;\n\t\tthis.loadingMore = false;\n\t\tthis.atBottom = true;\n\t\tthis.appended = 0;\n\t\tthis.resolvePending();\n\t}\n\n\t/** Resolves when the older chunk arrives. Returns null if no request was sent. */\n\trequestMoreHistory(count = HISTORY_CHUNK): Promise<void> | null {\n\t\tif (this.loadingMore) return null;\n\t\tif (this.historyAtStart) return null;\n\t\tif (!this.ws || this.ws.readyState !== WebSocket.OPEN) return null;\n\t\tthis.loadingMore = true;\n\t\tthis.requestHistory(this.historyStart, count);\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tthis.pendingHistory = resolve;\n\t\t});\n\t}\n\n\t/** Drop history beyond what we keep at the bottom (called when the user returns to bottom). */\n\ttrimToBottom(): void {\n\t\tif (this.history.length > KEEP_AT_BOTTOM) {\n\t\t\tconst drop = this.history.length - KEEP_AT_BOTTOM;\n\t\t\tthis.history.splice(0, drop);\n\t\t\tthis.historyStart += drop;\n\t\t}\n\t}\n\n\tsendResize(cols: number, rows: number): void {\n\t\tif (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\n\n\t\t// Skip if same as last sent\n\t\tif (this.lastSentSize?.cols === cols && this.lastSentSize?.rows === rows) return;\n\n\t\t// Debounce\n\t\tif (this.resizeTimer) clearTimeout(this.resizeTimer);\n\n\t\tthis.resizeTimer = setTimeout(() => {\n\t\t\tif (this.ws && this.ws.readyState === WebSocket.OPEN) {\n\t\t\t\tthis.ws.send(JSON.stringify({ type: 'resize', cols, rows }));\n\t\t\t\tthis.lastSentSize = { cols, rows };\n\t\t\t}\n\t\t\tthis.resizeTimer = null;\n\t\t}, 150);\n\t}\n}\n\nexport const terminalStore = new TerminalStore();\n","\"use strict\";\nvar __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\nvar PacketKind;\n(function (PacketKind) {\n PacketKind[PacketKind[\"EOS\"] = 0] = \"EOS\";\n PacketKind[PacketKind[\"Text\"] = 1] = \"Text\";\n PacketKind[PacketKind[\"Incomplete\"] = 2] = \"Incomplete\";\n PacketKind[PacketKind[\"ESC\"] = 3] = \"ESC\";\n PacketKind[PacketKind[\"Unknown\"] = 4] = \"Unknown\";\n PacketKind[PacketKind[\"SGR\"] = 5] = \"SGR\";\n PacketKind[PacketKind[\"OSCURL\"] = 6] = \"OSCURL\";\n})(PacketKind || (PacketKind = {}));\nexport class AnsiUp {\n constructor() {\n this.VERSION = \"6.0.6\";\n this.setup_palettes();\n this._use_classes = false;\n this.bold = false;\n this.faint = false;\n this.italic = false;\n this.underline = false;\n this.fg = this.bg = null;\n this._buffer = '';\n this._url_allowlist = { 'http': 1, 'https': 1 };\n this._escape_html = true;\n this.boldStyle = 'font-weight:bold';\n this.faintStyle = 'opacity:0.7';\n this.italicStyle = 'font-style:italic';\n this.underlineStyle = 'text-decoration:underline';\n }\n set use_classes(arg) {\n this._use_classes = arg;\n }\n get use_classes() {\n return this._use_classes;\n }\n set url_allowlist(arg) {\n this._url_allowlist = arg;\n }\n get url_allowlist() {\n return this._url_allowlist;\n }\n set escape_html(arg) {\n this._escape_html = arg;\n }\n get escape_html() {\n return this._escape_html;\n }\n set boldStyle(arg) { this._boldStyle = arg; }\n get boldStyle() { return this._boldStyle; }\n set faintStyle(arg) { this._faintStyle = arg; }\n get faintStyle() { return this._faintStyle; }\n set italicStyle(arg) { this._italicStyle = arg; }\n get italicStyle() { return this._italicStyle; }\n set underlineStyle(arg) { this._underlineStyle = arg; }\n get underlineStyle() { return this._underlineStyle; }\n setup_palettes() {\n this.ansi_colors =\n [\n [\n { rgb: [0, 0, 0], class_name: \"ansi-black\" },\n { rgb: [187, 0, 0], class_name: \"ansi-red\" },\n { rgb: [0, 187, 0], class_name: \"ansi-green\" },\n { rgb: [187, 187, 0], class_name: \"ansi-yellow\" },\n { rgb: [0, 0, 187], class_name: \"ansi-blue\" },\n { rgb: [187, 0, 187], class_name: \"ansi-magenta\" },\n { rgb: [0, 187, 187], class_name: \"ansi-cyan\" },\n { rgb: [255, 255, 255], class_name: \"ansi-white\" }\n ],\n [\n { rgb: [85, 85, 85], class_name: \"ansi-bright-black\" },\n { rgb: [255, 85, 85], class_name: \"ansi-bright-red\" },\n { rgb: [0, 255, 0], class_name: \"ansi-bright-green\" },\n { rgb: [255, 255, 85], class_name: \"ansi-bright-yellow\" },\n { rgb: [85, 85, 255], class_name: \"ansi-bright-blue\" },\n { rgb: [255, 85, 255], class_name: \"ansi-bright-magenta\" },\n { rgb: [85, 255, 255], class_name: \"ansi-bright-cyan\" },\n { rgb: [255, 255, 255], class_name: \"ansi-bright-white\" }\n ]\n ];\n this.palette_256 = [];\n this.ansi_colors.forEach(palette => {\n palette.forEach(rec => {\n this.palette_256.push(rec);\n });\n });\n let levels = [0, 95, 135, 175, 215, 255];\n for (let r = 0; r < 6; ++r) {\n for (let g = 0; g < 6; ++g) {\n for (let b = 0; b < 6; ++b) {\n let col = { rgb: [levels[r], levels[g], levels[b]], class_name: 'truecolor' };\n this.palette_256.push(col);\n }\n }\n }\n let grey_level = 8;\n for (let i = 0; i < 24; ++i, grey_level += 10) {\n let gry = { rgb: [grey_level, grey_level, grey_level], class_name: 'truecolor' };\n this.palette_256.push(gry);\n }\n }\n escape_txt_for_html(txt) {\n if (!this._escape_html)\n return txt;\n return txt.replace(/[&<>\"']/gm, (str) => {\n if (str === \"&\")\n return \"&\";\n if (str === \"<\")\n return \"<\";\n if (str === \">\")\n return \">\";\n if (str === \"\\\"\")\n return \""\";\n if (str === \"'\")\n return \"'\";\n });\n }\n append_buffer(txt) {\n var str = this._buffer + txt;\n this._buffer = str;\n }\n get_next_packet() {\n var pkt = {\n kind: PacketKind.EOS,\n text: '',\n url: ''\n };\n var len = this._buffer.length;\n if (len == 0)\n return pkt;\n var pos = this._buffer.indexOf(\"\\x1B\");\n if (pos == -1) {\n pkt.kind = PacketKind.Text;\n pkt.text = this._buffer;\n this._buffer = '';\n return pkt;\n }\n if (pos > 0) {\n pkt.kind = PacketKind.Text;\n pkt.text = this._buffer.slice(0, pos);\n this._buffer = this._buffer.slice(pos);\n return pkt;\n }\n if (pos == 0) {\n if (len < 3) {\n pkt.kind = PacketKind.Incomplete;\n return pkt;\n }\n var next_char = this._buffer.charAt(1);\n if ((next_char != '[') && (next_char != ']') && (next_char != '(')) {\n pkt.kind = PacketKind.ESC;\n pkt.text = this._buffer.slice(0, 1);\n this._buffer = this._buffer.slice(1);\n return pkt;\n }\n if (next_char == '[') {\n if (!this._csi_regex) {\n this._csi_regex = rgx(templateObject_1 || (templateObject_1 = __makeTemplateObject([\"\\n ^ # beginning of line\\n #\\n # First attempt\\n (?: # legal sequence\\n \\u001B[ # CSI\\n ([<-?]?) # private-mode char\\n ([d;]*) # any digits or semicolons\\n ([ -/]? # an intermediate modifier\\n [@-~]) # the command\\n )\\n | # alternate (second attempt)\\n (?: # illegal sequence\\n \\u001B[ # CSI\\n [ -~]* # anything legal\\n ([\\0-\\u001F:]) # anything illegal\\n )\\n \"], [\"\\n ^ # beginning of line\\n #\\n # First attempt\\n (?: # legal sequence\\n \\\\x1b\\\\[ # CSI\\n ([\\\\x3c-\\\\x3f]?) # private-mode char\\n ([\\\\d;]*) # any digits or semicolons\\n ([\\\\x20-\\\\x2f]? # an intermediate modifier\\n [\\\\x40-\\\\x7e]) # the command\\n )\\n | # alternate (second attempt)\\n (?: # illegal sequence\\n \\\\x1b\\\\[ # CSI\\n [\\\\x20-\\\\x7e]* # anything legal\\n ([\\\\x00-\\\\x1f:]) # anything illegal\\n )\\n \"])));\n }\n let match = this._buffer.match(this._csi_regex);\n if (match === null) {\n pkt.kind = PacketKind.Incomplete;\n return pkt;\n }\n if (match[4]) {\n pkt.kind = PacketKind.ESC;\n pkt.text = this._buffer.slice(0, 1);\n this._buffer = this._buffer.slice(1);\n return pkt;\n }\n if ((match[1] != '') || (match[3] != 'm'))\n pkt.kind = PacketKind.Unknown;\n else\n pkt.kind = PacketKind.SGR;\n pkt.text = match[2];\n var rpos = match[0].length;\n this._buffer = this._buffer.slice(rpos);\n return pkt;\n }\n else if (next_char == ']') {\n if (len < 4) {\n pkt.kind = PacketKind.Incomplete;\n return pkt;\n }\n if ((this._buffer.charAt(2) != '8')\n || (this._buffer.charAt(3) != ';')) {\n pkt.kind = PacketKind.ESC;\n pkt.text = this._buffer.slice(0, 1);\n this._buffer = this._buffer.slice(1);\n return pkt;\n }\n if (!this._osc_st) {\n this._osc_st = rgxG(templateObject_2 || (templateObject_2 = __makeTemplateObject([\"\\n (?: # legal sequence\\n (\\u001B\\\\) # ESC | # alternate\\n (\\u0007) # BEL (what xterm did)\\n )\\n | # alternate (second attempt)\\n ( # illegal sequence\\n [\\0-\\u0006] # anything illegal\\n | # alternate\\n [\\b-\\u001A] # anything illegal\\n | # alternate\\n [\\u001C-\\u001F] # anything illegal\\n )\\n \"], [\"\\n (?: # legal sequence\\n (\\\\x1b\\\\\\\\) # ESC \\\\\\n | # alternate\\n (\\\\x07) # BEL (what xterm did)\\n )\\n | # alternate (second attempt)\\n ( # illegal sequence\\n [\\\\x00-\\\\x06] # anything illegal\\n | # alternate\\n [\\\\x08-\\\\x1a] # anything illegal\\n | # alternate\\n [\\\\x1c-\\\\x1f] # anything illegal\\n )\\n \"])));\n }\n this._osc_st.lastIndex = 0;\n {\n let match = this._osc_st.exec(this._buffer);\n if (match === null) {\n pkt.kind = PacketKind.Incomplete;\n return pkt;\n }\n if (match[3]) {\n pkt.kind = PacketKind.ESC;\n pkt.text = this._buffer.slice(0, 1);\n this._buffer = this._buffer.slice(1);\n return pkt;\n }\n }\n {\n let match = this._osc_st.exec(this._buffer);\n if (match === null) {\n pkt.kind = PacketKind.Incomplete;\n return pkt;\n }\n if (match[3]) {\n pkt.kind = PacketKind.ESC;\n pkt.text = this._buffer.slice(0, 1);\n this._buffer = this._buffer.slice(1);\n return pkt;\n }\n }\n if (!this._osc_regex) {\n this._osc_regex = rgx(templateObject_3 || (templateObject_3 = __makeTemplateObject([\"\\n ^ # beginning of line\\n #\\n \\u001B]8; # OSC Hyperlink\\n [ -:<-~]* # params (excluding ;)\\n ; # end of params\\n ([!-~]{0,512}) # URL capture\\n (?: # ST\\n (?:\\u001B\\\\) # ESC | # alternate\\n (?:\\u0007) # BEL (what xterm did)\\n )\\n ([ -~]+) # TEXT capture\\n \\u001B]8;; # OSC Hyperlink End\\n (?: # ST\\n (?:\\u001B\\\\) # ESC | # alternate\\n (?:\\u0007) # BEL (what xterm did)\\n )\\n \"], [\"\\n ^ # beginning of line\\n #\\n \\\\x1b\\\\]8; # OSC Hyperlink\\n [\\\\x20-\\\\x3a\\\\x3c-\\\\x7e]* # params (excluding ;)\\n ; # end of params\\n ([\\\\x21-\\\\x7e]{0,512}) # URL capture\\n (?: # ST\\n (?:\\\\x1b\\\\\\\\) # ESC \\\\\\n | # alternate\\n (?:\\\\x07) # BEL (what xterm did)\\n )\\n ([\\\\x20-\\\\x7e]+) # TEXT capture\\n \\\\x1b\\\\]8;; # OSC Hyperlink End\\n (?: # ST\\n (?:\\\\x1b\\\\\\\\) # ESC \\\\\\n | # alternate\\n (?:\\\\x07) # BEL (what xterm did)\\n )\\n \"])));\n }\n let match = this._buffer.match(this._osc_regex);\n if (match === null) {\n pkt.kind = PacketKind.ESC;\n pkt.text = this._buffer.slice(0, 1);\n this._buffer = this._buffer.slice(1);\n return pkt;\n }\n pkt.kind = PacketKind.OSCURL;\n pkt.url = match[1];\n pkt.text = match[2];\n var rpos = match[0].length;\n this._buffer = this._buffer.slice(rpos);\n return pkt;\n }\n else if (next_char == '(') {\n pkt.kind = PacketKind.Unknown;\n this._buffer = this._buffer.slice(3);\n return pkt;\n }\n }\n }\n ansi_to_html(txt) {\n this.append_buffer(txt);\n var blocks = [];\n while (true) {\n var packet = this.get_next_packet();\n if ((packet.kind == PacketKind.EOS)\n || (packet.kind == PacketKind.Incomplete))\n break;\n if ((packet.kind == PacketKind.ESC)\n || (packet.kind == PacketKind.Unknown))\n continue;\n if (packet.kind == PacketKind.Text)\n blocks.push(this.transform_to_html(this.with_state(packet)));\n else if (packet.kind == PacketKind.SGR)\n this.process_ansi(packet);\n else if (packet.kind == PacketKind.OSCURL)\n blocks.push(this.process_hyperlink(packet));\n }\n return blocks.join(\"\");\n }\n with_state(pkt) {\n return { bold: this.bold, faint: this.faint, italic: this.italic, underline: this.underline, fg: this.fg, bg: this.bg, text: pkt.text };\n }\n process_ansi(pkt) {\n let sgr_cmds = pkt.text.split(';');\n while (sgr_cmds.length > 0) {\n let sgr_cmd_str = sgr_cmds.shift();\n let num = parseInt(sgr_cmd_str, 10);\n if (isNaN(num) || num === 0) {\n this.fg = null;\n this.bg = null;\n this.bold = false;\n this.faint = false;\n this.italic = false;\n this.underline = false;\n }\n else if (num === 1) {\n this.bold = true;\n }\n else if (num === 2) {\n this.faint = true;\n }\n else if (num === 3) {\n this.italic = true;\n }\n else if (num === 4) {\n this.underline = true;\n }\n else if (num === 21) {\n this.bold = false;\n }\n else if (num === 22) {\n this.faint = false;\n this.bold = false;\n }\n else if (num === 23) {\n this.italic = false;\n }\n else if (num === 24) {\n this.underline = false;\n }\n else if (num === 39) {\n this.fg = null;\n }\n else if (num === 49) {\n this.bg = null;\n }\n else if ((num >= 30) && (num < 38)) {\n this.fg = this.ansi_colors[0][(num - 30)];\n }\n else if ((num >= 40) && (num < 48)) {\n this.bg = this.ansi_colors[0][(num - 40)];\n }\n else if ((num >= 90) && (num < 98)) {\n this.fg = this.ansi_colors[1][(num - 90)];\n }\n else if ((num >= 100) && (num < 108)) {\n this.bg = this.ansi_colors[1][(num - 100)];\n }\n else if (num === 38 || num === 48) {\n if (sgr_cmds.length > 0) {\n let is_foreground = (num === 38);\n let mode_cmd = sgr_cmds.shift();\n if (mode_cmd === '5' && sgr_cmds.length > 0) {\n let palette_index = parseInt(sgr_cmds.shift(), 10);\n if (palette_index >= 0 && palette_index <= 255) {\n if (is_foreground)\n this.fg = this.palette_256[palette_index];\n else\n this.bg = this.palette_256[palette_index];\n }\n }\n if (mode_cmd === '2' && sgr_cmds.length > 2) {\n let r = parseInt(sgr_cmds.shift(), 10);\n let g = parseInt(sgr_cmds.shift(), 10);\n let b = parseInt(sgr_cmds.shift(), 10);\n if ((r >= 0 && r <= 255) && (g >= 0 && g <= 255) && (b >= 0 && b <= 255)) {\n let c = { rgb: [r, g, b], class_name: 'truecolor' };\n if (is_foreground)\n this.fg = c;\n else\n this.bg = c;\n }\n }\n }\n }\n }\n }\n transform_to_html(fragment) {\n let txt = fragment.text;\n if (txt.length === 0)\n return txt;\n txt = this.escape_txt_for_html(txt);\n if (!fragment.bold && !fragment.italic && !fragment.faint && !fragment.underline && fragment.fg === null && fragment.bg === null)\n return txt;\n let styles = [];\n let classes = [];\n let fg = fragment.fg;\n let bg = fragment.bg;\n if (fragment.bold)\n styles.push(this._boldStyle);\n if (fragment.faint)\n styles.push(this._faintStyle);\n if (fragment.italic)\n styles.push(this._italicStyle);\n if (fragment.underline)\n styles.push(this._underlineStyle);\n if (!this._use_classes) {\n if (fg)\n styles.push(`color:rgb(${fg.rgb.join(',')})`);\n if (bg)\n styles.push(`background-color:rgb(${bg.rgb})`);\n }\n else {\n if (fg) {\n if (fg.class_name !== 'truecolor') {\n classes.push(`${fg.class_name}-fg`);\n }\n else {\n styles.push(`color:rgb(${fg.rgb.join(',')})`);\n }\n }\n if (bg) {\n if (bg.class_name !== 'truecolor') {\n classes.push(`${bg.class_name}-bg`);\n }\n else {\n styles.push(`background-color:rgb(${bg.rgb.join(',')})`);\n }\n }\n }\n let class_string = '';\n let style_string = '';\n if (classes.length)\n class_string = ` class=\"${classes.join(' ')}\"`;\n if (styles.length)\n style_string = ` style=\"${styles.join(';')}\"`;\n return `<span${style_string}${class_string}>${txt}</span>`;\n }\n ;\n process_hyperlink(pkt) {\n let parts = pkt.url.split(':');\n if (parts.length < 1)\n return '';\n if (!this._url_allowlist[parts[0]])\n return '';\n let result = `<a href=\"${this.escape_txt_for_html(pkt.url)}\">${this.escape_txt_for_html(pkt.text)}</a>`;\n return result;\n }\n}\nfunction rgx(tmplObj, ...subst) {\n let regexText = tmplObj.raw[0];\n let wsrgx = /^\\s+|\\s+\\n|\\s*#[\\s\\S]*?\\n|\\n/gm;\n let txt2 = regexText.replace(wsrgx, '');\n return new RegExp(txt2);\n}\nfunction rgxG(tmplObj, ...subst) {\n let regexText = tmplObj.raw[0];\n let wsrgx = /^\\s+|\\s+\\n|\\s*#[\\s\\S]*?\\n|\\n/gm;\n let txt2 = regexText.replace(wsrgx, '');\n return new RegExp(txt2, 'g');\n}\nvar templateObject_1, templateObject_2, templateObject_3;\n","import { AnsiUp } from 'ansi_up';\n\nconst ansi = new AnsiUp();\nansi.use_classes = true;\n\n// OSC 8 hyperlinks: ESC ] 8 ; params ; URI ST TEXT ESC ] 8 ; ; ST\n// ST is either ESC \\ or BEL (\\x07). ansi_up doesn't parse these, so\n// extract them, run ansi_up on the text, then re-wrap in <a>.\nconst OSC8_RE = /\\x1b\\]8;[^;\\x07\\x1b]*;([^\\x07\\x1b]*)(?:\\x1b\\\\|\\x07)([\\s\\S]*?)\\x1b\\]8;;(?:\\x1b\\\\|\\x07)/g;\n\n// CSI / OSC / other escapes, for plain-text rendering\nconst ANSI_STRIP_RE = /\\x1b\\[[0-9;?]*[ -/]*[@-~]|\\x1b\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)|\\x1b[@-Z\\\\-_]/g;\n\nfunction escapeAttr(s: string): string {\n\treturn s.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<').replace(/>/g, '>');\n}\n\nfunction isSafeUrl(u: string): boolean {\n\treturn /^(https?:|mailto:|ftp:)/i.test(u);\n}\n\n/** ANSI text → HTML (ansi_up class-based colors + OSC 8 links). */\nexport function ansiToHtml(input: string): string {\n\tconst links: string[] = [];\n\tconst marked = input.replace(OSC8_RE, (_m, uri: string, text: string) => {\n\t\tconst i = links.push(uri) - 1;\n\t\treturn `\\x00CMX${i}S\\x00${text}\\x00CMX${i}E\\x00`;\n\t});\n\tlet html = ansi.ansi_to_html(marked);\n\thtml = html.replace(/\\x00CMX(\\d+)S\\x00([\\s\\S]*?)\\x00CMX\\1E\\x00/g, (_m, i, inner) => {\n\t\tconst uri = links[Number(i)] ?? '';\n\t\tif (!isSafeUrl(uri)) return inner;\n\t\treturn `<a href=\"${escapeAttr(uri)}\" target=\"_blank\" rel=\"noopener noreferrer\">${inner}</a>`;\n\t});\n\treturn html;\n}\n\n/**\n * Render one terminal line in isolation. ansi_up carries SGR state across\n * calls; a leading reset keeps lines independent so cached HTML stays valid.\n */\nexport function ansiLineToHtml(line: string): string {\n\treturn ansiToHtml('\\x1b[0m' + line);\n}\n\nexport function stripAnsi(input: string): string {\n\treturn input.replace(ANSI_STRIP_RE, '');\n}\n","<script lang=\"ts\">\n\timport { ansiLineToHtml, stripAnsi } from '$lib/terminal/ansi';\n\n\tinterface Props {\n\t\t/** History lines (ANSI), oldest first. Immutable per index → rendered once, reused via keyed each. */\n\t\thistory: string[];\n\t\t/** Absolute index of history[0] — used as the stable key base. */\n\t\thistoryStart: number;\n\t\t/** Visible pane rows (ANSI). Re-rendered on every change. */\n\t\tscreen: string[];\n\t\t/** Render with ANSI colors (true) or strip escapes (false). */\n\t\tthemed?: boolean;\n\t\t/**\n\t\t * While true, the view keeps showing the snapshot taken when it flipped\n\t\t * on (iOS drops the copy callout on any DOM mutation under a selection).\n\t\t */\n\t\tfrozen?: boolean;\n\t}\n\n\tlet { history, historyStart, screen, themed = true, frozen = false }: Props = $props();\n\n\tlet snapHistory = $state<string[]>([]);\n\tlet snapStart = $state(0);\n\tlet snapScreen = $state<string[]>([]);\n\tlet wasFrozen = false;\n\n\t$effect(() => {\n\t\tif (frozen && !wasFrozen) {\n\t\t\tsnapHistory = [...history];\n\t\t\tsnapStart = historyStart;\n\t\t\tsnapScreen = [...screen];\n\t\t}\n\t\twasFrozen = frozen;\n\t});\n\n\tconst shownHistory = $derived(frozen ? snapHistory : history);\n\tconst shownStart = $derived(frozen ? snapStart : historyStart);\n\tconst shownScreen = $derived(frozen ? snapScreen : screen);\n\n\t// Screen is small (pane rows); one string → one render per tick.\n\tconst screenHtml = $derived(\n\t\tthemed ? shownScreen.map(ansiLineToHtml).join('\\n') : shownScreen.map(stripAnsi).join('\\n')\n\t);\n</script>\n\n<pre class=\"terminal-view\" class:themed>{#each shownHistory as line, i (shownStart + i)}{#if themed}{@html ansiLineToHtml(line)}{:else}{stripAnsi(line)}{/if}{'\\n'}{/each}{#if themed}{@html screenHtml}{:else}{screenHtml}{/if}</pre>\n\n<style>\n\t.terminal-view {\n\t\tmargin: 0;\n\t\tfont-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;\n\t\tfont-size: 13px;\n\t\tline-height: 1.4;\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t\tbackground: #000;\n\t\tcolor: #fff;\n\t}\n\n\t.terminal-view {\n\t\tmargin: 0;\n\t\tfont-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;\n\t\tfont-size: 13px;\n\t\tline-height: 1.4;\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t\tbackground: #000;\n\t\tcolor: #fff;\n\t}\n\n\t/* ansi_up class-based colors */\n\t.terminal-view :global(.ansi-black-fg) { color: #555; }\n\t.terminal-view :global(.ansi-red-fg) { color: #f87171; }\n\t.terminal-view :global(.ansi-green-fg) { color: #4ade80; }\n\t.terminal-view :global(.ansi-yellow-fg) { color: #fbbf24; }\n\t.terminal-view :global(.ansi-blue-fg) { color: #60a5fa; }\n\t.terminal-view :global(.ansi-magenta-fg) { color: #c084fc; }\n\t.terminal-view :global(.ansi-cyan-fg) { color: #22d3ee; }\n\t.terminal-view :global(.ansi-white-fg) { color: #e5e7eb; }\n\n\t.terminal-view :global(.ansi-bright-black-fg) { color: #6b7280; }\n\t.terminal-view :global(.ansi-bright-red-fg) { color: #fca5a5; }\n\t.terminal-view :global(.ansi-bright-green-fg) { color: #86efac; }\n\t.terminal-view :global(.ansi-bright-yellow-fg) { color: #fde68a; }\n\t.terminal-view :global(.ansi-bright-blue-fg) { color: #93c5fd; }\n\t.terminal-view :global(.ansi-bright-magenta-fg) { color: #d8b4fe; }\n\t.terminal-view :global(.ansi-bright-cyan-fg) { color: #67e8f9; }\n\t.terminal-view :global(.ansi-bright-white-fg) { color: #fff; }\n\n\t.terminal-view :global(.ansi-black-bg) { background-color: #000; }\n\t.terminal-view :global(.ansi-red-bg) { background-color: #b91c1c; }\n\t.terminal-view :global(.ansi-green-bg) { background-color: #15803d; }\n\t.terminal-view :global(.ansi-yellow-bg) { background-color: #a16207; }\n\t.terminal-view :global(.ansi-blue-bg) { background-color: #1d4ed8; }\n\t.terminal-view :global(.ansi-magenta-bg) { background-color: #7e22ce; }\n\t.terminal-view :global(.ansi-cyan-bg) { background-color: #0e7490; }\n\t.terminal-view :global(.ansi-white-bg) { background-color: #e5e7eb; }\n\n\t.terminal-view :global(.ansi-bold) { font-weight: 700; }\n\t.terminal-view :global(.ansi-dim) { opacity: 0.7; }\n\t.terminal-view :global(.ansi-italic) { font-style: italic; }\n\t.terminal-view :global(.ansi-underline) { text-decoration: underline; }\n\t.terminal-view :global(.ansi-strikethrough) { text-decoration: line-through; }\n\n\t.terminal-view :global(a) {\n\t\tcolor: inherit;\n\t\ttext-decoration: underline;\n\t\ttext-decoration-style: dotted;\n\t}\n\t.terminal-view :global(a:hover) {\n\t\ttext-decoration-style: solid;\n\t}\n</style>\n","export interface ClickOutsideOptions {\n\tonOutside: () => void;\n\tenabled?: boolean;\n}\n\nexport interface ClickOutsideAction {\n\tdestroy(): void;\n\tupdate(opts: ClickOutsideOptions): void;\n}\n\nconst ATTACH_DELAY_MS = 10;\n\nexport function clickOutside(node: HTMLElement, options: ClickOutsideOptions): ClickOutsideAction {\n\tlet opts = options;\n\tlet attached = false;\n\tlet pendingTimer: ReturnType<typeof setTimeout> | null = null;\n\n\tfunction onDocumentEvent(e: Event): void {\n\t\tif (!node.contains(e.target as Node)) {\n\t\t\topts.onOutside();\n\t\t}\n\t}\n\n\tfunction detach(): void {\n\t\tif (pendingTimer) {\n\t\t\tclearTimeout(pendingTimer);\n\t\t\tpendingTimer = null;\n\t\t}\n\t\tif (attached) {\n\t\t\tdocument.removeEventListener('click', onDocumentEvent);\n\t\t\tdocument.removeEventListener('contextmenu', onDocumentEvent);\n\t\t\tattached = false;\n\t\t}\n\t}\n\n\tfunction sync(): void {\n\t\tconst wantAttached = opts.enabled ?? true;\n\t\tif (wantAttached && !attached && !pendingTimer) {\n\t\t\tpendingTimer = setTimeout(() => {\n\t\t\t\tpendingTimer = null;\n\t\t\t\tdocument.addEventListener('click', onDocumentEvent);\n\t\t\t\tdocument.addEventListener('contextmenu', onDocumentEvent);\n\t\t\t\tattached = true;\n\t\t\t}, ATTACH_DELAY_MS);\n\t\t} else if (!wantAttached) {\n\t\t\tdetach();\n\t\t}\n\t}\n\n\tsync();\n\n\treturn {\n\t\tdestroy(): void {\n\t\t\tdetach();\n\t\t},\n\t\tupdate(next: ClickOutsideOptions): void {\n\t\t\topts = next;\n\t\t\tsync();\n\t\t}\n\t};\n}\n","/**\n * Context-window accounting for a session.\n *\n * Claude Code never writes a percentage anywhere we can read, but it does\n * write the raw `usage` of every API response into the transcript, and the\n * arithmetic behind its own status line is simple enough to mirror: the\n * tokens occupying the window are the input tokens plus both cache counters\n * of the most recent response, measured against the model's window.\n */\n\nimport { asRecord, readNumber, readString } from \"./json.js\";\n\nconst WINDOW_200K = 200_000;\nconst WINDOW_1M = 1_000_000;\n\n/**\n * Windows by model, keyed on the id Claude Code writes into the transcript.\n * A provider may wrap that id (\"us.anthropic.claude-opus-5-v1:0\"), so the\n * known names are matched as substrings.\n *\n * A model in neither list stays unknown rather than being assumed: this table\n * ages against a Claude Code that upgrades on its own schedule, and a 540k\n * context reported as 270% of a guessed window is worse than no percentage.\n */\nconst WINDOWS: { window: number; models: string[] }[] = [\n {\n window: WINDOW_1M,\n models: [\n \"claude-sonnet-5\",\n \"claude-opus-4-7\",\n \"claude-opus-4-8\",\n \"claude-opus-5\",\n \"claude-fable-5\",\n \"claude-mythos-5\",\n ],\n },\n {\n window: WINDOW_200K,\n models: [\n \"claude-3-\",\n \"claude-haiku-4-5\",\n \"claude-sonnet-4-0\",\n \"claude-sonnet-4-5\",\n \"claude-sonnet-4-6\",\n \"claude-opus-4-0\",\n \"claude-opus-4-1\",\n \"claude-opus-4-5\",\n \"claude-opus-4-6\",\n ],\n },\n];\n\nexport interface ContextUsage {\n /** Model that served the response, as written in the transcript. */\n model: string;\n /** Tokens occupying the context window on the last API call. */\n tokens: number;\n /** That model's window in tokens, or null when the model is unknown. */\n window: number | null;\n}\n\nexport function contextWindowFor(model: string): number | null {\n const id = model.toLowerCase();\n // The `[1m]` suffix is the explicit opt-in offered for models that reach a\n // 1M window without having one natively.\n if (id.includes(\"[1m]\")) return WINDOW_1M;\n for (const entry of WINDOWS) {\n if (entry.models.some((known) => id.includes(known))) return entry.window;\n }\n return null;\n}\n\n/** Share of the window in use, or null when the window is unknown. */\nexport function contextPercent(usage: ContextUsage): number | null {\n return usage.window === null ? null : Math.round((usage.tokens / usage.window) * 100);\n}\n\n/** Read the context usage off an assistant record's `message`. */\nexport function readContextUsage(message: Record<string, unknown>): ContextUsage | null {\n const usage = asRecord(message.usage);\n if (!usage) return null;\n const tokens =\n readNumber(usage, \"input_tokens\") +\n readNumber(usage, \"cache_creation_input_tokens\") +\n readNumber(usage, \"cache_read_input_tokens\");\n // Synthetic messages never reached the API and carry a zeroed usage, which\n // would otherwise read as a context that had just emptied itself.\n if (tokens === 0) return null;\n const model = readString(message.model) ?? \"\";\n return { model, tokens, window: contextWindowFor(model) };\n}\n","<script lang=\"ts\">\n\timport type { Snippet } from 'svelte';\n\timport { clickOutside } from '$lib/actions/clickOutside';\n\timport { compact } from '$lib/format';\n\timport { edgeColor, THRESHOLDS } from '$lib/severity';\n\timport { contextPercent, type ContextUsage } from '../../../../src/transcript/context.js';\n\n\tinterface Props {\n\t\tcontext: ContextUsage | null;\n\t\t/** Mounted on the rail — the line routes over it. */\n\t\tnotch?: Snippet;\n\t}\n\n\tlet { context, notch }: Props = $props();\n\n\tlet open = $state(false);\n\tlet strip = $state<HTMLElement | null>(null);\n\tlet svgEl = $state<SVGSVGElement | null>(null);\n\tlet rightEl = $state<HTMLElement | null>(null);\n\tlet path = $state('');\n\tlet length = $state(0);\n\n\tconst used = $derived(context ? (contextPercent(context) ?? null) : null);\n\tconst left100 = $derived(used === null ? null : Math.max(0, 100 - used));\n\tconst color = $derived(edgeColor(used ?? 0));\n\n\t/**\n\t * Where the rail turns amber, and roughly where Claude starts compacting.\n\t * Read from the edge scale so the mark, the note and the rail's own colour\n\t * can never disagree about the number.\n\t */\n\tconst COMPACT_AT = THRESHOLDS.edge.warning;\n\n\t/**\n\t * The rail is one path: it turns the card's top corners and arcs over the\n\t * button mounted on it, so the fill's head is never hidden behind anything.\n\t */\n\tfunction build() {\n\t\tif (!strip || !svgEl) return;\n\t\tconst box = svgEl.getBoundingClientRect();\n\t\tconst width = box.width;\n\t\tif (width <= 0) return;\n\n\t\tconst card = strip.parentElement;\n\t\tconst radius = card\n\t\t\t? Math.min(20, parseFloat(getComputedStyle(card).borderTopLeftRadius) || 0)\n\t\t\t: 0;\n\t\tconst base = 1;\n\t\tconst clear = 5;\n\n\t\tconst knob = rightEl?.getBoundingClientRect();\n\t\tconst from = knob ? knob.left - box.left - clear : 0;\n\t\tconst to = knob ? knob.right - box.left + clear : 0;\n\t\tconst detour = knob !== undefined && knob.width > 0 && to > radius && from < width - radius;\n\n\t\tlet d =\n\t\t\tradius > 0 ? `M0 ${radius + base} A${radius} ${radius} 0 0 1 ${radius} ${base}` : `M0 ${base}`;\n\t\tif (detour) {\n\t\t\tconst r = (to - from) / 2;\n\t\t\td +=\n\t\t\t\t` L${from.toFixed(1)} ${base}` +\n\t\t\t\t` A${r.toFixed(1)} ${r.toFixed(1)} 0 0 1 ${to.toFixed(1)} ${base}`;\n\t\t}\n\t\td +=\n\t\t\tradius > 0\n\t\t\t\t? ` L${(width - radius).toFixed(1)} ${base} A${radius} ${radius} 0 0 1 ${width.toFixed(1)} ${radius + base}`\n\t\t\t\t: ` L${width.toFixed(1)} ${base}`;\n\n\t\tpath = d;\n\t\t// The rail turns the card's corner, so it needs as much height as that\n\t\t// corner is deep. Fixing it at 13px only ever suited a 12px radius —\n\t\t// anything rounder got the arc squashed into the strip.\n\t\tconst depth = Math.max(13, radius + base);\n\t\tsvgEl.setAttribute('viewBox', `0 0 ${width.toFixed(1)} ${depth}`);\n\t\tsvgEl.style.height = `${depth}px`;\n\t\t// Measured off a throwaway path so the reading never depends on when the\n\t\t// bound path element last rendered.\n\t\tconst probe = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\t\tprobe.setAttribute('d', d);\n\t\tsvgEl.appendChild(probe);\n\t\tlength = probe.getTotalLength();\n\t\tprobe.remove();\n\t}\n\n\t$effect(() => {\n\t\tif (!strip) return;\n\t\tbuild();\n\t\tconst ro = new ResizeObserver(build);\n\t\tro.observe(strip);\n\t\tif (rightEl) ro.observe(rightEl);\n\t\treturn () => ro.disconnect();\n\t});\n\n\n</script>\n\n<svelte:window onkeydown={(e) => e.key === 'Escape' && (open = false)} />\n\n<div class=\"strip\" bind:this={strip}>\n\t<button\n\t\ttype=\"button\"\n\t\tclass=\"line\"\n\t\taria-expanded={open}\n\t\taria-label={left100 === null\n\t\t\t? 'Context usage. Open details.'\n\t\t\t: `Context: ${left100}% left. Open details.`}\n\t\tonclick={() => (open = !open)}\n\t>\n\t\t<svg bind:this={svgEl} aria-hidden=\"true\">\n\t\t\t<path class=\"track\" d={path} />\n\t\t\t<path\n\t\t\t\tclass=\"fill\"\n\t\t\t\td={path}\n\t\t\t\tstyle=\"stroke: {color}; stroke-dasharray: {length}; stroke-dashoffset: {length *\n\t\t\t\t\t(1 - (used ?? 0) / 100)}\"\n\t\t\t/>\n\t\t</svg>\n\t</button>\n\n\t<div class=\"mount-right\" bind:this={rightEl}>{@render notch?.()}</div>\n\n\t{#if open}\n\t\t<div\n\t\t\tclass=\"pop\"\n\t\t\trole=\"dialog\"\n\t\t\taria-label=\"Context details\"\n\t\t\tuse:clickOutside={{ enabled: open, onOutside: () => (open = false) }}\n\t\t>\n\t\t\t<div class=\"pop-head\">\n\t\t\t\t<span class=\"pop-title\">Context</span>\n\t\t\t\t<span class=\"pop-big\">\n\t\t\t\t\t{#if left100 === null}{context ? compact(context.tokens) : '—'}{:else}{left100}<em>% left</em>{/if}\n\t\t\t\t</span>\n\t\t\t</div>\n\n\t\t\t{#if context && context.window && used !== null}\n\t\t\t\t<!-- the rail, unrolled: the popover shows the proportion it was\n\t\t\t\t opened to explain, rather than restating it as a word -->\n\t\t\t\t<div class=\"meter\">\n\t\t\t\t\t<div class=\"meter-fill\" style=\"width: {Math.min(100, used)}%; background: {color}\"></div>\n\t\t\t\t\t<div class=\"meter-mark\" style=\"left: {COMPACT_AT}%\"></div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"ends\">\n\t\t\t\t\t<span>{compact(context.tokens)} used</span>\n\t\t\t\t\t<span>{compact(context.window)}</span>\n\t\t\t\t</div>\n\t\t\t{:else if context}\n\t\t\t\t<div class=\"ends ends-solo\">\n\t\t\t\t\t<span>{compact(context.tokens)} in the last response</span>\n\t\t\t\t</div>\n\t\t\t{/if}\n\n\t\t\t{#if context}\n\t\t\t\t<div class=\"pop-foot\">\n\t\t\t\t\t<span class=\"model\">{context.model || 'unknown model'}</span>\n\t\t\t\t</div>\n\t\t\t{/if}\n\n\t\t\t{#if !context}\n\t\t\t\t<p class=\"pop-note\">\n\t\t\t\t\tNothing measured yet. The first response from Claude reports what the window holds.\n\t\t\t\t</p>\n\t\t\t{:else if !context.window}\n\t\t\t\t<p class=\"pop-note\">\n\t\t\t\t\tNo context window on record for this model, so there is no percentage to show.\n\t\t\t\t</p>\n\t\t\t{:else if used !== null && used >= COMPACT_AT}\n\t\t\t\t<p class=\"pop-note warn\">\n\t\t\t\t\tClaude compacts the conversation soon. Anything you want kept, say it now.\n\t\t\t\t</p>\n\t\t\t{:else}\n\t\t\t\t<p class=\"pop-note\">Claude compacts on its own near the mark, around {COMPACT_AT}%.</p>\n\t\t\t{/if}\n\t\t</div>\n\t{/if}\n</div>\n\n<style>\n\t.strip {\n\t\tposition: absolute;\n\t\tinset: -1px -1px auto -1px;\n\t\theight: 13px;\n\t\tz-index: 3;\n\t}\n\n\t.line {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\t/* Only the rail takes the click. The strip is taller than the line so\n\t\t the corner arc can draw, and anything below it belongs to the row\n\t\t underneath — which is the status line, whose buttons must win. */\n\t\tinset: 0 0 auto 0;\n\t\theight: 10px;\n\t\twidth: 100%;\n\t\tpadding: 0;\n\t\tborder: 0;\n\t\tbackground: transparent;\n\t\tcursor: pointer;\n\t}\n\t.line:focus-visible {\n\t\toutline: 2px solid #fbbf24;\n\t\toutline-offset: 3px;\n\t}\n\n\tsvg {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t\twidth: 100%;\n\t\theight: 13px;\n\t\toverflow: visible;\n\t\t/* Drawn as tall as the corner it turns, which overflows the button's\n\t\t hit band — decoration must not swallow the row below's clicks. */\n\t\tpointer-events: none;\n\t}\n\tpath {\n\t\tfill: none;\n\t\tstroke-width: 2;\n\t\tstroke-linecap: round;\n\t\tstroke-linejoin: round;\n\t}\n\t.track {\n\t\tstroke: rgba(245, 245, 244, 0.07);\n\t}\n\t.fill {\n\t\ttransition:\n\t\t\tstroke-dashoffset 0.35s ease,\n\t\t\tstroke 0.35s ease;\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.fill {\n\t\t\ttransition: none;\n\t\t}\n\t}\n\n\t/* centred on the rail's baseline, which is where the arc is drawn; the\n\t voice meter hangs off it, above the button */\n\t.mount-right {\n\t\tposition: absolute;\n\t\ttop: -20px;\n\t\tright: 15px;\n\t\tdisplay: flex;\n\t}\n\t.mount-right:empty {\n\t\tdisplay: none;\n\t}\n\n\t.pop {\n\t\tposition: absolute;\n\t\tleft: 12px;\n\t\tright: 12px;\n\t\tbottom: 10px;\n\t\tmax-width: 340px;\n\t\tbackground: #1a1a1c;\n\t\tborder: 1px solid #313135;\n\t\tborder-radius: 12px;\n\t\tpadding: 14px 15px 13px;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 10px;\n\t\tbox-shadow: 0 18px 40px rgba(0, 0, 0, 0.6);\n\t\tcolor: #f5f5f4;\n\t}\n\t.pop-head {\n\t\tdisplay: flex;\n\t\talign-items: baseline;\n\t\tjustify-content: space-between;\n\t\tgap: 12px;\n\t}\n\t.pop-title {\n\t\tfont-size: 10px;\n\t\tletter-spacing: 0.16em;\n\t\ttext-transform: uppercase;\n\t\tcolor: #78716c;\n\t}\n\t.pop-big {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 26px;\n\t\tline-height: 1;\n\t\tfont-variant-numeric: tabular-nums;\n\t}\n\t.pop-big em {\n\t\tfont-style: normal;\n\t\tfont-size: 13px;\n\t\tcolor: #a8a29e;\n\t\tmargin-left: 2px;\n\t}\n\n\t/* The rail this popover belongs to is a line that fills, so the popover\n\t shows the same line at full size rather than restating it in words. */\n\t.meter {\n\t\tposition: relative;\n\t\theight: 8px;\n\t\tborder-radius: 4px;\n\t\tbackground: rgba(245, 245, 244, 0.08);\n\t\toverflow: hidden;\n\t}\n\t.meter-fill {\n\t\tposition: absolute;\n\t\tinset: 0 auto 0 0;\n\t\tborder-radius: 4px;\n\t\ttransition: width 0.35s ease;\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.meter-fill {\n\t\t\ttransition: none;\n\t\t}\n\t}\n\t/* Where the rail turns amber — the one number on the bar worth marking. */\n\t.meter-mark {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\twidth: 1px;\n\t\tbackground: rgba(10, 10, 11, 0.75);\n\t}\n\n\t/* Figures sit under the end of the bar they describe, so the bar reads as\n\t the sentence and these are only its endpoints. */\n\t.ends {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\talign-items: baseline;\n\t\tgap: 8px;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 11px;\n\t\tfont-variant-numeric: tabular-nums;\n\t\tcolor: #a8a29e;\n\t}\n\t.ends-solo {\n\t\tjustify-content: flex-start;\n\t}\n\n\t.pop-foot {\n\t\tdisplay: flex;\n\t\tborder-top: 1px solid #2a2a2e;\n\t\tpadding-top: 10px;\n\t}\n\t.model {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 11px;\n\t\tcolor: #a8a29e;\n\t\tbackground: #232326;\n\t\tborder-radius: 5px;\n\t\tpadding: 3px 8px;\n\t}\n\n\t.pop-note {\n\t\tfont-size: 12px;\n\t\tline-height: 1.5;\n\t\tcolor: #78716c;\n\t\tmargin: 0;\n\t\ttext-wrap: pretty;\n\t}\n\t.pop-note.warn {\n\t\tcolor: #fbbf24;\n\t}\n</style>\n","<script lang=\"ts\">\n\timport { money } from '$lib/format';\n\timport { edgeColor, SEVERITY } from '$lib/severity';\n\timport { sessionStore } from '$lib/stores/sessions.svelte';\n\timport { usageStore } from '$lib/stores/usage.svelte';\n\n\t/** Load only says something once the box is struggling. */\n\tconst LOAD_FLOOR = 85;\n\n\t$effect(() => usageStore.subscribe());\n\n\tconst quota = $derived(usageStore.quota);\n\tconst stats = $derived(sessionStore.systemStats);\n\t/** Spend has no bar — it is not a share of anything — so it takes the label. */\n\tconst today = $derived(usageStore.today);\n\n\tinterface Chip {\n\t\tkey: string;\n\t\ttext: string;\n\t\tpercent: number;\n\t\t/** Colour, graded by the server where the server grades it. */\n\t\tcolor: string;\n\t}\n\n\t/** Labels share a length so the bars can share a width. */\n\tfunction shortLabel(label: string): string {\n\t\tconst text = label.toLowerCase();\n\t\tif (text.includes('session')) return '5h';\n\t\tconst model = text.match(/(opus|sonnet|haiku|fable|mythos)/)?.[1];\n\t\tif (model) return model;\n\t\tif (text.includes('week')) return 'wk';\n\t\treturn text.replace(/\\s*limit$/, '').split(/\\s+/)[0];\n\t}\n\n\tconst chips = $derived.by(() => {\n\t\tconst out: Chip[] = [];\n\t\tfor (const limit of quota?.available ? quota.limits : []) {\n\t\t\tout.push({\n\t\t\t\tkey: limit.kind,\n\t\t\t\ttext: `${shortLabel(limit.label)} ${Math.round(limit.percent)}%`,\n\t\t\t\tpercent: limit.percent,\n\t\t\t\t// The server grades plan limits itself, and the sidebar shows that\n\t\t\t\t// grade — recomputing here is how the two start disagreeing.\n\t\t\t\tcolor: limit.severity === 'normal' ? edgeColor(0) : SEVERITY[limit.severity].color\n\t\t\t});\n\t\t}\n\t\tif (stats) {\n\t\t\tif (stats.cpu >= LOAD_FLOOR)\n\t\t\t\tout.push({\n\t\t\t\t\tkey: 'cpu',\n\t\t\t\t\ttext: `cpu ${Math.round(stats.cpu)}%`,\n\t\t\t\t\tpercent: stats.cpu,\n\t\t\t\t\tcolor: edgeColor(stats.cpu)\n\t\t\t\t});\n\t\t\tif (stats.ram >= LOAD_FLOOR)\n\t\t\t\tout.push({\n\t\t\t\t\tkey: 'ram',\n\t\t\t\t\ttext: `ram ${Math.round(stats.ram)}%`,\n\t\t\t\t\tpercent: stats.ram,\n\t\t\t\t\tcolor: edgeColor(stats.ram)\n\t\t\t\t});\n\t\t}\n\t\treturn out;\n\t});\n</script>\n\n\n{#if chips.length > 0}\n\t<a class=\"tkey usage\" href=\"/usage\" title={chips.map((c) => c.text).join(' · ')}>\n\t\t<span class=\"bars\">\n\t\t\t{#each chips as chip (chip.key)}\n\t\t\t\t<span class=\"bar\" aria-label={chip.text}>\n\t\t\t\t\t<span style=\"width: {Math.min(100, chip.percent)}%; background: {chip.color}\"></span>\n\t\t\t\t</span>\n\t\t\t{/each}\n\t\t</span>\n\t\t<span>{today === null ? 'Usage' : money(today, true)}</span>\n\t</a>\n{/if}\n\n<style>\n\t/* A tile among tiles: the row is keycaps, so a loose glyph reads as dirt.\n\t It borrows the row's own .tkey shape and spends its face on the meters\n\t instead of an icon — the figures are one tap away, on /usage. */\n\t.usage {\n\t\ttext-decoration: none;\n\t\tgap: 3px;\n\t}\n\t.bars {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 3px;\n\t\twidth: 26px;\n\t}\n\t.bar {\n\t\tdisplay: block;\n\t\theight: 2px;\n\t\tborder-radius: 1px;\n\t\tbackground: rgba(245, 245, 244, 0.16);\n\t\toverflow: hidden;\n\t}\n\t.bar span {\n\t\tdisplay: block;\n\t\theight: 100%;\n\t\tborder-radius: 1px;\n\t}\n\n\t/* A phone has no width to spare, so the tile narrows to its contents —\n\t which is why the label is the shortest true thing it can say. */\n\t@media (max-width: 899px) {\n\t\t.usage {\n\t\t\tmin-width: 0;\n\t\t\tpadding: 0 5px;\n\t\t}\n\t\t.bars {\n\t\t\twidth: 24px;\n\t\t}\n\t}\n</style>\n","<script lang=\"ts\" module>\n\t/** One way to end a take: where what was said goes. */\n\texport interface VoiceAction {\n\t\tlabel: string;\n\t\ttitle: string;\n\t\ticon: string;\n\t\trun: () => void;\n\t}\n</script>\n\n<script lang=\"ts\">\n\timport { formatElapsed } from '$lib/format';\n\timport { voiceStore } from '$lib/stores/voice.svelte';\n\n\tinterface Props {\n\t\ttarget: string | null;\n\t\t/**\n\t\t * The ways out of a recording that keep it, in the order the composer\n\t\t * offers them for typed text: the panel is where the eye is during a\n\t\t * take, so it carries the same verbs rather than sending the thumb back\n\t\t * down for them.\n\t\t */\n\t\tactions?: VoiceAction[];\n\t}\n\n\tlet { target, actions = [] }: Props = $props();\n\n\tconst BARS = 12;\n\n\t/**\n\t * Recording state, hung above the microphone it belongs to: level, clock,\n\t * and the way out. Anchored to the button's right edge so a phone never\n\t * pushes it off screen.\n\t */\n\tconst owned = $derived(voiceStore.isOwnedBy(target));\n\tconst showing = $derived(owned && voiceStore.isActive);\n\tconst status = $derived(owned ? voiceStore.status : 'idle');\n\tconst lit = $derived(Math.min(BARS, Math.round(voiceStore.level.rms * 26)));\n\tconst clipping = $derived(voiceStore.level.peak >= 0.98);\n\tconst tooSoft = $derived(voiceStore.level.peak < 0.04);\n\n\t/** Read off the store's own start, so a meter that mounts mid-take is right. */\n\tlet now = $state(Date.now());\n\n\t$effect(() => {\n\t\tif (status !== 'recording') return;\n\t\tconst id = setInterval(() => (now = Date.now()), 500);\n\t\treturn () => clearInterval(id);\n\t});\n\n\tconst elapsed = $derived(\n\t\tvoiceStore.startedAt === null ? '0:00' : formatElapsed((now - voiceStore.startedAt) / 1000)\n\t);\n</script>\n\n{#if showing}\n\t<div class=\"meter\" class:clipping>\n\t\t<span\n\t\t\tclass=\"bars\"\n\t\t\ttitle={clipping\n\t\t\t\t? 'Clipping — too loud'\n\t\t\t\t: tooSoft\n\t\t\t\t\t? 'Too soft — speak louder or raise gain'\n\t\t\t\t\t: `Level ${(voiceStore.level.rms * 100).toFixed(0)}%`}\n\t\t>\n\t\t\t{#each Array(BARS) as _, i (i)}\n\t\t\t\t<span class=\"bar\" class:on={i < lit} style=\"--i: {i}\"></span>\n\t\t\t{/each}\n\t\t</span>\n\t\t<span class=\"clock\">\n\t\t\t{status === 'recording' ? elapsed : 'transcribing'}\n\t\t</span>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"btn drop\"\n\t\t\taria-label=\"Discard recording\"\n\t\t\ttitle=\"Discard recording / transcription\"\n\t\t\tonclick={() => void voiceStore.cancel()}\n\t\t>\n\t\t\t<iconify-icon icon=\"mdi:close\"></iconify-icon>\n\t\t</button>\n\t\t{#if status === 'recording'}\n\t\t\t{#each actions as action, i (action.label)}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"btn\"\n\t\t\t\t\tclass:keep={i === 0}\n\t\t\t\t\tclass:also={i > 0}\n\t\t\t\t\taria-label={action.label}\n\t\t\t\t\ttitle={action.title}\n\t\t\t\t\tonclick={action.run}\n\t\t\t\t>\n\t\t\t\t\t<iconify-icon icon={action.icon}></iconify-icon>\n\t\t\t\t</button>\n\t\t\t{/each}\n\t\t{/if}\n\t</div>\n{/if}\n\n<style>\n\t.meter {\n\t\tposition: absolute;\n\t\tbottom: calc(100% + 8px);\n\t\tright: 0;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\theight: 44px;\n\t\tpadding: 0 5px 0 12px;\n\t\tbackground: #1a1a1a;\n\t\tborder: 1px solid #333;\n\t\tborder-radius: 22px;\n\t\twhite-space: nowrap;\n\t\tbox-shadow: 0 6px 18px rgba(0, 0, 0, 0.45);\n\t}\n\t.clipping {\n\t\tborder-color: rgba(220, 38, 38, 0.6);\n\t}\n\n\t.bars {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 2px;\n\t\theight: 16px;\n\t}\n\t.bar {\n\t\twidth: 2px;\n\t\theight: calc(5px + var(--i) * 0.9px);\n\t\tborder-radius: 1px;\n\t\tbackground: #3f3c39;\n\t}\n\t.bar.on {\n\t\tbackground: #34d399;\n\t}\n\t.bar.on:nth-child(n + 9) {\n\t\tbackground: #fbbf24;\n\t}\n\t.bar.on:nth-child(n + 12) {\n\t\tbackground: #f87171;\n\t}\n\n\t.clock {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 11px;\n\t\tfont-variant-numeric: tabular-nums;\n\t\tcolor: #a8a29e;\n\t}\n\n\t/* Every verb is the same key, sized for a thumb rather than a cursor —\n\t the panel is read at arm's length on a phone, mid-sentence. */\n\t.btn {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 34px;\n\t\theight: 34px;\n\t\tborder-radius: 50%;\n\t\tborder: 0;\n\t\tbackground: transparent;\n\t\tfont-size: 20px;\n\t\tcursor: pointer;\n\t\ttouch-action: manipulation;\n\t}\n\t.drop {\n\t\tcolor: #fca5a5;\n\t}\n\t.drop:hover {\n\t\tbackground: rgba(220, 38, 38, 0.18);\n\t}\n\t.keep {\n\t\tcolor: #34d399;\n\t}\n\t.keep:hover {\n\t\tbackground: rgba(22, 163, 74, 0.2);\n\t}\n\t.also {\n\t\tcolor: #d6d3d1;\n\t}\n\t.also:hover {\n\t\tbackground: rgba(255, 255, 255, 0.1);\n\t}\n</style>\n","/** The image formats the dashboard serves and draws, by extension. Browser-safe: no node imports. */\nconst IMAGE_MIME_TYPES: Record<string, string> = {\n\t'.png': 'image/png',\n\t'.jpg': 'image/jpeg',\n\t'.jpeg': 'image/jpeg',\n\t'.gif': 'image/gif',\n\t'.webp': 'image/webp'\n};\n\n/** The image MIME type for a path, or null when it is not an image the dashboard serves. */\nexport function imageMimeFor(path: string): string | null {\n\tconst dot = path.lastIndexOf('.');\n\t// Like path.extname: a leading dot names a dotfile, not an extension.\n\tif (dot <= path.lastIndexOf('/') + 1) return null;\n\treturn IMAGE_MIME_TYPES[path.slice(dot).toLowerCase()] ?? null;\n}\n","<script lang=\"ts\">\n\t/**\n\t * Everything waiting to reach the agent, in one place, attached to the top\n\t * edge of the composer: text typed into the pane's own prompt box, which\n\t * must be sent or cleared before anything else can go in (a paste would\n\t * join the two); claude-mux's own queue (it can be reordered, edited,\n\t * steered into the running turn, or dropped); then what sits in Claude\n\t * Code's in-pane queue, which only Claude Code can reorder and which offers\n\t * the one action it has — send now.\n\t *\n\t * The layout follows t3code's QueuedRunsControl\n\t * (https://github.com/pingdotgg/t3code, apps/web/src/components/chat/QueuedRunsControl.tsx,\n\t * MIT, © T3 Tools Inc.), adapted to a server-held queue.\n\t */\n\timport * as Collapsible from '$lib/components/ui/collapsible';\n\timport type { QueuedMessageInfo } from '$shared/types/ws-messages.js';\n\timport { STEERS, type SteerMode } from '$lib/constants';\n\n\tconst STEER_MODES = Object.keys(STEERS) as SteerMode[];\n\timport { imageMimeFor } from '$shared/utils/image-types.js';\n\n\tlet {\n\t\ttarget,\n\t\tbase = '',\n\t\tsessionId = null,\n\t\tqueue,\n\t\tpaneQueue = [],\n\t\tbusy = false,\n\t\teditingId = null,\n\t\tpaneDraft = null,\n\t\tcomposerHasText = false,\n\t\tonEdit,\n\t\tonSendDraft,\n\t\tonClearDraft\n\t}: {\n\t\ttarget: string;\n\t\t/** The relay path to the session's machine, '' for this one. */\n\t\tbase?: string;\n\t\t/** Attachments are stored per session id, which the thumbnails are fetched by. */\n\t\tsessionId?: string | null;\n\t\tqueue: QueuedMessageInfo[];\n\t\t/** Messages typed into Claude Code's own queue, read off the pane. */\n\t\tpaneQueue?: string[];\n\t\t/** A turn is running, so a steer or send-now has somewhere to go. */\n\t\tbusy?: boolean;\n\t\t/** The item the composer is editing, drawn as such. */\n\t\teditingId?: string | null;\n\t\t/** What is typed in the pane's prompt box, where the terminal is not on screen to show it. */\n\t\tpaneDraft?: string | null;\n\t\t/** The composer holds a message the typed text stands in the way of. */\n\t\tcomposerHasText?: boolean;\n\t\tonEdit: (item: QueuedMessageInfo) => void;\n\t\t/** Submit the pane's typed text as it stands. */\n\t\tonSendDraft?: () => void;\n\t\t/** Empty the pane's prompt box. */\n\t\tonClearDraft?: () => void;\n\t} = $props();\n\n\tlet open = $state(true);\n\tlet error = $state<string | null>(null);\n\t/** The item being dragged by its grip, and the slot it would land in. */\n\tlet drag = $state<{ id: string; from: number; to: number } | null>(null);\n\tlet listEl: HTMLElement | null = $state(null);\n\t/** The rows' vertical midpoints, measured once when a drag starts. */\n\tlet midpoints: number[] = [];\n\n\tconst total = $derived(queue.length + paneQueue.length + (paneDraft ? 1 : 0));\n\tconst api = $derived(`${base}/api/sessions/${encodeURIComponent(target)}`);\n\n\tasync function call(path: string, method: string, body?: object): Promise<void> {\n\t\terror = null;\n\t\tconst res = await fetch(`${api}/${path}`, {\n\t\t\tmethod,\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tbody: body ? JSON.stringify(body) : undefined\n\t\t});\n\t\tif (!res.ok) {\n\t\t\tconst data = (await res.json().catch(() => ({}))) as { error?: string };\n\t\t\terror = data.error ?? res.statusText;\n\t\t}\n\t}\n\n\t// By id: the drain may send the head between this render and the request.\n\tconst remove = (id: string) => call('queue', 'DELETE', { id });\n\tconst move = (fromIndex: number, toIndex: number) => {\n\t\tif (toIndex < 0 || toIndex >= queue.length || toIndex === fromIndex) return;\n\t\tvoid call('queue', 'PATCH', { id: queue[fromIndex].id, toIndex });\n\t};\n\tconst steer = (id: string, mode: SteerMode) => call('steer', 'POST', { id, mode });\n\tconst sendNow = () => call('send-now', 'POST');\n\n\tfunction onGripKey(e: KeyboardEvent, index: number) {\n\t\tif (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n\t\t\te.preventDefault();\n\t\t\tmove(index, index + (e.key === 'ArrowUp' ? -1 : 1));\n\t\t}\n\t}\n\n\t/** The slot a pointer at this height falls into: the last row whose midpoint it is past. */\n\tfunction slotAt(y: number): number {\n\t\tlet slot = 0;\n\t\tfor (const [i, mid] of midpoints.entries()) if (y > mid) slot = i;\n\t\treturn slot;\n\t}\n\n\tfunction onGripDown(e: PointerEvent, item: QueuedMessageInfo, index: number) {\n\t\tif (e.button !== 0) return;\n\t\t(e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n\t\tconst rows = listEl ? Array.from(listEl.querySelectorAll<HTMLElement>('[data-queue-row]')) : [];\n\t\tmidpoints = rows.map((row) => {\n\t\t\tconst r = row.getBoundingClientRect();\n\t\t\treturn r.top + r.height / 2;\n\t\t});\n\t\tdrag = { id: item.id, from: index, to: index };\n\t}\n\tfunction onGripMove(e: PointerEvent) {\n\t\tif (drag) drag.to = slotAt(e.clientY);\n\t}\n\tfunction onGripUp() {\n\t\tif (!drag) return;\n\t\tconst { from, to } = drag;\n\t\tdrag = null;\n\t\tmove(from, to);\n\t}\n\n\tconst fileName = (path: string) => path.split('/').pop() ?? path;\n\tconst thumbUrl = (id: string, path: string) =>\n\t\t`${base}/api/sessions/${encodeURIComponent(id)}/attach?path=${encodeURIComponent(path)}`;\n</script>\n\n{#if total > 0}\n\t<Collapsible.Root bind:open class=\"qs\">\n\t\t<div class=\"qs-head\">\n\t\t\t<Collapsible.Trigger class=\"qs-toggle\">\n\t\t\t\t<iconify-icon icon={open ? 'mdi:chevron-down' : 'mdi:chevron-right'}></iconify-icon>\n\t\t\t\tQueued ({total})\n\t\t\t</Collapsible.Trigger>\n\t\t\t{#if error}<span class=\"qs-error\" role=\"alert\">{error}</span>{/if}\n\t\t</div>\n\t\t<Collapsible.Content>\n\t\t\t<ul class=\"qs-list\" bind:this={listEl}>\n\t\t\t\t{#if paneDraft}\n\t\t\t\t\t<!-- Outside the list's drag order: it is not in any queue, and nothing\n\t\t\t\t\t can be pasted in until it goes. -->\n\t\t\t\t\t<li class=\"qs-row in-box\">\n\t\t\t\t\t\t<span class=\"qs-grip\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:console-line\"></iconify-icon>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<div class=\"qs-body\">\n\t\t\t\t\t\t\t<p class=\"qs-text\">\n\t\t\t\t\t\t\t\t<span class=\"qs-tag\">typed in the pane</span>\n\t\t\t\t\t\t\t\t{#if composerHasText}<span class=\"qs-tag blocks\">send or clear it first</span>{/if}\n\t\t\t\t\t\t\t\t{paneDraft}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"qs-actions\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"qs-btn\"\n\t\t\t\t\t\t\t\ttitle=\"Send what is typed in the pane\"\n\t\t\t\t\t\t\t\taria-label=\"Send\"\n\t\t\t\t\t\t\t\tonclick={() => onSendDraft?.()}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:send\"></iconify-icon>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"qs-btn qs-remove\"\n\t\t\t\t\t\t\t\ttitle=\"Clear the pane's prompt box\"\n\t\t\t\t\t\t\t\taria-label=\"Clear\"\n\t\t\t\t\t\t\t\tonclick={() => onClearDraft?.()}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:close\"></iconify-icon>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</li>\n\t\t\t\t{/if}\n\t\t\t\t{#each queue as item, i (item.id)}\n\t\t\t\t\t{@const dropHere = drag && drag.id !== item.id && drag.to === i}\n\t\t\t\t\t<li\n\t\t\t\t\t\tclass=\"qs-row\"\n\t\t\t\t\t\tdata-queue-row\n\t\t\t\t\t\tclass:editing={item.id === editingId}\n\t\t\t\t\t\tclass:dragging={drag?.id === item.id}\n\t\t\t\t\t\tclass:drop-above={dropHere && drag!.from > i}\n\t\t\t\t\t\tclass:drop-below={dropHere && drag!.from < i}\n\t\t\t\t\t>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"qs-grip\"\n\t\t\t\t\t\t\ttitle=\"Drag, or use the arrow keys, to reorder\"\n\t\t\t\t\t\t\taria-label={`Reorder message ${i + 1} of ${queue.length}`}\n\t\t\t\t\t\t\tdisabled={queue.length < 2}\n\t\t\t\t\t\t\tonkeydown={(e) => onGripKey(e, i)}\n\t\t\t\t\t\t\tonpointerdown={(e) => onGripDown(e, item, i)}\n\t\t\t\t\t\t\tonpointermove={onGripMove}\n\t\t\t\t\t\t\tonpointerup={onGripUp}\n\t\t\t\t\t\t\tonpointercancel={() => (drag = null)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:drag-vertical\"></iconify-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<div class=\"qs-body\">\n\t\t\t\t\t\t\t{#if item.attachments?.length}\n\t\t\t\t\t\t\t\t<div class=\"qs-thumbs\">\n\t\t\t\t\t\t\t\t\t{#each item.attachments as path (path)}\n\t\t\t\t\t\t\t\t\t\t{#if imageMimeFor(path) && sessionId}\n\t\t\t\t\t\t\t\t\t\t\t<img class=\"qs-thumb\" src={thumbUrl(sessionId, path)} alt={fileName(path)} title={fileName(path)} />\n\t\t\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"qs-thumb qs-file\" title={fileName(path)}>\n\t\t\t\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:file-outline\"></iconify-icon>\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t<p class=\"qs-text\">\n\t\t\t\t\t\t\t\t{#if item.kind === 'control'}<span class=\"qs-tag\">dashboard</span>{/if}\n\t\t\t\t\t\t\t\t{#if item.id === editingId}<span class=\"qs-tag edit\">editing</span>{/if}\n\t\t\t\t\t\t\t\t{item.text}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"qs-actions\">\n\t\t\t\t\t\t\t{#if item.kind === 'user'}\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"qs-btn\"\n\t\t\t\t\t\t\t\t\ttitle=\"Edit in the composer\"\n\t\t\t\t\t\t\t\t\taria-label=\"Edit\"\n\t\t\t\t\t\t\t\t\tonclick={() => onEdit(item)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:pencil-outline\"></iconify-icon>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t{#if busy}\n\t\t\t\t\t\t\t\t\t{#each STEER_MODES as mode (mode)}\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"qs-btn\"\n\t\t\t\t\t\t\t\t\t\t\ttitle={STEERS[mode].title}\n\t\t\t\t\t\t\t\t\t\t\taria-label={STEERS[mode].label}\n\t\t\t\t\t\t\t\t\t\t\tonclick={() => void steer(item.id, mode)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<iconify-icon icon={STEERS[mode].icon}></iconify-icon>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"qs-btn qs-remove\"\n\t\t\t\t\t\t\t\ttitle=\"Remove from the queue\"\n\t\t\t\t\t\t\t\taria-label=\"Remove\"\n\t\t\t\t\t\t\t\tonclick={() => void remove(item.id)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:close\"></iconify-icon>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</li>\n\t\t\t\t{/each}\n\t\t\t\t{#each paneQueue as text, i (i + text)}\n\t\t\t\t\t<li class=\"qs-row in-pane\">\n\t\t\t\t\t\t<span class=\"qs-grip\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:console-line\"></iconify-icon>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<div class=\"qs-body\">\n\t\t\t\t\t\t\t<p class=\"qs-text\"><span class=\"qs-tag\">in Claude's queue</span>{text}</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{#if busy && i === 0}\n\t\t\t\t\t\t\t<!-- Claude Code hands its whole queue over at once, so the\n\t\t\t\t\t\t\t action sits on the first row and covers them all. -->\n\t\t\t\t\t\t\t<div class=\"qs-actions\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"qs-btn qs-wide\"\n\t\t\t\t\t\t\t\t\ttitle=\"Hand Claude's queue to the running turn now\"\n\t\t\t\t\t\t\t\t\tonclick={() => void sendNow()}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:send-clock-outline\"></iconify-icon>Send now\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</li>\n\t\t\t\t{/each}\n\t\t\t</ul>\n\t\t</Collapsible.Content>\n\t</Collapsible.Root>\n{/if}\n\n<style>\n\t/* A shelf on the composer's top edge: narrower than the card, the same\n\t surface, so it reads as part of the composer rather than the transcript. */\n\t:global(.qs) {\n\t\tmargin: 0 14px;\n\t\tbackground: #1a1a1b;\n\t\tborder: 1px solid #2a2a2c;\n\t\tborder-bottom: 0;\n\t\tborder-radius: 12px 12px 0 0;\n\t\tpadding: 4px 6px 6px;\n\t\tanimation: shelf-in 140ms ease-out;\n\t}\n\t@media (min-width: 900px) {\n\t\t:global(.qs) {\n\t\t\twidth: calc(100% - 28px);\n\t\t\tmax-width: calc(62rem - 28px);\n\t\t\tmargin: 0 auto;\n\t\t}\n\t}\n\n\t.qs-head {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tmin-height: 26px;\n\t}\n\t:global(.qs-toggle) {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 4px;\n\t\tpadding: 2px 6px 2px 2px;\n\t\tborder: 0;\n\t\tborder-radius: 6px;\n\t\tbackground: transparent;\n\t\tcolor: #a8a29e;\n\t\tfont-size: 12px;\n\t\tcursor: pointer;\n\t}\n\t:global(.qs-toggle:hover) {\n\t\tcolor: #e7e5e4;\n\t}\n\t:global(.qs-toggle:focus-visible) {\n\t\toutline: 2px solid #f59e0b;\n\t\toutline-offset: 1px;\n\t}\n\t.qs-error {\n\t\tcolor: #f87171;\n\t\tfont-size: 11px;\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\n\t.qs-list {\n\t\tlist-style: none;\n\t\tmargin: 2px 0 0;\n\t\tpadding: 0;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 2px;\n\t\tmax-height: 30vh;\n\t\toverflow-y: auto;\n\t}\n\t.qs-row {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tgap: 4px;\n\t\tpadding: 4px 4px 4px 0;\n\t\tborder-radius: 8px;\n\t\tborder-top: 2px solid transparent;\n\t\tborder-bottom: 2px solid transparent;\n\t}\n\t.qs-row:hover {\n\t\tbackground: #222224;\n\t}\n\t.qs-row.editing {\n\t\tbackground: #1f2a22;\n\t}\n\t.qs-row.dragging {\n\t\topacity: 0.5;\n\t}\n\t.qs-row.drop-above {\n\t\tborder-top-color: #57534e;\n\t}\n\t.qs-row.drop-below {\n\t\tborder-bottom-color: #57534e;\n\t}\n\t.qs-row.in-pane .qs-text {\n\t\tcolor: #8a8580;\n\t}\n\t.qs-tag.blocks {\n\t\tbackground: #3a2a0c;\n\t\tcolor: #fbbf24;\n\t}\n\n\t.qs-grip {\n\t\tflex: none;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 22px;\n\t\theight: 28px;\n\t\tborder: 0;\n\t\tborder-radius: 6px;\n\t\tbackground: transparent;\n\t\tcolor: #57534e;\n\t\tfont-size: 16px;\n\t\tcursor: grab;\n\t\ttouch-action: none;\n\t}\n\t.qs-grip:disabled {\n\t\tcursor: default;\n\t}\n\t.qs-grip:focus-visible {\n\t\toutline: 2px solid #f59e0b;\n\t\tcolor: #e7e5e4;\n\t}\n\t.qs-row.in-pane .qs-grip,\n\t.qs-row.in-box .qs-grip {\n\t\tcursor: default;\n\t\tfont-size: 13px;\n\t}\n\n\t.qs-body {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\tpadding-top: 5px;\n\t}\n\t.qs-text {\n\t\tmargin: 0;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 12px;\n\t\tline-height: 1.45;\n\t\tcolor: #d6d3d1;\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t\tdisplay: -webkit-box;\n\t\t-webkit-box-orient: vertical;\n\t\t-webkit-line-clamp: 2;\n\t\tline-clamp: 2;\n\t\toverflow: hidden;\n\t}\n\t.qs-tag {\n\t\tmargin-right: 6px;\n\t\tpadding: 0 5px;\n\t\tborder-radius: 4px;\n\t\tbackground: #2a2a2c;\n\t\tcolor: #a8a29e;\n\t\tfont-size: 10.5px;\n\t}\n\t.qs-tag.edit {\n\t\tbackground: #14532d;\n\t\tcolor: #d6f5e0;\n\t}\n\n\t.qs-thumbs {\n\t\tdisplay: flex;\n\t\tgap: 4px;\n\t\tmargin-bottom: 4px;\n\t}\n\t.qs-thumb {\n\t\twidth: 32px;\n\t\theight: 32px;\n\t\tborder-radius: 5px;\n\t\tobject-fit: cover;\n\t\tbackground: #2a2a2c;\n\t}\n\t.qs-file {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tcolor: #a8a29e;\n\t}\n\n\t.qs-actions {\n\t\tflex: none;\n\t\tdisplay: flex;\n\t\tgap: 2px;\n\t}\n\t.qs-btn {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tgap: 4px;\n\t\tmin-width: 30px;\n\t\theight: 28px;\n\t\tpadding: 0 6px;\n\t\tborder: 0;\n\t\tborder-radius: 6px;\n\t\tbackground: transparent;\n\t\tcolor: #a8a29e;\n\t\tfont-size: 15px;\n\t\tcursor: pointer;\n\t}\n\t.qs-btn:hover {\n\t\tbackground: #2e2926;\n\t\tcolor: #e7e5e4;\n\t}\n\t.qs-btn:focus-visible {\n\t\toutline: 2px solid #f59e0b;\n\t\toutline-offset: 1px;\n\t}\n\t.qs-remove:hover {\n\t\tbackground: #3a1a1a;\n\t\tcolor: #f87171;\n\t}\n\t.qs-wide {\n\t\tfont-size: 12px;\n\t}\n\t.qs-wide iconify-icon {\n\t\tfont-size: 15px;\n\t}\n\n\t@keyframes shelf-in {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: translateY(4px);\n\t\t}\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:global(.qs) {\n\t\t\tanimation: none;\n\t\t}\n\t}\n</style>\n","<script lang=\"ts\">\n\timport { Button } from '$lib/components/ui/button';\n\timport { Checkbox } from '$lib/components/ui/checkbox';\n\timport { longPress } from '$lib/actions/longPress';\n\timport { clickOutside } from '$lib/actions/clickOutside';\n\timport { voiceStore, type VoiceLanguage } from '$lib/stores/voice.svelte';\n\timport { listAudioInputs, type AudioInputDevice } from '$lib/voice/recorder';\n\n\tinterface Props {\n\t\ttarget: string | null;\n\t\t/**\n\t\t * The tap. The composer owns the take and what becomes of the words, so\n\t\t * this button, the hotkey and the gamepad all go through its one toggle.\n\t\t */\n\t\tonToggle: () => void;\n\t}\n\n\tlet { target, onToggle }: Props = $props();\n\n\tconst supported = $derived(voiceStore.supported);\n\t// Voice is a single-mic singleton owned by the page that started it; non-owner\n\t// pages render as idle so stray clicks/hotkeys/Esc can't hijack it.\n\tconst isOwner = $derived(voiceStore.isOwnedBy(target));\n\tconst busyElsewhere = $derived(voiceStore.isActive && !isOwner);\n\tconst status = $derived(isOwner ? voiceStore.status : 'idle');\n\tconst errorMsg = $derived(isOwner ? voiceStore.error : null);\n\n\tconst MAX_RECORDING_MS = 10 * 60 * 1000;\n\tconst LONG_TRANSCRIBE_MS = 5000;\n\n\tlet isLongTranscribe = $state(false);\n\tlet menuOpen = $state(false);\n\tlet devices = $state<AudioInputDevice[]>([]);\n\n\t$effect(() => {\n\t\tif (status !== 'transcribing') {\n\t\t\tisLongTranscribe = false;\n\t\t\treturn;\n\t\t}\n\t\tconst id = setTimeout(() => {\n\t\t\tisLongTranscribe = true;\n\t\t}, LONG_TRANSCRIBE_MS);\n\t\treturn () => clearTimeout(id);\n\t});\n\n\t// A take left running is stopped, and kept, before it outgrows what one upload carries.\n\t$effect(() => {\n\t\tif (status !== 'recording') return;\n\t\tconst auto = setTimeout(toggleVoice, MAX_RECORDING_MS);\n\t\treturn () => clearTimeout(auto);\n\t});\n\n\tfunction toggleVoice(): void {\n\t\tif (!busyElsewhere && target) onToggle();\n\t}\n\n\tasync function openMenu(): Promise<void> {\n\t\ttry {\n\t\t\tdevices = await listAudioInputs();\n\t\t} catch {\n\t\t\tdevices = [];\n\t\t}\n\t\tmenuOpen = true;\n\t}\n\n\tfunction canOpenMenu(): boolean {\n\t\treturn !busyElsewhere && (status === 'idle' || status === 'error');\n\t}\n\n\tfunction handleContextMenu(e: MouseEvent): void {\n\t\tif (!canOpenMenu()) return;\n\t\te.preventDefault();\n\t\tvoid openMenu();\n\t}\n\n\tconst buttonTitle = $derived.by(() => {\n\t\tif (busyElsewhere) {\n\t\t\treturn `Voice ${voiceStore.status} on ${voiceStore.ownerTarget}. Switch to that session to control it.`;\n\t\t}\n\t\tif (errorMsg) return errorMsg;\n\t\tif (status === 'transcribing')\n\t\t\treturn isLongTranscribe\n\t\t\t\t? 'First-run setup. ✕ or Esc to cancel.'\n\t\t\t\t: 'Transcribing. ✕ or Esc to cancel.';\n\t\tif (status === 'recording')\n\t\t\treturn 'Tap or F2/Pause/Ctrl+` to stop. ✕ or Esc to discard.';\n\t\treturn 'Tap or focus input then F2/Pause/Ctrl+` to record. Long-press or right-click for settings.';\n\t});\n\n\tfunction setLanguage(lang: VoiceLanguage): void {\n\t\tvoiceStore.language = lang;\n\t}\n\n\tfunction setDevice(e: Event): void {\n\t\tconst value = (e.target as HTMLSelectElement).value;\n\t\tvoiceStore.deviceId = value || null;\n\t}\n\n\tfunction setAutoSubmit(checked: boolean | 'indeterminate'): void {\n\t\tvoiceStore.autoSubmit = checked === true;\n\t}\n\n\tfunction setGain(e: Event): void {\n\t\tconst value = parseFloat((e.target as HTMLInputElement).value);\n\t\tif (!Number.isNaN(value)) voiceStore.gain = value;\n\t}\n\n\tfunction setNoiseSuppression(checked: boolean | 'indeterminate'): void {\n\t\tvoiceStore.noiseSuppression = checked === true;\n\t}\n\n\tfunction showUnsupportedReason(): void {\n\t\tconst reason = voiceStore.unsupportedReason ?? 'Voice not supported.';\n\t\talert(reason);\n\t}\n</script>\n\n<div\n\tclass=\"voice-btn-wrapper round\"\n\toncontextmenu={supported ? handleContextMenu : undefined}\n\trole=\"presentation\"\n\tuse:longPress={{\n\t\tonTrigger: () => void openMenu(),\n\t\tenabled: () => supported && canOpenMenu()\n\t}}\n\tuse:clickOutside={{\n\t\tenabled: menuOpen,\n\t\tonOutside: () => (menuOpen = false)\n\t}}\n>\n\t{#if !supported}\n\t\t<Button\n\t\t\tvariant=\"secondary\"\n\t\t\tsize=\"toolbar\"\n\t\t\tclass=\"flex-1 voice-btn unsupported\"\n\t\t\tonclick={showUnsupportedReason}\n\t\t\ttitle={voiceStore.unsupportedReason ?? 'Voice not supported'}\n\t\t>\n\t\t\t<iconify-icon icon=\"mdi:microphone-off\"></iconify-icon>\n\t\t\t<span>Mic</span>\n\t\t</Button>\n\t{:else}\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"voice-round {status}\"\n\t\t\tdisabled={!target || busyElsewhere}\n\t\t\tonclick={() => void toggleVoice()}\n\t\t\ttitle={buttonTitle}\n\t\t\taria-label={buttonTitle}\n\t\t>\n\t\t\t{#if busyElsewhere}\n\t\t\t\t<iconify-icon icon=\"mdi:microphone-off\"></iconify-icon>\n\t\t\t{:else if status === 'transcribing'}\n\t\t\t\t<iconify-icon icon=\"mdi:loading\" class=\"spin\"></iconify-icon>\n\t\t\t{:else if status === 'error'}\n\t\t\t\t<iconify-icon icon=\"mdi:microphone-off\"></iconify-icon>\n\t\t\t{:else}\n\t\t\t\t<iconify-icon icon=\"mdi:microphone\"></iconify-icon>\n\t\t\t{/if}\n\t\t</button>\n\t{/if}\n\n\t\t{#if menuOpen}\n\t\t\t<div class=\"voice-menu\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"voice-menu-close\"\n\t\t\t\t\taria-label=\"Close settings\"\n\t\t\t\t\tonclick={() => (menuOpen = false)}\n\t\t\t\t>\n\t\t\t\t\t<iconify-icon icon=\"mdi:close\"></iconify-icon>\n\t\t\t\t</button>\n\t\t\t\t<div class=\"setting-row\">\n\t\t\t\t\t<span class=\"setting-label\">Language</span>\n\t\t\t\t\t<div class=\"lang-row\">\n\t\t\t\t\t\t{#each ['auto', 'en', 'pt'] as const as lang}\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant={voiceStore.language === lang ? 'success' : 'secondary'}\n\t\t\t\t\t\t\t\tsize=\"toolbar\"\n\t\t\t\t\t\t\t\tclass=\"flex-1\"\n\t\t\t\t\t\t\t\tonclick={() => setLanguage(lang)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{lang.toUpperCase()}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<label class=\"setting-row inline\">\n\t\t\t\t\t<Checkbox\n\t\t\t\t\t\tchecked={voiceStore.autoSubmit}\n\t\t\t\t\t\tonCheckedChange={setAutoSubmit}\n\t\t\t\t\t/>\n\t\t\t\t\t<span class=\"setting-label inline\">Send when the recording stops</span>\n\t\t\t\t</label>\n\n\t\t\t\t<div class=\"setting-row\">\n\t\t\t\t\t<label class=\"setting-label\" for=\"voice-gain\">\n\t\t\t\t\t\tGain ×{voiceStore.gain.toFixed(1)}\n\t\t\t\t\t</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"voice-gain\"\n\t\t\t\t\t\ttype=\"range\"\n\t\t\t\t\t\tmin=\"1\"\n\t\t\t\t\t\tmax=\"6\"\n\t\t\t\t\t\tstep=\"0.5\"\n\t\t\t\t\t\tvalue={voiceStore.gain}\n\t\t\t\t\t\toninput={setGain}\n\t\t\t\t\t\tclass=\"gain-slider\"\n\t\t\t\t\t/>\n\t\t\t\t\t<p class=\"setting-hint\">Boost quiet voice. Higher = louder + more noise.</p>\n\t\t\t\t</div>\n\n\t\t\t\t<label class=\"setting-row inline\">\n\t\t\t\t\t<Checkbox\n\t\t\t\t\t\tchecked={voiceStore.noiseSuppression}\n\t\t\t\t\t\tonCheckedChange={setNoiseSuppression}\n\t\t\t\t\t/>\n\t\t\t\t\t<span class=\"setting-label inline\">Noise suppression (off helps very quiet speech)</span>\n\t\t\t\t</label>\n\n\t\t\t\t<div class=\"setting-row\">\n\t\t\t\t\t<label class=\"setting-label\" for=\"voice-device\">Microphone</label>\n\t\t\t\t\t<select\n\t\t\t\t\t\tid=\"voice-device\"\n\t\t\t\t\t\tclass=\"device-select\"\n\t\t\t\t\t\tvalue={voiceStore.deviceId ?? ''}\n\t\t\t\t\t\tonchange={setDevice}\n\t\t\t\t\t>\n\t\t\t\t\t\t<option value=\"\">System default</option>\n\t\t\t\t\t\t{#each devices as d (d.deviceId)}\n\t\t\t\t\t\t\t<option value={d.deviceId}>{d.label}</option>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</select>\n\t\t\t\t\t{#if devices.length === 0}\n\t\t\t\t\t\t<p class=\"setting-hint\">Allow mic access first to see device names.</p>\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t{/if}\n\t</div>\n\n<style>\n\t.voice-btn-wrapper {\n\t\tposition: relative;\n\t\tdisplay: flex;\n\t\tflex: 1;\n\t}\n\n\t.voice-btn-wrapper.round {\n\t\tflex: none;\n\t\twidth: 42px;\n\t\theight: 42px;\n\t}\n\n\t.voice-round {\n\t\twidth: 42px;\n\t\theight: 42px;\n\t\tborder-radius: 50%;\n\t\tborder: 1px solid #333;\n\t\tbackground: #222;\n\t\tcolor: #f5f5f4;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tfont-size: 19px;\n\t\tcursor: pointer;\n\t\ttouch-action: none;\n\t\tuser-select: none;\n\t\t/* punches the rail's channel out of the panel behind it */\n\t\tbox-shadow: 0 0 0 4px #111;\n\t}\n\t.voice-round:hover:not(:disabled) {\n\t\tbackground: #333;\n\t}\n\t.voice-round:disabled {\n\t\topacity: 0.5;\n\t\tcursor: default;\n\t}\n\t.voice-round.recording,\n\t.voice-round.error {\n\t\tbackground: #b91c1c;\n\t\tborder-color: #b91c1c;\n\t\tcolor: #fff;\n\t}\n\n\t:global(.voice-btn) {\n\t\ttouch-action: none;\n\t\tuser-select: none;\n\t\twidth: 100%;\n\t}\n\n\t.spin {\n\t\tanimation: voice-spin 1s linear infinite;\n\t\tdisplay: inline-block;\n\t}\n\n\t@keyframes voice-spin {\n\t\tto { transform: rotate(360deg); }\n\t}\n\n\t.voice-menu {\n\t\tposition: absolute;\n\t\tbottom: calc(100% + 6px);\n\t\tright: 0;\n\t\twidth: 18rem;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 0.85rem;\n\t\tpadding: 0.8rem;\n\t\tbackground: #1a1a1a;\n\t\tborder: 1px solid #333;\n\t\tborder-radius: 6px;\n\t\tbox-shadow: 0 6px 18px rgba(0, 0, 0, 0.4);\n\t\tz-index: var(--z-floating);\n\t}\n\n\t.voice-menu-close {\n\t\tposition: absolute;\n\t\ttop: 0.3rem;\n\t\tright: 0.3rem;\n\t\twidth: 1.6rem;\n\t\theight: 1.6rem;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tbackground: transparent;\n\t\tborder: 0;\n\t\tborder-radius: 4px;\n\t\tcolor: #aaa;\n\t\tfont-size: 1rem;\n\t\tcursor: pointer;\n\t\tpadding: 0;\n\t}\n\n\t.voice-menu-close:hover {\n\t\tbackground: #2a2a2a;\n\t\tcolor: #eee;\n\t}\n\n\t.setting-row {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 0.4rem;\n\t}\n\n\t.setting-row.inline {\n\t\tflex-direction: row;\n\t\talign-items: center;\n\t\tgap: 0.5rem;\n\t\tcursor: pointer;\n\t}\n\n\t.setting-label {\n\t\tfont-size: 0.72rem;\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.06em;\n\t\tcolor: #aaa;\n\t}\n\n\t.setting-label.inline {\n\t\ttext-transform: none;\n\t\tletter-spacing: normal;\n\t\tcolor: #ddd;\n\t\tfont-size: 0.85rem;\n\t}\n\n\t.lang-row {\n\t\tdisplay: flex;\n\t\tgap: 0.35rem;\n\t}\n\n\t.gain-slider {\n\t\twidth: 100%;\n\t\taccent-color: #84cc16;\n\t}\n\n\t.device-select {\n\t\twidth: 100%;\n\t\tpadding: 0.4rem 0.5rem;\n\t\tbackground: #222;\n\t\tcolor: #eee;\n\t\tborder: 1px solid #444;\n\t\tborder-radius: 4px;\n\t\tfont-size: 0.85rem;\n\t}\n\n\t.setting-hint {\n\t\tfont-size: 0.7rem;\n\t\tcolor: #888;\n\t\tmargin: 0;\n\t}\n</style>\n","<script lang=\"ts\">\n\t/**\n\t * The keys that drive the pane, in a well cut into the composer.\n\t *\n\t * One grid, one unit: every key is 42×30 or a whole-number span of it, so\n\t * nothing is sized by its own label. The arrow cluster keeps the two cells\n\t * beside Up empty — that gap is what makes an inverted T read as arrows in\n\t * peripheral vision, and filling it is what made the old 4×2 block\n\t * unreadable.\n\t *\n\t * Words for named keys, glyphs for direction. Chords use tmux's own `C-x`\n\t * notation, because that is the vocabulary this app already speaks.\n\t */\n\tinterface Props {\n\t\topen: boolean;\n\t\tctrlCount: number;\n\t\taltCount: number;\n\t\tonKeys: (keys: string) => void;\n\t\tonCycleCtrl: () => void;\n\t\tonCycleAlt: () => void;\n\t\t/** Put the draft in the prompt without submitting it. */\n\t\tonPutInPrompt: () => void;\n\t\t/** Take Claude Code's own suggestion: Tab, then Enter. */\n\t\tonAcceptSuggestion: () => void;\n\t\t/** Wipe whatever sits in the pane's prompt box. */\n\t\tonClearPrompt: () => void;\n\t}\n\n\tlet {\n\t\topen,\n\t\tctrlCount,\n\t\taltCount,\n\t\tonKeys,\n\t\tonCycleCtrl,\n\t\tonCycleAlt,\n\t\tonPutInPrompt,\n\t\tonAcceptSuggestion,\n\t\tonClearPrompt\n\t}: Props = $props();\n\n\tconst armed = $derived(ctrlCount > 0 || altCount > 0);\n\n\t/** Hold an arrow to repeat it, the way a real key repeats. */\n\tconst REPEAT_DELAY = 400;\n\tconst REPEAT_EVERY = 60;\n\tlet holdTimer: ReturnType<typeof setTimeout> | null = null;\n\tlet repeatTimer: ReturnType<typeof setInterval> | null = null;\n\n\tfunction startRepeat(keys: string) {\n\t\tstopRepeat();\n\t\tholdTimer = setTimeout(() => {\n\t\t\trepeatTimer = setInterval(() => onKeys(keys), REPEAT_EVERY);\n\t\t}, REPEAT_DELAY);\n\t}\n\n\tfunction stopRepeat() {\n\t\tif (holdTimer) clearTimeout(holdTimer);\n\t\tif (repeatTimer) clearInterval(repeatTimer);\n\t\tholdTimer = null;\n\t\trepeatTimer = null;\n\t}\n\n\t// Pointer capture can end without an up or a leave — and the tray itself is\n\t// removed by Ctrl+. or by leaving the session — so the timers need a\n\t// teardown that does not depend on the pointer reaching a handler.\n\t$effect(() => stopRepeat);\n\n\t/** The cluster, in the order a keyboard draws it. */\n\tconst ARROWS: { keys: string; cls: string; icon: string; label: string }[] = [\n\t\t{ keys: 'Up', cls: 'k-up', icon: 'mdi:arrow-up', label: 'Up' },\n\t\t{ keys: 'Left', cls: 'k-left', icon: 'mdi:arrow-left', label: 'Left' },\n\t\t{ keys: 'Down', cls: 'k-down', icon: 'mdi:arrow-down', label: 'Down' },\n\t\t{ keys: 'Right', cls: 'k-right', icon: 'mdi:arrow-right', label: 'Right' }\n\t];\n\n\tconst CHORDS = ['C-c', 'C-l', 'C-r', 'C-u', 'C-w'];\n\n\t/** The rest of what the More popover used to hide, so nothing is lost with it. */\n\tconst EXTRAS: { label: string; keys: string }[] = [\n\t\t{ label: 'bksp', keys: 'BSpace' },\n\t\t{ label: 'space', keys: 'Space' },\n\t\t{ label: 'y', keys: 'y' },\n\t\t{ label: '⇧tab', keys: 'BTab' }\n\t];\n</script>\n\n{#if open}\n\t<div class=\"tray\" class:armed>\n\t\t<div class=\"tray-body\">\n\t\t\t<div class=\"keys\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"k\"\n\t\t\t\t\tclass:on={ctrlCount > 0}\n\t\t\t\t\tonclick={onCycleCtrl}\n\t\t\t\t\ttitle=\"Arm Ctrl — the next Enter sends your line as a Ctrl sequence\"\n\t\t\t\t>\n\t\t\t\t\tctrl\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"k\"\n\t\t\t\t\tclass:on={altCount > 0}\n\t\t\t\t\tonclick={onCycleAlt}\n\t\t\t\t\ttitle=\"Arm Alt — the next Enter sends your line as a Meta sequence\"\n\t\t\t\t>\n\t\t\t\t\talt\n\t\t\t\t</button>\n\t\t\t\t<button type=\"button\" class=\"k\" onclick={() => onKeys('Escape')}>esc</button>\n\t\t\t\t<button type=\"button\" class=\"k\" onclick={() => onKeys('Tab')}>tab</button>\n\t\t\t\t<button type=\"button\" class=\"k k-pgup\" onclick={() => onKeys('PageUp')}>pgup</button>\n\t\t\t\t<button type=\"button\" class=\"k k-pgdn\" onclick={() => onKeys('PageDown')}>pgdn</button>\n\n\t\t\t\t{#each ARROWS as arrow (arrow.keys)}\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"k {arrow.cls}\"\n\t\t\t\t\t\taria-label={arrow.label}\n\t\t\t\t\t\tonclick={() => onKeys(arrow.keys)}\n\t\t\t\t\t\tonpointerdown={() => startRepeat(arrow.keys)}\n\t\t\t\t\t\tonpointerup={stopRepeat}\n\t\t\t\t\t\tonpointerleave={stopRepeat}\n\t\t\t\t\t\tonpointercancel={stopRepeat}\n\t\t\t\t\t>\n\t\t\t\t\t\t<iconify-icon icon={arrow.icon}></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t{/each}\n\n\t\t\t\t<button type=\"button\" class=\"k wide k-a\" onclick={onPutInPrompt}>\n\t\t\t\t\t<iconify-icon icon=\"mdi:tray-arrow-up\"></iconify-icon>Put in prompt\n\t\t\t\t</button>\n\t\t\t\t<button type=\"button\" class=\"k wide k-b\" onclick={onAcceptSuggestion}>\n\t\t\t\t\t<iconify-icon icon=\"mdi:star-four-points-outline\"></iconify-icon>Accept suggestion\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class=\"side\">\n\t\t\t\t<div class=\"extras\">\n\t\t\t\t\t{#each EXTRAS as extra (extra.label)}\n\t\t\t\t\t\t<button type=\"button\" class=\"k\" onclick={() => onKeys(extra.keys)}>{extra.label}</button>\n\t\t\t\t\t{/each}\n\t\t\t\t\t<button type=\"button\" class=\"k\" onclick={onClearPrompt}>clear</button>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"chords\">\n\t\t\t\t\t<span class=\"cap\">chords</span>\n\t\t\t\t\t<div class=\"crow\">\n\t\t\t\t\t\t{#each CHORDS as chord (chord)}\n\t\t\t\t\t\t\t<button type=\"button\" class=\"k\" onclick={() => onKeys(chord)}>{chord}</button>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class=\"cap cap-gap\">jump</span>\n\t\t\t\t\t<div class=\"crow\">\n\t\t\t\t\t\t<button type=\"button\" class=\"k\" onclick={() => onKeys('Home')}>home</button>\n\t\t\t\t\t\t<button type=\"button\" class=\"k\" onclick={() => onKeys('End')}>end</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<button type=\"button\" class=\"k k-ent\" aria-label=\"Enter\" onclick={() => onKeys('Enter')}>\n\t\t\t<iconify-icon icon=\"mdi:keyboard-return\"></iconify-icon>\n\t\t</button>\n\t</div>\n{/if}\n\n<style>\n\t/* A well cut into the card: darker than it, not lighter, so the keys are\n\t the only lit things in it. */\n\t.tray {\n\t\tposition: relative;\n\t\t/* The chords column answers to how wide the tray actually is. The\n\t\t viewport is the wrong question: a resizable sidebar sits between the\n\t\t window's edge and this card. */\n\t\tcontainer-type: inline-size;\n\t\tbackground: #08080a;\n\t\tborder-radius: 15px 15px 0 0;\n\t\tborder-bottom: 1px solid #202023;\n\t\tbox-shadow: inset 0 2px 5px rgba(0, 0, 0, 0.6);\n\t\tpadding: 12px 10px;\n\t\tdisplay: flex;\n\t\tgap: 12px;\n\t\talign-items: stretch;\n\t}\n\t/* Everything except Enter, which the tray keeps on its own right edge. */\n\t.tray-body {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\tgap: 12px 14px;\n\t\talign-items: flex-start;\n\t}\n\t/* An armed modifier lights the well's lower edge, beside the status line\n\t that names it — so a tray you glance past still shows it is armed. */\n\t.tray.armed::after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\tleft: 14px;\n\t\tright: 14px;\n\t\tbottom: -1px;\n\t\theight: 1px;\n\t\tbackground: linear-gradient(90deg, transparent, #fbbf24, transparent);\n\t\topacity: 0.65;\n\t}\n\n\t/* The grid holds its 42px unit wherever there is room for it, and gives the\n\t unit up rather than the layout on a phone too narrow for eight of them. */\n\t.keys {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(8, minmax(0, 42px));\n\t\tgrid-auto-rows: 30px;\n\t\tgap: 4px;\n\t\tflex: 1 1 300px;\n\t\tmax-width: 364px;\n\t}\n\n\t.tray .k {\n\t\tborder: 0;\n\t\tborder-radius: 6px;\n\t\tbackground: #212124;\n\t\tcolor: #a8a29e;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 11px;\n\t\tletter-spacing: 0.02em;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tgap: 6px;\n\t\tpadding: 0 8px;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmin-width: 0;\n\t\tcursor: pointer;\n\t\ttouch-action: manipulation;\n\t\ttransition:\n\t\t\tbackground 0.1s,\n\t\t\tcolor 0.1s;\n\t}\n\t.tray .k :global(iconify-icon) {\n\t\tfont-size: 15px;\n\t}\n\t.tray .k:hover {\n\t\tbackground: #2c2c31;\n\t\tcolor: #f5f5f4;\n\t}\n\t.tray .k.on {\n\t\tbackground: #3a2d0d;\n\t\tcolor: #fbbf24;\n\t}\n\t.tray .k.wide {\n\t\tjustify-content: flex-start;\n\t}\n\n\t.k-pgup {\n\t\tgrid-area: 1 / 5 / 2 / 7;\n\t}\n\t.k-pgdn {\n\t\tgrid-area: 1 / 7 / 2 / 9;\n\t}\n\t/* the cluster's empty shoulders are deliberate — see the note above */\n\t.k-up {\n\t\tgrid-area: 2 / 2;\n\t}\n\t.k-left {\n\t\tgrid-area: 3 / 1;\n\t}\n\t.k-down {\n\t\tgrid-area: 3 / 2;\n\t}\n\t.k-right {\n\t\tgrid-area: 3 / 3;\n\t}\n\t.k-a {\n\t\tgrid-area: 2 / 4 / 3 / 9;\n\t}\n\t.k-b {\n\t\tgrid-area: 3 / 4 / 4 / 9;\n\t}\n\t/* Enter leaves the grid for the tray's own right edge, full height, in the\n\t green the composer already uses for submitting — so a thumb reaching for\n\t it aims at a corner rather than at one cell among forty, and finds the\n\t same green in the same corner whether the tray is open or shut. */\n\t.tray .k-ent {\n\t\tflex: none;\n\t\twidth: 54px;\n\t\theight: auto;\n\t\talign-self: stretch;\n\t\tborder-radius: 12px;\n\t\tbackground: #15803d;\n\t\tcolor: #f0fdf4;\n\t}\n\t.tray .k-ent:hover {\n\t\tbackground: #16a34a;\n\t\tcolor: #f0fdf4;\n\t}\n\t.tray .k-ent :global(iconify-icon) {\n\t\tfont-size: 22px;\n\t}\n\n\t/* Width goes to the keys the More popover used to hide, not to stretching\n\t the cluster — a wider arrow key is not a better arrow key. */\n\t.side {\n\t\tflex: 1;\n\t\t/* Narrower than this and it wraps below the cluster instead of\n\t\t collapsing into a sliver beside it. */\n\t\tmin-width: 220px;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 9px;\n\t}\n\t/* The rest of the old More popover, kept visible rather than nested. */\n\t.extras {\n\t\tdisplay: flex;\n\t\tgap: 4px;\n\t\tflex-wrap: wrap;\n\t}\n\n\t.chords {\n\t\tdisplay: none;\n\t\tflex-direction: column;\n\t\tgap: 5px;\n\t\tpadding-top: 3px;\n\t\tborder-top: 1px solid #1b1b1f;\n\t}\n\t.cap {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 9px;\n\t\tletter-spacing: 0.16em;\n\t\ttext-transform: uppercase;\n\t\tcolor: #44403c;\n\t}\n\t.cap-gap {\n\t\tpadding-top: 6px;\n\t}\n\t.crow {\n\t\tdisplay: flex;\n\t\tgap: 4px;\n\t\tflex-wrap: wrap;\n\t}\n\t/* 364px of key grid, a 14px gap and the side column's 220px floor. */\n\t@container (min-width: 620px) {\n\t\t.chords {\n\t\t\tdisplay: flex;\n\t\t}\n\t\t/* Wide enough for the chords column, and the tray is taller than the\n\t\t keys that fill it. A thumb is not reaching across a desktop for\n\t\t Enter, so it stops at the height of the key grid — three rows and\n\t\t their gaps — and sits on the grid's own last row. */\n\t\t.tray .k-ent {\n\t\t\talign-self: flex-end;\n\t\t\theight: 98px;\n\t\t}\n\t}\n\n\t.extras .k,\n\t.chords .k {\n\t\twidth: auto;\n\t\theight: 30px;\n\t\tmin-width: 44px;\n\t}\n</style>\n","<script lang=\"ts\">\n\t/**\n\t * What the page header used to be: the other live sessions, the four rare\n\t * pane actions, and the kill.\n\t *\n\t * It lives above the composer's status line rather than at the top of the\n\t * screen, because switching session is a thing you do with a thumb like\n\t * everything else here. The terminal toggle keeps a glyph of its own on\n\t * the status line — it is the one header action used often enough to\n\t * deserve one.\n\t */\n\timport { clickOutside } from '$lib/actions/clickOutside';\n\timport SessionStateIndicator from './SessionStateIndicator.svelte';\n\timport { sessionStateVisual, indicatorStateOf } from '$shared/session-state.js';\n\timport type { ChordAction } from '$lib/stores/sidebarActions.svelte';\n\timport {\n\t\tsessionStore,\n\t\tgetSessionDisplayName,\n\t\ttype Session\n\t} from '$lib/stores/sessions.svelte';\n\timport { goto } from '$app/navigation';\n\n\tinterface Props {\n\t\topen: boolean;\n\t\t/** The session this composer belongs to, so it can mark itself current. */\n\t\tcurrentTarget: string | null;\n\t\tactions: ChordAction[];\n\t\tonKill: () => void;\n\t\tonClose: () => void;\n\t}\n\n\tlet { open, currentTarget, actions, onKill, onClose }: Props = $props();\n\n\t/** Live Claude sessions, the current one first. */\n\tconst siblings = $derived(\n\t\tsessionStore.sessions\n\t\t\t.filter((s: Session) => s.pane_alive !== false && s.tmux_target)\n\t\t\t.sort((a: Session, b: Session) =>\n\t\t\t\ta.tmux_target === currentTarget ? -1 : b.tmux_target === currentTarget ? 1 : 0\n\t\t\t)\n\t\t\t.slice(0, 8)\n\t);\n\n\tfunction open_(session: Session) {\n\t\tonClose();\n\t\tif (session.tmux_target) void goto(`/session/${encodeURIComponent(session.tmux_target)}`);\n\t}\n</script>\n\n{#if open}\n\t<div\n\t\tclass=\"sheet\"\n\t\trole=\"dialog\"\n\t\taria-label=\"Session\"\n\t\tuse:clickOutside={{ enabled: open, onOutside: onClose }}\n\t>\n\t\t<span class=\"cap\">sessions</span>\n\t\t{#each siblings as session (session.id)}\n\t\t\t{@const shown = indicatorStateOf(session)}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"row\"\n\t\t\t\tclass:cur={session.tmux_target === currentTarget}\n\t\t\t\tonclick={() => open_(session)}\n\t\t\t>\n\t\t\t\t<SessionStateIndicator state={shown} size=\"sm\" />\n\t\t\t\t<span class=\"name\">{getSessionDisplayName(session)}</span>\n\t\t\t\t<span class=\"sub\">{sessionStateVisual(shown).label}</span>\n\t\t\t</button>\n\t\t{/each}\n\n\t\t{#if actions.length > 0}\n\t\t\t<div class=\"div\"></div>\n\t\t\t<div class=\"acts\">\n\t\t\t\t{#each actions as action (action.label)}\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"act\"\n\t\t\t\t\t\ttitle={action.label}\n\t\t\t\t\t\taria-label={action.label}\n\t\t\t\t\t\tonclick={() => {\n\t\t\t\t\t\t\taction.run();\n\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<iconify-icon icon={action.icon}></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t{/each}\n\t\t\t</div>\n\t\t{/if}\n\n\t\t<div class=\"div\"></div>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"row kill\"\n\t\t\tonclick={() => {\n\t\t\t\tonKill();\n\t\t\t\tonClose();\n\t\t\t}}\n\t\t>\n\t\t\t<iconify-icon icon=\"mdi:power\"></iconify-icon>\n\t\t\t<span class=\"name\">Kill pane</span>\n\t\t</button>\n\t</div>\n{/if}\n\n<style>\n\t.sheet {\n\t\tposition: absolute;\n\t\tleft: 10px;\n\t\tright: 10px;\n\t\tbottom: calc(100% + 8px);\n\t\tmax-width: 330px;\n\t\tbackground: #1a1a1c;\n\t\tborder: 1px solid #313135;\n\t\tborder-radius: 14px;\n\t\tbox-shadow: 0 20px 44px rgba(0, 0, 0, 0.62);\n\t\tpadding: 7px;\n\t\tz-index: 9;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 2px;\n\t\t/* Scrolls on its own past this, and never hands a swipe on to the\n\t\t transcript underneath. */\n\t\tmax-height: min(70dvh, 520px);\n\t\toverflow-y: auto;\n\t\toverscroll-behavior: contain;\n\t}\n\t.cap {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 9.5px;\n\t\tletter-spacing: 0.15em;\n\t\ttext-transform: uppercase;\n\t\tcolor: #57534e;\n\t\tpadding: 7px 9px 5px;\n\t}\n\t.row {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 10px;\n\t\tpadding: 8px 9px;\n\t\tborder: 0;\n\t\tborder-radius: 9px;\n\t\tbackground: none;\n\t\twidth: 100%;\n\t\tjustify-content: flex-start;\n\t\ttext-align: left;\n\t\tcolor: #a8a29e;\n\t\tfont-size: 13.5px;\n\t\tcursor: pointer;\n\t}\n\t.row:hover {\n\t\tbackground: #232326;\n\t\tcolor: #f5f5f4;\n\t}\n\t.row.cur {\n\t\tbackground: #202024;\n\t\tcolor: #f5f5f4;\n\t}\n\t.name {\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\t.sub {\n\t\tmargin-left: auto;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 10px;\n\t\tcolor: #57534e;\n\t\tflex: none;\n\t}\n\t/* Kill sits alone below a rule, where a mis-tap can't reach it. */\n\t.row.kill {\n\t\tcolor: #c98080;\n\t}\n\t.row.kill:hover {\n\t\tbackground: #2c1b1b;\n\t\tcolor: #f2b8b8;\n\t}\n\t.div {\n\t\theight: 1px;\n\t\tbackground: #2a2a2e;\n\t\tmargin: 5px 2px;\n\t}\n\t.acts {\n\t\tdisplay: flex;\n\t\tgap: 3px;\n\t\tpadding: 2px;\n\t}\n\t.act {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\theight: 38px;\n\t\tborder: 0;\n\t\tborder-radius: 9px;\n\t\tbackground: #202024;\n\t\tcolor: #a8a29e;\n\t\tfont-size: 18px;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tcursor: pointer;\n\t}\n\t.act:hover {\n\t\tbackground: #292930;\n\t\tcolor: #f5f5f4;\n\t}\n</style>\n","<script lang=\"ts\">\n\timport { Tooltip as TooltipPrimitive } from \"bits-ui\";\n\n\tlet { ...restProps }: TooltipPrimitive.PortalProps = $props();\n</script>\n\n<TooltipPrimitive.Portal {...restProps} />\n","<script lang=\"ts\">\n\timport { Tooltip as TooltipPrimitive } from \"bits-ui\";\n\timport { cn } from \"$lib/utils.js\";\n\timport type { WithoutChildrenOrChild } from \"$lib/utils.js\";\n\timport TooltipPortal from \"./tooltip-portal.svelte\";\n\timport type { ComponentProps } from \"svelte\";\n\n\tlet {\n\t\tref = $bindable(null),\n\t\tclass: className,\n\t\tsideOffset = 0,\n\t\tside = \"top\",\n\t\tchildren,\n\t\tarrowClasses,\n\t\tportalProps,\n\t\t...restProps\n\t}: TooltipPrimitive.ContentProps & {\n\t\tarrowClasses?: string;\n\t\tportalProps?: WithoutChildrenOrChild<ComponentProps<typeof TooltipPortal>>;\n\t} = $props();\n</script>\n\n<TooltipPortal {...portalProps}>\n\t<TooltipPrimitive.Content\n\t\tbind:ref\n\t\tdata-slot=\"tooltip-content\"\n\t\t{sideOffset}\n\t\t{side}\n\t\tclass={cn(\n\t\t\t\"inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-(--z-floating) **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 z-(--z-floating) w-fit max-w-xs origin-(--bits-tooltip-content-transform-origin) bg-foreground text-background\",\n\t\t\tclassName\n\t\t)}\n\t\t{...restProps}\n\t>\n\t\t{@render children?.()}\n\t\t<TooltipPrimitive.Arrow>\n\t\t\t{#snippet child({ props })}\n\t\t\t\t<div\n\t\t\t\t\tclass={cn(\n\t\t\t\t\t\t\"size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] z-(--z-floating) bg-foreground fill-foreground\",\n\t\t\t\t\t\t\"data-[side=top]:translate-x-1/2 data-[side=top]:translate-y-[calc(-50%+2px)]\",\n\t\t\t\t\t\t\"data-[side=bottom]:-translate-x-1/2 data-[side=bottom]:-translate-y-[calc(-50%+1px)]\",\n\t\t\t\t\t\t\"data-[side=right]:translate-x-[calc(50%+2px)] data-[side=right]:translate-y-1/2\",\n\t\t\t\t\t\t\"data-[side=left]:-translate-y-[calc(50%-3px)]\",\n\t\t\t\t\t\tarrowClasses\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t></div>\n\t\t\t{/snippet}\n\t\t</TooltipPrimitive.Arrow>\n\t</TooltipPrimitive.Content>\n</TooltipPortal>\n","<script lang=\"ts\">\n\timport { Tooltip as TooltipPrimitive } from \"bits-ui\";\n\n\tlet { delayDuration = 0, ...restProps }: TooltipPrimitive.ProviderProps = $props();\n</script>\n\n<TooltipPrimitive.Provider {delayDuration} {...restProps} />\n","<script lang=\"ts\" generics=\"T = never\">\n\timport { Tooltip as TooltipPrimitive } from \"bits-ui\";\n\n\tlet { ref = $bindable(null), ...restProps }: TooltipPrimitive.TriggerProps<T> = $props();\n</script>\n\n<TooltipPrimitive.Trigger bind:ref data-slot=\"tooltip-trigger\" {...restProps} />\n","<script lang=\"ts\" generics=\"T = never\">\n\timport { Tooltip as TooltipPrimitive } from \"bits-ui\";\n\n\tlet { open = $bindable(false), ...restProps }: TooltipPrimitive.RootProps<T> = $props();\n</script>\n\n<TooltipPrimitive.Root bind:open {...restProps} />\n","<script lang=\"ts\">\n\t/**\n\t * An icon button that says what it does, and which key does it, on hover.\n\t *\n\t * The composer's controls are all glyphs with no caption, so the shortcut\n\t * has to live somewhere — a tooltip is the only place left that costs no\n\t * room. Built on the shadcn tooltip, delegating the trigger to this\n\t * button so nothing nests inside anything else.\n\t *\n\t * A finger has no hover to leave, so on a touch screen the tooltip's own\n\t * trigger opens a label that then sits there until you tap somewhere else.\n\t * There, the hold is the question and the tap is the answer: press and the\n\t * label appears for as long as you hold it, and the action does not run;\n\t * tap and the action runs with nothing drawn. Held, then, means \"what is\n\t * this?\" — the same gesture the mic already answers with its settings.\n\t */\n\timport * as Tooltip from '$lib/components/ui/tooltip';\n\timport { longPress } from '$lib/actions/longPress';\n\n\tinterface Props {\n\t\ticon: string;\n\t\t/** What the control does, in the words a person would use. */\n\t\tlabel: string;\n\t\t/** The keys that do the same thing, e.g. `Ctrl K`. Omit when there are none. */\n\t\tkeys?: string | null;\n\t\tclass?: string;\n\t\tonclick: () => void;\n\t}\n\n\tlet { icon, label, keys = null, class: klass = '', onclick }: Props = $props();\n\n\t/**\n\t * A screen driven by a finger: no hover to leave, and a pointer too coarse\n\t * to have one. Both halves are needed — a headless browser reports no\n\t * hover either, and there the tooltip should behave as it always has.\n\t */\n\tlet touch = $state(false);\n\t$effect(() => {\n\t\tconst mq = window.matchMedia('(hover: none) and (pointer: coarse)');\n\t\tconst sync = () => (touch = mq.matches);\n\t\tsync();\n\t\tmq.addEventListener('change', sync);\n\t\treturn () => mq.removeEventListener('change', sync);\n\t});\n\n\tlet open = $state(false);\n\t/** How long a hold has to last before it counts as a question. */\n\tconst HOLD_MS = 350;\n</script>\n\n<Tooltip.Root\n\tbind:open={() => open, (v) => { if (!touch) open = v; }}\n>\n\t<Tooltip.Trigger>\n\t\t{#snippet child({ props })}\n\t\t\t<button\n\t\t\t\t{...props}\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass={klass}\n\t\t\t\taria-label={keys ? `${label} (${keys})` : label}\n\t\t\t\t{onclick}\n\t\t\t\tuse:longPress={{\n\t\t\t\t\tms: HOLD_MS,\n\t\t\t\t\tenabled: () => touch,\n\t\t\t\t\tonTrigger: () => (open = true),\n\t\t\t\t\tonRelease: () => (open = false)\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<iconify-icon {icon}></iconify-icon>\n\t\t\t</button>\n\t\t{/snippet}\n\t</Tooltip.Trigger>\n\t<Tooltip.Content side=\"top\" sideOffset={8}>\n\t\t<span class=\"tip\">\n\t\t\t{label}\n\t\t\t{#if keys}<kbd>{keys}</kbd>{/if}\n\t\t</span>\n\t</Tooltip.Content>\n</Tooltip.Root>\n\n<style>\n\t.tip {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\twhite-space: nowrap;\n\t}\n\tkbd {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 10px;\n\t\tletter-spacing: 0.06em;\n\t\tpadding: 1px 5px;\n\t\tborder-radius: 4px;\n\t\tbackground: rgba(255, 255, 255, 0.14);\n\t}\n</style>\n","/**\n * The name Claude Code shows for a model, from the id the API logs.\n *\n * The transcript records the model on every assistant line as the API names\n * it — `claude-fable-5-1`, `claude-haiku-4-5-20251001` — and the dashboard\n * wants what the terminal's own status line says: \"Fable 5.1\", \"Haiku 4.5\".\n * The id is a family word, a version broken into dash-separated parts, and\n * sometimes a release date; the name is the family capitalised and the\n * version joined with dots. Anything that does not fit that shape is shown\n * as it is, so an id from a newer family still means something.\n */\n\n/** A trailing 8-digit release date, as in `claude-haiku-4-5-20251001`. */\nconst RELEASE_DATE = /-\\d{8}$/;\n\n/** A `[1m]` suffix Claude Code appends for the long-context variant. */\nconst CONTEXT_SUFFIX = /\\[(\\d+[mk])\\]$/i;\n\nexport function modelDisplayName(id: string | null | undefined): string | null {\n if (!id) return null;\n let rest = id.trim();\n if (!rest) return null;\n\n let context = \"\";\n const suffix = rest.match(CONTEXT_SUFFIX);\n if (suffix) {\n context = ` (${suffix[1].toUpperCase()})`;\n rest = rest.slice(0, -suffix[0].length);\n }\n\n // Bedrock and Vertex ids carry a region or vendor prefix: `us.anthropic.claude-…`.\n rest = rest.slice(rest.lastIndexOf(\".\") + 1).replace(RELEASE_DATE, \"\");\n const parts = rest.split(\"-\").filter(Boolean);\n if (parts[0]?.toLowerCase() === \"claude\") parts.shift();\n\n const family = parts.shift();\n if (!family || !/^[a-z]+$/i.test(family)) return id;\n const version = parts.filter((part) => /^\\d+$/.test(part));\n const tail = parts.filter((part) => !/^\\d+$/.test(part));\n if (version.length !== parts.length - tail.length) return id;\n\n const name = family[0].toUpperCase() + family.slice(1).toLowerCase();\n const pieces = [name];\n if (version.length > 0) pieces.push(version.join(\".\"));\n if (tail.length > 0) pieces.push(tail.join(\"-\"));\n return pieces.join(\" \") + context;\n}\n","<script lang=\"ts\">\n\timport { tick } from 'svelte';\n\timport { scoreCommand } from '$shared/utils/fuzzy.js';\n\n\ttype Kind = 'builtin' | 'command' | 'skill' | 'agent';\n\tinterface Cmd {\n\t\tname: string;\n\t\tinsert: string;\n\t\tkind: Kind;\n\t\tsource: string;\n\t\tdescription: string;\n\t}\n\n\tlet {\n\t\tcwd,\n\t\tbase = '',\n\t\tpinned = [],\n\t\tquery = '',\n\t\tonselect\n\t}: {\n\t\tcwd?: string | null;\n\t\t/** The relay path to the machine `cwd` is on, '' for this one. */\n\t\tbase?: string;\n\t\tpinned?: string[];\n\t\tquery?: string;\n\t\tonselect: (insert: string) => void;\n\t} = $props();\n\n\tlet commands = $state<Cmd[]>([]);\n\tlet loading = $state(false);\n\tlet error = $state<string | null>(null);\n\tlet activeIndex = $state(0);\n\tlet listEl = $state<HTMLDivElement | null>(null);\n\tlet loadedFor: string | null | undefined = undefined;\n\n\tconst KIND_LABEL: Record<Kind, string> = {\n\t\tbuiltin: 'built-in',\n\t\tcommand: 'command',\n\t\tskill: 'skill',\n\t\tagent: 'agent'\n\t};\n\tconst KIND_COLOR: Record<Kind, string> = {\n\t\tbuiltin: 'text-stone-400',\n\t\tcommand: 'text-sky-400',\n\t\tskill: 'text-emerald-400',\n\t\tagent: 'text-fuchsia-400'\n\t};\n\n\t/** What the list was loaded for: the cwd, on the machine it is on. */\n\tconst key = $derived(`${base}:${cwd}`);\n\n\texport async function reload(force = false) {\n\t\tif (!force && loadedFor === key && commands.length) return;\n\t\tloading = true;\n\t\terror = null;\n\t\ttry {\n\t\t\tconst qs = cwd ? `?cwd=${encodeURIComponent(cwd)}` : '';\n\t\t\tconst res = await fetch(`${base}/api/commands${qs}`);\n\t\t\tif (!res.ok) throw new Error(`HTTP ${res.status}`);\n\t\t\tconst data = await res.json();\n\t\t\tcommands = data.commands ?? [];\n\t\t\tloadedFor = key;\n\t\t} catch (e) {\n\t\t\terror = e instanceof Error ? e.message : String(e);\n\t\t} finally {\n\t\t\tloading = false;\n\t\t}\n\t}\n\n\t// Load on mount and whenever the cwd, or the machine it is on, changes\n\t$effect(() => {\n\t\tkey;\n\t\tvoid reload();\n\t});\n\n\tconst filtered = $derived.by(() => {\n\t\tconst q = query.trim();\n\t\tconst pinSet = new Set(pinned);\n\t\tconst scored = commands\n\t\t\t.map((c) => {\n\t\t\t\tconst score = scoreCommand(c, q);\n\t\t\t\treturn score == null ? null : { c, score };\n\t\t\t})\n\t\t\t.filter((x): x is { c: Cmd; score: number } => x != null);\n\t\tif (q) {\n\t\t\tscored.sort((a, b) => b.score - a.score);\n\t\t} else {\n\t\t\t// No query: pinned first, then by kind, then alpha\n\t\t\tconst kindOrder: Record<Kind, number> = { command: 0, skill: 1, agent: 2, builtin: 3 };\n\t\t\tscored.sort((a, b) => {\n\t\t\t\tconst pa = pinSet.has(a.c.insert) ? 0 : 1;\n\t\t\t\tconst pb = pinSet.has(b.c.insert) ? 0 : 1;\n\t\t\t\tif (pa !== pb) return pa - pb;\n\t\t\t\tif (pa === 0) return pinned.indexOf(a.c.insert) - pinned.indexOf(b.c.insert);\n\t\t\t\tconst ko = kindOrder[a.c.kind] - kindOrder[b.c.kind];\n\t\t\t\tif (ko !== 0) return ko;\n\t\t\t\treturn a.c.name.localeCompare(b.c.name);\n\t\t\t});\n\t\t}\n\t\treturn scored.map((x) => x.c);\n\t});\n\n\t$effect(() => {\n\t\t// reset highlight whenever results change\n\t\tfiltered;\n\t\tactiveIndex = 0;\n\t\tvoid tick().then(() => listEl?.scrollTo({ top: 0 }));\n\t});\n\n\tfunction choose(c: Cmd) {\n\t\tonselect(c.insert);\n\t}\n\n\t/** Pick the highlighted entry. Returns false when there is nothing to pick. */\n\texport function chooseActive(): boolean {\n\t\tconst c = filtered[activeIndex];\n\t\tif (!c) return false;\n\t\tchoose(c);\n\t\treturn true;\n\t}\n\n\t/**\n\t * Keyboard navigation for a host input. Returns true when the event was\n\t * consumed (arrow navigation or selection), false to let the host handle it.\n\t */\n\texport function handleKeydown(e: KeyboardEvent): boolean {\n\t\tif (e.key === 'ArrowDown') {\n\t\t\te.preventDefault();\n\t\t\tactiveIndex = Math.min(activeIndex + 1, filtered.length - 1);\n\t\t\tscrollActiveIntoView();\n\t\t\treturn true;\n\t\t}\n\t\tif (e.key === 'ArrowUp') {\n\t\t\te.preventDefault();\n\t\t\tactiveIndex = Math.max(activeIndex - 1, 0);\n\t\t\tscrollActiveIntoView();\n\t\t\treturn true;\n\t\t}\n\t\tif (e.key === 'Enter' || e.key === 'Tab') {\n\t\t\tif (!filtered.length) return false;\n\t\t\te.preventDefault();\n\t\t\treturn chooseActive();\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction scrollActiveIntoView() {\n\t\ttick().then(() => {\n\t\t\tlistEl?.querySelector<HTMLElement>(`[data-idx=\"${activeIndex}\"]`)?.scrollIntoView({ block: 'nearest' });\n\t\t});\n\t}\n\n\tfunction sourceLabel(c: Cmd): string {\n\t\tif (c.source === 'builtin') return '';\n\t\treturn c.source;\n\t}\n</script>\n\n<div bind:this={listEl} class=\"min-h-0 flex-1 overflow-y-auto overscroll-contain\">\n\t{#if loading && !commands.length}\n\t\t<div class=\"p-4 text-sm text-stone-400\">Loading…</div>\n\t{:else if error}\n\t\t<div class=\"p-4 text-sm text-red-400\">Failed to load: {error}</div>\n\t{:else if !filtered.length}\n\t\t<div class=\"p-4 text-sm text-stone-400\">No matches</div>\n\t{:else}\n\t\t{#each filtered as c, i (c.name + c.source)}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tdata-idx={i}\n\t\t\t\tclass=\"flex w-full flex-col items-start gap-0.5 border-b border-[#262626] px-3 py-2 text-left hover:bg-[#262626] {i === activeIndex ? 'bg-[#2a2a2a]' : ''}\"\n\t\t\t\tonclick={() => choose(c)}\n\t\t\t\tonpointerenter={() => (activeIndex = i)}\n\t\t\t>\n\t\t\t\t<div class=\"flex w-full items-center gap-2\">\n\t\t\t\t\t<span class=\"truncate font-mono text-sm\">{c.name}</span>\n\t\t\t\t\t<span class=\"ml-auto shrink-0 text-[10px] uppercase tracking-wide {KIND_COLOR[c.kind]}\">{KIND_LABEL[c.kind]}</span>\n\t\t\t\t\t{#if sourceLabel(c)}\n\t\t\t\t\t\t<span class=\"shrink-0 text-[10px] text-stone-500\">{sourceLabel(c)}</span>\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t\t{#if c.description}\n\t\t\t\t\t<div class=\"line-clamp-2 w-full text-xs text-stone-400\">{c.description}</div>\n\t\t\t\t{/if}\n\t\t\t</button>\n\t\t{/each}\n\t{/if}\n</div>\n<div class=\"border-t border-[#333] px-3 py-1 text-[10px] text-stone-500\">\n\t{filtered.length}/{commands.length} · ↑↓ navigate · Enter insert\n</div>\n","<script lang=\"ts\">\n\timport * as Dialog from '$lib/components/ui/dialog';\n\timport { tick } from 'svelte';\n\timport CommandList from './CommandList.svelte';\n\n\tlet {\n\t\topen = $bindable(false),\n\t\tcwd,\n\t\tbase = '',\n\t\tpinned = [],\n\t\tonselect\n\t}: {\n\t\topen: boolean;\n\t\tcwd?: string | null;\n\t\t/** The relay path to the machine `cwd` is on, '' for this one. */\n\t\tbase?: string;\n\t\tpinned?: string[];\n\t\tonselect: (insert: string) => void;\n\t} = $props();\n\n\tlet query = $state('');\n\tlet inputEl = $state<HTMLInputElement | null>(null);\n\tlet list = $state<CommandList | null>(null);\n\n\t$effect(() => {\n\t\tif (open) {\n\t\t\tquery = '';\n\t\t\ttick().then(() => inputEl?.focus());\n\t\t}\n\t});\n\n\tfunction choose(insert: string) {\n\t\tonselect(insert);\n\t\topen = false;\n\t}\n\n\tfunction onKeydown(e: KeyboardEvent) {\n\t\tlist?.handleKeydown(e);\n\t}\n</script>\n\n<Dialog.Root bind:open>\n\t<Dialog.Content\n\t\tclass=\"flex h-[85dvh] max-h-[85dvh] w-[calc(100%-1rem)] max-w-xl flex-col gap-0 overflow-hidden border-[#333] bg-[#1a1a1a] p-0 text-stone-100 sm:max-w-xl\"\n\t\tshowCloseButton={false}\n\t>\n\t\t<Dialog.Title class=\"sr-only\">Commands</Dialog.Title>\n\t\t<Dialog.Description class=\"sr-only\">Search slash commands, skills and agents</Dialog.Description>\n\t\t<div class=\"flex items-center gap-2 border-b border-[#333] px-3 py-2\">\n\t\t\t<iconify-icon icon=\"mdi:magnify\" class=\"shrink-0 text-stone-400\" style=\"font-size: 18px;\"></iconify-icon>\n\t\t\t<input\n\t\t\t\tbind:this={inputEl}\n\t\t\t\tbind:value={query}\n\t\t\t\tonkeydown={onKeydown}\n\t\t\t\ttype=\"text\"\n\t\t\t\tplaceholder=\"Search commands, skills, agents…\"\n\t\t\t\tautocomplete=\"off\"\n\t\t\t\tautocapitalize=\"off\"\n\t\t\t\tspellcheck=\"false\"\n\t\t\t\tenterkeyhint=\"go\"\n\t\t\t\tclass=\"min-w-0 flex-1 bg-transparent text-base text-stone-100 outline-none placeholder:text-stone-500\"\n\t\t\t/>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"shrink-0 rounded p-1 text-stone-400 hover:bg-[#333] hover:text-stone-100\"\n\t\t\t\ttitle=\"Refresh\"\n\t\t\t\tonclick={() => list?.reload(true)}\n\t\t\t>\n\t\t\t\t<iconify-icon icon=\"mdi:refresh\" style=\"font-size: 18px;\"></iconify-icon>\n\t\t\t</button>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-label=\"Close\"\n\t\t\t\tclass=\"shrink-0 rounded p-1 text-stone-400 hover:bg-[#333] hover:text-stone-100\"\n\t\t\t\tonclick={() => (open = false)}\n\t\t\t>\n\t\t\t\t<iconify-icon icon=\"mdi:close\" style=\"font-size: 18px;\"></iconify-icon>\n\t\t\t</button>\n\t\t</div>\n\n\t\t<CommandList bind:this={list} {cwd} {base} {pinned} {query} onselect={choose} />\n\t</Dialog.Content>\n</Dialog.Root>\n","import { browser } from '$app/environment';\n\nexport type GamepadButton =\n\t| 'A'\n\t| 'B'\n\t| 'X'\n\t| 'Y'\n\t| 'L1'\n\t| 'R1'\n\t| 'L2'\n\t| 'R2'\n\t| 'Back'\n\t| 'Start'\n\t| 'L3'\n\t| 'R3'\n\t| 'DpadUp'\n\t| 'DpadDown'\n\t| 'DpadLeft'\n\t| 'DpadRight'\n\t| 'Home';\n\nexport type GamepadHandler =\n\t| (() => void)\n\t| { press?: () => void; release?: () => void; repeat?: boolean };\nexport type GamepadHandlers = Partial<Record<GamepadButton, GamepadHandler>>;\nexport type GamepadAxesCallback = (axes: readonly number[]) => void;\n\nexport const STICK_DEADZONE = 0.15;\n\nconst BUTTON_INDEX: Record<number, GamepadButton> = {\n\t0: 'A',\n\t1: 'B',\n\t2: 'X',\n\t3: 'Y',\n\t4: 'L1',\n\t5: 'R1',\n\t6: 'L2',\n\t7: 'R2',\n\t8: 'Back',\n\t9: 'Start',\n\t10: 'L3',\n\t11: 'R3',\n\t12: 'DpadUp',\n\t13: 'DpadDown',\n\t14: 'DpadLeft',\n\t15: 'DpadRight',\n\t16: 'Home'\n};\n\nconst DEFAULT_REPEAT = new Set<GamepadButton>([\n\t'DpadUp',\n\t'DpadDown',\n\t'DpadLeft',\n\t'DpadRight'\n]);\n\nconst REPEAT_INITIAL_MS = 400;\nconst REPEAT_INTERVAL_MS = 80;\n\nfunction pressFn(h: GamepadHandler | undefined): (() => void) | undefined {\n\tif (!h) return undefined;\n\treturn typeof h === 'function' ? h : h.press;\n}\n\nfunction releaseFn(h: GamepadHandler | undefined): (() => void) | undefined {\n\tif (!h || typeof h === 'function') return undefined;\n\treturn h.release;\n}\n\nfunction shouldRepeat(name: GamepadButton, h: GamepadHandler | undefined): boolean {\n\tif (h && typeof h !== 'function' && typeof h.repeat === 'boolean') return h.repeat;\n\treturn DEFAULT_REPEAT.has(name);\n}\n\nexport type UseGamepadOpts = {\n\tbuttons?: () => GamepadHandlers;\n\taxes?: () => GamepadAxesCallback;\n\tenabled?: () => boolean;\n};\n\nexport function useGamepad(opts: UseGamepadOpts) {\n\tif (!browser) return;\n\tconst buttons = opts.buttons;\n\tconst axes = opts.axes;\n\tconst enabled = opts.enabled ?? (() => true);\n\n\t$effect(() => {\n\t\tlet raf = 0;\n\t\tlet active = false;\n\t\tconst pressed = new Set<number>();\n\t\tconst repeatStartTimers = new Map<number, ReturnType<typeof setTimeout>>();\n\t\tconst repeatIntervals = new Map<number, ReturnType<typeof setInterval>>();\n\n\t\tfunction clearRepeat(idx: number) {\n\t\t\tconst s = repeatStartTimers.get(idx);\n\t\t\tif (s) {\n\t\t\t\tclearTimeout(s);\n\t\t\t\trepeatStartTimers.delete(idx);\n\t\t\t}\n\t\t\tconst i = repeatIntervals.get(idx);\n\t\t\tif (i) {\n\t\t\t\tclearInterval(i);\n\t\t\t\trepeatIntervals.delete(idx);\n\t\t\t}\n\t\t}\n\n\t\tfunction scheduleRepeat(idx: number, name: GamepadButton) {\n\t\t\tconst start = setTimeout(() => {\n\t\t\t\trepeatStartTimers.delete(idx);\n\t\t\t\tif (!pressed.has(idx)) return;\n\t\t\t\tconst tick = setInterval(() => {\n\t\t\t\t\tif (!enabled()) return;\n\t\t\t\t\tpressFn(buttons?.()[name])?.();\n\t\t\t\t}, REPEAT_INTERVAL_MS);\n\t\t\t\trepeatIntervals.set(idx, tick);\n\t\t\t}, REPEAT_INITIAL_MS);\n\t\t\trepeatStartTimers.set(idx, start);\n\t\t}\n\n\t\tfunction poll() {\n\t\t\traf = requestAnimationFrame(poll);\n\t\t\tif (!enabled()) return;\n\t\t\tconst pads = navigator.getGamepads?.();\n\t\t\tif (!pads) return;\n\t\t\tconst pad = Array.from(pads).find((p) => p && p.connected);\n\t\t\tif (!pad) return;\n\n\t\t\tif (buttons) {\n\t\t\t\tconst map = buttons();\n\t\t\t\tpad.buttons.forEach((btn, idx) => {\n\t\t\t\t\tconst name = BUTTON_INDEX[idx];\n\t\t\t\t\tif (!name) return;\n\t\t\t\t\tconst isDown = btn.pressed;\n\t\t\t\t\tconst wasDown = pressed.has(idx);\n\t\t\t\t\tconst handler = map[name];\n\t\t\t\t\tif (isDown && !wasDown) {\n\t\t\t\t\t\tpressed.add(idx);\n\t\t\t\t\t\tpressFn(handler)?.();\n\t\t\t\t\t\tif (shouldRepeat(name, handler)) scheduleRepeat(idx, name);\n\t\t\t\t\t} else if (!isDown && wasDown) {\n\t\t\t\t\t\tpressed.delete(idx);\n\t\t\t\t\t\tclearRepeat(idx);\n\t\t\t\t\t\treleaseFn(handler)?.();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (axes) axes()(pad.axes);\n\t\t}\n\n\t\tfunction start() {\n\t\t\tif (active) return;\n\t\t\tactive = true;\n\t\t\traf = requestAnimationFrame(poll);\n\t\t}\n\t\tfunction stop() {\n\t\t\tif (!active) return;\n\t\t\tactive = false;\n\t\t\tcancelAnimationFrame(raf);\n\t\t\trepeatStartTimers.forEach(clearTimeout);\n\t\t\trepeatStartTimers.clear();\n\t\t\trepeatIntervals.forEach(clearInterval);\n\t\t\trepeatIntervals.clear();\n\t\t\tpressed.clear();\n\t\t}\n\n\t\tconst onConnect = () => start();\n\t\tconst onDisconnect = () => {\n\t\t\tif (navigator.getGamepads?.().some((p) => p && p.connected)) return;\n\t\t\tstop();\n\t\t};\n\n\t\twindow.addEventListener('gamepadconnected', onConnect);\n\t\twindow.addEventListener('gamepaddisconnected', onDisconnect);\n\t\tif (navigator.getGamepads?.().some((p) => p && p.connected)) start();\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener('gamepadconnected', onConnect);\n\t\t\twindow.removeEventListener('gamepaddisconnected', onDisconnect);\n\t\t\tstop();\n\t\t};\n\t});\n}\n","import { createPersisted } from './persisted';\n\nexport type ViewMode = 'transcript' | 'terminal';\n\nconst DEFAULT_MODE: ViewMode = 'transcript';\nconst persisted = createPersisted<Record<string, ViewMode>>('claude-mux-view-modes', {});\n\n// Which view (transcript or raw terminal) the user last chose, per pane target.\n// The URL still wins when it carries `?view=`; this only supplies the default\n// for a session opened without one, so each session reopens the way it was left.\nclass ViewModesStore {\n\tprivate state = $state<Record<string, ViewMode>>(persisted.load());\n\n\tget(target: string | null): ViewMode {\n\t\tif (!target) return DEFAULT_MODE;\n\t\treturn this.state[target] ?? DEFAULT_MODE;\n\t}\n\n\tset(target: string | null, mode: ViewMode): void {\n\t\tif (!target) return;\n\t\tif (this.state[target] === mode) return;\n\t\tif (mode === DEFAULT_MODE) delete this.state[target];\n\t\telse this.state[target] = mode;\n\t\tpersisted.save(this.state);\n\t}\n}\n\nexport const viewModesStore = new ViewModesStore();\n","<script lang=\"ts\">\n\timport { Dialog as SheetPrimitive } from \"bits-ui\";\n\timport { cn } from \"$lib/utils.js\";\n\n\tlet {\n\t\tref = $bindable(null),\n\t\tclass: className,\n\t\t...restProps\n\t}: SheetPrimitive.OverlayProps = $props();\n</script>\n\n<SheetPrimitive.Overlay\n\tbind:ref\n\tdata-slot=\"sheet-overlay\"\n\tclass={cn(\n\t\t\"bg-black/10 supports-backdrop-filter:backdrop-blur-xs fixed inset-0 z-(--z-modal) duration-100 data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n\t\tclassName\n\t)}\n\t{...restProps}\n/>\n","<script lang=\"ts\">\n\timport { Dialog as SheetPrimitive } from \"bits-ui\";\n\n\tlet { ...restProps }: SheetPrimitive.PortalProps = $props();\n</script>\n\n<SheetPrimitive.Portal {...restProps} />\n","<script lang=\"ts\" module>\n\texport type Side = \"top\" | \"right\" | \"bottom\" | \"left\";\n</script>\n\n<script lang=\"ts\">\n\timport { Dialog as SheetPrimitive } from \"bits-ui\";\n\timport XIcon from '@lucide/svelte/icons/x';\n\timport { Button } from \"$lib/components/ui/button/index.js\";\n\timport { cn, type WithoutChildrenOrChild } from \"$lib/utils.js\";\n\timport SheetOverlay from \"./sheet-overlay.svelte\";\n\timport SheetPortal from \"./sheet-portal.svelte\";\n\timport type { Snippet } from \"svelte\";\n\timport type { ComponentProps } from \"svelte\";\n\n\tlet {\n\t\tref = $bindable(null),\n\t\tclass: className,\n\t\tside = \"right\",\n\t\tshowCloseButton = true,\n\t\tportalProps,\n\t\tchildren,\n\t\t...restProps\n\t}: WithoutChildrenOrChild<SheetPrimitive.ContentProps> & {\n\t\tportalProps?: WithoutChildrenOrChild<ComponentProps<typeof SheetPortal>>;\n\t\tside?: Side;\n\t\tshowCloseButton?: boolean;\n\t\tchildren: Snippet;\n\t} = $props();\n</script>\n\n<SheetPortal {...portalProps}>\n\t<SheetOverlay />\n\t<SheetPrimitive.Content\n\t\tbind:ref\n\t\tdata-slot=\"sheet-content\"\n\t\tdata-side={side}\n\t\tclass={cn(\n\t\t\t\"bg-popover text-popover-foreground fixed z-(--z-modal) flex flex-col gap-4 bg-clip-padding text-sm shadow-lg transition duration-200 ease-in-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-[side=bottom]:data-open:slide-in-from-bottom-10 data-[side=left]:data-open:slide-in-from-left-10 data-[side=right]:data-open:slide-in-from-right-10 data-[side=top]:data-open:slide-in-from-top-10 data-closed:animate-out data-closed:fade-out-0 data-[side=bottom]:data-closed:slide-out-to-bottom-10 data-[side=left]:data-closed:slide-out-to-left-10 data-[side=right]:data-closed:slide-out-to-right-10 data-[side=top]:data-closed:slide-out-to-top-10\",\n\t\t\tclassName\n\t\t)}\n\t\t{...restProps}\n\t>\n\t\t{@render children?.()}\n\t\t{#if showCloseButton}\n\t\t\t<SheetPrimitive.Close data-slot=\"sheet-close\">\n\t\t\t\t{#snippet child({ props })}\n\t\t\t\t\t<Button variant=\"ghost\" class=\"absolute top-3 right-3\" size=\"icon-sm\" {...props}>\n\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t<span class=\"sr-only\">Close</span>\n\t\t\t\t\t</Button>\n\t\t\t\t{/snippet}\n\t\t\t</SheetPrimitive.Close>\n\t\t{/if}\n\t</SheetPrimitive.Content>\n</SheetPortal>\n","<script lang=\"ts\">\n\timport { Dialog as SheetPrimitive } from \"bits-ui\";\n\timport { cn } from \"$lib/utils.js\";\n\n\tlet {\n\t\tref = $bindable(null),\n\t\tclass: className,\n\t\t...restProps\n\t}: SheetPrimitive.TitleProps = $props();\n</script>\n\n<SheetPrimitive.Title\n\tbind:ref\n\tdata-slot=\"sheet-title\"\n\tclass={cn(\"text-foreground text-base font-medium\", className)}\n\t{...restProps}\n/>\n","<script lang=\"ts\">\n\timport { Dialog as SheetPrimitive } from \"bits-ui\";\n\n\tlet { open = $bindable(false), ...restProps }: SheetPrimitive.RootProps = $props();\n</script>\n\n<SheetPrimitive.Root bind:open {...restProps} />\n","<script lang=\"ts\">\n\t/**\n\t * The side panel's header and its panes. The header names every pane as a\n\t * tab, so the session's status line needs only the one button that opens\n\t * the panel. One pane shows at a time, but a\n\t * pane stays mounted once opened (hidden, not destroyed), so its scroll\n\t * and selection survive switching to another and back. Whether this sits\n\t * in a column beside the session or in a sheet over it is the page's call.\n\t */\n\timport type { Session } from '$lib/stores/sessions.svelte';\n\timport { PANES, paneKeys, MAXIMIZE_KEYS, CLOSE_KEYS, type PaneAction } from '$lib/side-panel/panes';\n\timport { readPaneParams } from '$lib/side-panel/url';\n\timport Hint from '$lib/components/Hint.svelte';\n\timport DiffBadge from '$lib/components/DiffBadge.svelte';\n\n\tlet {\n\t\tkind,\n\t\topen,\n\t\ttarget,\n\t\tbase,\n\t\tmachineHost,\n\t\tsession,\n\t\tquery,\n\t\tmaximized,\n\t\tcanMaximize,\n\t\tonSelect,\n\t\tonSetParams,\n\t\tonToggleMaximize,\n\t\tonClose,\n\t\tonMention,\n\t\tonOpenPane\n\t}: {\n\t\t/** The pane showing. */\n\t\tkind: string;\n\t\t/** False while the column is closed but kept mounted: no pane is active then. */\n\t\topen: boolean;\n\t\ttarget: string;\n\t\t/** Where the session's machine's API is reached: '' here, `/fleet/<id>` for another machine. */\n\t\tbase: string;\n\t\t/** The host name that reaches another machine's ports, or null for the origin's own session. */\n\t\tmachineHost: string | null;\n\t\tsession: Session | null;\n\t\t/** The page's query, for the params each pane owns. */\n\t\tquery: URLSearchParams;\n\t\tmaximized: boolean;\n\t\t/** Maximize applies to the inline column; a sheet has nothing to grow into. */\n\t\tcanMaximize: boolean;\n\t\t/** Show another pane. */\n\t\tonSelect: (kind: string) => void;\n\t\tonSetParams: (kind: string, own: Record<string, string | null>, opts?: { push?: boolean }) => void;\n\t\tonToggleMaximize: () => void;\n\t\tonClose: () => void;\n\t\tonMention: (text: string) => void;\n\t\t/** A pane asking for another one, with that pane's own params. */\n\t\tonOpenPane: (kind: string, own: Record<string, string | null>) => void;\n\t} = $props();\n\n\tlet mounted = $state<string[]>([]);\n\t$effect(() => {\n\t\tif (!mounted.includes(kind)) mounted = [...mounted, kind];\n\t});\n\n\tlet actions = $state<Record<string, PaneAction[]>>({});\n\n</script>\n\n<div class=\"panel\">\n\t<header>\n\t\t<div class=\"tabs\" role=\"tablist\" aria-label=\"Side panel\">\n\t\t\t{#each PANES as pane (pane.kind)}\n\t\t\t\t{@const reason = pane.unavailable?.(session) ?? null}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\trole=\"tab\"\n\t\t\t\t\tclass=\"tab\"\n\t\t\t\t\tclass:on={pane.kind === kind}\n\t\t\t\t\taria-selected={pane.kind === kind}\n\t\t\t\t\tdisabled={reason !== null}\n\t\t\t\t\ttitle={reason ?? `${pane.label} (${paneKeys(pane)})`}\n\t\t\t\t\tonclick={() => onSelect(pane.kind)}\n\t\t\t\t>\n\t\t\t\t\t<iconify-icon icon={pane.icon}></iconify-icon>\n\t\t\t\t\t<span class=\"tab-label\">{pane.label}</span>\n\t\t\t\t\t<span class=\"count\"><DiffBadge changes={pane.count?.(session)} /></span>\n\t\t\t\t</button>\n\t\t\t{/each}\n\t\t</div>\n\t\t<span class=\"sp\"></span>\n\t\t{#each actions[kind] ?? [] as action (action.label)}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"act\"\n\t\t\t\tclass:on={action.pressed}\n\t\t\t\taria-pressed={action.pressed}\n\t\t\t\tdisabled={action.disabled}\n\t\t\t\ttitle={action.label}\n\t\t\t\taria-label={action.label}\n\t\t\t\tonclick={action.run}\n\t\t\t>\n\t\t\t\t<iconify-icon icon={action.icon}></iconify-icon>\n\t\t\t</button>\n\t\t{/each}\n\t\t{#if canMaximize}\n\t\t\t<Hint\n\t\t\t\ticon={maximized ? 'mdi:arrow-collapse' : 'mdi:arrow-expand'}\n\t\t\t\tlabel={maximized ? 'Restore' : 'Maximize'}\n\t\t\t\tkeys={MAXIMIZE_KEYS}\n\t\t\t\tclass=\"act\"\n\t\t\t\tonclick={onToggleMaximize}\n\t\t\t/>\n\t\t{/if}\n\t\t<Hint icon=\"mdi:close\" label=\"Close panel\" keys={CLOSE_KEYS} class=\"act\" onclick={onClose} />\n\t</header>\n\t<div class=\"bodies\">\n\t\t{#each PANES.filter((p) => mounted.includes(p.kind)) as pane (pane.kind)}\n\t\t\t<!-- Hidden by visibility rather than display, which would lose its scroll. -->\n\t\t\t<div class=\"body\" class:off={pane.kind !== kind} inert={pane.kind !== kind}>\n\t\t\t\t<pane.body\n\t\t\t\t\t{session}\n\t\t\t\t\t{target}\n\t\t\t\t\t{base}\n\t\t\t\t\t{machineHost}\n\t\t\t\t\tparams={readPaneParams(query, pane.params)}\n\t\t\t\t\tsetParams={(own, opts) => onSetParams(pane.kind, own, opts)}\n\t\t\t\t\tsetActions={(list) => (actions[pane.kind] = list)}\n\t\t\t\t\tactive={open && pane.kind === kind}\n\t\t\t\t\tmention={onMention}\n\t\t\t\t\topenPane={onOpenPane}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t{/each}\n\t</div>\n</div>\n\n<style>\n\t.panel {\n\t\tcontainer-type: inline-size;\n\t\theight: 100%;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tmin-width: 0;\n\t\tbackground: #111111;\n\t\tcolor: #e7e5e4;\n\t}\n\theader {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tmin-height: 44px;\n\t\tpadding: 6px 8px;\n\t\tborder-bottom: 1px solid #222;\n\t\tflex: none;\n\t}\n\t/* Every pane is a tab; only the one showing spells its name where room is short. */\n\t.tabs {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 2px;\n\t\tmin-width: 0;\n\t}\n\t.tab {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\theight: 30px;\n\t\tpadding: 0 8px;\n\t\tborder: 0;\n\t\tborder-radius: 7px;\n\t\tbackground: transparent;\n\t\tcolor: #a8a29e;\n\t\tfont: inherit;\n\t\tfont-size: 13px;\n\t\twhite-space: nowrap;\n\t\tcursor: pointer;\n\t}\n\t.tab iconify-icon {\n\t\tfont-size: 16px;\n\t}\n\t.tab:hover:not(:disabled) {\n\t\tbackground: #1f1f1f;\n\t\tcolor: #f5f5f4;\n\t}\n\t.tab:disabled {\n\t\topacity: 0.4;\n\t\tcursor: default;\n\t}\n\t.tab.on {\n\t\tbackground: #232326;\n\t\tcolor: #f5f5f4;\n\t\tfont-weight: 600;\n\t}\n\t.tab:not(.on) .tab-label {\n\t\tdisplay: none;\n\t}\n\t.count {\n\t\tdisplay: inline-flex;\n\t\tfont-weight: 400;\n\t}\n\t.tab:not(.on) .count {\n\t\tdisplay: none;\n\t}\n\t@container (min-width: 40rem) {\n\t\t.tab:not(.on) .tab-label,\n\t\t.tab:not(.on) .count {\n\t\t\tdisplay: inline-flex;\n\t\t}\n\t}\n\t@media (pointer: coarse) {\n\t\t.tab {\n\t\t\theight: 38px;\n\t\t\tpadding: 0 10px;\n\t\t}\n\t}\n\t.sp {\n\t\tflex: 1;\n\t}\n\theader :global(.act) {\n\t\twidth: 30px;\n\t\theight: 30px;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tborder: 0;\n\t\tborder-radius: 7px;\n\t\tbackground: transparent;\n\t\tcolor: #a8a29e;\n\t\tfont-size: 16px;\n\t\tcursor: pointer;\n\t}\n\theader :global(.act:hover:not(:disabled)) {\n\t\tbackground: #1f1f1f;\n\t\tcolor: #f5f5f4;\n\t}\n\theader :global(.act:disabled) {\n\t\topacity: 0.4;\n\t\tcursor: default;\n\t}\n\theader :global(.act.on) {\n\t\tbackground: #232326;\n\t\tcolor: #f5f5f4;\n\t}\n\t.bodies {\n\t\tflex: 1;\n\t\tmin-height: 0;\n\t\tposition: relative;\n\t}\n\t.body {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t\toverflow: auto;\n\t}\n\t.body.off {\n\t\tvisibility: hidden;\n\t}\n</style>\n","<script lang=\"ts\">\n\t/**\n\t * The side panel's one control in the session's status line: it opens the\n\t * panel on the pane last shown and closes it again. Which pane shows is\n\t * chosen in the panel's own header, where there is room to name them. The\n\t * lines the session has changed ride on it, since that is the reason the\n\t * panel is most often opened.\n\t */\n\timport type { Session } from '$lib/stores/sessions.svelte';\n\timport { CLOSE_KEYS } from '$lib/side-panel/panes';\n\timport { Toggle } from '$lib/components/ui/toggle';\n\timport * as Tooltip from '$lib/components/ui/tooltip';\n\timport DiffBadge from '$lib/components/DiffBadge.svelte';\n\n\tlet {\n\t\topen,\n\t\tsession,\n\t\tonToggle\n\t}: {\n\t\topen: boolean;\n\t\tsession: Session;\n\t\tonToggle: () => void;\n\t} = $props();\n\n\tconst label = $derived(open ? 'Close side panel' : 'Open side panel');\n</script>\n\n<Tooltip.Root>\n\t<Tooltip.Trigger>\n\t\t{#snippet child({ props })}\n\t\t\t<span {...props} class=\"tt\">\n\t\t\t\t<Toggle variant=\"outline\" size=\"xs\" pressed={open} aria-label={label} onPressedChange={onToggle}>\n\t\t\t\t\t<iconify-icon icon=\"mdi:dock-right\"></iconify-icon>\n\t\t\t\t\t<DiffBadge changes={session.changes} />\n\t\t\t\t</Toggle>\n\t\t\t</span>\n\t\t{/snippet}\n\t</Tooltip.Trigger>\n\t<Tooltip.Content side=\"top\" sideOffset={8}>\n\t\t<span class=\"tip\">{label}<kbd>{CLOSE_KEYS}</kbd></span>\n\t</Tooltip.Content>\n</Tooltip.Root>\n\n<style>\n\t.tt {\n\t\tdisplay: inline-flex;\n\t\tflex: none;\n\t}\n\t.tt :global([data-slot='toggle']) {\n\t\tborder-color: #2a2a2c;\n\t\tcolor: #a8a29e;\n\t\tfont-family: var(--font-mono);\n\t}\n\t.tt :global([data-slot='toggle'][data-state='on']) {\n\t\tbackground: #232326;\n\t\tborder-color: #3f3f46;\n\t\tcolor: #f5f5f4;\n\t}\n\t.tt iconify-icon {\n\t\tfont-size: 13px;\n\t}\n\t.tip {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\twhite-space: nowrap;\n\t}\n\tkbd {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 10px;\n\t\tletter-spacing: 0.06em;\n\t\tpadding: 1px 5px;\n\t\tborder-radius: 4px;\n\t\tbackground: rgba(255, 255, 255, 0.14);\n\t}\n</style>\n","<script lang=\"ts\">\n\t/**\n\t * Remote Control for the session on the page: one button in the status\n\t * line that opens what fits the state. Off, it offers to turn it on; on,\n\t * to open the session in the Claude app, copy its link, or turn it off.\n\t *\n\t * Turning either way goes through the pane and only shows once the poll\n\t * sees it, so between the ask and that the button says it is pending.\n\t */\n\timport * as Popover from '$lib/components/ui/popover';\n\timport type { ChordAction } from '$lib/stores/sidebarActions.svelte';\n\n\tinterface Props {\n\t\t/** The session's Remote Control link, or null while it is off. */\n\t\turl: string | null;\n\t\t/** The way it was asked to turn, until the poll sees it turn. */\n\t\tpending: 'on' | 'off' | null;\n\t\t/** What fits the state, built by the page so the chord menu offers the same. */\n\t\tactions: ChordAction[];\n\t}\n\n\tlet { url, pending, actions }: Props = $props();\n\n\tlet open = $state(false);\n\n\tconst label = $derived(\n\t\tpending ? `Turning Remote Control ${pending}…` : `Remote Control is ${url ? 'on' : 'off'}`\n\t);\n\n\tfunction pick(action: ChordAction) {\n\t\topen = false;\n\t\taction.run();\n\t}\n</script>\n\n<Popover.Root bind:open>\n\t<Popover.Trigger class=\"mini rc-trigger\" aria-label={label} title={label} data-on={url ? '' : undefined} data-pending={pending ?? undefined}>\n\t\t<iconify-icon icon={url ? 'mdi:cellphone-link' : 'mdi:cellphone-link-off'}></iconify-icon>\n\t</Popover.Trigger>\n\t<Popover.Content side=\"top\" align=\"end\" sideOffset={8} role=\"menu\" class=\"rc-menu w-60 max-w-[85vw] border-[#333] bg-[#1a1a1a] p-1\">\n\t\t<div class=\"rc-head\" role=\"presentation\">\n\t\t\t<span class=\"rc-dot\" data-on={url ? '' : undefined} data-pending={pending ?? undefined}></span>\n\t\t\t{label}\n\t\t</div>\n\t\t{#each actions as action (action.label)}\n\t\t\t<button type=\"button\" role=\"menuitem\" class=\"rc-item\" class:danger={action.danger} disabled={action.disabled} onclick={() => pick(action)}>\n\t\t\t\t<iconify-icon icon={action.icon}></iconify-icon>\n\t\t\t\t{action.label}\n\t\t\t</button>\n\t\t{/each}\n\t</Popover.Content>\n</Popover.Root>\n\n<style>\n\t/* On reads in the sidebar's Remote Control indigo, so the two agree. */\n\t:global(.rc-trigger[data-on]) {\n\t\tcolor: #818cf8 !important;\n\t}\n\t:global(.rc-trigger[data-pending] iconify-icon),\n\t.rc-dot[data-pending] {\n\t\tanimation: rc-wait 1.2s steps(2, jump-none) infinite;\n\t}\n\t@keyframes rc-wait {\n\t\tfrom {\n\t\t\topacity: 1;\n\t\t}\n\t\tto {\n\t\t\topacity: 0.35;\n\t\t}\n\t}\n\t.rc-head {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tpadding: 6px 8px 8px;\n\t\tfont-size: 11px;\n\t\tletter-spacing: 0.02em;\n\t\tcolor: #a8a29e;\n\t}\n\t.rc-dot {\n\t\twidth: 6px;\n\t\theight: 6px;\n\t\tborder-radius: 50%;\n\t\tbackground: #57534e;\n\t\tflex: none;\n\t}\n\t.rc-dot[data-on] {\n\t\tbackground: #818cf8;\n\t}\n\t.rc-item {\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\tmin-height: 34px;\n\t\talign-items: center;\n\t\tgap: 10px;\n\t\tborder-radius: 6px;\n\t\tpadding: 0 8px;\n\t\tfont-size: 13px;\n\t\tcolor: #e7e5e4;\n\t\ttext-align: left;\n\t\tcursor: pointer;\n\t}\n\t.rc-item iconify-icon {\n\t\tfont-size: 16px;\n\t\tcolor: #a8a29e;\n\t}\n\t.rc-item:hover:not(:disabled) {\n\t\tbackground: #262626;\n\t}\n\t.rc-item:disabled {\n\t\topacity: 0.45;\n\t\tcursor: default;\n\t}\n\t.rc-item.danger,\n\t.rc-item.danger iconify-icon {\n\t\tcolor: #fca5a5;\n\t}\n\t@media (pointer: coarse) {\n\t\t.rc-item {\n\t\t\tmin-height: 44px;\n\t\t}\n\t}\n</style>\n","import { createPersisted } from './persisted';\n\n/** What a session's side panel keeps between visits; the URL holds which pane is open. */\nexport interface PanelPrefs {\n\t/** The inline column's width in px, set by a drag; unset means the default width. */\n\twidth?: number;\n\t/** The panel takes the whole page. */\n\tmaximized?: boolean;\n\t/** The pane last opened, which the close key reopens. */\n\tlast?: string;\n}\n\nconst persisted = createPersisted<Record<string, PanelPrefs>>('claude-mux-side-panel', {});\n\n/** The side panel's per-session preferences, keyed by pane target. */\nclass SidePanelStore {\n\tprivate state = $state<Record<string, PanelPrefs>>(persisted.load());\n\n\tget(target: string | null): PanelPrefs {\n\t\treturn (target && this.state[target]) || {};\n\t}\n\n\tupdate(target: string | null, patch: PanelPrefs): void {\n\t\tif (!target) return;\n\t\tthis.state[target] = { ...this.state[target], ...patch };\n\t\tpersisted.save(this.state);\n\t}\n}\n\nexport const sidePanelStore = new SidePanelStore();\n","/**\n * The side panel's sizes. The column sits beside the session (transcript and\n * composer) on a wide screen and becomes a sheet over it below\n * INLINE_MEDIA_QUERY's width.\n */\n\nconst REM = 16;\n\n/** Narrower than this, the panel is a sheet rather than a column. */\nexport const INLINE_MEDIA_QUERY = '(min-width: 1181px)';\n/** Narrower than this, the sheet takes the whole screen. */\nexport const PHONE_MEDIA_QUERY = '(max-width: 640px)';\n\n/** The default width, until a drag sets one. */\nexport const DEFAULT_WIDTH_CSS = 'clamp(28rem, 48vw, 44rem)';\nexport const PANEL_MIN_PX = 26 * REM;\n/** The session column — transcript and composer — is never squeezed below this. */\nexport const SESSION_MIN_PX = 28 * REM;\n/** The divider between the two columns. */\nexport const DIVIDER_PX = 6;\n\n/**\n * The width a drag to `pointerX` asks for, or null when it would squeeze the\n * session column below its minimum (the drag is then refused and the panel\n * keeps its width). Narrower than the panel's own minimum clamps to it.\n */\nexport function dragWidth(pointerX: number, rowRight: number, rowWidth: number): number | null {\n\tconst width = Math.max(PANEL_MIN_PX, Math.round(rowRight - pointerX - DIVIDER_PX / 2));\n\treturn rowWidth - width - DIVIDER_PX < SESSION_MIN_PX ? null : width;\n}\n","<script lang=\"ts\">\n\timport { page } from '$app/stores';\n\timport { goto, afterNavigate } from '$app/navigation';\n\timport { browser } from '$app/environment';\n\timport { reportClient } from '$lib/client-log';\n\timport { onDestroy, onMount, tick } from 'svelte';\n\timport { terminalStore } from '$lib/stores/terminal.svelte';\n\timport { sessionStore, getSessionDisplayName, attentionPrefix, postVisit } from '$lib/stores/sessions.svelte';\n\timport SessionStateIndicator from '$lib/components/SessionStateIndicator.svelte';\n\timport { sessionStateVisual, indicatorStateOf, isUnread, type IndicatorState } from '$shared/session-state.js';\n\timport { preferences } from '$lib/stores/preferences.svelte';\n\timport { Button } from '$lib/components/ui/button';\n\timport * as AlertDialog from '$lib/components/ui/alert-dialog';\n\timport * as Popover from '$lib/components/ui/popover';\n\timport TerminalView from '$lib/components/TerminalView.svelte';\n\timport TranscriptView from '$lib/components/TranscriptView.svelte';\n\timport { appendQuote } from '$lib/quote';\n\timport { transcriptStore } from '$lib/stores/transcript.svelte';\n\timport ContextGauge from '$lib/components/ContextGauge.svelte';\n\timport RailStats from '$lib/components/RailStats.svelte';\n\timport VoiceMeter, { type VoiceAction } from '$lib/components/VoiceMeter.svelte';\n\timport QueueStrip from '$lib/components/QueueStrip.svelte';\n\timport type { QueuedMessageInfo } from '$shared/types/ws-messages.js';\n\timport VoiceButton from '$lib/components/VoiceButton.svelte';\n\timport KeyTray from '$lib/components/KeyTray.svelte';\n\timport SessionSheet from '$lib/components/SessionSheet.svelte';\n\timport { drawer } from '$lib/stores/drawer.svelte';\n\timport Hint from '$lib/components/Hint.svelte';\n\timport * as Tooltip from '$lib/components/ui/tooltip';\n\timport { modelDisplayName } from '$shared/claude/model-name.js';\n\timport { serverStore } from '$lib/stores/servers.svelte';\n\timport { blockedReason, fleetStore, routeMachine, sessionApiAt } from '$lib/stores/fleet.svelte';\n\timport { clock } from '$lib/stores/clock.svelte';\n\timport { parseSessionPath, sessionPath } from '$lib/session-route';\n\timport { formatRef } from '$lib/split-refs';\n\timport CommandPalette from '$lib/components/CommandPalette.svelte';\n\timport CommandList from '$lib/components/CommandList.svelte';\n\timport RenameSessionDialog from '$lib/components/RenameSessionDialog.svelte';\n\timport { voiceStore } from '$lib/stores/voice.svelte';\n\timport { caretOf, insertSaid, keepsCaret, putCaret } from '$lib/dictation';\n\timport { draftsStore } from '$lib/stores/drafts.svelte';\n\timport { attachmentsStore, type Attachment } from '$lib/stores/attachments.svelte';\n\timport { untrack } from 'svelte';\n\timport { swipe } from '$lib/actions/swipe';\n\timport { STORAGE_KEYS, MOD_LABEL, STEERS, type SteerMode } from '$lib/constants';\n\timport { useGamepad, STICK_DEADZONE } from '$lib/gamepad.svelte';\n\timport { sidebarActionsStore, type ChordAction } from '$lib/stores/sidebarActions.svelte';\n\timport { viewModesStore } from '$lib/stores/viewModes.svelte';\n\timport * as Sheet from '$lib/components/ui/sheet';\n\timport ResizeDivider from '$lib/components/ResizeDivider.svelte';\n\timport SidePanel from '$lib/components/side-panel/SidePanel.svelte';\n\timport PanelToggle from '$lib/components/side-panel/PanelToggle.svelte';\n\timport RemoteControlMenu from '$lib/components/RemoteControlMenu.svelte';\n\timport { copyWithToast } from '$lib/side-panel/clipboard';\n\timport { toast } from 'svelte-sonner';\n\timport type { RewindAction } from '$shared/tmux/rewind.js';\n\timport { sidePanelStore } from '$lib/stores/sidePanel.svelte';\n\timport { PANES, PANE_KINDS, PANE_PARAMS, paneDef, panelKeyAction } from '$lib/side-panel/panes';\n\timport { MediaQuery } from 'svelte/reactivity';\n\timport { panelQuery, readPanel } from '$lib/side-panel/url';\n\timport type { Listing, TranscriptChanges } from '$lib/side-panel/changes';\n\timport {\n\t\tINLINE_MEDIA_QUERY,\n\t\tPHONE_MEDIA_QUERY,\n\t\tDEFAULT_WIDTH_CSS,\n\t\tPANEL_MIN_PX,\n\t\tSESSION_MIN_PX,\n\t\tDIVIDER_PX,\n\t\tdragWidth\n\t} from '$lib/side-panel/layout';\n\n\tconst target = $derived($page.params.target ? decodeURIComponent($page.params.target) : null);\n\tconst voiceEnabled = $derived(Boolean($page.data.voiceEnabled));\n\n\t/**\n\t * The machine the route names, `/m/<host>/session/<target>`. Its calls go\n\t * through this server's relay (`base`); this machine's own, named or not,\n\t * go straight here.\n\t */\n\tconst route = routeMachine(() => $page.params.machine ?? null);\n\tconst base = $derived(route.base);\n\tconst remoteHost = $derived(route.remoteHost);\n\tconst machineHost = $derived(route.machineHost);\n\t/** Why this page cannot act on the session's machine (offline, or too old for the relay), or null. */\n\tconst machineBlocked = $derived(route.machine ? blockedReason(route.machine, clock.now) : null);\n\t/**\n\t * The session as every per-session store keeps it (drafts, attachments,\n\t * views, voice): its target here, `host@target` on another machine,\n\t * since targets repeat across machines.\n\t */\n\tconst ref = $derived(target ? formatRef({ host: remoteHost, target }) : null);\n\t/** A session's API on this page's machine, by id or tmux target. */\n\tconst api = (id: string) => sessionApiAt(base, id);\n\n\tconst currentSession = $derived(route.session(target));\n\n\t// A plain (non-Claude) pane: a shell or a dev server, on whichever machine the route names.\n\tconst tmuxPane = $derived(route.pane(target) ?? null);\n\tconst isClaudeSession = $derived(currentSession != null);\n\tconst isPlainPane = $derived(!isClaudeSession && tmuxPane != null);\n\tconst claudeSessionDead = $derived(\n\t\tisClaudeSession && !!currentSession?.tmux_target && currentSession?.pane_alive === false\n\t);\n\t/**\n\t * Another machine's session is missing when the origin, whose socket\n\t * carries every machine it follows, has answered without it. That holds a\n\t * while before it counts: a session started from the sidebar is on the\n\t * page before its machine lists it.\n\t */\n\tconst REMOTE_MISSING_GRACE_MS = 10_000;\n\tconst remoteGone = $derived(!!remoteHost && !isClaudeSession && !isPlainPane && sessionStore.receivedData);\n\tlet remoteMissing = $state(false);\n\t$effect(() => {\n\t\tvoid ref;\n\t\tremoteMissing = false;\n\t\tif (!remoteGone) return;\n\t\tconst settle = setTimeout(() => (remoteMissing = true), REMOTE_MISSING_GRACE_MS);\n\t\treturn () => clearTimeout(settle);\n\t});\n\tconst targetMissing = $derived(\n\t\tremoteHost\n\t\t\t? remoteMissing\n\t\t\t: sessionStore.listed && !isClaudeSession && !isPlainPane\n\t);\n\tconst paneIsDead = $derived(claudeSessionDead || targetMissing);\n\tconst isAlive = $derived(!paneIsDead && (isClaudeSession || isPlainPane));\n\t// Dead panes and plain (non-Claude) panes are row states, not Claude states.\n\tconst indicatorState = $derived<IndicatorState>(\n\t\tpaneIsDead ? 'dead' : isPlainPane ? 'plain' : currentSession ? indicatorStateOf(currentSession) : 'idle'\n\t);\n\t// Browser tab: the state emoji rides in front of the name, so a background\n\t// tab says whether the session wants a human without being opened, and\n\t// the count before it says how many sessions anywhere want one or are done.\n\tconst attention = $derived(attentionPrefix(fleetStore.answering));\n\tconst pageTitle = $derived(\n\t\t`${attention}${sessionStateVisual(indicatorState).emoji} ${\n\t\t\tcurrentSession ? getSessionDisplayName(currentSession) : (target || 'Session')\n\t\t}`\n\t);\n\n\t// The unread \"Done\" watermark: opening the session stamps it, and so does\n\t// a turn that finishes while the page is in front of someone — the same\n\t// visit clears the badge on every other browser. Split panes are this page\n\t// in a frame, so they count too. Adapted from t3code's ChatView visit\n\t// effect (MIT, © T3 Tools Inc.).\n\tlet pageVisible = $state(browser && document.visibilityState === 'visible');\n\tonMount(() => {\n\t\tconst onVisibility = () => (pageVisible = document.visibilityState === 'visible');\n\t\tdocument.addEventListener('visibilitychange', onVisibility);\n\t\treturn () => document.removeEventListener('visibilitychange', onVisibility);\n\t});\n\t/**\n\t * The session this page last stamped, and the finished turn it had then:\n\t * one post per completion, not per broadcast. A \"Mark unread\" from another\n\t * browser leaves the turn as it was, so this page does not undo it.\n\t */\n\tlet lastVisit: { id: string; turn: number | null } | null = null;\n\t$effect(() => {\n\t\tconst s = currentSession;\n\t\tif (!s || !pageVisible) return;\n\t\tconst turn = s.turn_completed_at ?? null;\n\t\tconst fresh = lastVisit?.id !== s.id;\n\t\tif (!fresh && (!isUnread(s) || lastVisit!.turn === turn)) return;\n\t\tlastVisit = { id: s.id, turn };\n\t\tpostVisit(base, s.id);\n\t});\n\t// Inline status next to the title. Skip bare states (idle/busy/etc.)\n\t// since the state symbol + color already convey them; only show when\n\t// there's information the symbol can't carry.\n\tconst statusText = $derived.by(() => {\n\t\tif (paneIsDead) return 'pane closed';\n\t\tif (isPlainPane) return tmuxPane?.command || null;\n\t\treturn currentSession?.current_action || null;\n\t});\n\n\t// Transcript view exists only for Claude sessions (the JSONL is Claude Code's own log).\n\tconst canTranscript = $derived(isClaudeSession && (currentSession?.agent ?? 'claude') === 'claude');\n\t// Each view has its own URL: `?view=terminal` is the raw mirror. Without the\n\t// param, the session reopens in whichever view it was last left in.\n\t/**\n\t * This page is one pane of a split, drawn inside the split page's iframe.\n\t * The composer then carries the pane's controls — swap, zoom, close — and\n\t * asks the page outside for them with postMessage; the page outside only\n\t * ever tells this one whether it holds the focus.\n\t */\n\tconst embed = $derived($page.url.searchParams.has('embed'));\n\tlet paneFocused = $state(false);\n\tlet paneSide = $state<'a' | 'b' | null>(null);\n\n\tfunction tellPane(action: 'focus' | 'focus-other' | 'swap' | 'zoom' | 'close' | 'ready' | 'switch') {\n\t\tif (!embed || window.parent === window) return;\n\t\twindow.parent.postMessage({ type: 'claude-mux:pane', action }, location.origin);\n\t}\n\n\tonMount(() => {\n\t\tif (!embed) return;\n\t\tserverStore.init();\n\t\tconst onMessage = (e: MessageEvent) => {\n\t\t\tif (e.source !== window.parent) return;\n\t\t\tconst msg = e.data as { type?: string; focused?: boolean; side?: 'a' | 'b' } | null;\n\t\t\tif (msg?.type !== 'claude-mux:focus') return;\n\t\t\tpaneFocused = msg.focused === true;\n\t\t\tpaneSide = msg.side ?? null;\n\t\t};\n\t\t// Any interaction inside the pane is a claim on the focus.\n\t\tconst onPointer = () => tellPane('focus');\n\t\tconst onKeys = (e: KeyboardEvent) => {\n\t\t\tif ((e.ctrlKey || e.metaKey) && (e.key === '1' || e.key === '2')) {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst wanted = e.key === '1' ? 'a' : 'b';\n\t\t\t\ttellPane(wanted === paneSide ? 'focus' : 'focus-other');\n\t\t\t} else if ((e.ctrlKey || e.metaKey) && !e.altKey && !e.shiftKey && e.key.toLowerCase() === 'k') {\n\t\t\t\t// The switcher lives in the drawer, which belongs to the page outside.\n\t\t\t\te.preventDefault();\n\t\t\t\ttellPane('switch');\n\t\t\t}\n\t\t};\n\t\twindow.addEventListener('message', onMessage);\n\t\twindow.addEventListener('pointerdown', onPointer, true);\n\t\twindow.addEventListener('focus', onPointer);\n\t\twindow.addEventListener('keydown', onKeys, true);\n\t\ttellPane('ready');\n\t\treturn () => {\n\t\t\twindow.removeEventListener('message', onMessage);\n\t\t\twindow.removeEventListener('pointerdown', onPointer, true);\n\t\t\twindow.removeEventListener('focus', onPointer);\n\t\t\twindow.removeEventListener('keydown', onKeys, true);\n\t\t};\n\t});\n\n\tconst viewMode = $derived.by(() => {\n\t\tif (!canTranscript) return 'terminal';\n\t\tconst param = $page.url.searchParams.get('view');\n\t\tif (param === 'terminal' || param === 'transcript') return param;\n\t\treturn viewModesStore.get(ref);\n\t});\n\n\tfunction toggleView() {\n\t\tconst next = viewMode === 'transcript' ? 'terminal' : 'transcript';\n\t\tviewModesStore.set(ref, next);\n\t\tconst params = new URLSearchParams($page.url.searchParams);\n\t\tif (next === 'terminal') params.set('view', 'terminal');\n\t\telse params.delete('view');\n\t\tnavigateQuery(params);\n\t}\n\n\t/** Go to this page with `query`, keeping scroll and focus. */\n\tfunction navigateQuery(query: URLSearchParams, replaceState = false) {\n\t\tconst q = query.toString();\n\t\tgoto(`${$page.url.pathname}${q ? `?${q}` : ''}`, { noScroll: true, keepFocus: true, replaceState });\n\t}\n\n\t/**\n\t * The side panel: a column beside the session on a wide screen, a sheet\n\t * over it below 1180px (full-screen on a phone). Which pane shows lives in\n\t * the URL (`?panel=<kind>` and the pane's own params); its width, maximize,\n\t * and the pane last shown live in localStorage, per session.\n\t */\n\t/** The pane the URL asks for, unless it cannot apply to this session (a plain pane, say). */\n\tconst panelKind = $derived.by(() => {\n\t\tconst kind = readPanel($page.url.searchParams, PANE_KINDS);\n\t\treturn kind && !paneDef(kind)?.unavailable?.(currentSession ?? null) ? kind : null;\n\t});\n\tconst panelPrefs = $derived(sidePanelStore.get(ref));\n\tconst inlineQuery = new MediaQuery(INLINE_MEDIA_QUERY);\n\tconst phoneQuery = new MediaQuery(PHONE_MEDIA_QUERY);\n\tconst panelInline = $derived(inlineQuery.current);\n\tconst panelPhone = $derived(phoneQuery.current);\n\t/**\n\t * The pane the inline column last showed for this session. Closing hides\n\t * the column rather than unmounting it, so reopening finds every pane as\n\t * it was left.\n\t */\n\tlet panelKept = $state<{ ref: string | null; kind: string } | null>(null);\n\t$effect(() => {\n\t\tif (panelKind) panelKept = { ref, kind: panelKind };\n\t});\n\tconst panelColumnKind = $derived(\n\t\tpanelKind ?? (panelKept?.ref === ref ? panelKept.kind : null)\n\t);\n\tconst panelMaximized = $derived(panelInline && panelKind !== null && panelPrefs.maximized === true);\n\t/** The column's width mid-drag; saved to the session's prefs when the drag ends. */\n\tlet panelDragWidth = $state<number | null>(null);\n\tlet panelResizing = $state(false);\n\tlet sessionRow = $state<HTMLElement | null>(null);\n\tconst panelWidth = $derived(panelDragWidth ?? panelPrefs.width);\n\tconst panelWidthCss = $derived(panelWidth ? `${panelWidth}px` : DEFAULT_WIDTH_CSS);\n\n\t/** Show `kind`'s pane (or close the panel, for null). Opening and closing push history. */\n\tfunction openPanel(kind: string | null) {\n\t\tif (kind === panelKind) return;\n\t\tif (kind) sidePanelStore.update(ref, { last: kind });\n\t\tnavigateQuery(panelQuery($page.url.searchParams, kind, PANE_PARAMS));\n\t}\n\n\t/** A pane's key: pressed for the pane showing it closes the panel, otherwise it switches. Returns whether it did anything. */\n\tfunction togglePane(kind: string): boolean {\n\t\tif (paneDef(kind)?.unavailable?.(currentSession ?? null)) return false;\n\t\topenPanel(panelKind === kind ? null : kind);\n\t\treturn true;\n\t}\n\n\t/** The panel's own toggle: close it, or open it on the pane last shown. */\n\tfunction togglePanel(): boolean {\n\t\tif (!panelKind) return togglePane((paneDef(panelPrefs.last ?? null) ?? PANES[0]).kind);\n\t\topenPanel(null);\n\t\treturn true;\n\t}\n\n\tfunction setPaneParams(kind: string, own: Record<string, string | null>, opts?: { push?: boolean }) {\n\t\tif (kind !== panelKind) return;\n\t\tnavigateQuery(panelQuery($page.url.searchParams, kind, PANE_PARAMS, own), !opts?.push);\n\t}\n\n\t/** A pane's \"Mention\": the text joins the end of the draft, and a sheet steps aside so the composer shows. */\n\tfunction mentionInComposer(text: string) {\n\t\tconst gap = textInput && !/\\s$/.test(textInput) ? ' ' : '';\n\t\ttextInput = `${textInput}${gap}${text} `;\n\t\tif (!panelInline && panelKind) openPanel(null);\n\t\tvoid tick().then(() => {\n\t\t\tautoResize();\n\t\t\ttextareaElement?.focus();\n\t\t});\n\t}\n\n\t/** The composer takes the focus with the caret after everything in it. */\n\tfunction focusComposerEnd() {\n\t\tvoid tick().then(() => {\n\t\t\tautoResize();\n\t\t\tif (!textareaElement) return;\n\t\t\ttextareaElement.focus();\n\t\t\tconst end = textareaElement.value.length;\n\t\t\ttextareaElement.setSelectionRange(end, end);\n\t\t\ttextareaElement.scrollTop = textareaElement.scrollHeight;\n\t\t\tsyncCaret();\n\t\t});\n\t}\n\n\t/** The transcript's \"Add to prompt\": the selection joins the draft as a quote, and the reply goes under it. */\n\tfunction quoteInComposer(text: string) {\n\t\ttextInput = appendQuote(textInput, text);\n\t\tfocusComposerEnd();\n\t}\n\n\t/** A link that opens the side panel on `kind`, with that pane's own params. */\n\tfunction paneLink(kind: string, own: Record<string, string | null>): string {\n\t\treturn `${$page.url.pathname}?${panelQuery($page.url.searchParams, kind, PANE_PARAMS, own)}`;\n\t}\n\n\t/** A pull request or issue (`owner/name#n`) opened beside the session in the GitHub pane. */\n\tfunction openGithub(ref: string) {\n\t\tnavigateQuery(panelQuery($page.url.searchParams, 'github', PANE_PARAMS, { ref }));\n\t}\n\n\t/** Where a transcript tool row opens the file it touched: the Files pane, at that line. */\n\tfunction fileLink(path: string, line: number | null): string {\n\t\treturn paneLink('files', { file: path, line: line ? String(line) : null });\n\t}\n\n\t/** Where a turn's change summary opens the Changes pane: the session source, that turn, a file. */\n\tfunction changesLink(n: number, file: string | null): string {\n\t\treturn paneLink('changes', { source: 'session', turn: String(n), file });\n\t}\n\n\t/**\n\t * The turns that edited files, for the transcript's per-turn summaries.\n\t * Earlier turns never change, so this is read on opening a session and\n\t * again only when a turn ends (the session goes idle), not when one starts;\n\t * and once more a moment after, since the log can trail the Stop hook.\n\t */\n\tlet turnChanges = $state<{ id: string; changes: TranscriptChanges } | null>(null);\n\tconst changesSessionId = $derived(currentSession?.id ?? null);\n\tconst turnEnded = $derived(\n\t\tcurrentSession?.state === 'idle' ? (currentSession.turn_completed_at ?? 0) : null\n\t);\n\tconst sessionChanges = $derived(\n\t\tturnChanges && turnChanges.id === changesSessionId ? turnChanges.changes : null\n\t);\n\t$effect(() => {\n\t\tconst id = changesSessionId;\n\t\tif (!id) return;\n\t\tconst fallbackRoot = untrack(() => currentSession?.git_root ?? currentSession?.cwd ?? null);\n\t\tif (turnEnded === null && untrack(() => turnChanges?.id) === id) return;\n\t\tlet stale = false;\n\t\tconst load = () =>\n\t\t\tfetch(`${api(id)}/changes?source=session`)\n\t\t\t\t.then((res) => (res.ok ? (res.json() as Promise<Listing>) : null))\n\t\t\t\t.then((body) => {\n\t\t\t\t\tif (stale || !body) return;\n\t\t\t\t\tconst changes = {\n\t\t\t\t\t\tturns: body.turns ?? [],\n\t\t\t\t\t\tprompts: new Set(body.prompts ?? []),\n\t\t\t\t\t\troot: body.root ?? fallbackRoot\n\t\t\t\t\t};\n\t\t\t\t\tturnChanges = { id, changes };\n\t\t\t\t})\n\t\t\t\t.catch(() => {});\n\t\tvoid load();\n\t\tconst again = turnEnded === null ? null : setTimeout(load, 3000);\n\t\treturn () => {\n\t\t\tstale = true;\n\t\t\tif (again) clearTimeout(again);\n\t\t};\n\t});\n\n\t/** Returns whether it did anything. */\n\tfunction toggleMaximize(): boolean {\n\t\tif (!panelInline || !panelKind) return false;\n\t\tsidePanelStore.update(ref, { maximized: !panelPrefs.maximized });\n\t\treturn true;\n\t}\n\n\tfunction resizePanel(e: PointerEvent) {\n\t\tif (!sessionRow) return;\n\t\tconst rect = sessionRow.getBoundingClientRect();\n\t\tconst width = dragWidth(e.clientX, rect.right, rect.width);\n\t\t// A width that would crush the session column is refused, not clamped.\n\t\tif (width !== null) panelDragWidth = width;\n\t}\n\n\tfunction endPanelResize() {\n\t\tif (panelDragWidth !== null) sidePanelStore.update(ref, { width: panelDragWidth });\n\t\tpanelDragWidth = null;\n\t}\n\n\t/** The keys that toggle a pane, close or reopen the panel, and maximize it. */\n\tfunction handlePanelKeys(e: KeyboardEvent): boolean {\n\t\tconst action = e.defaultPrevented ? null : panelKeyAction(e);\n\t\tif (!action) return false;\n\t\tlet done: boolean;\n\t\tif (action === 'maximize') done = toggleMaximize();\n\t\telse if (action === 'toggle') done = togglePanel();\n\t\telse done = togglePane(action.kind);\n\t\t// A key that changed nothing is left to whatever else wants it.\n\t\tif (done) e.preventDefault();\n\t\treturn done;\n\t}\n\n\tlet textInput = $state('');\n\t/** Ctrl/⌘ is held, so the primary button shows what Enter would do with it. */\n\tlet heldDelivery = $state<'steer' | 'now' | null>(null);\n\t/**\n\t * What was last dictated into the draft. While the draft still holds it the\n\t * message is sent as spoken, so its turn is badged; a draft rewritten or\n\t * swapped for another session's stops matching, with nothing to reset.\n\t */\n\tlet said = $state<string | null>(null);\n\tconst dictated = $derived(said !== null && textInput.includes(said));\n\t/**\n\t * A queued message loaded into the composer. What was typed before is put\n\t * aside and comes back once the edit is saved or cancelled.\n\t */\n\tlet editing = $state<{ ref: string; api: string; id: string; draft: string } | null>(null);\n\t/** Said once, when an edit outlived the message it was editing. */\n\tlet editNotice = $state<string | null>(null);\n\tlet showConfirmKill = $state(false);\n\tlet showConfirmRestart = $state(false);\n\tlet moreOpen = $state(false);\n\tlet commandsOpen = $state(false);\n\tlet attachPickerOpen = $state(false);\n\tlet attachStackOpen = $state(false);\n\tlet ctrlCount = $state(0);\n\tlet altCount = $state(0);\n\n\t/** The key tray, and the sheet that replaced the page header. */\n\tlet trayOpen = $state(false);\n\tlet sheetOpen = $state(false);\n\tlet chordMenuOpen = $state(false);\n\tlet chordIndex = $state(0);\n\tlet chordItems = $state<ChordAction[]>([]);\n\tlet chordTitle = $state('');\n\tlet chordStickArmed = $state(false);\n\tlet chordStickX = $state(0);\n\tlet chordStickY = $state(0);\n\tlet showCopied = $state(false);\n\tconst CHORD_STICK_DEADZONE = 0.3;\n\tconst CHORD_RING_THRESHOLD = 0.7;\n\tconst CHORD_RING_RADII = [130, 220];\n\tconst CHORD_CURSOR_RADIUS_PX = 240;\n\tconst CHORD_MAX_PER_RING = 12;\n\tlet chordInnerCount = $state(0);\n\tconst chordRings = $derived.by(() => {\n\t\tconst items = chordItems;\n\t\tif (chordInnerCount <= 0 || chordInnerCount >= items.length) return [items];\n\t\treturn [items.slice(0, chordInnerCount), items.slice(chordInnerCount)];\n\t});\n\tconst chordPositions = $derived(\n\t\tchordRings.flatMap((ring, ringIdx) => {\n\t\t\tconst r = CHORD_RING_RADII[ringIdx] ?? CHORD_RING_RADII[CHORD_RING_RADII.length - 1];\n\t\t\treturn ring.map((_, i) => {\n\t\t\t\tconst angle = (i / ring.length) * Math.PI * 2 - Math.PI / 2;\n\t\t\t\treturn { x: Math.cos(angle) * r, y: Math.sin(angle) * r };\n\t\t\t});\n\t\t})\n\t);\n\n\tconst headerActions: ChordAction[] = $derived([\n\t\t...(isAlive && canTranscript\n\t\t\t? [\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: viewMode === 'transcript' ? 'Terminal view' : 'Transcript view',\n\t\t\t\t\t\ticon: viewMode === 'transcript' ? 'mdi:console' : 'mdi:message-text-outline',\n\t\t\t\t\t\trun: () => toggleView()\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t: []),\n\t\t...(isAlive\n\t\t\t? [\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: 'Copy cmd',\n\t\t\t\t\t\ticon: showCopied ? 'mdi:check' : 'mdi:content-copy',\n\t\t\t\t\t\trun: () => copyTmuxCmd(),\n\t\t\t\t\t\tflashing: showCopied\n\t\t\t\t\t},\n\t\t\t\t\t{ label: 'Fit screen', icon: 'mdi:fit-to-screen', run: () => handleResize() },\n\t\t\t\t\t{ label: 'Refresh', icon: 'mdi:refresh', run: () => location.reload() }\n\t\t\t\t]\n\t\t\t: []),\n\t\t...(isAlive && isClaudeSession\n\t\t\t? [{ label: 'Restart Claude', icon: 'mdi:restart', run: () => (showConfirmRestart = true) }]\n\t\t\t: []),\n\t\t{ label: 'Kill pane', icon: 'mdi:power', run: () => (showConfirmKill = true), danger: true }\n\t]);\n\n\t/**\n\t * Remote Control's actions, drawn by the status line's menu and spliced\n\t * into the gamepad's chord menu, so the two offer the same rows. Kept out\n\t * of `headerActions` because that menu draws them itself. Turning is greyed\n\t * out in the menu while an ask is pending; `turnRemoteControl` ignores a\n\t * second ask either way.\n\t */\n\tconst rcActions: ChordAction[] = $derived.by(() => {\n\t\tif (!isAlive || !isClaudeSession) return [];\n\t\tconst url = currentSession?.rc_url;\n\t\tconst disabled = rcPending !== null;\n\t\tif (!url)\n\t\t\treturn [{ label: 'Turn on Remote Control', icon: 'mdi:cellphone-link', disabled, run: () => turnRemoteControl(true) }];\n\t\treturn [\n\t\t\t{ label: 'Open in Claude app', icon: 'mdi:open-in-new', run: () => window.open(url, '_blank', 'noopener') },\n\t\t\t{ label: 'Copy link', icon: 'mdi:link-variant', run: () => void copyWithToast(url, 'Link copied') },\n\t\t\t{\n\t\t\t\tlabel: 'Turn off Remote Control',\n\t\t\t\ticon: 'mdi:cellphone-link-off',\n\t\t\t\tdanger: true,\n\t\t\t\tdisabled,\n\t\t\t\trun: () => turnRemoteControl(false)\n\t\t\t}\n\t\t];\n\t});\n\n\tconst ctrlActions: ChordAction[] = [\n\t\t{ label: 'Ctrl+L', icon: 'mdi:eraser', run: () => void sendKeys('C-l') },\n\t\t{ label: 'Ctrl+U', icon: 'mdi:backspace-outline', run: () => void sendKeys('C-u') },\n\t\t{ label: 'Ctrl+W', icon: 'mdi:delete-sweep-outline', run: () => void sendKeys('C-w') },\n\t\t{ label: 'Ctrl+C', icon: 'mdi:stop', run: () => void sendKeys('C-c') },\n\t\t{ label: 'Ctrl+R', icon: 'mdi:magnify', run: () => void sendKeys('C-r') }\n\t];\n\n\tconst slashActions: ChordAction[] = [\n\t\t{ label: '/clear', icon: 'mdi:broom', run: () => runText('/clear') },\n\t\t{ label: '/compact', icon: 'mdi:archive-arrow-down', run: () => runText('/compact') },\n\t\t{ label: '/resume', icon: 'mdi:play-circle-outline', run: () => runText('/resume') },\n\t\t{ label: '/memory', icon: 'mdi:memory', run: () => runText('/memory') },\n\t\t{ label: '/init', icon: 'mdi:rocket-launch-outline', run: () => runText('/init') },\n\t\t{ label: '/grill-me', icon: 'mdi:fire', run: () => runText('/grill-me') },\n\t\t{ label: '/grill-with-docs', icon: 'mdi:fire-circle', run: () => runText('/grill-with-docs') },\n\t\t{ label: '/tdd', icon: 'mdi:test-tube', run: () => runText('/tdd') },\n\t\t{ label: '/diagnose', icon: 'mdi:stethoscope', run: () => runText('/diagnose') },\n\t\t{ label: '/simplify', icon: 'mdi:vector-difference-ab', run: () => runText('/simplify') },\n\t\t{ label: '/frontend-design', icon: 'mdi:palette-outline', run: () => runText('/frontend-design') },\n\t\t{ label: '/ak:linus', icon: 'mdi:code-tags-check', run: () => runText('/ak:linus') },\n\t\t{ label: '/ak:replan', icon: 'mdi:clipboard-text-outline', run: () => runText('/ak:replan') },\n\t\t{ label: '/ak:redelta', icon: 'mdi:compare', run: () => runText('/ak:redelta') },\n\t\t{ label: '/ak:triage', icon: 'mdi:sort-variant', run: () => runText('/ak:triage') },\n\t\t{ label: '/ak:verify', icon: 'mdi:check-decagram', run: () => runText('/ak:verify') },\n\t\t{ label: '/ak:bcheck', icon: 'mdi:checkbox-marked-circle-outline', run: () => runText('/ak:bcheck') },\n\t\t{ label: '/ak:p1', icon: 'mdi:numeric-1-circle', run: () => runText('/ak:p1') },\n\t\t{ label: '/ak:p2', icon: 'mdi:numeric-2-circle', run: () => runText('/ak:p2') }\n\t];\n\n\tfunction chunk<T>(arr: T[], size: number): T[][] {\n\t\tconst out: T[][] = [];\n\t\tfor (let i = 0; i < arr.length; i += size) out.push(arr.slice(i, i + size));\n\t\treturn out;\n\t}\n\n\tconst attachments = $derived(attachmentsStore.get(ref));\n\tlet cameraInput: HTMLInputElement | null = $state(null);\n\tlet galleryInput: HTMLInputElement | null = $state(null);\n\tlet filesInput: HTMLInputElement | null = $state(null);\n\tlet isTouchDevice = $state(false);\n\tlet dropActive = $state(false);\n\n\tconst canSend = $derived(attachments.every((a) => a.status === 'ready'));\n\tconst readyPaths = $derived(\n\t\tattachments.filter((a) => a.status === 'ready' && a.path).map((a) => a.path!)\n\t);\n\tconst hasDraft = $derived(textInput.trim().length > 0 || readyPaths.length > 0);\n\t/** Claude Code's ghost-text proposal in the pane's prompt box, if any. */\n\tconst suggestion = $derived(\n\t\tcurrentSession?.draft_kind === 'suggestion' ? (currentSession?.draft_input ?? null) : null\n\t);\n\t/** The action button names what it will do rather than always saying \"send\". */\n\tconst actionKind = $derived.by(() => {\n\t\tif (modArmed) return 'keys' as const;\n\t\tif (!hasDraft) {\n\t\t\treturn suggestion != null ? ('accept' as const) : ('enter' as const);\n\t\t}\n\t\tif (editing) return 'save' as const;\n\t\tif (isIdle) return 'send' as const;\n\t\t// Holding Ctrl/⌘ turns the button into what Enter does with it held.\n\t\treturn isBusy && heldDelivery ? heldDelivery : ('queue' as const);\n\t});\n\n\tconst ACTIONS = {\n\t\tkeys: { label: 'Keys', icon: 'mdi:arrow-up-bold' },\n\t\taccept: { label: 'Accept', icon: 'mdi:keyboard-tab' },\n\t\tenter: { label: 'Enter', icon: 'mdi:keyboard-return' },\n\t\tsend: { label: 'Send', icon: 'mdi:arrow-up' },\n\t\tqueue: { label: 'Queue', icon: 'mdi:playlist-plus' },\n\t\t...STEERS,\n\t\tsave: { label: 'Save', icon: 'mdi:content-save-outline' }\n\t} as const;\n\t/** An armed modifier names the sequence it will send, not the verb. */\n\tconst actionLabel = $derived(\n\t\tactionKind === 'keys'\n\t\t\t? [ctrlCount > 0 ? 'Ctrl' : '', altCount > 0 ? 'Alt' : ''].filter(Boolean).join('+')\n\t\t\t: ACTIONS[actionKind].label\n\t);\n\tconst actionIcon = $derived(ACTIONS[actionKind].icon);\n\tconst hasAttachments = $derived(attachments.length > 0);\n\tconst anyFailed = $derived(attachments.some((a) => a.status === 'failed'));\n\tconst anyUploading = $derived(attachments.some((a) => a.status === 'uploading'));\n\t/** The pane is asking for a keypress, so the face toggle asks for attention. */\n\tconst wantsKeypress = $derived(\n\t\tcurrentSession?.state === 'waiting' || currentSession?.state === 'permission'\n\t);\n\t$effect(() => {\n\t\tif (!hasAttachments) attachStackOpen = false;\n\t});\n\n\n\n\tconst isBusy = $derived((currentSession?.state ?? 'idle') === 'busy');\n\tconst isIdle = $derived((currentSession?.state ?? 'idle') === 'idle');\n\n\t/** What tmux calls the arrows the browser reports. */\n\tconst ARROW_KEYS: Record<string, string> = {\n\t\tArrowUp: 'Up',\n\t\tArrowDown: 'Down',\n\t\tArrowLeft: 'Left',\n\t\tArrowRight: 'Right'\n\t};\n\n\t/**\n\t * Shortcuts for the controls that have no caption to name them.\n\t *\n\t * Deliberately avoids Ctrl+J and Ctrl+W, which Chrome keeps for itself and\n\t * will not hand back however hard the page asks.\n\t */\n\tfunction handleGlobalKeys(e: KeyboardEvent) {\n\t\tif (handleChooserKeys(e)) return;\n\t\tif (!e.repeat && handlePanelKeys(e)) return;\n\t\t// The voice key works wherever focus is; the composer handles it\n\t\t// itself when it has focus, and marks the event so it is not taken twice.\n\t\tif (!e.defaultPrevented && !e.repeat && isVoiceHotkey(e)) {\n\t\t\te.preventDefault();\n\t\t\tvoid toggleVoice();\n\t\t\treturn;\n\t\t}\n\t\tif (!(e.ctrlKey || e.metaKey) || e.altKey) return;\n\t\tconst key = e.key.toLowerCase();\n\t\t// Ctrl+K belongs to the drawer's fleet switcher; commands take the slash they start with.\n\t\tif (key === '/') {\n\t\t\te.preventDefault();\n\t\t\tcommandsOpen = !commandsOpen;\n\t\t} else if (key === '.') {\n\t\t\te.preventDefault();\n\t\t\ttrayOpen = !trayOpen;\n\t\t} else if (key === 'e' && isAlive && canTranscript) {\n\t\t\te.preventDefault();\n\t\t\ttoggleView();\n\t\t}\n\t}\n\n\t/**\n\t * The dialog the pane is drawing, as the poll read it. The server gates\n\t * this on the state the hooks report — or, for a dialog a local command\n\t * such as `/model` opens while the session is idle, on the pane naming its\n\t * own keys — so a numbered list in Claude's prose never arrives here.\n\t */\n\tconst paneChoice = $derived(currentSession?.pane_choice ?? null);\n\n\t/**\n\t * The pane has a dialog's text field open — the free-text row, or an\n\t * option's notes. An empty Enter there would decline the question, so\n\t * the composer leaves it to the card's own field.\n\t */\n\tconst paneTyping = $derived(paneChoice?.typing === true || paneChoice?.noting === true);\n\n\t/** Anything drawn over the page that answers to the keyboard itself. */\n\tconst overlayOpen = $derived(\n\t\tcommandsOpen || moreOpen || trayOpen || sheetOpen || chordMenuOpen || attachPickerOpen ||\n\t\t\tattachStackOpen\n\t);\n\n\t/** Element types that keep their own keystrokes. */\n\tconst TYPING_TAGS = /^(INPUT|TEXTAREA|SELECT)$/;\n\n\t/**\n\t * Answer the pane's dialog from the keyboard while nothing else wants the\n\t * keys: no draft, and focus on no field. Enter takes the row the pane has\n\t * highlighted, Escape declines, and the arrows walk it — the same keys the\n\t * dialog answers to in the terminal. Returns whether the key was spent here.\n\t */\n\tfunction handleChooserKeys(e: KeyboardEvent): boolean {\n\t\tif (!paneChoice || hasDraft || paneTyping || overlayOpen) return false;\n\t\tif (e.ctrlKey || e.metaKey || e.altKey) return false;\n\t\tconst el = e.target as HTMLElement | null;\n\t\tif (el?.isContentEditable || TYPING_TAGS.test(el?.tagName ?? '')) return false;\n\t\tconst key = e.key === 'Enter' || e.key === 'Escape' ? e.key : ARROW_KEYS[e.key];\n\t\tif (!key) return false;\n\t\te.preventDefault();\n\t\t// Enter on the highlighted free-text row would decline the question:\n\t\t// the card's field is where its answer goes.\n\t\tif (key === 'Enter' && paneChoice.options.find((o) => o.selected)?.text) {\n\t\t\tfocusDialogField();\n\t\t\treturn true;\n\t\t}\n\t\tvoid sendKeys(key);\n\t\treturn true;\n\t}\n\n\t/** Hands the keyboard to the dialog card's own text field. */\n\tfunction focusDialogField() {\n\t\toutputElement?.querySelector<HTMLInputElement>('[data-dialog-input]')?.focus();\n\t}\n\n\t/**\n\t * The rare half of the old page header, folded into the session sheet.\n\t *\n\t * Derived from `headerActions` rather than restated, so the sheet and the\n\t * gamepad chord menu can never drift apart. The composer draws the view\n\t * toggle and the kill as controls of their own, so those two come out.\n\t */\n\tconst sheetActions = $derived([\n\t\t...(isClaudeSession\n\t\t\t? [\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: 'Rename',\n\t\t\t\t\t\ticon: 'mdi:pencil',\n\t\t\t\t\t\trun: () => (renameId = currentSession?.id ?? null)\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t: []),\n\t\t...headerActions.filter(\n\t\t\t(a) => !a.danger && a.label !== 'Terminal view' && a.label !== 'Transcript view'\n\t\t)\n\t]);\n\t// Tap candidate: modifier keydown with no intervening key → arm on keyup\n\tlet ctrlTapCandidate = false;\n\tlet altTapCandidate = false;\n\t/** The model on the latest reply, named the way the terminal names it. */\n\tconst modelName = $derived(modelDisplayName(transcriptStore.model));\n\tconst paneUpdate = $derived(currentSession?.pane_update ?? null);\n\tconst UPDATE_LABEL = {\n\t\tinstalled: 'Update installed · restart to apply',\n\t\tavailable: 'Update available',\n\t\tfailed: 'Auto-update failed'\n\t} as const;\n\tconst queue = $derived(currentSession?.queue ?? []);\n\tconst queueCount = $derived(queue.length);\n\tfunction findEntry(id: string): HTMLElement | null {\n\t\treturn outputElement?.querySelector<HTMLElement>(`[data-entry-id=\"${CSS.escape(id)}\"]`) ?? null;\n\t}\n\n\t/** How many older slices to pull in looking for an entry before giving up. */\n\tconst REVEAL_PAGES = 40;\n\n\t/**\n\t * Scroll the transcript to an entry (a turn's prompt, a tool row) and open it if it folds. A long session holds only its tail, so\n\t * an entry the socket never sent is asked for, slice by slice, until it is\n\t * on the page or the history runs out.\n\t */\n\tasync function revealEntry(id: string) {\n\t\tlet el = findEntry(id);\n\t\tfor (let i = 0; !el && i < REVEAL_PAGES && transcriptStore.firstIndex > 0; i++) {\n\t\t\tawait transcriptStore.loadEarlier();\n\t\t\tawait tick();\n\t\t\tel = findEntry(id);\n\t\t}\n\t\tif (!el) return;\n\t\tif (el instanceof HTMLDetailsElement) el.open = true;\n\t\tuserScrolledUp = true;\n\t\tel.scrollIntoView({ block: 'center', behavior: 'smooth' });\n\t}\n\n\t/**\n\t * A pane asked to show an entry in the transcript (the Changes pane's\n\t * \"Show in transcript\"). From the terminal, switch to the transcript; a\n\t * sheet over the transcript gets out of the way. The entry is revealed\n\t * once the transcript has its first snapshot.\n\t */\n\tlet pendingReveal = $state<string | null>(null);\n\t$effect(() => {\n\t\tfunction onReveal(e: Event) {\n\t\t\tconst id = (e as CustomEvent<{ id: string }>).detail?.id;\n\t\t\tif (!id || !canTranscript) return;\n\t\t\tif (!panelInline && panelKind) openPanel(null);\n\t\t\tif (viewMode !== 'transcript') toggleView();\n\t\t\tpendingReveal = id;\n\t\t}\n\t\twindow.addEventListener('claude-mux:reveal-entry', onReveal);\n\t\treturn () => window.removeEventListener('claude-mux:reveal-entry', onReveal);\n\t});\n\t$effect(() => {\n\t\tconst id = pendingReveal;\n\t\tif (!id || viewMode !== 'transcript' || !transcriptStore.receivedData) return;\n\t\tpendingReveal = null;\n\t\tvoid tick().then(() => revealEntry(id));\n\t});\n\n\t/** The transcript's live status row is showing (its height affects scroll). */\n\tconst liveRowVisible = $derived(\n\t\tviewMode === 'transcript' && !isIdle\n\t);\n\n\t// Clear whatever is typed in Claude's prompt: Ctrl+E (end of line) then\n\t// Ctrl+U repeatedly (delete to line start; repeats walk up multiline input).\n\t// Extra Ctrl+U on an empty prompt is a no-op, so over-sending is safe.\n\tconst CLEAR_PROMPT_KEYS = 'C-e ' + Array(12).fill('C-u').join(' ');\n\n\tconst moreKeys: { label: string; keys: string; icon: string }[] = [\n\t\t{ label: 'Bksp', keys: 'BSpace', icon: 'mdi:backspace' },\n\t\t{ label: 'Left', keys: 'Left', icon: 'mdi:arrow-left' },\n\t\t{ label: 'Right', keys: 'Right', icon: 'mdi:arrow-right' },\n\t\t{ label: 'Space', keys: 'Space', icon: 'mdi:keyboard-space' },\n\t\t{ label: 'Yes', keys: 'y', icon: 'mdi:check' },\n\t\t{ label: 'Tab', keys: 'Tab', icon: 'mdi:keyboard-tab' },\n\t\t{ label: 'S-Tab', keys: 'BTab', icon: 'mdi:keyboard-tab-reverse' },\n\t\t{ label: 'Enter', keys: 'Enter', icon: 'mdi:keyboard-return' },\n\t\t{ label: 'PgUp', keys: 'PageUp', icon: 'mdi:chevron-double-up' },\n\t\t{ label: 'PgDn', keys: 'PageDown', icon: 'mdi:chevron-double-down' },\n\t\t{ label: 'Home', keys: 'Home', icon: 'mdi:page-first' },\n\t\t{ label: 'End', keys: 'End', icon: 'mdi:page-last' },\n\t\t{ label: 'Clear', keys: CLEAR_PROMPT_KEYS, icon: 'mdi:eraser' },\n\t];\n\n\t// Pinned commands — shown first in the command palette (Cmds button)\n\tconst pinnedCommands = [\n\t\t'/clear',\n\t\t'/rc',\n\t\t'/ak:linus',\n\t\t'/ak:replan',\n\t\t'/ak:redelta',\n\t\t'/ak:triage',\n\t\t'/ak:verify',\n\t\t'/ak:bcheck',\n\t\t'/ak:p1',\n\t\t'/ak:p2',\n\t];\n\n\tfunction fillInput(text: string) {\n\t\ttextInput = textInput ? textInput + ' ' + text : text;\n\t\t// Picked from the dialog: don't immediately re-open the inline slash popup for it.\n\t\tslashDismissedFor = `${textInput.length - text.length}:${text}`;\n\t\tcommandsOpen = false;\n\t\t// Delay focus until after popover closes so it isn't stolen\n\t\tsetTimeout(() => {\n\t\t\tif (textareaElement) {\n\t\t\t\ttextareaElement.focus();\n\t\t\t\tconst end = textareaElement.value.length;\n\t\t\t\ttextareaElement.setSelectionRange(end, end);\n\t\t\t\tsyncCaret();\n\t\t\t\tautoResize();\n\t\t\t}\n\t\t}, 100);\n\t}\n\tlet outputElement: HTMLDivElement | null = $state(null);\n\tlet textareaElement: HTMLTextAreaElement | null = $state(null);\n\tlet userScrolledUp = $state(false);\n\tlet showSelectionCopied = $state(false);\n\tlet selectedText = $state('');\n\tlet measureCanvas: HTMLCanvasElement | null = null;\n\n\t// Freeze terminal rendering while user has text selected (iOS dismisses\n\t// the copy callout on any DOM mutation under the selection)\n\tlet hasSelection = $state(false);\n\n\t$effect(() => {\n\t\tif (!browser) return;\n\t\tconst handler = () => {\n\t\t\tconst sel = window.getSelection();\n\t\t\tconst text = sel?.toString() || '';\n\t\t\tconst selActive = !!(text.length > 0 && outputElement?.contains(sel?.anchorNode ?? null));\n\t\t\tif (selActive) selectedText = text;\n\t\t\thasSelection = selActive;\n\t\t};\n\t\tdocument.addEventListener('selectionchange', handler);\n\t\treturn () => document.removeEventListener('selectionchange', handler);\n\t});\n\n\t// \"New lines below\" indicator: history lines appended since the user scrolled up\n\tlet seenAppended = $state(0);\n\t// Only one view is attached at a time, so a single counter serves both.\n\tconst appendedNow = $derived(\n\t\tviewMode === 'transcript' ? transcriptStore.appended : terminalStore.appended\n\t);\n\tconst unseenLines = $derived(\n\t\tuserScrolledUp ? Math.max(0, appendedNow - seenAppended) : 0\n\t);\n\n\t// Measure monospace character dimensions using canvas\n\tfunction measureFont(): { width: number; height: number } {\n\t\tif (!browser) return { width: 7.8, height: 18.2 };\n\n\t\tif (!measureCanvas) measureCanvas = document.createElement('canvas');\n\t\tconst ctx = measureCanvas.getContext('2d');\n\t\tif (!ctx) return { width: 7.8, height: 18.2 };\n\n\t\t// Match CSS: font-family from .output, font-size: 13px, line-height: 1.4\n\t\tctx.font = \"13px 'SF Mono', Monaco, 'Cascadia Code', monospace\";\n\t\tconst width = ctx.measureText('M').width;\n\t\tconst height = 13 * 1.4; // 18.2px\n\n\t\treturn { width, height };\n\t}\n\n\t// Calculate terminal dimensions from output element\n\tfunction calculateTerminalSize(): { cols: number; rows: number } | null {\n\t\tif (!outputElement) return null;\n\n\t\t// Padding is 16px on each side (from CSS .output)\n\t\tconst padding = 32;\n\t\tconst innerWidth = outputElement.clientWidth - padding;\n\t\tconst innerHeight = outputElement.clientHeight - padding;\n\n\t\tif (innerWidth <= 0 || innerHeight <= 0) return null;\n\n\t\tconst { width: charW, height: charH } = measureFont();\n\t\t// Subtract 1 col for safety margin (font rendering varies across devices)\n\t\tconst cols = Math.floor(innerWidth / charW) - 1;\n\t\tconst rows = Math.floor(innerHeight / charH);\n\n\t\tif (cols < 10 || rows < 3) return null;\n\t\treturn { cols, rows };\n\t}\n\n\t// Send resize to server\n\tfunction handleResize() {\n\t\tconst size = calculateTerminalSize();\n\t\tif (size) terminalStore.sendResize(size.cols, size.rows);\n\t}\n\n\t// Drive the terminal store from view state. setTarget owns WS, output,\n\t// and history reset together; only attach when target is confirmed alive\n\t// and the raw mirror is the active view.\n\t$effect(() => {\n\t\tterminalStore.setTarget(isAlive && viewMode === 'terminal' ? target : null, base, route.address);\n\t});\n\n\t// Same contract for the transcript store, keyed by session id.\n\t$effect(() => {\n\t\ttranscriptStore.setSession(\n\t\t\tisAlive && viewMode === 'transcript' ? (currentSession?.id ?? null) : null,\n\t\t\tnull,\n\t\t\tbase,\n\t\t\troute.address\n\t\t);\n\t});\n\n\t// New target: forget any scrolled-up state from the previous session so the\n\t// view always opens pinned to the latest output.\n\t$effect(() => {\n\t\tref;\n\t\tviewMode;\n\t\tuntrack(() => {\n\t\t\tuserScrolledUp = false;\n\t\t\tseenAppended = 0;\n\t\t\tterminalStore.atBottom = true;\n\t\t\t// Re-pin after a view switch: content height changes completely.\n\t\t\ttick().then(() => {\n\t\t\t\tif (outputElement) outputElement.scrollTop = outputElement.scrollHeight;\n\t\t\t});\n\t\t});\n\t});\n\n\tonDestroy(() => {\n\t\tterminalStore.setTarget(null);\n\t\ttranscriptStore.setSession(null);\n\t});\n\n\t// A subagent's \"Message <parent>\" lands here with `?compose`: the reader\n\t// came to type, so the box takes the focus and the param goes. A quote\n\t// made on the agent's page is already in this session's draft, so the\n\t// caret goes to its end.\n\t$effect(() => {\n\t\tif (!$page.url.searchParams.has('compose')) return;\n\t\t// The param goes either way: a pane with no composer up (terminal\n\t\t// view, a dead pane) should not grab the focus on some later visit.\n\t\tuntrack(() => {\n\t\t\tfocusComposerEnd();\n\t\t\tconst params = new URLSearchParams($page.url.searchParams);\n\t\t\tparams.delete('compose');\n\t\t\tconst query = params.toString();\n\t\t\tgoto(`${$page.url.pathname}${query ? `?${query}` : ''}`, {\n\t\t\t\treplaceState: true,\n\t\t\t\tnoScroll: true,\n\t\t\t\tkeepFocus: true\n\t\t\t});\n\t\t});\n\t});\n\n\t// The page has been seen showing one session while the URL named another,\n\t// and only sometimes. A beat after every navigation, compare the two and\n\t// write what the page believed to the server log, so the next report\n\t// comes with the state that produced it.\n\tafterNavigate(() => {\n\t\tsetTimeout(() => {\n\t\t\tconst urlTarget = parseSessionPath(location.pathname)?.ref.target ?? '';\n\t\t\tconst shown = currentSession?.tmux_target ?? target;\n\t\t\tif (urlTarget && shown && urlTarget !== shown) {\n\t\t\t\treportClient('stale', {\n\t\t\t\t\turlTarget,\n\t\t\t\t\ttarget,\n\t\t\t\t\tshown,\n\t\t\t\t\tcurrentSessionId: currentSession?.id ?? null,\n\t\t\t\t\tsessionsKnown: sessionStore.sessions.length,\n\t\t\t\t\ttargetInStore: sessionStore.sessions.some((s) => s.tmux_target === urlTarget),\n\t\t\t\t\tviewMode,\n\t\t\t\t\tisAlive,\n\t\t\t\t\ttranscriptAvailable: transcriptStore.available,\n\t\t\t\t\ttranscriptEntries: transcriptStore.entries.length,\n\t\t\t\t\tconnected: sessionStore.connected\n\t\t\t\t});\n\t\t\t}\n\t\t}, 800);\n\t});\n\n\t$effect(() => {\n\t\t// The landing page reopens this machine's last session, by target alone.\n\t\tif (!browser || !target || remoteHost) return;\n\t\ttry {\n\t\t\tif (isAlive) {\n\t\t\t\tlocalStorage.setItem(STORAGE_KEYS.lastSession, target);\n\t\t\t} else if (paneIsDead && localStorage.getItem(STORAGE_KEYS.lastSession) === target) {\n\t\t\t\tlocalStorage.removeItem(STORAGE_KEYS.lastSession);\n\t\t\t}\n\t\t} catch {\n\t\t\t// quota / private mode — resume just won't work this device\n\t\t}\n\t});\n\n\t// Load runs in $effect.pre so it precedes the save effect in the same flush;\n\t// otherwise a target switch would persist the previous textInput under the\n\t// new target.\n\t$effect.pre(() => {\n\t\tconst t = ref;\n\t\tuntrack(() => {\n\t\t\t// An edit belongs to its session: leaving it gives that session its\n\t\t\t// own draft back, and the queued message keeps its text.\n\t\t\tif (editing && editing.ref !== t) {\n\t\t\t\tdraftsStore.set(editing.ref, editing.draft);\n\t\t\t\tediting = null;\n\t\t\t}\n\t\t\teditNotice = null;\n\t\t\ttextInput = draftsStore.get(t);\n\t\t});\n\t\tvoid tick().then(autoResize);\n\t});\n\n\t$effect(() => {\n\t\tdraftsStore.set(ref, textInput);\n\t});\n\n\tfunction handleScroll() {\n\t\tif (!outputElement) return;\n\t\tconst { scrollTop, scrollHeight, clientHeight } = outputElement;\n\t\tconst nextScrolledUp = scrollHeight - scrollTop - clientHeight > 50;\n\t\tif (nextScrolledUp !== userScrolledUp) {\n\t\t\tuserScrolledUp = nextScrolledUp;\n\t\t\tterminalStore.atBottom = !nextScrolledUp;\n\t\t\t// Count \"new\" lines from the moment the user left the bottom\n\t\t\tseenAppended = appendedNow;\n\t\t\tif (!nextScrolledUp) terminalStore.trimToBottom();\n\t\t}\n\t\t// Whatever the reader stopped on is what we hold them to if the content\n\t\t// above them grows while they read.\n\t\tif (nextScrolledUp) captureAnchor();\n\n\t\t// Near the top: fetch an older chunk and keep the viewport anchored on the\n\t\t// same content (history only ever grows at the ends, so the distance from\n\t\t// the bottom is a stable anchor).\n\t\tif (scrollTop < 200 && !hasSelection && !terminalStore.historyAtStart) {\n\t\t\tconst pending = terminalStore.requestMoreHistory();\n\t\t\tif (pending) holdPlaceThrough(pending);\n\t\t}\n\t}\n\n\t/**\n\t * Chrome and Firefox hold the reader's place natively (CSS scroll anchoring)\n\t * when something above the viewport changes height — a tool result filling\n\t * into a card the reader has already scrolled past. Safari, and therefore\n\t * every browser on iOS, does not implement it, so there we keep the anchor\n\t * ourselves: the topmost row still on screen, and how far below the top of\n\t * the viewport it sat.\n\t */\n\tconst nativeScrollAnchoring = !browser || CSS.supports('overflow-anchor: auto');\n\tlet anchorNode: HTMLElement | null = null;\n\tlet anchorOffset = 0;\n\n\t/**\n\t * The transcript rows, which are the only thing worth anchoring to: the\n\t * terminal is a single <pre> with no per-row elements, and its one insertion\n\t * from above goes through holdPlaceThrough instead.\n\t */\n\tfunction anchorRows(): HTMLCollection | null {\n\t\treturn outputElement?.querySelector('.transcript')?.children ?? null;\n\t}\n\n\tfunction captureAnchor() {\n\t\tanchorNode = null;\n\t\tconst rows = nativeScrollAnchoring ? null : anchorRows();\n\t\tif (!rows || rows.length === 0 || !outputElement) return;\n\t\t// Rows are stacked in DOM order, so their edges are sorted: binary-search\n\t\t// for the topmost one still on screen rather than measuring every row\n\t\t// above the reader on every scroll event.\n\t\tconst top = outputElement.getBoundingClientRect().top;\n\t\tlet lo = 0;\n\t\tlet hi = rows.length - 1;\n\t\twhile (lo < hi) {\n\t\t\tconst mid = (lo + hi) >> 1;\n\t\t\tif (rows[mid].getBoundingClientRect().bottom > top) hi = mid;\n\t\t\telse lo = mid + 1;\n\t\t}\n\t\tanchorNode = rows[lo] as HTMLElement;\n\t\tanchorOffset = anchorNode.getBoundingClientRect().top - top;\n\t}\n\n\tfunction restoreAnchor() {\n\t\tif (nativeScrollAnchoring || !outputElement || !anchorNode?.isConnected) return;\n\t\tconst top = outputElement.getBoundingClientRect().top;\n\t\tconst drift = anchorNode.getBoundingClientRect().top - top - anchorOffset;\n\t\tif (Math.abs(drift) >= 1) outputElement.scrollTop += drift;\n\t}\n\n\t/**\n\t * Hold the reader's place across an insertion *above* them — older terminal\n\t * history, or the transcript's \"load earlier\". Both only ever grow at the\n\t * ends, so the distance to the bottom is a stable anchor; `pending` says\n\t * when the new content has arrived, and rAF lets it lay out first.\n\t */\n\tfunction holdPlaceThrough(pending: Promise<unknown>) {\n\t\tconst el = outputElement;\n\t\tif (!el) return;\n\t\tconst fromBottom = el.scrollHeight - el.scrollTop;\n\t\tpending.then(() =>\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tif (outputElement) outputElement.scrollTop = outputElement.scrollHeight - fromBottom;\n\t\t\t})\n\t\t);\n\t}\n\n\tfunction scrollToBottom() {\n\t\tif (!outputElement) return;\n\t\tuserScrolledUp = false;\n\t\tterminalStore.atBottom = true;\n\t\tseenAppended = appendedNow;\n\t\tterminalStore.trimToBottom();\n\t\ttick().then(() => {\n\t\t\tif (outputElement) outputElement.scrollTop = outputElement.scrollHeight;\n\t\t});\n\t}\n\n\t// Auto-scroll to bottom only if user hasn't scrolled up and no active selection.\n\t// While scrolled up we deliberately leave scrollTop alone: history only appends\n\t// below, so whatever the user is reading stays where it is.\n\t$effect(() => {\n\t\t// track output changes (screen redraws, appended history, and the initial\n\t\t// history tail / load-more prepends, which grow the block above the screen)\n\t\tterminalStore.screen;\n\t\tterminalStore.appended;\n\t\tterminalStore.history.length;\n\t\tterminalStore.historyStart;\n\t\ttranscriptStore.entries.length;\n\t\t// A boolean, not the action text: the latter changes on every 500ms\n\t\t// broadcast and would force a layout read/write twice a second.\n\t\tliveRowVisible;\n\t\tif (outputElement && !userScrolledUp && !hasSelection) {\n\t\t\tconst el = outputElement;\n\t\t\tel.scrollTop = el.scrollHeight;\n\t\t\t// Layout may still settle (fonts, viewport/keyboard changes on mobile): pin again next frame.\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tif (!userScrolledUp && !hasSelection) el.scrollTop = el.scrollHeight;\n\t\t\t});\n\t\t}\n\t});\n\n\t// Layout can change without any store update (toolbar/attachment rows,\n\t// keyboard on mobile, fonts loading, a tool result filling in a card that is\n\t// already on screen): keep the view pinned through those too.\n\t//\n\t// The observed set has to be re-synced when .output swaps its content.\n\t// Switching between the transcript and the terminal — including the restore\n\t// of the view this session was last in — replaces the child we watch, and an\n\t// observer left on the detached node never fires again, so the swap point\n\t// (viewMode) is a dependency: effects run after the DOM update, so the new\n\t// child is in place by the time this re-observes.\n\t$effect(() => {\n\t\tviewMode;\n\t\tconst el = outputElement;\n\t\tif (!el || typeof ResizeObserver === 'undefined') return;\n\t\tconst ro = new ResizeObserver(() => {\n\t\t\tif (hasSelection) return;\n\t\t\tif (userScrolledUp) restoreAnchor();\n\t\t\telse el.scrollTop = el.scrollHeight;\n\t\t});\n\t\tro.observe(el);\n\t\tfor (const child of el.children) ro.observe(child);\n\t\treturn () => ro.disconnect();\n\t});\n\n\tasync function postToPane(body: Record<string, unknown>) {\n\t\tif (!target) return;\n\t\tawait fetch(`${api(target)}/send`, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tbody: JSON.stringify(body)\n\t\t});\n\t}\n\n\tconst sendKeys = (keys: string) => postToPane({ keys });\n\n\t/** Types text into the pane as it is, with no Enter: a dialog's own text field. */\n\tconst sendPaneText = (text: string) => postToPane({ text, raw: true });\n\n\t/** Works Claude Code's rewind dialog in the pane; says why when it could not. */\n\tasync function rewind(action: RewindAction): Promise<boolean> {\n\t\tif (!target) return false;\n\t\tconst res = await fetch(`${api(target)}/rewind`, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tbody: JSON.stringify(action)\n\t\t}).catch(() => null);\n\t\tif (res?.ok) return true;\n\t\tconst why = (await res?.json().catch(() => null)) as { error?: string } | null;\n\t\ttoast.error(why?.error ?? 'Could not reach the pane');\n\t\treturn false;\n\t}\n\n\t// Send button with empty input: single tap → Enter, double tap → Tab+Enter\n\t// (accept suggestion). The single Enter is delayed briefly so a second tap\n\t// can upgrade it; keyboard Enter stays immediate (see handleKeydown).\n\tconst DOUBLE_TAP_MS = 300;\n\tlet emptyEnterTimer: ReturnType<typeof setTimeout> | null = null;\n\tasync function sendFromButton() {\n\t\tif (!target || !canSend) return;\n\t\tif (hasDraft) {\n\t\t\tawait sendText();\n\t\t\treturn;\n\t\t}\n\t\t// The dialog's text field is open: a bare Enter would decline it.\n\t\tif (paneTyping) return focusDialogField();\n\t\tif (emptyEnterTimer) {\n\t\t\tclearTimeout(emptyEnterTimer);\n\t\t\temptyEnterTimer = null;\n\t\t\tawait acceptSuggestion();\n\t\t\treturn;\n\t\t}\n\t\temptyEnterTimer = setTimeout(() => {\n\t\t\temptyEnterTimer = null;\n\t\t\tvoid sendKeys('Enter');\n\t\t}, DOUBLE_TAP_MS);\n\t}\n\n\tasync function sendText() {\n\t\tif (!target) return;\n\t\tif (!canSend) return;\n\t\tif (editing) {\n\t\t\tawait saveEdit();\n\t\t\treturn;\n\t\t}\n\t\tif (!hasDraft) {\n\t\t\t// Empty input: just send Enter key — unless the dialog's text field\n\t\t\t// is open, where an empty Enter declines the question.\n\t\t\tif (paneTyping) return focusDialogField();\n\t\t\tawait sendKeys('Enter');\n\t\t\treturn;\n\t\t}\n\t\t// An idle pane drawing a dialog (a local command's picker) would take\n\t\t// the text as keys and the Enter as a pick; the draft waits instead.\n\t\tif (isIdle && paneChoice) {\n\t\t\teditNotice = 'A dialog is open in the pane. Answer it in the card above, then send.';\n\t\t\treturn;\n\t\t}\n\t\t// Busy, or a dialog open: the message waits in the queue for its own turn.\n\t\tawait deliver(isIdle ? 'send' : 'queue');\n\t}\n\n\tinterface Composed {\n\t\t/** The session's key in the drafts and attachments stores. */\n\t\tref: string;\n\t\t/** Its API, so a reply that lands after a move still finds the session it left. */\n\t\tapi: string;\n\t\ttext: string;\n\t\tchipIds: string[];\n\t}\n\n\t/** What a send is about to deliver, taken before it awaits the server. */\n\tfunction composed(): Composed | null {\n\t\tif (!target || !ref) return null;\n\t\treturn { ref, api: api(target), text: textInput, chipIds: attachments.map((a) => a.localId) };\n\t}\n\n\t/**\n\t * Take a delivered message out of its session's composer. The send awaited\n\t * the server, so the user may be on another session by now, or have added to\n\t * this one: only the text and chips that went out are cleared, and in the\n\t * session they went to.\n\t */\n\tfunction clearSent(sent: Composed) {\n\t\tfor (const id of sent.chipIds) attachmentsStore.remove(sent.ref, id);\n\t\tif (sent.ref !== ref) {\n\t\t\tif (draftsStore.get(sent.ref) === sent.text) draftsStore.set(sent.ref, '');\n\t\t\treturn;\n\t\t}\n\t\tif (textInput !== sent.text) return;\n\t\ttextInput = '';\n\t\tif (textareaElement) textareaElement.style.height = 'auto';\n\t}\n\n\t/**\n\t * Hand a session a message through one of the routes that deliver one.\n\t * Resolves false, having said why, when the session did not take it.\n\t */\n\tasync function post(\n\t\tto: string,\n\t\troute: 'send' | 'queue' | 'steer',\n\t\tmessage: Record<string, unknown>\n\t): Promise<boolean> {\n\t\tconst res = await fetch(`${to}/${route}`, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tbody: JSON.stringify(message)\n\t\t});\n\t\tif (res.ok) return true;\n\t\tconst body = (await res.json().catch(() => ({}))) as { error?: string };\n\t\talert(`Could not ${route}: ${body.error ?? res.statusText}`);\n\t\treturn false;\n\t}\n\n\t/** A message composed elsewhere on the page — a grilling round's answers. */\n\tconst sendReply = async (text: string) => target != null && (await post(api(target), 'send', { text }));\n\n\t/** Put the draft in the pane's prompt box and leave the Enter to the pane. */\n\tasync function sendTextRaw() {\n\t\tif (!canSend || (!textInput && readyPaths.length === 0)) return;\n\t\tconst sent = composed();\n\t\tif (!sent) return;\n\t\tconst message = { text: sent.text, raw: true, attachments: readyPaths };\n\t\tif (await post(sent.api, 'send', message)) clearSent(sent);\n\t}\n\n\t/** Which way Remote Control was asked to turn, until the poll sees it turn. */\n\tlet rcPending = $state<'on' | 'off' | null>(null);\n\t/**\n\t * How long the pane gets to turn it before the ask is given up on. `/rc`\n\t * waits for a running turn to end, so this is the server's ask lifetime.\n\t */\n\tconst RC_PENDING_MS = 10 * 60_000;\n\t// An ask belongs to the session it was made in.\n\t$effect(() => {\n\t\tvoid ref;\n\t\trcPending = null;\n\t});\n\n\t/** Ask the session to turn Remote Control on or off; the poll sees the change. */\n\tasync function turnRemoteControl(on: boolean) {\n\t\tif (!target || rcPending) return;\n\t\tconst way = on ? 'on' : 'off';\n\t\trcPending = way;\n\t\tconst res = await fetch(`${api(target)}/rc`, {\n\t\t\tmethod: on ? 'POST' : 'DELETE'\n\t\t}).catch(() => null);\n\t\tif (!res?.ok) {\n\t\t\trcPending = null;\n\t\t\ttoast.error(`Could not turn Remote Control ${way}`);\n\t\t}\n\t}\n\n\t// A boolean, not the session: every broadcast is a new session object,\n\t// and depending on it would restart the timer below on each one.\n\tconst rcOn = $derived(!!currentSession?.rc_url);\n\t$effect(() => {\n\t\tconst wanted = rcPending;\n\t\tif (!wanted) return;\n\t\tif ((wanted === 'on') === rcOn) {\n\t\t\trcPending = null;\n\t\t\treturn;\n\t\t}\n\t\tconst timer = setTimeout(() => {\n\t\t\trcPending = null;\n\t\t\ttoast.error(`Remote Control did not turn ${wanted}`);\n\t\t}, RC_PENDING_MS);\n\t\treturn () => clearTimeout(timer);\n\t});\n\n\tasync function acceptSuggestion() {\n\t\tawait sendKeys('Tab Enter');\n\t}\n\n\t/**\n\t * The ways a draft reaches the session, whether it was typed or spoken:\n\t * `send` starts a turn, `queue` waits for the running one to end, `steer`\n\t * hands it to Claude Code to read when it next stops for input, and `now`\n\t * makes it read at once.\n\t */\n\ttype Delivery = 'send' | 'queue' | SteerMode;\n\n\t/** Deliver the draft; it leaves the composer only once the session has taken it. */\n\tasync function deliver(how: Delivery) {\n\t\tif (!canSend || !hasDraft) return;\n\t\tconst sent = composed();\n\t\tif (!sent) return;\n\t\tconst message = { text: sent.text, attachments: readyPaths, dictated };\n\t\t// The draft stays put on a refusal, so nothing typed or said is lost.\n\t\tconst taken =\n\t\t\thow === 'send' || how === 'queue'\n\t\t\t\t? await post(sent.api, how, message)\n\t\t\t\t: await post(sent.api, 'steer', { ...message, mode: how });\n\t\tif (taken) clearSent(sent);\n\t}\n\tconst steerText = () => deliver('steer');\n\tconst nowText = () => deliver('now');\n\n\t// ─── Editing a queued message ───────────────────────────────────────────\n\n\n\tfunction startEdit(item: QueuedMessageInfo) {\n\t\tif (!target || !ref) return;\n\t\tif (editing) cancelEdit();\n\t\tediting = { ref, api: api(target), id: item.id, draft: textInput };\n\t\teditNotice = null;\n\t\ttextInput = item.text;\n\t\tvoid tick().then(() => {\n\t\t\tautoResize();\n\t\t\ttextareaElement?.focus();\n\t\t});\n\t}\n\n\tfunction cancelEdit() {\n\t\tif (!editing) return;\n\t\ttextInput = editing.draft;\n\t\tediting = null;\n\t\tvoid tick().then(autoResize);\n\t}\n\n\t/**\n\t * The message left the queue while it was being edited — delivered, or\n\t * removed elsewhere. The edited text stays in the composer as a draft of\n\t * its own, ahead of whatever was put aside, so neither is lost.\n\t */\n\tfunction orphanEdit() {\n\t\tif (!editing) return;\n\t\tconst aside = editing.draft.trim();\n\t\tediting = null;\n\t\tif (aside) textInput = `${textInput}\\n\\n${aside}`;\n\t\teditNotice = 'That message was already sent, so your edit is kept here as a new draft.';\n\t}\n\n\tasync function saveEdit() {\n\t\tif (!editing || !textInput.trim()) return;\n\t\tconst { api: to, id } = editing;\n\t\tconst res = await fetch(`${to}/queue`, {\n\t\t\tmethod: 'PATCH',\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tbody: JSON.stringify({ id, text: textInput })\n\t\t});\n\t\tif (editing?.id !== id) return;\n\t\tif (res.ok) cancelEdit();\n\t\telse if (res.status === 404) orphanEdit();\n\t\telse {\n\t\t\tconst body = (await res.json().catch(() => ({}))) as { error?: string };\n\t\t\talert(`Could not save: ${body.error ?? res.statusText}`);\n\t\t}\n\t}\n\n\t// The broadcast drops an item the moment the drain sends it. A session\n\t// missing for a moment (a reconnect) says nothing about its queue.\n\t$effect(() => {\n\t\tif (\n\t\t\tediting &&\n\t\t\tediting.ref === ref &&\n\t\t\tcurrentSession &&\n\t\t\t!queue.some((m) => m.id === editing!.id)\n\t\t) {\n\t\t\tuntrack(orphanEdit);\n\t\t}\n\t});\n\n\tconst syncHeldDelivery = (e: KeyboardEvent) =>\n\t\t(heldDelivery = e.ctrlKey || e.metaKey ? (e.shiftKey ? 'now' : 'steer') : null);\n\n\n\t// ─── Attachments ────────────────────────────────────────────────────────\n\n\tfunction makeLocalId(): string {\n\t\treturn typeof crypto !== 'undefined' && 'randomUUID' in crypto\n\t\t\t? crypto.randomUUID()\n\t\t\t: `att-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n\t}\n\n\tasync function doUpload(owner: string, localId: string, file: File, signal: AbortSignal) {\n\t\tconst sessionId = currentSession?.id;\n\t\tif (!sessionId) {\n\t\t\tattachmentsStore.patch(owner, localId, { status: 'failed', error: 'No active session' });\n\t\t\treturn;\n\t\t}\n\t\tconst form = new FormData();\n\t\tform.append('file', file);\n\t\ttry {\n\t\t\tconst res = await fetch(`${api(sessionId)}/attach`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: form,\n\t\t\t\tsignal\n\t\t\t});\n\t\t\tif (!res.ok) {\n\t\t\t\tconst body = await res.json().catch(() => ({}));\n\t\t\t\tthrow new Error(body.error || `HTTP ${res.status}`);\n\t\t\t}\n\t\t\tconst data = (await res.json()) as { path: string; name: string; size: number; mime: string };\n\t\t\tattachmentsStore.patch(owner, localId, { status: 'ready', path: data.path, abort: undefined });\n\t\t} catch (err) {\n\t\t\tif (signal.aborted) return;\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\tattachmentsStore.patch(owner, localId, { status: 'failed', error: msg, abort: undefined });\n\t\t}\n\t}\n\n\tfunction uploadAttachment(file: File) {\n\t\tif (!ref) return;\n\t\tconst localId = makeLocalId();\n\t\tconst thumb = file.type.startsWith('image/') ? URL.createObjectURL(file) : undefined;\n\t\tconst abort = new AbortController();\n\t\tconst chip: Attachment = {\n\t\t\tlocalId,\n\t\t\tfile,\n\t\t\tname: file.name || `pasted-${Date.now()}`,\n\t\t\tsize: file.size,\n\t\t\tmime: file.type || 'application/octet-stream',\n\t\t\tstatus: 'uploading',\n\t\t\tthumb,\n\t\t\tabort\n\t\t};\n\t\tattachmentsStore.add(ref, chip);\n\t\tvoid doUpload(ref, localId, file, abort.signal);\n\t}\n\n\tfunction uploadFiles(files: FileList | File[] | null | undefined) {\n\t\tif (!files) return;\n\t\tfor (const f of Array.from(files)) uploadAttachment(f);\n\t}\n\n\tfunction retryAttachment(localId: string) {\n\t\tconst chip = attachments.find((a) => a.localId === localId);\n\t\tif (!ref || !chip || chip.status !== 'failed') return;\n\t\tconst abort = new AbortController();\n\t\tattachmentsStore.patch(ref, localId, { status: 'uploading', error: undefined, abort });\n\t\tvoid doUpload(ref, localId, chip.file, abort.signal);\n\t}\n\n\tfunction removeAttachment(localId: string) {\n\t\tconst chip = attachmentsStore.remove(ref, localId);\n\t\tif (chip?.status === 'ready' && chip.path && currentSession?.id) {\n\t\t\t// Best-effort server cleanup; chip is gone either way.\n\t\t\tvoid fetch(\n\t\t\t\t`${api(currentSession.id)}/attach?path=${encodeURIComponent(chip.path)}`,\n\t\t\t\t{ method: 'DELETE' }\n\t\t\t);\n\t\t}\n\t}\n\n\tfunction handlePaste(e: ClipboardEvent) {\n\t\tconst files = e.clipboardData?.files;\n\t\tif (files && files.length > 0) {\n\t\t\te.preventDefault();\n\t\t\tuploadFiles(files);\n\t\t}\n\t}\n\n\tfunction handlePickerInput(e: Event) {\n\t\tconst input = e.currentTarget as HTMLInputElement;\n\t\tuploadFiles(input.files);\n\t\tinput.value = '';\n\t\tattachPickerOpen = false;\n\t}\n\n\tfunction openPicker(which: 'camera' | 'gallery' | 'files') {\n\t\tattachPickerOpen = false;\n\t\tconst el = which === 'camera' ? cameraInput : which === 'gallery' ? galleryInput : filesInput;\n\t\t// Tick so popover close doesn't swallow the click on iOS.\n\t\tsetTimeout(() => el?.click(), 0);\n\t}\n\n\t// Touch detection + window-level drag-drop wiring.\n\tonMount(() => {\n\t\tif (!browser) return;\n\t\ttry {\n\t\t\tisTouchDevice = window.matchMedia('(pointer: coarse)').matches;\n\t\t} catch {\n\t\t\tisTouchDevice = 'ontouchstart' in window;\n\t\t}\n\n\t\tlet counter = 0;\n\t\tconst hasFiles = (e: DragEvent) =>\n\t\t\tArray.from(e.dataTransfer?.types ?? []).includes('Files');\n\t\tconst onEnter = (e: DragEvent) => {\n\t\t\tif (!hasFiles(e)) return;\n\t\t\tcounter++;\n\t\t\tif (counter === 1) dropActive = true;\n\t\t\te.preventDefault();\n\t\t};\n\t\tconst onLeave = (e: DragEvent) => {\n\t\t\tif (!hasFiles(e)) return;\n\t\t\tcounter--;\n\t\t\tif (counter <= 0) {\n\t\t\t\tcounter = 0;\n\t\t\t\tdropActive = false;\n\t\t\t}\n\t\t};\n\t\tconst onOver = (e: DragEvent) => {\n\t\t\tif (!hasFiles(e)) return;\n\t\t\te.preventDefault();\n\t\t\tif (e.dataTransfer) e.dataTransfer.dropEffect = 'copy';\n\t\t};\n\t\tconst onDrop = (e: DragEvent) => {\n\t\t\tif (!hasFiles(e)) return;\n\t\t\te.preventDefault();\n\t\t\tcounter = 0;\n\t\t\tdropActive = false;\n\t\t\tuploadFiles(e.dataTransfer?.files);\n\t\t};\n\t\twindow.addEventListener('dragenter', onEnter);\n\t\twindow.addEventListener('dragleave', onLeave);\n\t\twindow.addEventListener('dragover', onOver);\n\t\twindow.addEventListener('drop', onDrop);\n\t\treturn () => {\n\t\t\twindow.removeEventListener('dragenter', onEnter);\n\t\t\twindow.removeEventListener('dragleave', onLeave);\n\t\t\twindow.removeEventListener('dragover', onOver);\n\t\t\twindow.removeEventListener('drop', onDrop);\n\t\t};\n\t});\n\n\t/** The composer's own take is running, as opposed to a question field's. */\n\tconst speaking = $derived(\n\t\tvoiceEnabled && voiceStore.status === 'recording' && voiceStore.isOwnedBy(ref)\n\t);\n\n\t/**\n\t * End the composer's take and put what was said through `run`, the same\n\t * function a typed draft goes through: the words join the draft, and from\n\t * there voice has no path of its own. Without a `run` the setting decides\n\t * between sending and leaving the words in the box to be read first.\n\t * Resolves false when there was no take of the composer's to end.\n\t */\n\tasync function finishVoice(run?: () => unknown): Promise<boolean> {\n\t\tif (!speaking) return false;\n\t\tconst from = ref;\n\t\tconst heard = await voiceStore.stop();\n\t\tif (!heard || !from) return true;\n\t\tif (from !== ref) {\n\t\t\t// The page moved on while the words were being worked out: they wait\n\t\t\t// in the composer of the session they were said to.\n\t\t\tdraftsStore.set(from, insertSaid(draftsStore.get(from), heard.text, null).text);\n\t\t\treturn true;\n\t\t}\n\t\t// A spoken slash command still goes to the end: set before the draft, it\n\t\t// would take the draft as its arguments.\n\t\tconst spot = heard.command ? null : caretOf(textareaElement);\n\t\tconst next = insertSaid(textInput, heard.text, spot);\n\t\ttextInput = next.text;\n\t\t// A slash command renders as its own kind of turn, not as something said.\n\t\tsaid = heard.command ? null : heard.text;\n\t\tawait tick();\n\t\tautoResize();\n\t\tif (run) await run();\n\t\telse if (voiceStore.autoSubmit) await sendText();\n\t\telse if (spot) {\n\t\t\t// Left in the box to be read: the caret waits after the words for another take.\n\t\t\tputCaret(textareaElement, next.caret);\n\t\t\tsyncCaret();\n\t\t}\n\t\treturn true;\n\t}\n\n\t/** The microphone's one key: start a take, end it, or give up on its transcription. */\n\tasync function toggleVoice() {\n\t\tif (!ref || !voiceEnabled) return;\n\t\tif (voiceStore.isActive && !voiceStore.isOwnedBy(ref)) return;\n\t\tif (voiceStore.status === 'transcribing') voiceStore.cancelTranscribing();\n\t\telse if (voiceStore.status === 'recording') await finishVoice();\n\t\telse await voiceStore.startRecording(ref);\n\t}\n\n\t/** The ways to end a take that keep it: the composer's own verbs for a draft. */\n\tconst voiceActions = $derived.by((): VoiceAction[] => {\n\t\tconst first = editing ? ACTIONS.save : isIdle ? ACTIONS.send : ACTIONS.queue;\n\t\tconst actions: VoiceAction[] = [\n\t\t\t{ ...first, title: `Stop recording and ${first.label.toLowerCase()}`, run: () => void finishVoice(sendText) }\n\t\t];\n\t\tif (steerable) {\n\t\t\tactions.push(\n\t\t\t\t{ ...STEERS.steer, run: () => void finishVoice(steerText) },\n\t\t\t\t{ ...STEERS.now, run: () => void finishVoice(nowText) }\n\t\t\t);\n\t\t}\n\t\treturn actions;\n\t});\n\n\tfunction isVoiceHotkey(e: KeyboardEvent): boolean {\n\t\tif (!voiceEnabled) return false;\n\t\tif (e.altKey || e.metaKey || e.shiftKey) return false;\n\t\tif (e.code === 'F2' && !e.ctrlKey) return true;\n\t\tif (e.code === 'Pause' && !e.ctrlKey) return true;\n\t\tif (e.code === 'Backquote' && e.ctrlKey) return true;\n\t\treturn false;\n\t}\n\n\tfunction cycleCtrl() {\n\t\tctrlCount = (ctrlCount + 1) % 3;\n\t}\n\tfunction cycleAlt() {\n\t\taltCount = (altCount + 1) % 3;\n\t}\n\tconst modArmed = $derived(ctrlCount > 0 || altCount > 0);\n\t/** Steer is offered as its own control whenever there is a turn to steer into. */\n\t/** A turn is running and the composer is not busy with an edit, so a steer has somewhere to go. */\n\tconst steerable = $derived(isBusy && !editing);\n\tconst canSteer = $derived(steerable && hasDraft && !modArmed);\n\n\n\t/** One line, and it never doubles: the most important thing right now. */\n\tconst statusSay = $derived.by(() => {\n\t\tif (modArmed) {\n\t\t\tconst mods = [\n\t\t\t\tctrlCount > 0 ? `ctrl${ctrlCount > 1 ? ` ×${ctrlCount}` : ''}` : '',\n\t\t\t\taltCount > 0 ? `alt${altCount > 1 ? ` ×${altCount}` : ''}` : ''\n\t\t\t].filter(Boolean);\n\t\t\treturn `${mods.join(' + ')} armed`;\n\t\t}\n\t\tconst state = currentSession?.state ?? 'idle';\n\t\tconst label = sessionStateVisual(state).label.toLowerCase();\n\t\tif (state === 'permission') return label;\n\t\tif (state === 'waiting') return paneChoice?.question ?? label;\n\t\tconst parts: string[] = [];\n\t\tif (state === 'busy') parts.push(currentSession?.current_action || label);\n\t\telse parts.push(statusText || label);\n\t\tif (queueCount > 0) parts.push(`${queueCount} queued`);\n\t\treturn parts.filter(Boolean).join(' · ');\n\t});\n\tconst statusWants = $derived(modArmed || wantsKeypress);\n\n\t// Inline slash popup: when the word under the caret starts with \"/\" (anywhere\n\t// in the input), open the same command list as the Cmds button above the\n\t// input, filtered by the rest of that word. Picking an entry replaces just\n\t// that word; the rest of the input is left alone.\n\tlet slashList = $state<CommandList | null>(null);\n\tlet slashDismissedFor = $state<string | null>(null);\n\tlet caretPos = $state(0);\n\tfunction syncCaret() {\n\t\tif (textareaElement) caretPos = textareaElement.selectionStart ?? textInput.length;\n\t}\n\tconst slashToken = $derived.by(() => {\n\t\tconst text = textInput;\n\t\tconst pos = Math.min(caretPos, text.length);\n\t\tlet start = pos;\n\t\twhile (start > 0 && !/\\s/.test(text[start - 1])) start--;\n\t\tif (text[start] !== '/') return null;\n\t\tlet end = pos;\n\t\twhile (end < text.length && !/\\s/.test(text[end])) end++;\n\t\treturn { start, end, text: text.slice(start, end) };\n\t});\n\tconst slashKey = $derived(slashToken ? `${slashToken.start}:${slashToken.text}` : null);\n\tconst slashOpen = $derived(!modArmed && slashKey != null && slashKey !== slashDismissedFor);\n\tconst slashQuery = $derived(slashOpen && slashToken ? slashToken.text.slice(1) : '');\n\tfunction chooseSlash(insert: string) {\n\t\tconst tok = slashToken;\n\t\tif (!tok) return;\n\t\tconst before = textInput.slice(0, tok.start);\n\t\tconst after = textInput.slice(tok.end);\n\t\t// Trailing space closes the popup and matches Claude Code's own completion.\n\t\tconst sep = after.startsWith(' ') ? '' : ' ';\n\t\ttextInput = before + insert + sep + after;\n\t\tconst pos = before.length + insert.length + 1;\n\t\tslashDismissedFor = null;\n\t\tcaretPos = pos;\n\t\tvoid tick().then(() => {\n\t\t\tif (textareaElement) {\n\t\t\t\ttextareaElement.focus();\n\t\t\t\ttextareaElement.setSelectionRange(pos, pos);\n\t\t\t}\n\t\t\tautoResize();\n\t\t});\n\t}\n\tfunction dismissSlash() {\n\t\tslashDismissedFor = slashKey;\n\t}\n\n\tasync function runText(text: string) {\n\t\tif (target) await post(api(target), 'send', { text });\n\t}\n\n\tfunction chordStep(delta: number) {\n\t\tconst n = chordItems.length;\n\t\tif (n === 0) return;\n\t\tchordIndex = (chordIndex + delta + n) % n;\n\t\tchordStickArmed = true;\n\t}\n\n\tfunction openChord(items: ChordAction[], title: string, innerCount = 0) {\n\t\tchordItems = items;\n\t\tchordInnerCount = innerCount;\n\t\tchordIndex = 0;\n\t\tchordTitle = title;\n\t\tchordStickArmed = false;\n\t\tchordStickX = 0;\n\t\tchordStickY = 0;\n\t\tchordMenuOpen = true;\n\t}\n\tfunction closeChord() {\n\t\tchordMenuOpen = false;\n\t\tchordStickArmed = false;\n\t\tchordStickX = 0;\n\t\tchordStickY = 0;\n\t}\n\tfunction releaseChord() {\n\t\tif (chordStickArmed) chordItems[chordIndex]?.run();\n\t\tcloseChord();\n\t}\n\n\t$effect(() => {\n\t\tif (!browser) return;\n\t\tconst handler = (e: WheelEvent) => {\n\t\t\tif (!outputElement) return;\n\t\t\tconst t = e.target as Element | null;\n\t\t\tif (!t) return;\n\t\t\tif (outputElement.contains(t)) return;\n\t\t\t// Only hijack wheel from non-scrollable regions; leave native scroll alone.\n\t\t\tlet el: Element | null = t;\n\t\t\twhile (el && el !== document.body) {\n\t\t\t\tconst style = getComputedStyle(el);\n\t\t\t\tconst overflowY = style.overflowY;\n\t\t\t\tif ((overflowY === 'auto' || overflowY === 'scroll') && el.scrollHeight > el.clientHeight) return;\n\t\t\t\tel = el.parentElement;\n\t\t\t}\n\t\t\toutputElement.scrollTop += e.deltaY;\n\t\t};\n\t\twindow.addEventListener('wheel', handler, { passive: true });\n\t\treturn () => window.removeEventListener('wheel', handler);\n\t});\n\n\tuseGamepad({\n\t\tenabled: () => target != null,\n\t\taxes: () => (axes) => {\n\t\t\tconst lx = axes[0] ?? 0;\n\t\t\tconst ly = axes[1] ?? 0;\n\t\t\tif (chordMenuOpen) {\n\t\t\t\tchordStickX = lx;\n\t\t\t\tchordStickY = ly;\n\t\t\t\tconst mag = Math.hypot(lx, ly);\n\t\t\t\tif (mag < CHORD_STICK_DEADZONE || chordItems.length === 0) {\n\t\t\t\t\tchordStickArmed = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tchordStickArmed = true;\n\t\t\t\tconst rings = chordRings;\n\t\t\t\tconst ringIdx = rings.length > 1 && mag >= CHORD_RING_THRESHOLD ? 1 : 0;\n\t\t\t\tconst ring = rings[ringIdx];\n\t\t\t\tconst stickAngle = Math.atan2(ly, lx);\n\t\t\t\tconst norm = (stickAngle + Math.PI / 2 + Math.PI * 2) % (Math.PI * 2);\n\t\t\t\tconst localIdx = Math.round((norm / (Math.PI * 2)) * ring.length) % ring.length;\n\t\t\t\tlet offset = 0;\n\t\t\t\tfor (let i = 0; i < ringIdx; i++) offset += rings[i].length;\n\t\t\t\tchordIndex = offset + localIdx;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (Math.abs(ly) < STICK_DEADZONE) return;\n\t\t\tif (outputElement) outputElement.scrollTop += ly * 24;\n\t\t},\n\t\tbuttons: () => ({\n\t\t\tA: () => {\n\t\t\t\tif (chordMenuOpen) {\n\t\t\t\t\tchordItems[chordIndex]?.run();\n\t\t\t\t\tcloseChord();\n\t\t\t\t} else {\n\t\t\t\t\tvoid sendText();\n\t\t\t\t}\n\t\t\t},\n\t\t\tB: async () => {\n\t\t\t\tif (chordMenuOpen) return closeChord();\n\t\t\t\tif (voiceStore.isOwnedBy(ref)) {\n\t\t\t\t\tawait voiceStore.cancel();\n\t\t\t\t} else {\n\t\t\t\t\tvoid sendKeys('Escape');\n\t\t\t\t}\n\t\t\t},\n\t\t\tX: async () => {\n\t\t\t\tif (chordMenuOpen) return;\n\t\t\t\tawait toggleVoice();\n\t\t\t},\n\t\t\tY: () => {\n\t\t\t\tif (chordMenuOpen) return;\n\t\t\t\tcommandsOpen = !commandsOpen;\n\t\t\t},\n\t\t\tL1: () => history.back(),\n\t\t\tR1: () => history.forward(),\n\t\t\tL2: {\n\t\t\t\tpress: () => openChord([...ctrlActions, ...slashActions], 'Commands', ctrlActions.length),\n\t\t\t\trelease: releaseChord\n\t\t\t},\n\t\t\tR2: {\n\t\t\t\tpress: () =>\n\t\t\t\t\topenChord([...headerActions, ...rcActions, ...sidebarActionsStore.actions], 'Actions'),\n\t\t\t\trelease: releaseChord\n\t\t\t},\n\t\t\tDpadUp: () => {\n\t\t\t\tif (!chordMenuOpen) void sendKeys('Up');\n\t\t\t},\n\t\t\tDpadDown: () => {\n\t\t\t\tif (!chordMenuOpen) void sendKeys('Down');\n\t\t\t},\n\t\t\tDpadLeft: () => {\n\t\t\t\tif (chordMenuOpen) chordStep(-1);\n\t\t\t\telse void sendKeys('Left');\n\t\t\t},\n\t\t\tDpadRight: () => {\n\t\t\t\tif (chordMenuOpen) chordStep(1);\n\t\t\t\telse void sendKeys('Right');\n\t\t\t}\n\t\t})\n\t});\n\n\tasync function sendModSequence() {\n\t\tconst text = textInput;\n\t\tconst count = Math.max(ctrlCount, altCount);\n\t\tconst prefix = `${ctrlCount > 0 ? 'C-' : ''}${altCount > 0 ? 'M-' : ''}`;\n\t\tctrlCount = 0;\n\t\taltCount = 0;\n\t\tif (!text || !prefix) return;\n\t\tconst tokens: string[] = [];\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tfor (const c of text) {\n\t\t\t\ttokens.push(c === ' ' ? `${prefix}Space` : `${prefix}${c}`);\n\t\t\t}\n\t\t}\n\t\ttextInput = '';\n\t\tif (textareaElement) textareaElement.style.height = 'auto';\n\t\tawait sendKeys(tokens.join(' '));\n\t}\n\n\tasync function handleKeydown(e: KeyboardEvent) {\n\t\tif (!e.repeat && isVoiceHotkey(e)) {\n\t\t\te.preventDefault();\n\t\t\tctrlTapCandidate = false;\n\t\t\taltTapCandidate = false;\n\t\t\tawait toggleVoice();\n\t\t\treturn;\n\t\t}\n\t\tif (e.key === 'Control') {\n\t\t\tif (!e.repeat) ctrlTapCandidate = true;\n\t\t\treturn;\n\t\t}\n\t\tif (e.key === 'Alt') {\n\t\t\t// preventDefault suppresses browser menu-bar focus on Alt tap\n\t\t\te.preventDefault();\n\t\t\tif (!e.repeat) altTapCandidate = true;\n\t\t\treturn;\n\t\t}\n\t\tctrlTapCandidate = false;\n\t\taltTapCandidate = false;\n\n\t\tif (slashOpen) {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\te.preventDefault();\n\t\t\t\tdismissSlash();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (slashList?.handleKeydown(e)) return;\n\t\t}\n\n\t\tif (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\tif (editing) {\n\t\t\t\tcancelEdit();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (voiceStore.isOwnedBy(ref)) {\n\t\t\t\tawait voiceStore.cancel();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (modArmed) {\n\t\t\t\tctrlCount = 0;\n\t\t\t\taltCount = 0;\n\t\t\t} else {\n\t\t\t\tsendKeys('Escape');\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (e.key === 'Backspace' && textInput === '' && !modArmed) {\n\t\t\te.preventDefault();\n\t\t\tsendKeys('BSpace');\n\t\t\treturn;\n\t\t}\n\t\tif (ARROW_KEYS[e.key] && textInput === '' && !modArmed) {\n\t\t\te.preventDefault();\n\t\t\tsendKeys(ARROW_KEYS[e.key]);\n\t\t\treturn;\n\t\t}\n\t\tif (e.key === 'Tab' && textInput === '' && !modArmed && !e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey) {\n\t\t\te.preventDefault();\n\t\t\tsendKeys('Tab');\n\t\t\treturn;\n\t\t}\n\t\t// Shift+Enter alone is a new line; with Ctrl/⌘ it is the stronger steer.\n\t\tconst mod = e.ctrlKey || e.metaKey;\n\t\tif (e.key === 'Enter' && (!e.shiftKey || mod)) {\n\t\t\te.preventDefault();\n\t\t\t// A take has no draft yet, but its words are about to be one.\n\t\t\tconst steering = mod && (canSteer || (speaking && steerable));\n\t\t\tconst run = steering ? (e.shiftKey ? nowText : steerText) : sendText;\n\t\t\tif (await finishVoice(run)) return;\n\t\t\tif (modArmed) sendModSequence();\n\t\t\telse run();\n\t\t}\n\t}\n\n\t// Mobile soft keyboards (iOS especially) don't fire reliable repeated\n\t// keydown events for Backspace during long-press — they fire `beforeinput`\n\t// with inputType=\"deleteContentBackward\" each time, including at the\n\t// keyboard's accelerated repeat rate. Mirror handleKeydown's empty-input\n\t// Backspace forwarding here so long-press-to-delete works on mobile.\n\tfunction handleBeforeInput(e: InputEvent) {\n\t\tif (e.inputType === 'deleteContentBackward' && textInput === '' && !modArmed) {\n\t\t\te.preventDefault();\n\t\t\tvoid sendKeys('BSpace');\n\t\t}\n\t}\n\n\tfunction handleKeyup(e: KeyboardEvent) {\n\t\tif (e.key === 'Control' && ctrlTapCandidate) {\n\t\t\tctrlTapCandidate = false;\n\t\t\tcycleCtrl();\n\t\t}\n\t\tif (e.key === 'Alt' && altTapCandidate) {\n\t\t\taltTapCandidate = false;\n\t\t\tcycleAlt();\n\t\t}\n\t}\n\n\tfunction handleBlur() {\n\t\t// A modifier held across focus changes would miss its keyup and misfire later\n\t\tctrlTapCandidate = false;\n\t\taltTapCandidate = false;\n\t}\n\n\t/** One line of the composer's own type, and the ceiling its CSS allows. */\n\tconst FIELD_MIN = 24;\n\tconst FIELD_MAX = 112;\n\n\tfunction autoResize() {\n\t\tif (!textareaElement) return;\n\t\t// Reset to single row to measure actual content height\n\t\ttextareaElement.style.height = '0';\n\t\tconst newHeight = Math.max(FIELD_MIN, Math.min(textareaElement.scrollHeight, FIELD_MAX));\n\t\ttextareaElement.style.height = newHeight + 'px';\n\t}\n\n\tasync function killSession() {\n\t\tif (currentSession) {\n\t\t\tawait fetch(`${api(currentSession.id)}/kill`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({ pid: currentSession.pid, tmux_target: currentSession.tmux_target })\n\t\t\t});\n\t\t} else if (target) {\n\t\t\t// No session record (stale URL) — still attempt to kill the tmux pane by target\n\t\t\tawait fetch(`${api(target)}/kill`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({ pid: 0, tmux_target: target })\n\t\t\t});\n\t\t}\n\t\tshowConfirmKill = false;\n\t\tgoto('/');\n\t}\n\n\t/**\n\t * Quits Claude Code and reopens this conversation in the same pane — the\n\t * way to pick up an update or re-read skills without losing the session.\n\t */\n\tasync function restartSession(upgrade = false): Promise<{ startedAt?: number } | null> {\n\t\tif (!currentSession) return null;\n\t\tconst res = await fetch(`${api(currentSession.id)}/restart`, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tbody: JSON.stringify({ upgrade })\n\t\t});\n\t\tif (!res.ok) {\n\t\t\tconst body = (await res.json().catch(() => ({}))) as { error?: string };\n\t\t\talert(`Could not ${upgrade ? 'upgrade' : 'restart'} Claude Code: ${body.error ?? res.statusText}`);\n\t\t\treturn null;\n\t\t}\n\t\treturn (await res.json().catch(() => ({}))) as { startedAt?: number };\n\t}\n\n\t/**\n\t * Restart with Claude Code's own `/restart`, which a notice naming it says\n\t * the running version has: it replaces the process in place with\n\t * `--resume` of the same session, so the pane, the pid and the transcript\n\t * all stay. The text and its Enter go in as two sends with no read-back,\n\t * which would catch the box mid-restart and report the command as stuck.\n\t */\n\tasync function slashRestart() {\n\t\tif (!target) return;\n\t\tif (currentSession?.draft_input && currentSession.draft_kind !== 'suggestion') {\n\t\t\talert('Something is typed in the pane\\'s prompt box: send or clear it first.');\n\t\t\treturn;\n\t\t}\n\t\tawait sendPaneText('/restart');\n\t\tawait sendKeys('Enter');\n\t}\n\n\t/** The update notice says the running Claude Code restarts itself with `/restart`. */\n\tconst hasSlashRestart = $derived(paneUpdate?.kind === 'installed' && paneUpdate.text.includes('/restart'));\n\n\t/**\n\t * The session an upgrade was started in from here, until the server's own\n\t * word on it arrives. The server answers once the command is typed and\n\t * restarts when it has run; while it waits, and when it gives up without\n\t * restarting, the session's `upgrade` says so.\n\t */\n\tlet upgrading = $state<{ id: string; startedAt: number; clickedAt: number } | null>(null);\n\tconst upgrade = $derived(currentSession?.upgrade ?? null);\n\tconst UPGRADE_WAIT_MS = 6 * 60_000;\n\tasync function upgradeSession() {\n\t\tif (!currentSession) return;\n\t\tconst id = currentSession.id;\n\t\tconst started = await restartSession(true);\n\t\tif (started) upgrading = { id, startedAt: started.startedAt ?? 0, clickedAt: Date.now() };\n\t}\n\t$effect(() => {\n\t\tif (!upgrading || upgrading.id !== currentSession?.id) return;\n\t\t// The server's status for this run carries the `at` it answered with,\n\t\t// so an ended run is told from a running one without the page having\n\t\t// caught it running, and both clocks stay the server's.\n\t\tconst ours = upgrade && upgrade.at >= upgrading.startedAt ? upgrade : null;\n\t\tif (ours?.state === 'running') {\n\t\t\t// Still going: wait, but no longer than the server itself would.\n\t\t} else if (ours) {\n\t\t\tupgrading = null;\n\t\t\ttoast.error(ours.message ?? 'The upgrade did not restart Claude Code', {\n\t\t\t\tdescription: ours.output ?? undefined,\n\t\t\t\tduration: 30_000\n\t\t\t});\n\t\t\treturn;\n\t\t} else if (!paneUpdate?.command) {\n\t\t\t// No status and no notice: it restarted into the new version.\n\t\t\tupgrading = null;\n\t\t\treturn;\n\t\t}\n\t\tconst left = upgrading.clickedAt + UPGRADE_WAIT_MS - Date.now();\n\t\tconst giveUp = setTimeout(() => (upgrading = null), Math.max(0, left));\n\t\treturn () => clearTimeout(giveUp);\n\t});\n\n\tfunction copySelection() {\n\t\tconst text = selectedText;\n\t\tif (!text) return;\n\t\t// Use textarea + execCommand as primary method (works on iOS/Brave without HTTPS)\n\t\tconst textarea = document.createElement('textarea');\n\t\ttextarea.value = text;\n\t\ttextarea.setAttribute('readonly', '');\n\t\ttextarea.style.position = 'fixed';\n\t\ttextarea.style.left = '-9999px';\n\t\ttextarea.style.opacity = '0';\n\t\tdocument.body.appendChild(textarea);\n\t\ttextarea.select();\n\t\ttextarea.setSelectionRange(0, text.length); // iOS needs this\n\t\tdocument.execCommand('copy');\n\t\tdocument.body.removeChild(textarea);\n\t\tshowSelectionCopied = true;\n\t\tsetTimeout(() => { showSelectionCopied = false; }, 2000);\n\t}\n\n\tlet renameId = $state<string | null>(null);\n\n\tfunction copyTmuxCmd() {\n\t\tif (!target) return;\n\t\tconst cmd = `tmux attach -t \"${target.split(':')[0]}\"`;\n\t\tif (navigator.clipboard?.writeText) {\n\t\t\tnavigator.clipboard.writeText(cmd);\n\t\t} else {\n\t\t\t// Fallback for non-secure contexts (HTTP)\n\t\t\tconst textarea = document.createElement('textarea');\n\t\t\ttextarea.value = cmd;\n\t\t\ttextarea.style.position = 'fixed';\n\t\t\ttextarea.style.opacity = '0';\n\t\t\tdocument.body.appendChild(textarea);\n\t\t\ttextarea.select();\n\t\t\tdocument.execCommand('copy');\n\t\t\tdocument.body.removeChild(textarea);\n\t\t}\n\t\tshowCopied = true;\n\t\tsetTimeout(() => { showCopied = false; }, 2000);\n\t}\n\n\t</script>\n\n<svelte:window\n\tonkeydown={(e) => {\n\t\tsyncHeldDelivery(e);\n\t\thandleGlobalKeys(e);\n\t}}\n\tonkeyup={syncHeldDelivery}\n\tonblur={() => (heldDelivery = null)}\n/>\n\n<svelte:head>\n\t<title>{pageTitle}</title>\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\" />\n\t<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" />\n\t<link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin=\"anonymous\" />\n\t<link href=\"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap\" rel=\"stylesheet\" />\n</svelte:head>\n\n{#if chordMenuOpen}\n\t<div class=\"chord-overlay\">\n\t\t<div class=\"chord-panel\">\n\t\t\t<div class=\"chord-title\">{chordTitle}</div>\n\t\t\t<div class=\"chord-stage\">\n\t\t\t\t<div class=\"chord-ring\">\n\t\t\t\t\t{#each chordItems as item, i (item.label)}\n\t\t\t\t\t\t{@const pos = chordPositions[i] ?? { x: 0, y: 0 }}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"chord-item\"\n\t\t\t\t\t\t\tclass:armed={chordStickArmed && chordIndex === i}\n\t\t\t\t\t\t\tclass:danger={item.danger}\n\t\t\t\t\t\t\tstyle:--x=\"{pos.x}px\"\n\t\t\t\t\t\t\tstyle:--y=\"{pos.y}px\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<iconify-icon icon={item.icon}></iconify-icon>\n\t\t\t\t\t\t\t<span>{item.label}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t{/each}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"chord-deadzone\" class:inactive={!chordStickArmed}>\n\t\t\t\t\t<span>Cancel</span>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tclass=\"chord-cursor\"\n\t\t\t\t\tclass:armed={chordStickArmed}\n\t\t\t\t\tstyle:--cx=\"{chordStickX * CHORD_CURSOR_RADIUS_PX}px\"\n\t\t\t\t\tstyle:--cy=\"{chordStickY * CHORD_CURSOR_RADIUS_PX}px\"\n\t\t\t\t></div>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tclass=\"chord-status\"\n\t\t\t\tclass:danger={chordStickArmed && chordItems[chordIndex]?.danger}\n\t\t\t>\n\t\t\t\t{chordStickArmed ? chordItems[chordIndex]?.label ?? '' : 'Release to cancel'}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n{/if}\n\n<RenameSessionDialog\n\tsessionId={renameId}\n\tonClose={() => (renameId = null)}\n\tsessions={remoteHost ? (route.machine?.sessions ?? []) : undefined}\n\t{base}\n/>\n\n{#snippet attachMenu()}\n<Popover.Content side=\"top\" class=\"w-auto p-2 bg-[#1a1a1a] border-[#333]\">\n\t\t\t\t<div class=\"popover-grid\">\n\t{#if isTouchDevice}\n\t\t<Button variant=\"secondary\" size=\"toolbar\" class=\"min-w-14 min-h-12\" onclick={() => openPicker('camera')}>\n\t\t\t<iconify-icon icon=\"mdi:camera\"></iconify-icon>\n\t\t\t<span>Camera</span>\n\t\t</Button>\n\t{/if}\n\t<Button variant=\"secondary\" size=\"toolbar\" class=\"min-w-14 min-h-12\" onclick={() => openPicker('gallery')}>\n\t\t<iconify-icon icon=\"mdi:image-multiple\"></iconify-icon>\n\t\t<span>{isTouchDevice ? 'Gallery' : 'Image'}</span>\n\t</Button>\n\t<Button variant=\"secondary\" size=\"toolbar\" class=\"min-w-14 min-h-12\" onclick={() => openPicker('files')}>\n\t\t<iconify-icon icon=\"mdi:file-document-outline\"></iconify-icon>\n\t\t<span>Files</span>\n\t</Button>\n\t\t\t\t</div>\n\t\t\t</Popover.Content>\n{/snippet}\n\n{#snippet statusLine()}\n\t<div class=\"sl\">\n\t\t<SessionSheet\n\t\t\topen={sheetOpen}\n\t\t\tcurrentTarget={target}\n\t\t\tactions={sheetActions}\n\t\t\tonKill={() => (showConfirmKill = true)}\n\t\t\tonClose={() => (sheetOpen = false)}\n\t\t/>\n\t\t<SessionStateIndicator state={indicatorState} size=\"sm\" />\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"nm\"\n\t\t\tonclick={() => (sheetOpen = !sheetOpen)}\n\t\t\ttitle=\"Sessions, rename, and pane actions\"\n\t\t>\n\t\t\t<b>{currentSession ? getSessionDisplayName(currentSession) : target}</b>\n\t\t\t<iconify-icon icon=\"mdi:chevron-down\"></iconify-icon>\n\t\t</button>\n\t\t{#if embed && remoteHost}\n\t\t\t<!-- A pane may show another machine's session; its composer says which. -->\n\t\t\t<span class=\"mach\" title=\"Session runs on {remoteHost}\">{remoteHost}</span>\n\t\t{/if}\n\t\t{#if machineBlocked}\n\t\t\t<span class=\"sep\">·</span>\n\t\t\t<a class=\"say\" href=\"/machines\" title={machineBlocked}>\n\t\t\t\t<iconify-icon icon={route.machine?.online ? 'mdi:update' : 'mdi:lan-disconnect'}></iconify-icon>\n\t\t\t\t{machineBlocked}\n\t\t\t</a>\n\t\t{/if}\n\t\t{#if embed && paneFocused}\n\t\t\t<span class=\"foc\" title=\"The sidebar opens sessions here; ⌘/Ctrl 1 and 2 move the focus\">focus</span>\n\t\t{/if}\n\t\t{#if statusSay}\n\t\t\t<span class=\"sep\">·</span>\n\t\t\t<span class=\"say\" class:amber={statusWants}>{statusSay}</span>\n\t\t{/if}\n\t\t<!-- The model, as the terminal's own status line names it. It is read\n\t\t off the latest reply, so a /model change shows on the next one. -->\n\t\t{#if viewMode === 'transcript' && modelName}\n\t\t\t<span class=\"sep\">·</span>\n\t\t\t<span class=\"say model\" title=\"Model on the latest reply\">{modelName}</span>\n\t\t{/if}\n\t\t<!-- Claude Code announces its own updates only in the terminal's footer,\n\t\t so the transcript view says it here instead. -->\n\t\t{#if viewMode === 'transcript' && paneUpdate}\n\t\t\t<span class=\"sep\">·</span>\n\t\t\t{#if paneUpdate.kind === 'installed' && isAlive && isClaudeSession}\n\t\t\t\t<!-- The update is on disk; restarting is all it needs. Straight away\n\t\t\t\t when idle, behind the usual question when a turn would be cut off. -->\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"say upd installed\"\n\t\t\t\t\ttitle=\"{paneUpdate.text} — click to restart Claude Code now\"\n\t\t\t\t\tonclick={() =>\n\t\t\t\t\t\tisBusy\n\t\t\t\t\t\t\t? (showConfirmRestart = true)\n\t\t\t\t\t\t\t: void (hasSlashRestart ? slashRestart() : restartSession())}\n\t\t\t\t>\n\t\t\t\t\t<iconify-icon icon=\"mdi:restart\"></iconify-icon>\n\t\t\t\t\t{UPDATE_LABEL.installed}\n\t\t\t\t</button>\n\t\t\t{:else if paneUpdate.command && isAlive && isClaudeSession}\n\t\t\t\t<!-- The notice names its own fix. It is typed into Claude Code as a\n\t\t\t\t shell line, which only a session waiting for input will run. -->\n\t\t\t\t{@const running = upgrade?.state === 'running' || upgrading?.id === currentSession?.id}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"say upd installed\"\n\t\t\t\t\tdisabled={running || !isIdle}\n\t\t\t\t\ttitle={isIdle\n\t\t\t\t\t\t? `Run \"${paneUpdate.command}\" in this session, then restart Claude Code`\n\t\t\t\t\t\t: `${paneUpdate.text} — available once Claude Code is waiting for you`}\n\t\t\t\t\tonclick={() => void upgradeSession()}\n\t\t\t\t>\n\t\t\t\t\t<iconify-icon icon={running ? 'mdi:loading' : 'mdi:update'} class:spin={running}></iconify-icon>\n\t\t\t\t\t{running ? 'Upgrading…' : 'Update available · upgrade and restart'}\n\t\t\t\t</button>\n\t\t\t\t{#if upgrade && upgrade.state !== 'running'}\n\t\t\t\t\t<!-- Why the last upgrade left the session running the old version. -->\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"say upd failed\"\n\t\t\t\t\t\ttitle={[upgrade.message, upgrade.output].filter(Boolean).join('\\n\\n')}\n\t\t\t\t\t>\n\t\t\t\t\t\t<iconify-icon icon=\"mdi:alert-circle-outline\"></iconify-icon>\n\t\t\t\t\t\t{upgrade.state === 'unchanged'\n\t\t\t\t\t\t\t? 'upgrade did nothing'\n\t\t\t\t\t\t\t: upgrade.state === 'timeout'\n\t\t\t\t\t\t\t\t? 'upgrade timed out'\n\t\t\t\t\t\t\t\t: 'upgrade failed'}\n\t\t\t\t\t</span>\n\t\t\t\t{/if}\n\t\t\t{:else}\n\t\t\t\t<span class=\"say upd {paneUpdate.kind}\" title={paneUpdate.text}>\n\t\t\t\t\t<iconify-icon icon=\"mdi:update\"></iconify-icon>\n\t\t\t\t\t{UPDATE_LABEL[paneUpdate.kind]}\n\t\t\t\t</span>\n\t\t\t{/if}\n\t\t{/if}\n\t\t<span class=\"sl-sp\"></span>\n\t\t<!-- The old header's rare actions, back where they were, once there is\n\t\t room across for them. On a phone they stay in the sheet. -->\n\t\t{#each sheetActions as action (action.label)}\n\t\t\t<span class=\"wide-only\">\n\t\t\t\t<Hint icon={action.icon} label={action.label} class=\"mini\" onclick={action.run} />\n\t\t\t</span>\n\t\t{/each}\n\t\t{#if isAlive && isClaudeSession}\n\t\t\t<RemoteControlMenu url={currentSession?.rc_url ?? null} pending={rcPending} actions={rcActions} />\n\t\t{/if}\n\t\t{#if isClaudeSession}\n\t\t\t<PanelToggle open={panelKind !== null} session={currentSession!} onToggle={() => void togglePanel()} />\n\t\t{/if}\n\t\t{#if !embed}\n\t\t\t<Hint\n\t\t\t\ticon=\"mdi:menu\"\n\t\t\t\tlabel=\"Sessions and panels\"\n\t\t\t\tkeys={MOD_LABEL + ' B'}\n\t\t\t\tclass=\"mini menu-only\"\n\t\t\t\tonclick={() => drawer.toggle()}\n\t\t\t/>\n\t\t{/if}\n\t\t{#if isAlive && canTranscript}\n\t\t\t<Hint\n\t\t\t\ticon={viewMode === 'transcript' ? 'mdi:console' : 'mdi:message-text-outline'}\n\t\t\t\tlabel={viewMode === 'transcript' ? 'Terminal view' : 'Transcript view'}\n\t\t\t\tkeys={MOD_LABEL + ' E'}\n\t\t\t\tclass=\"mini\"\n\t\t\t\tonclick={() => toggleView()}\n\t\t\t/>\n\t\t{/if}\n\t\t{#if embed}\n\t\t\t<!-- The pane's own controls, asked of the page outside. Kept as one\n\t\t\t group so that when the row wraps they land together, right-aligned. -->\n\t\t\t<span class=\"pane-ctl\">\n\t\t\t\t<Hint icon=\"mdi:swap-horizontal\" label=\"Swap panes\" class=\"mini\" onclick={() => tellPane('swap')} />\n\t\t\t\t<Hint icon=\"mdi:arrow-expand\" label=\"Only this pane\" class=\"mini\" onclick={() => tellPane('zoom')} />\n\t\t\t\t<Hint icon=\"mdi:close\" label=\"Close this pane\" class=\"mini pane-close\" onclick={() => tellPane('close')} />\n\t\t\t</span>\n\t\t{/if}\n\t</div>\n{/snippet}\n\n{#snippet composerField()}\n\t\t\t<textarea\n\t\t\tbind:this={textareaElement}\n\t\t\tbind:value={textInput}\n\t\t\t{@attach keepsCaret}\n\t\t\tplaceholder={modArmed ? 'Type keys, Enter to send as mod sequence…' : 'Type a message...'}\n\t\t\trows={1}\n\t\t\tonkeydown={handleKeydown}\n\t\t\tonkeyup={(e) => { handleKeyup(e); syncCaret(); }}\n\t\t\tonbeforeinput={handleBeforeInput}\n\t\t\tonblur={handleBlur}\n\t\t\toninput={() => { syncCaret(); autoResize(); }}\n\t\t\tonclick={syncCaret}\n\t\t\tonfocus={syncCaret}\n\t\t\tonselect={syncCaret}\n\t\t\tonpaste={handlePaste}\n\t\t></textarea>\n{/snippet}\n\n<Tooltip.Provider delayDuration={250}>\n<div\n\tclass=\"session-row\"\n\tclass:panel-max={panelMaximized}\n\tbind:this={sessionRow}\n\tstyle:--panel-w={panelWidthCss}\n\tstyle:--panel-min=\"{PANEL_MIN_PX}px\"\n\tstyle:--session-min=\"{SESSION_MIN_PX}px\"\n\tstyle:--divider-w=\"{DIVIDER_PX}px\"\n>\n<div class=\"session-container\">\n\n\t<div class=\"output-wrap\">\n\t\t\t<div\n\t\t\t\tclass=\"output\"\n\t\t\t\tbind:this={outputElement}\n\t\t\t\tonscroll={handleScroll}\n\t\t\t\tuse:swipe={{\n\t\t\t\t\tenabled: () => isTouchDevice,\n\t\t\t\t\tthreshold: 64,\n\t\t\t\t\tonRight: () => drawer.toggle(),\n\t\t\t\t\tonLeft: () => { if (canTranscript) toggleView(); }\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t\t<input\n\t\t\tbind:this={cameraInput}\n\t\t\ttype=\"file\"\n\t\t\taccept=\"image/*\"\n\t\t\tcapture=\"environment\"\n\t\t\tmultiple\n\t\t\tclass=\"attach-input-hidden\"\n\t\t\tonchange={handlePickerInput}\n\t\t/>\n\t\t<input\n\t\t\tbind:this={galleryInput}\n\t\t\ttype=\"file\"\n\t\t\taccept=\"image/*,video/*\"\n\t\t\tmultiple\n\t\t\tclass=\"attach-input-hidden\"\n\t\t\tonchange={handlePickerInput}\n\t\t/>\n\t\t<input\n\t\t\tbind:this={filesInput}\n\t\t\ttype=\"file\"\n\t\t\tmultiple\n\t\t\tclass=\"attach-input-hidden\"\n\t\t\tonchange={handlePickerInput}\n\t\t/>\n\t\t{#if viewMode === 'transcript'}\n\t\t\t\t<!-- Keyed by session: what a card saw of one pane's dialog says nothing about the next. -->\n\t\t\t\t{#key ref}\n\t\t\t\t\t<TranscriptView\n\t\t\t\t\t\tentries={transcriptStore.entries}\n\t\t\t\t\t\tonLoadSubagent={(id) => transcriptStore.loadSubagent(id)}\n\t\t\t\t\t\t{fileLink}\n\t\t\t\t\t\tonQuote={quoteInComposer}\n\t\t\t\t\t\trepoSession={currentSession?.git_root ? currentSession.id : null}\n\t\t\t\t\t\tonOpenGithub={openGithub}\n\t\t\t\t\t\tagentLink={(id) => sessionPath({ host: remoteHost, target: target ?? '' }, `/agent/${encodeURIComponent(id)}`)}\n\t\t\t\t\t\tturnChanges={sessionChanges}\n\t\t\t\t\t\t{changesLink}\n\t\t\t\t\t\tavailable={transcriptStore.available}\n\t\t\t\t\t\tloaded={transcriptStore.receivedData}\n\t\t\t\t\t\tsessionState={currentSession?.state ?? null}\n\t\t\t\t\t\tcurrentAction={currentSession?.current_action ?? null}\n\t\t\t\t\t\tactivity={currentSession?.pane_activity ?? null}\n\t\t\t\t\t\tdelivered={currentSession?.delivered ?? []}\n\t\t\t\t\t\t{suggestion}\n\t\t\t\t\t\tonAcceptSuggestion={() => void acceptSuggestion()}\n\t\t\t\t\t\t{paneChoice}\n\t\t\t\t\t\tpaneLogin={currentSession?.pane_login ?? null}\n\t\t\t\t\t\tpaneRewind={currentSession?.pane_rewind ?? null}\n\t\t\t\t\t\tonRewind={rewind}\n\t\t\t\t\t\tsubagents={transcriptStore.subagentsByTask}\n\t\t\t\t\t\tonSendKeys={sendKeys}\n\t\t\t\t\t\tonSendPaneText={sendPaneText}\n\t\t\t\t\t\tdictateTarget={voiceEnabled ? ref : null}\n\t\t\t\t\t\t{base}\n\t\t\t\t\t\tolderCount={transcriptStore.firstIndex}\n\t\t\t\t\t\tloadingEarlier={transcriptStore.loadingEarlier}\n\t\t\t\t\t\tonLoadEarlier={() => holdPlaceThrough(transcriptStore.loadEarlier())}\n\t\t\t\t\t\tonSendReply={sendReply}\n\t\t\t\t\t/>\n\t\t\t\t{/key}\n\t\t\t\t{:else}\n\t\t\t\t\t<TerminalView\n\t\t\t\t\t\thistory={terminalStore.history}\n\t\t\t\t\t\thistoryStart={terminalStore.historyStart}\n\t\t\t\t\t\tscreen={terminalStore.screen}\n\t\t\t\t\t\tthemed={preferences.terminalTheming}\n\t\t\t\t\t\tfrozen={hasSelection}\n\t\t\t\t\t/>\n\t\t\t\t{/if}\n\t\t\t</div>\n\t\t\t{#if userScrolledUp}\n\t\t\t\t<button class=\"jump-bottom\" onclick={scrollToBottom} title=\"Jump to bottom\">\n\t\t\t\t\t<iconify-icon icon=\"mdi:arrow-down\"></iconify-icon>\n\t\t\t\t\t{#if unseenLines > 0}<span>{unseenLines} new</span>{/if}\n\t\t\t\t</button>\n\t\t\t{/if}\n\t\t</div>\n\n\t\t{#if target}\n\t\t<QueueStrip\n\t\t\t{target}\n\t\t\t{base}\n\t\t\tsessionId={currentSession?.id ?? null}\n\t\t\t{queue}\n\t\t\tpaneQueue={currentSession?.pane_queue ?? []}\n\t\t\tbusy={isBusy}\n\t\t\teditingId={editing?.ref === ref ? editing.id : null}\n\t\t\tpaneDraft={viewMode === 'transcript' && currentSession?.draft_kind === 'typed'\n\t\t\t\t? (currentSession?.draft_input ?? null)\n\t\t\t\t: null}\n\t\t\tcomposerHasText={textInput.trim().length > 0 || readyPaths.length > 0}\n\t\t\tonEdit={startEdit}\n\t\t\tonSendDraft={() => void sendKeys('Enter')}\n\t\t\tonClearDraft={() => void sendKeys(CLEAR_PROMPT_KEYS)}\n\t\t/>\n\t\t{/if}\n\n\t\t\t<div\n\t\t\t\tclass=\"cx\"\n\t\t\t\tclass:focused={embed && paneFocused}\n\t\t\t\tclass:embed\n\t\t\t\tuse:swipe={{\n\t\t\t\t\tenabled: () => isTouchDevice,\n\t\t\t\t\tonUp: () => (trayOpen = true),\n\t\t\t\t\tonDown: () => (trayOpen = false)\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<ContextGauge context={transcriptStore.context}>\n\t\t\t\t\t{#snippet notch()}\n\t\t\t\t\t\t<VoiceMeter target={ref} actions={voiceActions} />\n\t\t\t\t\t{/snippet}\n\t\t\t\t</ContextGauge>\n\n\t\t\t\t<KeyTray\n\t\t\t\t\topen={trayOpen}\n\t\t\t\t\t{ctrlCount}\n\t\t\t\t\t{altCount}\n\t\t\t\t\tonKeys={(keys) => void sendKeys(keys)}\n\t\t\t\t\tonCycleCtrl={cycleCtrl}\n\t\t\t\t\tonCycleAlt={cycleAlt}\n\t\t\t\t\tonPutInPrompt={() => void sendTextRaw()}\n\t\t\t\t\tonAcceptSuggestion={() => void acceptSuggestion()}\n\t\t\t\t\tonClearPrompt={() => void sendKeys(CLEAR_PROMPT_KEYS)}\n\t\t\t\t/>\n\n\t\t\t\t{@render statusLine()}\n\n\t\t\t\t<!-- The field and the footer share the width the rail leaves them. -->\n\t\t\t\t<div class=\"body\">\n\t\t\t\t\t<div class=\"lanes\">\n\n\t\t\t\t\t\t<!-- lane 1 — the middle: the field, or what replaces it -->\n\t\t\t\t\t\t<div class=\"mid\">\n\t\t\t\t\t\t\t{#if slashOpen}\n\t\t\t\t\t\t\t\t<div class=\"slash-popup\">\n\t\t\t\t\t\t\t\t\t<CommandList\n\t\t\t\t\t\t\t\t\t\tbind:this={slashList}\n\t\t\t\t\t\t\t\t\t\tcwd={currentSession?.cwd}\n\t\t\t\t\t\t\t\t\t\t{base}\n\t\t\t\t\t\t\t\t\t\tpinned={pinnedCommands}\n\t\t\t\t\t\t\t\t\t\tquery={slashQuery}\n\t\t\t\t\t\t\t\t\t\tonselect={chooseSlash}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{#if hasAttachments}\n\t\t\t\t\t\t\t\t<Popover.Root bind:open={attachStackOpen}>\n\t\t\t\t\t\t\t\t\t<Popover.Trigger\n\t\t\t\t\t\t\t\t\t\tclass=\"tattach\"\n\t\t\t\t\t\t\t\t\t\ttitle={`${attachments.length} attachment${attachments.length === 1 ? '' : 's'}`}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<iconify-icon\n\t\t\t\t\t\t\t\t\t\t\ticon={anyUploading ? 'mdi:loading' : 'mdi:paperclip'}\n\t\t\t\t\t\t\t\t\t\t\tclass={anyUploading ? 'attach-spin' : ''}\n\t\t\t\t\t\t\t\t\t\t></iconify-icon>\n\t\t\t\t\t\t\t\t\t\t<span class:attach-failed={anyFailed}>{attachments.length}</span>\n\t\t\t\t\t\t\t\t\t</Popover.Trigger>\n\t\t\t\t\t\t\t\t\t<Popover.Content\n\t\t\t\t\t\t\t\t\t\tside=\"top\"\n\t\t\t\t\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\t\t\t\t\tclass=\"w-72 p-2 bg-[#1a1a1a] border-[#333]\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div class=\"attach-list\">\n\t\t\t\t\t\t\t\t\t\t\t{#each attachments as att (att.localId)}\n\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"attach-item\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass:attach-item-failed={att.status === 'failed'}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttitle={att.status === 'failed' ? `Upload failed: ${att.error}` : att.name}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{#if att.thumb}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img class=\"attach-item-thumb\" src={att.thumb} alt=\"\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"attach-item-thumb attach-item-file\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:file-outline\"></iconify-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"attach-item-name\">{att.name}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{#if att.status === 'uploading'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<iconify-icon class=\"attach-spin\" icon=\"mdi:loading\"></iconify-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{:else if att.status === 'failed'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"attach-item-remove\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Retry\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={`Retry ${att.name}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonclick={() => retryAttachment(att.localId)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:refresh\"></iconify-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"attach-item-remove\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Remove\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={`Remove ${att.name}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonclick={() => removeAttachment(att.localId)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:close\"></iconify-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t{#if attachments.length > 1}\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" class=\"attach-clear\" onclick={() => attachmentsStore.clear(ref)}>\n\t\t\t\t\t\t\t\t\t\t\t\tRemove all\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t</Popover.Content>\n\t\t\t\t\t\t\t\t</Popover.Root>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{#if editing?.ref === ref}\n\t\t\t\t\t\t\t\t<div class=\"editbar\">\n\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:pencil-outline\"></iconify-icon>\n\t\t\t\t\t\t\t\t\t<span>Editing a queued message. Enter saves it in place.</span>\n\t\t\t\t\t\t\t\t\t<button type=\"button\" onclick={cancelEdit}>Cancel</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{:else if editNotice}\n\t\t\t\t\t\t\t\t<div class=\"editbar notice\" role=\"status\">\n\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:information-outline\"></iconify-icon>\n\t\t\t\t\t\t\t\t\t<span>{editNotice}</span>\n\t\t\t\t\t\t\t\t\t<button type=\"button\" onclick={() => (editNotice = null)}>Dismiss</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{@render composerField()}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- lane 2 — the footer, whose left edge never moves -->\n\t\t\t\t\t\t<div class=\"foot\">\n\t\t\t\t\t\t\t{#if hasSelection}\n\t\t\t\t\t\t\t\t<button type=\"button\" class=\"copy-sel\" onclick={copySelection}>\n\t\t\t\t\t\t\t\t\t<iconify-icon\n\t\t\t\t\t\t\t\t\t\ticon={showSelectionCopied ? 'mdi:check' : 'mdi:content-copy'}\n\t\t\t\t\t\t\t\t\t></iconify-icon>\n\t\t\t\t\t\t\t\t\t{showSelectionCopied ? 'Copied' : 'Copy'}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{#if isBusy}\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"interrupt\"\n\t\t\t\t\t\t\t\t\tonclick={() => void sendKeys('Escape')}\n\t\t\t\t\t\t\t\t\ttitle=\"Interrupt what Claude is doing\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:stop\"></iconify-icon><span>interrupt</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t<Popover.Root bind:open={attachPickerOpen}>\n\t\t\t\t\t\t\t\t<Popover.Trigger class=\"cx-g\" aria-label=\"Attach\">\n\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:paperclip\"></iconify-icon>\n\t\t\t\t\t\t\t\t</Popover.Trigger>\n\t\t\t\t\t\t\t\t{@render attachMenu()}\n\t\t\t\t\t\t\t</Popover.Root>\n\t\t\t\t\t\t\t<Hint\n\t\t\t\t\t\t\t\ticon=\"mdi:slash-forward\"\n\t\t\t\t\t\t\t\tlabel=\"Commands\"\n\t\t\t\t\t\t\t\tkeys={MOD_LABEL + ' /'}\n\t\t\t\t\t\t\t\tclass=\"cx-g\"\n\t\t\t\t\t\t\t\tonclick={() => (commandsOpen = true)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Popover.Root bind:open={moreOpen}>\n\t\t\t\t\t\t\t\t<Popover.Trigger class=\"cx-g\" title=\"More keys\">\n\t\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:dots-horizontal\"></iconify-icon>\n\t\t\t\t\t\t\t\t</Popover.Trigger>\n\t\t\t\t\t\t\t\t<Popover.Content\n\t\t\t\t\t\t\t\t\tside=\"top\"\n\t\t\t\t\t\t\t\t\tclass=\"w-auto max-w-[280px] p-2 bg-[#1a1a1a] border-[#333]\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div class=\"popover-grid\">\n\t\t\t\t\t\t\t\t\t\t{#each moreKeys as item (item.label)}\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"toolbar\"\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"min-w-14 min-h-12\"\n\t\t\t\t\t\t\t\t\t\t\t\tonclick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tsendKeys(item.keys);\n\t\t\t\t\t\t\t\t\t\t\t\t\tmoreOpen = false;\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<iconify-icon icon={item.icon}></iconify-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{item.label}</span>\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</Popover.Content>\n\t\t\t\t\t\t\t</Popover.Root>\n\t\t\t\t\t\t\t{#if !isBusy}\n\t\t\t\t\t\t\t\t<Hint\n\t\t\t\t\t\t\t\t\ticon=\"mdi:keyboard-esc\"\n\t\t\t\t\t\t\t\t\tlabel=\"Escape\"\n\t\t\t\t\t\t\t\t\tclass=\"cx-g esc-key\"\n\t\t\t\t\t\t\t\t\tonclick={() => void sendKeys('Escape')}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t<Hint\n\t\t\t\t\t\t\t\ticon=\"mdi:keyboard-outline\"\n\t\t\t\t\t\t\t\tlabel={trayOpen ? 'Hide keys' : 'Show keys'}\n\t\t\t\t\t\t\t\tkeys={MOD_LABEL + ' .'}\n\t\t\t\t\t\t\t\tclass=\"cx-g kb-toggle{trayOpen ? ' lit' : ''}{wantsKeypress || modArmed ? ' warn' : ''}\"\n\t\t\t\t\t\t\t\tonclick={() => (trayOpen = !trayOpen)}\n\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t<span class=\"foot-sp\"></span>\n\n\t\t\t\t\t\t\t<RailStats />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- the rail — the two controls a thumb reaches for, given the\n\t\t\t\t\t height of both lanes rather than the footer's alone -->\n\t\t\t\t\t<div class=\"rail\">\n\t\t\t\t\t\t{#if voiceEnabled}<VoiceButton target={ref} onToggle={() => void toggleVoice()} />{/if}\n\t\t\t\t\t\t<div class=\"act-wrap\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"act\"\n\t\t\t\t\t\t\t\tdisabled={!canSend}\n\t\t\t\t\t\t\t\taria-label={actionLabel}\n\t\t\t\t\t\t\t\ttitle={actionLabel}\n\t\t\t\t\t\t\t\tonclick={async () => {\n\t\t\t\t\t\t\t\t\tif (await finishVoice(sendText)) return;\n\t\t\t\t\t\t\t\t\tif (modArmed) await sendModSequence();\n\t\t\t\t\t\t\t\t\telse if (actionKind === 'steer' || actionKind === 'now') await deliver(actionKind);\n\t\t\t\t\t\t\t\t\telse await sendFromButton();\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<iconify-icon icon={actionIcon}></iconify-icon>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{#if canSteer}\n\t\t\t\t\t\t\t<!-- Its own button, so a phone has a way to steer that is not a\n\t\t\t\t\t\t\t held key or a long press. -->\n\t\t\t\t\t\t\t<div class=\"steers\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"act steer\"\n\t\t\t\t\t\t\t\t\tdisabled={!canSend}\n\t\t\t\t\t\t\t\t\taria-label=\"Steer\"\n\t\t\t\t\t\t\t\t\ttitle={`${STEERS.steer.title} (${MOD_LABEL}+Enter)`}\n\t\t\t\t\t\t\t\t\tonclick={() => void steerText()}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<iconify-icon icon={ACTIONS.steer.icon}></iconify-icon>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"act steer\"\n\t\t\t\t\t\t\t\t\tdisabled={!canSend}\n\t\t\t\t\t\t\t\t\taria-label=\"Now\"\n\t\t\t\t\t\t\t\t\ttitle={`${STEERS.now.title} (${MOD_LABEL}+Shift+Enter)`}\n\t\t\t\t\t\t\t\t\tonclick={() => void nowText()}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<iconify-icon icon={ACTIONS.now.icon}></iconify-icon>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n</div>\n\n{#snippet sidePanel(kind: string, open: boolean)}\n\t{#key ref}\n\t\t<SidePanel\n\t\t\t{kind}\n\t\t\t{open}\n\t\t\ttarget={target ?? ''}\n\t\t\t{base}\n\t\t\t{machineHost}\n\t\t\tsession={currentSession ?? null}\n\t\t\tquery={$page.url.searchParams}\n\t\t\tmaximized={panelMaximized}\n\t\t\tcanMaximize={panelInline}\n\t\t\tonSetParams={setPaneParams}\n\t\t\tonToggleMaximize={toggleMaximize}\n\t\t\tonSelect={openPanel}\n\t\t\tonClose={() => openPanel(null)}\n\t\t\tonMention={mentionInComposer}\n\t\t\tonOpenPane={(kind, own) => navigateQuery(panelQuery($page.url.searchParams, kind, PANE_PARAMS, own), false)}\n\t\t/>\n\t{/key}\n{/snippet}\n\n{#if panelInline}\n\t{#if panelColumnKind}\n\t\t<div class=\"panel-divider\" hidden={!panelKind}>\n\t\t\t<ResizeDivider\n\t\t\t\tbind:resizing={panelResizing}\n\t\t\t\ttitle=\"Drag to resize · double-click for the default width\"\n\t\t\t\tonmove={resizePanel}\n\t\t\t\tonend={endPanelResize}\n\t\t\t\tonreset={() => sidePanelStore.update(ref, { width: undefined })}\n\t\t\t/>\n\t\t</div>\n\t\t<aside class=\"side-panel\" aria-label=\"Side panel\" hidden={!panelKind}>\n\t\t\t{@render sidePanel(panelColumnKind, panelKind !== null)}\n\t\t\t{#if panelResizing}\n\t\t\t\t<!-- A pane may hold an iframe, which must not eat the pointer mid-drag. -->\n\t\t\t\t<div class=\"panel-shield\"></div>\n\t\t\t{/if}\n\t\t</aside>\n\t{/if}\n{:else}\n\t<Sheet.Root open={panelKind !== null} onOpenChange={(open) => { if (!open) openPanel(null); }}>\n\t\t<Sheet.Content\n\t\t\tside=\"right\"\n\t\t\tshowCloseButton={false}\n\t\t\tonOpenAutoFocus={(e) => e.preventDefault()}\n\t\t\tclass=\"side-sheet gap-0 p-0 {panelPhone ? 'phone' : ''}\"\n\t\t>\n\t\t\t<Sheet.Title class=\"sr-only\">Side panel</Sheet.Title>\n\t\t\t{#if panelKind}{@render sidePanel(panelKind, true)}{/if}\n\t\t</Sheet.Content>\n\t</Sheet.Root>\n{/if}\n</div>\n\n<CommandPalette bind:open={commandsOpen} cwd={currentSession?.cwd} {base} pinned={pinnedCommands} onselect={fillInput} />\n\n<AlertDialog.Root bind:open={showConfirmKill}>\n\t<AlertDialog.Content>\n\t\t<AlertDialog.Header>\n\t\t\t<AlertDialog.Title>Kill this {isClaudeSession ? 'session' : 'pane'}?</AlertDialog.Title>\n\t\t\t<AlertDialog.Description>{isClaudeSession ? 'This will terminate the Claude process.' : 'This will close the tmux pane.'}</AlertDialog.Description>\n\t\t</AlertDialog.Header>\n\t\t<AlertDialog.Footer>\n\t\t\t<AlertDialog.Cancel>Cancel</AlertDialog.Cancel>\n\t\t\t<AlertDialog.Action onclick={killSession} class=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\">Kill</AlertDialog.Action>\n\t\t</AlertDialog.Footer>\n\t</AlertDialog.Content>\n</AlertDialog.Root>\n\n<AlertDialog.Root bind:open={showConfirmRestart}>\n\t<AlertDialog.Content>\n\t\t<AlertDialog.Header>\n\t\t\t<AlertDialog.Title>Restart Claude Code?</AlertDialog.Title>\n\t\t\t<AlertDialog.Description>\n\t\t\t\tQuits Claude Code and reopens this conversation in the same pane with the same flags. Picks up a pending update and reloads skills and hooks.{#if isBusy} It is busy right now — what it is doing will be cut off.{/if}\n\t\t\t</AlertDialog.Description>\n\t\t</AlertDialog.Header>\n\t\t<AlertDialog.Footer>\n\t\t\t<AlertDialog.Cancel>Cancel</AlertDialog.Cancel>\n\t\t\t<AlertDialog.Action onclick={() => void restartSession()}>Restart</AlertDialog.Action>\n\t\t</AlertDialog.Footer>\n\t</AlertDialog.Content>\n</AlertDialog.Root>\n\n{#if dropActive}\n\t<div class=\"drop-overlay\">\n\t\t<iconify-icon icon=\"mdi:tray-arrow-down\"></iconify-icon>\n\t\t<span>Drop files to attach</span>\n\t</div>\n{/if}\n</Tooltip.Provider>\n\n<style>\n\t.chord-overlay {\n\t\tposition: fixed;\n\t\tinset: 0;\n\t\tdisplay: grid;\n\t\tplace-items: center;\n\t\tz-index: var(--z-overlay);\n\t\tpointer-events: none;\n\t\tbackground: radial-gradient(ellipse at center, rgba(0,0,0,0.65) 0%, rgba(0,0,0,0.92) 100%);\n\t\tfont-family: 'JetBrains Mono', ui-monospace, monospace;\n\t\tanimation: chord-fade-in 120ms ease-out;\n\t}\n\t@keyframes chord-fade-in {\n\t\tfrom { opacity: 0; transform: scale(0.96); }\n\t\tto { opacity: 1; transform: scale(1); }\n\t}\n\t.chord-panel {\n\t\tposition: relative;\n\t\tpadding: 1.25rem 1.5rem 1rem;\n\t\tbackground: linear-gradient(180deg, #14141a, #0a0a0d);\n\t\tborder: 1px solid rgba(226, 160, 82, 0.22);\n\t\tborder-radius: 14px;\n\t\tbox-shadow:\n\t\t\t0 0 0 1px rgba(226, 160, 82, 0.06),\n\t\t\t0 24px 60px rgba(0, 0, 0, 0.7),\n\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.04);\n\t}\n\t.chord-title {\n\t\tcolor: #e2a052;\n\t\tfont-size: 0.65rem;\n\t\tletter-spacing: 0.32em;\n\t\ttext-transform: uppercase;\n\t\ttext-align: center;\n\t\topacity: 0.7;\n\t\tmargin-bottom: 0.85rem;\n\t}\n\t.chord-stage {\n\t\tposition: relative;\n\t\tisolation: isolate;\n\t\twidth: 30rem;\n\t\theight: 30rem;\n\t}\n\t.chord-ring {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t}\n\t.chord-item {\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\tleft: 50%;\n\t\twidth: 4.5rem;\n\t\tmin-height: 4.5rem;\n\t\ttransform: translate(calc(-50% + var(--x, 0px)), calc(-50% + var(--y, 0px)));\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tgap: 0.25rem;\n\t\tpadding: 0.4rem 0.3rem;\n\t\tbackground: rgba(22, 22, 28, 0.65);\n\t\tborder: 1px solid rgba(255, 255, 255, 0.05);\n\t\tborder-radius: 50%;\n\t\tcolor: rgba(255, 255, 255, 0.5);\n\t\tfont-size: 0.55rem;\n\t\tletter-spacing: 0.03em;\n\t\ttext-align: center;\n\t\ttransition:\n\t\t\tborder-color 140ms,\n\t\t\tbackground 140ms,\n\t\t\tcolor 140ms,\n\t\t\tbox-shadow 140ms,\n\t\t\tscale 140ms cubic-bezier(0.2, 0.9, 0.2, 1);\n\t}\n\t.chord-item iconify-icon { font-size: 26px; }\n\t.chord-item.armed {\n\t\tbackground: linear-gradient(180deg, rgba(226,160,82,0.22), rgba(226,160,82,0.04));\n\t\tborder-color: rgba(226, 160, 82, 0.85);\n\t\tcolor: #fff;\n\t\tscale: 1.15;\n\t\tbox-shadow:\n\t\t\t0 0 28px rgba(226, 160, 82, 0.35),\n\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.08);\n\t}\n\t.chord-item.danger.armed {\n\t\tborder-color: rgba(239, 68, 68, 0.9);\n\t\tbackground: linear-gradient(180deg, rgba(239,68,68,0.22), rgba(239,68,68,0.04));\n\t\tcolor: #fecaca;\n\t\tbox-shadow: 0 0 28px rgba(239, 68, 68, 0.35);\n\t}\n\t.chord-deadzone {\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\tleft: 50%;\n\t\twidth: 6.5rem;\n\t\theight: 6.5rem;\n\t\ttransform: translate(-50%, -50%);\n\t\tborder-radius: 50%;\n\t\tborder: 1.5px dashed rgba(255, 255, 255, 0.18);\n\t\tdisplay: grid;\n\t\tplace-items: center;\n\t\tpointer-events: none;\n\t\tz-index: 2;\n\t\ttransition: border-color 180ms, background 180ms;\n\t}\n\t.chord-deadzone span {\n\t\tfont-size: 0.6rem;\n\t\tletter-spacing: 0.25em;\n\t\tcolor: rgba(255, 255, 255, 0.25);\n\t\topacity: 0;\n\t\ttransition: opacity 160ms, color 160ms;\n\t\ttext-transform: uppercase;\n\t}\n\t.chord-deadzone.inactive {\n\t\tborder-color: rgba(239, 68, 68, 0.55);\n\t\tbackground: radial-gradient(circle, rgba(239, 68, 68, 0.10) 0%, transparent 70%);\n\t}\n\t.chord-deadzone.inactive span {\n\t\topacity: 1;\n\t\tcolor: rgba(252, 165, 165, 0.85);\n\t}\n\t.chord-cursor {\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\tleft: 50%;\n\t\twidth: 14px;\n\t\theight: 14px;\n\t\tborder-radius: 50%;\n\t\ttransform: translate(calc(-50% + var(--cx, 0px)), calc(-50% + var(--cy, 0px)));\n\t\tbackground: rgba(239, 68, 68, 0.9);\n\t\tbox-shadow:\n\t\t\t0 0 10px rgba(239, 68, 68, 0.5),\n\t\t\t0 0 20px rgba(239, 68, 68, 0.25);\n\t\tpointer-events: none;\n\t\tz-index: 3;\n\t\twill-change: transform;\n\t\ttransition: background 100ms, box-shadow 100ms;\n\t}\n\t.chord-cursor.armed {\n\t\tbackground: #e2a052;\n\t\tbox-shadow:\n\t\t\t0 0 12px rgba(226, 160, 82, 0.9),\n\t\t\t0 0 28px rgba(226, 160, 82, 0.45);\n\t}\n\t.chord-cursor::before {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\tinset: -8px;\n\t\tborder-radius: 50%;\n\t\tborder: 1px solid currentColor;\n\t\topacity: 0.25;\n\t}\n\t.chord-status {\n\t\tmargin-top: 1rem;\n\t\ttext-align: center;\n\t\tfont-size: 0.72rem;\n\t\tletter-spacing: 0.18em;\n\t\ttext-transform: uppercase;\n\t\tcolor: rgba(255, 255, 255, 0.75);\n\t\tmin-height: 1rem;\n\t}\n\t.chord-status.danger {\n\t\tcolor: #fca5a5;\n\t}\n\n\t.session-row {\n\t\theight: 100%;\n\t\tdisplay: flex;\n\t\tmin-width: 0;\n\t\tbackground: #000;\n\t}\n\t.panel-divider[hidden],\n\t.side-panel[hidden] {\n\t\tdisplay: none;\n\t}\n\t.panel-divider {\n\t\tflex: none;\n\t\twidth: var(--divider-w);\n\t}\n\t.side-panel {\n\t\tposition: relative;\n\t\tflex: none;\n\t\twidth: var(--panel-w);\n\t\tmin-width: var(--panel-min);\n\t\tmax-width: calc(100% - var(--session-min) - var(--divider-w));\n\t\tborder-left: 1px solid #262626;\n\t}\n\t.panel-shield {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t}\n\t/* Maximized, the panel takes the page; the session stays mounted, out of sight. */\n\t.session-row.panel-max .session-container,\n\t.session-row.panel-max .panel-divider {\n\t\tdisplay: none;\n\t}\n\t.session-row.panel-max .side-panel {\n\t\tflex: 1;\n\t\twidth: auto;\n\t\tmax-width: none;\n\t\tborder-left: 0;\n\t}\n\t:global([data-slot='sheet-content'].side-sheet) {\n\t\twidth: min(44rem, 92vw);\n\t\tmax-width: none;\n\t\tbackground: #111111;\n\t\tborder-color: #262626;\n\t}\n\t:global([data-slot='sheet-content'].side-sheet.phone) {\n\t\twidth: 100vw;\n\t\tborder-left: 0;\n\t}\n\n\t.session-container {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\theight: 100%;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tbackground: #000;\n\t\toverflow: hidden;\n\t\toverscroll-behavior: none;\n\t\ttouch-action: pan-y;\n\t}\n\n\n\t.output-wrap {\n\t\tposition: relative;\n\t\tflex: 1;\n\t\tmin-height: 0;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t.jump-bottom {\n\t\tposition: absolute;\n\t\tright: 18px;\n\t\tbottom: 12px;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\tpadding: 6px 10px;\n\t\tborder-radius: 999px;\n\t\tborder: 1px solid #3a3a3a;\n\t\tbackground: rgba(30, 30, 30, 0.92);\n\t\tcolor: #e5e5e5;\n\t\tfont-size: 12px;\n\t\tcursor: pointer;\n\t\tbox-shadow: 0 2px 8px rgba(0, 0, 0, 0.5);\n\t\tz-index: 5;\n\t}\n\t.jump-bottom:hover {\n\t\tbackground: #2a2a2a;\n\t}\n\t.jump-bottom iconify-icon {\n\t\tfont-size: 16px;\n\t}\n\n\t.output {\n\t\tflex: 1;\n\t\toverflow-y: auto;\n\t\toverscroll-behavior: none;\n\t\ttouch-action: pan-y;\n\t\tpadding: 16px;\n\t\tmargin: 0;\n\t\tfont-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;\n\t\tfont-size: 13px;\n\t\tline-height: 1.4;\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t\tbackground: #000;\n\t\tcolor: #fff;\n\t}\n\t/* The transcript grows and shrinks under a live turn; a bar coming and\n\t going must not shift it sideways. Both edges, so it stays centred. */\n\t@media (hover: hover) and (pointer: fine) {\n\t\t.output {\n\t\t\tscrollbar-gutter: stable both-edges;\n\t\t}\n\t}\n\n\n\n\t.slash-popup {\n\t\tposition: absolute;\n\t\tleft: 8px;\n\t\tright: 8px;\n\t\tbottom: 100%;\n\t\tmargin-bottom: 6px;\n\t\tmax-height: min(50dvh, 420px);\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tbackground: #1a1a1a;\n\t\tborder: 1px solid #333;\n\t\tborder-radius: 8px;\n\t\toverflow: hidden;\n\t\tz-index: 10;\n\t\tbox-shadow: 0 -4px 12px rgba(0, 0, 0, 0.4);\n\t\tcolor: #f5f5f4;\n\t}\n\n\n\t.attach-list {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 4px;\n\t\tmax-height: 50vh;\n\t\toverflow-y: auto;\n\t}\n\t.attach-item {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tpadding: 4px;\n\t\tborder-radius: 6px;\n\t\tcolor: #d4e3ff;\n\t\tfont-size: 12px;\n\t}\n\t.attach-item:hover {\n\t\tbackground: rgba(255, 255, 255, 0.06);\n\t}\n\t.attach-item-failed {\n\t\tcolor: #ffd4d4;\n\t}\n\t.attach-item-thumb {\n\t\twidth: 40px;\n\t\theight: 40px;\n\t\tflex-shrink: 0;\n\t\tobject-fit: cover;\n\t\tborder-radius: 6px;\n\t\tbackground: #1f2c44;\n\t}\n\t.attach-item-file {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tfont-size: 22px;\n\t}\n\t.attach-item-name {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\t.attach-clear {\n\t\tmargin-top: 6px;\n\t\twidth: 100%;\n\t\tpadding: 6px;\n\t\tborder: 0;\n\t\tborder-radius: 6px;\n\t\tbackground: #2a2a2a;\n\t\tcolor: #ccc;\n\t\tfont-size: 12px;\n\t\tcursor: pointer;\n\t}\n\t.attach-clear:hover {\n\t\tbackground: #4a1d22;\n\t\tcolor: #ffd4d4;\n\t}\n\t.attach-spin {\n\t\tanimation: attach-spin 1s linear infinite;\n\t}\n\t@keyframes attach-spin {\n\t\tto { transform: rotate(360deg); }\n\t}\n\n\t.attach-input-hidden {\n\t\tposition: absolute;\n\t\tleft: -9999px;\n\t\twidth: 1px;\n\t\theight: 1px;\n\t\topacity: 0;\n\t\tpointer-events: none;\n\t}\n\n\t.drop-overlay {\n\t\tposition: fixed;\n\t\tinset: 0;\n\t\tbackground: rgba(20, 40, 80, 0.55);\n\t\tbackdrop-filter: blur(2px);\n\t\tz-index: var(--z-overlay);\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tpointer-events: none;\n\t\tborder: 3px dashed #4f8df7;\n\t\tcolor: #d4e3ff;\n\t\tfont-size: 20px;\n\t\tfont-weight: 600;\n\t\tgap: 12px;\n\t}\n\t.drop-overlay iconify-icon {\n\t\tfont-size: 48px;\n\t}\n\n\n\t.popover-grid {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(3, 1fr);\n\t\tgap: 6px;\n\t}\n\n\n\n\n\n\n\n\n\n\n\n\t/* ── Transcript composer ─────────────────────────────────────────────\n\t Three lanes and a rail. The status line and the footer are fixed\n\t furniture — the footer's left edge in particular never moves, so a thumb\n\t already travelling toward a control never has it swapped underneath.\n\t Only the middle lane changes what it contains, and the rail down the\n\t right holds the two controls that are worth a thumb's whole reach. */\n\t.cx {\n\t\tposition: relative;\n\t\tcontainer: composer / inline-size;\n\t\tbackground: #151516;\n\t\tborder: 1px solid #2a2a2c;\n\t\tborder-bottom: 0;\n\t\tborder-radius: 16px 16px 0 0;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tpadding-bottom: 8px;\n\t}\n\n\t/* ── lane 0 · the status line ───────────────────────────────────── */\n\t.sl {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 7px;\n\t\t/* The row is as tall as its tallest control, not as tall as its text:\n\t\t the buttons on the right are what a person aims at, and a 22px row\n\t\t caps them below the size a pointer can reliably land on. */\n\t\tmin-height: 28px;\n\t\t/* clears the context rail's 10px hit band, so the two rows never\n\t\t compete for the same click */\n\t\tpadding: 9px 8px 0 12px;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 10.5px;\n\t\tletter-spacing: 0.04em;\n\t\tcolor: #78716c;\n\t\tmin-width: 0;\n\t}\n\t.nm {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 4px;\n\t\tborder: 0;\n\t\tbackground: none;\n\t\tpadding: 0;\n\t\tcolor: #f5f5f4;\n\t\tfont: inherit;\n\t\tcursor: pointer;\n\t\tmin-width: 0;\n\t\tmax-width: 52%;\n\t}\n\t.nm b {\n\t\tfont-weight: 400;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\t.nm iconify-icon {\n\t\tfont-size: 12px;\n\t\topacity: 0.45;\n\t\tflex: none;\n\t}\n\t.nm:hover iconify-icon {\n\t\topacity: 0.9;\n\t}\n\t.sep {\n\t\tcolor: #3f3c39;\n\t\tflex: none;\n\t}\n\t.say {\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t\tmin-width: 0;\n\t}\n\t.say.amber {\n\t\tcolor: #fbbf24;\n\t}\n\t.say.upd {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 3px;\n\t\tcolor: #34d399;\n\t}\n\tbutton.say.upd {\n\t\tpadding: 1px 6px;\n\t\tborder: 1px solid #065f46;\n\t\tborder-radius: 6px;\n\t\tbackground: #052e22;\n\t\tfont: inherit;\n\t\tcursor: pointer;\n\t}\n\tbutton.say.upd:hover:not(:disabled) {\n\t\tbackground: #064e3b;\n\t}\n\tbutton.say.upd:disabled {\n\t\topacity: 0.55;\n\t\tcursor: default;\n\t}\n\t.say.upd.available {\n\t\tcolor: #a8a29e;\n\t}\n\t.say.upd.failed {\n\t\tcolor: #f87171;\n\t}\n\t.sl-sp {\n\t\tflex: 1;\n\t\tmin-width: 8px;\n\t}\n\t/* One pane of a split: the row may wrap in a narrow pane, and the pane's\n\t own controls travel as a group to the right of whichever line they land on. */\n\t.cx.embed .sl {\n\t\tflex-wrap: wrap;\n\t\trow-gap: 2px;\n\t}\n\t.pane-ctl {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 2px;\n\t\tmargin-left: auto;\n\t}\n\t.pane-ctl :global(.pane-close:hover) {\n\t\tcolor: #fca5a5;\n\t}\n\t.mach {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 10px;\n\t\tcolor: #818cf8;\n\t\tbackground: #1e1e3a;\n\t\tborder-radius: 4px;\n\t\tpadding: 0 5px;\n\t\twhite-space: nowrap;\n\t}\n\t.foc {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 9.5px;\n\t\tletter-spacing: 0.08em;\n\t\ttext-transform: uppercase;\n\t\tcolor: #f59e0b;\n\t}\n\t/* The focused pane says so on its composer, not over the conversation. */\n\t.cx.focused {\n\t\tborder-color: #5a4310;\n\t\tbox-shadow: inset 0 0 0 1px #3a2d0d;\n\t}\n\t/* 24×22 with the context rail's own hit band directly above is a target you\n\t aim at rather than one you hit — a miss high lands on the gauge. The\n\t glyph keeps its size; the button grows around it. */\n\t.sl :global(.mini) {\n\t\twidth: 30px;\n\t\theight: 28px;\n\t\tborder: 0;\n\t\tborder-radius: 6px;\n\t\tbackground: none;\n\t\tcolor: #78716c;\n\t\tfont-size: 15px;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex: none;\n\t\tcursor: pointer;\n\t}\n\t.sl :global(.mini:hover) {\n\t\tbackground: #202022;\n\t\tcolor: #f5f5f4;\n\t}\n\t/* A finger is not a cursor: it has no point to aim with and it covers the\n\t thing it is pressing. Where the pointer is coarse the row gives these\n\t controls the size a thumb actually lands on. */\n\t@media (pointer: coarse) {\n\t\t.sl {\n\t\t\tmin-height: 40px;\n\t\t\tgap: 4px;\n\t\t}\n\t\t.sl :global(.mini) {\n\t\t\twidth: 40px;\n\t\t\theight: 40px;\n\t\t}\n\t}\n\n\t/* The sidebar is always on screen once there is room for it. */\n\t@media (min-width: 769px) {\n\t\t/* `.sl .mini` sets display, so this has to match its specificity. */\n\t\t.sl :global(.menu-only) {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t/* The rail stands beside both lanes, so the field and the footer share a\n\t narrower column than the card. That width is what buys the mic and the\n\t action a thumb-sized target without the footer growing a second row. */\n\t.body {\n\t\tdisplay: flex;\n\t\talign-items: stretch;\n\t\tgap: 8px;\n\t\tpadding-right: 9px;\n\t}\n\t.lanes {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\t/* The footer's controls answer to the width the rail leaves them, which\n\t\t the viewport does not know: a sidebar sits between it and this card. */\n\t\tcontainer-type: inline-size;\n\t}\n\t/* The rail is furniture, not content: it sits at the foot and keeps one\n\t size whatever the middle lane grows into — a list of options, a field\n\t four lines deep. A send button as tall as the card is not a better\n\t target, only a stranger one. */\n\t.rail {\n\t\tflex: none;\n\t\talign-self: flex-end;\n\t\tdisplay: flex;\n\t\talign-items: stretch;\n\t\tgap: 6px;\n\t\tpadding: 8px 0 2px;\n\t\theight: 74px;\n\t}\n\n\t/* ── lane 1 · the middle ────────────────────────────────────────── */\n\t.mid {\n\t\tposition: relative;\n\t\tpadding: 8px 4px 0 13px;\n\t\tdisplay: flex;\n\t\tgap: 9px;\n\t\talign-items: flex-start;\n\t}\n\t.mid :global(textarea) {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\theight: 24px;\n\t\tmax-height: 112px;\n\t\tbackground: none;\n\t\tborder: 0;\n\t\tpadding: 0;\n\t\tcolor: #f5f5f4;\n\t\tfont-size: 15.5px;\n\t\tfont-family: inherit;\n\t\tline-height: 1.48;\n\t\tresize: none;\n\t\toverflow-y: auto;\n\t\toverflow-x: hidden;\n\t\tscrollbar-width: none;\n\t}\n\t.mid :global(textarea:focus) {\n\t\toutline: none;\n\t}\n\t.mid :global(textarea::placeholder) {\n\t\tcolor: #78716c;\n\t}\n\n\t.mid :global(.tattach) {\n\t\tflex: none;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 4px;\n\t\theight: 26px;\n\t\tpadding: 0 9px;\n\t\tborder: 0;\n\t\tborder-radius: 13px;\n\t\tbackground: #202022;\n\t\tcolor: #a8a29e;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 11.5px;\n\t\tcursor: pointer;\n\t}\n\t.mid :global(.tattach .attach-failed) {\n\t\tcolor: #f87171;\n\t}\n\n\t/* ── lane 2 · the footer ────────────────────────────────────────── */\n\t.foot {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 4px;\n\t\tmin-height: 42px;\n\t\tpadding: 2px 2px 0 11px;\n\t\t/* Every control on this row is `flex: none`, so a row too long for the\n\t\t card ran on under the rail instead of stopping at it. */\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t}\n\t.foot-sp {\n\t\tflex: 1;\n\t}\n\t/* Controls are bare glyphs that earn a fill only on hover or when lit,\n\t so exactly one thing on the composer is filled: the action. */\n\t.cx :global(.cx-g) {\n\t\tmin-width: 32px;\n\t\theight: 32px;\n\t\tborder: 0;\n\t\tborder-radius: 8px;\n\t\tbackground: none;\n\t\tcolor: #78716c;\n\t\tfont-size: 18px;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex: none;\n\t\tcursor: pointer;\n\t\ttransition:\n\t\t\tbackground 0.12s,\n\t\t\tcolor 0.12s;\n\t}\n\t.cx :global(.cx-g:hover) {\n\t\tbackground: #202022;\n\t\tcolor: #f5f5f4;\n\t}\n\t.cx :global(.cx-g.lit) {\n\t\tbackground: #202022;\n\t\tcolor: #f5f5f4;\n\t}\n\t.cx :global(.cx-g.warn) {\n\t\tcolor: #fbbf24;\n\t}\n\t/* Thumb-sized where the pointer is coarse. It has to follow the base rule:\n\t a media query carries no extra specificity, so written above it, it loses. */\n\t@media (pointer: coarse) {\n\t\t.cx :global(.cx-g) {\n\t\t\tmin-width: 40px;\n\t\t\theight: 40px;\n\t\t}\n\t}\n\n\t/* A desktop keyboard has Escape, but the field it is typed into keeps it,\n\t so the row carries the key itself. Only there: a phone reaches Escape\n\t through the keys tray, and the row has no width to spare for it. */\n\t.cx :global(.esc-key) {\n\t\tdisplay: none;\n\t}\n\t@media (min-width: 769px) {\n\t\t.cx :global(.esc-key) {\n\t\t\tdisplay: inline-flex;\n\t\t}\n\t\t/* The keys toggle belongs with the usage bars on a wide row — the left\n\t\t of the row is where the things you reach for while typing live. The\n\t\t spacer keeps order 0 and stays where it sits in the markup. */\n\t\t.cx :global(.kb-toggle) {\n\t\t\torder: 1;\n\t\t}\n\t\t.foot :global(.usage) {\n\t\t\torder: 2;\n\t\t}\n\t}\n\n\t/* While Claude works, Escape is the only key that matters, so it stops\n\t being the third tile in a row and says what it does. */\n\t.interrupt {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\theight: 32px;\n\t\tpadding: 0 11px;\n\t\tborder: 0;\n\t\tborder-radius: 8px;\n\t\tbackground: #3a2d0d;\n\t\tcolor: #fbbf24;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 11.5px;\n\t\tflex: none;\n\t\tcursor: pointer;\n\t}\n\t.interrupt:hover {\n\t\tbackground: #4a3a12;\n\t}\n\t/* Interrupt is the one control that arrives mid-row, and it arrives at the\n\t width where the spend readout has nowhere left to go. On a narrow card\n\t the glyph carries it: a stop sign in amber, on a bar where nothing else\n\t is amber, needs no caption. */\n\t@container (max-width: 420px) {\n\t\t.interrupt {\n\t\t\tpadding: 0 8px;\n\t\t}\n\t\t.interrupt span {\n\t\t\tdisplay: none;\n\t\t}\n\t\t/* The spend readout keeps its number and drops its sparkline, which is\n\t\t the half of it that cannot be read at this size anyway. */\n\t\t.cx :global(.usage .bars) {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t/* Spend is information, not an action, so it reads as text on the footer's\n\t own baseline rather than as another key. */\n\t.cx :global(.usage) {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\theight: 32px;\n\t\tpadding: 0 5px;\n\t\tborder-radius: 8px;\n\t\tbackground: none;\n\t\tcolor: #78716c;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 11px;\n\t\ttext-decoration: none;\n\t\tflex: none;\n\t}\n\t.cx :global(.usage:hover) {\n\t\tbackground: #202022;\n\t\tcolor: #a8a29e;\n\t}\n\t.cx :global(.usage .bars) {\n\t\twidth: 20px;\n\t}\n\n\t/* The round mic was drawn to sit on the context rail, where it punches a\n\t channel out of the panel behind it. On this rail it is one of two keys a\n\t thumb aims at, so it drops the ring and takes the rail's full height —\n\t a mic that is hard to hit is a mic that loses the sentence. */\n\t.rail :global(.voice-btn-wrapper.round),\n\t.rail :global(.voice-round) {\n\t\twidth: 46px;\n\t\theight: auto;\n\t\talign-self: stretch;\n\t}\n\t/* Record is its own verb, so the mic is filled like the action button is —\n\t red for record, green for send, and nothing else on the bar is filled. */\n\t.rail :global(.voice-round) {\n\t\tborder: 0;\n\t\tborder-radius: 12px;\n\t\tbackground: #b91c1c;\n\t\tcolor: #fff;\n\t\tfont-size: 21px;\n\t\tbox-shadow: none;\n\t}\n\t.rail :global(.voice-round:hover:not(:disabled)) {\n\t\tbackground: #dc2626;\n\t}\n\t.rail :global(.voice-round.recording),\n\t.rail :global(.voice-round.error) {\n\t\tbackground: #ef4444;\n\t}\n\n\t.act-wrap {\n\t\tposition: relative;\n\t\tdisplay: flex;\n\t\talign-items: stretch;\n\t\tflex: none;\n\t}\n\t/* The same rectangle in the same green as the tray's Enter, so the two\n\t ways to submit read as one control that happens to have two homes. */\n\t.act {\n\t\twidth: 46px;\n\t\theight: 100%;\n\t\tmin-height: 56px;\n\t\tborder: 1px solid transparent;\n\t\tborder-radius: 12px;\n\t\tbackground: #15803d;\n\t\tcolor: #f0fdf4;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tfont-size: 22px;\n\t\tcursor: pointer;\n\t\ttouch-action: manipulation;\n\t\tuser-select: none;\n\t\ttransition: background 0.12s;\n\t}\n\t.act:hover:not(:disabled) {\n\t\tbackground: #16a34a;\n\t}\n\t.act:disabled {\n\t\topacity: 0.5;\n\t\tcursor: default;\n\t}\n\t/* Steer sits beside the green send in the card's own grey: the second way\n\t in, not a rival to the first. */\n\t.act.steer {\n\t\tbackground: #292524;\n\t\tborder-color: #3a3532;\n\t\tcolor: #e7e5e4;\n\t}\n\t.act.steer:hover:not(:disabled) {\n\t\tbackground: #3a3532;\n\t}\n\t/* The two steers share one column of the rail, so a phone keeps its field. */\n\t.steers {\n\t\tflex: none;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 4px;\n\t}\n\t.steers .act {\n\t\tflex: 1;\n\t\theight: auto;\n\t\tmin-height: 0;\n\t}\n\n\t.editbar {\n\t\tflex-basis: 100%;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tfont-size: 12px;\n\t\tcolor: #86efac;\n\t}\n\t.editbar.notice {\n\t\tcolor: #a8a29e;\n\t}\n\t.editbar span {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n\t.editbar button {\n\t\theight: 26px;\n\t\tpadding: 0 10px;\n\t\tborder: 0;\n\t\tborder-radius: 6px;\n\t\tbackground: #292524;\n\t\tcolor: #e7e5e4;\n\t\tfont-size: 12px;\n\t\tcursor: pointer;\n\t}\n\t.editbar button:hover {\n\t\tbackground: #3a3532;\n\t}\n\n\n\t/* The header's rare actions return to the status line once there is room\n\t across for them; a phone reaches them through the sheet instead. The\n\t room is the composer's, not the viewport's: the side panel can leave\n\t the session a narrow column on a wide screen. */\n\t.wide-only {\n\t\tdisplay: none;\n\t}\n\t@container composer (min-width: 640px) {\n\t\t.wide-only {\n\t\t\tdisplay: inline-flex;\n\t\t}\n\t}\n\n\t/* Terminal mode's one control the transcript never needed: the pane's\n\t selection, which only exists while you are looking at the pane. */\n\t.copy-sel {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\theight: 32px;\n\t\tpadding: 0 11px;\n\t\tborder: 0;\n\t\tborder-radius: 8px;\n\t\tbackground: #14532d;\n\t\tcolor: #d6f5e0;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 11.5px;\n\t\tflex: none;\n\t\tcursor: pointer;\n\t}\n\t.copy-sel:hover {\n\t\tbackground: #166534;\n\t}\n\n\t/* A composer that runs the full width is a worse composer. */\n\t@media (min-width: 900px) {\n\t\t.cx {\n\t\t\twidth: 100%;\n\t\t\tmax-width: 62rem;\n\t\t\tmargin: 0 auto;\n\t\t}\n\t}\n</style>\n"],"names":["onMountEffect","fn","$.user_effect","untrack","id","$.prop","$$props","useId","width","height","restProps","$.rest_props","rest_excludes","mergedProps","$.derived","mergeProps","$.get","span","root_1","$.attribute_effect","svg","root","$.set_attribute","ref","arrowState","FloatingArrowState","boxWith","v","Arrow","TimeoutFn","#interval","#cb","#timer","cb","interval","onDestroyEffect","#clear","args","tooltipAttrs","createBitsAttrs","TooltipProviderContext","Context","TooltipRootContext","TooltipTriggerRegistryState","#triggers","$.state","$.proxy","value","#activeTriggerNode","activeTriggerId","#activePayload","record","next","#coerceActiveTrigger","firstEntry","TooltipProviderState","opts","simpleBox","#timerFn","#openTooltip","on","e","activeTooltip","triggerNode","target","#startTimer","#clearTimer","tooltip","$.set","TooltipRootState","#delayDuration","#disableHoverableContent","#disableCloseOnTriggerClick","#disabled","#ignoreNonKeyboardFocus","#wasOpenDelayed","#stateAttr","provider","PresenceManager","watch","isOpen","triggerId","#handleDelayedOpen","shouldSkipDelay","delayDuration","firstTriggerId","trigger","isActive","TooltipTriggerState","#isPointerDown","#hasPointerMoveOpened","#transitCheckTimeout","#mounted","#lastRegisteredId","tether","DOMContext","attachRef","#register","#getRoot","#isDisabled","node","payload","disabled","triggerRecord","#clearTransitCheck","#onpointerup","#onpointerdown","#onpointerenter","#onpointermove","#onpointerleave","relatedTarget","isElement","#onfocus","isFocusVisible","#onblur","#onclick","#props","isOpenForTrigger","isDisabled","boolToEmptyStrOrUndef","TooltipContentState","SafePolygon","nodes","activeTriggerNode","#snippetProps","getDataTransitionAttrs","open","onOpenChange","noop","onOpenChangeComplete","rootState","FloatingLayer","$$anchor","$.snippet","$.noop","uid","$.props_id","createId","side","sideOffset","align","avoidCollisions","arrowPadding","sticky","hideWhenDetached","collisionPadding","onInteractOutside","onEscapeKeydown","forceMount","contentState","floatingProps","popper","$$arg0","props","wrapperProps","finalWrapperProps","finalProps","getFloatingContentCSSVars","$0","div","div_1","node_3","$.child","$.reset","PopperLayerForceMount","$.spread_props","div_2","div_3","node_6","$.append","PopperLayer","$$render","consequent_1","consequent_3","type","tabindex","triggerState","button","FloatingLayerArrow","$$value","disableCloseOnTriggerClick","disableHoverableContent","ignoreNonKeyboardFocus","skipDelayDuration","HISTORY_CHUNK","KEEP_AT_BOTTOM","TerminalStore","ReliableWebSocket","#screen","protocol","encodedTarget","event","data","msg","start","lines","end","isLoadMore","curStart","curEnd","fresh","drop","resolve","before","count","base","address","cols","rows","terminalStore","__makeTemplateObject","cooked","raw","PacketKind","AnsiUp","arg","palette","rec","levels","r","g","b","col","grey_level","i","gry","txt","str","pkt","len","pos","next_char","rgx","templateObject_1","match","rpos","rgxG","templateObject_2","templateObject_3","blocks","packet","sgr_cmds","sgr_cmd_str","num","is_foreground","mode_cmd","palette_index","c","fragment","styles","classes","fg","bg","class_string","style_string","parts","tmplObj","subst","regexText","wsrgx","txt2","ansi","OSC8_RE","ANSI_STRIP_RE","escapeAttr","s","isSafeUrl","u","ansiToHtml","input","links","marked","_m","uri","text","html","inner","ansiLineToHtml","line","stripAnsi","themed","frozen","snapHistory","snapStart","snapScreen","wasFrozen","shownHistory","shownStart","shownScreen","screenHtml","pre","$.each","consequent","alternate","alternate_1","ATTACH_DELAY_MS","clickOutside","options","attached","pendingTimer","onDocumentEvent","detach","sync","wantAttached","contextPercent","usage","strip","svgEl","rightEl","path","length","used","left100","color","edgeColor","COMPACT_AT","THRESHOLDS","build","box","card","radius","clear","knob","from","to","detour","d","depth","probe","ro","root_9","path_1","path_2","$.sibling","$.bind_this","node_1","root_8","compact","div_4","$.first_child","fragment_2","div_5","div_6","div_7","span_1","text_2","$.only_child","span_2","text_3","div_8","root_2","span_3","text_4","consequent_2","div_9","root_3","span_4","text_5","p","root_4","p_1","root_5","p_2","root_6","p_3","root_7","text_6","consequent_6","consequent_5","consequent_4","$.action","$$node","$$action_arg","consequent_7","$.set_style","$.delegated","LOAD_FLOOR","usageStore","quota","stats","sessionStore","today","shortLabel","label","model","chips","out","limit","SEVERITY","a","chip","text_1","money","actions","BARS","owned","voiceStore","showing","status","lit","clipping","tooSoft","now","elapsed","formatElapsed","_","$.template_effect","classes_1","$.set_class","iconify_icon","node_2","action","button_1","iconify_icon_1","$.set_custom_element_data","classes_2","$$args","$.set_text","IMAGE_MIME_TYPES","imageMimeFor","dot","STEER_MODES","STEERS","sessionId","paneQueue","busy","editingId","paneDraft","composerHasText","error","drag","listEl","midpoints","total","api","call","method","body","res","remove","move","fromIndex","toIndex","steer","mode","sendNow","onGripKey","index","slotAt","y","slot","mid","onGripDown","item","row","onGripMove","onGripUp","fileName","thumbUrl","Collapsible_Root","Collapsible_Trigger","fragment_3","Collapsible_Content","ul","root_14","li","iconify_icon_2","iconify_icon_3","node_7","dropHere","li_1","root_11","button_2","iconify_icon_4","node_8","img","$1","$2","iconify_icon_5","node_10","span_5","node_12","button_3","fragment_5","iconify_icon_6","node_13","node_14","button_4","iconify_icon_7","consequent_8","button_5","iconify_icon_8","$.event","node_15","li_2","root_13","span_6","iconify_icon_9","node_16","root_12","button_6","iconify_icon_10","consequent_9","consequent_10","supported","isOwner","busyElsewhere","errorMsg","MAX_RECORDING_MS","LONG_TRANSCRIBE_MS","isLongTranscribe","menuOpen","devices","auto","toggleVoice","openMenu","listAudioInputs","canOpenMenu","handleContextMenu","buttonTitle","setLanguage","lang","setDevice","setAutoSubmit","checked","setGain","setNoiseSuppression","showUnsupportedReason","reason","Button","fragment_1","$.index","Checkbox","label_1","$.remove_input_defaults","label_2","node_4","select","option","node_5","option_1","option_1_value","$.init_select","select_value","$.select_option","longPress","armed","REPEAT_DELAY","REPEAT_EVERY","holdTimer","repeatTimer","startRepeat","keys","stopRepeat","ARROWS","CHORDS","EXTRAS","arrow","button_7","button_8","extra","button_9","button_10","chord","button_11","button_12","button_13","button_14","siblings","open_","session","goto","shown","indicatorStateOf","SessionStateIndicator","getSessionDisplayName","sessionStateVisual","TooltipPrimitive_Portal","TooltipPortal","cn","TooltipPrimitive_Content","child","TooltipPrimitive_Arrow","TooltipPrimitive_Provider","TooltipPrimitive_Trigger","TooltipPrimitive_Root","klass","touch","mq","HOLD_MS","bind_get","Tooltip_Root","Tooltip_Trigger","Tooltip_Content","kbd","RELEASE_DATE","CONTEXT_SUFFIX","modelDisplayName","rest","context","suffix","family","version","part","tail","pieces","pinned","query","commands","loading","activeIndex","loadedFor","KIND_LABEL","KIND_COLOR","key","reload","force","qs","filtered","q","pinSet","scored","score","scoreCommand","x","kindOrder","pa","pb","ko","tick","choose","chooseActive","handleKeydown","scrollActiveIntoView","sourceLabel","inputEl","list","insert","onKeydown","Dialog_Root","Dialog_Content","Dialog_Title","Dialog_Description","CommandList","STICK_DEADZONE","BUTTON_INDEX","DEFAULT_REPEAT","REPEAT_INITIAL_MS","REPEAT_INTERVAL_MS","pressFn","h","releaseFn","shouldRepeat","name","useGamepad","buttons","axes","enabled","raf","active","pressed","repeatStartTimers","repeatIntervals","clearRepeat","idx","scheduleRepeat","poll","pads","pad","map","btn","isDown","wasDown","handler","stop","onConnect","onDisconnect","DEFAULT_MODE","persisted","createPersisted","ViewModesStore","#state","viewModesStore","SheetPrimitive_Overlay","SheetPrimitive_Portal","showCloseButton","SheetPortal","SheetOverlay","SheetPrimitive_Content","XIcon","SheetPrimitive_Close","SheetPrimitive_Title","SheetPrimitive_Root","mounted","header","PANES","pane","DiffBadge","paneKeys","Hint","MAXIMIZE_KEYS","CLOSE_KEYS","readPaneParams","pane_body","own","Toggle","pick","Popover_Root","Popover_Trigger","Popover_Content","SidePanelStore","patch","sidePanelStore","REM","INLINE_MEDIA_QUERY","PHONE_MEDIA_QUERY","DEFAULT_WIDTH_CSS","PANEL_MIN_PX","SESSION_MIN_PX","DIVIDER_PX","dragWidth","pointerX","rowRight","rowWidth","attachMenu","openPicker","isTouchDevice","fragment_4","statusLine","root_17","SessionSheet","sheetOpen","sheetActions","showConfirmKill","indicatorState","remoteHost","embed","a_1","fragment_6","route","machineBlocked","paneFocused","fragment_7","statusWants","statusSay","fragment_8","modelName","viewMode","root_10","text_7","paneUpdate","UPDATE_LABEL","isBusy","showConfirmRestart","slashRestart","restartSession","running","upgrade","upgrading","currentSession","fragment_10","text_8","text_9","isIdle","upgradeSession","text_10","isAlive","isClaudeSession","span_7","root_15","RemoteControlMenu","rcPending","rcActions","panelKind","PanelToggle","togglePanel","consequent_11","MOD_LABEL","drawer","consequent_12","toggleView","canTranscript","consequent_13","span_8","root_16","node_21","tellPane","node_22","node_23","consequent_14","composerField","textarea_1","root_18","$.remove_textarea_child","textareaElement","$.attach","keepsCaret","modArmed","handleKeyup","syncCaret","handleBeforeInput","handleBlur","autoResize","handlePaste","textInput","$page","voiceEnabled","routeMachine","machineHost","blockedReason","clock","formatRef","sessionApiAt","tmuxPane","isPlainPane","claudeSessionDead","REMOTE_MISSING_GRACE_MS","remoteGone","remoteMissing","settle","targetMissing","paneIsDead","attention","attentionPrefix","fleetStore","pageTitle","pageVisible","onMount","onVisibility","lastVisit","turn","isUnread","postVisit","statusText","paneSide","serverStore","onMessage","onPointer","onKeys","wanted","param","params","navigateQuery","replaceState","kind","readPanel","PANE_KINDS","paneDef","panelPrefs","inlineQuery","MediaQuery","phoneQuery","panelInline","panelPhone","panelKept","panelColumnKind","panelMaximized","panelDragWidth","panelResizing","sessionRow","panelWidth","panelWidthCss","openPanel","panelQuery","PANE_PARAMS","togglePane","setPaneParams","mentionInComposer","gap","focusComposerEnd","quoteInComposer","appendQuote","paneLink","openGithub","fileLink","changesLink","file","turnChanges","changesSessionId","turnEnded","sessionChanges","fallbackRoot","stale","load","changes","again","toggleMaximize","resizePanel","rect","endPanelResize","handlePanelKeys","panelKeyAction","done","heldDelivery","said","dictated","editing","editNotice","moreOpen","commandsOpen","attachPickerOpen","attachStackOpen","ctrlCount","altCount","trayOpen","chordMenuOpen","chordIndex","chordItems","chordTitle","chordStickArmed","chordStickX","chordStickY","showCopied","CHORD_STICK_DEADZONE","CHORD_RING_THRESHOLD","CHORD_RING_RADII","CHORD_CURSOR_RADIUS_PX","chordInnerCount","chordRings","items","chordPositions","ring","ringIdx","angle","headerActions","copyTmuxCmd","handleResize","url","copyWithToast","turnRemoteControl","ctrlActions","sendKeys","slashActions","runText","attachments","attachmentsStore","cameraInput","galleryInput","filesInput","dropActive","canSend","readyPaths","hasDraft","suggestion","actionKind","ACTIONS","actionLabel","actionIcon","hasAttachments","anyFailed","anyUploading","wantsKeypress","ARROW_KEYS","handleGlobalKeys","handleChooserKeys","isVoiceHotkey","paneChoice","paneTyping","overlayOpen","TYPING_TAGS","el","o","focusDialogField","outputElement","renameId","ctrlTapCandidate","altTapCandidate","transcriptStore","queue","queueCount","findEntry","REVEAL_PAGES","revealEntry","userScrolledUp","pendingReveal","onReveal","liveRowVisible","CLEAR_PROMPT_KEYS","moreKeys","pinnedCommands","fillInput","slashDismissedFor","showSelectionCopied","selectedText","measureCanvas","hasSelection","sel","selActive","seenAppended","appendedNow","unseenLines","measureFont","ctx","calculateTerminalSize","padding","innerWidth","innerHeight","charW","charH","size","onDestroy","afterNavigate","urlTarget","parseSessionPath","reportClient","STORAGE_KEYS","$.user_pre_effect","t","draftsStore","handleScroll","scrollTop","scrollHeight","clientHeight","nextScrolledUp","captureAnchor","pending","holdPlaceThrough","nativeScrollAnchoring","anchorNode","anchorOffset","anchorRows","top","lo","hi","restoreAnchor","drift","fromBottom","scrollToBottom","postToPane","sendPaneText","rewind","why","toast","DOUBLE_TAP_MS","emptyEnterTimer","sendFromButton","sendText","acceptSuggestion","saveEdit","deliver","composed","clearSent","sent","post","message","sendReply","sendTextRaw","RC_PENDING_MS","way","rcOn","timer","how","steerText","nowText","startEdit","cancelEdit","orphanEdit","aside","m","syncHeldDelivery","makeLocalId","doUpload","owner","localId","signal","form","err","uploadAttachment","thumb","abort","uploadFiles","files","f","retryAttachment","removeAttachment","handlePickerInput","which","counter","hasFiles","onEnter","onLeave","onOver","onDrop","speaking","finishVoice","run","heard","insertSaid","spot","caretOf","putCaret","voiceActions","first","steerable","cycleCtrl","cycleAlt","canSteer","state","slashList","caretPos","slashToken","slashKey","slashOpen","slashQuery","chooseSlash","tok","after","sep","dismissSlash","chordStep","delta","n","openChord","title","innerCount","closeChord","releaseChord","overflowY","lx","ly","mag","rings","norm","localIdx","offset","sidebarActionsStore","sendModSequence","prefix","tokens","mod","FIELD_MIN","FIELD_MAX","newHeight","killSession","hasSlashRestart","UPGRADE_WAIT_MS","started","ours","left","giveUp","copySelection","textarea","cmd","$.window","$.head","$.document","root_20","text_11","root_19","span_9","text_12","div_10","text_13","classes_3","classes_4","styles_1","classes_5","consequent_15","RenameSessionDialog","node_25","Tooltip_Provider","div_11","fragment_16","sidePanel","SidePanel","div_12","div_13","div_14","input_1","input_2","input_3","node_28","TranscriptView","sessionPath","TerminalView","preferences","consequent_16","swipe","node_30","root_22","node_31","span_10","root_21","text_14","consequent_17","consequent_18","node_32","$3","$4","QueueStrip","consequent_19","div_15","node_33","ContextGauge","VoiceMeter","KeyTray","node_34","node_35","div_16","div_17","div_18","node_36","div_19","root_23","node_37","consequent_20","iconify_icon_11","fragment_26","span_11","text_15","$.clsx","Popover_Content_1","div_20","fragment_27","att","div_21","root_28","node_42","root_24","span_12","root_25","iconify_icon_12","consequent_21","alternate_2","span_13","text_16","node_43","iconify_icon_13","root_26","root_27","iconify_icon_14","consequent_23","iconify_icon_15","classes_9","node_44","root_29","consequent_24","consequent_25","div_22","root_32","iconify_icon_16","div_23","root_33","iconify_icon_17","span_14","text_17","consequent_27","node_46","div_24","node_47","root_34","iconify_icon_18","consequent_28","root_35","iconify_icon_19","consequent_29","Popover_Root_1","Popover_Trigger_1","iconify_icon_20","node_51","node_52","Popover_Root_2","Popover_Trigger_2","iconify_icon_21","Popover_Content_2","div_25","root_36","iconify_icon_22","fragment_31","span_15","text_19","consequent_30","node_57","RailStats","node_58","div_26","node_59","VoiceButton","consequent_31","div_27","iconify_icon_23","node_60","div_28","root_37","iconify_icon_24","iconify_icon_25","consequent_32","node_61","div_29","fragment_35","node_63","ResizeDivider","aside_1","node_64","div_30","root_38","consequent_33","consequent_34","Sheet_Root","Sheet_Content","Sheet_Title","consequent_36","consequent_35","alternate_3","classes_7","node_70","CommandPalette","AlertDialog_Root","AlertDialog_Content","AlertDialog_Header","AlertDialog_Title","AlertDialog_Description","AlertDialog_Footer","AlertDialog_Cancel","AlertDialog_Action","AlertDialog_Root_1","AlertDialog_Content_1","AlertDialog_Header_1","AlertDialog_Title_1","AlertDialog_Description_1","consequent_37","AlertDialog_Footer_1","AlertDialog_Cancel_1","AlertDialog_Action_1","div_31","root_41","iconify_icon_26","consequent_38","classes_6","styles_2"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,11]}
|