@rynx-ai/server 0.1.11-beta.4 → 0.1.11-beta.41

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 (497) hide show
  1. package/dist/control-api.d.ts +17 -4
  2. package/dist/control-api.js +722 -84
  3. package/dist/control-web/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  4. package/dist/control-web/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  5. package/dist/control-web/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  6. package/dist/control-web/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  7. package/dist/control-web/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  8. package/dist/control-web/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  9. package/dist/control-web/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  10. package/dist/control-web/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  11. package/dist/control-web/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  12. package/dist/control-web/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  13. package/dist/control-web/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  14. package/dist/control-web/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  15. package/dist/control-web/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  16. package/dist/control-web/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  17. package/dist/control-web/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  18. package/dist/control-web/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  19. package/dist/control-web/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  20. package/dist/control-web/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  21. package/dist/control-web/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  22. package/dist/control-web/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  23. package/dist/control-web/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  24. package/dist/control-web/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  25. package/dist/control-web/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  26. package/dist/control-web/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  27. package/dist/control-web/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  28. package/dist/control-web/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  29. package/dist/control-web/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  30. package/dist/control-web/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  31. package/dist/control-web/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  32. package/dist/control-web/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  33. package/dist/control-web/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  34. package/dist/control-web/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  35. package/dist/control-web/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  36. package/dist/control-web/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  37. package/dist/control-web/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  38. package/dist/control-web/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  39. package/dist/control-web/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  40. package/dist/control-web/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  41. package/dist/control-web/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  42. package/dist/control-web/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  43. package/dist/control-web/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  44. package/dist/control-web/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  45. package/dist/control-web/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  46. package/dist/control-web/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  47. package/dist/control-web/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  48. package/dist/control-web/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  49. package/dist/control-web/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  50. package/dist/control-web/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  51. package/dist/control-web/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  52. package/dist/control-web/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  53. package/dist/control-web/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  54. package/dist/control-web/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  55. package/dist/control-web/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  56. package/dist/control-web/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  57. package/dist/control-web/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  58. package/dist/control-web/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  59. package/dist/control-web/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  60. package/dist/control-web/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  61. package/dist/control-web/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  62. package/dist/control-web/assets/abap-CLvhMVsD.js +1 -0
  63. package/dist/control-web/assets/abnfDiagram-VRR7QNED-D_NL89dn.js +1 -0
  64. package/dist/control-web/assets/actionscript-3--17pq3dv.js +1 -0
  65. package/dist/control-web/assets/ada-C5qYipkI.js +1 -0
  66. package/dist/control-web/assets/andromeeda-vGVdxbeo.js +1 -0
  67. package/dist/control-web/assets/angular-html-DlZBZkSp.js +1 -0
  68. package/dist/control-web/assets/angular-ts-BVPGOT0K.js +1 -0
  69. package/dist/control-web/assets/apache-U0d_L8uA.js +1 -0
  70. package/dist/control-web/assets/apex-CGTLDQj6.js +1 -0
  71. package/dist/control-web/assets/apl-cDmXqmZ-.js +1 -0
  72. package/dist/control-web/assets/applescript-CCn79oCD.js +1 -0
  73. package/dist/control-web/assets/ara-4CJ0cIlV.js +1 -0
  74. package/dist/control-web/assets/arc-Pry-7G1_.js +1 -0
  75. package/dist/control-web/assets/architecture-TIHT7OUA-C9wU1KtW.js +1 -0
  76. package/dist/control-web/assets/architectureDiagram-ZJ3FMSHR-CV0rxVH6.js +36 -0
  77. package/dist/control-web/assets/array-BifhSqXX.js +1 -0
  78. package/dist/control-web/assets/asciidoc-DE70LPWp.js +1 -0
  79. package/dist/control-web/assets/asm-Cmm7eHzH.js +1 -0
  80. package/dist/control-web/assets/astro-B1Q6BwBx.js +1 -0
  81. package/dist/control-web/assets/aurora-x-CDeNXAV0.js +1 -0
  82. package/dist/control-web/assets/awk-BWXHIvNe.js +1 -0
  83. package/dist/control-web/assets/ayu-dark-DluEY0Gj.js +1 -0
  84. package/dist/control-web/assets/ayu-light-C3h-C4tm.js +1 -0
  85. package/dist/control-web/assets/ayu-mirage-Bqwy1Gya.js +1 -0
  86. package/dist/control-web/assets/ballerina-B7ZEbQpA.js +1 -0
  87. package/dist/control-web/assets/bat-Bo4NYOV-.js +1 -0
  88. package/dist/control-web/assets/beancount-D-usSTwE.js +1 -0
  89. package/dist/control-web/assets/berry-DKpUyyne.js +1 -0
  90. package/dist/control-web/assets/bibtex-Ci_nEsc7.js +1 -0
  91. package/dist/control-web/assets/bicep-CUHmPFLl.js +1 -0
  92. package/dist/control-web/assets/bird2-C2hNVINV.js +1 -0
  93. package/dist/control-web/assets/blade-Xpu-LGTm.js +1 -0
  94. package/dist/control-web/assets/blockDiagram-677ZJIJ3-Cc7nrkZh.js +132 -0
  95. package/dist/control-web/assets/bsl-BkkzgIyY.js +1 -0
  96. package/dist/control-web/assets/c-iCihek07.js +1 -0
  97. package/dist/control-web/assets/c3-CnJL0r0V.js +1 -0
  98. package/dist/control-web/assets/c4Diagram-LMCZKHZV-BPRU9m-F.js +10 -0
  99. package/dist/control-web/assets/cadence-CQ2zXKGN.js +1 -0
  100. package/dist/control-web/assets/cairo-DLTphjLi.js +1 -0
  101. package/dist/control-web/assets/catppuccin-frappe-3VR1Za6u.js +1 -0
  102. package/dist/control-web/assets/catppuccin-latte-DwIHMF0Q.js +1 -0
  103. package/dist/control-web/assets/catppuccin-macchiato-DYnBP6_5.js +1 -0
  104. package/dist/control-web/assets/catppuccin-mocha-DYhrFGRu.js +1 -0
  105. package/dist/control-web/assets/channel-BFm2_j8K.js +1 -0
  106. package/dist/control-web/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  107. package/dist/control-web/assets/chunk-32BRIVSS-Bbq3O54m.js +1 -0
  108. package/dist/control-web/assets/chunk-52WLFC77-sD4al-Ob.js +10 -0
  109. package/dist/control-web/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  110. package/dist/control-web/assets/chunk-7BUUIJ7U-Bb538aSH.js +1 -0
  111. package/dist/control-web/assets/chunk-C7G6YPKG-DqHaDS1O.js +1 -0
  112. package/dist/control-web/assets/chunk-EX3LRPZG-36GNQ5wp.js +231 -0
  113. package/dist/control-web/assets/chunk-HOUHSVGY-DeZ63q1j.js +1 -0
  114. package/dist/control-web/assets/chunk-ICXQ74PX-D2yF6lD_.js +2 -0
  115. package/dist/control-web/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  116. package/dist/control-web/assets/chunk-KEIR6QF5-BICK3FdT.js +161 -0
  117. package/dist/control-web/assets/chunk-MOJQB5TN-CdaKyBz5.js +88 -0
  118. package/dist/control-web/assets/chunk-OGEWGWER-eOXC7kiH.js +1 -0
  119. package/dist/control-web/assets/chunk-PUDLZKDR-6w0LILL_.js +156 -0
  120. package/dist/control-web/assets/chunk-Q4XR5HBZ-CXgD5TGL.js +70 -0
  121. package/dist/control-web/assets/chunk-RYQCIY6F-BsoV8yK2.js +1 -0
  122. package/dist/control-web/assets/chunk-V7JOEXUC-BfoZ78b6.js +206 -0
  123. package/dist/control-web/assets/chunk-VR4S4FIN-BW2gCEMQ.js +1 -0
  124. package/dist/control-web/assets/chunk-WYO6CB5R-CHn7hulw.js +128 -0
  125. package/dist/control-web/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
  126. package/dist/control-web/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  127. package/dist/control-web/assets/chunk-ZGVPDNZ5-CmFP0-fr.js +62 -0
  128. package/dist/control-web/assets/clarity-SemFz856.js +1 -0
  129. package/dist/control-web/assets/classDiagram-OUVF2IWQ-CUe_bETB.js +1 -0
  130. package/dist/control-web/assets/classDiagram-v2-EOCWNBFH-CUe_bETB.js +1 -0
  131. package/dist/control-web/assets/clojure-DqKBuwfJ.js +1 -0
  132. package/dist/control-web/assets/cmake-Bj61d0ZC.js +1 -0
  133. package/dist/control-web/assets/cobol-BsV-839J.js +1 -0
  134. package/dist/control-web/assets/codeowners-C8r90Shi.js +1 -0
  135. package/dist/control-web/assets/codeql-oeQT6MSM.js +1 -0
  136. package/dist/control-web/assets/coffee-CiiSLhB6.js +1 -0
  137. package/dist/control-web/assets/common-lisp-Cv5bFMCO.js +1 -0
  138. package/dist/control-web/assets/coq-BrsZFFmf.js +1 -0
  139. package/dist/control-web/assets/cose-bilkent-JH36ORCC-lJEhNiw_.js +1 -0
  140. package/dist/control-web/assets/cpp-DjoE5qBx.js +1 -0
  141. package/dist/control-web/assets/crystal-DDxHDkHz.js +1 -0
  142. package/dist/control-web/assets/csharp-Ct8U2NOr.js +1 -0
  143. package/dist/control-web/assets/css-LjpOdHib.js +1 -0
  144. package/dist/control-web/assets/csv-Dx-8-gkx.js +1 -0
  145. package/dist/control-web/assets/cue-CE9AQfxI.js +1 -0
  146. package/dist/control-web/assets/cynefin-VYW2F7L2-NaLr7Qlq.js +1 -0
  147. package/dist/control-web/assets/cynefinDiagram-TSTJHNR4-C90wpjAI.js +62 -0
  148. package/dist/control-web/assets/cypher-ClKdZ_lG.js +1 -0
  149. package/dist/control-web/assets/cytoscape.esm-B-NFISlW.js +321 -0
  150. package/dist/control-web/assets/d-qD-0Kul2.js +1 -0
  151. package/dist/control-web/assets/dagre-Buvkdvvj.js +1 -0
  152. package/dist/control-web/assets/dagre-VKFMJZFB-BxrPFWTb.js +4 -0
  153. package/dist/control-web/assets/dark-plus-Cs2F2srj.js +1 -0
  154. package/dist/control-web/assets/dart-DkHntEIa.js +1 -0
  155. package/dist/control-web/assets/dax-BkyTk9wS.js +1 -0
  156. package/dist/control-web/assets/defaultLocale-BFoDCU3G.js +1 -0
  157. package/dist/control-web/assets/desktop-Dlh5hvp9.js +1 -0
  158. package/dist/control-web/assets/diagram-FQU43EPY-VIQINsvz.js +3 -0
  159. package/dist/control-web/assets/diagram-G47NLZAW-DFeAfYXn.js +24 -0
  160. package/dist/control-web/assets/diagram-NH7WQ7WH-ATzdppDd.js +24 -0
  161. package/dist/control-web/assets/diagram-OA4YK3LP-DJZpWmbl.js +30 -0
  162. package/dist/control-web/assets/diagram-WEI45ONY-CqDHcW3g.js +41 -0
  163. package/dist/control-web/assets/diff-woXpYk--.js +1 -0
  164. package/dist/control-web/assets/dist-Dx9YWgcW.js +153 -0
  165. package/dist/control-web/assets/dist-v5Q1xZ2K.js +1 -0
  166. package/dist/control-web/assets/docker-IyjqRm3v.js +1 -0
  167. package/dist/control-web/assets/dotenv-_5a1GRtc.js +1 -0
  168. package/dist/control-web/assets/dracula-BHWKrbxM.js +1 -0
  169. package/dist/control-web/assets/dracula-soft-5eyTD99u.js +1 -0
  170. package/dist/control-web/assets/dream-maker-DW3nJb8Q.js +1 -0
  171. package/dist/control-web/assets/ebnfDiagram-CCIWWBDH-DnP6dHND.js +1 -0
  172. package/dist/control-web/assets/edge-8z7Jp9dO.js +1 -0
  173. package/dist/control-web/assets/elixir-CUV54ev5.js +1 -0
  174. package/dist/control-web/assets/elm-o4NJxfws.js +1 -0
  175. package/dist/control-web/assets/emacs-lisp-C9PiwqqW.js +1 -0
  176. package/dist/control-web/assets/erDiagram-Q63AITRT-Bo8bFqrZ.js +85 -0
  177. package/dist/control-web/assets/erb-CIsHcwm1.js +1 -0
  178. package/dist/control-web/assets/erlang-Cphh6RMH.js +1 -0
  179. package/dist/control-web/assets/eventmodeling-45OFAUF4-DTN8wqsu.js +1 -0
  180. package/dist/control-web/assets/everforest-dark-sB-x3p7T.js +1 -0
  181. package/dist/control-web/assets/everforest-light-Df2xbC6M.js +1 -0
  182. package/dist/control-web/assets/fennel-DQxkIbk2.js +1 -0
  183. package/dist/control-web/assets/fish-BJitypiv.js +1 -0
  184. package/dist/control-web/assets/flowDiagram-23GEKE2U-BwjqRyvd.js +1 -0
  185. package/dist/control-web/assets/fluent-C03EYrpw.js +1 -0
  186. package/dist/control-web/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
  187. package/dist/control-web/assets/fortran-free-form-CYNrtFtB.js +1 -0
  188. package/dist/control-web/assets/fsharp-D13ZGOAj.js +1 -0
  189. package/dist/control-web/assets/ganttDiagram-NO4QXBWP-kxQaBTzd.js +292 -0
  190. package/dist/control-web/assets/gdresource-C0sCabJj.js +1 -0
  191. package/dist/control-web/assets/gdscript-Cp2uCuqX.js +1 -0
  192. package/dist/control-web/assets/gdshader-CBce3t8t.js +1 -0
  193. package/dist/control-web/assets/genie-CV2tkWYe.js +1 -0
  194. package/dist/control-web/assets/gherkin-DExj1W_8.js +1 -0
  195. package/dist/control-web/assets/git-commit-BSykSTBG.js +1 -0
  196. package/dist/control-web/assets/git-rebase-BDPpS8w6.js +1 -0
  197. package/dist/control-web/assets/gitGraph-TEB2WS4Q-a646NnuJ.js +1 -0
  198. package/dist/control-web/assets/gitGraphDiagram-IHSO6WYX-BBe0q0At.js +106 -0
  199. package/dist/control-web/assets/github-dark-C-LZuMrd.js +1 -0
  200. package/dist/control-web/assets/github-dark-default-DXG-b-1a.js +1 -0
  201. package/dist/control-web/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
  202. package/dist/control-web/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
  203. package/dist/control-web/assets/github-light-EUqPIrTm.js +1 -0
  204. package/dist/control-web/assets/github-light-default-BXViO-2h.js +1 -0
  205. package/dist/control-web/assets/github-light-high-contrast-B68TUdTA.js +1 -0
  206. package/dist/control-web/assets/gleam-CSRkHgEL.js +1 -0
  207. package/dist/control-web/assets/glimmer-js-OEO36pDk.js +1 -0
  208. package/dist/control-web/assets/glimmer-ts-BnAPyISE.js +1 -0
  209. package/dist/control-web/assets/glsl-D5MA2a_X.js +1 -0
  210. package/dist/control-web/assets/gn-ilITqXS6.js +1 -0
  211. package/dist/control-web/assets/gnuplot-7GGW24-e.js +1 -0
  212. package/dist/control-web/assets/go-BJwz_mda.js +1 -0
  213. package/dist/control-web/assets/graphlib-DS17s2tU.js +1 -0
  214. package/dist/control-web/assets/graphql-Ctjuxyvl.js +1 -0
  215. package/dist/control-web/assets/groovy-CacY0gHj.js +1 -0
  216. package/dist/control-web/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
  217. package/dist/control-web/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
  218. package/dist/control-web/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
  219. package/dist/control-web/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
  220. package/dist/control-web/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
  221. package/dist/control-web/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
  222. package/dist/control-web/assets/hack-D_mkkoLd.js +1 -0
  223. package/dist/control-web/assets/haml-mpgecWZ6.js +1 -0
  224. package/dist/control-web/assets/handlebars-CAx_777f.js +1 -0
  225. package/dist/control-web/assets/haskell-D8IpX4py.js +1 -0
  226. package/dist/control-web/assets/haxe-OTjmBuCE.js +1 -0
  227. package/dist/control-web/assets/hcl-Dh228itO.js +1 -0
  228. package/dist/control-web/assets/highlighted-body-OFNGDK62-DVCHy9oI.js +1 -0
  229. package/dist/control-web/assets/hjson-CxZEssPk.js +1 -0
  230. package/dist/control-web/assets/hlsl-Cvrh5tZx.js +1 -0
  231. package/dist/control-web/assets/horizon-CE9ld1lL.js +1 -0
  232. package/dist/control-web/assets/horizon-bright-Br1oVSNq.js +1 -0
  233. package/dist/control-web/assets/houston-CsvMBhTu.js +1 -0
  234. package/dist/control-web/assets/html-B2lrdnWr.js +1 -0
  235. package/dist/control-web/assets/html-derivative-CDfZYcul.js +1 -0
  236. package/dist/control-web/assets/http-kmH8AyfE.js +1 -0
  237. package/dist/control-web/assets/hurl-DCZHXKU4.js +1 -0
  238. package/dist/control-web/assets/hxml-B0Qn7Nwc.js +1 -0
  239. package/dist/control-web/assets/hy-CZbG8q4J.js +1 -0
  240. package/dist/control-web/assets/imba-DsUTQ-LC.js +1 -0
  241. package/dist/control-web/assets/index-D7URT6K_.js +140 -0
  242. package/dist/control-web/assets/index-uEpvRMX9.css +1 -0
  243. package/dist/control-web/assets/info-DKCQHKI2-Cp_JrY-b.js +1 -0
  244. package/dist/control-web/assets/infoDiagram-FWYZ7A6U-CAm-h4F_.js +2 -0
  245. package/dist/control-web/assets/ini-B5eOa1yu.js +1 -0
  246. package/dist/control-web/assets/init-C-OQMol4.js +1 -0
  247. package/dist/control-web/assets/ishikawaDiagram-FXEZZL3T-O17pqcWr.js +70 -0
  248. package/dist/control-web/assets/java-DdHNQ9hk.js +1 -0
  249. package/dist/control-web/assets/javascript-obGGvMPs.js +1 -0
  250. package/dist/control-web/assets/jinja-BMiPVedm.js +1 -0
  251. package/dist/control-web/assets/jison-CBjhYtSs.js +1 -0
  252. package/dist/control-web/assets/journeyDiagram-5HDEW3XC-DQ-JuSoR.js +139 -0
  253. package/dist/control-web/assets/json-DAgxKhMr.js +1 -0
  254. package/dist/control-web/assets/json5-BR5RXkoi.js +1 -0
  255. package/dist/control-web/assets/jsonc-CYpm1nAK.js +1 -0
  256. package/dist/control-web/assets/jsonl-CmCQp5Yx.js +1 -0
  257. package/dist/control-web/assets/jsonnet-CJTPZ8u_.js +1 -0
  258. package/dist/control-web/assets/jssm-DXw9l8Rf.js +1 -0
  259. package/dist/control-web/assets/jsx-gTgmArGx.js +1 -0
  260. package/dist/control-web/assets/julia-CjHxn3vf.js +1 -0
  261. package/dist/control-web/assets/just-DMArCiVH.js +1 -0
  262. package/dist/control-web/assets/kanagawa-dragon-CXtmUGW6.js +1 -0
  263. package/dist/control-web/assets/kanagawa-lotus-BN08jTvb.js +1 -0
  264. package/dist/control-web/assets/kanagawa-wave-CTweb8Dz.js +1 -0
  265. package/dist/control-web/assets/kanban-definition-HUTT4EX6-Cgv3kPbm.js +89 -0
  266. package/dist/control-web/assets/katex-CyHG4N6b.js +1 -0
  267. package/dist/control-web/assets/kdl-CsD5j6eV.js +1 -0
  268. package/dist/control-web/assets/kotlin-DhhofPvG.js +1 -0
  269. package/dist/control-web/assets/kusto-BUv0MjJC.js +1 -0
  270. package/dist/control-web/assets/laserwave-C_8bwKvT.js +1 -0
  271. package/dist/control-web/assets/latex-D9bvcAJr.js +1 -0
  272. package/dist/control-web/assets/lean-CewbzKMR.js +1 -0
  273. package/dist/control-web/assets/less-DVTAwKKz.js +1 -0
  274. package/dist/control-web/assets/lib-BZ_F5vVH.js +1 -0
  275. package/dist/control-web/assets/light-plus-DVQuIRkW.js +1 -0
  276. package/dist/control-web/assets/line-DUsXzGJZ.js +1 -0
  277. package/dist/control-web/assets/linear-DmucvK78.js +1 -0
  278. package/dist/control-web/assets/liquid-CCX5qouA.js +1 -0
  279. package/dist/control-web/assets/llvm-Cm23YOpf.js +1 -0
  280. package/dist/control-web/assets/log-BNLmms1o.js +1 -0
  281. package/dist/control-web/assets/logo-Cluzi2Zq.js +1 -0
  282. package/dist/control-web/assets/lua-FONpmTUP.js +1 -0
  283. package/dist/control-web/assets/luau-CNKltnaQ.js +1 -0
  284. package/dist/control-web/assets/make-Dixweg8N.js +1 -0
  285. package/dist/control-web/assets/map-BaFkSB1l.js +1 -0
  286. package/dist/control-web/assets/markdown-BYOwaDjH.js +1 -0
  287. package/dist/control-web/assets/markdown-streamdown-4N4AcNp5.js +433 -0
  288. package/dist/control-web/assets/markdown-streamdown-DEcVZfaU.css +1 -0
  289. package/dist/control-web/assets/marko-oPGh3KfH.js +1 -0
  290. package/dist/control-web/assets/material-theme-Bm3Qr25_.js +1 -0
  291. package/dist/control-web/assets/material-theme-darker-2IIEA8gg.js +1 -0
  292. package/dist/control-web/assets/material-theme-lighter-uhdI0v04.js +1 -0
  293. package/dist/control-web/assets/material-theme-ocean-CHQ94UKr.js +1 -0
  294. package/dist/control-web/assets/material-theme-palenight-B5W6OYN7.js +1 -0
  295. package/dist/control-web/assets/matlab-D7qyCx1q.js +1 -0
  296. package/dist/control-web/assets/mdc-B_uQHOlt.js +1 -0
  297. package/dist/control-web/assets/mdx-DQZ5AkYe.js +1 -0
  298. package/dist/control-web/assets/mermaid-Bk4SNUv9.js +1 -0
  299. package/dist/control-web/assets/mermaid-GHXKKRXX-BElZGKGd.js +1 -0
  300. package/dist/control-web/assets/mermaid-parser.core-VMln12Kd.js +7 -0
  301. package/dist/control-web/assets/min-dark-BSWPekZh.js +1 -0
  302. package/dist/control-web/assets/min-light-DDpmG2fV.js +1 -0
  303. package/dist/control-web/assets/mindmap-definition-LN4V7U3C-Bn0lH-UM.js +96 -0
  304. package/dist/control-web/assets/mipsasm-BMqwQI7S.js +1 -0
  305. package/dist/control-web/assets/mojo-BgCJLMeH.js +1 -0
  306. package/dist/control-web/assets/monokai-CdkpiU2Y.js +1 -0
  307. package/dist/control-web/assets/moonbit-CaWjb8XO.js +1 -0
  308. package/dist/control-web/assets/move-B1IS1UjX.js +1 -0
  309. package/dist/control-web/assets/narrat-_X_XdTYD.js +1 -0
  310. package/dist/control-web/assets/nextflow-Bbiyy34d.js +1 -0
  311. package/dist/control-web/assets/nextflow-groovy-Dc_ddanL.js +1 -0
  312. package/dist/control-web/assets/nginx-BTMw9COX.js +1 -0
  313. package/dist/control-web/assets/night-owl-DhmEMT88.js +1 -0
  314. package/dist/control-web/assets/night-owl-light-eJ-hLW7d.js +1 -0
  315. package/dist/control-web/assets/nim-8PQFL6ZB.js +1 -0
  316. package/dist/control-web/assets/nix-IvuFDN5E.js +1 -0
  317. package/dist/control-web/assets/nord-Cb4Vim4T.js +1 -0
  318. package/dist/control-web/assets/nushell-DcLAeLz5.js +1 -0
  319. package/dist/control-web/assets/objective-c-D1A_Heim.js +1 -0
  320. package/dist/control-web/assets/objective-cpp-BsSzOQcm.js +1 -0
  321. package/dist/control-web/assets/ocaml-O90oeIOV.js +1 -0
  322. package/dist/control-web/assets/odin-B1RWQWA5.js +1 -0
  323. package/dist/control-web/assets/one-dark-pro-CLwyXe_n.js +1 -0
  324. package/dist/control-web/assets/one-light-D7Lr4KcI.js +1 -0
  325. package/dist/control-web/assets/openscad-BUDT5pXO.js +1 -0
  326. package/dist/control-web/assets/ordinal-BDEzSJ7C.js +1 -0
  327. package/dist/control-web/assets/packet-7NZHBO7P-Zw8iJ8lo.js +1 -0
  328. package/dist/control-web/assets/pascal-4ZHwLPI5.js +1 -0
  329. package/dist/control-web/assets/path-fybaL0A-.js +1 -0
  330. package/dist/control-web/assets/pegDiagram-2B236MQR-CtF7vVs_.js +1 -0
  331. package/dist/control-web/assets/perl-Vf0i0hAx.js +1 -0
  332. package/dist/control-web/assets/php-am1OsKhm.js +1 -0
  333. package/dist/control-web/assets/pie-RZYD4A2V-su_3QGU2.js +1 -0
  334. package/dist/control-web/assets/pieDiagram-ENE6RG2P-BkMUBLE1.js +39 -0
  335. package/dist/control-web/assets/pkl-ot-7Btpt.js +1 -0
  336. package/dist/control-web/assets/plastic-DQwYfKfQ.js +1 -0
  337. package/dist/control-web/assets/plsql-DGHpHOYJ.js +1 -0
  338. package/dist/control-web/assets/po-BiJDBrnU.js +1 -0
  339. package/dist/control-web/assets/poimandres-DRFjx7u4.js +1 -0
  340. package/dist/control-web/assets/polar-C7UOKdEL.js +1 -0
  341. package/dist/control-web/assets/postcss-BXeXVLqQ.js +1 -0
  342. package/dist/control-web/assets/powerquery-DNMTfnFr.js +1 -0
  343. package/dist/control-web/assets/powershell-DshXNtvi.js +1 -0
  344. package/dist/control-web/assets/prisma-BsRQq5mF.js +1 -0
  345. package/dist/control-web/assets/prolog-iXnhIJG7.js +1 -0
  346. package/dist/control-web/assets/proto-DB4EqR-F.js +1 -0
  347. package/dist/control-web/assets/pug-DO6yvBr3.js +1 -0
  348. package/dist/control-web/assets/puppet-CDv2pdJW.js +1 -0
  349. package/dist/control-web/assets/purescript-9MfHhQsQ.js +1 -0
  350. package/dist/control-web/assets/python-gzcpVVnB.js +1 -0
  351. package/dist/control-web/assets/qml-_a-QhfPD.js +1 -0
  352. package/dist/control-web/assets/qmldir-DCQb3MpD.js +1 -0
  353. package/dist/control-web/assets/qss-Fe1Jh2GI.js +1 -0
  354. package/dist/control-web/assets/quadrantDiagram-ABIIQ3AL-ba-VaqMe.js +7 -0
  355. package/dist/control-web/assets/r-D6UWEOL2.js +1 -0
  356. package/dist/control-web/assets/racket-DcIDlBhZ.js +1 -0
  357. package/dist/control-web/assets/radar-I7S5WNFK-Dat0rqem.js +1 -0
  358. package/dist/control-web/assets/railroad-3IZDKUUU-Dh2-s8r8.js +1 -0
  359. package/dist/control-web/assets/railroad-abnf-AHOZXSZD-CNUwq0JR.js +1 -0
  360. package/dist/control-web/assets/railroad-ebnf-EBAXGLYW-RHr0duea.js +1 -0
  361. package/dist/control-web/assets/railroad-peg-LSFZ7HO6-CVBWS2eU.js +1 -0
  362. package/dist/control-web/assets/railroadDiagram-RFXS5EU6-BiJX3SY-.js +1 -0
  363. package/dist/control-web/assets/raku-B3gFvitq.js +1 -0
  364. package/dist/control-web/assets/razor-CMVBVp3T.js +1 -0
  365. package/dist/control-web/assets/red-CJ3rzSJv.js +1 -0
  366. package/dist/control-web/assets/reg-CRGYupPL.js +1 -0
  367. package/dist/control-web/assets/regexp-DR20uMnK.js +1 -0
  368. package/dist/control-web/assets/rel-BtDbiS_P.js +1 -0
  369. package/dist/control-web/assets/requirementDiagram-TGXJPOKE-CFfakCzs.js +84 -0
  370. package/dist/control-web/assets/riscv-Ckw8ddFX.js +1 -0
  371. package/dist/control-web/assets/rolldown-runtime-hePW80VL.js +1 -0
  372. package/dist/control-web/assets/ron-VUp2lXgN.js +1 -0
  373. package/dist/control-web/assets/rose-pine-BthvhNj6.js +1 -0
  374. package/dist/control-web/assets/rose-pine-dawn-Dg85fqjY.js +1 -0
  375. package/dist/control-web/assets/rose-pine-moon-hon4tzzS.js +1 -0
  376. package/dist/control-web/assets/rosmsg-CAekHB0j.js +1 -0
  377. package/dist/control-web/assets/rough.esm-Dy-Kn_BL.js +1 -0
  378. package/dist/control-web/assets/rst-CgIrbW_q.js +1 -0
  379. package/dist/control-web/assets/ruby-Dp6Zud9H.js +1 -0
  380. package/dist/control-web/assets/rust-Cfkwpbl8.js +1 -0
  381. package/dist/control-web/assets/sankeyDiagram-HTMAVEWB-jgDi0God.js +40 -0
  382. package/dist/control-web/assets/sas-B6p8-ynO.js +1 -0
  383. package/dist/control-web/assets/sass-DXrisJhu.js +1 -0
  384. package/dist/control-web/assets/scala-DKOlJaKm.js +1 -0
  385. package/dist/control-web/assets/scheme-DQCgrYNe.js +1 -0
  386. package/dist/control-web/assets/scss-DcoSS-ti.js +1 -0
  387. package/dist/control-web/assets/sdbl-bTVj8UrX.js +1 -0
  388. package/dist/control-web/assets/sequenceDiagram-DBY2YBRQ-DBfyyb0N.js +162 -0
  389. package/dist/control-web/assets/shaderlab-TOUzSsQk.js +1 -0
  390. package/dist/control-web/assets/shellscript-Da78Ox-3.js +1 -0
  391. package/dist/control-web/assets/shellsession-CVsQGYfZ.js +1 -0
  392. package/dist/control-web/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +1 -0
  393. package/dist/control-web/assets/slack-dark-DnToyrRv.js +1 -0
  394. package/dist/control-web/assets/slack-ochin-B2OO5cIa.js +1 -0
  395. package/dist/control-web/assets/smalltalk-B16xEiuN.js +1 -0
  396. package/dist/control-web/assets/snazzy-light-4G7pJPwS.js +1 -0
  397. package/dist/control-web/assets/solarized-dark-DV17i1UV.js +1 -0
  398. package/dist/control-web/assets/solarized-light-DSh2HLQt.js +1 -0
  399. package/dist/control-web/assets/solidity-CKzVLygQ.js +1 -0
  400. package/dist/control-web/assets/soy-B5n_eHSp.js +1 -0
  401. package/dist/control-web/assets/sparql-D_iOobhT.js +1 -0
  402. package/dist/control-web/assets/splunk-BC2Px7Mm.js +1 -0
  403. package/dist/control-web/assets/sql-ClgswhA6.js +1 -0
  404. package/dist/control-web/assets/src-B6xuSHsQ.js +1 -0
  405. package/dist/control-web/assets/ssh-config-BgfXC-Er.js +1 -0
  406. package/dist/control-web/assets/stata-RoaAgbqU.js +1 -0
  407. package/dist/control-web/assets/stateDiagram-2N3HPSRC-Dwb_ncVi.js +1 -0
  408. package/dist/control-web/assets/stateDiagram-v2-6OUMAXLB-DI0opaA1.js +1 -0
  409. package/dist/control-web/assets/stylus-B6D30XZt.js +1 -0
  410. package/dist/control-web/assets/surrealql-DIn4NJsS.js +1 -0
  411. package/dist/control-web/assets/svelte-CIt8Fl9I.js +1 -0
  412. package/dist/control-web/assets/swift-DonLKvLd.js +1 -0
  413. package/dist/control-web/assets/swimlanes-5IMT3BWC-DW0LuiIV.js +2 -0
  414. package/dist/control-web/assets/swimlanesDiagram-G3AALYLV-DDTVjcOR.js +8 -0
  415. package/dist/control-web/assets/synthwave-84-nFMaYfgc.js +1 -0
  416. package/dist/control-web/assets/system-verilog-DJ5XKQeo.js +1 -0
  417. package/dist/control-web/assets/systemd-BxMlprV5.js +1 -0
  418. package/dist/control-web/assets/talonscript-CohzipZa.js +1 -0
  419. package/dist/control-web/assets/tasl-DMoTqEGO.js +1 -0
  420. package/dist/control-web/assets/tcl-CZd0xW_V.js +1 -0
  421. package/dist/control-web/assets/templ-BREsJpNc.js +1 -0
  422. package/dist/control-web/assets/terraform-DswuEJGm.js +1 -0
  423. package/dist/control-web/assets/tex-0w6-Dtgt.js +1 -0
  424. package/dist/control-web/assets/timeline-definition-FHXFAJF6-DeX4B_B8.js +120 -0
  425. package/dist/control-web/assets/tokyo-night-oM2G3aXe.js +1 -0
  426. package/dist/control-web/assets/toml-CcmNWLt0.js +1 -0
  427. package/dist/control-web/assets/treeView-QDETBFTQ-D1UXtICj.js +1 -0
  428. package/dist/control-web/assets/treemap-6X3UGDF4-CrppzjZH.js +1 -0
  429. package/dist/control-web/assets/ts-tags-q3pptdMi.js +1 -0
  430. package/dist/control-web/assets/tsv-sltzmVWM.js +1 -0
  431. package/dist/control-web/assets/tsx-CUOciP0b.js +1 -0
  432. package/dist/control-web/assets/turtle-ByJddavk.js +1 -0
  433. package/dist/control-web/assets/twig-LIeLXgf5.js +1 -0
  434. package/dist/control-web/assets/typescript-BydbNFcO.js +1 -0
  435. package/dist/control-web/assets/typespec-B88KGewJ.js +1 -0
  436. package/dist/control-web/assets/typst-DI99ib-x.js +1 -0
  437. package/dist/control-web/assets/v-DETTlOr0.js +1 -0
  438. package/dist/control-web/assets/vala-zf12oZj6.js +1 -0
  439. package/dist/control-web/assets/vb-Djn5o6TS.js +1 -0
  440. package/dist/control-web/assets/vennDiagram-L72KCM5P-BYpf-7VR.js +34 -0
  441. package/dist/control-web/assets/verilog-CiiDBU1e.js +1 -0
  442. package/dist/control-web/assets/vesper-D5bVUKB1.js +1 -0
  443. package/dist/control-web/assets/vhdl-BroJfC0k.js +1 -0
  444. package/dist/control-web/assets/viml-DvXPmvsu.js +1 -0
  445. package/dist/control-web/assets/vitesse-black-fwtXNY1n.js +1 -0
  446. package/dist/control-web/assets/vitesse-dark-BZCL-v6S.js +1 -0
  447. package/dist/control-web/assets/vitesse-light-VbXTXTou.js +1 -0
  448. package/dist/control-web/assets/vue-DVSfBueU.js +1 -0
  449. package/dist/control-web/assets/vue-html-DkKkQnZL.js +1 -0
  450. package/dist/control-web/assets/vue-vine-pWqEcBkW.js +1 -0
  451. package/dist/control-web/assets/vyper-CgoNMtux.js +1 -0
  452. package/dist/control-web/assets/wardley-OPB4EBWU-B9rA0UsV.js +1 -0
  453. package/dist/control-web/assets/wardleyDiagram-EHGQE667-BdvAUa5F.js +78 -0
  454. package/dist/control-web/assets/wasm-BnjxR4X6.js +1 -0
  455. package/dist/control-web/assets/wasm-ByWQv1Qj.js +1 -0
  456. package/dist/control-web/assets/wenyan-C8pVoKbM.js +1 -0
  457. package/dist/control-web/assets/wgsl-BsKzXJz4.js +1 -0
  458. package/dist/control-web/assets/wikitext-ClFFjSW2.js +1 -0
  459. package/dist/control-web/assets/wit-DdvCle-K.js +1 -0
  460. package/dist/control-web/assets/wolfram-DLL8P-h_.js +1 -0
  461. package/dist/control-web/assets/xml-BlnrEAEy.js +1 -0
  462. package/dist/control-web/assets/xsl-BOPS8gLt.js +1 -0
  463. package/dist/control-web/assets/xychartDiagram-FW5EYKEG-BaEV3pGm.js +7 -0
  464. package/dist/control-web/assets/yaml-Du_6cdrH.js +1 -0
  465. package/dist/control-web/assets/zenscript-BnlCZFoB.js +1 -0
  466. package/dist/control-web/assets/zig-CMLA9XwU.js +1 -0
  467. package/dist/control-web/index.html +3 -2
  468. package/dist/control-web-dist.d.ts +1 -1
  469. package/dist/control-web-dist.js +4 -2
  470. package/dist/desktop-browser-host.d.ts +3 -1
  471. package/dist/desktop-browser-host.js +39 -4
  472. package/dist/direct-runtime-server.js +187 -153
  473. package/dist/machine-session-service.d.ts +105 -15
  474. package/dist/machine-session-service.js +781 -87
  475. package/dist/remote-runtime-dispatcher.d.ts +2 -2
  476. package/dist/remote-runtime-dispatcher.js +42 -2
  477. package/dist/remote-runtime-session-projection.d.ts +1 -0
  478. package/dist/remote-runtime-session-projection.js +12 -0
  479. package/dist/server.d.ts +64 -11
  480. package/dist/server.js +422 -55
  481. package/dist/session-browser-service.d.ts +24 -4
  482. package/dist/session-browser-service.js +127 -1
  483. package/dist/session-pending-inputs.d.ts +42 -0
  484. package/dist/session-pending-inputs.js +87 -0
  485. package/dist/session-portal.d.ts +54 -0
  486. package/dist/session-portal.js +997 -0
  487. package/dist/session-runtime-index.d.ts +3 -6
  488. package/dist/session-runtime-index.js +96 -38
  489. package/dist/session-terminal-host.d.ts +22 -2
  490. package/dist/session-terminal-host.js +66 -83
  491. package/dist/terminal-ws.d.ts +4 -1
  492. package/dist/terminal-ws.js +93 -27
  493. package/package.json +7 -7
  494. package/dist/control-web/assets/highlighted-body-OFNGDK62-DWWsUtHF.js +0 -1
  495. package/dist/control-web/assets/index-BnX7NWJX.js +0 -689
  496. package/dist/control-web/assets/index-CUoWRX2i.css +0 -32
  497. package/dist/control-web/assets/mermaid-GHXKKRXX-C1fxAgiw.js +0 -131
