@juspay/shooter 1.0.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 (327) hide show
  1. package/.claude/hooks/notifier.cjs +1431 -0
  2. package/.claude/settings.json +162 -0
  3. package/README.md +515 -0
  4. package/bin/shooter.cjs +141 -0
  5. package/build/client/_app/immutable/assets/0.CM9Hl6d-.css +1 -0
  6. package/build/client/_app/immutable/assets/0.CM9Hl6d-.css.br +0 -0
  7. package/build/client/_app/immutable/assets/0.CM9Hl6d-.css.gz +0 -0
  8. package/build/client/_app/immutable/assets/2.CAShZ7lQ.css +1 -0
  9. package/build/client/_app/immutable/assets/2.CAShZ7lQ.css.br +1 -0
  10. package/build/client/_app/immutable/assets/2.CAShZ7lQ.css.gz +0 -0
  11. package/build/client/_app/immutable/assets/3.C0uFg0IS.css +1 -0
  12. package/build/client/_app/immutable/assets/3.C0uFg0IS.css.br +0 -0
  13. package/build/client/_app/immutable/assets/3.C0uFg0IS.css.gz +0 -0
  14. package/build/client/_app/immutable/assets/4.cJuCkJKZ.css +1 -0
  15. package/build/client/_app/immutable/assets/4.cJuCkJKZ.css.br +0 -0
  16. package/build/client/_app/immutable/assets/4.cJuCkJKZ.css.gz +0 -0
  17. package/build/client/_app/immutable/assets/5.DRjApZQW.css +1 -0
  18. package/build/client/_app/immutable/assets/5.DRjApZQW.css.br +0 -0
  19. package/build/client/_app/immutable/assets/5.DRjApZQW.css.gz +0 -0
  20. package/build/client/_app/immutable/assets/6.AraZrY8I.css +1 -0
  21. package/build/client/_app/immutable/assets/6.AraZrY8I.css.br +0 -0
  22. package/build/client/_app/immutable/assets/6.AraZrY8I.css.gz +0 -0
  23. package/build/client/_app/immutable/assets/7.BCJ1IuMx.css +1 -0
  24. package/build/client/_app/immutable/assets/7.BCJ1IuMx.css.br +0 -0
  25. package/build/client/_app/immutable/assets/7.BCJ1IuMx.css.gz +0 -0
  26. package/build/client/_app/immutable/assets/ChatView.CsdBAOKx.css +1 -0
  27. package/build/client/_app/immutable/assets/ChatView.CsdBAOKx.css.br +0 -0
  28. package/build/client/_app/immutable/assets/ChatView.CsdBAOKx.css.gz +0 -0
  29. package/build/client/_app/immutable/assets/markdown.B0b5w2tq.css +1 -0
  30. package/build/client/_app/immutable/assets/markdown.B0b5w2tq.css.br +0 -0
  31. package/build/client/_app/immutable/assets/markdown.B0b5w2tq.css.gz +0 -0
  32. package/build/client/_app/immutable/assets/xterm.DFuMZ0ql.css +1 -0
  33. package/build/client/_app/immutable/assets/xterm.DFuMZ0ql.css.br +0 -0
  34. package/build/client/_app/immutable/assets/xterm.DFuMZ0ql.css.gz +0 -0
  35. package/build/client/_app/immutable/chunks/BNJphC1q.js +56 -0
  36. package/build/client/_app/immutable/chunks/BNJphC1q.js.br +0 -0
  37. package/build/client/_app/immutable/chunks/BNJphC1q.js.gz +0 -0
  38. package/build/client/_app/immutable/chunks/BTGVxaYV.js +9 -0
  39. package/build/client/_app/immutable/chunks/BTGVxaYV.js.br +0 -0
  40. package/build/client/_app/immutable/chunks/BTGVxaYV.js.gz +0 -0
  41. package/build/client/_app/immutable/chunks/BlxrFPDK.js +1 -0
  42. package/build/client/_app/immutable/chunks/BlxrFPDK.js.br +0 -0
  43. package/build/client/_app/immutable/chunks/BlxrFPDK.js.gz +0 -0
  44. package/build/client/_app/immutable/chunks/Bvk7mfPM.js +1 -0
  45. package/build/client/_app/immutable/chunks/Bvk7mfPM.js.br +0 -0
  46. package/build/client/_app/immutable/chunks/Bvk7mfPM.js.gz +0 -0
  47. package/build/client/_app/immutable/chunks/CAokzuPQ.js +1 -0
  48. package/build/client/_app/immutable/chunks/CAokzuPQ.js.br +0 -0
  49. package/build/client/_app/immutable/chunks/CAokzuPQ.js.gz +0 -0
  50. package/build/client/_app/immutable/chunks/CGLrx-H5.js +1 -0
  51. package/build/client/_app/immutable/chunks/CGLrx-H5.js.br +0 -0
  52. package/build/client/_app/immutable/chunks/CGLrx-H5.js.gz +0 -0
  53. package/build/client/_app/immutable/chunks/CgCpWzEA.js +1 -0
  54. package/build/client/_app/immutable/chunks/CgCpWzEA.js.br +0 -0
  55. package/build/client/_app/immutable/chunks/CgCpWzEA.js.gz +0 -0
  56. package/build/client/_app/immutable/chunks/Cjwk_cGO.js +6 -0
  57. package/build/client/_app/immutable/chunks/Cjwk_cGO.js.br +0 -0
  58. package/build/client/_app/immutable/chunks/Cjwk_cGO.js.gz +0 -0
  59. package/build/client/_app/immutable/chunks/CtQ8EED1.js +11 -0
  60. package/build/client/_app/immutable/chunks/CtQ8EED1.js.br +0 -0
  61. package/build/client/_app/immutable/chunks/CtQ8EED1.js.gz +0 -0
  62. package/build/client/_app/immutable/chunks/DERQCisl.js +1 -0
  63. package/build/client/_app/immutable/chunks/DERQCisl.js.br +0 -0
  64. package/build/client/_app/immutable/chunks/DERQCisl.js.gz +0 -0
  65. package/build/client/_app/immutable/chunks/DKrg8TQs.js +1 -0
  66. package/build/client/_app/immutable/chunks/DKrg8TQs.js.br +0 -0
  67. package/build/client/_app/immutable/chunks/DKrg8TQs.js.gz +0 -0
  68. package/build/client/_app/immutable/chunks/DLu6yJIZ.js +1 -0
  69. package/build/client/_app/immutable/chunks/DLu6yJIZ.js.br +0 -0
  70. package/build/client/_app/immutable/chunks/DLu6yJIZ.js.gz +0 -0
  71. package/build/client/_app/immutable/chunks/Dkkpz_4D.js +126 -0
  72. package/build/client/_app/immutable/chunks/Dkkpz_4D.js.br +0 -0
  73. package/build/client/_app/immutable/chunks/Dkkpz_4D.js.gz +0 -0
  74. package/build/client/_app/immutable/chunks/DoczjQhA.js +1 -0
  75. package/build/client/_app/immutable/chunks/DoczjQhA.js.br +0 -0
  76. package/build/client/_app/immutable/chunks/DoczjQhA.js.gz +0 -0
  77. package/build/client/_app/immutable/chunks/PPVm8Dsz.js +1 -0
  78. package/build/client/_app/immutable/chunks/PPVm8Dsz.js.br +0 -0
  79. package/build/client/_app/immutable/chunks/PPVm8Dsz.js.gz +0 -0
  80. package/build/client/_app/immutable/chunks/RpcNruLP.js +2 -0
  81. package/build/client/_app/immutable/chunks/RpcNruLP.js.br +0 -0
  82. package/build/client/_app/immutable/chunks/RpcNruLP.js.gz +0 -0
  83. package/build/client/_app/immutable/chunks/a-St0Zwo.js +1 -0
  84. package/build/client/_app/immutable/chunks/a-St0Zwo.js.br +0 -0
  85. package/build/client/_app/immutable/chunks/a-St0Zwo.js.gz +0 -0
  86. package/build/client/_app/immutable/chunks/bo70OQUZ.js +1 -0
  87. package/build/client/_app/immutable/chunks/bo70OQUZ.js.br +0 -0
  88. package/build/client/_app/immutable/chunks/bo70OQUZ.js.gz +0 -0
  89. package/build/client/_app/immutable/entry/app.QvGgdvTI.js +2 -0
  90. package/build/client/_app/immutable/entry/app.QvGgdvTI.js.br +0 -0
  91. package/build/client/_app/immutable/entry/app.QvGgdvTI.js.gz +0 -0
  92. package/build/client/_app/immutable/entry/start.BntDNRMC.js +1 -0
  93. package/build/client/_app/immutable/entry/start.BntDNRMC.js.br +0 -0
  94. package/build/client/_app/immutable/entry/start.BntDNRMC.js.gz +0 -0
  95. package/build/client/_app/immutable/nodes/0.CzkdvJ7j.js +1 -0
  96. package/build/client/_app/immutable/nodes/0.CzkdvJ7j.js.br +0 -0
  97. package/build/client/_app/immutable/nodes/0.CzkdvJ7j.js.gz +0 -0
  98. package/build/client/_app/immutable/nodes/1.MG1QhfrI.js +1 -0
  99. package/build/client/_app/immutable/nodes/1.MG1QhfrI.js.br +0 -0
  100. package/build/client/_app/immutable/nodes/1.MG1QhfrI.js.gz +0 -0
  101. package/build/client/_app/immutable/nodes/2.B4MlOSh6.js +1 -0
  102. package/build/client/_app/immutable/nodes/2.B4MlOSh6.js.br +0 -0
  103. package/build/client/_app/immutable/nodes/2.B4MlOSh6.js.gz +0 -0
  104. package/build/client/_app/immutable/nodes/3.DIwYkjDn.js +3 -0
  105. package/build/client/_app/immutable/nodes/3.DIwYkjDn.js.br +0 -0
  106. package/build/client/_app/immutable/nodes/3.DIwYkjDn.js.gz +0 -0
  107. package/build/client/_app/immutable/nodes/4.D-cIe70D.js +1 -0
  108. package/build/client/_app/immutable/nodes/4.D-cIe70D.js.br +0 -0
  109. package/build/client/_app/immutable/nodes/4.D-cIe70D.js.gz +0 -0
  110. package/build/client/_app/immutable/nodes/5.D7zPRe3L.js +1 -0
  111. package/build/client/_app/immutable/nodes/5.D7zPRe3L.js.br +0 -0
  112. package/build/client/_app/immutable/nodes/5.D7zPRe3L.js.gz +0 -0
  113. package/build/client/_app/immutable/nodes/6.BB7QE48r.js +2 -0
  114. package/build/client/_app/immutable/nodes/6.BB7QE48r.js.br +0 -0
  115. package/build/client/_app/immutable/nodes/6.BB7QE48r.js.gz +0 -0
  116. package/build/client/_app/immutable/nodes/7.D8mqsrZG.js +2 -0
  117. package/build/client/_app/immutable/nodes/7.D8mqsrZG.js.br +0 -0
  118. package/build/client/_app/immutable/nodes/7.D8mqsrZG.js.gz +0 -0
  119. package/build/client/_app/version.json +1 -0
  120. package/build/client/_app/version.json.br +0 -0
  121. package/build/client/_app/version.json.gz +0 -0
  122. package/build/client/app-icon.png +0 -0
  123. package/build/client/apple-touch-icon.png +0 -0
  124. package/build/client/favicon.png +0 -0
  125. package/build/client/favicon.svg +10 -0
  126. package/build/client/favicon.svg.br +0 -0
  127. package/build/client/favicon.svg.gz +0 -0
  128. package/build/client/manifest.webmanifest +1 -0
  129. package/build/client/pwa-192x192.png +0 -0
  130. package/build/client/pwa-512x512.png +0 -0
  131. package/build/client/registerSW.js +1 -0
  132. package/build/client/registerSW.js.br +0 -0
  133. package/build/client/registerSW.js.gz +0 -0
  134. package/build/client/sw.js +222 -0
  135. package/build/client/sw.js.br +0 -0
  136. package/build/client/sw.js.gz +0 -0
  137. package/build/client/workbox-5119daf5.js +3395 -0
  138. package/build/client/workbox-5119daf5.js.br +0 -0
  139. package/build/client/workbox-5119daf5.js.gz +0 -0
  140. package/build/env.js +94 -0
  141. package/build/handler.js +1494 -0
  142. package/build/index.js +345 -0
  143. package/build/pty-holder.cjs +510 -0
  144. package/build/server/chunks/0-q2IUp76Y.js +9 -0
  145. package/build/server/chunks/0-q2IUp76Y.js.map +1 -0
  146. package/build/server/chunks/1-CU50G5wZ.js +9 -0
  147. package/build/server/chunks/1-CU50G5wZ.js.map +1 -0
  148. package/build/server/chunks/2-D01t9s8T.js +9 -0
  149. package/build/server/chunks/2-D01t9s8T.js.map +1 -0
  150. package/build/server/chunks/3-5PUQ04wC.js +9 -0
  151. package/build/server/chunks/3-5PUQ04wC.js.map +1 -0
  152. package/build/server/chunks/4-e7gywnSG.js +9 -0
  153. package/build/server/chunks/4-e7gywnSG.js.map +1 -0
  154. package/build/server/chunks/5-CA1SA6KZ.js +9 -0
  155. package/build/server/chunks/5-CA1SA6KZ.js.map +1 -0
  156. package/build/server/chunks/6-71H221sV.js +9 -0
  157. package/build/server/chunks/6-71H221sV.js.map +1 -0
  158. package/build/server/chunks/7-Bo-vmdyz.js +9 -0
  159. package/build/server/chunks/7-Bo-vmdyz.js.map +1 -0
  160. package/build/server/chunks/_layout.svelte-SFHOxs74.js +132 -0
  161. package/build/server/chunks/_layout.svelte-SFHOxs74.js.map +1 -0
  162. package/build/server/chunks/_page.svelte-B4w-2wD-.js +120 -0
  163. package/build/server/chunks/_page.svelte-B4w-2wD-.js.map +1 -0
  164. package/build/server/chunks/_page.svelte-B_qAXjkh.js +213 -0
  165. package/build/server/chunks/_page.svelte-B_qAXjkh.js.map +1 -0
  166. package/build/server/chunks/_page.svelte-CsF1_TRG.js +50 -0
  167. package/build/server/chunks/_page.svelte-CsF1_TRG.js.map +1 -0
  168. package/build/server/chunks/_page.svelte-DJC6U-P0.js +68 -0
  169. package/build/server/chunks/_page.svelte-DJC6U-P0.js.map +1 -0
  170. package/build/server/chunks/_page.svelte-DQ6HBtsz.js +407 -0
  171. package/build/server/chunks/_page.svelte-DQ6HBtsz.js.map +1 -0
  172. package/build/server/chunks/_page.svelte-LbhhjP21.js +148 -0
  173. package/build/server/chunks/_page.svelte-LbhhjP21.js.map +1 -0
  174. package/build/server/chunks/_server.ts-BL2FGb5Z.js +387 -0
  175. package/build/server/chunks/_server.ts-BL2FGb5Z.js.map +1 -0
  176. package/build/server/chunks/_server.ts-BgdjBZco.js +47 -0
  177. package/build/server/chunks/_server.ts-BgdjBZco.js.map +1 -0
  178. package/build/server/chunks/_server.ts-BihKSdj_.js +59 -0
  179. package/build/server/chunks/_server.ts-BihKSdj_.js.map +1 -0
  180. package/build/server/chunks/_server.ts-BjOJsoy4.js +63 -0
  181. package/build/server/chunks/_server.ts-BjOJsoy4.js.map +1 -0
  182. package/build/server/chunks/_server.ts-C29xzfaw.js +77 -0
  183. package/build/server/chunks/_server.ts-C29xzfaw.js.map +1 -0
  184. package/build/server/chunks/_server.ts-CPa6DgIt.js +71 -0
  185. package/build/server/chunks/_server.ts-CPa6DgIt.js.map +1 -0
  186. package/build/server/chunks/_server.ts-CbDRDIoP.js +36 -0
  187. package/build/server/chunks/_server.ts-CbDRDIoP.js.map +1 -0
  188. package/build/server/chunks/_server.ts-Cl1OEWL4.js +54 -0
  189. package/build/server/chunks/_server.ts-Cl1OEWL4.js.map +1 -0
  190. package/build/server/chunks/_server.ts-ColfDHW8.js +60 -0
  191. package/build/server/chunks/_server.ts-ColfDHW8.js.map +1 -0
  192. package/build/server/chunks/_server.ts-Cv_OrRuL.js +494 -0
  193. package/build/server/chunks/_server.ts-Cv_OrRuL.js.map +1 -0
  194. package/build/server/chunks/_server.ts-D4MNi4cD.js +25 -0
  195. package/build/server/chunks/_server.ts-D4MNi4cD.js.map +1 -0
  196. package/build/server/chunks/_server.ts-DRVbgm6k.js +125 -0
  197. package/build/server/chunks/_server.ts-DRVbgm6k.js.map +1 -0
  198. package/build/server/chunks/_server.ts-DfajWaqh.js +39 -0
  199. package/build/server/chunks/_server.ts-DfajWaqh.js.map +1 -0
  200. package/build/server/chunks/_server.ts-y9-WYDMa.js +35 -0
  201. package/build/server/chunks/_server.ts-y9-WYDMa.js.map +1 -0
  202. package/build/server/chunks/auth-CEgFis71.js +32 -0
  203. package/build/server/chunks/auth-CEgFis71.js.map +1 -0
  204. package/build/server/chunks/client-CxCatAKr.js +255 -0
  205. package/build/server/chunks/client-CxCatAKr.js.map +1 -0
  206. package/build/server/chunks/error.svelte-BqdwMWdK.js +26 -0
  207. package/build/server/chunks/error.svelte-BqdwMWdK.js.map +1 -0
  208. package/build/server/chunks/exports-CJ0Q5XmL.js +4081 -0
  209. package/build/server/chunks/exports-CJ0Q5XmL.js.map +1 -0
  210. package/build/server/chunks/index2-DAxIoAO-.js +36 -0
  211. package/build/server/chunks/index2-DAxIoAO-.js.map +1 -0
  212. package/build/server/chunks/jsonl-parser-dmZU_Hyu.js +137 -0
  213. package/build/server/chunks/jsonl-parser-dmZU_Hyu.js.map +1 -0
  214. package/build/server/chunks/library-apns-BHxLmuIx.js +104 -0
  215. package/build/server/chunks/library-apns-BHxLmuIx.js.map +1 -0
  216. package/build/server/chunks/markdown-Bxrl3cCF.js +1241 -0
  217. package/build/server/chunks/markdown-Bxrl3cCF.js.map +1 -0
  218. package/build/server/chunks/pending-requests-D8UiTw7L.js +44 -0
  219. package/build/server/chunks/pending-requests-D8UiTw7L.js.map +1 -0
  220. package/build/server/chunks/pty-manager-C0FhBiVq.js +1697 -0
  221. package/build/server/chunks/pty-manager-C0FhBiVq.js.map +1 -0
  222. package/build/server/chunks/shared-server-BDY8jh20.js +200 -0
  223. package/build/server/chunks/shared-server-BDY8jh20.js.map +1 -0
  224. package/build/server/chunks/stores-D0HorpgL.js +36 -0
  225. package/build/server/chunks/stores-D0HorpgL.js.map +1 -0
  226. package/build/server/index.js +6466 -0
  227. package/build/server/index.js.map +1 -0
  228. package/build/server/manifest.js +184 -0
  229. package/build/server/manifest.js.map +1 -0
  230. package/build/shims.js +32 -0
  231. package/package.json +94 -0
  232. package/scripts/clipboard-shims/wl-paste +48 -0
  233. package/scripts/clipboard-shims/xclip +31 -0
  234. package/scripts/install.sh +477 -0
  235. package/scripts/setup-node-pty.sh +63 -0
  236. package/scripts/setup.cjs +571 -0
  237. package/scripts/test-runner.ts +243 -0
  238. package/scripts/vercel-env-commands.sh +60 -0
  239. package/server.ts +139 -0
  240. package/src/app.css +1835 -0
  241. package/src/app.d.ts +31 -0
  242. package/src/app.html +24 -0
  243. package/src/generated/types/APN.ts +305 -0
  244. package/src/generated/types/CLI.ts +52 -0
  245. package/src/generated/types/JWT.ts +92 -0
  246. package/src/generated/types/Terminal.ts +2736 -0
  247. package/src/generated/types/index.ts +6 -0
  248. package/src/lib/assets/icons/alert-triangle.svg +5 -0
  249. package/src/lib/assets/icons/bell.svg +4 -0
  250. package/src/lib/assets/icons/check-circle.svg +4 -0
  251. package/src/lib/assets/icons/file.svg +4 -0
  252. package/src/lib/assets/icons/folder.svg +3 -0
  253. package/src/lib/assets/icons/play.svg +3 -0
  254. package/src/lib/assets/icons/refresh.svg +4 -0
  255. package/src/lib/assets/icons/settings.svg +4 -0
  256. package/src/lib/assets/icons/terminal.svg +1 -0
  257. package/src/lib/assets/icons/tool.svg +3 -0
  258. package/src/lib/assets/icons/x-circle.svg +5 -0
  259. package/src/lib/modules/client/common/Card.svelte +26 -0
  260. package/src/lib/modules/client/common/EmptyState.svelte +36 -0
  261. package/src/lib/modules/client/common/Icon.svelte +61 -0
  262. package/src/lib/modules/client/common/StatusBadge.svelte +38 -0
  263. package/src/lib/modules/client/common/cache.ts +31 -0
  264. package/src/lib/modules/client/common/config-guard.ts +18 -0
  265. package/src/lib/modules/client/common/index.ts +12 -0
  266. package/src/lib/modules/client/common/markdown.ts +23 -0
  267. package/src/lib/modules/client/common/native-bridge.ts +50 -0
  268. package/src/lib/modules/client/common/time.ts +22 -0
  269. package/src/lib/modules/client/common/tool-title.ts +28 -0
  270. package/src/lib/modules/client/terminal/ChatView.svelte +400 -0
  271. package/src/lib/modules/client/terminal/CommandPalette.svelte +60 -0
  272. package/src/lib/modules/client/terminal/ConnectionStatus.svelte +99 -0
  273. package/src/lib/modules/client/terminal/LaunchSheet.svelte +294 -0
  274. package/src/lib/modules/client/terminal/QuickKeys.svelte +71 -0
  275. package/src/lib/modules/client/terminal/ShortcutsHelp.svelte +79 -0
  276. package/src/lib/modules/client/terminal/keyboard-shortcuts.ts +70 -0
  277. package/src/lib/modules/client/terminal/xterm-wrapper.ts +243 -0
  278. package/src/lib/modules/server/apn/library-apns.ts +137 -0
  279. package/src/lib/modules/server/apn/notification-history.ts +35 -0
  280. package/src/lib/modules/server/apn/notification-sessions.ts +117 -0
  281. package/src/lib/modules/server/apn/pending-requests.ts +65 -0
  282. package/src/lib/modules/server/apn/types.ts +51 -0
  283. package/src/lib/modules/server/auth.ts +34 -0
  284. package/src/lib/modules/server/cli/index.ts +79 -0
  285. package/src/lib/modules/server/cli/runner.ts +162 -0
  286. package/src/lib/modules/server/fcm/fcm-service.ts +72 -0
  287. package/src/lib/modules/server/sessions/jsonl-parser.ts +197 -0
  288. package/src/lib/modules/server/sessions/jsonl-reader.ts +301 -0
  289. package/src/lib/modules/server/sessions/opencode-reader.ts +264 -0
  290. package/src/lib/modules/server/sessions/types.ts +53 -0
  291. package/src/lib/modules/server/terminal/holder-client.ts +273 -0
  292. package/src/lib/modules/server/terminal/opencode-watcher.ts +661 -0
  293. package/src/lib/modules/server/terminal/pty-holder.cjs +510 -0
  294. package/src/lib/modules/server/terminal/pty-manager.ts +1012 -0
  295. package/src/lib/modules/server/terminal/session-watcher.ts +320 -0
  296. package/src/lib/modules/server/terminal/terminal-store.ts +198 -0
  297. package/src/lib/modules/server/ws/events-handler.ts +73 -0
  298. package/src/lib/modules/server/ws/keepalive.ts +108 -0
  299. package/src/lib/modules/server/ws/server.ts +93 -0
  300. package/src/lib/modules/server/ws/session-handler.ts +462 -0
  301. package/src/lib/modules/server/ws/terminal-handler.ts +197 -0
  302. package/src/lib/modules/server/ws/ticket-store.ts +58 -0
  303. package/src/lib/theme.css +529 -0
  304. package/src/lib/types/config.ts +6 -0
  305. package/src/routes/+layout.svelte +218 -0
  306. package/src/routes/+page.svelte +261 -0
  307. package/src/routes/api/debug/+server.ts +33 -0
  308. package/src/routes/api/device-token/+server.ts +85 -0
  309. package/src/routes/api/health/+server.ts +100 -0
  310. package/src/routes/api/notify/+server.ts +418 -0
  311. package/src/routes/api/qr-config/+server.ts +45 -0
  312. package/src/routes/api/response/+server.ts +73 -0
  313. package/src/routes/api/sessions/+server.ts +120 -0
  314. package/src/routes/api/terminals/+server.ts +141 -0
  315. package/src/routes/api/terminals/[id]/+server.ts +75 -0
  316. package/src/routes/api/terminals/[id]/paste-image/+server.ts +61 -0
  317. package/src/routes/api/terminals/[id]/resize/+server.ts +60 -0
  318. package/src/routes/api/webhook/+server.ts +42 -0
  319. package/src/routes/api/ws-status/+server.ts +23 -0
  320. package/src/routes/api/ws-ticket/+server.ts +86 -0
  321. package/src/routes/config/+page.svelte +600 -0
  322. package/src/routes/project/+page.svelte +274 -0
  323. package/src/routes/session/[id]/+page.svelte +434 -0
  324. package/src/routes/terminals/+page.svelte +618 -0
  325. package/src/routes/terminals/[id]/+page.svelte +968 -0
  326. package/svelte.config.js +18 -0
  327. package/tsconfig.json +14 -0
