@rynx-ai/server 0.1.11-beta.3 → 0.1.11-beta.30

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 (448) hide show
  1. package/dist/control-api.d.ts +16 -4
  2. package/dist/control-api.js +676 -83
  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-BdImnpbu.js +1 -0
  63. package/dist/control-web/assets/abnfDiagram-VRR7QNED-COu02MlJ.js +1 -0
  64. package/dist/control-web/assets/actionscript-3-CoDkCxhg.js +1 -0
  65. package/dist/control-web/assets/ada-bCR0ucgS.js +1 -0
  66. package/dist/control-web/assets/andromeeda-C4gqWexZ.js +1 -0
  67. package/dist/control-web/assets/angular-html-CU67Zn6k.js +1 -0
  68. package/dist/control-web/assets/angular-ts-BwZT4LLn.js +1 -0
  69. package/dist/control-web/assets/apache-Pmp26Uib.js +1 -0
  70. package/dist/control-web/assets/apex-D8_7TLub.js +1 -0
  71. package/dist/control-web/assets/apl-dKokRX4l.js +1 -0
  72. package/dist/control-web/assets/applescript-Co6uUVPk.js +1 -0
  73. package/dist/control-web/assets/ara-BRHolxvo.js +1 -0
  74. package/dist/control-web/assets/arc-DqiFeYAM.js +1 -0
  75. package/dist/control-web/assets/architectureDiagram-ZJ3FMSHR-BWFGgUV4.js +36 -0
  76. package/dist/control-web/assets/asciidoc-Ve4PFQV2.js +1 -0
  77. package/dist/control-web/assets/asm-D_Q5rh1f.js +1 -0
  78. package/dist/control-web/assets/astro-CbQHKStN.js +1 -0
  79. package/dist/control-web/assets/aurora-x-D-2ljcwZ.js +1 -0
  80. package/dist/control-web/assets/awk-DMzUqQB5.js +1 -0
  81. package/dist/control-web/assets/ayu-dark-DYE7WIF3.js +1 -0
  82. package/dist/control-web/assets/ayu-light-BA47KaF1.js +1 -0
  83. package/dist/control-web/assets/ayu-mirage-32ctXXKs.js +1 -0
  84. package/dist/control-web/assets/ballerina-BFfxhgS-.js +1 -0
  85. package/dist/control-web/assets/bat-BkioyH1T.js +1 -0
  86. package/dist/control-web/assets/beancount-k_qm7-4y.js +1 -0
  87. package/dist/control-web/assets/berry-uYugtg8r.js +1 -0
  88. package/dist/control-web/assets/bibtex-CHM0blh-.js +1 -0
  89. package/dist/control-web/assets/bicep-Bmn6On1c.js +1 -0
  90. package/dist/control-web/assets/bird2-DPOp833l.js +1 -0
  91. package/dist/control-web/assets/blade-D4QpJJKB.js +1 -0
  92. package/dist/control-web/assets/blockDiagram-677ZJIJ3-ZC0bXDzB.js +132 -0
  93. package/dist/control-web/assets/bsl-BO_Y6i37.js +1 -0
  94. package/dist/control-web/assets/c-BIGW1oBm.js +1 -0
  95. package/dist/control-web/assets/c3-eo99z4R2.js +1 -0
  96. package/dist/control-web/assets/c4Diagram-LMCZKHZV-Uupq5I-s.js +10 -0
  97. package/dist/control-web/assets/cadence-Bv_4Rxtq.js +1 -0
  98. package/dist/control-web/assets/cairo-KRGpt6FW.js +1 -0
  99. package/dist/control-web/assets/catppuccin-frappe-DFWUc33u.js +1 -0
  100. package/dist/control-web/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
  101. package/dist/control-web/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
  102. package/dist/control-web/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
  103. package/dist/control-web/assets/channel-3HG15wfa.js +1 -0
  104. package/dist/control-web/assets/chunk-2Q5K7J3B-C77vwuDM.js +1 -0
  105. package/dist/control-web/assets/chunk-32BRIVSS-BkfLE_TX.js +1 -0
  106. package/dist/control-web/assets/chunk-5VM5RSS4-By6zfDWW.js +15 -0
  107. package/dist/control-web/assets/chunk-EX3LRPZG-CO439p_3.js +231 -0
  108. package/dist/control-web/assets/chunk-JWPE2WC7-B9BPEwug.js +1 -0
  109. package/dist/control-web/assets/chunk-MOJQB5TN-CYKygWZz.js +88 -0
  110. package/dist/control-web/assets/chunk-RYQCIY6F-ug-An4HG.js +1 -0
  111. package/dist/control-web/assets/chunk-V7JOEXUC-3UFQGnKX.js +206 -0
  112. package/dist/control-web/assets/chunk-VR4S4FIN-DjspjYUb.js +1 -0
  113. package/dist/control-web/assets/chunk-XXDRQBXY-3znnutie.js +1 -0
  114. package/dist/control-web/assets/clarity-D53aC0YG.js +1 -0
  115. package/dist/control-web/assets/classDiagram-OUVF2IWQ-WmU4L9YT.js +1 -0
  116. package/dist/control-web/assets/classDiagram-v2-EOCWNBFH-WmU4L9YT.js +1 -0
  117. package/dist/control-web/assets/clojure-P80f7IUj.js +1 -0
  118. package/dist/control-web/assets/cmake-D1j8_8rp.js +1 -0
  119. package/dist/control-web/assets/cobol-nwyudZeR.js +1 -0
  120. package/dist/control-web/assets/codeowners-Bp6g37R7.js +1 -0
  121. package/dist/control-web/assets/codeql-DsOJ9woJ.js +1 -0
  122. package/dist/control-web/assets/coffee-Ch7k5sss.js +1 -0
  123. package/dist/control-web/assets/common-lisp-Cg-RD9OK.js +1 -0
  124. package/dist/control-web/assets/coq-DkFqJrB1.js +1 -0
  125. package/dist/control-web/assets/cose-bilkent-JH36ORCC-Dr28goCd.js +1 -0
  126. package/dist/control-web/assets/cpp-CofmeUqb.js +1 -0
  127. package/dist/control-web/assets/crystal-tKQVLTB8.js +1 -0
  128. package/dist/control-web/assets/csharp-COcwbKMJ.js +1 -0
  129. package/dist/control-web/assets/css-DPfMkruS.js +1 -0
  130. package/dist/control-web/assets/csv-fuZLfV_i.js +1 -0
  131. package/dist/control-web/assets/cue-D82EKSYY.js +1 -0
  132. package/dist/control-web/assets/cynefin-VYW2F7L2-Be5uJhnw.js +178 -0
  133. package/dist/control-web/assets/cynefinDiagram-TSTJHNR4-BLxtSvL6.js +62 -0
  134. package/dist/control-web/assets/cypher-COkxafJQ.js +1 -0
  135. package/dist/control-web/assets/cytoscape.esm-DTSO7Bv0.js +331 -0
  136. package/dist/control-web/assets/d-85-TOEBH.js +1 -0
  137. package/dist/control-web/assets/dagre-VKFMJZFB-DPRuDV5p.js +4 -0
  138. package/dist/control-web/assets/dark-plus-C3mMm8J8.js +1 -0
  139. package/dist/control-web/assets/dart-CF10PKvl.js +1 -0
  140. package/dist/control-web/assets/dax-CEL-wOlO.js +1 -0
  141. package/dist/control-web/assets/defaultLocale-DX6XiGOO.js +1 -0
  142. package/dist/control-web/assets/desktop-BmXAJ9_W.js +1 -0
  143. package/dist/control-web/assets/diagram-FQU43EPY-Cybg22U0.js +3 -0
  144. package/dist/control-web/assets/diagram-G47NLZAW-CGeIKUfW.js +24 -0
  145. package/dist/control-web/assets/diagram-NH7WQ7WH-BJq5MBRm.js +24 -0
  146. package/dist/control-web/assets/diagram-OA4YK3LP-DquOQGwg.js +30 -0
  147. package/dist/control-web/assets/diagram-WEI45ONY-Cblb4xP2.js +41 -0
  148. package/dist/control-web/assets/diff-D97Zzqfu.js +1 -0
  149. package/dist/control-web/assets/docker-BcOcwvcX.js +1 -0
  150. package/dist/control-web/assets/dotenv-Da5cRb03.js +1 -0
  151. package/dist/control-web/assets/dracula-BzJJZx-M.js +1 -0
  152. package/dist/control-web/assets/dracula-soft-BXkSAIEj.js +1 -0
  153. package/dist/control-web/assets/dream-maker-BtqSS_iP.js +1 -0
  154. package/dist/control-web/assets/ebnfDiagram-CCIWWBDH-CQjHiOqj.js +1 -0
  155. package/dist/control-web/assets/edge-BkV0erSs.js +1 -0
  156. package/dist/control-web/assets/elixir-CDX3lj18.js +1 -0
  157. package/dist/control-web/assets/elm-DbKCFpqz.js +1 -0
  158. package/dist/control-web/assets/emacs-lisp-C9XAeP06.js +1 -0
  159. package/dist/control-web/assets/erDiagram-Q63AITRT-Bspr3uKJ.js +85 -0
  160. package/dist/control-web/assets/erb-B12qg9BL.js +1 -0
  161. package/dist/control-web/assets/erlang-DsQrWhSR.js +1 -0
  162. package/dist/control-web/assets/everforest-dark-BgDCqdQA.js +1 -0
  163. package/dist/control-web/assets/everforest-light-C8M2exoo.js +1 -0
  164. package/dist/control-web/assets/fennel-BYunw83y.js +1 -0
  165. package/dist/control-web/assets/fish-BvzEVeQv.js +1 -0
  166. package/dist/control-web/assets/flowDiagram-23GEKE2U-CxcZyBA-.js +156 -0
  167. package/dist/control-web/assets/fluent-C4IJs8-o.js +1 -0
  168. package/dist/control-web/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  169. package/dist/control-web/assets/fortran-free-form-BxgE0vQu.js +1 -0
  170. package/dist/control-web/assets/fsharp-CXgrBDvD.js +1 -0
  171. package/dist/control-web/assets/ganttDiagram-NO4QXBWP-qBdh7A-P.js +292 -0
  172. package/dist/control-web/assets/gdresource-BOOCDP_w.js +1 -0
  173. package/dist/control-web/assets/gdscript-C5YyOfLZ.js +1 -0
  174. package/dist/control-web/assets/gdshader-DkwncUOv.js +1 -0
  175. package/dist/control-web/assets/genie-D0YGMca9.js +1 -0
  176. package/dist/control-web/assets/gherkin-DyxjwDmM.js +1 -0
  177. package/dist/control-web/assets/git-commit-F4YmCXRG.js +1 -0
  178. package/dist/control-web/assets/git-rebase-r7XF79zn.js +1 -0
  179. package/dist/control-web/assets/gitGraphDiagram-IHSO6WYX-BTYub2KT.js +106 -0
  180. package/dist/control-web/assets/github-dark-DHJKELXO.js +1 -0
  181. package/dist/control-web/assets/github-dark-default-Cuk6v7N8.js +1 -0
  182. package/dist/control-web/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  183. package/dist/control-web/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  184. package/dist/control-web/assets/github-light-DAi9KRSo.js +1 -0
  185. package/dist/control-web/assets/github-light-default-D7oLnXFd.js +1 -0
  186. package/dist/control-web/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  187. package/dist/control-web/assets/gleam-BspZqrRM.js +1 -0
  188. package/dist/control-web/assets/glimmer-js-Rg0-pVw9.js +1 -0
  189. package/dist/control-web/assets/glimmer-ts-U6CK756n.js +1 -0
  190. package/dist/control-web/assets/glsl-DplSGwfg.js +1 -0
  191. package/dist/control-web/assets/gn-n2N0HUVH.js +1 -0
  192. package/dist/control-web/assets/gnuplot-DdkO51Og.js +1 -0
  193. package/dist/control-web/assets/go-CxLEBnE3.js +1 -0
  194. package/dist/control-web/assets/graph-C9eacEi8.js +1 -0
  195. package/dist/control-web/assets/graphql-ChdNCCLP.js +1 -0
  196. package/dist/control-web/assets/groovy-gcz8RCvz.js +1 -0
  197. package/dist/control-web/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  198. package/dist/control-web/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  199. package/dist/control-web/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  200. package/dist/control-web/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  201. package/dist/control-web/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  202. package/dist/control-web/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  203. package/dist/control-web/assets/hack-CaT9iCJl.js +1 -0
  204. package/dist/control-web/assets/haml-B8DHNrY2.js +1 -0
  205. package/dist/control-web/assets/handlebars-BL8al0AC.js +1 -0
  206. package/dist/control-web/assets/haskell-Df6bDoY_.js +1 -0
  207. package/dist/control-web/assets/haxe-CzTSHFRz.js +1 -0
  208. package/dist/control-web/assets/hcl-BWvSN4gD.js +1 -0
  209. package/dist/control-web/assets/{highlighted-body-OFNGDK62-DWWsUtHF.js → highlighted-body-OFNGDK62-DyksUrwu.js} +1 -1
  210. package/dist/control-web/assets/hjson-D5-asLiD.js +1 -0
  211. package/dist/control-web/assets/hlsl-D3lLCCz7.js +1 -0
  212. package/dist/control-web/assets/horizon-BUw7H-hv.js +1 -0
  213. package/dist/control-web/assets/horizon-bright-Cn-bp-IR.js +1 -0
  214. package/dist/control-web/assets/houston-DnULxvSX.js +1 -0
  215. package/dist/control-web/assets/html-GMplVEZG.js +1 -0
  216. package/dist/control-web/assets/html-derivative-BFtXZ54Q.js +1 -0
  217. package/dist/control-web/assets/http-jrhK8wxY.js +1 -0
  218. package/dist/control-web/assets/hurl-irOxFIW8.js +1 -0
  219. package/dist/control-web/assets/hxml-Bvhsp5Yf.js +1 -0
  220. package/dist/control-web/assets/hy-DFXneXwc.js +1 -0
  221. package/dist/control-web/assets/imba-DGztddWO.js +1 -0
  222. package/dist/control-web/assets/index-B9SAq_63.js +718 -0
  223. package/dist/control-web/assets/index-BDaSctIT.js +153 -0
  224. package/dist/control-web/assets/index-CtaYRNgJ.css +32 -0
  225. package/dist/control-web/assets/infoDiagram-FWYZ7A6U-ChbQR3Zo.js +2 -0
  226. package/dist/control-web/assets/ini-BEwlwnbL.js +1 -0
  227. package/dist/control-web/assets/init-Gi6I4Gst.js +1 -0
  228. package/dist/control-web/assets/ishikawaDiagram-FXEZZL3T-C-4_qGzn.js +70 -0
  229. package/dist/control-web/assets/java-CylS5w8V.js +1 -0
  230. package/dist/control-web/assets/javascript-wDzz0qaB.js +1 -0
  231. package/dist/control-web/assets/jinja-4LBKfQ-Z.js +1 -0
  232. package/dist/control-web/assets/jison-wvAkD_A8.js +1 -0
  233. package/dist/control-web/assets/journeyDiagram-5HDEW3XC-B090zN18.js +139 -0
  234. package/dist/control-web/assets/json-Cp-IABpG.js +1 -0
  235. package/dist/control-web/assets/json5-C9tS-k6U.js +1 -0
  236. package/dist/control-web/assets/jsonc-Des-eS-w.js +1 -0
  237. package/dist/control-web/assets/jsonl-DcaNXYhu.js +1 -0
  238. package/dist/control-web/assets/jsonnet-DFQXde-d.js +1 -0
  239. package/dist/control-web/assets/jssm-C2t-YnRu.js +1 -0
  240. package/dist/control-web/assets/jsx-g9-lgVsj.js +1 -0
  241. package/dist/control-web/assets/julia-CxzCAyBv.js +1 -0
  242. package/dist/control-web/assets/just-Cw27pwNe.js +1 -0
  243. package/dist/control-web/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
  244. package/dist/control-web/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
  245. package/dist/control-web/assets/kanagawa-wave-DWedfzmr.js +1 -0
  246. package/dist/control-web/assets/kanban-definition-HUTT4EX6-RlTcRbPs.js +89 -0
  247. package/dist/control-web/assets/kdl-DV7GczEv.js +1 -0
  248. package/dist/control-web/assets/kotlin-BdnUsdx6.js +1 -0
  249. package/dist/control-web/assets/kusto-DZf3V79B.js +1 -0
  250. package/dist/control-web/assets/laserwave-DUszq2jm.js +1 -0
  251. package/dist/control-web/assets/latex-CWtU0Tv5.js +1 -0
  252. package/dist/control-web/assets/layout-DEXfKzaS.js +1 -0
  253. package/dist/control-web/assets/lean-BZvkOJ9d.js +1 -0
  254. package/dist/control-web/assets/less-B1dDrJ26.js +1 -0
  255. package/dist/control-web/assets/light-plus-B7mTdjB0.js +1 -0
  256. package/dist/control-web/assets/linear-DTuNxDqu.js +1 -0
  257. package/dist/control-web/assets/liquid-DYVedYrR.js +1 -0
  258. package/dist/control-web/assets/llvm-DjAJT7YJ.js +1 -0
  259. package/dist/control-web/assets/log-2UxHyX5q.js +1 -0
  260. package/dist/control-web/assets/logo-BtOb2qkB.js +1 -0
  261. package/dist/control-web/assets/lua-BaeVxFsk.js +1 -0
  262. package/dist/control-web/assets/luau-C-HG3fhB.js +1 -0
  263. package/dist/control-web/assets/make-CHLpvVh8.js +1 -0
  264. package/dist/control-web/assets/map-Czzmt4hB.js +1 -0
  265. package/dist/control-web/assets/markdown-Cvjx9yec.js +1 -0
  266. package/dist/control-web/assets/marko-CnJfTvn9.js +1 -0
  267. package/dist/control-web/assets/material-theme-D5KoaKCx.js +1 -0
  268. package/dist/control-web/assets/material-theme-darker-BfHTSMKl.js +1 -0
  269. package/dist/control-web/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  270. package/dist/control-web/assets/material-theme-ocean-CyktbL80.js +1 -0
  271. package/dist/control-web/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  272. package/dist/control-web/assets/matlab-D7o27uSR.js +1 -0
  273. package/dist/control-web/assets/mdc-BMNejdWA.js +1 -0
  274. package/dist/control-web/assets/mdx-Cmh6b_Ma.js +1 -0
  275. package/dist/control-web/assets/mermaid-GHXKKRXX-BYZTj3zW.css +1 -0
  276. package/dist/control-web/assets/mermaid-GHXKKRXX-BkcV3dgg.js +710 -0
  277. package/dist/control-web/assets/mermaid-mWjccvbQ.js +1 -0
  278. package/dist/control-web/assets/min-dark-CafNBF8u.js +1 -0
  279. package/dist/control-web/assets/min-light-CTRr51gU.js +1 -0
  280. package/dist/control-web/assets/mindmap-definition-LN4V7U3C-DYby41E9.js +96 -0
  281. package/dist/control-web/assets/mipsasm-CKIfxQSi.js +1 -0
  282. package/dist/control-web/assets/mojo-rZm6bMo-.js +1 -0
  283. package/dist/control-web/assets/monokai-D4h5O-jR.js +1 -0
  284. package/dist/control-web/assets/moonbit-_H4v1dQx.js +1 -0
  285. package/dist/control-web/assets/move-IF9eRakj.js +1 -0
  286. package/dist/control-web/assets/narrat-DRg8JJMk.js +1 -0
  287. package/dist/control-web/assets/nextflow-Zz6hmt5N.js +1 -0
  288. package/dist/control-web/assets/nextflow-groovy-BeH2EWoN.js +1 -0
  289. package/dist/control-web/assets/nginx-BpAMiNFr.js +1 -0
  290. package/dist/control-web/assets/night-owl-C39BiMTA.js +1 -0
  291. package/dist/control-web/assets/night-owl-light-CMTm3GFP.js +1 -0
  292. package/dist/control-web/assets/nim-CVrawwO9.js +1 -0
  293. package/dist/control-web/assets/nix-CwoSXNpI.js +1 -0
  294. package/dist/control-web/assets/nord-Ddv68eIx.js +1 -0
  295. package/dist/control-web/assets/nushell-Cz2AlsmD.js +1 -0
  296. package/dist/control-web/assets/objective-c-DXmwc3jG.js +1 -0
  297. package/dist/control-web/assets/objective-cpp-CLxacb5B.js +1 -0
  298. package/dist/control-web/assets/ocaml-C0hk2d4L.js +1 -0
  299. package/dist/control-web/assets/odin-BBf5iR-q.js +1 -0
  300. package/dist/control-web/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  301. package/dist/control-web/assets/one-light-C3Wv6jpd.js +1 -0
  302. package/dist/control-web/assets/openscad-C4EeE6gA.js +1 -0
  303. package/dist/control-web/assets/ordinal-Cboi1Yqb.js +1 -0
  304. package/dist/control-web/assets/pascal-D93ZcfNL.js +1 -0
  305. package/dist/control-web/assets/pegDiagram-2B236MQR-CPK6GaEv.js +1 -0
  306. package/dist/control-web/assets/perl-C0TMdlhV.js +1 -0
  307. package/dist/control-web/assets/php-Dhbhpdrm.js +1 -0
  308. package/dist/control-web/assets/pieDiagram-ENE6RG2P-DLCmXuji.js +39 -0
  309. package/dist/control-web/assets/pkl-u5AG7uiY.js +1 -0
  310. package/dist/control-web/assets/plastic-3e1v2bzS.js +1 -0
  311. package/dist/control-web/assets/plsql-ChMvpjG-.js +1 -0
  312. package/dist/control-web/assets/po-BTJTHyun.js +1 -0
  313. package/dist/control-web/assets/poimandres-CS3Unz2-.js +1 -0
  314. package/dist/control-web/assets/polar-C0HS_06l.js +1 -0
  315. package/dist/control-web/assets/postcss-CXtECtnM.js +1 -0
  316. package/dist/control-web/assets/powerquery-CEu0bR-o.js +1 -0
  317. package/dist/control-web/assets/powershell-Dpen1YoG.js +1 -0
  318. package/dist/control-web/assets/prisma-Dd19v3D-.js +1 -0
  319. package/dist/control-web/assets/prolog-CbFg5uaA.js +1 -0
  320. package/dist/control-web/assets/proto-C7zT0LnQ.js +1 -0
  321. package/dist/control-web/assets/pug-CGlum2m_.js +1 -0
  322. package/dist/control-web/assets/puppet-BMWR74SV.js +1 -0
  323. package/dist/control-web/assets/purescript-CklMAg4u.js +1 -0
  324. package/dist/control-web/assets/python-B6aJPvgy.js +1 -0
  325. package/dist/control-web/assets/qml-3beO22l8.js +1 -0
  326. package/dist/control-web/assets/qmldir-C8lEn-DE.js +1 -0
  327. package/dist/control-web/assets/qss-IeuSbFQv.js +1 -0
  328. package/dist/control-web/assets/quadrantDiagram-ABIIQ3AL-RIS8r7CA.js +7 -0
  329. package/dist/control-web/assets/r-Dspwwk_N.js +1 -0
  330. package/dist/control-web/assets/racket-BqYA7rlc.js +1 -0
  331. package/dist/control-web/assets/railroadDiagram-RFXS5EU6-B1HB7xsg.js +1 -0
  332. package/dist/control-web/assets/raku-DXvB9xmW.js +1 -0
  333. package/dist/control-web/assets/razor-Uh8Bk_45.js +1 -0
  334. package/dist/control-web/assets/red-bN70gL4F.js +1 -0
  335. package/dist/control-web/assets/reg-C-SQnVFl.js +1 -0
  336. package/dist/control-web/assets/regexp-CDVJQ6XC.js +1 -0
  337. package/dist/control-web/assets/rel-C3B-1QV4.js +1 -0
  338. package/dist/control-web/assets/requirementDiagram-TGXJPOKE-Inh_4hU0.js +84 -0
  339. package/dist/control-web/assets/riscv-BM1_JUlF.js +1 -0
  340. package/dist/control-web/assets/ron-D8l8udqQ.js +1 -0
  341. package/dist/control-web/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
  342. package/dist/control-web/assets/rose-pine-moon-D4_iv3hh.js +1 -0
  343. package/dist/control-web/assets/rose-pine-qdsjHGoJ.js +1 -0
  344. package/dist/control-web/assets/rosmsg-BJDFO7_C.js +1 -0
  345. package/dist/control-web/assets/rst-BrH8l1NY.js +1 -0
  346. package/dist/control-web/assets/ruby-Dw2BHqvy.js +1 -0
  347. package/dist/control-web/assets/rust-B1yitclQ.js +1 -0
  348. package/dist/control-web/assets/sankeyDiagram-HTMAVEWB-DPF33kPB.js +40 -0
  349. package/dist/control-web/assets/sas-cz2c8ADy.js +1 -0
  350. package/dist/control-web/assets/sass-Cj5Yp3dK.js +1 -0
  351. package/dist/control-web/assets/scala-C151Ov-r.js +1 -0
  352. package/dist/control-web/assets/scheme-C98Dy4si.js +1 -0
  353. package/dist/control-web/assets/scss-OYdSNvt2.js +1 -0
  354. package/dist/control-web/assets/sdbl-DVxCFoDh.js +1 -0
  355. package/dist/control-web/assets/sequenceDiagram-DBY2YBRQ-iywKWoYc.js +162 -0
  356. package/dist/control-web/assets/shaderlab-Dg9Lc6iA.js +1 -0
  357. package/dist/control-web/assets/shellscript-Yzrsuije.js +1 -0
  358. package/dist/control-web/assets/shellsession-BADoaaVG.js +1 -0
  359. package/dist/control-web/assets/sizeCapture-X5ZJPWSS-DlnHubz9.js +1 -0
  360. package/dist/control-web/assets/slack-dark-BthQWCQV.js +1 -0
  361. package/dist/control-web/assets/slack-ochin-DqwNpetd.js +1 -0
  362. package/dist/control-web/assets/smalltalk-BERRCDM3.js +1 -0
  363. package/dist/control-web/assets/snazzy-light-Bw305WKR.js +1 -0
  364. package/dist/control-web/assets/solarized-dark-DXbdFlpD.js +1 -0
  365. package/dist/control-web/assets/solarized-light-L9t79GZl.js +1 -0
  366. package/dist/control-web/assets/solidity-rGO070M0.js +1 -0
  367. package/dist/control-web/assets/soy-Brmx7dQM.js +1 -0
  368. package/dist/control-web/assets/sparql-rVzFXLq3.js +1 -0
  369. package/dist/control-web/assets/splunk-BtCnVYZw.js +1 -0
  370. package/dist/control-web/assets/sql-BLtJtn59.js +1 -0
  371. package/dist/control-web/assets/ssh-config-_ykCGR6B.js +1 -0
  372. package/dist/control-web/assets/stata-BH5u7GGu.js +1 -0
  373. package/dist/control-web/assets/stateDiagram-2N3HPSRC-CShzll2N.js +1 -0
  374. package/dist/control-web/assets/stateDiagram-v2-6OUMAXLB-Cdx0fWna.js +1 -0
  375. package/dist/control-web/assets/stylus-BEDo0Tqx.js +1 -0
  376. package/dist/control-web/assets/surrealql-Bq5Q-fJD.js +1 -0
  377. package/dist/control-web/assets/svelte-C_ipcX3V.js +1 -0
  378. package/dist/control-web/assets/swift-D82vCrfD.js +1 -0
  379. package/dist/control-web/assets/swimlanes-5IMT3BWC-CxlQpFBv.js +2 -0
  380. package/dist/control-web/assets/swimlanesDiagram-G3AALYLV-CoX0jnUu.js +8 -0
  381. package/dist/control-web/assets/synthwave-84-CbfX1IO0.js +1 -0
  382. package/dist/control-web/assets/system-verilog-CnnmHF94.js +1 -0
  383. package/dist/control-web/assets/systemd-4A_iFExJ.js +1 -0
  384. package/dist/control-web/assets/talonscript-CkByrt1z.js +1 -0
  385. package/dist/control-web/assets/tasl-QIJgUcNo.js +1 -0
  386. package/dist/control-web/assets/tcl-dwOrl1Do.js +1 -0
  387. package/dist/control-web/assets/templ-P3uqSqPl.js +1 -0
  388. package/dist/control-web/assets/terraform-BETggiCN.js +1 -0
  389. package/dist/control-web/assets/tex-idrVyKtj.js +1 -0
  390. package/dist/control-web/assets/timeline-definition-FHXFAJF6-Dlx59Xc3.js +120 -0
  391. package/dist/control-web/assets/tokyo-night-hegEt444.js +1 -0
  392. package/dist/control-web/assets/toml-vGWfd6FD.js +1 -0
  393. package/dist/control-web/assets/ts-tags-zn1MmPIZ.js +1 -0
  394. package/dist/control-web/assets/tsv-B_m7g4N7.js +1 -0
  395. package/dist/control-web/assets/tsx-COt5Ahok.js +1 -0
  396. package/dist/control-web/assets/turtle-BsS91CYL.js +1 -0
  397. package/dist/control-web/assets/twig-DNn4PbVi.js +1 -0
  398. package/dist/control-web/assets/typescript-BPQ3VLAy.js +1 -0
  399. package/dist/control-web/assets/typespec-BGHnOYBU.js +1 -0
  400. package/dist/control-web/assets/typst-DHCkPAjA.js +1 -0
  401. package/dist/control-web/assets/v-BcVCzyr7.js +1 -0
  402. package/dist/control-web/assets/vala-CsfeWuGM.js +1 -0
  403. package/dist/control-web/assets/vb-D17OF-Vu.js +1 -0
  404. package/dist/control-web/assets/vennDiagram-L72KCM5P-DLsv4i_t.js +34 -0
  405. package/dist/control-web/assets/verilog-BQ8w6xss.js +1 -0
  406. package/dist/control-web/assets/vesper-DU1UobuO.js +1 -0
  407. package/dist/control-web/assets/vhdl-CeAyd5Ju.js +1 -0
  408. package/dist/control-web/assets/viml-CJc9bBzg.js +1 -0
  409. package/dist/control-web/assets/vitesse-black-Bkuqu6BP.js +1 -0
  410. package/dist/control-web/assets/vitesse-dark-D0r3Knsf.js +1 -0
  411. package/dist/control-web/assets/vitesse-light-CVO1_9PV.js +1 -0
  412. package/dist/control-web/assets/vue-DN_0RTcg.js +1 -0
  413. package/dist/control-web/assets/vue-html-AaS7Mt5G.js +1 -0
  414. package/dist/control-web/assets/vue-vine-CQOfvN7w.js +1 -0
  415. package/dist/control-web/assets/vyper-CDx5xZoG.js +1 -0
  416. package/dist/control-web/assets/wardleyDiagram-EHGQE667-BazV8fpH.js +78 -0
  417. package/dist/control-web/assets/wasm-CG6Dc4jp.js +1 -0
  418. package/dist/control-web/assets/wasm-MzD3tlZU.js +1 -0
  419. package/dist/control-web/assets/wenyan-BV7otONQ.js +1 -0
  420. package/dist/control-web/assets/wgsl-Dx-B1_4e.js +1 -0
  421. package/dist/control-web/assets/wikitext-BhOHFoWU.js +1 -0
  422. package/dist/control-web/assets/wit-5i3qLPDT.js +1 -0
  423. package/dist/control-web/assets/wolfram-lXgVvXCa.js +1 -0
  424. package/dist/control-web/assets/xml-sdJ4AIDG.js +1 -0
  425. package/dist/control-web/assets/xsl-CtQFsRM5.js +1 -0
  426. package/dist/control-web/assets/xychartDiagram-FW5EYKEG-Bx9uDlYu.js +7 -0
  427. package/dist/control-web/assets/yaml-Buea-lGh.js +1 -0
  428. package/dist/control-web/assets/zenscript-DVFEvuxE.js +1 -0
  429. package/dist/control-web/assets/zig-VOosw3JB.js +1 -0
  430. package/dist/control-web/index.html +2 -2
  431. package/dist/control-web-dist.d.ts +1 -1
  432. package/dist/control-web-dist.js +4 -2
  433. package/dist/machine-session-service.d.ts +82 -15
  434. package/dist/machine-session-service.js +670 -80
  435. package/dist/remote-runtime-dispatcher.d.ts +1 -1
  436. package/dist/remote-runtime-dispatcher.js +16 -1
  437. package/dist/remote-runtime-session-projection.js +5 -0
  438. package/dist/server.d.ts +24 -7
  439. package/dist/server.js +207 -46
  440. package/dist/session-portal.d.ts +42 -0
  441. package/dist/session-portal.js +746 -0
  442. package/dist/session-runtime-index.d.ts +2 -6
  443. package/dist/session-runtime-index.js +70 -38
  444. package/dist/terminal-ws.js +8 -6
  445. package/package.json +7 -7
  446. package/dist/control-web/assets/index-BnX7NWJX.js +0 -689
  447. package/dist/control-web/assets/index-CUoWRX2i.css +0 -32
  448. package/dist/control-web/assets/mermaid-GHXKKRXX-C1fxAgiw.js +0 -131
