@juspay/shooter 1.19.0 → 1.21.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 (283) hide show
  1. package/build/client/_app/immutable/assets/11.F10lvwyh.css +1 -0
  2. package/build/client/_app/immutable/assets/11.F10lvwyh.css.br +0 -0
  3. package/build/client/_app/immutable/assets/11.F10lvwyh.css.gz +0 -0
  4. package/build/client/_app/immutable/assets/2.BHi6pjT2.css +1 -0
  5. package/build/client/_app/immutable/assets/2.BHi6pjT2.css.br +0 -0
  6. package/build/client/_app/immutable/assets/2.BHi6pjT2.css.gz +0 -0
  7. package/build/client/_app/immutable/chunks/{ZS5XYDx_.js → B1bOvemT.js} +1 -1
  8. package/build/client/_app/immutable/chunks/B1bOvemT.js.br +0 -0
  9. package/build/client/_app/immutable/chunks/{ZS5XYDx_.js.gz → B1bOvemT.js.gz} +0 -0
  10. package/build/client/_app/immutable/chunks/{DCDL_9ys.js → BmfLecb1.js} +1 -1
  11. package/build/client/_app/immutable/chunks/BmfLecb1.js.br +0 -0
  12. package/build/client/_app/immutable/chunks/BmfLecb1.js.gz +0 -0
  13. package/build/client/_app/immutable/chunks/C87ZRWX0.js +1 -0
  14. package/build/client/_app/immutable/chunks/C87ZRWX0.js.br +0 -0
  15. package/build/client/_app/immutable/chunks/C87ZRWX0.js.gz +0 -0
  16. package/build/client/_app/immutable/chunks/{BvmdJful.js → CJulw9ux.js} +1 -1
  17. package/build/client/_app/immutable/chunks/CJulw9ux.js.br +0 -0
  18. package/build/client/_app/immutable/chunks/CJulw9ux.js.gz +0 -0
  19. package/build/client/_app/immutable/chunks/DOEXXmsh.js +3 -0
  20. package/build/client/_app/immutable/chunks/DOEXXmsh.js.br +0 -0
  21. package/build/client/_app/immutable/chunks/DOEXXmsh.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/{ClIPTXf3.js → DomZZqvG.js} +1 -1
  23. package/build/client/_app/immutable/chunks/DomZZqvG.js.br +0 -0
  24. package/build/client/_app/immutable/chunks/DomZZqvG.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/{DA4Zt9Me.js → EqMAkEha.js} +1 -1
  26. package/build/client/_app/immutable/chunks/EqMAkEha.js.br +0 -0
  27. package/build/client/_app/immutable/chunks/EqMAkEha.js.gz +0 -0
  28. package/build/client/_app/immutable/chunks/J5-Cr5oR.js +6 -0
  29. package/build/client/_app/immutable/chunks/J5-Cr5oR.js.br +0 -0
  30. package/build/client/_app/immutable/chunks/J5-Cr5oR.js.gz +0 -0
  31. package/build/client/_app/immutable/chunks/{BB2l8o4X.js → i5iZvmIH.js} +1 -1
  32. package/build/client/_app/immutable/chunks/i5iZvmIH.js.br +0 -0
  33. package/build/client/_app/immutable/chunks/i5iZvmIH.js.gz +0 -0
  34. package/build/client/_app/immutable/entry/{app.D4TXlu7A.js → app.CeSxgGat.js} +2 -2
  35. package/build/client/_app/immutable/entry/app.CeSxgGat.js.br +0 -0
  36. package/build/client/_app/immutable/entry/app.CeSxgGat.js.gz +0 -0
  37. package/build/client/_app/immutable/entry/start.DrnJFwxA.js +1 -0
  38. package/build/client/_app/immutable/entry/start.DrnJFwxA.js.br +2 -0
  39. package/build/client/_app/immutable/entry/start.DrnJFwxA.js.gz +0 -0
  40. package/build/client/_app/immutable/nodes/0.oaPwxh1O.js +10 -0
  41. package/build/client/_app/immutable/nodes/0.oaPwxh1O.js.br +0 -0
  42. package/build/client/_app/immutable/nodes/0.oaPwxh1O.js.gz +0 -0
  43. package/build/client/_app/immutable/nodes/{1.BVnLUSs-.js → 1.DMPyoM-M.js} +1 -1
  44. package/build/client/_app/immutable/nodes/1.DMPyoM-M.js.br +0 -0
  45. package/build/client/_app/immutable/nodes/1.DMPyoM-M.js.gz +0 -0
  46. package/build/client/_app/immutable/nodes/{10.D1wl2wPX.js → 10.Cbm7nQKK.js} +1 -1
  47. package/build/client/_app/immutable/nodes/10.Cbm7nQKK.js.br +0 -0
  48. package/build/client/_app/immutable/nodes/10.Cbm7nQKK.js.gz +0 -0
  49. package/build/client/_app/immutable/nodes/11.CKmZjP_a.js +2 -0
  50. package/build/client/_app/immutable/nodes/11.CKmZjP_a.js.br +0 -0
  51. package/build/client/_app/immutable/nodes/11.CKmZjP_a.js.gz +0 -0
  52. package/build/client/_app/immutable/nodes/2.zlrdNFtH.js +13 -0
  53. package/build/client/_app/immutable/nodes/2.zlrdNFtH.js.br +0 -0
  54. package/build/client/_app/immutable/nodes/2.zlrdNFtH.js.gz +0 -0
  55. package/build/client/_app/immutable/nodes/{3.Wfz3TcJd.js → 3.BgLpGnzb.js} +1 -1
  56. package/build/client/_app/immutable/nodes/3.BgLpGnzb.js.br +0 -0
  57. package/build/client/_app/immutable/nodes/3.BgLpGnzb.js.gz +0 -0
  58. package/build/client/_app/immutable/nodes/{4.CBX9A3ka.js → 4.BFYS2g9C.js} +3 -3
  59. package/build/client/_app/immutable/nodes/4.BFYS2g9C.js.br +0 -0
  60. package/build/client/_app/immutable/nodes/4.BFYS2g9C.js.gz +0 -0
  61. package/build/client/_app/immutable/nodes/{5.DIVKuZc9.js → 5.Avc1-gVb.js} +1 -1
  62. package/build/client/_app/immutable/nodes/5.Avc1-gVb.js.br +0 -0
  63. package/build/client/_app/immutable/nodes/5.Avc1-gVb.js.gz +0 -0
  64. package/build/client/_app/immutable/nodes/{6.DtZAEPXb.js → 6.Dw2wEssJ.js} +1 -1
  65. package/build/client/_app/immutable/nodes/6.Dw2wEssJ.js.br +0 -0
  66. package/build/client/_app/immutable/nodes/6.Dw2wEssJ.js.gz +0 -0
  67. package/build/client/_app/immutable/nodes/{7.MfBRh32I.js → 7.DwKZjoBg.js} +1 -1
  68. package/build/client/_app/immutable/nodes/7.DwKZjoBg.js.br +0 -0
  69. package/build/client/_app/immutable/nodes/7.DwKZjoBg.js.gz +0 -0
  70. package/build/client/_app/immutable/nodes/{8.DVE6LnOC.js → 8.ZUAI6g5E.js} +1 -1
  71. package/build/client/_app/immutable/nodes/8.ZUAI6g5E.js.br +0 -0
  72. package/build/client/_app/immutable/nodes/8.ZUAI6g5E.js.gz +0 -0
  73. package/build/client/_app/immutable/nodes/{9.BCel5OqI.js → 9.I_KGXPwB.js} +1 -1
  74. package/build/client/_app/immutable/nodes/9.I_KGXPwB.js.br +0 -0
  75. package/build/client/_app/immutable/nodes/9.I_KGXPwB.js.gz +0 -0
  76. package/build/client/_app/version.json +1 -1
  77. package/build/client/_app/version.json.br +0 -0
  78. package/build/client/_app/version.json.gz +0 -0
  79. package/build/server/chunks/{0-DJqyZZTr.js → 0-vrTNAfZB.js} +4 -2
  80. package/build/server/chunks/0-vrTNAfZB.js.map +1 -0
  81. package/build/server/chunks/{1-2YUVen1F.js → 1-nbr-bOoF.js} +2 -2
  82. package/build/server/chunks/{1-2YUVen1F.js.map → 1-nbr-bOoF.js.map} +1 -1
  83. package/build/server/chunks/{10-D1X7LB3v.js → 10-ChyvvJ6w.js} +2 -2
  84. package/build/server/chunks/{10-D1X7LB3v.js.map → 10-ChyvvJ6w.js.map} +1 -1
  85. package/build/server/chunks/{11-qXSPdF5j.js → 11-6ZAjL3uU.js} +4 -4
  86. package/build/server/chunks/11-6ZAjL3uU.js.map +1 -0
  87. package/build/server/chunks/{2-BD7kj1mt.js → 2-DWFRVDWJ.js} +3 -3
  88. package/build/server/chunks/{2-BD7kj1mt.js.map → 2-DWFRVDWJ.js.map} +1 -1
  89. package/build/server/chunks/{3-oNjv-BhZ.js → 3-CKANM_WM.js} +2 -2
  90. package/build/server/chunks/{3-oNjv-BhZ.js.map → 3-CKANM_WM.js.map} +1 -1
  91. package/build/server/chunks/{4-Bb5VFhsO.js → 4-D92KnTmb.js} +3 -3
  92. package/build/server/chunks/{4-Bb5VFhsO.js.map → 4-D92KnTmb.js.map} +1 -1
  93. package/build/server/chunks/{5-oNoWuIsn.js → 5-BxVjs2qi.js} +2 -2
  94. package/build/server/chunks/{5-oNoWuIsn.js.map → 5-BxVjs2qi.js.map} +1 -1
  95. package/build/server/chunks/{6-DRJGUqHG.js → 6-Cbf1AAMQ.js} +2 -2
  96. package/build/server/chunks/{6-DRJGUqHG.js.map → 6-Cbf1AAMQ.js.map} +1 -1
  97. package/build/server/chunks/{7-_giJiu0L.js → 7-CMK2quEf.js} +2 -2
  98. package/build/server/chunks/{7-_giJiu0L.js.map → 7-CMK2quEf.js.map} +1 -1
  99. package/build/server/chunks/{8-zvWAVNT5.js → 8-DhdfkfDM.js} +2 -2
  100. package/build/server/chunks/{8-zvWAVNT5.js.map → 8-DhdfkfDM.js.map} +1 -1
  101. package/build/server/chunks/{9-DVyDL445.js → 9-CPpxtRM5.js} +2 -2
  102. package/build/server/chunks/{9-DVyDL445.js.map → 9-CPpxtRM5.js.map} +1 -1
  103. package/build/server/chunks/Banner-BgaAs1rs.js.map +1 -1
  104. package/build/server/chunks/Button-D0hZ7JYt.js.map +1 -1
  105. package/build/server/chunks/Icon-D0GBnDcs.js.map +1 -1
  106. package/build/server/chunks/Input-OmIiydSx.js.map +1 -1
  107. package/build/server/chunks/Pill-4xJ-VhAA.js.map +1 -1
  108. package/build/server/chunks/Shimmer-Dw2uvTC1.js.map +1 -1
  109. package/build/server/chunks/_error.svelte-CZnkxeLr.js.map +1 -1
  110. package/build/server/chunks/_layout.svelte-DfgNGGiM.js.map +1 -1
  111. package/build/server/chunks/_page.svelte-BTlfUsBp.js.map +1 -1
  112. package/build/server/chunks/_page.svelte-BX2FMgSg.js.map +1 -1
  113. package/build/server/chunks/_page.svelte-C7B0qdrC.js.map +1 -1
  114. package/build/server/chunks/_page.svelte-CE7COWnF.js.map +1 -1
  115. package/build/server/chunks/_page.svelte-CWsjjd4l.js.map +1 -1
  116. package/build/server/chunks/_page.svelte-D5S2hkBk.js.map +1 -1
  117. package/build/server/chunks/_page.svelte-D_Ey8QRG.js.map +1 -1
  118. package/build/server/chunks/{_page.svelte-BLo2v_8E.js → _page.svelte-Gv9p8nlS.js} +3 -4
  119. package/build/server/chunks/_page.svelte-Gv9p8nlS.js.map +1 -0
  120. package/build/server/chunks/{_page.svelte-BUBLUSGo.js → _page.svelte-dabsQl9c.js} +206 -5
  121. package/build/server/chunks/_page.svelte-dabsQl9c.js.map +1 -0
  122. package/build/server/chunks/_page.svelte-tBuIq8Pg.js.map +1 -1
  123. package/build/server/chunks/_server.ts-B-evHL2q.js +13 -0
  124. package/build/server/chunks/_server.ts-B-evHL2q.js.map +1 -0
  125. package/build/server/chunks/_server.ts-BB46Fbqn.js +59 -0
  126. package/build/server/chunks/_server.ts-BB46Fbqn.js.map +1 -0
  127. package/build/server/chunks/{_server.ts-DMm0hBP4.js → _server.ts-BWVlO8iV.js} +8 -5
  128. package/build/server/chunks/_server.ts-BWVlO8iV.js.map +1 -0
  129. package/build/server/chunks/{_server.ts-BRAzC6W1.js → _server.ts-BevnuePu.js} +27 -6
  130. package/build/server/chunks/_server.ts-BevnuePu.js.map +1 -0
  131. package/build/server/chunks/_server.ts-CA5KUENM.js +95 -0
  132. package/build/server/chunks/_server.ts-CA5KUENM.js.map +1 -0
  133. package/build/server/chunks/{_server.ts-DhJx0DLr.js → _server.ts-CC2K8-L2.js} +16 -7
  134. package/build/server/chunks/_server.ts-CC2K8-L2.js.map +1 -0
  135. package/build/server/chunks/{_server.ts-Bi0Oe4PF.js → _server.ts-CD7JP3fz.js} +14 -9
  136. package/build/server/chunks/_server.ts-CD7JP3fz.js.map +1 -0
  137. package/build/server/chunks/{_server.ts-C_OOUqsd.js → _server.ts-D0zRDSx0.js} +2 -2
  138. package/build/server/chunks/{_server.ts-C_OOUqsd.js.map → _server.ts-D0zRDSx0.js.map} +1 -1
  139. package/build/server/chunks/{_server.ts-DxT9IlZF.js → _server.ts-Dp-hXW_I.js} +3 -3
  140. package/build/server/chunks/{_server.ts-DxT9IlZF.js.map → _server.ts-Dp-hXW_I.js.map} +1 -1
  141. package/build/server/chunks/_server.ts-DpRr0Tfh.js +68 -0
  142. package/build/server/chunks/_server.ts-DpRr0Tfh.js.map +1 -0
  143. package/build/server/chunks/{_server.ts-Bjbr7glm.js → _server.ts-QN-Bo5ql.js} +12 -5
  144. package/build/server/chunks/_server.ts-QN-Bo5ql.js.map +1 -0
  145. package/build/server/chunks/_server.ts-VzDcFFgy.js +157 -0
  146. package/build/server/chunks/_server.ts-VzDcFFgy.js.map +1 -0
  147. package/build/server/chunks/{_server.ts-BrqaMMAa.js → _server.ts-W6i3EnGX.js} +29 -6
  148. package/build/server/chunks/_server.ts-W6i3EnGX.js.map +1 -0
  149. package/build/server/chunks/{_server.ts-CRVNEOd2.js → _server.ts-X1R7L_QI.js} +3 -3
  150. package/build/server/chunks/{_server.ts-CRVNEOd2.js.map → _server.ts-X1R7L_QI.js.map} +1 -1
  151. package/build/server/chunks/cache-BlMaDsHi.js.map +1 -1
  152. package/build/server/chunks/guest-registry-Dxvd7p-g.js +48 -0
  153. package/build/server/chunks/guest-registry-Dxvd7p-g.js.map +1 -0
  154. package/build/server/chunks/index-CoYB03g7.js.map +1 -1
  155. package/build/server/chunks/index2-dSGQ9Eaa.js.map +1 -1
  156. package/build/server/chunks/{pty-manager-41h3IK8K.js → pty-manager-ZqXqa-6A.js} +6 -2
  157. package/build/server/chunks/pty-manager-ZqXqa-6A.js.map +1 -0
  158. package/build/server/chunks/root-D4IoFC8F.js.map +1 -1
  159. package/build/server/chunks/share-auth-BS7JuiHf.js +27 -0
  160. package/build/server/chunks/share-auth-BS7JuiHf.js.map +1 -0
  161. package/build/server/chunks/share-store-B9jMpVg0.js +127 -0
  162. package/build/server/chunks/share-store-B9jMpVg0.js.map +1 -0
  163. package/build/server/chunks/state.svelte-CmHqngc_.js.map +1 -1
  164. package/build/server/chunks/stores-CRYxfF0o.js.map +1 -1
  165. package/build/server/index.js +1 -1
  166. package/build/server/index.js.map +1 -1
  167. package/build/server/manifest.js +57 -22
  168. package/build/server/manifest.js.map +1 -1
  169. package/package.json +2 -2
  170. package/server.ts +10 -3
  171. package/src/lib/modules/client/dashboard/AutopilotPanel.svelte +400 -0
  172. package/src/lib/modules/client/dashboard/index.ts +1 -0
  173. package/src/lib/modules/client/neurolink/provider-config.ts +13 -37
  174. package/src/lib/modules/client/terminal/ShareGate.svelte +96 -0
  175. package/src/lib/modules/client/terminal/ShareSheet.svelte +395 -0
  176. package/src/lib/modules/client/terminal/xterm-wrapper.ts +19 -2
  177. package/src/lib/modules/server/sessions/autopilot-engine.ts +346 -0
  178. package/src/lib/modules/server/sessions/litellm-client.ts +115 -0
  179. package/src/lib/modules/server/sessions/next-step-consensus.ts +185 -0
  180. package/src/lib/modules/server/sessions/summary-store.ts +111 -0
  181. package/src/lib/modules/server/terminal/pty-manager.ts +6 -0
  182. package/src/lib/modules/server/terminal/share-auth.ts +37 -0
  183. package/src/lib/modules/server/terminal/share-store.ts +172 -0
  184. package/src/lib/modules/server/ws/events-handler.ts +32 -0
  185. package/src/lib/modules/server/ws/guest-registry.ts +49 -0
  186. package/src/lib/modules/server/ws/server.ts +22 -3
  187. package/src/lib/modules/server/ws/session-handler.ts +18 -4
  188. package/src/lib/modules/server/ws/terminal-handler.ts +21 -2
  189. package/src/lib/modules/server/ws/ticket-store.ts +18 -10
  190. package/src/lib/types/autopilot.ts +73 -0
  191. package/src/lib/types/generated/Client.ts +25 -1
  192. package/src/lib/types/generated/Share.ts +404 -0
  193. package/src/lib/types/generated/WsProtocol.ts +73 -2
  194. package/src/lib/types/generated/index.ts +1 -0
  195. package/src/lib/types/index.ts +1 -0
  196. package/src/lib/types/terminal-client.ts +21 -2
  197. package/src/lib/types/ws.ts +1 -0
  198. package/src/routes/+layout.server.ts +2 -0
  199. package/src/routes/+layout.svelte +19 -4
  200. package/src/routes/+page.svelte +9 -1
  201. package/src/routes/api/autopilot/+server.ts +74 -0
  202. package/src/routes/api/neurolink-proxy/+server.ts +31 -6
  203. package/src/routes/api/notify/+server.ts +20 -3
  204. package/src/routes/api/summaries/+server.ts +99 -0
  205. package/src/routes/api/terminals/[id]/+server.ts +14 -3
  206. package/src/routes/api/terminals/[id]/paste-image/+server.ts +8 -4
  207. package/src/routes/api/terminals/[id]/resize/+server.ts +8 -4
  208. package/src/routes/api/terminals/[id]/share/+server.ts +98 -0
  209. package/src/routes/api/terminals/[id]/share/auth/+server.ts +81 -0
  210. package/src/routes/api/terminals/[id]/share/status/+server.ts +11 -0
  211. package/src/routes/api/ws-ticket/+server.ts +26 -5
  212. package/src/routes/terminals/[id]/+page.svelte +184 -43
  213. package/build/client/_app/immutable/assets/11.v5KA95xm.css +0 -1
  214. package/build/client/_app/immutable/assets/11.v5KA95xm.css.br +0 -0
  215. package/build/client/_app/immutable/assets/11.v5KA95xm.css.gz +0 -0
  216. package/build/client/_app/immutable/assets/2.DjiwkLqE.css +0 -1
  217. package/build/client/_app/immutable/assets/2.DjiwkLqE.css.br +0 -0
  218. package/build/client/_app/immutable/assets/2.DjiwkLqE.css.gz +0 -0
  219. package/build/client/_app/immutable/chunks/BB2l8o4X.js.br +0 -0
  220. package/build/client/_app/immutable/chunks/BB2l8o4X.js.gz +0 -0
  221. package/build/client/_app/immutable/chunks/BcqA7eKM.js +0 -3
  222. package/build/client/_app/immutable/chunks/BcqA7eKM.js.br +0 -0
  223. package/build/client/_app/immutable/chunks/BcqA7eKM.js.gz +0 -0
  224. package/build/client/_app/immutable/chunks/BvmdJful.js.br +0 -0
  225. package/build/client/_app/immutable/chunks/BvmdJful.js.gz +0 -0
  226. package/build/client/_app/immutable/chunks/CR6bkGJW.js +0 -6
  227. package/build/client/_app/immutable/chunks/CR6bkGJW.js.br +0 -0
  228. package/build/client/_app/immutable/chunks/CR6bkGJW.js.gz +0 -0
  229. package/build/client/_app/immutable/chunks/ClIPTXf3.js.br +0 -0
  230. package/build/client/_app/immutable/chunks/ClIPTXf3.js.gz +0 -0
  231. package/build/client/_app/immutable/chunks/DA4Zt9Me.js.br +0 -0
  232. package/build/client/_app/immutable/chunks/DA4Zt9Me.js.gz +0 -0
  233. package/build/client/_app/immutable/chunks/DCDL_9ys.js.br +0 -0
  234. package/build/client/_app/immutable/chunks/DCDL_9ys.js.gz +0 -0
  235. package/build/client/_app/immutable/chunks/ZS5XYDx_.js.br +0 -0
  236. package/build/client/_app/immutable/chunks/pRcLbE0d.js +0 -1
  237. package/build/client/_app/immutable/chunks/pRcLbE0d.js.br +0 -0
  238. package/build/client/_app/immutable/chunks/pRcLbE0d.js.gz +0 -0
  239. package/build/client/_app/immutable/entry/app.D4TXlu7A.js.br +0 -0
  240. package/build/client/_app/immutable/entry/app.D4TXlu7A.js.gz +0 -0
  241. package/build/client/_app/immutable/entry/start.BBQhtURO.js +0 -1
  242. package/build/client/_app/immutable/entry/start.BBQhtURO.js.br +0 -0
  243. package/build/client/_app/immutable/entry/start.BBQhtURO.js.gz +0 -0
  244. package/build/client/_app/immutable/nodes/0.1zylwAPT.js +0 -10
  245. package/build/client/_app/immutable/nodes/0.1zylwAPT.js.br +0 -0
  246. package/build/client/_app/immutable/nodes/0.1zylwAPT.js.gz +0 -0
  247. package/build/client/_app/immutable/nodes/1.BVnLUSs-.js.br +0 -0
  248. package/build/client/_app/immutable/nodes/1.BVnLUSs-.js.gz +0 -0
  249. package/build/client/_app/immutable/nodes/10.D1wl2wPX.js.br +0 -0
  250. package/build/client/_app/immutable/nodes/10.D1wl2wPX.js.gz +0 -0
  251. package/build/client/_app/immutable/nodes/11.C18nMGmp.js +0 -2
  252. package/build/client/_app/immutable/nodes/11.C18nMGmp.js.br +0 -0
  253. package/build/client/_app/immutable/nodes/11.C18nMGmp.js.gz +0 -0
  254. package/build/client/_app/immutable/nodes/2.D1Mm0DUX.js +0 -13
  255. package/build/client/_app/immutable/nodes/2.D1Mm0DUX.js.br +0 -0
  256. package/build/client/_app/immutable/nodes/2.D1Mm0DUX.js.gz +0 -0
  257. package/build/client/_app/immutable/nodes/3.Wfz3TcJd.js.br +0 -0
  258. package/build/client/_app/immutable/nodes/3.Wfz3TcJd.js.gz +0 -0
  259. package/build/client/_app/immutable/nodes/4.CBX9A3ka.js.br +0 -0
  260. package/build/client/_app/immutable/nodes/4.CBX9A3ka.js.gz +0 -0
  261. package/build/client/_app/immutable/nodes/5.DIVKuZc9.js.br +0 -0
  262. package/build/client/_app/immutable/nodes/5.DIVKuZc9.js.gz +0 -0
  263. package/build/client/_app/immutable/nodes/6.DtZAEPXb.js.br +0 -0
  264. package/build/client/_app/immutable/nodes/6.DtZAEPXb.js.gz +0 -0
  265. package/build/client/_app/immutable/nodes/7.MfBRh32I.js.br +0 -0
  266. package/build/client/_app/immutable/nodes/7.MfBRh32I.js.gz +0 -0
  267. package/build/client/_app/immutable/nodes/8.DVE6LnOC.js.br +0 -0
  268. package/build/client/_app/immutable/nodes/8.DVE6LnOC.js.gz +0 -0
  269. package/build/client/_app/immutable/nodes/9.BCel5OqI.js.br +0 -0
  270. package/build/client/_app/immutable/nodes/9.BCel5OqI.js.gz +0 -0
  271. package/build/server/chunks/0-DJqyZZTr.js.map +0 -1
  272. package/build/server/chunks/11-qXSPdF5j.js.map +0 -1
  273. package/build/server/chunks/_page.svelte-BLo2v_8E.js.map +0 -1
  274. package/build/server/chunks/_page.svelte-BUBLUSGo.js.map +0 -1
  275. package/build/server/chunks/_server.ts-BRAzC6W1.js.map +0 -1
  276. package/build/server/chunks/_server.ts-Bi0Oe4PF.js.map +0 -1
  277. package/build/server/chunks/_server.ts-Bjbr7glm.js.map +0 -1
  278. package/build/server/chunks/_server.ts-BrqaMMAa.js.map +0 -1
  279. package/build/server/chunks/_server.ts-DMm0hBP4.js.map +0 -1
  280. package/build/server/chunks/_server.ts-DhJx0DLr.js.map +0 -1
  281. package/build/server/chunks/events-handler-Dm1mNPQP.js +0 -20
  282. package/build/server/chunks/events-handler-Dm1mNPQP.js.map +0 -1
  283. package/build/server/chunks/pty-manager-41h3IK8K.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_server.ts-CA5KUENM.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/terminals/_id_/share/_server.ts.js"],"sourcesContent":["import { v as validateAuth } from \"../../../../../../chunks/auth.js\";\nimport { p as ptyManager } from \"../../../../../../chunks/pty-manager.js\";\nimport { s as shareStore, h as hashPassword } from \"../../../../../../chunks/share-store.js\";\nimport { c as closeGuests } from \"../../../../../../chunks/guest-registry.js\";\nimport { json } from \"@sveltejs/kit\";\nconst MIN_PASSWORD_LENGTH = 6;\nconst MODES = [\"view\", \"control\"];\nfunction toInfo(terminalId) {\n const share = shareStore.getShare(terminalId);\n if (!share) {\n return { active: false, createdAt: null, mode: null, updatedAt: null };\n }\n return { active: true, createdAt: share.createdAt, mode: share.mode, updatedAt: share.updatedAt };\n}\nconst GET = ({ params, request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n return json(toInfo(params.id));\n};\nconst PUT = async ({ params, request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n if (!ptyManager.get(params.id)) {\n return json({ error: \"Terminal not found\" }, { status: 404 });\n }\n let body;\n try {\n body = await request.json();\n } catch {\n return json({ error: \"Invalid JSON\" }, { status: 400 });\n }\n if (!MODES.includes(body.mode)) {\n return json({ error: \"mode must be 'view' or 'control'\" }, { status: 400 });\n }\n const existing = shareStore.getShare(params.id);\n const password = typeof body.password === \"string\" ? body.password : \"\";\n if (!existing && password.length < MIN_PASSWORD_LENGTH) {\n return json(\n { error: `password is required (min ${String(MIN_PASSWORD_LENGTH)} chars)` },\n { status: 400 }\n );\n }\n if (password && password.length < MIN_PASSWORD_LENGTH) {\n return json(\n { error: `password must be at least ${String(MIN_PASSWORD_LENGTH)} chars` },\n { status: 400 }\n );\n }\n const now = Date.now();\n shareStore.setShare({\n createdAt: existing?.createdAt ?? now,\n mode: body.mode,\n // `existing` is guaranteed non-null when password is empty (validated above).\n passwordHash: password ? hashPassword(password) : existing?.passwordHash ?? \"\",\n terminalId: params.id,\n updatedAt: now\n });\n if (password) {\n shareStore.deleteSessions(params.id);\n }\n if (password || existing?.mode !== body.mode) {\n closeGuests(params.id);\n }\n return json(toInfo(params.id));\n};\nconst DELETE = ({ params, request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n shareStore.deleteShare(params.id);\n const closed = closeGuests(params.id);\n return json({ closedConnections: closed, success: true });\n};\nexport {\n DELETE,\n GET,\n PUT\n};\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,9 @@
