@axhub/genie 0.1.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/README.md +1 -1
  2. package/dist/api-docs.html +6 -6
  3. package/dist/assets/App-BfaNALgf.js +504 -0
  4. package/dist/assets/App-qxJ8_QYu.css +32 -0
  5. package/dist/assets/ReviewApp-DIT2yWk-.js +1 -0
  6. package/dist/assets/_basePickBy-Dz3NcIVK.js +1 -0
  7. package/dist/assets/_baseUniq-DON_Sg7x.js +1 -0
  8. package/dist/assets/abap-BdImnpbu.js +1 -0
  9. package/dist/assets/actionscript-3-CoDkCxhg.js +1 -0
  10. package/dist/assets/ada-bCR0ucgS.js +1 -0
  11. package/dist/assets/andromeeda-C4gqWexZ.js +1 -0
  12. package/dist/assets/angular-html-CU67Zn6k.js +1 -0
  13. package/dist/assets/angular-ts-BwZT4LLn.js +1 -0
  14. package/dist/assets/apache-Pmp26Uib.js +1 -0
  15. package/dist/assets/apex-D8_7TLub.js +1 -0
  16. package/dist/assets/apl-dKokRX4l.js +1 -0
  17. package/dist/assets/applescript-Co6uUVPk.js +1 -0
  18. package/dist/assets/ara-BRHolxvo.js +1 -0
  19. package/dist/assets/arc-Y4G80q-l.js +1 -0
  20. package/dist/assets/architectureDiagram-2XIMDMQ5-D_qR4657.js +36 -0
  21. package/dist/assets/asciidoc-Ve4PFQV2.js +1 -0
  22. package/dist/assets/asm-D_Q5rh1f.js +1 -0
  23. package/dist/assets/astro-CbQHKStN.js +1 -0
  24. package/dist/assets/aurora-x-D-2ljcwZ.js +1 -0
  25. package/dist/assets/awk-DMzUqQB5.js +1 -0
  26. package/dist/assets/ayu-dark-DYE7WIF3.js +1 -0
  27. package/dist/assets/ayu-light-BA47KaF1.js +1 -0
  28. package/dist/assets/ayu-mirage-32ctXXKs.js +1 -0
  29. package/dist/assets/ballerina-BFfxhgS-.js +1 -0
  30. package/dist/assets/bat-BkioyH1T.js +1 -0
  31. package/dist/assets/beancount-k_qm7-4y.js +1 -0
  32. package/dist/assets/berry-uYugtg8r.js +1 -0
  33. package/dist/assets/bibtex-CHM0blh-.js +1 -0
  34. package/dist/assets/bicep-Bmn6On1c.js +1 -0
  35. package/dist/assets/bird2-DPOp833l.js +1 -0
  36. package/dist/assets/blade-D4QpJJKB.js +1 -0
  37. package/dist/assets/blockDiagram-WCTKOSBZ-NsmAlV5_.js +132 -0
  38. package/dist/assets/bsl-BO_Y6i37.js +1 -0
  39. package/dist/assets/c-BIGW1oBm.js +1 -0
  40. package/dist/assets/c3-eo99z4R2.js +1 -0
  41. package/dist/assets/c4Diagram-IC4MRINW-cbOJM4yr.js +10 -0
  42. package/dist/assets/cadence-Bv_4Rxtq.js +1 -0
  43. package/dist/assets/cairo-KRGpt6FW.js +1 -0
  44. package/dist/assets/catppuccin-frappe-DFWUc33u.js +1 -0
  45. package/dist/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
  46. package/dist/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
  47. package/dist/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
  48. package/dist/assets/channel-C6KNnXlA.js +1 -0
  49. package/dist/assets/chunk-4BX2VUAB-bLBhl74J.js +1 -0
  50. package/dist/assets/chunk-55IACEB6-D8kNkDUO.js +1 -0
  51. package/dist/assets/chunk-FMBD7UC4-BjR6UbXB.js +15 -0
  52. package/dist/assets/chunk-JSJVCQXG-luNqWn64.js +1 -0
  53. package/dist/assets/chunk-KX2RTZJC-CNnKm6dK.js +1 -0
  54. package/dist/assets/chunk-NQ4KR5QH-Cp9gb43u.js +220 -0
  55. package/dist/assets/chunk-QZHKN3VN-HlVYo2Oq.js +1 -0
  56. package/dist/assets/chunk-WL4C6EOR-CjSZoOGO.js +189 -0
  57. package/dist/assets/clarity-D53aC0YG.js +1 -0
  58. package/dist/assets/classDiagram-VBA2DB6C-BQlzzlH7.js +1 -0
  59. package/dist/assets/classDiagram-v2-RAHNMMFH-BQlzzlH7.js +1 -0
  60. package/dist/assets/clojure-P80f7IUj.js +1 -0
  61. package/dist/assets/clone-DMxS3qWP.js +1 -0
  62. package/dist/assets/cmake-D1j8_8rp.js +1 -0
  63. package/dist/assets/cobol-nwyudZeR.js +1 -0
  64. package/dist/assets/codeowners-Bp6g37R7.js +1 -0
  65. package/dist/assets/codeql-DsOJ9woJ.js +1 -0
  66. package/dist/assets/coffee-Ch7k5sss.js +1 -0
  67. package/dist/assets/common-lisp-Cg-RD9OK.js +1 -0
  68. package/dist/assets/coq-DkFqJrB1.js +1 -0
  69. package/dist/assets/cose-bilkent-S5V4N54A-DZWRjeEd.js +1 -0
  70. package/dist/assets/cpp-CofmeUqb.js +1 -0
  71. package/dist/assets/crystal-tKQVLTB8.js +1 -0
  72. package/dist/assets/csharp-COcwbKMJ.js +1 -0
  73. package/dist/assets/css-DPfMkruS.js +1 -0
  74. package/dist/assets/csv-fuZLfV_i.js +1 -0
  75. package/dist/assets/cue-D82EKSYY.js +1 -0
  76. package/dist/assets/cypher-COkxafJQ.js +1 -0
  77. package/dist/assets/cytoscape.esm-2ZfV8NB5.js +331 -0
  78. package/dist/assets/d-85-TOEBH.js +1 -0
  79. package/dist/assets/dagre-KLK3FWXG-yAzUmqI7.js +4 -0
  80. package/dist/assets/dark-plus-C3mMm8J8.js +1 -0
  81. package/dist/assets/dart-CF10PKvl.js +1 -0
  82. package/dist/assets/dax-CEL-wOlO.js +1 -0
  83. package/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  84. package/dist/assets/desktop-BmXAJ9_W.js +1 -0
  85. package/dist/assets/diagram-E7M64L7V-CvzlIvDJ.js +24 -0
  86. package/dist/assets/diagram-IFDJBPK2-DFMIJpuM.js +43 -0
  87. package/dist/assets/diagram-P4PSJMXO-KL-J3gyb.js +24 -0
  88. package/dist/assets/diff-D97Zzqfu.js +1 -0
  89. package/dist/assets/docker-BcOcwvcX.js +1 -0
  90. package/dist/assets/dotenv-Da5cRb03.js +1 -0
  91. package/dist/assets/dracula-BzJJZx-M.js +1 -0
  92. package/dist/assets/dracula-soft-BXkSAIEj.js +1 -0
  93. package/dist/assets/dream-maker-BtqSS_iP.js +1 -0
  94. package/dist/assets/edge-BkV0erSs.js +1 -0
  95. package/dist/assets/elixir-CDX3lj18.js +1 -0
  96. package/dist/assets/elm-DbKCFpqz.js +1 -0
  97. package/dist/assets/emacs-lisp-C9XAeP06.js +1 -0
  98. package/dist/assets/erDiagram-INFDFZHY-BXszHbTM.js +70 -0
  99. package/dist/assets/erb-B12qg9BL.js +1 -0
  100. package/dist/assets/erlang-DsQrWhSR.js +1 -0
  101. package/dist/assets/everforest-dark-BgDCqdQA.js +1 -0
  102. package/dist/assets/everforest-light-C8M2exoo.js +1 -0
  103. package/dist/assets/fennel-BYunw83y.js +1 -0
  104. package/dist/assets/fish-BvzEVeQv.js +1 -0
  105. package/dist/assets/flowDiagram-PKNHOUZH-Ba43NVp6.js +162 -0
  106. package/dist/assets/fluent-C4IJs8-o.js +1 -0
  107. package/dist/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  108. package/dist/assets/fortran-free-form-BxgE0vQu.js +1 -0
  109. package/dist/assets/fsharp-CXgrBDvD.js +1 -0
  110. package/dist/assets/ganttDiagram-A5KZAMGK-uLHfhCrg.js +292 -0
  111. package/dist/assets/gdresource-BOOCDP_w.js +1 -0
  112. package/dist/assets/gdscript-C5YyOfLZ.js +1 -0
  113. package/dist/assets/gdshader-DkwncUOv.js +1 -0
  114. package/dist/assets/genie-D0YGMca9.js +1 -0
  115. package/dist/assets/gherkin-DyxjwDmM.js +1 -0
  116. package/dist/assets/git-commit-F4YmCXRG.js +1 -0
  117. package/dist/assets/git-rebase-r7XF79zn.js +1 -0
  118. package/dist/assets/gitGraphDiagram-K3NZZRJ6-BTEuFaiL.js +65 -0
  119. package/dist/assets/github-dark-DHJKELXO.js +1 -0
  120. package/dist/assets/github-dark-default-Cuk6v7N8.js +1 -0
  121. package/dist/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  122. package/dist/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  123. package/dist/assets/github-light-DAi9KRSo.js +1 -0
  124. package/dist/assets/github-light-default-D7oLnXFd.js +1 -0
  125. package/dist/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  126. package/dist/assets/gleam-BspZqrRM.js +1 -0
  127. package/dist/assets/glimmer-js-Rg0-pVw9.js +1 -0
  128. package/dist/assets/glimmer-ts-U6CK756n.js +1 -0
  129. package/dist/assets/glsl-DplSGwfg.js +1 -0
  130. package/dist/assets/gn-n2N0HUVH.js +1 -0
  131. package/dist/assets/gnuplot-DdkO51Og.js +1 -0
  132. package/dist/assets/go-CxLEBnE3.js +1 -0
  133. package/dist/assets/graph-h2nuWjx4.js +1 -0
  134. package/dist/assets/graphql-ChdNCCLP.js +1 -0
  135. package/dist/assets/groovy-gcz8RCvz.js +1 -0
  136. package/dist/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  137. package/dist/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  138. package/dist/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  139. package/dist/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  140. package/dist/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  141. package/dist/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  142. package/dist/assets/hack-CaT9iCJl.js +1 -0
  143. package/dist/assets/haml-B8DHNrY2.js +1 -0
  144. package/dist/assets/handlebars-BL8al0AC.js +1 -0
  145. package/dist/assets/haskell-Df6bDoY_.js +1 -0
  146. package/dist/assets/haxe-CzTSHFRz.js +1 -0
  147. package/dist/assets/hcl-BWvSN4gD.js +1 -0
  148. package/dist/assets/highlighted-body-TPN3WLV5-C6BY7XZJ.js +1 -0
  149. package/dist/assets/hjson-D5-asLiD.js +1 -0
  150. package/dist/assets/hlsl-D3lLCCz7.js +1 -0
  151. package/dist/assets/horizon-BUw7H-hv.js +1 -0
  152. package/dist/assets/horizon-bright-Cn-bp-IR.js +1 -0
  153. package/dist/assets/houston-DnULxvSX.js +1 -0
  154. package/dist/assets/html-GMplVEZG.js +1 -0
  155. package/dist/assets/html-derivative-BFtXZ54Q.js +1 -0
  156. package/dist/assets/http-jrhK8wxY.js +1 -0
  157. package/dist/assets/hurl-irOxFIW8.js +1 -0
  158. package/dist/assets/hxml-Bvhsp5Yf.js +1 -0
  159. package/dist/assets/hy-DFXneXwc.js +1 -0
  160. package/dist/assets/imba-DGztddWO.js +1 -0
  161. package/dist/assets/index-2198VgsK.css +1 -0
  162. package/dist/assets/index-C6Bb2jGF.js +2 -0
  163. package/dist/assets/infoDiagram-LFFYTUFH-BOLfvCIq.js +2 -0
  164. package/dist/assets/ini-BEwlwnbL.js +1 -0
  165. package/dist/assets/init-Gi6I4Gst.js +1 -0
  166. package/dist/assets/ishikawaDiagram-PHBUUO56-BRzQ1ee5.js +70 -0
  167. package/dist/assets/java-CylS5w8V.js +1 -0
  168. package/dist/assets/javascript-wDzz0qaB.js +1 -0
  169. package/dist/assets/jinja-4LBKfQ-Z.js +1 -0
  170. package/dist/assets/jison-wvAkD_A8.js +1 -0
  171. package/dist/assets/journeyDiagram-4ABVD52K-DXm_VcMy.js +139 -0
  172. package/dist/assets/json-Cp-IABpG.js +1 -0
  173. package/dist/assets/json5-C9tS-k6U.js +1 -0
  174. package/dist/assets/jsonc-Des-eS-w.js +1 -0
  175. package/dist/assets/jsonl-DcaNXYhu.js +1 -0
  176. package/dist/assets/jsonnet-DFQXde-d.js +1 -0
  177. package/dist/assets/jssm-C2t-YnRu.js +1 -0
  178. package/dist/assets/jsx-g9-lgVsj.js +1 -0
  179. package/dist/assets/julia-CxzCAyBv.js +1 -0
  180. package/dist/assets/just-Cw27pwNe.js +1 -0
  181. package/dist/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
  182. package/dist/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
  183. package/dist/assets/kanagawa-wave-DWedfzmr.js +1 -0
  184. package/dist/assets/kanban-definition-K7BYSVSG-D_oyzopl.js +89 -0
  185. package/dist/assets/kdl-DV7GczEv.js +1 -0
  186. package/dist/assets/kotlin-BdnUsdx6.js +1 -0
  187. package/dist/assets/kusto-DZf3V79B.js +1 -0
  188. package/dist/assets/laserwave-DUszq2jm.js +1 -0
  189. package/dist/assets/latex-CWtU0Tv5.js +1 -0
  190. package/dist/assets/layout-Q8YoR_E1.js +1 -0
  191. package/dist/assets/lean-BZvkOJ9d.js +1 -0
  192. package/dist/assets/less-B1dDrJ26.js +1 -0
  193. package/dist/assets/light-plus-B7mTdjB0.js +1 -0
  194. package/dist/assets/linear-B3qNg7di.js +1 -0
  195. package/dist/assets/liquid-DYVedYrR.js +1 -0
  196. package/dist/assets/llvm-DjAJT7YJ.js +1 -0
  197. package/dist/assets/log-2UxHyX5q.js +1 -0
  198. package/dist/assets/logo-BtOb2qkB.js +1 -0
  199. package/dist/assets/lua-BaeVxFsk.js +1 -0
  200. package/dist/assets/luau-C-HG3fhB.js +1 -0
  201. package/dist/assets/make-CHLpvVh8.js +1 -0
  202. package/dist/assets/markdown-Cvjx9yec.js +1 -0
  203. package/dist/assets/marko-CnJfTvn9.js +1 -0
  204. package/dist/assets/material-theme-D5KoaKCx.js +1 -0
  205. package/dist/assets/material-theme-darker-BfHTSMKl.js +1 -0
  206. package/dist/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  207. package/dist/assets/material-theme-ocean-CyktbL80.js +1 -0
  208. package/dist/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  209. package/dist/assets/matlab-D7o27uSR.js +1 -0
  210. package/dist/assets/mdc-BMNejdWA.js +1 -0
  211. package/dist/assets/mdx-Cmh6b_Ma.js +1 -0
  212. package/dist/assets/mermaid-O7DHMXV3-BVZ_4MKo.js +988 -0
  213. package/dist/assets/mermaid-mWjccvbQ.js +1 -0
  214. package/dist/assets/min-dark-CafNBF8u.js +1 -0
  215. package/dist/assets/min-light-CTRr51gU.js +1 -0
  216. package/dist/assets/mindmap-definition-YRQLILUH-CjulgYdi.js +68 -0
  217. package/dist/assets/mipsasm-CKIfxQSi.js +1 -0
  218. package/dist/assets/mojo-rZm6bMo-.js +1 -0
  219. package/dist/assets/monokai-D4h5O-jR.js +1 -0
  220. package/dist/assets/moonbit-_H4v1dQx.js +1 -0
  221. package/dist/assets/move-IF9eRakj.js +1 -0
  222. package/dist/assets/narrat-DRg8JJMk.js +1 -0
  223. package/dist/assets/nextflow-Zz6hmt5N.js +1 -0
  224. package/dist/assets/nextflow-groovy-BeH2EWoN.js +1 -0
  225. package/dist/assets/nginx-BpAMiNFr.js +1 -0
  226. package/dist/assets/night-owl-C39BiMTA.js +1 -0
  227. package/dist/assets/night-owl-light-CMTm3GFP.js +1 -0
  228. package/dist/assets/nim-CVrawwO9.js +1 -0
  229. package/dist/assets/nix-CwoSXNpI.js +1 -0
  230. package/dist/assets/nord-Ddv68eIx.js +1 -0
  231. package/dist/assets/nushell-Cz2AlsmD.js +1 -0
  232. package/dist/assets/objective-c-DXmwc3jG.js +1 -0
  233. package/dist/assets/objective-cpp-CLxacb5B.js +1 -0
  234. package/dist/assets/ocaml-C0hk2d4L.js +1 -0
  235. package/dist/assets/odin-BBf5iR-q.js +1 -0
  236. package/dist/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  237. package/dist/assets/one-light-C3Wv6jpd.js +1 -0
  238. package/dist/assets/openscad-C4EeE6gA.js +1 -0
  239. package/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  240. package/dist/assets/pascal-D93ZcfNL.js +1 -0
  241. package/dist/assets/perl-C0TMdlhV.js +1 -0
  242. package/dist/assets/php-Dhbhpdrm.js +1 -0
  243. package/dist/assets/pieDiagram-SKSYHLDU-8VzrefxA.js +30 -0
  244. package/dist/assets/pkl-u5AG7uiY.js +1 -0
  245. package/dist/assets/plastic-3e1v2bzS.js +1 -0
  246. package/dist/assets/plsql-ChMvpjG-.js +1 -0
  247. package/dist/assets/po-BTJTHyun.js +1 -0
  248. package/dist/assets/poimandres-CS3Unz2-.js +1 -0
  249. package/dist/assets/polar-C0HS_06l.js +1 -0
  250. package/dist/assets/postcss-CXtECtnM.js +1 -0
  251. package/dist/assets/powerquery-CEu0bR-o.js +1 -0
  252. package/dist/assets/powershell-Dpen1YoG.js +1 -0
  253. package/dist/assets/prisma-Dd19v3D-.js +1 -0
  254. package/dist/assets/prolog-CbFg5uaA.js +1 -0
  255. package/dist/assets/proto-C7zT0LnQ.js +1 -0
  256. package/dist/assets/pug-CGlum2m_.js +1 -0
  257. package/dist/assets/puppet-BMWR74SV.js +1 -0
  258. package/dist/assets/purescript-CklMAg4u.js +1 -0
  259. package/dist/assets/python-B6aJPvgy.js +1 -0
  260. package/dist/assets/qml-3beO22l8.js +1 -0
  261. package/dist/assets/qmldir-C8lEn-DE.js +1 -0
  262. package/dist/assets/qss-IeuSbFQv.js +1 -0
  263. package/dist/assets/quadrantDiagram-337W2JSQ-CFh-ijm2.js +7 -0
  264. package/dist/assets/r-Dspwwk_N.js +1 -0
  265. package/dist/assets/racket-BqYA7rlc.js +1 -0
  266. package/dist/assets/raku-DXvB9xmW.js +1 -0
  267. package/dist/assets/razor-Uh8Bk_45.js +1 -0
  268. package/dist/assets/red-bN70gL4F.js +1 -0
  269. package/dist/assets/reg-C-SQnVFl.js +1 -0
  270. package/dist/assets/regexp-CDVJQ6XC.js +1 -0
  271. package/dist/assets/rel-C3B-1QV4.js +1 -0
  272. package/dist/assets/requirementDiagram-Z7DCOOCP-BNPlTs5Q.js +73 -0
  273. package/dist/assets/riscv-BM1_JUlF.js +1 -0
  274. package/dist/assets/ron-D8l8udqQ.js +1 -0
  275. package/dist/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
  276. package/dist/assets/rose-pine-moon-D4_iv3hh.js +1 -0
  277. package/dist/assets/rose-pine-qdsjHGoJ.js +1 -0
  278. package/dist/assets/rosmsg-BJDFO7_C.js +1 -0
  279. package/dist/assets/rst-BrH8l1NY.js +1 -0
  280. package/dist/assets/ruby-Dw2BHqvy.js +1 -0
  281. package/dist/assets/rust-B1yitclQ.js +1 -0
  282. package/dist/assets/sankeyDiagram-WA2Y5GQK-C5l_hYst.js +10 -0
  283. package/dist/assets/sas-cz2c8ADy.js +1 -0
  284. package/dist/assets/sass-Cj5Yp3dK.js +1 -0
  285. package/dist/assets/scala-C151Ov-r.js +1 -0
  286. package/dist/assets/scheme-C98Dy4si.js +1 -0
  287. package/dist/assets/scss-OYdSNvt2.js +1 -0
  288. package/dist/assets/sdbl-DVxCFoDh.js +1 -0
  289. package/dist/assets/sequenceDiagram-2WXFIKYE-B4a_rQw8.js +145 -0
  290. package/dist/assets/shaderlab-Dg9Lc6iA.js +1 -0
  291. package/dist/assets/shellscript-Yzrsuije.js +1 -0
  292. package/dist/assets/shellsession-BADoaaVG.js +1 -0
  293. package/dist/assets/slack-dark-BthQWCQV.js +1 -0
  294. package/dist/assets/slack-ochin-DqwNpetd.js +1 -0
  295. package/dist/assets/smalltalk-BERRCDM3.js +1 -0
  296. package/dist/assets/snazzy-light-Bw305WKR.js +1 -0
  297. package/dist/assets/solarized-dark-DXbdFlpD.js +1 -0
  298. package/dist/assets/solarized-light-L9t79GZl.js +1 -0
  299. package/dist/assets/solidity-rGO070M0.js +1 -0
  300. package/dist/assets/soy-Brmx7dQM.js +1 -0
  301. package/dist/assets/sparql-rVzFXLq3.js +1 -0
  302. package/dist/assets/splunk-BtCnVYZw.js +1 -0
  303. package/dist/assets/sql-BLtJtn59.js +1 -0
  304. package/dist/assets/ssh-config-_ykCGR6B.js +1 -0
  305. package/dist/assets/stata-BH5u7GGu.js +1 -0
  306. package/dist/assets/stateDiagram-RAJIS63D-Bt4mMmKB.js +1 -0
  307. package/dist/assets/stateDiagram-v2-FVOUBMTO-6NYMazfq.js +1 -0
  308. package/dist/assets/stylus-BEDo0Tqx.js +1 -0
  309. package/dist/assets/surrealql-Bq5Q-fJD.js +1 -0
  310. package/dist/assets/svelte-C_ipcX3V.js +1 -0
  311. package/dist/assets/swift-D82vCrfD.js +1 -0
  312. package/dist/assets/synthwave-84-CbfX1IO0.js +1 -0
  313. package/dist/assets/system-verilog-CnnmHF94.js +1 -0
  314. package/dist/assets/systemd-4A_iFExJ.js +1 -0
  315. package/dist/assets/talonscript-CkByrt1z.js +1 -0
  316. package/dist/assets/tasl-QIJgUcNo.js +1 -0
  317. package/dist/assets/tcl-dwOrl1Do.js +1 -0
  318. package/dist/assets/templ-P3uqSqPl.js +1 -0
  319. package/dist/assets/terraform-BETggiCN.js +1 -0
  320. package/dist/assets/tex-idrVyKtj.js +1 -0
  321. package/dist/assets/timeline-definition-YZTLITO2-CLYvSw_R.js +61 -0
  322. package/dist/assets/tokyo-night-hegEt444.js +1 -0
  323. package/dist/assets/toml-vGWfd6FD.js +1 -0
  324. package/dist/assets/treemap-KZPCXAKY-ksND0hZK.js +162 -0
  325. package/dist/assets/ts-tags-zn1MmPIZ.js +1 -0
  326. package/dist/assets/tsv-B_m7g4N7.js +1 -0
  327. package/dist/assets/tsx-COt5Ahok.js +1 -0
  328. package/dist/assets/turtle-BsS91CYL.js +1 -0
  329. package/dist/assets/twig-DNn4PbVi.js +1 -0
  330. package/dist/assets/typescript-BPQ3VLAy.js +1 -0
  331. package/dist/assets/typespec-BGHnOYBU.js +1 -0
  332. package/dist/assets/typst-DHCkPAjA.js +1 -0
  333. package/dist/assets/v-BcVCzyr7.js +1 -0
  334. package/dist/assets/vala-CsfeWuGM.js +1 -0
  335. package/dist/assets/vb-D17OF-Vu.js +1 -0
  336. package/dist/assets/{vendor-codemirror-B88_OPWf.js → vendor-codemirror-Dz7_EqNA.js} +3 -3
  337. package/dist/assets/{vendor-react-C3RJLQGO.js → vendor-react-Cpt6D04s.js} +11 -11
  338. package/dist/assets/vennDiagram-LZ73GAT5-CaQg4oZK.js +34 -0
  339. package/dist/assets/verilog-BQ8w6xss.js +1 -0
  340. package/dist/assets/vesper-DU1UobuO.js +1 -0
  341. package/dist/assets/vhdl-CeAyd5Ju.js +1 -0
  342. package/dist/assets/viml-CJc9bBzg.js +1 -0
  343. package/dist/assets/vitesse-black-Bkuqu6BP.js +1 -0
  344. package/dist/assets/vitesse-dark-D0r3Knsf.js +1 -0
  345. package/dist/assets/vitesse-light-CVO1_9PV.js +1 -0
  346. package/dist/assets/vue-DN_0RTcg.js +1 -0
  347. package/dist/assets/vue-html-AaS7Mt5G.js +1 -0
  348. package/dist/assets/vue-vine-CQOfvN7w.js +1 -0
  349. package/dist/assets/vyper-CDx5xZoG.js +1 -0
  350. package/dist/assets/wasm-CG6Dc4jp.js +1 -0
  351. package/dist/assets/wasm-MzD3tlZU.js +1 -0
  352. package/dist/assets/wenyan-BV7otONQ.js +1 -0
  353. package/dist/assets/wgsl-Dx-B1_4e.js +1 -0
  354. package/dist/assets/wikitext-BhOHFoWU.js +1 -0
  355. package/dist/assets/wit-5i3qLPDT.js +1 -0
  356. package/dist/assets/wolfram-lXgVvXCa.js +1 -0
  357. package/dist/assets/xml-sdJ4AIDG.js +1 -0
  358. package/dist/assets/xsl-CtQFsRM5.js +1 -0
  359. package/dist/assets/xychartDiagram-JWTSCODW-C8dCbTeM.js +7 -0
  360. package/dist/assets/yaml-Buea-lGh.js +1 -0
  361. package/dist/assets/zenscript-DVFEvuxE.js +1 -0
  362. package/dist/assets/zig-VOosw3JB.js +1 -0
  363. package/dist/index.html +35 -21
  364. package/dist/manifest.json +1 -1
  365. package/dist/sw.js +18 -46
  366. package/package.json +12 -8
  367. package/server/bin/codex-sdk-wrapper.js +49 -0
  368. package/server/channels/runtime/AgentRuntimeAdapter.js +2 -5
  369. package/server/channels/store/ChannelStore.js +73 -107
  370. package/server/claude-sdk.js +160 -6
  371. package/server/cli.js +590 -32
  372. package/server/cli.test.js +76 -0
  373. package/server/database/db.js +438 -372
  374. package/server/external-agent/auth.js +88 -0
  375. package/server/external-agent/service.js +1052 -0
  376. package/server/external-agent/service.test.js +41 -0
  377. package/server/external-agent/ws.js +1526 -0
  378. package/server/external-agent/ws.test.js +289 -0
  379. package/server/gemini-cli.js +108 -20
  380. package/server/index.js +115 -121
  381. package/server/load-env.js +16 -13
  382. package/server/openai-codex.js +165 -11
  383. package/server/opencode-cli.js +3 -2
  384. package/server/projects.js +432 -338
  385. package/server/routes/agent.js +347 -459
  386. package/server/routes/auth.js +14 -36
  387. package/server/routes/cli-auth.js +60 -113
  388. package/server/routes/commands.js +16 -26
  389. package/server/routes/git.js +5 -16
  390. package/server/routes/projects.js +2 -7
  391. package/server/routes/session-core.js +177 -0
  392. package/server/session-core/abortSession.js +48 -0
  393. package/server/session-core/eventStore.js +139 -0
  394. package/server/session-core/providerAdapters.js +84 -0
  395. package/server/session-core/providerDiscovery.js +235 -0
  396. package/server/session-core/runtimeState.js +390 -0
  397. package/server/session-core/runtimeWriter.js +59 -0
  398. package/server/utils/agentCallback.js +273 -0
  399. package/server/utils/agentImages.js +253 -0
  400. package/server/utils/codexPath.js +47 -0
  401. package/server/utils/defaultWorkingDirectory.js +34 -0
  402. package/shared/conversationEvents.js +1071 -0
  403. package/shared/modelConstants.js +18 -24
  404. package/dist/assets/index-CVjMty4a.js +0 -902
  405. package/dist/assets/index-eo5scY_Z.css +0 -32
  406. package/server/cursor-cli.js +0 -276
  407. package/server/database/init.sql +0 -98
  408. package/server/routes/cursor.js +0 -795
