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.
Files changed (369) hide show
  1. package/CLAUDE.md +21 -7
  2. package/dist/fleet-places.d.ts +7 -1
  3. package/dist/fleet-places.d.ts.map +1 -1
  4. package/dist/fleet-places.js +14 -1
  5. package/dist/fleet-places.js.map +1 -1
  6. package/dist/server/dictation-marks.d.ts.map +1 -1
  7. package/dist/server/dictation-marks.js +23 -1
  8. package/dist/server/dictation-marks.js.map +1 -1
  9. package/dist/server/message-queue.d.ts +8 -5
  10. package/dist/server/message-queue.d.ts.map +1 -1
  11. package/dist/server/message-queue.js +87 -14
  12. package/dist/server/message-queue.js.map +1 -1
  13. package/dist/transcript/parser.d.ts +7 -0
  14. package/dist/transcript/parser.d.ts.map +1 -1
  15. package/dist/transcript/parser.js +19 -3
  16. package/dist/transcript/parser.js.map +1 -1
  17. package/dist/transcript/past-sessions.d.ts.map +1 -1
  18. package/dist/transcript/past-sessions.js +4 -1
  19. package/dist/transcript/past-sessions.js.map +1 -1
  20. package/dist/utils/version.d.ts +1 -1
  21. package/dist/utils/version.js +1 -1
  22. package/{web/.svelte-kit/output/client/_app/immutable/chunks/sULMfRFG.js → dist/web/client/_app/immutable/chunks/B1ueI-Jp.js} +2 -2
  23. package/dist/web/client/_app/immutable/chunks/{sULMfRFG.js.map → B1ueI-Jp.js.map} +1 -1
  24. package/dist/web/client/_app/immutable/chunks/{CtlIfY1C.js → BFJy9rwt.js} +2 -2
  25. package/{web/.svelte-kit/output/client/_app/immutable/chunks/CtlIfY1C.js.map → dist/web/client/_app/immutable/chunks/BFJy9rwt.js.map} +1 -1
  26. package/dist/web/client/_app/immutable/chunks/{Q5yhzux8.js → CHi6-HvE.js} +2 -2
  27. package/{web/.svelte-kit/output/client/_app/immutable/chunks/Q5yhzux8.js.map → dist/web/client/_app/immutable/chunks/CHi6-HvE.js.map} +1 -1
  28. package/{web/.svelte-kit/output/client/_app/immutable/chunks/BQzv8cqz.js → dist/web/client/_app/immutable/chunks/CWkKdSpD.js} +2 -2
  29. package/{web/.svelte-kit/output/client/_app/immutable/chunks/BQzv8cqz.js.map → dist/web/client/_app/immutable/chunks/CWkKdSpD.js.map} +1 -1
  30. package/dist/web/client/_app/immutable/chunks/{CiU8KBun.js → CvvlvMDB.js} +2 -2
  31. package/dist/web/client/_app/immutable/chunks/{CiU8KBun.js.map → CvvlvMDB.js.map} +1 -1
  32. package/dist/web/client/_app/immutable/chunks/{W5_HMZ5E.js → D9xWC-qj.js} +2 -2
  33. package/dist/web/client/_app/immutable/chunks/{W5_HMZ5E.js.map → D9xWC-qj.js.map} +1 -1
  34. package/dist/web/client/_app/immutable/chunks/{BQQ3-rqs.js → DJiHHJv3.js} +2 -2
  35. package/dist/web/client/_app/immutable/chunks/{BQQ3-rqs.js.map → DJiHHJv3.js.map} +1 -1
  36. package/dist/web/client/_app/immutable/chunks/{VceCNUd7.js → DLDYXkE0.js} +2 -2
  37. package/{web/.svelte-kit/output/client/_app/immutable/chunks/VceCNUd7.js.map → dist/web/client/_app/immutable/chunks/DLDYXkE0.js.map} +1 -1
  38. package/dist/web/client/_app/immutable/chunks/{CtjkAirr.js → Dl5QsiDq.js} +9 -9
  39. package/dist/web/client/_app/immutable/chunks/Dl5QsiDq.js.map +1 -0
  40. package/dist/web/client/_app/immutable/chunks/{CM0CI9GL.js → DmS4pplA.js} +3 -3
  41. package/dist/web/client/_app/immutable/chunks/{CM0CI9GL.js.map → DmS4pplA.js.map} +1 -1
  42. package/dist/web/client/_app/immutable/chunks/{XgSsj0QY.js → DnntjP1o.js} +2 -2
  43. package/{web/.svelte-kit/output/client/_app/immutable/chunks/XgSsj0QY.js.map → dist/web/client/_app/immutable/chunks/DnntjP1o.js.map} +1 -1
  44. package/dist/web/client/_app/immutable/chunks/DpTXIw4-.js +4 -0
  45. package/dist/web/client/_app/immutable/chunks/DpTXIw4-.js.map +1 -0
  46. package/dist/web/client/_app/immutable/chunks/{DlENCZqZ.js → PiwvGsYU.js} +2 -2
  47. package/dist/web/client/_app/immutable/chunks/{DlENCZqZ.js.map → PiwvGsYU.js.map} +1 -1
  48. package/dist/web/client/_app/immutable/chunks/{cvsGFvDx.js → kSW42MxU.js} +2 -2
  49. package/{web/.svelte-kit/output/client/_app/immutable/chunks/cvsGFvDx.js.map → dist/web/client/_app/immutable/chunks/kSW42MxU.js.map} +1 -1
  50. package/dist/web/client/_app/immutable/chunks/{BvX4FYxp.js → z2QK0SL-.js} +2 -2
  51. package/dist/web/client/_app/immutable/chunks/{BvX4FYxp.js.map → z2QK0SL-.js.map} +1 -1
  52. package/dist/web/client/_app/immutable/entry/{app.BwTbN8wB.js → app.DYWHzSFA.js} +3 -3
  53. 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
  54. package/dist/web/client/_app/immutable/entry/start.oS6XCDT9.js +2 -0
  55. package/dist/web/client/_app/immutable/entry/start.oS6XCDT9.js.map +1 -0
  56. package/{web/.svelte-kit/output/client/_app/immutable/nodes/0.BnHV-ElR.js → dist/web/client/_app/immutable/nodes/0.Czwb44Pq.js} +2 -2
  57. 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
  58. package/dist/web/client/_app/immutable/nodes/{1.Dc3ryOCf.js → 1.DfBNXGyJ.js} +2 -2
  59. package/dist/web/client/_app/immutable/nodes/{1.Dc3ryOCf.js.map → 1.DfBNXGyJ.js.map} +1 -1
  60. package/dist/web/client/_app/immutable/nodes/{2.DUrpAceY.js → 2.Clm1SlwT.js} +2 -2
  61. package/dist/web/client/_app/immutable/nodes/{2.DUrpAceY.js.map → 2.Clm1SlwT.js.map} +1 -1
  62. package/dist/web/client/_app/immutable/nodes/{3.BaCofjAn.js → 3.MNg0k2ol.js} +2 -2
  63. package/dist/web/client/_app/immutable/nodes/{3.BaCofjAn.js.map → 3.MNg0k2ol.js.map} +1 -1
  64. package/dist/web/client/_app/immutable/nodes/{4.v1wYkrvS.js → 4.DDSYHXWy.js} +2 -2
  65. package/dist/web/client/_app/immutable/nodes/{4.v1wYkrvS.js.map → 4.DDSYHXWy.js.map} +1 -1
  66. package/dist/web/client/_app/immutable/nodes/{5.Bn4A77jK.js → 5.CDTzRbAK.js} +2 -2
  67. package/dist/web/client/_app/immutable/nodes/{5.Bn4A77jK.js.map → 5.CDTzRbAK.js.map} +1 -1
  68. package/dist/web/client/_app/immutable/nodes/{6.C2hEoITj.js → 6.CLPKF1xx.js} +2 -2
  69. package/dist/web/client/_app/immutable/nodes/{6.C2hEoITj.js.map → 6.CLPKF1xx.js.map} +1 -1
  70. package/dist/web/client/_app/immutable/nodes/{7.BcHOjWdp.js → 7.DLF_GZUp.js} +2 -2
  71. package/dist/web/client/_app/immutable/nodes/{7.BcHOjWdp.js.map → 7.DLF_GZUp.js.map} +1 -1
  72. package/dist/web/client/_app/immutable/nodes/{8.D7NtqIYy.js → 8.OBQBHtO9.js} +2 -2
  73. package/dist/web/client/_app/immutable/nodes/{8.D7NtqIYy.js.map → 8.OBQBHtO9.js.map} +1 -1
  74. package/dist/web/client/_app/immutable/nodes/{9.D-211z9-.js → 9.Bd3JJwvV.js} +2 -2
  75. package/dist/web/client/_app/immutable/nodes/{9.D-211z9-.js.map → 9.Bd3JJwvV.js.map} +1 -1
  76. package/dist/web/client/_app/version.json +1 -1
  77. package/dist/web/server/chunks/{0-CvglVGCY.js → 0-BmH6IGke.js} +14 -14
  78. package/dist/web/server/chunks/{0-CvglVGCY.js.map → 0-BmH6IGke.js.map} +1 -1
  79. package/dist/web/server/chunks/{1-D-gJDFrG.js → 1-CjJBxrXF.js} +4 -4
  80. package/dist/web/server/chunks/{1-D-gJDFrG.js.map → 1-CjJBxrXF.js.map} +1 -1
  81. package/dist/web/server/chunks/{2-BCmEU5Qq.js → 2-Cn-SpZE3.js} +13 -13
  82. package/dist/web/server/chunks/{2-BCmEU5Qq.js.map → 2-Cn-SpZE3.js.map} +1 -1
  83. package/dist/web/server/chunks/{3-CHn5Kw-T.js → 3-DRRc_1dm.js} +10 -10
  84. package/dist/web/server/chunks/{3-CHn5Kw-T.js.map → 3-DRRc_1dm.js.map} +1 -1
  85. package/dist/web/server/chunks/{4-Cxg7VcZ7.js → 4-CxxQapQm.js} +12 -12
  86. package/dist/web/server/chunks/{4-Cxg7VcZ7.js.map → 4-CxxQapQm.js.map} +1 -1
  87. package/dist/web/server/chunks/{5-DSgvnHF_.js → 5-DD-Hn8d7.js} +9 -9
  88. package/dist/web/server/chunks/{5-DSgvnHF_.js.map → 5-DD-Hn8d7.js.map} +1 -1
  89. package/dist/web/server/chunks/{6-B0rymWRR.js → 6-DKEaLqzQ.js} +5 -5
  90. package/dist/web/server/chunks/{6-B0rymWRR.js.map → 6-DKEaLqzQ.js.map} +1 -1
  91. package/dist/web/server/chunks/{7-CNomBJux.js → 7-DNbW_v2X.js} +10 -10
  92. package/dist/web/server/chunks/{7-CNomBJux.js.map → 7-DNbW_v2X.js.map} +1 -1
  93. package/dist/web/server/chunks/{8-TYbX-1bO.js → 8-BPETDVql.js} +12 -12
  94. package/dist/web/server/chunks/{8-TYbX-1bO.js.map → 8-BPETDVql.js.map} +1 -1
  95. package/dist/web/server/chunks/{9-XGQQvTLc.js → 9-kQH8GgXO.js} +9 -9
  96. package/dist/web/server/chunks/{9-XGQQvTLc.js.map → 9-kQH8GgXO.js.map} +1 -1
  97. package/dist/web/server/chunks/{_layout.svelte-yrPX5VFm.js → _layout.svelte-DeHDxJGt.js} +58 -37
  98. package/dist/web/server/chunks/_layout.svelte-DeHDxJGt.js.map +1 -0
  99. package/dist/web/server/chunks/{_page.svelte-C_kFA0Lq.js → _page.svelte-DntYC0f2.js} +4 -4
  100. package/dist/web/server/chunks/{_page.svelte-C_kFA0Lq.js.map → _page.svelte-DntYC0f2.js.map} +1 -1
  101. package/dist/web/server/chunks/{_page.svelte-DvxpwsgS.js → _page.svelte-DpMY4uTa.js} +6 -6
  102. package/dist/web/server/chunks/{_page.svelte-DvxpwsgS.js.map → _page.svelte-DpMY4uTa.js.map} +1 -1
  103. package/dist/web/server/chunks/{_server.ts-KbQyErIR.js → _server.ts--U_0S12v.js} +2 -2
  104. package/dist/web/server/chunks/{_server.ts-KbQyErIR.js.map → _server.ts--U_0S12v.js.map} +1 -1
  105. package/dist/web/server/chunks/{_server.ts-Dz01Gvhk.js → _server.ts-0RT4n9LX.js} +2 -2
  106. package/dist/web/server/chunks/{_server.ts-Dz01Gvhk.js.map → _server.ts-0RT4n9LX.js.map} +1 -1
  107. package/dist/web/server/chunks/{_server.ts-TN_Ka6cR.js → _server.ts-4m17ESHV.js} +2 -2
  108. package/dist/web/server/chunks/{_server.ts-TN_Ka6cR.js.map → _server.ts-4m17ESHV.js.map} +1 -1
  109. package/dist/web/server/chunks/{_server.ts-Bj1Eewby.js → _server.ts-8Bs2jUgD.js} +2 -2
  110. package/dist/web/server/chunks/{_server.ts-Bj1Eewby.js.map → _server.ts-8Bs2jUgD.js.map} +1 -1
  111. package/dist/web/server/chunks/{_server.ts-9iRpDv9e.js → _server.ts-B9dTG4Gs.js} +2 -2
  112. package/dist/web/server/chunks/{_server.ts-9iRpDv9e.js.map → _server.ts-B9dTG4Gs.js.map} +1 -1
  113. package/dist/web/server/chunks/{_server.ts-CNBy2p2U.js → _server.ts-BBeDdZMo.js} +2 -2
  114. package/dist/web/server/chunks/{_server.ts-CNBy2p2U.js.map → _server.ts-BBeDdZMo.js.map} +1 -1
  115. package/dist/web/server/chunks/{_server.ts-AAllMdwT.js → _server.ts-BOIIbvcd.js} +2 -2
  116. package/dist/web/server/chunks/{_server.ts-AAllMdwT.js.map → _server.ts-BOIIbvcd.js.map} +1 -1
  117. package/dist/web/server/chunks/{_server.ts-CyOA1rOq.js → _server.ts-BQNv3Qn9.js} +3 -3
  118. package/dist/web/server/chunks/{_server.ts-CyOA1rOq.js.map → _server.ts-BQNv3Qn9.js.map} +1 -1
  119. package/dist/web/server/chunks/{_server.ts-FoPsfjo3.js → _server.ts-BYyaN7ik.js} +2 -2
  120. package/dist/web/server/chunks/{_server.ts-FoPsfjo3.js.map → _server.ts-BYyaN7ik.js.map} +1 -1
  121. package/dist/web/server/chunks/{_server.ts-DVgdt6Zu.js → _server.ts-C0jQSpvq.js} +3 -3
  122. package/dist/web/server/chunks/{_server.ts-DVgdt6Zu.js.map → _server.ts-C0jQSpvq.js.map} +1 -1
  123. package/dist/web/server/chunks/{_server.ts-CSK1ReRS.js → _server.ts-CBU5vhD8.js} +2 -2
  124. package/dist/web/server/chunks/{_server.ts-CSK1ReRS.js.map → _server.ts-CBU5vhD8.js.map} +1 -1
  125. package/dist/web/server/chunks/{_server.ts-ji7L8HUR.js → _server.ts-CKlhUlhI.js} +3 -3
  126. package/dist/web/server/chunks/{_server.ts-ji7L8HUR.js.map → _server.ts-CKlhUlhI.js.map} +1 -1
  127. package/dist/web/server/chunks/{_server.ts-DPctaiWC.js → _server.ts-COCrEIiW.js} +2 -2
  128. package/dist/web/server/chunks/{_server.ts-DPctaiWC.js.map → _server.ts-COCrEIiW.js.map} +1 -1
  129. package/dist/web/server/chunks/{_server.ts-C7uhdF7Y.js → _server.ts-CPCsEz_B.js} +4 -4
  130. package/dist/web/server/chunks/{_server.ts-C7uhdF7Y.js.map → _server.ts-CPCsEz_B.js.map} +1 -1
  131. package/dist/web/server/chunks/{_server.ts-DsyqZudf.js → _server.ts-CPGa_LDW.js} +2 -2
  132. package/dist/web/server/chunks/{_server.ts-DsyqZudf.js.map → _server.ts-CPGa_LDW.js.map} +1 -1
  133. package/dist/web/server/chunks/{_server.ts-DrFiP32b.js → _server.ts-CPrFFsh-.js} +3 -3
  134. package/dist/web/server/chunks/{_server.ts-DrFiP32b.js.map → _server.ts-CPrFFsh-.js.map} +1 -1
  135. package/dist/web/server/chunks/{_server.ts-Cv8SUkC5.js → _server.ts-CQywkS_H.js} +3 -3
  136. package/dist/web/server/chunks/{_server.ts-Cv8SUkC5.js.map → _server.ts-CQywkS_H.js.map} +1 -1
  137. package/dist/web/server/chunks/{_server.ts-B9RfKfyc.js → _server.ts-CSbdJ5iI.js} +2 -2
  138. package/dist/web/server/chunks/{_server.ts-B9RfKfyc.js.map → _server.ts-CSbdJ5iI.js.map} +1 -1
  139. package/dist/web/server/chunks/{_server.ts-CwFbAWCg.js → _server.ts-CXzAFIps.js} +2 -2
  140. package/dist/web/server/chunks/{_server.ts-CwFbAWCg.js.map → _server.ts-CXzAFIps.js.map} +1 -1
  141. package/dist/web/server/chunks/{_server.ts-DHuyjZQx.js → _server.ts-C_H2gKKu.js} +2 -2
  142. package/dist/web/server/chunks/{_server.ts-DHuyjZQx.js.map → _server.ts-C_H2gKKu.js.map} +1 -1
  143. package/dist/web/server/chunks/{_server.ts-DozhhYwq.js → _server.ts-CbS7DnV7.js} +3 -3
  144. package/dist/web/server/chunks/{_server.ts-DozhhYwq.js.map → _server.ts-CbS7DnV7.js.map} +1 -1
  145. package/dist/web/server/chunks/{_server.ts-DK-6ddNq.js → _server.ts-CfIP7qf6.js} +3 -3
  146. package/dist/web/server/chunks/{_server.ts-DK-6ddNq.js.map → _server.ts-CfIP7qf6.js.map} +1 -1
  147. package/dist/web/server/chunks/{_server.ts-BWVtnpJh.js → _server.ts-Crdideoe.js} +3 -3
  148. package/dist/web/server/chunks/{_server.ts-BWVtnpJh.js.map → _server.ts-Crdideoe.js.map} +1 -1
  149. package/dist/web/server/chunks/{_server.ts-CA8nszPb.js → _server.ts-D5FI04La.js} +3 -3
  150. package/dist/web/server/chunks/{_server.ts-CA8nszPb.js.map → _server.ts-D5FI04La.js.map} +1 -1
  151. package/dist/web/server/chunks/{_server.ts-78nODRDJ.js → _server.ts-DAjvFQRk.js} +2 -2
  152. package/dist/web/server/chunks/{_server.ts-78nODRDJ.js.map → _server.ts-DAjvFQRk.js.map} +1 -1
  153. package/dist/web/server/chunks/{_server.ts-vhti5VvF.js → _server.ts-DGvNQ4Mq.js} +3 -3
  154. package/dist/web/server/chunks/{_server.ts-vhti5VvF.js.map → _server.ts-DGvNQ4Mq.js.map} +1 -1
  155. package/dist/web/server/chunks/{_server.ts-BozsVs8t.js → _server.ts-DUlnfVa3.js} +2 -2
  156. package/dist/web/server/chunks/{_server.ts-BozsVs8t.js.map → _server.ts-DUlnfVa3.js.map} +1 -1
  157. package/dist/web/server/chunks/{_server.ts-CA1j9wWk.js → _server.ts-DZrVaelC.js} +2 -2
  158. package/dist/web/server/chunks/{_server.ts-CA1j9wWk.js.map → _server.ts-DZrVaelC.js.map} +1 -1
  159. package/dist/web/server/chunks/{_server.ts-CovkmnvY.js → _server.ts-DZyOwdre.js} +3 -3
  160. package/dist/web/server/chunks/{_server.ts-CovkmnvY.js.map → _server.ts-DZyOwdre.js.map} +1 -1
  161. package/dist/web/server/chunks/{_server.ts-DQJ-tygD.js → _server.ts-DfzLASfY.js} +2 -2
  162. package/dist/web/server/chunks/{_server.ts-DQJ-tygD.js.map → _server.ts-DfzLASfY.js.map} +1 -1
  163. package/dist/web/server/chunks/{_server.ts-D2Tvcncu.js → _server.ts-Ds8fP3ak.js} +3 -3
  164. package/dist/web/server/chunks/{_server.ts-D2Tvcncu.js.map → _server.ts-Ds8fP3ak.js.map} +1 -1
  165. package/dist/web/server/chunks/{_server.ts-CgChlIKq.js → _server.ts-DxGjRezI.js} +2 -2
  166. package/dist/web/server/chunks/{_server.ts-CgChlIKq.js.map → _server.ts-DxGjRezI.js.map} +1 -1
  167. package/dist/web/server/chunks/{_server.ts-1ZhqL5o8.js → _server.ts-P-GtOUhW.js} +2 -2
  168. package/dist/web/server/chunks/{_server.ts-1ZhqL5o8.js.map → _server.ts-P-GtOUhW.js.map} +1 -1
  169. package/dist/web/server/chunks/{_server.ts-iK8ih9Bi.js → _server.ts-PQZACnJh.js} +2 -2
  170. package/dist/web/server/chunks/{_server.ts-iK8ih9Bi.js.map → _server.ts-PQZACnJh.js.map} +1 -1
  171. package/dist/web/server/chunks/{_server.ts-VgbTPrqV.js → _server.ts-WtstJm2K.js} +2 -2
  172. package/dist/web/server/chunks/{_server.ts-VgbTPrqV.js.map → _server.ts-WtstJm2K.js.map} +1 -1
  173. package/dist/web/server/chunks/{_server.ts-DGTSZoLn.js → _server.ts-dvT2bXEB.js} +2 -2
  174. package/dist/web/server/chunks/{_server.ts-DGTSZoLn.js.map → _server.ts-dvT2bXEB.js.map} +1 -1
  175. package/dist/web/server/chunks/{_server.ts-BxscGs8D.js → _server.ts-m835uDm6.js} +2 -2
  176. package/dist/web/server/chunks/{_server.ts-BxscGs8D.js.map → _server.ts-m835uDm6.js.map} +1 -1
  177. package/dist/web/server/chunks/{_server.ts-CzcknkWq.js → _server.ts-wsNKi_0h.js} +2 -2
  178. package/dist/web/server/chunks/{_server.ts-CzcknkWq.js.map → _server.ts-wsNKi_0h.js.map} +1 -1
  179. package/dist/web/server/chunks/{checkbox-DiJTAtHi.js → checkbox-Gt0K_cvq.js} +2 -2
  180. package/dist/web/server/chunks/{checkbox-DiJTAtHi.js.map → checkbox-Gt0K_cvq.js.map} +1 -1
  181. package/dist/web/server/chunks/{create-id-DpoSQWrl.js → create-id-CwRBEuSe.js} +3 -3
  182. package/dist/web/server/chunks/{create-id-DpoSQWrl.js.map → create-id-CwRBEuSe.js.map} +1 -1
  183. package/dist/web/server/chunks/{discover-DjR28OqK.js → discover-DykzHz0t.js} +2 -2
  184. package/dist/web/server/chunks/{discover-DjR28OqK.js.map → discover-DykzHz0t.js.map} +1 -1
  185. package/dist/web/server/chunks/{drafts.svelte-DsFAtH-s.js → drafts.svelte-Bs3uu0o9.js} +3 -3
  186. package/dist/web/server/chunks/{drafts.svelte-DsFAtH-s.js.map → drafts.svelte-Bs3uu0o9.js.map} +1 -1
  187. package/dist/web/server/chunks/{end-session-BbBa9yD0.js → end-session-ChFkyGma.js} +2 -2
  188. package/dist/web/server/chunks/{end-session-BbBa9yD0.js.map → end-session-ChFkyGma.js.map} +1 -1
  189. package/dist/web/server/chunks/{files-4i3igWea.js → files-DNH191y7.js} +2 -2
  190. package/dist/web/server/chunks/{files-4i3igWea.js.map → files-DNH191y7.js.map} +1 -1
  191. package/dist/web/server/chunks/{fleet-DZJSFWuH.js → fleet-OhxUuYh1.js} +4 -4
  192. package/dist/web/server/chunks/{fleet-DZJSFWuH.js.map → fleet-OhxUuYh1.js.map} +1 -1
  193. package/dist/web/server/chunks/{git-D9dLEKUF.js → git-CHO9UIOQ.js} +13 -5
  194. package/dist/web/server/chunks/git-CHO9UIOQ.js.map +1 -0
  195. package/dist/web/server/chunks/{git-history-De9t0yF-.js → git-history-CxyH4jQb.js} +2 -2
  196. package/dist/web/server/chunks/{git-history-De9t0yF-.js.map → git-history-CxyH4jQb.js.map} +1 -1
  197. package/dist/web/server/chunks/{hooks.server-C3Uglne7.js → hooks.server-CBWcxR_B.js} +6 -6
  198. package/dist/web/server/chunks/{hooks.server-C3Uglne7.js.map → hooks.server-CBWcxR_B.js.map} +1 -1
  199. package/dist/web/server/chunks/{message-queue-sFcJCRjz.js → message-queue-DcPUlVz5.js} +69 -15
  200. package/dist/web/server/chunks/message-queue-DcPUlVz5.js.map +1 -0
  201. package/dist/web/server/chunks/{project-CbPa8Mu7.js → project-CBPdIh2n.js} +2 -2
  202. package/dist/web/server/chunks/{project-CbPa8Mu7.js.map → project-CBPdIh2n.js.map} +1 -1
  203. package/dist/web/server/chunks/{project-icons-CSb1bfT9.js → project-icons-bWhaFSVy.js} +4 -4
  204. package/dist/web/server/chunks/{project-icons-CSb1bfT9.js.map → project-icons-bWhaFSVy.js.map} +1 -1
  205. package/dist/web/server/chunks/{push-BJ7P9DGd.js → push-B1bEhIC-.js} +5 -5
  206. package/dist/web/server/chunks/{push-BJ7P9DGd.js.map → push-B1bEhIC-.js.map} +1 -1
  207. package/dist/web/server/chunks/{remote-control-C1d9R3w4.js → remote-control-qMrIrQCU.js} +2 -2
  208. package/dist/web/server/chunks/{remote-control-C1d9R3w4.js.map → remote-control-qMrIrQCU.js.map} +1 -1
  209. package/dist/web/server/chunks/{start-session-CKbupnLS.js → start-session-C9loHv64.js} +3 -3
  210. package/dist/web/server/chunks/{start-session-CKbupnLS.js.map → start-session-C9loHv64.js.map} +1 -1
  211. package/dist/web/server/chunks/{version-BqEJmw2g.js → version-Dfokr2tc.js} +2 -2
  212. package/dist/web/server/chunks/version-Dfokr2tc.js.map +1 -0
  213. package/dist/web/server/chunks/{web-preview-Bi5fjydK.js → web-preview-H5eiWlBD.js} +2 -2
  214. package/dist/web/server/chunks/{web-preview-Bi5fjydK.js.map → web-preview-H5eiWlBD.js.map} +1 -1
  215. package/dist/web/server/chunks/{ws-handlers-zemeJ8Si.js → ws-handlers-D8kw9RG2.js} +6 -5
  216. package/dist/web/server/chunks/ws-handlers-D8kw9RG2.js.map +1 -0
  217. package/dist/web/server/chunks/{ws-managers-C5VXKb_r.js → ws-managers-CsT346dr.js} +2 -2
  218. package/dist/web/server/chunks/{ws-managers-C5VXKb_r.js.map → ws-managers-CsT346dr.js.map} +1 -1
  219. package/dist/web/server/chunks/{ws-messages-jOSwT1Yq.js → ws-messages-B81v2RXg.js} +7 -2
  220. package/dist/web/server/chunks/ws-messages-B81v2RXg.js.map +1 -0
  221. package/dist/web/server/index.js +2 -2
  222. package/dist/web/server/index.js.map +1 -1
  223. package/dist/web/server/manifest.js +53 -53
  224. package/dist/web/server/manifest.js.map +1 -1
  225. package/package.json +1 -1
  226. package/src/fleet-places.ts +17 -1
  227. package/src/server/dictation-marks.ts +24 -1
  228. package/src/server/message-queue.ts +79 -13
  229. package/src/transcript/parser.ts +20 -3
  230. package/src/transcript/past-sessions.ts +3 -1
  231. package/src/utils/version.ts +1 -1
  232. package/tests/fleet-places.test.ts +20 -0
  233. package/tests/server/dictation-marks.test.ts +16 -0
  234. package/tests/server/steer.test.ts +14 -1
  235. package/tests/transcript/parser.test.ts +34 -0
  236. package/tests/transcript/past-sessions.test.ts +5 -0
  237. package/web/.svelte-kit/adapter-bun/.vite/manifest.json +2 -1
  238. package/web/.svelte-kit/adapter-bun/chunks/git.js +13 -4
  239. package/web/.svelte-kit/adapter-bun/chunks/git.js.map +1 -1
  240. package/web/.svelte-kit/adapter-bun/chunks/internal2.js +1 -1
  241. package/web/.svelte-kit/adapter-bun/chunks/internal2.js.map +1 -1
  242. package/web/.svelte-kit/adapter-bun/chunks/message-queue.js +73 -9
  243. package/web/.svelte-kit/adapter-bun/chunks/message-queue.js.map +1 -1
  244. package/web/.svelte-kit/adapter-bun/chunks/version.js +1 -1
  245. package/web/.svelte-kit/adapter-bun/chunks/version.js.map +1 -1
  246. package/web/.svelte-kit/adapter-bun/chunks/ws-handlers.js +2 -1
  247. package/web/.svelte-kit/adapter-bun/chunks/ws-handlers.js.map +1 -1
  248. package/web/.svelte-kit/adapter-bun/chunks/ws-messages.js +6 -1
  249. package/web/.svelte-kit/adapter-bun/chunks/ws-messages.js.map +1 -1
  250. package/web/.svelte-kit/adapter-bun/entries/pages/_layout.svelte.js +72 -45
  251. package/web/.svelte-kit/adapter-bun/entries/pages/_layout.svelte.js.map +1 -1
  252. package/web/.svelte-kit/adapter-bun/manifest-full.js +1 -1
  253. package/web/.svelte-kit/adapter-bun/manifest.js +1 -1
  254. package/web/.svelte-kit/adapter-bun/nodes/0.js +1 -1
  255. package/web/.svelte-kit/adapter-bun/nodes/1.js +1 -1
  256. package/web/.svelte-kit/adapter-bun/nodes/2.js +1 -1
  257. package/web/.svelte-kit/adapter-bun/nodes/3.js +1 -1
  258. package/web/.svelte-kit/adapter-bun/nodes/4.js +1 -1
  259. package/web/.svelte-kit/adapter-bun/nodes/5.js +1 -1
  260. package/web/.svelte-kit/adapter-bun/nodes/6.js +1 -1
  261. package/web/.svelte-kit/adapter-bun/nodes/7.js +1 -1
  262. package/web/.svelte-kit/adapter-bun/nodes/8.js +1 -1
  263. package/web/.svelte-kit/adapter-bun/nodes/9.js +1 -1
  264. package/web/.svelte-kit/generated/server/internal.js +1 -1
  265. package/web/.svelte-kit/output/client/.vite/manifest.json +208 -208
  266. package/{dist/web/client/_app/immutable/chunks/sULMfRFG.js → web/.svelte-kit/output/client/_app/immutable/chunks/B1ueI-Jp.js} +2 -2
  267. package/web/.svelte-kit/output/client/_app/immutable/chunks/{sULMfRFG.js.map → B1ueI-Jp.js.map} +1 -1
  268. package/web/.svelte-kit/output/client/_app/immutable/chunks/{CtlIfY1C.js → BFJy9rwt.js} +2 -2
  269. package/{dist/web/client/_app/immutable/chunks/CtlIfY1C.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/BFJy9rwt.js.map} +1 -1
  270. package/web/.svelte-kit/output/client/_app/immutable/chunks/{Q5yhzux8.js → CHi6-HvE.js} +2 -2
  271. package/{dist/web/client/_app/immutable/chunks/Q5yhzux8.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/CHi6-HvE.js.map} +1 -1
  272. package/{dist/web/client/_app/immutable/chunks/BQzv8cqz.js → web/.svelte-kit/output/client/_app/immutable/chunks/CWkKdSpD.js} +2 -2
  273. package/{dist/web/client/_app/immutable/chunks/BQzv8cqz.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/CWkKdSpD.js.map} +1 -1
  274. package/web/.svelte-kit/output/client/_app/immutable/chunks/{CiU8KBun.js → CvvlvMDB.js} +2 -2
  275. package/web/.svelte-kit/output/client/_app/immutable/chunks/{CiU8KBun.js.map → CvvlvMDB.js.map} +1 -1
  276. package/web/.svelte-kit/output/client/_app/immutable/chunks/{W5_HMZ5E.js → D9xWC-qj.js} +2 -2
  277. package/web/.svelte-kit/output/client/_app/immutable/chunks/{W5_HMZ5E.js.map → D9xWC-qj.js.map} +1 -1
  278. package/web/.svelte-kit/output/client/_app/immutable/chunks/{BQQ3-rqs.js → DJiHHJv3.js} +2 -2
  279. package/web/.svelte-kit/output/client/_app/immutable/chunks/{BQQ3-rqs.js.map → DJiHHJv3.js.map} +1 -1
  280. package/web/.svelte-kit/output/client/_app/immutable/chunks/{VceCNUd7.js → DLDYXkE0.js} +2 -2
  281. package/{dist/web/client/_app/immutable/chunks/VceCNUd7.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/DLDYXkE0.js.map} +1 -1
  282. package/web/.svelte-kit/output/client/_app/immutable/chunks/{CtjkAirr.js → Dl5QsiDq.js} +9 -9
  283. package/web/.svelte-kit/output/client/_app/immutable/chunks/Dl5QsiDq.js.map +1 -0
  284. package/web/.svelte-kit/output/client/_app/immutable/chunks/{CM0CI9GL.js → DmS4pplA.js} +3 -3
  285. package/web/.svelte-kit/output/client/_app/immutable/chunks/{CM0CI9GL.js.map → DmS4pplA.js.map} +1 -1
  286. package/web/.svelte-kit/output/client/_app/immutable/chunks/{XgSsj0QY.js → DnntjP1o.js} +2 -2
  287. package/{dist/web/client/_app/immutable/chunks/XgSsj0QY.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/DnntjP1o.js.map} +1 -1
  288. package/web/.svelte-kit/output/client/_app/immutable/chunks/DpTXIw4-.js +4 -0
  289. package/web/.svelte-kit/output/client/_app/immutable/chunks/DpTXIw4-.js.map +1 -0
  290. package/web/.svelte-kit/output/client/_app/immutable/chunks/{DlENCZqZ.js → PiwvGsYU.js} +2 -2
  291. package/web/.svelte-kit/output/client/_app/immutable/chunks/{DlENCZqZ.js.map → PiwvGsYU.js.map} +1 -1
  292. package/web/.svelte-kit/output/client/_app/immutable/chunks/{cvsGFvDx.js → kSW42MxU.js} +2 -2
  293. package/{dist/web/client/_app/immutable/chunks/cvsGFvDx.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/kSW42MxU.js.map} +1 -1
  294. package/web/.svelte-kit/output/client/_app/immutable/chunks/{BvX4FYxp.js → z2QK0SL-.js} +2 -2
  295. package/web/.svelte-kit/output/client/_app/immutable/chunks/{BvX4FYxp.js.map → z2QK0SL-.js.map} +1 -1
  296. package/web/.svelte-kit/output/client/_app/immutable/entry/{app.BwTbN8wB.js → app.DYWHzSFA.js} +3 -3
  297. 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
  298. package/web/.svelte-kit/output/client/_app/immutable/entry/start.oS6XCDT9.js +2 -0
  299. package/web/.svelte-kit/output/client/_app/immutable/entry/start.oS6XCDT9.js.map +1 -0
  300. package/{dist/web/client/_app/immutable/nodes/0.BnHV-ElR.js → web/.svelte-kit/output/client/_app/immutable/nodes/0.Czwb44Pq.js} +2 -2
  301. 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
  302. package/web/.svelte-kit/output/client/_app/immutable/nodes/{1.Dc3ryOCf.js → 1.DfBNXGyJ.js} +2 -2
  303. package/web/.svelte-kit/output/client/_app/immutable/nodes/{1.Dc3ryOCf.js.map → 1.DfBNXGyJ.js.map} +1 -1
  304. package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.DUrpAceY.js → 2.Clm1SlwT.js} +2 -2
  305. package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.DUrpAceY.js.map → 2.Clm1SlwT.js.map} +1 -1
  306. package/web/.svelte-kit/output/client/_app/immutable/nodes/{3.BaCofjAn.js → 3.MNg0k2ol.js} +2 -2
  307. package/web/.svelte-kit/output/client/_app/immutable/nodes/{3.BaCofjAn.js.map → 3.MNg0k2ol.js.map} +1 -1
  308. package/web/.svelte-kit/output/client/_app/immutable/nodes/4.DDSYHXWy.js +2 -0
  309. package/web/.svelte-kit/output/client/_app/immutable/nodes/{4.v1wYkrvS.js.map → 4.DDSYHXWy.js.map} +1 -1
  310. package/web/.svelte-kit/output/client/_app/immutable/nodes/5.CDTzRbAK.js +2 -0
  311. package/web/.svelte-kit/output/client/_app/immutable/nodes/{5.Bn4A77jK.js.map → 5.CDTzRbAK.js.map} +1 -1
  312. package/web/.svelte-kit/output/client/_app/immutable/nodes/{6.C2hEoITj.js → 6.CLPKF1xx.js} +2 -2
  313. package/web/.svelte-kit/output/client/_app/immutable/nodes/{6.C2hEoITj.js.map → 6.CLPKF1xx.js.map} +1 -1
  314. package/web/.svelte-kit/output/client/_app/immutable/nodes/{7.BcHOjWdp.js → 7.DLF_GZUp.js} +2 -2
  315. package/web/.svelte-kit/output/client/_app/immutable/nodes/{7.BcHOjWdp.js.map → 7.DLF_GZUp.js.map} +1 -1
  316. package/web/.svelte-kit/output/client/_app/immutable/nodes/8.OBQBHtO9.js +2 -0
  317. package/web/.svelte-kit/output/client/_app/immutable/nodes/{8.D7NtqIYy.js.map → 8.OBQBHtO9.js.map} +1 -1
  318. package/web/.svelte-kit/output/client/_app/immutable/nodes/9.Bd3JJwvV.js +2 -0
  319. package/web/.svelte-kit/output/client/_app/immutable/nodes/{9.D-211z9-.js.map → 9.Bd3JJwvV.js.map} +1 -1
  320. package/web/.svelte-kit/output/client/_app/version.json +1 -1
  321. package/web/.svelte-kit/output/server/.vite/manifest.json +2 -1
  322. package/web/.svelte-kit/output/server/chunks/git.js +13 -4
  323. package/web/.svelte-kit/output/server/chunks/git.js.map +1 -1
  324. package/web/.svelte-kit/output/server/chunks/internal2.js +1 -1
  325. package/web/.svelte-kit/output/server/chunks/internal2.js.map +1 -1
  326. package/web/.svelte-kit/output/server/chunks/message-queue.js +73 -9
  327. package/web/.svelte-kit/output/server/chunks/message-queue.js.map +1 -1
  328. package/web/.svelte-kit/output/server/chunks/version.js +1 -1
  329. package/web/.svelte-kit/output/server/chunks/version.js.map +1 -1
  330. package/web/.svelte-kit/output/server/chunks/ws-handlers.js +2 -1
  331. package/web/.svelte-kit/output/server/chunks/ws-handlers.js.map +1 -1
  332. package/web/.svelte-kit/output/server/chunks/ws-messages.js +6 -1
  333. package/web/.svelte-kit/output/server/chunks/ws-messages.js.map +1 -1
  334. package/web/.svelte-kit/output/server/entries/pages/_layout.svelte.js +72 -45
  335. package/web/.svelte-kit/output/server/entries/pages/_layout.svelte.js.map +1 -1
  336. package/web/.svelte-kit/output/server/manifest-full.js +1 -1
  337. package/web/.svelte-kit/output/server/manifest.js +1 -1
  338. package/web/.svelte-kit/output/server/nodes/0.js +1 -1
  339. package/web/.svelte-kit/output/server/nodes/1.js +1 -1
  340. package/web/.svelte-kit/output/server/nodes/2.js +1 -1
  341. package/web/.svelte-kit/output/server/nodes/3.js +1 -1
  342. package/web/.svelte-kit/output/server/nodes/4.js +1 -1
  343. package/web/.svelte-kit/output/server/nodes/5.js +1 -1
  344. package/web/.svelte-kit/output/server/nodes/6.js +1 -1
  345. package/web/.svelte-kit/output/server/nodes/7.js +1 -1
  346. package/web/.svelte-kit/output/server/nodes/8.js +1 -1
  347. package/web/.svelte-kit/output/server/nodes/9.js +1 -1
  348. package/web/src/lib/components/AllSessionsPanel.svelte +9 -1
  349. package/web/src/lib/components/FolderPicker.svelte +49 -21
  350. package/dist/web/client/_app/immutable/chunks/CtjkAirr.js.map +0 -1
  351. package/dist/web/client/_app/immutable/chunks/Dck--FBb.js +0 -4
  352. package/dist/web/client/_app/immutable/chunks/Dck--FBb.js.map +0 -1
  353. package/dist/web/client/_app/immutable/entry/start.B2ZPizAt.js +0 -2
  354. package/dist/web/client/_app/immutable/entry/start.B2ZPizAt.js.map +0 -1
  355. package/dist/web/server/chunks/_layout.svelte-yrPX5VFm.js.map +0 -1
  356. package/dist/web/server/chunks/git-D9dLEKUF.js.map +0 -1
  357. package/dist/web/server/chunks/message-queue-sFcJCRjz.js.map +0 -1
  358. package/dist/web/server/chunks/version-BqEJmw2g.js.map +0 -1
  359. package/dist/web/server/chunks/ws-handlers-zemeJ8Si.js.map +0 -1
  360. package/dist/web/server/chunks/ws-messages-jOSwT1Yq.js.map +0 -1
  361. package/web/.svelte-kit/output/client/_app/immutable/chunks/CtjkAirr.js.map +0 -1
  362. package/web/.svelte-kit/output/client/_app/immutable/chunks/Dck--FBb.js +0 -4
  363. package/web/.svelte-kit/output/client/_app/immutable/chunks/Dck--FBb.js.map +0 -1
  364. package/web/.svelte-kit/output/client/_app/immutable/entry/start.B2ZPizAt.js +0 -2
  365. package/web/.svelte-kit/output/client/_app/immutable/entry/start.B2ZPizAt.js.map +0 -1
  366. package/web/.svelte-kit/output/client/_app/immutable/nodes/4.v1wYkrvS.js +0 -2
  367. package/web/.svelte-kit/output/client/_app/immutable/nodes/5.Bn4A77jK.js +0 -2
  368. package/web/.svelte-kit/output/client/_app/immutable/nodes/8.D7NtqIYy.js +0 -2
  369. 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 long Claude Code gets to take a pasted line before the box is read. */