1
1
  import { v as validateAuth } from './auth-DuunT7Cg.js';
2
- import { p as ptyManager } from './pty-manager-41h3IK8K.js';
2
+ import { p as ptyManager } from './pty-manager-ZqXqa-6A.js';
3
+ import { r as resolveAccess } from './share-auth-BS7JuiHf.js';
4
+ import { s as shareStore } from './share-store-B9jMpVg0.js';
3
5
  import { t as toErrorMessage } from './error-DDXB3duW.js';
6
+ import { c as closeGuests } from './guest-registry-Dxvd7p-g.js';
4
7
  import { j as json } from './index-CoD1IJuy.js';
5
8
  import './shared-server-DaWdgxVh.js';
6
9
  import 'crypto';
@@ -10,7 +13,6 @@ import 'path';
10
13
  import 'url';
11
14
  import './qwen-reader-DGfUbKaJ.js';
12
15
  import 'os';
13
- import './events-handler-Dm1mNPQP.js';
14
16
  import './super-session-handler-DPyxFgmz.js';
15
17
  import './registry-D4J_CuzW.js';
16
18
  import 'better-sqlite3';
@@ -31,9 +33,9 @@ function lastScrollbackLine(scrollback) {
31
33
  return null;
32
34
  }
33
35
  const GET = ({ params, request }) => {
34
- const authError = validateAuth(request);
35
- if (authError) {
36
- return authError;
36
+ const access = resolveAccess(request, params.id);
37
+ if (!access) {
38
+ return json({ error: "Unauthorized" }, { status: 401 });
37
39
  }
38
40
  try {
39
41
  const terminal = ptyManager.get(params.id);
@@ -43,6 +45,7 @@ const GET = ({ params, request }) => {
43
45
  return json({
44
46
  args: terminal.args,
45
47
  clientCount: terminal.clients.size,
48
+ cols: terminal.cols,
46
49
  command: terminal.command,
47
50
  createdAt: terminal.createdAt.toISOString(),
48
51
  cwd: terminal.cwd,
@@ -51,10 +54,12 @@ const GET = ({ params, request }) => {
51
54
  id: terminal.id,
52
55
  lastOutput: lastScrollbackLine(terminal.scrollback),
53
56
  pid: terminal.pid,
57
+ rows: terminal.rows,
54
58
  sessionWs: `/ws/session/${terminal.id}`,
55
59
  status: terminal.status,
56
60
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
57
- ws: `/ws/terminal/${terminal.id}`
61
+ ws: `/ws/terminal/${terminal.id}`,
62
+ ...access.level === "guest" ? { shareMode: access.mode } : {}
58
63
  });
59
64
  } catch (error) {
60
65
  console.error("[terminals] Failed to get terminal:", toErrorMessage(error));
@@ -73,6 +78,8 @@ const DELETE = ({ params, request }) => {
73
78
  }
74
79
  if (terminal.status === "exited") {
75
80
  ptyManager.remove(params.id);
81
+ shareStore.deleteShare(params.id);
82
+ closeGuests(params.id);
76
83
  console.log(`[terminals] Removed exited terminal ${params.id}`);
77
84
  return json({
78
85
  removed: true,
@@ -81,6 +88,8 @@ const DELETE = ({ params, request }) => {
81
88
  });
82
89
  }
83
90
  ptyManager.kill(params.id);
91
+ shareStore.deleteShare(params.id);
92
+ closeGuests(params.id);
84
93
  console.log(`[terminals] Killed terminal ${params.id} (pid=${terminal.pid})`);
85
94
  return json({
86
95
  success: true,
@@ -93,4 +102,4 @@ const DELETE = ({ params, request }) => {
93
102
  };
94
103
 
95
104
  export { DELETE, GET };
96
- //# sourceMappingURL=_server.ts-DhJx0DLr.js.map
105
+ //# sourceMappingURL=_server.ts-CC2K8-L2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_server.ts-CC2K8-L2.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/terminals/_id_/_server.ts.js"],"sourcesContent":["import { v as validateAuth } from \"../../../../../chunks/auth.js\";\nimport { p as ptyManager } from \"../../../../../chunks/pty-manager.js\";\nimport { r as resolveAccess } from \"../../../../../chunks/share-auth.js\";\nimport { s as shareStore } from \"../../../../../chunks/share-store.js\";\nimport { t as toErrorMessage } from \"../../../../../chunks/error.js\";\nimport { c as closeGuests } from \"../../../../../chunks/guest-registry.js\";\nimport { json } from \"@sveltejs/kit\";\nfunction lastScrollbackLine(scrollback) {\n if (!scrollback) {\n return null;\n }\n const lines = scrollback.trimEnd().split(\"\\n\");\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i].trim();\n if (line) {\n return line.slice(0, 200);\n }\n }\n return null;\n}\nconst GET = ({ params, request }) => {\n const access = resolveAccess(request, params.id);\n if (!access) {\n return json({ error: \"Unauthorized\" }, { status: 401 });\n }\n try {\n const terminal = ptyManager.get(params.id);\n if (!terminal) {\n return json({ error: \"Terminal not found\" }, { status: 404 });\n }\n return json({\n args: terminal.args,\n clientCount: terminal.clients.size,\n cols: terminal.cols,\n command: terminal.command,\n createdAt: terminal.createdAt.toISOString(),\n cwd: terminal.cwd,\n exitCode: terminal.exitCode,\n exitedAt: terminal.exitedAt?.toISOString() ?? null,\n id: terminal.id,\n lastOutput: lastScrollbackLine(terminal.scrollback),\n pid: terminal.pid,\n rows: terminal.rows,\n sessionWs: `/ws/session/${terminal.id}`,\n status: terminal.status,\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n ws: `/ws/terminal/${terminal.id}`,\n ...access.level === \"guest\" ? { shareMode: access.mode } : {}\n });\n } catch (error) {\n console.error(\"[terminals] Failed to get terminal:\", toErrorMessage(error));\n return json({ error: \"Failed to get terminal\" }, { status: 500 });\n }\n};\nconst DELETE = ({ params, request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n try {\n const terminal = ptyManager.get(params.id);\n if (!terminal) {\n return json({ error: \"Terminal not found\" }, { status: 404 });\n }\n if (terminal.status === \"exited\") {\n ptyManager.remove(params.id);\n shareStore.deleteShare(params.id);\n closeGuests(params.id);\n console.log(`[terminals] Removed exited terminal ${params.id}`);\n return json({\n removed: true,\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n }\n ptyManager.kill(params.id);\n shareStore.deleteShare(params.id);\n closeGuests(params.id);\n console.log(`[terminals] Killed terminal ${params.id} (pid=${terminal.pid})`);\n return json({\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n } catch (error) {\n console.error(\"[terminals] Failed to kill terminal:\", toErrorMessage(error));\n return json({ error: \"Failed to kill terminal\" }, { status: 500 });\n }\n};\nexport {\n DELETE,\n GET\n};\n"],"names":[],"mappings":"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"}
@@ -1,26 +1,31 @@
1
- import { v as validateAuth } from './auth-DuunT7Cg.js';
2
- import { p as ptyManager } from './pty-manager-41h3IK8K.js';
1
+ import { p as ptyManager } from './pty-manager-ZqXqa-6A.js';
2
+ import { r as resolveAccess } from './share-auth-BS7JuiHf.js';
3
3
  import { t as toErrorMessage } from './error-DDXB3duW.js';
4
4
  import { j as json } from './index-CoD1IJuy.js';
5
- import './shared-server-DaWdgxVh.js';
6
- import 'crypto';
7
5
  import 'child_process';
6
+ import 'crypto';
8
7
  import 'fs';
9
8
  import 'path';
10
9
  import 'url';
11
10
  import './qwen-reader-DGfUbKaJ.js';
12
11
  import 'os';
13
- import './events-handler-Dm1mNPQP.js';
12
+ import './guest-registry-Dxvd7p-g.js';
14
13
  import './super-session-handler-DPyxFgmz.js';
15
14
  import './registry-D4J_CuzW.js';
16
15
  import 'better-sqlite3';
17
16
  import './coordinator-DMU_ADXf.js';
18
17
  import 'net';
18
+ import './auth-DuunT7Cg.js';
19
+ import './shared-server-DaWdgxVh.js';
20
+ import './share-store-B9jMpVg0.js';
19
21
 
20
22
  const POST = async ({ params, request }) => {
21
- const authError = validateAuth(request);
22
- if (authError) {
23
- return authError;
23
+ const access = resolveAccess(request, params.id);
24
+ if (!access) {
25
+ return json({ error: "Unauthorized" }, { status: 401 });
26
+ }
27
+ if (access.level === "guest" && access.mode !== "control") {
28
+ return json({ error: "View-only access" }, { status: 403 });
24
29
  }
25
30
  let body;
26
31
  try {
@@ -62,4 +67,4 @@ const POST = async ({ params, request }) => {
62
67
  };
63
68
 
64
69
  export { POST };
65
- //# sourceMappingURL=_server.ts-Bi0Oe4PF.js.map
70
+ //# sourceMappingURL=_server.ts-CD7JP3fz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_server.ts-CD7JP3fz.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/terminals/_id_/resize/_server.ts.js"],"sourcesContent":["import { p as ptyManager } from \"../../../../../../chunks/pty-manager.js\";\nimport { r as resolveAccess } from \"../../../../../../chunks/share-auth.js\";\nimport { t as toErrorMessage } from \"../../../../../../chunks/error.js\";\nimport { json } from \"@sveltejs/kit\";\nconst POST = async ({ params, request }) => {\n const access = resolveAccess(request, params.id);\n if (!access) {\n return json({ error: \"Unauthorized\" }, { status: 401 });\n }\n if (access.level === \"guest\" && access.mode !== \"control\") {\n return json({ error: \"View-only access\" }, { status: 403 });\n }\n let body;\n try {\n body = await request.json();\n } catch {\n return json({ error: \"Invalid JSON in request body\" }, { status: 400 });\n }\n try {\n const { cols, rows } = body;\n if (cols === void 0 || rows === void 0) {\n return json({ error: \"cols and rows are required\" }, { status: 400 });\n }\n if (typeof cols !== \"number\" || cols < 1) {\n return json({ error: \"cols must be a positive number\" }, { status: 400 });\n }\n if (typeof rows !== \"number\" || rows < 1) {\n return json({ error: \"rows must be a positive number\" }, { status: 400 });\n }\n if (cols > 500 || rows > 200) {\n return json({ error: \"cols must be <= 500 and rows must be <= 200\" }, { status: 400 });\n }\n const terminal = ptyManager.get(params.id);\n if (!terminal) {\n return json({ error: \"Terminal not found\" }, { status: 404 });\n }\n if (terminal.status === \"exited\") {\n return json({ error: \"Terminal already exited\" }, { status: 409 });\n }\n ptyManager.resize(params.id, cols, rows);\n console.log(`[terminals] Resized terminal ${params.id} to ${cols}x${rows}`);\n return json({\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n } catch (error) {\n console.error(\"[terminals] Failed to resize terminal:\", toErrorMessage(error));\n return json({ error: \"Failed to resize terminal\" }, { status: 500 });\n }\n};\nexport {\n POST\n};\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { v as validateAuth } from './auth-DuunT7Cg.js';
2
- import { g as getEventsClientCount } from './events-handler-Dm1mNPQP.js';
2
+ import { g as getEventsClientCount } from './guest-registry-Dxvd7p-g.js';
3
3
  import './super-session-handler-DPyxFgmz.js';
4
4
  import { j as json } from './index-CoD1IJuy.js';
5
5
  import './shared-server-DaWdgxVh.js';
@@ -26,4 +26,4 @@ const GET = ({ request }) => {
26
26
  };
27
27
 
28
28
  export { GET };
29
- //# sourceMappingURL=_server.ts-C_OOUqsd.js.map
29
+ //# sourceMappingURL=_server.ts-D0zRDSx0.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_server.ts-C_OOUqsd.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/ws-status/_server.ts.js"],"sourcesContent":["import { v as validateAuth } from \"../../../../chunks/auth.js\";\nimport { g as getEventsClientCount } from \"../../../../chunks/events-handler.js\";\nimport \"../../../../chunks/super-session-handler.js\";\nimport { json } from \"@sveltejs/kit\";\nfunction getConnectedClientCount() {\n return getEventsClientCount();\n}\nconst GET = ({ request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n return json({\n connectedClients: getConnectedClientCount()\n });\n};\nexport {\n GET\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAIA,SAAS,uBAAuB,GAAG;AACnC,EAAE,OAAO,oBAAoB,EAAE;AAC/B;AACK,MAAC,GAAG,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK;AAC7B,EAAE,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;AACzC,EAAE,IAAI,SAAS,EAAE;AACjB,IAAI,OAAO,SAAS;AACpB,EAAE;AACF,EAAE,OAAO,IAAI,CAAC;AACd,IAAI,gBAAgB,EAAE,uBAAuB;AAC7C,GAAG,CAAC;AACJ;;;;"}
1
+ {"version":3,"file":"_server.ts-D0zRDSx0.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/ws-status/_server.ts.js"],"sourcesContent":["import { v as validateAuth } from \"../../../../chunks/auth.js\";\nimport { g as getEventsClientCount } from \"../../../../chunks/guest-registry.js\";\nimport \"../../../../chunks/super-session-handler.js\";\nimport { json } from \"@sveltejs/kit\";\nfunction getConnectedClientCount() {\n return getEventsClientCount();\n}\nconst GET = ({ request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n return json({\n connectedClients: getConnectedClientCount()\n });\n};\nexport {\n GET\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAIA,SAAS,uBAAuB,GAAG;AACnC,EAAE,OAAO,oBAAoB,EAAE;AAC/B;AACK,MAAC,GAAG,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK;AAC7B,EAAE,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;AACzC,EAAE,IAAI,SAAS,EAAE;AACjB,IAAI,OAAO,SAAS;AACpB,EAAE;AACF,EAAE,OAAO,IAAI,CAAC;AACd,IAAI,gBAAgB,EAAE,uBAAuB;AAC7C,GAAG,CAAC;AACJ;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { v as validateAuth } from './auth-DuunT7Cg.js';
2
2
  import { P as PROVIDER_COMMANDS } from './registry-D4J_CuzW.js';
3
- import { p as ptyManager } from './pty-manager-41h3IK8K.js';
3
+ import { p as ptyManager } from './pty-manager-ZqXqa-6A.js';
4
4
  import { t as toErrorMessage } from './error-DDXB3duW.js';
5
5
  import { j as json } from './index-CoD1IJuy.js';
6
6
  import { realpathSync, statSync } from 'fs';
@@ -12,7 +12,7 @@ import 'os';
12
12
  import 'better-sqlite3';
13
13
  import 'child_process';
14
14
  import 'url';
15
- import './events-handler-Dm1mNPQP.js';
15
+ import './guest-registry-Dxvd7p-g.js';
16
16
  import './super-session-handler-DPyxFgmz.js';
17
17
  import './coordinator-DMU_ADXf.js';
18
18
  import 'net';
@@ -138,4 +138,4 @@ const POST = async ({ request }) => {
138
138
  };
139
139
 
140
140
  export { GET, POST };
141
- //# sourceMappingURL=_server.ts-DxT9IlZF.js.map
141
+ //# sourceMappingURL=_server.ts-Dp-hXW_I.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_server.ts-DxT9IlZF.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/terminals/_server.ts.js"],"sourcesContent":["import { v as validateAuth } from \"../../../../chunks/auth.js\";\nimport { P as PROVIDER_COMMANDS } from \"../../../../chunks/registry.js\";\nimport { p as ptyManager } from \"../../../../chunks/pty-manager.js\";\nimport { t as toErrorMessage } from \"../../../../chunks/error.js\";\nimport { json } from \"@sveltejs/kit\";\nimport { realpathSync, statSync } from \"fs\";\nimport { relative, isAbsolute } from \"path\";\nconst ALLOWED_COMMANDS = [\"zsh\", \"bash\", \"sh\", \"fish\", ...PROVIDER_COMMANDS];\nfunction lastScrollbackLine(scrollback) {\n if (!scrollback) {\n return null;\n }\n const lines = scrollback.trimEnd().split(\"\\n\");\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i].trim();\n if (line) {\n return line.slice(0, 200);\n }\n }\n return null;\n}\nconst GET = ({ request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n try {\n const terminals = ptyManager.list().map((t) => ({\n args: t.args,\n clientCount: t.clients.size,\n command: t.command,\n createdAt: t.createdAt.toISOString(),\n currentCwd: t.currentCwd,\n cwd: t.cwd,\n exitCode: t.exitCode,\n exitedAt: t.exitedAt?.toISOString() ?? null,\n id: t.id,\n isActive: t.isActive,\n lastOutput: lastScrollbackLine(t.scrollback),\n pid: t.pid,\n status: t.status\n }));\n return json({\n count: terminals.length,\n terminals,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n } catch (error) {\n console.error(\"[terminals] Failed to list terminals:\", toErrorMessage(error));\n return json({ error: \"Failed to list terminals\" }, { status: 500 });\n }\n};\nconst POST = async ({ request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n let body;\n try {\n body = await request.json();\n } catch {\n return json({ error: \"Invalid JSON in request body\" }, { status: 400 });\n }\n try {\n const { args, cols, command, cwd, rows } = body;\n if (!command) {\n return json({ error: \"command is required\" }, { status: 400 });\n }\n if (command.includes(\"/\") || command.includes(\"\\\\\") || !ALLOWED_COMMANDS.includes(command)) {\n return json(\n { error: `Command not allowed. Allowed: ${ALLOWED_COMMANDS.join(\", \")}` },\n { status: 400 }\n );\n }\n if (!cwd) {\n return json({ error: \"cwd is required\" }, { status: 400 });\n }\n let realCwd;\n try {\n realCwd = realpathSync(cwd);\n if (!statSync(realCwd).isDirectory()) {\n return json({ error: \"cwd must be a directory\" }, { status: 400 });\n }\n } catch {\n return json({ error: \"cwd must be a directory\" }, { status: 400 });\n }\n const home = process.env.HOME || \"\";\n if (home) {\n const rel = relative(home, realCwd);\n if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n return json({ error: \"Working directory must be under home directory\" }, { status: 400 });\n }\n }\n if (args !== void 0 && !Array.isArray(args)) {\n return json({ error: \"args must be an array of strings\" }, { status: 400 });\n }\n if (args && !args.every((a) => typeof a === \"string\")) {\n return json({ error: \"All args must be strings\" }, { status: 400 });\n }\n if (cols !== void 0 && (typeof cols !== \"number\" || cols < 1)) {\n return json({ error: \"cols must be a positive number\" }, { status: 400 });\n }\n if (rows !== void 0 && (typeof rows !== \"number\" || rows < 1)) {\n return json({ error: \"rows must be a positive number\" }, { status: 400 });\n }\n const terminal = await ptyManager.create(command, args ?? [], realCwd, cols ?? 80, rows ?? 24);\n console.log(\n `[terminals] Created terminal ${terminal.id} (pid=${terminal.pid}, command=${command})`\n );\n return json(\n {\n command: terminal.command,\n createdAt: terminal.createdAt instanceof Date ? terminal.createdAt.toISOString() : terminal.createdAt,\n cwd: terminal.cwd,\n id: terminal.id,\n pid: terminal.pid,\n sessionWs: `/ws/session/${terminal.id}`,\n ws: `/ws/terminal/${terminal.id}`\n },\n { status: 201 }\n );\n } catch (error) {\n console.error(\"[terminals] Failed to create terminal:\", toErrorMessage(error));\n return json({ error: \"Failed to create terminal\" }, { status: 500 });\n }\n};\nexport {\n GET,\n POST\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"_server.ts-Dp-hXW_I.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/terminals/_server.ts.js"],"sourcesContent":["import { v as validateAuth } from \"../../../../chunks/auth.js\";\nimport { P as PROVIDER_COMMANDS } from \"../../../../chunks/registry.js\";\nimport { p as ptyManager } from \"../../../../chunks/pty-manager.js\";\nimport { t as toErrorMessage } from \"../../../../chunks/error.js\";\nimport { json } from \"@sveltejs/kit\";\nimport { realpathSync, statSync } from \"fs\";\nimport { relative, isAbsolute } from \"path\";\nconst ALLOWED_COMMANDS = [\"zsh\", \"bash\", \"sh\", \"fish\", ...PROVIDER_COMMANDS];\nfunction lastScrollbackLine(scrollback) {\n if (!scrollback) {\n return null;\n }\n const lines = scrollback.trimEnd().split(\"\\n\");\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i].trim();\n if (line) {\n return line.slice(0, 200);\n }\n }\n return null;\n}\nconst GET = ({ request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n try {\n const terminals = ptyManager.list().map((t) => ({\n args: t.args,\n clientCount: t.clients.size,\n command: t.command,\n createdAt: t.createdAt.toISOString(),\n currentCwd: t.currentCwd,\n cwd: t.cwd,\n exitCode: t.exitCode,\n exitedAt: t.exitedAt?.toISOString() ?? null,\n id: t.id,\n isActive: t.isActive,\n lastOutput: lastScrollbackLine(t.scrollback),\n pid: t.pid,\n status: t.status\n }));\n return json({\n count: terminals.length,\n terminals,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n } catch (error) {\n console.error(\"[terminals] Failed to list terminals:\", toErrorMessage(error));\n return json({ error: \"Failed to list terminals\" }, { status: 500 });\n }\n};\nconst POST = async ({ request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n let body;\n try {\n body = await request.json();\n } catch {\n return json({ error: \"Invalid JSON in request body\" }, { status: 400 });\n }\n try {\n const { args, cols, command, cwd, rows } = body;\n if (!command) {\n return json({ error: \"command is required\" }, { status: 400 });\n }\n if (command.includes(\"/\") || command.includes(\"\\\\\") || !ALLOWED_COMMANDS.includes(command)) {\n return json(\n { error: `Command not allowed. Allowed: ${ALLOWED_COMMANDS.join(\", \")}` },\n { status: 400 }\n );\n }\n if (!cwd) {\n return json({ error: \"cwd is required\" }, { status: 400 });\n }\n let realCwd;\n try {\n realCwd = realpathSync(cwd);\n if (!statSync(realCwd).isDirectory()) {\n return json({ error: \"cwd must be a directory\" }, { status: 400 });\n }\n } catch {\n return json({ error: \"cwd must be a directory\" }, { status: 400 });\n }\n const home = process.env.HOME || \"\";\n if (home) {\n const rel = relative(home, realCwd);\n if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n return json({ error: \"Working directory must be under home directory\" }, { status: 400 });\n }\n }\n if (args !== void 0 && !Array.isArray(args)) {\n return json({ error: \"args must be an array of strings\" }, { status: 400 });\n }\n if (args && !args.every((a) => typeof a === \"string\")) {\n return json({ error: \"All args must be strings\" }, { status: 400 });\n }\n if (cols !== void 0 && (typeof cols !== \"number\" || cols < 1)) {\n return json({ error: \"cols must be a positive number\" }, { status: 400 });\n }\n if (rows !== void 0 && (typeof rows !== \"number\" || rows < 1)) {\n return json({ error: \"rows must be a positive number\" }, { status: 400 });\n }\n const terminal = await ptyManager.create(command, args ?? [], realCwd, cols ?? 80, rows ?? 24);\n console.log(\n `[terminals] Created terminal ${terminal.id} (pid=${terminal.pid}, command=${command})`\n );\n return json(\n {\n command: terminal.command,\n createdAt: terminal.createdAt instanceof Date ? terminal.createdAt.toISOString() : terminal.createdAt,\n cwd: terminal.cwd,\n id: terminal.id,\n pid: terminal.pid,\n sessionWs: `/ws/session/${terminal.id}`,\n ws: `/ws/terminal/${terminal.id}`\n },\n { status: 201 }\n );\n } catch (error) {\n console.error(\"[terminals] Failed to create terminal:\", toErrorMessage(error));\n return json({ error: \"Failed to create terminal\" }, { status: 500 });\n }\n};\nexport {\n GET,\n POST\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import { s as shareStore, v as verifyPassword } from './share-store-B9jMpVg0.js';
2
+ import { j as json } from './index-CoD1IJuy.js';
3
+ import 'better-sqlite3';
4
+ import 'crypto';
5
+ import 'fs';
6
+ import 'path';
7
+
8
+ const RATE_LIMIT_WINDOW_MS = 6e4;
9
+ const RATE_LIMIT_MAX = 10;
10
+ const attempts = /* @__PURE__ */ new Map();
11
+ function checkRateLimit(key) {
12
+ const now = Date.now();
13
+ const recent = (attempts.get(key) ?? []).filter((t) => t > now - RATE_LIMIT_WINDOW_MS);
14
+ attempts.set(key, recent);
15
+ if (recent.length >= RATE_LIMIT_MAX) {
16
+ return false;
17
+ }
18
+ recent.push(now);
19
+ return true;
20
+ }
21
+ setInterval(() => {
22
+ const cutoff = Date.now() - RATE_LIMIT_WINDOW_MS;
23
+ for (const [key, timestamps] of attempts) {
24
+ const recent = timestamps.filter((t) => t > cutoff);
25
+ if (recent.length === 0) {
26
+ attempts.delete(key);
27
+ } else {
28
+ attempts.set(key, recent);
29
+ }
30
+ }
31
+ }, 3e5).unref();
32
+ const POST = async (event) => {
33
+ const { params, request } = event;
34
+ const share = shareStore.getShare(params.id);
35
+ if (!share) {
36
+ return json({ error: "Not shared" }, { status: 404 });
37
+ }
38
+ let ip = "unknown";
39
+ const cfIp = request.headers.get("cf-connecting-ip");
40
+ const fwd = request.headers.get("x-forwarded-for");
41
+ if (cfIp) {
42
+ ip = cfIp;
43
+ } else if (fwd) {
44
+ ip = fwd.split(",")[0].trim();
45
+ } else {
46
+ try {
47
+ ip = event.getClientAddress();
48
+ } catch {
49
+ }
50
+ }
51
+ if (!checkRateLimit(`${ip}:${params.id}`)) {
52
+ return json({ error: "Too many attempts. Try again in a minute." }, { status: 429 });
53
+ }
54
+ let body;
55
+ try {
56
+ body = await request.json();
57
+ } catch {
58
+ return json({ error: "Invalid JSON" }, { status: 400 });
59
+ }
60
+ if (typeof body.password !== "string" || !verifyPassword(body.password, share.passwordHash)) {
61
+ return json({ error: "Invalid password" }, { status: 401 });
62
+ }
63
+ const { expiresAt, token } = shareStore.createSession(params.id);
64
+ return json({ expiresAt, mode: share.mode, token });
65
+ };
66
+
67
+ export { POST };
68
+ //# sourceMappingURL=_server.ts-DpRr0Tfh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_server.ts-DpRr0Tfh.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/terminals/_id_/share/auth/_server.ts.js"],"sourcesContent":["import { s as shareStore, v as verifyPassword } from \"../../../../../../../chunks/share-store.js\";\nimport { json } from \"@sveltejs/kit\";\nconst RATE_LIMIT_WINDOW_MS = 6e4;\nconst RATE_LIMIT_MAX = 10;\nconst attempts = /* @__PURE__ */ new Map();\nfunction checkRateLimit(key) {\n const now = Date.now();\n const recent = (attempts.get(key) ?? []).filter((t) => t > now - RATE_LIMIT_WINDOW_MS);\n attempts.set(key, recent);\n if (recent.length >= RATE_LIMIT_MAX) {\n return false;\n }\n recent.push(now);\n return true;\n}\nsetInterval(() => {\n const cutoff = Date.now() - RATE_LIMIT_WINDOW_MS;\n for (const [key, timestamps] of attempts) {\n const recent = timestamps.filter((t) => t > cutoff);\n if (recent.length === 0) {\n attempts.delete(key);\n } else {\n attempts.set(key, recent);\n }\n }\n}, 3e5).unref();\nconst POST = async (event) => {\n const { params, request } = event;\n const share = shareStore.getShare(params.id);\n if (!share) {\n return json({ error: \"Not shared\" }, { status: 404 });\n }\n let ip = \"unknown\";\n const cfIp = request.headers.get(\"cf-connecting-ip\");\n const fwd = request.headers.get(\"x-forwarded-for\");\n if (cfIp) {\n ip = cfIp;\n } else if (fwd) {\n ip = fwd.split(\",\")[0].trim();\n } else {\n try {\n ip = event.getClientAddress();\n } catch {\n }\n }\n if (!checkRateLimit(`${ip}:${params.id}`)) {\n return json({ error: \"Too many attempts. Try again in a minute.\" }, { status: 429 });\n }\n let body;\n try {\n body = await request.json();\n } catch {\n return json({ error: \"Invalid JSON\" }, { status: 400 });\n }\n if (typeof body.password !== \"string\" || !verifyPassword(body.password, share.passwordHash)) {\n return json({ error: \"Invalid password\" }, { status: 401 });\n }\n const { expiresAt, token } = shareStore.createSession(params.id);\n return json({ expiresAt, mode: share.mode, token });\n};\nexport {\n POST\n};\n"],"names":[],"mappings":"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"}
@@ -1,14 +1,21 @@
1
- import { v as validateAuth } from './auth-DuunT7Cg.js';
1
+ import { r as resolveAccess } from './share-auth-BS7JuiHf.js';
2
2
  import { t as toErrorMessage } from './error-DDXB3duW.js';
3
3
  import { j as json } from './index-CoD1IJuy.js';
4
4
  import { mkdirSync, writeFileSync } from 'fs';
5
+ import './auth-DuunT7Cg.js';
5
6
  import './shared-server-DaWdgxVh.js';
6
7
  import 'crypto';
8
+ import './share-store-B9jMpVg0.js';
9
+ import 'better-sqlite3';
10
+ import 'path';
7
11
 
8
12
  const POST = async ({ params, request }) => {
9
- const authError = validateAuth(request);
10
- if (authError) {
11
- return authError;
13
+ const access = resolveAccess(request, params.id);
14
+ if (!access) {
15
+ return json({ error: "Unauthorized" }, { status: 401 });
16
+ }
17
+ if (access.level === "guest" && access.mode !== "control") {
18
+ return json({ error: "View-only access" }, { status: 403 });
12
19
  }
13
20
  const terminalId = params.id;
14
21
  if (!/^[A-Za-z0-9_-]+$/.test(terminalId)) {
@@ -47,4 +54,4 @@ const POST = async ({ params, request }) => {
47
54
  };
48
55
 
49
56
  export { POST };
50
- //# sourceMappingURL=_server.ts-Bjbr7glm.js.map
57
+ //# sourceMappingURL=_server.ts-QN-Bo5ql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_server.ts-QN-Bo5ql.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/terminals/_id_/paste-image/_server.ts.js"],"sourcesContent":["import { r as resolveAccess } from \"../../../../../../chunks/share-auth.js\";\nimport { t as toErrorMessage } from \"../../../../../../chunks/error.js\";\nimport { json } from \"@sveltejs/kit\";\nimport { mkdirSync, writeFileSync } from \"fs\";\nconst POST = async ({ params, request }) => {\n const access = resolveAccess(request, params.id);\n if (!access) {\n return json({ error: \"Unauthorized\" }, { status: 401 });\n }\n if (access.level === \"guest\" && access.mode !== \"control\") {\n return json({ error: \"View-only access\" }, { status: 403 });\n }\n const terminalId = params.id;\n if (!/^[A-Za-z0-9_-]+$/.test(terminalId)) {\n return json({ error: \"Invalid terminal ID\" }, { status: 400 });\n }\n let body;\n try {\n body = await request.json();\n } catch {\n return json({ error: \"Invalid JSON\" }, { status: 400 });\n }\n if (!body.image || typeof body.image !== \"string\") {\n return json({ error: \"image (base64) is required\" }, { status: 400 });\n }\n let imageBuffer;\n try {\n const base64Data = body.image.replace(/^data:image\\/\\w+;base64,/, \"\");\n const decoded = Buffer.from(base64Data, \"base64\");\n if (decoded.length === 0 || decoded.toString(\"base64\") !== base64Data) {\n return json({ error: \"Invalid base64 image data\" }, { status: 400 });\n }\n imageBuffer = decoded;\n } catch {\n return json({ error: \"Invalid base64 image data\" }, { status: 400 });\n }\n const clipboardDir = `/tmp/shooter-clipboard-${terminalId}`;\n const imagePath = `${clipboardDir}/image.png`;\n try {\n mkdirSync(clipboardDir, { recursive: true });\n writeFileSync(imagePath, imageBuffer);\n } catch (err) {\n console.error(\"[paste-image] Failed to write image:\", toErrorMessage(err));\n return json({ error: \"Failed to write image\" }, { status: 500 });\n }\n return json({ size: imageBuffer.length, success: true });\n};\nexport {\n POST\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ import { v as validateAuth } from './auth-DuunT7Cg.js';
2
+ import Database from 'better-sqlite3';
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+ import { j as json } from './index-CoD1IJuy.js';
6
+ import './shared-server-DaWdgxVh.js';
7
+ import 'crypto';
8
+
9
+ const DB_DIR = path.join(process.env.HOME || "", ".shooter");
10
+ const DB_PATH = path.join(DB_DIR, "shooter.db");
11
+ const COLUMNS = [
12
+ "id",
13
+ "terminal_id",
14
+ "session_id",
15
+ "project_name",
16
+ "summary",
17
+ "next_steps",
18
+ "trigger",
19
+ "created_at"
20
+ ];
21
+ class SummaryStore {
22
+ db;
23
+ constructor() {
24
+ fs.mkdirSync(DB_DIR, { recursive: true });
25
+ this.db = new Database(DB_PATH);
26
+ this.db.pragma("journal_mode = WAL");
27
+ this.db.exec(`
28
+ CREATE TABLE IF NOT EXISTS session_summaries (
29
+ id TEXT PRIMARY KEY,
30
+ terminal_id TEXT,
31
+ session_id TEXT,
32
+ project_name TEXT,
33
+ summary TEXT NOT NULL,
34
+ next_steps TEXT NOT NULL DEFAULT '[]',
35
+ trigger TEXT NOT NULL,
36
+ created_at TEXT NOT NULL
37
+ )
38
+ `);
39
+ }
40
+ insert(record) {
41
+ const placeholders = COLUMNS.map(() => "?").join(", ");
42
+ this.db.prepare(`INSERT INTO session_summaries (${COLUMNS.join(", ")}) VALUES (${placeholders})`).run(
43
+ record.id,
44
+ record.terminalId,
45
+ record.sessionId,
46
+ record.projectName,
47
+ record.summary,
48
+ record.nextSteps,
49
+ record.trigger,
50
+ record.createdAt
51
+ );
52
+ }
53
+ listRecent(limit, sessionId) {
54
+ if (sessionId) {
55
+ const rows2 = this.db.prepare(
56
+ "SELECT * FROM session_summaries WHERE session_id = ? ORDER BY created_at DESC LIMIT ?"
57
+ ).all(sessionId, limit);
58
+ return rows2.map(rowToRecord);
59
+ }
60
+ const rows = this.db.prepare("SELECT * FROM session_summaries ORDER BY created_at DESC LIMIT ?").all(limit);
61
+ return rows.map(rowToRecord);
62
+ }
63
+ }
64
+ function rowToRecord(row) {
65
+ return {
66
+ createdAt: row.created_at,
67
+ id: row.id,
68
+ nextSteps: row.next_steps,
69
+ projectName: row.project_name ?? null,
70
+ sessionId: row.session_id ?? null,
71
+ summary: row.summary,
72
+ terminalId: row.terminal_id ?? null,
73
+ trigger: row.trigger
74
+ };
75
+ }
76
+ const SS_GLOBAL_KEY = "__shooter_summary_store";
77
+ const summaryStore = globalThis[SS_GLOBAL_KEY] || new SummaryStore();
78
+ globalThis[SS_GLOBAL_KEY] = summaryStore;
79
+ const DEFAULT_LIMIT = 50;
80
+ const MAX_LIMIT = 200;
81
+ const POST = async ({ request }) => {
82
+ const authError = validateAuth(request);
83
+ if (authError) {
84
+ return authError;
85
+ }
86
+ const rawBody = await request.json();
87
+ if (!rawBody || typeof rawBody !== "object" || Array.isArray(rawBody)) {
88
+ return json({ error: "Request body must be a JSON object" }, { status: 400 });
89
+ }
90
+ const body = rawBody;
91
+ if (typeof body.id !== "string" || !body.id) {
92
+ return json({ error: "id is required and must be a non-empty string" }, { status: 400 });
93
+ }
94
+ if (body.id.length > 128) {
95
+ return json({ error: "id must be 128 characters or fewer" }, { status: 400 });
96
+ }
97
+ if (typeof body.summary !== "string" || !body.summary) {
98
+ return json({ error: "summary is required and must be a non-empty string" }, { status: 400 });
99
+ }
100
+ if (body.summary.length > 1e3) {
101
+ return json({ error: "summary must be 1000 characters or fewer" }, { status: 400 });
102
+ }
103
+ if (typeof body.trigger !== "string" || !body.trigger) {
104
+ return json({ error: "trigger is required and must be a non-empty string" }, { status: 400 });
105
+ }
106
+ if (body.trigger.length > 64) {
107
+ return json({ error: "trigger must be 64 characters or fewer" }, { status: 400 });
108
+ }
109
+ if (typeof body.createdAt !== "string" || !body.createdAt) {
110
+ return json({ error: "createdAt is required and must be a non-empty string" }, { status: 400 });
111
+ }
112
+ if (body.createdAt.length > 64 || isNaN(Date.parse(body.createdAt))) {
113
+ return json({ error: "createdAt must be a valid ISO 8601 date string" }, { status: 400 });
114
+ }
115
+ if (typeof body.nextSteps === "string" && body.nextSteps.length > 8192) {
116
+ return json({ error: "nextSteps must be 8192 characters or fewer" }, { status: 400 });
117
+ }
118
+ const record = {
119
+ createdAt: body.createdAt,
120
+ id: body.id,
121
+ nextSteps: typeof body.nextSteps === "string" ? body.nextSteps : "[]",
122
+ projectName: typeof body.projectName === "string" ? body.projectName : null,
123
+ sessionId: typeof body.sessionId === "string" ? body.sessionId : null,
124
+ summary: body.summary,
125
+ terminalId: typeof body.terminalId === "string" ? body.terminalId : null,
126
+ trigger: body.trigger
127
+ };
128
+ try {
129
+ summaryStore.insert(record);
130
+ } catch (err) {
131
+ const message = err instanceof Error ? err.message : String(err);
132
+ const isDuplicate = typeof message === "string" && message.includes("UNIQUE constraint failed");
133
+ if (isDuplicate) {
134
+ return json({ error: "Record with this id already exists" }, { status: 409 });
135
+ }
136
+ return json({ error: "Failed to persist summary" }, { status: 500 });
137
+ }
138
+ return json({ id: record.id, success: true }, { status: 201 });
139
+ };
140
+ const GET = ({ request, url }) => {
141
+ const authError = validateAuth(request);
142
+ if (authError) {
143
+ return authError;
144
+ }
145
+ const sessionId = url.searchParams.get("sessionId") ?? void 0;
146
+ const rawLimit = parseInt(url.searchParams.get("limit") || String(DEFAULT_LIMIT));
147
+ const limit = Number.isFinite(rawLimit) && rawLimit >= 1 ? Math.min(rawLimit, MAX_LIMIT) : DEFAULT_LIMIT;
148
+ const summaries = summaryStore.listRecent(limit, sessionId);
149
+ return json({
150
+ count: summaries.length,
151
+ summaries,
152
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
153
+ });
154
+ };
155
+
156
+ export { GET, POST };
157
+ //# sourceMappingURL=_server.ts-VzDcFFgy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_server.ts-VzDcFFgy.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/summaries/_server.ts.js"],"sourcesContent":["import { v as validateAuth } from \"../../../../chunks/auth.js\";\nimport Database from \"better-sqlite3\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { json } from \"@sveltejs/kit\";\nconst DB_DIR = path.join(process.env.HOME || \"\", \".shooter\");\nconst DB_PATH = path.join(DB_DIR, \"shooter.db\");\nconst COLUMNS = [\n \"id\",\n \"terminal_id\",\n \"session_id\",\n \"project_name\",\n \"summary\",\n \"next_steps\",\n \"trigger\",\n \"created_at\"\n];\nclass SummaryStore {\n db;\n constructor() {\n fs.mkdirSync(DB_DIR, { recursive: true });\n this.db = new Database(DB_PATH);\n this.db.pragma(\"journal_mode = WAL\");\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS session_summaries (\n id TEXT PRIMARY KEY,\n terminal_id TEXT,\n session_id TEXT,\n project_name TEXT,\n summary TEXT NOT NULL,\n next_steps TEXT NOT NULL DEFAULT '[]',\n trigger TEXT NOT NULL,\n created_at TEXT NOT NULL\n )\n `);\n }\n insert(record) {\n const placeholders = COLUMNS.map(() => \"?\").join(\", \");\n this.db.prepare(`INSERT INTO session_summaries (${COLUMNS.join(\", \")}) VALUES (${placeholders})`).run(\n record.id,\n record.terminalId,\n record.sessionId,\n record.projectName,\n record.summary,\n record.nextSteps,\n record.trigger,\n record.createdAt\n );\n }\n listRecent(limit, sessionId) {\n if (sessionId) {\n const rows2 = this.db.prepare(\n \"SELECT * FROM session_summaries WHERE session_id = ? ORDER BY created_at DESC LIMIT ?\"\n ).all(sessionId, limit);\n return rows2.map(rowToRecord);\n }\n const rows = this.db.prepare(\"SELECT * FROM session_summaries ORDER BY created_at DESC LIMIT ?\").all(limit);\n return rows.map(rowToRecord);\n }\n}\nfunction rowToRecord(row) {\n return {\n createdAt: row.created_at,\n id: row.id,\n nextSteps: row.next_steps,\n projectName: row.project_name ?? null,\n sessionId: row.session_id ?? null,\n summary: row.summary,\n terminalId: row.terminal_id ?? null,\n trigger: row.trigger\n };\n}\nconst SS_GLOBAL_KEY = \"__shooter_summary_store\";\nconst summaryStore = globalThis[SS_GLOBAL_KEY] || new SummaryStore();\nglobalThis[SS_GLOBAL_KEY] = summaryStore;\nconst DEFAULT_LIMIT = 50;\nconst MAX_LIMIT = 200;\nconst POST = async ({ request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n const rawBody = await request.json();\n if (!rawBody || typeof rawBody !== \"object\" || Array.isArray(rawBody)) {\n return json({ error: \"Request body must be a JSON object\" }, { status: 400 });\n }\n const body = rawBody;\n if (typeof body.id !== \"string\" || !body.id) {\n return json({ error: \"id is required and must be a non-empty string\" }, { status: 400 });\n }\n if (body.id.length > 128) {\n return json({ error: \"id must be 128 characters or fewer\" }, { status: 400 });\n }\n if (typeof body.summary !== \"string\" || !body.summary) {\n return json({ error: \"summary is required and must be a non-empty string\" }, { status: 400 });\n }\n if (body.summary.length > 1e3) {\n return json({ error: \"summary must be 1000 characters or fewer\" }, { status: 400 });\n }\n if (typeof body.trigger !== \"string\" || !body.trigger) {\n return json({ error: \"trigger is required and must be a non-empty string\" }, { status: 400 });\n }\n if (body.trigger.length > 64) {\n return json({ error: \"trigger must be 64 characters or fewer\" }, { status: 400 });\n }\n if (typeof body.createdAt !== \"string\" || !body.createdAt) {\n return json({ error: \"createdAt is required and must be a non-empty string\" }, { status: 400 });\n }\n if (body.createdAt.length > 64 || isNaN(Date.parse(body.createdAt))) {\n return json({ error: \"createdAt must be a valid ISO 8601 date string\" }, { status: 400 });\n }\n if (typeof body.nextSteps === \"string\" && body.nextSteps.length > 8192) {\n return json({ error: \"nextSteps must be 8192 characters or fewer\" }, { status: 400 });\n }\n const record = {\n createdAt: body.createdAt,\n id: body.id,\n nextSteps: typeof body.nextSteps === \"string\" ? body.nextSteps : \"[]\",\n projectName: typeof body.projectName === \"string\" ? body.projectName : null,\n sessionId: typeof body.sessionId === \"string\" ? body.sessionId : null,\n summary: body.summary,\n terminalId: typeof body.terminalId === \"string\" ? body.terminalId : null,\n trigger: body.trigger\n };\n try {\n summaryStore.insert(record);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const isDuplicate = typeof message === \"string\" && message.includes(\"UNIQUE constraint failed\");\n if (isDuplicate) {\n return json({ error: \"Record with this id already exists\" }, { status: 409 });\n }\n return json({ error: \"Failed to persist summary\" }, { status: 500 });\n }\n return json({ id: record.id, success: true }, { status: 201 });\n};\nconst GET = ({ request, url }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n const sessionId = url.searchParams.get(\"sessionId\") ?? void 0;\n const rawLimit = parseInt(url.searchParams.get(\"limit\") || String(DEFAULT_LIMIT));\n const limit = Number.isFinite(rawLimit) && rawLimit >= 1 ? Math.min(rawLimit, MAX_LIMIT) : DEFAULT_LIMIT;\n const summaries = summaryStore.listRecent(limit, sessionId);\n return json({\n count: summaries.length,\n summaries,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n};\nexport {\n GET,\n POST\n};\n"],"names":[],"mappings":"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"}
@@ -1,14 +1,23 @@
1
1
  import { v as validateAuth } from './auth-DuunT7Cg.js';
2
+ import { s as shareStore } from './share-store-B9jMpVg0.js';
2
3
  import { randomBytes } from 'crypto';
3
4
  import { j as json } from './index-CoD1IJuy.js';
4
5
  import './shared-server-DaWdgxVh.js';
6
+ import 'better-sqlite3';
7
+ import 'fs';
8
+ import 'path';
5
9
 
6
10
  const GLOBAL_KEY = "__shooter_ws_tickets";
7
11
  const tickets = globalThis[GLOBAL_KEY] || /* @__PURE__ */ new Map();
8
12
  globalThis[GLOBAL_KEY] = tickets;
9
- function generateTicket() {
13
+ function generateTicket(scope) {
10
14
  const ticket = randomBytes(32).toString("hex");
11
- tickets.set(ticket, { createdAt: Date.now(), used: false });
15
+ tickets.set(ticket, {
16
+ createdAt: Date.now(),
17
+ readOnly: scope?.readOnly ?? null,
18
+ terminalId: scope?.terminalId ?? null,
19
+ used: false
20
+ });
12
21
  return ticket;
13
22
  }
14
23
  setInterval(() => {
@@ -50,12 +59,26 @@ setInterval(() => {
50
59
  }
51
60
  }, 3e5).unref();
52
61
  const POST = ({ request }) => {
62
+ const bearer = (request.headers.get("authorization") ?? request.headers.get("Authorization") ?? "").replace(/^Bearer\s+/i, "").trim();
53
63
  const authError = validateAuth(request);
54
64
  if (authError) {
55
- return authError;
65
+ const session = bearer ? shareStore.resolveToken(bearer) : null;
66
+ if (!session) {
67
+ return authError;
68
+ }
69
+ if (!checkRateLimit(bearer)) {
70
+ return json(
71
+ { error: "Rate limit exceeded. Maximum 30 ticket requests per minute." },
72
+ { status: 429 }
73
+ );
74
+ }
75
+ const ticket2 = generateTicket({
76
+ readOnly: session.mode === "view",
77
+ terminalId: session.terminalId
78
+ });
79
+ return json({ expiresIn: 30, ticket: ticket2 });
56
80
  }
57
- const apiKey = (request.headers.get("authorization") ?? "").substring(7).trim();
58
- if (!checkRateLimit(apiKey)) {
81
+ if (!checkRateLimit(bearer)) {
59
82
  return json(
60
83
  { error: "Rate limit exceeded. Maximum 30 ticket requests per minute." },
61
84
  { status: 429 }
@@ -69,4 +92,4 @@ const POST = ({ request }) => {
69
92
  };
70
93
 
71
94
  export { POST };
72
- //# sourceMappingURL=_server.ts-BrqaMMAa.js.map
95
+ //# sourceMappingURL=_server.ts-W6i3EnGX.js.map