offsite 0.0.0 → 0.0.2

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 (362) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -0
  3. package/apps/server/dist/args.js +11 -0
  4. package/apps/server/dist/claude.js +207 -0
  5. package/apps/server/dist/config.js +185 -0
  6. package/apps/server/dist/content.js +172 -0
  7. package/apps/server/dist/db.js +13 -0
  8. package/apps/server/dist/files.js +50 -0
  9. package/apps/server/dist/git.js +133 -0
  10. package/apps/server/dist/history.js +137 -0
  11. package/apps/server/dist/hub.js +10 -0
  12. package/apps/server/dist/main.js +64 -0
  13. package/apps/server/dist/projects.js +92 -0
  14. package/apps/server/dist/protocol.js +20 -0
  15. package/apps/server/dist/push.js +152 -0
  16. package/apps/server/dist/run.js +375 -0
  17. package/apps/server/dist/runs.js +102 -0
  18. package/apps/server/dist/schemes.js +262 -0
  19. package/apps/server/dist/sessions.js +65 -0
  20. package/apps/server/dist/socket.js +149 -0
  21. package/apps/server/dist/storage.js +22 -0
  22. package/apps/server/dist/terminal/alerts.js +145 -0
  23. package/apps/server/dist/terminal/process.js +207 -0
  24. package/apps/server/dist/terminal/shell-check.js +91 -0
  25. package/apps/server/dist/terminal/shell-integration.js +112 -0
  26. package/apps/server/dist/terminal/terminal.js +402 -0
  27. package/apps/server/src/terminal/shell-integration/bash/offsite.bash +112 -0
  28. package/apps/server/src/terminal/shell-integration/fish/offsite.fish +22 -0
  29. package/apps/server/src/terminal/shell-integration/zsh/.zshenv +100 -0
  30. package/apps/web/dist/assets/CaskaydiaCove-Bold-EtG3C8NJ.woff2 +0 -0
  31. package/apps/web/dist/assets/CaskaydiaCove-Regular-C8p8BuDw.woff2 +0 -0
  32. package/apps/web/dist/assets/FiraCode-Bold-CWkMdXEH.woff2 +0 -0
  33. package/apps/web/dist/assets/FiraCode-Regular-DlIV_a-6.woff2 +0 -0
  34. package/apps/web/dist/assets/Hack-Bold-CJ2nw9Fn.woff2 +0 -0
  35. package/apps/web/dist/assets/Hack-Regular-DQT7wDXD.woff2 +0 -0
  36. package/apps/web/dist/assets/JetBrainsMono-Bold-C3RVijod.woff2 +0 -0
  37. package/apps/web/dist/assets/JetBrainsMono-Regular-BhNseNRl.woff2 +0 -0
  38. package/apps/web/dist/assets/abap-CLvhMVsD.js +1 -0
  39. package/apps/web/dist/assets/actionscript-3-Cs6JJXT5.js +1 -0
  40. package/apps/web/dist/assets/ada-X3Y2mlq2.js +1 -0
  41. package/apps/web/dist/assets/ahk-DwADkxyd.js +1 -0
  42. package/apps/web/dist/assets/ahk2-_6rzW9BS.js +1 -0
  43. package/apps/web/dist/assets/andromeeda-vGVdxbeo.js +1 -0
  44. package/apps/web/dist/assets/angular-html-Oa9dnZbT.js +1 -0
  45. package/apps/web/dist/assets/angular-ts-F_BIbY2H.js +1 -0
  46. package/apps/web/dist/assets/apache-U0d_L8uA.js +1 -0
  47. package/apps/web/dist/assets/apex-KFGFyKwG.js +1 -0
  48. package/apps/web/dist/assets/apl-D7AuiKiV.js +1 -0
  49. package/apps/web/dist/assets/applescript-CCn79oCD.js +1 -0
  50. package/apps/web/dist/assets/ara-4CJ0cIlV.js +1 -0
  51. package/apps/web/dist/assets/asciidoc-SCjQUq34.js +1 -0
  52. package/apps/web/dist/assets/asm-Cmm7eHzH.js +1 -0
  53. package/apps/web/dist/assets/astro-DnpymQyW.js +1 -0
  54. package/apps/web/dist/assets/aurora-x-CDeNXAV0.js +1 -0
  55. package/apps/web/dist/assets/awk-BWXHIvNe.js +1 -0
  56. package/apps/web/dist/assets/ayu-dark-DluEY0Gj.js +1 -0
  57. package/apps/web/dist/assets/ayu-light-C3h-C4tm.js +1 -0
  58. package/apps/web/dist/assets/ayu-mirage-Bqwy1Gya.js +1 -0
  59. package/apps/web/dist/assets/ballerina-B7ZEbQpA.js +1 -0
  60. package/apps/web/dist/assets/bat-qdxAdBWQ.js +1 -0
  61. package/apps/web/dist/assets/beancount-C2IN4Vk8.js +1 -0
  62. package/apps/web/dist/assets/berry-DKpUyyne.js +1 -0
  63. package/apps/web/dist/assets/bibtex-Ci_nEsc7.js +1 -0
  64. package/apps/web/dist/assets/bicep-CUHmPFLl.js +1 -0
  65. package/apps/web/dist/assets/bird2-CYIUgYqB.js +1 -0
  66. package/apps/web/dist/assets/blade-CZZrW0iI.js +1 -0
  67. package/apps/web/dist/assets/bsl-_VjlB9mv.js +1 -0
  68. package/apps/web/dist/assets/c-V_Rix0w2.js +1 -0
  69. package/apps/web/dist/assets/c3-D0apG41V.js +1 -0
  70. package/apps/web/dist/assets/cadence-CQ2zXKGN.js +1 -0
  71. package/apps/web/dist/assets/cairo-DLTphjLi.js +1 -0
  72. package/apps/web/dist/assets/catppuccin-frappe-C9Q5zVZY.js +1 -0
  73. package/apps/web/dist/assets/catppuccin-latte-CtsyrtPq.js +1 -0
  74. package/apps/web/dist/assets/catppuccin-macchiato-R8nAf1vR.js +1 -0
  75. package/apps/web/dist/assets/catppuccin-mocha-DjuaAJKi.js +1 -0
  76. package/apps/web/dist/assets/chapel-fGtLLMYq.js +1 -0
  77. package/apps/web/dist/assets/clarity-CtfBBspg.js +1 -0
  78. package/apps/web/dist/assets/clojure-DqKBuwfJ.js +1 -0
  79. package/apps/web/dist/assets/cmake-Bj61d0ZC.js +1 -0
  80. package/apps/web/dist/assets/cobol-BFOTnbFa.js +1 -0
  81. package/apps/web/dist/assets/codeowners-C8r90Shi.js +1 -0
  82. package/apps/web/dist/assets/codeql-oeQT6MSM.js +1 -0
  83. package/apps/web/dist/assets/coffee-BdvfipEg.js +1 -0
  84. package/apps/web/dist/assets/common-lisp-Cv5bFMCO.js +1 -0
  85. package/apps/web/dist/assets/coq-CGaSfhwR.js +1 -0
  86. package/apps/web/dist/assets/cpp-D_NFR3H2.js +1 -0
  87. package/apps/web/dist/assets/crystal-BM2vkBPa.js +1 -0
  88. package/apps/web/dist/assets/csharp-dmMxLVLW.js +1 -0
  89. package/apps/web/dist/assets/css-Byur6C5q.js +1 -0
  90. package/apps/web/dist/assets/csv-Dx-8-gkx.js +1 -0
  91. package/apps/web/dist/assets/cue-CE9AQfxI.js +1 -0
  92. package/apps/web/dist/assets/cypher-ClKdZ_lG.js +1 -0
  93. package/apps/web/dist/assets/d-qD-0Kul2.js +1 -0
  94. package/apps/web/dist/assets/dark-plus-Cs2F2srj.js +1 -0
  95. package/apps/web/dist/assets/dart-CHZY9Xhz.js +1 -0
  96. package/apps/web/dist/assets/dax-BkyTk9wS.js +1 -0
  97. package/apps/web/dist/assets/desktop-Dlh5hvp9.js +1 -0
  98. package/apps/web/dist/assets/diff-woXpYk--.js +1 -0
  99. package/apps/web/dist/assets/docker-IyjqRm3v.js +1 -0
  100. package/apps/web/dist/assets/dotenv-CuH5my32.js +1 -0
  101. package/apps/web/dist/assets/dracula-BHWKrbxM.js +1 -0
  102. package/apps/web/dist/assets/dracula-soft-5eyTD99u.js +1 -0
  103. package/apps/web/dist/assets/dream-maker-DW3nJb8Q.js +1 -0
  104. package/apps/web/dist/assets/edge-CP-KL2DQ.js +1 -0
  105. package/apps/web/dist/assets/elixir-CiO075Fh.js +1 -0
  106. package/apps/web/dist/assets/elm-DIyG-d95.js +1 -0
  107. package/apps/web/dist/assets/emacs-lisp-DR2vtWaj.js +1 -0
  108. package/apps/web/dist/assets/erb-DHZK6WKc.js +1 -0
  109. package/apps/web/dist/assets/erlang-Cphh6RMH.js +1 -0
  110. package/apps/web/dist/assets/everforest-dark-sB-x3p7T.js +1 -0
  111. package/apps/web/dist/assets/everforest-light-Df2xbC6M.js +1 -0
  112. package/apps/web/dist/assets/fennel-DQxkIbk2.js +1 -0
  113. package/apps/web/dist/assets/fish-BJitypiv.js +1 -0
  114. package/apps/web/dist/assets/fluent-C03EYrpw.js +1 -0
  115. package/apps/web/dist/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
  116. package/apps/web/dist/assets/fortran-free-form-CYNrtFtB.js +1 -0
  117. package/apps/web/dist/assets/fsharp-D13ZGOAj.js +1 -0
  118. package/apps/web/dist/assets/gdresource-xMC7jr7x.js +1 -0
  119. package/apps/web/dist/assets/gdscript-DYvRD3hg.js +1 -0
  120. package/apps/web/dist/assets/gdshader-CBce3t8t.js +1 -0
  121. package/apps/web/dist/assets/genie-CV2tkWYe.js +1 -0
  122. package/apps/web/dist/assets/gherkin-DExj1W_8.js +1 -0
  123. package/apps/web/dist/assets/ghostty-vt-CQAu1Gs5.wasm +0 -0
  124. package/apps/web/dist/assets/git-commit-BSykSTBG.js +1 -0
  125. package/apps/web/dist/assets/git-rebase-CxXKbwiy.js +1 -0
  126. package/apps/web/dist/assets/github-dark-C-LZuMrd.js +1 -0
  127. package/apps/web/dist/assets/github-dark-default-DXG-b-1a.js +1 -0
  128. package/apps/web/dist/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
  129. package/apps/web/dist/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
  130. package/apps/web/dist/assets/github-light-EUqPIrTm.js +1 -0
  131. package/apps/web/dist/assets/github-light-default-BXViO-2h.js +1 -0
  132. package/apps/web/dist/assets/github-light-high-contrast-B68TUdTA.js +1 -0
  133. package/apps/web/dist/assets/gleam-CSRkHgEL.js +1 -0
  134. package/apps/web/dist/assets/glimmer-js-BUhQC_gD.js +1 -0
  135. package/apps/web/dist/assets/glimmer-ts-D2lLByyw.js +1 -0
  136. package/apps/web/dist/assets/glsl-BMvlWqE_.js +1 -0
  137. package/apps/web/dist/assets/gn-CAXYAgV-.js +1 -0
  138. package/apps/web/dist/assets/gnuplot-7GGW24-e.js +1 -0
  139. package/apps/web/dist/assets/go-rLFTqkRN.js +1 -0
  140. package/apps/web/dist/assets/graphql-D9UFk_fJ.js +1 -0
  141. package/apps/web/dist/assets/groovy-CacY0gHj.js +1 -0
  142. package/apps/web/dist/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
  143. package/apps/web/dist/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
  144. package/apps/web/dist/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
  145. package/apps/web/dist/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
  146. package/apps/web/dist/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
  147. package/apps/web/dist/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
  148. package/apps/web/dist/assets/hack-BZAO0Jc2.js +1 -0
  149. package/apps/web/dist/assets/haml-Dm5wroII.js +1 -0
  150. package/apps/web/dist/assets/handlebars-C9L1Bn7f.js +1 -0
  151. package/apps/web/dist/assets/haskell-D8IpX4py.js +1 -0
  152. package/apps/web/dist/assets/haxe-C8oCnwJJ.js +1 -0
  153. package/apps/web/dist/assets/hcl-Dh228itO.js +1 -0
  154. package/apps/web/dist/assets/hjson-CxZEssPk.js +1 -0
  155. package/apps/web/dist/assets/hlsl-Cvrh5tZx.js +1 -0
  156. package/apps/web/dist/assets/horizon-CE9ld1lL.js +1 -0
  157. package/apps/web/dist/assets/horizon-bright-DSNQnXHK.js +1 -0
  158. package/apps/web/dist/assets/houston-CsvMBhTu.js +1 -0
  159. package/apps/web/dist/assets/html-Bz91Luf0.js +1 -0
  160. package/apps/web/dist/assets/html-derivative-hIdjVrpA.js +1 -0
  161. package/apps/web/dist/assets/http-AWG6aeFM.js +1 -0
  162. package/apps/web/dist/assets/hurl-pSGcpqgh.js +1 -0
  163. package/apps/web/dist/assets/hxml-Dcm88srW.js +1 -0
  164. package/apps/web/dist/assets/hy-CZbG8q4J.js +1 -0
  165. package/apps/web/dist/assets/imba-DsUTQ-LC.js +1 -0
  166. package/apps/web/dist/assets/index-BiLbXfDN.js +899 -0
  167. package/apps/web/dist/assets/index-DQIK-TpZ.css +2 -0
  168. package/apps/web/dist/assets/ini-B5eOa1yu.js +1 -0
  169. package/apps/web/dist/assets/java-D_CyC-X4.js +1 -0
  170. package/apps/web/dist/assets/javascript-PK4jkG9t.js +1 -0
  171. package/apps/web/dist/assets/jinja-Cu3wzgkz.js +1 -0
  172. package/apps/web/dist/assets/jison-CHevE1W8.js +1 -0
  173. package/apps/web/dist/assets/json-DPTkd0bP.js +1 -0
  174. package/apps/web/dist/assets/json5-BR5RXkoi.js +1 -0
  175. package/apps/web/dist/assets/jsonc-CYpm1nAK.js +1 -0
  176. package/apps/web/dist/assets/jsonl-CmCQp5Yx.js +1 -0
  177. package/apps/web/dist/assets/jsonnet-CJTPZ8u_.js +1 -0
  178. package/apps/web/dist/assets/jssm-DXw9l8Rf.js +1 -0
  179. package/apps/web/dist/assets/jsx-DcsDzCOA.js +1 -0
  180. package/apps/web/dist/assets/julia-B9tMVOL0.js +1 -0
  181. package/apps/web/dist/assets/just-BHIhrE9N.js +1 -0
  182. package/apps/web/dist/assets/kanagawa-dragon-Bozd7klA.js +1 -0
  183. package/apps/web/dist/assets/kanagawa-lotus-BmuOG9ZW.js +1 -0
  184. package/apps/web/dist/assets/kanagawa-wave-BML5mF2J.js +1 -0
  185. package/apps/web/dist/assets/kdl-CsD5j6eV.js +1 -0
  186. package/apps/web/dist/assets/kotlin-DhhofPvG.js +1 -0
  187. package/apps/web/dist/assets/kusto-C7mF5XQf.js +1 -0
  188. package/apps/web/dist/assets/laserwave-C_8bwKvT.js +1 -0
  189. package/apps/web/dist/assets/latex-CY05HK-G.js +1 -0
  190. package/apps/web/dist/assets/lean-CewbzKMR.js +1 -0
  191. package/apps/web/dist/assets/less-DVTAwKKz.js +1 -0
  192. package/apps/web/dist/assets/light-plus-DVQuIRkW.js +1 -0
  193. package/apps/web/dist/assets/liquid-DJaL8XK2.js +1 -0
  194. package/apps/web/dist/assets/llvm-DqHOMS-s.js +1 -0
  195. package/apps/web/dist/assets/log-BNLmms1o.js +1 -0
  196. package/apps/web/dist/assets/logo-Cluzi2Zq.js +1 -0
  197. package/apps/web/dist/assets/lua-BfaWUinJ.js +1 -0
  198. package/apps/web/dist/assets/luau-VGWVLoqX.js +1 -0
  199. package/apps/web/dist/assets/make-Dixweg8N.js +1 -0
  200. package/apps/web/dist/assets/markdown-BYOwaDjH.js +1 -0
  201. package/apps/web/dist/assets/marko-0Lc0z7w6.js +1 -0
  202. package/apps/web/dist/assets/material-theme-Bm3Qr25_.js +1 -0
  203. package/apps/web/dist/assets/material-theme-darker-2IIEA8gg.js +1 -0
  204. package/apps/web/dist/assets/material-theme-lighter-uhdI0v04.js +1 -0
  205. package/apps/web/dist/assets/material-theme-ocean-CHQ94UKr.js +1 -0
  206. package/apps/web/dist/assets/material-theme-palenight-B5W6OYN7.js +1 -0
  207. package/apps/web/dist/assets/matlab-D7qyCx1q.js +1 -0
  208. package/apps/web/dist/assets/mdc-DEhXNYDZ.js +1 -0
  209. package/apps/web/dist/assets/mdx-DQZ5AkYe.js +1 -0
  210. package/apps/web/dist/assets/mermaid-BxpfTIzt.js +1 -0
  211. package/apps/web/dist/assets/min-dark-BSWPekZh.js +1 -0
  212. package/apps/web/dist/assets/min-light-DDpmG2fV.js +1 -0
  213. package/apps/web/dist/assets/mipsasm-BMqwQI7S.js +1 -0
  214. package/apps/web/dist/assets/mojo-fg40_ntQ.js +1 -0
  215. package/apps/web/dist/assets/monokai-BscAjiQZ.js +1 -0
  216. package/apps/web/dist/assets/moonbit-D9W784E_.js +1 -0
  217. package/apps/web/dist/assets/move-BYnGhZoM.js +1 -0
  218. package/apps/web/dist/assets/narrat-_X_XdTYD.js +1 -0
  219. package/apps/web/dist/assets/nextflow-CSgcYZcx.js +1 -0
  220. package/apps/web/dist/assets/nextflow-groovy-D7IRt6Pp.js +1 -0
  221. package/apps/web/dist/assets/nginx-DLuBebI5.js +1 -0
  222. package/apps/web/dist/assets/night-owl-DhmEMT88.js +1 -0
  223. package/apps/web/dist/assets/night-owl-light-eJ-hLW7d.js +1 -0
  224. package/apps/web/dist/assets/nim-BIJh7lZB.js +1 -0
  225. package/apps/web/dist/assets/nix-IvuFDN5E.js +1 -0
  226. package/apps/web/dist/assets/nord-Cb4Vim4T.js +1 -0
  227. package/apps/web/dist/assets/nsis-CjNLYCLg.js +1 -0
  228. package/apps/web/dist/assets/nushell--0fT3PI1.js +1 -0
  229. package/apps/web/dist/assets/objective-c-D1A_Heim.js +1 -0
  230. package/apps/web/dist/assets/objective-cpp-BsSzOQcm.js +1 -0
  231. package/apps/web/dist/assets/ocaml-O90oeIOV.js +1 -0
  232. package/apps/web/dist/assets/odin-B1RWQWA5.js +1 -0
  233. package/apps/web/dist/assets/one-dark-pro-C6YyR8OD.js +1 -0
  234. package/apps/web/dist/assets/one-light-D7Lr4KcI.js +1 -0
  235. package/apps/web/dist/assets/openscad-BUDT5pXO.js +1 -0
  236. package/apps/web/dist/assets/org-BFpxb2WJ.js +1 -0
  237. package/apps/web/dist/assets/pascal-4ZHwLPI5.js +1 -0
  238. package/apps/web/dist/assets/perl-DHbDMq2q.js +1 -0
  239. package/apps/web/dist/assets/php-BcVbiJpZ.js +1 -0
  240. package/apps/web/dist/assets/pierre-dark-CpLgRqie.js +1 -0
  241. package/apps/web/dist/assets/pierre-dark-protanopia-deuteranopia-B35FxJx-.js +1 -0
  242. package/apps/web/dist/assets/pierre-dark-soft-kZQmAZld.js +1 -0
  243. package/apps/web/dist/assets/pierre-dark-tritanopia-CpjhbsIL.js +1 -0
  244. package/apps/web/dist/assets/pierre-dark-vibrant-CpQYzh95.js +1 -0
  245. package/apps/web/dist/assets/pierre-light-CoaEpmwp.js +1 -0
  246. package/apps/web/dist/assets/pierre-light-protanopia-deuteranopia-0fSaH845.js +1 -0
  247. package/apps/web/dist/assets/pierre-light-soft-lWLdNTOI.js +1 -0
  248. package/apps/web/dist/assets/pierre-light-tritanopia-CEbqgOJL.js +1 -0
  249. package/apps/web/dist/assets/pierre-light-vibrant-D80Fkn33.js +1 -0
  250. package/apps/web/dist/assets/pkl-ot-7Btpt.js +1 -0
  251. package/apps/web/dist/assets/plastic-DQwYfKfQ.js +1 -0
  252. package/apps/web/dist/assets/plsql-DGHpHOYJ.js +1 -0
  253. package/apps/web/dist/assets/po-BiJDBrnU.js +1 -0
  254. package/apps/web/dist/assets/poimandres-DRFjx7u4.js +1 -0
  255. package/apps/web/dist/assets/polar-C7UOKdEL.js +1 -0
  256. package/apps/web/dist/assets/postcss-BXeXVLqQ.js +1 -0
  257. package/apps/web/dist/assets/powerquery-DNMTfnFr.js +1 -0
  258. package/apps/web/dist/assets/powershell-QtSnmXcu.js +1 -0
  259. package/apps/web/dist/assets/prisma-DMgNhnYS.js +1 -0
  260. package/apps/web/dist/assets/prolog-iXnhIJG7.js +1 -0
  261. package/apps/web/dist/assets/proto-DB4EqR-F.js +1 -0
  262. package/apps/web/dist/assets/pug-bdfyK-rS.js +1 -0
  263. package/apps/web/dist/assets/puppet-CDv2pdJW.js +1 -0
  264. package/apps/web/dist/assets/purescript-9MfHhQsQ.js +1 -0
  265. package/apps/web/dist/assets/python-gzcpVVnB.js +1 -0
  266. package/apps/web/dist/assets/qml-BC2D8eWk.js +1 -0
  267. package/apps/web/dist/assets/qmldir-DCQb3MpD.js +1 -0
  268. package/apps/web/dist/assets/qss-Fe1Jh2GI.js +1 -0
  269. package/apps/web/dist/assets/r-O3zbZ-YT.js +1 -0
  270. package/apps/web/dist/assets/racket-DcIDlBhZ.js +1 -0
  271. package/apps/web/dist/assets/raku-B3gFvitq.js +1 -0
  272. package/apps/web/dist/assets/razor-Ffnu5_vD.js +1 -0
  273. package/apps/web/dist/assets/rbs-C0MpOrj4.js +1 -0
  274. package/apps/web/dist/assets/red-CYlAq2b0.js +1 -0
  275. package/apps/web/dist/assets/reg-CRGYupPL.js +1 -0
  276. package/apps/web/dist/assets/regexp-dnbUAgjx.js +1 -0
  277. package/apps/web/dist/assets/rel-BtDbiS_P.js +1 -0
  278. package/apps/web/dist/assets/riscv-Ckw8ddFX.js +1 -0
  279. package/apps/web/dist/assets/ron-VUp2lXgN.js +1 -0
  280. package/apps/web/dist/assets/rose-pine-aMsaMD1D.js +1 -0
  281. package/apps/web/dist/assets/rose-pine-dawn-8PwUyIlP.js +1 -0
  282. package/apps/web/dist/assets/rose-pine-moon-DO-qXg-I.js +1 -0
  283. package/apps/web/dist/assets/rosmsg-CAekHB0j.js +1 -0
  284. package/apps/web/dist/assets/rst-DJfy2dSm.js +1 -0
  285. package/apps/web/dist/assets/ruby-DGEpA0mD.js +1 -0
  286. package/apps/web/dist/assets/rust-DpiIf5JO.js +1 -0
  287. package/apps/web/dist/assets/sas-CZvL8X8k.js +1 -0
  288. package/apps/web/dist/assets/sass-DXrisJhu.js +1 -0
  289. package/apps/web/dist/assets/scala-BiFt_7mu.js +1 -0
  290. package/apps/web/dist/assets/scheme-DQCgrYNe.js +1 -0
  291. package/apps/web/dist/assets/scss-BtNSCzZB.js +1 -0
  292. package/apps/web/dist/assets/sdbl-bTVj8UrX.js +1 -0
  293. package/apps/web/dist/assets/shaderlab-TOUzSsQk.js +1 -0
  294. package/apps/web/dist/assets/shellscript-uR-sOZlr.js +1 -0
  295. package/apps/web/dist/assets/shellsession-BT-Jl4S5.js +1 -0
  296. package/apps/web/dist/assets/slack-dark-DnToyrRv.js +1 -0
  297. package/apps/web/dist/assets/slack-ochin-B2OO5cIa.js +1 -0
  298. package/apps/web/dist/assets/smalltalk-BHpQb5nM.js +1 -0
  299. package/apps/web/dist/assets/smithy-Dgaz7aur.js +1 -0
  300. package/apps/web/dist/assets/snazzy-light-4G7pJPwS.js +1 -0
  301. package/apps/web/dist/assets/solarized-dark-b97czJOk.js +1 -0
  302. package/apps/web/dist/assets/solarized-light-DFPxpIYQ.js +1 -0
  303. package/apps/web/dist/assets/solidity-Bj7E1mRn.js +1 -0
  304. package/apps/web/dist/assets/soy-BjfL_vrj.js +1 -0
  305. package/apps/web/dist/assets/sparql-D_iOobhT.js +1 -0
  306. package/apps/web/dist/assets/splunk-BC2Px7Mm.js +1 -0
  307. package/apps/web/dist/assets/sql-fa1gAeRF.js +1 -0
  308. package/apps/web/dist/assets/ssh-config-BgfXC-Er.js +1 -0
  309. package/apps/web/dist/assets/stata-DgTOpGhg.js +1 -0
  310. package/apps/web/dist/assets/stylus-B6D30XZt.js +1 -0
  311. package/apps/web/dist/assets/surrealql-DVqEkJeu.js +1 -0
  312. package/apps/web/dist/assets/svelte-CyQ5sU9I.js +1 -0
  313. package/apps/web/dist/assets/swift-CyEgAFGc.js +1 -0
  314. package/apps/web/dist/assets/synthwave-84-nFMaYfgc.js +1 -0
  315. package/apps/web/dist/assets/system-verilog-Dh5ihWbf.js +1 -0
  316. package/apps/web/dist/assets/systemd-BxMlprV5.js +1 -0
  317. package/apps/web/dist/assets/talonscript-CohzipZa.js +1 -0
  318. package/apps/web/dist/assets/tasl-DMoTqEGO.js +1 -0
  319. package/apps/web/dist/assets/tcl-CZd0xW_V.js +1 -0
  320. package/apps/web/dist/assets/templ-DrztMbAf.js +1 -0
  321. package/apps/web/dist/assets/terraform-DswuEJGm.js +1 -0
  322. package/apps/web/dist/assets/tex-NAwM8Kkh.js +1 -0
  323. package/apps/web/dist/assets/tokyo-night-oM2G3aXe.js +1 -0
  324. package/apps/web/dist/assets/toml-CcmNWLt0.js +1 -0
  325. package/apps/web/dist/assets/ts-tags-DX96dDxh.js +1 -0
  326. package/apps/web/dist/assets/tsv-sltzmVWM.js +1 -0
  327. package/apps/web/dist/assets/tsx-D3PnhDHK.js +1 -0
  328. package/apps/web/dist/assets/turtle-ByJddavk.js +1 -0
  329. package/apps/web/dist/assets/twig-FG0P9evf.js +1 -0
  330. package/apps/web/dist/assets/typescript-Crqeuw0P.js +1 -0
  331. package/apps/web/dist/assets/typespec-BGhR2SqG.js +1 -0
  332. package/apps/web/dist/assets/typst-CO_2MFRr.js +1 -0
  333. package/apps/web/dist/assets/v-DBj4K9d_.js +1 -0
  334. package/apps/web/dist/assets/vala-zf12oZj6.js +1 -0
  335. package/apps/web/dist/assets/vb-DOwzaHZ0.js +1 -0
  336. package/apps/web/dist/assets/verilog-B2gwz-sJ.js +1 -0
  337. package/apps/web/dist/assets/vesper-DdrHHSXu.js +1 -0
  338. package/apps/web/dist/assets/vhdl-BroJfC0k.js +1 -0
  339. package/apps/web/dist/assets/viml-DvXPmvsu.js +1 -0
  340. package/apps/web/dist/assets/vitesse-black-fwtXNY1n.js +1 -0
  341. package/apps/web/dist/assets/vitesse-dark-BZCL-v6S.js +1 -0
  342. package/apps/web/dist/assets/vitesse-light-VbXTXTou.js +1 -0
  343. package/apps/web/dist/assets/vue-fTNrS0Q3.js +1 -0
  344. package/apps/web/dist/assets/vue-html-E0ptmXwc.js +1 -0
  345. package/apps/web/dist/assets/vue-vine-C34_rJIu.js +1 -0
  346. package/apps/web/dist/assets/vyper-CgoNMtux.js +1 -0
  347. package/apps/web/dist/assets/wasm-BnjxR4X6.js +1 -0
  348. package/apps/web/dist/assets/wasm-ByWQv1Qj.js +1 -0
  349. package/apps/web/dist/assets/wenyan-C8pVoKbM.js +1 -0
  350. package/apps/web/dist/assets/wgsl-BsKzXJz4.js +1 -0
  351. package/apps/web/dist/assets/wikitext-ClFFjSW2.js +1 -0
  352. package/apps/web/dist/assets/wit-DdvCle-K.js +1 -0
  353. package/apps/web/dist/assets/wolfram-DLL8P-h_.js +1 -0
  354. package/apps/web/dist/assets/xml-BB9WbMMU.js +1 -0
  355. package/apps/web/dist/assets/xsl-B3w2P7LL.js +1 -0
  356. package/apps/web/dist/assets/yaml-BKGRKqBA.js +1 -0
  357. package/apps/web/dist/assets/zenscript-BnlCZFoB.js +1 -0
  358. package/apps/web/dist/assets/zig-CMLA9XwU.js +1 -0
  359. package/apps/web/dist/index.html +17 -0
  360. package/apps/web/dist/sw.js +81 -0
  361. package/bin/offsite.js +2 -0
  362. package/package.json +19 -1
