@rynx-ai/server 0.1.11-beta.5 → 0.1.11-beta.51

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 (499) hide show
  1. package/dist/control-api.d.ts +11 -5
  2. package/dist/control-api.js +699 -95
  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 +12 -1
  471. package/dist/desktop-browser-host.js +110 -13
  472. package/dist/direct-runtime-server.js +187 -153
  473. package/dist/machine-session-service.d.ts +96 -15
  474. package/dist/machine-session-service.js +745 -115
  475. package/dist/remote-runtime-dispatcher.d.ts +2 -2
  476. package/dist/remote-runtime-dispatcher.js +39 -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 +67 -16
  480. package/dist/server.js +422 -55
  481. package/dist/session-browser-service.d.ts +50 -4
  482. package/dist/session-browser-service.js +232 -11
  483. package/dist/session-browser-surface-coordinator.d.ts +2 -0
  484. package/dist/session-browser-surface-coordinator.js +15 -0
  485. package/dist/session-pending-inputs.d.ts +42 -0
  486. package/dist/session-pending-inputs.js +87 -0
  487. package/dist/session-portal.d.ts +54 -0
  488. package/dist/session-portal.js +997 -0
  489. package/dist/session-runtime-index.d.ts +3 -6
  490. package/dist/session-runtime-index.js +96 -38
  491. package/dist/session-terminal-host.d.ts +22 -2
  492. package/dist/session-terminal-host.js +66 -83
  493. package/dist/terminal-ws.d.ts +4 -1
  494. package/dist/terminal-ws.js +93 -27
  495. package/package.json +7 -7
  496. package/dist/control-web/assets/highlighted-body-OFNGDK62-B4mcMjmm.js +0 -1
  497. package/dist/control-web/assets/index-5n6D-i-c.css +0 -32
  498. package/dist/control-web/assets/index-D56JQ9oi.js +0 -709
  499. package/dist/control-web/assets/mermaid-GHXKKRXX-DnL0iDTi.js +0 -131
@@ -1,10 +1,14 @@
1
1
  import type { AdmissionReservation } from "@rynx-ai/core";
2
- import { type RuntimeBrowserCloseParams, type RuntimeBrowserCloseResult, type RuntimeBrowserExecutionBackend, type RuntimeBrowserOpenParams, type RuntimeBrowserPageCreateParams, type RuntimeBrowserPageMutationParams, type RuntimeBrowserPageNavigateParams, type RuntimeBrowserState, type RuntimeBrowserStateGetParams } from "@rynx-ai/protocol/runtime-browser";
2
+ import { type RuntimeBrowserCloseParams, type RuntimeBrowserCloseResult, type RuntimeBrowserExecutionBackend, type RuntimeBrowserOpenParams, type RuntimeBrowserPageCreateParams, type RuntimeBrowserPageMutationParams, type RuntimeBrowserPageNavigateParams, type RuntimeBrowserRequestHeadersConfig, type RuntimeBrowserRequestHeadersGetParams, type RuntimeBrowserRequestHeadersPolicy, type RuntimeBrowserRequestHeadersSetParams, type RuntimeBrowserState, type RuntimeBrowserStateGetParams } from "@rynx-ai/protocol/runtime-browser";
3
3
  import type { RuntimeBrowserSurfaceFormat, RuntimeBrowserSurfaceInputEvent } from "@rynx-ai/protocol/runtime-browser-surface";
4
4
  import { type RuntimeBrowserEndpointDescriptor } from "@rynx-ai/protocol/runtime-browser-bootstrap";
5
5
  export interface SessionBrowserHostCreateInput {
6
6
  sessionId: string;
7
7
  browserGeneration: number;
8
+ /** Required at this internal boundary so every Host installs the policy
9
+ * before it permits the first navigation. Wire-version compatibility stays
10
+ * inside the concrete Host adapter. */
11
+ requestHeaders: RuntimeBrowserRequestHeadersConfig;
8
12
  url?: string;
9
13
  }
10
14
  /** Generation-scoped physical page state. `hostPageId` never leaves the service. */
@@ -15,6 +19,7 @@ export interface SessionBrowserHostPage {
15
19
  loading: boolean;
16
20
  canGoBack: boolean;
17
21
  canGoForward: boolean;
22
+ observationStale?: boolean;
18
23
  }
