@rynx-ai/server 0.1.11-beta.3 → 0.1.11-beta.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/control-api.d.ts +16 -4
- package/dist/control-api.js +676 -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-COu02MlJ.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-DqiFeYAM.js +1 -0
- package/dist/control-web/assets/architectureDiagram-ZJ3FMSHR-BWFGgUV4.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-ZC0bXDzB.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-Uupq5I-s.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-3HG15wfa.js +1 -0
- package/dist/control-web/assets/chunk-2Q5K7J3B-C77vwuDM.js +1 -0
- package/dist/control-web/assets/chunk-32BRIVSS-BkfLE_TX.js +1 -0
- package/dist/control-web/assets/chunk-5VM5RSS4-By6zfDWW.js +15 -0
- package/dist/control-web/assets/chunk-EX3LRPZG-CO439p_3.js +231 -0
- package/dist/control-web/assets/chunk-JWPE2WC7-B9BPEwug.js +1 -0
- package/dist/control-web/assets/chunk-MOJQB5TN-CYKygWZz.js +88 -0
- package/dist/control-web/assets/chunk-RYQCIY6F-ug-An4HG.js +1 -0
- package/dist/control-web/assets/chunk-V7JOEXUC-3UFQGnKX.js +206 -0
- package/dist/control-web/assets/chunk-VR4S4FIN-DjspjYUb.js +1 -0
- package/dist/control-web/assets/chunk-XXDRQBXY-3znnutie.js +1 -0
- package/dist/control-web/assets/clarity-D53aC0YG.js +1 -0
- package/dist/control-web/assets/classDiagram-OUVF2IWQ-WmU4L9YT.js +1 -0
- package/dist/control-web/assets/classDiagram-v2-EOCWNBFH-WmU4L9YT.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-Dr28goCd.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-Be5uJhnw.js +178 -0
- package/dist/control-web/assets/cynefinDiagram-TSTJHNR4-BLxtSvL6.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-DPRuDV5p.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-Cybg22U0.js +3 -0
- package/dist/control-web/assets/diagram-G47NLZAW-CGeIKUfW.js +24 -0
- package/dist/control-web/assets/diagram-NH7WQ7WH-BJq5MBRm.js +24 -0
- package/dist/control-web/assets/diagram-OA4YK3LP-DquOQGwg.js +30 -0
- package/dist/control-web/assets/diagram-WEI45ONY-Cblb4xP2.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-CQjHiOqj.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-Bspr3uKJ.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-CxcZyBA-.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-qBdh7A-P.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-BTYub2KT.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-DyksUrwu.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-B9SAq_63.js +718 -0
- package/dist/control-web/assets/index-BDaSctIT.js +153 -0
- package/dist/control-web/assets/index-CtaYRNgJ.css +32 -0
- package/dist/control-web/assets/infoDiagram-FWYZ7A6U-ChbQR3Zo.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-C-4_qGzn.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-B090zN18.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-RlTcRbPs.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-DTuNxDqu.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-BkcV3dgg.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-DYby41E9.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-CPK6GaEv.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-DLCmXuji.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-RIS8r7CA.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-B1HB7xsg.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-Inh_4hU0.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-DPF33kPB.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-iywKWoYc.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-DlnHubz9.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-CShzll2N.js +1 -0
- package/dist/control-web/assets/stateDiagram-v2-6OUMAXLB-Cdx0fWna.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-CxlQpFBv.js +2 -0
- package/dist/control-web/assets/swimlanesDiagram-G3AALYLV-CoX0jnUu.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-Dlx59Xc3.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-DLsv4i_t.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-BazV8fpH.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-Bx9uDlYu.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/machine-session-service.d.ts +82 -15
- package/dist/machine-session-service.js +670 -80
- package/dist/remote-runtime-dispatcher.d.ts +1 -1
- package/dist/remote-runtime-dispatcher.js +16 -1
- package/dist/remote-runtime-session-projection.js +5 -0
- package/dist/server.d.ts +24 -7
- package/dist/server.js +207 -46
- package/dist/session-portal.d.ts +42 -0
- package/dist/session-portal.js +746 -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
|
@@ -34,7 +34,7 @@ export interface RemoteRuntimeProjectHost {
|
|
|
34
34
|
update(projectId: string, input: RemoteRuntimeProjectCreateParams): RemoteRuntimeProject | undefined | Promise<RemoteRuntimeProject | undefined>;
|
|
35
35
|
remove(projectId: string): boolean | Promise<boolean>;
|
|
36
36
|
}
|
|
37
|
-
export type RemoteRuntimeSessionHost = Pick<MachineSessionService, "list" | "snapshot" | "watch" | "interrupt" | "agentOptions" | "launchOptions" | "create" | "fork" | "sendMessage" | "resourcePolicy" | "beginResourceUpload" | "writeResourceUploadChunk" | "commitResourceUpload" | "getResource" | "readResource" | "deleteResource" | "enqueueMessage" | "startTerminal" | "delete" | "resolveInteraction">;
|
|
37
|
+
export type RemoteRuntimeSessionHost = Pick<MachineSessionService, "list" | "snapshot" | "watch" | "interrupt" | "agentOptions" | "launchOptions" | "executionSettings" | "updateExecutionSettings" | "create" | "fork" | "sendMessage" | "resourcePolicy" | "beginResourceUpload" | "writeResourceUploadChunk" | "commitResourceUpload" | "getResource" | "readResource" | "deleteResource" | "getFile" | "readFile" | "getWorkspaceFile" | "readWorkspaceFile" | "enqueueMessage" | "startTerminal" | "delete" | "resolveInteraction">;
|
|
38
38
|
export type RemoteRuntimeBrowserHost = Pick<SessionBrowserService, "getState" | "open" | "close" | "createPage" | "closePage" | "activatePage" | "navigatePage" | "goBack" | "goForward" | "reload">;
|
|
39
39
|
export type RemoteRuntimeSessionEmulatorHost = Pick<SessionEmulatorService, "getState" | "listDevices" | "attach" | "detach" | "tap" | "type" | "button" | "rotate" | "launch" | "gesture" | "releaseDevice" | "stopDevice">;
|
|
40
40
|
export interface OpenRemoteRuntimeSessionEvents {
|
|
@@ -125,6 +125,10 @@ export class RemoteRuntimeDispatcher {
|
|
|
125
125
|
return await this.withSessions(request, (sessions) => sessions.agentOptions());
|
|
126
126
|
case "session.launchOptions.list":
|
|
127
127
|
return await this.withSessions(request, (sessions) => sessions.launchOptions());
|
|
128
|
+
case "session.execution.get":
|
|
129
|
+
return await this.withSessions(request, (sessions) => sessions.executionSettings(request.params.sessionId));
|
|
130
|
+
case "session.execution.update":
|
|
131
|
+
return await this.withSessions(request, (sessions) => sessions.updateExecutionSettings(request.params));
|
|
128
132
|
case "session.create":
|
|
129
133
|
return await this.withSessions(request, (sessions) => sessions.create(request.params));
|
|
130
134
|
case "session.fork":
|
|
@@ -150,6 +154,14 @@ export class RemoteRuntimeDispatcher {
|
|
|
150
154
|
return await this.withSessions(request, (sessions) => sessions.readResource(request.params));
|
|
151
155
|
case "session.resource.delete":
|
|
152
156
|
return await this.withSessions(request, (sessions) => sessions.deleteResource(request.params));
|
|
157
|
+
case "session.file.get":
|
|
158
|
+
return await this.withSessions(request, (sessions) => sessions.getFile(request.params));
|
|
159
|
+
case "session.file.read":
|
|
160
|
+
return await this.withSessions(request, (sessions) => sessions.readFile(request.params));
|
|
161
|
+
case "session.workspace.file.get":
|
|
162
|
+
return await this.withSessions(request, (sessions) => sessions.getWorkspaceFile(request.params));
|
|
163
|
+
case "session.workspace.file.read":
|
|
164
|
+
return await this.withSessions(request, (sessions) => sessions.readWorkspaceFile(request.params));
|
|
153
165
|
case "session.message.enqueue":
|
|
154
166
|
return await this.withSessions(request, (sessions) => sessions.enqueueMessage(request.params.sessionId, request.params.message));
|
|
155
167
|
case "session.terminal.start":
|
|
@@ -343,7 +355,10 @@ function mapHostError(request, error) {
|
|
|
343
355
|
: error.code === "conflict"
|
|
344
356
|
? "Remote Session resource conflicts with existing state"
|
|
345
357
|
: "Remote Session operation may have been applied";
|
|
346
|
-
|
|
358
|
+
// Native lifecycle failures are already reduced to a user-safe phase and
|
|
359
|
+
// concrete Provider cause. Preserve that text over Direct Runtime so the
|
|
360
|
+
// remote UI does not collapse every startup failure into one wrapper.
|
|
361
|
+
return { code: error.code, message: error.runtimeFailure?.message ?? message };
|
|
347
362
|
}
|
|
348
363
|
if (request.method === "session.interrupt") {
|
|
349
364
|
return {
|
|
@@ -65,6 +65,9 @@ function projectRuntimeSnapshot(value) {
|
|
|
65
65
|
const projected = {
|
|
66
66
|
status: runtime.status,
|
|
67
67
|
...(runtime.statusKind === undefined ? {} : { statusKind: runtime.statusKind }),
|
|
68
|
+
...(runtime.backgroundTaskCount === undefined
|
|
69
|
+
? {}
|
|
70
|
+
: { backgroundTaskCount: runtime.backgroundTaskCount }),
|
|
68
71
|
activeResponseIds: [],
|
|
69
72
|
pendingInteractions: [],
|
|
70
73
|
};
|
|
@@ -530,10 +533,12 @@ function assertEventScope(event, expectedSessionId) {
|
|
|
530
533
|
let actual;
|
|
531
534
|
switch (event.type) {
|
|
532
535
|
case "session.status":
|
|
536
|
+
case "session.collaboration_mode":
|
|
533
537
|
case "response.created":
|
|
534
538
|
case "session.interaction.requested":
|
|
535
539
|
case "session.interaction.resolved":
|
|
536
540
|
case "session.interaction.cancelled":
|
|
541
|
+
case "session.interrupted":
|
|
537
542
|
case "session.todos":
|
|
538
543
|
case "session.rotated":
|
|
539
544
|
actual = event.sessionId;
|
package/dist/server.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { Server as HttpServer } from "node:http";
|
|
2
2
|
import Koa from "koa";
|
|
3
3
|
import { ConversationRuntime, type AdmissionReservation, type AgentCapabilities, type AgentSessionStore, type AppConfig, type SessionEvent, type SessionBus, type SessionLogStore, type SessionRegistry } from "@rynx-ai/core";
|
|
4
|
-
import type { SessionInteractionResolution } from "@rynx-ai/protocol";
|
|
4
|
+
import type { SessionImageFileReference, SessionInteractionResolution } from "@rynx-ai/protocol";
|
|
5
5
|
import type { ControlRuntimeShareAddress, DaemonBrowserArtifactCleanResult, DaemonBrowserArtifactInstallInput, DaemonBrowserArtifactInstallResult, DaemonBrowserArtifactUpdateInput, DaemonBrowserArtifactVersionResult, DaemonCleanupSessionsInput, DaemonCleanupSessionsResult, DaemonChromeInspectionConfigureInput, DaemonChromeInspectionStatus, DaemonShutdownIfIdleResult } from "@rynx-ai/protocol/control";
|
|
6
6
|
import type { PluginInstallCommitInput, PluginInstallCommitResult, PluginInstallPreparation, PluginInstallPrepareInput, PluginManagementItem, PluginMarketplaceAddInput, PluginMarketplaceItem } from "@rynx-ai/protocol/plugin-management";
|
|
7
|
-
import type { PluginJsonValue } from "@rynx-ai/plugin-sdk";
|
|
7
|
+
import type { PluginAgentSummary, PluginJsonValue, PluginResolvedSessionExecution, PluginSessionActivitySnapshot, PluginSessionExecutionSnapshot } from "@rynx-ai/plugin-sdk";
|
|
8
8
|
import type { PairingOffer } from "@rynx-ai/protocol/direct-runtime";
|
|
9
9
|
import type { DaemonStatus } from "@rynx-ai/protocol/remote-runtime";
|
|
10
10
|
import type { RuntimeBrowserBootstrapCredential, RuntimeBrowserEndpointDescriptor } from "@rynx-ai/protocol/runtime-browser-bootstrap";
|
|
@@ -12,12 +12,14 @@ import type { RuntimeBrowserInspectMessage, RuntimeBrowserInspectTarget } from "
|
|
|
12
12
|
import type { RuntimeBrowserSurfaceClientFrame, RuntimeBrowserSurfaceImageFrame, RuntimeBrowserSurfaceOpenFrame, RuntimeBrowserSurfaceReadyFrame, RuntimeBrowserSurfaceServerFrame } from "@rynx-ai/protocol/runtime-browser-surface";
|
|
13
13
|
import type { RuntimeEmulatorSurfaceImageFrame, RuntimeEmulatorSurfaceReadyFrame } from "@rynx-ai/protocol/runtime-emulator-surface";
|
|
14
14
|
import type { RemoteRuntimeRpcMethod, RemoteRuntimeRpcParams, RemoteRuntimeRpcResultFor, RemoteRuntimeSequencedSessionEvent } from "@rynx-ai/protocol/remote-runtime-rpc";
|
|
15
|
-
import type { PluginAgentSummary, PluginResolvedSessionExecution, PluginSessionExecutionSnapshot } from "@rynx-ai/plugin-sdk";
|
|
16
15
|
import { RunnerManager, type CodexSessionStore, type RunnerSessionContextProvider } from "@rynx-ai/runtime";
|
|
17
16
|
import { type ControlPlaneDeps, type LocalSessionResourceHost, type SessionResourceLifecycle } from "./control-api.js";
|
|
18
17
|
import type { MachineSessionService } from "./machine-session-service.js";
|
|
19
18
|
import type { DaemonRuntimeHost } from "./remote-runtime.js";
|
|
20
19
|
import { type AttachDesktopBrowserHostServerOptions } from "./desktop-browser-host.js";
|
|
20
|
+
import { type SessionPortalAuthorizationPorts } from "./session-portal.js";
|
|
21
|
+
export { createSessionPortalApp, startSessionPortal } from "./session-portal.js";
|
|
22
|
+
export type { SessionPortalAuthorization, SessionPortalAuthorizationPorts, SessionPortalOptions, SessionPortalServer, } from "./session-portal.js";
|
|
21
23
|
import { SessionRuntimeIndex } from "./session-runtime-index.js";
|
|
22
24
|
import type { SessionEmulatorService } from "./session-emulator-service.js";
|
|
23
25
|
import { type SessionTerminalHost } from "./session-terminal-host.js";
|
|
@@ -25,7 +27,7 @@ import type { ProviderCliManagementHost } from "./provider-cli-host.js";
|
|
|
25
27
|
import { type RuntimeWebAccessPolicy } from "./runtime-web-auth.js";
|
|
26
28
|
export type { ProviderCliManagementHost, ProviderCliStatusHost, } from "./provider-cli-host.js";
|
|
27
29
|
export { MachineSessionService, MachineSessionServiceFailure, MachineSessionServiceInputError, synthesizeSessionTitle, } from "./machine-session-service.js";
|
|
28
|
-
export type { MachineSessionAgentCatalogPort, MachineSessionCreateInput, MachineSessionCreateResult, MachineSessionDeleteResult, MachineSessionForkInput, MachineSessionForkOperationRecord, MachineSessionForkOperationState, MachineSessionForkResult, MachineSessionForkStorePort, MachineSessionNativeRotationInput, MachineSessionInterruptPort, MachineSessionInterruptResult, MachineSessionInteractionResult, MachineSessionListInput, MachineSessionListPage, MachineSessionMessageResult, MachineSessionMessageEnqueueResult, MachineSessionMessageInput, MachineSessionMessageOperationState, MachineSessionPendingMessage, MachineSessionPendingMessagePort, MachineSessionPreparedInput, MachineSessionResourcePort, MachineSessionRunnerPort, MachineSessionRuntimeStatePort, MachineSessionServiceFailureCode, MachineSessionServiceOptions, MachineSessionServicePorts, MachineSessionSnapshotInput, MachineSessionSnapshotPage, MachineSessionWatch, } from "./machine-session-service.js";
|
|
30
|
+
export type { MachineSessionAgentCatalogPort, MachineSessionCreateInput, MachineSessionCreateResult, MachineSessionDeleteResult, MachineSessionForkInput, MachineSessionForkOperationRecord, MachineSessionForkOperationState, MachineSessionForkResult, MachineSessionForkStorePort, MachineSessionNativeRotationInput, MachineSessionInterruptPort, MachineSessionInterruptResult, MachineSessionInteractionResult, MachineSessionListInput, MachineSessionListPage, MachineSessionMessageResult, MachineSessionMessageEnqueueResult, MachineSessionMessageInput, MachineSessionMessageOperationState, MachineSessionPendingMessage, MachineSessionPendingMessagePort, MachineSessionPreparedInput, MachineSessionResourcePort, MachineSessionRunExecutionSelection, MachineSessionRunExecutionSnapshot, MachineSessionRunnerPort, MachineSessionRuntimeStatePort, MachineSessionServiceFailureCode, MachineSessionServiceOptions, MachineSessionServicePorts, MachineSessionSnapshotInput, MachineSessionSnapshotPage, MachineSessionWatch, StartedMachineSessionRun, } from "./machine-session-service.js";
|
|
29
31
|
export { SessionBrowserHostError, SessionBrowserService, SessionBrowserServiceError, SessionBrowserSurfaceUnsupportedError, } from "./session-browser-service.js";
|
|
30
32
|
export type { SessionBrowserHost, SessionBrowserHostCreateInput, SessionBrowserHostErrorCode, SessionBrowserHostEvent, SessionBrowserHostHandle, SessionBrowserHostPage, SessionBrowserHostSurfaceFrame, SessionBrowserHostSurfaceOpenInput, SessionBrowserHostSurfaceSource, SessionBrowserHostSurfaceTrustedInput, SessionBrowserHostSurfaceViewport, SessionBrowserHostSnapshot, SessionBrowserInspectionEndpoint, SessionBrowserInspectionTarget, SessionBrowserRegistryPort, SessionBrowserServiceErrorCode, SessionBrowserServiceOptions, SessionBrowserServicePorts, SessionBrowserSurfaceOpenInput, SessionBrowserSurfaceSource, } from "./session-browser-service.js";
|
|
31
33
|
export { SessionEmulatorBindingConflictError, SessionEmulatorService, SessionEmulatorServiceError, } from "./session-emulator-service.js";
|
|
@@ -132,6 +134,9 @@ export interface StartServerOptions {
|
|
|
132
134
|
providerClis?: ProviderCliManagementHost;
|
|
133
135
|
/** Private resident-app Browser Host socket, authenticated by daemonManagement. */
|
|
134
136
|
desktopBrowserHost?: Omit<AttachDesktopBrowserHostServerOptions, "managementToken">;
|
|
137
|
+
/** Hashed ticket/grant authority for the native Session Portal. Required
|
|
138
|
+
* when RYNX_SESSION_PORTAL_PORT enables that listener. */
|
|
139
|
+
sessionPortalAuthorization?: SessionPortalAuthorizationPorts;
|
|
135
140
|
}
|
|
136
141
|
export interface SessionRuntimeServices {
|
|
137
142
|
sessionStore: CodexSessionStore;
|
|
@@ -142,10 +147,11 @@ export interface SessionRuntimeServices {
|
|
|
142
147
|
publishSessionEvent: (sessionId: string, event: SessionEvent) => Promise<void>;
|
|
143
148
|
}
|
|
144
149
|
export interface PluginRuntimeHostServices {
|
|
145
|
-
conversationRuntime: ConversationRuntime;
|
|
146
150
|
capabilities: AgentCapabilities;
|
|
147
151
|
sessionStore: AgentSessionStore;
|
|
148
152
|
sessionRegistry: SessionRegistry;
|
|
153
|
+
sessionRuns: Pick<MachineSessionService, "startRun">;
|
|
154
|
+
sessionFiles: Pick<MachineSessionService, "resolveResourcePath">;
|
|
149
155
|
agentCatalog: {
|
|
150
156
|
list(): Promise<PluginAgentSummary[]>;
|
|
151
157
|
get(id: string): Promise<PluginAgentSummary | null>;
|
|
@@ -154,6 +160,7 @@ export interface PluginRuntimeHostServices {
|
|
|
154
160
|
session: PluginSessionExecutionSnapshot;
|
|
155
161
|
}): Promise<PluginResolvedSessionExecution>;
|
|
156
162
|
};
|
|
163
|
+
sessionActivity(sessionId: string): PluginSessionActivitySnapshot;
|
|
157
164
|
interruptSession(sessionId: string): Promise<boolean>;
|
|
158
165
|
terminateSession?(sessionId: string): Promise<boolean>;
|
|
159
166
|
resolveSessionInteraction(sessionId: string, interactionId: string, resolution: SessionInteractionResolution): Promise<{
|
|
@@ -163,6 +170,11 @@ export interface PluginRuntimeHostServices {
|
|
|
163
170
|
* closed, but cannot provision Sessions or begin Turns. */
|
|
164
171
|
admissionOpen?: () => boolean;
|
|
165
172
|
admissionReserve?: () => AdmissionReservation | undefined;
|
|
173
|
+
sessionPortal?: {
|
|
174
|
+
scheme: "http" | "https";
|
|
175
|
+
bindHost: string;
|
|
176
|
+
port: number;
|
|
177
|
+
};
|
|
166
178
|
}
|
|
167
179
|
export interface PluginRuntimeLifecycle {
|
|
168
180
|
bindHostServices(services: PluginRuntimeHostServices): void;
|
|
@@ -339,7 +351,7 @@ export interface RuntimeConnectionLease {
|
|
|
339
351
|
};
|
|
340
352
|
call<M extends RemoteRuntimeRpcMethod>(method: M, params: RemoteRuntimeRpcParams<M>, options?: {
|
|
341
353
|
signal?: AbortSignal;
|
|
342
|
-
timeoutMs?: number;
|
|
354
|
+
timeoutMs?: number | null;
|
|
343
355
|
}): Promise<RemoteRuntimeRpcResultFor<M>>;
|
|
344
356
|
subscribeSessionEvents(sessionId: string, options?: {
|
|
345
357
|
signal?: AbortSignal;
|
|
@@ -426,6 +438,11 @@ export declare function createSessionRuntimeServices(input: {
|
|
|
426
438
|
sessionContextProvider?: RunnerSessionContextProvider;
|
|
427
439
|
admissionOpen?: () => boolean;
|
|
428
440
|
admissionReserve?: () => AdmissionReservation | undefined;
|
|
441
|
+
materializeGeneratedImage?: (input: {
|
|
442
|
+
sessionId: string;
|
|
443
|
+
sourceId: string;
|
|
444
|
+
result: string;
|
|
445
|
+
}) => Promise<SessionImageFileReference>;
|
|
429
446
|
}): SessionRuntimeServices;
|
|
430
447
|
/**
|
|
431
448
|
* The HTTP surface is just a liveness probe for container orchestration — all
|
|
@@ -434,4 +451,4 @@ export declare function createSessionRuntimeServices(input: {
|
|
|
434
451
|
* no agent request / response / SSE endpoints are exposed here.
|
|
435
452
|
*/
|
|
436
453
|
export declare function createApp({ config, control }?: CreateAppOptions): Koa<Koa.DefaultState, Koa.DefaultContext>;
|
|
437
|
-
export declare function startServer({ config, control, sessionLog, sessionRegistry, pluginRuntime, daemonManagement, remoteRuntime, remoteRuntimeAdmin, runtimeTargetControl, runtimeConnectionResolver, localSessionResources, localMachineSessions, sessionEmulators, sessionRuntimeServices, sessionLifecycle, sessionTerminals, runtimeLocalBrowser, providerClis, desktopBrowserHost, }?: StartServerOptions): Promise<RynxServer>;
|
|
454
|
+
export declare function startServer({ config, control, sessionLog, sessionRegistry, pluginRuntime, daemonManagement, remoteRuntime, remoteRuntimeAdmin, runtimeTargetControl, runtimeConnectionResolver, localSessionResources, localMachineSessions, sessionEmulators, sessionRuntimeServices, sessionLifecycle, sessionTerminals, runtimeLocalBrowser, providerClis, desktopBrowserHost, sessionPortalAuthorization, }?: StartServerOptions): Promise<RynxServer>;
|
package/dist/server.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { basename, extname, isAbsolute } from "node:path";
|
|
1
2
|
import { pathToFileURL } from "node:url";
|
|
2
3
|
import Koa from "koa";
|
|
3
4
|
import Router from "@koa/router";
|
|
@@ -10,6 +11,8 @@ import { attachBrowserSurfaceWs } from "./browser-surface-ws.js";
|
|
|
10
11
|
import { attachEmulatorSurfaceWs } from "./emulator-surface-ws.js";
|
|
11
12
|
import { attachDesktopBrowserHostServer, } from "./desktop-browser-host.js";
|
|
12
13
|
import { resolveControlWebDist, sendSpaFile } from "./control-web-dist.js";
|
|
14
|
+
import { startSessionPortal, } from "./session-portal.js";
|
|
15
|
+
export { createSessionPortalApp, startSessionPortal } from "./session-portal.js";
|
|
13
16
|
import { SessionRuntimeIndex } from "./session-runtime-index.js";
|
|
14
17
|
import { createRunnerSessionTerminalHost, } from "./session-terminal-host.js";
|
|
15
18
|
import { runtimeWebAccessPolicyForBindHost, } from "./runtime-web-auth.js";
|
|
@@ -64,19 +67,24 @@ export function createSessionRuntimeServices(input) {
|
|
|
64
67
|
});
|
|
65
68
|
const sessionBus = new InMemorySessionBus();
|
|
66
69
|
const sessionRuntimeIndex = new SessionRuntimeIndex();
|
|
67
|
-
const sessionMirrorQueue = new SessionMirrorQueue((sessionId, event) =>
|
|
70
|
+
const sessionMirrorQueue = new SessionMirrorQueue(async (sessionId, event) => {
|
|
71
|
+
const finalized = await finalizeGeneratedImageEvent(sessionId, event, input);
|
|
72
|
+
sessionRuntimeIndex.observe(sessionId, finalized);
|
|
73
|
+
await persistSessionEvent(sessionId, finalized, {
|
|
74
|
+
sessionLog: input.sessionLog,
|
|
75
|
+
sessionBus,
|
|
76
|
+
});
|
|
77
|
+
});
|
|
68
78
|
const mirrorSessionEvent = (sessionId, event) => {
|
|
69
|
-
sessionRuntimeIndex.observe(sessionId, event);
|
|
70
79
|
return sessionMirrorQueue.enqueue(sessionId, event);
|
|
71
80
|
};
|
|
72
81
|
const conversationRuntime = new ConversationRuntime({
|
|
73
82
|
config: input.config,
|
|
74
83
|
executor: runnerManager,
|
|
75
84
|
sessionBus,
|
|
76
|
-
sessionEventSink: mirrorSessionEvent,
|
|
77
85
|
});
|
|
78
86
|
runnerManager.onMirror((sessionId, event) => {
|
|
79
|
-
|
|
87
|
+
return mirrorSessionEvent(sessionId, event).catch((error) => {
|
|
80
88
|
input.onMirrorError?.(error, sessionId);
|
|
81
89
|
});
|
|
82
90
|
});
|
|
@@ -89,6 +97,72 @@ export function createSessionRuntimeServices(input) {
|
|
|
89
97
|
publishSessionEvent: mirrorSessionEvent,
|
|
90
98
|
};
|
|
91
99
|
}
|
|
100
|
+
async function finalizeGeneratedImageEvent(sessionId, event, input) {
|
|
101
|
+
if (event.type !== "response.output_item.done" ||
|
|
102
|
+
event.item.type !== "function_call_output") {
|
|
103
|
+
return event;
|
|
104
|
+
}
|
|
105
|
+
const rawData = event.item.data;
|
|
106
|
+
const pending = rawData.__rynxGeneratedImage;
|
|
107
|
+
if (!pending)
|
|
108
|
+
return event;
|
|
109
|
+
const { __rynxGeneratedImage: _omitted, ...data } = rawData;
|
|
110
|
+
try {
|
|
111
|
+
const pathMediaType = pending.savedPath && isAbsolute(pending.savedPath)
|
|
112
|
+
? imageMediaTypeFromPath(pending.savedPath)
|
|
113
|
+
: undefined;
|
|
114
|
+
const generatedImage = pathMediaType && pending.savedPath
|
|
115
|
+
? {
|
|
116
|
+
path: pending.savedPath,
|
|
117
|
+
filename: basename(pending.savedPath),
|
|
118
|
+
mediaType: pathMediaType,
|
|
119
|
+
}
|
|
120
|
+
: pending.result && input.materializeGeneratedImage
|
|
121
|
+
? await input.materializeGeneratedImage({
|
|
122
|
+
sessionId,
|
|
123
|
+
sourceId: event.item.id,
|
|
124
|
+
result: pending.result,
|
|
125
|
+
})
|
|
126
|
+
: undefined;
|
|
127
|
+
return {
|
|
128
|
+
...event,
|
|
129
|
+
item: {
|
|
130
|
+
...event.item,
|
|
131
|
+
data: {
|
|
132
|
+
...data,
|
|
133
|
+
...(generatedImage ? { generatedImage } : {}),
|
|
134
|
+
...(!generatedImage && pending.savedPath && !isAbsolute(pending.savedPath)
|
|
135
|
+
? { output: `${data.output}\nImage path was not absolute; preview omitted.`.trim() }
|
|
136
|
+
: {}),
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
input.onMirrorError?.(error, sessionId);
|
|
143
|
+
return {
|
|
144
|
+
...event,
|
|
145
|
+
item: {
|
|
146
|
+
...event.item,
|
|
147
|
+
data: {
|
|
148
|
+
...data,
|
|
149
|
+
output: `${data.output}\nImage preview unavailable.`.trim(),
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function imageMediaTypeFromPath(path) {
|
|
156
|
+
switch (extname(path).toLowerCase()) {
|
|
157
|
+
case ".png": return "image/png";
|
|
158
|
+
case ".jpg":
|
|
159
|
+
case ".jpeg": return "image/jpeg";
|
|
160
|
+
case ".webp": return "image/webp";
|
|
161
|
+
case ".gif": return "image/gif";
|
|
162
|
+
case ".svg": return "image/svg+xml";
|
|
163
|
+
default: return undefined;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
92
166
|
/**
|
|
93
167
|
* The HTTP surface is just a liveness probe for container orchestration — all
|
|
94
168
|
* agent capabilities are forwarded through the mounted channel plugins (the
|
|
@@ -137,7 +211,7 @@ export function createApp({ config = loadConfig(), control } = {}) {
|
|
|
137
211
|
}
|
|
138
212
|
return app;
|
|
139
213
|
}
|
|
140
|
-
export async function startServer({ config = loadConfig(), control, sessionLog, sessionRegistry, pluginRuntime, daemonManagement, remoteRuntime, remoteRuntimeAdmin, runtimeTargetControl, runtimeConnectionResolver, localSessionResources, localMachineSessions, sessionEmulators, sessionRuntimeServices, sessionLifecycle, sessionTerminals, runtimeLocalBrowser, providerClis, desktopBrowserHost, } = {}) {
|
|
214
|
+
export async function startServer({ config = loadConfig(), control, sessionLog, sessionRegistry, pluginRuntime, daemonManagement, remoteRuntime, remoteRuntimeAdmin, runtimeTargetControl, runtimeConnectionResolver, localSessionResources, localMachineSessions, sessionEmulators, sessionRuntimeServices, sessionLifecycle, sessionTerminals, runtimeLocalBrowser, providerClis, desktopBrowserHost, sessionPortalAuthorization, } = {}) {
|
|
141
215
|
const runtimeWebAccess = runtimeWebAccessPolicyForBindHost(config.HOST);
|
|
142
216
|
const desktopBrowserManagementToken = desktopBrowserHost
|
|
143
217
|
? requireDaemonManagementToken(daemonManagement)
|
|
@@ -160,14 +234,58 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
|
|
|
160
234
|
return { cwd: session.workspace.cwd };
|
|
161
235
|
},
|
|
162
236
|
});
|
|
237
|
+
const controlShutdown = new AbortController();
|
|
238
|
+
const controlSurface = control
|
|
239
|
+
? {
|
|
240
|
+
deps: control,
|
|
241
|
+
runtime: conversationRuntime,
|
|
242
|
+
sessionBus,
|
|
243
|
+
sessionLog,
|
|
244
|
+
runnerManager,
|
|
245
|
+
sessionStore,
|
|
246
|
+
pluginRuntimeStatus: pluginRuntime
|
|
247
|
+
? () => pluginRuntime.statusSnapshot()
|
|
248
|
+
: undefined,
|
|
249
|
+
daemonManagement,
|
|
250
|
+
remoteRuntime,
|
|
251
|
+
remoteRuntimeAdmin,
|
|
252
|
+
runtimeTargetControl,
|
|
253
|
+
runtimeConnectionResolver,
|
|
254
|
+
localSessionResources,
|
|
255
|
+
localMachineSessions,
|
|
256
|
+
sessionEmulators,
|
|
257
|
+
shutdownSignal: controlShutdown.signal,
|
|
258
|
+
sessionRuntimeIndex,
|
|
259
|
+
sessionLifecycle,
|
|
260
|
+
runtimeLocalBrowser,
|
|
261
|
+
providerClis,
|
|
262
|
+
}
|
|
263
|
+
: undefined;
|
|
264
|
+
const sessionPortalConfig = config.RYNX_SESSION_PORTAL_PORT !== undefined
|
|
265
|
+
? (() => {
|
|
266
|
+
if (runtimeWebAccess.mode !== "loopback") {
|
|
267
|
+
throw new Error("Session Portal requires the ordinary Control listener to bind loopback only");
|
|
268
|
+
}
|
|
269
|
+
const controlWebDist = resolveControlWebDist();
|
|
270
|
+
if (!sessionPortalAuthorization || !controlSurface || !controlWebDist) {
|
|
271
|
+
throw new Error("Session Portal requires authorization, Control services, and the native Control Web build");
|
|
272
|
+
}
|
|
273
|
+
return { authorization: sessionPortalAuthorization, controlWebDist };
|
|
274
|
+
})()
|
|
275
|
+
: undefined;
|
|
276
|
+
let sessionPortalServer;
|
|
163
277
|
if (pluginRuntime) {
|
|
164
278
|
if (!sessionRegistry)
|
|
165
279
|
throw new Error("plugin runtime requires a machine session registry");
|
|
280
|
+
if (!localMachineSessions) {
|
|
281
|
+
throw new Error("plugin runtime requires the machine Session service");
|
|
282
|
+
}
|
|
166
283
|
pluginRuntime.bindHostServices({
|
|
167
|
-
conversationRuntime,
|
|
168
284
|
capabilities: runnerManager,
|
|
169
285
|
sessionStore,
|
|
170
286
|
sessionRegistry,
|
|
287
|
+
sessionRuns: localMachineSessions,
|
|
288
|
+
sessionFiles: localMachineSessions,
|
|
171
289
|
agentCatalog: {
|
|
172
290
|
list: async () => (await listAgentSpecs()).map(toPluginAgentSummary),
|
|
173
291
|
get: async (id) => {
|
|
@@ -180,9 +298,27 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
|
|
|
180
298
|
session: input.session,
|
|
181
299
|
}),
|
|
182
300
|
},
|
|
301
|
+
sessionActivity: (sessionId) => {
|
|
302
|
+
const snapshot = sessionRuntimeIndex.snapshot(sessionId);
|
|
303
|
+
return {
|
|
304
|
+
...snapshot,
|
|
305
|
+
status: snapshot.pendingInteractions.length > 0
|
|
306
|
+
? "waiting"
|
|
307
|
+
: snapshot.status,
|
|
308
|
+
};
|
|
309
|
+
},
|
|
183
310
|
interruptSession: (sessionId) => runnerManager.interruptLiveSession(sessionId),
|
|
184
311
|
terminateSession: (sessionId) => runnerManager.terminateLiveSession(sessionId),
|
|
185
312
|
resolveSessionInteraction: (sessionId, interactionId, resolution) => runnerManager.resolveInteraction(sessionId, interactionId, resolution),
|
|
313
|
+
...(sessionPortalConfig
|
|
314
|
+
? {
|
|
315
|
+
sessionPortal: {
|
|
316
|
+
scheme: "http",
|
|
317
|
+
bindHost: config.RYNX_SESSION_PORTAL_HOST,
|
|
318
|
+
port: config.RYNX_SESSION_PORTAL_PORT,
|
|
319
|
+
},
|
|
320
|
+
}
|
|
321
|
+
: {}),
|
|
186
322
|
});
|
|
187
323
|
}
|
|
188
324
|
// Provider TUI `/clear`·`/fork` uses the same publication boundary as an
|
|
@@ -198,38 +334,37 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
|
|
|
198
334
|
kind: r.kind,
|
|
199
335
|
});
|
|
200
336
|
});
|
|
201
|
-
|
|
337
|
+
if (localMachineSessions) {
|
|
338
|
+
runnerManager.onCollaborationMode((sessionId, mode) => {
|
|
339
|
+
localMachineSessions.recordNativeCollaborationMode(sessionId, mode);
|
|
340
|
+
});
|
|
341
|
+
}
|
|
202
342
|
const app = createApp({
|
|
203
343
|
config,
|
|
204
|
-
control:
|
|
205
|
-
? {
|
|
206
|
-
deps: control,
|
|
207
|
-
runtime: conversationRuntime,
|
|
208
|
-
sessionBus,
|
|
209
|
-
sessionLog,
|
|
210
|
-
runnerManager,
|
|
211
|
-
sessionStore,
|
|
212
|
-
pluginRuntimeStatus: pluginRuntime
|
|
213
|
-
? () => pluginRuntime.statusSnapshot()
|
|
214
|
-
: undefined,
|
|
215
|
-
daemonManagement,
|
|
216
|
-
remoteRuntime,
|
|
217
|
-
remoteRuntimeAdmin,
|
|
218
|
-
runtimeTargetControl,
|
|
219
|
-
runtimeConnectionResolver,
|
|
220
|
-
localSessionResources,
|
|
221
|
-
localMachineSessions,
|
|
222
|
-
sessionEmulators,
|
|
223
|
-
shutdownSignal: controlShutdown.signal,
|
|
224
|
-
sessionRuntimeIndex,
|
|
225
|
-
sessionLifecycle,
|
|
226
|
-
runtimeLocalBrowser,
|
|
227
|
-
providerClis,
|
|
228
|
-
}
|
|
229
|
-
: undefined,
|
|
344
|
+
control: controlSurface,
|
|
230
345
|
});
|
|
231
|
-
return new Promise((resolve) => {
|
|
346
|
+
return new Promise((resolve, reject) => {
|
|
347
|
+
let startupWebSocketServers = [];
|
|
348
|
+
const rejectBeforeListening = (error) => reject(error);
|
|
232
349
|
const server = app.listen(config.PORT, config.HOST, () => {
|
|
350
|
+
server.off("error", rejectBeforeListening);
|
|
351
|
+
void finishStartup(server).catch(async (error) => {
|
|
352
|
+
controlShutdown.abort(asError(error));
|
|
353
|
+
sessionPortalServer?.stopAccepting();
|
|
354
|
+
server.closeAllConnections?.();
|
|
355
|
+
await Promise.allSettled([
|
|
356
|
+
closeWebSocketServers(startupWebSocketServers),
|
|
357
|
+
sessionPortalServer?.shutdown() ?? Promise.resolve(),
|
|
358
|
+
new Promise((done) => server.close(() => done())),
|
|
359
|
+
Promise.resolve(daemonManagement?.pluginManagement?.dispose?.()),
|
|
360
|
+
Promise.resolve(pluginRuntime?.dispose()),
|
|
361
|
+
runnerManager.stop(),
|
|
362
|
+
]);
|
|
363
|
+
reject(error);
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
server.once("error", rejectBeforeListening);
|
|
367
|
+
const finishStartup = async (server) => {
|
|
233
368
|
console.log(JSON.stringify({
|
|
234
369
|
level: config.LOG_LEVEL,
|
|
235
370
|
msg: "Harness agent server listening",
|
|
@@ -238,15 +373,6 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
|
|
|
238
373
|
runtime: config.DEFAULT_RUNTIME,
|
|
239
374
|
model: resolveRuntimeModel(config, config.DEFAULT_RUNTIME),
|
|
240
375
|
}));
|
|
241
|
-
const startup = pluginRuntime?.startPluginRuntimes() ?? Promise.resolve();
|
|
242
|
-
void startup.catch((error) => {
|
|
243
|
-
console.error(JSON.stringify({
|
|
244
|
-
level: "error",
|
|
245
|
-
type: "plugin-runtime",
|
|
246
|
-
event: "startup_failed",
|
|
247
|
-
error: error instanceof Error ? error.message : String(error),
|
|
248
|
-
}));
|
|
249
|
-
});
|
|
250
376
|
const webSocketServers = [
|
|
251
377
|
attachTerminalWs(server, {
|
|
252
378
|
runtimeConnectionResolver,
|
|
@@ -265,9 +391,36 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
|
|
|
265
391
|
if (control?.emulator) {
|
|
266
392
|
webSocketServers.push(attachEmulatorTouchWs(server, { emulator: control.emulator }));
|
|
267
393
|
}
|
|
394
|
+
startupWebSocketServers = webSocketServers;
|
|
395
|
+
if (sessionPortalConfig) {
|
|
396
|
+
sessionPortalServer = await startSessionPortal({
|
|
397
|
+
host: config.RYNX_SESSION_PORTAL_HOST,
|
|
398
|
+
port: config.RYNX_SESSION_PORTAL_PORT,
|
|
399
|
+
scheme: "http",
|
|
400
|
+
authorization: sessionPortalConfig.authorization,
|
|
401
|
+
controlOrigin: listeningHttpOrigin(server),
|
|
402
|
+
controlWebDist: sessionPortalConfig.controlWebDist,
|
|
403
|
+
shutdownSignal: controlShutdown.signal,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
const startup = pluginRuntime?.startPluginRuntimes() ?? Promise.resolve();
|
|
407
|
+
void startup.catch((error) => {
|
|
408
|
+
console.error(JSON.stringify({
|
|
409
|
+
level: "error",
|
|
410
|
+
type: "plugin-runtime",
|
|
411
|
+
event: "startup_failed",
|
|
412
|
+
error: error instanceof Error ? error.message : String(error),
|
|
413
|
+
}));
|
|
414
|
+
});
|
|
268
415
|
resolve(bindServerLifecycle(server, {
|
|
269
|
-
fence: () =>
|
|
270
|
-
|
|
416
|
+
fence: () => {
|
|
417
|
+
controlShutdown.abort(new Error("Rynx server is shutting down"));
|
|
418
|
+
sessionPortalServer?.stopAccepting();
|
|
419
|
+
},
|
|
420
|
+
closeUpgrades: () => Promise.all([
|
|
421
|
+
closeWebSocketServers(webSocketServers),
|
|
422
|
+
sessionPortalServer?.shutdown() ?? Promise.resolve(),
|
|
423
|
+
]).then(() => undefined),
|
|
271
424
|
cleanup: async () => runCleanupSteps([
|
|
272
425
|
() => startup.catch(() => undefined),
|
|
273
426
|
() => Promise.resolve(daemonManagement?.pluginManagement?.dispose?.()),
|
|
@@ -275,9 +428,17 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
|
|
|
275
428
|
() => runnerManager.stop(),
|
|
276
429
|
]),
|
|
277
430
|
}));
|
|
278
|
-
}
|
|
431
|
+
};
|
|
279
432
|
});
|
|
280
433
|
}
|
|
434
|
+
function listeningHttpOrigin(server) {
|
|
435
|
+
const address = server.address();
|
|
436
|
+
if (!address || typeof address === "string") {
|
|
437
|
+
throw new Error("Control listener did not expose an HTTP address");
|
|
438
|
+
}
|
|
439
|
+
const host = address.address.includes(":") ? `[${address.address}]` : address.address;
|
|
440
|
+
return `http://${host}:${address.port}`;
|
|
441
|
+
}
|
|
281
442
|
function requireDaemonManagementToken(host) {
|
|
282
443
|
const token = host?.managementToken;
|
|
283
444
|
const bytes = typeof token === "string" ? Buffer.byteLength(token, "utf8") : 0;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type IncomingMessage, type Server as HttpServer } from "node:http";
|
|
2
|
+
import type { Duplex } from "node:stream";
|
|
3
|
+
import Koa from "koa";
|
|
4
|
+
export declare const SESSION_PORTAL_HEADER = "x-rynx-session-portal";
|
|
5
|
+
export declare const SESSION_PORTAL_QUERY = "portal";
|
|
6
|
+
export interface SessionPortalAuthorization {
|
|
7
|
+
portalId: string;
|
|
8
|
+
pluginId: string;
|
|
9
|
+
scope: "plugin_sessions" | "single_session";
|
|
10
|
+
access: "read_only" | "read_write";
|
|
11
|
+
sessionId?: string;
|
|
12
|
+
expiresAt: string;
|
|
13
|
+
}
|
|
14
|
+
export interface SessionPortalAuthorizationPorts {
|
|
15
|
+
redeem(ticket: string): (SessionPortalAuthorization & {
|
|
16
|
+
secret: string;
|
|
17
|
+
}) | undefined;
|
|
18
|
+
authorize(portalId: string, secret: string): SessionPortalAuthorization | undefined;
|
|
19
|
+
ownsSession(pluginId: string, sessionId: string): boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface SessionPortalOptions {
|
|
22
|
+
host: string;
|
|
23
|
+
port: number;
|
|
24
|
+
scheme: "http" | "https";
|
|
25
|
+
authorization: SessionPortalAuthorizationPorts;
|
|
26
|
+
controlOrigin: string;
|
|
27
|
+
controlWebDist: string;
|
|
28
|
+
shutdownSignal?: AbortSignal;
|
|
29
|
+
}
|
|
30
|
+
export interface SessionPortalServer {
|
|
31
|
+
server: HttpServer;
|
|
32
|
+
stopAccepting(): void;
|
|
33
|
+
shutdown(): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
/** Session Portal is a narrow adapter in front of the one Control service. It
|
|
36
|
+
* serves the native SPA, validates Portal grants, and forwards only authorized
|
|
37
|
+
* Session HTTP calls to Control; it owns no Session or Runtime handlers. */
|
|
38
|
+
export declare function createSessionPortalApp(options: SessionPortalOptions): Koa;
|
|
39
|
+
export declare function startSessionPortal(options: SessionPortalOptions): Promise<SessionPortalServer>;
|
|
40
|
+
export declare function authorizeSessionPortalWebSocket(request: IncomingMessage, ports: SessionPortalAuthorizationPorts, runtimeSelector: string, sessionId: string): SessionPortalAuthorization | undefined;
|
|
41
|
+
export declare function rejectSessionPortalUpgrade(socket: Duplex): void;
|
|
42
|
+
export declare function scheduleSessionPortalExpiry(expiresAt: string, onExpire: () => void): () => void;
|