claude-mux 0.30.13 → 0.30.15
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 +21 -7
- 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/server/message-queue.d.ts +8 -5
- package/dist/server/message-queue.d.ts.map +1 -1
- package/dist/server/message-queue.js +87 -14
- package/dist/server/message-queue.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/{web/.svelte-kit/output/client/_app/immutable/chunks/sULMfRFG.js → dist/web/client/_app/immutable/chunks/B1ueI-Jp.js} +2 -2
- package/dist/web/client/_app/immutable/chunks/{sULMfRFG.js.map → B1ueI-Jp.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{CtlIfY1C.js → BFJy9rwt.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/CtlIfY1C.js.map → dist/web/client/_app/immutable/chunks/BFJy9rwt.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{Q5yhzux8.js → CHi6-HvE.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/Q5yhzux8.js.map → dist/web/client/_app/immutable/chunks/CHi6-HvE.js.map} +1 -1
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/BQzv8cqz.js → dist/web/client/_app/immutable/chunks/CWkKdSpD.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/BQzv8cqz.js.map → dist/web/client/_app/immutable/chunks/CWkKdSpD.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{CiU8KBun.js → CvvlvMDB.js} +2 -2
- package/dist/web/client/_app/immutable/chunks/{CiU8KBun.js.map → CvvlvMDB.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{W5_HMZ5E.js → D9xWC-qj.js} +2 -2
- package/dist/web/client/_app/immutable/chunks/{W5_HMZ5E.js.map → D9xWC-qj.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{BQQ3-rqs.js → DJiHHJv3.js} +2 -2
- package/dist/web/client/_app/immutable/chunks/{BQQ3-rqs.js.map → DJiHHJv3.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{VceCNUd7.js → DLDYXkE0.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/VceCNUd7.js.map → dist/web/client/_app/immutable/chunks/DLDYXkE0.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{CtjkAirr.js → Dl5QsiDq.js} +9 -9
- package/dist/web/client/_app/immutable/chunks/Dl5QsiDq.js.map +1 -0
- package/dist/web/client/_app/immutable/chunks/{CM0CI9GL.js → DmS4pplA.js} +3 -3
- package/dist/web/client/_app/immutable/chunks/{CM0CI9GL.js.map → DmS4pplA.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{XgSsj0QY.js → DnntjP1o.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/XgSsj0QY.js.map → dist/web/client/_app/immutable/chunks/DnntjP1o.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/DpTXIw4-.js +4 -0
- package/dist/web/client/_app/immutable/chunks/DpTXIw4-.js.map +1 -0
- package/dist/web/client/_app/immutable/chunks/{DlENCZqZ.js → PiwvGsYU.js} +2 -2
- package/dist/web/client/_app/immutable/chunks/{DlENCZqZ.js.map → PiwvGsYU.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{cvsGFvDx.js → kSW42MxU.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/cvsGFvDx.js.map → dist/web/client/_app/immutable/chunks/kSW42MxU.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{BvX4FYxp.js → z2QK0SL-.js} +2 -2
- package/dist/web/client/_app/immutable/chunks/{BvX4FYxp.js.map → z2QK0SL-.js.map} +1 -1
- package/dist/web/client/_app/immutable/entry/{app.BwTbN8wB.js → app.DYWHzSFA.js} +3 -3
- package/{web/.svelte-kit/output/client/_app/immutable/entry/app.BwTbN8wB.js.map → dist/web/client/_app/immutable/entry/app.DYWHzSFA.js.map} +1 -1
- package/dist/web/client/_app/immutable/entry/start.oS6XCDT9.js +2 -0
- package/dist/web/client/_app/immutable/entry/start.oS6XCDT9.js.map +1 -0
- package/{web/.svelte-kit/output/client/_app/immutable/nodes/0.BnHV-ElR.js → dist/web/client/_app/immutable/nodes/0.Czwb44Pq.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/nodes/0.BnHV-ElR.js.map → dist/web/client/_app/immutable/nodes/0.Czwb44Pq.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{1.Dc3ryOCf.js → 1.DfBNXGyJ.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{1.Dc3ryOCf.js.map → 1.DfBNXGyJ.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{2.DUrpAceY.js → 2.Clm1SlwT.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{2.DUrpAceY.js.map → 2.Clm1SlwT.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{3.BaCofjAn.js → 3.MNg0k2ol.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{3.BaCofjAn.js.map → 3.MNg0k2ol.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{4.v1wYkrvS.js → 4.DDSYHXWy.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{4.v1wYkrvS.js.map → 4.DDSYHXWy.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{5.Bn4A77jK.js → 5.CDTzRbAK.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{5.Bn4A77jK.js.map → 5.CDTzRbAK.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{6.C2hEoITj.js → 6.CLPKF1xx.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{6.C2hEoITj.js.map → 6.CLPKF1xx.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{7.BcHOjWdp.js → 7.DLF_GZUp.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{7.BcHOjWdp.js.map → 7.DLF_GZUp.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{8.D7NtqIYy.js → 8.OBQBHtO9.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{8.D7NtqIYy.js.map → 8.OBQBHtO9.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{9.D-211z9-.js → 9.Bd3JJwvV.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{9.D-211z9-.js.map → 9.Bd3JJwvV.js.map} +1 -1
- package/dist/web/client/_app/version.json +1 -1
- package/dist/web/server/chunks/{0-CvglVGCY.js → 0-BmH6IGke.js} +14 -14
- package/dist/web/server/chunks/{0-CvglVGCY.js.map → 0-BmH6IGke.js.map} +1 -1
- package/dist/web/server/chunks/{1-D-gJDFrG.js → 1-CjJBxrXF.js} +4 -4
- package/dist/web/server/chunks/{1-D-gJDFrG.js.map → 1-CjJBxrXF.js.map} +1 -1
- package/dist/web/server/chunks/{2-BCmEU5Qq.js → 2-Cn-SpZE3.js} +13 -13
- package/dist/web/server/chunks/{2-BCmEU5Qq.js.map → 2-Cn-SpZE3.js.map} +1 -1
- package/dist/web/server/chunks/{3-CHn5Kw-T.js → 3-DRRc_1dm.js} +10 -10
- package/dist/web/server/chunks/{3-CHn5Kw-T.js.map → 3-DRRc_1dm.js.map} +1 -1
- package/dist/web/server/chunks/{4-Cxg7VcZ7.js → 4-CxxQapQm.js} +12 -12
- package/dist/web/server/chunks/{4-Cxg7VcZ7.js.map → 4-CxxQapQm.js.map} +1 -1
- package/dist/web/server/chunks/{5-DSgvnHF_.js → 5-DD-Hn8d7.js} +9 -9
- package/dist/web/server/chunks/{5-DSgvnHF_.js.map → 5-DD-Hn8d7.js.map} +1 -1
- package/dist/web/server/chunks/{6-B0rymWRR.js → 6-DKEaLqzQ.js} +5 -5
- package/dist/web/server/chunks/{6-B0rymWRR.js.map → 6-DKEaLqzQ.js.map} +1 -1
- package/dist/web/server/chunks/{7-CNomBJux.js → 7-DNbW_v2X.js} +10 -10
- package/dist/web/server/chunks/{7-CNomBJux.js.map → 7-DNbW_v2X.js.map} +1 -1
- package/dist/web/server/chunks/{8-TYbX-1bO.js → 8-BPETDVql.js} +12 -12
- package/dist/web/server/chunks/{8-TYbX-1bO.js.map → 8-BPETDVql.js.map} +1 -1
- package/dist/web/server/chunks/{9-XGQQvTLc.js → 9-kQH8GgXO.js} +9 -9
- package/dist/web/server/chunks/{9-XGQQvTLc.js.map → 9-kQH8GgXO.js.map} +1 -1
- package/dist/web/server/chunks/{_layout.svelte-yrPX5VFm.js → _layout.svelte-DeHDxJGt.js} +58 -37
- package/dist/web/server/chunks/_layout.svelte-DeHDxJGt.js.map +1 -0
- package/dist/web/server/chunks/{_page.svelte-C_kFA0Lq.js → _page.svelte-DntYC0f2.js} +4 -4
- package/dist/web/server/chunks/{_page.svelte-C_kFA0Lq.js.map → _page.svelte-DntYC0f2.js.map} +1 -1
- package/dist/web/server/chunks/{_page.svelte-DvxpwsgS.js → _page.svelte-DpMY4uTa.js} +6 -6
- package/dist/web/server/chunks/{_page.svelte-DvxpwsgS.js.map → _page.svelte-DpMY4uTa.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-KbQyErIR.js → _server.ts--U_0S12v.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-KbQyErIR.js.map → _server.ts--U_0S12v.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-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-9iRpDv9e.js → _server.ts-B9dTG4Gs.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-9iRpDv9e.js.map → _server.ts-B9dTG4Gs.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-CNBy2p2U.js → _server.ts-BBeDdZMo.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-CNBy2p2U.js.map → _server.ts-BBeDdZMo.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-AAllMdwT.js → _server.ts-BOIIbvcd.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-AAllMdwT.js.map → _server.ts-BOIIbvcd.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-CyOA1rOq.js → _server.ts-BQNv3Qn9.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-CyOA1rOq.js.map → _server.ts-BQNv3Qn9.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-DVgdt6Zu.js → _server.ts-C0jQSpvq.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-DVgdt6Zu.js.map → _server.ts-C0jQSpvq.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-ji7L8HUR.js → _server.ts-CKlhUlhI.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-ji7L8HUR.js.map → _server.ts-CKlhUlhI.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-DrFiP32b.js → _server.ts-CPrFFsh-.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-DrFiP32b.js.map → _server.ts-CPrFFsh-.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-Cv8SUkC5.js → _server.ts-CQywkS_H.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-Cv8SUkC5.js.map → _server.ts-CQywkS_H.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-B9RfKfyc.js → _server.ts-CSbdJ5iI.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-B9RfKfyc.js.map → _server.ts-CSbdJ5iI.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-DozhhYwq.js → _server.ts-CbS7DnV7.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-DozhhYwq.js.map → _server.ts-CbS7DnV7.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-DK-6ddNq.js → _server.ts-CfIP7qf6.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-DK-6ddNq.js.map → _server.ts-CfIP7qf6.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-BWVtnpJh.js → _server.ts-Crdideoe.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-BWVtnpJh.js.map → _server.ts-Crdideoe.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-CA8nszPb.js → _server.ts-D5FI04La.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-CA8nszPb.js.map → _server.ts-D5FI04La.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-78nODRDJ.js → _server.ts-DAjvFQRk.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-78nODRDJ.js.map → _server.ts-DAjvFQRk.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-BozsVs8t.js → _server.ts-DUlnfVa3.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-BozsVs8t.js.map → _server.ts-DUlnfVa3.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-CovkmnvY.js → _server.ts-DZyOwdre.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-CovkmnvY.js.map → _server.ts-DZyOwdre.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-DQJ-tygD.js → _server.ts-DfzLASfY.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-DQJ-tygD.js.map → _server.ts-DfzLASfY.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-D2Tvcncu.js → _server.ts-Ds8fP3ak.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-D2Tvcncu.js.map → _server.ts-Ds8fP3ak.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-1ZhqL5o8.js → _server.ts-P-GtOUhW.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-1ZhqL5o8.js.map → _server.ts-P-GtOUhW.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-iK8ih9Bi.js → _server.ts-PQZACnJh.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-iK8ih9Bi.js.map → _server.ts-PQZACnJh.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-VgbTPrqV.js → _server.ts-WtstJm2K.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-VgbTPrqV.js.map → _server.ts-WtstJm2K.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/{_server.ts-CzcknkWq.js → _server.ts-wsNKi_0h.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-CzcknkWq.js.map → _server.ts-wsNKi_0h.js.map} +1 -1
- package/dist/web/server/chunks/{checkbox-DiJTAtHi.js → checkbox-Gt0K_cvq.js} +2 -2
- package/dist/web/server/chunks/{checkbox-DiJTAtHi.js.map → checkbox-Gt0K_cvq.js.map} +1 -1
- package/dist/web/server/chunks/{create-id-DpoSQWrl.js → create-id-CwRBEuSe.js} +3 -3
- package/dist/web/server/chunks/{create-id-DpoSQWrl.js.map → create-id-CwRBEuSe.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-Bs3uu0o9.js} +3 -3
- package/dist/web/server/chunks/{drafts.svelte-DsFAtH-s.js.map → drafts.svelte-Bs3uu0o9.js.map} +1 -1
- package/dist/web/server/chunks/{end-session-BbBa9yD0.js → end-session-ChFkyGma.js} +2 -2
- package/dist/web/server/chunks/{end-session-BbBa9yD0.js.map → end-session-ChFkyGma.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-OhxUuYh1.js} +4 -4
- package/dist/web/server/chunks/{fleet-DZJSFWuH.js.map → fleet-OhxUuYh1.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-CBWcxR_B.js} +6 -6
- package/dist/web/server/chunks/{hooks.server-C3Uglne7.js.map → hooks.server-CBWcxR_B.js.map} +1 -1
- package/dist/web/server/chunks/{message-queue-sFcJCRjz.js → message-queue-DcPUlVz5.js} +69 -15
- package/dist/web/server/chunks/message-queue-DcPUlVz5.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-B1bEhIC-.js} +5 -5
- package/dist/web/server/chunks/{push-BJ7P9DGd.js.map → push-B1bEhIC-.js.map} +1 -1
- package/dist/web/server/chunks/{remote-control-C1d9R3w4.js → remote-control-qMrIrQCU.js} +2 -2
- package/dist/web/server/chunks/{remote-control-C1d9R3w4.js.map → remote-control-qMrIrQCU.js.map} +1 -1
- package/dist/web/server/chunks/{start-session-CKbupnLS.js → start-session-C9loHv64.js} +3 -3
- package/dist/web/server/chunks/{start-session-CKbupnLS.js.map → start-session-C9loHv64.js.map} +1 -1
- package/dist/web/server/chunks/{version-BqEJmw2g.js → version-Dfokr2tc.js} +2 -2
- package/dist/web/server/chunks/version-Dfokr2tc.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-D8kw9RG2.js} +6 -5
- package/dist/web/server/chunks/ws-handlers-D8kw9RG2.js.map +1 -0
- package/dist/web/server/chunks/{ws-managers-C5VXKb_r.js → ws-managers-CsT346dr.js} +2 -2
- package/dist/web/server/chunks/{ws-managers-C5VXKb_r.js.map → ws-managers-CsT346dr.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/server/message-queue.ts +79 -13
- 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/server/steer.test.ts +14 -1
- package/tests/transcript/parser.test.ts +34 -0
- package/tests/transcript/past-sessions.test.ts +5 -0
- package/web/.svelte-kit/adapter-bun/.vite/manifest.json +2 -1
- 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 +73 -9
- 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 +208 -208
- package/{dist/web/client/_app/immutable/chunks/sULMfRFG.js → web/.svelte-kit/output/client/_app/immutable/chunks/B1ueI-Jp.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{sULMfRFG.js.map → B1ueI-Jp.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{CtlIfY1C.js → BFJy9rwt.js} +2 -2
- package/{dist/web/client/_app/immutable/chunks/CtlIfY1C.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/BFJy9rwt.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{Q5yhzux8.js → CHi6-HvE.js} +2 -2
- package/{dist/web/client/_app/immutable/chunks/Q5yhzux8.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/CHi6-HvE.js.map} +1 -1
- package/{dist/web/client/_app/immutable/chunks/BQzv8cqz.js → web/.svelte-kit/output/client/_app/immutable/chunks/CWkKdSpD.js} +2 -2
- package/{dist/web/client/_app/immutable/chunks/BQzv8cqz.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/CWkKdSpD.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{CiU8KBun.js → CvvlvMDB.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{CiU8KBun.js.map → CvvlvMDB.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{W5_HMZ5E.js → D9xWC-qj.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{W5_HMZ5E.js.map → D9xWC-qj.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{BQQ3-rqs.js → DJiHHJv3.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{BQQ3-rqs.js.map → DJiHHJv3.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{VceCNUd7.js → DLDYXkE0.js} +2 -2
- package/{dist/web/client/_app/immutable/chunks/VceCNUd7.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/DLDYXkE0.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{CtjkAirr.js → Dl5QsiDq.js} +9 -9
- package/web/.svelte-kit/output/client/_app/immutable/chunks/Dl5QsiDq.js.map +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{CM0CI9GL.js → DmS4pplA.js} +3 -3
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{CM0CI9GL.js.map → DmS4pplA.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{XgSsj0QY.js → DnntjP1o.js} +2 -2
- package/{dist/web/client/_app/immutable/chunks/XgSsj0QY.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/DnntjP1o.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/DpTXIw4-.js +4 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/DpTXIw4-.js.map +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{DlENCZqZ.js → PiwvGsYU.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{DlENCZqZ.js.map → PiwvGsYU.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{cvsGFvDx.js → kSW42MxU.js} +2 -2
- package/{dist/web/client/_app/immutable/chunks/cvsGFvDx.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/kSW42MxU.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{BvX4FYxp.js → z2QK0SL-.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{BvX4FYxp.js.map → z2QK0SL-.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/entry/{app.BwTbN8wB.js → app.DYWHzSFA.js} +3 -3
- package/{dist/web/client/_app/immutable/entry/app.BwTbN8wB.js.map → web/.svelte-kit/output/client/_app/immutable/entry/app.DYWHzSFA.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.oS6XCDT9.js +2 -0
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.oS6XCDT9.js.map +1 -0
- package/{dist/web/client/_app/immutable/nodes/0.BnHV-ElR.js → web/.svelte-kit/output/client/_app/immutable/nodes/0.Czwb44Pq.js} +2 -2
- package/{dist/web/client/_app/immutable/nodes/0.BnHV-ElR.js.map → web/.svelte-kit/output/client/_app/immutable/nodes/0.Czwb44Pq.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{1.Dc3ryOCf.js → 1.DfBNXGyJ.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{1.Dc3ryOCf.js.map → 1.DfBNXGyJ.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.DUrpAceY.js → 2.Clm1SlwT.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.DUrpAceY.js.map → 2.Clm1SlwT.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{3.BaCofjAn.js → 3.MNg0k2ol.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{3.BaCofjAn.js.map → 3.MNg0k2ol.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/4.DDSYHXWy.js +2 -0
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{4.v1wYkrvS.js.map → 4.DDSYHXWy.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/5.CDTzRbAK.js +2 -0
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{5.Bn4A77jK.js.map → 5.CDTzRbAK.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{6.C2hEoITj.js → 6.CLPKF1xx.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{6.C2hEoITj.js.map → 6.CLPKF1xx.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{7.BcHOjWdp.js → 7.DLF_GZUp.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{7.BcHOjWdp.js.map → 7.DLF_GZUp.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/8.OBQBHtO9.js +2 -0
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{8.D7NtqIYy.js.map → 8.OBQBHtO9.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/9.Bd3JJwvV.js +2 -0
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{9.D-211z9-.js.map → 9.Bd3JJwvV.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/version.json +1 -1
- package/web/.svelte-kit/output/server/.vite/manifest.json +2 -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 +73 -9
- 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,5 +1,5 @@
|
|
|
1
1
|
import { n as deleteSession } from "./sessions-json-Diquh3w5.js";
|
|
2
|
-
import { t as broadcastSessions } from "./ws-managers-
|
|
2
|
+
import { t as broadcastSessions } from "./ws-managers-CsT346dr.js";
|
|
3
3
|
import { execFileSync } from "child_process";
|
|
4
4
|
// .svelte-kit/adapter-bun/chunks/end-session.js
|
|
5
5
|
function endSession(id, pid, tmuxTarget) {
|
|
@@ -20,4 +20,4 @@ function endSession(id, pid, tmuxTarget) {
|
|
|
20
20
|
}
|
|
21
21
|
export { endSession as t };
|
|
22
22
|
|
|
23
|
-
//# sourceMappingURL=end-session-
|
|
23
|
+
//# sourceMappingURL=end-session-ChFkyGma.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"end-session-
|
|
1
|
+
{"version":3,"file":"end-session-ChFkyGma.js","names":[],"sources":["../../../../web/.svelte-kit/adapter-bun/chunks/end-session.js"],"sourcesContent":["import { execFileSync } from \"child_process\";\nimport { f as deleteSession } from \"./sessions-json.js\";\nimport { c as broadcastSessions } from \"./ws-managers.js\";\nfunction endSession(id, pid, tmuxTarget) {\n if (typeof pid === \"number\" && pid > 0 && Number.isInteger(pid)) {\n try {\n execFileSync(\"kill\", [\"-9\", String(pid)], { stdio: \"ignore\" });\n } catch {\n }\n }\n if (tmuxTarget && typeof tmuxTarget === \"string\") {\n try {\n execFileSync(\"tmux\", [\"kill-pane\", \"-t\", tmuxTarget], { stdio: \"ignore\" });\n } catch {\n }\n }\n try {\n deleteSession(id);\n } catch {\n }\n broadcastSessions();\n}\nexport {\n endSession as e\n};\n//# sourceMappingURL=end-session.js.map\n"],"mappings":";;;;AAGA,SAAS,WAAW,IAAI,KAAK,YAAY;CACvC,IAAI,OAAO,QAAQ,YAAY,MAAM,KAAK,OAAO,UAAU,GAAG,GAC5D,IAAI;EACF,aAAa,QAAQ,CAAC,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,OAAO,SAAS,CAAC;CAC/D,QAAQ,CACR;CAEF,IAAI,cAAc,OAAO,eAAe,UACtC,IAAI;EACF,aAAa,QAAQ;GAAC;GAAa;GAAM;EAAU,GAAG,EAAE,OAAO,SAAS,CAAC;CAC3E,QAAQ,CACR;CAEF,IAAI;EACF,cAAc,EAAE;CAClB,QAAQ,CACR;CACA,kBAAkB;AACpB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as imageMimeFor } from "./image-types-D13dLNUL.js";
|
|
2
|
-
import { i as git, p as repoRoot } from "./git-
|
|
2
|
+
import { i as git, p as repoRoot } from "./git-CHO9UIOQ.js";
|
|
3
3
|
import { homedir } from "os";
|
|
4
4
|
import { open, readFile, readdir, realpath, stat } from "fs/promises";
|
|
5
5
|
import { execFile } from "child_process";
|
|
@@ -219,4 +219,4 @@ async function listRepoFiles(root) {
|
|
|
219
219
|
}
|
|
220
220
|
export { listRepoFiles as a, readProjectImage as c, listDir as i, resolveInRoot as l, filesRoot as n, locateProjectFile as o, isInside as r, readProjectFile as s, FileAccessError as t };
|
|
221
221
|
|
|
222
|
-
//# sourceMappingURL=files-
|
|
222
|
+
//# sourceMappingURL=files-DNH191y7.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files-4i3igWea.js","names":[],"sources":["../../../../web/.svelte-kit/adapter-bun/chunks/files.js"],"sourcesContent":["import { execFile } from \"child_process\";\nimport { StringDecoder } from \"string_decoder\";\nimport { realpath, stat, readFile, readdir, open } from \"fs/promises\";\nimport { homedir } from \"os\";\nimport { isAbsolute, resolve, relative, sep, join } from \"path\";\nimport { r as repoRoot, g as git } from \"./git.js\";\nimport { i as imageMimeFor } from \"./image-types.js\";\nconst READ_LIMIT_BYTES = 1024 * 1024;\nconst IMAGE_LIMIT_BYTES = 20 * 1024 * 1024;\nconst SNIFF_BYTES = 8 * 1024;\nconst LIST_LIMIT = 5e4;\nclass FileAccessError extends Error {\n constructor(message, status) {\n super(message);\n this.status = status;\n }\n status;\n}\nasync function filesRoot(session) {\n const repo = session.git_root ?? await repoRoot(session.cwd);\n return { root: repo ?? session.cwd, repo: repo !== null };\n}\nfunction isInside(root, abs) {\n const rel = relative(root, abs);\n return rel === \"\" || rel !== \"..\" && !rel.startsWith(\"..\" + sep) && !isAbsolute(rel);\n}\nfunction isGitPath(rel) {\n return rel.split(\"/\").includes(\".git\");\n}\nasync function resolveInRoot(root, path) {\n if (path.includes(\"\\0\")) throw new FileAccessError(\"Invalid path\", 400);\n const realRoot = await realpath(root).catch(() => {\n throw new FileAccessError(\"Project directory not found\", 404);\n });\n const wanted = isAbsolute(path) ? resolve(path) : resolve(realRoot, path);\n if (!isInside(realRoot, wanted) && !(isAbsolute(path) && isInside(resolve(root), wanted))) {\n throw new FileAccessError(\"Path is outside the project\", 403);\n }\n let abs;\n try {\n abs = await realpath(wanted);\n } catch {\n throw new FileAccessError(\"No such file or directory\", 404);\n }\n if (!isInside(realRoot, abs)) throw new FileAccessError(\"Path is outside the project\", 403);\n const rel = relative(realRoot, abs).split(sep).join(\"/\");\n if (isGitPath(rel)) throw new FileAccessError(\"Path is outside the project\", 403);\n return { abs, rel, realRoot };\n}\nasync function ignoredPaths(root, paths) {\n const out = await new Promise((done) => {\n const child = execFile(\n \"git\",\n [\"check-ignore\", \"-z\", \"--stdin\"],\n { cwd: root, timeout: 1e4, maxBuffer: 16 * 1024 * 1024 },\n // Exit 1 means nothing given is ignored.\n (_err, stdout) => done(stdout ?? \"\")\n );\n child.stdin?.on(\"error\", () => {\n });\n child.stdin?.end(paths.join(\"\\0\") + \"\\0\");\n });\n return new Set(out.split(\"\\0\").filter(Boolean));\n}\nfunction byTypeThenName(a, b) {\n if (a.type !== b.type) return a.type === \"dir\" ? -1 : 1;\n return a.name.localeCompare(b.name, void 0, { numeric: true, sensitivity: \"base\" });\n}\nasync function listDir(root, dir, opts) {\n const { abs, rel, realRoot } = await resolveInRoot(root, dir || \".\");\n const dirents = await readdir(abs, { withFileTypes: true }).catch((err) => {\n throw new FileAccessError(err.code === \"ENOTDIR\" ? \"Not a directory\" : \"Cannot read directory\", 400);\n });\n const entries = [];\n await Promise.all(\n dirents.map(async (d) => {\n const path = rel ? `${rel}/${d.name}` : d.name;\n if (isGitPath(path)) return;\n if (d.isDirectory()) return void entries.push({ name: d.name, path, type: \"dir\" });\n if (d.isFile()) return void entries.push({ name: d.name, path, type: \"file\" });\n if (!d.isSymbolicLink()) return;\n try {\n const target = await realpath(join(abs, d.name));\n if (!isInside(realRoot, target)) return;\n const s = await stat(target);\n entries.push({ name: d.name, path, type: s.isDirectory() ? \"dir\" : \"file\", link: true });\n } catch {\n }\n })\n );\n let hidden = 0;\n let shown = entries;\n if (opts.repo && entries.length > 0) {\n const spelled = (e) => e.type === \"dir\" && !e.link ? `${e.path}/` : e.path;\n const ignored = await ignoredPaths(realRoot, entries.map(spelled));\n for (const e of entries) if (ignored.has(spelled(e))) e.ignored = true;\n if (!opts.showIgnored) {\n shown = entries.filter((e) => !e.ignored);\n hidden = entries.length - shown.length;\n }\n }\n return { root: realRoot, dir: rel, repo: opts.repo, entries: shown.sort(byTypeThenName), hidden };\n}\nasync function readHead(abs, limit) {\n const handle = await open(abs, \"r\");\n try {\n const buf = Buffer.allocUnsafe(limit);\n const { bytesRead } = await handle.read(buf, 0, limit, 0);\n return buf.subarray(0, bytesRead);\n } finally {\n await handle.close();\n }\n}\nasync function readProjectFile(root, path) {\n const { abs, rel } = await resolveInRoot(root, path);\n const s = await stat(abs);\n if (!s.isFile()) throw new FileAccessError(\"Not a file\", 400);\n const mime = imageMimeFor(abs);\n if (mime) return { kind: \"image\", path: rel, size: s.size, mime };\n const head = await readHead(abs, Math.min(s.size, READ_LIMIT_BYTES));\n if (head.subarray(0, SNIFF_BYTES).includes(0)) return { kind: \"binary\", path: rel, size: s.size };\n const truncated = s.size > READ_LIMIT_BYTES;\n let bytes = head;\n if (truncated) {\n const nl = bytes.lastIndexOf(10);\n if (nl > 0) bytes = bytes.subarray(0, nl + 1);\n }\n const text = new StringDecoder(\"utf8\").write(bytes);\n return { kind: \"text\", path: rel, size: s.size, shown: Buffer.byteLength(text), text, truncated };\n}\nasync function readProjectImage(root, path) {\n const { abs } = await resolveInRoot(root, path);\n const mime = imageMimeFor(abs);\n if (!mime) throw new FileAccessError(\"Not an image\", 415);\n const s = await stat(abs);\n if (!s.isFile()) throw new FileAccessError(\"Not a file\", 400);\n if (s.size > IMAGE_LIMIT_BYTES) throw new FileAccessError(\"Image too large\", 413);\n return { bytes: await readFile(abs), mime };\n}\nasync function locateProjectFile(root, path, cwd) {\n const found = async (candidate) => {\n try {\n await resolveInRoot(root, candidate);\n return true;\n } catch (err) {\n if (err instanceof FileAccessError) return false;\n throw err;\n }\n };\n if (path.startsWith(\"~/\")) return join(homedir(), path.slice(2));\n if (isAbsolute(path) || await found(path)) return path;\n const fromCwd = join(cwd, path);\n if (await found(fromCwd)) return fromCwd;\n const tail = path.replace(/^(?:\\.\\/)+/, \"\");\n const listed = await listRepoFiles(root);\n if (!listed || listed.truncated) return path;\n const matches = listed.files.filter((f) => f.endsWith(`/${tail}`));\n return matches.length === 1 ? matches[0] : path;\n}\nasync function listRepoFiles(root) {\n const out = await git([\"ls-files\", \"-z\", \"--cached\", \"--others\", \"--exclude-standard\"], root);\n if (out === null) return null;\n const files = [...new Set(out.split(\"\\0\").filter(Boolean))];\n return { files: files.slice(0, LIST_LIMIT), truncated: files.length > LIST_LIMIT };\n}\nexport {\n FileAccessError as F,\n locateProjectFile as a,\n readProjectImage as b,\n readProjectFile as c,\n listDir as d,\n filesRoot as f,\n isInside as i,\n listRepoFiles as l,\n resolveInRoot as r\n};\n//# sourceMappingURL=files.js.map\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"files-DNH191y7.js","names":[],"sources":["../../../../web/.svelte-kit/adapter-bun/chunks/files.js"],"sourcesContent":["import { execFile } from \"child_process\";\nimport { StringDecoder } from \"string_decoder\";\nimport { realpath, stat, readFile, readdir, open } from \"fs/promises\";\nimport { homedir } from \"os\";\nimport { isAbsolute, resolve, relative, sep, join } from \"path\";\nimport { r as repoRoot, g as git } from \"./git.js\";\nimport { i as imageMimeFor } from \"./image-types.js\";\nconst READ_LIMIT_BYTES = 1024 * 1024;\nconst IMAGE_LIMIT_BYTES = 20 * 1024 * 1024;\nconst SNIFF_BYTES = 8 * 1024;\nconst LIST_LIMIT = 5e4;\nclass FileAccessError extends Error {\n constructor(message, status) {\n super(message);\n this.status = status;\n }\n status;\n}\nasync function filesRoot(session) {\n const repo = session.git_root ?? await repoRoot(session.cwd);\n return { root: repo ?? session.cwd, repo: repo !== null };\n}\nfunction isInside(root, abs) {\n const rel = relative(root, abs);\n return rel === \"\" || rel !== \"..\" && !rel.startsWith(\"..\" + sep) && !isAbsolute(rel);\n}\nfunction isGitPath(rel) {\n return rel.split(\"/\").includes(\".git\");\n}\nasync function resolveInRoot(root, path) {\n if (path.includes(\"\\0\")) throw new FileAccessError(\"Invalid path\", 400);\n const realRoot = await realpath(root).catch(() => {\n throw new FileAccessError(\"Project directory not found\", 404);\n });\n const wanted = isAbsolute(path) ? resolve(path) : resolve(realRoot, path);\n if (!isInside(realRoot, wanted) && !(isAbsolute(path) && isInside(resolve(root), wanted))) {\n throw new FileAccessError(\"Path is outside the project\", 403);\n }\n let abs;\n try {\n abs = await realpath(wanted);\n } catch {\n throw new FileAccessError(\"No such file or directory\", 404);\n }\n if (!isInside(realRoot, abs)) throw new FileAccessError(\"Path is outside the project\", 403);\n const rel = relative(realRoot, abs).split(sep).join(\"/\");\n if (isGitPath(rel)) throw new FileAccessError(\"Path is outside the project\", 403);\n return { abs, rel, realRoot };\n}\nasync function ignoredPaths(root, paths) {\n const out = await new Promise((done) => {\n const child = execFile(\n \"git\",\n [\"check-ignore\", \"-z\", \"--stdin\"],\n { cwd: root, timeout: 1e4, maxBuffer: 16 * 1024 * 1024 },\n // Exit 1 means nothing given is ignored.\n (_err, stdout) => done(stdout ?? \"\")\n );\n child.stdin?.on(\"error\", () => {\n });\n child.stdin?.end(paths.join(\"\\0\") + \"\\0\");\n });\n return new Set(out.split(\"\\0\").filter(Boolean));\n}\nfunction byTypeThenName(a, b) {\n if (a.type !== b.type) return a.type === \"dir\" ? -1 : 1;\n return a.name.localeCompare(b.name, void 0, { numeric: true, sensitivity: \"base\" });\n}\nasync function listDir(root, dir, opts) {\n const { abs, rel, realRoot } = await resolveInRoot(root, dir || \".\");\n const dirents = await readdir(abs, { withFileTypes: true }).catch((err) => {\n throw new FileAccessError(err.code === \"ENOTDIR\" ? \"Not a directory\" : \"Cannot read directory\", 400);\n });\n const entries = [];\n await Promise.all(\n dirents.map(async (d) => {\n const path = rel ? `${rel}/${d.name}` : d.name;\n if (isGitPath(path)) return;\n if (d.isDirectory()) return void entries.push({ name: d.name, path, type: \"dir\" });\n if (d.isFile()) return void entries.push({ name: d.name, path, type: \"file\" });\n if (!d.isSymbolicLink()) return;\n try {\n const target = await realpath(join(abs, d.name));\n if (!isInside(realRoot, target)) return;\n const s = await stat(target);\n entries.push({ name: d.name, path, type: s.isDirectory() ? \"dir\" : \"file\", link: true });\n } catch {\n }\n })\n );\n let hidden = 0;\n let shown = entries;\n if (opts.repo && entries.length > 0) {\n const spelled = (e) => e.type === \"dir\" && !e.link ? `${e.path}/` : e.path;\n const ignored = await ignoredPaths(realRoot, entries.map(spelled));\n for (const e of entries) if (ignored.has(spelled(e))) e.ignored = true;\n if (!opts.showIgnored) {\n shown = entries.filter((e) => !e.ignored);\n hidden = entries.length - shown.length;\n }\n }\n return { root: realRoot, dir: rel, repo: opts.repo, entries: shown.sort(byTypeThenName), hidden };\n}\nasync function readHead(abs, limit) {\n const handle = await open(abs, \"r\");\n try {\n const buf = Buffer.allocUnsafe(limit);\n const { bytesRead } = await handle.read(buf, 0, limit, 0);\n return buf.subarray(0, bytesRead);\n } finally {\n await handle.close();\n }\n}\nasync function readProjectFile(root, path) {\n const { abs, rel } = await resolveInRoot(root, path);\n const s = await stat(abs);\n if (!s.isFile()) throw new FileAccessError(\"Not a file\", 400);\n const mime = imageMimeFor(abs);\n if (mime) return { kind: \"image\", path: rel, size: s.size, mime };\n const head = await readHead(abs, Math.min(s.size, READ_LIMIT_BYTES));\n if (head.subarray(0, SNIFF_BYTES).includes(0)) return { kind: \"binary\", path: rel, size: s.size };\n const truncated = s.size > READ_LIMIT_BYTES;\n let bytes = head;\n if (truncated) {\n const nl = bytes.lastIndexOf(10);\n if (nl > 0) bytes = bytes.subarray(0, nl + 1);\n }\n const text = new StringDecoder(\"utf8\").write(bytes);\n return { kind: \"text\", path: rel, size: s.size, shown: Buffer.byteLength(text), text, truncated };\n}\nasync function readProjectImage(root, path) {\n const { abs } = await resolveInRoot(root, path);\n const mime = imageMimeFor(abs);\n if (!mime) throw new FileAccessError(\"Not an image\", 415);\n const s = await stat(abs);\n if (!s.isFile()) throw new FileAccessError(\"Not a file\", 400);\n if (s.size > IMAGE_LIMIT_BYTES) throw new FileAccessError(\"Image too large\", 413);\n return { bytes: await readFile(abs), mime };\n}\nasync function locateProjectFile(root, path, cwd) {\n const found = async (candidate) => {\n try {\n await resolveInRoot(root, candidate);\n return true;\n } catch (err) {\n if (err instanceof FileAccessError) return false;\n throw err;\n }\n };\n if (path.startsWith(\"~/\")) return join(homedir(), path.slice(2));\n if (isAbsolute(path) || await found(path)) return path;\n const fromCwd = join(cwd, path);\n if (await found(fromCwd)) return fromCwd;\n const tail = path.replace(/^(?:\\.\\/)+/, \"\");\n const listed = await listRepoFiles(root);\n if (!listed || listed.truncated) return path;\n const matches = listed.files.filter((f) => f.endsWith(`/${tail}`));\n return matches.length === 1 ? matches[0] : path;\n}\nasync function listRepoFiles(root) {\n const out = await git([\"ls-files\", \"-z\", \"--cached\", \"--others\", \"--exclude-standard\"], root);\n if (out === null) return null;\n const files = [...new Set(out.split(\"\\0\").filter(Boolean))];\n return { files: files.slice(0, LIST_LIMIT), truncated: files.length > LIST_LIMIT };\n}\nexport {\n FileAccessError as F,\n locateProjectFile as a,\n readProjectImage as b,\n readProjectFile as c,\n listDir as d,\n filesRoot as f,\n isInside as i,\n listRepoFiles as l,\n resolveInRoot as r\n};\n//# sourceMappingURL=files.js.map\n"],"mappings":"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"}
|
|
@@ -2,12 +2,12 @@ import { t as pageOriginAllowed } from "./page-origin-D7IqosUS.js";
|
|
|
2
2
|
import { t as writeFileAtomic } from "./atomic-write-CPI0lZzV.js";
|
|
3
3
|
import { t as ProjectReportSchema } from "./fleet-projects-WVLUrgJA.js";
|
|
4
4
|
import { n as PluginsReportSchema } from "./fleet-plugins-DxkFZ20N.js";
|
|
5
|
-
import { c as eachOf, d as mergePrefs, i as PlainPaneSchema, l as isPrefKey, r as PastSessionSchema, u as isServerOnlyKey } from "./ws-messages-
|
|
5
|
+
import { c as eachOf, d as mergePrefs, i as PlainPaneSchema, l as isPrefKey, r as PastSessionSchema, u as isServerOnlyKey } from "./ws-messages-B81v2RXg.js";
|
|
6
6
|
import { i as relayRefusal, n as protocolOf } from "./fleet-protocol-C9L7S3-l.js";
|
|
7
7
|
import { n as CLAUDE_MUX_DIR } from "./paths-oZtLkDBD.js";
|
|
8
8
|
import { t as MACHINE_ID } from "./instance-CjKmUYwD.js";
|
|
9
|
-
import { r as rememberMachines, t as discoverServers } from "./discover-
|
|
10
|
-
import { r as sessionsWsManager } from "./ws-managers-
|
|
9
|
+
import { r as rememberMachines, t as discoverServers } from "./discover-DykzHz0t.js";
|
|
10
|
+
import { r as sessionsWsManager } from "./ws-managers-CsT346dr.js";
|
|
11
11
|
import { join } from "node:path";
|
|
12
12
|
import { readFileSync } from "node:fs";
|
|
13
13
|
// .svelte-kit/adapter-bun/chunks/fleet.js
|
|
@@ -759,4 +759,4 @@ function relayGate(machine, path) {
|
|
|
759
759
|
}
|
|
760
760
|
export { isPeerLink as a, relayGate as c, ensureFleetState as i, relayRequest as l, admitRelay as n, openRelayUpstream as o, ensureFleetPrefs as r, parseFleetPath as s, FORWARDED_HEADER as t };
|
|
761
761
|
|
|
762
|
-
//# sourceMappingURL=fleet-
|
|
762
|
+
//# sourceMappingURL=fleet-OhxUuYh1.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fleet-DZJSFWuH.js","names":[],"sources":["../../../../web/.svelte-kit/adapter-bun/chunks/fleet.js"],"sourcesContent":["import { join } from \"node:path\";\nimport { readFileSync } from \"node:fs\";\nimport { w as writeFileAtomic } from \"./atomic-write.js\";\nimport { P as ProjectReportSchema } from \"./fleet-projects.js\";\nimport { e as eachOf, f as PastSessionSchema, g as PlainPaneSchema, m as mergePrefs, i as isServerOnlyKey, h as isPrefKey } from \"./ws-messages.js\";\nimport { p as pageOriginAllowed } from \"./page-origin.js\";\nimport { p as protocolOf, r as relayRefusal } from \"./fleet-protocol.js\";\nimport { P as PluginsReportSchema } from \"./fleet-plugins.js\";\nimport { C as CLAUDE_MUX_DIR } from \"./paths.js\";\nimport { M as MACHINE_ID } from \"./instance.js\";\nimport { r as rememberMachines, d as discoverServers } from \"./discover.js\";\nimport { s as sessionsWsManager } from \"./ws-managers.js\";\nconst FORWARDED_HEADER = \"x-claude-mux-forwarded\";\nconst RESPONSE_TIMEOUT_MS = 12e4;\nfunction parseFleetPath(pathname) {\n const match = pathname.match(/^\\/fleet\\/([^/]+)(\\/api(?:\\/.*)?)$/);\n if (!match) return null;\n let machine;\n try {\n machine = decodeURIComponent(match[1]);\n } catch {\n return null;\n }\n return { machine, path: match[2] };\n}\nfunction errorResponse(status, error, machine) {\n return new Response(JSON.stringify({ error, machine }), {\n status,\n headers: { \"content-type\": \"application/json\" }\n });\n}\nconst REQUEST_HOP_HEADERS = /* @__PURE__ */ new Set([\n \"host\",\n \"origin\",\n \"referer\",\n \"connection\",\n \"keep-alive\",\n \"upgrade\",\n \"transfer-encoding\",\n \"content-length\",\n \"accept-encoding\",\n \"te\",\n \"trailer\",\n \"proxy-connection\",\n \"proxy-authorization\"\n]);\nconst RESPONSE_HOP_HEADERS = /* @__PURE__ */ new Set([\n \"connection\",\n \"keep-alive\",\n \"transfer-encoding\",\n \"content-encoding\",\n \"content-length\"\n]);\nasync function admitRelay(origin, host, target, resolve, gate) {\n const { machine } = target;\n if (!pageOriginAllowed(origin, host)) return errorResponse(403, \"cross-origin request refused\", machine);\n const base = await resolve(machine);\n if (!base) return errorResponse(404, \"unknown machine\", machine);\n const refused = gate?.(machine, target.path);\n return refused ? errorResponse(426, refused, machine) : base;\n}\nasync function relayRequest(request, target, resolve, self, gate) {\n const base = await admitRelay(request.headers.get(\"origin\"), request.headers.get(\"host\"), target, resolve, gate);\n if (typeof base !== \"string\") return base;\n const headers = new Headers();\n request.headers.forEach((value, name) => {\n if (!REQUEST_HOP_HEADERS.has(name.toLowerCase())) headers.set(name, value);\n });\n headers.set(FORWARDED_HEADER, self);\n headers.set(\"origin\", new URL(base).origin);\n const hasBody = request.method !== \"GET\" && request.method !== \"HEAD\";\n const body = hasBody ? await request.arrayBuffer() : void 0;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), RESPONSE_TIMEOUT_MS);\n let response;\n try {\n response = await fetch(`${base}${target.path}${new URL(request.url).search}`, {\n method: request.method,\n headers,\n body,\n redirect: \"manual\",\n // A page that goes away mid-request takes the owner's request with it.\n signal: AbortSignal.any([controller.signal, request.signal])\n });\n } catch {\n return errorResponse(502, \"machine unreachable\", target.machine);\n } finally {\n clearTimeout(timer);\n }\n const out = new Headers();\n response.headers.forEach((value, name) => {\n if (!RESPONSE_HOP_HEADERS.has(name.toLowerCase())) out.append(name, value);\n });\n const location = out.get(\"location\");\n if (location?.startsWith(\"/api/\")) out.set(\"location\", `/fleet/${encodeURIComponent(target.machine)}${location}`);\n return new Response(response.body, { status: response.status, statusText: response.statusText, headers: out });\n}\nconst UNREACHABLE_CLOSE = 1014;\nfunction closeReason(reason) {\n const encoder = new TextEncoder();\n let out = reason;\n while (encoder.encode(out).length > 123) out = [...out].slice(0, -1).join(\"\");\n return out;\n}\nfunction sendableCode(code) {\n if (code === 1e3 || code >= 3e3 && code <= 4999) return code;\n if (code >= 1001 && code <= 1003 || code >= 1007 && code <= 1014) return code;\n return 1e3;\n}\nconst FLEET_STATE_SENDER = \"fleet-state\";\nfunction isPeerLink(origin, forwarded) {\n return !origin && forwarded === FLEET_STATE_SENDER;\n}\nfunction openForwardedSocket(base, path, self) {\n const url = new URL(path, base);\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n return new WebSocket(url, { headers: { [FORWARDED_HEADER]: self } });\n}\nfunction openRelayUpstream(base, path, client, self) {\n const pending = [];\n let opened = false;\n let closed = false;\n let socket;\n const finish = (code, reason) => {\n if (closed) return;\n closed = true;\n try {\n client.close(sendableCode(code), closeReason(reason));\n } catch {\n }\n };\n try {\n socket = openForwardedSocket(base, path, self);\n } catch {\n finish(UNREACHABLE_CLOSE, \"machine unreachable\");\n return { send() {\n }, close() {\n } };\n }\n socket.binaryType = \"arraybuffer\";\n socket.addEventListener(\"open\", () => {\n opened = true;\n for (const data of pending.splice(0)) socket.send(data);\n });\n socket.addEventListener(\"message\", (event) => {\n if (closed) return;\n client.send(event.data);\n });\n socket.addEventListener(\"close\", (event) => {\n finish(opened ? event.code : UNREACHABLE_CLOSE, opened ? event.reason : \"machine unreachable\");\n });\n socket.addEventListener(\"error\", () => {\n if (!opened) finish(UNREACHABLE_CLOSE, \"machine unreachable\");\n });\n return {\n send(data) {\n if (closed) return;\n if (opened && socket.readyState === WebSocket.OPEN) socket.send(data);\n else pending.push(data);\n },\n close() {\n closed = true;\n if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) socket.close();\n }\n };\n}\nconst RETRY_MIN_MS = 5e3;\nconst RETRY_MAX_MS = 6e4;\nconst PING_MS = 15e3;\nconst SILENCE_MS = 4e4;\nconst PERSIST_DELAY_MS = 2e3;\nconst PERSIST_SEEN_MS = 6e4;\nfunction retryDelay(failures) {\n return Math.min(RETRY_MAX_MS, RETRY_MIN_MS * 2 ** Math.max(0, failures - 1));\n}\nclass FleetState {\n constructor(options) {\n this.options = options;\n this.selfId = options.selfId;\n this.connect = options.connect ?? connectPeer;\n this.readHealth = options.health ?? fetchHealth;\n this.now = options.now ?? Date.now;\n for (const { state, past } of this.restore()) {\n this.peers.set(state.id, { ...this.newPeer({ ...state, online: false, retryAt: null }), past });\n }\n }\n options;\n peers = /* @__PURE__ */ new Map();\n listeners = /* @__PURE__ */ new Set();\n pastListeners = /* @__PURE__ */ new Set();\n persistTimer = null;\n persistedAt = 0;\n stopped = false;\n connect;\n readHealth;\n now;\n selfId;\n /** The machines restored from disk or found since, for the relay to know their addresses. */\n addresses() {\n return [...this.peers.values()].map(({ state }) => ({ id: state.id, hostname: state.hostname, url: state.url }));\n }\n /**\n * Follow the machines discovery found. A new one is connected at once, one\n * whose address changed is reconnected there, and one missing from the list\n * is kept: a machine that is off drops out of discovery, and its last known\n * state is what the page should keep showing. Machines restored from disk\n * and not yet tried are tried now.\n */\n update(found) {\n if (this.stopped) return;\n let changed = false;\n for (const address of found) {\n if (!address.id || address.id === this.options.selfId) continue;\n for (const other of [...this.peers.values()]) {\n if (other.state.url === address.url && other.state.id !== address.id) {\n this.rekey(other, address.id);\n changed = true;\n }\n }\n const peer = this.peers.get(address.id);\n if (!peer) {\n this.peers.set(address.id, this.newPeer(emptyState(address)));\n changed = true;\n continue;\n }\n if (peer.state.hostname !== address.hostname) {\n peer.state = { ...peer.state, hostname: address.hostname };\n changed = true;\n }\n if (peer.state.url !== address.url) {\n peer.state = { ...peer.state, url: address.url };\n this.drop(peer);\n peer.failures = 0;\n changed = true;\n }\n }\n for (const peer of this.peers.values()) {\n if (!peer.link && !peer.retryTimer) this.open(peer);\n }\n if (changed) this.changed();\n }\n /** Try a machine that is offline now rather than when its wait is up. False for one nobody knows. */\n retryNow(id) {\n const peer = this.peers.get(id);\n if (!peer) return false;\n if (peer.state.online || this.stopped) return true;\n this.drop(peer);\n peer.failures = 0;\n this.open(peer);\n return true;\n }\n /** One machine's state by its id, or null for one nobody knows. */\n machine(id) {\n return this.peers.get(id)?.state ?? null;\n }\n /** Every other machine, by name. */\n snapshot() {\n return [...this.peers.values()].map((p) => p.state).sort((a, b) => a.hostname.localeCompare(b.hostname) || a.id.localeCompare(b.id));\n }\n /**\n * Every other machine's past sessions, by machine id: what it listed last,\n * kept while it is off so its conversations stay on the page.\n */\n past() {\n const out = {};\n for (const [id, peer] of this.peers) out[id] = peer.past;\n return out;\n }\n /** Called after a machine's past sessions change. Returns the unsubscribe. */\n subscribePast(listener) {\n this.pastListeners.add(listener);\n return () => this.pastListeners.delete(listener);\n }\n /** Called after every change to the snapshot. Returns the unsubscribe. */\n subscribe(listener) {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n /** Close every link, cancel every timer and write what is known. */\n stop() {\n this.stopped = true;\n for (const peer of this.peers.values()) this.drop(peer);\n if (this.persistTimer) clearTimeout(this.persistTimer);\n this.persistTimer = null;\n this.persist();\n }\n newPeer(state) {\n return { state, link: null, failures: 0, retryTimer: null, pingTimer: null, lastFrame: null, past: [] };\n }\n open(peer) {\n if (this.stopped) return;\n if (peer.state.retryAt !== null) {\n peer.state = { ...peer.state, retryAt: null };\n this.changed();\n }\n const link = this.connect(peer.state.url, {\n open: () => {\n if (peer.link !== link) return;\n peer.failures = 0;\n this.heard(peer);\n let healthKnown = false;\n const readHealth = () => void this.readHealth(peer.state.url).catch(() => null).then((health) => {\n if (peer.link !== link) return;\n const moved = !!health?.instance && health.instance !== peer.state.id;\n if (moved) {\n this.rekey(peer, health.instance);\n if (peer.link !== link) return this.changed();\n }\n const patch = peer.state.online ? {} : { online: true };\n if (health) {\n healthKnown = true;\n const version = health.version ?? peer.state.version;\n if (version !== peer.state.version || health.protocol !== peer.state.protocol) {\n Object.assign(patch, { version, protocol: health.protocol });\n }\n }\n if (moved || Object.keys(patch).length > 0) this.setState(peer, patch);\n });\n peer.pingTimer = setInterval(() => {\n if (this.now() - (peer.state.lastSeen ?? 0) > SILENCE_MS) {\n this.lost(peer, link);\n return;\n }\n link.send(\"ping\");\n if (!healthKnown) readHealth();\n }, PING_MS);\n readHealth();\n },\n message: (data) => {\n if (peer.link !== link) return;\n this.heard(peer);\n this.receive(peer, data);\n },\n close: () => this.lost(peer, link)\n });\n peer.link = link;\n }\n /**\n * A peer that is quiet but answering pings changes nothing anyone sees, so\n * its newer last-seen is only written to disk, once a minute at most.\n */\n heard(peer) {\n peer.state = { ...peer.state, lastSeen: this.now() };\n if (this.now() - this.persistedAt > PERSIST_SEEN_MS) this.schedulePersist();\n }\n /** A link that closed, failed, or went silent: the machine is offline until the next attempt answers. */\n lost(peer, link) {\n if (peer.link !== link) return;\n this.drop(peer);\n if (this.stopped) return;\n peer.failures++;\n const delay = retryDelay(peer.failures);\n peer.retryTimer = setTimeout(() => {\n peer.retryTimer = null;\n this.open(peer);\n }, delay);\n this.setState(peer, { online: false, retryAt: this.now() + delay });\n }\n /**\n * Move a record to the id its address now reports (a machine whose id\n * changed, such as one that began to persist it). When a record is already\n * kept under that id the two become one: the one with a link keeps it (the\n * record under the new id when both or neither have one), the other is let\n * go, and what they knew comes from whichever was heard from last. An\n * address that turns out to be this machine is dropped altogether.\n */\n rekey(peer, id) {\n if (this.peers.get(peer.state.id) === peer) this.peers.delete(peer.state.id);\n if (id === this.options.selfId) {\n this.drop(peer);\n this.pastChanged();\n return;\n }\n const existing = this.peers.get(id);\n let kept = peer;\n if (existing && existing !== peer) {\n kept = peer.link && !existing.link ? peer : existing;\n const other = kept === peer ? existing : peer;\n this.drop(other);\n const [fresher, staler] = (other.state.lastSeen ?? 0) > (kept.state.lastSeen ?? 0) ? [other, kept] : [kept, other];\n const { url, online, retryAt } = kept.state;\n kept.state = { ...fresher.state, url, online, retryAt };\n kept.past = fresher.past.length > 0 ? fresher.past : staler.past;\n kept.lastFrame = null;\n }\n kept.state = { ...kept.state, id };\n this.peers.set(id, kept);\n this.pastChanged();\n }\n /** Let go of a peer's link and timers without touching its state. */\n drop(peer) {\n const link = peer.link;\n peer.link = null;\n peer.lastFrame = null;\n if (peer.pingTimer) clearInterval(peer.pingTimer);\n if (peer.retryTimer) clearTimeout(peer.retryTimer);\n peer.pingTimer = null;\n peer.retryTimer = null;\n if (link) {\n try {\n link.close();\n } catch {\n }\n }\n }\n receive(peer, data) {\n if (data === \"pong\") return;\n let msg;\n try {\n msg = JSON.parse(data);\n } catch {\n return;\n }\n if (msg?.type === \"prefs\") {\n this.options.prefs?.(msg.prefs);\n return;\n }\n if (msg?.type === \"past\") {\n const sessions = msg.sessions;\n if (!Array.isArray(sessions)) return;\n const past = PastSchema.parse(sessions);\n if (JSON.stringify(past) === JSON.stringify(peer.past)) return;\n peer.past = past;\n this.pastChanged();\n return;\n }\n if (msg?.type !== \"sessions\" && msg?.type !== \"connected\") return;\n if (!Array.isArray(msg.sessions)) return;\n const pluginsAt = msg.plugins?.readAt;\n const frame = JSON.stringify([msg.sessions, msg.panes, msg.projects, msg.projectReports, msg.inbox, pluginsAt]);\n if (frame === peer.lastFrame) return;\n peer.lastFrame = frame;\n this.setState(peer, {\n sessions: msg.sessions,\n // An older broadcast may leave these out; what was known stands.\n ...Array.isArray(msg.projects) ? { projects: msg.projects.filter((p) => typeof p === \"string\") } : {},\n ...Array.isArray(msg.projectReports) ? { projectReports: ReportsSchema.parse(msg.projectReports) } : {},\n ...Array.isArray(msg.panes) ? { panes: PanesSchema.parse(msg.panes) } : {},\n ...Array.isArray(msg.inbox) ? { inbox: msg.inbox } : {},\n ...msg.plugins && pluginsAt !== peer.state.plugins?.readAt ? { plugins: readPlugins(msg.plugins) ?? peer.state.plugins } : {}\n });\n }\n setState(peer, patch) {\n peer.state = { ...peer.state, ...patch };\n this.changed();\n }\n changed() {\n this.notify(this.listeners, \"listener\");\n }\n pastChanged() {\n this.notify(this.pastListeners, \"past listener\");\n }\n notify(listeners, what) {\n for (const listener of listeners) {\n try {\n listener();\n } catch (err) {\n console.error(`[fleet] ${what} failed:`, err);\n }\n }\n this.schedulePersist();\n }\n schedulePersist() {\n if (this.options.path && !this.persistTimer && !this.stopped) {\n this.persistTimer = setTimeout(() => {\n this.persistTimer = null;\n this.persist();\n }, PERSIST_DELAY_MS);\n }\n }\n persist() {\n const path = this.options.path;\n if (!path) return;\n this.persistedAt = this.now();\n const body = {\n machines: this.snapshot().map(({ online: _online, retryAt: _retryAt, ...kept }) => ({\n ...kept,\n past: this.peers.get(kept.id)?.past ?? []\n }))\n };\n try {\n writeFileAtomic(path, JSON.stringify(body));\n } catch (err) {\n console.error(\"[fleet] could not write\", path, err);\n }\n }\n restore() {\n const path = this.options.path;\n if (!path) return [];\n let saved;\n try {\n saved = JSON.parse(readFileSync(path, \"utf8\"));\n } catch {\n return [];\n }\n if (!Array.isArray(saved?.machines)) return [];\n return saved.machines.filter((m) => m && typeof m.id === \"string\" && typeof m.url === \"string\" && m.id !== this.options.selfId).map((m) => ({\n state: {\n ...emptyState({ id: m.id, hostname: String(m.hostname ?? m.id), url: m.url }),\n lastSeen: typeof m.lastSeen === \"number\" ? m.lastSeen : null,\n version: typeof m.version === \"string\" ? m.version : null,\n protocol: typeof m.protocol === \"number\" ? m.protocol : null,\n sessions: Array.isArray(m.sessions) ? m.sessions : [],\n projects: Array.isArray(m.projects) ? m.projects : [],\n projectReports: Array.isArray(m.projectReports) ? ReportsSchema.parse(m.projectReports) : [],\n panes: Array.isArray(m.panes) ? PanesSchema.parse(m.panes) : [],\n inbox: Array.isArray(m.inbox) ? m.inbox : [],\n plugins: readPlugins(m.plugins)\n },\n past: Array.isArray(m.past) ? PastSchema.parse(m.past) : []\n }));\n }\n}\nfunction emptyState(address) {\n return {\n id: address.id,\n hostname: address.hostname,\n url: address.url,\n online: false,\n lastSeen: null,\n retryAt: null,\n version: null,\n protocol: null,\n sessions: [],\n projects: [],\n projectReports: [],\n panes: [],\n inbox: [],\n plugins: null\n };\n}\nfunction readPlugins(raw) {\n const parsed = PluginsReportSchema.safeParse(raw);\n return parsed.success ? parsed.data : null;\n}\nconst ReportsSchema = eachOf(ProjectReportSchema);\nconst PastSchema = eachOf(PastSessionSchema);\nconst PanesSchema = eachOf(PlainPaneSchema);\nconst CONNECT_TIMEOUT_MS = 1e4;\nfunction connectPeer(url, handlers) {\n let socket;\n try {\n socket = openForwardedSocket(url, \"/api/sessions/stream\", FLEET_STATE_SENDER);\n } catch {\n queueMicrotask(handlers.close);\n return { send() {\n }, close() {\n } };\n }\n const timer = setTimeout(() => socket.close(), CONNECT_TIMEOUT_MS);\n socket.addEventListener(\"open\", () => {\n clearTimeout(timer);\n handlers.open();\n });\n socket.addEventListener(\"message\", (event) => {\n if (typeof event.data === \"string\") handlers.message(event.data);\n });\n socket.addEventListener(\"close\", () => {\n clearTimeout(timer);\n handlers.close();\n });\n socket.addEventListener(\"error\", () => {\n clearTimeout(timer);\n handlers.close();\n });\n return {\n send(data) {\n if (socket.readyState === WebSocket.OPEN) socket.send(data);\n },\n close() {\n clearTimeout(timer);\n if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) socket.close();\n }\n };\n}\nasync function fetchHealth(url) {\n try {\n const res = await fetch(new URL(\"/api/health\", url), { signal: AbortSignal.timeout(5e3) });\n if (!res.ok) return null;\n const data = await res.json();\n return {\n version: typeof data.version === \"string\" ? data.version : null,\n protocol: protocolOf(data),\n instance: typeof data.instance === \"string\" && data.instance ? data.instance : null\n };\n } catch {\n return null;\n }\n}\nclass FleetPrefsStore {\n constructor(options) {\n this.options = options;\n this.now = options.now ?? Date.now;\n this.prefs = mergePrefs({}, this.restore()).prefs;\n }\n options;\n prefs;\n listeners = /* @__PURE__ */ new Set();\n now;\n all() {\n return this.prefs;\n }\n /** The set without the keys the servers keep among themselves (`isServerOnlyKey()`): what a page is sent. */\n forPages() {\n return Object.fromEntries(Object.entries(this.prefs).filter(([key]) => !isServerOnlyKey(key)));\n }\n /**\n * A page's write. A clock that reads earlier than the entry it replaces\n * (another machine's, a little ahead) is moved past it, so the write a\n * person just made is never lost to the one before it. False for a key or\n * value that cannot be kept.\n */\n set(key, value) {\n return this.setAll({ [key]: value });\n }\n /** Several writes as one change, so the set is written and sent once; false, writing nothing, if any cannot be kept. */\n setAll(values) {\n const entries = Object.entries(values);\n if (entries.some(([key, value]) => !isPrefKey(key) || value === void 0)) return false;\n if (entries.length === 0) return true;\n const prefs = { ...this.prefs };\n for (const [key, value] of entries) {\n const at = Math.max(this.now(), (prefs[key]?.at ?? 0) + 1);\n prefs[key] = { value, at, by: this.options.selfId };\n }\n this.prefs = prefs;\n this.changed();\n return true;\n }\n /** Another machine's set; true when anything in it was newer. */\n merge(incoming) {\n const { prefs, changed } = mergePrefs(this.prefs, incoming);\n if (changed.length === 0) return false;\n this.prefs = prefs;\n this.changed();\n return true;\n }\n /** Called after every change. Returns the unsubscribe. */\n subscribe(listener) {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n changed() {\n this.persist();\n for (const listener of this.listeners) {\n try {\n listener();\n } catch (err) {\n console.error(\"[fleet-prefs] listener failed:\", err);\n }\n }\n }\n /**\n * The file is read and merged before it is written: a dev server beside\n * the prod one shares the file and the machine id, follows neither, and\n * would otherwise drop the other's writes from it with its own.\n */\n persist() {\n const path = this.options.path;\n if (!path) return;\n this.prefs = mergePrefs(this.prefs, this.restore()).prefs;\n try {\n writeFileAtomic(path, JSON.stringify({ prefs: this.prefs }));\n } catch (err) {\n console.error(\"[fleet-prefs] could not write\", path, err);\n }\n }\n restore() {\n const path = this.options.path;\n if (!path) return {};\n try {\n return JSON.parse(readFileSync(path, \"utf8\")).prefs;\n } catch {\n return {};\n }\n }\n}\nconst REDISCOVER_MS = 6e4;\nfunction ensureFleetPrefs() {\n const g = globalThis;\n if (g.__claudeMuxFleetPrefs) return g.__claudeMuxFleetPrefs;\n const prefs = new FleetPrefsStore({ selfId: MACHINE_ID, path: join(CLAUDE_MUX_DIR, \"fleet-prefs.json\") });\n g.__claudeMuxFleetPrefs = prefs;\n sessionsWsManager.setPrefsSource(prefs);\n return prefs;\n}\nfunction ensureFleetState() {\n const g = globalThis;\n if (g.__claudeMuxFleetState) return g.__claudeMuxFleetState;\n const prefs = ensureFleetPrefs();\n const state = new FleetState({\n selfId: MACHINE_ID,\n path: join(CLAUDE_MUX_DIR, \"fleet.json\"),\n prefs: (incoming) => prefs.merge(incoming)\n });\n g.__claudeMuxFleetState = state;\n rememberMachines(state.addresses());\n sessionsWsManager.setFleetSource(state);\n const discover = () => discoverServers().then((found) => state.update(found.servers)).catch((err) => console.error(\"[fleet] discovery failed:\", err));\n void discover();\n setInterval(discover, REDISCOVER_MS).unref?.();\n return state;\n}\nfunction relayGate(machine, path) {\n return relayRefusal(ensureFleetState().machine(machine), path);\n}\nexport {\n FORWARDED_HEADER as F,\n admitRelay as a,\n relayGate as b,\n ensureFleetPrefs as c,\n ensureFleetState as e,\n isPeerLink as i,\n openRelayUpstream as o,\n parseFleetPath as p,\n relayRequest as r\n};\n//# sourceMappingURL=fleet.js.map\n"],"mappings":";;;;;;;;;;;;;AAYA,MAAM,mBAAmB;AACzB,MAAM,sBAAsB;AAC5B,SAAS,eAAe,UAAU;CAChC,MAAM,QAAQ,SAAS,MAAM,oCAAoC;CACjE,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI;CACJ,IAAI;EACF,UAAU,mBAAmB,MAAM,EAAE;CACvC,QAAQ;EACN,OAAO;CACT;CACA,OAAO;EAAE;EAAS,MAAM,MAAM;CAAG;AACnC;AACA,SAAS,cAAc,QAAQ,OAAO,SAAS;CAC7C,OAAO,IAAI,SAAS,KAAK,UAAU;EAAE;EAAO;CAAQ,CAAC,GAAG;EACtD;EACA,SAAS,EAAE,gBAAgB,mBAAmB;CAChD,CAAC;AACH;AACA,MAAM,sCAAsC,IAAI,IAAI;CAClD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AACD,MAAM,uCAAuC,IAAI,IAAI;CACnD;CACA;CACA;CACA;CACA;AACF,CAAC;AACD,eAAe,WAAW,QAAQ,MAAM,QAAQ,SAAS,MAAM;CAC7D,MAAM,EAAE,YAAY;CACpB,IAAI,CAAC,kBAAkB,QAAQ,IAAI,GAAG,OAAO,cAAc,KAAK,gCAAgC,OAAO;CACvG,MAAM,OAAO,MAAM,QAAQ,OAAO;CAClC,IAAI,CAAC,MAAM,OAAO,cAAc,KAAK,mBAAmB,OAAO;CAC/D,MAAM,UAAU,OAAO,SAAS,OAAO,IAAI;CAC3C,OAAO,UAAU,cAAc,KAAK,SAAS,OAAO,IAAI;AAC1D;AACA,eAAe,aAAa,SAAS,QAAQ,SAAS,MAAM,MAAM;CAChE,MAAM,OAAO,MAAM,WAAW,QAAQ,QAAQ,IAAI,QAAQ,GAAG,QAAQ,QAAQ,IAAI,MAAM,GAAG,QAAQ,SAAS,IAAI;CAC/G,IAAI,OAAO,SAAS,UAAU,OAAO;CACrC,MAAM,UAAU,IAAI,QAAQ;CAC5B,QAAQ,QAAQ,SAAS,OAAO,SAAS;EACvC,IAAI,CAAC,oBAAoB,IAAI,KAAK,YAAY,CAAC,GAAG,QAAQ,IAAI,MAAM,KAAK;CAC3E,CAAC;CACD,QAAQ,IAAI,kBAAkB,IAAI;CAClC,QAAQ,IAAI,UAAU,IAAI,IAAI,IAAI,CAAC,CAAC,MAAM;CAE1C,MAAM,OADU,QAAQ,WAAW,SAAS,QAAQ,WAAW,SACxC,MAAM,QAAQ,YAAY,IAAI,KAAK;CAC1D,MAAM,aAAa,IAAI,gBAAgB;CACvC,MAAM,QAAQ,iBAAiB,WAAW,MAAM,GAAG,mBAAmB;CACtE,IAAI;CACJ,IAAI;EACF,WAAW,MAAM,MAAM,GAAG,OAAO,OAAO,OAAO,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC,UAAU;GAC5E,QAAQ,QAAQ;GAChB;GACA;GACA,UAAU;GAEV,QAAQ,YAAY,IAAI,CAAC,WAAW,QAAQ,QAAQ,MAAM,CAAC;EAC7D,CAAC;CACH,QAAQ;EACN,OAAO,cAAc,KAAK,uBAAuB,OAAO,OAAO;CACjE,UAAU;EACR,aAAa,KAAK;CACpB;CACA,MAAM,MAAM,IAAI,QAAQ;CACxB,SAAS,QAAQ,SAAS,OAAO,SAAS;EACxC,IAAI,CAAC,qBAAqB,IAAI,KAAK,YAAY,CAAC,GAAG,IAAI,OAAO,MAAM,KAAK;CAC3E,CAAC;CACD,MAAM,WAAW,IAAI,IAAI,UAAU;CACnC,IAAI,UAAU,WAAW,OAAO,GAAG,IAAI,IAAI,YAAY,UAAU,mBAAmB,OAAO,OAAO,IAAI,UAAU;CAChH,OAAO,IAAI,SAAS,SAAS,MAAM;EAAE,QAAQ,SAAS;EAAQ,YAAY,SAAS;EAAY,SAAS;CAAI,CAAC;AAC/G;AACA,MAAM,oBAAoB;AAC1B,SAAS,YAAY,QAAQ;CAC3B,MAAM,UAAU,IAAI,YAAY;CAChC,IAAI,MAAM;CACV,OAAO,QAAQ,OAAO,GAAG,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE;CAC5E,OAAO;AACT;AACA,SAAS,aAAa,MAAM;CAC1B,IAAI,SAAS,OAAO,QAAQ,OAAO,QAAQ,MAAM,OAAO;CACxD,IAAI,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,MAAM,OAAO;CACzE,OAAO;AACT;AACA,MAAM,qBAAqB;AAC3B,SAAS,WAAW,QAAQ,WAAW;CACrC,OAAO,CAAC,UAAU,cAAc;AAClC;AACA,SAAS,oBAAoB,MAAM,MAAM,MAAM;CAC7C,MAAM,MAAM,IAAI,IAAI,MAAM,IAAI;CAC9B,IAAI,WAAW,IAAI,aAAa,WAAW,SAAS;CACpD,OAAO,IAAI,UAAU,KAAK,EAAE,SAAS,GAAG,mBAAmB,KAAK,EAAE,CAAC;AACrE;AACA,SAAS,kBAAkB,MAAM,MAAM,QAAQ,MAAM;CACnD,MAAM,UAAU,CAAC;CACjB,IAAI,SAAS;CACb,IAAI,SAAS;CACb,IAAI;CACJ,MAAM,UAAU,MAAM,WAAW;EAC/B,IAAI,QAAQ;EACZ,SAAS;EACT,IAAI;GACF,OAAO,MAAM,aAAa,IAAI,GAAG,YAAY,MAAM,CAAC;EACtD,QAAQ,CACR;CACF;CACA,IAAI;EACF,SAAS,oBAAoB,MAAM,MAAM,IAAI;CAC/C,QAAQ;EACN,OAAO,mBAAmB,qBAAqB;EAC/C,OAAO;GAAE,OAAO,CAChB;GAAG,QAAQ,CACX;EAAE;CACJ;CACA,OAAO,aAAa;CACpB,OAAO,iBAAiB,cAAc;EACpC,SAAS;EACT,KAAK,MAAM,QAAQ,QAAQ,OAAO,CAAC,GAAG,OAAO,KAAK,IAAI;CACxD,CAAC;CACD,OAAO,iBAAiB,YAAY,UAAU;EAC5C,IAAI,QAAQ;EACZ,OAAO,KAAK,MAAM,IAAI;CACxB,CAAC;CACD,OAAO,iBAAiB,UAAU,UAAU;EAC1C,OAAO,SAAS,MAAM,OAAO,mBAAmB,SAAS,MAAM,SAAS,qBAAqB;CAC/F,CAAC;CACD,OAAO,iBAAiB,eAAe;EACrC,IAAI,CAAC,QAAQ,OAAO,mBAAmB,qBAAqB;CAC9D,CAAC;CACD,OAAO;EACL,KAAK,MAAM;GACT,IAAI,QAAQ;GACZ,IAAI,UAAU,OAAO,eAAe,UAAU,MAAM,OAAO,KAAK,IAAI;QAC/D,QAAQ,KAAK,IAAI;EACxB;EACA,QAAQ;GACN,SAAS;GACT,IAAI,OAAO,eAAe,UAAU,QAAQ,OAAO,eAAe,UAAU,YAAY,OAAO,MAAM;EACvG;CACF;AACF;AACA,MAAM,eAAe;AACrB,MAAM,eAAe;AACrB,MAAM,UAAU;AAChB,MAAM,aAAa;AACnB,MAAM,mBAAmB;AACzB,MAAM,kBAAkB;AACxB,SAAS,WAAW,UAAU;CAC5B,OAAO,KAAK,IAAI,cAAc,eAAe,KAAK,KAAK,IAAI,GAAG,WAAW,CAAC,CAAC;AAC7E;AACA,IAAM,aAAN,MAAiB;CACf,YAAY,SAAS;EACnB,KAAK,UAAU;EACf,KAAK,SAAS,QAAQ;EACtB,KAAK,UAAU,QAAQ,WAAW;EAClC,KAAK,aAAa,QAAQ,UAAU;EACpC,KAAK,MAAM,QAAQ,OAAO,KAAK;EAC/B,KAAK,MAAM,EAAE,OAAO,UAAU,KAAK,QAAQ,GACzC,KAAK,MAAM,IAAI,MAAM,IAAI;GAAE,GAAG,KAAK,QAAQ;IAAE,GAAG;IAAO,QAAQ;IAAO,SAAS;GAAK,CAAC;GAAG;EAAK,CAAC;CAElG;CACA;CACA,wBAAwB,IAAI,IAAI;CAChC,4BAA4B,IAAI,IAAI;CACpC,gCAAgC,IAAI,IAAI;CACxC,eAAe;CACf,cAAc;CACd,UAAU;CACV;CACA;CACA;CACA;;CAEA,YAAY;EACV,OAAO,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,aAAa;GAAE,IAAI,MAAM;GAAI,UAAU,MAAM;GAAU,KAAK,MAAM;EAAI,EAAE;CACjH;;;;;;;;CAQA,OAAO,OAAO;EACZ,IAAI,KAAK,SAAS;EAClB,IAAI,UAAU;EACd,KAAK,MAAM,WAAW,OAAO;GAC3B,IAAI,CAAC,QAAQ,MAAM,QAAQ,OAAO,KAAK,QAAQ,QAAQ;GACvD,KAAK,MAAM,SAAS,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC,GACzC,IAAI,MAAM,MAAM,QAAQ,QAAQ,OAAO,MAAM,MAAM,OAAO,QAAQ,IAAI;IACpE,KAAK,MAAM,OAAO,QAAQ,EAAE;IAC5B,UAAU;GACZ;GAEF,MAAM,OAAO,KAAK,MAAM,IAAI,QAAQ,EAAE;GACtC,IAAI,CAAC,MAAM;IACT,KAAK,MAAM,IAAI,QAAQ,IAAI,KAAK,QAAQ,WAAW,OAAO,CAAC,CAAC;IAC5D,UAAU;IACV;GACF;GACA,IAAI,KAAK,MAAM,aAAa,QAAQ,UAAU;IAC5C,KAAK,QAAQ;KAAE,GAAG,KAAK;KAAO,UAAU,QAAQ;IAAS;IACzD,UAAU;GACZ;GACA,IAAI,KAAK,MAAM,QAAQ,QAAQ,KAAK;IAClC,KAAK,QAAQ;KAAE,GAAG,KAAK;KAAO,KAAK,QAAQ;IAAI;IAC/C,KAAK,KAAK,IAAI;IACd,KAAK,WAAW;IAChB,UAAU;GACZ;EACF;EACA,KAAK,MAAM,QAAQ,KAAK,MAAM,OAAO,GACnC,IAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,YAAY,KAAK,KAAK,IAAI;EAEpD,IAAI,SAAS,KAAK,QAAQ;CAC5B;;CAEA,SAAS,IAAI;EACX,MAAM,OAAO,KAAK,MAAM,IAAI,EAAE;EAC9B,IAAI,CAAC,MAAM,OAAO;EAClB,IAAI,KAAK,MAAM,UAAU,KAAK,SAAS,OAAO;EAC9C,KAAK,KAAK,IAAI;EACd,KAAK,WAAW;EAChB,KAAK,KAAK,IAAI;EACd,OAAO;CACT;;CAEA,QAAQ,IAAI;EACV,OAAO,KAAK,MAAM,IAAI,EAAE,CAAC,EAAE,SAAS;CACtC;;CAEA,WAAW;EACT,OAAO,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,SAAS,cAAc,EAAE,QAAQ,KAAK,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC;CACrI;;;;;CAKA,OAAO;EACL,MAAM,MAAM,CAAC;EACb,KAAK,MAAM,CAAC,IAAI,SAAS,KAAK,OAAO,IAAI,MAAM,KAAK;EACpD,OAAO;CACT;;CAEA,cAAc,UAAU;EACtB,KAAK,cAAc,IAAI,QAAQ;EAC/B,aAAa,KAAK,cAAc,OAAO,QAAQ;CACjD;;CAEA,UAAU,UAAU;EAClB,KAAK,UAAU,IAAI,QAAQ;EAC3B,aAAa,KAAK,UAAU,OAAO,QAAQ;CAC7C;;CAEA,OAAO;EACL,KAAK,UAAU;EACf,KAAK,MAAM,QAAQ,KAAK,MAAM,OAAO,GAAG,KAAK,KAAK,IAAI;EACtD,IAAI,KAAK,cAAc,aAAa,KAAK,YAAY;EACrD,KAAK,eAAe;EACpB,KAAK,QAAQ;CACf;CACA,QAAQ,OAAO;EACb,OAAO;GAAE;GAAO,MAAM;GAAM,UAAU;GAAG,YAAY;GAAM,WAAW;GAAM,WAAW;GAAM,MAAM,CAAC;EAAE;CACxG;CACA,KAAK,MAAM;EACT,IAAI,KAAK,SAAS;EAClB,IAAI,KAAK,MAAM,YAAY,MAAM;GAC/B,KAAK,QAAQ;IAAE,GAAG,KAAK;IAAO,SAAS;GAAK;GAC5C,KAAK,QAAQ;EACf;EACA,MAAM,OAAO,KAAK,QAAQ,KAAK,MAAM,KAAK;GACxC,YAAY;IACV,IAAI,KAAK,SAAS,MAAM;IACxB,KAAK,WAAW;IAChB,KAAK,MAAM,IAAI;IACf,IAAI,cAAc;IAClB,MAAM,mBAAmB,KAAK,KAAK,WAAW,KAAK,MAAM,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,MAAM,WAAW;KAC/F,IAAI,KAAK,SAAS,MAAM;KACxB,MAAM,QAAQ,CAAC,CAAC,QAAQ,YAAY,OAAO,aAAa,KAAK,MAAM;KACnE,IAAI,OAAO;MACT,KAAK,MAAM,MAAM,OAAO,QAAQ;MAChC,IAAI,KAAK,SAAS,MAAM,OAAO,KAAK,QAAQ;KAC9C;KACA,MAAM,QAAQ,KAAK,MAAM,SAAS,CAAC,IAAI,EAAE,QAAQ,KAAK;KACtD,IAAI,QAAQ;MACV,cAAc;MACd,MAAM,UAAU,OAAO,WAAW,KAAK,MAAM;MAC7C,IAAI,YAAY,KAAK,MAAM,WAAW,OAAO,aAAa,KAAK,MAAM,UACnE,OAAO,OAAO,OAAO;OAAE;OAAS,UAAU,OAAO;MAAS,CAAC;KAE/D;KACA,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,SAAS,MAAM,KAAK;IACvE,CAAC;IACD,KAAK,YAAY,kBAAkB;KACjC,IAAI,KAAK,IAAI,KAAK,KAAK,MAAM,YAAY,KAAK,YAAY;MACxD,KAAK,KAAK,MAAM,IAAI;MACpB;KACF;KACA,KAAK,KAAK,MAAM;KAChB,IAAI,CAAC,aAAa,WAAW;IAC/B,GAAG,OAAO;IACV,WAAW;GACb;GACA,UAAU,SAAS;IACjB,IAAI,KAAK,SAAS,MAAM;IACxB,KAAK,MAAM,IAAI;IACf,KAAK,QAAQ,MAAM,IAAI;GACzB;GACA,aAAa,KAAK,KAAK,MAAM,IAAI;EACnC,CAAC;EACD,KAAK,OAAO;CACd;;;;;CAKA,MAAM,MAAM;EACV,KAAK,QAAQ;GAAE,GAAG,KAAK;GAAO,UAAU,KAAK,IAAI;EAAE;EACnD,IAAI,KAAK,IAAI,IAAI,KAAK,cAAc,iBAAiB,KAAK,gBAAgB;CAC5E;;CAEA,KAAK,MAAM,MAAM;EACf,IAAI,KAAK,SAAS,MAAM;EACxB,KAAK,KAAK,IAAI;EACd,IAAI,KAAK,SAAS;EAClB,KAAK;EACL,MAAM,QAAQ,WAAW,KAAK,QAAQ;EACtC,KAAK,aAAa,iBAAiB;GACjC,KAAK,aAAa;GAClB,KAAK,KAAK,IAAI;EAChB,GAAG,KAAK;EACR,KAAK,SAAS,MAAM;GAAE,QAAQ;GAAO,SAAS,KAAK,IAAI,IAAI;EAAM,CAAC;CACpE;;;;;;;;;CASA,MAAM,MAAM,IAAI;EACd,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,EAAE,MAAM,MAAM,KAAK,MAAM,OAAO,KAAK,MAAM,EAAE;EAC3E,IAAI,OAAO,KAAK,QAAQ,QAAQ;GAC9B,KAAK,KAAK,IAAI;GACd,KAAK,YAAY;GACjB;EACF;EACA,MAAM,WAAW,KAAK,MAAM,IAAI,EAAE;EAClC,IAAI,OAAO;EACX,IAAI,YAAY,aAAa,MAAM;GACjC,OAAO,KAAK,QAAQ,CAAC,SAAS,OAAO,OAAO;GAC5C,MAAM,QAAQ,SAAS,OAAO,WAAW;GACzC,KAAK,KAAK,KAAK;GACf,MAAM,CAAC,SAAS,WAAW,MAAM,MAAM,YAAY,MAAM,KAAK,MAAM,YAAY,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK;GACjH,MAAM,EAAE,KAAK,QAAQ,YAAY,KAAK;GACtC,KAAK,QAAQ;IAAE,GAAG,QAAQ;IAAO;IAAK;IAAQ;GAAQ;GACtD,KAAK,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,OAAO,OAAO;GAC5D,KAAK,YAAY;EACnB;EACA,KAAK,QAAQ;GAAE,GAAG,KAAK;GAAO;EAAG;EACjC,KAAK,MAAM,IAAI,IAAI,IAAI;EACvB,KAAK,YAAY;CACnB;;CAEA,KAAK,MAAM;EACT,MAAM,OAAO,KAAK;EAClB,KAAK,OAAO;EACZ,KAAK,YAAY;EACjB,IAAI,KAAK,WAAW,cAAc,KAAK,SAAS;EAChD,IAAI,KAAK,YAAY,aAAa,KAAK,UAAU;EACjD,KAAK,YAAY;EACjB,KAAK,aAAa;EAClB,IAAI,MACF,IAAI;GACF,KAAK,MAAM;EACb,QAAQ,CACR;CAEJ;CACA,QAAQ,MAAM,MAAM;EAClB,IAAI,SAAS,QAAQ;EACrB,IAAI;EACJ,IAAI;GACF,MAAM,KAAK,MAAM,IAAI;EACvB,QAAQ;GACN;EACF;EACA,IAAI,KAAK,SAAS,SAAS;GACzB,KAAK,QAAQ,QAAQ,IAAI,KAAK;GAC9B;EACF;EACA,IAAI,KAAK,SAAS,QAAQ;GACxB,MAAM,WAAW,IAAI;GACrB,IAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;GAC9B,MAAM,OAAO,WAAW,MAAM,QAAQ;GACtC,IAAI,KAAK,UAAU,IAAI,MAAM,KAAK,UAAU,KAAK,IAAI,GAAG;GACxD,KAAK,OAAO;GACZ,KAAK,YAAY;GACjB;EACF;EACA,IAAI,KAAK,SAAS,cAAc,KAAK,SAAS,aAAa;EAC3D,IAAI,CAAC,MAAM,QAAQ,IAAI,QAAQ,GAAG;EAClC,MAAM,YAAY,IAAI,SAAS;EAC/B,MAAM,QAAQ,KAAK,UAAU;GAAC,IAAI;GAAU,IAAI;GAAO,IAAI;GAAU,IAAI;GAAgB,IAAI;GAAO;EAAS,CAAC;EAC9G,IAAI,UAAU,KAAK,WAAW;EAC9B,KAAK,YAAY;EACjB,KAAK,SAAS,MAAM;GAClB,UAAU,IAAI;GAEd,GAAG,MAAM,QAAQ,IAAI,QAAQ,IAAI,EAAE,UAAU,IAAI,SAAS,QAAQ,MAAM,OAAO,MAAM,QAAQ,EAAE,IAAI,CAAC;GACpG,GAAG,MAAM,QAAQ,IAAI,cAAc,IAAI,EAAE,gBAAgB,cAAc,MAAM,IAAI,cAAc,EAAE,IAAI,CAAC;GACtG,GAAG,MAAM,QAAQ,IAAI,KAAK,IAAI,EAAE,OAAO,YAAY,MAAM,IAAI,KAAK,EAAE,IAAI,CAAC;GACzE,GAAG,MAAM,QAAQ,IAAI,KAAK,IAAI,EAAE,OAAO,IAAI,MAAM,IAAI,CAAC;GACtD,GAAG,IAAI,WAAW,cAAc,KAAK,MAAM,SAAS,SAAS,EAAE,SAAS,YAAY,IAAI,OAAO,KAAK,KAAK,MAAM,QAAQ,IAAI,CAAC;EAC9H,CAAC;CACH;CACA,SAAS,MAAM,OAAO;EACpB,KAAK,QAAQ;GAAE,GAAG,KAAK;GAAO,GAAG;EAAM;EACvC,KAAK,QAAQ;CACf;CACA,UAAU;EACR,KAAK,OAAO,KAAK,WAAW,UAAU;CACxC;CACA,cAAc;EACZ,KAAK,OAAO,KAAK,eAAe,eAAe;CACjD;CACA,OAAO,WAAW,MAAM;EACtB,KAAK,MAAM,YAAY,WACrB,IAAI;GACF,SAAS;EACX,SAAS,KAAK;GACZ,QAAQ,MAAM,WAAW,KAAK,WAAW,GAAG;EAC9C;EAEF,KAAK,gBAAgB;CACvB;CACA,kBAAkB;EAChB,IAAI,KAAK,QAAQ,QAAQ,CAAC,KAAK,gBAAgB,CAAC,KAAK,SACnD,KAAK,eAAe,iBAAiB;GACnC,KAAK,eAAe;GACpB,KAAK,QAAQ;EACf,GAAG,gBAAgB;CAEvB;CACA,UAAU;EACR,MAAM,OAAO,KAAK,QAAQ;EAC1B,IAAI,CAAC,MAAM;EACX,KAAK,cAAc,KAAK,IAAI;EAC5B,MAAM,OAAO,EACX,UAAU,KAAK,SAAS,CAAC,CAAC,KAAK,EAAE,QAAQ,SAAS,SAAS,UAAU,GAAG,YAAY;GAClF,GAAG;GACH,MAAM,KAAK,MAAM,IAAI,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC;EAC1C,EAAE,EACJ;EACA,IAAI;GACF,gBAAgB,MAAM,KAAK,UAAU,IAAI,CAAC;EAC5C,SAAS,KAAK;GACZ,QAAQ,MAAM,2BAA2B,MAAM,GAAG;EACpD;CACF;CACA,UAAU;EACR,MAAM,OAAO,KAAK,QAAQ;EAC1B,IAAI,CAAC,MAAM,OAAO,CAAC;EACnB,IAAI;EACJ,IAAI;GACF,QAAQ,KAAK,MAAM,aAAa,MAAM,MAAM,CAAC;EAC/C,QAAQ;GACN,OAAO,CAAC;EACV;EACA,IAAI,CAAC,MAAM,QAAQ,OAAO,QAAQ,GAAG,OAAO,CAAC;EAC7C,OAAO,MAAM,SAAS,QAAQ,MAAM,KAAK,OAAO,EAAE,OAAO,YAAY,OAAO,EAAE,QAAQ,YAAY,EAAE,OAAO,KAAK,QAAQ,MAAM,CAAC,CAAC,KAAK,OAAO;GAC1I,OAAO;IACL,GAAG,WAAW;KAAE,IAAI,EAAE;KAAI,UAAU,OAAO,EAAE,YAAY,EAAE,EAAE;KAAG,KAAK,EAAE;IAAI,CAAC;IAC5E,UAAU,OAAO,EAAE,aAAa,WAAW,EAAE,WAAW;IACxD,SAAS,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU;IACrD,UAAU,OAAO,EAAE,aAAa,WAAW,EAAE,WAAW;IACxD,UAAU,MAAM,QAAQ,EAAE,QAAQ,IAAI,EAAE,WAAW,CAAC;IACpD,UAAU,MAAM,QAAQ,EAAE,QAAQ,IAAI,EAAE,WAAW,CAAC;IACpD,gBAAgB,MAAM,QAAQ,EAAE,cAAc,IAAI,cAAc,MAAM,EAAE,cAAc,IAAI,CAAC;IAC3F,OAAO,MAAM,QAAQ,EAAE,KAAK,IAAI,YAAY,MAAM,EAAE,KAAK,IAAI,CAAC;IAC9D,OAAO,MAAM,QAAQ,EAAE,KAAK,IAAI,EAAE,QAAQ,CAAC;IAC3C,SAAS,YAAY,EAAE,OAAO;GAChC;GACA,MAAM,MAAM,QAAQ,EAAE,IAAI,IAAI,WAAW,MAAM,EAAE,IAAI,IAAI,CAAC;EAC5D,EAAE;CACJ;AACF;AACA,SAAS,WAAW,SAAS;CAC3B,OAAO;EACL,IAAI,QAAQ;EACZ,UAAU,QAAQ;EAClB,KAAK,QAAQ;EACb,QAAQ;EACR,UAAU;EACV,SAAS;EACT,SAAS;EACT,UAAU;EACV,UAAU,CAAC;EACX,UAAU,CAAC;EACX,gBAAgB,CAAC;EACjB,OAAO,CAAC;EACR,OAAO,CAAC;EACR,SAAS;CACX;AACF;AACA,SAAS,YAAY,KAAK;CACxB,MAAM,SAAS,oBAAoB,UAAU,GAAG;CAChD,OAAO,OAAO,UAAU,OAAO,OAAO;AACxC;AACA,MAAM,gBAAgB,OAAO,mBAAmB;AAChD,MAAM,aAAa,OAAO,iBAAiB;AAC3C,MAAM,cAAc,OAAO,eAAe;AAC1C,MAAM,qBAAqB;AAC3B,SAAS,YAAY,KAAK,UAAU;CAClC,IAAI;CACJ,IAAI;EACF,SAAS,oBAAoB,KAAK,wBAAwB,kBAAkB;CAC9E,QAAQ;EACN,eAAe,SAAS,KAAK;EAC7B,OAAO;GAAE,OAAO,CAChB;GAAG,QAAQ,CACX;EAAE;CACJ;CACA,MAAM,QAAQ,iBAAiB,OAAO,MAAM,GAAG,kBAAkB;CACjE,OAAO,iBAAiB,cAAc;EACpC,aAAa,KAAK;EAClB,SAAS,KAAK;CAChB,CAAC;CACD,OAAO,iBAAiB,YAAY,UAAU;EAC5C,IAAI,OAAO,MAAM,SAAS,UAAU,SAAS,QAAQ,MAAM,IAAI;CACjE,CAAC;CACD,OAAO,iBAAiB,eAAe;EACrC,aAAa,KAAK;EAClB,SAAS,MAAM;CACjB,CAAC;CACD,OAAO,iBAAiB,eAAe;EACrC,aAAa,KAAK;EAClB,SAAS,MAAM;CACjB,CAAC;CACD,OAAO;EACL,KAAK,MAAM;GACT,IAAI,OAAO,eAAe,UAAU,MAAM,OAAO,KAAK,IAAI;EAC5D;EACA,QAAQ;GACN,aAAa,KAAK;GAClB,IAAI,OAAO,eAAe,UAAU,QAAQ,OAAO,eAAe,UAAU,YAAY,OAAO,MAAM;EACvG;CACF;AACF;AACA,eAAe,YAAY,KAAK;CAC9B,IAAI;EACF,MAAM,MAAM,MAAM,MAAM,IAAI,IAAI,eAAe,GAAG,GAAG,EAAE,QAAQ,YAAY,QAAQ,GAAG,EAAE,CAAC;EACzF,IAAI,CAAC,IAAI,IAAI,OAAO;EACpB,MAAM,OAAO,MAAM,IAAI,KAAK;EAC5B,OAAO;GACL,SAAS,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU;GAC3D,UAAU,WAAW,IAAI;GACzB,UAAU,OAAO,KAAK,aAAa,YAAY,KAAK,WAAW,KAAK,WAAW;EACjF;CACF,QAAQ;EACN,OAAO;CACT;AACF;AACA,IAAM,kBAAN,MAAsB;CACpB,YAAY,SAAS;EACnB,KAAK,UAAU;EACf,KAAK,MAAM,QAAQ,OAAO,KAAK;EAC/B,KAAK,QAAQ,WAAW,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC;CAC9C;CACA;CACA;CACA,4BAA4B,IAAI,IAAI;CACpC;CACA,MAAM;EACJ,OAAO,KAAK;CACd;;CAEA,WAAW;EACT,OAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,gBAAgB,GAAG,CAAC,CAAC;CAC/F;;;;;;;CAOA,IAAI,KAAK,OAAO;EACd,OAAO,KAAK,OAAO,GAAG,MAAM,MAAM,CAAC;CACrC;;CAEA,OAAO,QAAQ;EACb,MAAM,UAAU,OAAO,QAAQ,MAAM;EACrC,IAAI,QAAQ,MAAM,CAAC,KAAK,WAAW,CAAC,UAAU,GAAG,KAAK,UAAU,KAAK,CAAC,GAAG,OAAO;EAChF,IAAI,QAAQ,WAAW,GAAG,OAAO;EACjC,MAAM,QAAQ,EAAE,GAAG,KAAK,MAAM;EAC9B,KAAK,MAAM,CAAC,KAAK,UAAU,SAEzB,MAAM,OAAO;GAAE;GAAO,IADX,KAAK,IAAI,KAAK,IAAI,IAAI,MAAM,IAAI,EAAE,MAAM,KAAK,CACjC;GAAG,IAAI,KAAK,QAAQ;EAAO;EAEpD,KAAK,QAAQ;EACb,KAAK,QAAQ;EACb,OAAO;CACT;;CAEA,MAAM,UAAU;EACd,MAAM,EAAE,OAAO,YAAY,WAAW,KAAK,OAAO,QAAQ;EAC1D,IAAI,QAAQ,WAAW,GAAG,OAAO;EACjC,KAAK,QAAQ;EACb,KAAK,QAAQ;EACb,OAAO;CACT;;CAEA,UAAU,UAAU;EAClB,KAAK,UAAU,IAAI,QAAQ;EAC3B,aAAa,KAAK,UAAU,OAAO,QAAQ;CAC7C;CACA,UAAU;EACR,KAAK,QAAQ;EACb,KAAK,MAAM,YAAY,KAAK,WAC1B,IAAI;GACF,SAAS;EACX,SAAS,KAAK;GACZ,QAAQ,MAAM,kCAAkC,GAAG;EACrD;CAEJ;;;;;;CAMA,UAAU;EACR,MAAM,OAAO,KAAK,QAAQ;EAC1B,IAAI,CAAC,MAAM;EACX,KAAK,QAAQ,WAAW,KAAK,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC;EACpD,IAAI;GACF,gBAAgB,MAAM,KAAK,UAAU,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC;EAC7D,SAAS,KAAK;GACZ,QAAQ,MAAM,iCAAiC,MAAM,GAAG;EAC1D;CACF;CACA,UAAU;EACR,MAAM,OAAO,KAAK,QAAQ;EAC1B,IAAI,CAAC,MAAM,OAAO,CAAC;EACnB,IAAI;GACF,OAAO,KAAK,MAAM,aAAa,MAAM,MAAM,CAAC,CAAC,CAAC;EAChD,QAAQ;GACN,OAAO,CAAC;EACV;CACF;AACF;AACA,MAAM,gBAAgB;AACtB,SAAS,mBAAmB;CAC1B,MAAM,IAAI;CACV,IAAI,EAAE,uBAAuB,OAAO,EAAE;CACtC,MAAM,QAAQ,IAAI,gBAAgB;EAAE,QAAQ;EAAY,MAAM,KAAK,gBAAgB,kBAAkB;CAAE,CAAC;CACxG,EAAE,wBAAwB;CAC1B,kBAAkB,eAAe,KAAK;CACtC,OAAO;AACT;AACA,SAAS,mBAAmB;CAC1B,MAAM,IAAI;CACV,IAAI,EAAE,uBAAuB,OAAO,EAAE;CACtC,MAAM,QAAQ,iBAAiB;CAC/B,MAAM,QAAQ,IAAI,WAAW;EAC3B,QAAQ;EACR,MAAM,KAAK,gBAAgB,YAAY;EACvC,QAAQ,aAAa,MAAM,MAAM,QAAQ;CAC3C,CAAC;CACD,EAAE,wBAAwB;CAC1B,iBAAiB,MAAM,UAAU,CAAC;CAClC,kBAAkB,eAAe,KAAK;CACtC,MAAM,iBAAiB,gBAAgB,CAAC,CAAC,MAAM,UAAU,MAAM,OAAO,MAAM,OAAO,CAAC,CAAC,CAAC,OAAO,QAAQ,QAAQ,MAAM,6BAA6B,GAAG,CAAC;CACpJ,SAAc;CACd,YAAY,UAAU,aAAa,CAAC,CAAC,QAAQ;CAC7C,OAAO;AACT;AACA,SAAS,UAAU,SAAS,MAAM;CAChC,OAAO,aAAa,iBAAiB,CAAC,CAAC,QAAQ,OAAO,GAAG,IAAI;AAC/D"}
|
|
1
|
+
{"version":3,"file":"fleet-OhxUuYh1.js","names":[],"sources":["../../../../web/.svelte-kit/adapter-bun/chunks/fleet.js"],"sourcesContent":["import { join } from \"node:path\";\nimport { readFileSync } from \"node:fs\";\nimport { w as writeFileAtomic } from \"./atomic-write.js\";\nimport { P as ProjectReportSchema } from \"./fleet-projects.js\";\nimport { e as eachOf, f as PastSessionSchema, g as PlainPaneSchema, m as mergePrefs, i as isServerOnlyKey, h as isPrefKey } from \"./ws-messages.js\";\nimport { p as pageOriginAllowed } from \"./page-origin.js\";\nimport { p as protocolOf, r as relayRefusal } from \"./fleet-protocol.js\";\nimport { P as PluginsReportSchema } from \"./fleet-plugins.js\";\nimport { C as CLAUDE_MUX_DIR } from \"./paths.js\";\nimport { M as MACHINE_ID } from \"./instance.js\";\nimport { r as rememberMachines, d as discoverServers } from \"./discover.js\";\nimport { s as sessionsWsManager } from \"./ws-managers.js\";\nconst FORWARDED_HEADER = \"x-claude-mux-forwarded\";\nconst RESPONSE_TIMEOUT_MS = 12e4;\nfunction parseFleetPath(pathname) {\n const match = pathname.match(/^\\/fleet\\/([^/]+)(\\/api(?:\\/.*)?)$/);\n if (!match) return null;\n let machine;\n try {\n machine = decodeURIComponent(match[1]);\n } catch {\n return null;\n }\n return { machine, path: match[2] };\n}\nfunction errorResponse(status, error, machine) {\n return new Response(JSON.stringify({ error, machine }), {\n status,\n headers: { \"content-type\": \"application/json\" }\n });\n}\nconst REQUEST_HOP_HEADERS = /* @__PURE__ */ new Set([\n \"host\",\n \"origin\",\n \"referer\",\n \"connection\",\n \"keep-alive\",\n \"upgrade\",\n \"transfer-encoding\",\n \"content-length\",\n \"accept-encoding\",\n \"te\",\n \"trailer\",\n \"proxy-connection\",\n \"proxy-authorization\"\n]);\nconst RESPONSE_HOP_HEADERS = /* @__PURE__ */ new Set([\n \"connection\",\n \"keep-alive\",\n \"transfer-encoding\",\n \"content-encoding\",\n \"content-length\"\n]);\nasync function admitRelay(origin, host, target, resolve, gate) {\n const { machine } = target;\n if (!pageOriginAllowed(origin, host)) return errorResponse(403, \"cross-origin request refused\", machine);\n const base = await resolve(machine);\n if (!base) return errorResponse(404, \"unknown machine\", machine);\n const refused = gate?.(machine, target.path);\n return refused ? errorResponse(426, refused, machine) : base;\n}\nasync function relayRequest(request, target, resolve, self, gate) {\n const base = await admitRelay(request.headers.get(\"origin\"), request.headers.get(\"host\"), target, resolve, gate);\n if (typeof base !== \"string\") return base;\n const headers = new Headers();\n request.headers.forEach((value, name) => {\n if (!REQUEST_HOP_HEADERS.has(name.toLowerCase())) headers.set(name, value);\n });\n headers.set(FORWARDED_HEADER, self);\n headers.set(\"origin\", new URL(base).origin);\n const hasBody = request.method !== \"GET\" && request.method !== \"HEAD\";\n const body = hasBody ? await request.arrayBuffer() : void 0;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), RESPONSE_TIMEOUT_MS);\n let response;\n try {\n response = await fetch(`${base}${target.path}${new URL(request.url).search}`, {\n method: request.method,\n headers,\n body,\n redirect: \"manual\",\n // A page that goes away mid-request takes the owner's request with it.\n signal: AbortSignal.any([controller.signal, request.signal])\n });\n } catch {\n return errorResponse(502, \"machine unreachable\", target.machine);\n } finally {\n clearTimeout(timer);\n }\n const out = new Headers();\n response.headers.forEach((value, name) => {\n if (!RESPONSE_HOP_HEADERS.has(name.toLowerCase())) out.append(name, value);\n });\n const location = out.get(\"location\");\n if (location?.startsWith(\"/api/\")) out.set(\"location\", `/fleet/${encodeURIComponent(target.machine)}${location}`);\n return new Response(response.body, { status: response.status, statusText: response.statusText, headers: out });\n}\nconst UNREACHABLE_CLOSE = 1014;\nfunction closeReason(reason) {\n const encoder = new TextEncoder();\n let out = reason;\n while (encoder.encode(out).length > 123) out = [...out].slice(0, -1).join(\"\");\n return out;\n}\nfunction sendableCode(code) {\n if (code === 1e3 || code >= 3e3 && code <= 4999) return code;\n if (code >= 1001 && code <= 1003 || code >= 1007 && code <= 1014) return code;\n return 1e3;\n}\nconst FLEET_STATE_SENDER = \"fleet-state\";\nfunction isPeerLink(origin, forwarded) {\n return !origin && forwarded === FLEET_STATE_SENDER;\n}\nfunction openForwardedSocket(base, path, self) {\n const url = new URL(path, base);\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n return new WebSocket(url, { headers: { [FORWARDED_HEADER]: self } });\n}\nfunction openRelayUpstream(base, path, client, self) {\n const pending = [];\n let opened = false;\n let closed = false;\n let socket;\n const finish = (code, reason) => {\n if (closed) return;\n closed = true;\n try {\n client.close(sendableCode(code), closeReason(reason));\n } catch {\n }\n };\n try {\n socket = openForwardedSocket(base, path, self);\n } catch {\n finish(UNREACHABLE_CLOSE, \"machine unreachable\");\n return { send() {\n }, close() {\n } };\n }\n socket.binaryType = \"arraybuffer\";\n socket.addEventListener(\"open\", () => {\n opened = true;\n for (const data of pending.splice(0)) socket.send(data);\n });\n socket.addEventListener(\"message\", (event) => {\n if (closed) return;\n client.send(event.data);\n });\n socket.addEventListener(\"close\", (event) => {\n finish(opened ? event.code : UNREACHABLE_CLOSE, opened ? event.reason : \"machine unreachable\");\n });\n socket.addEventListener(\"error\", () => {\n if (!opened) finish(UNREACHABLE_CLOSE, \"machine unreachable\");\n });\n return {\n send(data) {\n if (closed) return;\n if (opened && socket.readyState === WebSocket.OPEN) socket.send(data);\n else pending.push(data);\n },\n close() {\n closed = true;\n if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) socket.close();\n }\n };\n}\nconst RETRY_MIN_MS = 5e3;\nconst RETRY_MAX_MS = 6e4;\nconst PING_MS = 15e3;\nconst SILENCE_MS = 4e4;\nconst PERSIST_DELAY_MS = 2e3;\nconst PERSIST_SEEN_MS = 6e4;\nfunction retryDelay(failures) {\n return Math.min(RETRY_MAX_MS, RETRY_MIN_MS * 2 ** Math.max(0, failures - 1));\n}\nclass FleetState {\n constructor(options) {\n this.options = options;\n this.selfId = options.selfId;\n this.connect = options.connect ?? connectPeer;\n this.readHealth = options.health ?? fetchHealth;\n this.now = options.now ?? Date.now;\n for (const { state, past } of this.restore()) {\n this.peers.set(state.id, { ...this.newPeer({ ...state, online: false, retryAt: null }), past });\n }\n }\n options;\n peers = /* @__PURE__ */ new Map();\n listeners = /* @__PURE__ */ new Set();\n pastListeners = /* @__PURE__ */ new Set();\n persistTimer = null;\n persistedAt = 0;\n stopped = false;\n connect;\n readHealth;\n now;\n selfId;\n /** The machines restored from disk or found since, for the relay to know their addresses. */\n addresses() {\n return [...this.peers.values()].map(({ state }) => ({ id: state.id, hostname: state.hostname, url: state.url }));\n }\n /**\n * Follow the machines discovery found. A new one is connected at once, one\n * whose address changed is reconnected there, and one missing from the list\n * is kept: a machine that is off drops out of discovery, and its last known\n * state is what the page should keep showing. Machines restored from disk\n * and not yet tried are tried now.\n */\n update(found) {\n if (this.stopped) return;\n let changed = false;\n for (const address of found) {\n if (!address.id || address.id === this.options.selfId) continue;\n for (const other of [...this.peers.values()]) {\n if (other.state.url === address.url && other.state.id !== address.id) {\n this.rekey(other, address.id);\n changed = true;\n }\n }\n const peer = this.peers.get(address.id);\n if (!peer) {\n this.peers.set(address.id, this.newPeer(emptyState(address)));\n changed = true;\n continue;\n }\n if (peer.state.hostname !== address.hostname) {\n peer.state = { ...peer.state, hostname: address.hostname };\n changed = true;\n }\n if (peer.state.url !== address.url) {\n peer.state = { ...peer.state, url: address.url };\n this.drop(peer);\n peer.failures = 0;\n changed = true;\n }\n }\n for (const peer of this.peers.values()) {\n if (!peer.link && !peer.retryTimer) this.open(peer);\n }\n if (changed) this.changed();\n }\n /** Try a machine that is offline now rather than when its wait is up. False for one nobody knows. */\n retryNow(id) {\n const peer = this.peers.get(id);\n if (!peer) return false;\n if (peer.state.online || this.stopped) return true;\n this.drop(peer);\n peer.failures = 0;\n this.open(peer);\n return true;\n }\n /** One machine's state by its id, or null for one nobody knows. */\n machine(id) {\n return this.peers.get(id)?.state ?? null;\n }\n /** Every other machine, by name. */\n snapshot() {\n return [...this.peers.values()].map((p) => p.state).sort((a, b) => a.hostname.localeCompare(b.hostname) || a.id.localeCompare(b.id));\n }\n /**\n * Every other machine's past sessions, by machine id: what it listed last,\n * kept while it is off so its conversations stay on the page.\n */\n past() {\n const out = {};\n for (const [id, peer] of this.peers) out[id] = peer.past;\n return out;\n }\n /** Called after a machine's past sessions change. Returns the unsubscribe. */\n subscribePast(listener) {\n this.pastListeners.add(listener);\n return () => this.pastListeners.delete(listener);\n }\n /** Called after every change to the snapshot. Returns the unsubscribe. */\n subscribe(listener) {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n /** Close every link, cancel every timer and write what is known. */\n stop() {\n this.stopped = true;\n for (const peer of this.peers.values()) this.drop(peer);\n if (this.persistTimer) clearTimeout(this.persistTimer);\n this.persistTimer = null;\n this.persist();\n }\n newPeer(state) {\n return { state, link: null, failures: 0, retryTimer: null, pingTimer: null, lastFrame: null, past: [] };\n }\n open(peer) {\n if (this.stopped) return;\n if (peer.state.retryAt !== null) {\n peer.state = { ...peer.state, retryAt: null };\n this.changed();\n }\n const link = this.connect(peer.state.url, {\n open: () => {\n if (peer.link !== link) return;\n peer.failures = 0;\n this.heard(peer);\n let healthKnown = false;\n const readHealth = () => void this.readHealth(peer.state.url).catch(() => null).then((health) => {\n if (peer.link !== link) return;\n const moved = !!health?.instance && health.instance !== peer.state.id;\n if (moved) {\n this.rekey(peer, health.instance);\n if (peer.link !== link) return this.changed();\n }\n const patch = peer.state.online ? {} : { online: true };\n if (health) {\n healthKnown = true;\n const version = health.version ?? peer.state.version;\n if (version !== peer.state.version || health.protocol !== peer.state.protocol) {\n Object.assign(patch, { version, protocol: health.protocol });\n }\n }\n if (moved || Object.keys(patch).length > 0) this.setState(peer, patch);\n });\n peer.pingTimer = setInterval(() => {\n if (this.now() - (peer.state.lastSeen ?? 0) > SILENCE_MS) {\n this.lost(peer, link);\n return;\n }\n link.send(\"ping\");\n if (!healthKnown) readHealth();\n }, PING_MS);\n readHealth();\n },\n message: (data) => {\n if (peer.link !== link) return;\n this.heard(peer);\n this.receive(peer, data);\n },\n close: () => this.lost(peer, link)\n });\n peer.link = link;\n }\n /**\n * A peer that is quiet but answering pings changes nothing anyone sees, so\n * its newer last-seen is only written to disk, once a minute at most.\n */\n heard(peer) {\n peer.state = { ...peer.state, lastSeen: this.now() };\n if (this.now() - this.persistedAt > PERSIST_SEEN_MS) this.schedulePersist();\n }\n /** A link that closed, failed, or went silent: the machine is offline until the next attempt answers. */\n lost(peer, link) {\n if (peer.link !== link) return;\n this.drop(peer);\n if (this.stopped) return;\n peer.failures++;\n const delay = retryDelay(peer.failures);\n peer.retryTimer = setTimeout(() => {\n peer.retryTimer = null;\n this.open(peer);\n }, delay);\n this.setState(peer, { online: false, retryAt: this.now() + delay });\n }\n /**\n * Move a record to the id its address now reports (a machine whose id\n * changed, such as one that began to persist it). When a record is already\n * kept under that id the two become one: the one with a link keeps it (the\n * record under the new id when both or neither have one), the other is let\n * go, and what they knew comes from whichever was heard from last. An\n * address that turns out to be this machine is dropped altogether.\n */\n rekey(peer, id) {\n if (this.peers.get(peer.state.id) === peer) this.peers.delete(peer.state.id);\n if (id === this.options.selfId) {\n this.drop(peer);\n this.pastChanged();\n return;\n }\n const existing = this.peers.get(id);\n let kept = peer;\n if (existing && existing !== peer) {\n kept = peer.link && !existing.link ? peer : existing;\n const other = kept === peer ? existing : peer;\n this.drop(other);\n const [fresher, staler] = (other.state.lastSeen ?? 0) > (kept.state.lastSeen ?? 0) ? [other, kept] : [kept, other];\n const { url, online, retryAt } = kept.state;\n kept.state = { ...fresher.state, url, online, retryAt };\n kept.past = fresher.past.length > 0 ? fresher.past : staler.past;\n kept.lastFrame = null;\n }\n kept.state = { ...kept.state, id };\n this.peers.set(id, kept);\n this.pastChanged();\n }\n /** Let go of a peer's link and timers without touching its state. */\n drop(peer) {\n const link = peer.link;\n peer.link = null;\n peer.lastFrame = null;\n if (peer.pingTimer) clearInterval(peer.pingTimer);\n if (peer.retryTimer) clearTimeout(peer.retryTimer);\n peer.pingTimer = null;\n peer.retryTimer = null;\n if (link) {\n try {\n link.close();\n } catch {\n }\n }\n }\n receive(peer, data) {\n if (data === \"pong\") return;\n let msg;\n try {\n msg = JSON.parse(data);\n } catch {\n return;\n }\n if (msg?.type === \"prefs\") {\n this.options.prefs?.(msg.prefs);\n return;\n }\n if (msg?.type === \"past\") {\n const sessions = msg.sessions;\n if (!Array.isArray(sessions)) return;\n const past = PastSchema.parse(sessions);\n if (JSON.stringify(past) === JSON.stringify(peer.past)) return;\n peer.past = past;\n this.pastChanged();\n return;\n }\n if (msg?.type !== \"sessions\" && msg?.type !== \"connected\") return;\n if (!Array.isArray(msg.sessions)) return;\n const pluginsAt = msg.plugins?.readAt;\n const frame = JSON.stringify([msg.sessions, msg.panes, msg.projects, msg.projectReports, msg.inbox, pluginsAt]);\n if (frame === peer.lastFrame) return;\n peer.lastFrame = frame;\n this.setState(peer, {\n sessions: msg.sessions,\n // An older broadcast may leave these out; what was known stands.\n ...Array.isArray(msg.projects) ? { projects: msg.projects.filter((p) => typeof p === \"string\") } : {},\n ...Array.isArray(msg.projectReports) ? { projectReports: ReportsSchema.parse(msg.projectReports) } : {},\n ...Array.isArray(msg.panes) ? { panes: PanesSchema.parse(msg.panes) } : {},\n ...Array.isArray(msg.inbox) ? { inbox: msg.inbox } : {},\n ...msg.plugins && pluginsAt !== peer.state.plugins?.readAt ? { plugins: readPlugins(msg.plugins) ?? peer.state.plugins } : {}\n });\n }\n setState(peer, patch) {\n peer.state = { ...peer.state, ...patch };\n this.changed();\n }\n changed() {\n this.notify(this.listeners, \"listener\");\n }\n pastChanged() {\n this.notify(this.pastListeners, \"past listener\");\n }\n notify(listeners, what) {\n for (const listener of listeners) {\n try {\n listener();\n } catch (err) {\n console.error(`[fleet] ${what} failed:`, err);\n }\n }\n this.schedulePersist();\n }\n schedulePersist() {\n if (this.options.path && !this.persistTimer && !this.stopped) {\n this.persistTimer = setTimeout(() => {\n this.persistTimer = null;\n this.persist();\n }, PERSIST_DELAY_MS);\n }\n }\n persist() {\n const path = this.options.path;\n if (!path) return;\n this.persistedAt = this.now();\n const body = {\n machines: this.snapshot().map(({ online: _online, retryAt: _retryAt, ...kept }) => ({\n ...kept,\n past: this.peers.get(kept.id)?.past ?? []\n }))\n };\n try {\n writeFileAtomic(path, JSON.stringify(body));\n } catch (err) {\n console.error(\"[fleet] could not write\", path, err);\n }\n }\n restore() {\n const path = this.options.path;\n if (!path) return [];\n let saved;\n try {\n saved = JSON.parse(readFileSync(path, \"utf8\"));\n } catch {\n return [];\n }\n if (!Array.isArray(saved?.machines)) return [];\n return saved.machines.filter((m) => m && typeof m.id === \"string\" && typeof m.url === \"string\" && m.id !== this.options.selfId).map((m) => ({\n state: {\n ...emptyState({ id: m.id, hostname: String(m.hostname ?? m.id), url: m.url }),\n lastSeen: typeof m.lastSeen === \"number\" ? m.lastSeen : null,\n version: typeof m.version === \"string\" ? m.version : null,\n protocol: typeof m.protocol === \"number\" ? m.protocol : null,\n sessions: Array.isArray(m.sessions) ? m.sessions : [],\n projects: Array.isArray(m.projects) ? m.projects : [],\n projectReports: Array.isArray(m.projectReports) ? ReportsSchema.parse(m.projectReports) : [],\n panes: Array.isArray(m.panes) ? PanesSchema.parse(m.panes) : [],\n inbox: Array.isArray(m.inbox) ? m.inbox : [],\n plugins: readPlugins(m.plugins)\n },\n past: Array.isArray(m.past) ? PastSchema.parse(m.past) : []\n }));\n }\n}\nfunction emptyState(address) {\n return {\n id: address.id,\n hostname: address.hostname,\n url: address.url,\n online: false,\n lastSeen: null,\n retryAt: null,\n version: null,\n protocol: null,\n sessions: [],\n projects: [],\n projectReports: [],\n panes: [],\n inbox: [],\n plugins: null\n };\n}\nfunction readPlugins(raw) {\n const parsed = PluginsReportSchema.safeParse(raw);\n return parsed.success ? parsed.data : null;\n}\nconst ReportsSchema = eachOf(ProjectReportSchema);\nconst PastSchema = eachOf(PastSessionSchema);\nconst PanesSchema = eachOf(PlainPaneSchema);\nconst CONNECT_TIMEOUT_MS = 1e4;\nfunction connectPeer(url, handlers) {\n let socket;\n try {\n socket = openForwardedSocket(url, \"/api/sessions/stream\", FLEET_STATE_SENDER);\n } catch {\n queueMicrotask(handlers.close);\n return { send() {\n }, close() {\n } };\n }\n const timer = setTimeout(() => socket.close(), CONNECT_TIMEOUT_MS);\n socket.addEventListener(\"open\", () => {\n clearTimeout(timer);\n handlers.open();\n });\n socket.addEventListener(\"message\", (event) => {\n if (typeof event.data === \"string\") handlers.message(event.data);\n });\n socket.addEventListener(\"close\", () => {\n clearTimeout(timer);\n handlers.close();\n });\n socket.addEventListener(\"error\", () => {\n clearTimeout(timer);\n handlers.close();\n });\n return {\n send(data) {\n if (socket.readyState === WebSocket.OPEN) socket.send(data);\n },\n close() {\n clearTimeout(timer);\n if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) socket.close();\n }\n };\n}\nasync function fetchHealth(url) {\n try {\n const res = await fetch(new URL(\"/api/health\", url), { signal: AbortSignal.timeout(5e3) });\n if (!res.ok) return null;\n const data = await res.json();\n return {\n version: typeof data.version === \"string\" ? data.version : null,\n protocol: protocolOf(data),\n instance: typeof data.instance === \"string\" && data.instance ? data.instance : null\n };\n } catch {\n return null;\n }\n}\nclass FleetPrefsStore {\n constructor(options) {\n this.options = options;\n this.now = options.now ?? Date.now;\n this.prefs = mergePrefs({}, this.restore()).prefs;\n }\n options;\n prefs;\n listeners = /* @__PURE__ */ new Set();\n now;\n all() {\n return this.prefs;\n }\n /** The set without the keys the servers keep among themselves (`isServerOnlyKey()`): what a page is sent. */\n forPages() {\n return Object.fromEntries(Object.entries(this.prefs).filter(([key]) => !isServerOnlyKey(key)));\n }\n /**\n * A page's write. A clock that reads earlier than the entry it replaces\n * (another machine's, a little ahead) is moved past it, so the write a\n * person just made is never lost to the one before it. False for a key or\n * value that cannot be kept.\n */\n set(key, value) {\n return this.setAll({ [key]: value });\n }\n /** Several writes as one change, so the set is written and sent once; false, writing nothing, if any cannot be kept. */\n setAll(values) {\n const entries = Object.entries(values);\n if (entries.some(([key, value]) => !isPrefKey(key) || value === void 0)) return false;\n if (entries.length === 0) return true;\n const prefs = { ...this.prefs };\n for (const [key, value] of entries) {\n const at = Math.max(this.now(), (prefs[key]?.at ?? 0) + 1);\n prefs[key] = { value, at, by: this.options.selfId };\n }\n this.prefs = prefs;\n this.changed();\n return true;\n }\n /** Another machine's set; true when anything in it was newer. */\n merge(incoming) {\n const { prefs, changed } = mergePrefs(this.prefs, incoming);\n if (changed.length === 0) return false;\n this.prefs = prefs;\n this.changed();\n return true;\n }\n /** Called after every change. Returns the unsubscribe. */\n subscribe(listener) {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n changed() {\n this.persist();\n for (const listener of this.listeners) {\n try {\n listener();\n } catch (err) {\n console.error(\"[fleet-prefs] listener failed:\", err);\n }\n }\n }\n /**\n * The file is read and merged before it is written: a dev server beside\n * the prod one shares the file and the machine id, follows neither, and\n * would otherwise drop the other's writes from it with its own.\n */\n persist() {\n const path = this.options.path;\n if (!path) return;\n this.prefs = mergePrefs(this.prefs, this.restore()).prefs;\n try {\n writeFileAtomic(path, JSON.stringify({ prefs: this.prefs }));\n } catch (err) {\n console.error(\"[fleet-prefs] could not write\", path, err);\n }\n }\n restore() {\n const path = this.options.path;\n if (!path) return {};\n try {\n return JSON.parse(readFileSync(path, \"utf8\")).prefs;\n } catch {\n return {};\n }\n }\n}\nconst REDISCOVER_MS = 6e4;\nfunction ensureFleetPrefs() {\n const g = globalThis;\n if (g.__claudeMuxFleetPrefs) return g.__claudeMuxFleetPrefs;\n const prefs = new FleetPrefsStore({ selfId: MACHINE_ID, path: join(CLAUDE_MUX_DIR, \"fleet-prefs.json\") });\n g.__claudeMuxFleetPrefs = prefs;\n sessionsWsManager.setPrefsSource(prefs);\n return prefs;\n}\nfunction ensureFleetState() {\n const g = globalThis;\n if (g.__claudeMuxFleetState) return g.__claudeMuxFleetState;\n const prefs = ensureFleetPrefs();\n const state = new FleetState({\n selfId: MACHINE_ID,\n path: join(CLAUDE_MUX_DIR, \"fleet.json\"),\n prefs: (incoming) => prefs.merge(incoming)\n });\n g.__claudeMuxFleetState = state;\n rememberMachines(state.addresses());\n sessionsWsManager.setFleetSource(state);\n const discover = () => discoverServers().then((found) => state.update(found.servers)).catch((err) => console.error(\"[fleet] discovery failed:\", err));\n void discover();\n setInterval(discover, REDISCOVER_MS).unref?.();\n return state;\n}\nfunction relayGate(machine, path) {\n return relayRefusal(ensureFleetState().machine(machine), path);\n}\nexport {\n FORWARDED_HEADER as F,\n admitRelay as a,\n relayGate as b,\n ensureFleetPrefs as c,\n ensureFleetState as e,\n isPeerLink as i,\n openRelayUpstream as o,\n parseFleetPath as p,\n relayRequest as r\n};\n//# sourceMappingURL=fleet.js.map\n"],"mappings":"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"}
|
|
@@ -73,6 +73,12 @@ ${text}` : text);
|
|
|
73
73
|
if (chunks.length === 0 && !LOCAL_OUTPUT_TAG.test(trimmed)) return null;
|
|
74
74
|
return chunks.join("\n");
|
|
75
75
|
}
|
|
76
|
+
const PASTED_OPEN = /<pasted_content id="[^"]*">\n?/g;
|
|
77
|
+
const PASTED_CLOSE = /\n?<\/pasted_content id="[^"]*">\n?/g;
|
|
78
|
+
function unwrapPasted(text) {
|
|
79
|
+
if (!text.includes("<pasted_content id=")) return text;
|
|
80
|
+
return text.replace(PASTED_OPEN, "").replace(PASTED_CLOSE, "\n").trim();
|
|
81
|
+
}
|
|
76
82
|
function parseAskQuestions(input) {
|
|
77
83
|
const raw = input.questions;
|
|
78
84
|
if (!Array.isArray(raw)) return [];
|
|
@@ -326,7 +332,8 @@ var TranscriptBuilder = class {
|
|
|
326
332
|
const attachment = asRecord(record.attachment);
|
|
327
333
|
if (!attachment || attachment.type !== "queued_command") return [];
|
|
328
334
|
if (asRecord(attachment.origin)?.kind !== "human") return [];
|
|
329
|
-
const
|
|
335
|
+
const raw = readString(attachment.prompt);
|
|
336
|
+
const prompt = raw === null ? null : unwrapPasted(raw);
|
|
330
337
|
if (!prompt || prompt.trim().length === 0) return [];
|
|
331
338
|
const uuid = readString(record.uuid) ?? `queued-${this.entries.length}`;
|
|
332
339
|
const ts = parseTimestamp(record.timestamp ?? attachment.timestamp);
|
|
@@ -403,7 +410,7 @@ var TranscriptBuilder = class {
|
|
|
403
410
|
if (!message) return [];
|
|
404
411
|
const uuid = readString(record.uuid) ?? `user-${this.entries.length}`;
|
|
405
412
|
const ts = parseTimestamp(record.timestamp);
|
|
406
|
-
const content = message.content;
|
|
413
|
+
const content = typeof message.content === "string" ? unwrapPasted(message.content) : message.content;
|
|
407
414
|
const origin = asRecord(record.origin);
|
|
408
415
|
if (origin?.kind === "peer") {
|
|
409
416
|
const body = readString(origin.body) ?? (typeof content === "string" ? content : null);
|
|
@@ -528,7 +535,8 @@ var TranscriptBuilder = class {
|
|
|
528
535
|
...patch ? { patch } : {}
|
|
529
536
|
}));
|
|
530
537
|
} else if (rec.type === "text") {
|
|
531
|
-
const
|
|
538
|
+
const raw = readString(rec.text);
|
|
539
|
+
const text = raw === null ? null : unwrapPasted(raw);
|
|
532
540
|
if (text && text.trim().length > 0) promptTexts.push(text);
|
|
533
541
|
}
|
|
534
542
|
}
|
|
@@ -1259,6 +1267,6 @@ async function currentBranch(root) {
|
|
|
1259
1267
|
"HEAD"
|
|
1260
1268
|
], root))?.trim() || null;
|
|
1261
1269
|
}
|
|
1262
|
-
export { gitChanges as a, parseSlashCommand as c, peekGitSummary as d, promptText as f, summarize as g, sessionWatcher as h, git as i, parseTs as l, sessionChanges as m, confinePath as n, gitFileDiff as o, repoRoot as p, currentBranch as r, parseNumstat as s, TranscriptBuilder as t, parseUnifiedDiff as u };
|
|
1270
|
+
export { unwrapPasted as _, gitChanges as a, parseSlashCommand as c, peekGitSummary as d, promptText as f, summarize as g, sessionWatcher as h, git as i, parseTs as l, sessionChanges as m, confinePath as n, gitFileDiff as o, repoRoot as p, currentBranch as r, parseNumstat as s, TranscriptBuilder as t, parseUnifiedDiff as u };
|
|
1263
1271
|
|
|
1264
|
-
//# sourceMappingURL=git-
|
|
1272
|
+
//# sourceMappingURL=git-CHO9UIOQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-CHO9UIOQ.js","names":[],"sources":["../../../../web/.svelte-kit/adapter-bun/chunks/mcp.js","../../../../web/.svelte-kit/adapter-bun/chunks/git.js"],"sourcesContent":["class ForkTracker {\n seqByUuid = /* @__PURE__ */ new Map();\n next = 0;\n lastAssistant = -1;\n /** Note a main-conversation line in file order; answers its position. */\n see(uuid, type) {\n const seq = this.next++;\n if (uuid) this.seqByUuid.set(uuid, seq);\n if (type === \"assistant\") this.lastAssistant = seq;\n return seq;\n }\n /**\n * For a prompt about to be noted, the position after which the conversation\n * was abandoned (everything after it, up to the prompt, is the old branch),\n * or null when the prompt simply follows on.\n */\n abandonedAfter(parentUuid) {\n if (!parentUuid) return null;\n const parent = this.seqByUuid.get(parentUuid);\n if (parent === void 0 || this.lastAssistant <= parent) return null;\n return parent;\n }\n}\nconst isRewound = (item) => (item.kind === \"group\" ? item.entries[0]?.rewound : item.rewound) === true;\nfunction foldRewound(items) {\n const out = [];\n for (const item of items) {\n if (!isRewound(item)) {\n out.push(item);\n continue;\n }\n let run = out[out.length - 1];\n if (run?.kind !== \"rewound\") {\n run = { kind: \"rewound\", id: `rewound:${item.id}`, items: [], turns: 0 };\n out.push(run);\n }\n run.items.push(item);\n if (item.kind === \"user\") run.turns++;\n }\n return out;\n}\nfunction parseMcpToolName(name) {\n const match = /^mcp__(.+?)__(.+)$/.exec(name);\n return match ? { server: match[1], tool: match[2] } : null;\n}\nexport {\n ForkTracker as F,\n foldRewound as f,\n parseMcpToolName as p\n};\n//# sourceMappingURL=mcp.js.map\n","import { execFile } from \"child_process\";\nimport { readdirSync, statSync, openSync, readSync, closeSync } from \"fs\";\nimport { join, isAbsolute, resolve, relative, sep } from \"path\";\nimport { a as asRecord, r as readString } from \"./json.js\";\nimport { b as peekTranscriptPath } from \"./context-peek.js\";\nimport { J as JsonlTailer } from \"./tailer.js\";\nimport { F as ForkTracker, p as parseMcpToolName } from \"./mcp.js\";\nimport { r as readContextUsage } from \"./context.js\";\nimport { g as getSession } from \"./sessions-json.js\";\nimport { S as SESSIONS_DIR } from \"./paths.js\";\nconst COMMAND_TAG = /<command-(name|message|args)>([\\s\\S]*?)<\\/command-\\1>/g;\nfunction parseSlashCommand(content) {\n const trimmed = content.trim();\n if (!trimmed.startsWith(\"<command-\")) return null;\n const tags = {};\n for (const match of trimmed.matchAll(COMMAND_TAG)) tags[match[1]] = match[2].trim();\n const name = tags.name;\n if (!name) return null;\n return { name, ...tags.args ? { args: tags.args } : {} };\n}\nconst LOCAL_OUTPUT_TAG = /^<local-command-(stdout|stderr)>([\\s\\S]*?)<\\/local-command-\\1>/;\nconst ANSI_SGR = /\\x1b\\[[0-9;]*m/g;\nconst LOCAL_CAVEAT = /^<local-command-caveat>/;\nconst INTERRUPT_MARKER = /^\\[Request interrupted (by user[^\\]]*)\\]$/;\nfunction interruptNote(text) {\n const m = INTERRUPT_MARKER.exec(text.trim());\n return m ? `Interrupted ${m[1]}` : null;\n}\nfunction parseLocalOutput(content) {\n const trimmed = content.trim();\n if (!trimmed.startsWith(\"<local-command-\")) return null;\n const chunks = [];\n let rest = trimmed;\n for (let m = rest.match(LOCAL_OUTPUT_TAG); m; m = rest.match(LOCAL_OUTPUT_TAG)) {\n const text = m[2].replace(ANSI_SGR, \"\").trim();\n if (text) chunks.push(m[1] === \"stderr\" ? `[stderr]\n${text}` : text);\n rest = rest.slice(m[0].length).trimStart();\n }\n if (chunks.length === 0 && !LOCAL_OUTPUT_TAG.test(trimmed)) return null;\n return chunks.join(\"\\n\");\n}\nconst PASTED_OPEN = /<pasted_content id=\"[^\"]*\">\\n?/g;\nconst PASTED_CLOSE = /\\n?<\\/pasted_content id=\"[^\"]*\">\\n?/g;\nfunction unwrapPasted(text) {\n if (!text.includes(\"<pasted_content id=\")) return text;\n return text.replace(PASTED_OPEN, \"\").replace(PASTED_CLOSE, \"\\n\").trim();\n}\nfunction parseAskQuestions(input) {\n const raw = input.questions;\n if (!Array.isArray(raw)) return [];\n const questions = [];\n for (const entry of raw) {\n const q = asRecord(entry);\n if (!q) continue;\n const options = Array.isArray(q.options) ? q.options.map((o) => asRecord(o)).filter((o) => o !== null).map((o) => ({\n label: readString(o.label) ?? \"\",\n ...readString(o.description) ? { description: readString(o.description) } : {},\n ...readString(o.preview) ? { preview: readString(o.preview) } : {}\n })).filter((o) => o.label.length > 0) : [];\n questions.push({\n header: readString(q.header) ?? \"\",\n question: readString(q.question) ?? \"\",\n multiSelect: q.multiSelect === true,\n options\n });\n }\n return questions;\n}\nconst PATCH_LINE_LIMIT = 400;\nfunction readStructuredPatch(raw, limit = Infinity) {\n if (!Array.isArray(raw)) return [];\n const hunks = [];\n let total = 0;\n for (const entry of raw) {\n const hunk = asRecord(entry);\n if (!hunk || !Array.isArray(hunk.lines)) continue;\n const lines = hunk.lines.filter((line) => typeof line === \"string\");\n if (lines.length === 0) continue;\n const kept = lines.slice(0, Math.max(0, limit - total));\n if (kept.length < lines.length) kept.push(`… ${lines.length - kept.length} more lines`);\n total += kept.length;\n hunks.push({\n header: `@@ -${hunk.oldStart ?? \"?\"},${hunk.oldLines ?? \"?\"} +${hunk.newStart ?? \"?\"},${hunk.newLines ?? \"?\"} @@`,\n lines: kept\n });\n if (total >= limit) break;\n }\n return hunks;\n}\nfunction extractPatch(sidecar) {\n const sc = asRecord(sidecar);\n const hunks = readStructuredPatch(sc?.structuredPatch, PATCH_LINE_LIMIT);\n if (hunks.length === 0) return void 0;\n return { file: readString(sc?.filePath) ?? \"\", hunks };\n}\nconst INPUT_CHAR_LIMIT = 4e3;\nconst RESULT_CHAR_LIMIT = 8e3;\nconst TEXT_CHAR_LIMIT = 64e3;\nfunction truncate(text, limit) {\n if (text.length <= limit) return text;\n return `${text.slice(0, limit)}\n… [truncated, ${text.length - limit} more chars]`;\n}\nfunction parseTimestamp(value) {\n const ts = typeof value === \"string\" ? Date.parse(value) : NaN;\n return Number.isFinite(ts) ? ts : Date.now();\n}\nconst BUILTIN_KEY_ARGS = [\n \"command\",\n \"file_path\",\n \"pattern\",\n \"url\",\n \"query\",\n \"description\",\n \"prompt\",\n \"skill\"\n];\nconst MCP_KEY_ARGS = [\n \"url\",\n \"uid\",\n \"key\",\n \"function\",\n \"query\",\n \"command\",\n \"file_path\",\n \"path\",\n \"selector\",\n \"text\",\n \"name\",\n \"title\"\n];\nconst MCP_SHORT_ARG = 80;\nfunction firstString(input, keys) {\n for (const key of keys) {\n const value = readString(input[key]);\n if (value?.trim()) return value;\n }\n return null;\n}\nfunction shortString(input) {\n for (const value of Object.values(input)) {\n if (typeof value === \"string\" && value.trim() && value.length <= MCP_SHORT_ARG) return value;\n }\n return null;\n}\nfunction summarizeToolUse(rawName, input) {\n const mcp = parseMcpToolName(rawName);\n const name = mcp?.tool ?? rawName;\n const key = mcp ? firstString(input, MCP_KEY_ARGS) ?? shortString(input) : firstString(input, BUILTIN_KEY_ARGS);\n if (!key) return name;\n const flat = key.replace(/\\s+/g, \" \").trim();\n return `${name}: ${flat.length > 120 ? `${flat.slice(0, 117)}...` : flat}`;\n}\nconst IMAGE_SOURCE = /^\\[Image: source: (.+?)(?:, original [^\\]]*)?\\]/;\nfunction toolResultImages(blockContent) {\n if (!Array.isArray(blockContent)) return [];\n const paths = [];\n for (const part of blockContent) {\n const match = IMAGE_SOURCE.exec(readString(asRecord(part)?.text) ?? \"\");\n if (match) paths.push(match[1].trim());\n }\n return paths;\n}\nfunction toolResultText(sidecar, blockContent) {\n const sc = asRecord(sidecar);\n if (sc) {\n const stdout = readString(sc.stdout);\n const stderr = readString(sc.stderr);\n if (stdout !== null || stderr !== null) {\n return [stdout, stderr && stderr.length > 0 ? `[stderr]\n${stderr}` : null].filter((part) => part !== null && part.length > 0).join(\"\\n\");\n }\n }\n if (typeof blockContent === \"string\") return blockContent;\n if (Array.isArray(blockContent)) {\n const saved = toolResultImages(blockContent).length;\n let unsaved = blockContent.filter((part) => asRecord(part)?.type === \"image\").length - saved;\n const parts = blockContent.map((part) => {\n const rec = asRecord(part);\n const text = readString(rec?.text) ?? \"\";\n if (rec?.type === \"image\") {\n return unsaved-- > 0 ? readString(sc?.file) ?? \"[image]\" : \"\";\n }\n return IMAGE_SOURCE.test(text) ? \"\" : text;\n }).filter((text) => text.length > 0);\n if (parts.length > 0 || saved > 0) return parts.join(\"\\n\");\n }\n if (sc) {\n try {\n return JSON.stringify(sc, null, 2);\n } catch {\n return \"\";\n }\n }\n return \"\";\n}\nclass TranscriptBuilder {\n /**\n * @param sidechain true when reading a subagent's own file, where every line\n * is marked `isSidechain` — the main transcript skips those, since subagent\n * work lives in its own file.\n * @param isDictated tells a prompt injected by voice from a typed one. The\n * JSONL carries no origin for this, so the caller re-derives it (by text and\n * time, see dictation-marks) and the builder stamps `dictated` at parse\n * time, where the flag survives re-upserts of the same entry.\n */\n constructor(sidechain = false, isDictated) {\n this.sidechain = sidechain;\n this.isDictated = isDictated;\n }\n sidechain;\n isDictated;\n entries = [];\n /**\n * Subagents the harness has reported as finished. Background agents give no\n * other completion signal — their launching tool call returns immediately —\n * so this notification is the authoritative end, keyed by agent id.\n */\n finishedAgents = /* @__PURE__ */ new Set();\n /**\n * Context-window usage of the most recent API response, or null before the\n * first one. Compaction needs no special handling: the response that\n * follows it reports the smaller context on its own.\n */\n context = null;\n /** The model that wrote the latest assistant line, as the API names it. */\n model = null;\n /** The compaction logged last, whose summary is the next user line. */\n lastCompactId = null;\n indexById = /* @__PURE__ */ new Map();\n /** The slash command logged last, which a local command's output belongs to. */\n lastCommandId = null;\n /** Queued prompts awaiting a possible re-delivery as a real user line. */\n pendingQueued = [];\n forks = new ForkTracker();\n /** The position of the line being fed, and of the line that first made each entry. */\n seq = -1;\n seqById = /* @__PURE__ */ new Map();\n dictatedFlag(text, ts) {\n return this.isDictated?.(text, ts) ? { dictated: true } : void 0;\n }\n /** Position of an entry in `entries`, or undefined if it is not one. */\n indexOf(id) {\n return this.indexById.get(id);\n }\n feed(line) {\n const trimmed = line.trim();\n if (trimmed.length === 0) return [];\n let record;\n try {\n record = asRecord(JSON.parse(trimmed));\n } catch {\n return [];\n }\n if (!record) return [];\n if (record.isSidechain === true !== this.sidechain) return [];\n const uuid = readString(record.uuid);\n if (uuid) this.seq = this.forks.see(uuid, record.type);\n switch (record.type) {\n case \"user\":\n return this.feedUser(record);\n case \"assistant\":\n return this.feedAssistant(record);\n case \"attachment\":\n return this.feedAttachment(record);\n case \"system\":\n return this.feedSystem(record);\n default:\n return [];\n }\n }\n /**\n * The most recent user turn, when it is plain text reading exactly `text`\n * and nothing has been said since but the harness's own bookkeeping — the\n * compaction a `/compact` triggers, for one.\n */\n recentPlainUserLine(text) {\n for (let i = this.entries.length - 1, seen = 0; i >= 0 && seen < 4; i--, seen++) {\n const entry = this.entries[i];\n if (entry.kind === \"compact\") continue;\n if (entry.kind !== \"user\") return null;\n return !entry.command && entry.text === text ? entry : null;\n }\n return null;\n }\n /**\n * A system line. The only one with a place in the transcript is the\n * compaction boundary: the reader needs to know where the conversation was\n * folded, or the summary that follows reads as a prompt they never typed.\n */\n feedSystem(record) {\n if (record.subtype !== \"compact_boundary\") return [];\n const uuid = readString(record.uuid) ?? `compact-${this.entries.length}`;\n const meta = asRecord(record.compactMetadata);\n const pre = typeof meta?.preTokens === \"number\" ? meta.preTokens : void 0;\n const post = typeof meta?.postTokens === \"number\" ? meta.postTokens : void 0;\n this.lastCompactId = uuid;\n return [\n this.upsert({\n kind: \"compact\",\n id: uuid,\n ts: parseTimestamp(record.timestamp),\n trigger: readString(meta?.trigger) ?? \"auto\",\n ...pre !== void 0 ? { preTokens: pre } : {},\n ...post !== void 0 ? { postTokens: post } : {}\n })\n ];\n }\n feedAttachment(record) {\n const attachment = asRecord(record.attachment);\n if (!attachment || attachment.type !== \"queued_command\") return [];\n if (asRecord(attachment.origin)?.kind !== \"human\") return [];\n const raw = readString(attachment.prompt);\n const prompt = raw === null ? null : unwrapPasted(raw);\n if (!prompt || prompt.trim().length === 0) return [];\n const uuid = readString(record.uuid) ?? `queued-${this.entries.length}`;\n const ts = parseTimestamp(record.timestamp ?? attachment.timestamp);\n this.pendingQueued.push({ text: prompt.trim(), id: uuid });\n return [\n this.upsert({\n kind: \"queued\",\n id: uuid,\n ts,\n text: truncate(prompt, TEXT_CHAR_LIMIT),\n ...this.dictatedFlag(prompt, ts)\n })\n ];\n }\n /** Record a finished subagent from a harness task-notification. */\n noteAgentFinished(text) {\n const agentId = text.match(/<task-id>([^<]+)<\\/task-id>/)?.[1];\n const status = text.match(/<status>([^<]+)<\\/status>/)?.[1];\n if (agentId && status && status !== \"running\") this.finishedAgents.add(agentId);\n }\n /** Hide queued entries that a real user line re-delivers. The delivered\n * text may embed the queued prompt (harness wrapping), so match on exact\n * equality or prefix, not just identity. */\n deliverQueued(text) {\n const delivered = text.trim();\n const changed = [];\n this.pendingQueued = this.pendingQueued.filter((pending) => {\n if (delivered !== pending.text && !delivered.startsWith(pending.text)) return true;\n const entry = this.getEntry(pending.id);\n if (entry && entry.kind === \"queued\") {\n changed.push(this.upsert({ ...entry, delivered: true }));\n }\n return false;\n });\n return changed;\n }\n upsert(entry) {\n const existing = this.indexById.get(entry.id);\n if (existing !== void 0) {\n this.entries[existing] = entry;\n } else {\n this.seqById.set(entry.id, this.seq);\n this.indexById.set(entry.id, this.entries.length);\n this.entries.push(entry);\n }\n return entry.id;\n }\n /**\n * A prompt that went back past what came before it (see ForkTracker): mark\n * every entry the old branch made as rewound, and answer their ids.\n */\n rewindTo(record) {\n const after = this.forks.abandonedAfter(readString(record.parentUuid));\n if (after === null) return [];\n const changed = [];\n this.entries.forEach((entry, i) => {\n const seq = this.seqById.get(entry.id);\n if (seq === void 0 || seq <= after || entry.rewound) return;\n this.entries[i] = { ...entry, rewound: true };\n changed.push(entry.id);\n });\n return changed;\n }\n getEntry(id) {\n const index = this.indexById.get(id);\n return index === void 0 ? void 0 : this.entries[index];\n }\n feedUser(record) {\n const message = asRecord(record.message);\n if (!message) return [];\n const uuid = readString(record.uuid) ?? `user-${this.entries.length}`;\n const ts = parseTimestamp(record.timestamp);\n const content = typeof message.content === \"string\" ? unwrapPasted(message.content) : message.content;\n const origin = asRecord(record.origin);\n if (origin?.kind === \"peer\") {\n const body = readString(origin.body) ?? (typeof content === \"string\" ? content : null);\n if (!body || body.trim().length === 0) return [];\n const from = readString(origin.name) ?? void 0;\n return [\n this.upsert({\n kind: \"peer\",\n id: uuid,\n ts,\n text: truncate(body, TEXT_CHAR_LIMIT),\n ...from ? { from } : {}\n })\n ];\n }\n if (record.isCompactSummary === true && typeof content === \"string\") {\n const owner = this.lastCompactId ? this.getEntry(this.lastCompactId) : void 0;\n if (owner?.kind === \"compact\") {\n return [this.upsert({ ...owner, summary: truncate(content, TEXT_CHAR_LIMIT) })];\n }\n return [];\n }\n if (record.isMeta === true) return [];\n if (typeof content === \"string\") {\n if (content.trim().length === 0) return [];\n const originKind = asRecord(record.origin)?.kind;\n if (originKind === \"task-notification\") {\n this.noteAgentFinished(content);\n return [];\n }\n if (originKind !== void 0 && originKind !== \"human\") return [];\n if (originKind === void 0 && /^<(task-notification|system-reminder)/.test(content.trim()))\n return [];\n if (LOCAL_CAVEAT.test(content.trimStart())) return [];\n const interrupt2 = interruptNote(content);\n if (interrupt2) return [this.upsert({ kind: \"interrupt\", id: uuid, ts, text: interrupt2 })];\n const output = parseLocalOutput(content);\n if (output !== null) {\n if (output.length === 0) return [];\n const owner = this.lastCommandId ? this.getEntry(this.lastCommandId) : void 0;\n if (owner?.kind === \"user\" && owner.command) {\n return [\n this.upsert({\n ...owner,\n command: { ...owner.command, output: truncate(output, TEXT_CHAR_LIMIT) }\n })\n ];\n }\n return [this.upsert({ kind: \"user\", id: uuid, ts, text: truncate(output, TEXT_CHAR_LIMIT) })];\n }\n const command = parseSlashCommand(content);\n if (command) {\n const spelled = `${command.name}${command.args ? ` ${command.args}` : \"\"}`;\n const typed = this.recentPlainUserLine(spelled);\n if (typed) {\n this.lastCommandId = typed.id;\n return [this.upsert({ ...typed, command })];\n }\n }\n this.lastCommandId = command ? uuid : null;\n const text = command ? `${command.name}${command.args ? ` ${command.args}` : \"\"}` : content;\n return [\n ...this.rewindTo(record),\n ...this.deliverQueued(content),\n this.upsert({\n kind: \"user\",\n id: uuid,\n ts,\n text: truncate(text, TEXT_CHAR_LIMIT),\n ...command ? { command } : {},\n ...this.dictatedFlag(text, ts)\n })\n ];\n }\n if (!Array.isArray(content)) return [];\n const changed = [];\n const promptTexts = [];\n for (const block of content) {\n const rec = asRecord(block);\n if (!rec) continue;\n if (rec.type === \"tool_result\") {\n const toolUseId = readString(rec.tool_use_id);\n const entry = toolUseId ? this.getEntry(toolUseId) : void 0;\n if (!entry) continue;\n if (entry.kind === \"ask\") {\n const sidecar = asRecord(record.toolUseResult);\n const answersRaw = asRecord(sidecar?.answers);\n if (answersRaw) {\n const answers = {};\n for (const [q, a] of Object.entries(answersRaw)) {\n if (typeof a === \"string\") answers[q] = a;\n }\n changed.push(this.upsert({ ...entry, answers }));\n } else {\n changed.push(this.upsert({ ...entry, rejected: true }));\n }\n continue;\n }\n if (entry.kind !== \"tool\") continue;\n const patch = extractPatch(record.toolUseResult);\n const output = patch && rec.is_error !== true ? \"\" : toolResultText(record.toolUseResult, rec.content);\n const images = toolResultImages(rec.content);\n changed.push(\n this.upsert({\n ...entry,\n result: {\n ok: rec.is_error !== true,\n output: truncate(output, RESULT_CHAR_LIMIT),\n ...images.length > 0 ? { images } : {}\n },\n ...patch ? { patch } : {}\n })\n );\n } else if (rec.type === \"text\") {\n const raw = readString(rec.text);\n const text = raw === null ? null : unwrapPasted(raw);\n if (text && text.trim().length > 0) promptTexts.push(text);\n }\n }\n const interrupt = promptTexts.length === 1 ? interruptNote(promptTexts[0]) : null;\n if (interrupt) {\n changed.push(this.upsert({ kind: \"interrupt\", id: uuid, ts, text: interrupt }));\n } else if (promptTexts.length > 0) {\n changed.push(\n ...this.rewindTo(record),\n this.upsert({\n kind: \"user\",\n id: uuid,\n ts,\n text: truncate(promptTexts.join(\"\\n\\n\"), TEXT_CHAR_LIMIT),\n ...this.dictatedFlag(promptTexts.join(\"\\n\\n\"), ts)\n })\n );\n }\n return changed;\n }\n feedAssistant(record) {\n const message = asRecord(record.message);\n if (message) this.context = readContextUsage(message) ?? this.context;\n if (message) this.model = readString(message.model) ?? this.model;\n const content = message?.content;\n if (!Array.isArray(content)) return [];\n const uuid = readString(record.uuid) ?? `assistant-${this.entries.length}`;\n const ts = parseTimestamp(record.timestamp);\n const changed = [];\n for (let i = 0; i < content.length; i++) {\n const block = asRecord(content[i]);\n if (!block) continue;\n const blockId = `${uuid}:${i}`;\n switch (block.type) {\n case \"text\": {\n const text = readString(block.text);\n if (text && text.trim().length > 0) {\n changed.push(\n this.upsert({ kind: \"text\", id: blockId, ts, text: truncate(text, TEXT_CHAR_LIMIT) })\n );\n }\n break;\n }\n case \"thinking\": {\n const text = readString(block.thinking);\n if (text && text.trim().length > 0) {\n changed.push(\n this.upsert({\n kind: \"thinking\",\n id: blockId,\n ts,\n text: truncate(text, TEXT_CHAR_LIMIT)\n })\n );\n }\n break;\n }\n case \"tool_use\": {\n const toolUseId = readString(block.id) ?? blockId;\n const name = readString(block.name) ?? \"tool\";\n const input = asRecord(block.input) ?? {};\n if (name === \"AskUserQuestion\") {\n const questions = parseAskQuestions(input);\n if (questions.length > 0) {\n changed.push(this.upsert({ kind: \"ask\", id: toolUseId, ts, questions }));\n break;\n }\n }\n let inputText;\n try {\n inputText = JSON.stringify(input, null, 2);\n } catch {\n inputText = \"{}\";\n }\n changed.push(\n this.upsert({\n kind: \"tool\",\n id: toolUseId,\n ts,\n name,\n summary: summarizeToolUse(name, input),\n input: truncate(inputText, INPUT_CHAR_LIMIT)\n })\n );\n break;\n }\n }\n }\n return changed;\n }\n}\nfunction sessionIdOf(file) {\n return file.slice(0, -\".json\".length);\n}\nclass SessionWatcher {\n subscribers = /* @__PURE__ */ new Set();\n pollTimer = null;\n lastState = /* @__PURE__ */ new Map();\n // filename -> mtime\n pollInterval = 500;\n start() {\n if (this.pollTimer) return;\n console.log(\"[watcher] Started polling\", SESSIONS_DIR, `(${this.pollInterval}ms)`);\n this.updateState();\n this.pollTimer = setInterval(() => {\n const changed = this.checkForChanges();\n if (changed.size > 0) {\n this.notifySubscribers(changed);\n }\n }, this.pollInterval);\n }\n updateState() {\n this.lastState.clear();\n try {\n const files = readdirSync(SESSIONS_DIR);\n for (const file of files) {\n if (!file.endsWith(\".json\")) continue;\n try {\n const stat = statSync(join(SESSIONS_DIR, file));\n this.lastState.set(file, stat.mtimeMs);\n } catch {\n }\n }\n } catch {\n }\n }\n checkForChanges() {\n const newState = /* @__PURE__ */ new Map();\n const changed = /* @__PURE__ */ new Set();\n try {\n const files = readdirSync(SESSIONS_DIR);\n for (const file of files) {\n if (!file.endsWith(\".json\")) continue;\n try {\n const stat = statSync(join(SESSIONS_DIR, file));\n newState.set(file, stat.mtimeMs);\n const oldMtime = this.lastState.get(file);\n if (oldMtime !== stat.mtimeMs) {\n console.log(`[watcher] File ${oldMtime === void 0 ? \"added\" : \"changed\"}:`, file);\n changed.add(sessionIdOf(file));\n }\n } catch {\n }\n }\n for (const file of this.lastState.keys()) {\n if (!newState.has(file)) {\n console.log(\"[watcher] File removed:\", file);\n changed.add(sessionIdOf(file));\n }\n }\n } catch {\n }\n this.lastState = newState;\n return changed;\n }\n notifySubscribers(changed) {\n console.log(\"[watcher] Notifying\", this.subscribers.size, \"subscribers\");\n for (const callback of this.subscribers) {\n try {\n callback(changed);\n } catch (error) {\n console.error(\"[watcher] Subscriber error:\", error);\n }\n }\n }\n subscribe(callback) {\n this.subscribers.add(callback);\n if (this.subscribers.size === 1) {\n this.start();\n }\n return () => {\n this.subscribers.delete(callback);\n if (this.subscribers.size === 0) {\n this.stop();\n }\n };\n }\n stop() {\n if (this.pollTimer) {\n clearInterval(this.pollTimer);\n this.pollTimer = null;\n }\n this.lastState.clear();\n console.log(\"[watcher] Stopped\");\n }\n}\nconst sessionWatcher = new SessionWatcher();\nfunction summarize(files) {\n return {\n files: files.length,\n additions: files.reduce((n, f) => n + f.additions, 0),\n deletions: files.reduce((n, f) => n + f.deletions, 0)\n };\n}\nfunction sidecarFile(sc) {\n return readString(sc.filePath) ?? readString(sc.notebook_path);\n}\nfunction countLines(hunks) {\n let additions = 0;\n let deletions = 0;\n for (const hunk of hunks) {\n for (const line of hunk.lines) {\n if (line.startsWith(\"+\")) additions++;\n else if (line.startsWith(\"-\")) deletions++;\n }\n }\n return { additions, deletions };\n}\nfunction creationHunk(content) {\n const lines = content.split(\"\\n\");\n if (lines[lines.length - 1] === \"\") lines.pop();\n if (lines.length === 0) return [];\n return [{ header: `@@ -0,0 +1,${lines.length} @@`, lines: lines.map((line) => `+${line}`) }];\n}\nfunction fileChangeFromSidecar(sidecar) {\n const sc = asRecord(sidecar);\n if (!sc || !(\"structuredPatch\" in sc)) return null;\n const file = sidecarFile(sc);\n if (!file) return null;\n const content = readString(sc.content);\n const created = sc.type === \"create\" || sc.type === void 0 && content !== null && !(\"originalFile\" in sc);\n let hunks = readStructuredPatch(sc.structuredPatch);\n if (created && hunks.length === 0 && content !== null) hunks = creationHunk(content);\n return { file, kind: created ? \"added\" : \"modified\", ...countLines(hunks), hunks };\n}\nconst HARNESS_PROMPT = /^<(task-notification|system-reminder|local-command-)/;\nfunction promptText(record) {\n if (record.isMeta === true || record.isCompactSummary === true) return null;\n const kind = asRecord(record.origin)?.kind;\n if (kind !== void 0 && kind !== \"human\") return null;\n const content = asRecord(record.message)?.content;\n let text;\n if (typeof content === \"string\") text = content;\n else if (Array.isArray(content)) {\n const parts = [];\n for (const block of content) {\n const rec = asRecord(block);\n if (rec?.type === \"tool_result\") return null;\n const part = rec?.type === \"text\" ? readString(rec.text) : null;\n if (part) parts.push(part);\n }\n text = parts.join(\"\\n\");\n } else return null;\n text = text.trim();\n if (!text || HARNESS_PROMPT.test(text) || interruptNote(text)) return null;\n const command = parseSlashCommand(text);\n if (command) text = command.args ? `${command.name} ${command.args}` : command.name;\n const firstLine = text.split(\"\\n\", 1)[0];\n return firstLine.length > 120 ? `${firstLine.slice(0, 117)}...` : firstLine;\n}\nfunction isCommand(record) {\n const content = asRecord(record.message)?.content;\n return typeof content === \"string\" && parseSlashCommand(content.trim()) !== null;\n}\nfunction parseTs(value) {\n const ts = typeof value === \"string\" ? Date.parse(value) : NaN;\n return Number.isFinite(ts) ? ts : 0;\n}\nfunction count(file, changes) {\n return {\n file,\n // Created at some point in the run means new to whoever reads the run.\n kind: changes[0].kind,\n additions: changes.reduce((n, c) => n + c.additions, 0),\n deletions: changes.reduce((n, c) => n + c.deletions, 0)\n };\n}\nfunction merge(file, changes) {\n return { ...count(file, changes), hunks: changes.flatMap((c) => c.hunks) };\n}\nclass ChangesCollector {\n turns = [];\n /** tool_use ids already counted, so a line written twice is counted once. */\n seen = /* @__PURE__ */ new Set();\n forks = new ForkTracker();\n feed(line) {\n const carriesChange = line.includes('\"structuredPatch\"');\n const mayOpen = line.includes('\"type\":\"user\"') && !line.includes('\"tool_result\"');\n if (!carriesChange && !mayOpen && !line.startsWith('{\"parentUuid\"')) return;\n let record;\n try {\n record = asRecord(JSON.parse(line));\n } catch {\n return;\n }\n if (!record || record.isSidechain === true) return;\n const uuid = readString(record.uuid);\n const seq = uuid ? this.forks.see(uuid, record.type) : -1;\n if (record.type !== \"user\" || !carriesChange && !mayOpen) return;\n if (carriesChange) {\n const change = fileChangeFromSidecar(record.toolUseResult);\n if (!change) return;\n const content = asRecord(record.message)?.content;\n const result = Array.isArray(content) ? content.map(asRecord).find((block) => block?.type === \"tool_result\") : void 0;\n const toolUseId = readString(result?.tool_use_id);\n if (toolUseId) {\n if (this.seen.has(toolUseId)) return;\n this.seen.add(toolUseId);\n }\n let turn = this.turns[this.turns.length - 1];\n if (!turn) {\n turn = { id: null, seq: -1, n: 0, ts: parseTs(record.timestamp), prompt: \"\", changes: /* @__PURE__ */ new Map() };\n this.turns.push(turn);\n }\n const list = turn.changes.get(change.file);\n if (list) list.push(change);\n else turn.changes.set(change.file, [change]);\n return;\n }\n const prompt = promptText(record);\n if (prompt === null) return;\n const last = this.turns[this.turns.length - 1];\n if (last && last.changes.size === 0 && last.prompt === prompt && isCommand(record)) return;\n const after = this.forks.abandonedAfter(readString(record.parentUuid));\n if (after !== null) this.turns = this.turns.filter((turn) => turn.seq <= after);\n this.turns.push({\n id: uuid,\n seq,\n n: (this.turns[this.turns.length - 1]?.n ?? 0) + 1,\n ts: parseTs(record.timestamp),\n prompt,\n changes: /* @__PURE__ */ new Map()\n });\n }\n /** The id of every turn's prompt, changed something or not, oldest first. */\n promptIds() {\n return this.turns.flatMap((turn) => turn.id ? [turn.id] : []);\n }\n /** The turns that changed something, oldest first. */\n byTurn() {\n return this.turns.filter((turn) => turn.changes.size > 0).map((turn) => ({\n id: turn.id,\n n: turn.n,\n ts: turn.ts,\n prompt: turn.prompt,\n files: [...turn.changes].map(([file, list]) => count(file, list))\n }));\n }\n /** Every change to each file over every turn, in the order first touched. */\n perFile() {\n const all = /* @__PURE__ */ new Map();\n for (const turn of this.turns) {\n for (const [file, list] of turn.changes) {\n const prior = all.get(file);\n if (prior) prior.push(...list);\n else all.set(file, [...list]);\n }\n }\n return all;\n }\n /** Each file the session changed, folded over every turn, in the order first touched. */\n files() {\n return [...this.perFile()].map(([file, list]) => merge(file, list));\n }\n /** As `files()`, counted without folding any hunks. */\n counts() {\n return [...this.perFile()].map(([file, list]) => count(file, list));\n }\n /** One file's change: over the whole session, or within the turn `turnId` names. */\n file(file, turnId) {\n const list = turnId === void 0 ? this.perFile().get(file) : this.turns.find((turn) => turn.id === turnId)?.changes.get(file);\n return list ? merge(file, list) : null;\n }\n summary() {\n return summarize(this.counts());\n }\n}\nconst FORGET_MS$1 = 10 * 6e4;\nconst tracked = /* @__PURE__ */ new Map();\nfunction sessionChanges(session) {\n const path = peekTranscriptPath(session);\n if (!path) return null;\n const now = Date.now();\n for (const [other, entry] of tracked) if (now - entry.usedAt > FORGET_MS$1) tracked.delete(other);\n let t = tracked.get(path);\n if (!t) {\n t = { tailer: new JsonlTailer(path), collector: new ChangesCollector(), usedAt: now };\n tracked.set(path, t);\n }\n t.usedAt = now;\n for (; ; ) {\n const read = t.tailer.read();\n if (read.status === \"reset\") {\n t.collector = new ChangesCollector();\n continue;\n }\n if (read.status === \"lines\") for (const line of read.lines) t.collector.feed(line);\n return t.collector;\n }\n}\nconst REFRESH_MS = 2e3;\nconst FORGET_MS = 10 * 6e4;\nconst NO_REPO_RETRY_MS = 6e4;\nconst COUNT_LIMIT_BYTES = 2 * 1024 * 1024;\nconst EMPTY_TREE = \"4b825dc642cb6eb9a060e54bf8d69288fbee4904\";\nfunction git(args, cwd, okCodes = [0]) {\n return new Promise((done) => {\n execFile(\n \"git\",\n [\"-c\", \"core.quotepath=off\", ...args],\n { cwd, timeout: 2e4, maxBuffer: 64 * 1024 * 1024 },\n (err, stdout) => {\n const code = err ? typeof err.code === \"number\" ? err.code : -1 : 0;\n done(okCodes.includes(code) ? stdout : null);\n }\n );\n });\n}\nfunction parsePorcelainV2(out) {\n const fields = out.split(\"\\0\");\n const files = [];\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n if (!field) continue;\n const type = field[0];\n if (type === \"?\") {\n files.push({ file: field.slice(2), kind: \"added\", untracked: true });\n } else if (type === \"1\") {\n const parts = field.split(\" \");\n files.push({ file: parts.slice(8).join(\" \"), kind: kindOf(parts[1]) });\n } else if (type === \"2\") {\n const parts = field.split(\" \");\n const oldPath = fields[++i] ?? \"\";\n const file = parts.slice(9).join(\" \");\n files.push({ file, oldPath, kind: parts[8].startsWith(\"C\") ? \"added\" : \"renamed\" });\n } else if (type === \"u\") {\n files.push({ file: field.split(\" \").slice(10).join(\" \"), kind: \"modified\" });\n }\n }\n return files;\n}\nfunction kindOf(xy) {\n if (xy.includes(\"D\")) return \"deleted\";\n if (xy[0] === \"A\") return \"added\";\n return \"modified\";\n}\nfunction parseNumstat(out) {\n const counts = /* @__PURE__ */ new Map();\n const fields = out.split(\"\\0\");\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n if (!field) continue;\n const [add, del, path] = field.split(\"\t\");\n if (del === void 0) continue;\n const file = path ? path : (i += 2, fields[i] ?? \"\");\n const binary = add === \"-\" && del === \"-\";\n counts.set(file, {\n additions: binary ? 0 : Number(add) || 0,\n deletions: binary ? 0 : Number(del) || 0,\n binary\n });\n }\n return counts;\n}\nfunction parseUnifiedDiff(out) {\n const hunks = [];\n let binary = false;\n let current = null;\n for (const line of out.split(\"\\n\")) {\n if (line.startsWith(\"diff \")) {\n current = null;\n } else if (line.startsWith(\"@@\")) {\n current = { header: line.replace(/^(@@[^@]*@@).*$/, \"$1\"), lines: [] };\n hunks.push(current);\n } else if (current && /^[ +\\-\\\\]/.test(line)) {\n current.lines.push(line);\n } else if (!current && /^Binary files .* differ$|^GIT binary patch$/.test(line)) {\n binary = true;\n }\n }\n return { binary, hunks };\n}\nfunction confinePath(root, file) {\n if (!file || file.includes(\"\\0\")) return null;\n const abs = isAbsolute(file) ? resolve(file) : resolve(root, file);\n const rel = relative(root, abs);\n if (!rel || rel === \"..\" || rel.startsWith(\"..\" + sep) || isAbsolute(rel)) return null;\n return rel.split(sep).join(\"/\");\n}\nconst untrackedCounts = /* @__PURE__ */ new Map();\nfunction countUntracked(path) {\n try {\n const { size, mtimeMs } = statSync(path);\n const memo = untrackedCounts.get(path);\n if (memo && memo.size === size && memo.mtimeMs === mtimeMs) return memo.count;\n const count2 = readLineCount(path, size);\n untrackedCounts.set(path, { size, mtimeMs, count: count2 });\n return count2;\n } catch {\n untrackedCounts.delete(path);\n return null;\n }\n}\nfunction readLineCount(path, size) {\n try {\n if (size > COUNT_LIMIT_BYTES) return null;\n const buffer = Buffer.alloc(size);\n const fd = openSync(path, \"r\");\n try {\n readSync(fd, buffer, 0, size, 0);\n } finally {\n closeSync(fd);\n }\n if (buffer.subarray(0, 8e3).includes(0)) return { additions: 0, deletions: 0, binary: true };\n let lines = 0;\n for (let i = buffer.indexOf(10); i !== -1; i = buffer.indexOf(10, i + 1)) lines++;\n if (size > 0 && buffer[size - 1] !== 10) lines++;\n return { additions: lines, deletions: 0, binary: false };\n } catch {\n return null;\n }\n}\nasync function baseRev(root) {\n return await git([\"rev-parse\", \"--verify\", \"-q\", \"HEAD\"], root) ? \"HEAD\" : EMPTY_TREE;\n}\nasync function readChanges(root) {\n const [status, base] = await Promise.all([\n git([\"status\", \"--porcelain=v2\", \"-z\", \"--untracked-files=all\"], root),\n baseRev(root)\n ]);\n if (status === null) return null;\n const numstat = await git([\"diff\", \"--numstat\", \"-z\", \"-M\", base], root) ?? \"\";\n const counts = parseNumstat(numstat);\n const entries = parsePorcelainV2(status);\n const untracked = new Set(entries.filter((e) => e.untracked).map((e) => resolve(root, e.file)));\n for (const path of untrackedCounts.keys()) {\n if (path.startsWith(root + sep) && !untracked.has(path)) untrackedCounts.delete(path);\n }\n const files = entries.map((entry) => {\n const count2 = entry.untracked ? countUntracked(resolve(root, entry.file)) : counts.get(entry.file);\n return {\n ...entry,\n additions: count2?.additions ?? 0,\n deletions: count2?.deletions ?? 0,\n ...count2?.binary ? { binary: true } : {}\n };\n });\n return { root, files, base };\n}\nconst roots = /* @__PURE__ */ new Map();\nconst resolving = /* @__PURE__ */ new Map();\nconst repos = /* @__PURE__ */ new Map();\nlet unsubscribe = null;\nasync function repoRoot(cwd) {\n const known = roots.get(cwd);\n if (known && (known.root !== null || Date.now() - known.at < NO_REPO_RETRY_MS)) return known.root;\n let pending = resolving.get(cwd);\n if (!pending) {\n pending = git([\"rev-parse\", \"--show-toplevel\"], cwd).then((out) => {\n const root = out ? out.trim() || null : null;\n roots.set(cwd, { root, at: Date.now() });\n resolving.delete(cwd);\n return root;\n });\n resolving.set(cwd, pending);\n }\n return pending;\n}\nfunction noteSessionChanged(cwd) {\n const known = roots.get(cwd)?.root;\n for (const [root, repo] of repos) {\n if (root === known || cwd === root || cwd.startsWith(root + \"/\")) {\n repo.dirty = true;\n schedule(root, repo);\n }\n }\n}\nfunction watch() {\n if (unsubscribe) return;\n unsubscribe = sessionWatcher.subscribe((changed) => {\n for (const id of changed) {\n const cwd = getSession(id)?.cwd;\n if (cwd) noteSessionChanged(cwd);\n }\n });\n}\nfunction refresh(root, repo) {\n if (repo.inflight) return repo.inflight;\n repo.dirty = false;\n repo.refreshedAt = Date.now();\n repo.inflight = readChanges(root).then((changes) => {\n repo.changes = changes;\n return changes;\n }).finally(() => {\n repo.inflight = null;\n if (repo.dirty) schedule(root, repo);\n });\n return repo.inflight;\n}\nfunction schedule(root, repo) {\n if (Date.now() - repo.askedAt > FORGET_MS) {\n if (repo.trailing) clearTimeout(repo.trailing);\n repos.delete(root);\n return;\n }\n if (repo.inflight || repo.trailing) return;\n const wait = repo.refreshedAt + REFRESH_MS - Date.now();\n if (wait <= 0) {\n void refresh(root, repo);\n return;\n }\n repo.trailing = setTimeout(() => {\n repo.trailing = null;\n if (repo.dirty) void refresh(root, repo);\n }, wait);\n}\nfunction stateFor(root) {\n let repo = repos.get(root);\n if (!repo) {\n repo = { changes: null, refreshedAt: 0, dirty: true, inflight: null, trailing: null, askedAt: Date.now() };\n repos.set(root, repo);\n }\n repo.askedAt = Date.now();\n watch();\n return repo;\n}\nasync function gitChanges(cwd) {\n const root = await repoRoot(cwd);\n if (!root) return null;\n const repo = stateFor(root);\n if (repo.inflight) return repo.inflight;\n if (repo.changes && (!repo.dirty || Date.now() - repo.refreshedAt < REFRESH_MS)) {\n if (repo.dirty) schedule(root, repo);\n return repo.changes;\n }\n return refresh(root, repo);\n}\nfunction peekGitSummary(cwd) {\n const root = roots.get(cwd)?.root;\n if (root === void 0) {\n void gitChanges(cwd);\n return void 0;\n }\n if (root === null) {\n void repoRoot(cwd);\n return null;\n }\n const repo = stateFor(root);\n if (!repo.changes) {\n schedule(root, repo);\n return repo.refreshedAt ? null : void 0;\n }\n return summarize(repo.changes.files);\n}\nasync function gitFileDiff(cwd, file) {\n const changes = await gitChanges(cwd);\n if (!changes) return null;\n const rel = confinePath(changes.root, file);\n if (!rel) return null;\n const entry = changes.files.find((f) => f.file === rel);\n if (!entry) return null;\n const out = entry.untracked ? (\n // --no-index exits 1 when the files differ, which they always do here.\n await git([\"diff\", \"--no-index\", \"--\", \"/dev/null\", rel], changes.root, [0, 1])\n ) : await git(\n [\"diff\", \"-M\", changes.base, \"--\", ...entry.oldPath ? [entry.oldPath] : [], rel],\n changes.root\n );\n if (out === null) return null;\n const parsed = parseUnifiedDiff(out);\n return { file: rel, binary: parsed.binary || entry.binary === true, hunks: parsed.hunks };\n}\nasync function currentBranch(root) {\n const out = await git([\"symbolic-ref\", \"--short\", \"-q\", \"HEAD\"], root);\n return out?.trim() || null;\n}\nexport {\n TranscriptBuilder as T,\n peekGitSummary as a,\n sessionChanges as b,\n confinePath as c,\n currentBranch as d,\n gitChanges as e,\n summarize as f,\n git as g,\n gitFileDiff as h,\n parseTs as i,\n promptText as j,\n parseNumstat as k,\n parseUnifiedDiff as l,\n parseSlashCommand as p,\n repoRoot as r,\n sessionWatcher as s,\n unwrapPasted as u\n};\n//# sourceMappingURL=git.js.map\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as git, n as confinePath, p as repoRoot, s as parseNumstat, u as parseUnifiedDiff } from "./git-
|
|
1
|
+
import { i as git, n as confinePath, p as repoRoot, s as parseNumstat, u as parseUnifiedDiff } from "./git-CHO9UIOQ.js";
|
|
2
2
|
// .svelte-kit/adapter-bun/chunks/git-history.js
|
|
3
3
|
const HISTORY_LIMIT = 300;
|
|
4
4
|
const EMPTY_TREE = "4b825dc642cb6eb9a060e54bf8d69288fbee4904";
|
|
@@ -233,4 +233,4 @@ async function commitFileText(cwd, hash, file) {
|
|
|
233
233
|
}
|
|
234
234
|
export { gitHistory as i, commitFileText as n, commitFiles as r, commitFileDiff as t };
|
|
235
235
|
|
|
236
|
-
//# sourceMappingURL=git-history-
|
|
236
|
+
//# sourceMappingURL=git-history-CxyH4jQb.js.map
|