@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.
- package/dist/control-api.d.ts +11 -5
- package/dist/control-api.js +699 -95
- package/dist/control-web/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/control-web/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/control-web/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/control-web/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/control-web/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/control-web/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/control-web/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/control-web/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/control-web/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/control-web/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/control-web/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/control-web/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/control-web/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/control-web/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/control-web/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/control-web/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/control-web/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/control-web/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/control-web/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/control-web/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/control-web/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/control-web/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/control-web/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/control-web/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/control-web/assets/abap-CLvhMVsD.js +1 -0
- package/dist/control-web/assets/abnfDiagram-VRR7QNED-D_NL89dn.js +1 -0
- package/dist/control-web/assets/actionscript-3--17pq3dv.js +1 -0
- package/dist/control-web/assets/ada-C5qYipkI.js +1 -0
- package/dist/control-web/assets/andromeeda-vGVdxbeo.js +1 -0
- package/dist/control-web/assets/angular-html-DlZBZkSp.js +1 -0
- package/dist/control-web/assets/angular-ts-BVPGOT0K.js +1 -0
- package/dist/control-web/assets/apache-U0d_L8uA.js +1 -0
- package/dist/control-web/assets/apex-CGTLDQj6.js +1 -0
- package/dist/control-web/assets/apl-cDmXqmZ-.js +1 -0
- package/dist/control-web/assets/applescript-CCn79oCD.js +1 -0
- package/dist/control-web/assets/ara-4CJ0cIlV.js +1 -0
- package/dist/control-web/assets/arc-Pry-7G1_.js +1 -0
- package/dist/control-web/assets/architecture-TIHT7OUA-C9wU1KtW.js +1 -0
- package/dist/control-web/assets/architectureDiagram-ZJ3FMSHR-CV0rxVH6.js +36 -0
- package/dist/control-web/assets/array-BifhSqXX.js +1 -0
- package/dist/control-web/assets/asciidoc-DE70LPWp.js +1 -0
- package/dist/control-web/assets/asm-Cmm7eHzH.js +1 -0
- package/dist/control-web/assets/astro-B1Q6BwBx.js +1 -0
- package/dist/control-web/assets/aurora-x-CDeNXAV0.js +1 -0
- package/dist/control-web/assets/awk-BWXHIvNe.js +1 -0
- package/dist/control-web/assets/ayu-dark-DluEY0Gj.js +1 -0
- package/dist/control-web/assets/ayu-light-C3h-C4tm.js +1 -0
- package/dist/control-web/assets/ayu-mirage-Bqwy1Gya.js +1 -0
- package/dist/control-web/assets/ballerina-B7ZEbQpA.js +1 -0
- package/dist/control-web/assets/bat-Bo4NYOV-.js +1 -0
- package/dist/control-web/assets/beancount-D-usSTwE.js +1 -0
- package/dist/control-web/assets/berry-DKpUyyne.js +1 -0
- package/dist/control-web/assets/bibtex-Ci_nEsc7.js +1 -0
- package/dist/control-web/assets/bicep-CUHmPFLl.js +1 -0
- package/dist/control-web/assets/bird2-C2hNVINV.js +1 -0
- package/dist/control-web/assets/blade-Xpu-LGTm.js +1 -0
- package/dist/control-web/assets/blockDiagram-677ZJIJ3-Cc7nrkZh.js +132 -0
- package/dist/control-web/assets/bsl-BkkzgIyY.js +1 -0
- package/dist/control-web/assets/c-iCihek07.js +1 -0
- package/dist/control-web/assets/c3-CnJL0r0V.js +1 -0
- package/dist/control-web/assets/c4Diagram-LMCZKHZV-BPRU9m-F.js +10 -0
- package/dist/control-web/assets/cadence-CQ2zXKGN.js +1 -0
- package/dist/control-web/assets/cairo-DLTphjLi.js +1 -0
- package/dist/control-web/assets/catppuccin-frappe-3VR1Za6u.js +1 -0
- package/dist/control-web/assets/catppuccin-latte-DwIHMF0Q.js +1 -0
- package/dist/control-web/assets/catppuccin-macchiato-DYnBP6_5.js +1 -0
- package/dist/control-web/assets/catppuccin-mocha-DYhrFGRu.js +1 -0
- package/dist/control-web/assets/channel-BFm2_j8K.js +1 -0
- package/dist/control-web/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist/control-web/assets/chunk-32BRIVSS-Bbq3O54m.js +1 -0
- package/dist/control-web/assets/chunk-52WLFC77-sD4al-Ob.js +10 -0
- package/dist/control-web/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/dist/control-web/assets/chunk-7BUUIJ7U-Bb538aSH.js +1 -0
- package/dist/control-web/assets/chunk-C7G6YPKG-DqHaDS1O.js +1 -0
- package/dist/control-web/assets/chunk-EX3LRPZG-36GNQ5wp.js +231 -0
- package/dist/control-web/assets/chunk-HOUHSVGY-DeZ63q1j.js +1 -0
- package/dist/control-web/assets/chunk-ICXQ74PX-D2yF6lD_.js +2 -0
- package/dist/control-web/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist/control-web/assets/chunk-KEIR6QF5-BICK3FdT.js +161 -0
- package/dist/control-web/assets/chunk-MOJQB5TN-CdaKyBz5.js +88 -0
- package/dist/control-web/assets/chunk-OGEWGWER-eOXC7kiH.js +1 -0
- package/dist/control-web/assets/chunk-PUDLZKDR-6w0LILL_.js +156 -0
- package/dist/control-web/assets/chunk-Q4XR5HBZ-CXgD5TGL.js +70 -0
- package/dist/control-web/assets/chunk-RYQCIY6F-BsoV8yK2.js +1 -0
- package/dist/control-web/assets/chunk-V7JOEXUC-BfoZ78b6.js +206 -0
- package/dist/control-web/assets/chunk-VR4S4FIN-BW2gCEMQ.js +1 -0
- package/dist/control-web/assets/chunk-WYO6CB5R-CHn7hulw.js +128 -0
- package/dist/control-web/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
- package/dist/control-web/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/dist/control-web/assets/chunk-ZGVPDNZ5-CmFP0-fr.js +62 -0
- package/dist/control-web/assets/clarity-SemFz856.js +1 -0
- package/dist/control-web/assets/classDiagram-OUVF2IWQ-CUe_bETB.js +1 -0
- package/dist/control-web/assets/classDiagram-v2-EOCWNBFH-CUe_bETB.js +1 -0
- package/dist/control-web/assets/clojure-DqKBuwfJ.js +1 -0
- package/dist/control-web/assets/cmake-Bj61d0ZC.js +1 -0
- package/dist/control-web/assets/cobol-BsV-839J.js +1 -0
- package/dist/control-web/assets/codeowners-C8r90Shi.js +1 -0
- package/dist/control-web/assets/codeql-oeQT6MSM.js +1 -0
- package/dist/control-web/assets/coffee-CiiSLhB6.js +1 -0
- package/dist/control-web/assets/common-lisp-Cv5bFMCO.js +1 -0
- package/dist/control-web/assets/coq-BrsZFFmf.js +1 -0
- package/dist/control-web/assets/cose-bilkent-JH36ORCC-lJEhNiw_.js +1 -0
- package/dist/control-web/assets/cpp-DjoE5qBx.js +1 -0
- package/dist/control-web/assets/crystal-DDxHDkHz.js +1 -0
- package/dist/control-web/assets/csharp-Ct8U2NOr.js +1 -0
- package/dist/control-web/assets/css-LjpOdHib.js +1 -0
- package/dist/control-web/assets/csv-Dx-8-gkx.js +1 -0
- package/dist/control-web/assets/cue-CE9AQfxI.js +1 -0
- package/dist/control-web/assets/cynefin-VYW2F7L2-NaLr7Qlq.js +1 -0
- package/dist/control-web/assets/cynefinDiagram-TSTJHNR4-C90wpjAI.js +62 -0
- package/dist/control-web/assets/cypher-ClKdZ_lG.js +1 -0
- package/dist/control-web/assets/cytoscape.esm-B-NFISlW.js +321 -0
- package/dist/control-web/assets/d-qD-0Kul2.js +1 -0
- package/dist/control-web/assets/dagre-Buvkdvvj.js +1 -0
- package/dist/control-web/assets/dagre-VKFMJZFB-BxrPFWTb.js +4 -0
- package/dist/control-web/assets/dark-plus-Cs2F2srj.js +1 -0
- package/dist/control-web/assets/dart-DkHntEIa.js +1 -0
- package/dist/control-web/assets/dax-BkyTk9wS.js +1 -0
- package/dist/control-web/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist/control-web/assets/desktop-Dlh5hvp9.js +1 -0
- package/dist/control-web/assets/diagram-FQU43EPY-VIQINsvz.js +3 -0
- package/dist/control-web/assets/diagram-G47NLZAW-DFeAfYXn.js +24 -0
- package/dist/control-web/assets/diagram-NH7WQ7WH-ATzdppDd.js +24 -0
- package/dist/control-web/assets/diagram-OA4YK3LP-DJZpWmbl.js +30 -0
- package/dist/control-web/assets/diagram-WEI45ONY-CqDHcW3g.js +41 -0
- package/dist/control-web/assets/diff-woXpYk--.js +1 -0
- package/dist/control-web/assets/dist-Dx9YWgcW.js +153 -0
- package/dist/control-web/assets/dist-v5Q1xZ2K.js +1 -0
- package/dist/control-web/assets/docker-IyjqRm3v.js +1 -0
- package/dist/control-web/assets/dotenv-_5a1GRtc.js +1 -0
- package/dist/control-web/assets/dracula-BHWKrbxM.js +1 -0
- package/dist/control-web/assets/dracula-soft-5eyTD99u.js +1 -0
- package/dist/control-web/assets/dream-maker-DW3nJb8Q.js +1 -0
- package/dist/control-web/assets/ebnfDiagram-CCIWWBDH-DnP6dHND.js +1 -0
- package/dist/control-web/assets/edge-8z7Jp9dO.js +1 -0
- package/dist/control-web/assets/elixir-CUV54ev5.js +1 -0
- package/dist/control-web/assets/elm-o4NJxfws.js +1 -0
- package/dist/control-web/assets/emacs-lisp-C9PiwqqW.js +1 -0
- package/dist/control-web/assets/erDiagram-Q63AITRT-Bo8bFqrZ.js +85 -0
- package/dist/control-web/assets/erb-CIsHcwm1.js +1 -0
- package/dist/control-web/assets/erlang-Cphh6RMH.js +1 -0
- package/dist/control-web/assets/eventmodeling-45OFAUF4-DTN8wqsu.js +1 -0
- package/dist/control-web/assets/everforest-dark-sB-x3p7T.js +1 -0
- package/dist/control-web/assets/everforest-light-Df2xbC6M.js +1 -0
- package/dist/control-web/assets/fennel-DQxkIbk2.js +1 -0
- package/dist/control-web/assets/fish-BJitypiv.js +1 -0
- package/dist/control-web/assets/flowDiagram-23GEKE2U-BwjqRyvd.js +1 -0
- package/dist/control-web/assets/fluent-C03EYrpw.js +1 -0
- package/dist/control-web/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
- package/dist/control-web/assets/fortran-free-form-CYNrtFtB.js +1 -0
- package/dist/control-web/assets/fsharp-D13ZGOAj.js +1 -0
- package/dist/control-web/assets/ganttDiagram-NO4QXBWP-kxQaBTzd.js +292 -0
- package/dist/control-web/assets/gdresource-C0sCabJj.js +1 -0
- package/dist/control-web/assets/gdscript-Cp2uCuqX.js +1 -0
- package/dist/control-web/assets/gdshader-CBce3t8t.js +1 -0
- package/dist/control-web/assets/genie-CV2tkWYe.js +1 -0
- package/dist/control-web/assets/gherkin-DExj1W_8.js +1 -0
- package/dist/control-web/assets/git-commit-BSykSTBG.js +1 -0
- package/dist/control-web/assets/git-rebase-BDPpS8w6.js +1 -0
- package/dist/control-web/assets/gitGraph-TEB2WS4Q-a646NnuJ.js +1 -0
- package/dist/control-web/assets/gitGraphDiagram-IHSO6WYX-BBe0q0At.js +106 -0
- package/dist/control-web/assets/github-dark-C-LZuMrd.js +1 -0
- package/dist/control-web/assets/github-dark-default-DXG-b-1a.js +1 -0
- package/dist/control-web/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
- package/dist/control-web/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
- package/dist/control-web/assets/github-light-EUqPIrTm.js +1 -0
- package/dist/control-web/assets/github-light-default-BXViO-2h.js +1 -0
- package/dist/control-web/assets/github-light-high-contrast-B68TUdTA.js +1 -0
- package/dist/control-web/assets/gleam-CSRkHgEL.js +1 -0
- package/dist/control-web/assets/glimmer-js-OEO36pDk.js +1 -0
- package/dist/control-web/assets/glimmer-ts-BnAPyISE.js +1 -0
- package/dist/control-web/assets/glsl-D5MA2a_X.js +1 -0
- package/dist/control-web/assets/gn-ilITqXS6.js +1 -0
- package/dist/control-web/assets/gnuplot-7GGW24-e.js +1 -0
- package/dist/control-web/assets/go-BJwz_mda.js +1 -0
- package/dist/control-web/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/control-web/assets/graphql-Ctjuxyvl.js +1 -0
- package/dist/control-web/assets/groovy-CacY0gHj.js +1 -0
- package/dist/control-web/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
- package/dist/control-web/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
- package/dist/control-web/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
- package/dist/control-web/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
- package/dist/control-web/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
- package/dist/control-web/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
- package/dist/control-web/assets/hack-D_mkkoLd.js +1 -0
- package/dist/control-web/assets/haml-mpgecWZ6.js +1 -0
- package/dist/control-web/assets/handlebars-CAx_777f.js +1 -0
- package/dist/control-web/assets/haskell-D8IpX4py.js +1 -0
- package/dist/control-web/assets/haxe-OTjmBuCE.js +1 -0
- package/dist/control-web/assets/hcl-Dh228itO.js +1 -0
- package/dist/control-web/assets/highlighted-body-OFNGDK62-DVCHy9oI.js +1 -0
- package/dist/control-web/assets/hjson-CxZEssPk.js +1 -0
- package/dist/control-web/assets/hlsl-Cvrh5tZx.js +1 -0
- package/dist/control-web/assets/horizon-CE9ld1lL.js +1 -0
- package/dist/control-web/assets/horizon-bright-Br1oVSNq.js +1 -0
- package/dist/control-web/assets/houston-CsvMBhTu.js +1 -0
- package/dist/control-web/assets/html-B2lrdnWr.js +1 -0
- package/dist/control-web/assets/html-derivative-CDfZYcul.js +1 -0
- package/dist/control-web/assets/http-kmH8AyfE.js +1 -0
- package/dist/control-web/assets/hurl-DCZHXKU4.js +1 -0
- package/dist/control-web/assets/hxml-B0Qn7Nwc.js +1 -0
- package/dist/control-web/assets/hy-CZbG8q4J.js +1 -0
- package/dist/control-web/assets/imba-DsUTQ-LC.js +1 -0
- package/dist/control-web/assets/index-D7URT6K_.js +140 -0
- package/dist/control-web/assets/index-uEpvRMX9.css +1 -0
- package/dist/control-web/assets/info-DKCQHKI2-Cp_JrY-b.js +1 -0
- package/dist/control-web/assets/infoDiagram-FWYZ7A6U-CAm-h4F_.js +2 -0
- package/dist/control-web/assets/ini-B5eOa1yu.js +1 -0
- package/dist/control-web/assets/init-C-OQMol4.js +1 -0
- package/dist/control-web/assets/ishikawaDiagram-FXEZZL3T-O17pqcWr.js +70 -0
- package/dist/control-web/assets/java-DdHNQ9hk.js +1 -0
- package/dist/control-web/assets/javascript-obGGvMPs.js +1 -0
- package/dist/control-web/assets/jinja-BMiPVedm.js +1 -0
- package/dist/control-web/assets/jison-CBjhYtSs.js +1 -0
- package/dist/control-web/assets/journeyDiagram-5HDEW3XC-DQ-JuSoR.js +139 -0
- package/dist/control-web/assets/json-DAgxKhMr.js +1 -0
- package/dist/control-web/assets/json5-BR5RXkoi.js +1 -0
- package/dist/control-web/assets/jsonc-CYpm1nAK.js +1 -0
- package/dist/control-web/assets/jsonl-CmCQp5Yx.js +1 -0
- package/dist/control-web/assets/jsonnet-CJTPZ8u_.js +1 -0
- package/dist/control-web/assets/jssm-DXw9l8Rf.js +1 -0
- package/dist/control-web/assets/jsx-gTgmArGx.js +1 -0
- package/dist/control-web/assets/julia-CjHxn3vf.js +1 -0
- package/dist/control-web/assets/just-DMArCiVH.js +1 -0
- package/dist/control-web/assets/kanagawa-dragon-CXtmUGW6.js +1 -0
- package/dist/control-web/assets/kanagawa-lotus-BN08jTvb.js +1 -0
- package/dist/control-web/assets/kanagawa-wave-CTweb8Dz.js +1 -0
- package/dist/control-web/assets/kanban-definition-HUTT4EX6-Cgv3kPbm.js +89 -0
- package/dist/control-web/assets/katex-CyHG4N6b.js +1 -0
- package/dist/control-web/assets/kdl-CsD5j6eV.js +1 -0
- package/dist/control-web/assets/kotlin-DhhofPvG.js +1 -0
- package/dist/control-web/assets/kusto-BUv0MjJC.js +1 -0
- package/dist/control-web/assets/laserwave-C_8bwKvT.js +1 -0
- package/dist/control-web/assets/latex-D9bvcAJr.js +1 -0
- package/dist/control-web/assets/lean-CewbzKMR.js +1 -0
- package/dist/control-web/assets/less-DVTAwKKz.js +1 -0
- package/dist/control-web/assets/lib-BZ_F5vVH.js +1 -0
- package/dist/control-web/assets/light-plus-DVQuIRkW.js +1 -0
- package/dist/control-web/assets/line-DUsXzGJZ.js +1 -0
- package/dist/control-web/assets/linear-DmucvK78.js +1 -0
- package/dist/control-web/assets/liquid-CCX5qouA.js +1 -0
- package/dist/control-web/assets/llvm-Cm23YOpf.js +1 -0
- package/dist/control-web/assets/log-BNLmms1o.js +1 -0
- package/dist/control-web/assets/logo-Cluzi2Zq.js +1 -0
- package/dist/control-web/assets/lua-FONpmTUP.js +1 -0
- package/dist/control-web/assets/luau-CNKltnaQ.js +1 -0
- package/dist/control-web/assets/make-Dixweg8N.js +1 -0
- package/dist/control-web/assets/map-BaFkSB1l.js +1 -0
- package/dist/control-web/assets/markdown-BYOwaDjH.js +1 -0
- package/dist/control-web/assets/markdown-streamdown-4N4AcNp5.js +433 -0
- package/dist/control-web/assets/markdown-streamdown-DEcVZfaU.css +1 -0
- package/dist/control-web/assets/marko-oPGh3KfH.js +1 -0
- package/dist/control-web/assets/material-theme-Bm3Qr25_.js +1 -0
- package/dist/control-web/assets/material-theme-darker-2IIEA8gg.js +1 -0
- package/dist/control-web/assets/material-theme-lighter-uhdI0v04.js +1 -0
- package/dist/control-web/assets/material-theme-ocean-CHQ94UKr.js +1 -0
- package/dist/control-web/assets/material-theme-palenight-B5W6OYN7.js +1 -0
- package/dist/control-web/assets/matlab-D7qyCx1q.js +1 -0
- package/dist/control-web/assets/mdc-B_uQHOlt.js +1 -0
- package/dist/control-web/assets/mdx-DQZ5AkYe.js +1 -0
- package/dist/control-web/assets/mermaid-Bk4SNUv9.js +1 -0
- package/dist/control-web/assets/mermaid-GHXKKRXX-BElZGKGd.js +1 -0
- package/dist/control-web/assets/mermaid-parser.core-VMln12Kd.js +7 -0
- package/dist/control-web/assets/min-dark-BSWPekZh.js +1 -0
- package/dist/control-web/assets/min-light-DDpmG2fV.js +1 -0
- package/dist/control-web/assets/mindmap-definition-LN4V7U3C-Bn0lH-UM.js +96 -0
- package/dist/control-web/assets/mipsasm-BMqwQI7S.js +1 -0
- package/dist/control-web/assets/mojo-BgCJLMeH.js +1 -0
- package/dist/control-web/assets/monokai-CdkpiU2Y.js +1 -0
- package/dist/control-web/assets/moonbit-CaWjb8XO.js +1 -0
- package/dist/control-web/assets/move-B1IS1UjX.js +1 -0
- package/dist/control-web/assets/narrat-_X_XdTYD.js +1 -0
- package/dist/control-web/assets/nextflow-Bbiyy34d.js +1 -0
- package/dist/control-web/assets/nextflow-groovy-Dc_ddanL.js +1 -0
- package/dist/control-web/assets/nginx-BTMw9COX.js +1 -0
- package/dist/control-web/assets/night-owl-DhmEMT88.js +1 -0
- package/dist/control-web/assets/night-owl-light-eJ-hLW7d.js +1 -0
- package/dist/control-web/assets/nim-8PQFL6ZB.js +1 -0
- package/dist/control-web/assets/nix-IvuFDN5E.js +1 -0
- package/dist/control-web/assets/nord-Cb4Vim4T.js +1 -0
- package/dist/control-web/assets/nushell-DcLAeLz5.js +1 -0
- package/dist/control-web/assets/objective-c-D1A_Heim.js +1 -0
- package/dist/control-web/assets/objective-cpp-BsSzOQcm.js +1 -0
- package/dist/control-web/assets/ocaml-O90oeIOV.js +1 -0
- package/dist/control-web/assets/odin-B1RWQWA5.js +1 -0
- package/dist/control-web/assets/one-dark-pro-CLwyXe_n.js +1 -0
- package/dist/control-web/assets/one-light-D7Lr4KcI.js +1 -0
- package/dist/control-web/assets/openscad-BUDT5pXO.js +1 -0
- package/dist/control-web/assets/ordinal-BDEzSJ7C.js +1 -0
- package/dist/control-web/assets/packet-7NZHBO7P-Zw8iJ8lo.js +1 -0
- package/dist/control-web/assets/pascal-4ZHwLPI5.js +1 -0
- package/dist/control-web/assets/path-fybaL0A-.js +1 -0
- package/dist/control-web/assets/pegDiagram-2B236MQR-CtF7vVs_.js +1 -0
- package/dist/control-web/assets/perl-Vf0i0hAx.js +1 -0
- package/dist/control-web/assets/php-am1OsKhm.js +1 -0
- package/dist/control-web/assets/pie-RZYD4A2V-su_3QGU2.js +1 -0
- package/dist/control-web/assets/pieDiagram-ENE6RG2P-BkMUBLE1.js +39 -0
- package/dist/control-web/assets/pkl-ot-7Btpt.js +1 -0
- package/dist/control-web/assets/plastic-DQwYfKfQ.js +1 -0
- package/dist/control-web/assets/plsql-DGHpHOYJ.js +1 -0
- package/dist/control-web/assets/po-BiJDBrnU.js +1 -0
- package/dist/control-web/assets/poimandres-DRFjx7u4.js +1 -0
- package/dist/control-web/assets/polar-C7UOKdEL.js +1 -0
- package/dist/control-web/assets/postcss-BXeXVLqQ.js +1 -0
- package/dist/control-web/assets/powerquery-DNMTfnFr.js +1 -0
- package/dist/control-web/assets/powershell-DshXNtvi.js +1 -0
- package/dist/control-web/assets/prisma-BsRQq5mF.js +1 -0
- package/dist/control-web/assets/prolog-iXnhIJG7.js +1 -0
- package/dist/control-web/assets/proto-DB4EqR-F.js +1 -0
- package/dist/control-web/assets/pug-DO6yvBr3.js +1 -0
- package/dist/control-web/assets/puppet-CDv2pdJW.js +1 -0
- package/dist/control-web/assets/purescript-9MfHhQsQ.js +1 -0
- package/dist/control-web/assets/python-gzcpVVnB.js +1 -0
- package/dist/control-web/assets/qml-_a-QhfPD.js +1 -0
- package/dist/control-web/assets/qmldir-DCQb3MpD.js +1 -0
- package/dist/control-web/assets/qss-Fe1Jh2GI.js +1 -0
- package/dist/control-web/assets/quadrantDiagram-ABIIQ3AL-ba-VaqMe.js +7 -0
- package/dist/control-web/assets/r-D6UWEOL2.js +1 -0
- package/dist/control-web/assets/racket-DcIDlBhZ.js +1 -0
- package/dist/control-web/assets/radar-I7S5WNFK-Dat0rqem.js +1 -0
- package/dist/control-web/assets/railroad-3IZDKUUU-Dh2-s8r8.js +1 -0
- package/dist/control-web/assets/railroad-abnf-AHOZXSZD-CNUwq0JR.js +1 -0
- package/dist/control-web/assets/railroad-ebnf-EBAXGLYW-RHr0duea.js +1 -0
- package/dist/control-web/assets/railroad-peg-LSFZ7HO6-CVBWS2eU.js +1 -0
- package/dist/control-web/assets/railroadDiagram-RFXS5EU6-BiJX3SY-.js +1 -0
- package/dist/control-web/assets/raku-B3gFvitq.js +1 -0
- package/dist/control-web/assets/razor-CMVBVp3T.js +1 -0
- package/dist/control-web/assets/red-CJ3rzSJv.js +1 -0
- package/dist/control-web/assets/reg-CRGYupPL.js +1 -0
- package/dist/control-web/assets/regexp-DR20uMnK.js +1 -0
- package/dist/control-web/assets/rel-BtDbiS_P.js +1 -0
- package/dist/control-web/assets/requirementDiagram-TGXJPOKE-CFfakCzs.js +84 -0
- package/dist/control-web/assets/riscv-Ckw8ddFX.js +1 -0
- package/dist/control-web/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/control-web/assets/ron-VUp2lXgN.js +1 -0
- package/dist/control-web/assets/rose-pine-BthvhNj6.js +1 -0
- package/dist/control-web/assets/rose-pine-dawn-Dg85fqjY.js +1 -0
- package/dist/control-web/assets/rose-pine-moon-hon4tzzS.js +1 -0
- package/dist/control-web/assets/rosmsg-CAekHB0j.js +1 -0
- package/dist/control-web/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/dist/control-web/assets/rst-CgIrbW_q.js +1 -0
- package/dist/control-web/assets/ruby-Dp6Zud9H.js +1 -0
- package/dist/control-web/assets/rust-Cfkwpbl8.js +1 -0
- package/dist/control-web/assets/sankeyDiagram-HTMAVEWB-jgDi0God.js +40 -0
- package/dist/control-web/assets/sas-B6p8-ynO.js +1 -0
- package/dist/control-web/assets/sass-DXrisJhu.js +1 -0
- package/dist/control-web/assets/scala-DKOlJaKm.js +1 -0
- package/dist/control-web/assets/scheme-DQCgrYNe.js +1 -0
- package/dist/control-web/assets/scss-DcoSS-ti.js +1 -0
- package/dist/control-web/assets/sdbl-bTVj8UrX.js +1 -0
- package/dist/control-web/assets/sequenceDiagram-DBY2YBRQ-DBfyyb0N.js +162 -0
- package/dist/control-web/assets/shaderlab-TOUzSsQk.js +1 -0
- package/dist/control-web/assets/shellscript-Da78Ox-3.js +1 -0
- package/dist/control-web/assets/shellsession-CVsQGYfZ.js +1 -0
- package/dist/control-web/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +1 -0
- package/dist/control-web/assets/slack-dark-DnToyrRv.js +1 -0
- package/dist/control-web/assets/slack-ochin-B2OO5cIa.js +1 -0
- package/dist/control-web/assets/smalltalk-B16xEiuN.js +1 -0
- package/dist/control-web/assets/snazzy-light-4G7pJPwS.js +1 -0
- package/dist/control-web/assets/solarized-dark-DV17i1UV.js +1 -0
- package/dist/control-web/assets/solarized-light-DSh2HLQt.js +1 -0
- package/dist/control-web/assets/solidity-CKzVLygQ.js +1 -0
- package/dist/control-web/assets/soy-B5n_eHSp.js +1 -0
- package/dist/control-web/assets/sparql-D_iOobhT.js +1 -0
- package/dist/control-web/assets/splunk-BC2Px7Mm.js +1 -0
- package/dist/control-web/assets/sql-ClgswhA6.js +1 -0
- package/dist/control-web/assets/src-B6xuSHsQ.js +1 -0
- package/dist/control-web/assets/ssh-config-BgfXC-Er.js +1 -0
- package/dist/control-web/assets/stata-RoaAgbqU.js +1 -0
- package/dist/control-web/assets/stateDiagram-2N3HPSRC-Dwb_ncVi.js +1 -0
- package/dist/control-web/assets/stateDiagram-v2-6OUMAXLB-DI0opaA1.js +1 -0
- package/dist/control-web/assets/stylus-B6D30XZt.js +1 -0
- package/dist/control-web/assets/surrealql-DIn4NJsS.js +1 -0
- package/dist/control-web/assets/svelte-CIt8Fl9I.js +1 -0
- package/dist/control-web/assets/swift-DonLKvLd.js +1 -0
- package/dist/control-web/assets/swimlanes-5IMT3BWC-DW0LuiIV.js +2 -0
- package/dist/control-web/assets/swimlanesDiagram-G3AALYLV-DDTVjcOR.js +8 -0
- package/dist/control-web/assets/synthwave-84-nFMaYfgc.js +1 -0
- package/dist/control-web/assets/system-verilog-DJ5XKQeo.js +1 -0
- package/dist/control-web/assets/systemd-BxMlprV5.js +1 -0
- package/dist/control-web/assets/talonscript-CohzipZa.js +1 -0
- package/dist/control-web/assets/tasl-DMoTqEGO.js +1 -0
- package/dist/control-web/assets/tcl-CZd0xW_V.js +1 -0
- package/dist/control-web/assets/templ-BREsJpNc.js +1 -0
- package/dist/control-web/assets/terraform-DswuEJGm.js +1 -0
- package/dist/control-web/assets/tex-0w6-Dtgt.js +1 -0
- package/dist/control-web/assets/timeline-definition-FHXFAJF6-DeX4B_B8.js +120 -0
- package/dist/control-web/assets/tokyo-night-oM2G3aXe.js +1 -0
- package/dist/control-web/assets/toml-CcmNWLt0.js +1 -0
- package/dist/control-web/assets/treeView-QDETBFTQ-D1UXtICj.js +1 -0
- package/dist/control-web/assets/treemap-6X3UGDF4-CrppzjZH.js +1 -0
- package/dist/control-web/assets/ts-tags-q3pptdMi.js +1 -0
- package/dist/control-web/assets/tsv-sltzmVWM.js +1 -0
- package/dist/control-web/assets/tsx-CUOciP0b.js +1 -0
- package/dist/control-web/assets/turtle-ByJddavk.js +1 -0
- package/dist/control-web/assets/twig-LIeLXgf5.js +1 -0
- package/dist/control-web/assets/typescript-BydbNFcO.js +1 -0
- package/dist/control-web/assets/typespec-B88KGewJ.js +1 -0
- package/dist/control-web/assets/typst-DI99ib-x.js +1 -0
- package/dist/control-web/assets/v-DETTlOr0.js +1 -0
- package/dist/control-web/assets/vala-zf12oZj6.js +1 -0
- package/dist/control-web/assets/vb-Djn5o6TS.js +1 -0
- package/dist/control-web/assets/vennDiagram-L72KCM5P-BYpf-7VR.js +34 -0
- package/dist/control-web/assets/verilog-CiiDBU1e.js +1 -0
- package/dist/control-web/assets/vesper-D5bVUKB1.js +1 -0
- package/dist/control-web/assets/vhdl-BroJfC0k.js +1 -0
- package/dist/control-web/assets/viml-DvXPmvsu.js +1 -0
- package/dist/control-web/assets/vitesse-black-fwtXNY1n.js +1 -0
- package/dist/control-web/assets/vitesse-dark-BZCL-v6S.js +1 -0
- package/dist/control-web/assets/vitesse-light-VbXTXTou.js +1 -0
- package/dist/control-web/assets/vue-DVSfBueU.js +1 -0
- package/dist/control-web/assets/vue-html-DkKkQnZL.js +1 -0
- package/dist/control-web/assets/vue-vine-pWqEcBkW.js +1 -0
- package/dist/control-web/assets/vyper-CgoNMtux.js +1 -0
- package/dist/control-web/assets/wardley-OPB4EBWU-B9rA0UsV.js +1 -0
- package/dist/control-web/assets/wardleyDiagram-EHGQE667-BdvAUa5F.js +78 -0
- package/dist/control-web/assets/wasm-BnjxR4X6.js +1 -0
- package/dist/control-web/assets/wasm-ByWQv1Qj.js +1 -0
- package/dist/control-web/assets/wenyan-C8pVoKbM.js +1 -0
- package/dist/control-web/assets/wgsl-BsKzXJz4.js +1 -0
- package/dist/control-web/assets/wikitext-ClFFjSW2.js +1 -0
- package/dist/control-web/assets/wit-DdvCle-K.js +1 -0
- package/dist/control-web/assets/wolfram-DLL8P-h_.js +1 -0
- package/dist/control-web/assets/xml-BlnrEAEy.js +1 -0
- package/dist/control-web/assets/xsl-BOPS8gLt.js +1 -0
- package/dist/control-web/assets/xychartDiagram-FW5EYKEG-BaEV3pGm.js +7 -0
- package/dist/control-web/assets/yaml-Du_6cdrH.js +1 -0
- package/dist/control-web/assets/zenscript-BnlCZFoB.js +1 -0
- package/dist/control-web/assets/zig-CMLA9XwU.js +1 -0
- package/dist/control-web/index.html +3 -2
- package/dist/control-web-dist.d.ts +1 -1
- package/dist/control-web-dist.js +4 -2
- package/dist/desktop-browser-host.d.ts +12 -1
- package/dist/desktop-browser-host.js +110 -13
- package/dist/direct-runtime-server.js +187 -153
- package/dist/machine-session-service.d.ts +96 -15
- package/dist/machine-session-service.js +745 -115
- package/dist/remote-runtime-dispatcher.d.ts +2 -2
- package/dist/remote-runtime-dispatcher.js +39 -2
- package/dist/remote-runtime-session-projection.d.ts +1 -0
- package/dist/remote-runtime-session-projection.js +12 -0
- package/dist/server.d.ts +67 -16
- package/dist/server.js +422 -55
- package/dist/session-browser-service.d.ts +50 -4
- package/dist/session-browser-service.js +232 -11
- package/dist/session-browser-surface-coordinator.d.ts +2 -0
- package/dist/session-browser-surface-coordinator.js +15 -0
- package/dist/session-pending-inputs.d.ts +42 -0
- package/dist/session-pending-inputs.js +87 -0
- package/dist/session-portal.d.ts +54 -0
- package/dist/session-portal.js +997 -0
- package/dist/session-runtime-index.d.ts +3 -6
- package/dist/session-runtime-index.js +96 -38
- package/dist/session-terminal-host.d.ts +22 -2
- package/dist/session-terminal-host.js +66 -83
- package/dist/terminal-ws.d.ts +4 -1
- package/dist/terminal-ws.js +93 -27
- package/package.json +7 -7
- package/dist/control-web/assets/highlighted-body-OFNGDK62-B4mcMjmm.js +0 -1
- package/dist/control-web/assets/index-5n6D-i-c.css +0 -32
- package/dist/control-web/assets/index-D56JQ9oi.js +0 -709
- 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
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
+
}
|