@@ -34,7 +34,7 @@ export interface RemoteRuntimeProjectHost {
34
34
  update(projectId: string, input: RemoteRuntimeProjectCreateParams): RemoteRuntimeProject | undefined | Promise<RemoteRuntimeProject | undefined>;
35
35
  remove(projectId: string): boolean | Promise<boolean>;
36
36
  }
37
- export type RemoteRuntimeSessionHost = Pick<MachineSessionService, "list" | "snapshot" | "watch" | "interrupt" | "agentOptions" | "launchOptions" | "create" | "fork" | "sendMessage" | "resourcePolicy" | "beginResourceUpload" | "writeResourceUploadChunk" | "commitResourceUpload" | "getResource" | "readResource" | "deleteResource" | "enqueueMessage" | "startTerminal" | "delete" | "resolveInteraction">;
37
+ export type RemoteRuntimeSessionHost = Pick<MachineSessionService, "list" | "snapshot" | "watch" | "interrupt" | "agentOptions" | "launchOptions" | "executionSettings" | "updateExecutionSettings" | "create" | "fork" | "sendMessage" | "resourcePolicy" | "beginResourceUpload" | "writeResourceUploadChunk" | "commitResourceUpload" | "getResource" | "readResource" | "deleteResource" | "getFile" | "readFile" | "getWorkspaceFile" | "readWorkspaceFile" | "enqueueMessage" | "startTerminal" | "delete" | "resolveInteraction">;
38
38
  export type RemoteRuntimeBrowserHost = Pick<SessionBrowserService, "getState" | "open" | "close" | "createPage" | "closePage" | "activatePage" | "navigatePage" | "goBack" | "goForward" | "reload">;
