@cuongtran001/kanna 0.39.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 (473) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +355 -0
  3. package/bin/kanna +9 -0
  4. package/dist/client/apple-touch-icon.png +0 -0
  5. package/dist/client/assets/abap-BdImnpbu.js +1 -0
  6. package/dist/client/assets/actionscript-3-CoDkCxhg.js +1 -0
  7. package/dist/client/assets/ada-bCR0ucgS.js +1 -0
  8. package/dist/client/assets/andromeeda-C4gqWexZ.js +1 -0
  9. package/dist/client/assets/angular-html-CU67Zn6k.js +1 -0
  10. package/dist/client/assets/angular-ts-BwZT4LLn.js +1 -0
  11. package/dist/client/assets/apache-Pmp26Uib.js +1 -0
  12. package/dist/client/assets/apex-D8_7TLub.js +1 -0
  13. package/dist/client/assets/apl-dKokRX4l.js +1 -0
  14. package/dist/client/assets/applescript-Co6uUVPk.js +1 -0
  15. package/dist/client/assets/ara-BRHolxvo.js +1 -0
  16. package/dist/client/assets/asciidoc-Ve4PFQV2.js +1 -0
  17. package/dist/client/assets/asm-D_Q5rh1f.js +1 -0
  18. package/dist/client/assets/astro-CbQHKStN.js +1 -0
  19. package/dist/client/assets/aurora-x-D-2ljcwZ.js +1 -0
  20. package/dist/client/assets/awk-DMzUqQB5.js +1 -0
  21. package/dist/client/assets/ayu-dark-DYE7WIF3.js +1 -0
  22. package/dist/client/assets/ayu-light-BA47KaF1.js +1 -0
  23. package/dist/client/assets/ayu-mirage-32ctXXKs.js +1 -0
  24. package/dist/client/assets/ballerina-BFfxhgS-.js +1 -0
  25. package/dist/client/assets/bat-BkioyH1T.js +1 -0
  26. package/dist/client/assets/beancount-k_qm7-4y.js +1 -0
  27. package/dist/client/assets/berry-uYugtg8r.js +1 -0
  28. package/dist/client/assets/bibtex-CHM0blh-.js +1 -0
  29. package/dist/client/assets/bicep-Bmn6On1c.js +1 -0
  30. package/dist/client/assets/bird2-DPOp833l.js +1 -0
  31. package/dist/client/assets/blade-D4QpJJKB.js +1 -0
  32. package/dist/client/assets/bricolage-grotesque-latin-ext-wght-normal-CcLUaPy7.woff2 +0 -0
  33. package/dist/client/assets/bricolage-grotesque-latin-wght-normal-DLoelf7F.woff2 +0 -0
  34. package/dist/client/assets/bricolage-grotesque-vietnamese-wght-normal-BUzh504Q.woff2 +0 -0
  35. package/dist/client/assets/bsl-BO_Y6i37.js +1 -0
  36. package/dist/client/assets/c-BIGW1oBm.js +1 -0
  37. package/dist/client/assets/c3-eo99z4R2.js +1 -0
  38. package/dist/client/assets/cadence-Bv_4Rxtq.js +1 -0
  39. package/dist/client/assets/cairo-KRGpt6FW.js +1 -0
  40. package/dist/client/assets/catppuccin-frappe-DFWUc33u.js +1 -0
  41. package/dist/client/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
  42. package/dist/client/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
  43. package/dist/client/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
  44. package/dist/client/assets/clarity-D53aC0YG.js +1 -0
  45. package/dist/client/assets/clojure-P80f7IUj.js +1 -0
  46. package/dist/client/assets/cmake-D1j8_8rp.js +1 -0
  47. package/dist/client/assets/cobol-nwyudZeR.js +1 -0
  48. package/dist/client/assets/codeowners-Bp6g37R7.js +1 -0
  49. package/dist/client/assets/codeql-DsOJ9woJ.js +1 -0
  50. package/dist/client/assets/coffee-Ch7k5sss.js +1 -0
  51. package/dist/client/assets/common-lisp-Cg-RD9OK.js +1 -0
  52. package/dist/client/assets/coq-DkFqJrB1.js +1 -0
  53. package/dist/client/assets/cpp-CofmeUqb.js +1 -0
  54. package/dist/client/assets/crystal-tKQVLTB8.js +1 -0
  55. package/dist/client/assets/csharp-COcwbKMJ.js +1 -0
  56. package/dist/client/assets/css-DPfMkruS.js +1 -0
  57. package/dist/client/assets/csv-fuZLfV_i.js +1 -0
  58. package/dist/client/assets/cue-D82EKSYY.js +1 -0
  59. package/dist/client/assets/cypher-COkxafJQ.js +1 -0
  60. package/dist/client/assets/d-85-TOEBH.js +1 -0
  61. package/dist/client/assets/dark-plus-C3mMm8J8.js +1 -0
  62. package/dist/client/assets/dart-CF10PKvl.js +1 -0
  63. package/dist/client/assets/dax-CEL-wOlO.js +1 -0
  64. package/dist/client/assets/desktop-BmXAJ9_W.js +1 -0
  65. package/dist/client/assets/diff-D97Zzqfu.js +1 -0
  66. package/dist/client/assets/docker-BcOcwvcX.js +1 -0
  67. package/dist/client/assets/dotenv-Da5cRb03.js +1 -0
  68. package/dist/client/assets/dracula-BzJJZx-M.js +1 -0
  69. package/dist/client/assets/dracula-soft-BXkSAIEj.js +1 -0
  70. package/dist/client/assets/dream-maker-BtqSS_iP.js +1 -0
  71. package/dist/client/assets/edge-BkV0erSs.js +1 -0
  72. package/dist/client/assets/elixir-CDX3lj18.js +1 -0
  73. package/dist/client/assets/elm-DbKCFpqz.js +1 -0
  74. package/dist/client/assets/emacs-lisp-C9XAeP06.js +1 -0
  75. package/dist/client/assets/erb-B12qg9BL.js +1 -0
  76. package/dist/client/assets/erlang-DsQrWhSR.js +1 -0
  77. package/dist/client/assets/everforest-dark-BgDCqdQA.js +1 -0
  78. package/dist/client/assets/everforest-light-C8M2exoo.js +1 -0
  79. package/dist/client/assets/fennel-BYunw83y.js +1 -0
  80. package/dist/client/assets/fish-BvzEVeQv.js +1 -0
  81. package/dist/client/assets/fluent-C4IJs8-o.js +1 -0
  82. package/dist/client/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  83. package/dist/client/assets/fortran-free-form-BxgE0vQu.js +1 -0
  84. package/dist/client/assets/fsharp-CXgrBDvD.js +1 -0
  85. package/dist/client/assets/gdresource-BOOCDP_w.js +1 -0
  86. package/dist/client/assets/gdscript-C5YyOfLZ.js +1 -0
  87. package/dist/client/assets/gdshader-DkwncUOv.js +1 -0
  88. package/dist/client/assets/genie-D0YGMca9.js +1 -0
  89. package/dist/client/assets/gherkin-DyxjwDmM.js +1 -0
  90. package/dist/client/assets/git-commit-F4YmCXRG.js +1 -0
  91. package/dist/client/assets/git-rebase-r7XF79zn.js +1 -0
  92. package/dist/client/assets/github-dark-DHJKELXO.js +1 -0
  93. package/dist/client/assets/github-dark-default-Cuk6v7N8.js +1 -0
  94. package/dist/client/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  95. package/dist/client/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  96. package/dist/client/assets/github-light-DAi9KRSo.js +1 -0
  97. package/dist/client/assets/github-light-default-D7oLnXFd.js +1 -0
  98. package/dist/client/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  99. package/dist/client/assets/gleam-BspZqrRM.js +1 -0
  100. package/dist/client/assets/glimmer-js-Rg0-pVw9.js +1 -0
  101. package/dist/client/assets/glimmer-ts-U6CK756n.js +1 -0
  102. package/dist/client/assets/glsl-DplSGwfg.js +1 -0
  103. package/dist/client/assets/gn-n2N0HUVH.js +1 -0
  104. package/dist/client/assets/gnuplot-DdkO51Og.js +1 -0
  105. package/dist/client/assets/go-CxLEBnE3.js +1 -0
  106. package/dist/client/assets/graphql-ChdNCCLP.js +1 -0
  107. package/dist/client/assets/groovy-gcz8RCvz.js +1 -0
  108. package/dist/client/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  109. package/dist/client/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  110. package/dist/client/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  111. package/dist/client/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  112. package/dist/client/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  113. package/dist/client/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  114. package/dist/client/assets/hack-CaT9iCJl.js +1 -0
  115. package/dist/client/assets/haml-B8DHNrY2.js +1 -0
  116. package/dist/client/assets/handlebars-BL8al0AC.js +1 -0
  117. package/dist/client/assets/haskell-Df6bDoY_.js +1 -0
  118. package/dist/client/assets/haxe-CzTSHFRz.js +1 -0
  119. package/dist/client/assets/hcl-BWvSN4gD.js +1 -0
  120. package/dist/client/assets/hjson-D5-asLiD.js +1 -0
  121. package/dist/client/assets/hlsl-D3lLCCz7.js +1 -0
  122. package/dist/client/assets/horizon-BUw7H-hv.js +1 -0
  123. package/dist/client/assets/horizon-bright-Cn-bp-IR.js +1 -0
  124. package/dist/client/assets/houston-DnULxvSX.js +1 -0
  125. package/dist/client/assets/html-GMplVEZG.js +1 -0
  126. package/dist/client/assets/html-derivative-BFtXZ54Q.js +1 -0
  127. package/dist/client/assets/http-jrhK8wxY.js +1 -0
  128. package/dist/client/assets/hurl-irOxFIW8.js +1 -0
  129. package/dist/client/assets/hxml-Bvhsp5Yf.js +1 -0
  130. package/dist/client/assets/hy-DFXneXwc.js +1 -0
  131. package/dist/client/assets/imba-DGztddWO.js +1 -0
  132. package/dist/client/assets/index-Do7324M0.css +32 -0
  133. package/dist/client/assets/index-ktE9DLCD.js +2620 -0
  134. package/dist/client/assets/ini-BEwlwnbL.js +1 -0
  135. package/dist/client/assets/java-CylS5w8V.js +1 -0
  136. package/dist/client/assets/javascript-wDzz0qaB.js +1 -0
  137. package/dist/client/assets/jinja-4LBKfQ-Z.js +1 -0
  138. package/dist/client/assets/jison-wvAkD_A8.js +1 -0
  139. package/dist/client/assets/json-Cp-IABpG.js +1 -0
  140. package/dist/client/assets/json5-C9tS-k6U.js +1 -0
  141. package/dist/client/assets/jsonc-Des-eS-w.js +1 -0
  142. package/dist/client/assets/jsonl-DcaNXYhu.js +1 -0
  143. package/dist/client/assets/jsonnet-DFQXde-d.js +1 -0
  144. package/dist/client/assets/jssm-C2t-YnRu.js +1 -0
  145. package/dist/client/assets/jsx-g9-lgVsj.js +1 -0
  146. package/dist/client/assets/julia-CxzCAyBv.js +1 -0
  147. package/dist/client/assets/just-Cw27pwNe.js +1 -0
  148. package/dist/client/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
  149. package/dist/client/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
  150. package/dist/client/assets/kanagawa-wave-DWedfzmr.js +1 -0
  151. package/dist/client/assets/kdl-DV7GczEv.js +1 -0
  152. package/dist/client/assets/kotlin-BdnUsdx6.js +1 -0
  153. package/dist/client/assets/kusto-DZf3V79B.js +1 -0
  154. package/dist/client/assets/laserwave-DUszq2jm.js +1 -0
  155. package/dist/client/assets/latex-CWtU0Tv5.js +1 -0
  156. package/dist/client/assets/lean-BZvkOJ9d.js +1 -0
  157. package/dist/client/assets/less-B1dDrJ26.js +1 -0
  158. package/dist/client/assets/light-plus-B7mTdjB0.js +1 -0
  159. package/dist/client/assets/liquid-DYVedYrR.js +1 -0
  160. package/dist/client/assets/llvm-DjAJT7YJ.js +1 -0
  161. package/dist/client/assets/log-2UxHyX5q.js +1 -0
  162. package/dist/client/assets/logo-BtOb2qkB.js +1 -0
  163. package/dist/client/assets/lua-BaeVxFsk.js +1 -0
  164. package/dist/client/assets/luau-C-HG3fhB.js +1 -0
  165. package/dist/client/assets/make-CHLpvVh8.js +1 -0
  166. package/dist/client/assets/markdown-Cvjx9yec.js +1 -0
  167. package/dist/client/assets/marko-CnJfTvn9.js +1 -0
  168. package/dist/client/assets/material-theme-D5KoaKCx.js +1 -0
  169. package/dist/client/assets/material-theme-darker-BfHTSMKl.js +1 -0
  170. package/dist/client/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  171. package/dist/client/assets/material-theme-ocean-CyktbL80.js +1 -0
  172. package/dist/client/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  173. package/dist/client/assets/matlab-D7o27uSR.js +1 -0
  174. package/dist/client/assets/mdc-BMNejdWA.js +1 -0
  175. package/dist/client/assets/mdx-Cmh6b_Ma.js +1 -0
  176. package/dist/client/assets/mermaid-mWjccvbQ.js +1 -0
  177. package/dist/client/assets/min-dark-CafNBF8u.js +1 -0
  178. package/dist/client/assets/min-light-CTRr51gU.js +1 -0
  179. package/dist/client/assets/mipsasm-CKIfxQSi.js +1 -0
  180. package/dist/client/assets/mojo-rZm6bMo-.js +1 -0
  181. package/dist/client/assets/monokai-D4h5O-jR.js +1 -0
  182. package/dist/client/assets/moonbit-_H4v1dQx.js +1 -0
  183. package/dist/client/assets/move-IF9eRakj.js +1 -0
  184. package/dist/client/assets/narrat-DRg8JJMk.js +1 -0
  185. package/dist/client/assets/nextflow-Zz6hmt5N.js +1 -0
  186. package/dist/client/assets/nextflow-groovy-BeH2EWoN.js +1 -0
  187. package/dist/client/assets/nginx-BpAMiNFr.js +1 -0
  188. package/dist/client/assets/night-owl-C39BiMTA.js +1 -0
  189. package/dist/client/assets/night-owl-light-CMTm3GFP.js +1 -0
  190. package/dist/client/assets/nim-CVrawwO9.js +1 -0
  191. package/dist/client/assets/nix-CwoSXNpI.js +1 -0
  192. package/dist/client/assets/nord-Ddv68eIx.js +1 -0
  193. package/dist/client/assets/nushell-Cz2AlsmD.js +1 -0
  194. package/dist/client/assets/objective-c-DXmwc3jG.js +1 -0
  195. package/dist/client/assets/objective-cpp-CLxacb5B.js +1 -0
  196. package/dist/client/assets/ocaml-C0hk2d4L.js +1 -0
  197. package/dist/client/assets/odin-BBf5iR-q.js +1 -0
  198. package/dist/client/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  199. package/dist/client/assets/one-light-C3Wv6jpd.js +1 -0
  200. package/dist/client/assets/openscad-C4EeE6gA.js +1 -0
  201. package/dist/client/assets/pascal-D93ZcfNL.js +1 -0
  202. package/dist/client/assets/perl-C0TMdlhV.js +1 -0
  203. package/dist/client/assets/php-Dhbhpdrm.js +1 -0
  204. package/dist/client/assets/pierre-dark-DF2SEV7i.js +1 -0
  205. package/dist/client/assets/pierre-light-DOlZxES8.js +1 -0
  206. package/dist/client/assets/pkl-u5AG7uiY.js +1 -0
  207. package/dist/client/assets/plastic-3e1v2bzS.js +1 -0
  208. package/dist/client/assets/plsql-ChMvpjG-.js +1 -0
  209. package/dist/client/assets/po-BTJTHyun.js +1 -0
  210. package/dist/client/assets/poimandres-CS3Unz2-.js +1 -0
  211. package/dist/client/assets/polar-C0HS_06l.js +1 -0
  212. package/dist/client/assets/postcss-CXtECtnM.js +1 -0
  213. package/dist/client/assets/powerquery-CEu0bR-o.js +1 -0
  214. package/dist/client/assets/powershell-Dpen1YoG.js +1 -0
  215. package/dist/client/assets/prisma-Dd19v3D-.js +1 -0
  216. package/dist/client/assets/prolog-CbFg5uaA.js +1 -0
  217. package/dist/client/assets/proto-C7zT0LnQ.js +1 -0
  218. package/dist/client/assets/pug-CGlum2m_.js +1 -0
  219. package/dist/client/assets/puppet-BMWR74SV.js +1 -0
  220. package/dist/client/assets/purescript-CklMAg4u.js +1 -0
  221. package/dist/client/assets/python-B6aJPvgy.js +1 -0
  222. package/dist/client/assets/qml-3beO22l8.js +1 -0
  223. package/dist/client/assets/qmldir-C8lEn-DE.js +1 -0
  224. package/dist/client/assets/qss-IeuSbFQv.js +1 -0
  225. package/dist/client/assets/r-Dspwwk_N.js +1 -0
  226. package/dist/client/assets/racket-BqYA7rlc.js +1 -0
  227. package/dist/client/assets/raku-DXvB9xmW.js +1 -0
  228. package/dist/client/assets/razor-Uh8Bk_45.js +1 -0
  229. package/dist/client/assets/red-bN70gL4F.js +1 -0
  230. package/dist/client/assets/reg-C-SQnVFl.js +1 -0
  231. package/dist/client/assets/regexp-CDVJQ6XC.js +1 -0
  232. package/dist/client/assets/rel-C3B-1QV4.js +1 -0
  233. package/dist/client/assets/riscv-BM1_JUlF.js +1 -0
  234. package/dist/client/assets/ron-D8l8udqQ.js +1 -0
  235. package/dist/client/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
  236. package/dist/client/assets/rose-pine-moon-D4_iv3hh.js +1 -0
  237. package/dist/client/assets/rose-pine-qdsjHGoJ.js +1 -0
  238. package/dist/client/assets/rosmsg-BJDFO7_C.js +1 -0
  239. package/dist/client/assets/rst-BrH8l1NY.js +1 -0
  240. package/dist/client/assets/ruby-Dw2BHqvy.js +1 -0
  241. package/dist/client/assets/rust-B1yitclQ.js +1 -0
  242. package/dist/client/assets/sas-cz2c8ADy.js +1 -0
  243. package/dist/client/assets/sass-Cj5Yp3dK.js +1 -0
  244. package/dist/client/assets/scala-C151Ov-r.js +1 -0
  245. package/dist/client/assets/scheme-C98Dy4si.js +1 -0
  246. package/dist/client/assets/scss-OYdSNvt2.js +1 -0
  247. package/dist/client/assets/sdbl-DVxCFoDh.js +1 -0
  248. package/dist/client/assets/shaderlab-Dg9Lc6iA.js +1 -0
  249. package/dist/client/assets/shellscript-Yzrsuije.js +1 -0
  250. package/dist/client/assets/shellsession-BADoaaVG.js +1 -0
  251. package/dist/client/assets/slack-dark-BthQWCQV.js +1 -0
  252. package/dist/client/assets/slack-ochin-DqwNpetd.js +1 -0
  253. package/dist/client/assets/smalltalk-BERRCDM3.js +1 -0
  254. package/dist/client/assets/snazzy-light-Bw305WKR.js +1 -0
  255. package/dist/client/assets/solarized-dark-DXbdFlpD.js +1 -0
  256. package/dist/client/assets/solarized-light-L9t79GZl.js +1 -0
  257. package/dist/client/assets/solidity-rGO070M0.js +1 -0
  258. package/dist/client/assets/soy-Brmx7dQM.js +1 -0
  259. package/dist/client/assets/sparql-rVzFXLq3.js +1 -0
  260. package/dist/client/assets/splunk-BtCnVYZw.js +1 -0
  261. package/dist/client/assets/sql-BLtJtn59.js +1 -0
  262. package/dist/client/assets/ssh-config-_ykCGR6B.js +1 -0
  263. package/dist/client/assets/stata-BH5u7GGu.js +1 -0
  264. package/dist/client/assets/stylus-BEDo0Tqx.js +1 -0
  265. package/dist/client/assets/surrealql-Bq5Q-fJD.js +1 -0
  266. package/dist/client/assets/svelte-C_ipcX3V.js +1 -0
  267. package/dist/client/assets/swift-D82vCrfD.js +1 -0
  268. package/dist/client/assets/synthwave-84-CbfX1IO0.js +1 -0
  269. package/dist/client/assets/system-verilog-CnnmHF94.js +1 -0
  270. package/dist/client/assets/systemd-4A_iFExJ.js +1 -0
  271. package/dist/client/assets/talonscript-CkByrt1z.js +1 -0
  272. package/dist/client/assets/tasl-QIJgUcNo.js +1 -0
  273. package/dist/client/assets/tcl-dwOrl1Do.js +1 -0
  274. package/dist/client/assets/templ-P3uqSqPl.js +1 -0
  275. package/dist/client/assets/terraform-BETggiCN.js +1 -0
  276. package/dist/client/assets/tex-idrVyKtj.js +1 -0
  277. package/dist/client/assets/tokyo-night-hegEt444.js +1 -0
  278. package/dist/client/assets/toml-vGWfd6FD.js +1 -0
  279. package/dist/client/assets/ts-tags-zn1MmPIZ.js +1 -0
  280. package/dist/client/assets/tsv-B_m7g4N7.js +1 -0
  281. package/dist/client/assets/tsx-COt5Ahok.js +1 -0
  282. package/dist/client/assets/turtle-BsS91CYL.js +1 -0
  283. package/dist/client/assets/twig-DNn4PbVi.js +1 -0
  284. package/dist/client/assets/typescript-BPQ3VLAy.js +1 -0
  285. package/dist/client/assets/typespec-BGHnOYBU.js +1 -0
  286. package/dist/client/assets/typst-DHCkPAjA.js +1 -0
  287. package/dist/client/assets/v-BcVCzyr7.js +1 -0
  288. package/dist/client/assets/vala-CsfeWuGM.js +1 -0
  289. package/dist/client/assets/vb-D17OF-Vu.js +1 -0
  290. package/dist/client/assets/verilog-BQ8w6xss.js +1 -0
  291. package/dist/client/assets/vesper-DU1UobuO.js +1 -0
  292. package/dist/client/assets/vhdl-CeAyd5Ju.js +1 -0
  293. package/dist/client/assets/viml-CJc9bBzg.js +1 -0
  294. package/dist/client/assets/vitesse-black-Bkuqu6BP.js +1 -0
  295. package/dist/client/assets/vitesse-dark-D0r3Knsf.js +1 -0
  296. package/dist/client/assets/vitesse-light-CVO1_9PV.js +1 -0
  297. package/dist/client/assets/vue-DN_0RTcg.js +1 -0
  298. package/dist/client/assets/vue-html-AaS7Mt5G.js +1 -0
  299. package/dist/client/assets/vue-vine-CQOfvN7w.js +1 -0
  300. package/dist/client/assets/vyper-CDx5xZoG.js +1 -0
  301. package/dist/client/assets/wasm-CG6Dc4jp.js +1 -0
  302. package/dist/client/assets/wasm-MzD3tlZU.js +1 -0
  303. package/dist/client/assets/wenyan-BV7otONQ.js +1 -0
  304. package/dist/client/assets/wgsl-Dx-B1_4e.js +1 -0
  305. package/dist/client/assets/wikitext-BhOHFoWU.js +1 -0
  306. package/dist/client/assets/wit-5i3qLPDT.js +1 -0
  307. package/dist/client/assets/wolfram-lXgVvXCa.js +1 -0
  308. package/dist/client/assets/xml-sdJ4AIDG.js +1 -0
  309. package/dist/client/assets/xsl-CtQFsRM5.js +1 -0
  310. package/dist/client/assets/yaml-Buea-lGh.js +1 -0
  311. package/dist/client/assets/zenscript-DVFEvuxE.js +1 -0
  312. package/dist/client/assets/zig-VOosw3JB.js +1 -0
  313. package/dist/client/chat-sounds/Blow.mp3 +0 -0
  314. package/dist/client/chat-sounds/Bottle.mp3 +0 -0
  315. package/dist/client/chat-sounds/Frog.mp3 +0 -0
  316. package/dist/client/chat-sounds/Funk.mp3 +0 -0
  317. package/dist/client/chat-sounds/Glass.mp3 +0 -0
  318. package/dist/client/chat-sounds/Ping.mp3 +0 -0
  319. package/dist/client/chat-sounds/Pop.mp3 +0 -0
  320. package/dist/client/chat-sounds/Purr.mp3 +0 -0
  321. package/dist/client/chat-sounds/Tink.mp3 +0 -0
  322. package/dist/client/editor-icons/cursor.png +0 -0
  323. package/dist/client/editor-icons/custom.png +0 -0
  324. package/dist/client/editor-icons/default-app.png +0 -0
  325. package/dist/client/editor-icons/finder.png +0 -0
  326. package/dist/client/editor-icons/preview.png +0 -0
  327. package/dist/client/editor-icons/terminal.png +0 -0
  328. package/dist/client/editor-icons/windsurf.png +0 -0
  329. package/dist/client/editor-icons/xcode.png +0 -0
  330. package/dist/client/favicon.png +0 -0
  331. package/dist/client/fonts/body-medium.woff2 +0 -0
  332. package/dist/client/fonts/body-regular-italic.woff2 +0 -0
  333. package/dist/client/fonts/body-regular.woff2 +0 -0
  334. package/dist/client/fonts/body-semibold.woff2 +0 -0
  335. package/dist/client/icon-192.png +0 -0
  336. package/dist/client/icon-512.png +0 -0
  337. package/dist/client/icon-maskable-512.png +0 -0
  338. package/dist/client/icon.svg +4 -0
  339. package/dist/client/index.html +34 -0
  340. package/dist/client/manifest.webmanifest +46 -0
  341. package/dist/client/screenshot-light.png +0 -0
  342. package/dist/client/screenshot.png +0 -0
  343. package/dist/export-viewer/assets/bricolage-grotesque-latin-ext-wght-normal-CcLUaPy7.woff2 +0 -0
  344. package/dist/export-viewer/assets/bricolage-grotesque-latin-wght-normal-DLoelf7F.woff2 +0 -0
  345. package/dist/export-viewer/assets/bricolage-grotesque-vietnamese-wght-normal-BUzh504Q.woff2 +0 -0
  346. package/dist/export-viewer/assets/index-D1qUumZR.js +410 -0
  347. package/dist/export-viewer/assets/index-gG2nMW51.css +1 -0
  348. package/dist/export-viewer/editor-icons/cursor.png +0 -0
  349. package/dist/export-viewer/editor-icons/custom.png +0 -0
  350. package/dist/export-viewer/editor-icons/default-app.png +0 -0
  351. package/dist/export-viewer/editor-icons/finder.png +0 -0
  352. package/dist/export-viewer/editor-icons/preview.png +0 -0
  353. package/dist/export-viewer/editor-icons/terminal.png +0 -0
  354. package/dist/export-viewer/editor-icons/windsurf.png +0 -0
  355. package/dist/export-viewer/editor-icons/xcode.png +0 -0
  356. package/dist/export-viewer/fonts/body-medium.woff2 +0 -0
  357. package/dist/export-viewer/fonts/body-regular-italic.woff2 +0 -0
  358. package/dist/export-viewer/fonts/body-regular.woff2 +0 -0
  359. package/dist/export-viewer/fonts/body-semibold.woff2 +0 -0
  360. package/dist/export-viewer/index.html +14 -0
  361. package/package.json +99 -0
  362. package/src/server/__fixtures__/claude-session-empty.jsonl +0 -0
  363. package/src/server/__fixtures__/claude-session-malformed.jsonl +3 -0
  364. package/src/server/__fixtures__/claude-session-valid.jsonl +6 -0
  365. package/src/server/agent.test.ts +2369 -0
  366. package/src/server/agent.ts +1927 -0
  367. package/src/server/analytics.test.ts +313 -0
  368. package/src/server/analytics.ts +131 -0
  369. package/src/server/app-settings.test.ts +233 -0
  370. package/src/server/app-settings.ts +548 -0
  371. package/src/server/auth.test.ts +329 -0
  372. package/src/server/auth.ts +204 -0
  373. package/src/server/auto-continue/e2e.test.ts +215 -0
  374. package/src/server/auto-continue/events.test.ts +30 -0
  375. package/src/server/auto-continue/events.ts +35 -0
  376. package/src/server/auto-continue/limit-detector.test.ts +153 -0
  377. package/src/server/auto-continue/limit-detector.ts +159 -0
  378. package/src/server/auto-continue/read-model.test.ts +109 -0
  379. package/src/server/auto-continue/read-model.ts +83 -0
  380. package/src/server/auto-continue/schedule-manager.test.ts +155 -0
  381. package/src/server/auto-continue/schedule-manager.ts +116 -0
  382. package/src/server/claude-session-importer.test.ts +214 -0
  383. package/src/server/claude-session-importer.ts +187 -0
  384. package/src/server/claude-session-mapper.test.ts +88 -0
  385. package/src/server/claude-session-mapper.ts +106 -0
  386. package/src/server/claude-session-parser.test.ts +38 -0
  387. package/src/server/claude-session-parser.ts +67 -0
  388. package/src/server/claude-session-scanner.test.ts +49 -0
  389. package/src/server/claude-session-scanner.ts +24 -0
  390. package/src/server/claude-session-types.ts +61 -0
  391. package/src/server/cli-runtime.test.ts +523 -0
  392. package/src/server/cli-runtime.ts +405 -0
  393. package/src/server/cli-supervisor.ts +102 -0
  394. package/src/server/cli.ts +64 -0
  395. package/src/server/cloudflare-tunnel/agent-integration.test.ts +76 -0
  396. package/src/server/cloudflare-tunnel/agent-integration.ts +55 -0
  397. package/src/server/cloudflare-tunnel/detector.test.ts +72 -0
  398. package/src/server/cloudflare-tunnel/detector.ts +44 -0
  399. package/src/server/cloudflare-tunnel/e2e.test.ts +194 -0
  400. package/src/server/cloudflare-tunnel/events.test.ts +43 -0
  401. package/src/server/cloudflare-tunnel/events.ts +31 -0
  402. package/src/server/cloudflare-tunnel/gateway.ts +143 -0
  403. package/src/server/cloudflare-tunnel/lifecycle.test.ts +48 -0
  404. package/src/server/cloudflare-tunnel/lifecycle.ts +62 -0
  405. package/src/server/cloudflare-tunnel/read-model.test.ts +69 -0
  406. package/src/server/cloudflare-tunnel/read-model.ts +80 -0
  407. package/src/server/cloudflare-tunnel/tunnel-manager.test.ts +116 -0
  408. package/src/server/cloudflare-tunnel/tunnel-manager.ts +165 -0
  409. package/src/server/codex-app-server-protocol.ts +487 -0
  410. package/src/server/codex-app-server.test.ts +1816 -0
  411. package/src/server/codex-app-server.ts +1475 -0
  412. package/src/server/diff-store.test.ts +737 -0
  413. package/src/server/diff-store.ts +2199 -0
  414. package/src/server/discovery.test.ts +211 -0
  415. package/src/server/discovery.ts +301 -0
  416. package/src/server/event-store.test.ts +797 -0
  417. package/src/server/event-store.ts +1421 -0
  418. package/src/server/events.ts +217 -0
  419. package/src/server/external-open.test.ts +112 -0
  420. package/src/server/external-open.ts +345 -0
  421. package/src/server/generate-commit-message.test.ts +79 -0
  422. package/src/server/generate-commit-message.ts +126 -0
  423. package/src/server/generate-title.ts +76 -0
  424. package/src/server/harness-types.ts +19 -0
  425. package/src/server/keybindings.test.ts +144 -0
  426. package/src/server/keybindings.ts +178 -0
  427. package/src/server/llm-provider.test.ts +134 -0
  428. package/src/server/llm-provider.ts +207 -0
  429. package/src/server/machine-name.ts +22 -0
  430. package/src/server/paths-route.test.ts +64 -0
  431. package/src/server/paths.ts +35 -0
  432. package/src/server/process-utils.test.ts +12 -0
  433. package/src/server/process-utils.ts +47 -0
  434. package/src/server/project-paths.test.ts +95 -0
  435. package/src/server/project-paths.ts +191 -0
  436. package/src/server/provider-catalog.test.ts +69 -0
  437. package/src/server/provider-catalog.ts +87 -0
  438. package/src/server/quick-response.test.ts +440 -0
  439. package/src/server/quick-response.ts +300 -0
  440. package/src/server/read-models.test.ts +509 -0
  441. package/src/server/read-models.ts +230 -0
  442. package/src/server/restart.test.ts +27 -0
  443. package/src/server/restart.ts +30 -0
  444. package/src/server/server.ts +616 -0
  445. package/src/server/share.test.ts +180 -0
  446. package/src/server/share.ts +150 -0
  447. package/src/server/standalone-export.test.ts +224 -0
  448. package/src/server/standalone-export.ts +419 -0
  449. package/src/server/terminal-manager.test.ts +315 -0
  450. package/src/server/terminal-manager.ts +350 -0
  451. package/src/server/test-helpers/async-event-queue.ts +52 -0
  452. package/src/server/test-helpers/wait-for.ts +14 -0
  453. package/src/server/title-generation.live.test.ts +44 -0
  454. package/src/server/update-manager.test.ts +158 -0
  455. package/src/server/update-manager.ts +222 -0
  456. package/src/server/update-strategy.test.ts +237 -0
  457. package/src/server/update-strategy.ts +241 -0
  458. package/src/server/uploads.test.ts +292 -0
  459. package/src/server/uploads.ts +131 -0
  460. package/src/server/ws-router.test.ts +2292 -0
  461. package/src/server/ws-router.ts +1465 -0
  462. package/src/shared/analytics.ts +30 -0
  463. package/src/shared/branding.test.ts +31 -0
  464. package/src/shared/branding.ts +77 -0
  465. package/src/shared/dev-ports.test.ts +113 -0
  466. package/src/shared/dev-ports.ts +134 -0
  467. package/src/shared/ports.ts +2 -0
  468. package/src/shared/protocol.ts +257 -0
  469. package/src/shared/share.ts +27 -0
  470. package/src/shared/tools.test.ts +164 -0
  471. package/src/shared/tools.ts +327 -0
  472. package/src/shared/types.test.ts +25 -0
  473. package/src/shared/types.ts +1088 -0
