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
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
import { execFileSync, execSync } from 'child_process';
|
|
14
14
|
import { randomUUID } from 'crypto';
|
|
15
|
-
import { existsSync, readFileSync } from 'fs';
|
|
15
|
+
import { closeSync, existsSync, openSync, readFileSync, readSync, statSync } from 'fs';
|
|
16
16
|
import { join } from 'path';
|
|
17
17
|
import { getAllSessions } from '../db/index.js';
|
|
18
18
|
import { CLAUDE_MUX_DIR } from '../utils/paths.js';
|
|
@@ -21,6 +21,7 @@ import { isPidAlive } from '../utils/pid.js';
|
|
|
21
21
|
import { capturePaneContentAsync, readPaneHold, readPromptBox } from '../tmux/pane.js';
|
|
22
22
|
import { composePromptWithAttachments } from './attachments.js';
|
|
23
23
|
import { recordDictation } from './dictation-marks.js';
|
|
24
|
+
import { resolveTranscriptPath } from '../transcript/tailer.js';
|
|
24
25
|
import type { DeliveryInfo, QueuedMessageInfo } from '../types/ws-messages.js';
|
|
25
26
|
|
|
26
27
|
// ============================================================================
|
|
@@ -114,26 +115,91 @@ function pressEnter(target: string): void {
|
|
|
114
115
|
}
|
|
115
116
|
}
|
|
116
117
|
|
|
117
|
-
/** How
|
|
118
|
-
const
|
|
118
|
+
/** How often the box is read while waiting for Claude Code to take a line. */
|
|
119
|
+
const SUBMIT_POLL_MS = 250;
|
|
120
|
+
/** How long the text may sit in the box before one more Enter is sent. */
|
|
121
|
+
const SUBMIT_RETRY_MS = 1500;
|
|
122
|
+
/** How long Claude Code gets in all before the line counts as not taken. */
|
|
123
|
+
const SUBMIT_GIVE_UP_MS = 5000;
|
|
124
|
+
/** How much of the transcript's tail is searched for the line being logged. */
|
|
125
|
+
const TRANSCRIPT_TAIL_BYTES = 512 * 1024;
|
|
126
|
+
|
|
127
|
+
/** Claude Code's stand-in for a long paste in its box: "[Pasted text #1 +12 lines]". */
|
|
128
|
+
const PASTE_PLACEHOLDER = /^\[Pasted text #\d+/;
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Whether the session in `target` logged `text` as a prompt or a queued
|
|
132
|
+
* message at or after `since`: the transcript's word that Claude Code took
|
|
133
|
+
* it, which holds even while the pane has not yet redrawn its box.
|
|
134
|
+
*/
|
|
135
|
+
function loggedSince(target: string, text: string, since: number): boolean {
|
|
136
|
+
const session = getAllSessions().find((s) => s.tmux_target === target || s.id === target);
|
|
137
|
+
const path = session ? resolveTranscriptPath(session, session.id) : null;
|
|
138
|
+
if (!path) return false;
|
|
139
|
+
const want = text.replace(/\s+/g, '');
|
|
140
|
+
try {
|
|
141
|
+
const size = statSync(path).size;
|
|
142
|
+
const fd = openSync(path, 'r');
|
|
143
|
+
try {
|
|
144
|
+
const length = Math.min(size, TRANSCRIPT_TAIL_BYTES);
|
|
145
|
+
const buf = Buffer.alloc(length);
|
|
146
|
+
readSync(fd, buf, 0, length, size - length);
|
|
147
|
+
const lines = buf.toString('utf8').split('\n').reverse();
|
|
148
|
+
for (const line of lines) {
|
|
149
|
+
if (!line.includes('"queue-operation"') && !line.includes('"type":"user"')) continue;
|
|
150
|
+
let record: { timestamp?: string; content?: unknown; message?: { content?: unknown } };
|
|
151
|
+
try {
|
|
152
|
+
record = JSON.parse(line);
|
|
153
|
+
} catch {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
const at = record.timestamp ? Date.parse(record.timestamp) : NaN;
|
|
157
|
+
if (!(at >= since)) continue;
|
|
158
|
+
const content = record.content ?? record.message?.content;
|
|
159
|
+
const logged = typeof content === 'string' ? content : JSON.stringify(content ?? '');
|
|
160
|
+
if (logged.replace(/\s+/g, '').includes(want)) return true;
|
|
161
|
+
}
|
|
162
|
+
} finally {
|
|
163
|
+
closeSync(fd);
|
|
164
|
+
}
|
|
165
|
+
} catch {
|
|
166
|
+
/* no transcript to read: the box decides */
|
|
167
|
+
}
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
119
170
|
|
|
120
171
|
/**
|
|
121
172
|
* Whether Claude Code took the line just sent. A message it accepted has left
|
|
122
173
|
* the box: either the turn started, or, while busy, it went to Claude Code's
|
|
123
|
-
* own queue
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
174
|
+
* own queue. A busy pane in a long session can take seconds to redraw, so the
|
|
175
|
+
* box is read until then, and two other signs count as taken meanwhile: the
|
|
176
|
+
* box holding something else, and the transcript logging the line (a prompt,
|
|
177
|
+
* or a queue entry). Text still sitting there after a while means the Enter
|
|
178
|
+
* was lost, which happens when the paste and the key land inside the same
|
|
179
|
+
* input burst; one more Enter is sent. Resolves false when the text is still
|
|
180
|
+
* there, unlogged, at the end.
|
|
127
181
|
*/
|
|
128
|
-
export async function confirmSubmitted(target: string): Promise<boolean> {
|
|
129
|
-
|
|
130
|
-
|
|
182
|
+
export async function confirmSubmitted(target: string, text?: string): Promise<boolean> {
|
|
183
|
+
const since = Date.now() - 2000;
|
|
184
|
+
const started = Date.now();
|
|
185
|
+
let retried = false;
|
|
186
|
+
for (;;) {
|
|
187
|
+
await new Promise((r) => setTimeout(r, SUBMIT_POLL_MS));
|
|
131
188
|
const raw = await capturePaneContentAsync(target, true);
|
|
132
189
|
const box = raw === null ? null : readPromptBox(raw);
|
|
133
190
|
if (!box || box.kind !== 'typed' || !box.text.trim()) return true;
|
|
134
|
-
if (
|
|
191
|
+
if (text !== undefined) {
|
|
192
|
+
const typed = box.text.trim();
|
|
193
|
+
if (!PASTE_PLACEHOLDER.test(typed) && !sameTyped(typed, text)) return true;
|
|
194
|
+
if (loggedSince(target, text, since)) return true;
|
|
195
|
+
}
|
|
196
|
+
const waited = Date.now() - started;
|
|
197
|
+
if (!retried && waited >= SUBMIT_RETRY_MS) {
|
|
198
|
+
pressEnter(target);
|
|
199
|
+
retried = true;
|
|
200
|
+
}
|
|
201
|
+
if (waited >= SUBMIT_GIVE_UP_MS) return false;
|
|
135
202
|
}
|
|
136
|
-
return false;
|
|
137
203
|
}
|
|
138
204
|
|
|
139
205
|
/** How a message handed to the pane fared (`submitToPane`). */
|
|
@@ -163,7 +229,7 @@ export async function submitToPane(target: string, text: string): Promise<Submit
|
|
|
163
229
|
} else {
|
|
164
230
|
sendTextToPane(target, text);
|
|
165
231
|
}
|
|
166
|
-
return (await confirmSubmitted(target)) ? 'taken' : 'in-box';
|
|
232
|
+
return (await confirmSubmitted(target, text)) ? 'taken' : 'in-box';
|
|
167
233
|
}
|
|
168
234
|
|
|
169
235
|
/**
|
package/src/transcript/parser.ts
CHANGED
|
@@ -177,6 +177,21 @@ function parseLocalOutput(content: string): string | null {
|
|
|
177
177
|
return chunks.join("\n");
|
|
178
178
|
}
|
|
179
179
|
|
|
180
|
+
/** The wrapper Claude Code logs around a long paste: `<pasted_content id="c2b8">` … `</pasted_content id="c2b8">`. */
|
|
181
|
+
const PASTED_OPEN = /<pasted_content id="[^"]*">\n?/g;
|
|
182
|
+
const PASTED_CLOSE = /\n?<\/pasted_content id="[^"]*">\n?/g;
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* A prompt as it was pasted. Claude Code logs a long paste inside a
|
|
186
|
+
* `<pasted_content>` wrapper (with a blank line before it when nothing was
|
|
187
|
+
* typed ahead of it); the person sent the text, not the tags, and the
|
|
188
|
+
* dictation and queued-message matching compare against the text.
|
|
189
|
+
*/
|
|
190
|
+
export function unwrapPasted(text: string): string {
|
|
191
|
+
if (!text.includes("<pasted_content id=")) return text;
|
|
192
|
+
return text.replace(PASTED_OPEN, "").replace(PASTED_CLOSE, "\n").trim();
|
|
193
|
+
}
|
|
194
|
+
|
|
180
195
|
function parseAskQuestions(input: Record<string, unknown>): AskQuestion[] {
|
|
181
196
|
const raw = input.questions;
|
|
182
197
|
if (!Array.isArray(raw)) return [];
|
|
@@ -503,7 +518,8 @@ export class TranscriptBuilder {
|
|
|
503
518
|
if (!attachment || attachment.type !== "queued_command") return [];
|
|
504
519
|
// Only human-typed prompts; system notifications also arrive queued.
|
|
505
520
|
if (asRecord(attachment.origin)?.kind !== "human") return [];
|
|
506
|
-
const
|
|
521
|
+
const raw = readString(attachment.prompt);
|
|
522
|
+
const prompt = raw === null ? null : unwrapPasted(raw);
|
|
507
523
|
if (!prompt || prompt.trim().length === 0) return [];
|
|
508
524
|
const uuid = readString(record.uuid) ?? `queued-${this.entries.length}`;
|
|
509
525
|
const ts = parseTimestamp(record.timestamp ?? attachment.timestamp);
|
|
@@ -582,7 +598,7 @@ export class TranscriptBuilder {
|
|
|
582
598
|
if (!message) return [];
|
|
583
599
|
const uuid = readString(record.uuid) ?? `user-${this.entries.length}`;
|
|
584
600
|
const ts = parseTimestamp(record.timestamp);
|
|
585
|
-
const content = message.content;
|
|
601
|
+
const content = typeof message.content === "string" ? unwrapPasted(message.content) : message.content;
|
|
586
602
|
|
|
587
603
|
// Cross-session (A2A) messages arrive as meta user lines with
|
|
588
604
|
// origin.kind "peer"; origin.body is the clean text (message.content is
|
|
@@ -724,7 +740,8 @@ export class TranscriptBuilder {
|
|
|
724
740
|
}),
|
|
725
741
|
);
|
|
726
742
|
} else if (rec.type === "text") {
|
|
727
|
-
const
|
|
743
|
+
const raw = readString(rec.text);
|
|
744
|
+
const text = raw === null ? null : unwrapPasted(raw);
|
|
728
745
|
if (text && text.trim().length > 0) promptTexts.push(text);
|
|
729
746
|
}
|
|
730
747
|
}
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
import { open, readdir, readFile, stat } from "node:fs/promises";
|
|
19
19
|
import { basename, join } from "node:path";
|
|
20
20
|
import { type PastSession } from "../past-session.js";
|
|
21
|
-
import { parseSlashCommand } from "./parser.js";
|
|
21
|
+
import { parseSlashCommand, unwrapPasted } from "./parser.js";
|
|
22
22
|
import { projectsRoot } from "./tailer.js";
|
|
23
23
|
|
|
24
24
|
|
|
@@ -76,6 +76,8 @@ export function promptText(entry: Entry): string | null {
|
|
|
76
76
|
if (!block || message.content.some((b) => b?.type === "tool_result")) return null;
|
|
77
77
|
text = block.text;
|
|
78
78
|
}
|
|
79
|
+
// A long paste is logged inside Claude Code's <pasted_content> wrapper.
|
|
80
|
+
if (text) text = unwrapPasted(text);
|
|
79
81
|
if (!text?.trim()) return null;
|
|
80
82
|
const command = parseSlashCommand(text);
|
|
81
83
|
if (command) return clip(command.args ? `${command.name} ${command.args}` : command.name);
|
package/src/utils/version.ts
CHANGED
|
@@ -30,6 +30,26 @@ describe("projectRoots", () => {
|
|
|
30
30
|
expect(projectRoots(["/p/app"], ["/p/app", ""])).toEqual(["/p/app", NO_FOLDER]);
|
|
31
31
|
expect(projectRoots([], [null])).toEqual([NO_FOLDER]);
|
|
32
32
|
});
|
|
33
|
+
|
|
34
|
+
it("keeps a session's repo its own project under a remembered folder that is no repo", () => {
|
|
35
|
+
// distilo: a session opened in ~/Projects made it the one remembered root.
|
|
36
|
+
const P = "/home/leo/Projects";
|
|
37
|
+
const roots = projectRoots(
|
|
38
|
+
[P],
|
|
39
|
+
[P, `${P}/quita`, `${P}/distilo/runner`],
|
|
40
|
+
[null, `${P}/quita`, `${P}/distilo`],
|
|
41
|
+
() => false
|
|
42
|
+
);
|
|
43
|
+
expect(roots).toEqual([P, `${P}/quita`, `${P}/distilo`]);
|
|
44
|
+
expect(rootOf(`${P}/distilo/runner`, roots)).toBe(`${P}/distilo`);
|
|
45
|
+
expect(rootOf(P, roots)).toBe(P);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("leaves a worktree under the repo it belongs to", () => {
|
|
49
|
+
const app = "/home/leo/Projects/app";
|
|
50
|
+
const tree = `${app}/.claude/worktrees/agent-1`;
|
|
51
|
+
expect(projectRoots([app], [app, tree], [app, tree], (root) => root === app)).toEqual([app]);
|
|
52
|
+
});
|
|
33
53
|
});
|
|
34
54
|
|
|
35
55
|
describe("rootOf", () => {
|
|
@@ -43,6 +43,22 @@ describe("dictation marks", () => {
|
|
|
43
43
|
expect(isDictated("s1", "fix the login bug now", Date.now())).toBe(false);
|
|
44
44
|
});
|
|
45
45
|
|
|
46
|
+
it("matches dictations Claude Code ran together as one prompt", () => {
|
|
47
|
+
// Two things said during a turn are queued by Claude Code and logged as
|
|
48
|
+
// one prompt, joined by a line break.
|
|
49
|
+
recordDictation("s1", "Também me responde aí, ele voltou pro topo?");
|
|
50
|
+
recordDictation("s1", "Outra limitação que eu acho é a do scroll.");
|
|
51
|
+
const joined = "Também me responde aí, ele voltou pro topo?\nOutra limitação que eu acho é a do scroll.";
|
|
52
|
+
expect(isDictated("s1", joined, Date.now())).toBe(true);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("does not match a prompt only partly made of dictations", () => {
|
|
56
|
+
recordDictation("s1", "fix the login bug");
|
|
57
|
+
recordDictation("s1", "and the logout one");
|
|
58
|
+
expect(isDictated("s1", "fix the login bug\nplus something typed", Date.now())).toBe(false);
|
|
59
|
+
expect(isDictated("s1", "fix the login bugand the logout one", Date.now())).toBe(false);
|
|
60
|
+
});
|
|
61
|
+
|
|
46
62
|
it("does not match outside the time window", () => {
|
|
47
63
|
recordDictation("s1", "fix the login bug");
|
|
48
64
|
expect(isDictated("s1", "fix the login bug", Date.now() + 16 * 60_000)).toBe(false);
|
|
@@ -42,7 +42,7 @@ const CHORD = ['send-keys', '-t', TARGET, 'C-x', 'C-s'];
|
|
|
42
42
|
* than run-all: the queue's drain loop is an interval and would never end.
|
|
43
43
|
*/
|
|
44
44
|
async function settle<T>(promise: Promise<T>): Promise<T> {
|
|
45
|
-
await vi.advanceTimersByTimeAsync(
|
|
45
|
+
await vi.advanceTimersByTimeAsync(6000);
|
|
46
46
|
return promise;
|
|
47
47
|
}
|
|
48
48
|
|
|
@@ -104,6 +104,19 @@ describe('steer', () => {
|
|
|
104
104
|
expect(callIndex(['send-keys', '-t', TARGET, 'Enter'])).toBeGreaterThan(-1);
|
|
105
105
|
});
|
|
106
106
|
|
|
107
|
+
it('waits out a slow redraw rather than calling the text stuck', async () => {
|
|
108
|
+
// Pasted into an empty box; the box still shows the text for four reads, then clears.
|
|
109
|
+
boxReads = [null, 'look at this', 'look at this', 'look at this', 'look at this', null];
|
|
110
|
+
expect(await settle(steerIntoPane(TARGET, 'look at this', true))).toBe('taken');
|
|
111
|
+
// Taken before the retry was due: no second Enter.
|
|
112
|
+
expect(tmuxCalls.filter((c) => c.join(' ') === `send-keys -t ${TARGET} Enter`)).toHaveLength(1);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('counts the line taken once the box holds something else', async () => {
|
|
116
|
+
boxReads = [null, 'a new draft'];
|
|
117
|
+
expect(await settle(steerIntoPane(TARGET, 'look at this', true))).toBe('taken');
|
|
118
|
+
});
|
|
119
|
+
|
|
107
120
|
it('leaves the pane alone when something else is typed in its box', async () => {
|
|
108
121
|
boxText = 'a draft of my own';
|
|
109
122
|
expect(await settle(steerIntoPane(TARGET, 'look at this', true, { mode: 'now' }))).toBe('occupied');
|
|
@@ -79,6 +79,40 @@ describe("TranscriptBuilder", () => {
|
|
|
79
79
|
]);
|
|
80
80
|
});
|
|
81
81
|
|
|
82
|
+
it("reads a long paste without Claude Code's pasted_content wrapper, and matches its dictation", () => {
|
|
83
|
+
// Logged as in a real session (Claude Code 2.1.30x): a blank line, the
|
|
84
|
+
// wrapper, the paste, the closing tag carrying the same id.
|
|
85
|
+
const said = "Enquanto eu penso no que você acabou de falar, uma ideia.\nSeis. Deixa quieto.";
|
|
86
|
+
const builder = new TranscriptBuilder(false, (text) => text === said);
|
|
87
|
+
builder.feed(
|
|
88
|
+
line({
|
|
89
|
+
type: "user",
|
|
90
|
+
uuid: "u1",
|
|
91
|
+
timestamp: TS,
|
|
92
|
+
message: { role: "user", content: `\n\n<pasted_content id="c2b8">\n${said}\n</pasted_content id="c2b8">\n` },
|
|
93
|
+
origin: { kind: "human" },
|
|
94
|
+
}),
|
|
95
|
+
);
|
|
96
|
+
expect(builder.entries).toEqual([{ kind: "user", id: "u1", ts: Date.parse(TS), text: said, dictated: true }]);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("keeps the words typed ahead of a pasted block", () => {
|
|
100
|
+
const builder = new TranscriptBuilder();
|
|
101
|
+
builder.feed(
|
|
102
|
+
line({
|
|
103
|
+
type: "user",
|
|
104
|
+
uuid: "u1",
|
|
105
|
+
timestamp: TS,
|
|
106
|
+
message: {
|
|
107
|
+
role: "user",
|
|
108
|
+
content: [{ type: "text", text: 'look at this\n\n<pasted_content id="a1">\nline one\nline two\n</pasted_content id="a1">\n' }],
|
|
109
|
+
},
|
|
110
|
+
origin: { kind: "human" },
|
|
111
|
+
}),
|
|
112
|
+
);
|
|
113
|
+
expect(builder.entries[0]).toMatchObject({ kind: "user", text: "look at this\n\nline one\nline two" });
|
|
114
|
+
});
|
|
115
|
+
|
|
82
116
|
it("unwraps a slash command into its name and arguments", () => {
|
|
83
117
|
const builder = new TranscriptBuilder();
|
|
84
118
|
builder.feed(
|
|
@@ -46,6 +46,11 @@ function write(dir: string, id: string, entries: unknown[], mtime?: Date): strin
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
describe("promptText", () => {
|
|
49
|
+
it("reads a long paste out of Claude Code's pasted_content wrapper", () => {
|
|
50
|
+
const logged = '\n\n<pasted_content id="c2b8">\nlong dictated text\n</pasted_content id="c2b8">\n';
|
|
51
|
+
expect(promptText(user(logged))).toBe("long dictated text");
|
|
52
|
+
});
|
|
53
|
+
|
|
49
54
|
it("reads typed text, and a slash command as typed", () => {
|
|
50
55
|
expect(promptText(user("fix the build"))).toBe("fix the build");
|
|
51
56
|
expect(promptText(user([{ type: "text", text: "from a block" }]))).toBe("from a block");
|
|
@@ -40,6 +40,12 @@ ${text}` : text);
|
|
|
40
40
|
if (chunks.length === 0 && !LOCAL_OUTPUT_TAG.test(trimmed)) return null;
|
|
41
41
|
return chunks.join("\n");
|
|
42
42
|
}
|
|
43
|
+
const PASTED_OPEN = /<pasted_content id="[^"]*">\n?/g;
|
|
44
|
+
const PASTED_CLOSE = /\n?<\/pasted_content id="[^"]*">\n?/g;
|
|
45
|
+
function unwrapPasted(text) {
|
|
46
|
+
if (!text.includes("<pasted_content id=")) return text;
|
|
47
|
+
return text.replace(PASTED_OPEN, "").replace(PASTED_CLOSE, "\n").trim();
|
|
48
|
+
}
|
|
43
49
|
function parseAskQuestions(input) {
|
|
44
50
|
const raw = input.questions;
|
|
45
51
|
if (!Array.isArray(raw)) return [];
|
|
@@ -305,7 +311,8 @@ class TranscriptBuilder {
|
|
|
305
311
|
const attachment = asRecord(record.attachment);
|
|
306
312
|
if (!attachment || attachment.type !== "queued_command") return [];
|
|
307
313
|
if (asRecord(attachment.origin)?.kind !== "human") return [];
|
|
308
|
-
const
|
|
314
|
+
const raw = readString(attachment.prompt);
|
|
315
|
+
const prompt = raw === null ? null : unwrapPasted(raw);
|
|
309
316
|
if (!prompt || prompt.trim().length === 0) return [];
|
|
310
317
|
const uuid = readString(record.uuid) ?? `queued-${this.entries.length}`;
|
|
311
318
|
const ts = parseTimestamp(record.timestamp ?? attachment.timestamp);
|
|
@@ -378,7 +385,7 @@ class TranscriptBuilder {
|
|
|
378
385
|
if (!message) return [];
|
|
379
386
|
const uuid = readString(record.uuid) ?? `user-${this.entries.length}`;
|
|
380
387
|
const ts = parseTimestamp(record.timestamp);
|
|
381
|
-
const content = message.content;
|
|
388
|
+
const content = typeof message.content === "string" ? unwrapPasted(message.content) : message.content;
|
|
382
389
|
const origin = asRecord(record.origin);
|
|
383
390
|
if (origin?.kind === "peer") {
|
|
384
391
|
const body = readString(origin.body) ?? (typeof content === "string" ? content : null);
|
|
@@ -493,7 +500,8 @@ class TranscriptBuilder {
|
|
|
493
500
|
})
|
|
494
501
|
);
|
|
495
502
|
} else if (rec.type === "text") {
|
|
496
|
-
const
|
|
503
|
+
const raw = readString(rec.text);
|
|
504
|
+
const text = raw === null ? null : unwrapPasted(raw);
|
|
497
505
|
if (text && text.trim().length > 0) promptTexts.push(text);
|
|
498
506
|
}
|
|
499
507
|
}
|
|
@@ -1176,6 +1184,7 @@ export {
|
|
|
1176
1184
|
parseUnifiedDiff as l,
|
|
1177
1185
|
parseSlashCommand as p,
|
|
1178
1186
|
repoRoot as r,
|
|
1179
|
-
sessionWatcher as s
|
|
1187
|
+
sessionWatcher as s,
|
|
1188
|
+
unwrapPasted as u
|
|
1180
1189
|
};
|
|
1181
1190
|
//# sourceMappingURL=git.js.map
|