118
- const SUBMIT_SETTLE_MS = 600;
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 and the box shows the hint for that. Text still sitting there
124
- * typed means the Enter was lost, which happens when the paste and the key
125
- * land inside the same input burst; one more Enter is sent, and the box read
126
- * again. Resolves false when the text is still there after that.
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
- for (let attempt = 0; attempt < 2; attempt++) {
130
- await new Promise((r) => setTimeout(r, SUBMIT_SETTLE_MS));
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 (attempt === 0) execFileSync('tmux', ['send-keys', '-t', target, 'Enter'], { stdio: 'ignore' });
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
  /**
@@ -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 prompt = readString(attachment.prompt);
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 text = readString(rec.text);
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);
@@ -2,4 +2,4 @@
2
2
  * Central version constant for claude-watch.
3
3
  * Keep in sync with package.json version.
4
4
  */
5
- export const VERSION = "0.30.13";
5
+ export const VERSION = "0.30.15";
@@ -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(2000);
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");
@@ -417,7 +417,8 @@
417
417
  "_paths.js",
418
418
  "_pid.js",
419
419
  "_pane.js",
420
- "_attachments.js"
420
+ "_attachments.js",
421
+ "_tailer.js"
421
422
  ]
422
423
  },
423
424
  "_page-origin.js": {
@@ -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 prompt = readString(attachment.prompt);
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 text = readString(rec.text);
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