@rynx-ai/server 0.1.11-beta.4 → 0.1.11-beta.41
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 +17 -4
- package/dist/control-api.js +722 -84
- package/dist/control-web/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/control-web/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/control-web/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/control-web/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/control-web/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/control-web/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/control-web/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/control-web/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/control-web/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/control-web/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/control-web/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/control-web/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/control-web/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/control-web/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/control-web/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/control-web/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/control-web/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/control-web/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/control-web/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/control-web/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/control-web/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/control-web/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/control-web/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/control-web/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/control-web/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/control-web/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/control-web/assets/abap-CLvhMVsD.js +1 -0
- package/dist/control-web/assets/abnfDiagram-VRR7QNED-D_NL89dn.js +1 -0
- package/dist/control-web/assets/actionscript-3--17pq3dv.js +1 -0
- package/dist/control-web/assets/ada-C5qYipkI.js +1 -0
- package/dist/control-web/assets/andromeeda-vGVdxbeo.js +1 -0
- package/dist/control-web/assets/angular-html-DlZBZkSp.js +1 -0
- package/dist/control-web/assets/angular-ts-BVPGOT0K.js +1 -0
- package/dist/control-web/assets/apache-U0d_L8uA.js +1 -0
- package/dist/control-web/assets/apex-CGTLDQj6.js +1 -0
- package/dist/control-web/assets/apl-cDmXqmZ-.js +1 -0
- package/dist/control-web/assets/applescript-CCn79oCD.js +1 -0
- package/dist/control-web/assets/ara-4CJ0cIlV.js +1 -0
- package/dist/control-web/assets/arc-Pry-7G1_.js +1 -0
- package/dist/control-web/assets/architecture-TIHT7OUA-C9wU1KtW.js +1 -0
- package/dist/control-web/assets/architectureDiagram-ZJ3FMSHR-CV0rxVH6.js +36 -0
- package/dist/control-web/assets/array-BifhSqXX.js +1 -0
- package/dist/control-web/assets/asciidoc-DE70LPWp.js +1 -0
- package/dist/control-web/assets/asm-Cmm7eHzH.js +1 -0
- package/dist/control-web/assets/astro-B1Q6BwBx.js +1 -0
- package/dist/control-web/assets/aurora-x-CDeNXAV0.js +1 -0
- package/dist/control-web/assets/awk-BWXHIvNe.js +1 -0
- package/dist/control-web/assets/ayu-dark-DluEY0Gj.js +1 -0
- package/dist/control-web/assets/ayu-light-C3h-C4tm.js +1 -0
- package/dist/control-web/assets/ayu-mirage-Bqwy1Gya.js +1 -0
- package/dist/control-web/assets/ballerina-B7ZEbQpA.js +1 -0
- package/dist/control-web/assets/bat-Bo4NYOV-.js +1 -0
- package/dist/control-web/assets/beancount-D-usSTwE.js +1 -0
- package/dist/control-web/assets/berry-DKpUyyne.js +1 -0
- package/dist/control-web/assets/bibtex-Ci_nEsc7.js +1 -0
- package/dist/control-web/assets/bicep-CUHmPFLl.js +1 -0
- package/dist/control-web/assets/bird2-C2hNVINV.js +1 -0
- package/dist/control-web/assets/blade-Xpu-LGTm.js +1 -0
- package/dist/control-web/assets/blockDiagram-677ZJIJ3-Cc7nrkZh.js +132 -0
- package/dist/control-web/assets/bsl-BkkzgIyY.js +1 -0
- package/dist/control-web/assets/c-iCihek07.js +1 -0
- package/dist/control-web/assets/c3-CnJL0r0V.js +1 -0
- package/dist/control-web/assets/c4Diagram-LMCZKHZV-BPRU9m-F.js +10 -0
- package/dist/control-web/assets/cadence-CQ2zXKGN.js +1 -0
- package/dist/control-web/assets/cairo-DLTphjLi.js +1 -0
- package/dist/control-web/assets/catppuccin-frappe-3VR1Za6u.js +1 -0
- package/dist/control-web/assets/catppuccin-latte-DwIHMF0Q.js +1 -0
- package/dist/control-web/assets/catppuccin-macchiato-DYnBP6_5.js +1 -0
- package/dist/control-web/assets/catppuccin-mocha-DYhrFGRu.js +1 -0
- package/dist/control-web/assets/channel-BFm2_j8K.js +1 -0
- package/dist/control-web/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist/control-web/assets/chunk-32BRIVSS-Bbq3O54m.js +1 -0
- package/dist/control-web/assets/chunk-52WLFC77-sD4al-Ob.js +10 -0
- package/dist/control-web/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/dist/control-web/assets/chunk-7BUUIJ7U-Bb538aSH.js +1 -0
- package/dist/control-web/assets/chunk-C7G6YPKG-DqHaDS1O.js +1 -0
- package/dist/control-web/assets/chunk-EX3LRPZG-36GNQ5wp.js +231 -0
- package/dist/control-web/assets/chunk-HOUHSVGY-DeZ63q1j.js +1 -0
- package/dist/control-web/assets/chunk-ICXQ74PX-D2yF6lD_.js +2 -0
- package/dist/control-web/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist/control-web/assets/chunk-KEIR6QF5-BICK3FdT.js +161 -0
- package/dist/control-web/assets/chunk-MOJQB5TN-CdaKyBz5.js +88 -0
- package/dist/control-web/assets/chunk-OGEWGWER-eOXC7kiH.js +1 -0
- package/dist/control-web/assets/chunk-PUDLZKDR-6w0LILL_.js +156 -0
- package/dist/control-web/assets/chunk-Q4XR5HBZ-CXgD5TGL.js +70 -0
- package/dist/control-web/assets/chunk-RYQCIY6F-BsoV8yK2.js +1 -0
- package/dist/control-web/assets/chunk-V7JOEXUC-BfoZ78b6.js +206 -0
- package/dist/control-web/assets/chunk-VR4S4FIN-BW2gCEMQ.js +1 -0
- package/dist/control-web/assets/chunk-WYO6CB5R-CHn7hulw.js +128 -0
- package/dist/control-web/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
- package/dist/control-web/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/dist/control-web/assets/chunk-ZGVPDNZ5-CmFP0-fr.js +62 -0
- package/dist/control-web/assets/clarity-SemFz856.js +1 -0
- package/dist/control-web/assets/classDiagram-OUVF2IWQ-CUe_bETB.js +1 -0
- package/dist/control-web/assets/classDiagram-v2-EOCWNBFH-CUe_bETB.js +1 -0
- package/dist/control-web/assets/clojure-DqKBuwfJ.js +1 -0
- package/dist/control-web/assets/cmake-Bj61d0ZC.js +1 -0
- package/dist/control-web/assets/cobol-BsV-839J.js +1 -0
- package/dist/control-web/assets/codeowners-C8r90Shi.js +1 -0
- package/dist/control-web/assets/codeql-oeQT6MSM.js +1 -0
- package/dist/control-web/assets/coffee-CiiSLhB6.js +1 -0
- package/dist/control-web/assets/common-lisp-Cv5bFMCO.js +1 -0
- package/dist/control-web/assets/coq-BrsZFFmf.js +1 -0
- package/dist/control-web/assets/cose-bilkent-JH36ORCC-lJEhNiw_.js +1 -0
- package/dist/control-web/assets/cpp-DjoE5qBx.js +1 -0
- package/dist/control-web/assets/crystal-DDxHDkHz.js +1 -0
- package/dist/control-web/assets/csharp-Ct8U2NOr.js +1 -0
- package/dist/control-web/assets/css-LjpOdHib.js +1 -0
- package/dist/control-web/assets/csv-Dx-8-gkx.js +1 -0
- package/dist/control-web/assets/cue-CE9AQfxI.js +1 -0
- package/dist/control-web/assets/cynefin-VYW2F7L2-NaLr7Qlq.js +1 -0
- package/dist/control-web/assets/cynefinDiagram-TSTJHNR4-C90wpjAI.js +62 -0
- package/dist/control-web/assets/cypher-ClKdZ_lG.js +1 -0
- package/dist/control-web/assets/cytoscape.esm-B-NFISlW.js +321 -0
- package/dist/control-web/assets/d-qD-0Kul2.js +1 -0
- package/dist/control-web/assets/dagre-Buvkdvvj.js +1 -0
- package/dist/control-web/assets/dagre-VKFMJZFB-BxrPFWTb.js +4 -0
- package/dist/control-web/assets/dark-plus-Cs2F2srj.js +1 -0
- package/dist/control-web/assets/dart-DkHntEIa.js +1 -0
- package/dist/control-web/assets/dax-BkyTk9wS.js +1 -0
- package/dist/control-web/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist/control-web/assets/desktop-Dlh5hvp9.js +1 -0
- package/dist/control-web/assets/diagram-FQU43EPY-VIQINsvz.js +3 -0
- package/dist/control-web/assets/diagram-G47NLZAW-DFeAfYXn.js +24 -0
- package/dist/control-web/assets/diagram-NH7WQ7WH-ATzdppDd.js +24 -0
- package/dist/control-web/assets/diagram-OA4YK3LP-DJZpWmbl.js +30 -0
- package/dist/control-web/assets/diagram-WEI45ONY-CqDHcW3g.js +41 -0
- package/dist/control-web/assets/diff-woXpYk--.js +1 -0
- package/dist/control-web/assets/dist-Dx9YWgcW.js +153 -0
- package/dist/control-web/assets/dist-v5Q1xZ2K.js +1 -0
- package/dist/control-web/assets/docker-IyjqRm3v.js +1 -0
- package/dist/control-web/assets/dotenv-_5a1GRtc.js +1 -0
- package/dist/control-web/assets/dracula-BHWKrbxM.js +1 -0
- package/dist/control-web/assets/dracula-soft-5eyTD99u.js +1 -0
- package/dist/control-web/assets/dream-maker-DW3nJb8Q.js +1 -0
- package/dist/control-web/assets/ebnfDiagram-CCIWWBDH-DnP6dHND.js +1 -0
- package/dist/control-web/assets/edge-8z7Jp9dO.js +1 -0
- package/dist/control-web/assets/elixir-CUV54ev5.js +1 -0
- package/dist/control-web/assets/elm-o4NJxfws.js +1 -0
- package/dist/control-web/assets/emacs-lisp-C9PiwqqW.js +1 -0
- package/dist/control-web/assets/erDiagram-Q63AITRT-Bo8bFqrZ.js +85 -0
- package/dist/control-web/assets/erb-CIsHcwm1.js +1 -0
- package/dist/control-web/assets/erlang-Cphh6RMH.js +1 -0
- package/dist/control-web/assets/eventmodeling-45OFAUF4-DTN8wqsu.js +1 -0
- package/dist/control-web/assets/everforest-dark-sB-x3p7T.js +1 -0
- package/dist/control-web/assets/everforest-light-Df2xbC6M.js +1 -0
- package/dist/control-web/assets/fennel-DQxkIbk2.js +1 -0
- package/dist/control-web/assets/fish-BJitypiv.js +1 -0
- package/dist/control-web/assets/flowDiagram-23GEKE2U-BwjqRyvd.js +1 -0
- package/dist/control-web/assets/fluent-C03EYrpw.js +1 -0
- package/dist/control-web/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
- package/dist/control-web/assets/fortran-free-form-CYNrtFtB.js +1 -0
- package/dist/control-web/assets/fsharp-D13ZGOAj.js +1 -0
- package/dist/control-web/assets/ganttDiagram-NO4QXBWP-kxQaBTzd.js +292 -0
- package/dist/control-web/assets/gdresource-C0sCabJj.js +1 -0
- package/dist/control-web/assets/gdscript-Cp2uCuqX.js +1 -0
- package/dist/control-web/assets/gdshader-CBce3t8t.js +1 -0
- package/dist/control-web/assets/genie-CV2tkWYe.js +1 -0
- package/dist/control-web/assets/gherkin-DExj1W_8.js +1 -0
- package/dist/control-web/assets/git-commit-BSykSTBG.js +1 -0
- package/dist/control-web/assets/git-rebase-BDPpS8w6.js +1 -0
- package/dist/control-web/assets/gitGraph-TEB2WS4Q-a646NnuJ.js +1 -0
- package/dist/control-web/assets/gitGraphDiagram-IHSO6WYX-BBe0q0At.js +106 -0
- package/dist/control-web/assets/github-dark-C-LZuMrd.js +1 -0
- package/dist/control-web/assets/github-dark-default-DXG-b-1a.js +1 -0
- package/dist/control-web/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
- package/dist/control-web/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
- package/dist/control-web/assets/github-light-EUqPIrTm.js +1 -0
- package/dist/control-web/assets/github-light-default-BXViO-2h.js +1 -0
- package/dist/control-web/assets/github-light-high-contrast-B68TUdTA.js +1 -0
- package/dist/control-web/assets/gleam-CSRkHgEL.js +1 -0
- package/dist/control-web/assets/glimmer-js-OEO36pDk.js +1 -0
- package/dist/control-web/assets/glimmer-ts-BnAPyISE.js +1 -0
- package/dist/control-web/assets/glsl-D5MA2a_X.js +1 -0
- package/dist/control-web/assets/gn-ilITqXS6.js +1 -0
- package/dist/control-web/assets/gnuplot-7GGW24-e.js +1 -0
- package/dist/control-web/assets/go-BJwz_mda.js +1 -0
- package/dist/control-web/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/control-web/assets/graphql-Ctjuxyvl.js +1 -0
- package/dist/control-web/assets/groovy-CacY0gHj.js +1 -0
- package/dist/control-web/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
- package/dist/control-web/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
- package/dist/control-web/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
- package/dist/control-web/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
- package/dist/control-web/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
- package/dist/control-web/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
- package/dist/control-web/assets/hack-D_mkkoLd.js +1 -0
- package/dist/control-web/assets/haml-mpgecWZ6.js +1 -0
- package/dist/control-web/assets/handlebars-CAx_777f.js +1 -0
- package/dist/control-web/assets/haskell-D8IpX4py.js +1 -0
- package/dist/control-web/assets/haxe-OTjmBuCE.js +1 -0
- package/dist/control-web/assets/hcl-Dh228itO.js +1 -0
- package/dist/control-web/assets/highlighted-body-OFNGDK62-DVCHy9oI.js +1 -0
- package/dist/control-web/assets/hjson-CxZEssPk.js +1 -0
- package/dist/control-web/assets/hlsl-Cvrh5tZx.js +1 -0
- package/dist/control-web/assets/horizon-CE9ld1lL.js +1 -0
- package/dist/control-web/assets/horizon-bright-Br1oVSNq.js +1 -0
- package/dist/control-web/assets/houston-CsvMBhTu.js +1 -0
- package/dist/control-web/assets/html-B2lrdnWr.js +1 -0
- package/dist/control-web/assets/html-derivative-CDfZYcul.js +1 -0
- package/dist/control-web/assets/http-kmH8AyfE.js +1 -0
- package/dist/control-web/assets/hurl-DCZHXKU4.js +1 -0
- package/dist/control-web/assets/hxml-B0Qn7Nwc.js +1 -0
- package/dist/control-web/assets/hy-CZbG8q4J.js +1 -0
- package/dist/control-web/assets/imba-DsUTQ-LC.js +1 -0
- package/dist/control-web/assets/index-D7URT6K_.js +140 -0
- package/dist/control-web/assets/index-uEpvRMX9.css +1 -0
- package/dist/control-web/assets/info-DKCQHKI2-Cp_JrY-b.js +1 -0
- package/dist/control-web/assets/infoDiagram-FWYZ7A6U-CAm-h4F_.js +2 -0
- package/dist/control-web/assets/ini-B5eOa1yu.js +1 -0
- package/dist/control-web/assets/init-C-OQMol4.js +1 -0
- package/dist/control-web/assets/ishikawaDiagram-FXEZZL3T-O17pqcWr.js +70 -0
- package/dist/control-web/assets/java-DdHNQ9hk.js +1 -0
- package/dist/control-web/assets/javascript-obGGvMPs.js +1 -0
- package/dist/control-web/assets/jinja-BMiPVedm.js +1 -0
- package/dist/control-web/assets/jison-CBjhYtSs.js +1 -0
- package/dist/control-web/assets/journeyDiagram-5HDEW3XC-DQ-JuSoR.js +139 -0
- package/dist/control-web/assets/json-DAgxKhMr.js +1 -0
- package/dist/control-web/assets/json5-BR5RXkoi.js +1 -0
- package/dist/control-web/assets/jsonc-CYpm1nAK.js +1 -0
- package/dist/control-web/assets/jsonl-CmCQp5Yx.js +1 -0
- package/dist/control-web/assets/jsonnet-CJTPZ8u_.js +1 -0
- package/dist/control-web/assets/jssm-DXw9l8Rf.js +1 -0
- package/dist/control-web/assets/jsx-gTgmArGx.js +1 -0
- package/dist/control-web/assets/julia-CjHxn3vf.js +1 -0
- package/dist/control-web/assets/just-DMArCiVH.js +1 -0
- package/dist/control-web/assets/kanagawa-dragon-CXtmUGW6.js +1 -0
- package/dist/control-web/assets/kanagawa-lotus-BN08jTvb.js +1 -0
- package/dist/control-web/assets/kanagawa-wave-CTweb8Dz.js +1 -0
- package/dist/control-web/assets/kanban-definition-HUTT4EX6-Cgv3kPbm.js +89 -0
- package/dist/control-web/assets/katex-CyHG4N6b.js +1 -0
- package/dist/control-web/assets/kdl-CsD5j6eV.js +1 -0
- package/dist/control-web/assets/kotlin-DhhofPvG.js +1 -0
- package/dist/control-web/assets/kusto-BUv0MjJC.js +1 -0
- package/dist/control-web/assets/laserwave-C_8bwKvT.js +1 -0
- package/dist/control-web/assets/latex-D9bvcAJr.js +1 -0
- package/dist/control-web/assets/lean-CewbzKMR.js +1 -0
- package/dist/control-web/assets/less-DVTAwKKz.js +1 -0
- package/dist/control-web/assets/lib-BZ_F5vVH.js +1 -0
- package/dist/control-web/assets/light-plus-DVQuIRkW.js +1 -0
- package/dist/control-web/assets/line-DUsXzGJZ.js +1 -0
- package/dist/control-web/assets/linear-DmucvK78.js +1 -0
- package/dist/control-web/assets/liquid-CCX5qouA.js +1 -0
- package/dist/control-web/assets/llvm-Cm23YOpf.js +1 -0
- package/dist/control-web/assets/log-BNLmms1o.js +1 -0
- package/dist/control-web/assets/logo-Cluzi2Zq.js +1 -0
- package/dist/control-web/assets/lua-FONpmTUP.js +1 -0
- package/dist/control-web/assets/luau-CNKltnaQ.js +1 -0
- package/dist/control-web/assets/make-Dixweg8N.js +1 -0
- package/dist/control-web/assets/map-BaFkSB1l.js +1 -0
- package/dist/control-web/assets/markdown-BYOwaDjH.js +1 -0
- package/dist/control-web/assets/markdown-streamdown-4N4AcNp5.js +433 -0
- package/dist/control-web/assets/markdown-streamdown-DEcVZfaU.css +1 -0
- package/dist/control-web/assets/marko-oPGh3KfH.js +1 -0
- package/dist/control-web/assets/material-theme-Bm3Qr25_.js +1 -0
- package/dist/control-web/assets/material-theme-darker-2IIEA8gg.js +1 -0
- package/dist/control-web/assets/material-theme-lighter-uhdI0v04.js +1 -0
- package/dist/control-web/assets/material-theme-ocean-CHQ94UKr.js +1 -0
- package/dist/control-web/assets/material-theme-palenight-B5W6OYN7.js +1 -0
- package/dist/control-web/assets/matlab-D7qyCx1q.js +1 -0
- package/dist/control-web/assets/mdc-B_uQHOlt.js +1 -0
- package/dist/control-web/assets/mdx-DQZ5AkYe.js +1 -0
- package/dist/control-web/assets/mermaid-Bk4SNUv9.js +1 -0
- package/dist/control-web/assets/mermaid-GHXKKRXX-BElZGKGd.js +1 -0
- package/dist/control-web/assets/mermaid-parser.core-VMln12Kd.js +7 -0
- package/dist/control-web/assets/min-dark-BSWPekZh.js +1 -0
- package/dist/control-web/assets/min-light-DDpmG2fV.js +1 -0
- package/dist/control-web/assets/mindmap-definition-LN4V7U3C-Bn0lH-UM.js +96 -0
- package/dist/control-web/assets/mipsasm-BMqwQI7S.js +1 -0
- package/dist/control-web/assets/mojo-BgCJLMeH.js +1 -0
- package/dist/control-web/assets/monokai-CdkpiU2Y.js +1 -0
- package/dist/control-web/assets/moonbit-CaWjb8XO.js +1 -0
- package/dist/control-web/assets/move-B1IS1UjX.js +1 -0
- package/dist/control-web/assets/narrat-_X_XdTYD.js +1 -0
- package/dist/control-web/assets/nextflow-Bbiyy34d.js +1 -0
- package/dist/control-web/assets/nextflow-groovy-Dc_ddanL.js +1 -0
- package/dist/control-web/assets/nginx-BTMw9COX.js +1 -0
- package/dist/control-web/assets/night-owl-DhmEMT88.js +1 -0
- package/dist/control-web/assets/night-owl-light-eJ-hLW7d.js +1 -0
- package/dist/control-web/assets/nim-8PQFL6ZB.js +1 -0
- package/dist/control-web/assets/nix-IvuFDN5E.js +1 -0
- package/dist/control-web/assets/nord-Cb4Vim4T.js +1 -0
- package/dist/control-web/assets/nushell-DcLAeLz5.js +1 -0
- package/dist/control-web/assets/objective-c-D1A_Heim.js +1 -0
- package/dist/control-web/assets/objective-cpp-BsSzOQcm.js +1 -0
- package/dist/control-web/assets/ocaml-O90oeIOV.js +1 -0
- package/dist/control-web/assets/odin-B1RWQWA5.js +1 -0
- package/dist/control-web/assets/one-dark-pro-CLwyXe_n.js +1 -0
- package/dist/control-web/assets/one-light-D7Lr4KcI.js +1 -0
- package/dist/control-web/assets/openscad-BUDT5pXO.js +1 -0
- package/dist/control-web/assets/ordinal-BDEzSJ7C.js +1 -0
- package/dist/control-web/assets/packet-7NZHBO7P-Zw8iJ8lo.js +1 -0
- package/dist/control-web/assets/pascal-4ZHwLPI5.js +1 -0
- package/dist/control-web/assets/path-fybaL0A-.js +1 -0
- package/dist/control-web/assets/pegDiagram-2B236MQR-CtF7vVs_.js +1 -0
- package/dist/control-web/assets/perl-Vf0i0hAx.js +1 -0
- package/dist/control-web/assets/php-am1OsKhm.js +1 -0
- package/dist/control-web/assets/pie-RZYD4A2V-su_3QGU2.js +1 -0
- package/dist/control-web/assets/pieDiagram-ENE6RG2P-BkMUBLE1.js +39 -0
- package/dist/control-web/assets/pkl-ot-7Btpt.js +1 -0
- package/dist/control-web/assets/plastic-DQwYfKfQ.js +1 -0
- package/dist/control-web/assets/plsql-DGHpHOYJ.js +1 -0
- package/dist/control-web/assets/po-BiJDBrnU.js +1 -0
- package/dist/control-web/assets/poimandres-DRFjx7u4.js +1 -0
- package/dist/control-web/assets/polar-C7UOKdEL.js +1 -0
- package/dist/control-web/assets/postcss-BXeXVLqQ.js +1 -0
- package/dist/control-web/assets/powerquery-DNMTfnFr.js +1 -0
- package/dist/control-web/assets/powershell-DshXNtvi.js +1 -0
- package/dist/control-web/assets/prisma-BsRQq5mF.js +1 -0
- package/dist/control-web/assets/prolog-iXnhIJG7.js +1 -0
- package/dist/control-web/assets/proto-DB4EqR-F.js +1 -0
- package/dist/control-web/assets/pug-DO6yvBr3.js +1 -0
- package/dist/control-web/assets/puppet-CDv2pdJW.js +1 -0
- package/dist/control-web/assets/purescript-9MfHhQsQ.js +1 -0
- package/dist/control-web/assets/python-gzcpVVnB.js +1 -0
- package/dist/control-web/assets/qml-_a-QhfPD.js +1 -0
- package/dist/control-web/assets/qmldir-DCQb3MpD.js +1 -0
- package/dist/control-web/assets/qss-Fe1Jh2GI.js +1 -0
- package/dist/control-web/assets/quadrantDiagram-ABIIQ3AL-ba-VaqMe.js +7 -0
- package/dist/control-web/assets/r-D6UWEOL2.js +1 -0
- package/dist/control-web/assets/racket-DcIDlBhZ.js +1 -0
- package/dist/control-web/assets/radar-I7S5WNFK-Dat0rqem.js +1 -0
- package/dist/control-web/assets/railroad-3IZDKUUU-Dh2-s8r8.js +1 -0
- package/dist/control-web/assets/railroad-abnf-AHOZXSZD-CNUwq0JR.js +1 -0
- package/dist/control-web/assets/railroad-ebnf-EBAXGLYW-RHr0duea.js +1 -0
- package/dist/control-web/assets/railroad-peg-LSFZ7HO6-CVBWS2eU.js +1 -0
- package/dist/control-web/assets/railroadDiagram-RFXS5EU6-BiJX3SY-.js +1 -0
- package/dist/control-web/assets/raku-B3gFvitq.js +1 -0
- package/dist/control-web/assets/razor-CMVBVp3T.js +1 -0
- package/dist/control-web/assets/red-CJ3rzSJv.js +1 -0
- package/dist/control-web/assets/reg-CRGYupPL.js +1 -0
- package/dist/control-web/assets/regexp-DR20uMnK.js +1 -0
- package/dist/control-web/assets/rel-BtDbiS_P.js +1 -0
- package/dist/control-web/assets/requirementDiagram-TGXJPOKE-CFfakCzs.js +84 -0
- package/dist/control-web/assets/riscv-Ckw8ddFX.js +1 -0
- package/dist/control-web/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/control-web/assets/ron-VUp2lXgN.js +1 -0
- package/dist/control-web/assets/rose-pine-BthvhNj6.js +1 -0
- package/dist/control-web/assets/rose-pine-dawn-Dg85fqjY.js +1 -0
- package/dist/control-web/assets/rose-pine-moon-hon4tzzS.js +1 -0
- package/dist/control-web/assets/rosmsg-CAekHB0j.js +1 -0
- package/dist/control-web/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/dist/control-web/assets/rst-CgIrbW_q.js +1 -0
- package/dist/control-web/assets/ruby-Dp6Zud9H.js +1 -0
- package/dist/control-web/assets/rust-Cfkwpbl8.js +1 -0
- package/dist/control-web/assets/sankeyDiagram-HTMAVEWB-jgDi0God.js +40 -0
- package/dist/control-web/assets/sas-B6p8-ynO.js +1 -0
- package/dist/control-web/assets/sass-DXrisJhu.js +1 -0
- package/dist/control-web/assets/scala-DKOlJaKm.js +1 -0
- package/dist/control-web/assets/scheme-DQCgrYNe.js +1 -0
- package/dist/control-web/assets/scss-DcoSS-ti.js +1 -0
- package/dist/control-web/assets/sdbl-bTVj8UrX.js +1 -0
- package/dist/control-web/assets/sequenceDiagram-DBY2YBRQ-DBfyyb0N.js +162 -0
- package/dist/control-web/assets/shaderlab-TOUzSsQk.js +1 -0
- package/dist/control-web/assets/shellscript-Da78Ox-3.js +1 -0
- package/dist/control-web/assets/shellsession-CVsQGYfZ.js +1 -0
- package/dist/control-web/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +1 -0
- package/dist/control-web/assets/slack-dark-DnToyrRv.js +1 -0
- package/dist/control-web/assets/slack-ochin-B2OO5cIa.js +1 -0
- package/dist/control-web/assets/smalltalk-B16xEiuN.js +1 -0
- package/dist/control-web/assets/snazzy-light-4G7pJPwS.js +1 -0
- package/dist/control-web/assets/solarized-dark-DV17i1UV.js +1 -0
- package/dist/control-web/assets/solarized-light-DSh2HLQt.js +1 -0
- package/dist/control-web/assets/solidity-CKzVLygQ.js +1 -0
- package/dist/control-web/assets/soy-B5n_eHSp.js +1 -0
- package/dist/control-web/assets/sparql-D_iOobhT.js +1 -0
- package/dist/control-web/assets/splunk-BC2Px7Mm.js +1 -0
- package/dist/control-web/assets/sql-ClgswhA6.js +1 -0
- package/dist/control-web/assets/src-B6xuSHsQ.js +1 -0
- package/dist/control-web/assets/ssh-config-BgfXC-Er.js +1 -0
- package/dist/control-web/assets/stata-RoaAgbqU.js +1 -0
- package/dist/control-web/assets/stateDiagram-2N3HPSRC-Dwb_ncVi.js +1 -0
- package/dist/control-web/assets/stateDiagram-v2-6OUMAXLB-DI0opaA1.js +1 -0
- package/dist/control-web/assets/stylus-B6D30XZt.js +1 -0
- package/dist/control-web/assets/surrealql-DIn4NJsS.js +1 -0
- package/dist/control-web/assets/svelte-CIt8Fl9I.js +1 -0
- package/dist/control-web/assets/swift-DonLKvLd.js +1 -0
- package/dist/control-web/assets/swimlanes-5IMT3BWC-DW0LuiIV.js +2 -0
- package/dist/control-web/assets/swimlanesDiagram-G3AALYLV-DDTVjcOR.js +8 -0
- package/dist/control-web/assets/synthwave-84-nFMaYfgc.js +1 -0
- package/dist/control-web/assets/system-verilog-DJ5XKQeo.js +1 -0
- package/dist/control-web/assets/systemd-BxMlprV5.js +1 -0
- package/dist/control-web/assets/talonscript-CohzipZa.js +1 -0
- package/dist/control-web/assets/tasl-DMoTqEGO.js +1 -0
- package/dist/control-web/assets/tcl-CZd0xW_V.js +1 -0
- package/dist/control-web/assets/templ-BREsJpNc.js +1 -0
- package/dist/control-web/assets/terraform-DswuEJGm.js +1 -0
- package/dist/control-web/assets/tex-0w6-Dtgt.js +1 -0
- package/dist/control-web/assets/timeline-definition-FHXFAJF6-DeX4B_B8.js +120 -0
- package/dist/control-web/assets/tokyo-night-oM2G3aXe.js +1 -0
- package/dist/control-web/assets/toml-CcmNWLt0.js +1 -0
- package/dist/control-web/assets/treeView-QDETBFTQ-D1UXtICj.js +1 -0
- package/dist/control-web/assets/treemap-6X3UGDF4-CrppzjZH.js +1 -0
- package/dist/control-web/assets/ts-tags-q3pptdMi.js +1 -0
- package/dist/control-web/assets/tsv-sltzmVWM.js +1 -0
- package/dist/control-web/assets/tsx-CUOciP0b.js +1 -0
- package/dist/control-web/assets/turtle-ByJddavk.js +1 -0
- package/dist/control-web/assets/twig-LIeLXgf5.js +1 -0
- package/dist/control-web/assets/typescript-BydbNFcO.js +1 -0
- package/dist/control-web/assets/typespec-B88KGewJ.js +1 -0
- package/dist/control-web/assets/typst-DI99ib-x.js +1 -0
- package/dist/control-web/assets/v-DETTlOr0.js +1 -0
- package/dist/control-web/assets/vala-zf12oZj6.js +1 -0
- package/dist/control-web/assets/vb-Djn5o6TS.js +1 -0
- package/dist/control-web/assets/vennDiagram-L72KCM5P-BYpf-7VR.js +34 -0
- package/dist/control-web/assets/verilog-CiiDBU1e.js +1 -0
- package/dist/control-web/assets/vesper-D5bVUKB1.js +1 -0
- package/dist/control-web/assets/vhdl-BroJfC0k.js +1 -0
- package/dist/control-web/assets/viml-DvXPmvsu.js +1 -0
- package/dist/control-web/assets/vitesse-black-fwtXNY1n.js +1 -0
- package/dist/control-web/assets/vitesse-dark-BZCL-v6S.js +1 -0
- package/dist/control-web/assets/vitesse-light-VbXTXTou.js +1 -0
- package/dist/control-web/assets/vue-DVSfBueU.js +1 -0
- package/dist/control-web/assets/vue-html-DkKkQnZL.js +1 -0
- package/dist/control-web/assets/vue-vine-pWqEcBkW.js +1 -0
- package/dist/control-web/assets/vyper-CgoNMtux.js +1 -0
- package/dist/control-web/assets/wardley-OPB4EBWU-B9rA0UsV.js +1 -0
- package/dist/control-web/assets/wardleyDiagram-EHGQE667-BdvAUa5F.js +78 -0
- package/dist/control-web/assets/wasm-BnjxR4X6.js +1 -0
- package/dist/control-web/assets/wasm-ByWQv1Qj.js +1 -0
- package/dist/control-web/assets/wenyan-C8pVoKbM.js +1 -0
- package/dist/control-web/assets/wgsl-BsKzXJz4.js +1 -0
- package/dist/control-web/assets/wikitext-ClFFjSW2.js +1 -0
- package/dist/control-web/assets/wit-DdvCle-K.js +1 -0
- package/dist/control-web/assets/wolfram-DLL8P-h_.js +1 -0
- package/dist/control-web/assets/xml-BlnrEAEy.js +1 -0
- package/dist/control-web/assets/xsl-BOPS8gLt.js +1 -0
- package/dist/control-web/assets/xychartDiagram-FW5EYKEG-BaEV3pGm.js +7 -0
- package/dist/control-web/assets/yaml-Du_6cdrH.js +1 -0
- package/dist/control-web/assets/zenscript-BnlCZFoB.js +1 -0
- package/dist/control-web/assets/zig-CMLA9XwU.js +1 -0
- package/dist/control-web/index.html +3 -2
- package/dist/control-web-dist.d.ts +1 -1
- package/dist/control-web-dist.js +4 -2
- package/dist/desktop-browser-host.d.ts +3 -1
- package/dist/desktop-browser-host.js +39 -4
- package/dist/direct-runtime-server.js +187 -153
- package/dist/machine-session-service.d.ts +105 -15
- package/dist/machine-session-service.js +781 -87
- 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 +12 -0
- package/dist/server.d.ts +64 -11
- package/dist/server.js +422 -55
- package/dist/session-browser-service.d.ts +24 -4
- package/dist/session-browser-service.js +127 -1
- package/dist/session-pending-inputs.d.ts +42 -0
- package/dist/session-pending-inputs.js +87 -0
- package/dist/session-portal.d.ts +54 -0
- package/dist/session-portal.js +997 -0
- package/dist/session-runtime-index.d.ts +3 -6
- package/dist/session-runtime-index.js +96 -38
- package/dist/session-terminal-host.d.ts +22 -2
- package/dist/session-terminal-host.js +66 -83
- package/dist/terminal-ws.d.ts +4 -1
- package/dist/terminal-ws.js +93 -27
- package/package.json +7 -7
- package/dist/control-web/assets/highlighted-body-OFNGDK62-DWWsUtHF.js +0 -1
- 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
package/dist/server.js
CHANGED
|
@@ -1,19 +1,24 @@
|
|
|
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";
|
|
4
5
|
import { loadConfig, listAgentSpecs, loadAgentSpec, resolveSessionExecution, resolveRuntimeModel, ConversationRuntime, InMemorySessionBus, persistSessionEvent, } from "@rynx-ai/core";
|
|
5
6
|
import { RunnerManager, FileCodexSessionStore, resolveCodexSessionStorePath, } from "@rynx-ai/runtime";
|
|
6
7
|
import { createControlRouter, } from "./control-api.js";
|
|
8
|
+
import { MachineSessionServiceFailure, MachineSessionServiceInputError, } from "./machine-session-service.js";
|
|
7
9
|
import { attachEmulatorTouchWs } from "./emulator-touch-ws.js";
|
|
8
10
|
import { attachTerminalWs } from "./terminal-ws.js";
|
|
9
11
|
import { attachBrowserSurfaceWs } from "./browser-surface-ws.js";
|
|
10
12
|
import { attachEmulatorSurfaceWs } from "./emulator-surface-ws.js";
|
|
11
13
|
import { attachDesktopBrowserHostServer, } from "./desktop-browser-host.js";
|
|
12
14
|
import { resolveControlWebDist, sendSpaFile } from "./control-web-dist.js";
|
|
15
|
+
import { startSessionPortal, } from "./session-portal.js";
|
|
16
|
+
export { createSessionPortalApp, startSessionPortal } from "./session-portal.js";
|
|
13
17
|
import { SessionRuntimeIndex } from "./session-runtime-index.js";
|
|
14
18
|
import { createRunnerSessionTerminalHost, } from "./session-terminal-host.js";
|
|
15
19
|
import { runtimeWebAccessPolicyForBindHost, } from "./runtime-web-auth.js";
|
|
16
20
|
export { MachineSessionService, MachineSessionServiceFailure, MachineSessionServiceInputError, synthesizeSessionTitle, } from "./machine-session-service.js";
|
|
21
|
+
export { SessionPendingInputIndex } from "./session-pending-inputs.js";
|
|
17
22
|
export { SessionBrowserHostError, SessionBrowserService, SessionBrowserServiceError, SessionBrowserSurfaceUnsupportedError, } from "./session-browser-service.js";
|
|
18
23
|
export { SessionEmulatorBindingConflictError, SessionEmulatorService, SessionEmulatorServiceError, } from "./session-emulator-service.js";
|
|
19
24
|
export { SessionBrowserSurfaceCoordinator } from "./session-browser-surface-coordinator.js";
|
|
@@ -25,25 +30,74 @@ export { attachDirectRuntimeBrowserInspectServer, DirectRuntimeBrowserInspectHos
|
|
|
25
30
|
export { RemoteRuntimeDispatcher } from "./remote-runtime-dispatcher.js";
|
|
26
31
|
export { createRunnerSessionTerminalHost, SessionTerminalOpenError, SessionTerminalStreamError, } from "./session-terminal-host.js";
|
|
27
32
|
export { listRuntimeModels } from "@rynx-ai/runtime";
|
|
28
|
-
/**
|
|
33
|
+
/** Bound one mirror write at ten seconds. After that uncertainty boundary,
|
|
34
|
+
* later records may start instead
|
|
35
|
+
* of waiting forever behind a persistence call whose result is unknown. */
|
|
36
|
+
const SESSION_MIRROR_STALL_TIMEOUT_MS = 10_000;
|
|
37
|
+
class SessionMirrorAmbiguousError extends Error {
|
|
38
|
+
abandonToken;
|
|
39
|
+
mirrorClassification = "ambiguous";
|
|
40
|
+
constructor(sessionId, abandonToken) {
|
|
41
|
+
super(`Session mirror persistence did not settle before its response deadline: ${sessionId}`);
|
|
42
|
+
this.abandonToken = abandonToken;
|
|
43
|
+
this.name = "SessionMirrorAmbiguousError";
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function preparedMirrorPersistence(persistence) {
|
|
47
|
+
if (typeof persistence === "object" &&
|
|
48
|
+
persistence !== null &&
|
|
49
|
+
"promise" in persistence)
|
|
50
|
+
return persistence;
|
|
51
|
+
return { promise: persistence };
|
|
52
|
+
}
|
|
53
|
+
/** Preserve one session's mirror order without serializing unrelated sessions.
|
|
54
|
+
* A timed-out operation is not cancelled: like an HTTP read timeout, it may
|
|
55
|
+
* still commit later. Its caller receives `ambiguous` and must not retry. */
|
|
29
56
|
export class SessionMirrorQueue {
|
|
30
57
|
persist;
|
|
58
|
+
stallTimeoutMs;
|
|
31
59
|
tails = new Map();
|
|
32
|
-
constructor(persist) {
|
|
60
|
+
constructor(persist, stallTimeoutMs = SESSION_MIRROR_STALL_TIMEOUT_MS) {
|
|
33
61
|
this.persist = persist;
|
|
62
|
+
this.stallTimeoutMs = stallTimeoutMs;
|
|
34
63
|
}
|
|
35
64
|
enqueue(sessionId, event) {
|
|
36
65
|
const previous = this.tails.get(sessionId) ?? Promise.resolve();
|
|
37
|
-
const
|
|
66
|
+
const bounded = previous
|
|
38
67
|
.catch(() => undefined)
|
|
39
|
-
.then(() =>
|
|
40
|
-
|
|
68
|
+
.then(() => {
|
|
69
|
+
// Prepare only when this record reaches the head of its Session lane.
|
|
70
|
+
// Starting either persistence or its deadline while an older record is
|
|
71
|
+
// still ahead would shorten queued records' attempt windows and allow a
|
|
72
|
+
// burst of them to time out concurrently.
|
|
73
|
+
const prepared = preparedMirrorPersistence(this.persist(sessionId, event));
|
|
74
|
+
let timer;
|
|
75
|
+
return new Promise((resolve, reject) => {
|
|
76
|
+
timer = setTimeout(() => {
|
|
77
|
+
// A user echo claims one exact optimistic pending input while the
|
|
78
|
+
// write starts. Retire it synchronously before rejecting this tail:
|
|
79
|
+
// the next echo must never peek the same content or attachments.
|
|
80
|
+
prepared.onAmbiguous?.();
|
|
81
|
+
reject(new SessionMirrorAmbiguousError(sessionId, prepared.abandonToken));
|
|
82
|
+
}, this.stallTimeoutMs);
|
|
83
|
+
timer.unref?.();
|
|
84
|
+
void prepared.promise.then(resolve, reject);
|
|
85
|
+
}).finally(() => {
|
|
86
|
+
if (timer)
|
|
87
|
+
clearTimeout(timer);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
// The bounded result, not the potentially immortal persistence promise,
|
|
91
|
+
// gates the next record. `operation` remains observed by `bounded`, so a
|
|
92
|
+
// late rejection cannot become an unhandled promise rejection.
|
|
93
|
+
const tail = bounded.catch(() => undefined);
|
|
94
|
+
this.tails.set(sessionId, tail);
|
|
41
95
|
const cleanup = () => {
|
|
42
|
-
if (this.tails.get(sessionId) ===
|
|
96
|
+
if (this.tails.get(sessionId) === tail)
|
|
43
97
|
this.tails.delete(sessionId);
|
|
44
98
|
};
|
|
45
|
-
void
|
|
46
|
-
return
|
|
99
|
+
void tail.then(cleanup, cleanup);
|
|
100
|
+
return bounded;
|
|
47
101
|
}
|
|
48
102
|
}
|
|
49
103
|
/**
|
|
@@ -64,22 +118,77 @@ export function createSessionRuntimeServices(input) {
|
|
|
64
118
|
});
|
|
65
119
|
const sessionBus = new InMemorySessionBus();
|
|
66
120
|
const sessionRuntimeIndex = new SessionRuntimeIndex();
|
|
67
|
-
const sessionMirrorQueue = new SessionMirrorQueue((sessionId, event) =>
|
|
121
|
+
const sessionMirrorQueue = new SessionMirrorQueue((sessionId, event) => {
|
|
122
|
+
// Claim the exact pending projection synchronously when this record reaches
|
|
123
|
+
// the head of its Session lane. Its id remains stable even if persistence
|
|
124
|
+
// later times out or fails after the result becomes ambiguous.
|
|
125
|
+
const pendingResolved = resolvePendingInputEvent(sessionId, event, input.pendingInputs);
|
|
126
|
+
const pendingId = pendingResolved.pendingId;
|
|
127
|
+
const promise = (async () => {
|
|
128
|
+
const finalized = await finalizeGeneratedImageEvent(sessionId, pendingResolved.event, input);
|
|
129
|
+
try {
|
|
130
|
+
await persistSessionEvent(sessionId, finalized, {
|
|
131
|
+
sessionLog: input.sessionLog,
|
|
132
|
+
sessionBus,
|
|
133
|
+
strictPersistence: true,
|
|
134
|
+
...(pendingId
|
|
135
|
+
? {
|
|
136
|
+
onInputPersisted: async (persistedEvent) => {
|
|
137
|
+
if (persistedEvent.clearedPendingId !== pendingId)
|
|
138
|
+
return;
|
|
139
|
+
input.pendingInputs?.resolve(sessionId, pendingId);
|
|
140
|
+
if (!input.onPendingInputPersisted || !pendingResolved.clientMessageId)
|
|
141
|
+
return;
|
|
142
|
+
await input.onPendingInputPersisted({
|
|
143
|
+
sessionId,
|
|
144
|
+
pendingId: persistedEvent.clearedPendingId,
|
|
145
|
+
clientMessageId: pendingResolved.clientMessageId,
|
|
146
|
+
responseId: persistedEvent.item.responseId,
|
|
147
|
+
messageItemId: persistedEvent.item.id,
|
|
148
|
+
});
|
|
149
|
+
},
|
|
150
|
+
}
|
|
151
|
+
: {}),
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
if (pendingId) {
|
|
156
|
+
throw new PendingInputMirrorPersistenceError(error, pendingId);
|
|
157
|
+
}
|
|
158
|
+
throw error;
|
|
159
|
+
}
|
|
160
|
+
sessionRuntimeIndex.observe(sessionId, finalized);
|
|
161
|
+
})();
|
|
162
|
+
return {
|
|
163
|
+
promise,
|
|
164
|
+
...(pendingId
|
|
165
|
+
? {
|
|
166
|
+
abandonToken: pendingId,
|
|
167
|
+
onAmbiguous: () => input.pendingInputs?.resolve(sessionId, pendingId),
|
|
168
|
+
}
|
|
169
|
+
: {}),
|
|
170
|
+
};
|
|
171
|
+
}, input.mirrorStallTimeoutMs);
|
|
68
172
|
const mirrorSessionEvent = (sessionId, event) => {
|
|
69
|
-
sessionRuntimeIndex.observe(sessionId, event);
|
|
70
173
|
return sessionMirrorQueue.enqueue(sessionId, event);
|
|
71
174
|
};
|
|
72
175
|
const conversationRuntime = new ConversationRuntime({
|
|
73
176
|
config: input.config,
|
|
74
177
|
executor: runnerManager,
|
|
75
178
|
sessionBus,
|
|
76
|
-
sessionEventSink: mirrorSessionEvent,
|
|
77
179
|
});
|
|
78
180
|
runnerManager.onMirror((sessionId, event) => {
|
|
79
|
-
|
|
181
|
+
return mirrorSessionEvent(sessionId, event).catch((error) => {
|
|
80
182
|
input.onMirrorError?.(error, sessionId);
|
|
183
|
+
throw error;
|
|
81
184
|
});
|
|
82
185
|
});
|
|
186
|
+
runnerManager.onMirrorAbandon((sessionId, pendingId) => {
|
|
187
|
+
input.pendingInputs?.resolve(sessionId, pendingId);
|
|
188
|
+
});
|
|
189
|
+
runnerManager.onMirrorSupersede((sessionId) => {
|
|
190
|
+
input.pendingInputs?.deleteSession(sessionId);
|
|
191
|
+
});
|
|
83
192
|
return {
|
|
84
193
|
sessionStore,
|
|
85
194
|
runnerManager,
|
|
@@ -89,6 +198,137 @@ export function createSessionRuntimeServices(input) {
|
|
|
89
198
|
publishSessionEvent: mirrorSessionEvent,
|
|
90
199
|
};
|
|
91
200
|
}
|
|
201
|
+
class PendingInputMirrorPersistenceError extends Error {
|
|
202
|
+
abandonToken;
|
|
203
|
+
statusCode;
|
|
204
|
+
constructor(error, abandonToken) {
|
|
205
|
+
super(error instanceof Error ? error.message : String(error), { cause: error });
|
|
206
|
+
this.abandonToken = abandonToken;
|
|
207
|
+
this.name = "PendingInputMirrorPersistenceError";
|
|
208
|
+
if (typeof error === "object" &&
|
|
209
|
+
error !== null &&
|
|
210
|
+
typeof error.statusCode === "number") {
|
|
211
|
+
this.statusCode = error.statusCode;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/** Drain the oldest pending web input when the Provider transcript produces a
|
|
216
|
+
* real user record. The transcript is the only durable writer; the returned id
|
|
217
|
+
* lets clients replace the exact temporary bubble. */
|
|
218
|
+
function resolvePendingInputEvent(sessionId, event, pendingInputs) {
|
|
219
|
+
if (event.type !== "session.input.consumed" ||
|
|
220
|
+
event.item.type !== "message" ||
|
|
221
|
+
event.item.data.role !== "user" ||
|
|
222
|
+
event.item.data.isMeta ||
|
|
223
|
+
event.item.parentToolCallId !== undefined) {
|
|
224
|
+
return { event };
|
|
225
|
+
}
|
|
226
|
+
const pending = pendingInputs?.peekOldest(sessionId);
|
|
227
|
+
if (!pending)
|
|
228
|
+
return { event };
|
|
229
|
+
const fileParts = pending.content.filter((part) => part.type === "input_image" || part.type === "input_file");
|
|
230
|
+
const alreadyHasFiles = event.item.data.content.some((part) => part.type === "input_image" || part.type === "input_file");
|
|
231
|
+
const containsInternalResourceMarker = event.item.data.content.some((part) => part.type === "input_text" &&
|
|
232
|
+
/\[\[RYNX_(?:IMAGE|FILE)_RESOURCE\s/.test(part.text));
|
|
233
|
+
const content = containsInternalResourceMarker
|
|
234
|
+
? pending.content
|
|
235
|
+
: fileParts.length > 0 && !alreadyHasFiles
|
|
236
|
+
? [...fileParts, ...event.item.data.content]
|
|
237
|
+
: event.item.data.content;
|
|
238
|
+
return {
|
|
239
|
+
pendingId: pending.pendingId,
|
|
240
|
+
clientMessageId: pending.clientMessageId,
|
|
241
|
+
event: {
|
|
242
|
+
...event,
|
|
243
|
+
clearedPendingId: pending.pendingId,
|
|
244
|
+
...(content !== event.item.data.content
|
|
245
|
+
? {
|
|
246
|
+
item: {
|
|
247
|
+
...event.item,
|
|
248
|
+
data: {
|
|
249
|
+
...event.item.data,
|
|
250
|
+
content,
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
}
|
|
254
|
+
: {}),
|
|
255
|
+
},
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
async function finalizeGeneratedImageEvent(sessionId, event, input) {
|
|
259
|
+
if (event.type !== "response.output_item.done" ||
|
|
260
|
+
event.item.type !== "function_call_output") {
|
|
261
|
+
return event;
|
|
262
|
+
}
|
|
263
|
+
const rawData = event.item.data;
|
|
264
|
+
const pending = rawData.__rynxGeneratedImage;
|
|
265
|
+
if (!pending)
|
|
266
|
+
return event;
|
|
267
|
+
const { __rynxGeneratedImage: _omitted, ...data } = rawData;
|
|
268
|
+
try {
|
|
269
|
+
const pathMediaType = pending.savedPath && isAbsolute(pending.savedPath)
|
|
270
|
+
? imageMediaTypeFromPath(pending.savedPath)
|
|
271
|
+
: undefined;
|
|
272
|
+
const generatedImage = pathMediaType && pending.savedPath
|
|
273
|
+
? {
|
|
274
|
+
path: pending.savedPath,
|
|
275
|
+
filename: basename(pending.savedPath),
|
|
276
|
+
mediaType: pathMediaType,
|
|
277
|
+
}
|
|
278
|
+
: pending.result && input.materializeGeneratedImage
|
|
279
|
+
? await input.materializeGeneratedImage({
|
|
280
|
+
sessionId,
|
|
281
|
+
sourceId: event.item.id,
|
|
282
|
+
result: pending.result,
|
|
283
|
+
})
|
|
284
|
+
: undefined;
|
|
285
|
+
return {
|
|
286
|
+
...event,
|
|
287
|
+
item: {
|
|
288
|
+
...event.item,
|
|
289
|
+
data: {
|
|
290
|
+
...data,
|
|
291
|
+
...(generatedImage ? { generatedImage } : {}),
|
|
292
|
+
...(!generatedImage && pending.savedPath && !isAbsolute(pending.savedPath)
|
|
293
|
+
? { output: `${data.output}\nImage path was not absolute; preview omitted.`.trim() }
|
|
294
|
+
: {}),
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
input.onMirrorError?.(error, sessionId);
|
|
301
|
+
// The source bytes are part of an ordinary durable delivery.
|
|
302
|
+
// Only deterministic validation/conflict failures may discard their
|
|
303
|
+
// preview; infrastructure and explicitly retryable resource failures must
|
|
304
|
+
// NACK so the child retries the exact image commit.
|
|
305
|
+
if (!(error instanceof MachineSessionServiceFailure) ||
|
|
306
|
+
error.retryable) {
|
|
307
|
+
throw error;
|
|
308
|
+
}
|
|
309
|
+
return {
|
|
310
|
+
...event,
|
|
311
|
+
item: {
|
|
312
|
+
...event.item,
|
|
313
|
+
data: {
|
|
314
|
+
...data,
|
|
315
|
+
output: `${data.output}\nImage preview unavailable.`.trim(),
|
|
316
|
+
},
|
|
317
|
+
},
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
function imageMediaTypeFromPath(path) {
|
|
322
|
+
switch (extname(path).toLowerCase()) {
|
|
323
|
+
case ".png": return "image/png";
|
|
324
|
+
case ".jpg":
|
|
325
|
+
case ".jpeg": return "image/jpeg";
|
|
326
|
+
case ".webp": return "image/webp";
|
|
327
|
+
case ".gif": return "image/gif";
|
|
328
|
+
case ".svg": return "image/svg+xml";
|
|
329
|
+
default: return undefined;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
92
332
|
/**
|
|
93
333
|
* The HTTP surface is just a liveness probe for container orchestration — all
|
|
94
334
|
* agent capabilities are forwarded through the mounted channel plugins (the
|
|
@@ -137,7 +377,7 @@ export function createApp({ config = loadConfig(), control } = {}) {
|
|
|
137
377
|
}
|
|
138
378
|
return app;
|
|
139
379
|
}
|
|
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, } = {}) {
|
|
380
|
+
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
381
|
const runtimeWebAccess = runtimeWebAccessPolicyForBindHost(config.HOST);
|
|
142
382
|
const desktopBrowserManagementToken = desktopBrowserHost
|
|
143
383
|
? requireDaemonManagementToken(daemonManagement)
|
|
@@ -160,14 +400,58 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
|
|
|
160
400
|
return { cwd: session.workspace.cwd };
|
|
161
401
|
},
|
|
162
402
|
});
|
|
403
|
+
const controlShutdown = new AbortController();
|
|
404
|
+
const controlSurface = control
|
|
405
|
+
? {
|
|
406
|
+
deps: control,
|
|
407
|
+
runtime: conversationRuntime,
|
|
408
|
+
sessionBus,
|
|
409
|
+
sessionLog,
|
|
410
|
+
runnerManager,
|
|
411
|
+
sessionStore,
|
|
412
|
+
pluginRuntimeStatus: pluginRuntime
|
|
413
|
+
? () => pluginRuntime.statusSnapshot()
|
|
414
|
+
: undefined,
|
|
415
|
+
daemonManagement,
|
|
416
|
+
remoteRuntime,
|
|
417
|
+
remoteRuntimeAdmin,
|
|
418
|
+
runtimeTargetControl,
|
|
419
|
+
runtimeConnectionResolver,
|
|
420
|
+
localSessionResources,
|
|
421
|
+
localMachineSessions,
|
|
422
|
+
sessionEmulators,
|
|
423
|
+
shutdownSignal: controlShutdown.signal,
|
|
424
|
+
sessionRuntimeIndex,
|
|
425
|
+
sessionLifecycle,
|
|
426
|
+
runtimeLocalBrowser,
|
|
427
|
+
providerClis,
|
|
428
|
+
}
|
|
429
|
+
: undefined;
|
|
430
|
+
const sessionPortalConfig = config.RYNX_SESSION_PORTAL_PORT !== undefined
|
|
431
|
+
? (() => {
|
|
432
|
+
if (runtimeWebAccess.mode !== "loopback") {
|
|
433
|
+
throw new Error("Session Portal requires the ordinary Control listener to bind loopback only");
|
|
434
|
+
}
|
|
435
|
+
const controlWebDist = resolveControlWebDist();
|
|
436
|
+
if (!sessionPortalAuthorization || !controlSurface || !controlWebDist) {
|
|
437
|
+
throw new Error("Session Portal requires authorization, Control services, and the native Control Web build");
|
|
438
|
+
}
|
|
439
|
+
return { authorization: sessionPortalAuthorization, controlWebDist };
|
|
440
|
+
})()
|
|
441
|
+
: undefined;
|
|
442
|
+
let sessionPortalServer;
|
|
163
443
|
if (pluginRuntime) {
|
|
164
444
|
if (!sessionRegistry)
|
|
165
445
|
throw new Error("plugin runtime requires a machine session registry");
|
|
446
|
+
if (!localMachineSessions) {
|
|
447
|
+
throw new Error("plugin runtime requires the machine Session service");
|
|
448
|
+
}
|
|
166
449
|
pluginRuntime.bindHostServices({
|
|
167
|
-
conversationRuntime,
|
|
168
450
|
capabilities: runnerManager,
|
|
169
451
|
sessionStore,
|
|
170
452
|
sessionRegistry,
|
|
453
|
+
sessionRuns: localMachineSessions,
|
|
454
|
+
sessionFiles: localMachineSessions,
|
|
171
455
|
agentCatalog: {
|
|
172
456
|
list: async () => (await listAgentSpecs()).map(toPluginAgentSummary),
|
|
173
457
|
get: async (id) => {
|
|
@@ -180,9 +464,57 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
|
|
|
180
464
|
session: input.session,
|
|
181
465
|
}),
|
|
182
466
|
},
|
|
467
|
+
sessionActivity: (sessionId) => {
|
|
468
|
+
const snapshot = sessionRuntimeIndex.snapshot(sessionId);
|
|
469
|
+
return {
|
|
470
|
+
...snapshot,
|
|
471
|
+
status: snapshot.pendingInteractions.length > 0
|
|
472
|
+
? "waiting"
|
|
473
|
+
: snapshot.status,
|
|
474
|
+
};
|
|
475
|
+
},
|
|
183
476
|
interruptSession: (sessionId) => runnerManager.interruptLiveSession(sessionId),
|
|
184
477
|
terminateSession: (sessionId) => runnerManager.terminateLiveSession(sessionId),
|
|
478
|
+
...(sessionLog
|
|
479
|
+
? {
|
|
480
|
+
sessionTimeline: {
|
|
481
|
+
hasItem: async (sessionId, itemId) => Boolean(await sessionLog.get(sessionId, itemId)),
|
|
482
|
+
projectText: async ({ sessionId, responseId, itemId, text }) => {
|
|
483
|
+
const event = {
|
|
484
|
+
type: "response.output_item.done",
|
|
485
|
+
responseId,
|
|
486
|
+
item: {
|
|
487
|
+
id: itemId,
|
|
488
|
+
sessionId,
|
|
489
|
+
position: -1,
|
|
490
|
+
responseId,
|
|
491
|
+
status: "completed",
|
|
492
|
+
createdAt: Date.now(),
|
|
493
|
+
createdBy: "plugin_projection",
|
|
494
|
+
type: "message",
|
|
495
|
+
data: { role: "assistant", content: [{ type: "output_text", text }] },
|
|
496
|
+
},
|
|
497
|
+
};
|
|
498
|
+
// Projection is an acknowledged durable operation, unlike the
|
|
499
|
+
// provider mirror's deliberately best-effort live fan-out.
|
|
500
|
+
// Append first and only then publish; a failed append leaves the
|
|
501
|
+
// projection ledger pending so the Plugin can retry safely.
|
|
502
|
+
await sessionLog.append(sessionId, [event.item]);
|
|
503
|
+
sessionServices.sessionBus.publish(sessionId, event);
|
|
504
|
+
},
|
|
505
|
+
},
|
|
506
|
+
}
|
|
507
|
+
: {}),
|
|
185
508
|
resolveSessionInteraction: (sessionId, interactionId, resolution) => runnerManager.resolveInteraction(sessionId, interactionId, resolution),
|
|
509
|
+
...(sessionPortalConfig
|
|
510
|
+
? {
|
|
511
|
+
sessionPortal: {
|
|
512
|
+
scheme: "http",
|
|
513
|
+
bindHost: config.RYNX_SESSION_PORTAL_HOST,
|
|
514
|
+
port: config.RYNX_SESSION_PORTAL_PORT,
|
|
515
|
+
},
|
|
516
|
+
}
|
|
517
|
+
: {}),
|
|
186
518
|
});
|
|
187
519
|
}
|
|
188
520
|
// Provider TUI `/clear`·`/fork` uses the same publication boundary as an
|
|
@@ -196,40 +528,55 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
|
|
|
196
528
|
sourceSessionId: r.from,
|
|
197
529
|
targetSessionId: r.to,
|
|
198
530
|
kind: r.kind,
|
|
531
|
+
}).catch((error) => {
|
|
532
|
+
if (error instanceof MachineSessionServiceInputError) {
|
|
533
|
+
throw Object.assign(error, { statusCode: 400 });
|
|
534
|
+
}
|
|
535
|
+
if (error instanceof MachineSessionServiceFailure) {
|
|
536
|
+
// A mismatched pre-existing target is a deterministic payload conflict,
|
|
537
|
+
// not an HTTP-style concurrent 409. Surface it as permanent so the
|
|
538
|
+
// three-attempt permanent-error budget can stop the rotation lane.
|
|
539
|
+
const statusCode = error.code === "outcome_unknown"
|
|
540
|
+
? 503
|
|
541
|
+
: error.code === "not_found"
|
|
542
|
+
? 404
|
|
543
|
+
: 422;
|
|
544
|
+
throw Object.assign(error, { statusCode });
|
|
545
|
+
}
|
|
546
|
+
throw error;
|
|
199
547
|
});
|
|
200
548
|
});
|
|
201
|
-
|
|
549
|
+
if (localMachineSessions) {
|
|
550
|
+
runnerManager.onCollaborationMode((sessionId, mode) => {
|
|
551
|
+
localMachineSessions.recordNativeCollaborationMode(sessionId, mode);
|
|
552
|
+
});
|
|
553
|
+
}
|
|
202
554
|
const app = createApp({
|
|
203
555
|
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,
|
|
556
|
+
control: controlSurface,
|
|
230
557
|
});
|
|
231
|
-
return new Promise((resolve) => {
|
|
558
|
+
return new Promise((resolve, reject) => {
|
|
559
|
+
let startupWebSocketServers = [];
|
|
560
|
+
const rejectBeforeListening = (error) => reject(error);
|
|
232
561
|
const server = app.listen(config.PORT, config.HOST, () => {
|
|
562
|
+
server.off("error", rejectBeforeListening);
|
|
563
|
+
void finishStartup(server).catch(async (error) => {
|
|
564
|
+
controlShutdown.abort(asError(error));
|
|
565
|
+
sessionPortalServer?.stopAccepting();
|
|
566
|
+
server.closeAllConnections?.();
|
|
567
|
+
await Promise.allSettled([
|
|
568
|
+
closeWebSocketServers(startupWebSocketServers),
|
|
569
|
+
sessionPortalServer?.shutdown() ?? Promise.resolve(),
|
|
570
|
+
new Promise((done) => server.close(() => done())),
|
|
571
|
+
Promise.resolve(daemonManagement?.pluginManagement?.dispose?.()),
|
|
572
|
+
Promise.resolve(pluginRuntime?.dispose()),
|
|
573
|
+
runnerManager.stop(),
|
|
574
|
+
]);
|
|
575
|
+
reject(error);
|
|
576
|
+
});
|
|
577
|
+
});
|
|
578
|
+
server.once("error", rejectBeforeListening);
|
|
579
|
+
const finishStartup = async (server) => {
|
|
233
580
|
console.log(JSON.stringify({
|
|
234
581
|
level: config.LOG_LEVEL,
|
|
235
582
|
msg: "Harness agent server listening",
|
|
@@ -238,15 +585,6 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
|
|
|
238
585
|
runtime: config.DEFAULT_RUNTIME,
|
|
239
586
|
model: resolveRuntimeModel(config, config.DEFAULT_RUNTIME),
|
|
240
587
|
}));
|
|
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
588
|
const webSocketServers = [
|
|
251
589
|
attachTerminalWs(server, {
|
|
252
590
|
runtimeConnectionResolver,
|
|
@@ -265,19 +603,48 @@ export async function startServer({ config = loadConfig(), control, sessionLog,
|
|
|
265
603
|
if (control?.emulator) {
|
|
266
604
|
webSocketServers.push(attachEmulatorTouchWs(server, { emulator: control.emulator }));
|
|
267
605
|
}
|
|
606
|
+
startupWebSocketServers = webSocketServers;
|
|
607
|
+
// Plugin recovery fences and revokes any product-owned Portal authority.
|
|
608
|
+
// Do not expose the listener until every enabled Plugin got its serialized
|
|
609
|
+
// startup attempt; startPluginRuntimes absorbs individual failures.
|
|
610
|
+
await (pluginRuntime?.startPluginRuntimes() ?? Promise.resolve());
|
|
611
|
+
if (sessionPortalConfig) {
|
|
612
|
+
sessionPortalServer = await startSessionPortal({
|
|
613
|
+
host: config.RYNX_SESSION_PORTAL_HOST,
|
|
614
|
+
port: config.RYNX_SESSION_PORTAL_PORT,
|
|
615
|
+
scheme: "http",
|
|
616
|
+
authorization: sessionPortalConfig.authorization,
|
|
617
|
+
controlOrigin: listeningHttpOrigin(server),
|
|
618
|
+
controlWebDist: sessionPortalConfig.controlWebDist,
|
|
619
|
+
shutdownSignal: controlShutdown.signal,
|
|
620
|
+
});
|
|
621
|
+
}
|
|
268
622
|
resolve(bindServerLifecycle(server, {
|
|
269
|
-
fence: () =>
|
|
270
|
-
|
|
623
|
+
fence: () => {
|
|
624
|
+
controlShutdown.abort(new Error("Rynx server is shutting down"));
|
|
625
|
+
sessionPortalServer?.stopAccepting();
|
|
626
|
+
},
|
|
627
|
+
closeUpgrades: () => Promise.all([
|
|
628
|
+
closeWebSocketServers(webSocketServers),
|
|
629
|
+
sessionPortalServer?.shutdown() ?? Promise.resolve(),
|
|
630
|
+
]).then(() => undefined),
|
|
271
631
|
cleanup: async () => runCleanupSteps([
|
|
272
|
-
() => startup.catch(() => undefined),
|
|
273
632
|
() => Promise.resolve(daemonManagement?.pluginManagement?.dispose?.()),
|
|
274
633
|
() => pluginRuntime?.dispose() ?? Promise.resolve(),
|
|
275
634
|
() => runnerManager.stop(),
|
|
276
635
|
]),
|
|
277
636
|
}));
|
|
278
|
-
}
|
|
637
|
+
};
|
|
279
638
|
});
|
|
280
639
|
}
|
|
640
|
+
function listeningHttpOrigin(server) {
|
|
641
|
+
const address = server.address();
|
|
642
|
+
if (!address || typeof address === "string") {
|
|
643
|
+
throw new Error("Control listener did not expose an HTTP address");
|
|
644
|
+
}
|
|
645
|
+
const host = address.address.includes(":") ? `[${address.address}]` : address.address;
|
|
646
|
+
return `http://${host}:${address.port}`;
|
|
647
|
+
}
|
|
281
648
|
function requireDaemonManagementToken(host) {
|
|
282
649
|
const token = host?.managementToken;
|
|
283
650
|
const bytes = typeof token === "string" ? Buffer.byteLength(token, "utf8") : 0;
|