@juspay/shooter 1.17.0 → 1.19.0

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 (342) hide show
  1. package/build/client/_app/immutable/assets/{0.B0O0vCnX.css → 0.BwNtE8TX.css} +1 -1
  2. package/build/client/_app/immutable/assets/0.BwNtE8TX.css.br +0 -0
  3. package/build/client/_app/immutable/assets/{0.B0O0vCnX.css.gz → 0.BwNtE8TX.css.gz} +0 -0
  4. package/build/client/_app/immutable/assets/8.BYgAX7hR.css +1 -0
  5. package/build/client/_app/immutable/assets/8.BYgAX7hR.css.br +0 -0
  6. package/build/client/_app/immutable/assets/8.BYgAX7hR.css.gz +0 -0
  7. package/build/client/_app/immutable/assets/9.DV6pZunn.css +1 -0
  8. package/build/client/_app/immutable/assets/9.DV6pZunn.css.br +0 -0
  9. package/build/client/_app/immutable/assets/9.DV6pZunn.css.gz +0 -0
  10. package/build/client/_app/immutable/chunks/{DZQMsHM5.js → 2rBV5OkJ.js} +1 -1
  11. package/build/client/_app/immutable/chunks/2rBV5OkJ.js.br +0 -0
  12. package/build/client/_app/immutable/chunks/2rBV5OkJ.js.gz +0 -0
  13. package/build/client/_app/immutable/chunks/BB2l8o4X.js +1 -0
  14. package/build/client/_app/immutable/chunks/BB2l8o4X.js.br +0 -0
  15. package/build/client/_app/immutable/chunks/BB2l8o4X.js.gz +0 -0
  16. package/build/client/_app/immutable/chunks/{Cg3dlX05.js → BPDiEZo0.js} +2 -2
  17. package/build/client/_app/immutable/chunks/BPDiEZo0.js.br +0 -0
  18. package/build/client/_app/immutable/chunks/BPDiEZo0.js.gz +0 -0
  19. package/build/client/_app/immutable/chunks/{C_9BZILB.js → BcpydfqI.js} +1 -1
  20. package/build/client/_app/immutable/chunks/BcpydfqI.js.br +0 -0
  21. package/build/client/_app/immutable/chunks/BcpydfqI.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/BcqA7eKM.js +3 -0
  23. package/build/client/_app/immutable/chunks/BcqA7eKM.js.br +0 -0
  24. package/build/client/_app/immutable/chunks/BcqA7eKM.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/BdtLzPpO.js +1 -0
  26. package/build/client/_app/immutable/chunks/BdtLzPpO.js.br +0 -0
  27. package/build/client/_app/immutable/chunks/BdtLzPpO.js.gz +0 -0
  28. package/build/client/_app/immutable/chunks/{BRqaaL5D.js → BvmdJful.js} +1 -1
  29. package/build/client/_app/immutable/chunks/BvmdJful.js.br +0 -0
  30. package/build/client/_app/immutable/chunks/BvmdJful.js.gz +0 -0
  31. package/build/client/_app/immutable/chunks/{C5VOyQCG.js → ClIPTXf3.js} +1 -1
  32. package/build/client/_app/immutable/chunks/ClIPTXf3.js.br +0 -0
  33. package/build/client/_app/immutable/chunks/ClIPTXf3.js.gz +0 -0
  34. package/build/client/_app/immutable/chunks/{BctvtE4d.js → DA4Zt9Me.js} +1 -1
  35. package/build/client/_app/immutable/chunks/DA4Zt9Me.js.br +0 -0
  36. package/build/client/_app/immutable/chunks/{BctvtE4d.js.gz → DA4Zt9Me.js.gz} +0 -0
  37. package/build/client/_app/immutable/chunks/{CjfxuHdN.js → DCDL_9ys.js} +1 -1
  38. package/build/client/_app/immutable/chunks/DCDL_9ys.js.br +0 -0
  39. package/build/client/_app/immutable/chunks/DCDL_9ys.js.gz +0 -0
  40. package/build/client/_app/immutable/chunks/{DYuMZGL5.js → DWmC0QM7.js} +1 -1
  41. package/build/client/_app/immutable/chunks/DWmC0QM7.js.br +0 -0
  42. package/build/client/_app/immutable/chunks/DWmC0QM7.js.gz +0 -0
  43. package/build/client/_app/immutable/chunks/{DZvnhU_8.js → ZS5XYDx_.js} +2 -2
  44. package/build/client/_app/immutable/chunks/ZS5XYDx_.js.br +0 -0
  45. package/build/client/_app/immutable/chunks/ZS5XYDx_.js.gz +0 -0
  46. package/build/client/_app/immutable/entry/app.D4TXlu7A.js +2 -0
  47. package/build/client/_app/immutable/entry/app.D4TXlu7A.js.br +0 -0
  48. package/build/client/_app/immutable/entry/app.D4TXlu7A.js.gz +0 -0
  49. package/build/client/_app/immutable/entry/start.BBQhtURO.js +1 -0
  50. package/build/client/_app/immutable/entry/start.BBQhtURO.js.br +0 -0
  51. package/build/client/_app/immutable/entry/start.BBQhtURO.js.gz +0 -0
  52. package/build/client/_app/immutable/nodes/0.1zylwAPT.js +10 -0
  53. package/build/client/_app/immutable/nodes/0.1zylwAPT.js.br +0 -0
  54. package/build/client/_app/immutable/nodes/0.1zylwAPT.js.gz +0 -0
  55. package/build/client/_app/immutable/nodes/{1.Fqso94b3.js → 1.BVnLUSs-.js} +1 -1
  56. package/build/client/_app/immutable/nodes/1.BVnLUSs-.js.br +0 -0
  57. package/build/client/_app/immutable/nodes/1.BVnLUSs-.js.gz +0 -0
  58. package/build/client/_app/immutable/nodes/{8.BjKgvSie.js → 10.D1wl2wPX.js} +2 -2
  59. package/build/client/_app/immutable/nodes/10.D1wl2wPX.js.br +0 -0
  60. package/build/client/_app/immutable/nodes/10.D1wl2wPX.js.gz +0 -0
  61. package/build/client/_app/immutable/nodes/{9.BRT6HOXB.js → 11.C18nMGmp.js} +1 -1
  62. package/build/client/_app/immutable/nodes/11.C18nMGmp.js.br +0 -0
  63. package/build/client/_app/immutable/nodes/11.C18nMGmp.js.gz +0 -0
  64. package/build/client/_app/immutable/nodes/{2.BusCVJWk.js → 2.D1Mm0DUX.js} +2 -2
  65. package/build/client/_app/immutable/nodes/2.D1Mm0DUX.js.br +0 -0
  66. package/build/client/_app/immutable/nodes/2.D1Mm0DUX.js.gz +0 -0
  67. package/build/client/_app/immutable/nodes/{3.DUlpocIc.js → 3.Wfz3TcJd.js} +3 -3
  68. package/build/client/_app/immutable/nodes/3.Wfz3TcJd.js.br +0 -0
  69. package/build/client/_app/immutable/nodes/3.Wfz3TcJd.js.gz +0 -0
  70. package/build/client/_app/immutable/nodes/{4.BSVqdrrD.js → 4.CBX9A3ka.js} +2 -2
  71. package/build/client/_app/immutable/nodes/4.CBX9A3ka.js.br +0 -0
  72. package/build/client/_app/immutable/nodes/4.CBX9A3ka.js.gz +0 -0
  73. package/build/client/_app/immutable/nodes/{5.Cfj35gpY.js → 5.DIVKuZc9.js} +1 -1
  74. package/build/client/_app/immutable/nodes/5.DIVKuZc9.js.br +0 -0
  75. package/build/client/_app/immutable/nodes/5.DIVKuZc9.js.gz +0 -0
  76. package/build/client/_app/immutable/nodes/{6.CG4eKRH0.js → 6.DtZAEPXb.js} +1 -1
  77. package/build/client/_app/immutable/nodes/6.DtZAEPXb.js.br +0 -0
  78. package/build/client/_app/immutable/nodes/6.DtZAEPXb.js.gz +0 -0
  79. package/build/client/_app/immutable/nodes/{7.DHilxD1o.js → 7.MfBRh32I.js} +1 -1
  80. package/build/client/_app/immutable/nodes/7.MfBRh32I.js.br +0 -0
  81. package/build/client/_app/immutable/nodes/7.MfBRh32I.js.gz +0 -0
  82. package/build/client/_app/immutable/nodes/8.DVE6LnOC.js +1 -0
  83. package/build/client/_app/immutable/nodes/8.DVE6LnOC.js.br +0 -0
  84. package/build/client/_app/immutable/nodes/8.DVE6LnOC.js.gz +0 -0
  85. package/build/client/_app/immutable/nodes/9.BCel5OqI.js +2 -0
  86. package/build/client/_app/immutable/nodes/9.BCel5OqI.js.br +0 -0
  87. package/build/client/_app/immutable/nodes/9.BCel5OqI.js.gz +0 -0
  88. package/build/client/_app/version.json +1 -1
  89. package/build/client/_app/version.json.br +0 -0
  90. package/build/client/_app/version.json.gz +0 -0
  91. package/build/server/chunks/{0-BWFSL107.js → 0-DJqyZZTr.js} +4 -4
  92. package/build/server/chunks/{0-BWFSL107.js.map → 0-DJqyZZTr.js.map} +1 -1
  93. package/build/server/chunks/1-2YUVen1F.js +9 -0
  94. package/build/server/chunks/{1-Bw5KlAjL.js.map → 1-2YUVen1F.js.map} +1 -1
  95. package/build/server/chunks/10-D1X7LB3v.js +9 -0
  96. package/build/server/chunks/10-D1X7LB3v.js.map +1 -0
  97. package/build/server/chunks/11-qXSPdF5j.js +9 -0
  98. package/build/server/chunks/11-qXSPdF5j.js.map +1 -0
  99. package/build/server/chunks/{2-CQ3yYSVK.js → 2-BD7kj1mt.js} +3 -3
  100. package/build/server/chunks/{2-CQ3yYSVK.js.map → 2-BD7kj1mt.js.map} +1 -1
  101. package/build/server/chunks/{3-DZ4H9hPs.js → 3-oNjv-BhZ.js} +3 -3
  102. package/build/server/chunks/{3-DZ4H9hPs.js.map → 3-oNjv-BhZ.js.map} +1 -1
  103. package/build/server/chunks/{4-BtYdKCVW.js → 4-Bb5VFhsO.js} +3 -3
  104. package/build/server/chunks/{4-BtYdKCVW.js.map → 4-Bb5VFhsO.js.map} +1 -1
  105. package/build/server/chunks/{5-CvJK3PiH.js → 5-oNoWuIsn.js} +3 -3
  106. package/build/server/chunks/{5-CvJK3PiH.js.map → 5-oNoWuIsn.js.map} +1 -1
  107. package/build/server/chunks/6-DRJGUqHG.js +9 -0
  108. package/build/server/chunks/{6-BZ0enR6b.js.map → 6-DRJGUqHG.js.map} +1 -1
  109. package/build/server/chunks/7-_giJiu0L.js +9 -0
  110. package/build/server/chunks/{7-Lg8imTZn.js.map → 7-_giJiu0L.js.map} +1 -1
  111. package/build/server/chunks/8-zvWAVNT5.js +9 -0
  112. package/build/server/chunks/8-zvWAVNT5.js.map +1 -0
  113. package/build/server/chunks/9-DVyDL445.js +9 -0
  114. package/build/server/chunks/9-DVyDL445.js.map +1 -0
  115. package/build/server/chunks/Banner-BgaAs1rs.js +90 -0
  116. package/build/server/chunks/Banner-BgaAs1rs.js.map +1 -0
  117. package/build/server/chunks/{Button-B5dU-ntz.js → Button-D0hZ7JYt.js} +2 -2
  118. package/build/server/chunks/Button-D0hZ7JYt.js.map +1 -0
  119. package/build/server/chunks/{Icon-C7Ml3GX6.js → Icon-D0GBnDcs.js} +3 -3
  120. package/build/server/chunks/Icon-D0GBnDcs.js.map +1 -0
  121. package/build/server/chunks/{Input-CPGO0sbS.js → Input-OmIiydSx.js} +2 -2
  122. package/build/server/chunks/Input-OmIiydSx.js.map +1 -0
  123. package/build/server/chunks/{Pill-CcrtCejm.js → Pill-4xJ-VhAA.js} +3 -3
  124. package/build/server/chunks/Pill-4xJ-VhAA.js.map +1 -0
  125. package/build/server/chunks/{Shimmer-C5jkvGr1.js → Shimmer-Dw2uvTC1.js} +2 -2
  126. package/build/server/chunks/Shimmer-Dw2uvTC1.js.map +1 -0
  127. package/build/server/chunks/{_error.svelte-CSIxs-ab.js → _error.svelte-CZnkxeLr.js} +8 -8
  128. package/build/server/chunks/{_error.svelte-CSIxs-ab.js.map → _error.svelte-CZnkxeLr.js.map} +1 -1
  129. package/build/server/chunks/{_layout.svelte-noB4j-v2.js → _layout.svelte-DfgNGGiM.js} +16 -11
  130. package/build/server/chunks/_layout.svelte-DfgNGGiM.js.map +1 -0
  131. package/build/server/chunks/{_page.svelte-DnTpPnPR.js → _page.svelte-BLo2v_8E.js} +7 -88
  132. package/build/server/chunks/_page.svelte-BLo2v_8E.js.map +1 -0
  133. package/build/server/chunks/_page.svelte-BTlfUsBp.js +43 -0
  134. package/build/server/chunks/_page.svelte-BTlfUsBp.js.map +1 -0
  135. package/build/server/chunks/{_page.svelte-C60lAagP.js → _page.svelte-BUBLUSGo.js} +8 -8
  136. package/build/server/chunks/_page.svelte-BUBLUSGo.js.map +1 -0
  137. package/build/server/chunks/{_page.svelte-BV0XyYJZ.js → _page.svelte-BX2FMgSg.js} +4 -4
  138. package/build/server/chunks/{_page.svelte-BV0XyYJZ.js.map → _page.svelte-BX2FMgSg.js.map} +1 -1
  139. package/build/server/chunks/{_page.svelte-BUkm2304.js → _page.svelte-C7B0qdrC.js} +5 -5
  140. package/build/server/chunks/{_page.svelte-BUkm2304.js.map → _page.svelte-C7B0qdrC.js.map} +1 -1
  141. package/build/server/chunks/{_page.svelte-Dmg-RFCg.js → _page.svelte-CE7COWnF.js} +7 -7
  142. package/build/server/chunks/{_page.svelte-Dmg-RFCg.js.map → _page.svelte-CE7COWnF.js.map} +1 -1
  143. package/build/server/chunks/{_page.svelte-BfB8maoc.js → _page.svelte-CWsjjd4l.js} +9 -9
  144. package/build/server/chunks/{_page.svelte-BfB8maoc.js.map → _page.svelte-CWsjjd4l.js.map} +1 -1
  145. package/build/server/chunks/_page.svelte-D5S2hkBk.js +104 -0
  146. package/build/server/chunks/_page.svelte-D5S2hkBk.js.map +1 -0
  147. package/build/server/chunks/{_page.svelte-B6qyh-K-.js → _page.svelte-D_Ey8QRG.js} +11 -11
  148. package/build/server/chunks/{_page.svelte-B6qyh-K-.js.map → _page.svelte-D_Ey8QRG.js.map} +1 -1
  149. package/build/server/chunks/{_page.svelte-DuzZr5dA.js → _page.svelte-tBuIq8Pg.js} +11 -11
  150. package/build/server/chunks/{_page.svelte-DuzZr5dA.js.map → _page.svelte-tBuIq8Pg.js.map} +1 -1
  151. package/build/server/chunks/_server.ts-BaaY7Z9D.js +77 -0
  152. package/build/server/chunks/_server.ts-BaaY7Z9D.js.map +1 -0
  153. package/build/server/chunks/{_server.ts-5wx4ZppI.js → _server.ts-Bi0Oe4PF.js} +7 -4
  154. package/build/server/chunks/_server.ts-Bi0Oe4PF.js.map +1 -0
  155. package/build/server/chunks/_server.ts-C0317RBD.js +57 -0
  156. package/build/server/chunks/_server.ts-C0317RBD.js.map +1 -0
  157. package/build/server/chunks/{_server.ts-CKXVBbwb.js → _server.ts-CRVNEOd2.js} +10 -8
  158. package/build/server/chunks/_server.ts-CRVNEOd2.js.map +1 -0
  159. package/build/server/chunks/_server.ts-CVPZOpiv.js +23 -0
  160. package/build/server/chunks/_server.ts-CVPZOpiv.js.map +1 -0
  161. package/build/server/chunks/{_server.ts-CyjDrcZN.js → _server.ts-C_OOUqsd.js} +9 -1
  162. package/build/server/chunks/_server.ts-C_OOUqsd.js.map +1 -0
  163. package/build/server/chunks/{_server.ts-BMMTS86y.js → _server.ts-D9ir7u24.js} +3 -4
  164. package/build/server/chunks/{_server.ts-BMMTS86y.js.map → _server.ts-D9ir7u24.js.map} +1 -1
  165. package/build/server/chunks/{_server.ts-DZ5naqSL.js → _server.ts-DMm0hBP4.js} +5 -1
  166. package/build/server/chunks/_server.ts-DMm0hBP4.js.map +1 -0
  167. package/build/server/chunks/{_server.ts-CgHc1Zpx.js → _server.ts-DhJx0DLr.js} +7 -4
  168. package/build/server/chunks/_server.ts-DhJx0DLr.js.map +1 -0
  169. package/build/server/chunks/_server.ts-DkZX_O9a.js +39 -0
  170. package/build/server/chunks/_server.ts-DkZX_O9a.js.map +1 -0
  171. package/build/server/chunks/{_server.ts-B1z0q6qZ.js → _server.ts-DxT9IlZF.js} +6 -5
  172. package/build/server/chunks/_server.ts-DxT9IlZF.js.map +1 -0
  173. package/build/server/chunks/{_server.ts-Bt7EAfjo.js → _server.ts-MbnroWEF.js} +25 -48
  174. package/build/server/chunks/_server.ts-MbnroWEF.js.map +1 -0
  175. package/build/server/chunks/_server.ts-Mttr0-Sl.js +48 -0
  176. package/build/server/chunks/_server.ts-Mttr0-Sl.js.map +1 -0
  177. package/build/server/chunks/_server.ts-jtqWDWcf.js +45 -0
  178. package/build/server/chunks/_server.ts-jtqWDWcf.js.map +1 -0
  179. package/build/server/chunks/{cache-Me3zUAaD.js → cache-BlMaDsHi.js} +2 -2
  180. package/build/server/chunks/{cache-Me3zUAaD.js.map → cache-BlMaDsHi.js.map} +1 -1
  181. package/build/server/chunks/{client-CfNnl32g.js → client-Ds1brw-8.js} +4 -4
  182. package/build/server/chunks/{client-CfNnl32g.js.map → client-Ds1brw-8.js.map} +1 -1
  183. package/build/server/chunks/client2-DngLdcUc.js +7 -0
  184. package/build/server/chunks/{client2-DDP30_vY.js.map → client2-DngLdcUc.js.map} +1 -1
  185. package/build/server/chunks/coordinator-DMU_ADXf.js +530 -0
  186. package/build/server/chunks/coordinator-DMU_ADXf.js.map +1 -0
  187. package/build/server/chunks/{index-CJrGuxuM.js → index-CoYB03g7.js} +2 -2
  188. package/build/server/chunks/{index-CJrGuxuM.js.map → index-CoYB03g7.js.map} +1 -1
  189. package/build/server/chunks/{index-server--49oHtA0.js → index-server-Bq3cnK69.js} +2 -2
  190. package/build/server/chunks/{index-server--49oHtA0.js.map → index-server-Bq3cnK69.js.map} +1 -1
  191. package/build/server/chunks/{index2-MY7PXeAc.js → index2-dSGQ9Eaa.js} +2 -2
  192. package/build/server/chunks/{index2-MY7PXeAc.js.map → index2-dSGQ9Eaa.js.map} +1 -1
  193. package/build/server/chunks/{pty-manager-RmhVe2Ez.js → pty-manager-41h3IK8K.js} +100 -2
  194. package/build/server/chunks/pty-manager-41h3IK8K.js.map +1 -0
  195. package/build/server/chunks/qwen-reader-DGfUbKaJ.js +2112 -0
  196. package/build/server/chunks/qwen-reader-DGfUbKaJ.js.map +1 -0
  197. package/build/server/chunks/{registry-DzJj2E6I.js → registry-D4J_CuzW.js} +56 -24
  198. package/build/server/chunks/registry-D4J_CuzW.js.map +1 -0
  199. package/build/server/chunks/{root-xvQIR1Bt.js → root-D4IoFC8F.js} +2 -2
  200. package/build/server/chunks/root-D4IoFC8F.js.map +1 -0
  201. package/build/server/chunks/{state.svelte-RCtlkrNH.js → state.svelte-CmHqngc_.js} +3 -3
  202. package/build/server/chunks/{state.svelte-RCtlkrNH.js.map → state.svelte-CmHqngc_.js.map} +1 -1
  203. package/build/server/chunks/{stores-C-LqoonT.js → stores-CRYxfF0o.js} +4 -4
  204. package/build/server/chunks/stores-CRYxfF0o.js.map +1 -0
  205. package/build/server/chunks/super-session-handler-DPyxFgmz.js +22 -0
  206. package/build/server/chunks/super-session-handler-DPyxFgmz.js.map +1 -0
  207. package/build/server/index.js +4 -4
  208. package/build/server/index.js.map +1 -1
  209. package/build/server/manifest.js +79 -21
  210. package/build/server/manifest.js.map +1 -1
  211. package/package.json +2 -2
  212. package/scripts/e2e-all-features.sh +204 -0
  213. package/scripts/e2e-cross-terminal.sh +168 -0
  214. package/server.ts +37 -0
  215. package/src/lib/modules/client/common/provider.ts +0 -2
  216. package/src/lib/modules/client/terminal/ChatView.svelte +9 -2
  217. package/src/lib/modules/client/terminal/LaunchSheet.svelte +3 -0
  218. package/src/lib/modules/server/sessions/amp-reader.ts +439 -0
  219. package/src/lib/modules/server/sessions/copilot-reader.ts +542 -0
  220. package/src/lib/modules/server/sessions/cursor-reader.ts +634 -0
  221. package/src/lib/modules/server/sessions/gemini-reader.ts +48 -25
  222. package/src/lib/modules/server/sessions/opencode-reader.ts +13 -12
  223. package/src/lib/modules/server/sessions/process-detector.ts +37 -60
  224. package/src/lib/modules/server/sessions/provider-paths.ts +173 -0
  225. package/src/lib/modules/server/sessions/qwen-reader.ts +41 -15
  226. package/src/lib/modules/server/sessions/registry.ts +55 -14
  227. package/src/lib/modules/server/sos/coordinator.ts +492 -0
  228. package/src/lib/modules/server/sos/policy-gate.ts +56 -0
  229. package/src/lib/modules/server/sos/relay-store.ts +159 -0
  230. package/src/lib/modules/server/terminal/generic-session-watcher.ts +163 -0
  231. package/src/lib/modules/server/terminal/pty-input.ts +37 -0
  232. package/src/lib/modules/server/terminal/pty-manager.ts +51 -0
  233. package/src/lib/modules/server/ws/server.ts +6 -1
  234. package/src/lib/modules/server/ws/session-handler.ts +17 -2
  235. package/src/lib/modules/server/ws/super-session-handler.ts +200 -0
  236. package/src/lib/theme.css +1 -2
  237. package/src/lib/types/generated/Sessions.ts +1 -4
  238. package/src/lib/types/index.ts +2 -1
  239. package/src/lib/types/server.ts +23 -6
  240. package/src/lib/types/sessions.ts +1 -10
  241. package/src/lib/types/sos.ts +134 -0
  242. package/src/routes/+layout.svelte +9 -2
  243. package/src/routes/api/sessions/connect/+server.ts +7 -3
  244. package/src/routes/api/sos/+server.ts +36 -0
  245. package/src/routes/api/sos/[id]/+server.ts +55 -0
  246. package/src/routes/api/sos/[id]/inject/+server.ts +44 -0
  247. package/src/routes/api/sos/[id]/members/+server.ts +47 -0
  248. package/src/routes/api/sos/[id]/members/[mid]/+server.ts +17 -0
  249. package/src/routes/api/sos/[id]/rules/+server.ts +85 -0
  250. package/src/routes/sos/+page.svelte +195 -0
  251. package/src/routes/sos/[id]/+page.svelte +677 -0
  252. package/build/client/_app/immutable/assets/0.B0O0vCnX.css.br +0 -0
  253. package/build/client/_app/immutable/chunks/BRqaaL5D.js.br +0 -0
  254. package/build/client/_app/immutable/chunks/BRqaaL5D.js.gz +0 -0
  255. package/build/client/_app/immutable/chunks/BctvtE4d.js.br +0 -0
  256. package/build/client/_app/immutable/chunks/BxFShcQO.js +0 -1
  257. package/build/client/_app/immutable/chunks/BxFShcQO.js.br +0 -0
  258. package/build/client/_app/immutable/chunks/BxFShcQO.js.gz +0 -0
  259. package/build/client/_app/immutable/chunks/ByzqAuXw.js +0 -3
  260. package/build/client/_app/immutable/chunks/ByzqAuXw.js.br +0 -0
  261. package/build/client/_app/immutable/chunks/ByzqAuXw.js.gz +0 -0
  262. package/build/client/_app/immutable/chunks/C5VOyQCG.js.br +0 -0
  263. package/build/client/_app/immutable/chunks/C5VOyQCG.js.gz +0 -0
  264. package/build/client/_app/immutable/chunks/C_9BZILB.js.br +0 -0
  265. package/build/client/_app/immutable/chunks/C_9BZILB.js.gz +0 -0
  266. package/build/client/_app/immutable/chunks/Cg3dlX05.js.br +0 -0
  267. package/build/client/_app/immutable/chunks/Cg3dlX05.js.gz +0 -0
  268. package/build/client/_app/immutable/chunks/CjfxuHdN.js.br +0 -0
  269. package/build/client/_app/immutable/chunks/CjfxuHdN.js.gz +0 -0
  270. package/build/client/_app/immutable/chunks/DYuMZGL5.js.br +0 -0
  271. package/build/client/_app/immutable/chunks/DYuMZGL5.js.gz +0 -0
  272. package/build/client/_app/immutable/chunks/DZQMsHM5.js.br +0 -0
  273. package/build/client/_app/immutable/chunks/DZQMsHM5.js.gz +0 -0
  274. package/build/client/_app/immutable/chunks/DZvnhU_8.js.br +0 -0
  275. package/build/client/_app/immutable/chunks/DZvnhU_8.js.gz +0 -0
  276. package/build/client/_app/immutable/chunks/Pw0jDB7M.js +0 -1
  277. package/build/client/_app/immutable/chunks/Pw0jDB7M.js.br +0 -0
  278. package/build/client/_app/immutable/chunks/Pw0jDB7M.js.gz +0 -0
  279. package/build/client/_app/immutable/entry/app.CNaTe-zm.js +0 -2
  280. package/build/client/_app/immutable/entry/app.CNaTe-zm.js.br +0 -0
  281. package/build/client/_app/immutable/entry/app.CNaTe-zm.js.gz +0 -0
  282. package/build/client/_app/immutable/entry/start.hxYnjcDu.js +0 -1
  283. package/build/client/_app/immutable/entry/start.hxYnjcDu.js.br +0 -0
  284. package/build/client/_app/immutable/entry/start.hxYnjcDu.js.gz +0 -0
  285. package/build/client/_app/immutable/nodes/0.C3ELOf4c.js +0 -7
  286. package/build/client/_app/immutable/nodes/0.C3ELOf4c.js.br +0 -0
  287. package/build/client/_app/immutable/nodes/0.C3ELOf4c.js.gz +0 -0
  288. package/build/client/_app/immutable/nodes/1.Fqso94b3.js.br +0 -0
  289. package/build/client/_app/immutable/nodes/1.Fqso94b3.js.gz +0 -0
  290. package/build/client/_app/immutable/nodes/2.BusCVJWk.js.br +0 -0
  291. package/build/client/_app/immutable/nodes/2.BusCVJWk.js.gz +0 -0
  292. package/build/client/_app/immutable/nodes/3.DUlpocIc.js.br +0 -0
  293. package/build/client/_app/immutable/nodes/3.DUlpocIc.js.gz +0 -0
  294. package/build/client/_app/immutable/nodes/4.BSVqdrrD.js.br +0 -0
  295. package/build/client/_app/immutable/nodes/4.BSVqdrrD.js.gz +0 -0
  296. package/build/client/_app/immutable/nodes/5.Cfj35gpY.js.br +0 -0
  297. package/build/client/_app/immutable/nodes/5.Cfj35gpY.js.gz +0 -0
  298. package/build/client/_app/immutable/nodes/6.CG4eKRH0.js.br +0 -0
  299. package/build/client/_app/immutable/nodes/6.CG4eKRH0.js.gz +0 -0
  300. package/build/client/_app/immutable/nodes/7.DHilxD1o.js.br +0 -0
  301. package/build/client/_app/immutable/nodes/7.DHilxD1o.js.gz +0 -0
  302. package/build/client/_app/immutable/nodes/8.BjKgvSie.js.br +0 -0
  303. package/build/client/_app/immutable/nodes/8.BjKgvSie.js.gz +0 -0
  304. package/build/client/_app/immutable/nodes/9.BRT6HOXB.js.br +0 -0
  305. package/build/client/_app/immutable/nodes/9.BRT6HOXB.js.gz +0 -0
  306. package/build/server/chunks/1-Bw5KlAjL.js +0 -9
  307. package/build/server/chunks/6-BZ0enR6b.js +0 -9
  308. package/build/server/chunks/7-Lg8imTZn.js +0 -9
  309. package/build/server/chunks/8-DKs4yOL7.js +0 -9
  310. package/build/server/chunks/8-DKs4yOL7.js.map +0 -1
  311. package/build/server/chunks/9-UNmpUWDY.js +0 -9
  312. package/build/server/chunks/9-UNmpUWDY.js.map +0 -1
  313. package/build/server/chunks/Button-B5dU-ntz.js.map +0 -1
  314. package/build/server/chunks/Icon-C7Ml3GX6.js.map +0 -1
  315. package/build/server/chunks/Input-CPGO0sbS.js.map +0 -1
  316. package/build/server/chunks/Pill-CcrtCejm.js.map +0 -1
  317. package/build/server/chunks/Shimmer-C5jkvGr1.js.map +0 -1
  318. package/build/server/chunks/_layout.svelte-noB4j-v2.js.map +0 -1
  319. package/build/server/chunks/_page.svelte-C60lAagP.js.map +0 -1
  320. package/build/server/chunks/_page.svelte-DnTpPnPR.js.map +0 -1
  321. package/build/server/chunks/_server.ts-5wx4ZppI.js.map +0 -1
  322. package/build/server/chunks/_server.ts-B1z0q6qZ.js.map +0 -1
  323. package/build/server/chunks/_server.ts-Bt7EAfjo.js.map +0 -1
  324. package/build/server/chunks/_server.ts-CKXVBbwb.js.map +0 -1
  325. package/build/server/chunks/_server.ts-CgHc1Zpx.js.map +0 -1
  326. package/build/server/chunks/_server.ts-CyjDrcZN.js.map +0 -1
  327. package/build/server/chunks/_server.ts-DZ5naqSL.js.map +0 -1
  328. package/build/server/chunks/client2-DDP30_vY.js +0 -7
  329. package/build/server/chunks/opencode-db-path-BwaPufWf.js +0 -411
  330. package/build/server/chunks/opencode-db-path-BwaPufWf.js.map +0 -1
  331. package/build/server/chunks/pty-manager-RmhVe2Ez.js.map +0 -1
  332. package/build/server/chunks/qwen-reader-2fTFuC_D.js +0 -622
  333. package/build/server/chunks/qwen-reader-2fTFuC_D.js.map +0 -1
  334. package/build/server/chunks/registry-DzJj2E6I.js.map +0 -1
  335. package/build/server/chunks/root-xvQIR1Bt.js.map +0 -1
  336. package/build/server/chunks/stores-C-LqoonT.js.map +0 -1
  337. /package/build/client/_app/immutable/assets/{8.BhoBXADL.css → 10.BhoBXADL.css} +0 -0
  338. /package/build/client/_app/immutable/assets/{8.BhoBXADL.css.br → 10.BhoBXADL.css.br} +0 -0
  339. /package/build/client/_app/immutable/assets/{8.BhoBXADL.css.gz → 10.BhoBXADL.css.gz} +0 -0
  340. /package/build/client/_app/immutable/assets/{9.v5KA95xm.css → 11.v5KA95xm.css} +0 -0
  341. /package/build/client/_app/immutable/assets/{9.v5KA95xm.css.br → 11.v5KA95xm.css.br} +0 -0
  342. /package/build/client/_app/immutable/assets/{9.v5KA95xm.css.gz → 11.v5KA95xm.css.gz} +0 -0