@@ -1,6 +1,4 @@
1
- import crypto from 'crypto';
2
-
3
- import { db } from '../../database/db.js';
1
+ import { channelDb } from '../../database/db.js';
4
2
 
5
3
  const DEFAULT_CONFIGS = {
6
4
  lark: {
@@ -52,21 +50,32 @@ function getDefaultConfig(platform) {
52
50
  return { ...(DEFAULT_CONFIGS[normalizePlatform(platform)] || DEFAULT_CONFIGS.lark) };
53
51
  }
54
52
 
55
- function parseConfig(value, platform) {
56
- const defaults = getDefaultConfig(platform);
57
- if (!value) {
58
- return defaults;
59
- }
53
+ function mapAllowedUser(entry) {
54
+ if (!entry) return null;
55
+ return {
56
+ id: entry.id,
57
+ platformType: entry.platform_type,
58
+ userId: entry.user_id,
59
+ displayName: entry.display_name,
60
+ note: entry.note,
61
+ isActive: entry.is_active,
62
+ createdAt: entry.created_at,
63
+ updatedAt: entry.updated_at,
64
+ };
65
+ }
60
66
 
61
- try {
62
- const parsed = JSON.parse(value);
63
- return {
64
- ...defaults,
65
- ...(parsed || {}),
66
- };
67
- } catch {
68
- return defaults;
69
- }
67
+ function mapChannelSession(entry) {
68
+ if (!entry) return null;
69
+ return {
70
+ id: entry.id,
71
+ platformType: entry.platform_type,
72
+ userId: entry.user_id,
73
+ chatId: entry.chat_id,
74
+ backend: entry.backend,
75
+ providerSessionId: entry.provider_session_id,
76
+ projectPath: entry.project_path,
77
+ updatedAt: entry.updated_at,
78
+ };
70
79
  }
71
80
 
72
81
  export class ChannelStore {
@@ -79,14 +88,14 @@ export class ChannelStore {
79
88
  }
80
89
 
81
90
  getPluginConfig(pluginId = 'lark_default') {
82
- const row = db.prepare('SELECT * FROM channel_plugins WHERE id = ?').get(pluginId);
91
+ const row = channelDb.getPlugin(pluginId);
83
92
  const platform = resolvePlatformByPluginId(pluginId);
84
93
 
85
94
  if (!row) {
86
95
  return {
87
96
  id: pluginId,
88
97
  type: platform,
89
- enabled: 0,
98
+ enabled: false,
90
99
  status: 'stopped',
91
100
  config: getDefaultConfig(platform),
92
101
  };
@@ -95,9 +104,12 @@ export class ChannelStore {
95
104
  return {
96
105
  id: row.id,
97
106
  type: row.type || platform,
98
- enabled: row.enabled,
107
+ enabled: !!row.enabled,
99
108
  status: row.status,
100
- config: parseConfig(row.config_json, row.type || platform),
109
+ config: {
110
+ ...getDefaultConfig(row.type || platform),
111
+ ...(row.config || {}),
112
+ },
101
113
  updatedAt: row.updated_at,
102
114
  };
103
115
  }
@@ -105,30 +117,18 @@ export class ChannelStore {
105
117
  upsertPluginConfig(pluginId = 'lark_default', patch = {}) {
106
118
  const existing = this.getPluginConfig(pluginId);
107
119
  const type = resolvePlatformByPluginId(pluginId);
108
- const nextConfig = {
109
- ...existing.config,
110
- ...patch,
111
- };
112
120
 
113
- const updatedAt = now();
114
-
115
- db.prepare(`
116
- INSERT INTO channel_plugins (id, type, enabled, status, config_json, updated_at)
117
- VALUES (?, ?, ?, ?, ?, ?)
118
- ON CONFLICT(id) DO UPDATE SET
119
- type = excluded.type,
120
- enabled = excluded.enabled,
121
- status = excluded.status,
122
- config_json = excluded.config_json,
123
- updated_at = excluded.updated_at
124
- `).run(
125
- pluginId,
121
+ channelDb.upsertPlugin({
122
+ id: pluginId,
126
123
  type,
127
- existing.enabled || 0,
128
- existing.status || 'stopped',
129
- JSON.stringify(nextConfig),
130
- updatedAt
131
- );
124
+ enabled: !!existing.enabled,
125
+ status: existing.status || 'stopped',
126
+ config: {
127
+ ...existing.config,
128
+ ...patch,
129
+ },
130
+ updated_at: now(),
131
+ });
132
132
 
133
133
  return this.getPluginConfig(pluginId);
134
134
  }
@@ -136,35 +136,21 @@ export class ChannelStore {
136
136
  updatePluginRuntimeStatus(pluginId = 'lark_default', enabled, status) {
137
137
  const existing = this.getPluginConfig(pluginId);
138
138
  const type = resolvePlatformByPluginId(pluginId);
139
- const updatedAt = now();
140
-
141
- db.prepare(`
142
- INSERT INTO channel_plugins (id, type, enabled, status, config_json, updated_at)
143
- VALUES (?, ?, ?, ?, ?, ?)
144
- ON CONFLICT(id) DO UPDATE SET
145
- enabled = excluded.enabled,
146
- status = excluded.status,
147
- updated_at = excluded.updated_at
148
- `).run(
149
- pluginId,
139
+
140
+ channelDb.upsertPlugin({
141
+ id: pluginId,
150
142
  type,
151
- enabled ? 1 : 0,
143
+ enabled: !!enabled,
152
144
  status,
153
- JSON.stringify(existing.config),
154
- updatedAt
155
- );
145
+ config: existing.config,
146
+ updated_at: now(),
147
+ });
156
148
 
157
149
  return this.getPluginConfig(pluginId);
158
150
  }
159
151
 
160
152
  listAllowedUsers(platform = 'lark') {
161
- const normalizedPlatform = normalizePlatform(platform);
162
- return db.prepare(`
163
- SELECT id, platform_type AS platformType, user_id AS userId, display_name AS displayName, note, is_active AS isActive, created_at AS createdAt, updated_at AS updatedAt
164
- FROM channel_allowed_users
165
- WHERE platform_type = ?
166
- ORDER BY created_at DESC
167
- `).all(normalizedPlatform);
153
+ return channelDb.listAllowedUsers(normalizePlatform(platform)).map(mapAllowedUser);
168
154
  }
169
155
 
170
156
  addAllowedUser(platform = 'lark', { userId, displayName = null, note = null }) {
@@ -174,63 +160,43 @@ export class ChannelStore {
174
160
  throw new Error('userId is required');
175
161
  }
176
162
 
177
- const current = now();
178
-
179
- db.prepare(`
180
- INSERT INTO channel_allowed_users (platform_type, user_id, display_name, note, is_active, created_at, updated_at)
181
- VALUES (?, ?, ?, ?, 1, ?, ?)
182
- `).run(normalizedPlatform, trimmedUserId, displayName ? String(displayName).trim() : null, note ? String(note).trim() : null, current, current);
183
-
184
- return db.prepare(`
185
- SELECT id, platform_type AS platformType, user_id AS userId, display_name AS displayName, note, is_active AS isActive, created_at AS createdAt, updated_at AS updatedAt
186
- FROM channel_allowed_users
187
- WHERE platform_type = ? AND user_id = ?
188
- `).get(normalizedPlatform, trimmedUserId);
163
+ return mapAllowedUser(channelDb.addAllowedUser(normalizedPlatform, {
164
+ userId: trimmedUserId,
165
+ displayName: displayName ? String(displayName).trim() : null,
166
+ note: note ? String(note).trim() : null,
167
+ }));
189
168
  }
190
169
 
191
170
  removeAllowedUser(platform = 'lark', id) {
192
- const normalizedPlatform = normalizePlatform(platform);
193
- const result = db.prepare('DELETE FROM channel_allowed_users WHERE platform_type = ? AND id = ?').run(normalizedPlatform, id);
194
- return result.changes > 0;
171
+ return channelDb.removeAllowedUser(normalizePlatform(platform), id);
195
172
  }
196
173
 
197
174
  toggleAllowedUser(platform = 'lark', id, isActive) {
198
- const normalizedPlatform = normalizePlatform(platform);
199
- const result = db.prepare('UPDATE channel_allowed_users SET is_active = ?, updated_at = ? WHERE platform_type = ? AND id = ?').run(isActive ? 1 : 0, now(), normalizedPlatform, id);
200
- return result.changes > 0;
175
+ return channelDb.toggleAllowedUser(normalizePlatform(platform), id, isActive);
201
176
  }
202
177
 
203
178
  isAllowedUser(platform = 'lark', userId) {
204
- const normalizedPlatform = normalizePlatform(platform);
205
179
  if (!userId) return false;
206
- const row = db.prepare('SELECT id FROM channel_allowed_users WHERE platform_type = ? AND user_id = ? AND is_active = 1').get(normalizedPlatform, String(userId));
207
- return !!row;
180
+ return channelDb.isAllowedUser(normalizePlatform(platform), String(userId));
208
181
  }
209
182
 
210
183
  getChannelSession({ platform = 'lark', userId, chatId, backend }) {
211
- const normalizedPlatform = normalizePlatform(platform);
212
- return db.prepare(`
213
- SELECT id, platform_type AS platformType, user_id AS userId, chat_id AS chatId, backend, provider_session_id AS providerSessionId, project_path AS projectPath, updated_at AS updatedAt
214
- FROM channel_sessions
215
- WHERE platform_type = ? AND user_id = ? AND chat_id = ? AND backend = ?
216
- LIMIT 1
217
- `).get(normalizedPlatform, userId, chatId, backend) || null;
184
+ return mapChannelSession(channelDb.getChannelSession({
185
+ platform: normalizePlatform(platform),
186
+ userId,
187
+ chatId,
188
+ backend,
189
+ }));
218
190
  }
219
191
 
220
192
  upsertChannelSession({ platform = 'lark', userId, chatId, backend, providerSessionId, projectPath }) {
221
- const normalizedPlatform = normalizePlatform(platform);
222
- const id = crypto.randomUUID();
223
- const updatedAt = now();
224
-
225
- db.prepare(`
226
- INSERT INTO channel_sessions (id, platform_type, user_id, chat_id, backend, provider_session_id, project_path, updated_at)
227
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)
228
- ON CONFLICT(platform_type, user_id, chat_id, backend) DO UPDATE SET
229
- provider_session_id = excluded.provider_session_id,
230
- project_path = excluded.project_path,
231
- updated_at = excluded.updated_at
232
- `).run(id, normalizedPlatform, userId, chatId, backend, providerSessionId || null, projectPath || null, updatedAt);
233
-
234
- return this.getChannelSession({ platform: normalizedPlatform, userId, chatId, backend });
193
+ return mapChannelSession(channelDb.upsertChannelSession({
194
+ platform: normalizePlatform(platform),
195
+ userId,
196
+ chatId,
197
+ backend,
198
+ providerSessionId,
199
+ projectPath,
200
+ }));
235
201
  }
236
202
  }
@@ -20,6 +20,7 @@ import { promises as fs } from 'fs';
20
20
  import path from 'path';
21
21
  import os from 'os';
22
22
  import { CLAUDE_MODELS } from '../shared/modelConstants.js';
23
+ import { resolveWorkingDirectory } from './utils/defaultWorkingDirectory.js';
23
24
 
24
25
  // Session tracking: Map of session IDs to active query instances
25
26
  const activeSessions = new Map();
@@ -32,6 +33,8 @@ const pendingToolApprovals = new Map();
32
33
  // This does not change SDK limits; it only defines how long we wait for the UI,
33
34
  // introduced to avoid hanging the run when no decision arrives.
34
35
  const TOOL_APPROVAL_TIMEOUT_MS = parseInt(process.env.CLAUDE_TOOL_APPROVAL_TIMEOUT_MS, 10) || 55000;
36
+ const CLAUDE_STREAM_START_TIMEOUT_MS = parseInt(process.env.CLAUDE_STREAM_START_TIMEOUT_MS, 10) || 20000;
37
+ const CLAUDE_MEANINGFUL_OUTPUT_TIMEOUT_MS = parseInt(process.env.CLAUDE_MEANINGFUL_OUTPUT_TIMEOUT_MS, 10) || 45000;
35
38
 
36
39
  // Generate a stable request ID for UI approval flows.
37
40
  // This does not encode tool details or get shown to users; it exists so the UI
@@ -273,6 +276,48 @@ function transformMessage(sdkMessage) {
273
276
  return sdkMessage;
274
277
  }
275
278
 
279
+ function messageHasMeaningfulClaudeOutput(message) {
280
+ if (!message || typeof message !== 'object') {
281
+ return false;
282
+ }
283
+
284
+ if (message.type === 'system' && message.subtype === 'init') {
285
+ return false;
286
+ }
287
+
288
+ if (message.type === 'content_block_delta') {
289
+ return typeof message.delta?.text === 'string' && message.delta.text.trim().length > 0;
290
+ }
291
+
292
+ if (message.type === 'thinking') {
293
+ return typeof message.message?.content === 'string' && message.message.content.trim().length > 0;
294
+ }
295
+
296
+ if (message.type === 'tool_use' || message.type === 'tool_result') {
297
+ return true;
298
+ }
299
+
300
+ const contentParts = Array.isArray(message.content)
301
+ ? message.content
302
+ : Array.isArray(message.message?.content)
303
+ ? message.message.content
304
+ : null;
305
+
306
+ if (contentParts) {
307
+ return contentParts.some((part) => (
308
+ (part?.type === 'text' && typeof part.text === 'string' && part.text.trim().length > 0) ||
309
+ part?.type === 'tool_use' ||
310
+ part?.type === 'tool_result'
311
+ ));
312
+ }
313
+
314
+ if (typeof message.content === 'string' && message.content.trim().length > 0) {
315
+ return true;
316
+ }
317
+
318
+ return false;
319
+ }
320
+
276
321
  /**
277
322
  * Extracts token usage from SDK result messages
278
323
  * @param {Object} resultMessage - SDK result message
@@ -468,24 +513,98 @@ async function loadMcpConfig(cwd) {
468
513
  * @returns {Promise<void>}
469
514
  */
470
515
  async function queryClaudeSDK(command, options = {}, ws) {
516
+ const workingDirectory = resolveWorkingDirectory(options);
517
+ const effectiveOptions = {
518
+ ...options,
519
+ cwd: workingDirectory
520
+ };
471
521
  const { sessionId } = options;
472
522
  let capturedSessionId = sessionId;
473
523
  let sessionCreatedSent = false;
474
524
  let tempImagePaths = [];
475
525
  let tempDir = null;
526
+ let queryInstance = null;
527
+ let startupTimeoutId = null;
528
+ let meaningfulOutputTimeoutId = null;
529
+ let timeoutTriggered = false;
530
+ let timeoutErrorMessage = null;
531
+
532
+ const clearStartupTimeout = () => {
533
+ if (startupTimeoutId) {
534
+ clearTimeout(startupTimeoutId);
535
+ startupTimeoutId = null;
536
+ }
537
+ };
538
+
539
+ const clearMeaningfulOutputTimeout = () => {
540
+ if (meaningfulOutputTimeoutId) {
541
+ clearTimeout(meaningfulOutputTimeoutId);
542
+ meaningfulOutputTimeoutId = null;
543
+ }
544
+ };
545
+
546
+ const interruptTimedOutQuery = () => {
547
+ if (!queryInstance || typeof queryInstance.interrupt !== 'function') {
548
+ return;
549
+ }
550
+
551
+ Promise.resolve(queryInstance.interrupt()).catch((interruptError) => {
552
+ console.warn('Failed to interrupt Claude SDK query after timeout:', interruptError);
553
+ });
554
+ };
555
+
556
+ const triggerStreamTimeout = (message) => {
557
+ if (timeoutTriggered) {
558
+ return;
559
+ }
560
+
561
+ timeoutTriggered = true;
562
+ timeoutErrorMessage = message;
563
+ interruptTimedOutQuery();
564
+ };
565
+
566
+ const armStartupTimeout = () => {
567
+ clearStartupTimeout();
568
+
569
+ if (!Number.isFinite(CLAUDE_STREAM_START_TIMEOUT_MS) || CLAUDE_STREAM_START_TIMEOUT_MS <= 0) {
570
+ return;
571
+ }
572
+
573
+ startupTimeoutId = setTimeout(() => {
574
+ triggerStreamTimeout(
575
+ `Claude did not produce any stream events within ${Math.round(CLAUDE_STREAM_START_TIMEOUT_MS / 1000)} seconds. ` +
576
+ 'This usually means the Claude client or upstream service is unavailable.'
577
+ );
578
+ }, CLAUDE_STREAM_START_TIMEOUT_MS);
579
+ };
580
+
581
+ const armMeaningfulOutputTimeout = () => {
582
+ clearMeaningfulOutputTimeout();
583
+
584
+ if (!Number.isFinite(CLAUDE_MEANINGFUL_OUTPUT_TIMEOUT_MS) || CLAUDE_MEANINGFUL_OUTPUT_TIMEOUT_MS <= 0) {
585
+ return;
586
+ }
587
+
588
+ meaningfulOutputTimeoutId = setTimeout(() => {
589
+ triggerStreamTimeout(
590
+ `Claude did not produce any assistant output within ${Math.round(CLAUDE_MEANINGFUL_OUTPUT_TIMEOUT_MS / 1000)} seconds. ` +
591
+ 'The upstream Claude service may be unavailable or stuck before the first response.'
592
+ );
593
+ }, CLAUDE_MEANINGFUL_OUTPUT_TIMEOUT_MS);
594
+ };
476
595
 
477
596
  try {
478
597
  // Map CLI options to SDK format
479
- const sdkOptions = mapCliOptionsToSDK(options);
598
+ const sdkOptions = mapCliOptionsToSDK(effectiveOptions);
480
599
 
481
600
  // Load MCP configuration
482
- const mcpServers = await loadMcpConfig(options.cwd);
601
+ const mcpServers = await loadMcpConfig(effectiveOptions.cwd);
483
602
  if (mcpServers) {
484
603
  sdkOptions.mcpServers = mcpServers;
485
604
  }
486
605
 
487
606
  // Handle images - save to temp files and modify prompt
488
- const imageResult = await handleImages(command, options.images, options.cwd);
607
+ const imageResult = await handleImages(command, effectiveOptions.images, effectiveOptions.cwd);
489
608
  const finalCommand = imageResult.modifiedCommand;
490
609
  tempImagePaths = imageResult.tempImagePaths;
491
610
  tempDir = imageResult.tempDir;
@@ -554,14 +673,29 @@ async function queryClaudeSDK(command, options = {}, ws) {
554
673
  sdkOptions.disallowedTools = sdkOptions.disallowedTools.filter(entry => entry !== decision.rememberEntry);
555
674
  }
556
675
  }
676
+ ws.send({
677
+ type: 'claude-permission-resolved',
678
+ requestId,
679
+ status: 'approved',
680
+ toolName,
681
+ sessionId: capturedSessionId || sessionId || null
682
+ });
557
683
  return { behavior: 'allow', updatedInput: decision.updatedInput ?? input };
558
684
  }
559
685
 
686
+ ws.send({
687
+ type: 'claude-permission-resolved',
688
+ requestId,
689
+ status: 'denied',
690
+ toolName,
691
+ message: decision.message ?? 'User denied tool use',
692
+ sessionId: capturedSessionId || sessionId || null
693
+ });
560
694
  return { behavior: 'deny', message: decision.message ?? 'User denied tool use' };
561
695
  };
562
696
 
563
697
  // Create SDK query instance
564
- const queryInstance = query({
698
+ queryInstance = query({
565
699
  prompt: finalCommand,
566
700
  options: sdkOptions
567
701
  });
@@ -573,7 +707,11 @@ async function queryClaudeSDK(command, options = {}, ws) {
573
707
 
574
708
  // Process streaming messages
575
709
  console.log('Starting async generator loop for session:', capturedSessionId || 'NEW');
710
+ armStartupTimeout();
711
+ armMeaningfulOutputTimeout();
576
712
  for await (const message of queryInstance) {
713
+ clearStartupTimeout();
714
+
577
715
  // Capture session ID from first message
578
716
  if (message.session_id && !capturedSessionId) {
579
717
 
@@ -590,7 +728,8 @@ async function queryClaudeSDK(command, options = {}, ws) {
590
728
  sessionCreatedSent = true;
591
729
  ws.send({
592
730
  type: 'session-created',
593
- sessionId: capturedSessionId
731
+ sessionId: capturedSessionId,
732
+ provider: 'claude'
594
733
  });
595
734
  } else {
596
735
  console.log('Not sending session-created. sessionId:', sessionId, 'sessionCreatedSent:', sessionCreatedSent);
@@ -604,9 +743,14 @@ async function queryClaudeSDK(command, options = {}, ws) {
604
743
  ws.send({
605
744
  type: 'claude-response',
606
745
  data: transformedMessage,
746
+ provider: 'claude',
607
747
  sessionId: capturedSessionId || sessionId || null
608
748
  });
609
749
 
750
+ if (messageHasMeaningfulClaudeOutput(message)) {
751
+ clearMeaningfulOutputTimeout();
752
+ }
753
+
610
754
  // Extract and send token budget updates from result messages
611
755
  if (message.type === 'result') {
612
756
  const tokenBudget = extractTokenBudget(message);
@@ -615,12 +759,17 @@ async function queryClaudeSDK(command, options = {}, ws) {
615
759
  ws.send({
616
760
  type: 'token-budget',
617
761
  data: tokenBudget,
762
+ provider: 'claude',
618
763
  sessionId: capturedSessionId || sessionId || null
619
764
  });
620
765
  }
621
766
  }
622
767
  }
623
768
 
769
+ if (timeoutTriggered) {
770
+ throw new Error(timeoutErrorMessage);
771
+ }
772
+
624
773
  // Clean up session on completion
625
774
  if (capturedSessionId) {
626
775
  removeSession(capturedSessionId);
@@ -633,6 +782,7 @@ async function queryClaudeSDK(command, options = {}, ws) {
633
782
  console.log('Streaming complete, sending claude-complete event');
634
783
  ws.send({
635
784
  type: 'claude-complete',
785
+ provider: 'claude',
636
786
  sessionId: capturedSessionId,
637
787
  exitCode: 0,
638
788
  isNewSession: !sessionId && !!command
@@ -653,11 +803,15 @@ async function queryClaudeSDK(command, options = {}, ws) {
653
803
  // Send error to WebSocket
654
804
  ws.send({
655
805
  type: 'claude-error',
656
- error: error.message,
806
+ error: timeoutErrorMessage || error.message,
807
+ provider: 'claude',
657
808
  sessionId: capturedSessionId || sessionId || null
658
809
  });
659
810
 
660
811
  throw error;
812
+ } finally {
813
+ clearStartupTimeout();
814
+ clearMeaningfulOutputTimeout();
661
815
  }
662
816
  }
663
817