package/src/app.css ADDED
@@ -0,0 +1,1835 @@
1
+ /* Geist Design System - Dark Mode */
2
+ :root {
3
+ /* Backgrounds */
4
+ --ds-background-100: #0a0a0a;
5
+ --ds-background-200: #000000;
6
+
7
+ /* Gray Scale (1-10) */
8
+ --ds-gray-100: #1a1a1a;
9
+ --ds-gray-200: #1f1f1f;
10
+ --ds-gray-300: #292929;
11
+ --ds-gray-400: #2e2e2e;
12
+ --ds-gray-500: #454545;
13
+ --ds-gray-600: #878787;
14
+ --ds-gray-700: #8f8f8f;
15
+ --ds-gray-800: #7d7d7d;
16
+ --ds-gray-900: #a1a1a1;
17
+ --ds-gray-1000: #ededed;
18
+
19
+ /* Gray Alpha */
20
+ --ds-gray-alpha-100: rgba(255, 255, 255, 0.06);
21
+ --ds-gray-alpha-200: rgba(255, 255, 255, 0.09);
22
+ --ds-gray-alpha-300: rgba(255, 255, 255, 0.13);
23
+ --ds-gray-alpha-400: rgba(255, 255, 255, 0.14);
24
+
25
+ /* Blue */
26
+ --ds-blue-100: #0d1d33;
27
+ --ds-blue-700: #0070f3;
28
+ --ds-blue-900: #52a8ff;
29
+
30
+ /* Red */
31
+ --ds-red-100: #2a1314;
32
+ --ds-red-700: #e5484d;
33
+ --ds-red-900: #ff6166;
34
+
35
+ /* Green */
36
+ --ds-green-100: #0d1f12;
37
+ --ds-green-700: #46a758;
38
+ --ds-green-900: #62c073;
39
+
40
+ /* Amber */
41
+ --ds-amber-100: #271700;
42
+ --ds-amber-700: #f5a623;
43
+ --ds-amber-900: #ffb224;
44
+
45
+ /* Semantic Aliases */
46
+ --background: var(--ds-background-100);
47
+ --background-secondary: var(--ds-background-200);
48
+
49
+ --component-bg: var(--ds-gray-100);
50
+ --component-bg-hover: var(--ds-gray-200);
51
+ --component-bg-active: var(--ds-gray-300);
52
+
53
+ --border: var(--ds-gray-400);
54
+ --border-hover: var(--ds-gray-500);
55
+ --border-active: var(--ds-gray-600);
56
+
57
+ --text-primary: var(--ds-gray-1000);
58
+ --text-secondary: var(--ds-gray-900);
59
+ --text-tertiary: var(--ds-gray-800);
60
+
61
+ /* Typography */
62
+ --font-sans:
63
+ 'Geist', -apple-system, 'BlinkMacSystemFont', 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',
64
+ 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
65
+ --font-mono: 'Geist Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', monospace;
66
+
67
+ /* Font Sizes - Geist Typography Scale */
68
+ --text-xs: 12px;
69
+ --text-sm: 13px;
70
+ --text-base: 14px;
71
+ --text-md: 15px;
72
+ --text-lg: 16px;
73
+ --text-xl: 20px;
74
+ --text-2xl: 24px;
75
+ --text-3xl: 32px;
76
+ --text-4xl: 40px;
77
+
78
+ /* Line Heights */
79
+ --leading-none: 1;
80
+ --leading-tight: 1.25;
81
+ --leading-snug: 1.375;
82
+ --leading-normal: 1.5;
83
+ --leading-relaxed: 1.625;
84
+
85
+ /* Letter Spacing */
86
+ --tracking-tighter: -0.04em;
87
+ --tracking-tight: -0.02em;
88
+ --tracking-normal: 0;
89
+
90
+ /* Spacing */
91
+ --space-0: 0;
92
+ --space-1: 4px;
93
+ --space-2: 8px;
94
+ --space-3: 12px;
95
+ --space-4: 16px;
96
+ --space-5: 20px;
97
+ --space-6: 24px;
98
+ --space-8: 32px;
99
+ --space-10: 40px;
100
+ --space-12: 48px;
101
+ --space-16: 64px;
102
+
103
+ /* Border Radius */
104
+ --radius-sm: 4px;
105
+ --radius-md: 6px;
106
+ --radius-lg: 8px;
107
+ --radius-xl: 12px;
108
+ --radius-full: 9999px;
109
+
110
+ /* Transitions */
111
+ --transition-fast: 150ms ease;
112
+ --transition-normal: 200ms ease;
113
+
114
+ /* Layout */
115
+ --max-width: 1100px;
116
+ --header-height: 64px;
117
+ }
118
+
119
+ /* Reset */
120
+ *,
121
+ *::before,
122
+ *::after {
123
+ margin: 0;
124
+ padding: 0;
125
+ box-sizing: border-box;
126
+ }
127
+
128
+ html {
129
+ -webkit-font-smoothing: antialiased;
130
+ -moz-osx-font-smoothing: grayscale;
131
+ text-rendering: optimizeLegibility;
132
+ }
133
+
134
+ body {
135
+ font-family: var(--font-sans);
136
+ font-size: var(--text-base);
137
+ line-height: var(--leading-normal);
138
+ background: var(--background);
139
+ color: var(--text-primary);
140
+ min-height: 100vh;
141
+ }
142
+
143
+ /* App Layout */
144
+ .app {
145
+ height: 100vh;
146
+ display: flex;
147
+ flex-direction: column;
148
+ overflow: hidden;
149
+ }
150
+
151
+ /* Header */
152
+ .header {
153
+ height: var(--header-height);
154
+ background: var(--background);
155
+ border-bottom: 1px solid var(--border);
156
+ position: sticky;
157
+ top: 0;
158
+ z-index: 100;
159
+ }
160
+
161
+ .header-content {
162
+ max-width: var(--max-width);
163
+ height: 100%;
164
+ margin: 0 auto;
165
+ padding: 0 var(--space-6);
166
+ display: flex;
167
+ justify-content: space-between;
168
+ align-items: center;
169
+ }
170
+
171
+ /* Logo */
172
+ .logo {
173
+ display: flex;
174
+ align-items: center;
175
+ gap: var(--space-3);
176
+ text-decoration: none;
177
+ color: inherit;
178
+ }
179
+
180
+ .logo-icon {
181
+ width: 24px;
182
+ height: 24px;
183
+ flex-shrink: 0;
184
+ }
185
+
186
+ .logo-text {
187
+ font-size: var(--text-md);
188
+ font-weight: 500;
189
+ letter-spacing: var(--tracking-tight);
190
+ color: var(--text-primary);
191
+ }
192
+
193
+ /* Navigation */
194
+ .nav {
195
+ display: flex;
196
+ align-items: center;
197
+ gap: var(--space-1);
198
+ }
199
+
200
+ .nav-link {
201
+ display: flex;
202
+ align-items: center;
203
+ gap: var(--space-2);
204
+ padding: var(--space-2) var(--space-3);
205
+ border-radius: var(--radius-md);
206
+ font-size: var(--text-sm);
207
+ font-weight: 400;
208
+ color: var(--text-secondary);
209
+ text-decoration: none;
210
+ background: transparent;
211
+ border: none;
212
+ cursor: pointer;
213
+ transition:
214
+ color var(--transition-fast),
215
+ background var(--transition-fast);
216
+ }
217
+
218
+ .nav-link:hover {
219
+ color: var(--text-primary);
220
+ background: var(--component-bg);
221
+ }
222
+
223
+ .nav-link.active {
224
+ color: var(--text-primary);
225
+ }
226
+
227
+ /* Main Content */
228
+ .main {
229
+ flex: 1;
230
+ max-width: var(--max-width);
231
+ width: 100%;
232
+ margin: 0 auto;
233
+ padding: var(--space-8) var(--space-6);
234
+ }
235
+
236
+ /* Page Header */
237
+ .page-header {
238
+ margin-bottom: var(--space-8);
239
+ }
240
+
241
+ .page-title {
242
+ font-size: var(--text-2xl);
243
+ font-weight: 600;
244
+ letter-spacing: var(--tracking-tighter);
245
+ color: var(--text-primary);
246
+ line-height: var(--leading-tight);
247
+ margin-bottom: var(--space-2);
248
+ }
249
+
250
+ .page-description {
251
+ font-size: var(--text-sm);
252
+ color: var(--text-secondary);
253
+ line-height: var(--leading-normal);
254
+ }
255
+
256
+ /* Cards */
257
+ .card {
258
+ background: var(--component-bg);
259
+ border: 1px solid var(--border);
260
+ border-radius: var(--radius-lg);
261
+ overflow: hidden;
262
+ }
263
+
264
+ .card-header {
265
+ padding: var(--space-4) var(--space-5);
266
+ border-bottom: 1px solid var(--ds-gray-alpha-200);
267
+ }
268
+
269
+ .card-title {
270
+ font-size: var(--text-sm);
271
+ font-weight: 500;
272
+ color: var(--text-primary);
273
+ line-height: var(--leading-tight);
274
+ }
275
+
276
+ .card-description {
277
+ font-size: var(--text-sm);
278
+ color: var(--text-tertiary);
279
+ margin-top: var(--space-1);
280
+ line-height: var(--leading-normal);
281
+ }
282
+
283
+ .card-content {
284
+ padding: var(--space-5);
285
+ }
286
+
287
+ /* Form elements and buttons now provided by @juspay/svelte-ui-components
288
+ (Button, Input) with theme vars in theme.css */
289
+
290
+ /* Status Badge */
291
+ .status-badge {
292
+ display: inline-flex;
293
+ align-items: center;
294
+ gap: var(--space-2);
295
+ height: 26px;
296
+ padding: 0 var(--space-3);
297
+ border-radius: var(--radius-full);
298
+ font-size: var(--text-xs);
299
+ font-weight: 500;
300
+ text-transform: uppercase;
301
+ letter-spacing: 0.02em;
302
+ }
303
+
304
+ .status-badge.online {
305
+ background: var(--ds-green-100);
306
+ color: var(--ds-green-900);
307
+ }
308
+
309
+ .status-badge.offline {
310
+ background: var(--ds-red-100);
311
+ color: var(--ds-red-900);
312
+ }
313
+
314
+ .status-badge.degraded {
315
+ background: var(--ds-amber-100);
316
+ color: var(--ds-amber-900);
317
+ }
318
+
319
+ .status-dot {
320
+ width: 6px;
321
+ height: 6px;
322
+ border-radius: 50%;
323
+ background: currentColor;
324
+ }
325
+
326
+ /* Empty State */
327
+ .empty-state {
328
+ display: flex;
329
+ flex-direction: column;
330
+ align-items: center;
331
+ text-align: center;
332
+ padding: var(--space-16) var(--space-6);
333
+ }
334
+
335
+ @media (max-width: 768px) {
336
+ .empty-state {
337
+ padding: var(--space-8) var(--space-4);
338
+ }
339
+ }
340
+ @media (max-width: 480px) {
341
+ .empty-state {
342
+ padding: var(--space-6) var(--space-3);
343
+ }
344
+ }
345
+
346
+ .empty-state-icon {
347
+ width: 48px;
348
+ height: 48px;
349
+ margin: 0 auto var(--space-5);
350
+ background: var(--component-bg);
351
+ border-radius: var(--radius-lg);
352
+ display: flex;
353
+ align-items: center;
354
+ justify-content: center;
355
+ }
356
+
357
+ .empty-state-icon svg {
358
+ width: 24px;
359
+ height: 24px;
360
+ color: var(--text-tertiary);
361
+ }
362
+
363
+ .empty-state-title {
364
+ font-size: var(--text-lg);
365
+ font-weight: 600;
366
+ color: var(--text-primary);
367
+ margin-bottom: var(--space-2);
368
+ }
369
+
370
+ .empty-state-description {
371
+ font-size: var(--text-sm);
372
+ color: var(--text-secondary);
373
+ max-width: 320px;
374
+ margin: 0 auto var(--space-6);
375
+ line-height: var(--leading-relaxed);
376
+ }
377
+
378
+ /* Alert now provided by Banner from @juspay/svelte-ui-components */
379
+
380
+ /* List */
381
+ .list {
382
+ border: 1px solid var(--border);
383
+ border-radius: var(--radius-lg);
384
+ overflow: hidden;
385
+ }
386
+
387
+ .list-item {
388
+ display: flex;
389
+ align-items: center;
390
+ padding: var(--space-4) var(--space-5);
391
+ background: var(--component-bg);
392
+ border-bottom: 1px solid var(--ds-gray-alpha-200);
393
+ transition: background var(--transition-fast);
394
+ }
395
+
396
+ .list-item:last-child {
397
+ border-bottom: none;
398
+ }
399
+
400
+ .list-item:hover {
401
+ background: var(--component-bg-hover);
402
+ }
403
+
404
+ /* Tags now provided by Pill from @juspay/svelte-ui-components */
405
+
406
+ /* Code */
407
+ .code {
408
+ font-family: var(--font-mono);
409
+ font-size: var(--text-xs);
410
+ background: var(--component-bg);
411
+ padding: var(--space-1) var(--space-2);
412
+ border-radius: var(--radius-sm);
413
+ color: var(--text-secondary);
414
+ }
415
+
416
+ /* Divider */
417
+ .divider {
418
+ height: 1px;
419
+ background: var(--border);
420
+ margin: var(--space-6) 0;
421
+ }
422
+
423
+ /* Animations */
424
+ @keyframes spin {
425
+ to {
426
+ transform: rotate(360deg);
427
+ }
428
+ }
429
+
430
+ @keyframes fadeIn {
431
+ from {
432
+ opacity: 0;
433
+ }
434
+ to {
435
+ opacity: 1;
436
+ }
437
+ }
438
+
439
+ @keyframes slideUp {
440
+ from {
441
+ opacity: 0;
442
+ transform: translateY(4px);
443
+ }
444
+ to {
445
+ opacity: 1;
446
+ transform: translateY(0);
447
+ }
448
+ }
449
+
450
+ /* Utilities */
451
+ .sr-only {
452
+ position: absolute;
453
+ width: 1px;
454
+ height: 1px;
455
+ padding: 0;
456
+ margin: -1px;
457
+ overflow: hidden;
458
+ clip: rect(0, 0, 0, 0);
459
+ white-space: nowrap;
460
+ border: 0;
461
+ }
462
+
463
+ /* Responsive */
464
+ @media (max-width: 768px) {
465
+ :root {
466
+ --header-height: 56px;
467
+ }
468
+
469
+ .header-content {
470
+ padding: 0 var(--space-4);
471
+ }
472
+
473
+ .main {
474
+ padding: var(--space-6) var(--space-4);
475
+ }
476
+
477
+ .page-title {
478
+ font-size: var(--text-xl);
479
+ }
480
+
481
+ .hide-mobile {
482
+ display: none;
483
+ }
484
+ }
485
+
486
+ @media (max-width: 480px) {
487
+ :root {
488
+ --header-height: 48px;
489
+ }
490
+
491
+ .main {
492
+ padding: var(--space-4) var(--space-3);
493
+ }
494
+
495
+ .header-content {
496
+ padding: 0 var(--space-3);
497
+ }
498
+
499
+ .logo {
500
+ gap: var(--space-2);
501
+ }
502
+
503
+ .logo-text {
504
+ font-size: var(--text-sm);
505
+ }
506
+
507
+ .nav {
508
+ gap: 0;
509
+ }
510
+
511
+ .nav-link {
512
+ padding: var(--space-3) var(--space-2);
513
+ font-size: 13px;
514
+ min-height: 44px;
515
+ display: inline-flex;
516
+ align-items: center;
517
+ }
518
+
519
+ /* Mobile touch targets — iOS HIG minimum 44px */
520
+ .btn {
521
+ min-height: 44px;
522
+ height: auto;
523
+ padding: 10px 16px;
524
+ }
525
+
526
+ .btn-sm {
527
+ min-height: 44px;
528
+ height: auto;
529
+ padding: 10px 12px;
530
+ }
531
+
532
+ .input {
533
+ min-height: 44px;
534
+ height: auto;
535
+ padding: 10px 12px;
536
+ }
537
+ }
538
+
539
+ /* Focus States */
540
+ .btn:focus-visible,
541
+ .input:focus-visible,
542
+ .nav-link:focus-visible {
543
+ outline: 2px solid var(--ds-blue-700);
544
+ outline-offset: 2px;
545
+ }
546
+
547
+ /* Reduced Motion */
548
+ @media (prefers-reduced-motion: reduce) {
549
+ *,
550
+ *::before,
551
+ *::after {
552
+ animation-duration: 0.01ms !important;
553
+ animation-iteration-count: 1 !important;
554
+ transition-duration: 0.01ms !important;
555
+ }
556
+ }
557
+
558
+ /* Selection */
559
+ ::selection {
560
+ background: var(--ds-blue-700);
561
+ color: #fff;
562
+ }
563
+
564
+ /* Scrollbar */
565
+ ::-webkit-scrollbar {
566
+ width: 8px;
567
+ height: 8px;
568
+ }
569
+
570
+ ::-webkit-scrollbar-track {
571
+ background: transparent;
572
+ }
573
+
574
+ ::-webkit-scrollbar-thumb {
575
+ background: var(--ds-gray-400);
576
+ border-radius: var(--radius-full);
577
+ }
578
+
579
+ ::-webkit-scrollbar-thumb:hover {
580
+ background: var(--ds-gray-500);
581
+ }
582
+
583
+ /* ============================================
584
+ Session Cards
585
+ ============================================ */
586
+
587
+ .session-card {
588
+ background: var(--bg-secondary, #141414);
589
+ border: 1px solid var(--border, #2a2a2a);
590
+ border-radius: var(--radius-lg, 12px);
591
+ padding: var(--space-4, 1rem) var(--space-5, 1.25rem);
592
+ cursor: pointer;
593
+ transition:
594
+ border-color var(--transition-fast, 150ms),
595
+ background var(--transition-fast, 150ms);
596
+ display: flex;
597
+ flex-direction: column;
598
+ overflow: hidden;
599
+ min-width: 0;
600
+ gap: var(--space-3, 0.75rem);
601
+ }
602
+
603
+ .session-card:hover {
604
+ border-color: var(--gray-600, #525252);
605
+ background: var(--bg-tertiary, #1a1a1a);
606
+ }
607
+
608
+ .session-card-header {
609
+ display: flex;
610
+ justify-content: space-between;
611
+ align-items: flex-start;
612
+ gap: var(--space-3, 0.75rem);
613
+ min-width: 0;
614
+ overflow: hidden;
615
+ }
616
+
617
+ .session-card-header > div:first-child {
618
+ min-width: 0;
619
+ overflow: hidden;
620
+ }
621
+
622
+ .session-card-title {
623
+ font-size: 1rem;
624
+ font-weight: 600;
625
+ color: var(--text-primary, #fafafa);
626
+ margin: 0;
627
+ overflow: hidden;
628
+ text-overflow: ellipsis;
629
+ white-space: nowrap;
630
+ }
631
+
632
+ .session-card-subtitle {
633
+ font-size: 0.8rem;
634
+ color: var(--text-tertiary, #737373);
635
+ font-family: var(--font-mono, monospace);
636
+ margin-top: 2px;
637
+ overflow: hidden;
638
+ text-overflow: ellipsis;
639
+ white-space: nowrap;
640
+ max-width: 100%;
641
+ }
642
+
643
+ /* Session badges now provided by Pill from @juspay/svelte-ui-components */
644
+
645
+ .session-stats {
646
+ display: flex;
647
+ gap: var(--space-4, 1rem);
648
+ font-size: 0.8rem;
649
+ color: var(--text-secondary, #a3a3a3);
650
+ }
651
+
652
+ .session-stats strong {
653
+ color: var(--text-primary, #fafafa);
654
+ font-weight: 600;
655
+ }
656
+
657
+ .session-tools {
658
+ display: flex;
659
+ flex-wrap: wrap;
660
+ gap: 6px;
661
+ }
662
+
663
+ .session-tool-pill {
664
+ padding: 3px 8px;
665
+ border-radius: 4px;
666
+ font-size: 0.7rem;
667
+ font-weight: 600;
668
+ font-family: var(--font-mono, monospace);
669
+ border: 1px solid;
670
+ }
671
+
672
+ .session-tool-pill[data-tool='Bash'] {
673
+ background: rgba(245, 158, 11, 0.15);
674
+ color: #f59e0b;
675
+ border-color: rgba(245, 158, 11, 0.3);
676
+ }
677
+ .session-tool-pill[data-tool='Edit'] {
678
+ background: rgba(59, 130, 246, 0.15);
679
+ color: #3b82f6;
680
+ border-color: rgba(59, 130, 246, 0.3);
681
+ }
682
+ .session-tool-pill[data-tool='Write'] {
683
+ background: rgba(139, 92, 246, 0.15);
684
+ color: #8b5cf6;
685
+ border-color: rgba(139, 92, 246, 0.3);
686
+ }
687
+ .session-tool-pill[data-tool='Read'] {
688
+ background: rgba(16, 185, 129, 0.15);
689
+ color: #10b981;
690
+ border-color: rgba(16, 185, 129, 0.3);
691
+ }
692
+ .session-tool-pill[data-tool='Agent'] {
693
+ background: rgba(239, 68, 68, 0.15);
694
+ color: #ef4444;
695
+ border-color: rgba(239, 68, 68, 0.3);
696
+ }
697
+ .session-tool-pill[data-tool='Build'] {
698
+ background: rgba(6, 182, 212, 0.15);
699
+ color: #06b6d4;
700
+ border-color: rgba(6, 182, 212, 0.3);
701
+ }
702
+ .session-tool-pill[data-tool='Test'] {
703
+ background: rgba(236, 72, 153, 0.15);
704
+ color: #ec4899;
705
+ border-color: rgba(236, 72, 153, 0.3);
706
+ }
707
+
708
+ .session-tool-pill-default {
709
+ background: rgba(107, 114, 128, 0.15);
710
+ color: #9ca3af;
711
+ border-color: rgba(107, 114, 128, 0.3);
712
+ }
713
+
714
+ .session-tool-more {
715
+ padding: 3px 8px;
716
+ border-radius: 4px;
717
+ font-size: 0.7rem;
718
+ color: var(--text-tertiary, #737373);
719
+ background: rgba(255, 255, 255, 0.05);
720
+ }
721
+
722
+ .session-duration {
723
+ font-size: 0.75rem;
724
+ color: var(--text-tertiary, #737373);
725
+ }
726
+
727
+ .session-chevron {
728
+ color: var(--text-tertiary, #737373);
729
+ font-size: 1.2rem;
730
+ align-self: center;
731
+ }
732
+
733
+ /* ============================================
734
+ Session Detail Page
735
+ ============================================ */
736
+
737
+ .session-detail-header {
738
+ display: flex;
739
+ align-items: center;
740
+ gap: var(--space-3, 0.75rem);
741
+ margin-bottom: var(--space-4, 1rem);
742
+ }
743
+
744
+ .session-back-btn {
745
+ display: inline-flex;
746
+ align-items: center;
747
+ justify-content: center;
748
+ width: 36px;
749
+ height: 36px;
750
+ border-radius: var(--radius-md, 8px);
751
+ background: var(--bg-secondary, #141414);
752
+ border: 1px solid var(--border, #2a2a2a);
753
+ color: var(--text-secondary, #a3a3a3);
754
+ cursor: pointer;
755
+ transition: all var(--transition-fast, 150ms);
756
+ text-decoration: none;
757
+ font-size: 1.1rem;
758
+ }
759
+
760
+ .session-back-btn:hover {
761
+ background: var(--bg-tertiary, #1a1a1a);
762
+ color: var(--text-primary, #fafafa);
763
+ border-color: var(--gray-600, #525252);
764
+ }
765
+
766
+ .session-info-bar {
767
+ display: grid;
768
+ grid-template-columns: repeat(4, 1fr);
769
+ gap: 1px;
770
+ background: var(--border, #2a2a2a);
771
+ border: 1px solid var(--border, #2a2a2a);
772
+ border-radius: var(--radius-lg, 12px);
773
+ overflow: hidden;
774
+ margin-bottom: var(--space-5, 1.25rem);
775
+ }
776
+
777
+ .session-info-item {
778
+ background: var(--bg-secondary, #141414);
779
+ padding: var(--space-3, 0.75rem) var(--space-4, 1rem);
780
+ }
781
+
782
+ .session-info-label {
783
+ font-size: 0.65rem;
784
+ text-transform: uppercase;
785
+ letter-spacing: 0.08em;
786
+ color: var(--text-tertiary, #737373);
787
+ margin-bottom: 4px;
788
+ }
789
+
790
+ .session-info-value {
791
+ font-size: 0.9rem;
792
+ font-weight: 500;
793
+ color: var(--text-primary, #fafafa);
794
+ }
795
+
796
+ .session-events-list {
797
+ display: flex;
798
+ flex-direction: column;
799
+ gap: 0;
800
+ }
801
+
802
+ .session-event {
803
+ display: grid;
804
+ grid-template-columns: 60px auto 1fr;
805
+ gap: var(--space-3, 0.75rem);
806
+ padding: var(--space-3, 0.75rem) 0;
807
+ border-bottom: 1px solid var(--border, #2a2a2a);
808
+ align-items: start;
809
+ }
810
+
811
+ .session-event:last-child {
812
+ border-bottom: none;
813
+ }
814
+
815
+ .session-event-time {
816
+ font-family: var(--font-mono, monospace);
817
+ font-size: 0.8rem;
818
+ color: var(--text-tertiary, #737373);
819
+ padding-top: 2px;
820
+ }
821
+
822
+ .session-event-tool {
823
+ padding: 3px 8px;
824
+ border-radius: 4px;
825
+ font-size: 0.7rem;
826
+ font-weight: 600;
827
+ font-family: var(--font-mono, monospace);
828
+ text-align: center;
829
+ min-width: 50px;
830
+ border: 1px solid;
831
+ }
832
+
833
+ .session-event-content {
834
+ min-width: 0;
835
+ }
836
+
837
+ .session-event-title {
838
+ font-size: 0.9rem;
839
+ color: var(--text-primary, #fafafa);
840
+ font-weight: 500;
841
+ white-space: nowrap;
842
+ overflow: hidden;
843
+ text-overflow: ellipsis;
844
+ }
845
+
846
+ .session-event-message {
847
+ font-size: 0.8rem;
848
+ color: var(--text-tertiary, #737373);
849
+ margin-top: 2px;
850
+ white-space: nowrap;
851
+ overflow: hidden;
852
+ text-overflow: ellipsis;
853
+ }
854
+
855
+ .session-footer {
856
+ display: flex;
857
+ justify-content: space-between;
858
+ align-items: center;
859
+ padding-top: var(--space-4, 1rem);
860
+ margin-top: var(--space-3, 0.75rem);
861
+ border-top: 1px solid var(--border, #2a2a2a);
862
+ font-size: 0.8rem;
863
+ color: var(--text-secondary, #a3a3a3);
864
+ }
865
+
866
+ /* ============================================
867
+ Session Mobile Responsive
868
+ ============================================ */
869
+
870
+ @media (max-width: 768px) {
871
+ .session-card {
872
+ padding: var(--space-3, 0.75rem);
873
+ }
874
+
875
+ .session-card-header {
876
+ flex-direction: column;
877
+ gap: var(--space-2, 0.5rem);
878
+ }
879
+
880
+ .session-badge {
881
+ align-self: flex-start;
882
+ }
883
+
884
+ .session-stats {
885
+ flex-wrap: wrap;
886
+ gap: var(--space-2, 0.5rem);
887
+ }
888
+
889
+ .session-info-bar {
890
+ grid-template-columns: 1fr 1fr;
891
+ }
892
+
893
+ .session-event {
894
+ grid-template-columns: 50px auto 1fr;
895
+ gap: var(--space-2, 0.5rem);
896
+ }
897
+
898
+ .session-event-title {
899
+ white-space: normal;
900
+ }
901
+
902
+ .session-footer {
903
+ flex-direction: column;
904
+ gap: var(--space-2, 0.5rem);
905
+ align-items: flex-start;
906
+ }
907
+ }
908
+
909
+ @media (max-width: 480px) {
910
+ .session-info-bar {
911
+ grid-template-columns: 1fr;
912
+ }
913
+
914
+ .session-event {
915
+ grid-template-columns: 1fr;
916
+ gap: var(--space-1, 0.25rem);
917
+ }
918
+
919
+ .session-event-time {
920
+ font-size: 0.7rem;
921
+ }
922
+
923
+ .session-card {
924
+ padding: 10px 12px;
925
+ gap: var(--space-2);
926
+ }
927
+ .session-card-subtitle {
928
+ font-size: 0.7rem;
929
+ }
930
+ .session-stats {
931
+ gap: var(--space-1);
932
+ font-size: 0.75rem;
933
+ }
934
+ }
935
+
936
+ /* ============================================
937
+ Chat Conversation View
938
+ ============================================ */
939
+
940
+ .chat-container {
941
+ display: flex;
942
+ flex-direction: column;
943
+ gap: var(--space-4, 1rem);
944
+ padding: var(--space-4, 1rem) 0;
945
+ overflow-y: auto;
946
+ flex: 1;
947
+ min-height: 0;
948
+ }
949
+
950
+ .chat-message {
951
+ display: flex;
952
+ gap: var(--space-3, 0.75rem);
953
+ max-width: 85%;
954
+ animation: fadeInUp 0.2s ease-out;
955
+ }
956
+
957
+ @keyframes fadeInUp {
958
+ from {
959
+ opacity: 0;
960
+ transform: translateY(8px);
961
+ }
962
+ to {
963
+ opacity: 1;
964
+ transform: translateY(0);
965
+ }
966
+ }
967
+
968
+ .chat-message-user {
969
+ align-self: flex-end;
970
+ flex-direction: row-reverse;
971
+ }
972
+
973
+ .chat-message-assistant {
974
+ align-self: flex-start;
975
+ }
976
+
977
+ .chat-message-system {
978
+ align-self: center;
979
+ max-width: 90%;
980
+ }
981
+
982
+ .chat-avatar {
983
+ width: 28px;
984
+ height: 28px;
985
+ border-radius: 50%;
986
+ display: flex;
987
+ align-items: center;
988
+ justify-content: center;
989
+ font-size: 0.75rem;
990
+ flex-shrink: 0;
991
+ margin-top: 4px;
992
+ }
993
+
994
+ .chat-avatar-user {
995
+ background: rgba(59, 130, 246, 0.2);
996
+ color: #60a5fa;
997
+ border: 1px solid rgba(59, 130, 246, 0.3);
998
+ }
999
+
1000
+ .chat-avatar-assistant {
1001
+ background: rgba(249, 115, 22, 0.2);
1002
+ color: #fb923c;
1003
+ border: 1px solid rgba(249, 115, 22, 0.3);
1004
+ }
1005
+
1006
+ .chat-bubble {
1007
+ border-radius: var(--radius-lg, 12px);
1008
+ padding: var(--space-3, 0.75rem) var(--space-4, 1rem);
1009
+ line-height: 1.5;
1010
+ font-size: 0.9rem;
1011
+ word-break: break-word;
1012
+ overflow-wrap: break-word;
1013
+ min-width: 0;
1014
+ overflow: hidden;
1015
+ }
1016
+
1017
+ .chat-bubble-user {
1018
+ background: #1e293b;
1019
+ border: 1px solid #334155;
1020
+ color: var(--text-primary, #fafafa);
1021
+ border-bottom-right-radius: 4px;
1022
+ }
1023
+
1024
+ .chat-bubble-assistant {
1025
+ background: var(--bg-secondary, #141414);
1026
+ border: 1px solid var(--border, #2a2a2a);
1027
+ color: var(--text-primary, #fafafa);
1028
+ border-bottom-left-radius: 4px;
1029
+ }
1030
+
1031
+ .chat-bubble p {
1032
+ margin: 0 0 0.5rem 0;
1033
+ }
1034
+
1035
+ .chat-bubble p:last-child {
1036
+ margin-bottom: 0;
1037
+ }
1038
+
1039
+ .chat-bubble code {
1040
+ background: rgba(255, 255, 255, 0.08);
1041
+ padding: 2px 6px;
1042
+ border-radius: 4px;
1043
+ font-family: var(--font-mono, monospace);
1044
+ font-size: 0.85em;
1045
+ }
1046
+
1047
+ .chat-bubble pre {
1048
+ background: rgba(0, 0, 0, 0.3);
1049
+ border: 1px solid var(--border, #2a2a2a);
1050
+ border-radius: var(--radius-md, 8px);
1051
+ padding: var(--space-3, 0.75rem);
1052
+ overflow-x: auto;
1053
+ margin: 0.5rem 0;
1054
+ font-size: 0.8rem;
1055
+ }
1056
+
1057
+ @media (max-width: 768px) {
1058
+ .chat-bubble pre {
1059
+ max-width: calc(100vw - 120px);
1060
+ }
1061
+ }
1062
+
1063
+ .chat-bubble pre code {
1064
+ background: none;
1065
+ padding: 0;
1066
+ }
1067
+
1068
+ /* Markdown rendering inside chat bubbles */
1069
+ .chat-bubble h1,
1070
+ .chat-bubble h2,
1071
+ .chat-bubble h3,
1072
+ .chat-bubble h4 {
1073
+ margin: 0.75rem 0 0.25rem;
1074
+ font-weight: 600;
1075
+ line-height: 1.3;
1076
+ color: var(--text-primary, #fafafa);
1077
+ }
1078
+
1079
+ .chat-bubble h1 {
1080
+ font-size: 1.15em;
1081
+ }
1082
+ .chat-bubble h2 {
1083
+ font-size: 1.05em;
1084
+ }
1085
+ .chat-bubble h3 {
1086
+ font-size: 0.95em;
1087
+ }
1088
+ .chat-bubble h4 {
1089
+ font-size: 0.9em;
1090
+ }
1091
+
1092
+ .chat-bubble h1:first-child,
1093
+ .chat-bubble h2:first-child,
1094
+ .chat-bubble h3:first-child {
1095
+ margin-top: 0;
1096
+ }
1097
+
1098
+ .chat-bubble ul,
1099
+ .chat-bubble ol {
1100
+ margin: 0.4rem 0;
1101
+ padding-left: 1.4rem;
1102
+ }
1103
+
1104
+ .chat-bubble li {
1105
+ margin-bottom: 0.2rem;
1106
+ line-height: 1.5;
1107
+ }
1108
+
1109
+ .chat-bubble li > ul,
1110
+ .chat-bubble li > ol {
1111
+ margin: 0.1rem 0;
1112
+ }
1113
+
1114
+ .chat-bubble blockquote {
1115
+ border-left: 3px solid var(--gray-600, #525252);
1116
+ margin: 0.5rem 0;
1117
+ padding: 0.25rem 0.75rem;
1118
+ color: var(--text-secondary, #a3a3a3);
1119
+ font-style: italic;
1120
+ }
1121
+
1122
+ .chat-bubble table {
1123
+ border-collapse: collapse;
1124
+ width: 100%;
1125
+ margin: 0.5rem 0;
1126
+ font-size: 0.85em;
1127
+ }
1128
+
1129
+ .chat-bubble th,
1130
+ .chat-bubble td {
1131
+ border: 1px solid var(--border, #2a2a2a);
1132
+ padding: 0.35rem 0.6rem;
1133
+ text-align: left;
1134
+ }
1135
+
1136
+ .chat-bubble th {
1137
+ background: rgba(255, 255, 255, 0.04);
1138
+ font-weight: 600;
1139
+ }
1140
+
1141
+ .chat-bubble hr {
1142
+ border: none;
1143
+ border-top: 1px solid var(--border, #2a2a2a);
1144
+ margin: 0.75rem 0;
1145
+ }
1146
+
1147
+ .chat-bubble a {
1148
+ color: #60a5fa;
1149
+ text-decoration: none;
1150
+ }
1151
+
1152
+ .chat-bubble a:hover {
1153
+ text-decoration: underline;
1154
+ }
1155
+
1156
+ .chat-bubble strong {
1157
+ font-weight: 600;
1158
+ color: var(--text-primary, #fafafa);
1159
+ }
1160
+
1161
+ .chat-bubble em {
1162
+ font-style: italic;
1163
+ }
1164
+
1165
+ .chat-bubble img {
1166
+ max-width: 100%;
1167
+ border-radius: var(--radius-md, 8px);
1168
+ }
1169
+
1170
+ .chat-timestamp {
1171
+ font-size: 0.7rem;
1172
+ color: var(--text-tertiary, #737373);
1173
+ margin-top: 4px;
1174
+ padding: 0 4px;
1175
+ }
1176
+
1177
+ .chat-message-user .chat-timestamp {
1178
+ text-align: right;
1179
+ }
1180
+
1181
+ /* Tool Call Cards */
1182
+ .chat-tool-card {
1183
+ background: var(--bg-secondary, #141414);
1184
+ border: 1px solid var(--border, #2a2a2a);
1185
+ border-radius: var(--radius-md, 8px);
1186
+ overflow: hidden;
1187
+ margin: var(--space-2, 0.5rem) 0;
1188
+ max-width: 90%;
1189
+ align-self: flex-start;
1190
+ }
1191
+
1192
+ .chat-tool-header {
1193
+ display: flex;
1194
+ align-items: center;
1195
+ gap: var(--space-2, 0.5rem);
1196
+ padding: var(--space-2, 0.5rem) var(--space-3, 0.75rem);
1197
+ cursor: pointer;
1198
+ user-select: none;
1199
+ transition: background var(--transition-fast, 150ms);
1200
+ }
1201
+
1202
+ .chat-tool-header:hover {
1203
+ background: rgba(255, 255, 255, 0.03);
1204
+ }
1205
+
1206
+ .chat-tool-chevron {
1207
+ font-size: 0.7rem;
1208
+ color: var(--text-tertiary, #737373);
1209
+ transition: transform 0.2s ease;
1210
+ }
1211
+
1212
+ .chat-tool-chevron.expanded {
1213
+ transform: rotate(90deg);
1214
+ }
1215
+
1216
+ .chat-tool-name {
1217
+ font-family: var(--font-mono, monospace);
1218
+ font-size: 0.75rem;
1219
+ font-weight: 600;
1220
+ padding: 2px 8px;
1221
+ border-radius: 4px;
1222
+ border: 1px solid;
1223
+ }
1224
+
1225
+ .chat-tool-name[data-tool='Bash'] {
1226
+ background: rgba(245, 158, 11, 0.15);
1227
+ color: #f59e0b;
1228
+ border-color: rgba(245, 158, 11, 0.3);
1229
+ }
1230
+ .chat-tool-name[data-tool='Edit'] {
1231
+ background: rgba(59, 130, 246, 0.15);
1232
+ color: #3b82f6;
1233
+ border-color: rgba(59, 130, 246, 0.3);
1234
+ }
1235
+ .chat-tool-name[data-tool='Write'] {
1236
+ background: rgba(139, 92, 246, 0.15);
1237
+ color: #8b5cf6;
1238
+ border-color: rgba(139, 92, 246, 0.3);
1239
+ }
1240
+ .chat-tool-name[data-tool='Read'] {
1241
+ background: rgba(16, 185, 129, 0.15);
1242
+ color: #10b981;
1243
+ border-color: rgba(16, 185, 129, 0.3);
1244
+ }
1245
+ .chat-tool-name[data-tool='Agent'] {
1246
+ background: rgba(239, 68, 68, 0.15);
1247
+ color: #ef4444;
1248
+ border-color: rgba(239, 68, 68, 0.3);
1249
+ }
1250
+ .chat-tool-name[data-tool='Grep'] {
1251
+ background: rgba(6, 182, 212, 0.15);
1252
+ color: #06b6d4;
1253
+ border-color: rgba(6, 182, 212, 0.3);
1254
+ }
1255
+ .chat-tool-name[data-tool='Glob'] {
1256
+ background: rgba(236, 72, 153, 0.15);
1257
+ color: #ec4899;
1258
+ border-color: rgba(236, 72, 153, 0.3);
1259
+ }
1260
+ .chat-tool-name[data-tool='Skill'] {
1261
+ background: rgba(168, 85, 247, 0.15);
1262
+ color: #a855f7;
1263
+ border-color: rgba(168, 85, 247, 0.3);
1264
+ }
1265
+
1266
+ .chat-tool-description {
1267
+ font-size: 0.8rem;
1268
+ color: var(--text-secondary, #a3a3a3);
1269
+ flex: 1;
1270
+ white-space: nowrap;
1271
+ overflow: hidden;
1272
+ text-overflow: ellipsis;
1273
+ }
1274
+
1275
+ .chat-tool-body {
1276
+ border-top: 1px solid var(--border, #2a2a2a);
1277
+ padding: var(--space-3, 0.75rem);
1278
+ font-family: var(--font-mono, monospace);
1279
+ font-size: 0.75rem;
1280
+ color: var(--text-secondary, #a3a3a3);
1281
+ max-height: 300px;
1282
+ overflow-y: auto;
1283
+ white-space: pre-wrap;
1284
+ word-break: break-all;
1285
+ }
1286
+
1287
+ .chat-tool-result {
1288
+ border-top: 1px solid var(--border, #2a2a2a);
1289
+ padding: var(--space-3, 0.75rem);
1290
+ font-family: var(--font-mono, monospace);
1291
+ font-size: 0.75rem;
1292
+ max-height: 200px;
1293
+ overflow-y: auto;
1294
+ white-space: pre-wrap;
1295
+ word-break: break-all;
1296
+ }
1297
+
1298
+ .chat-tool-result-success {
1299
+ color: #10b981;
1300
+ background: rgba(16, 185, 129, 0.05);
1301
+ }
1302
+
1303
+ .chat-tool-result-error {
1304
+ color: #ef4444;
1305
+ background: rgba(239, 68, 68, 0.05);
1306
+ }
1307
+
1308
+ /* Thinking blocks */
1309
+ .chat-thinking {
1310
+ background: rgba(168, 85, 247, 0.05);
1311
+ border: 1px dashed rgba(168, 85, 247, 0.2);
1312
+ border-radius: var(--radius-md, 8px);
1313
+ padding: var(--space-2, 0.5rem) var(--space-3, 0.75rem);
1314
+ margin: var(--space-2, 0.5rem) 0;
1315
+ max-width: 90%;
1316
+ align-self: flex-start;
1317
+ }
1318
+
1319
+ .chat-thinking-header {
1320
+ display: flex;
1321
+ align-items: center;
1322
+ gap: var(--space-2, 0.5rem);
1323
+ cursor: pointer;
1324
+ font-size: 0.75rem;
1325
+ color: #a855f7;
1326
+ font-weight: 500;
1327
+ }
1328
+
1329
+ .chat-thinking-body {
1330
+ font-size: 0.8rem;
1331
+ color: var(--text-tertiary, #737373);
1332
+ margin-top: var(--space-2, 0.5rem);
1333
+ line-height: 1.5;
1334
+ max-height: 200px;
1335
+ overflow-y: auto;
1336
+ }
1337
+
1338
+ /* Back link */
1339
+ .back-link {
1340
+ display: inline-flex;
1341
+ align-items: center;
1342
+ gap: var(--space-2, 0.5rem);
1343
+ font-size: 0.85rem;
1344
+ color: var(--text-secondary, #a3a3a3);
1345
+ text-decoration: none;
1346
+ margin-bottom: var(--space-3, 0.75rem);
1347
+ transition: color var(--transition-fast, 150ms);
1348
+ min-height: 44px;
1349
+ padding: 8px 4px;
1350
+ }
1351
+
1352
+ .back-link:hover {
1353
+ color: var(--text-primary, #fafafa);
1354
+ }
1355
+
1356
+ /* Session header for chat view */
1357
+ .chat-session-header {
1358
+ background: var(--bg-secondary, #141414);
1359
+ border: 1px solid var(--border, #2a2a2a);
1360
+ border-radius: var(--radius-lg, 12px);
1361
+ padding: var(--space-4, 1rem) var(--space-5, 1.25rem);
1362
+ margin-bottom: var(--space-4, 1rem);
1363
+ }
1364
+
1365
+ .chat-session-title {
1366
+ font-size: 1.1rem;
1367
+ font-weight: 600;
1368
+ color: var(--text-primary, #fafafa);
1369
+ margin-bottom: var(--space-1, 0.25rem);
1370
+ }
1371
+
1372
+ .chat-session-meta {
1373
+ display: flex;
1374
+ flex-wrap: wrap;
1375
+ gap: var(--space-3, 0.75rem);
1376
+ font-size: 0.8rem;
1377
+ color: var(--text-tertiary, #737373);
1378
+ }
1379
+
1380
+ .chat-session-meta-item {
1381
+ display: flex;
1382
+ align-items: center;
1383
+ gap: 4px;
1384
+ }
1385
+
1386
+ /* Chat Mobile Responsive */
1387
+ @media (max-width: 768px) {
1388
+ .chat-container {
1389
+ overflow-x: hidden;
1390
+ }
1391
+
1392
+ .chat-message {
1393
+ max-width: 95%;
1394
+ min-width: 0;
1395
+ }
1396
+
1397
+ .chat-tool-card {
1398
+ max-width: 95%;
1399
+ }
1400
+
1401
+ .chat-thinking {
1402
+ max-width: 95%;
1403
+ }
1404
+
1405
+ .chat-avatar {
1406
+ width: 24px;
1407
+ height: 24px;
1408
+ font-size: 0.65rem;
1409
+ }
1410
+
1411
+ .chat-bubble {
1412
+ padding: var(--space-2, 0.5rem) var(--space-3, 0.75rem);
1413
+ font-size: 0.85rem;
1414
+ overflow-wrap: break-word;
1415
+ word-break: break-word;
1416
+ min-width: 0;
1417
+ }
1418
+
1419
+ .chat-bubble pre {
1420
+ overflow-x: auto;
1421
+ max-width: 100%;
1422
+ }
1423
+
1424
+ .chat-bubble table {
1425
+ display: block;
1426
+ overflow-x: auto;
1427
+ max-width: 100%;
1428
+ }
1429
+
1430
+ .chat-tool-description {
1431
+ max-width: 200px;
1432
+ }
1433
+
1434
+ .chat-tool-body {
1435
+ max-width: 100%;
1436
+ overflow-x: auto;
1437
+ }
1438
+
1439
+ .chat-session-meta {
1440
+ flex-direction: column;
1441
+ gap: var(--space-1, 0.25rem);
1442
+ }
1443
+ }
1444
+
1445
+ @media (max-width: 480px) {
1446
+ .chat-message {
1447
+ max-width: 100%;
1448
+ }
1449
+
1450
+ .chat-message-user,
1451
+ .chat-message-assistant {
1452
+ align-self: stretch;
1453
+ }
1454
+
1455
+ .chat-tool-card,
1456
+ .chat-thinking {
1457
+ max-width: 100%;
1458
+ }
1459
+
1460
+ .chat-tool-description {
1461
+ max-width: 150px;
1462
+ }
1463
+ }
1464
+
1465
+ /* Skeleton loading — minimal fallback for pages not yet migrated to Shimmer */
1466
+
1467
+ .skeleton {
1468
+ background: linear-gradient(90deg, var(--bg-secondary, #1a1a2e) 25%, var(--bg-tertiary, #252540) 50%, var(--bg-secondary, #1a1a2e) 75%);
1469
+ background-size: 200% 100%;
1470
+ animation: skeleton-pulse 1.5s ease-in-out infinite;
1471
+ border-radius: var(--radius-sm, 4px);
1472
+ }
1473
+
1474
+ @keyframes skeleton-pulse {
1475
+ 0% { background-position: 200% 0; }
1476
+ 100% { background-position: -200% 0; }
1477
+ }
1478
+
1479
+ .loading-container {
1480
+ display: flex;
1481
+ flex-direction: column;
1482
+ gap: var(--space-3, 0.75rem);
1483
+ padding: var(--space-4, 1rem) 0;
1484
+ }
1485
+
1486
+ /* Source badges now provided by Pill from @juspay/svelte-ui-components */
1487
+
1488
+ /* ============================================
1489
+ Terminal Feature
1490
+ ============================================ */
1491
+
1492
+ /* Terminal Top Bar */
1493
+ .terminal-topbar {
1494
+ display: flex;
1495
+ align-items: center;
1496
+ gap: var(--space-3, 0.75rem);
1497
+ padding: var(--space-2, 0.5rem) var(--space-4, 1rem);
1498
+ background: #111827;
1499
+ border-bottom: 1px solid #1e293b;
1500
+ min-height: 48px;
1501
+ flex-shrink: 0;
1502
+ }
1503
+
1504
+ .terminal-topbar .btn {
1505
+ flex-shrink: 0;
1506
+ }
1507
+
1508
+ /* Terminal Body (xterm container) */
1509
+ .terminal-body {
1510
+ flex: 1;
1511
+ background: #0a0a0f;
1512
+ overflow: hidden;
1513
+ position: relative;
1514
+ min-height: 0;
1515
+ }
1516
+
1517
+ /* Terminal Input Bar */
1518
+ .terminal-input {
1519
+ display: flex;
1520
+ align-items: center;
1521
+ gap: var(--space-2, 0.5rem);
1522
+ padding: var(--space-2, 0.5rem) var(--space-3, 0.75rem);
1523
+ background: #111827;
1524
+ border-top: 1px solid #1e293b;
1525
+ flex-shrink: 0;
1526
+ }
1527
+
1528
+ .terminal-input input {
1529
+ flex: 1;
1530
+ height: 40px;
1531
+ padding: 0 var(--space-3, 0.75rem);
1532
+ background: #0a0a0f;
1533
+ border: 1px solid #1e293b;
1534
+ border-radius: var(--radius-md, 6px);
1535
+ color: var(--text-primary, #ededed);
1536
+ font-family: var(--font-mono);
1537
+ font-size: var(--text-sm, 13px);
1538
+ outline: none;
1539
+ transition: border-color var(--transition-fast, 150ms);
1540
+ }
1541
+
1542
+ .terminal-input input:focus {
1543
+ border-color: #334155;
1544
+ }
1545
+
1546
+ .terminal-input input::placeholder {
1547
+ color: var(--text-tertiary, #7d7d7d);
1548
+ }
1549
+
1550
+ /* Raw/Chat Toggle */
1551
+ .term-toggle {
1552
+ display: inline-flex;
1553
+ align-items: center;
1554
+ background: #1e293b;
1555
+ border-radius: var(--radius-full, 9999px);
1556
+ padding: 2px;
1557
+ flex-shrink: 0;
1558
+ }
1559
+
1560
+ .term-toggle button {
1561
+ height: 28px;
1562
+ padding: 0 var(--space-3, 0.75rem);
1563
+ border: none;
1564
+ border-radius: var(--radius-full, 9999px);
1565
+ background: transparent;
1566
+ color: var(--text-tertiary, #7d7d7d);
1567
+ font-family: var(--font-sans);
1568
+ font-size: var(--text-xs, 12px);
1569
+ font-weight: 500;
1570
+ cursor: pointer;
1571
+ transition:
1572
+ background var(--transition-fast, 150ms),
1573
+ color var(--transition-fast, 150ms);
1574
+ }
1575
+
1576
+ .term-toggle button.active {
1577
+ background: #334155;
1578
+ color: var(--text-primary, #ededed);
1579
+ }
1580
+
1581
+ .term-toggle button:hover:not(.active) {
1582
+ color: var(--text-secondary, #a1a1a1);
1583
+ }
1584
+
1585
+ /* Badge: AI */
1586
+ .badge-ai {
1587
+ display: inline-flex;
1588
+ align-items: center;
1589
+ gap: 4px;
1590
+ padding: 2px 8px;
1591
+ border-radius: var(--radius-full, 9999px);
1592
+ background: rgba(167, 139, 250, 0.15);
1593
+ color: #a78bfa;
1594
+ font-size: var(--text-xs, 12px);
1595
+ font-weight: 500;
1596
+ white-space: nowrap;
1597
+ }
1598
+
1599
+ /* Badge: Shell */
1600
+ .badge-shell {
1601
+ display: inline-flex;
1602
+ align-items: center;
1603
+ gap: 4px;
1604
+ padding: 2px 8px;
1605
+ border-radius: var(--radius-full, 9999px);
1606
+ background: rgba(34, 197, 94, 0.15);
1607
+ color: #22c55e;
1608
+ font-size: var(--text-xs, 12px);
1609
+ font-weight: 500;
1610
+ white-space: nowrap;
1611
+ }
1612
+
1613
+ /* Badge: Live (pulsing green) */
1614
+ .badge-live {
1615
+ display: inline-flex;
1616
+ align-items: center;
1617
+ gap: 6px;
1618
+ padding: 2px 8px;
1619
+ border-radius: var(--radius-full, 9999px);
1620
+ background: rgba(34, 197, 94, 0.15);
1621
+ color: #22c55e;
1622
+ font-size: var(--text-xs, 12px);
1623
+ font-weight: 500;
1624
+ white-space: nowrap;
1625
+ }
1626
+
1627
+ .badge-live::before {
1628
+ content: '';
1629
+ width: 6px;
1630
+ height: 6px;
1631
+ border-radius: 50%;
1632
+ background: #22c55e;
1633
+ animation: pulse-dot 2s ease-in-out infinite;
1634
+ }
1635
+
1636
+ /* Badge: Ended (gray) */
1637
+ .badge-ended {
1638
+ display: inline-flex;
1639
+ align-items: center;
1640
+ gap: 4px;
1641
+ padding: 2px 8px;
1642
+ border-radius: var(--radius-full, 9999px);
1643
+ background: rgba(107, 114, 128, 0.15);
1644
+ color: #9ca3af;
1645
+ font-size: var(--text-xs, 12px);
1646
+ font-weight: 500;
1647
+ white-space: nowrap;
1648
+ }
1649
+
1650
+ /* Connection Status */
1651
+ .connection-status {
1652
+ display: inline-flex;
1653
+ align-items: center;
1654
+ gap: 6px;
1655
+ font-size: var(--text-xs, 12px);
1656
+ font-weight: 500;
1657
+ white-space: nowrap;
1658
+ }
1659
+
1660
+ .connection-status-dot {
1661
+ width: 8px;
1662
+ height: 8px;
1663
+ border-radius: 50%;
1664
+ flex-shrink: 0;
1665
+ }
1666
+
1667
+ .connection-status.connected .connection-status-dot {
1668
+ background: #22c55e;
1669
+ }
1670
+
1671
+ .connection-status.reconnecting .connection-status-dot {
1672
+ background: #f59e0b;
1673
+ animation: pulse-dot 1s ease-in-out infinite;
1674
+ }
1675
+
1676
+ .connection-status.disconnected .connection-status-dot {
1677
+ background: #ef4444;
1678
+ }
1679
+
1680
+ .connection-status.connected {
1681
+ color: #22c55e;
1682
+ }
1683
+
1684
+ .connection-status.reconnecting {
1685
+ color: #f59e0b;
1686
+ }
1687
+
1688
+ .connection-status.disconnected {
1689
+ color: #ef4444;
1690
+ }
1691
+
1692
+ /* Chat Input Bar (for chat mode) */
1693
+ .chat-input-bar {
1694
+ display: flex;
1695
+ align-items: center;
1696
+ gap: var(--space-2, 0.5rem);
1697
+ padding: var(--space-3, 0.75rem) var(--space-4, 1rem);
1698
+ padding-bottom: calc(var(--space-3, 0.75rem) + env(safe-area-inset-bottom, 0px));
1699
+ background: #111827;
1700
+ border-top: 1px solid #1e293b;
1701
+ flex-shrink: 0;
1702
+ }
1703
+
1704
+ .chat-input-bar input {
1705
+ flex: 1;
1706
+ height: 44px;
1707
+ padding: 0 var(--space-4, 1rem);
1708
+ background: #0a0a0f;
1709
+ border: 1px solid #1e293b;
1710
+ border-radius: var(--radius-lg, 8px);
1711
+ color: var(--text-primary, #ededed);
1712
+ font-family: var(--font-sans);
1713
+ font-size: var(--text-base, 14px);
1714
+ outline: none;
1715
+ transition: border-color var(--transition-fast, 150ms);
1716
+ }
1717
+
1718
+ .chat-input-bar input:focus {
1719
+ border-color: #334155;
1720
+ }
1721
+
1722
+ .chat-input-bar input::placeholder {
1723
+ color: var(--text-tertiary, #7d7d7d);
1724
+ }
1725
+
1726
+ .chat-input-bar button {
1727
+ height: 44px;
1728
+ min-width: 44px;
1729
+ padding: 0 var(--space-4, 1rem);
1730
+ background: #22c55e;
1731
+ border: none;
1732
+ border-radius: var(--radius-lg, 8px);
1733
+ color: #0a0a0f;
1734
+ font-family: var(--font-sans);
1735
+ font-size: var(--text-sm, 13px);
1736
+ font-weight: 600;
1737
+ cursor: pointer;
1738
+ flex-shrink: 0;
1739
+ transition:
1740
+ background var(--transition-fast, 150ms),
1741
+ opacity var(--transition-fast, 150ms);
1742
+ }
1743
+
1744
+ .chat-input-bar button:hover {
1745
+ background: #16a34a;
1746
+ }
1747
+
1748
+ .chat-input-bar button:disabled {
1749
+ opacity: 0.4;
1750
+ cursor: not-allowed;
1751
+ }
1752
+
1753
+ /* Chat Permission Inline (Allow/Deny buttons) */
1754
+ .chat-permission-inline {
1755
+ display: flex;
1756
+ align-items: center;
1757
+ gap: var(--space-2, 0.5rem);
1758
+ padding: var(--space-3, 0.75rem) var(--space-4, 1rem);
1759
+ background: rgba(245, 158, 11, 0.08);
1760
+ border: 1px solid rgba(245, 158, 11, 0.2);
1761
+ border-radius: var(--radius-lg, 8px);
1762
+ margin: var(--space-2, 0.5rem) 0;
1763
+ }
1764
+
1765
+ .chat-permission-inline .permission-label {
1766
+ flex: 1;
1767
+ font-size: var(--text-sm, 13px);
1768
+ color: #f59e0b;
1769
+ font-weight: 500;
1770
+ }
1771
+
1772
+ .chat-permission-inline .btn-allow {
1773
+ height: 34px;
1774
+ padding: 0 var(--space-4, 1rem);
1775
+ background: #22c55e;
1776
+ border: none;
1777
+ border-radius: var(--radius-md, 6px);
1778
+ color: #0a0a0f;
1779
+ font-size: var(--text-sm, 13px);
1780
+ font-weight: 600;
1781
+ cursor: pointer;
1782
+ transition: background var(--transition-fast, 150ms);
1783
+ }
1784
+
1785
+ .chat-permission-inline .btn-allow:hover {
1786
+ background: #16a34a;
1787
+ }
1788
+
1789
+ .chat-permission-inline .btn-deny {
1790
+ height: 34px;
1791
+ padding: 0 var(--space-4, 1rem);
1792
+ background: transparent;
1793
+ border: 1px solid #ef4444;
1794
+ border-radius: var(--radius-md, 6px);
1795
+ color: #ef4444;
1796
+ font-size: var(--text-sm, 13px);
1797
+ font-weight: 600;
1798
+ cursor: pointer;
1799
+ transition:
1800
+ background var(--transition-fast, 150ms),
1801
+ color var(--transition-fast, 150ms);
1802
+ }
1803
+
1804
+ .chat-permission-inline .btn-deny:hover {
1805
+ background: rgba(239, 68, 68, 0.15);
1806
+ }
1807
+
1808
+ /* ============================================
1809
+ Terminal Mobile Responsive
1810
+ ============================================ */
1811
+
1812
+ @media (max-width: 768px) {
1813
+ .terminal-topbar {
1814
+ padding: var(--space-2, 0.5rem) var(--space-3, 0.75rem);
1815
+ gap: var(--space-2, 0.5rem);
1816
+ min-height: 44px;
1817
+ }
1818
+
1819
+ .terminal-input input {
1820
+ min-width: 0;
1821
+ }
1822
+
1823
+ .chat-input-bar input {
1824
+ min-width: 0;
1825
+ }
1826
+
1827
+ .chat-permission-inline {
1828
+ flex-wrap: wrap;
1829
+ }
1830
+
1831
+ .chat-permission-inline .permission-label {
1832
+ width: 100%;
1833
+ margin-bottom: var(--space-1, 0.25rem);
1834
+ }
1835
+ }