@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
@@ -0,0 +1,390 @@
1
+ import {
2
+ CONVERSATION_EVENT_KINDS,
3
+ SUPPORTED_PROVIDERS
4
+ } from '../../shared/conversationEvents.js';
5
+ import {
6
+ mergeConversationEventHistories
7
+ } from './eventStore.js';
8
+ import { getProviderAdapter } from './providerAdapters.js';
9
+ import { getProjects } from '../projects.js';
10
+ import { isClaudeSDKSessionActive } from '../claude-sdk.js';
11
+ import { isCodexSessionActive } from '../openai-codex.js';
12
+ import { isGeminiSessionActive } from '../gemini-cli.js';
13
+ import { isOpencodeSessionActive } from '../opencode-cli.js';
14
+
15
+ export const AGENT_RUNTIME_PHASES = {
16
+ IDLE: 'idle',
17
+ QUEUED: 'queued',
18
+ STREAMING: 'streaming',
19
+ AWAITING_APPROVAL: 'awaiting_approval',
20
+ COMPLETED: 'completed',
21
+ ABORTED: 'aborted',
22
+ ERRORED: 'errored'
23
+ };
24
+
25
+ const ACTIVE_PHASES = new Set([
26
+ AGENT_RUNTIME_PHASES.QUEUED,
27
+ AGENT_RUNTIME_PHASES.STREAMING,
28
+ AGENT_RUNTIME_PHASES.AWAITING_APPROVAL
29
+ ]);
30
+ const TERMINAL_PHASES = new Set([
31
+ AGENT_RUNTIME_PHASES.COMPLETED,
32
+ AGENT_RUNTIME_PHASES.ABORTED,
33
+ AGENT_RUNTIME_PHASES.ERRORED
34
+ ]);
35
+ const sessionRuntimeListeners = new Set();
36
+ const lastBroadcastSignatures = new Map();
37
+
38
+ function normalizeNonEmptyString(value) {
39
+ if (typeof value !== 'string') {
40
+ return null;
41
+ }
42
+
43
+ const normalized = value.trim();
44
+ return normalized ? normalized : null;
45
+ }
46
+
47
+ function normalizeProvider(provider) {
48
+ const normalized = normalizeNonEmptyString(provider)?.toLowerCase() || null;
49
+ return SUPPORTED_PROVIDERS.includes(normalized) ? normalized : null;
50
+ }
51
+
52
+ function normalizePhase(phase) {
53
+ const normalized = normalizeNonEmptyString(phase)?.toLowerCase() || null;
54
+ return Object.values(AGENT_RUNTIME_PHASES).includes(normalized) ? normalized : null;
55
+ }
56
+
57
+ function getProviderProjectSessions(project, provider) {
58
+ if (!project || typeof project !== 'object') {
59
+ return [];
60
+ }
61
+
62
+ if (provider === 'claude') {
63
+ return Array.isArray(project.sessions) ? project.sessions : [];
64
+ }
65
+
66
+ if (provider === 'codex') {
67
+ return Array.isArray(project.codexSessions) ? project.codexSessions : [];
68
+ }
69
+
70
+ if (provider === 'gemini') {
71
+ return Array.isArray(project.geminiSessions) ? project.geminiSessions : [];
72
+ }
73
+
74
+ if (provider === 'opencode') {
75
+ return Array.isArray(project.opencodeSessions) ? project.opencodeSessions : [];
76
+ }
77
+
78
+ return [];
79
+ }
80
+
81
+ async function resolveSessionProjectContext(provider, sessionId) {
82
+ const normalizedProvider = normalizeProvider(provider);
83
+ const normalizedSessionId = normalizeNonEmptyString(sessionId);
84
+
85
+ if (!normalizedProvider || !normalizedSessionId) {
86
+ return null;
87
+ }
88
+
89
+ const projects = await getProjects();
90
+
91
+ for (const project of projects) {
92
+ const sessions = getProviderProjectSessions(project, normalizedProvider);
93
+ const matchedSession = sessions.find((session) => session?.id === normalizedSessionId);
94
+ if (!matchedSession) {
95
+ continue;
96
+ }
97
+
98
+ return {
99
+ projectName: project.name,
100
+ projectPath: project.fullPath || project.path || null,
101
+ session: matchedSession
102
+ };
103
+ }
104
+
105
+ return null;
106
+ }
107
+
108
+ async function loadProviderEvents(provider, sessionId) {
109
+ const normalizedProvider = normalizeProvider(provider);
110
+ const normalizedSessionId = normalizeNonEmptyString(sessionId);
111
+
112
+ if (!normalizedProvider || !normalizedSessionId) {
113
+ return { events: [], context: null, error: null };
114
+ }
115
+
116
+ const adapter = getProviderAdapter(normalizedProvider);
117
+ const context = await resolveSessionProjectContext(normalizedProvider, normalizedSessionId);
118
+
119
+ try {
120
+ const result = await adapter.loadEvents({
121
+ projectName: context?.projectName,
122
+ projectPath: context?.projectPath,
123
+ sessionId: normalizedSessionId,
124
+ limit: null,
125
+ offset: 0
126
+ });
127
+
128
+ const events = Array.isArray(result) ? result : (Array.isArray(result?.events) ? result.events : []);
129
+
130
+ return {
131
+ events,
132
+ context,
133
+ error: null
134
+ };
135
+ } catch (error) {
136
+ return {
137
+ events: [],
138
+ context,
139
+ error
140
+ };
141
+ }
142
+ }
143
+
144
+ function isSessionActive(provider, sessionId) {
145
+ const normalizedProvider = normalizeProvider(provider);
146
+ const normalizedSessionId = normalizeNonEmptyString(sessionId);
147
+
148
+ if (!normalizedProvider || !normalizedSessionId) {
149
+ return false;
150
+ }
151
+
152
+ if (normalizedProvider === 'codex') {
153
+ return Boolean(isCodexSessionActive(normalizedSessionId));
154
+ }
155
+
156
+ if (normalizedProvider === 'gemini') {
157
+ return Boolean(isGeminiSessionActive(normalizedSessionId));
158
+ }
159
+
160
+ if (normalizedProvider === 'opencode') {
161
+ return Boolean(isOpencodeSessionActive(normalizedSessionId));
162
+ }
163
+
164
+ return Boolean(isClaudeSDKSessionActive(normalizedSessionId));
165
+ }
166
+
167
+ function inferPhaseFromEvents(events = []) {
168
+ let inferredPhase = null;
169
+
170
+ for (const event of events) {
171
+ if (!event || typeof event !== 'object') {
172
+ continue;
173
+ }
174
+
175
+ if (event.kind === CONVERSATION_EVENT_KINDS.ERROR) {
176
+ inferredPhase = AGENT_RUNTIME_PHASES.ERRORED;
177
+ continue;
178
+ }
179
+
180
+ if (event.kind === CONVERSATION_EVENT_KINDS.SESSION_STATE_CHANGED) {
181
+ const nextPhase = normalizePhase(event.payload?.state);
182
+ if (nextPhase) {
183
+ inferredPhase = nextPhase;
184
+ }
185
+ continue;
186
+ }
187
+
188
+ if (event.kind === CONVERSATION_EVENT_KINDS.APPROVAL_REQUEST) {
189
+ inferredPhase = AGENT_RUNTIME_PHASES.AWAITING_APPROVAL;
190
+ continue;
191
+ }
192
+
193
+ if (event.kind === CONVERSATION_EVENT_KINDS.APPROVAL_RESOLVED) {
194
+ inferredPhase = AGENT_RUNTIME_PHASES.STREAMING;
195
+ continue;
196
+ }
197
+
198
+ if (
199
+ event.kind === CONVERSATION_EVENT_KINDS.ASSISTANT_TEXT_START ||
200
+ event.kind === CONVERSATION_EVENT_KINDS.ASSISTANT_TEXT_DELTA ||
201
+ event.kind === CONVERSATION_EVENT_KINDS.REASONING_START ||
202
+ event.kind === CONVERSATION_EVENT_KINDS.REASONING_DELTA ||
203
+ event.kind === CONVERSATION_EVENT_KINDS.TOOL_CALL_START ||
204
+ event.kind === CONVERSATION_EVENT_KINDS.TOOL_CALL_INPUT ||
205
+ event.kind === CONVERSATION_EVENT_KINDS.TOOL_CALL_END ||
206
+ event.kind === CONVERSATION_EVENT_KINDS.TOOL_RESULT ||
207
+ event.kind === CONVERSATION_EVENT_KINDS.SYSTEM_NOTICE
208
+ ) {
209
+ inferredPhase = AGENT_RUNTIME_PHASES.STREAMING;
210
+ }
211
+ }
212
+
213
+ return inferredPhase;
214
+ }
215
+
216
+ function inferPendingApproval(events = []) {
217
+ const pendingRequests = new Set();
218
+
219
+ for (const event of events) {
220
+ if (!event || typeof event !== 'object') {
221
+ continue;
222
+ }
223
+
224
+ const requestId = normalizeNonEmptyString(event.payload?.requestId) || normalizeNonEmptyString(event.extensions?.requestId);
225
+
226
+ if (event.kind === CONVERSATION_EVENT_KINDS.APPROVAL_REQUEST) {
227
+ if (requestId) {
228
+ pendingRequests.add(requestId);
229
+ }
230
+ continue;
231
+ }
232
+
233
+ if (event.kind === CONVERSATION_EVENT_KINDS.APPROVAL_RESOLVED) {
234
+ if (requestId) {
235
+ pendingRequests.delete(requestId);
236
+ }
237
+ continue;
238
+ }
239
+
240
+ if (event.kind === CONVERSATION_EVENT_KINDS.SESSION_STATE_CHANGED) {
241
+ const sessionState = normalizePhase(event.payload?.state);
242
+ if (
243
+ sessionState === AGENT_RUNTIME_PHASES.IDLE ||
244
+ sessionState === AGENT_RUNTIME_PHASES.COMPLETED ||
245
+ sessionState === AGENT_RUNTIME_PHASES.ABORTED ||
246
+ sessionState === AGENT_RUNTIME_PHASES.ERRORED
247
+ ) {
248
+ pendingRequests.clear();
249
+ }
250
+ }
251
+ }
252
+
253
+ return pendingRequests.size > 0;
254
+ }
255
+
256
+ function getLatestEventTimestamp(events = []) {
257
+ const latestEvent = [...events].reverse().find((event) => normalizeNonEmptyString(event?.timestamp));
258
+ return latestEvent?.timestamp || null;
259
+ }
260
+
261
+ function createRuntimeSignature(snapshot) {
262
+ return JSON.stringify({
263
+ phase: snapshot.phase,
264
+ isLoading: snapshot.isLoading,
265
+ canAbortSession: snapshot.canAbortSession,
266
+ hasPendingApproval: snapshot.hasPendingApproval
267
+ });
268
+ }
269
+
270
+ export function createSessionRuntimeSubscriptionKey(provider, sessionId) {
271
+ const normalizedProvider = normalizeProvider(provider);
272
+ const normalizedSessionId = normalizeNonEmptyString(sessionId);
273
+
274
+ if (!normalizedProvider || !normalizedSessionId) {
275
+ return null;
276
+ }
277
+
278
+ return `${normalizedProvider}:${normalizedSessionId}`;
279
+ }
280
+
281
+ export async function buildSessionRuntimeSnapshot(provider, sessionId, options = {}) {
282
+ const normalizedProvider = normalizeProvider(provider);
283
+ const normalizedSessionId = normalizeNonEmptyString(sessionId);
284
+
285
+ if (!normalizedProvider || !normalizedSessionId) {
286
+ return null;
287
+ }
288
+
289
+ const recentEvents = Array.isArray(options.recentEvents) ? options.recentEvents : [];
290
+ const { events: persistedEvents, context, error } = await loadProviderEvents(normalizedProvider, normalizedSessionId);
291
+ const mergedEvents = mergeConversationEventHistories(
292
+ persistedEvents,
293
+ recentEvents.filter((event) => event?.provider === normalizedProvider && event?.sessionId === normalizedSessionId)
294
+ );
295
+ const active = isSessionActive(normalizedProvider, normalizedSessionId);
296
+
297
+ const exists = active || Boolean(context) || mergedEvents.length > 0;
298
+ if (!exists) {
299
+ return null;
300
+ }
301
+
302
+ let phase = inferPhaseFromEvents(mergedEvents);
303
+ const hasPendingApproval = active ? inferPendingApproval(mergedEvents) : false;
304
+
305
+ if (TERMINAL_PHASES.has(phase)) {
306
+ // Keep terminal phase as-is.
307
+ } else if (hasPendingApproval) {
308
+ phase = AGENT_RUNTIME_PHASES.AWAITING_APPROVAL;
309
+ } else if (active) {
310
+ phase = ACTIVE_PHASES.has(phase) ? phase : AGENT_RUNTIME_PHASES.STREAMING;
311
+ } else {
312
+ phase = AGENT_RUNTIME_PHASES.IDLE;
313
+ }
314
+
315
+ const updatedAt = getLatestEventTimestamp(mergedEvents) || new Date().toISOString();
316
+
317
+ return {
318
+ sessionId: normalizedSessionId,
319
+ provider: normalizedProvider,
320
+ phase,
321
+ isLoading: active,
322
+ canAbortSession: active,
323
+ hasPendingApproval,
324
+ updatedAt,
325
+ _context: context,
326
+ _loadError: error || null
327
+ };
328
+ }
329
+
330
+ export function subscribeToSessionRuntimeStateChanges(listener) {
331
+ if (typeof listener !== 'function') {
332
+ return () => {};
333
+ }
334
+
335
+ sessionRuntimeListeners.add(listener);
336
+ return () => {
337
+ sessionRuntimeListeners.delete(listener);
338
+ };
339
+ }
340
+
341
+ export async function publishSessionRuntimeStateChanges(events = []) {
342
+ const groupedRecentEvents = new Map();
343
+
344
+ events.forEach((event) => {
345
+ const subscriptionKey = createSessionRuntimeSubscriptionKey(event?.provider, event?.sessionId);
346
+ if (!subscriptionKey) {
347
+ return;
348
+ }
349
+
350
+ if (!groupedRecentEvents.has(subscriptionKey)) {
351
+ groupedRecentEvents.set(subscriptionKey, []);
352
+ }
353
+
354
+ groupedRecentEvents.get(subscriptionKey).push(event);
355
+ });
356
+
357
+ await Promise.all(Array.from(groupedRecentEvents.entries()).map(async ([subscriptionKey, recentEvents]) => {
358
+ const [provider, sessionId] = subscriptionKey.split(':');
359
+ const snapshot = await buildSessionRuntimeSnapshot(provider, sessionId, { recentEvents });
360
+ if (!snapshot) {
361
+ return;
362
+ }
363
+
364
+ const signature = createRuntimeSignature(snapshot);
365
+ if (lastBroadcastSignatures.get(subscriptionKey) === signature) {
366
+ return;
367
+ }
368
+
369
+ lastBroadcastSignatures.set(subscriptionKey, signature);
370
+
371
+ sessionRuntimeListeners.forEach((listener) => {
372
+ try {
373
+ listener({
374
+ subscriptionKey,
375
+ snapshot: {
376
+ sessionId: snapshot.sessionId,
377
+ provider: snapshot.provider,
378
+ phase: snapshot.phase,
379
+ isLoading: snapshot.isLoading,
380
+ canAbortSession: snapshot.canAbortSession,
381
+ hasPendingApproval: snapshot.hasPendingApproval,
382
+ updatedAt: snapshot.updatedAt
383
+ }
384
+ });
385
+ } catch (error) {
386
+ console.warn('[WARN] Failed to notify session runtime listener:', error.message);
387
+ }
388
+ });
389
+ }));
390
+ }
@@ -0,0 +1,59 @@
1
+ import { normalizeRealtimePayloadToConversationEvents } from '../../shared/conversationEvents.js';
2
+ import { appendMirroredConversationEvents } from './eventStore.js';
3
+ import { publishSessionRuntimeStateChanges } from './runtimeState.js';
4
+
5
+ export class SessionEventMirrorWriter {
6
+ constructor(writer, provider = 'claude') {
7
+ this.writer = writer;
8
+ this.provider = provider;
9
+ this.sessionId = null;
10
+ this.isWebSocketWriter = writer?.isWebSocketWriter;
11
+ this.isSSEStreamWriter = writer?.isSSEStreamWriter;
12
+ }
13
+
14
+ send(data) {
15
+ if (data?.sessionId) {
16
+ this.sessionId = data.sessionId;
17
+ }
18
+
19
+ this.writer.send(data);
20
+
21
+ const normalizedEvents = normalizeRealtimePayloadToConversationEvents({
22
+ ...data,
23
+ provider: data?.provider || this.provider,
24
+ sessionId: data?.sessionId || this.sessionId
25
+ }, this.provider);
26
+
27
+ normalizedEvents.forEach((event) => {
28
+ this.writer.send({
29
+ type: 'conversation-event',
30
+ provider: event.provider,
31
+ sessionId: event.sessionId,
32
+ event
33
+ });
34
+ });
35
+
36
+ if (normalizedEvents.length > 0) {
37
+ void appendMirroredConversationEvents(normalizedEvents).catch((error) => {
38
+ console.warn('[WARN] Failed to persist mirrored conversation events:', error.message);
39
+ });
40
+ void publishSessionRuntimeStateChanges(normalizedEvents).catch((error) => {
41
+ console.warn('[WARN] Failed to publish runtime state changes:', error.message);
42
+ });
43
+ }
44
+ }
45
+
46
+ setSessionId(sessionId) {
47
+ this.sessionId = sessionId;
48
+ if (typeof this.writer.setSessionId === 'function') {
49
+ this.writer.setSessionId(sessionId);
50
+ }
51
+ }
52
+
53
+ getSessionId() {
54
+ if (typeof this.writer.getSessionId === 'function') {
55
+ return this.writer.getSessionId();
56
+ }
57
+ return this.sessionId;
58
+ }
59
+ }
@@ -0,0 +1,273 @@
1
+ import crypto from 'crypto';
2
+ import fetch from 'node-fetch';
3
+
4
+ export const DEFAULT_AGENT_CALLBACK_EVENTS = ['completed', 'errored', 'aborted'];
5
+ const VALID_AGENT_CALLBACK_EVENTS = new Set(DEFAULT_AGENT_CALLBACK_EVENTS);
6
+ const CALLBACK_ATTEMPT_TIMEOUT_MS = 5000;
7
+ const CALLBACK_RETRY_DELAYS_MS = [0, 1000, 5000];
8
+
9
+ export function normalizeAgentCallbackConfig(rawCallback) {
10
+ if (rawCallback == null) {
11
+ return null;
12
+ }
13
+
14
+ if (!rawCallback || typeof rawCallback !== 'object' || Array.isArray(rawCallback)) {
15
+ throw new Error('callback must be an object');
16
+ }
17
+
18
+ const rawUrl = typeof rawCallback.url === 'string' ? rawCallback.url.trim() : '';
19
+ if (!rawUrl) {
20
+ throw new Error('callback.url is required when callback is provided');
21
+ }
22
+
23
+ let parsedUrl;
24
+ try {
25
+ parsedUrl = new URL(rawUrl);
26
+ } catch {
27
+ throw new Error('callback.url must be a valid URL');
28
+ }
29
+
30
+ if (!['http:', 'https:'].includes(parsedUrl.protocol)) {
31
+ throw new Error('callback.url must use http or https');
32
+ }
33
+
34
+ if (rawCallback.secret !== undefined && typeof rawCallback.secret !== 'string') {
35
+ throw new Error('callback.secret must be a string when provided');
36
+ }
37
+
38
+ const eventsInput = rawCallback.events === undefined
39
+ ? DEFAULT_AGENT_CALLBACK_EVENTS
40
+ : rawCallback.events;
41
+
42
+ if (!Array.isArray(eventsInput)) {
43
+ throw new Error('callback.events must be an array when provided');
44
+ }
45
+
46
+ const normalizedEvents = [];
47
+ for (const event of eventsInput) {
48
+ if (typeof event !== 'string') {
49
+ throw new Error('callback.events must only contain strings');
50
+ }
51
+
52
+ const normalizedEvent = event.trim().toLowerCase();
53
+ if (!VALID_AGENT_CALLBACK_EVENTS.has(normalizedEvent)) {
54
+ throw new Error('callback.events can only include completed, errored, or aborted');
55
+ }
56
+
57
+ if (!normalizedEvents.includes(normalizedEvent)) {
58
+ normalizedEvents.push(normalizedEvent);
59
+ }
60
+ }
61
+
62
+ return {
63
+ url: parsedUrl.toString(),
64
+ events: normalizedEvents,
65
+ secret: rawCallback.secret ? rawCallback.secret : null
66
+ };
67
+ }
68
+
69
+ export function shouldDeliverAgentCallback(callbackConfig, event) {
70
+ return !!(callbackConfig && callbackConfig.events.includes(event));
71
+ }
72
+
73
+ export function createAgentCallbackEventId() {
74
+ if (typeof crypto.randomUUID === 'function') {
75
+ return `agentcb_${crypto.randomUUID()}`;
76
+ }
77
+
78
+ return `agentcb_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
79
+ }
80
+
81
+ export function createEmptyTokenSummary() {
82
+ return {
83
+ inputTokens: 0,
84
+ outputTokens: 0,
85
+ cacheReadTokens: 0,
86
+ cacheCreationTokens: 0,
87
+ totalTokens: 0
88
+ };
89
+ }
90
+
91
+ function normalizeResult(result = {}) {
92
+ return {
93
+ sessionPath: result.sessionPath ?? null,
94
+ sessionUrl: result.sessionUrl ?? null,
95
+ messages: Array.isArray(result.messages) ? result.messages : [],
96
+ tokens: result.tokens && typeof result.tokens === 'object'
97
+ ? {
98
+ inputTokens: Number(result.tokens.inputTokens) || 0,
99
+ outputTokens: Number(result.tokens.outputTokens) || 0,
100
+ cacheReadTokens: Number(result.tokens.cacheReadTokens) || 0,
101
+ cacheCreationTokens: Number(result.tokens.cacheCreationTokens) || 0,
102
+ totalTokens: Number(result.tokens.totalTokens) || 0
103
+ }
104
+ : createEmptyTokenSummary(),
105
+ branch: result.branch ?? null,
106
+ pullRequest: result.pullRequest ?? null
107
+ };
108
+ }
109
+
110
+ export function buildAgentCallbackPayload({
111
+ event,
112
+ eventId,
113
+ sessionId = null,
114
+ provider,
115
+ projectPath = null,
116
+ isResumed = false,
117
+ startedAt,
118
+ finishedAt,
119
+ result,
120
+ error = null
121
+ }) {
122
+ const success = event === 'completed';
123
+
124
+ return {
125
+ event,
126
+ eventId,
127
+ sessionId,
128
+ provider,
129
+ status: event,
130
+ success,
131
+ projectPath,
132
+ isResumed,
133
+ startedAt,
134
+ finishedAt,
135
+ result: normalizeResult(result),
136
+ error: error ? { message: error.message || String(error) } : null
137
+ };
138
+ }
139
+
140
+ export function signAgentCallbackBody(secret, rawBody) {
141
+ const digest = crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
142
+ return `sha256=${digest}`;
143
+ }
144
+
145
+ function getCallbackTargetHost(url) {
146
+ try {
147
+ return new URL(url).host;
148
+ } catch {
149
+ return url;
150
+ }
151
+ }
152
+
153
+ function sleep(ms) {
154
+ return new Promise((resolve) => {
155
+ setTimeout(resolve, ms);
156
+ });
157
+ }
158
+
159
+ export async function deliverAgentCallbackAttempt({
160
+ callback,
161
+ payload,
162
+ eventId,
163
+ attempt,
164
+ logger = console
165
+ }) {
166
+ const rawBody = JSON.stringify(payload);
167
+ const headers = {
168
+ 'Content-Type': 'application/json',
169
+ 'User-Agent': 'Axhub-Genie-Callback/1.0',
170
+ 'X-Agent-Event': payload.event,
171
+ 'X-Agent-Event-Id': eventId,
172
+ 'X-Agent-Delivery-Attempt': String(attempt),
173
+ };
174
+
175
+ if (callback.secret) {
176
+ headers['X-Agent-Signature'] = signAgentCallbackBody(callback.secret, rawBody);
177
+ }
178
+
179
+ const controller = new AbortController();
180
+ const timeoutId = setTimeout(() => controller.abort(), CALLBACK_ATTEMPT_TIMEOUT_MS);
181
+ const host = getCallbackTargetHost(callback.url);
182
+
183
+ try {
184
+ const response = await fetch(callback.url, {
185
+ method: 'POST',
186
+ headers,
187
+ body: rawBody,
188
+ signal: controller.signal
189
+ });
190
+
191
+ const retryable = response.status >= 500;
192
+ logger.info?.(
193
+ `[AgentCallback] attempt=${attempt} eventId=${eventId} sessionId=${payload.sessionId || 'unknown'} host=${host} status=${response.status}`
194
+ );
195
+
196
+ return {
197
+ ok: response.ok,
198
+ status: response.status,
199
+ retryable
200
+ };
201
+ } catch (error) {
202
+ const isAbortTimeout = error?.name === 'AbortError';
203
+ logger.warn?.(
204
+ `[AgentCallback] attempt=${attempt} eventId=${eventId} sessionId=${payload.sessionId || 'unknown'} host=${host} error=${isAbortTimeout ? 'timeout' : (error.message || error)}`
205
+ );
206
+
207
+ return {
208
+ ok: false,
209
+ status: null,
210
+ retryable: true,
211
+ error
212
+ };
213
+ } finally {
214
+ clearTimeout(timeoutId);
215
+ }
216
+ }
217
+
218
+ export async function deliverAgentCallbackWithRetry({
219
+ callback,
220
+ payload,
221
+ logger = console
222
+ }) {
223
+ const eventId = payload.eventId;
224
+ let finalResult = null;
225
+
226
+ for (let index = 0; index < CALLBACK_RETRY_DELAYS_MS.length; index += 1) {
227
+ const attempt = index + 1;
228
+ const delayMs = CALLBACK_RETRY_DELAYS_MS[index];
229
+
230
+ if (delayMs > 0) {
231
+ await sleep(delayMs);
232
+ }
233
+
234
+ const result = await deliverAgentCallbackAttempt({
235
+ callback,
236
+ payload,
237
+ eventId,
238
+ attempt,
239
+ logger
240
+ });
241
+ finalResult = result;
242
+
243
+ if (result.ok) {
244
+ return result;
245
+ }
246
+
247
+ if (!result.retryable || attempt >= CALLBACK_RETRY_DELAYS_MS.length) {
248
+ break;
249
+ }
250
+ }
251
+
252
+ logger.warn?.(
253
+ `[AgentCallback] delivery_failed eventId=${eventId} sessionId=${payload.sessionId || 'unknown'} host=${getCallbackTargetHost(callback.url)} status=${finalResult?.status ?? 'n/a'}`
254
+ );
255
+
256
+ return finalResult;
257
+ }
258
+
259
+ export function scheduleAgentCallbackDelivery({
260
+ callback,
261
+ payload,
262
+ logger = console
263
+ }) {
264
+ return Promise.resolve().then(() => deliverAgentCallbackWithRetry({
265
+ callback,
266
+ payload,
267
+ logger
268
+ })).catch((error) => {
269
+ logger.warn?.(
270
+ `[AgentCallback] unexpected_delivery_error eventId=${payload?.eventId || 'unknown'} error=${error.message || error}`
271
+ );
272
+ });
273
+ }