39
39
  export type RemoteRuntimeSessionEmulatorHost = Pick<SessionEmulatorService, "getState" | "listDevices" | "attach" | "detach" | "tap" | "type" | "button" | "rotate" | "launch" | "gesture" | "releaseDevice" | "stopDevice">;
40
40
  export interface OpenRemoteRuntimeSessionEvents {
@@ -125,6 +125,10 @@ export class RemoteRuntimeDispatcher {
125
125
  return await this.withSessions(request, (sessions) => sessions.agentOptions());
126
126
  case "session.launchOptions.list":
127
127
  return await this.withSessions(request, (sessions) => sessions.launchOptions());
128
+ case "session.execution.get":
129
+ return await this.withSessions(request, (sessions) => sessions.executionSettings(request.params.sessionId));
130
+ case "session.execution.update":
131
+ return await this.withSessions(request, (sessions) => sessions.updateExecutionSettings(request.params));
128
132
  case "session.create":
129
133
  return await this.withSessions(request, (sessions) => sessions.create(request.params));
130
134
  case "session.fork":
@@ -150,6 +154,14 @@ export class RemoteRuntimeDispatcher {
150
154
  return await this.withSessions(request, (sessions) => sessions.readResource(request.params));
151
155
  case "session.resource.delete":
152
156
  return await this.withSessions(request, (sessions) => sessions.deleteResource(request.params));
157
+ case "session.file.get":
158
+ return await this.withSessions(request, (sessions) => sessions.getFile(request.params));
159
+ case "session.file.read":
160
+ return await this.withSessions(request, (sessions) => sessions.readFile(request.params));
161
+ case "session.workspace.file.get":
162
+ return await this.withSessions(request, (sessions) => sessions.getWorkspaceFile(request.params));
163
+ case "session.workspace.file.read":
164
+ return await this.withSessions(request, (sessions) => sessions.readWorkspaceFile(request.params));
153
165
  case "session.message.enqueue":
154
166
  return await this.withSessions(request, (sessions) => sessions.enqueueMessage(request.params.sessionId, request.params.message));
155
167
  case "session.terminal.start":
@@ -343,7 +355,10 @@ function mapHostError(request, error) {
343
355
  : error.code === "conflict"
344
356
  ? "Remote Session resource conflicts with existing state"
345
357
  : "Remote Session operation may have been applied";
346
- return { code: error.code, message };
358
+ // Native lifecycle failures are already reduced to a user-safe phase and
359
+ // concrete Provider cause. Preserve that text over Direct Runtime so the
360
+ // remote UI does not collapse every startup failure into one wrapper.
361
+ return { code: error.code, message: error.runtimeFailure?.message ?? message };
347
362
  }
348
363
  if (request.method === "session.interrupt") {
349
364
  return {
@@ -65,6 +65,9 @@ function projectRuntimeSnapshot(value) {
65
65
  const projected = {
66
66
  status: runtime.status,
67
67
  ...(runtime.statusKind === undefined ? {} : { statusKind: runtime.statusKind }),
68
+ ...(runtime.backgroundTaskCount === undefined
69
+ ? {}
70
+ : { backgroundTaskCount: runtime.backgroundTaskCount }),
68
71
  activeResponseIds: [],
69
72
  pendingInteractions: [],
70
73
  };
@@ -530,10 +533,12 @@ function assertEventScope(event, expectedSessionId) {
530
533
  let actual;
531
534
  switch (event.type) {
532
535
  case "session.status":
536
+ case "session.collaboration_mode":
533
537
  case "response.created":
534
538
  case "session.interaction.requested":
535
539
  case "session.interaction.resolved":
536
540
  case "session.interaction.cancelled":
541
+ case "session.interrupted":
537
542
  case "session.todos":
538
543
  case "session.rotated":
539
544
  actual = event.sessionId;
package/dist/server.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import type { Server as HttpServer } from "node:http";
2
2
  import Koa from "koa";
3
3
  import { ConversationRuntime, type AdmissionReservation, type AgentCapabilities, type AgentSessionStore, type AppConfig, type SessionEvent, type SessionBus, type SessionLogStore, type SessionRegistry } from "@rynx-ai/core";
4
- import type { SessionInteractionResolution } from "@rynx-ai/protocol";
4
+ import type { SessionImageFileReference, SessionInteractionResolution } from "@rynx-ai/protocol";
5
5
  import type { ControlRuntimeShareAddress, DaemonBrowserArtifactCleanResult, DaemonBrowserArtifactInstallInput, DaemonBrowserArtifactInstallResult, DaemonBrowserArtifactUpdateInput, DaemonBrowserArtifactVersionResult, DaemonCleanupSessionsInput, DaemonCleanupSessionsResult, DaemonChromeInspectionConfigureInput, DaemonChromeInspectionStatus, DaemonShutdownIfIdleResult } from "@rynx-ai/protocol/control";
6
6
  import type { PluginInstallCommitInput, PluginInstallCommitResult, PluginInstallPreparation, PluginInstallPrepareInput, PluginManagementItem, PluginMarketplaceAddInput, PluginMarketplaceItem } from "@rynx-ai/protocol/plugin-management";
7
- import type { PluginJsonValue } from "@rynx-ai/plugin-sdk";
7
+ import type { PluginAgentSummary, PluginJsonValue, PluginResolvedSessionExecution, PluginSessionActivitySnapshot, PluginSessionExecutionSnapshot } from "@rynx-ai/plugin-sdk";
8
8
  import type { PairingOffer } from "@rynx-ai/protocol/direct-runtime";
9
9
  import type { DaemonStatus } from "@rynx-ai/protocol/remote-runtime";
10
10
  import type { RuntimeBrowserBootstrapCredential, RuntimeBrowserEndpointDescriptor } from "@rynx-ai/protocol/runtime-browser-bootstrap";
@@ -12,12 +12,14 @@ import type { RuntimeBrowserInspectMessage, RuntimeBrowserInspectTarget } from "
12
12
  import type { RuntimeBrowserSurfaceClientFrame, RuntimeBrowserSurfaceImageFrame, RuntimeBrowserSurfaceOpenFrame, RuntimeBrowserSurfaceReadyFrame, RuntimeBrowserSurfaceServerFrame } from "@rynx-ai/protocol/runtime-browser-surface";
13
13
  import type { RuntimeEmulatorSurfaceImageFrame, RuntimeEmulatorSurfaceReadyFrame } from "@rynx-ai/protocol/runtime-emulator-surface";
14
14
  import type { RemoteRuntimeRpcMethod, RemoteRuntimeRpcParams, RemoteRuntimeRpcResultFor, RemoteRuntimeSequencedSessionEvent } from "@rynx-ai/protocol/remote-runtime-rpc";
15
- import type { PluginAgentSummary, PluginResolvedSessionExecution, PluginSessionExecutionSnapshot } from "@rynx-ai/plugin-sdk";
16
15
  import { RunnerManager, type CodexSessionStore, type RunnerSessionContextProvider } from "@rynx-ai/runtime";
17
16
  import { type ControlPlaneDeps, type LocalSessionResourceHost, type SessionResourceLifecycle } from "./control-api.js";
18
17
  import type { MachineSessionService } from "./machine-session-service.js";
19
18
  import type { DaemonRuntimeHost } from "./remote-runtime.js";
20
19
  import { type AttachDesktopBrowserHostServerOptions } from "./desktop-browser-host.js";
20
+ import { type SessionPortalAuthorizationPorts } from "./session-portal.js";
21
+ export { createSessionPortalApp, startSessionPortal } from "./session-portal.js";
22
+ export type { SessionPortalAuthorization, SessionPortalAuthorizationPorts, SessionPortalOptions, SessionPortalServer, } from "./session-portal.js";
21
23
  import { SessionRuntimeIndex } from "./session-runtime-index.js";
22
24
  import type { SessionEmulatorService } from "./session-emulator-service.js";
23
25
  import { type SessionTerminalHost } from "./session-terminal-host.js";
@@ -25,7 +27,7 @@ import type { ProviderCliManagementHost } from "./provider-cli-host.js";
25
27
  import { type RuntimeWebAccessPolicy } from "./runtime-web-auth.js";
26
28
  export type { ProviderCliManagementHost, ProviderCliStatusHost, } from "./provider-cli-host.js";
27
29
  export { MachineSessionService, MachineSessionServiceFailure, MachineSessionServiceInputError, synthesizeSessionTitle, } from "./machine-session-service.js";
28
- export type { MachineSessionAgentCatalogPort, MachineSessionCreateInput, MachineSessionCreateResult, MachineSessionDeleteResult, MachineSessionForkInput, MachineSessionForkOperationRecord, MachineSessionForkOperationState, MachineSessionForkResult, MachineSessionForkStorePort, MachineSessionNativeRotationInput, MachineSessionInterruptPort, MachineSessionInterruptResult, MachineSessionInteractionResult, MachineSessionListInput, MachineSessionListPage, MachineSessionMessageResult, MachineSessionMessageEnqueueResult, MachineSessionMessageInput, MachineSessionMessageOperationState, MachineSessionPendingMessage, MachineSessionPendingMessagePort, MachineSessionPreparedInput, MachineSessionResourcePort, MachineSessionRunnerPort, MachineSessionRuntimeStatePort, MachineSessionServiceFailureCode, MachineSessionServiceOptions, MachineSessionServicePorts, MachineSessionSnapshotInput, MachineSessionSnapshotPage, MachineSessionWatch, } from "./machine-session-service.js";
30
+ export type { MachineSessionAgentCatalogPort, MachineSessionCreateInput, MachineSessionCreateResult, MachineSessionDeleteResult, MachineSessionForkInput, MachineSessionForkOperationRecord, MachineSessionForkOperationState, MachineSessionForkResult, MachineSessionForkStorePort, MachineSessionNativeRotationInput, MachineSessionInterruptPort, MachineSessionInterruptResult, MachineSessionInteractionResult, MachineSessionListInput, MachineSessionListPage, MachineSessionMessageResult, MachineSessionMessageEnqueueResult, MachineSessionMessageInput, MachineSessionMessageOperationState, MachineSessionPendingMessage, MachineSessionPendingMessagePort, MachineSessionPreparedInput, MachineSessionResourcePort, MachineSessionRunExecutionSelection, MachineSessionRunExecutionSnapshot, MachineSessionRunnerPort, MachineSessionRuntimeStatePort, MachineSessionServiceFailureCode, MachineSessionServiceOptions, MachineSessionServicePorts, MachineSessionSnapshotInput, MachineSessionSnapshotPage, MachineSessionWatch, StartedMachineSessionRun, } from "./machine-session-service.js";
29
31
  export { SessionBrowserHostError, SessionBrowserService, SessionBrowserServiceError, SessionBrowserSurfaceUnsupportedError, } from "./session-browser-service.js";
30
32
  export type { SessionBrowserHost, SessionBrowserHostCreateInput, SessionBrowserHostErrorCode, SessionBrowserHostEvent, SessionBrowserHostHandle, SessionBrowserHostPage, SessionBrowserHostSurfaceFrame, SessionBrowserHostSurfaceOpenInput, SessionBrowserHostSurfaceSource, SessionBrowserHostSurfaceTrustedInput, SessionBrowserHostSurfaceViewport, SessionBrowserHostSnapshot, SessionBrowserInspectionEndpoint, SessionBrowserInspectionTarget, SessionBrowserRegistryPort, SessionBrowserServiceErrorCode, SessionBrowserServiceOptions, SessionBrowserServicePorts, SessionBrowserSurfaceOpenInput, SessionBrowserSurfaceSource, } from "./session-browser-service.js";
31
33
  export { SessionEmulatorBindingConflictError, SessionEmulatorService, SessionEmulatorServiceError, } from "./session-emulator-service.js";
@@ -132,6 +134,9 @@ export interface StartServerOptions {
132
134
  providerClis?: ProviderCliManagementHost;
133
135
  /** Private resident-app Browser Host socket, authenticated by daemonManagement. */
134
136
  desktopBrowserHost?: Omit<AttachDesktopBrowserHostServerOptions, "managementToken">;
137
+ /** Hashed ticket/grant authority for the native Session Portal. Required
138
+ * when RYNX_SESSION_PORTAL_PORT enables that listener. */
139
+ sessionPortalAuthorization?: SessionPortalAuthorizationPorts;
135
140
  }
136
141
  export interface SessionRuntimeServices {
137
142
  sessionStore: CodexSessionStore;
@@ -142,10 +147,11 @@ export interface SessionRuntimeServices {
142
147
  publishSessionEvent: (sessionId: string, event: SessionEvent) => Promise<void>;
143
148
  }
144
149
  export interface PluginRuntimeHostServices {
145
- conversationRuntime: ConversationRuntime;
146
150
  capabilities: AgentCapabilities;
147
151
  sessionStore: AgentSessionStore;
148
152
  sessionRegistry: SessionRegistry;
153
+ sessionRuns: Pick<MachineSessionService, "startRun">;
154
+ sessionFiles: Pick<MachineSessionService, "resolveResourcePath">;
149
155
  agentCatalog: {
150
156
  list(): Promise<PluginAgentSummary[]>;
151
157
  get(id: string): Promise<PluginAgentSummary | null>;
@@ -154,6 +160,7 @@ export interface PluginRuntimeHostServices {
154
160
  session: PluginSessionExecutionSnapshot;
155
161
  }): Promise<PluginResolvedSessionExecution>;
156
162
  };
163
+ sessionActivity(sessionId: string): PluginSessionActivitySnapshot;
157
164
  interruptSession(sessionId: string): Promise<boolean>;
158
165
  terminateSession?(sessionId: string): Promise<boolean>;
159
166
  resolveSessionInteraction(sessionId: string, interactionId: string, resolution: SessionInteractionResolution): Promise<{
@@ -163,6 +170,11 @@ export interface PluginRuntimeHostServices {
163
170
  * closed, but cannot provision Sessions or begin Turns. */
164
171
  admissionOpen?: () => boolean;
165
172
  admissionReserve?: () => AdmissionReservation | undefined;
173
+ sessionPortal?: {
174
+ scheme: "http" | "https";
175
+ bindHost: string;
176
+ port: number;
177
+ };
166
178
  }
167
179
  export interface PluginRuntimeLifecycle {
168
180
  bindHostServices(services: PluginRuntimeHostServices): void;
@@ -339,7 +351,7 @@ export interface RuntimeConnectionLease {
339
351
  };
340
352
  call<M extends RemoteRuntimeRpcMethod>(method: M, params: RemoteRuntimeRpcParams<M>, options?: {
341
353
  signal?: AbortSignal;
342
- timeoutMs?: number;
354
+ timeoutMs?: number | null;
343
355
  }): Promise<RemoteRuntimeRpcResultFor<M>>;
344
356
  subscribeSessionEvents(sessionId: string, options?: {
345
357
  signal?: AbortSignal;
@@ -426,6 +438,11 @@ export declare function createSessionRuntimeServices(input: {
426
438
  sessionContextProvider?: RunnerSessionContextProvider;
427
439
  admissionOpen?: () => boolean;
428
440
  admissionReserve?: () => AdmissionReservation | undefined;
441
+ materializeGeneratedImage?: (input: {
442
+ sessionId: string;
443
+ sourceId: string;
444
+ result: string;
445
+ }) => Promise<SessionImageFileReference>;
429
446
  }): SessionRuntimeServices;
430
447
  /**
431
448
  * The HTTP surface is just a liveness probe for container orchestration — all
@@ -434,4 +451,4 @@ export declare function createSessionRuntimeServices(input: {
434
451
  * no agent request / response / SSE endpoints are exposed here.
435
452
  */
436
453
  export declare function createApp({ config, control }?: CreateAppOptions): Koa<Koa.DefaultState, Koa.DefaultContext>;
437
- export declare function startServer({ config, control, sessionLog, sessionRegistry, pluginRuntime, daemonManagement, remoteRuntime, remoteRuntimeAdmin, runtimeTargetControl, runtimeConnectionResolver, localSessionResources, localMachineSessions, sessionEmulators, sessionRuntimeServices, sessionLifecycle, sessionTerminals, runtimeLocalBrowser, providerClis, desktopBrowserHost, }?: StartServerOptions): Promise<RynxServer>;
454
+ export declare function startServer({ config, control, sessionLog, sessionRegistry, pluginRuntime, daemonManagement, remoteRuntime, remoteRuntimeAdmin, runtimeTargetControl, runtimeConnectionResolver, localSessionResources, localMachineSessions, sessionEmulators, sessionRuntimeServices, sessionLifecycle, sessionTerminals, runtimeLocalBrowser, providerClis, desktopBrowserHost, sessionPortalAuthorization, }?: StartServerOptions): Promise<RynxServer>;
package/dist/server.js CHANGED
@@ -1,3 +1,4 @@
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";
@@ -10,6 +11,8 @@ import { attachBrowserSurfaceWs } from "./browser-surface-ws.js";
10
11
  import { attachEmulatorSurfaceWs } from "./emulator-surface-ws.js";
11
12
  import { attachDesktopBrowserHostServer, } from "./desktop-browser-host.js";
12
13
  import { resolveControlWebDist, sendSpaFile } from "./control-web-dist.js";
14
+ import { startSessionPortal, } from "./session-portal.js";
15
+ export { createSessionPortalApp, startSessionPortal } from "./session-portal.js";
13
16
  import { SessionRuntimeIndex } from "./session-runtime-index.js";
14
17
  import { createRunnerSessionTerminalHost, } from "./session-terminal-host.js";
15
18
  import { runtimeWebAccessPolicyForBindHost, } from "./runtime-web-auth.js";
@@ -64,19 +67,24 @@ export function createSessionRuntimeServices(input) {
64
67
  });
65
68
  const sessionBus = new InMemorySessionBus();
66
69
  const sessionRuntimeIndex = new SessionRuntimeIndex();
67
- const sessionMirrorQueue = new SessionMirrorQueue((sessionId, event) => persistSessionEvent(sessionId, event, { sessionLog: input.sessionLog, sessionBus }));
70
+ const sessionMirrorQueue = new SessionMirrorQueue(async (sessionId, event) => {
71
+ const finalized = await finalizeGeneratedImageEvent(sessionId, event, input);
72
+ sessionRuntimeIndex.observe(sessionId, finalized);
73
+ await persistSessionEvent(sessionId, finalized, {
74
+ sessionLog: input.sessionLog,
75
+ sessionBus,
76
+ });
77
+ });
68
78
  const mirrorSessionEvent = (sessionId, event) => {
69
- sessionRuntimeIndex.observe(sessionId, event);
70
79
  return sessionMirrorQueue.enqueue(sessionId, event);
71
80
  };
72
81
  const conversationRuntime = new ConversationRuntime({
73
82
  config: input.config,
74
83
  executor: runnerManager,
75
84
  sessionBus,
76
- sessionEventSink: mirrorSessionEvent,
77
85
  });
78
86
  runnerManager.onMirror((sessionId, event) => {
79
- void mirrorSessionEvent(sessionId, event).catch((error) => {
87
+ return mirrorSessionEvent(sessionId, event).catch((error) => {
80
88
  input.onMirrorError?.(error, sessionId);
81
89
  });
82
90
  });
@@ -89,6 +97,72 @@ export function createSessionRuntimeServices(input) {
89
97
  publishSessionEvent: mirrorSessionEvent,
90
98
  };
91
99
  }
100
+ async function finalizeGeneratedImageEvent(sessionId, event, input) {
101
+ if (event.type !== "response.output_item.done" ||
102
+ event.item.type !== "function_call_output") {
103
+ return event;
104
+ }
105
+ const rawData = event.item.data;
106
+ const pending = rawData.__rynxGeneratedImage;
107
+ if (!pending)
108
+ return event;
109
+ const { __rynxGeneratedImage: _omitted, ...data } = rawData;
110
+ try {
111
+ const pathMediaType = pending.savedPath && isAbsolute(pending.savedPath)
112
+ ? imageMediaTypeFromPath(pending.savedPath)
113
+ : undefined;
114
+ const generatedImage = pathMediaType && pending.savedPath
115
+ ? {
116
+ path: pending.savedPath,
117
+ filename: basename(pending.savedPath),
118
+ mediaType: pathMediaType,
119
+ }
120
+ : pending.result && input.materializeGeneratedImage
121
+ ? await input.materializeGeneratedImage({
122
+ sessionId,
123
+ sourceId: event.item.id,
124
+ result: pending.result,
125
+ })
126
+ : undefined;
127
+ return {
128
+ ...event,
129
+ item: {
130
+ ...event.item,
131
+ data: {
132
+ ...data,
133
+ ...(generatedImage ? { generatedImage } : {}),
134
+ ...(!generatedImage && pending.savedPath && !isAbsolute(pending.savedPath)
135
+ ? { output: `${data.output}\nImage path was not absolute; preview omitted.`.trim() }
136
+ : {}),
137
+ },
138
+ },
139
+ };
140
+ }
141
+ catch (error) {
142
+ input.onMirrorError?.(error, sessionId);
143
+ return {
144
+ ...event,
145
+ item: {
146
+ ...event.item,
147
+ data: {
148
+ ...data,
149
+ output: `${data.output}\nImage preview unavailable.`.trim(),
150
+ },
151
+ },
152
+ };
153
+ }
154
+ }
155
+ function imageMediaTypeFromPath(path) {
156
+ switch (extname(path).toLowerCase()) {
157
+ case ".png": return "image/png";
158
+ case ".jpg":
159
+ case ".jpeg": return "image/jpeg";
160
+ case ".webp": return "image/webp";
161
+ case ".gif": return "image/gif";
162
+ case ".svg": return "image/svg+xml";
163
+ default: return undefined;
164
+ }
165
+ }
92
166
  /**
93
167
  * The HTTP surface is just a liveness probe for container orchestration — all
94
168
  * agent capabilities are forwarded through the mounted channel plugins (the
@@ -137,7 +211,7 @@ export function createApp({ config = loadConfig(), control } = {}) {
137
211
  }
138
212
  return app;
139
213
  }
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, } = {}) {
214
+ 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
215
  const runtimeWebAccess = runtimeWebAccessPolicyForBindHost(config.HOST);
142
216
  const desktopBrowserManagementToken = desktopBrowserHost
143
217
  ? requireDaemonManagementToken(daemonManagement)
@@ -160,14 +234,58 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
160
234
  return { cwd: session.workspace.cwd };
161
235
  },
162
236
  });
237
+ const controlShutdown = new AbortController();
238
+ const controlSurface = control
239
+ ? {
240
+ deps: control,
241
+ runtime: conversationRuntime,
242
+ sessionBus,
243
+ sessionLog,
244
+ runnerManager,
245
+ sessionStore,
246
+ pluginRuntimeStatus: pluginRuntime
247
+ ? () => pluginRuntime.statusSnapshot()
248
+ : undefined,
249
+ daemonManagement,
250
+ remoteRuntime,
251
+ remoteRuntimeAdmin,
252
+ runtimeTargetControl,
253
+ runtimeConnectionResolver,
254
+ localSessionResources,
255
+ localMachineSessions,
256
+ sessionEmulators,
257
+ shutdownSignal: controlShutdown.signal,
258
+ sessionRuntimeIndex,
259
+ sessionLifecycle,
260
+ runtimeLocalBrowser,
261
+ providerClis,
262
+ }
263
+ : undefined;
264
+ const sessionPortalConfig = config.RYNX_SESSION_PORTAL_PORT !== undefined
265
+ ? (() => {
266
+ if (runtimeWebAccess.mode !== "loopback") {
267
+ throw new Error("Session Portal requires the ordinary Control listener to bind loopback only");
268
+ }
269
+ const controlWebDist = resolveControlWebDist();
270
+ if (!sessionPortalAuthorization || !controlSurface || !controlWebDist) {
271
+ throw new Error("Session Portal requires authorization, Control services, and the native Control Web build");
272
+ }
273
+ return { authorization: sessionPortalAuthorization, controlWebDist };
274
+ })()
275
+ : undefined;
276
+ let sessionPortalServer;
163
277
  if (pluginRuntime) {
164
278
  if (!sessionRegistry)
165
279
  throw new Error("plugin runtime requires a machine session registry");
280
+ if (!localMachineSessions) {
281
+ throw new Error("plugin runtime requires the machine Session service");
282
+ }
166
283
  pluginRuntime.bindHostServices({
167
- conversationRuntime,
168
284
  capabilities: runnerManager,
169
285
  sessionStore,
170
286
  sessionRegistry,
287
+ sessionRuns: localMachineSessions,
288
+ sessionFiles: localMachineSessions,
171
289
  agentCatalog: {
172
290
  list: async () => (await listAgentSpecs()).map(toPluginAgentSummary),
173
291
  get: async (id) => {
@@ -180,9 +298,27 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
180
298
  session: input.session,
181
299
  }),
182
300
  },
301
+ sessionActivity: (sessionId) => {
302
+ const snapshot = sessionRuntimeIndex.snapshot(sessionId);
303
+ return {
304
+ ...snapshot,
305
+ status: snapshot.pendingInteractions.length > 0
306
+ ? "waiting"
307
+ : snapshot.status,
308
+ };
309
+ },
183
310
  interruptSession: (sessionId) => runnerManager.interruptLiveSession(sessionId),
184
311
  terminateSession: (sessionId) => runnerManager.terminateLiveSession(sessionId),
185
312
  resolveSessionInteraction: (sessionId, interactionId, resolution) => runnerManager.resolveInteraction(sessionId, interactionId, resolution),
313
+ ...(sessionPortalConfig
314
+ ? {
315
+ sessionPortal: {
316
+ scheme: "http",
317
+ bindHost: config.RYNX_SESSION_PORTAL_HOST,
318
+ port: config.RYNX_SESSION_PORTAL_PORT,
319
+ },
320
+ }
321
+ : {}),
186
322
  });
187
323
  }
188
324
  // Provider TUI `/clear`·`/fork` uses the same publication boundary as an
@@ -198,38 +334,37 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
198
334
  kind: r.kind,
199
335
  });
200
336
  });
201
- const controlShutdown = new AbortController();
337
+ if (localMachineSessions) {
338
+ runnerManager.onCollaborationMode((sessionId, mode) => {
339
+ localMachineSessions.recordNativeCollaborationMode(sessionId, mode);
340
+ });
341
+ }
202
342
  const app = createApp({
203
343
  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,
344
+ control: controlSurface,
230
345
  });
231
- return new Promise((resolve) => {
346
+ return new Promise((resolve, reject) => {
347
+ let startupWebSocketServers = [];
348
+ const rejectBeforeListening = (error) => reject(error);
232
349
  const server = app.listen(config.PORT, config.HOST, () => {
350
+ server.off("error", rejectBeforeListening);
351
+ void finishStartup(server).catch(async (error) => {
352
+ controlShutdown.abort(asError(error));
353
+ sessionPortalServer?.stopAccepting();
354
+ server.closeAllConnections?.();
355
+ await Promise.allSettled([
356
+ closeWebSocketServers(startupWebSocketServers),
357
+ sessionPortalServer?.shutdown() ?? Promise.resolve(),
358
+ new Promise((done) => server.close(() => done())),
359
+ Promise.resolve(daemonManagement?.pluginManagement?.dispose?.()),
360
+ Promise.resolve(pluginRuntime?.dispose()),
361
+ runnerManager.stop(),
362
+ ]);
363
+ reject(error);
364
+ });
365
+ });
366
+ server.once("error", rejectBeforeListening);
367
+ const finishStartup = async (server) => {
233
368
  console.log(JSON.stringify({
234
369
  level: config.LOG_LEVEL,
235
370
  msg: "Harness agent server listening",
@@ -238,15 +373,6 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
238
373
  runtime: config.DEFAULT_RUNTIME,
239
374
  model: resolveRuntimeModel(config, config.DEFAULT_RUNTIME),
240
375
  }));
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
376
  const webSocketServers = [
251
377
  attachTerminalWs(server, {
252
378
  runtimeConnectionResolver,
@@ -265,9 +391,36 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
265
391
  if (control?.emulator) {
266
392
  webSocketServers.push(attachEmulatorTouchWs(server, { emulator: control.emulator }));
267
393
  }
394
+ startupWebSocketServers = webSocketServers;
395
+ if (sessionPortalConfig) {
396
+ sessionPortalServer = await startSessionPortal({
397
+ host: config.RYNX_SESSION_PORTAL_HOST,
398
+ port: config.RYNX_SESSION_PORTAL_PORT,
399
+ scheme: "http",
400
+ authorization: sessionPortalConfig.authorization,
401
+ controlOrigin: listeningHttpOrigin(server),
402
+ controlWebDist: sessionPortalConfig.controlWebDist,
403
+ shutdownSignal: controlShutdown.signal,
404
+ });
405
+ }
406
+ const startup = pluginRuntime?.startPluginRuntimes() ?? Promise.resolve();
407
+ void startup.catch((error) => {
408
+ console.error(JSON.stringify({
409
+ level: "error",
410
+ type: "plugin-runtime",
411
+ event: "startup_failed",
412
+ error: error instanceof Error ? error.message : String(error),
413
+ }));
414
+ });
268
415
  resolve(bindServerLifecycle(server, {
269
- fence: () => controlShutdown.abort(new Error("Rynx server is shutting down")),
270
- closeUpgrades: () => closeWebSocketServers(webSocketServers),
416
+ fence: () => {
417
+ controlShutdown.abort(new Error("Rynx server is shutting down"));
418
+ sessionPortalServer?.stopAccepting();
419
+ },
420
+ closeUpgrades: () => Promise.all([
421
+ closeWebSocketServers(webSocketServers),
422
+ sessionPortalServer?.shutdown() ?? Promise.resolve(),
423
+ ]).then(() => undefined),
271
424
  cleanup: async () => runCleanupSteps([
272
425
  () => startup.catch(() => undefined),
273
426
  () => Promise.resolve(daemonManagement?.pluginManagement?.dispose?.()),
@@ -275,9 +428,17 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
275
428
  () => runnerManager.stop(),
276
429
  ]),
277
430
  }));
278
- });
431
+ };
279
432
  });
280
433
  }
434
+ function listeningHttpOrigin(server) {
435
+ const address = server.address();
436
+ if (!address || typeof address === "string") {
437
+ throw new Error("Control listener did not expose an HTTP address");
438
+ }
439
+ const host = address.address.includes(":") ? `[${address.address}]` : address.address;
440
+ return `http://${host}:${address.port}`;
441
+ }
281
442
  function requireDaemonManagementToken(host) {
282
443
  const token = host?.managementToken;
283
444
  const bytes = typeof token === "string" ? Buffer.byteLength(token, "utf8") : 0;
@@ -0,0 +1,42 @@
1
+ import { type IncomingMessage, type Server as HttpServer } from "node:http";
2
+ import type { Duplex } from "node:stream";
3
+ import Koa from "koa";
4
+ export declare const SESSION_PORTAL_HEADER = "x-rynx-session-portal";
5
+ export declare const SESSION_PORTAL_QUERY = "portal";
6
+ export interface SessionPortalAuthorization {
7
+ portalId: string;
8
+ pluginId: string;
9
+ scope: "plugin_sessions" | "single_session";
10
+ access: "read_only" | "read_write";
11
+ sessionId?: string;
12
+ expiresAt: string;
13
+ }
14
+ export interface SessionPortalAuthorizationPorts {
15
+ redeem(ticket: string): (SessionPortalAuthorization & {
16
+ secret: string;
17
+ }) | undefined;
18
+ authorize(portalId: string, secret: string): SessionPortalAuthorization | undefined;
19
+ ownsSession(pluginId: string, sessionId: string): boolean;
20
+ }
21
+ export interface SessionPortalOptions {
22
+ host: string;
23
+ port: number;
24
+ scheme: "http" | "https";
25
+ authorization: SessionPortalAuthorizationPorts;
26
+ controlOrigin: string;
27
+ controlWebDist: string;
28
+ shutdownSignal?: AbortSignal;
29
+ }
30
+ export interface SessionPortalServer {
31
+ server: HttpServer;
32
+ stopAccepting(): void;
33
+ shutdown(): Promise<void>;
34
+ }
35
+ /** Session Portal is a narrow adapter in front of the one Control service. It
36
+ * serves the native SPA, validates Portal grants, and forwards only authorized
37
+ * Session HTTP calls to Control; it owns no Session or Runtime handlers. */
38
+ export declare function createSessionPortalApp(options: SessionPortalOptions): Koa;
39
+ export declare function startSessionPortal(options: SessionPortalOptions): Promise<SessionPortalServer>;
40
+ export declare function authorizeSessionPortalWebSocket(request: IncomingMessage, ports: SessionPortalAuthorizationPorts, runtimeSelector: string, sessionId: string): SessionPortalAuthorization | undefined;
41
+ export declare function rejectSessionPortalUpgrade(socket: Duplex): void;
42
+ export declare function scheduleSessionPortalExpiry(expiresAt: string, onExpire: () => void): () => void;