package/dist/server.js CHANGED
@@ -1,19 +1,24 @@
1
+ import { basename, extname, isAbsolute } from "node:path";
1
2
  import { pathToFileURL } from "node:url";
2
3
  import Koa from "koa";
3
4
  import Router from "@koa/router";
4
5
  import { loadConfig, listAgentSpecs, loadAgentSpec, resolveSessionExecution, resolveRuntimeModel, ConversationRuntime, InMemorySessionBus, persistSessionEvent, } from "@rynx-ai/core";
5
6
  import { RunnerManager, FileCodexSessionStore, resolveCodexSessionStorePath, } from "@rynx-ai/runtime";
6
7
  import { createControlRouter, } from "./control-api.js";
8
+ import { MachineSessionServiceFailure, MachineSessionServiceInputError, } from "./machine-session-service.js";
7
9
  import { attachEmulatorTouchWs } from "./emulator-touch-ws.js";
8
10
  import { attachTerminalWs } from "./terminal-ws.js";
9
11
  import { attachBrowserSurfaceWs } from "./browser-surface-ws.js";
10
12
  import { attachEmulatorSurfaceWs } from "./emulator-surface-ws.js";
11
13
  import { attachDesktopBrowserHostServer, } from "./desktop-browser-host.js";
12
14
  import { resolveControlWebDist, sendSpaFile } from "./control-web-dist.js";