@@ -0,0 +1,168 @@
1
+ #!/usr/bin/env bash
2
+ # Shooter cross-terminal E2E smoke test
3
+ # Usage: API_KEY=<key> PORT=54818 bash scripts/e2e-cross-terminal.sh
4
+ # Pre-requisites: build/handler.js must exist (run pnpm build first)
5
+ # Required env: API_KEY (default: e2e-test-key), PORT (default: 54818)
6
+ #
7
+ # Boots the real server and exercises the live HTTP + WebSocket + PTY stack for
8
+ # two independent terminals (A and B), then tears everything down (including the
9
+ # intentionally-detached pty-holder processes). Exits non-zero on any failure.
10
+ # NOTE: this smoke test verifies each terminal's own I/O, not A->coordinator->B
11
+ # relay routing — relay is covered by the SoS suite.
12
+
13
+ set -euo pipefail
14
+
15
+ PORT="${PORT:-54818}"
16
+ API_KEY="${API_KEY:-e2e-test-key}"
17
+ BASE="http://localhost:${PORT}"
18
+ HOME_DIR="${HOME}"
19
+ LOG="/tmp/shooter-e2e-$$.log"
20
+ # Keep the WS client INSIDE the project dir so Node resolves the local `ws` package.
21
+ WS_SCRIPT="$(pwd)/.shooter-e2e-ws-$$.mjs"
22
+ TERM_A_ID=""
23
+ TERM_B_ID=""
24
+ SERVER_PID=""
25
+
26
+ cleanup() {
27
+ [ -n "${TERM_A_ID:-}" ] && curl -s -X DELETE -H "Authorization: Bearer ${API_KEY}" "${BASE}/api/terminals/${TERM_A_ID}" > /dev/null || true
28
+ [ -n "${TERM_B_ID:-}" ] && curl -s -X DELETE -H "Authorization: Bearer ${API_KEY}" "${BASE}/api/terminals/${TERM_B_ID}" > /dev/null || true
29
+ # Terminate the server we started by its own PID; fall back to a port sweep only
30
+ # if we never captured it (avoids killing an unrelated process on this port).
31
+ if [ -n "${SERVER_PID:-}" ]; then
32
+ kill "${SERVER_PID}" 2>/dev/null || true
33
+ else
34
+ lsof -ti "tcp:${PORT}" | xargs kill -9 2>/dev/null || true
35
+ fi
36
+ [ -n "${TERM_A_ID:-}" ] && pkill -f "pty-holder.cjs ${TERM_A_ID}" 2>/dev/null || true
37
+ [ -n "${TERM_B_ID:-}" ] && pkill -f "pty-holder.cjs ${TERM_B_ID}" 2>/dev/null || true
38
+ [ -n "${TERM_A_ID:-}" ] && rm -f "/tmp/shooter-term-${TERM_A_ID}.sock" || true
39
+ [ -n "${TERM_B_ID:-}" ] && rm -f "/tmp/shooter-term-${TERM_B_ID}.sock" || true
40
+ rm -f "${LOG}" "${WS_SCRIPT}"
41
+ echo "TEARDOWN_COMPLETE"
42
+ }
43
+ trap cleanup EXIT
44
+
45
+ echo "=== Shooter Cross-Terminal E2E (port=${PORT}) ==="
46
+
47
+ # 0. Verify build
48
+ [ -f "build/handler.js" ] || { echo "ERROR: build/handler.js not found. Run pnpm build first."; exit 1; }
49
+
50
+ # 1. Start server
51
+ API_KEY="${API_KEY}" PORT="${PORT}" npx tsx server.ts > "${LOG}" 2>&1 &
52
+ SERVER_PID=$!
53
+ echo "Server PID: ${SERVER_PID}"
54
+
55
+ # 2. Wait for health
56
+ echo "Waiting for server..."
57
+ for i in $(seq 1 15); do
58
+ STATUS=$(curl -s -o /dev/null -w "%{http_code}" -H "Authorization: Bearer ${API_KEY}" "${BASE}/api/health" 2>/dev/null || true)
59
+ [ "${STATUS}" = "200" ] && { echo "Server up after $((i*2))s"; break; }
60
+ sleep 2
61
+ done
62
+
63
+ # A: Health
64
+ echo ""; echo "=== A: Health ==="
65
+ HEALTH=$(curl -s -H "Authorization: Bearer ${API_KEY}" "${BASE}/api/health")
66
+ echo "${HEALTH}"
67
+ echo "${HEALTH}" | python3 -c "import json,sys; d=json.load(sys.stdin); assert d['status']=='healthy', d"
68
+ echo "PASS: health=healthy"
69
+
70
+ # B: Sessions
71
+ echo ""; echo "=== B: Sessions ==="
72
+ SESSIONS=$(curl -s -H "Authorization: Bearer ${API_KEY}" "${BASE}/api/sessions")
73
+ COUNT=$(echo "${SESSIONS}" | python3 -c "import json,sys; print(json.load(sys.stdin)['count'])")
74
+ echo "Sessions: ${COUNT}"
75
+ [ "${COUNT}" -gt 0 ] && echo "PASS: count=${COUNT}" || echo "WARN: 0 sessions"
76
+
77
+ # C: Detect
78
+ echo ""; echo "=== C: Detect ==="
79
+ DETECT_STATUS=$(curl -s -o /dev/null -w "%{http_code}" -H "Authorization: Bearer ${API_KEY}" "${BASE}/api/sessions/detect")
80
+ [ "${DETECT_STATUS}" = "200" ] && echo "PASS: detect=200" || { echo "FAIL: detect=${DETECT_STATUS}"; exit 1; }
81
+
82
+ # D: Create terminals
83
+ echo ""; echo "=== D: Create terminals ==="
84
+ TERM_A=$(curl -s -X POST -H "Authorization: Bearer ${API_KEY}" -H "Content-Type: application/json" \
85
+ -d "{\"command\":\"bash\",\"cwd\":\"${HOME_DIR}\"}" "${BASE}/api/terminals")
86
+ TERM_A_ID=$(echo "${TERM_A}" | python3 -c "import json,sys; print(json.load(sys.stdin)['id'])")
87
+ echo "Terminal A: id=${TERM_A_ID}"
88
+
89
+ TERM_B=$(curl -s -X POST -H "Authorization: Bearer ${API_KEY}" -H "Content-Type: application/json" \
90
+ -d "{\"command\":\"bash\",\"cwd\":\"${HOME_DIR}\"}" "${BASE}/api/terminals")
91
+ TERM_B_ID=$(echo "${TERM_B}" | python3 -c "import json,sys; print(json.load(sys.stdin)['id'])")
92
+ echo "Terminal B: id=${TERM_B_ID}"
93
+
94
+ # E/F/G: WebSocket checks via temp .mjs file
95
+ cat > "${WS_SCRIPT}" << JSEOF
96
+ import { WebSocket } from 'ws';
97
+
98
+ const BASE_URL = '${BASE}';
99
+ const WS_BASE = 'ws://localhost:${PORT}';
100
+ const API_KEY = '${API_KEY}';
101
+ const TERM_A = '${TERM_A_ID}';
102
+ const TERM_B = '${TERM_B_ID}';
103
+ const PING = 'PING_FROM_A_' + Date.now();
104
+
105
+ async function getTicket() {
106
+ const r = await fetch(\`\${BASE_URL}/api/ws-ticket\`, { method: 'POST', headers: { Authorization: \`Bearer \${API_KEY}\` } });
107
+ if (!r.ok) throw new Error('ticket failed: ' + r.status);
108
+ return (await r.json()).ticket;
109
+ }
110
+ function connectWs(path, ticket) {
111
+ return new Promise((res, rej) => {
112
+ const ws = new WebSocket(\`\${WS_BASE}\${path}?ticket=\${ticket}\`);
113
+ ws.once('open', () => res(ws));
114
+ ws.once('error', rej);
115
+ setTimeout(() => rej(new Error('timeout ' + path)), 6000);
116
+ });
117
+ }
118
+ function collect(ws, ms) {
119
+ const frames = [];
120
+ return new Promise(res => {
121
+ const t = setTimeout(() => res(frames), ms);
122
+ ws.on('message', raw => { try { frames.push(JSON.parse(raw.toString('utf-8'))); } catch {} });
123
+ ws.once('close', () => { clearTimeout(t); res(frames); });
124
+ });
125
+ }
126
+ const strip = s => s.replace(/\x1b\[[0-9;]*[A-Za-z]/g, '').replace(/\r/g, '');
127
+
128
+ // E: terminal A input -> output
129
+ const tA = await getTicket();
130
+ const wsA = await connectWs('/ws/terminal/' + TERM_A, tA);
131
+ await collect(wsA, 1000);
132
+ wsA.send(JSON.stringify({ type: 'input', data: 'echo ' + PING + '\n' }));
133
+ const frA = await collect(wsA, 3000);
134
+ const outA = frA.filter(f => f.type === 'output').map(f => strip(f.data)).join('');
135
+ const pingLine = outA.split('\n').find(l => l.includes(PING));
136
+ console.log('E PASS:', !!pingLine, '| token:', JSON.stringify(pingLine));
137
+ if (!pingLine) process.exit(1);
138
+
139
+ // F: terminal B independent I/O — write directly to B and verify its echo.
140
+ // NOTE: NOT a relay assertion (A's output is not routed to B here); true
141
+ // A->coordinator->B relay is covered by the SoS suite, not this smoke test.
142
+ const tB = await getTicket();
143
+ const wsB = await connectWs('/ws/terminal/' + TERM_B, tB);
144
+ await collect(wsB, 1000);
145
+ wsB.send(JSON.stringify({ type: 'input', data: 'echo TERMB_IO_' + PING + '\n' }));
146
+ const frB = await collect(wsB, 3000);
147
+ const outB = frB.filter(f => f.type === 'output').map(f => strip(f.data)).join('');
148
+ const ioLine = outB.split('\n').find(l => l.includes('TERMB_IO_'));
149
+ console.log('F PASS (terminal-B I/O, not relay):', !!ioLine, '| token:', JSON.stringify(ioLine));
150
+ if (!ioLine) process.exit(1);
151
+
152
+ // G: /ws/session plain shell -> empty history frame
153
+ const tS = await getTicket();
154
+ const wsS = await connectWs('/ws/session/' + TERM_A, tS);
155
+ const frS = await collect(wsS, 2500);
156
+ wsS.close();
157
+ const hist = frS.find(f => f.type === 'history');
158
+ console.log('G PASS:', !!hist, '| messages:', hist?.messages?.length ?? 'n/a');
159
+ if (!hist) process.exit(1);
160
+
161
+ wsA.close(); wsB.close();
162
+ console.log('ALL_WS_CHECKS: PASS');
163
+ JSEOF
164
+
165
+ echo ""; echo "=== E/F/G: WebSocket checks ==="
166
+ node "${WS_SCRIPT}"
167
+
168
+ echo ""; echo "=== Shooter Cross-Terminal E2E: ALL PASS ==="
package/server.ts CHANGED
@@ -23,8 +23,12 @@ if (!existsSync(handlerPath)) {
23
23
  }
24
24
 
25
25
  const { handler } = await import('./build/handler.js');
26
+ import { isReadOnlyProviderPath } from './src/lib/modules/server/sessions/provider-paths.js';
27
+ import { sosCoordinator } from './src/lib/modules/server/sos/coordinator.js';
26
28
  import { codexWatcher } from './src/lib/modules/server/terminal/codex-watcher.js';
29
+ import { genericSessionWatcher } from './src/lib/modules/server/terminal/generic-session-watcher.js';
27
30
  import { openCodeWatcher } from './src/lib/modules/server/terminal/opencode-watcher.js';
31
+ import { ptySubmitSequence } from './src/lib/modules/server/terminal/pty-input.js';
28
32
  import { ptyManager } from './src/lib/modules/server/terminal/pty-manager.js';
29
33
  import { sessionWatcher } from './src/lib/modules/server/terminal/session-watcher.js';
30
34
  import { startKeepalive, stopKeepalive } from './src/lib/modules/server/ws/keepalive.js';
@@ -74,6 +78,12 @@ const sessionWatcherAdapter = {
74
78
  if (sessionFile.includes('/.codex/')) {
75
79
  return codexWatcher.getHistory(sessionFile);
76
80
  }
81
+ // Read-only providers (cursor/copilot/qwen/gemini/amp) are re-read whole
82
+ // by the generic watcher — checked before the claude fallback because
83
+ // their JSONL paths would otherwise be mis-parsed as Claude JSONL.
84
+ if (isReadOnlyProviderPath(sessionFile)) {
85
+ return genericSessionWatcher.getHistory(sessionFile);
86
+ }
77
87
  return sessionWatcher.getHistory(sessionFile);
78
88
  },
79
89
  subscribe(sessionFile: string, callback: Parameters<typeof sessionWatcher.watch>[1]) {
@@ -88,6 +98,9 @@ const sessionWatcherAdapter = {
88
98
  callback as (messages: ConversationMessage[]) => void
89
99
  );
90
100
  }
101
+ if (isReadOnlyProviderPath(sessionFile)) {
102
+ return genericSessionWatcher.subscribe(sessionFile, callback);
103
+ }
91
104
  // Use subscribe() which returns a ref-counted unsubscribe function.
92
105
  // The watcher is only torn down when the last subscriber disconnects.
93
106
  return sessionWatcher.subscribe(sessionFile, callback);
@@ -110,9 +123,32 @@ setTerminalHandlerPtyManager(ptyManagerAdapter);
110
123
  setSessionHandlerPtyManager(ptyManagerAdapter);
111
124
  setSessionWatcher(sessionWatcherAdapter);
112
125
 
126
+ // The SoS coordinator reuses the same watcher adapter (so it supports every
127
+ // provider) and injects relays through PtyManager, which server.ts owns.
128
+ sosCoordinator.setWatcher(sessionWatcherAdapter);
129
+ sosCoordinator.setInjector((terminalId: string, text: string) => {
130
+ const terminal = ptyManager.get(terminalId);
131
+ if (!terminal || terminal.status === 'exited') {
132
+ return { error: 'Target terminal not available', ok: false };
133
+ }
134
+ // Deliver + submit via a bracketed paste, not a bare newline. Agent TUIs read
135
+ // the PTY in raw mode where LF never submits and a trailing CR in the same
136
+ // write is absorbed as paste content; ptySubmitSequence() wraps the body in a
137
+ // bracketed paste so the closing CR is a real Enter. See pty-input.ts.
138
+ try {
139
+ terminal.pty.write(ptySubmitSequence(text));
140
+ return { ok: true };
141
+ } catch {
142
+ return { error: 'Failed to write to target terminal', ok: false };
143
+ }
144
+ });
145
+
113
146
  // Recover persisted terminals before accepting connections
114
147
  await ptyManager.reconnectAll();
115
148
 
149
+ // Rebuild persisted super-sessions and re-subscribe their members.
150
+ sosCoordinator.reconnectAll();
151
+
116
152
  // ── HTTP server wrapping SvelteKit ───────────────────────────────────
117
153
 
118
154
  const server: Server = createServer((req, res) => {
@@ -221,6 +257,7 @@ function shutdown(signal: string): void {
221
257
  sessionWatcher.stopAll();
222
258
  openCodeWatcher.stopAll();
223
259
  codexWatcher.stopAll();
260
+ genericSessionWatcher.stopAll();
224
261
 
225
262
  // Terminate all remaining WebSocket clients (/ws/session, /ws/events)
226
263
  // so wss.close() doesn't hang waiting for them to disconnect.
@@ -12,7 +12,6 @@ const SOURCE_COMMAND: Record<SessionSource, string> = {
12
12
  copilot: 'copilot',
13
13
  cursor: 'cursor-agent',
14
14
  gemini: 'gemini',
15
- iflow: 'iflow',
16
15
  opencode: 'opencode',
17
16
  qwen: 'qwen',
18
17
  };
@@ -24,7 +23,6 @@ const SOURCE_LABEL: Record<SessionSource, string> = {
24
23
  copilot: 'Copilot',
25
24
  cursor: 'Cursor',
26
25
  gemini: 'Gemini',
27
- iflow: 'iFlow',
28
26
  opencode: 'OpenCode',
29
27
  qwen: 'Qwen',
30
28
  };
@@ -170,7 +170,14 @@
170
170
  }
171
171
 
172
172
  function formatTime(ts: string): string {
173
- return new Date(ts).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
173
+ if (!ts) {
174
+ return '';
175
+ }
176
+ const date = new Date(ts);
177
+ if (Number.isNaN(date.getTime())) {
178
+ return '';
179
+ }
180
+ return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
174
181
  }
175
182
 
176
183
  function getToolDescriptionFromPart(part: ToolUsePart): string {
@@ -366,7 +373,7 @@
366
373
  role="button"
367
374
  tabindex="0"
368
375
  >
369
- &#128173; Thinking... {isThinkExpanded ? '&#9660;' : '&#9654;'}
376
+ &#128173; Thinking... {isThinkExpanded ? '' : ''}
370
377
  </div>
371
378
  <Accordion expand={isThinkExpanded}>
372
379
  {#if isThinkExpanded}
@@ -12,6 +12,9 @@
12
12
  { args: [], command: 'codex', label: 'Codex' },
13
13
  { args: [], command: 'gemini', label: 'Gemini' },
14
14
  { args: [], command: 'qwen', label: 'Qwen' },
15
+ { args: [], command: 'cursor-agent', label: 'Cursor' },
16
+ { args: [], command: 'copilot', label: 'Copilot' },
17
+ { args: [], command: 'amp', label: 'Amp' },
15
18
  { args: [], command: 'opencode', label: 'OpenCode' },
16
19
  { args: [], command: 'zsh', label: 'Shell / zsh' },
17
20
  { args: [], command: 'bash', label: 'Bash' },