@@ -0,0 +1,1088 @@
1
+ export const STORE_VERSION = 3 as const
2
+ export const PROTOCOL_VERSION = 1 as const
3
+
4
+ export type AgentProvider = "claude" | "codex"
5
+ export type LlmProviderKind = "openai" | "openrouter" | "custom"
6
+ export type AppThemePreference = "light" | "dark" | "system"
7
+ export type ChatSoundPreference = "never" | "unfocused" | "always"
8
+ export type ChatSoundId = "blow" | "bottle" | "frog" | "funk" | "glass" | "ping" | "pop" | "purr" | "tink"
9
+ export type DefaultProviderPreference = "last_used" | AgentProvider
10
+ export type EditorPreset = "cursor" | "vscode" | "xcode" | "windsurf" | "custom"
11
+ export const DEFAULT_OPENAI_SDK_MODEL = "gpt-5.4-mini"
12
+ export const DEFAULT_OPENROUTER_SDK_MODEL = "moonshotai/kimi-k2.5:nitro"
13
+
14
+ export type AttachmentKind = "image" | "file" | "mention"
15
+ export type StandaloneTranscriptAttachmentMode = "metadata" | "bundle"
16
+ export type StandaloneTranscriptTheme = "light" | "dark"
17
+
18
+ export interface ChatAttachment {
19
+ id: string
20
+ kind: AttachmentKind
21
+ displayName: string
22
+ absolutePath: string
23
+ relativePath: string
24
+ contentUrl: string
25
+ mimeType: string
26
+ size: number
27
+ }
28
+
29
+ export interface StandaloneTranscriptBundle {
30
+ version: 1
31
+ chatId: string
32
+ title: string
33
+ localPath: string
34
+ exportedAt: string
35
+ viewerVersion: string
36
+ theme: StandaloneTranscriptTheme
37
+ attachmentMode: StandaloneTranscriptAttachmentMode
38
+ messages: TranscriptEntry[]
39
+ }
40
+
41
+ export interface StandaloneTranscriptExportResult {
42
+ ok: true
43
+ outputDir: string
44
+ indexHtmlPath: string
45
+ transcriptJsonPath: string
46
+ attachmentMode: StandaloneTranscriptAttachmentMode
47
+ totalAttachmentCount: number
48
+ bundledAttachmentCount: number
49
+ shareSlug: string
50
+ shareUrl: string
51
+ uploadedFileCount: number
52
+ }
53
+
54
+ export interface StandaloneTranscriptExportFailureResult {
55
+ ok: false
56
+ error: string
57
+ outputDir: string
58
+ transcriptJsonPath: string
59
+ transcriptFileName: string
60
+ transcriptJson: string
61
+ shareSlug: string
62
+ shareUrl: string
63
+ }
64
+
65
+ export type StandaloneTranscriptExportCommandResult =
66
+ | StandaloneTranscriptExportResult
67
+ | StandaloneTranscriptExportFailureResult
68
+
69
+ export interface QueuedChatMessage {
70
+ id: string
71
+ content: string
72
+ attachments: ChatAttachment[]
73
+ createdAt: number
74
+ provider?: AgentProvider
75
+ model?: string
76
+ modelOptions?: ModelOptions
77
+ planMode?: boolean
78
+ autoContinue?: { scheduleId: string }
79
+ }
80
+
81
+ export interface InternalUserAttachmentsData {
82
+ userText: string
83
+ attachments: ChatAttachment[]
84
+ llmHintText: string
85
+ }
86
+
87
+ export interface ProviderModelOption {
88
+ id: string
89
+ label: string
90
+ supportsEffort: boolean
91
+ aliases?: readonly string[]
92
+ contextWindowOptions?: readonly ProviderContextWindowOption[]
93
+ supportsMaxReasoningEffort?: boolean
94
+ }
95
+
96
+ export interface ProviderEffortOption {
97
+ id: string
98
+ label: string
99
+ }
100
+
101
+ export interface ProviderContextWindowOption {
102
+ id: ClaudeContextWindow
103
+ label: string
104
+ }
105
+
106
+ export const CLAUDE_REASONING_OPTIONS = [
107
+ { id: "low", label: "Low" },
108
+ { id: "medium", label: "Medium" },
109
+ { id: "high", label: "High" },
110
+ { id: "max", label: "Max" },
111
+ ] as const satisfies readonly ProviderEffortOption[]
112
+
113
+ export const CODEX_REASONING_OPTIONS = [
114
+ { id: "minimal", label: "Minimal" },
115
+ { id: "low", label: "Low" },
116
+ { id: "medium", label: "Medium" },
117
+ { id: "high", label: "High" },
118
+ { id: "xhigh", label: "XHigh" },
119
+ ] as const satisfies readonly ProviderEffortOption[]
120
+
121
+ export type ClaudeReasoningEffort = (typeof CLAUDE_REASONING_OPTIONS)[number]["id"]
122
+ export type CodexReasoningEffort = (typeof CODEX_REASONING_OPTIONS)[number]["id"]
123
+ export type ClaudeContextWindow = "200k" | "1m"
124
+ export type ServiceTier = "fast"
125
+
126
+ export interface ClaudeModelOptions {
127
+ reasoningEffort: ClaudeReasoningEffort
128
+ contextWindow: ClaudeContextWindow
129
+ }
130
+
131
+ export interface CodexModelOptions {
132
+ reasoningEffort: CodexReasoningEffort
133
+ fastMode: boolean
134
+ }
135
+
136
+ export interface ProviderModelOptionsByProvider {
137
+ claude: ClaudeModelOptions
138
+ codex: CodexModelOptions
139
+ }
140
+
141
+ export interface ProviderPreference<TModelOptions> {
142
+ model: string
143
+ modelOptions: TModelOptions
144
+ planMode: boolean
145
+ }
146
+
147
+ export type ChatProviderPreferences = {
148
+ claude: ProviderPreference<ClaudeModelOptions>
149
+ codex: ProviderPreference<CodexModelOptions>
150
+ }
151
+
152
+ export type ModelOptions = Partial<{
153
+ [K in AgentProvider]: Partial<ProviderModelOptionsByProvider[K]>
154
+ }>
155
+
156
+ export const DEFAULT_CLAUDE_MODEL_OPTIONS = {
157
+ reasoningEffort: "high",
158
+ contextWindow: "200k",
159
+ } as const satisfies ClaudeModelOptions
160
+
161
+ export const DEFAULT_CODEX_MODEL_OPTIONS = {
162
+ reasoningEffort: "high",
163
+ fastMode: false,
164
+ } as const satisfies CodexModelOptions
165
+
166
+ export function isClaudeReasoningEffort(value: unknown): value is ClaudeReasoningEffort {
167
+ return CLAUDE_REASONING_OPTIONS.some((option) => option.id === value)
168
+ }
169
+
170
+ export function isCodexReasoningEffort(value: unknown): value is CodexReasoningEffort {
171
+ return CODEX_REASONING_OPTIONS.some((option) => option.id === value)
172
+ }
173
+
174
+ export const CLAUDE_CONTEXT_WINDOW_OPTIONS = [
175
+ { id: "200k", label: "200k" },
176
+ { id: "1m", label: "1M" },
177
+ ] as const satisfies readonly ProviderContextWindowOption[]
178
+
179
+ export function isClaudeContextWindow(value: unknown): value is ClaudeContextWindow {
180
+ return CLAUDE_CONTEXT_WINDOW_OPTIONS.some((option) => option.id === value)
181
+ }
182
+
183
+ export interface ProviderCatalogEntry {
184
+ id: AgentProvider
185
+ label: string
186
+ defaultModel: string
187
+ defaultEffort?: string
188
+ supportsPlanMode: boolean
189
+ models: ProviderModelOption[]
190
+ efforts: ProviderEffortOption[]
191
+ }
192
+
193
+ export const PROVIDERS: ProviderCatalogEntry[] = [
194
+ {
195
+ id: "claude",
196
+ label: "Claude",
197
+ defaultModel: "claude-sonnet-4-6",
198
+ defaultEffort: "high",
199
+ supportsPlanMode: true,
200
+ models: [
201
+ {
202
+ id: "claude-opus-4-7",
203
+ label: "Opus 4.7",
204
+ supportsEffort: true,
205
+ aliases: ["opus"],
206
+ contextWindowOptions: [...CLAUDE_CONTEXT_WINDOW_OPTIONS],
207
+ supportsMaxReasoningEffort: true,
208
+ },
209
+ {
210
+ id: "claude-sonnet-4-6",
211
+ label: "Sonnet 4.6",
212
+ supportsEffort: true,
213
+ aliases: ["sonnet"],
214
+ contextWindowOptions: [...CLAUDE_CONTEXT_WINDOW_OPTIONS],
215
+ },
216
+ {
217
+ id: "claude-haiku-4-5-20251001",
218
+ label: "Haiku 4.5",
219
+ supportsEffort: true,
220
+ aliases: ["haiku"],
221
+ },
222
+ ],
223
+ efforts: [...CLAUDE_REASONING_OPTIONS],
224
+ },
225
+ {
226
+ id: "codex",
227
+ label: "Codex",
228
+ defaultModel: "gpt-5.5",
229
+ supportsPlanMode: true,
230
+ models: [
231
+ { id: "gpt-5.5", label: "GPT-5.5", supportsEffort: false },
232
+ { id: "gpt-5.4", label: "GPT-5.4", supportsEffort: false },
233
+ { id: "gpt-5.3-codex", label: "GPT-5.3 Codex", supportsEffort: false, aliases: ["gpt-5-codex"] },
234
+ { id: "gpt-5.3-codex-spark", label: "GPT-5.3 Codex Spark", supportsEffort: false },
235
+ ],
236
+ efforts: [],
237
+ },
238
+ ]
239
+
240
+ export function getProviderCatalog(provider: AgentProvider): ProviderCatalogEntry {
241
+ const entry = PROVIDERS.find((candidate) => candidate.id === provider)
242
+ if (!entry) {
243
+ throw new Error(`Unknown provider: ${provider}`)
244
+ }
245
+ return entry
246
+ }
247
+
248
+ function getProviderModelMatch(provider: AgentProvider, modelId?: string): ProviderModelOption | undefined {
249
+ if (!modelId) return undefined
250
+
251
+ return getProviderCatalog(provider).models.find((candidate) =>
252
+ candidate.id === modelId || candidate.aliases?.includes(modelId)
253
+ )
254
+ }
255
+
256
+ export function normalizeProviderModelId(
257
+ provider: AgentProvider,
258
+ modelId?: string,
259
+ fallbackModelId?: string
260
+ ): string {
261
+ return getProviderModelMatch(provider, modelId)?.id
262
+ ?? fallbackModelId
263
+ ?? getProviderCatalog(provider).defaultModel
264
+ }
265
+
266
+ export function normalizeClaudeModelId(modelId?: string, fallbackModelId = "claude-opus-4-7"): string {
267
+ return normalizeProviderModelId("claude", modelId, fallbackModelId)
268
+ }
269
+
270
+ export function normalizeCodexModelId(modelId?: string, fallbackModelId = "gpt-5.5"): string {
271
+ return normalizeProviderModelId("codex", modelId, fallbackModelId)
272
+ }
273
+
274
+ export function getProviderModelOption(provider: AgentProvider, modelId: string): ProviderModelOption | undefined {
275
+ const normalizedModelId = normalizeProviderModelId(provider, modelId)
276
+ return getProviderCatalog(provider).models.find((candidate) => candidate.id === normalizedModelId)
277
+ }
278
+
279
+ export function getClaudeModelOption(modelId: string): ProviderModelOption | undefined {
280
+ return getProviderModelOption("claude", modelId)
281
+ }
282
+
283
+ export function supportsClaudeMaxReasoningEffort(modelId: string): boolean {
284
+ return Boolean(getClaudeModelOption(modelId)?.supportsMaxReasoningEffort)
285
+ }
286
+
287
+ export function getClaudeContextWindowOptions(modelId: string): readonly ProviderContextWindowOption[] {
288
+ return getClaudeModelOption(modelId)?.contextWindowOptions ?? []
289
+ }
290
+
291
+ export function normalizeClaudeContextWindow(modelId: string, contextWindow?: unknown): ClaudeContextWindow {
292
+ const options = getClaudeContextWindowOptions(modelId)
293
+ if (options.length === 0) return DEFAULT_CLAUDE_MODEL_OPTIONS.contextWindow
294
+ return options.some((option) => option.id === contextWindow)
295
+ ? contextWindow as ClaudeContextWindow
296
+ : DEFAULT_CLAUDE_MODEL_OPTIONS.contextWindow
297
+ }
298
+
299
+ export function resolveClaudeApiModelId(modelId: string, contextWindow?: ClaudeContextWindow): string {
300
+ return contextWindow === "1m" ? `${modelId}[1m]` : modelId
301
+ }
302
+
303
+ export function resolveClaudeContextWindowTokens(contextWindow: ClaudeContextWindow): number {
304
+ switch (contextWindow) {
305
+ case "1m":
306
+ return 1_000_000
307
+ case "200k":
308
+ default:
309
+ return 200_000
310
+ }
311
+ }
312
+
313
+ export type KannaStatus =
314
+ | "idle"
315
+ | "starting"
316
+ | "running"
317
+ | "waiting_for_user"
318
+ | "failed"
319
+
320
+ export interface ProjectSummary {
321
+ id: string
322
+ localPath: string
323
+ title: string
324
+ createdAt: number
325
+ updatedAt: number
326
+ }
327
+
328
+ export interface SidebarChatRow {
329
+ _id: string
330
+ _creationTime: number
331
+ chatId: string
332
+ title: string
333
+ status: KannaStatus
334
+ unread: boolean
335
+ localPath: string
336
+ provider: AgentProvider | null
337
+ lastMessageAt?: number
338
+ hasAutomation: boolean
339
+ canFork?: boolean
340
+ }
341
+
342
+ export interface SidebarProjectGroup {
343
+ groupKey: string
344
+ localPath: string
345
+ chats: SidebarChatRow[]
346
+ previewChats: SidebarChatRow[]
347
+ olderChats: SidebarChatRow[]
348
+ archivedChats?: SidebarChatRow[]
349
+ defaultCollapsed: boolean
350
+ }
351
+
352
+ export interface SidebarData {
353
+ projectGroups: SidebarProjectGroup[]
354
+ }
355
+
356
+ export interface LocalProjectSummary {
357
+ localPath: string
358
+ title: string
359
+ source: "saved" | "discovered"
360
+ lastOpenedAt?: number
361
+ chatCount: number
362
+ }
363
+
364
+ export interface LocalProjectsSnapshot {
365
+ machine: {
366
+ id: "local"
367
+ displayName: string
368
+ platform: NodeJS.Platform
369
+ }
370
+ projects: LocalProjectSummary[]
371
+ }
372
+
373
+ export interface AppSettingsSnapshot {
374
+ analyticsEnabled: boolean
375
+ browserSettingsMigrated: boolean
376
+ theme: AppThemePreference
377
+ chatSoundPreference: ChatSoundPreference
378
+ chatSoundId: ChatSoundId
379
+ terminal: {
380
+ scrollbackLines: number
381
+ minColumnWidth: number
382
+ }
383
+ editor: {
384
+ preset: EditorPreset
385
+ commandTemplate: string
386
+ }
387
+ defaultProvider: DefaultProviderPreference
388
+ providerDefaults: ChatProviderPreferences
389
+ warning: string | null
390
+ filePathDisplay: string
391
+ cloudflareTunnel: CloudflareTunnelSettings
392
+ }
393
+
394
+ export interface AppSettingsPatch {
395
+ analyticsEnabled?: boolean
396
+ browserSettingsMigrated?: boolean
397
+ theme?: AppThemePreference
398
+ chatSoundPreference?: ChatSoundPreference
399
+ chatSoundId?: ChatSoundId
400
+ terminal?: Partial<AppSettingsSnapshot["terminal"]>
401
+ editor?: Partial<AppSettingsSnapshot["editor"]>
402
+ defaultProvider?: DefaultProviderPreference
403
+ providerDefaults?: {
404
+ claude?: Partial<ProviderPreference<ClaudeModelOptions>>
405
+ codex?: Partial<ProviderPreference<CodexModelOptions>>
406
+ }
407
+ cloudflareTunnel?: Partial<CloudflareTunnelSettings>
408
+ }
409
+
410
+ export interface LlmProviderFile {
411
+ provider?: LlmProviderKind
412
+ apiKey?: string
413
+ model?: string
414
+ baseUrl?: string | null
415
+ }
416
+
417
+ export interface LlmProviderSnapshot {
418
+ provider: LlmProviderKind
419
+ apiKey: string
420
+ model: string
421
+ baseUrl: string
422
+ resolvedBaseUrl: string
423
+ enabled: boolean
424
+ warning: string | null
425
+ filePathDisplay: string
426
+ }
427
+
428
+ export interface LlmProviderValidationResult {
429
+ ok: boolean
430
+ error: unknown | null
431
+ }
432
+
433
+ export type UpdateStatus =
434
+ | "idle"
435
+ | "checking"
436
+ | "available"
437
+ | "up_to_date"
438
+ | "updating"
439
+ | "restart_pending"
440
+ | "error"
441
+
442
+ export interface UpdateSnapshot {
443
+ currentVersion: string
444
+ latestVersion: string | null
445
+ status: UpdateStatus
446
+ updateAvailable: boolean
447
+ lastCheckedAt: number | null
448
+ error: string | null
449
+ installAction: "restart" | "reload"
450
+ reloadRequestedAt: number | null
451
+ }
452
+
453
+ export type UpdateInstallErrorCode =
454
+ | "version_not_live_yet"
455
+ | "install_failed"
456
+ | "command_missing"
457
+
458
+ export interface UpdateInstallResult {
459
+ ok: boolean
460
+ action: "restart" | "reload"
461
+ errorCode: UpdateInstallErrorCode | null
462
+ userTitle: string | null
463
+ userMessage: string | null
464
+ }
465
+
466
+ export type KeybindingAction =
467
+ | "toggleEmbeddedTerminal"
468
+ | "toggleRightSidebar"
469
+ | "openInFinder"
470
+ | "openInEditor"
471
+ | "addSplitTerminal"
472
+ | "jumpToSidebarChat"
473
+ | "createChatInCurrentProject"
474
+ | "openAddProject"
475
+
476
+ export const DEFAULT_KEYBINDINGS: Record<KeybindingAction, string[]> = {
477
+ toggleEmbeddedTerminal: ["cmd+j", "ctrl+`"],
478
+ toggleRightSidebar: ["cmd+b", "ctrl+b"],
479
+ openInFinder: ["cmd+alt+f", "ctrl+alt+f"],
480
+ openInEditor: ["cmd+shift+o", "ctrl+shift+o"],
481
+ addSplitTerminal: ["cmd+/", "ctrl+/"],
482
+ jumpToSidebarChat: ["cmd+alt"],
483
+ createChatInCurrentProject: ["cmd+alt+n"],
484
+ openAddProject: ["cmd+alt+o"],
485
+ }
486
+
487
+ export interface KeybindingsSnapshot {
488
+ bindings: Record<KeybindingAction, string[]>
489
+ warning: string | null
490
+ filePathDisplay: string
491
+ }
492
+
493
+ export interface McpServerInfo {
494
+ name: string
495
+ status: string
496
+ error?: string
497
+ }
498
+
499
+ export interface AccountInfo {
500
+ email?: string
501
+ organization?: string
502
+ subscriptionType?: string
503
+ tokenSource?: string
504
+ apiKeySource?: string
505
+ }
506
+
507
+ export interface AskUserQuestionOption {
508
+ label: string
509
+ description?: string
510
+ }
511
+
512
+ export interface AskUserQuestionItem {
513
+ id?: string
514
+ question: string
515
+ header?: string
516
+ options?: AskUserQuestionOption[]
517
+ multiSelect?: boolean
518
+ }
519
+
520
+ export type AskUserQuestionAnswerMap = Record<string, string[]>
521
+
522
+ export interface TodoItem {
523
+ content: string
524
+ status: "pending" | "in_progress" | "completed"
525
+ activeForm: string
526
+ }
527
+
528
+ interface TranscriptEntryBase {
529
+ _id: string
530
+ messageId?: string
531
+ createdAt: number
532
+ hidden?: boolean
533
+ debugRaw?: string
534
+ }
535
+
536
+ interface ToolCallBase<TKind extends string, TInput> {
537
+ kind: "tool"
538
+ toolKind: TKind
539
+ toolName: string
540
+ toolId: string
541
+ input: TInput
542
+ rawInput?: Record<string, unknown>
543
+ }
544
+
545
+ export interface AskUserQuestionToolCall
546
+ extends ToolCallBase<"ask_user_question", { questions: AskUserQuestionItem[] }> { }
547
+
548
+ export interface ExitPlanModeToolCall
549
+ extends ToolCallBase<"exit_plan_mode", { plan?: string; summary?: string }> { }
550
+
551
+ export interface TodoWriteToolCall
552
+ extends ToolCallBase<"todo_write", { todos: TodoItem[] }> { }
553
+
554
+ export interface SkillToolCall
555
+ extends ToolCallBase<"skill", { skill: string }> { }
556
+
557
+ export interface GlobToolCall
558
+ extends ToolCallBase<"glob", { pattern: string }> { }
559
+
560
+ export interface GrepToolCall
561
+ extends ToolCallBase<"grep", { pattern: string; outputMode?: string }> { }
562
+
563
+ export interface BashToolCall
564
+ extends ToolCallBase<"bash", { command: string; description?: string; timeoutMs?: number; runInBackground?: boolean }> { }
565
+
566
+ export interface WebSearchToolCall
567
+ extends ToolCallBase<"web_search", { query: string }> { }
568
+
569
+ export interface ReadFileToolCall
570
+ extends ToolCallBase<"read_file", { filePath: string }> { }
571
+
572
+ export interface WriteFileToolCall
573
+ extends ToolCallBase<"write_file", { filePath: string; content: string }> { }
574
+
575
+ export interface EditFileToolCall
576
+ extends ToolCallBase<"edit_file", { filePath: string; oldString: string; newString: string }> { }
577
+
578
+ export interface DeleteFileToolCall
579
+ extends ToolCallBase<"delete_file", { filePath: string; content: string }> { }
580
+
581
+ export interface SubagentTaskToolCall
582
+ extends ToolCallBase<"subagent_task", { subagentType?: string }> { }
583
+
584
+ export interface McpGenericToolCall
585
+ extends ToolCallBase<"mcp_generic", { server: string; tool: string; payload: Record<string, unknown> }> { }
586
+
587
+ export interface UnknownToolCall
588
+ extends ToolCallBase<"unknown_tool", { payload: Record<string, unknown> }> { }
589
+
590
+ export type NormalizedToolCall =
591
+ | AskUserQuestionToolCall
592
+ | ExitPlanModeToolCall
593
+ | TodoWriteToolCall
594
+ | SkillToolCall
595
+ | GlobToolCall
596
+ | GrepToolCall
597
+ | BashToolCall
598
+ | WebSearchToolCall
599
+ | ReadFileToolCall
600
+ | WriteFileToolCall
601
+ | EditFileToolCall
602
+ | DeleteFileToolCall
603
+ | SubagentTaskToolCall
604
+ | McpGenericToolCall
605
+ | UnknownToolCall
606
+
607
+ export interface ToolResultEntry extends TranscriptEntryBase {
608
+ kind: "tool_result"
609
+ toolId: string
610
+ content: unknown
611
+ isError?: boolean
612
+ }
613
+
614
+ export interface UserPromptEntry extends TranscriptEntryBase {
615
+ kind: "user_prompt"
616
+ content: string
617
+ attachments?: ChatAttachment[]
618
+ steered?: boolean
619
+ autoContinue?: { scheduleId: string }
620
+ }
621
+
622
+ export interface SystemInitEntry extends TranscriptEntryBase {
623
+ kind: "system_init"
624
+ provider: AgentProvider
625
+ model: string
626
+ tools: string[]
627
+ agents: string[]
628
+ slashCommands: string[]
629
+ mcpServers: McpServerInfo[]
630
+ }
631
+
632
+ export interface AccountInfoEntry extends TranscriptEntryBase {
633
+ kind: "account_info"
634
+ accountInfo: AccountInfo
635
+ }
636
+
637
+ export interface AssistantTextEntry extends TranscriptEntryBase {
638
+ kind: "assistant_text"
639
+ text: string
640
+ }
641
+
642
+ export interface ToolCallEntry extends TranscriptEntryBase {
643
+ kind: "tool_call"
644
+ tool: NormalizedToolCall
645
+ }
646
+
647
+ export interface ResultEntry extends TranscriptEntryBase {
648
+ kind: "result"
649
+ subtype: "success" | "error" | "cancelled"
650
+ isError: boolean
651
+ durationMs: number
652
+ result: string
653
+ costUsd?: number
654
+ }
655
+
656
+ export interface StatusEntry extends TranscriptEntryBase {
657
+ kind: "status"
658
+ status: string
659
+ }
660
+
661
+ export interface ContextWindowUsageSnapshot {
662
+ usedTokens: number
663
+ totalProcessedTokens?: number
664
+ maxTokens?: number
665
+ inputTokens?: number
666
+ cachedInputTokens?: number
667
+ outputTokens?: number
668
+ reasoningOutputTokens?: number
669
+ lastUsedTokens?: number
670
+ lastInputTokens?: number
671
+ lastCachedInputTokens?: number
672
+ lastOutputTokens?: number
673
+ lastReasoningOutputTokens?: number
674
+ toolUses?: number
675
+ durationMs?: number
676
+ compactsAutomatically: boolean
677
+ }
678
+
679
+ export interface ChatDiffFile {
680
+ path: string
681
+ changeType: "added" | "deleted" | "modified" | "renamed"
682
+ isUntracked: boolean
683
+ additions: number
684
+ deletions: number
685
+ patchDigest: string
686
+ mimeType?: string
687
+ size?: number
688
+ }
689
+
690
+ export interface ChatBranchHistoryEntry {
691
+ sha: string
692
+ summary: string
693
+ description: string
694
+ authorName?: string
695
+ authoredAt: string
696
+ tags: string[]
697
+ githubUrl?: string
698
+ }
699
+
700
+ export interface ChatBranchHistorySnapshot {
701
+ entries: ChatBranchHistoryEntry[]
702
+ }
703
+
704
+ export type ChatBranchListEntryKind = "local" | "remote" | "pull_request"
705
+
706
+ export interface ChatBranchListEntry {
707
+ id: string
708
+ kind: ChatBranchListEntryKind
709
+ name: string
710
+ displayName: string
711
+ updatedAt?: string
712
+ description?: string
713
+ remoteRef?: string
714
+ prNumber?: number
715
+ prTitle?: string
716
+ headRefName?: string
717
+ headLabel?: string
718
+ headRepoCloneUrl?: string
719
+ isCrossRepository?: boolean
720
+ }
721
+
722
+ export interface ChatBranchListResult {
723
+ currentBranchName?: string
724
+ defaultBranchName?: string
725
+ recent: ChatBranchListEntry[]
726
+ local: ChatBranchListEntry[]
727
+ remote: ChatBranchListEntry[]
728
+ pullRequests: ChatBranchListEntry[]
729
+ pullRequestsStatus: "available" | "unavailable" | "error"
730
+ pullRequestsError?: string
731
+ }
732
+
733
+ export interface GitHubPublishInfo {
734
+ ghInstalled: boolean
735
+ authenticated: boolean
736
+ activeAccountLogin?: string
737
+ owners: string[]
738
+ suggestedRepoName: string
739
+ }
740
+
741
+ export interface GitHubRepoAvailabilityResult {
742
+ available: boolean
743
+ message: string
744
+ }
745
+
746
+ export interface BranchMetadata {
747
+ branchName?: string
748
+ defaultBranchName?: string
749
+ hasOriginRemote?: boolean
750
+ originRepoSlug?: string
751
+ hasUpstream?: boolean
752
+ }
753
+
754
+ export interface UpstreamStatus {
755
+ aheadCount?: number
756
+ behindCount?: number
757
+ lastFetchedAt?: string
758
+ }
759
+
760
+ export interface ChatDiffSnapshot extends BranchMetadata, UpstreamStatus {
761
+ status: "unknown" | "ready" | "no_repo"
762
+ files: ChatDiffFile[]
763
+ branchHistory?: ChatBranchHistorySnapshot
764
+ }
765
+
766
+ export interface BranchActionSuccess {
767
+ ok: true
768
+ branchName?: string
769
+ snapshotChanged: boolean
770
+ }
771
+
772
+ export interface BranchActionFailure {
773
+ ok: false
774
+ title: string
775
+ message: string
776
+ detail?: string
777
+ cancelled?: boolean
778
+ snapshotChanged?: boolean
779
+ }
780
+
781
+ export type ChatSyncSuccess = BranchActionSuccess & {
782
+ action: "fetch" | "pull" | "push" | "publish"
783
+ aheadCount?: number
784
+ behindCount?: number
785
+ }
786
+
787
+ export type ChatSyncFailure = BranchActionFailure & {
788
+ action: "fetch" | "pull" | "push" | "publish"
789
+ }
790
+
791
+ export type ChatSyncResult = ChatSyncSuccess | ChatSyncFailure
792
+
793
+ export type DiffCommitMode = "commit_and_push" | "commit_only"
794
+
795
+ export type ChatCheckoutBranchSuccess = BranchActionSuccess
796
+ export type ChatCheckoutBranchFailure = BranchActionFailure
797
+ export type ChatCheckoutBranchResult = ChatCheckoutBranchSuccess | ChatCheckoutBranchFailure
798
+
799
+ export type ChatCreateBranchSuccess = BranchActionSuccess & { branchName: string }
800
+ export type ChatCreateBranchFailure = BranchActionFailure
801
+ export type ChatCreateBranchResult = ChatCreateBranchSuccess | ChatCreateBranchFailure
802
+
803
+ export type ChatMergePreviewStatus = "up_to_date" | "mergeable" | "conflicts" | "error"
804
+
805
+ export interface ChatMergePreviewResult {
806
+ currentBranchName?: string
807
+ targetBranchName: string
808
+ targetDisplayName: string
809
+ status: ChatMergePreviewStatus
810
+ commitCount: number
811
+ hasConflicts: boolean
812
+ message: string
813
+ detail?: string
814
+ }
815
+
816
+ export type ChatMergeBranchSuccess = BranchActionSuccess
817
+ export type ChatMergeBranchFailure = BranchActionFailure
818
+ export type ChatMergeBranchResult = ChatMergeBranchSuccess | ChatMergeBranchFailure
819
+
820
+ export type DiffCommitSuccess = BranchActionSuccess & {
821
+ mode: DiffCommitMode
822
+ pushed: boolean
823
+ }
824
+
825
+ export type DiffCommitFailure = BranchActionFailure & {
826
+ mode: DiffCommitMode
827
+ phase: "commit" | "push"
828
+ localCommitCreated?: boolean
829
+ }
830
+
831
+ export type DiffCommitResult = DiffCommitSuccess | DiffCommitFailure
832
+
833
+ export interface ContextWindowUpdatedEntry extends TranscriptEntryBase {
834
+ kind: "context_window_updated"
835
+ usage: ContextWindowUsageSnapshot
836
+ }
837
+
838
+ export interface CompactBoundaryEntry extends TranscriptEntryBase {
839
+ kind: "compact_boundary"
840
+ }
841
+
842
+ export interface CompactSummaryEntry extends TranscriptEntryBase {
843
+ kind: "compact_summary"
844
+ summary: string
845
+ }
846
+
847
+ export interface ContextClearedEntry extends TranscriptEntryBase {
848
+ kind: "context_cleared"
849
+ }
850
+
851
+ export interface InterruptedEntry extends TranscriptEntryBase {
852
+ kind: "interrupted"
853
+ }
854
+
855
+ export type TranscriptEntry =
856
+ | UserPromptEntry
857
+ | SystemInitEntry
858
+ | AccountInfoEntry
859
+ | AssistantTextEntry
860
+ | ToolCallEntry
861
+ | ToolResultEntry
862
+ | ResultEntry
863
+ | StatusEntry
864
+ | ContextWindowUpdatedEntry
865
+ | CompactBoundaryEntry
866
+ | CompactSummaryEntry
867
+ | ContextClearedEntry
868
+ | InterruptedEntry
869
+ | AutoContinuePromptEntry
870
+
871
+ export interface HydratedToolCallBase<TKind extends string, TInput, TResult> {
872
+ id: string
873
+ messageId?: string
874
+ hidden?: boolean
875
+ kind: "tool"
876
+ toolKind: TKind
877
+ toolName: string
878
+ toolId: string
879
+ input: TInput
880
+ result?: TResult
881
+ rawResult?: unknown
882
+ isError?: boolean
883
+ timestamp: string
884
+ }
885
+
886
+ export interface AskUserQuestionToolResult {
887
+ answers: AskUserQuestionAnswerMap
888
+ discarded?: boolean
889
+ }
890
+
891
+ export interface ExitPlanModeToolResult {
892
+ confirmed?: boolean
893
+ clearContext?: boolean
894
+ message?: string
895
+ discarded?: boolean
896
+ }
897
+
898
+ export type HydratedAskUserQuestionToolCall =
899
+ HydratedToolCallBase<"ask_user_question", AskUserQuestionToolCall["input"], AskUserQuestionToolResult>
900
+
901
+ export type HydratedExitPlanModeToolCall =
902
+ HydratedToolCallBase<"exit_plan_mode", ExitPlanModeToolCall["input"], ExitPlanModeToolResult>
903
+
904
+ export type HydratedTodoWriteToolCall =
905
+ HydratedToolCallBase<"todo_write", TodoWriteToolCall["input"], unknown>
906
+
907
+ export type HydratedSkillToolCall =
908
+ HydratedToolCallBase<"skill", SkillToolCall["input"], unknown>
909
+
910
+ export type HydratedGlobToolCall =
911
+ HydratedToolCallBase<"glob", GlobToolCall["input"], unknown>
912
+
913
+ export type HydratedGrepToolCall =
914
+ HydratedToolCallBase<"grep", GrepToolCall["input"], unknown>
915
+
916
+ export type HydratedBashToolCall =
917
+ HydratedToolCallBase<"bash", BashToolCall["input"], unknown>
918
+
919
+ export type HydratedWebSearchToolCall =
920
+ HydratedToolCallBase<"web_search", WebSearchToolCall["input"], unknown>
921
+
922
+ export interface ReadFileTextBlock {
923
+ type: "text"
924
+ text: string
925
+ }
926
+
927
+ export interface ReadFileImageBlock {
928
+ type: "image"
929
+ data: string
930
+ mimeType?: string
931
+ }
932
+
933
+ export interface ReadFileToolResult {
934
+ content: string
935
+ blocks?: Array<ReadFileTextBlock | ReadFileImageBlock>
936
+ }
937
+
938
+ export type HydratedReadFileToolCall =
939
+ HydratedToolCallBase<"read_file", ReadFileToolCall["input"], ReadFileToolResult | string>
940
+
941
+ export type HydratedWriteFileToolCall =
942
+ HydratedToolCallBase<"write_file", WriteFileToolCall["input"], unknown>
943
+
944
+ export type HydratedEditFileToolCall =
945
+ HydratedToolCallBase<"edit_file", EditFileToolCall["input"], unknown>
946
+
947
+ export type HydratedDeleteFileToolCall =
948
+ HydratedToolCallBase<"delete_file", DeleteFileToolCall["input"], unknown>
949
+
950
+ export type HydratedSubagentTaskToolCall =
951
+ HydratedToolCallBase<"subagent_task", SubagentTaskToolCall["input"], unknown>
952
+
953
+ export type HydratedMcpGenericToolCall =
954
+ HydratedToolCallBase<"mcp_generic", McpGenericToolCall["input"], unknown>
955
+
956
+ export type HydratedUnknownToolCall =
957
+ HydratedToolCallBase<"unknown_tool", UnknownToolCall["input"], unknown>
958
+
959
+ export type HydratedToolCall =
960
+ | HydratedAskUserQuestionToolCall
961
+ | HydratedExitPlanModeToolCall
962
+ | HydratedTodoWriteToolCall
963
+ | HydratedSkillToolCall
964
+ | HydratedGlobToolCall
965
+ | HydratedGrepToolCall
966
+ | HydratedBashToolCall
967
+ | HydratedWebSearchToolCall
968
+ | HydratedReadFileToolCall
969
+ | HydratedWriteFileToolCall
970
+ | HydratedEditFileToolCall
971
+ | HydratedDeleteFileToolCall
972
+ | HydratedSubagentTaskToolCall
973
+ | HydratedMcpGenericToolCall
974
+ | HydratedUnknownToolCall
975
+
976
+ export type HydratedTranscriptMessage =
977
+ | ({ kind: "user_prompt"; content: string; attachments?: ChatAttachment[]; steered?: boolean; autoContinue?: { scheduleId: string }; id: string; messageId?: string; timestamp: string; hidden?: boolean })
978
+ | ({ kind: "system_init"; model: string; tools: string[]; agents: string[]; slashCommands: string[]; mcpServers: McpServerInfo[]; provider: AgentProvider; id: string; messageId?: string; timestamp: string; hidden?: boolean; debugRaw?: string })
979
+ | ({ kind: "account_info"; accountInfo: AccountInfo; id: string; messageId?: string; timestamp: string; hidden?: boolean })
980
+ | ({ kind: "assistant_text"; text: string; id: string; messageId?: string; timestamp: string; hidden?: boolean })
981
+ | ({ kind: "result"; success: boolean; cancelled?: boolean; result: string; durationMs: number; costUsd?: number; id: string; messageId?: string; timestamp: string; hidden?: boolean })
982
+ | ({ kind: "status"; status: string; id: string; messageId?: string; timestamp: string; hidden?: boolean })
983
+ | ({ kind: "context_window_updated"; usage: ContextWindowUsageSnapshot; id: string; messageId?: string; timestamp: string; hidden?: boolean })
984
+ | ({ kind: "compact_boundary"; id: string; messageId?: string; timestamp: string; hidden?: boolean })
985
+ | ({ kind: "compact_summary"; summary: string; id: string; messageId?: string; timestamp: string; hidden?: boolean })
986
+ | ({ kind: "context_cleared"; id: string; messageId?: string; timestamp: string; hidden?: boolean })
987
+ | ({ kind: "interrupted"; id: string; messageId?: string; timestamp: string; hidden?: boolean })
988
+ | ({ kind: "unknown"; json: string; id: string; messageId?: string; timestamp: string; hidden?: boolean })
989
+ | ({ kind: "auto_continue_prompt"; scheduleId: string; id: string; messageId?: string; timestamp: string; hidden?: boolean })
990
+ | ({ id: string; messageId?: string; hidden?: boolean } & HydratedToolCall)
991
+
992
+ export interface ChatRuntime {
993
+ chatId: string
994
+ projectId: string
995
+ localPath: string
996
+ title: string
997
+ status: KannaStatus
998
+ isDraining: boolean
999
+ provider: AgentProvider | null
1000
+ planMode: boolean
1001
+ sessionToken: string | null
1002
+ }
1003
+
1004
+ export interface ChatHistorySnapshot {
1005
+ hasOlder: boolean
1006
+ olderCursor: string | null
1007
+ recentLimit: number
1008
+ }
1009
+
1010
+ export interface SlashCommand {
1011
+ name: string
1012
+ description: string
1013
+ argumentHint: string
1014
+ }
1015
+
1016
+ export interface ChatSnapshot {
1017
+ runtime: ChatRuntime
1018
+ queuedMessages: QueuedChatMessage[]
1019
+ messages: TranscriptEntry[]
1020
+ history: ChatHistorySnapshot
1021
+ availableProviders: ProviderCatalogEntry[]
1022
+ slashCommands: SlashCommand[]
1023
+ slashCommandsLoading: boolean
1024
+ schedules: Record<string, AutoContinueSchedule>
1025
+ liveScheduleId: string | null
1026
+ tunnels: Record<string, CloudflareTunnelRecord>
1027
+ liveTunnelId: string | null
1028
+ }
1029
+
1030
+ export interface ChatHistoryPage {
1031
+ messages: TranscriptEntry[]
1032
+ hasOlder: boolean
1033
+ olderCursor: string | null
1034
+ }
1035
+
1036
+ export interface KannaSnapshot {
1037
+ sidebar: SidebarData
1038
+ chat?: ChatSnapshot | null
1039
+ }
1040
+
1041
+ export interface PendingToolSnapshot {
1042
+ toolUseId: string
1043
+ toolKind: "ask_user_question" | "exit_plan_mode"
1044
+ }
1045
+
1046
+ export type AutoContinueScheduleState = "proposed" | "scheduled" | "fired" | "cancelled"
1047
+
1048
+ export interface AutoContinueSchedule {
1049
+ scheduleId: string
1050
+ state: AutoContinueScheduleState
1051
+ scheduledAt: number | null
1052
+ tz: string
1053
+ resetAt: number
1054
+ detectedAt: number
1055
+ }
1056
+
1057
+ export interface AutoContinuePromptEntry extends TranscriptEntryBase {
1058
+ kind: "auto_continue_prompt"
1059
+ scheduleId: string
1060
+ }
1061
+
1062
+ export type CloudflareTunnelMode = "always-ask" | "auto-expose"
1063
+
1064
+ export interface CloudflareTunnelSettings {
1065
+ enabled: boolean
1066
+ cloudflaredPath: string
1067
+ mode: CloudflareTunnelMode
1068
+ }
1069
+
1070
+ export const CLOUDFLARE_TUNNEL_DEFAULTS: CloudflareTunnelSettings = {
1071
+ enabled: false,
1072
+ cloudflaredPath: "cloudflared",
1073
+ mode: "always-ask",
1074
+ }
1075
+
1076
+ export type CloudflareTunnelState = "proposed" | "active" | "stopped" | "failed"
1077
+
1078
+ export interface CloudflareTunnelRecord {
1079
+ tunnelId: string
1080
+ chatId: string
1081
+ port: number
1082
+ state: CloudflareTunnelState
1083
+ url: string | null
1084
+ error: string | null
1085
+ proposedAt: number
1086
+ activatedAt: number | null
1087
+ stoppedAt: number | null
1088
+ }