19
24
  export interface SessionBrowserHostSnapshot {
20
25
  pages: SessionBrowserHostPage[];
@@ -124,6 +129,12 @@ export interface SessionBrowserHostHandle {
124
129
  }>;
125
130
  /** Optional exact physical Page handoff for the daemon-local inspection gateway. */
126
131
  getPageCdpEndpoint?(hostPageId: string): Promise<SessionBrowserInspectionEndpoint>;
132
+ /** Automation facade, distinct from raw DevTools inspection; binds exactly one existing Page. */
133
+ getPageAutomationEndpoint?(hostPageId: string): Promise<SessionBrowserInspectionEndpoint & {
134
+ pageTargetId: string;
135
+ }>;
136
+ /** Temporary renderability, never semantic Page selection or human window focus. */
137
+ acquireAutomationVisibility?(hostPageId: string, canActivate?: () => boolean): Promise<SessionBrowserAutomationVisibility>;
127
138
  /** Optional physical presentation primitive; it never projects native CDP. */
128
139
  openSurface?(input: SessionBrowserHostSurfaceOpenInput): Promise<SessionBrowserHostSurfaceSource>;
129
140
  snapshot(): Promise<SessionBrowserHostSnapshot>;
@@ -136,6 +147,8 @@ export interface SessionBrowserHostHandle {
136
147
  goBack(hostPageId: string): Promise<void>;
137
148
  goForward(hostPageId: string): Promise<void>;
138
149
  reload(hostPageId: string): Promise<void>;
150
+ /** Replaces the Session-wide desired request Header projection for this generation. */
151
+ setRequestHeaders(config: RuntimeBrowserRequestHeadersConfig): Promise<void>;
139
152
  close(): Promise<void>;
140
153
  }
141
154
  /** Physical Browser factory selected by the Runtime composition root. */
@@ -152,23 +165,45 @@ export interface SessionBrowserServicePorts {
152
165
  sessions?: SessionBrowserRegistryPort;
153
166
  }
154
167
  export interface SessionBrowserServiceOptions {
168
+ onObservationError?: (error: unknown, target: {
169
+ sessionId: string;
170
+ browserGeneration: number;
171
+ }) => void;
155
172
  /** Injectable only so opaque identity behavior is deterministic in tests. */
156
173
  pageIdFactory?: () => string;
157
174
  /** Injectable boot nonce; production randomization fences stale pre-restart mutations. */
158
175
  bootGenerationSeed?: number;
176
+ /** Injectable only for deterministic CAS tests; production uses 128 random bits. */
177
+ requestHeaderRevisionSeed?: string;
159
178
  /**
160
179
  * Synchronous daemon admission fence. A successful reservation is held until
161
180
  * Browser open has either failed or registered the physical Host handle.
162
181
  */
163
182
  admissionReserve?: () => AdmissionReservation | undefined;
164
183
  }
165
- export type SessionBrowserHostErrorCode = "unavailable" | "page_not_found" | "capacity" | "outcome_unknown";
184
+ export interface SessionBrowserAutomationVisibility {
185
+ /** Always releases resources; false suppresses physical focus restoration after human takeover. */
186
+ release(restoreFocus?: boolean): Promise<void>;
187
+ }
188
+ export interface SessionBrowserAutomationBinding extends RuntimeBrowserEndpointDescriptor {
189
+ pageId: string;
190
+ pageTargetId: string;
191
+ /** Synchronous physical identity fence; long driver commands never hold the Session lock. */
192
+ isCurrent(): boolean;
193
+ acquireAutomationVisibility(canActivate?: () => boolean): Promise<SessionBrowserAutomationVisibility>;
194
+ }
195
+ export type SessionBrowserHostErrorCode = "unavailable" | "command_timeout" | "operation_failed" | "unsupported" | "page_not_found" | "capacity" | "outcome_unknown";
166
196
  /** Expected failure reported by a Browser Host implementation. */
167
197
  export declare class SessionBrowserHostError extends Error {
168
198
  readonly code: SessionBrowserHostErrorCode;
169
199
  constructor(code: SessionBrowserHostErrorCode, message: string, options?: ErrorOptions);
170
200
  }
171
- export type SessionBrowserServiceErrorCode = "invalid_request" | "not_found" | "generation_mismatch" | "unavailable" | "capacity" | "host_failure" | "outcome_unknown" | "shutting_down";
201
+ /** Narrow Session-owned policy port used by transports and Plugin hosting. */
202
+ export interface SessionBrowserRequestHeadersPort {
203
+ getRequestHeaders(input: RuntimeBrowserRequestHeadersGetParams): Promise<RuntimeBrowserRequestHeadersPolicy>;
204
+ setRequestHeaders(input: RuntimeBrowserRequestHeadersSetParams): Promise<RuntimeBrowserRequestHeadersPolicy>;
205
+ }
206
+ export type SessionBrowserServiceErrorCode = "invalid_request" | "command_timeout" | "not_found" | "generation_mismatch" | "revision_mismatch" | "unsupported" | "unavailable" | "capacity" | "host_failure" | "outcome_unknown" | "shutting_down";
172
207
  /** Stable application error; transports map the code without exposing Host diagnostics. */
173
208
  export declare class SessionBrowserServiceError extends Error {
174
209
  readonly code: SessionBrowserServiceErrorCode;
@@ -178,15 +213,20 @@ export declare class SessionBrowserServiceError extends Error {
178
213
  * Transport-neutral owner of the Runtime -> Session -> Browser -> Page model.
179
214
  * Every operation for one Session shares one queue; different Sessions remain independent.
180
215
  */
181
- export declare class SessionBrowserService {
216
+ export declare class SessionBrowserService implements SessionBrowserRequestHeadersPort {
182
217
  private readonly ports;
218
+ private readonly options;
183
219
  private readonly records;
184
220
  private readonly generations;
221
+ private readonly requestHeaderPolicies;
185
222
  private readonly queues;
186
223
  private readonly deletingSessions;
224
+ private readonly closingAutomationPages;
187
225
  private readonly observers;
188
226
  private readonly pageIdFactory;
189
227
  private readonly bootGenerationSeed;
228
+ private readonly requestHeaderRevisionSeed;
229
+ private requestHeaderRevision;
190
230
  private readonly admissionReserve?;
191
231
  private shuttingDown;
192
232
  private closeAllPromise?;
@@ -205,12 +245,15 @@ export declare class SessionBrowserService {
205
245
  */
206
246
  getInspectionPageEndpoint(input: RuntimeBrowserPageMutationParams): Promise<SessionBrowserInspectionEndpoint>;
207
247
  getState(input: RuntimeBrowserStateGetParams): Promise<RuntimeBrowserState | null>;
248
+ getRequestHeaders(input: RuntimeBrowserRequestHeadersGetParams): Promise<RuntimeBrowserRequestHeadersPolicy>;
249
+ setRequestHeaders(input: RuntimeBrowserRequestHeadersSetParams): Promise<RuntimeBrowserRequestHeadersPolicy>;
208
250
  /**
209
251
  * Runtime-local automation handoff. This method is deliberately absent from
210
252
  * RemoteRuntimeBrowserHost and Direct RPC so a CDP endpoint cannot cross a
211
253
  * Runtime boundary.
212
254
  */
213
255
  getRuntimeLocalEndpoint(sessionId: string): Promise<RuntimeBrowserEndpointDescriptor>;
256
+ resolveAutomationPage(sessionId: string, pageId?: string): Promise<SessionBrowserAutomationBinding>;
214
257
  /**
215
258
  * Resolve one opaque Page to its generation-local Host source. This is the
216
259
  * only presentation path allowed to cross the semantic/physical Page seam.
@@ -233,6 +276,8 @@ export declare class SessionBrowserService {
233
276
  private closeEveryRecord;
234
277
  private createBrowser;
235
278
  private reserveOpenAdmission;
279
+ private currentRequestHeaders;
280
+ private nextRequestHeadersRevision;
236
281
  private closeUnavailableForRecreate;
237
282
  private pageMutation;
238
283
  private pageMutationParsed;
@@ -240,6 +285,7 @@ export declare class SessionBrowserService {
240
285
  private reconcileForRead;
241
286
  private reconcileForMutation;
242
287
  private tryReconcileAfterRejectedMutation;
288
+ private retainRecoverableObservation;
243
289
  private reconcile;
244
290
  private createPageId;
245
291
  private project;
@@ -1,5 +1,7 @@
1
1
  import { randomBytes, randomUUID } from "node:crypto";
2
- import { RUNTIME_BROWSER_MAX_PAGES, parseRuntimeBrowserCloseParams, parseRuntimeBrowserOpenParams, parseRuntimeBrowserPageCreateParams, parseRuntimeBrowserPageMutationParams, parseRuntimeBrowserPageNavigateParams, parseRuntimeBrowserState, parseRuntimeBrowserStateGetParams, } from "@rynx-ai/protocol/runtime-browser";
2
+ import { join } from "node:path";
3
+ import { diagnosticEvents, sessionDiagnosticDir } from "@rynx-ai/core";
4
+ import { RUNTIME_BROWSER_MAX_PAGES, parseRuntimeBrowserRequestHeadersGetParams, parseRuntimeBrowserRequestHeadersSetParams, parseRuntimeBrowserCloseParams, parseRuntimeBrowserOpenParams, parseRuntimeBrowserPageCreateParams, parseRuntimeBrowserPageMutationParams, parseRuntimeBrowserPageNavigateParams, parseRuntimeBrowserState, parseRuntimeBrowserStateGetParams, } from "@rynx-ai/protocol/runtime-browser";
3
5
  import { parseRuntimeBrowserEndpointDescriptor, } from "@rynx-ai/protocol/runtime-browser-bootstrap";
4
6
  const MAX_HOST_PAGE_ID_CHARS = 2_048;
5
7
  const MAX_PAGE_ID_FACTORY_ATTEMPTS = 64;
@@ -35,26 +37,37 @@ export class SessionBrowserServiceError extends Error {
35
37
  */
36
38
  export class SessionBrowserService {
37
39
  ports;
40
+ options;
38
41
  records = new Map();
39
42
  generations = new Map();
43
+ requestHeaderPolicies = new Map();
40
44
  queues = new Map();
41
45
  deletingSessions = new Set();
46
+ closingAutomationPages = new Map();
42
47
  observers = new Set();
43
48
  pageIdFactory;
44
49
  bootGenerationSeed;
50
+ requestHeaderRevisionSeed;
51
+ requestHeaderRevision = 0;
45
52
  admissionReserve;
46
53
  shuttingDown = false;
47
54
  closeAllPromise;
48
55
  constructor(ports, options = {}) {
49
56
  this.ports = ports;
57
+ this.options = options;
50
58
  this.pageIdFactory = options.pageIdFactory ?? (() => `page_${randomUUID()}`);
51
59
  this.bootGenerationSeed = options.bootGenerationSeed ?? randomBootGenerationSeed();
60
+ this.requestHeaderRevisionSeed = options.requestHeaderRevisionSeed ??
61
+ randomBytes(16).toString("base64url");
52
62
  this.admissionReserve = options.admissionReserve;
53
63
  if (!Number.isSafeInteger(this.bootGenerationSeed) ||
54
64
  this.bootGenerationSeed < 0 ||
55
65
  this.bootGenerationSeed >= Number.MAX_SAFE_INTEGER) {
56
66
  throw new Error("Browser boot generation seed must be a nonnegative safe integer");
57
67
  }
68
+ if (!/^[A-Za-z0-9_-]{16,128}$/.test(this.requestHeaderRevisionSeed)) {
69
+ throw new Error("Browser request Header revision seed must be an opaque 16-128 character token");
70
+ }
58
71
  }
59
72
  /** Number of Session Browsers that still own a physical Host handle. */
60
73
  activeBrowserCount() {
@@ -124,7 +137,7 @@ export class SessionBrowserService {
124
137
  }
125
138
  catch (error) {
126
139
  if (error instanceof SessionBrowserHostError &&
127
- (error.code === "unavailable" || error.code === "outcome_unknown")) {
140
+ error.code === "unavailable") {
128
141
  record.status = "unavailable";
129
142
  }
130
143
  throw mapHostError(error, "Browser inspection endpoint is unavailable");
@@ -144,6 +157,70 @@ export class SessionBrowserService {
144
157
  return this.project(record);
145
158
  });
146
159
  }
160
+ async getRequestHeaders(input) {
161
+ const params = parseInput(() => parseRuntimeBrowserRequestHeadersGetParams(input), "Browser request headers read is invalid");
162
+ return this.exclusive(params.sessionId, async () => {
163
+ this.ensureRunning();
164
+ await this.ensureSessionExists(params.sessionId);
165
+ return cloneRequestHeadersPolicy(this.currentRequestHeaders(params.sessionId));
166
+ });
167
+ }
168
+ async setRequestHeaders(input) {
169
+ const params = parseInput(() => parseRuntimeBrowserRequestHeadersSetParams(input), "Browser request headers update is invalid");
170
+ return this.exclusive(params.sessionId, async () => {
171
+ this.ensureRunning();
172
+ await this.ensureSessionExists(params.sessionId);
173
+ const current = this.currentRequestHeaders(params.sessionId);
174
+ if (params.expectedRevision !== current.revision) {
175
+ throw new SessionBrowserServiceError("revision_mismatch", "Browser request headers changed since they were read");
176
+ }
177
+ const nextConfig = {
178
+ enabled: params.enabled,
179
+ headers: params.headers.map((header) => ({ ...header })),
180
+ };
181
+ if (sameRequestHeadersConfig(current, nextConfig)) {
182
+ return cloneRequestHeadersPolicy(current);
183
+ }
184
+ // Reserve the next token before touching a live Host so revision-space
185
+ // exhaustion can never turn a successfully applied policy into an
186
+ // uncommitted outcome. Gaps after Host failure are harmless.
187
+ const nextRevision = this.nextRequestHeadersRevision();
188
+ const record = this.records.get(params.sessionId);
189
+ if (record && record.status !== "ready") {
190
+ await this.closeUnavailableForRecreate(record);
191
+ }
192
+ else if (record && !sameEffectiveRequestHeaders(current, nextConfig)) {
193
+ try {
194
+ await record.handle.setRequestHeaders(nextConfig);
195
+ }
196
+ catch (error) {
197
+ // A definite compatibility rejection did not touch the live Host.
198
+ // Preserve both the current Browser and committed policy so callers
199
+ // can upgrade the Host or close/reopen explicitly without data loss.
200
+ if (error instanceof SessionBrowserHostError && error.code === "unsupported") {
201
+ throw mapHostError(error, "Browser Host does not support request headers");
202
+ }
203
+ record.status = "unavailable";
204
+ try {
205
+ await record.handle.close();
206
+ if (this.records.get(params.sessionId) === record) {
207
+ this.records.delete(params.sessionId);
208
+ }
209
+ }
210
+ catch (closeError) {
211
+ throw new SessionBrowserServiceError("outcome_unknown", "Browser request headers may have been partially applied", { cause: new AggregateError([error, closeError]) });
212
+ }
213
+ throw mapHostError(error, "Browser Host rejected the request headers update");
214
+ }
215
+ }
216
+ const policy = {
217
+ ...nextConfig,
218
+ revision: nextRevision,
219
+ };
220
+ this.requestHeaderPolicies.set(params.sessionId, policy);
221
+ return cloneRequestHeadersPolicy(policy);
222
+ });
223
+ }
147
224
  /**
148
225
  * Runtime-local automation handoff. This method is deliberately absent from
149
226
  * RemoteRuntimeBrowserHost and Direct RPC so a CDP endpoint cannot cross a
@@ -170,11 +247,53 @@ export class SessionBrowserService {
170
247
  });
171
248
  }
172
249
  catch (error) {
173
- record.status = "unavailable";
250
+ if (!this.retainRecoverableObservation(record, error))
251
+ record.status = "unavailable";
174
252
  throw mapHostError(error, "Browser automation endpoint is unavailable");
175
253
  }
176
254
  });
177
255
  }
256
+ async resolveAutomationPage(sessionId, pageId) {
257
+ parseInput(() => parseRuntimeBrowserStateGetParams({ sessionId }), "Browser Session is invalid");
258
+ return this.exclusive(sessionId, async () => {
259
+ this.ensureRunning();
260
+ await this.ensureSessionExists(sessionId);
261
+ const record = this.requireRecord(sessionId);
262
+ if (record.status !== "ready")
263
+ throw new SessionBrowserServiceError("unavailable", "Browser is not available");
264
+ const selected = pageId ?? record.activePageId;
265
+ const page = selected ? record.pagesById.get(selected) : undefined;
266
+ if (!page)
267
+ throw new SessionBrowserServiceError("not_found", "Browser Page was not found; run browser pages");
268
+ if (!record.handle.getPageAutomationEndpoint) {
269
+ throw new SessionBrowserServiceError("unsupported", "Browser Host needs an upgrade for page automation");
270
+ }
271
+ const endpoint = await record.handle.getPageAutomationEndpoint(page.hostPageId);
272
+ const descriptor = parseRuntimeBrowserEndpointDescriptor({
273
+ sessionId, browserGeneration: record.browserGeneration,
274
+ executionBackend: record.executionBackend, ...endpoint,
275
+ });
276
+ const isCurrent = () => !this.shuttingDown && !this.deletingSessions.has(sessionId) && this.records.get(sessionId) === record &&
277
+ record.status === "ready" && !this.closingAutomationPages.has(JSON.stringify([sessionId, record.browserGeneration, page.pageId])) &&
278
+ record.pagesById.get(page.pageId)?.hostPageId === page.hostPageId;
279
+ return {
280
+ ...descriptor, pageId: page.pageId, pageTargetId: endpoint.pageTargetId, isCurrent,
281
+ acquireAutomationVisibility: async (canActivate) => {
282
+ if (!isCurrent())
283
+ throw new SessionBrowserServiceError("not_found", "Browser Page closed before render admission");
284
+ if (!record.handle.acquireAutomationVisibility) {
285
+ throw new SessionBrowserServiceError("unsupported", "Upgrade the Browser Host for automation rendering");
286
+ }
287
+ const visibility = await record.handle.acquireAutomationVisibility(page.hostPageId, canActivate);
288
+ if (!isCurrent()) {
289
+ await visibility.release(false).catch(() => undefined);
290
+ throw new SessionBrowserServiceError("not_found", "Browser Page closed during render admission");
291
+ }
292
+ return visibility;
293
+ },
294
+ };
295
+ });
296
+ }
178
297
  /**
179
298
  * Resolve one opaque Page to its generation-local Host source. This is the
180
299
  * only presentation path allowed to cross the semantic/physical Page seam.
@@ -289,8 +408,20 @@ export class SessionBrowserService {
289
408
  return this.runMutation(record, () => record.handle.createPage(params.url));
290
409
  });
291
410
  }
292
- closePage(input) {
293
- return this.pageMutation(input, "Browser page close request is invalid", (record, hostPageId) => record.handle.closePage(hostPageId));
411
+ async closePage(input) {
412
+ const params = parseInput(() => parseRuntimeBrowserPageMutationParams(input), "Browser page close request is invalid");
413
+ const key = JSON.stringify([params.sessionId, params.browserGeneration, params.pageId]);
414
+ this.closingAutomationPages.set(key, (this.closingAutomationPages.get(key) ?? 0) + 1);
415
+ try {
416
+ return await this.pageMutation(params, "Browser page close request is invalid", (record, hostPageId) => record.handle.closePage(hostPageId));
417
+ }
418
+ finally {
419
+ const remaining = this.closingAutomationPages.get(key) - 1;
420
+ if (remaining)
421
+ this.closingAutomationPages.set(key, remaining);
422
+ else
423
+ this.closingAutomationPages.delete(key);
424
+ }
294
425
  }
295
426
  activatePage(input) {
296
427
  return this.pageMutation(input, "Browser page activation request is invalid", (record, hostPageId) => record.handle.activatePage(hostPageId));
@@ -314,6 +445,9 @@ export class SessionBrowserService {
314
445
  this.deletingSessions.add(parsed);
315
446
  await this.exclusive(parsed, async () => {
316
447
  const failures = [];
448
+ // Header values are runtime-only and may be sensitive. Forget them as
449
+ // soon as deletion owns the Session, even if physical cleanup fails.
450
+ this.requestHeaderPolicies.delete(parsed);
317
451
  const record = this.records.get(parsed);
318
452
  if (record) {
319
453
  record.status = "closing";
@@ -367,6 +501,9 @@ export class SessionBrowserService {
367
501
  }, true)));
368
502
  }
369
503
  await Promise.allSettled([...this.observers]);
504
+ // Values may be sensitive. Once the service is fenced they have no valid
505
+ // reader, so do not retain them for the rest of a graceful process exit.
506
+ this.requestHeaderPolicies.clear();
370
507
  if (failures.length > 0) {
371
508
  throw new SessionBrowserServiceError("host_failure", "One or more Browsers did not close during shutdown", { cause: failures[0] });
372
509
  }
@@ -384,6 +521,7 @@ export class SessionBrowserService {
384
521
  handle = await this.ports.host.createBrowser({
385
522
  sessionId: params.sessionId,
386
523
  browserGeneration,
524
+ requestHeaders: cloneRequestHeadersConfig(this.currentRequestHeaders(params.sessionId)),
387
525
  ...(params.url === undefined ? {} : { url: params.url }),
388
526
  });
389
527
  }
@@ -455,6 +593,20 @@ export class SessionBrowserService {
455
593
  }
456
594
  return admission;
457
595
  }
596
+ currentRequestHeaders(sessionId) {
597
+ return this.requestHeaderPolicies.get(sessionId) ?? {
598
+ enabled: false,
599
+ headers: [],
600
+ revision: `${this.requestHeaderRevisionSeed}.0`,
601
+ };
602
+ }
603
+ nextRequestHeadersRevision() {
604
+ if (this.requestHeaderRevision >= Number.MAX_SAFE_INTEGER) {
605
+ throw new SessionBrowserServiceError("capacity", "Browser request headers revision space is exhausted");
606
+ }
607
+ this.requestHeaderRevision += 1;
608
+ return `${this.requestHeaderRevisionSeed}.${this.requestHeaderRevision.toString(36)}`;
609
+ }
458
610
  async closeUnavailableForRecreate(record) {
459
611
  record.status = "closing";
460
612
  try {
@@ -490,7 +642,7 @@ export class SessionBrowserService {
490
642
  }
491
643
  catch (error) {
492
644
  if (error instanceof SessionBrowserHostError &&
493
- (error.code === "unavailable" || error.code === "outcome_unknown")) {
645
+ error.code === "unavailable") {
494
646
  record.status = "unavailable";
495
647
  }
496
648
  if (error instanceof SessionBrowserHostError && error.code === "page_not_found") {
@@ -503,7 +655,8 @@ export class SessionBrowserService {
503
655
  return this.project(record);
504
656
  }
505
657
  catch (error) {
506
- record.status = "unavailable";
658
+ if (!this.retainRecoverableObservation(record, error))
659
+ record.status = "unavailable";
507
660
  throw new SessionBrowserServiceError("outcome_unknown", "Browser operation completed but its outcome could not be reconciled", { cause: error });
508
661
  }
509
662
  }
@@ -512,6 +665,8 @@ export class SessionBrowserService {
512
665
  await this.reconcile(record);
513
666
  }
514
667
  catch (error) {
668
+ if (this.retainRecoverableObservation(record, error))
669
+ return;
515
670
  record.status = "unavailable";
516
671
  throw new SessionBrowserServiceError("host_failure", "Browser Host state could not be reconciled", { cause: error });
517
672
  }
@@ -521,6 +676,9 @@ export class SessionBrowserService {
521
676
  await this.reconcile(record);
522
677
  }
523
678
  catch (error) {
679
+ if (this.retainRecoverableObservation(record, error)) {
680
+ throw mapHostError(error, "Browser state observation is temporarily unavailable");
681
+ }
524
682
  record.status = "unavailable";
525
683
  throw new SessionBrowserServiceError("unavailable", "Browser became unavailable while reconciling Host state", { cause: error });
526
684
  }
@@ -529,9 +687,24 @@ export class SessionBrowserService {
529
687
  try {
530
688
  await this.reconcile(record);
531
689
  }
532
- catch {
533
- record.status = "unavailable";
690
+ catch (error) {
691
+ if (!this.retainRecoverableObservation(record, error))
692
+ record.status = "unavailable";
693
+ }
694
+ }
695
+ retainRecoverableObservation(record, error) {
696
+ if (!(error instanceof SessionBrowserHostError) ||
697
+ !["command_timeout", "operation_failed", "outcome_unknown"].includes(error.code))
698
+ return false;
699
+ record.observationStale = true;
700
+ try {
701
+ this.options.onObservationError?.(error, {
702
+ sessionId: record.sessionId,
703
+ browserGeneration: record.browserGeneration,
704
+ });
534
705
  }
706
+ catch { /* A diagnostic sink cannot change Browser readiness. */ }
707
+ return true;
535
708
  }
536
709
  async reconcile(record) {
537
710
  const snapshot = await record.handle.snapshot();
@@ -559,6 +732,7 @@ export class SessionBrowserService {
559
732
  loading: hostPage.loading,
560
733
  canGoBack: hostPage.canGoBack,
561
734
  canGoForward: hostPage.canGoForward,
735
+ ...(hostPage.observationStale === undefined ? {} : { observationStale: hostPage.observationStale }),
562
736
  });
563
737
  }
564
738
  if (snapshot.activeHostPageId !== null &&
@@ -611,6 +785,7 @@ export class SessionBrowserService {
611
785
  record.pageOrder = parsed.pages.map((page) => page.pageId);
612
786
  record.activePageId = parsed.activePageId;
613
787
  record.capabilities = parsed.capabilities;
788
+ record.observationStale = parsed.pages.some((page) => page.observationStale);
614
789
  }
615
790
  createPageId(record, pending) {
616
791
  for (let attempt = 0; attempt < MAX_PAGE_ID_FACTORY_ATTEMPTS; attempt += 1) {
@@ -631,6 +806,7 @@ export class SessionBrowserService {
631
806
  activePageId: record.activePageId,
632
807
  pages: record.pageOrder.map((pageId) => record.pagesById.get(pageId)),
633
808
  capabilities: record.capabilities,
809
+ ...(record.observationStale ? { observationStale: true } : {}),
634
810
  });
635
811
  if (!parsed)
636
812
  throw new Error("Browser record unexpectedly projected to absence");
@@ -641,9 +817,13 @@ export class SessionBrowserService {
641
817
  this.observers.add(observer);
642
818
  }
643
819
  async consumeEvents(record) {
820
+ const log = diagnosticEvents(join(sessionDiagnosticDir("browser", record.sessionId), "page-events.jsonl"), { sessionId: record.sessionId });
821
+ const lifecycle = diagnosticEvents(join(sessionDiagnosticDir("browser", record.sessionId), "browser-host.log"), { sessionId: record.sessionId, browserGeneration: record.browserGeneration });
822
+ lifecycle("browser.observer.started");
644
823
  let failed;
645
824
  try {
646
825
  for await (const event of record.handle.events) {
826
+ log("browser.observation", { ...event });
647
827
  await this.exclusive(record.sessionId, async () => {
648
828
  if (!this.isCurrent(record, event.browserGeneration))
649
829
  return;
@@ -658,8 +838,9 @@ export class SessionBrowserService {
658
838
  try {
659
839
  await this.reconcile(record);
660
840
  }
661
- catch {
662
- record.status = "unavailable";
841
+ catch (error) {
842
+ if (!this.retainRecoverableObservation(record, error))
843
+ record.status = "unavailable";
663
844
  }
664
845
  }, true);
665
846
  }
@@ -667,6 +848,7 @@ export class SessionBrowserService {
667
848
  catch (error) {
668
849
  failed = error;
669
850
  }
851
+ lifecycle("browser.observer.ended", { ...(failed ? { error: String(failed) } : {}) });
670
852
  await this.exclusive(record.sessionId, async () => {
671
853
  if (!this.isCurrent(record, record.browserGeneration))
672
854
  return;
@@ -755,6 +937,12 @@ function mapHostError(error, fallbackMessage) {
755
937
  if (error instanceof SessionBrowserServiceError)
756
938
  return error;
757
939
  if (error instanceof SessionBrowserHostError) {
940
+ if (error.code === "command_timeout") {
941
+ return new SessionBrowserServiceError("command_timeout", "Browser command timed out; do not automatically repeat an accepted action", { cause: error });
942
+ }
943
+ if (error.code === "operation_failed") {
944
+ return new SessionBrowserServiceError("host_failure", fallbackMessage, { cause: error });
945
+ }
758
946
  if (error.code === "page_not_found") {
759
947
  return new SessionBrowserServiceError("not_found", "Browser Page was not found", {
760
948
  cause: error,
@@ -768,12 +956,45 @@ function mapHostError(error, fallbackMessage) {
768
956
  if (error.code === "outcome_unknown") {
769
957
  return new SessionBrowserServiceError("outcome_unknown", "Browser Host operation outcome is unknown", { cause: error });
770
958
  }
959
+ if (error.code === "unsupported") {
960
+ return new SessionBrowserServiceError("unsupported", "Browser Host does not support this operation", { cause: error });
961
+ }
771
962
  return new SessionBrowserServiceError("unavailable", "Browser Host is unavailable", {
772
963
  cause: error,
773
964
  });
774
965
  }
775
966
  return new SessionBrowserServiceError("host_failure", fallbackMessage, { cause: error });
776
967
  }
968
+ function cloneRequestHeadersConfig(config) {
969
+ return {
970
+ enabled: config.enabled,
971
+ headers: config.headers.map((header) => ({ ...header })),
972
+ };
973
+ }
974
+ function cloneRequestHeadersPolicy(policy) {
975
+ return {
976
+ ...cloneRequestHeadersConfig(policy),
977
+ revision: policy.revision,
978
+ };
979
+ }
980
+ function sameRequestHeadersConfig(left, right) {
981
+ return left.enabled === right.enabled && sameRequestHeaderRows(left.headers, right.headers, true);
982
+ }
983
+ function sameEffectiveRequestHeaders(left, right) {
984
+ return sameRequestHeaderRows(left.enabled ? left.headers : [], right.enabled ? right.headers : [], false);
985
+ }
986
+ function sameRequestHeaderRows(left, right, preserveNameCase) {
987
+ if (left.length !== right.length)
988
+ return false;
989
+ return left.every((header, index) => {
990
+ const candidate = right[index];
991
+ return candidate !== undefined &&
992
+ (preserveNameCase
993
+ ? header.name === candidate.name
994
+ : header.name.toLowerCase() === candidate.name.toLowerCase()) &&
995
+ header.value === candidate.value;
996
+ });
997
+ }
777
998
  function validateHostPageId(value) {
778
999
  if (typeof value !== "string" ||
779
1000
  value.length === 0 ||
@@ -20,5 +20,7 @@ export declare class SessionBrowserSurfaceCoordinator implements DirectRuntimeBr
20
20
  private readonly maxPendingEventBytes;
21
21
  constructor(browsers: SessionBrowserService, options?: SessionBrowserSurfaceCoordinatorOptions);
22
22
  open(frame: RuntimeBrowserSurfaceOpenFrame, context: Parameters<DirectRuntimeBrowserSurfaceHost["open"]>[1]): Promise<DirectRuntimeBrowserSurfaceAttachment>;
23
+ isHumanControlled(sessionId: string, browserGeneration: number, pageId: string): boolean;
24
+ isBrowserHumanControlled(sessionId: string, browserGeneration: number): boolean;
23
25
  private exclusivePage;
24
26
  }
@@ -95,6 +95,17 @@ export class SessionBrowserSurfaceCoordinator {
95
95
  return attachment;
96
96
  });
97
97
  }
98
+ isHumanControlled(sessionId, browserGeneration, pageId) {
99
+ const page = this.pages.get(`${sessionId}\u0000${pageId}`);
100
+ return page?.browserGeneration === browserGeneration && page.hasHumanControl();
101
+ }
102
+ isBrowserHumanControlled(sessionId, browserGeneration) {
103
+ for (const [key, page] of this.pages) {
104
+ if (key.startsWith(`${sessionId}\u0000`) && page.browserGeneration === browserGeneration && page.hasHumanControl())
105
+ return true;
106
+ }
107
+ return false;
108
+ }
98
109
  exclusivePage(pageKey, operation) {
99
110
  const previous = this.pageQueues.get(pageKey) ?? Promise.resolve();
100
111
  const result = previous.then(operation, operation);
@@ -173,6 +184,9 @@ class SharedPageSurface {
173
184
  getViewport() {
174
185
  return this.page.source.getViewport();
175
186
  }
187
+ hasHumanControl() {
188
+ return Boolean(this.owner || this.desiredOwner);
189
+ }
176
190
  driverState() {
177
191
  return this.owner
178
192
  ? { driver: "stream", driverSubscriptionId: this.owner.subscriptionId }
@@ -647,6 +661,7 @@ function mapSurfaceOpenError(error) {
647
661
  case "shutting_down":
648
662
  return new DirectRuntimeBrowserSurfaceHostError("browser_closed", error.message, { cause: error });
649
663
  case "host_failure":
664
+ case "command_timeout":
650
665
  case "outcome_unknown":
651
666
  return new DirectRuntimeBrowserSurfaceHostError("internal_error", error.message, { cause: error });
652
667
  }
@@ -0,0 +1,42 @@
1
+ import type { UserContentPart } from "@rynx-ai/protocol";
2
+ export interface MachineSessionPendingInput {
3
+ pendingId: string;
4
+ content: UserContentPart[];
5
+ }
6
+ export interface MachineSessionPendingInputRecord {
7
+ clientMessageId: string;
8
+ content: UserContentPart[];
9
+ }
10
+ export interface MachineSessionDrainedInput extends MachineSessionPendingInput {
11
+ clientMessageId: string;
12
+ }
13
+ export interface MachineSessionPendingInputPort {
14
+ record(sessionId: string, input: MachineSessionPendingInputRecord): string;
15
+ resolve(sessionId: string, pendingId: string): void;
16
+ peekOldest(sessionId: string): MachineSessionDrainedInput | undefined;
17
+ resolveOldest(sessionId: string): MachineSessionDrainedInput | undefined;
18
+ findByClientMessageId(sessionId: string, clientMessageId: string): MachineSessionPendingInput | undefined;
19
+ snapshotFor(sessionId: string): MachineSessionPendingInput[];
20
+ deleteSession(sessionId: string): void;
21
+ }
22
+ /**
23
+ * Process-live FIFO of web-composer inputs awaiting their native transcript
24
+ * echo. The message is deliberately not persisted when the send POST succeeds:
25
+ * the Provider transcript remains the sole durable writer. This index only
26
+ * keeps the temporary bubble recoverable across page rebinds until that echo
27
+ * arrives.
28
+ */
29
+ export declare class SessionPendingInputIndex implements MachineSessionPendingInputPort {
30
+ private readonly ttlMs;
31
+ private readonly now;
32
+ private readonly entries;
33
+ constructor(ttlMs?: number, now?: () => number);
34
+ record(sessionId: string, input: MachineSessionPendingInputRecord): string;
35
+ resolve(sessionId: string, pendingId: string): void;
36
+ resolveOldest(sessionId: string): MachineSessionDrainedInput | undefined;
37
+ peekOldest(sessionId: string): MachineSessionDrainedInput | undefined;
38
+ findByClientMessageId(sessionId: string, clientMessageId: string): MachineSessionPendingInput | undefined;
39
+ snapshotFor(sessionId: string): MachineSessionPendingInput[];
40
+ deleteSession(sessionId: string): void;
41
+ private evictStale;
42
+ }