15
+ import { startSessionPortal, } from "./session-portal.js";
16
+ export { createSessionPortalApp, startSessionPortal } from "./session-portal.js";
13
17
  import { SessionRuntimeIndex } from "./session-runtime-index.js";
14
18
  import { createRunnerSessionTerminalHost, } from "./session-terminal-host.js";
15
19
  import { runtimeWebAccessPolicyForBindHost, } from "./runtime-web-auth.js";
16
20
  export { MachineSessionService, MachineSessionServiceFailure, MachineSessionServiceInputError, synthesizeSessionTitle, } from "./machine-session-service.js";
21
+ export { SessionPendingInputIndex } from "./session-pending-inputs.js";
17
22
  export { SessionBrowserHostError, SessionBrowserService, SessionBrowserServiceError, SessionBrowserSurfaceUnsupportedError, } from "./session-browser-service.js";
18
23
  export { SessionEmulatorBindingConflictError, SessionEmulatorService, SessionEmulatorServiceError, } from "./session-emulator-service.js";
19
24
  export { SessionBrowserSurfaceCoordinator } from "./session-browser-surface-coordinator.js";
@@ -25,25 +30,74 @@ export { attachDirectRuntimeBrowserInspectServer, DirectRuntimeBrowserInspectHos
25
30
  export { RemoteRuntimeDispatcher } from "./remote-runtime-dispatcher.js";
26
31
  export { createRunnerSessionTerminalHost, SessionTerminalOpenError, SessionTerminalStreamError, } from "./session-terminal-host.js";
27
32
  export { listRuntimeModels } from "@rynx-ai/runtime";
28
- /** Preserve one session's mirror order without serializing unrelated sessions. */
33
+ /** Bound one mirror write at ten seconds. After that uncertainty boundary,
34
+ * later records may start instead
35
+ * of waiting forever behind a persistence call whose result is unknown. */
36
+ const SESSION_MIRROR_STALL_TIMEOUT_MS = 10_000;
37
+ class SessionMirrorAmbiguousError extends Error {
38
+ abandonToken;
39
+ mirrorClassification = "ambiguous";
40
+ constructor(sessionId, abandonToken) {
41
+ super(`Session mirror persistence did not settle before its response deadline: ${sessionId}`);
42
+ this.abandonToken = abandonToken;
43
+ this.name = "SessionMirrorAmbiguousError";
44
+ }
45
+ }
46
+ function preparedMirrorPersistence(persistence) {
47
+ if (typeof persistence === "object" &&
48
+ persistence !== null &&
49
+ "promise" in persistence)
50
+ return persistence;
51
+ return { promise: persistence };
52
+ }
53
+ /** Preserve one session's mirror order without serializing unrelated sessions.
54
+ * A timed-out operation is not cancelled: like an HTTP read timeout, it may
55
+ * still commit later. Its caller receives `ambiguous` and must not retry. */
29
56
  export class SessionMirrorQueue {
30
57
  persist;
58
+ stallTimeoutMs;
31
59
  tails = new Map();
32
- constructor(persist) {
60
+ constructor(persist, stallTimeoutMs = SESSION_MIRROR_STALL_TIMEOUT_MS) {
33
61
  this.persist = persist;
62
+ this.stallTimeoutMs = stallTimeoutMs;
34
63
  }
35
64
  enqueue(sessionId, event) {
36
65
  const previous = this.tails.get(sessionId) ?? Promise.resolve();
37
- const next = previous
66
+ const bounded = previous
38
67
  .catch(() => undefined)
39
- .then(() => this.persist(sessionId, event));
40
- this.tails.set(sessionId, next);
68
+ .then(() => {
69
+ // Prepare only when this record reaches the head of its Session lane.
70
+ // Starting either persistence or its deadline while an older record is
71
+ // still ahead would shorten queued records' attempt windows and allow a
72
+ // burst of them to time out concurrently.
73
+ const prepared = preparedMirrorPersistence(this.persist(sessionId, event));
74
+ let timer;
75
+ return new Promise((resolve, reject) => {
76
+ timer = setTimeout(() => {
77
+ // A user echo claims one exact optimistic pending input while the
78
+ // write starts. Retire it synchronously before rejecting this tail:
79
+ // the next echo must never peek the same content or attachments.
80
+ prepared.onAmbiguous?.();
81
+ reject(new SessionMirrorAmbiguousError(sessionId, prepared.abandonToken));
82
+ }, this.stallTimeoutMs);
83
+ timer.unref?.();
84
+ void prepared.promise.then(resolve, reject);
85
+ }).finally(() => {
86
+ if (timer)
87
+ clearTimeout(timer);
88
+ });
89
+ });
90
+ // The bounded result, not the potentially immortal persistence promise,
91
+ // gates the next record. `operation` remains observed by `bounded`, so a
92
+ // late rejection cannot become an unhandled promise rejection.
93
+ const tail = bounded.catch(() => undefined);
94
+ this.tails.set(sessionId, tail);
41
95
  const cleanup = () => {
42
- if (this.tails.get(sessionId) === next)
96
+ if (this.tails.get(sessionId) === tail)
43
97
  this.tails.delete(sessionId);
44
98
  };
45
- void next.then(cleanup, cleanup);
46
- return next;
99
+ void tail.then(cleanup, cleanup);
100
+ return bounded;
47
101
  }
48
102
  }
49
103
  /**
@@ -64,22 +118,77 @@ export function createSessionRuntimeServices(input) {
64
118
  });
65
119
  const sessionBus = new InMemorySessionBus();
66
120
  const sessionRuntimeIndex = new SessionRuntimeIndex();
67
- const sessionMirrorQueue = new SessionMirrorQueue((sessionId, event) => persistSessionEvent(sessionId, event, { sessionLog: input.sessionLog, sessionBus }));
121
+ const sessionMirrorQueue = new SessionMirrorQueue((sessionId, event) => {
122
+ // Claim the exact pending projection synchronously when this record reaches
123
+ // the head of its Session lane. Its id remains stable even if persistence
124
+ // later times out or fails after the result becomes ambiguous.
125
+ const pendingResolved = resolvePendingInputEvent(sessionId, event, input.pendingInputs);
126
+ const pendingId = pendingResolved.pendingId;
127
+ const promise = (async () => {
128
+ const finalized = await finalizeGeneratedImageEvent(sessionId, pendingResolved.event, input);
129
+ try {
130
+ await persistSessionEvent(sessionId, finalized, {
131
+ sessionLog: input.sessionLog,
132
+ sessionBus,
133
+ strictPersistence: true,
134
+ ...(pendingId
135
+ ? {
136
+ onInputPersisted: async (persistedEvent) => {
137
+ if (persistedEvent.clearedPendingId !== pendingId)
138
+ return;
139
+ input.pendingInputs?.resolve(sessionId, pendingId);
140
+ if (!input.onPendingInputPersisted || !pendingResolved.clientMessageId)
141
+ return;
142
+ await input.onPendingInputPersisted({
143
+ sessionId,
144
+ pendingId: persistedEvent.clearedPendingId,
145
+ clientMessageId: pendingResolved.clientMessageId,
146
+ responseId: persistedEvent.item.responseId,
147
+ messageItemId: persistedEvent.item.id,
148
+ });
149
+ },
150
+ }
151
+ : {}),
152
+ });
153
+ }
154
+ catch (error) {
155
+ if (pendingId) {
156
+ throw new PendingInputMirrorPersistenceError(error, pendingId);
157
+ }
158
+ throw error;
159
+ }
160
+ sessionRuntimeIndex.observe(sessionId, finalized);
161
+ })();
162
+ return {
163
+ promise,
164
+ ...(pendingId
165
+ ? {
166
+ abandonToken: pendingId,
167
+ onAmbiguous: () => input.pendingInputs?.resolve(sessionId, pendingId),
168
+ }
169
+ : {}),
170
+ };
171
+ }, input.mirrorStallTimeoutMs);
68
172
  const mirrorSessionEvent = (sessionId, event) => {
69
- sessionRuntimeIndex.observe(sessionId, event);
70
173
  return sessionMirrorQueue.enqueue(sessionId, event);
71
174
  };
72
175
  const conversationRuntime = new ConversationRuntime({
73
176
  config: input.config,
74
177
  executor: runnerManager,
75
178
  sessionBus,
76
- sessionEventSink: mirrorSessionEvent,
77
179
  });
78
180
  runnerManager.onMirror((sessionId, event) => {
79
- void mirrorSessionEvent(sessionId, event).catch((error) => {
181
+ return mirrorSessionEvent(sessionId, event).catch((error) => {
80
182
  input.onMirrorError?.(error, sessionId);
183
+ throw error;
81
184
  });
82
185
  });
186
+ runnerManager.onMirrorAbandon((sessionId, pendingId) => {
187
+ input.pendingInputs?.resolve(sessionId, pendingId);
188
+ });
189
+ runnerManager.onMirrorSupersede((sessionId) => {
190
+ input.pendingInputs?.deleteSession(sessionId);
191
+ });
83
192
  return {
84
193
  sessionStore,
85
194
  runnerManager,
@@ -89,6 +198,137 @@ export function createSessionRuntimeServices(input) {
89
198
  publishSessionEvent: mirrorSessionEvent,
90
199
  };
91
200
  }
201
+ class PendingInputMirrorPersistenceError extends Error {
202
+ abandonToken;
203
+ statusCode;
204
+ constructor(error, abandonToken) {
205
+ super(error instanceof Error ? error.message : String(error), { cause: error });
206
+ this.abandonToken = abandonToken;
207
+ this.name = "PendingInputMirrorPersistenceError";
208
+ if (typeof error === "object" &&
209
+ error !== null &&
210
+ typeof error.statusCode === "number") {
211
+ this.statusCode = error.statusCode;
212
+ }
213
+ }
214
+ }
215
+ /** Drain the oldest pending web input when the Provider transcript produces a
216
+ * real user record. The transcript is the only durable writer; the returned id
217
+ * lets clients replace the exact temporary bubble. */
218
+ function resolvePendingInputEvent(sessionId, event, pendingInputs) {
219
+ if (event.type !== "session.input.consumed" ||
220
+ event.item.type !== "message" ||
221
+ event.item.data.role !== "user" ||
222
+ event.item.data.isMeta ||
223
+ event.item.parentToolCallId !== undefined) {
224
+ return { event };
225
+ }
226
+ const pending = pendingInputs?.peekOldest(sessionId);
227
+ if (!pending)
228
+ return { event };
229
+ const fileParts = pending.content.filter((part) => part.type === "input_image" || part.type === "input_file");
230
+ const alreadyHasFiles = event.item.data.content.some((part) => part.type === "input_image" || part.type === "input_file");
231
+ const containsInternalResourceMarker = event.item.data.content.some((part) => part.type === "input_text" &&
232
+ /\[\[RYNX_(?:IMAGE|FILE)_RESOURCE\s/.test(part.text));
233
+ const content = containsInternalResourceMarker
234
+ ? pending.content
235
+ : fileParts.length > 0 && !alreadyHasFiles
236
+ ? [...fileParts, ...event.item.data.content]
237
+ : event.item.data.content;
238
+ return {
239
+ pendingId: pending.pendingId,
240
+ clientMessageId: pending.clientMessageId,
241
+ event: {
242
+ ...event,
243
+ clearedPendingId: pending.pendingId,
244
+ ...(content !== event.item.data.content
245
+ ? {
246
+ item: {
247
+ ...event.item,
248
+ data: {
249
+ ...event.item.data,
250
+ content,
251
+ },
252
+ },
253
+ }
254
+ : {}),
255
+ },
256
+ };
257
+ }
258
+ async function finalizeGeneratedImageEvent(sessionId, event, input) {
259
+ if (event.type !== "response.output_item.done" ||
260
+ event.item.type !== "function_call_output") {
261
+ return event;
262
+ }
263
+ const rawData = event.item.data;
264
+ const pending = rawData.__rynxGeneratedImage;
265
+ if (!pending)
266
+ return event;
267
+ const { __rynxGeneratedImage: _omitted, ...data } = rawData;
268
+ try {
269
+ const pathMediaType = pending.savedPath && isAbsolute(pending.savedPath)
270
+ ? imageMediaTypeFromPath(pending.savedPath)
271
+ : undefined;
272
+ const generatedImage = pathMediaType && pending.savedPath
273
+ ? {
274
+ path: pending.savedPath,
275
+ filename: basename(pending.savedPath),
276
+ mediaType: pathMediaType,
277
+ }
278
+ : pending.result && input.materializeGeneratedImage
279
+ ? await input.materializeGeneratedImage({
280
+ sessionId,
281
+ sourceId: event.item.id,
282
+ result: pending.result,
283
+ })
284
+ : undefined;
285
+ return {
286
+ ...event,
287
+ item: {
288
+ ...event.item,
289
+ data: {
290
+ ...data,
291
+ ...(generatedImage ? { generatedImage } : {}),
292
+ ...(!generatedImage && pending.savedPath && !isAbsolute(pending.savedPath)
293
+ ? { output: `${data.output}\nImage path was not absolute; preview omitted.`.trim() }
294
+ : {}),
295
+ },
296
+ },
297
+ };
298
+ }
299
+ catch (error) {
300
+ input.onMirrorError?.(error, sessionId);
301
+ // The source bytes are part of an ordinary durable delivery.
302
+ // Only deterministic validation/conflict failures may discard their
303
+ // preview; infrastructure and explicitly retryable resource failures must
304
+ // NACK so the child retries the exact image commit.
305
+ if (!(error instanceof MachineSessionServiceFailure) ||
306
+ error.retryable) {
307
+ throw error;
308
+ }
309
+ return {
310
+ ...event,
311
+ item: {
312
+ ...event.item,
313
+ data: {
314
+ ...data,
315
+ output: `${data.output}\nImage preview unavailable.`.trim(),
316
+ },
317
+ },
318
+ };
319
+ }
320
+ }
321
+ function imageMediaTypeFromPath(path) {
322
+ switch (extname(path).toLowerCase()) {
323
+ case ".png": return "image/png";
324
+ case ".jpg":
325
+ case ".jpeg": return "image/jpeg";
326
+ case ".webp": return "image/webp";
327
+ case ".gif": return "image/gif";
328
+ case ".svg": return "image/svg+xml";
329
+ default: return undefined;
330
+ }
331
+ }
92
332
  /**
93
333
  * The HTTP surface is just a liveness probe for container orchestration — all
94
334
  * agent capabilities are forwarded through the mounted channel plugins (the
@@ -137,7 +377,7 @@ export function createApp({ config = loadConfig(), control } = {}) {
137
377
  }
138
378
  return app;
139
379
  }
140
- export async function startServer({ config = loadConfig(), control, sessionLog, sessionRegistry, pluginRuntime, daemonManagement, remoteRuntime, remoteRuntimeAdmin, runtimeTargetControl, runtimeConnectionResolver, localSessionResources, localMachineSessions, sessionEmulators, sessionRuntimeServices, sessionLifecycle, sessionTerminals, runtimeLocalBrowser, providerClis, desktopBrowserHost, } = {}) {
380
+ export async function startServer({ config = loadConfig(), control, sessionLog, sessionRegistry, pluginRuntime, daemonManagement, remoteRuntime, remoteRuntimeAdmin, runtimeTargetControl, runtimeConnectionResolver, localSessionResources, localMachineSessions, sessionEmulators, sessionRuntimeServices, sessionLifecycle, sessionTerminals, runtimeLocalBrowser, providerClis, desktopBrowserHost, sessionPortalAuthorization, } = {}) {
141
381
  const runtimeWebAccess = runtimeWebAccessPolicyForBindHost(config.HOST);
142
382
  const desktopBrowserManagementToken = desktopBrowserHost
143
383
  ? requireDaemonManagementToken(daemonManagement)
@@ -160,14 +400,58 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
160
400
  return { cwd: session.workspace.cwd };
161
401
  },
162
402
  });
403
+ const controlShutdown = new AbortController();
404
+ const controlSurface = control
405
+ ? {
406
+ deps: control,
407
+ runtime: conversationRuntime,
408
+ sessionBus,
409
+ sessionLog,
410
+ runnerManager,
411
+ sessionStore,
412
+ pluginRuntimeStatus: pluginRuntime
413
+ ? () => pluginRuntime.statusSnapshot()
414
+ : undefined,
415
+ daemonManagement,
416
+ remoteRuntime,
417
+ remoteRuntimeAdmin,
418
+ runtimeTargetControl,
419
+ runtimeConnectionResolver,
420
+ localSessionResources,
421
+ localMachineSessions,
422
+ sessionEmulators,
423
+ shutdownSignal: controlShutdown.signal,
424
+ sessionRuntimeIndex,
425
+ sessionLifecycle,
426
+ runtimeLocalBrowser,
427
+ providerClis,
428
+ }
429
+ : undefined;
430
+ const sessionPortalConfig = config.RYNX_SESSION_PORTAL_PORT !== undefined
431
+ ? (() => {
432
+ if (runtimeWebAccess.mode !== "loopback") {
433
+ throw new Error("Session Portal requires the ordinary Control listener to bind loopback only");
434
+ }
435
+ const controlWebDist = resolveControlWebDist();
436
+ if (!sessionPortalAuthorization || !controlSurface || !controlWebDist) {
437
+ throw new Error("Session Portal requires authorization, Control services, and the native Control Web build");
438
+ }
439
+ return { authorization: sessionPortalAuthorization, controlWebDist };
440
+ })()
441
+ : undefined;
442
+ let sessionPortalServer;
163
443
  if (pluginRuntime) {
164
444
  if (!sessionRegistry)
165
445
  throw new Error("plugin runtime requires a machine session registry");
446
+ if (!localMachineSessions) {
447
+ throw new Error("plugin runtime requires the machine Session service");
448
+ }
166
449
  pluginRuntime.bindHostServices({
167
- conversationRuntime,
168
450
  capabilities: runnerManager,
169
451
  sessionStore,
170
452
  sessionRegistry,
453
+ sessionRuns: localMachineSessions,
454
+ sessionFiles: localMachineSessions,
171
455
  agentCatalog: {
172
456
  list: async () => (await listAgentSpecs()).map(toPluginAgentSummary),
173
457
  get: async (id) => {
@@ -180,9 +464,57 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
180
464
  session: input.session,
181
465
  }),
182
466
  },
467
+ sessionActivity: (sessionId) => {
468
+ const snapshot = sessionRuntimeIndex.snapshot(sessionId);
469
+ return {
470
+ ...snapshot,
471
+ status: snapshot.pendingInteractions.length > 0
472
+ ? "waiting"
473
+ : snapshot.status,
474
+ };
475
+ },
183
476
  interruptSession: (sessionId) => runnerManager.interruptLiveSession(sessionId),
184
477
  terminateSession: (sessionId) => runnerManager.terminateLiveSession(sessionId),
478
+ ...(sessionLog
479
+ ? {
480
+ sessionTimeline: {
481
+ hasItem: async (sessionId, itemId) => Boolean(await sessionLog.get(sessionId, itemId)),
482
+ projectText: async ({ sessionId, responseId, itemId, text }) => {
483
+ const event = {
484
+ type: "response.output_item.done",
485
+ responseId,
486
+ item: {
487
+ id: itemId,
488
+ sessionId,
489
+ position: -1,
490
+ responseId,
491
+ status: "completed",
492
+ createdAt: Date.now(),
493
+ createdBy: "plugin_projection",
494
+ type: "message",
495
+ data: { role: "assistant", content: [{ type: "output_text", text }] },
496
+ },
497
+ };
498
+ // Projection is an acknowledged durable operation, unlike the
499
+ // provider mirror's deliberately best-effort live fan-out.
500
+ // Append first and only then publish; a failed append leaves the
501
+ // projection ledger pending so the Plugin can retry safely.
502
+ await sessionLog.append(sessionId, [event.item]);
503
+ sessionServices.sessionBus.publish(sessionId, event);
504
+ },
505
+ },
506
+ }
507
+ : {}),
185
508
  resolveSessionInteraction: (sessionId, interactionId, resolution) => runnerManager.resolveInteraction(sessionId, interactionId, resolution),
509
+ ...(sessionPortalConfig
510
+ ? {
511
+ sessionPortal: {
512
+ scheme: "http",
513
+ bindHost: config.RYNX_SESSION_PORTAL_HOST,
514
+ port: config.RYNX_SESSION_PORTAL_PORT,
515
+ },
516
+ }
517
+ : {}),
186
518
  });
187
519
  }
188
520
  // Provider TUI `/clear`·`/fork` uses the same publication boundary as an
@@ -196,40 +528,55 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
196
528
  sourceSessionId: r.from,
197
529
  targetSessionId: r.to,
198
530
  kind: r.kind,
531
+ }).catch((error) => {
532
+ if (error instanceof MachineSessionServiceInputError) {
533
+ throw Object.assign(error, { statusCode: 400 });
534
+ }
535
+ if (error instanceof MachineSessionServiceFailure) {
536
+ // A mismatched pre-existing target is a deterministic payload conflict,
537
+ // not an HTTP-style concurrent 409. Surface it as permanent so the
538
+ // three-attempt permanent-error budget can stop the rotation lane.
539
+ const statusCode = error.code === "outcome_unknown"
540
+ ? 503
541
+ : error.code === "not_found"
542
+ ? 404
543
+ : 422;
544
+ throw Object.assign(error, { statusCode });
545
+ }
546
+ throw error;
199
547
  });
200
548
  });
201
- const controlShutdown = new AbortController();
549
+ if (localMachineSessions) {
550
+ runnerManager.onCollaborationMode((sessionId, mode) => {
551
+ localMachineSessions.recordNativeCollaborationMode(sessionId, mode);
552
+ });
553
+ }
202
554
  const app = createApp({
203
555
  config,
204
- control: control
205
- ? {
206
- deps: control,
207
- runtime: conversationRuntime,
208
- sessionBus,
209
- sessionLog,
210
- runnerManager,
211
- sessionStore,
212
- pluginRuntimeStatus: pluginRuntime
213
- ? () => pluginRuntime.statusSnapshot()
214
- : undefined,
215
- daemonManagement,
216
- remoteRuntime,
217
- remoteRuntimeAdmin,
218
- runtimeTargetControl,
219
- runtimeConnectionResolver,
220
- localSessionResources,
221
- localMachineSessions,
222
- sessionEmulators,
223
- shutdownSignal: controlShutdown.signal,
224
- sessionRuntimeIndex,
225
- sessionLifecycle,
226
- runtimeLocalBrowser,
227
- providerClis,
228
- }
229
- : undefined,
556
+ control: controlSurface,
230
557
  });
231
- return new Promise((resolve) => {
558
+ return new Promise((resolve, reject) => {
559
+ let startupWebSocketServers = [];
560
+ const rejectBeforeListening = (error) => reject(error);
232
561
  const server = app.listen(config.PORT, config.HOST, () => {
562
+ server.off("error", rejectBeforeListening);
563
+ void finishStartup(server).catch(async (error) => {
564
+ controlShutdown.abort(asError(error));
565
+ sessionPortalServer?.stopAccepting();
566
+ server.closeAllConnections?.();
567
+ await Promise.allSettled([
568
+ closeWebSocketServers(startupWebSocketServers),
569
+ sessionPortalServer?.shutdown() ?? Promise.resolve(),
570
+ new Promise((done) => server.close(() => done())),
571
+ Promise.resolve(daemonManagement?.pluginManagement?.dispose?.()),
572
+ Promise.resolve(pluginRuntime?.dispose()),
573
+ runnerManager.stop(),
574
+ ]);
575
+ reject(error);
576
+ });
577
+ });
578
+ server.once("error", rejectBeforeListening);
579
+ const finishStartup = async (server) => {
233
580
  console.log(JSON.stringify({
234
581
  level: config.LOG_LEVEL,
235
582
  msg: "Harness agent server listening",
@@ -238,15 +585,6 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
238
585
  runtime: config.DEFAULT_RUNTIME,
239
586
  model: resolveRuntimeModel(config, config.DEFAULT_RUNTIME),
240
587
  }));
241
- const startup = pluginRuntime?.startPluginRuntimes() ?? Promise.resolve();
242
- void startup.catch((error) => {
243
- console.error(JSON.stringify({
244
- level: "error",
245
- type: "plugin-runtime",
246
- event: "startup_failed",
247
- error: error instanceof Error ? error.message : String(error),
248
- }));
249
- });
250
588
  const webSocketServers = [
251
589
  attachTerminalWs(server, {
252
590
  runtimeConnectionResolver,
@@ -265,19 +603,48 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
265
603
  if (control?.emulator) {
266
604
  webSocketServers.push(attachEmulatorTouchWs(server, { emulator: control.emulator }));
267
605
  }
606
+ startupWebSocketServers = webSocketServers;
607
+ // Plugin recovery fences and revokes any product-owned Portal authority.
608
+ // Do not expose the listener until every enabled Plugin got its serialized
609
+ // startup attempt; startPluginRuntimes absorbs individual failures.
610
+ await (pluginRuntime?.startPluginRuntimes() ?? Promise.resolve());
611
+ if (sessionPortalConfig) {
612
+ sessionPortalServer = await startSessionPortal({
613
+ host: config.RYNX_SESSION_PORTAL_HOST,
614
+ port: config.RYNX_SESSION_PORTAL_PORT,
615
+ scheme: "http",
616
+ authorization: sessionPortalConfig.authorization,
617
+ controlOrigin: listeningHttpOrigin(server),
618
+ controlWebDist: sessionPortalConfig.controlWebDist,
619
+ shutdownSignal: controlShutdown.signal,
620
+ });
621
+ }
268
622
  resolve(bindServerLifecycle(server, {
269
- fence: () => controlShutdown.abort(new Error("Rynx server is shutting down")),
270
- closeUpgrades: () => closeWebSocketServers(webSocketServers),
623
+ fence: () => {
624
+ controlShutdown.abort(new Error("Rynx server is shutting down"));
625
+ sessionPortalServer?.stopAccepting();
626
+ },
627
+ closeUpgrades: () => Promise.all([
628
+ closeWebSocketServers(webSocketServers),
629
+ sessionPortalServer?.shutdown() ?? Promise.resolve(),
630
+ ]).then(() => undefined),
271
631
  cleanup: async () => runCleanupSteps([
272
- () => startup.catch(() => undefined),
273
632
  () => Promise.resolve(daemonManagement?.pluginManagement?.dispose?.()),
274
633
  () => pluginRuntime?.dispose() ?? Promise.resolve(),
275
634
  () => runnerManager.stop(),
276
635
  ]),
277
636
  }));
278
- });
637
+ };
279
638
  });
280
639
  }
640
+ function listeningHttpOrigin(server) {
641
+ const address = server.address();
642
+ if (!address || typeof address === "string") {
643
+ throw new Error("Control listener did not expose an HTTP address");
644
+ }
645
+ const host = address.address.includes(":") ? `[${address.address}]` : address.address;
646
+ return `http://${host}:${address.port}`;
647
+ }
281
648
  function requireDaemonManagementToken(host) {
282
649
  const token = host?.managementToken;
283
650
  const bytes = typeof token === "string" ? Buffer.byteLength(token, "utf8") : 0;