@rynx-ai/server 0.1.11-beta.3 → 0.1.11-beta.31
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 +16 -4
- package/dist/control-api.js +713 -83
- 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-BdImnpbu.js +1 -0
- package/dist/control-web/assets/abnfDiagram-VRR7QNED-8c99_3I5.js +1 -0
- package/dist/control-web/assets/actionscript-3-CoDkCxhg.js +1 -0
- package/dist/control-web/assets/ada-bCR0ucgS.js +1 -0
- package/dist/control-web/assets/andromeeda-C4gqWexZ.js +1 -0
- package/dist/control-web/assets/angular-html-CU67Zn6k.js +1 -0
- package/dist/control-web/assets/angular-ts-BwZT4LLn.js +1 -0
- package/dist/control-web/assets/apache-Pmp26Uib.js +1 -0
- package/dist/control-web/assets/apex-D8_7TLub.js +1 -0
- package/dist/control-web/assets/apl-dKokRX4l.js +1 -0
- package/dist/control-web/assets/applescript-Co6uUVPk.js +1 -0
- package/dist/control-web/assets/ara-BRHolxvo.js +1 -0
- package/dist/control-web/assets/arc-FWW96Tzo.js +1 -0
- package/dist/control-web/assets/architectureDiagram-ZJ3FMSHR-B5FrqoRB.js +36 -0
- package/dist/control-web/assets/asciidoc-Ve4PFQV2.js +1 -0
- package/dist/control-web/assets/asm-D_Q5rh1f.js +1 -0
- package/dist/control-web/assets/astro-CbQHKStN.js +1 -0
- package/dist/control-web/assets/aurora-x-D-2ljcwZ.js +1 -0
- package/dist/control-web/assets/awk-DMzUqQB5.js +1 -0
- package/dist/control-web/assets/ayu-dark-DYE7WIF3.js +1 -0
- package/dist/control-web/assets/ayu-light-BA47KaF1.js +1 -0
- package/dist/control-web/assets/ayu-mirage-32ctXXKs.js +1 -0
- package/dist/control-web/assets/ballerina-BFfxhgS-.js +1 -0
- package/dist/control-web/assets/bat-BkioyH1T.js +1 -0
- package/dist/control-web/assets/beancount-k_qm7-4y.js +1 -0
- package/dist/control-web/assets/berry-uYugtg8r.js +1 -0
- package/dist/control-web/assets/bibtex-CHM0blh-.js +1 -0
- package/dist/control-web/assets/bicep-Bmn6On1c.js +1 -0
- package/dist/control-web/assets/bird2-DPOp833l.js +1 -0
- package/dist/control-web/assets/blade-D4QpJJKB.js +1 -0
- package/dist/control-web/assets/blockDiagram-677ZJIJ3-DJRwOGMa.js +132 -0
- package/dist/control-web/assets/bsl-BO_Y6i37.js +1 -0
- package/dist/control-web/assets/c-BIGW1oBm.js +1 -0
- package/dist/control-web/assets/c3-eo99z4R2.js +1 -0
- package/dist/control-web/assets/c4Diagram-LMCZKHZV-B8FCUurl.js +10 -0
- package/dist/control-web/assets/cadence-Bv_4Rxtq.js +1 -0
- package/dist/control-web/assets/cairo-KRGpt6FW.js +1 -0
- package/dist/control-web/assets/catppuccin-frappe-DFWUc33u.js +1 -0
- package/dist/control-web/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
- package/dist/control-web/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
- package/dist/control-web/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
- package/dist/control-web/assets/channel-Bnyhn1Qs.js +1 -0
- package/dist/control-web/assets/chunk-2Q5K7J3B-DC5xexY2.js +1 -0
- package/dist/control-web/assets/chunk-32BRIVSS-DAzT69zb.js +1 -0
- package/dist/control-web/assets/chunk-5VM5RSS4-CXKpL77L.js +15 -0
- package/dist/control-web/assets/chunk-EX3LRPZG-DQKQvoPv.js +231 -0
- package/dist/control-web/assets/chunk-JWPE2WC7-CWMqpJoT.js +1 -0
- package/dist/control-web/assets/chunk-MOJQB5TN-Bd8jn7RZ.js +88 -0
- package/dist/control-web/assets/chunk-RYQCIY6F-DKXEMFO6.js +1 -0
- package/dist/control-web/assets/chunk-V7JOEXUC-BUDLq5nU.js +206 -0
- package/dist/control-web/assets/chunk-VR4S4FIN-C65l7VIz.js +1 -0
- package/dist/control-web/assets/chunk-XXDRQBXY-Y2498HkC.js +1 -0
- package/dist/control-web/assets/clarity-D53aC0YG.js +1 -0
- package/dist/control-web/assets/classDiagram-OUVF2IWQ-CBtXSdwW.js +1 -0
- package/dist/control-web/assets/classDiagram-v2-EOCWNBFH-CBtXSdwW.js +1 -0
- package/dist/control-web/assets/clojure-P80f7IUj.js +1 -0
- package/dist/control-web/assets/cmake-D1j8_8rp.js +1 -0
- package/dist/control-web/assets/cobol-nwyudZeR.js +1 -0
- package/dist/control-web/assets/codeowners-Bp6g37R7.js +1 -0
- package/dist/control-web/assets/codeql-DsOJ9woJ.js +1 -0
- package/dist/control-web/assets/coffee-Ch7k5sss.js +1 -0
- package/dist/control-web/assets/common-lisp-Cg-RD9OK.js +1 -0
- package/dist/control-web/assets/coq-DkFqJrB1.js +1 -0
- package/dist/control-web/assets/cose-bilkent-JH36ORCC-C9aVXb8E.js +1 -0
- package/dist/control-web/assets/cpp-CofmeUqb.js +1 -0
- package/dist/control-web/assets/crystal-tKQVLTB8.js +1 -0
- package/dist/control-web/assets/csharp-COcwbKMJ.js +1 -0
- package/dist/control-web/assets/css-DPfMkruS.js +1 -0
- package/dist/control-web/assets/csv-fuZLfV_i.js +1 -0
- package/dist/control-web/assets/cue-D82EKSYY.js +1 -0
- package/dist/control-web/assets/cynefin-VYW2F7L2-BsyMhvG0.js +178 -0
- package/dist/control-web/assets/cynefinDiagram-TSTJHNR4-DwY43f3-.js +62 -0
- package/dist/control-web/assets/cypher-COkxafJQ.js +1 -0
- package/dist/control-web/assets/cytoscape.esm-DTSO7Bv0.js +331 -0
- package/dist/control-web/assets/d-85-TOEBH.js +1 -0
- package/dist/control-web/assets/dagre-VKFMJZFB-CP1xk7Ox.js +4 -0
- package/dist/control-web/assets/dark-plus-C3mMm8J8.js +1 -0
- package/dist/control-web/assets/dart-CF10PKvl.js +1 -0
- package/dist/control-web/assets/dax-CEL-wOlO.js +1 -0
- package/dist/control-web/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/dist/control-web/assets/desktop-BmXAJ9_W.js +1 -0
- package/dist/control-web/assets/diagram-FQU43EPY-D_yRnH1b.js +3 -0
- package/dist/control-web/assets/diagram-G47NLZAW-DpTmLmbm.js +24 -0
- package/dist/control-web/assets/diagram-NH7WQ7WH-Wh_P26Dr.js +24 -0
- package/dist/control-web/assets/diagram-OA4YK3LP-BMMaO78f.js +30 -0
- package/dist/control-web/assets/diagram-WEI45ONY-D8smty9F.js +41 -0
- package/dist/control-web/assets/diff-D97Zzqfu.js +1 -0
- package/dist/control-web/assets/docker-BcOcwvcX.js +1 -0
- package/dist/control-web/assets/dotenv-Da5cRb03.js +1 -0
- package/dist/control-web/assets/dracula-BzJJZx-M.js +1 -0
- package/dist/control-web/assets/dracula-soft-BXkSAIEj.js +1 -0
- package/dist/control-web/assets/dream-maker-BtqSS_iP.js +1 -0
- package/dist/control-web/assets/ebnfDiagram-CCIWWBDH-BqVsmEYh.js +1 -0
- package/dist/control-web/assets/edge-BkV0erSs.js +1 -0
- package/dist/control-web/assets/elixir-CDX3lj18.js +1 -0
- package/dist/control-web/assets/elm-DbKCFpqz.js +1 -0
- package/dist/control-web/assets/emacs-lisp-C9XAeP06.js +1 -0
- package/dist/control-web/assets/erDiagram-Q63AITRT-CxaumIzW.js +85 -0
- package/dist/control-web/assets/erb-B12qg9BL.js +1 -0
- package/dist/control-web/assets/erlang-DsQrWhSR.js +1 -0
- package/dist/control-web/assets/everforest-dark-BgDCqdQA.js +1 -0
- package/dist/control-web/assets/everforest-light-C8M2exoo.js +1 -0
- package/dist/control-web/assets/fennel-BYunw83y.js +1 -0
- package/dist/control-web/assets/fish-BvzEVeQv.js +1 -0
- package/dist/control-web/assets/flowDiagram-23GEKE2U-DZhUBne-.js +156 -0
- package/dist/control-web/assets/fluent-C4IJs8-o.js +1 -0
- package/dist/control-web/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
- package/dist/control-web/assets/fortran-free-form-BxgE0vQu.js +1 -0
- package/dist/control-web/assets/fsharp-CXgrBDvD.js +1 -0
- package/dist/control-web/assets/ganttDiagram-NO4QXBWP-B20dY8SF.js +292 -0
- package/dist/control-web/assets/gdresource-BOOCDP_w.js +1 -0
- package/dist/control-web/assets/gdscript-C5YyOfLZ.js +1 -0
- package/dist/control-web/assets/gdshader-DkwncUOv.js +1 -0
- package/dist/control-web/assets/genie-D0YGMca9.js +1 -0
- package/dist/control-web/assets/gherkin-DyxjwDmM.js +1 -0
- package/dist/control-web/assets/git-commit-F4YmCXRG.js +1 -0
- package/dist/control-web/assets/git-rebase-r7XF79zn.js +1 -0
- package/dist/control-web/assets/gitGraphDiagram-IHSO6WYX-CAlnqFfW.js +106 -0
- package/dist/control-web/assets/github-dark-DHJKELXO.js +1 -0
- package/dist/control-web/assets/github-dark-default-Cuk6v7N8.js +1 -0
- package/dist/control-web/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
- package/dist/control-web/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
- package/dist/control-web/assets/github-light-DAi9KRSo.js +1 -0
- package/dist/control-web/assets/github-light-default-D7oLnXFd.js +1 -0
- package/dist/control-web/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
- package/dist/control-web/assets/gleam-BspZqrRM.js +1 -0
- package/dist/control-web/assets/glimmer-js-Rg0-pVw9.js +1 -0
- package/dist/control-web/assets/glimmer-ts-U6CK756n.js +1 -0
- package/dist/control-web/assets/glsl-DplSGwfg.js +1 -0
- package/dist/control-web/assets/gn-n2N0HUVH.js +1 -0
- package/dist/control-web/assets/gnuplot-DdkO51Og.js +1 -0
- package/dist/control-web/assets/go-CxLEBnE3.js +1 -0
- package/dist/control-web/assets/graph-C9eacEi8.js +1 -0
- package/dist/control-web/assets/graphql-ChdNCCLP.js +1 -0
- package/dist/control-web/assets/groovy-gcz8RCvz.js +1 -0
- package/dist/control-web/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
- package/dist/control-web/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
- package/dist/control-web/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
- package/dist/control-web/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
- package/dist/control-web/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
- package/dist/control-web/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
- package/dist/control-web/assets/hack-CaT9iCJl.js +1 -0
- package/dist/control-web/assets/haml-B8DHNrY2.js +1 -0
- package/dist/control-web/assets/handlebars-BL8al0AC.js +1 -0
- package/dist/control-web/assets/haskell-Df6bDoY_.js +1 -0
- package/dist/control-web/assets/haxe-CzTSHFRz.js +1 -0
- package/dist/control-web/assets/hcl-BWvSN4gD.js +1 -0
- package/dist/control-web/assets/{highlighted-body-OFNGDK62-DWWsUtHF.js → highlighted-body-OFNGDK62-vBlGjC8F.js} +1 -1
- package/dist/control-web/assets/hjson-D5-asLiD.js +1 -0
- package/dist/control-web/assets/hlsl-D3lLCCz7.js +1 -0
- package/dist/control-web/assets/horizon-BUw7H-hv.js +1 -0
- package/dist/control-web/assets/horizon-bright-Cn-bp-IR.js +1 -0
- package/dist/control-web/assets/houston-DnULxvSX.js +1 -0
- package/dist/control-web/assets/html-GMplVEZG.js +1 -0
- package/dist/control-web/assets/html-derivative-BFtXZ54Q.js +1 -0
- package/dist/control-web/assets/http-jrhK8wxY.js +1 -0
- package/dist/control-web/assets/hurl-irOxFIW8.js +1 -0
- package/dist/control-web/assets/hxml-Bvhsp5Yf.js +1 -0
- package/dist/control-web/assets/hy-DFXneXwc.js +1 -0
- package/dist/control-web/assets/imba-DGztddWO.js +1 -0
- package/dist/control-web/assets/index-B3g4Kfko.js +153 -0
- package/dist/control-web/assets/index-BKqZNg1a.js +718 -0
- package/dist/control-web/assets/index-CZrE_F_i.css +32 -0
- package/dist/control-web/assets/infoDiagram-FWYZ7A6U-PaEyeSke.js +2 -0
- package/dist/control-web/assets/ini-BEwlwnbL.js +1 -0
- package/dist/control-web/assets/init-Gi6I4Gst.js +1 -0
- package/dist/control-web/assets/ishikawaDiagram-FXEZZL3T-BwsgPXGC.js +70 -0
- package/dist/control-web/assets/java-CylS5w8V.js +1 -0
- package/dist/control-web/assets/javascript-wDzz0qaB.js +1 -0
- package/dist/control-web/assets/jinja-4LBKfQ-Z.js +1 -0
- package/dist/control-web/assets/jison-wvAkD_A8.js +1 -0
- package/dist/control-web/assets/journeyDiagram-5HDEW3XC-BUEf1NEq.js +139 -0
- package/dist/control-web/assets/json-Cp-IABpG.js +1 -0
- package/dist/control-web/assets/json5-C9tS-k6U.js +1 -0
- package/dist/control-web/assets/jsonc-Des-eS-w.js +1 -0
- package/dist/control-web/assets/jsonl-DcaNXYhu.js +1 -0
- package/dist/control-web/assets/jsonnet-DFQXde-d.js +1 -0
- package/dist/control-web/assets/jssm-C2t-YnRu.js +1 -0
- package/dist/control-web/assets/jsx-g9-lgVsj.js +1 -0
- package/dist/control-web/assets/julia-CxzCAyBv.js +1 -0
- package/dist/control-web/assets/just-Cw27pwNe.js +1 -0
- package/dist/control-web/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
- package/dist/control-web/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
- package/dist/control-web/assets/kanagawa-wave-DWedfzmr.js +1 -0
- package/dist/control-web/assets/kanban-definition-HUTT4EX6-CiTCwnJ7.js +89 -0
- package/dist/control-web/assets/kdl-DV7GczEv.js +1 -0
- package/dist/control-web/assets/kotlin-BdnUsdx6.js +1 -0
- package/dist/control-web/assets/kusto-DZf3V79B.js +1 -0
- package/dist/control-web/assets/laserwave-DUszq2jm.js +1 -0
- package/dist/control-web/assets/latex-CWtU0Tv5.js +1 -0
- package/dist/control-web/assets/layout-DEXfKzaS.js +1 -0
- package/dist/control-web/assets/lean-BZvkOJ9d.js +1 -0
- package/dist/control-web/assets/less-B1dDrJ26.js +1 -0
- package/dist/control-web/assets/light-plus-B7mTdjB0.js +1 -0
- package/dist/control-web/assets/linear-Cs4GSPvX.js +1 -0
- package/dist/control-web/assets/liquid-DYVedYrR.js +1 -0
- package/dist/control-web/assets/llvm-DjAJT7YJ.js +1 -0
- package/dist/control-web/assets/log-2UxHyX5q.js +1 -0
- package/dist/control-web/assets/logo-BtOb2qkB.js +1 -0
- package/dist/control-web/assets/lua-BaeVxFsk.js +1 -0
- package/dist/control-web/assets/luau-C-HG3fhB.js +1 -0
- package/dist/control-web/assets/make-CHLpvVh8.js +1 -0
- package/dist/control-web/assets/map-Czzmt4hB.js +1 -0
- package/dist/control-web/assets/markdown-Cvjx9yec.js +1 -0
- package/dist/control-web/assets/marko-CnJfTvn9.js +1 -0
- package/dist/control-web/assets/material-theme-D5KoaKCx.js +1 -0
- package/dist/control-web/assets/material-theme-darker-BfHTSMKl.js +1 -0
- package/dist/control-web/assets/material-theme-lighter-B0m2ddpp.js +1 -0
- package/dist/control-web/assets/material-theme-ocean-CyktbL80.js +1 -0
- package/dist/control-web/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
- package/dist/control-web/assets/matlab-D7o27uSR.js +1 -0
- package/dist/control-web/assets/mdc-BMNejdWA.js +1 -0
- package/dist/control-web/assets/mdx-Cmh6b_Ma.js +1 -0
- package/dist/control-web/assets/mermaid-GHXKKRXX-BYZTj3zW.css +1 -0
- package/dist/control-web/assets/mermaid-GHXKKRXX-C_lUqoOB.js +710 -0
- package/dist/control-web/assets/mermaid-mWjccvbQ.js +1 -0
- package/dist/control-web/assets/min-dark-CafNBF8u.js +1 -0
- package/dist/control-web/assets/min-light-CTRr51gU.js +1 -0
- package/dist/control-web/assets/mindmap-definition-LN4V7U3C-B8TkylOR.js +96 -0
- package/dist/control-web/assets/mipsasm-CKIfxQSi.js +1 -0
- package/dist/control-web/assets/mojo-rZm6bMo-.js +1 -0
- package/dist/control-web/assets/monokai-D4h5O-jR.js +1 -0
- package/dist/control-web/assets/moonbit-_H4v1dQx.js +1 -0
- package/dist/control-web/assets/move-IF9eRakj.js +1 -0
- package/dist/control-web/assets/narrat-DRg8JJMk.js +1 -0
- package/dist/control-web/assets/nextflow-Zz6hmt5N.js +1 -0
- package/dist/control-web/assets/nextflow-groovy-BeH2EWoN.js +1 -0
- package/dist/control-web/assets/nginx-BpAMiNFr.js +1 -0
- package/dist/control-web/assets/night-owl-C39BiMTA.js +1 -0
- package/dist/control-web/assets/night-owl-light-CMTm3GFP.js +1 -0
- package/dist/control-web/assets/nim-CVrawwO9.js +1 -0
- package/dist/control-web/assets/nix-CwoSXNpI.js +1 -0
- package/dist/control-web/assets/nord-Ddv68eIx.js +1 -0
- package/dist/control-web/assets/nushell-Cz2AlsmD.js +1 -0
- package/dist/control-web/assets/objective-c-DXmwc3jG.js +1 -0
- package/dist/control-web/assets/objective-cpp-CLxacb5B.js +1 -0
- package/dist/control-web/assets/ocaml-C0hk2d4L.js +1 -0
- package/dist/control-web/assets/odin-BBf5iR-q.js +1 -0
- package/dist/control-web/assets/one-dark-pro-DVMEJ2y_.js +1 -0
- package/dist/control-web/assets/one-light-C3Wv6jpd.js +1 -0
- package/dist/control-web/assets/openscad-C4EeE6gA.js +1 -0
- package/dist/control-web/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dist/control-web/assets/pascal-D93ZcfNL.js +1 -0
- package/dist/control-web/assets/pegDiagram-2B236MQR-Bnge_jzz.js +1 -0
- package/dist/control-web/assets/perl-C0TMdlhV.js +1 -0
- package/dist/control-web/assets/php-Dhbhpdrm.js +1 -0
- package/dist/control-web/assets/pieDiagram-ENE6RG2P-DOP7FAKG.js +39 -0
- package/dist/control-web/assets/pkl-u5AG7uiY.js +1 -0
- package/dist/control-web/assets/plastic-3e1v2bzS.js +1 -0
- package/dist/control-web/assets/plsql-ChMvpjG-.js +1 -0
- package/dist/control-web/assets/po-BTJTHyun.js +1 -0
- package/dist/control-web/assets/poimandres-CS3Unz2-.js +1 -0
- package/dist/control-web/assets/polar-C0HS_06l.js +1 -0
- package/dist/control-web/assets/postcss-CXtECtnM.js +1 -0
- package/dist/control-web/assets/powerquery-CEu0bR-o.js +1 -0
- package/dist/control-web/assets/powershell-Dpen1YoG.js +1 -0
- package/dist/control-web/assets/prisma-Dd19v3D-.js +1 -0
- package/dist/control-web/assets/prolog-CbFg5uaA.js +1 -0
- package/dist/control-web/assets/proto-C7zT0LnQ.js +1 -0
- package/dist/control-web/assets/pug-CGlum2m_.js +1 -0
- package/dist/control-web/assets/puppet-BMWR74SV.js +1 -0
- package/dist/control-web/assets/purescript-CklMAg4u.js +1 -0
- package/dist/control-web/assets/python-B6aJPvgy.js +1 -0
- package/dist/control-web/assets/qml-3beO22l8.js +1 -0
- package/dist/control-web/assets/qmldir-C8lEn-DE.js +1 -0
- package/dist/control-web/assets/qss-IeuSbFQv.js +1 -0
- package/dist/control-web/assets/quadrantDiagram-ABIIQ3AL-Cqqu5uu-.js +7 -0
- package/dist/control-web/assets/r-Dspwwk_N.js +1 -0
- package/dist/control-web/assets/racket-BqYA7rlc.js +1 -0
- package/dist/control-web/assets/railroadDiagram-RFXS5EU6-1bk56BMW.js +1 -0
- package/dist/control-web/assets/raku-DXvB9xmW.js +1 -0
- package/dist/control-web/assets/razor-Uh8Bk_45.js +1 -0
- package/dist/control-web/assets/red-bN70gL4F.js +1 -0
- package/dist/control-web/assets/reg-C-SQnVFl.js +1 -0
- package/dist/control-web/assets/regexp-CDVJQ6XC.js +1 -0
- package/dist/control-web/assets/rel-C3B-1QV4.js +1 -0
- package/dist/control-web/assets/requirementDiagram-TGXJPOKE-BHVwG79A.js +84 -0
- package/dist/control-web/assets/riscv-BM1_JUlF.js +1 -0
- package/dist/control-web/assets/ron-D8l8udqQ.js +1 -0
- package/dist/control-web/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
- package/dist/control-web/assets/rose-pine-moon-D4_iv3hh.js +1 -0
- package/dist/control-web/assets/rose-pine-qdsjHGoJ.js +1 -0
- package/dist/control-web/assets/rosmsg-BJDFO7_C.js +1 -0
- package/dist/control-web/assets/rst-BrH8l1NY.js +1 -0
- package/dist/control-web/assets/ruby-Dw2BHqvy.js +1 -0
- package/dist/control-web/assets/rust-B1yitclQ.js +1 -0
- package/dist/control-web/assets/sankeyDiagram-HTMAVEWB-ghjBFqfs.js +40 -0
- package/dist/control-web/assets/sas-cz2c8ADy.js +1 -0
- package/dist/control-web/assets/sass-Cj5Yp3dK.js +1 -0
- package/dist/control-web/assets/scala-C151Ov-r.js +1 -0
- package/dist/control-web/assets/scheme-C98Dy4si.js +1 -0
- package/dist/control-web/assets/scss-OYdSNvt2.js +1 -0
- package/dist/control-web/assets/sdbl-DVxCFoDh.js +1 -0
- package/dist/control-web/assets/sequenceDiagram-DBY2YBRQ-DChtyqq5.js +162 -0
- package/dist/control-web/assets/shaderlab-Dg9Lc6iA.js +1 -0
- package/dist/control-web/assets/shellscript-Yzrsuije.js +1 -0
- package/dist/control-web/assets/shellsession-BADoaaVG.js +1 -0
- package/dist/control-web/assets/sizeCapture-X5ZJPWSS-BNp94nCS.js +1 -0
- package/dist/control-web/assets/slack-dark-BthQWCQV.js +1 -0
- package/dist/control-web/assets/slack-ochin-DqwNpetd.js +1 -0
- package/dist/control-web/assets/smalltalk-BERRCDM3.js +1 -0
- package/dist/control-web/assets/snazzy-light-Bw305WKR.js +1 -0
- package/dist/control-web/assets/solarized-dark-DXbdFlpD.js +1 -0
- package/dist/control-web/assets/solarized-light-L9t79GZl.js +1 -0
- package/dist/control-web/assets/solidity-rGO070M0.js +1 -0
- package/dist/control-web/assets/soy-Brmx7dQM.js +1 -0
- package/dist/control-web/assets/sparql-rVzFXLq3.js +1 -0
- package/dist/control-web/assets/splunk-BtCnVYZw.js +1 -0
- package/dist/control-web/assets/sql-BLtJtn59.js +1 -0
- package/dist/control-web/assets/ssh-config-_ykCGR6B.js +1 -0
- package/dist/control-web/assets/stata-BH5u7GGu.js +1 -0
- package/dist/control-web/assets/stateDiagram-2N3HPSRC-CaFYkZZ2.js +1 -0
- package/dist/control-web/assets/stateDiagram-v2-6OUMAXLB-CCvEZFYI.js +1 -0
- package/dist/control-web/assets/stylus-BEDo0Tqx.js +1 -0
- package/dist/control-web/assets/surrealql-Bq5Q-fJD.js +1 -0
- package/dist/control-web/assets/svelte-C_ipcX3V.js +1 -0
- package/dist/control-web/assets/swift-D82vCrfD.js +1 -0
- package/dist/control-web/assets/swimlanes-5IMT3BWC-CV2YWeYv.js +2 -0
- package/dist/control-web/assets/swimlanesDiagram-G3AALYLV-BFAdJHEB.js +8 -0
- package/dist/control-web/assets/synthwave-84-CbfX1IO0.js +1 -0
- package/dist/control-web/assets/system-verilog-CnnmHF94.js +1 -0
- package/dist/control-web/assets/systemd-4A_iFExJ.js +1 -0
- package/dist/control-web/assets/talonscript-CkByrt1z.js +1 -0
- package/dist/control-web/assets/tasl-QIJgUcNo.js +1 -0
- package/dist/control-web/assets/tcl-dwOrl1Do.js +1 -0
- package/dist/control-web/assets/templ-P3uqSqPl.js +1 -0
- package/dist/control-web/assets/terraform-BETggiCN.js +1 -0
- package/dist/control-web/assets/tex-idrVyKtj.js +1 -0
- package/dist/control-web/assets/timeline-definition-FHXFAJF6-Cq32UWLH.js +120 -0
- package/dist/control-web/assets/tokyo-night-hegEt444.js +1 -0
- package/dist/control-web/assets/toml-vGWfd6FD.js +1 -0
- package/dist/control-web/assets/ts-tags-zn1MmPIZ.js +1 -0
- package/dist/control-web/assets/tsv-B_m7g4N7.js +1 -0
- package/dist/control-web/assets/tsx-COt5Ahok.js +1 -0
- package/dist/control-web/assets/turtle-BsS91CYL.js +1 -0
- package/dist/control-web/assets/twig-DNn4PbVi.js +1 -0
- package/dist/control-web/assets/typescript-BPQ3VLAy.js +1 -0
- package/dist/control-web/assets/typespec-BGHnOYBU.js +1 -0
- package/dist/control-web/assets/typst-DHCkPAjA.js +1 -0
- package/dist/control-web/assets/v-BcVCzyr7.js +1 -0
- package/dist/control-web/assets/vala-CsfeWuGM.js +1 -0
- package/dist/control-web/assets/vb-D17OF-Vu.js +1 -0
- package/dist/control-web/assets/vennDiagram-L72KCM5P-BgBoqPth.js +34 -0
- package/dist/control-web/assets/verilog-BQ8w6xss.js +1 -0
- package/dist/control-web/assets/vesper-DU1UobuO.js +1 -0
- package/dist/control-web/assets/vhdl-CeAyd5Ju.js +1 -0
- package/dist/control-web/assets/viml-CJc9bBzg.js +1 -0
- package/dist/control-web/assets/vitesse-black-Bkuqu6BP.js +1 -0
- package/dist/control-web/assets/vitesse-dark-D0r3Knsf.js +1 -0
- package/dist/control-web/assets/vitesse-light-CVO1_9PV.js +1 -0
- package/dist/control-web/assets/vue-DN_0RTcg.js +1 -0
- package/dist/control-web/assets/vue-html-AaS7Mt5G.js +1 -0
- package/dist/control-web/assets/vue-vine-CQOfvN7w.js +1 -0
- package/dist/control-web/assets/vyper-CDx5xZoG.js +1 -0
- package/dist/control-web/assets/wardleyDiagram-EHGQE667-VsC2Gfpu.js +78 -0
- package/dist/control-web/assets/wasm-CG6Dc4jp.js +1 -0
- package/dist/control-web/assets/wasm-MzD3tlZU.js +1 -0
- package/dist/control-web/assets/wenyan-BV7otONQ.js +1 -0
- package/dist/control-web/assets/wgsl-Dx-B1_4e.js +1 -0
- package/dist/control-web/assets/wikitext-BhOHFoWU.js +1 -0
- package/dist/control-web/assets/wit-5i3qLPDT.js +1 -0
- package/dist/control-web/assets/wolfram-lXgVvXCa.js +1 -0
- package/dist/control-web/assets/xml-sdJ4AIDG.js +1 -0
- package/dist/control-web/assets/xsl-CtQFsRM5.js +1 -0
- package/dist/control-web/assets/xychartDiagram-FW5EYKEG-CyFiAunt.js +7 -0
- package/dist/control-web/assets/yaml-Buea-lGh.js +1 -0
- package/dist/control-web/assets/zenscript-DVFEvuxE.js +1 -0
- package/dist/control-web/assets/zig-VOosw3JB.js +1 -0
- package/dist/control-web/index.html +2 -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 +3 -1
- package/dist/desktop-browser-host.js +39 -4
- package/dist/machine-session-service.d.ts +94 -15
- package/dist/machine-session-service.js +700 -86
- package/dist/remote-runtime-dispatcher.d.ts +2 -2
- package/dist/remote-runtime-dispatcher.js +42 -2
- package/dist/remote-runtime-session-projection.d.ts +1 -0
- package/dist/remote-runtime-session-projection.js +6 -0
- package/dist/server.d.ts +47 -8
- package/dist/server.js +291 -47
- package/dist/session-browser-service.d.ts +24 -4
- package/dist/session-browser-service.js +127 -1
- package/dist/session-pending-inputs.d.ts +40 -0
- package/dist/session-pending-inputs.js +84 -0
- package/dist/session-portal.d.ts +54 -0
- package/dist/session-portal.js +983 -0
- package/dist/session-runtime-index.d.ts +2 -6
- package/dist/session-runtime-index.js +70 -38
- package/dist/terminal-ws.js +8 -6
- package/package.json +7 -7
- package/dist/control-web/assets/index-BnX7NWJX.js +0 -689
- package/dist/control-web/assets/index-CUoWRX2i.css +0 -32
- package/dist/control-web/assets/mermaid-GHXKKRXX-C1fxAgiw.js +0 -131
|
@@ -1,5 +1,5 @@
|
|
|
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 { RUNTIME_BROWSER_MAX_PAGES, parseRuntimeBrowserRequestHeadersGetParams, parseRuntimeBrowserRequestHeadersSetParams, parseRuntimeBrowserCloseParams, parseRuntimeBrowserOpenParams, parseRuntimeBrowserPageCreateParams, parseRuntimeBrowserPageMutationParams, parseRuntimeBrowserPageNavigateParams, parseRuntimeBrowserState, parseRuntimeBrowserStateGetParams, } from "@rynx-ai/protocol/runtime-browser";
|
|
3
3
|
import { parseRuntimeBrowserEndpointDescriptor, } from "@rynx-ai/protocol/runtime-browser-bootstrap";
|
|
4
4
|
const MAX_HOST_PAGE_ID_CHARS = 2_048;
|
|
5
5
|
const MAX_PAGE_ID_FACTORY_ATTEMPTS = 64;
|
|
@@ -37,11 +37,14 @@ export class SessionBrowserService {
|
|
|
37
37
|
ports;
|
|
38
38
|
records = new Map();
|
|
39
39
|
generations = new Map();
|
|
40
|
+
requestHeaderPolicies = new Map();
|
|
40
41
|
queues = new Map();
|
|
41
42
|
deletingSessions = new Set();
|
|
42
43
|
observers = new Set();
|
|
43
44
|
pageIdFactory;
|
|
44
45
|
bootGenerationSeed;
|
|
46
|
+
requestHeaderRevisionSeed;
|
|
47
|
+
requestHeaderRevision = 0;
|
|
45
48
|
admissionReserve;
|
|
46
49
|
shuttingDown = false;
|
|
47
50
|
closeAllPromise;
|
|
@@ -49,12 +52,17 @@ export class SessionBrowserService {
|
|
|
49
52
|
this.ports = ports;
|
|
50
53
|
this.pageIdFactory = options.pageIdFactory ?? (() => `page_${randomUUID()}`);
|
|
51
54
|
this.bootGenerationSeed = options.bootGenerationSeed ?? randomBootGenerationSeed();
|
|
55
|
+
this.requestHeaderRevisionSeed = options.requestHeaderRevisionSeed ??
|
|
56
|
+
randomBytes(16).toString("base64url");
|
|
52
57
|
this.admissionReserve = options.admissionReserve;
|
|
53
58
|
if (!Number.isSafeInteger(this.bootGenerationSeed) ||
|
|
54
59
|
this.bootGenerationSeed < 0 ||
|
|
55
60
|
this.bootGenerationSeed >= Number.MAX_SAFE_INTEGER) {
|
|
56
61
|
throw new Error("Browser boot generation seed must be a nonnegative safe integer");
|
|
57
62
|
}
|
|
63
|
+
if (!/^[A-Za-z0-9_-]{16,128}$/.test(this.requestHeaderRevisionSeed)) {
|
|
64
|
+
throw new Error("Browser request Header revision seed must be an opaque 16-128 character token");
|
|
65
|
+
}
|
|
58
66
|
}
|
|
59
67
|
/** Number of Session Browsers that still own a physical Host handle. */
|
|
60
68
|
activeBrowserCount() {
|
|
@@ -144,6 +152,70 @@ export class SessionBrowserService {
|
|
|
144
152
|
return this.project(record);
|
|
145
153
|
});
|
|
146
154
|
}
|
|
155
|
+
async getRequestHeaders(input) {
|
|
156
|
+
const params = parseInput(() => parseRuntimeBrowserRequestHeadersGetParams(input), "Browser request headers read is invalid");
|
|
157
|
+
return this.exclusive(params.sessionId, async () => {
|
|
158
|
+
this.ensureRunning();
|
|
159
|
+
await this.ensureSessionExists(params.sessionId);
|
|
160
|
+
return cloneRequestHeadersPolicy(this.currentRequestHeaders(params.sessionId));
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
async setRequestHeaders(input) {
|
|
164
|
+
const params = parseInput(() => parseRuntimeBrowserRequestHeadersSetParams(input), "Browser request headers update is invalid");
|
|
165
|
+
return this.exclusive(params.sessionId, async () => {
|
|
166
|
+
this.ensureRunning();
|
|
167
|
+
await this.ensureSessionExists(params.sessionId);
|
|
168
|
+
const current = this.currentRequestHeaders(params.sessionId);
|
|
169
|
+
if (params.expectedRevision !== current.revision) {
|
|
170
|
+
throw new SessionBrowserServiceError("revision_mismatch", "Browser request headers changed since they were read");
|
|
171
|
+
}
|
|
172
|
+
const nextConfig = {
|
|
173
|
+
enabled: params.enabled,
|
|
174
|
+
headers: params.headers.map((header) => ({ ...header })),
|
|
175
|
+
};
|
|
176
|
+
if (sameRequestHeadersConfig(current, nextConfig)) {
|
|
177
|
+
return cloneRequestHeadersPolicy(current);
|
|
178
|
+
}
|
|
179
|
+
// Reserve the next token before touching a live Host so revision-space
|
|
180
|
+
// exhaustion can never turn a successfully applied policy into an
|
|
181
|
+
// uncommitted outcome. Gaps after Host failure are harmless.
|
|
182
|
+
const nextRevision = this.nextRequestHeadersRevision();
|
|
183
|
+
const record = this.records.get(params.sessionId);
|
|
184
|
+
if (record && record.status !== "ready") {
|
|
185
|
+
await this.closeUnavailableForRecreate(record);
|
|
186
|
+
}
|
|
187
|
+
else if (record && !sameEffectiveRequestHeaders(current, nextConfig)) {
|
|
188
|
+
try {
|
|
189
|
+
await record.handle.setRequestHeaders(nextConfig);
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
// A definite compatibility rejection did not touch the live Host.
|
|
193
|
+
// Preserve both the current Browser and committed policy so callers
|
|
194
|
+
// can upgrade the Host or close/reopen explicitly without data loss.
|
|
195
|
+
if (error instanceof SessionBrowserHostError && error.code === "unsupported") {
|
|
196
|
+
throw mapHostError(error, "Browser Host does not support request headers");
|
|
197
|
+
}
|
|
198
|
+
record.status = "unavailable";
|
|
199
|
+
try {
|
|
200
|
+
await record.handle.close();
|
|
201
|
+
if (this.records.get(params.sessionId) === record) {
|
|
202
|
+
this.records.delete(params.sessionId);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch (closeError) {
|
|
206
|
+
throw new SessionBrowserServiceError("outcome_unknown", "Browser request headers may have been partially applied", { cause: new AggregateError([error, closeError]) });
|
|
207
|
+
}
|
|
208
|
+
throw mapHostError(error, "Browser Host rejected the request headers update");
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const policy = {
|
|
212
|
+
...nextConfig,
|
|
213
|
+
revision: nextRevision,
|
|
214
|
+
};
|
|
215
|
+
this.requestHeaderPolicies.set(params.sessionId, policy);
|
|
216
|
+
return cloneRequestHeadersPolicy(policy);
|
|
217
|
+
});
|
|
218
|
+
}
|
|
147
219
|
/**
|
|
148
220
|
* Runtime-local automation handoff. This method is deliberately absent from
|
|
149
221
|
* RemoteRuntimeBrowserHost and Direct RPC so a CDP endpoint cannot cross a
|
|
@@ -314,6 +386,9 @@ export class SessionBrowserService {
|
|
|
314
386
|
this.deletingSessions.add(parsed);
|
|
315
387
|
await this.exclusive(parsed, async () => {
|
|
316
388
|
const failures = [];
|
|
389
|
+
// Header values are runtime-only and may be sensitive. Forget them as
|
|
390
|
+
// soon as deletion owns the Session, even if physical cleanup fails.
|
|
391
|
+
this.requestHeaderPolicies.delete(parsed);
|
|
317
392
|
const record = this.records.get(parsed);
|
|
318
393
|
if (record) {
|
|
319
394
|
record.status = "closing";
|
|
@@ -367,6 +442,9 @@ export class SessionBrowserService {
|
|
|
367
442
|
}, true)));
|
|
368
443
|
}
|
|
369
444
|
await Promise.allSettled([...this.observers]);
|
|
445
|
+
// Values may be sensitive. Once the service is fenced they have no valid
|
|
446
|
+
// reader, so do not retain them for the rest of a graceful process exit.
|
|
447
|
+
this.requestHeaderPolicies.clear();
|
|
370
448
|
if (failures.length > 0) {
|
|
371
449
|
throw new SessionBrowserServiceError("host_failure", "One or more Browsers did not close during shutdown", { cause: failures[0] });
|
|
372
450
|
}
|
|
@@ -384,6 +462,7 @@ export class SessionBrowserService {
|
|
|
384
462
|
handle = await this.ports.host.createBrowser({
|
|
385
463
|
sessionId: params.sessionId,
|
|
386
464
|
browserGeneration,
|
|
465
|
+
requestHeaders: cloneRequestHeadersConfig(this.currentRequestHeaders(params.sessionId)),
|
|
387
466
|
...(params.url === undefined ? {} : { url: params.url }),
|
|
388
467
|
});
|
|
389
468
|
}
|
|
@@ -455,6 +534,20 @@ export class SessionBrowserService {
|
|
|
455
534
|
}
|
|
456
535
|
return admission;
|
|
457
536
|
}
|
|
537
|
+
currentRequestHeaders(sessionId) {
|
|
538
|
+
return this.requestHeaderPolicies.get(sessionId) ?? {
|
|
539
|
+
enabled: false,
|
|
540
|
+
headers: [],
|
|
541
|
+
revision: `${this.requestHeaderRevisionSeed}.0`,
|
|
542
|
+
};
|
|
543
|
+
}
|
|
544
|
+
nextRequestHeadersRevision() {
|
|
545
|
+
if (this.requestHeaderRevision >= Number.MAX_SAFE_INTEGER) {
|
|
546
|
+
throw new SessionBrowserServiceError("capacity", "Browser request headers revision space is exhausted");
|
|
547
|
+
}
|
|
548
|
+
this.requestHeaderRevision += 1;
|
|
549
|
+
return `${this.requestHeaderRevisionSeed}.${this.requestHeaderRevision.toString(36)}`;
|
|
550
|
+
}
|
|
458
551
|
async closeUnavailableForRecreate(record) {
|
|
459
552
|
record.status = "closing";
|
|
460
553
|
try {
|
|
@@ -768,12 +861,45 @@ function mapHostError(error, fallbackMessage) {
|
|
|
768
861
|
if (error.code === "outcome_unknown") {
|
|
769
862
|
return new SessionBrowserServiceError("outcome_unknown", "Browser Host operation outcome is unknown", { cause: error });
|
|
770
863
|
}
|
|
864
|
+
if (error.code === "unsupported") {
|
|
865
|
+
return new SessionBrowserServiceError("unsupported", "Browser Host does not support this operation", { cause: error });
|
|
866
|
+
}
|
|
771
867
|
return new SessionBrowserServiceError("unavailable", "Browser Host is unavailable", {
|
|
772
868
|
cause: error,
|
|
773
869
|
});
|
|
774
870
|
}
|
|
775
871
|
return new SessionBrowserServiceError("host_failure", fallbackMessage, { cause: error });
|
|
776
872
|
}
|
|
873
|
+
function cloneRequestHeadersConfig(config) {
|
|
874
|
+
return {
|
|
875
|
+
enabled: config.enabled,
|
|
876
|
+
headers: config.headers.map((header) => ({ ...header })),
|
|
877
|
+
};
|
|
878
|
+
}
|
|
879
|
+
function cloneRequestHeadersPolicy(policy) {
|
|
880
|
+
return {
|
|
881
|
+
...cloneRequestHeadersConfig(policy),
|
|
882
|
+
revision: policy.revision,
|
|
883
|
+
};
|
|
884
|
+
}
|
|
885
|
+
function sameRequestHeadersConfig(left, right) {
|
|
886
|
+
return left.enabled === right.enabled && sameRequestHeaderRows(left.headers, right.headers, true);
|
|
887
|
+
}
|
|
888
|
+
function sameEffectiveRequestHeaders(left, right) {
|
|
889
|
+
return sameRequestHeaderRows(left.enabled ? left.headers : [], right.enabled ? right.headers : [], false);
|
|
890
|
+
}
|
|
891
|
+
function sameRequestHeaderRows(left, right, preserveNameCase) {
|
|
892
|
+
if (left.length !== right.length)
|
|
893
|
+
return false;
|
|
894
|
+
return left.every((header, index) => {
|
|
895
|
+
const candidate = right[index];
|
|
896
|
+
return candidate !== undefined &&
|
|
897
|
+
(preserveNameCase
|
|
898
|
+
? header.name === candidate.name
|
|
899
|
+
: header.name.toLowerCase() === candidate.name.toLowerCase()) &&
|
|
900
|
+
header.value === candidate.value;
|
|
901
|
+
});
|
|
902
|
+
}
|
|
777
903
|
function validateHostPageId(value) {
|
|
778
904
|
if (typeof value !== "string" ||
|
|
779
905
|
value.length === 0 ||
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
resolveOldest(sessionId: string): MachineSessionDrainedInput | undefined;
|
|
17
|
+
findByClientMessageId(sessionId: string, clientMessageId: string): MachineSessionPendingInput | undefined;
|
|
18
|
+
snapshotFor(sessionId: string): MachineSessionPendingInput[];
|
|
19
|
+
deleteSession(sessionId: string): void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Process-live FIFO of web-composer inputs awaiting their native transcript
|
|
23
|
+
* echo. The message is deliberately not persisted when the send POST succeeds:
|
|
24
|
+
* the Provider transcript remains the sole durable writer. This index only
|
|
25
|
+
* keeps the temporary bubble recoverable across page rebinds until that echo
|
|
26
|
+
* arrives.
|
|
27
|
+
*/
|
|
28
|
+
export declare class SessionPendingInputIndex implements MachineSessionPendingInputPort {
|
|
29
|
+
private readonly ttlMs;
|
|
30
|
+
private readonly now;
|
|
31
|
+
private readonly entries;
|
|
32
|
+
constructor(ttlMs?: number, now?: () => number);
|
|
33
|
+
record(sessionId: string, input: MachineSessionPendingInputRecord): string;
|
|
34
|
+
resolve(sessionId: string, pendingId: string): void;
|
|
35
|
+
resolveOldest(sessionId: string): MachineSessionDrainedInput | undefined;
|
|
36
|
+
findByClientMessageId(sessionId: string, clientMessageId: string): MachineSessionPendingInput | undefined;
|
|
37
|
+
snapshotFor(sessionId: string): MachineSessionPendingInput[];
|
|
38
|
+
deleteSession(sessionId: string): void;
|
|
39
|
+
private evictStale;
|
|
40
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
const DEFAULT_PENDING_INPUT_TTL_MS = 10 * 60_000;
|
|
3
|
+
/**
|
|
4
|
+
* Process-live FIFO of web-composer inputs awaiting their native transcript
|
|
5
|
+
* echo. The message is deliberately not persisted when the send POST succeeds:
|
|
6
|
+
* the Provider transcript remains the sole durable writer. This index only
|
|
7
|
+
* keeps the temporary bubble recoverable across page rebinds until that echo
|
|
8
|
+
* arrives.
|
|
9
|
+
*/
|
|
10
|
+
export class SessionPendingInputIndex {
|
|
11
|
+
ttlMs;
|
|
12
|
+
now;
|
|
13
|
+
entries = new Map();
|
|
14
|
+
constructor(ttlMs = DEFAULT_PENDING_INPUT_TTL_MS, now = Date.now) {
|
|
15
|
+
this.ttlMs = ttlMs;
|
|
16
|
+
this.now = now;
|
|
17
|
+
}
|
|
18
|
+
record(sessionId, input) {
|
|
19
|
+
this.evictStale(sessionId);
|
|
20
|
+
const pending = this.entries.get(sessionId) ?? new Map();
|
|
21
|
+
const pendingId = `pending_${randomUUID().replaceAll("-", "")}`;
|
|
22
|
+
pending.set(pendingId, {
|
|
23
|
+
pendingId,
|
|
24
|
+
clientMessageId: input.clientMessageId,
|
|
25
|
+
content: input.content.map((part) => ({ ...part })),
|
|
26
|
+
createdAt: this.now(),
|
|
27
|
+
});
|
|
28
|
+
this.entries.set(sessionId, pending);
|
|
29
|
+
return pendingId;
|
|
30
|
+
}
|
|
31
|
+
resolve(sessionId, pendingId) {
|
|
32
|
+
const pending = this.entries.get(sessionId);
|
|
33
|
+
if (!pending)
|
|
34
|
+
return;
|
|
35
|
+
pending.delete(pendingId);
|
|
36
|
+
if (pending.size === 0)
|
|
37
|
+
this.entries.delete(sessionId);
|
|
38
|
+
}
|
|
39
|
+
resolveOldest(sessionId) {
|
|
40
|
+
this.evictStale(sessionId);
|
|
41
|
+
const pending = this.entries.get(sessionId);
|
|
42
|
+
const pendingId = pending?.keys().next().value;
|
|
43
|
+
if (!pending || !pendingId)
|
|
44
|
+
return undefined;
|
|
45
|
+
const input = pending.get(pendingId);
|
|
46
|
+
pending.delete(pendingId);
|
|
47
|
+
if (pending.size === 0)
|
|
48
|
+
this.entries.delete(sessionId);
|
|
49
|
+
return input ? cloneDrainedInput(input) : undefined;
|
|
50
|
+
}
|
|
51
|
+
findByClientMessageId(sessionId, clientMessageId) {
|
|
52
|
+
this.evictStale(sessionId);
|
|
53
|
+
const input = [...(this.entries.get(sessionId)?.values() ?? [])].find((entry) => entry.clientMessageId === clientMessageId);
|
|
54
|
+
return input ? clonePendingInput(input) : undefined;
|
|
55
|
+
}
|
|
56
|
+
snapshotFor(sessionId) {
|
|
57
|
+
this.evictStale(sessionId);
|
|
58
|
+
return [...(this.entries.get(sessionId)?.values() ?? [])].map(clonePendingInput);
|
|
59
|
+
}
|
|
60
|
+
deleteSession(sessionId) {
|
|
61
|
+
this.entries.delete(sessionId);
|
|
62
|
+
}
|
|
63
|
+
evictStale(sessionId) {
|
|
64
|
+
const pending = this.entries.get(sessionId);
|
|
65
|
+
if (!pending)
|
|
66
|
+
return;
|
|
67
|
+
const cutoff = this.now() - this.ttlMs;
|
|
68
|
+
for (const [pendingId, input] of pending) {
|
|
69
|
+
if (input.createdAt < cutoff)
|
|
70
|
+
pending.delete(pendingId);
|
|
71
|
+
}
|
|
72
|
+
if (pending.size === 0)
|
|
73
|
+
this.entries.delete(sessionId);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function clonePendingInput(input) {
|
|
77
|
+
return {
|
|
78
|
+
pendingId: input.pendingId,
|
|
79
|
+
content: input.content.map((part) => ({ ...part })),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function cloneDrainedInput(input) {
|
|
83
|
+
return { ...clonePendingInput(input), clientMessageId: input.clientMessageId };
|
|
84
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { type IncomingMessage, type Server as HttpServer } from "node:http";
|
|
2
|
+
import type { Duplex } from "node:stream";
|
|
3
|
+
import Koa from "koa";
|
|
4
|
+
export declare const SESSION_PORTAL_HEADER = "x-rynx-session-portal";
|
|
5
|
+
export declare const SESSION_PORTAL_QUERY = "portal";
|
|
6
|
+
export declare const SESSION_PORTAL_SECRET_HEADER = "x-rynx-session-portal-secret";
|
|
7
|
+
export declare const SESSION_PORTAL_SECRET_QUERY = "portal_secret";
|
|
8
|
+
export declare const SESSION_PORTAL_EMBED_ORIGIN_QUERY = "embed_origin";
|
|
9
|
+
export interface SessionPortalAuthorization {
|
|
10
|
+
portalId: string;
|
|
11
|
+
pluginId: string;
|
|
12
|
+
scope: "plugin_sessions" | "single_session";
|
|
13
|
+
access: "read_only" | "read_write";
|
|
14
|
+
embedOrigin?: string;
|
|
15
|
+
sessionId?: string;
|
|
16
|
+
expiresAt: string;
|
|
17
|
+
}
|
|
18
|
+
export interface SessionPortalAuthorizationPorts {
|
|
19
|
+
redeem(ticket: string, embedOrigin?: string): (SessionPortalAuthorization & {
|
|
20
|
+
secret: string;
|
|
21
|
+
}) | undefined;
|
|
22
|
+
authorize(portalId: string, secret: string): SessionPortalAuthorization | undefined;
|
|
23
|
+
inspect(portalId: string): SessionPortalAuthorization | undefined;
|
|
24
|
+
subscribeRevocations?(listener: (portalIds: readonly string[]) => void | Promise<void>): () => void;
|
|
25
|
+
ownsSession(pluginId: string, sessionId: string): boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface SessionPortalOptions {
|
|
28
|
+
host: string;
|
|
29
|
+
port: number;
|
|
30
|
+
scheme: "http" | "https";
|
|
31
|
+
authorization: SessionPortalAuthorizationPorts;
|
|
32
|
+
controlOrigin: string;
|
|
33
|
+
controlWebDist: string;
|
|
34
|
+
shutdownSignal?: AbortSignal;
|
|
35
|
+
}
|
|
36
|
+
export interface SessionPortalServer {
|
|
37
|
+
server: HttpServer;
|
|
38
|
+
stopAccepting(): void;
|
|
39
|
+
shutdown(): Promise<void>;
|
|
40
|
+
}
|
|
41
|
+
declare class SessionPortalTransportRegistry {
|
|
42
|
+
private readonly transports;
|
|
43
|
+
track(portalId: string, close: () => void): () => void;
|
|
44
|
+
revoke(portalIds: readonly string[]): Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
/** Session Portal is a narrow adapter in front of the one Control service. It
|
|
47
|
+
* serves the native SPA, validates Portal grants, and forwards only authorized
|
|
48
|
+
* Session HTTP calls to Control; it owns no Session or Runtime handlers. */
|
|
49
|
+
export declare function createSessionPortalApp(options: SessionPortalOptions, transports?: SessionPortalTransportRegistry): Koa;
|
|
50
|
+
export declare function startSessionPortal(options: SessionPortalOptions): Promise<SessionPortalServer>;
|
|
51
|
+
export declare function authorizeSessionPortalWebSocket(request: IncomingMessage, ports: SessionPortalAuthorizationPorts, runtimeSelector: string, sessionId: string): SessionPortalAuthorization | undefined;
|
|
52
|
+
export declare function rejectSessionPortalUpgrade(socket: Duplex): void;
|
|
53
|
+
export declare function scheduleSessionPortalExpiry(expiresAt: string, onExpire: () => void): () => void;
|
|
54
|
+
export {};
|