@@ -0,0 +1,262 @@
1
+ export const schemes = [
2
+ {
3
+ id: 'one-dark-darker',
4
+ name: 'One Dark Darker',
5
+ background: '#15181C',
6
+ foreground: '#ABB2BF',
7
+ cursor: '#B3BAC5',
8
+ selectionBackground: '#3B414D',
9
+ palette: [
10
+ '#4A4F5A',
11
+ '#EE5D69',
12
+ '#97C775',
13
+ '#B68353',
14
+ '#61AFEF',
15
+ '#C678DD',
16
+ '#56B6C2',
17
+ '#CCCCCC',
18
+ '#616A7B',
19
+ '#FE808A',
20
+ '#C2DEAD',
21
+ '#D1A47A',
22
+ '#93CFFF',
23
+ '#E0A8F1',
24
+ '#82D2DC',
25
+ '#FFFFFF',
26
+ ],
27
+ },
28
+ {
29
+ id: 'one-dark-pro',
30
+ name: 'One Dark Pro',
31
+ background: '#282C34',
32
+ foreground: '#ABB2BF',
33
+ cursor: '#528BFF',
34
+ selectionBackground: '#41454E',
35
+ palette: [
36
+ '#3F4451',
37
+ '#E05561',
38
+ '#8CC265',
39
+ '#D18F52',
40
+ '#4AA5F0',
41
+ '#C162DE',
42
+ '#42B3C2',
43
+ '#D7DAE0',
44
+ '#4F5666',
45
+ '#FF616E',
46
+ '#A5E075',
47
+ '#F0A45D',
48
+ '#4DC4FF',
49
+ '#DE73FF',
50
+ '#4CD1E0',
51
+ '#E6E6E6',
52
+ ],
53
+ },
54
+ {
55
+ id: 'dracula',
56
+ name: 'Dracula',
57
+ background: '#282A36',
58
+ foreground: '#F8F8F2',
59
+ cursor: '#F8F8F2',
60
+ selectionBackground: '#44475A',
61
+ palette: [
62
+ '#21222C',
63
+ '#FF5555',
64
+ '#50FA7B',
65
+ '#F1FA8C',
66
+ '#BD93F9',
67
+ '#FF79C6',
68
+ '#8BE9FD',
69
+ '#F8F8F2',
70
+ '#6272A4',
71
+ '#FF6E6E',
72
+ '#69FF94',
73
+ '#FFFFA5',
74
+ '#D6ACFF',
75
+ '#FF92DF',
76
+ '#A4FFFF',
77
+ '#FFFFFF',
78
+ ],
79
+ },
80
+ {
81
+ id: 'tokyo-night',
82
+ name: 'Tokyo Night',
83
+ background: '#1A1B26',
84
+ foreground: '#C0CAF5',
85
+ cursor: '#C0CAF5',
86
+ selectionBackground: '#33467C',
87
+ palette: [
88
+ '#15161E',
89
+ '#F7768E',
90
+ '#9ECE6A',
91
+ '#E0AF68',
92
+ '#7AA2F7',
93
+ '#BB9AF7',
94
+ '#7DCFFF',
95
+ '#A9B1D6',
96
+ '#414868',
97
+ '#F7768E',
98
+ '#9ECE6A',
99
+ '#E0AF68',
100
+ '#7AA2F7',
101
+ '#BB9AF7',
102
+ '#7DCFFF',
103
+ '#C0CAF5',
104
+ ],
105
+ },
106
+ {
107
+ id: 'catppuccin-mocha',
108
+ name: 'Catppuccin Mocha',
109
+ background: '#1E1E2E',
110
+ foreground: '#CDD6F4',
111
+ cursor: '#F5E0DC',
112
+ selectionBackground: '#585B70',
113
+ palette: [
114
+ '#45475A',
115
+ '#F38BA8',
116
+ '#A6E3A1',
117
+ '#F9E2AF',
118
+ '#89B4FA',
119
+ '#F5C2E7',
120
+ '#94E2D5',
121
+ '#BAC2DE',
122
+ '#585B70',
123
+ '#F38BA8',
124
+ '#A6E3A1',
125
+ '#F9E2AF',
126
+ '#89B4FA',
127
+ '#F5C2E7',
128
+ '#94E2D5',
129
+ '#A6ADC8',
130
+ ],
131
+ },
132
+ {
133
+ id: 'nord',
134
+ name: 'Nord',
135
+ background: '#2E3440',
136
+ foreground: '#D8DEE9',
137
+ cursor: '#D8DEE9',
138
+ selectionBackground: '#434C5E',
139
+ palette: [
140
+ '#3B4252',
141
+ '#BF616A',
142
+ '#A3BE8C',
143
+ '#EBCB8B',
144
+ '#81A1C1',
145
+ '#B48EAD',
146
+ '#88C0D0',
147
+ '#E5E9F0',
148
+ '#4C566A',
149
+ '#BF616A',
150
+ '#A3BE8C',
151
+ '#EBCB8B',
152
+ '#81A1C1',
153
+ '#B48EAD',
154
+ '#8FBCBB',
155
+ '#ECEFF4',
156
+ ],
157
+ },
158
+ {
159
+ id: 'gruvbox-dark',
160
+ name: 'Gruvbox Dark',
161
+ background: '#282828',
162
+ foreground: '#EBDBB2',
163
+ cursor: '#EBDBB2',
164
+ selectionBackground: '#504945',
165
+ palette: [
166
+ '#282828',
167
+ '#CC241D',
168
+ '#98971A',
169
+ '#D79921',
170
+ '#458588',
171
+ '#B16286',
172
+ '#689D6A',
173
+ '#A89984',
174
+ '#928374',
175
+ '#FB4934',
176
+ '#B8BB26',
177
+ '#FABD2F',
178
+ '#83A598',
179
+ '#D3869B',
180
+ '#8EC07C',
181
+ '#EBDBB2',
182
+ ],
183
+ },
184
+ {
185
+ id: 'solarized-dark',
186
+ name: 'Solarized Dark',
187
+ background: '#002B36',
188
+ foreground: '#839496',
189
+ cursor: '#839496',
190
+ selectionBackground: '#073642',
191
+ palette: [
192
+ '#073642',
193
+ '#DC322F',
194
+ '#859900',
195
+ '#B58900',
196
+ '#268BD2',
197
+ '#D33682',
198
+ '#2AA198',
199
+ '#EEE8D5',
200
+ '#002B36',
201
+ '#CB4B16',
202
+ '#586E75',
203
+ '#657B83',
204
+ '#839496',
205
+ '#6C71C4',
206
+ '#93A1A1',
207
+ '#FDF6E3',
208
+ ],
209
+ },
210
+ {
211
+ id: 'github-dark',
212
+ name: 'GitHub Dark',
213
+ background: '#0D1117',
214
+ foreground: '#E6EDF3',
215
+ cursor: '#E6EDF3',
216
+ selectionBackground: '#264F78',
217
+ palette: [
218
+ '#484F58',
219
+ '#FF7B72',
220
+ '#3FB950',
221
+ '#D29922',
222
+ '#58A6FF',
223
+ '#BC8CFF',
224
+ '#39C5CF',
225
+ '#B1BAC4',
226
+ '#6E7681',
227
+ '#FFA198',
228
+ '#56D364',
229
+ '#E3B341',
230
+ '#79C0FF',
231
+ '#D2A8FF',
232
+ '#56D4DD',
233
+ '#FFFFFF',
234
+ ],
235
+ },
236
+ {
237
+ id: 'rose-pine',
238
+ name: 'Rosé Pine',
239
+ background: '#191724',
240
+ foreground: '#E0DEF4',
241
+ cursor: '#E0DEF4',
242
+ selectionBackground: '#403D52',
243
+ palette: [
244
+ '#26233A',
245
+ '#EB6F92',
246
+ '#31748F',
247
+ '#F6C177',
248
+ '#9CCFD8',
249
+ '#C4A7E7',
250
+ '#EBBCBA',
251
+ '#E0DEF4',
252
+ '#6E6A86',
253
+ '#EB6F92',
254
+ '#31748F',
255
+ '#F6C177',
256
+ '#9CCFD8',
257
+ '#C4A7E7',
258
+ '#EBBCBA',
259
+ '#E0DEF4',
260
+ ],
261
+ },
262
+ ];
@@ -0,0 +1,65 @@
1
+ import { deleteSession, forkSession, getSessionMessages, listSessions, renameSession, } from '@anthropic-ai/claude-agent-sdk';
2
+ import { projects } from './projects.js';
3
+ import { runs } from './run.js';
4
+ import { readJson, writeJson } from './storage.js';
5
+ export async function sessions() {
6
+ const marks = readMarks();
7
+ const lists = await Promise.all(projects().map(async (project) => (await listSessions({
8
+ dir: project.path,
9
+ includeWorktrees: false,
10
+ includeProgrammatic: false,
11
+ })).map((item) => ({
12
+ id: item.sessionId,
13
+ title: item.summary,
14
+ cwd: project.path,
15
+ branch: item.gitBranch ?? null,
16
+ updatedAt: item.lastModified,
17
+ pinned: marks.pinned.includes(item.sessionId),
18
+ archived: marks.archived.includes(item.sessionId),
19
+ }))));
20
+ return lists.flat();
21
+ }
22
+ export async function updateSession(id, patch) {
23
+ if (patch.title !== undefined)
24
+ await renameSession(id, patch.title);
25
+ const marks = readMarks();
26
+ if (patch.pinned !== undefined)
27
+ marks.pinned = mark(marks.pinned, id, patch.pinned);
28
+ if (patch.archived !== undefined)
29
+ marks.archived = mark(marks.archived, id, patch.archived);
30
+ writeMarks(marks);
31
+ }
32
+ export async function removeSession(id) {
33
+ const run = runs.get(id);
34
+ if (run !== undefined) {
35
+ run.stop();
36
+ await run.closed;
37
+ }
38
+ await deleteSession(id);
39
+ const marks = readMarks();
40
+ writeMarks({
41
+ pinned: mark(marks.pinned, id, false),
42
+ archived: mark(marks.archived, id, false),
43
+ });
44
+ }
45
+ export async function fork(sessionId, cwd, messageId) {
46
+ const disk = await getSessionMessages(sessionId, { dir: cwd });
47
+ const index = disk.findIndex((item) => item.uuid === messageId);
48
+ if (index < 0)
49
+ throw new Error('Cannot fork the session at that point');
50
+ const result = await forkSession(sessionId, {
51
+ dir: cwd,
52
+ upToMessageId: messageId,
53
+ });
54
+ return { sessionId: result.sessionId };
55
+ }
56
+ function readMarks() {
57
+ return (readJson('sessions.json') ?? { pinned: [], archived: [] });
58
+ }
59
+ function writeMarks(marks) {
60
+ writeJson('sessions.json', marks);
61
+ }
62
+ function mark(ids, id, on) {
63
+ const rest = ids.filter((item) => item !== id);
64
+ return on ? [...rest, id] : rest;
65
+ }
@@ -0,0 +1,149 @@
1
+ import { accounts, addAccount, capabilities, removeAccount, updateAccount, } from './claude.js';
2
+ import { configInfo, readConfig, saveConfig } from './config.js';
3
+ import { listFiles, saveUpload } from './files.js';
4
+ import { commit, createPullRequest, gitStatus, push, suggestCommitMessage, workingDiff, } from './git.js';
5
+ import { earlier } from './history.js';
6
+ import { clients } from './hub.js';
7
+ import { addProject, directories, projects, removeProject, updateProject, } from './projects.js';
8
+ import { pushKey, subscribe, unsubscribe } from './push.js';
9
+ import { activity, runs } from './run.js';
10
+ import { open, rewind, send } from './runs.js';
11
+ import { fork, removeSession, sessions, updateSession } from './sessions.js';
12
+ import { listShells } from './terminal/process.js';
13
+ import { busyTerminal, detachTerminal, savePastedImage, terminalInput, terminalRequest, } from './terminal/terminal.js';
14
+ const handlers = {
15
+ ping: () => null,
16
+ 'config.get': () => configInfo(),
17
+ 'config.save': (params) => saveConfig(params),
18
+ 'projects.list': () => projects(),
19
+ 'projects.add': (params) => addProject(params.path),
20
+ 'projects.update': (params) => updateProject(params.path, params.patch),
21
+ 'projects.remove': (params) => removeProject(params.path),
22
+ 'directories.list': (params) => directories(params.path),
23
+ 'sessions.list': () => sessions(),
24
+ 'sessions.update': async (params) => {
25
+ await updateSession(params.id, params.patch);
26
+ return sessions();
27
+ },
28
+ 'sessions.remove': async (params) => {
29
+ await removeSession(params.id);
30
+ return sessions();
31
+ },
32
+ 'sessions.open': async (params, client) => {
33
+ await open(client, params.sessionId, params.cwd);
34
+ return null;
35
+ },
36
+ 'sessions.earlier': (params) => earlier(params.sessionId, params.cwd, params.before),
37
+ 'sessions.send': async (params, client) => {
38
+ await send(client, params);
39
+ return null;
40
+ },
41
+ 'sessions.unqueue': (params) => {
42
+ runs.get(params.sessionId)?.unqueue(params.id);
43
+ return null;
44
+ },
45
+ 'sessions.interrupt': async (params) => {
46
+ await runs.get(params.sessionId)?.query.interrupt();
47
+ return null;
48
+ },
49
+ 'sessions.configure': async (params) => {
50
+ await runs.get(params.sessionId)?.configure(params.settings);
51
+ return null;
52
+ },
53
+ 'sessions.respond': (params) => {
54
+ runs
55
+ .get(params.sessionId)
56
+ ?.respond(params.requestId, params.decision, params.answers);
57
+ return null;
58
+ },
59
+ 'sessions.rewind': (params) => rewind(params),
60
+ 'sessions.fork': (params) => fork(params.sessionId, params.cwd, params.messageId),
61
+ 'accounts.list': () => accounts(),
62
+ 'accounts.add': (params) => {
63
+ addAccount(params.name, params.configDir);
64
+ return accounts();
65
+ },
66
+ 'accounts.update': (params) => {
67
+ updateAccount(params.id, params.name, params.configDir);
68
+ return accounts();
69
+ },
70
+ 'accounts.remove': (params) => {
71
+ removeAccount(params.id);
72
+ return accounts();
73
+ },
74
+ capabilities: (params) => capabilities(params.accountId, params.cwd),
75
+ 'files.list': (params) => listFiles(params.cwd),
76
+ 'files.upload': (params) => saveUpload(params.name, Buffer.from(params.data, 'base64')),
77
+ 'git.status': (params) => gitStatus(params.cwd),
78
+ 'git.diff': (params) => workingDiff(params.cwd),
79
+ 'git.commit': (params) => commit(params.cwd, params.message),
80
+ 'git.push': (params) => push(params.cwd),
81
+ 'git.pullRequest': (params) => createPullRequest(params.cwd),
82
+ 'git.message': (params) => suggestCommitMessage(params.accountId, params.cwd),
83
+ 'push.key': () => pushKey(),
84
+ 'push.subscribe': (params) => {
85
+ subscribe(params);
86
+ return null;
87
+ },
88
+ 'push.unsubscribe': (params) => {
89
+ unsubscribe(params.endpoint);
90
+ return null;
91
+ },
92
+ terminal: async (params, client) => {
93
+ await terminalRequest(client, params);
94
+ return null;
95
+ },
96
+ 'terminal.shells': () => listShells(),
97
+ 'terminal.busy': (params) => busyTerminal(params.id),
98
+ 'terminal.paste': (params) => savePastedImage(params.type, Buffer.from(params.data, 'base64')),
99
+ };
100
+ export function connectClient(socket) {
101
+ const client = {
102
+ socket,
103
+ heardAt: Date.now(),
104
+ opening: null,
105
+ sessionId: null,
106
+ send: (message) => socket.send(JSON.stringify(message)),
107
+ };
108
+ clients.add(client);
109
+ client.send({ type: 'activity', activity: activity() });
110
+ client.send({ type: 'config', config: readConfig() });
111
+ client.send({ type: 'projects', projects: projects() });
112
+ socket.on('message', (data, isBinary) => {
113
+ client.heardAt = Date.now();
114
+ if (isBinary) {
115
+ terminalInput(client, data);
116
+ return;
117
+ }
118
+ void answer(client, String(data));
119
+ });
120
+ socket.on('error', (error) => console.warn(`a browser connection failed: ${error}`));
121
+ socket.on('close', () => {
122
+ clients.delete(client);
123
+ detachTerminal(client);
124
+ });
125
+ }
126
+ async function answer(client, text) {
127
+ let call;
128
+ try {
129
+ call = JSON.parse(text);
130
+ }
131
+ catch (error) {
132
+ console.warn(`ignoring a message that is not JSON: ${error}`);
133
+ return;
134
+ }
135
+ try {
136
+ if (!Object.hasOwn(handlers, call.method))
137
+ throw new Error(`unknown method ${call.method}`);
138
+ const handler = handlers[call.method];
139
+ const result = await handler(call.params, client);
140
+ client.send({ type: 'reply', id: call.id, result });
141
+ }
142
+ catch (error) {
143
+ client.send({
144
+ type: 'reply',
145
+ id: call.id,
146
+ error: error instanceof Error ? error.message : String(error),
147
+ });
148
+ }
149
+ }
@@ -0,0 +1,22 @@
1
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { args } from './args.js';
4
+ export const home = args.dir;
5
+ export function readJson(name) {
6
+ try {
7
+ return JSON.parse(readFileSync(path.join(home, name), 'utf8'));
8
+ }
9
+ catch (error) {
10
+ if (error.code === 'ENOENT')
11
+ return null;
12
+ throw error;
13
+ }
14
+ }
15
+ export function writeJson(name, value) {
16
+ const file = path.join(home, name);
17
+ mkdirSync(home, { recursive: true });
18
+ writeFileSync(`${file}.tmp`, `${JSON.stringify(value, null, 2)}\n`, {
19
+ mode: 0o600,
20
+ });
21
+ renameSync(`${file}.tmp`, file);
22
+ }
@@ -0,0 +1,145 @@
1
+ export const ALERT_DELAY = 500;
2
+ const BELL_GAP = 5000;
3
+ const NOTIFICATION_GAP = 1000;
4
+ const PAYLOAD_LIMIT = 1024;
5
+ const ESC = 0x1b;
6
+ const BEL = 0x07;
7
+ const CAN = 0x18;
8
+ const SUB = 0x1a;
9
+ export class Scanner {
10
+ title = '';
11
+ state = 'ground';
12
+ payload = [];
13
+ scan(bytes) {
14
+ let alert = null;
15
+ let index = 0;
16
+ while (index < bytes.length) {
17
+ if (this.state === 'ground') {
18
+ let offset = index;
19
+ while (offset < bytes.length &&
20
+ bytes[offset] !== ESC &&
21
+ bytes[offset] !== BEL)
22
+ offset++;
23
+ if (offset === bytes.length)
24
+ break;
25
+ index = offset;
26
+ }
27
+ const found = this.step(bytes[index]);
28
+ index++;
29
+ if (found === null)
30
+ continue;
31
+ if (found.type === 'bell')
32
+ alert ??= found;
33
+ else
34
+ alert = found;
35
+ }
36
+ return alert;
37
+ }
38
+ step(byte) {
39
+ if (byte === CAN || byte === SUB) {
40
+ this.state = 'ground';
41
+ return null;
42
+ }
43
+ switch (this.state) {
44
+ case 'ground':
45
+ if (byte === ESC)
46
+ this.state = 'escape';
47
+ if (byte === BEL)
48
+ return { type: 'bell' };
49
+ return null;
50
+ case 'escape':
51
+ if (byte === 0x5d) {
52
+ this.payload = [];
53
+ this.state = 'osc';
54
+ }
55
+ else if ([0x50, 0x58, 0x5e, 0x5f].includes(byte))
56
+ this.state = 'text';
57
+ else if (byte !== ESC)
58
+ this.state = 'ground';
59
+ if (byte === BEL)
60
+ return { type: 'bell' };
61
+ return null;
62
+ case 'osc':
63
+ if (byte === BEL) {
64
+ this.state = 'ground';
65
+ return this.finish();
66
+ }
67
+ if (byte === ESC)
68
+ this.state = 'oscEscape';
69
+ else if (this.payload.length < PAYLOAD_LIMIT)
70
+ this.payload.push(byte);
71
+ return null;
72
+ case 'oscEscape':
73
+ if (byte === 0x5c) {
74
+ this.state = 'ground';
75
+ return this.finish();
76
+ }
77
+ this.state = 'escape';
78
+ return this.step(byte);
79
+ case 'text':
80
+ if (byte === ESC)
81
+ this.state = 'textEscape';
82
+ return null;
83
+ case 'textEscape':
84
+ if (byte === 0x5c) {
85
+ this.state = 'ground';
86
+ return null;
87
+ }
88
+ this.state = 'escape';
89
+ return this.step(byte);
90
+ }
91
+ }
92
+ finish() {
93
+ const text = Buffer.from(this.payload).toString('utf8');
94
+ if (text.startsWith('0;') || text.startsWith('2;')) {
95
+ this.title = text.slice(2);
96
+ return null;
97
+ }
98
+ if (text.startsWith('9;')) {
99
+ const body = text.slice(2);
100
+ const digits = /^\d*/.exec(body)?.[0].length ?? 0;
101
+ if (digits > 0 && (body.length === digits || body[digits] === ';'))
102
+ return null;
103
+ return { type: 'notification', title: '', body };
104
+ }
105
+ if (text.startsWith('777;notify;')) {
106
+ const rest = text.slice('777;notify;'.length);
107
+ const split = rest.indexOf(';');
108
+ return split === -1
109
+ ? { type: 'notification', title: rest, body: '' }
110
+ : {
111
+ type: 'notification',
112
+ title: rest.slice(0, split),
113
+ body: rest.slice(split + 1),
114
+ };
115
+ }
116
+ return null;
117
+ }
118
+ }
119
+ export class Alerts {
120
+ pushedAt = null;
121
+ bellPending = false;
122
+ startBell() {
123
+ if (this.bellPending || this.pushedRecently(BELL_GAP))
124
+ return false;
125
+ this.bellPending = true;
126
+ return true;
127
+ }
128
+ finishBell() {
129
+ if (!this.bellPending)
130
+ return false;
131
+ this.bellPending = false;
132
+ this.pushedAt = Date.now();
133
+ return true;
134
+ }
135
+ startNotification() {
136
+ this.bellPending = false;
137
+ if (this.pushedRecently(NOTIFICATION_GAP))
138
+ return false;
139
+ this.pushedAt = Date.now();
140
+ return true;
141
+ }
142
+ pushedRecently(gap) {
143
+ return this.pushedAt !== null && Date.now() - this.pushedAt < gap;
144
+ }
145
+ }