@vividcodeai/embeddedcowork-dev 0.0.3-dev-20260507-b76190e8
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/README.md +173 -0
- package/dist/api-types.js +1 -0
- package/dist/auth/auth-store.js +134 -0
- package/dist/auth/http-auth.js +37 -0
- package/dist/auth/manager.js +140 -0
- package/dist/auth/password-hash.js +32 -0
- package/dist/auth/session-manager.js +17 -0
- package/dist/auth/token-manager.js +27 -0
- package/dist/background-processes/manager.js +576 -0
- package/dist/bin.js +24 -0
- package/dist/clients/connection-manager.js +93 -0
- package/dist/config/location.js +57 -0
- package/dist/config/schema.js +71 -0
- package/dist/events/bus.js +45 -0
- package/dist/filesystem/__tests__/search-cache.test.js +40 -0
- package/dist/filesystem/browser.js +292 -0
- package/dist/filesystem/search-cache.js +43 -0
- package/dist/filesystem/search.js +135 -0
- package/dist/index.js +466 -0
- package/dist/launcher.js +149 -0
- package/dist/loader.js +21 -0
- package/dist/logger.js +109 -0
- package/dist/opencode-config/README.md +32 -0
- package/dist/opencode-config/opencode.jsonc +3 -0
- package/dist/opencode-config/package.json +9 -0
- package/dist/opencode-config/plugin/embeddedcowork.ts +62 -0
- package/dist/opencode-config/plugin/lib/background-process.ts +265 -0
- package/dist/opencode-config/plugin/lib/client.ts +133 -0
- package/dist/opencode-config/plugin/lib/request.ts +214 -0
- package/dist/opencode-config.js +15 -0
- package/dist/plugins/channel.js +40 -0
- package/dist/plugins/handlers.js +17 -0
- package/dist/plugins/voice-mode.js +78 -0
- package/dist/releases/dev-release-monitor.js +75 -0
- package/dist/releases/release-monitor.js +107 -0
- package/dist/runtime-paths.js +67 -0
- package/dist/server/__tests__/network-addresses.test.js +68 -0
- package/dist/server/__tests__/remote-proxy.test.js +204 -0
- package/dist/server/http-server.js +996 -0
- package/dist/server/network-addresses.js +114 -0
- package/dist/server/remote-proxy.js +466 -0
- package/dist/server/routes/auth-pages/login.html +135 -0
- package/dist/server/routes/auth-pages/token.html +93 -0
- package/dist/server/routes/auth.js +149 -0
- package/dist/server/routes/background-processes.js +78 -0
- package/dist/server/routes/events.js +66 -0
- package/dist/server/routes/filesystem.js +43 -0
- package/dist/server/routes/meta.js +44 -0
- package/dist/server/routes/plugin.js +70 -0
- package/dist/server/routes/remote-proxy.js +42 -0
- package/dist/server/routes/remote-servers.js +142 -0
- package/dist/server/routes/settings.js +69 -0
- package/dist/server/routes/sidecars.js +46 -0
- package/dist/server/routes/speech.js +63 -0
- package/dist/server/routes/storage.js +52 -0
- package/dist/server/routes/workspaces.js +221 -0
- package/dist/server/routes/worktrees.js +156 -0
- package/dist/server/tls.js +224 -0
- package/dist/settings/binaries.js +37 -0
- package/dist/settings/merge-patch.js +33 -0
- package/dist/settings/migrate.js +238 -0
- package/dist/settings/public-config.js +33 -0
- package/dist/settings/service.js +101 -0
- package/dist/settings/yaml-doc-store.js +96 -0
- package/dist/sidecars/manager.js +193 -0
- package/dist/speech/providers/openai-compatible.js +189 -0
- package/dist/speech/service.js +58 -0
- package/dist/storage/instance-store.js +56 -0
- package/dist/ui/__tests__/remote-ui.test.js +67 -0
- package/dist/ui/remote-ui.js +462 -0
- package/dist/workspaces/__tests__/spawn.test.js +139 -0
- package/dist/workspaces/git-mutations.js +98 -0
- package/dist/workspaces/git-status.js +323 -0
- package/dist/workspaces/git-worktrees.js +216 -0
- package/dist/workspaces/instance-events.js +180 -0
- package/dist/workspaces/manager.js +420 -0
- package/dist/workspaces/opencode-auth.js +16 -0
- package/dist/workspaces/runtime.js +366 -0
- package/dist/workspaces/spawn.js +219 -0
- package/dist/workspaces/worktree-directory.js +74 -0
- package/dist/workspaces/worktree-map.js +116 -0
- package/package.json +57 -0
- package/public/apple-touch-icon-180x180.png +0 -0
- package/public/assets/ChangesTab-C2DJXDf9.js +2 -0
- package/public/assets/DiffToolbar-De-3SRCF.js +1 -0
- package/public/assets/EmbeddedCowork-Icon-DSw5nKk7.png +0 -0
- package/public/assets/FilesTab-BuQ00MEc.js +2 -0
- package/public/assets/GitChangesTab-D9bf2jkM.js +2 -0
- package/public/assets/SplitFilePanel-B-3h60o2.js +1 -0
- package/public/assets/StatusTab-D5s19fRN.js +1 -0
- package/public/assets/abap-BdImnpbu.js +1 -0
- package/public/assets/actionscript-3-CfeIJUat.js +1 -0
- package/public/assets/ada-bCR0ucgS.js +1 -0
- package/public/assets/andromeeda-C-Jbm3Hp.js +1 -0
- package/public/assets/angular-html-CU67Zn6k.js +1 -0
- package/public/assets/angular-ts-BwZT4LLn.js +1 -0
- package/public/assets/apache-Pmp26Uib.js +1 -0
- package/public/assets/apex-DhZLUxFE.js +1 -0
- package/public/assets/apl-dKokRX4l.js +1 -0
- package/public/assets/applescript-Co6uUVPk.js +1 -0
- package/public/assets/ara-BRHolxvo.js +1 -0
- package/public/assets/asciidoc-Dv7Oe6Be.js +1 -0
- package/public/assets/asm-D_Q5rh1f.js +1 -0
- package/public/assets/astro-CbQHKStN.js +1 -0
- package/public/assets/aurora-x-D-2ljcwZ.js +1 -0
- package/public/assets/awk-DMzUqQB5.js +1 -0
- package/public/assets/ayu-dark-Cv9koXgw.js +1 -0
- package/public/assets/ballerina-BFfxhgS-.js +1 -0
- package/public/assets/bat-BkioyH1T.js +1 -0
- package/public/assets/beancount-k_qm7-4y.js +1 -0
- package/public/assets/berry-D08WgyRC.js +1 -0
- package/public/assets/bibtex-CHM0blh-.js +1 -0
- package/public/assets/bicep-Bmn6On1c.js +1 -0
- package/public/assets/blade-DVc8C-J4.js +1 -0
- package/public/assets/bsl-BO_Y6i37.js +1 -0
- package/public/assets/bundle-full-CdNbUxmo.js +13 -0
- package/public/assets/c-BIGW1oBm.js +1 -0
- package/public/assets/cadence-Bv_4Rxtq.js +1 -0
- package/public/assets/cairo-KRGpt6FW.js +1 -0
- package/public/assets/catppuccin-frappe-DFWUc33u.js +1 -0
- package/public/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
- package/public/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
- package/public/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
- package/public/assets/clarity-D53aC0YG.js +1 -0
- package/public/assets/clojure-P80f7IUj.js +1 -0
- package/public/assets/cmake-D1j8_8rp.js +1 -0
- package/public/assets/cobol-nwyudZeR.js +1 -0
- package/public/assets/codeowners-Bp6g37R7.js +1 -0
- package/public/assets/codeql-DsOJ9woJ.js +1 -0
- package/public/assets/coffee-Ch7k5sss.js +1 -0
- package/public/assets/common-lisp-Cg-RD9OK.js +1 -0
- package/public/assets/coq-DkFqJrB1.js +1 -0
- package/public/assets/core-DhEqZVGG.js +1 -0
- package/public/assets/cpp-CofmeUqb.js +1 -0
- package/public/assets/crystal-tKQVLTB8.js +1 -0
- package/public/assets/csharp-CX12Zw3r.js +1 -0
- package/public/assets/css-DPfMkruS.js +1 -0
- package/public/assets/csv-fuZLfV_i.js +1 -0
- package/public/assets/cue-D82EKSYY.js +1 -0
- package/public/assets/cypher-COkxafJQ.js +1 -0
- package/public/assets/d-85-TOEBH.js +1 -0
- package/public/assets/dark-plus-eOWES_5F.js +1 -0
- package/public/assets/dart-CF10PKvl.js +1 -0
- package/public/assets/dax-CEL-wOlO.js +1 -0
- package/public/assets/desktop-BmXAJ9_W.js +1 -0
- package/public/assets/diff-D97Zzqfu.js +1 -0
- package/public/assets/diff-viewer-B1l_VZc1.js +1 -0
- package/public/assets/docker-BcOcwvcX.js +1 -0
- package/public/assets/dotenv-Da5cRb03.js +1 -0
- package/public/assets/dracula-BzJJZx-M.js +1 -0
- package/public/assets/dracula-soft-BXkSAIEj.js +1 -0
- package/public/assets/dream-maker-BtqSS_iP.js +1 -0
- package/public/assets/edge-BkV0erSs.js +1 -0
- package/public/assets/elixir-CDX3lj18.js +1 -0
- package/public/assets/elm-DbKCFpqz.js +1 -0
- package/public/assets/emacs-lisp-C9XAeP06.js +1 -0
- package/public/assets/erb-BOJIQeun.js +1 -0
- package/public/assets/erlang-DsQrWhSR.js +1 -0
- package/public/assets/event-DjZVAIBO.js +1 -0
- package/public/assets/everforest-dark-BgDCqdQA.js +1 -0
- package/public/assets/everforest-light-C8M2exoo.js +1 -0
- package/public/assets/fast-diff-vendor-DgdwVvTQ.js +1 -0
- package/public/assets/fennel-BYunw83y.js +1 -0
- package/public/assets/fish-BvzEVeQv.js +1 -0
- package/public/assets/fluent-C4IJs8-o.js +1 -0
- package/public/assets/fortran-fixed-form-BZjJHVRy.js +1 -0
- package/public/assets/fortran-free-form-D22FLkUw.js +1 -0
- package/public/assets/fsharp-CXgrBDvD.js +1 -0
- package/public/assets/gdresource-B7Tvp0Sc.js +1 -0
- package/public/assets/gdscript-DTMYz4Jt.js +1 -0
- package/public/assets/gdshader-DkwncUOv.js +1 -0
- package/public/assets/genie-D0YGMca9.js +1 -0
- package/public/assets/gherkin-DyxjwDmM.js +1 -0
- package/public/assets/git-commit-F4YmCXRG.js +1 -0
- package/public/assets/git-diff-vendor-CSgooKT_.js +52 -0
- package/public/assets/git-diff-vendor-HAZkIolJ.css +19 -0
- package/public/assets/git-rebase-r7XF79zn.js +1 -0
- package/public/assets/github-dark-DHJKELXO.js +1 -0
- package/public/assets/github-dark-default-Cuk6v7N8.js +1 -0
- package/public/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
- package/public/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
- package/public/assets/github-light-DAi9KRSo.js +1 -0
- package/public/assets/github-light-default-D7oLnXFd.js +1 -0
- package/public/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
- package/public/assets/gleam-BspZqrRM.js +1 -0
- package/public/assets/glimmer-js-Rg0-pVw9.js +1 -0
- package/public/assets/glimmer-ts-U6CK756n.js +1 -0
- package/public/assets/glsl-DplSGwfg.js +1 -0
- package/public/assets/gnuplot-DdkO51Og.js +1 -0
- package/public/assets/go-Dn2_MT6a.js +1 -0
- package/public/assets/graphql-ChdNCCLP.js +1 -0
- package/public/assets/groovy-gcz8RCvz.js +1 -0
- package/public/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
- package/public/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
- package/public/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
- package/public/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
- package/public/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
- package/public/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
- package/public/assets/hack-CaT9iCJl.js +1 -0
- package/public/assets/haml-B8DHNrY2.js +1 -0
- package/public/assets/handlebars-BL8al0AC.js +1 -0
- package/public/assets/haskell-Df6bDoY_.js +1 -0
- package/public/assets/haxe-CzTSHFRz.js +1 -0
- package/public/assets/hcl-BWvSN4gD.js +1 -0
- package/public/assets/highlight-vendor-8FKMu9os.js +10 -0
- package/public/assets/hjson-D5-asLiD.js +1 -0
- package/public/assets/hlsl-D3lLCCz7.js +1 -0
- package/public/assets/houston-DnULxvSX.js +1 -0
- package/public/assets/html-GMplVEZG.js +1 -0
- package/public/assets/html-derivative-BFtXZ54Q.js +1 -0
- package/public/assets/http-jrhK8wxY.js +1 -0
- package/public/assets/hurl-irOxFIW8.js +1 -0
- package/public/assets/hxml-Bvhsp5Yf.js +1 -0
- package/public/assets/hy-DFXneXwc.js +1 -0
- package/public/assets/imba-DGztddWO.js +1 -0
- package/public/assets/index-B2LsA7hD.js +1 -0
- package/public/assets/index-BErmCqgL.js +1 -0
- package/public/assets/index-BKMyzTSR.js +1 -0
- package/public/assets/index-BKvZBimW.js +1 -0
- package/public/assets/index-BQeBs108.js +1 -0
- package/public/assets/index-BqQARTCd.js +1 -0
- package/public/assets/index-C9Tl2tHH.js +2 -0
- package/public/assets/index-CLSJ4cO9.js +1 -0
- package/public/assets/index-DElsPAzQ.css +1 -0
- package/public/assets/index-ixx_g9gD.js +1 -0
- package/public/assets/ini-BEwlwnbL.js +1 -0
- package/public/assets/java-CylS5w8V.js +1 -0
- package/public/assets/javascript-wDzz0qaB.js +1 -0
- package/public/assets/jinja-4LBKfQ-Z.js +1 -0
- package/public/assets/jison-wvAkD_A8.js +1 -0
- package/public/assets/json-Cp-IABpG.js +1 -0
- package/public/assets/json5-C9tS-k6U.js +1 -0
- package/public/assets/jsonc-Des-eS-w.js +1 -0
- package/public/assets/jsonl-DcaNXYhu.js +1 -0
- package/public/assets/jsonnet-DFQXde-d.js +1 -0
- package/public/assets/jssm-C2t-YnRu.js +1 -0
- package/public/assets/jsx-g9-lgVsj.js +1 -0
- package/public/assets/julia-C8NyazO9.js +1 -0
- package/public/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
- package/public/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
- package/public/assets/kanagawa-wave-DWedfzmr.js +1 -0
- package/public/assets/kdl-DV7GczEv.js +1 -0
- package/public/assets/kotlin-BdnUsdx6.js +1 -0
- package/public/assets/kusto-BvAqAH-y.js +1 -0
- package/public/assets/laserwave-DUszq2jm.js +1 -0
- package/public/assets/latex-BUKiar2Z.js +1 -0
- package/public/assets/lean-DP1Csr6i.js +1 -0
- package/public/assets/less-B1dDrJ26.js +1 -0
- package/public/assets/light-plus-B7mTdjB0.js +1 -0
- package/public/assets/liquid-DYVedYrR.js +1 -0
- package/public/assets/llvm-BtvRca6l.js +1 -0
- package/public/assets/loading-CQjaT4lJ.js +2 -0
- package/public/assets/loading-CugGjKDZ.css +1 -0
- package/public/assets/log-2UxHyX5q.js +1 -0
- package/public/assets/logo-BtOb2qkB.js +1 -0
- package/public/assets/lua-BbnMAYS6.js +1 -0
- package/public/assets/luau-CXu1NL6O.js +1 -0
- package/public/assets/main-C1yBw4P8.js +53 -0
- package/public/assets/make-CHLpvVh8.js +1 -0
- package/public/assets/markdown-Cvjx9yec.js +1 -0
- package/public/assets/markdown-D5eIdNMf.js +58 -0
- package/public/assets/marko-CPi9NSCl.js +1 -0
- package/public/assets/material-theme-D5KoaKCx.js +1 -0
- package/public/assets/material-theme-darker-BfHTSMKl.js +1 -0
- package/public/assets/material-theme-lighter-B0m2ddpp.js +1 -0
- package/public/assets/material-theme-ocean-CyktbL80.js +1 -0
- package/public/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
- package/public/assets/matlab-D7o27uSR.js +1 -0
- package/public/assets/mdc-DUICxH0z.js +1 -0
- package/public/assets/mdx-Cmh6b_Ma.js +1 -0
- package/public/assets/mermaid-DKYwYmdq.js +1 -0
- package/public/assets/min-dark-CafNBF8u.js +1 -0
- package/public/assets/min-light-CTRr51gU.js +1 -0
- package/public/assets/mipsasm-CKIfxQSi.js +1 -0
- package/public/assets/mojo-1DNp92w6.js +1 -0
- package/public/assets/monaco-viewer-9Byc1Kpy.js +26 -0
- package/public/assets/monokai-D4h5O-jR.js +1 -0
- package/public/assets/move-Bu9oaDYs.js +1 -0
- package/public/assets/narrat-DRg8JJMk.js +1 -0
- package/public/assets/nextflow-CUEJCptM.js +1 -0
- package/public/assets/nginx-DknmC5AR.js +1 -0
- package/public/assets/night-owl-C39BiMTA.js +1 -0
- package/public/assets/nim-CVrawwO9.js +1 -0
- package/public/assets/nix-BbRYJGeE.js +1 -0
- package/public/assets/nord-Ddv68eIx.js +1 -0
- package/public/assets/nushell-C-sUppwS.js +1 -0
- package/public/assets/objective-c-DXmwc3jG.js +1 -0
- package/public/assets/objective-cpp-CLxacb5B.js +1 -0
- package/public/assets/ocaml-C0hk2d4L.js +1 -0
- package/public/assets/one-dark-pro-DVMEJ2y_.js +1 -0
- package/public/assets/one-light-PoHY5YXO.js +1 -0
- package/public/assets/pascal-D93ZcfNL.js +1 -0
- package/public/assets/perl-C0TMdlhV.js +1 -0
- package/public/assets/php-CDn_0X-4.js +1 -0
- package/public/assets/pkl-u5AG7uiY.js +1 -0
- package/public/assets/plastic-3e1v2bzS.js +1 -0
- package/public/assets/plsql-ChMvpjG-.js +1 -0
- package/public/assets/po-BTJTHyun.js +1 -0
- package/public/assets/poimandres-CS3Unz2-.js +1 -0
- package/public/assets/polar-C0HS_06l.js +1 -0
- package/public/assets/postcss-CXtECtnM.js +1 -0
- package/public/assets/powerquery-CEu0bR-o.js +1 -0
- package/public/assets/powershell-Dpen1YoG.js +1 -0
- package/public/assets/prisma-Dd19v3D-.js +1 -0
- package/public/assets/prolog-CbFg5uaA.js +1 -0
- package/public/assets/proto-DyJlTyXw.js +1 -0
- package/public/assets/pug-CGlum2m_.js +1 -0
- package/public/assets/puppet-BMWR74SV.js +1 -0
- package/public/assets/purescript-CklMAg4u.js +1 -0
- package/public/assets/python-B6aJPvgy.js +1 -0
- package/public/assets/qml-3beO22l8.js +1 -0
- package/public/assets/qmldir-C8lEn-DE.js +1 -0
- package/public/assets/qss-IeuSbFQv.js +1 -0
- package/public/assets/r-DiinP2Uv.js +1 -0
- package/public/assets/racket-BqYA7rlc.js +1 -0
- package/public/assets/raku-DXvB9xmW.js +1 -0
- package/public/assets/razor-WgofotgN.js +1 -0
- package/public/assets/red-bN70gL4F.js +1 -0
- package/public/assets/reg-C-SQnVFl.js +1 -0
- package/public/assets/regexp-CDVJQ6XC.js +1 -0
- package/public/assets/rel-C3B-1QV4.js +1 -0
- package/public/assets/riscv-BM1_JUlF.js +1 -0
- package/public/assets/rose-pine-BHrmToEH.js +1 -0
- package/public/assets/rose-pine-dawn-CnK8MTSM.js +1 -0
- package/public/assets/rose-pine-moon-NleAzG8P.js +1 -0
- package/public/assets/rosmsg-BJDFO7_C.js +1 -0
- package/public/assets/rst-B0xPkSld.js +1 -0
- package/public/assets/ruby-BvKwtOVI.js +1 -0
- package/public/assets/rust-B1yitclQ.js +1 -0
- package/public/assets/sas-cz2c8ADy.js +1 -0
- package/public/assets/sass-Cj5Yp3dK.js +1 -0
- package/public/assets/scala-C151Ov-r.js +1 -0
- package/public/assets/scheme-C98Dy4si.js +1 -0
- package/public/assets/scss-OYdSNvt2.js +1 -0
- package/public/assets/sdbl-DVxCFoDh.js +1 -0
- package/public/assets/shaderlab-Dg9Lc6iA.js +1 -0
- package/public/assets/shellscript-Yzrsuije.js +1 -0
- package/public/assets/shellsession-BADoaaVG.js +1 -0
- package/public/assets/slack-dark-BthQWCQV.js +1 -0
- package/public/assets/slack-ochin-DqwNpetd.js +1 -0
- package/public/assets/smalltalk-BERRCDM3.js +1 -0
- package/public/assets/snazzy-light-Bw305WKR.js +1 -0
- package/public/assets/solarized-dark-DXbdFlpD.js +1 -0
- package/public/assets/solarized-light-L9t79GZl.js +1 -0
- package/public/assets/solidity-BbcW6ACK.js +1 -0
- package/public/assets/soy-Brmx7dQM.js +1 -0
- package/public/assets/sparql-rVzFXLq3.js +1 -0
- package/public/assets/splunk-BtCnVYZw.js +1 -0
- package/public/assets/sql-BLtJtn59.js +1 -0
- package/public/assets/ssh-config-_ykCGR6B.js +1 -0
- package/public/assets/stata-BH5u7GGu.js +1 -0
- package/public/assets/stylus-BEDo0Tqx.js +1 -0
- package/public/assets/svelte-3Dk4HxPD.js +1 -0
- package/public/assets/swift-Dg5xB15N.js +1 -0
- package/public/assets/synthwave-84-CbfX1IO0.js +1 -0
- package/public/assets/system-verilog-CnnmHF94.js +1 -0
- package/public/assets/systemd-4A_iFExJ.js +1 -0
- package/public/assets/talonscript-CkByrt1z.js +1 -0
- package/public/assets/tasl-QIJgUcNo.js +1 -0
- package/public/assets/tcl-dwOrl1Do.js +1 -0
- package/public/assets/templ-W15q3VgB.js +1 -0
- package/public/assets/terraform-BETggiCN.js +1 -0
- package/public/assets/tex-Cppo0RY3.js +1 -0
- package/public/assets/todo-uxdyLWei.js +1 -0
- package/public/assets/tokyo-night-hegEt444.js +1 -0
- package/public/assets/toml-vGWfd6FD.js +1 -0
- package/public/assets/tool-call-C_JEoVSV.js +60 -0
- package/public/assets/ts-tags-zn1MmPIZ.js +1 -0
- package/public/assets/tsv-B_m7g4N7.js +1 -0
- package/public/assets/tsx-COt5Ahok.js +1 -0
- package/public/assets/turtle-BsS91CYL.js +1 -0
- package/public/assets/twig-CO9l9SDP.js +1 -0
- package/public/assets/typescript-BPQ3VLAy.js +1 -0
- package/public/assets/typespec-Df68jz8_.js +1 -0
- package/public/assets/typst-DHCkPAjA.js +1 -0
- package/public/assets/unified-picker-ePaJEYDm.js +1 -0
- package/public/assets/v-BcVCzyr7.js +1 -0
- package/public/assets/vala-CsfeWuGM.js +1 -0
- package/public/assets/vb-D17OF-Vu.js +1 -0
- package/public/assets/verilog-BQ8w6xss.js +1 -0
- package/public/assets/vesper-DU1UobuO.js +1 -0
- package/public/assets/vhdl-CeAyd5Ju.js +1 -0
- package/public/assets/viml-CJc9bBzg.js +1 -0
- package/public/assets/vitesse-black-Bkuqu6BP.js +1 -0
- package/public/assets/vitesse-dark-D0r3Knsf.js +1 -0
- package/public/assets/vitesse-light-CVO1_9PV.js +1 -0
- package/public/assets/vue-CCoi5OLL.js +1 -0
- package/public/assets/vue-html-DAAvJJDi.js +1 -0
- package/public/assets/vue-vine-_Ih-lPRR.js +1 -0
- package/public/assets/vyper-CDx5xZoG.js +1 -0
- package/public/assets/wasm-CG6Dc4jp.js +1 -0
- package/public/assets/wasm-MzD3tlZU.js +1 -0
- package/public/assets/wenyan-BV7otONQ.js +1 -0
- package/public/assets/wgsl-Dx-B1_4e.js +1 -0
- package/public/assets/wikitext-BhOHFoWU.js +1 -0
- package/public/assets/wit-5i3qLPDT.js +1 -0
- package/public/assets/wolfram-lXgVvXCa.js +1 -0
- package/public/assets/wrap-text-S8HH4qqP.js +1 -0
- package/public/assets/xml-sdJ4AIDG.js +1 -0
- package/public/assets/xsl-CtQFsRM5.js +1 -0
- package/public/assets/yaml-Buea-lGh.js +1 -0
- package/public/assets/zenscript-DVFEvuxE.js +1 -0
- package/public/assets/zig-VOosw3JB.js +1 -0
- package/public/favicon.ico +0 -0
- package/public/index.html +44 -0
- package/public/loading.html +33 -0
- package/public/logo.png +0 -0
- package/public/manifest.webmanifest +1 -0
- package/public/maskable-icon-512x512.png +0 -0
- package/public/monaco/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
- package/public/monaco/vs/base/worker/workerMain.js +31 -0
- package/public/monaco/vs/basic-languages/cpp/cpp.js +10 -0
- package/public/monaco/vs/basic-languages/kotlin/kotlin.js +10 -0
- package/public/monaco/vs/basic-languages/markdown/markdown.js +10 -0
- package/public/monaco/vs/basic-languages/python/python.js +10 -0
- package/public/monaco/vs/editor/editor.main.css +8 -0
- package/public/monaco/vs/editor/editor.main.js +798 -0
- package/public/monaco/vs/language/css/cssMode.js +13 -0
- package/public/monaco/vs/language/css/cssWorker.js +77 -0
- package/public/monaco/vs/language/html/htmlMode.js +13 -0
- package/public/monaco/vs/language/html/htmlWorker.js +454 -0
- package/public/monaco/vs/language/json/jsonMode.js +19 -0
- package/public/monaco/vs/language/json/jsonWorker.js +42 -0
- package/public/monaco/vs/language/typescript/tsMode.js +20 -0
- package/public/monaco/vs/language/typescript/tsWorker.js +51328 -0
- package/public/monaco/vs/loader.js +11 -0
- package/public/monaco.worker.js +7 -0
- package/public/pwa-192x192.png +0 -0
- package/public/pwa-512x512.png +0 -0
- package/public/pwa-64x64.png +0 -0
- package/public/registerSW.js +1 -0
- package/public/sw.js +1 -0
- package/public/ui-version.json +3 -0
- package/public/workbox-60d14903.js +1 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI entry point.
|
|
3
|
+
* For now this only wires the typed modules together; actual command handling comes later.
|
|
4
|
+
*/
|
|
5
|
+
import { Command, InvalidArgumentError, Option } from "commander";
|
|
6
|
+
import path from "path";
|
|
7
|
+
import { fileURLToPath } from "url";
|
|
8
|
+
import { createRequire } from "module";
|
|
9
|
+
import { createHttpServer } from "./server/http-server";
|
|
10
|
+
import { WorkspaceManager } from "./workspaces/manager";
|
|
11
|
+
import { resolveConfigLocation } from "./config/location";
|
|
12
|
+
import { SettingsService } from "./settings/service";
|
|
13
|
+
import { BinaryResolver } from "./settings/binaries";
|
|
14
|
+
import { FileSystemBrowser } from "./filesystem/browser";
|
|
15
|
+
import { EventBus } from "./events/bus";
|
|
16
|
+
import { InstanceStore } from "./storage/instance-store";
|
|
17
|
+
import { InstanceEventBridge } from "./workspaces/instance-events";
|
|
18
|
+
import { createLogger } from "./logger";
|
|
19
|
+
import { launchInBrowser } from "./launcher";
|
|
20
|
+
import { resolveUi } from "./ui/remote-ui";
|
|
21
|
+
import { AuthManager, BOOTSTRAP_TOKEN_STDOUT_PREFIX, DEFAULT_AUTH_COOKIE_NAME, DEFAULT_AUTH_USERNAME } from "./auth/manager";
|
|
22
|
+
import { resolveHttpsOptions } from "./server/tls";
|
|
23
|
+
import { RemoteProxySessionManager } from "./server/remote-proxy";
|
|
24
|
+
import { resolveNetworkAddresses, resolveRemoteAddresses } from "./server/network-addresses";
|
|
25
|
+
import { startDevReleaseMonitor } from "./releases/dev-release-monitor";
|
|
26
|
+
import { SpeechService } from "./speech/service";
|
|
27
|
+
import { SideCarManager } from "./sidecars/manager";
|
|
28
|
+
import { ClientConnectionManager } from "./clients/connection-manager";
|
|
29
|
+
import { PluginChannelManager } from "./plugins/channel";
|
|
30
|
+
import { VoiceModeManager } from "./plugins/voice-mode";
|
|
31
|
+
import { readServerPackageVersion, resolveServerPublicDir } from "./runtime-paths";
|
|
32
|
+
const require = createRequire(import.meta.url);
|
|
33
|
+
const packageJson = { version: readServerPackageVersion(import.meta.url) };
|
|
34
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
35
|
+
const __dirname = path.dirname(__filename);
|
|
36
|
+
const DEFAULT_UI_STATIC_DIR = resolveServerPublicDir(import.meta.url);
|
|
37
|
+
const DEFAULT_HOST = "127.0.0.1";
|
|
38
|
+
const DEFAULT_CONFIG_PATH = "~/.config/EmbeddedCowork/config.json";
|
|
39
|
+
const DEFAULT_HTTPS_PORT = 9898;
|
|
40
|
+
const DEFAULT_HTTP_PORT = 9899;
|
|
41
|
+
function parseCliOptions(argv) {
|
|
42
|
+
const program = new Command()
|
|
43
|
+
.name("EmbeddedCowork")
|
|
44
|
+
.description("EmbeddedCowork CLI server")
|
|
45
|
+
.version(packageJson.version, "-v, --version", "Show the CLI version")
|
|
46
|
+
.addOption(new Option("--host <host>", "Host interface to bind").env("CLI_HOST").default(DEFAULT_HOST))
|
|
47
|
+
.addOption(new Option("--https <enabled>", "Enable HTTPS listener (true|false)").env("CLI_HTTPS").default("true"))
|
|
48
|
+
.addOption(new Option("--http <enabled>", "Enable HTTP listener (true|false)").env("CLI_HTTP").default("false"))
|
|
49
|
+
.addOption(new Option("--https-port <number>", "HTTPS port (0 for auto)").env("CLI_HTTPS_PORT").default(DEFAULT_HTTPS_PORT).argParser(parsePort))
|
|
50
|
+
.addOption(new Option("--http-port <number>", "HTTP port (0 for auto)").env("CLI_HTTP_PORT").default(DEFAULT_HTTP_PORT).argParser(parsePort))
|
|
51
|
+
.addOption(new Option("--tls-key <path>", "TLS private key (PEM)").env("CLI_TLS_KEY"))
|
|
52
|
+
.addOption(new Option("--tls-cert <path>", "TLS certificate (PEM)").env("CLI_TLS_CERT"))
|
|
53
|
+
.addOption(new Option("--tls-ca <path>", "TLS CA chain (PEM)").env("CLI_TLS_CA"))
|
|
54
|
+
.addOption(new Option("--tlsSANs <list>", "Additional TLS SANs (comma-separated)").env("CLI_TLS_SANS"))
|
|
55
|
+
.addOption(new Option("--workspace-root <path>", "Restricts root path where workspaces can be opened").env("CLI_WORKSPACE_ROOT").default(process.cwd()))
|
|
56
|
+
.addOption(new Option("--root <path>").env("CLI_ROOT").hideHelp(true))
|
|
57
|
+
.addOption(new Option("--unrestricted-root", "Allow browsing the full filesystem").env("CLI_UNRESTRICTED_ROOT").default(false))
|
|
58
|
+
.addOption(new Option("--config <path>", "Path to the config file").env("CLI_CONFIG").default(DEFAULT_CONFIG_PATH))
|
|
59
|
+
.addOption(new Option("--log-level <level>", "Log level (trace|debug|info|warn|error)").env("CLI_LOG_LEVEL"))
|
|
60
|
+
.addOption(new Option("--log-destination <path>", "Log destination file (defaults to stdout)").env("CLI_LOG_DESTINATION"))
|
|
61
|
+
.addOption(new Option("--ui-dir <path>", "Directory containing the built UI bundle").env("CLI_UI_DIR").default(DEFAULT_UI_STATIC_DIR))
|
|
62
|
+
.addOption(new Option("--ui-dev-server <url>", "Proxy UI requests to a running dev server").env("CLI_UI_DEV_SERVER"))
|
|
63
|
+
.addOption(new Option("--ui-no-update", "Disable remote UI updates").env("CLI_UI_NO_UPDATE").default(false))
|
|
64
|
+
.addOption(new Option("--ui-auto-update <enabled>", "Enable remote UI updates (true|false)").env("CLI_UI_AUTO_UPDATE").default("true"))
|
|
65
|
+
.addOption(new Option("--ui-manifest-url <url>", "Remote UI manifest URL").env("CLI_UI_MANIFEST_URL"))
|
|
66
|
+
.addOption(new Option("--launch", "Launch the UI in a browser after start").env("CLI_LAUNCH").default(false))
|
|
67
|
+
.addOption(new Option("--username <username>", "Username for server authentication")
|
|
68
|
+
.env("EmbeddedCowork_SERVER_USERNAME")
|
|
69
|
+
.default(DEFAULT_AUTH_USERNAME))
|
|
70
|
+
.addOption(new Option("--password <password>", "Password for server authentication").env("EmbeddedCowork_SERVER_PASSWORD"))
|
|
71
|
+
.addOption(new Option("--auth-cookie-name <name>", "Cookie name for server authentication")
|
|
72
|
+
.env("EmbeddedCowork_AUTH_COOKIE_NAME")
|
|
73
|
+
.default(DEFAULT_AUTH_COOKIE_NAME))
|
|
74
|
+
.addOption(new Option("--generate-token", "Emit a one-time bootstrap token for desktop")
|
|
75
|
+
.env("EmbeddedCowork_GENERATE_TOKEN")
|
|
76
|
+
.default(false))
|
|
77
|
+
.addOption(new Option("--dangerously-skip-auth", "Disable EmbeddedCowork's internal auth. Use only behind a trusted perimeter (SSO/VPN/etc).")
|
|
78
|
+
.env("EmbeddedCowork_SKIP_AUTH")
|
|
79
|
+
.default(false));
|
|
80
|
+
program.parse(argv, { from: "user" });
|
|
81
|
+
const parsed = program.opts();
|
|
82
|
+
const parseBooleanEnv = (value) => {
|
|
83
|
+
const normalized = (value ?? "").trim().toLowerCase();
|
|
84
|
+
return normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "y" || normalized === "on";
|
|
85
|
+
};
|
|
86
|
+
const resolvedRoot = parsed.workspaceRoot ?? parsed.root ?? process.cwd();
|
|
87
|
+
const normalizedHost = resolveHost(parsed.host);
|
|
88
|
+
const autoUpdateString = (parsed.uiAutoUpdate ?? "true").trim().toLowerCase();
|
|
89
|
+
const uiAutoUpdate = autoUpdateString === "1" || autoUpdateString === "true" || autoUpdateString === "yes";
|
|
90
|
+
const httpsEnabled = parseBooleanEnv(parsed.https);
|
|
91
|
+
const httpEnabled = parseBooleanEnv(parsed.http);
|
|
92
|
+
if (!httpsEnabled && !httpEnabled) {
|
|
93
|
+
throw new InvalidArgumentError("At least one listener must be enabled (--https or --http)");
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
host: normalizedHost,
|
|
97
|
+
https: httpsEnabled,
|
|
98
|
+
http: httpEnabled,
|
|
99
|
+
httpsPort: parsed.httpsPort,
|
|
100
|
+
httpPort: parsed.httpPort,
|
|
101
|
+
tlsKeyPath: parsed.tlsKey,
|
|
102
|
+
tlsCertPath: parsed.tlsCert,
|
|
103
|
+
tlsCaPath: parsed.tlsCa,
|
|
104
|
+
tlsSANs: parsed.tlsSANs,
|
|
105
|
+
rootDir: resolvedRoot,
|
|
106
|
+
configPath: parsed.config,
|
|
107
|
+
unrestrictedRoot: Boolean(parsed.unrestrictedRoot),
|
|
108
|
+
logLevel: parsed.logLevel,
|
|
109
|
+
logDestination: parsed.logDestination,
|
|
110
|
+
uiStaticDir: parsed.uiDir,
|
|
111
|
+
uiDevServer: parsed.uiDevServer,
|
|
112
|
+
uiAutoUpdate,
|
|
113
|
+
uiNoUpdate: Boolean(parsed.uiNoUpdate),
|
|
114
|
+
uiManifestUrl: parsed.uiManifestUrl,
|
|
115
|
+
launch: Boolean(parsed.launch),
|
|
116
|
+
authUsername: parsed.username,
|
|
117
|
+
authPassword: parsed.password,
|
|
118
|
+
authCookieName: parsed.authCookieName,
|
|
119
|
+
generateToken: Boolean(parsed.generateToken),
|
|
120
|
+
dangerouslySkipAuth: Boolean(parsed.dangerouslySkipAuth),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function parsePort(input) {
|
|
124
|
+
const value = Number(input);
|
|
125
|
+
if (!Number.isInteger(value) || value < 0 || value > 65535) {
|
|
126
|
+
throw new InvalidArgumentError("Port must be an integer between 0 and 65535");
|
|
127
|
+
}
|
|
128
|
+
return value;
|
|
129
|
+
}
|
|
130
|
+
function resolveHost(input) {
|
|
131
|
+
const trimmed = input?.trim();
|
|
132
|
+
if (!trimmed)
|
|
133
|
+
return DEFAULT_HOST;
|
|
134
|
+
if (trimmed === "0.0.0.0") {
|
|
135
|
+
return "0.0.0.0";
|
|
136
|
+
}
|
|
137
|
+
if (trimmed === "localhost") {
|
|
138
|
+
return DEFAULT_HOST;
|
|
139
|
+
}
|
|
140
|
+
return trimmed;
|
|
141
|
+
}
|
|
142
|
+
function programHasArg(argv, flag) {
|
|
143
|
+
return argv.includes(flag);
|
|
144
|
+
}
|
|
145
|
+
async function main() {
|
|
146
|
+
const options = parseCliOptions(process.argv.slice(2));
|
|
147
|
+
const logger = createLogger({ level: options.logLevel, destination: options.logDestination, component: "app" });
|
|
148
|
+
const workspaceLogger = logger.child({ component: "workspace" });
|
|
149
|
+
const configLogger = logger.child({ component: "config" });
|
|
150
|
+
const eventLogger = logger.child({ component: "events" });
|
|
151
|
+
const logOptions = {
|
|
152
|
+
...options,
|
|
153
|
+
authPassword: options.authPassword ? "[REDACTED]" : undefined,
|
|
154
|
+
};
|
|
155
|
+
logger.info({ options: logOptions }, "Starting EmbeddedCowork CLI server");
|
|
156
|
+
if (options.dangerouslySkipAuth) {
|
|
157
|
+
logger.warn("DANGEROUS: internal authentication is disabled (--dangerously-skip-auth / EmbeddedCowork_SKIP_AUTH).");
|
|
158
|
+
}
|
|
159
|
+
const eventBus = new EventBus(eventLogger);
|
|
160
|
+
const isLoopbackHost = (host) => host === "127.0.0.1" || host === "::1" || host.startsWith("127.");
|
|
161
|
+
const configLocation = resolveConfigLocation(options.configPath);
|
|
162
|
+
const configDir = configLocation.baseDir;
|
|
163
|
+
if ((options.tlsKeyPath && !options.tlsCertPath) || (!options.tlsKeyPath && options.tlsCertPath)) {
|
|
164
|
+
throw new InvalidArgumentError("--tls-key and --tls-cert must be provided together");
|
|
165
|
+
}
|
|
166
|
+
const serverMeta = {
|
|
167
|
+
localUrl: "http://localhost:0",
|
|
168
|
+
remoteUrl: undefined,
|
|
169
|
+
eventsUrl: `/api/events`,
|
|
170
|
+
host: options.host,
|
|
171
|
+
listeningMode: isLoopbackHost(options.host) ? "local" : "all",
|
|
172
|
+
localPort: 0,
|
|
173
|
+
remotePort: undefined,
|
|
174
|
+
hostLabel: options.host,
|
|
175
|
+
workspaceRoot: options.rootDir,
|
|
176
|
+
addresses: [],
|
|
177
|
+
};
|
|
178
|
+
const authManager = new AuthManager({
|
|
179
|
+
configPath: configLocation.configYamlPath,
|
|
180
|
+
username: options.authUsername,
|
|
181
|
+
password: options.authPassword,
|
|
182
|
+
cookieName: options.authCookieName,
|
|
183
|
+
generateToken: options.generateToken,
|
|
184
|
+
dangerouslySkipAuth: options.dangerouslySkipAuth,
|
|
185
|
+
}, logger.child({ component: "auth" }));
|
|
186
|
+
if (options.generateToken && !options.dangerouslySkipAuth) {
|
|
187
|
+
const token = authManager.issueBootstrapToken();
|
|
188
|
+
if (token) {
|
|
189
|
+
console.log(`${BOOTSTRAP_TOKEN_STDOUT_PREFIX}${token}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
const tlsResolution = resolveHttpsOptions({
|
|
193
|
+
enabled: options.https,
|
|
194
|
+
configDir,
|
|
195
|
+
host: options.host,
|
|
196
|
+
tlsKeyPath: options.tlsKeyPath,
|
|
197
|
+
tlsCertPath: options.tlsCertPath,
|
|
198
|
+
tlsCaPath: options.tlsCaPath,
|
|
199
|
+
tlsSANs: options.tlsSANs,
|
|
200
|
+
logger: logger.child({ component: "tls" }),
|
|
201
|
+
});
|
|
202
|
+
const nodeExtraCaCertsPath = !options.http ? tlsResolution?.caCertPath : undefined;
|
|
203
|
+
const settings = new SettingsService(configLocation, eventBus, configLogger);
|
|
204
|
+
const binaryResolver = new BinaryResolver(settings);
|
|
205
|
+
const workspaceManager = new WorkspaceManager({
|
|
206
|
+
rootDir: options.rootDir,
|
|
207
|
+
settings,
|
|
208
|
+
binaryResolver,
|
|
209
|
+
eventBus,
|
|
210
|
+
logger: workspaceLogger,
|
|
211
|
+
getServerBaseUrl: () => serverMeta.localUrl,
|
|
212
|
+
nodeExtraCaCertsPath,
|
|
213
|
+
});
|
|
214
|
+
const fileSystemBrowser = new FileSystemBrowser({ rootDir: options.rootDir, unrestricted: options.unrestrictedRoot });
|
|
215
|
+
const instanceStore = new InstanceStore(configLocation.instancesDir);
|
|
216
|
+
const speechService = new SpeechService(settings, logger.child({ component: "speech" }));
|
|
217
|
+
const sidecarManager = new SideCarManager({
|
|
218
|
+
settings,
|
|
219
|
+
eventBus,
|
|
220
|
+
logger: logger.child({ component: "sidecars" }),
|
|
221
|
+
});
|
|
222
|
+
const instanceEventBridge = new InstanceEventBridge({
|
|
223
|
+
workspaceManager,
|
|
224
|
+
eventBus,
|
|
225
|
+
logger: logger.child({ component: "instance-events" }),
|
|
226
|
+
});
|
|
227
|
+
const uiDirEnvOverride = Boolean(process.env.CLI_UI_DIR);
|
|
228
|
+
const uiDirCliOverride = programHasArg(process.argv.slice(2), "--ui-dir");
|
|
229
|
+
const uiOverrideIsExplicit = uiDirEnvOverride || uiDirCliOverride;
|
|
230
|
+
const uiDirOverride = uiOverrideIsExplicit ? options.uiStaticDir : undefined;
|
|
231
|
+
const autoUpdateEnabled = options.uiAutoUpdate && !options.uiNoUpdate;
|
|
232
|
+
const uiResolution = await resolveUi({
|
|
233
|
+
serverVersion: packageJson.version,
|
|
234
|
+
bundledUiDir: DEFAULT_UI_STATIC_DIR,
|
|
235
|
+
autoUpdate: autoUpdateEnabled,
|
|
236
|
+
overrideUiDir: uiDirOverride,
|
|
237
|
+
uiDevServerUrl: options.uiDevServer,
|
|
238
|
+
manifestUrl: options.uiManifestUrl,
|
|
239
|
+
logger: logger.child({ component: "ui" }),
|
|
240
|
+
});
|
|
241
|
+
serverMeta.serverVersion = packageJson.version;
|
|
242
|
+
serverMeta.ui = {
|
|
243
|
+
version: uiResolution.uiVersion,
|
|
244
|
+
source: uiResolution.source,
|
|
245
|
+
};
|
|
246
|
+
serverMeta.support = {
|
|
247
|
+
supported: uiResolution.supported,
|
|
248
|
+
message: uiResolution.message,
|
|
249
|
+
latestServerVersion: uiResolution.latestServerVersion,
|
|
250
|
+
latestServerUrl: uiResolution.latestServerUrl,
|
|
251
|
+
minServerVersion: uiResolution.minServerVersion,
|
|
252
|
+
};
|
|
253
|
+
const updateChannel = (process.env.EmbeddedCowork_UPDATE_CHANNEL ?? "").trim().toLowerCase();
|
|
254
|
+
const githubRepo = (process.env.EmbeddedCowork_GITHUB_REPO ?? "vividcode-ai/EmbeddedCowork").trim();
|
|
255
|
+
const isDevVersion = packageJson.version.includes("-dev.") || packageJson.version.includes("-dev-");
|
|
256
|
+
const enableDevUpdateChecks = updateChannel === "dev" || (updateChannel === "" && isDevVersion);
|
|
257
|
+
const devReleaseMonitor = enableDevUpdateChecks
|
|
258
|
+
? startDevReleaseMonitor({
|
|
259
|
+
currentVersion: packageJson.version,
|
|
260
|
+
repo: githubRepo,
|
|
261
|
+
logger: logger.child({ component: "updates" }),
|
|
262
|
+
onUpdate: (release) => {
|
|
263
|
+
serverMeta.update = release;
|
|
264
|
+
},
|
|
265
|
+
})
|
|
266
|
+
: null;
|
|
267
|
+
const remoteAccessEnabled = options.host === "0.0.0.0" || !isLoopbackHost(options.host);
|
|
268
|
+
const clientConnectionManager = new ClientConnectionManager(logger.child({ component: "client-connections" }));
|
|
269
|
+
const pluginChannel = new PluginChannelManager(logger.child({ component: "plugin-channel" }));
|
|
270
|
+
const remoteProxySessionManager = new RemoteProxySessionManager({
|
|
271
|
+
authManager,
|
|
272
|
+
logger: logger.child({ component: "remote-proxy" }),
|
|
273
|
+
httpsOptions: tlsResolution?.httpsOptions,
|
|
274
|
+
});
|
|
275
|
+
const voiceModeManager = new VoiceModeManager({
|
|
276
|
+
connections: clientConnectionManager,
|
|
277
|
+
channel: pluginChannel,
|
|
278
|
+
logger: logger.child({ component: "voice-mode" }),
|
|
279
|
+
});
|
|
280
|
+
const httpsPortExplicit = programHasArg(process.argv.slice(2), "--https-port") || Boolean(process.env.CLI_HTTPS_PORT);
|
|
281
|
+
const httpPortExplicit = programHasArg(process.argv.slice(2), "--http-port") || Boolean(process.env.CLI_HTTP_PORT);
|
|
282
|
+
const httpsBindPort = httpsPortExplicit ? options.httpsPort : 0;
|
|
283
|
+
const httpBindPort = httpPortExplicit ? options.httpPort : 0;
|
|
284
|
+
// Listener binding rules:
|
|
285
|
+
// - Remote access enabled: HTTP listens on loopback, HTTPS on all IPs (host=0.0.0.0 / LAN IP).
|
|
286
|
+
// - Remote access disabled: both listen on loopback.
|
|
287
|
+
// - HTTP-only mode: respect --host (used for dev/testing).
|
|
288
|
+
const httpsBindHost = remoteAccessEnabled ? options.host : "127.0.0.1";
|
|
289
|
+
const httpBindHost = options.http ? (options.https ? "127.0.0.1" : options.host) : "127.0.0.1";
|
|
290
|
+
const servers = [];
|
|
291
|
+
const httpServer = options.http
|
|
292
|
+
? createHttpServer({
|
|
293
|
+
bindHost: httpBindHost,
|
|
294
|
+
bindPort: httpBindPort,
|
|
295
|
+
defaultPort: options.httpPort,
|
|
296
|
+
protocol: "http",
|
|
297
|
+
workspaceManager,
|
|
298
|
+
settings,
|
|
299
|
+
fileSystemBrowser,
|
|
300
|
+
eventBus,
|
|
301
|
+
serverMeta,
|
|
302
|
+
instanceStore,
|
|
303
|
+
speechService,
|
|
304
|
+
sidecarManager,
|
|
305
|
+
authManager,
|
|
306
|
+
clientConnectionManager,
|
|
307
|
+
pluginChannel,
|
|
308
|
+
voiceModeManager,
|
|
309
|
+
remoteProxySessionManager,
|
|
310
|
+
uiStaticDir: uiResolution.uiStaticDir ?? DEFAULT_UI_STATIC_DIR,
|
|
311
|
+
uiDevServerUrl: uiResolution.uiDevServerUrl,
|
|
312
|
+
logger,
|
|
313
|
+
})
|
|
314
|
+
: null;
|
|
315
|
+
const httpsServer = options.https
|
|
316
|
+
? createHttpServer({
|
|
317
|
+
bindHost: httpsBindHost,
|
|
318
|
+
bindPort: httpsBindPort,
|
|
319
|
+
defaultPort: options.httpsPort,
|
|
320
|
+
protocol: "https",
|
|
321
|
+
httpsOptions: tlsResolution?.httpsOptions,
|
|
322
|
+
workspaceManager,
|
|
323
|
+
settings,
|
|
324
|
+
fileSystemBrowser,
|
|
325
|
+
eventBus,
|
|
326
|
+
serverMeta,
|
|
327
|
+
instanceStore,
|
|
328
|
+
speechService,
|
|
329
|
+
sidecarManager,
|
|
330
|
+
authManager,
|
|
331
|
+
clientConnectionManager,
|
|
332
|
+
pluginChannel,
|
|
333
|
+
voiceModeManager,
|
|
334
|
+
remoteProxySessionManager,
|
|
335
|
+
uiStaticDir: uiResolution.uiStaticDir ?? DEFAULT_UI_STATIC_DIR,
|
|
336
|
+
uiDevServerUrl: undefined,
|
|
337
|
+
logger,
|
|
338
|
+
})
|
|
339
|
+
: null;
|
|
340
|
+
if (httpServer)
|
|
341
|
+
servers.push(httpServer);
|
|
342
|
+
if (httpsServer)
|
|
343
|
+
servers.push(httpsServer);
|
|
344
|
+
const [httpStart, httpsStart] = await Promise.all([
|
|
345
|
+
httpServer ? httpServer.start() : Promise.resolve(null),
|
|
346
|
+
httpsServer ? httpsServer.start() : Promise.resolve(null),
|
|
347
|
+
]);
|
|
348
|
+
const localStart = httpStart ?? httpsStart;
|
|
349
|
+
if (!localStart) {
|
|
350
|
+
throw new Error("No listeners started");
|
|
351
|
+
}
|
|
352
|
+
const remoteStart = httpsStart ?? httpStart;
|
|
353
|
+
const localProtocol = httpStart ? "http" : "https";
|
|
354
|
+
const remoteProtocol = httpsStart ? "https" : "http";
|
|
355
|
+
// Use an explicit IPv4 loopback address for the "local" URL.
|
|
356
|
+
// On macOS, `localhost` often resolves to ::1 first, and it is possible to have
|
|
357
|
+
// another instance bound on IPv6 while this instance binds IPv4 (or vice versa),
|
|
358
|
+
// which can lead clients to talk to the wrong process.
|
|
359
|
+
const localUrl = `${localProtocol}://127.0.0.1:${localStart.port}`;
|
|
360
|
+
let remoteUrl;
|
|
361
|
+
let remoteAddresses = [];
|
|
362
|
+
if (remoteStart) {
|
|
363
|
+
const wantsAll = options.host === "0.0.0.0" || !isLoopbackHost(options.host);
|
|
364
|
+
let remoteHost = options.host;
|
|
365
|
+
if (wantsAll) {
|
|
366
|
+
if (options.host === "0.0.0.0") {
|
|
367
|
+
const resolved = resolveRemoteAddresses({ host: options.host, protocol: remoteProtocol, port: remoteStart.port });
|
|
368
|
+
remoteAddresses = resolved.userVisible;
|
|
369
|
+
remoteUrl = resolved.primaryRemoteUrl ?? `${remoteProtocol}://localhost:${remoteStart.port}`;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
remoteHost = "localhost";
|
|
374
|
+
}
|
|
375
|
+
if (!remoteUrl) {
|
|
376
|
+
remoteUrl = `${remoteProtocol}://${remoteHost}:${remoteStart.port}`;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
serverMeta.localUrl = localUrl;
|
|
380
|
+
serverMeta.localPort = localStart.port;
|
|
381
|
+
serverMeta.remoteUrl = remoteUrl;
|
|
382
|
+
serverMeta.remotePort = remoteStart?.port;
|
|
383
|
+
serverMeta.host = options.host;
|
|
384
|
+
serverMeta.listeningMode = options.host === "0.0.0.0" || !isLoopbackHost(options.host) ? "all" : "local";
|
|
385
|
+
if (serverMeta.remotePort && remoteUrl) {
|
|
386
|
+
serverMeta.addresses = remoteAddresses.length
|
|
387
|
+
? remoteAddresses
|
|
388
|
+
: resolveNetworkAddresses({ host: options.host, protocol: remoteProtocol, port: serverMeta.remotePort });
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
serverMeta.addresses = [];
|
|
392
|
+
}
|
|
393
|
+
console.log(`Local Connection URL : ${serverMeta.localUrl}`);
|
|
394
|
+
if (serverMeta.remoteUrl) {
|
|
395
|
+
console.log(`Remote Connection URL : ${serverMeta.remoteUrl}`);
|
|
396
|
+
const additionalRemoteUrls = serverMeta.addresses
|
|
397
|
+
.map((addr) => addr.remoteUrl)
|
|
398
|
+
.filter((url) => url !== serverMeta.remoteUrl);
|
|
399
|
+
if (additionalRemoteUrls.length > 0) {
|
|
400
|
+
console.log("Other Accessible URLs:");
|
|
401
|
+
for (const url of additionalRemoteUrls) {
|
|
402
|
+
console.log(` - ${url}`);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
if (options.launch) {
|
|
407
|
+
await launchInBrowser(serverMeta.localUrl, logger.child({ component: "launcher" }));
|
|
408
|
+
}
|
|
409
|
+
let shuttingDown = false;
|
|
410
|
+
const shutdown = async () => {
|
|
411
|
+
if (shuttingDown) {
|
|
412
|
+
logger.info("Shutdown already in progress, ignoring signal");
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
shuttingDown = true;
|
|
416
|
+
logger.info("Received shutdown signal, stopping workspaces and server");
|
|
417
|
+
const shutdownWorkspaces = (async () => {
|
|
418
|
+
try {
|
|
419
|
+
instanceEventBridge.shutdown();
|
|
420
|
+
}
|
|
421
|
+
catch (error) {
|
|
422
|
+
logger.warn({ err: error }, "Instance event bridge shutdown failed");
|
|
423
|
+
}
|
|
424
|
+
try {
|
|
425
|
+
await sidecarManager.shutdown();
|
|
426
|
+
}
|
|
427
|
+
catch (error) {
|
|
428
|
+
logger.error({ err: error }, "SideCar manager shutdown failed");
|
|
429
|
+
}
|
|
430
|
+
try {
|
|
431
|
+
clientConnectionManager.shutdown();
|
|
432
|
+
}
|
|
433
|
+
catch (error) {
|
|
434
|
+
logger.warn({ err: error }, "Client connection manager shutdown failed");
|
|
435
|
+
}
|
|
436
|
+
try {
|
|
437
|
+
await workspaceManager.shutdown();
|
|
438
|
+
logger.info("Workspace manager shutdown complete");
|
|
439
|
+
}
|
|
440
|
+
catch (error) {
|
|
441
|
+
logger.error({ err: error }, "Workspace manager shutdown failed");
|
|
442
|
+
}
|
|
443
|
+
})();
|
|
444
|
+
const shutdownHttp = (async () => {
|
|
445
|
+
try {
|
|
446
|
+
await Promise.allSettled(servers.map((srv) => srv.stop()));
|
|
447
|
+
logger.info("HTTP server(s) stopped");
|
|
448
|
+
}
|
|
449
|
+
catch (error) {
|
|
450
|
+
logger.error({ err: error }, "Failed to stop HTTP server");
|
|
451
|
+
}
|
|
452
|
+
})();
|
|
453
|
+
await Promise.allSettled([shutdownWorkspaces, shutdownHttp]);
|
|
454
|
+
// no-op: remote UI manifest replaces GitHub release monitor
|
|
455
|
+
devReleaseMonitor?.stop();
|
|
456
|
+
logger.info("Exiting process");
|
|
457
|
+
process.exit(0);
|
|
458
|
+
};
|
|
459
|
+
process.on("SIGINT", shutdown);
|
|
460
|
+
process.on("SIGTERM", shutdown);
|
|
461
|
+
}
|
|
462
|
+
main().catch((error) => {
|
|
463
|
+
const logger = createLogger({ component: "app" });
|
|
464
|
+
logger.error({ err: error }, "CLI server crashed");
|
|
465
|
+
process.exit(1);
|
|
466
|
+
});
|
package/dist/launcher.js
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { spawn } from "child_process";
|
|
2
|
+
import os from "os";
|
|
3
|
+
import path from "path";
|
|
4
|
+
const APP_ARGS = (url) => [`--app=${url}`, "--new-window"];
|
|
5
|
+
export async function launchInBrowser(url, logger) {
|
|
6
|
+
const { platform, candidates, manualExamples } = buildPlatformCandidates(url);
|
|
7
|
+
console.log(`Attempting to launch browser (${platform}) using:`);
|
|
8
|
+
candidates.forEach((candidate) => console.log(` - ${candidate.name}: ${candidate.command}`));
|
|
9
|
+
for (const candidate of candidates) {
|
|
10
|
+
const success = await tryLaunch(candidate, url, logger);
|
|
11
|
+
if (success) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
console.error("No supported browser found to launch. Run without --launch and use one of the commands below or install a compatible browser.");
|
|
16
|
+
if (manualExamples.length > 0) {
|
|
17
|
+
console.error("Manual launch commands:");
|
|
18
|
+
manualExamples.forEach((line) => console.error(` ${line}`));
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
async function tryLaunch(candidate, url, logger) {
|
|
23
|
+
return new Promise((resolve) => {
|
|
24
|
+
let resolved = false;
|
|
25
|
+
try {
|
|
26
|
+
const args = candidate.args(url);
|
|
27
|
+
const child = spawn(candidate.command, args, { stdio: "ignore", detached: true });
|
|
28
|
+
child.once("error", (error) => {
|
|
29
|
+
if (resolved)
|
|
30
|
+
return;
|
|
31
|
+
resolved = true;
|
|
32
|
+
logger.debug({ err: error, candidate: candidate.name, command: candidate.command, args }, "Browser launch failed");
|
|
33
|
+
resolve(false);
|
|
34
|
+
});
|
|
35
|
+
child.once("spawn", () => {
|
|
36
|
+
if (resolved)
|
|
37
|
+
return;
|
|
38
|
+
resolved = true;
|
|
39
|
+
logger.info({
|
|
40
|
+
browser: candidate.name,
|
|
41
|
+
command: candidate.command,
|
|
42
|
+
args,
|
|
43
|
+
fullCommand: [candidate.command, ...args].join(" "),
|
|
44
|
+
}, "Launched browser in app mode");
|
|
45
|
+
child.unref();
|
|
46
|
+
resolve(true);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (resolved)
|
|
51
|
+
return;
|
|
52
|
+
resolved = true;
|
|
53
|
+
logger.debug({ err: error, candidate: candidate.name, command: candidate.command }, "Browser spawn threw");
|
|
54
|
+
resolve(false);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
function buildPlatformCandidates(url) {
|
|
59
|
+
switch (os.platform()) {
|
|
60
|
+
case "darwin":
|
|
61
|
+
return {
|
|
62
|
+
platform: "macOS",
|
|
63
|
+
candidates: buildMacCandidates(),
|
|
64
|
+
manualExamples: buildMacManualExamples(url),
|
|
65
|
+
};
|
|
66
|
+
case "win32":
|
|
67
|
+
return {
|
|
68
|
+
platform: "Windows",
|
|
69
|
+
candidates: buildWindowsCandidates(),
|
|
70
|
+
manualExamples: buildWindowsManualExamples(url),
|
|
71
|
+
};
|
|
72
|
+
default:
|
|
73
|
+
return {
|
|
74
|
+
platform: "Linux",
|
|
75
|
+
candidates: buildLinuxCandidates(),
|
|
76
|
+
manualExamples: buildLinuxManualExamples(url),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function buildMacCandidates() {
|
|
81
|
+
const apps = [
|
|
82
|
+
{ name: "Google Chrome", path: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" },
|
|
83
|
+
{ name: "Google Chrome Canary", path: "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary" },
|
|
84
|
+
{ name: "Microsoft Edge", path: "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge" },
|
|
85
|
+
{ name: "Brave Browser", path: "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser" },
|
|
86
|
+
{ name: "Chromium", path: "/Applications/Chromium.app/Contents/MacOS/Chromium" },
|
|
87
|
+
{ name: "Vivaldi", path: "/Applications/Vivaldi.app/Contents/MacOS/Vivaldi" },
|
|
88
|
+
{ name: "Arc", path: "/Applications/Arc.app/Contents/MacOS/Arc" },
|
|
89
|
+
];
|
|
90
|
+
return apps.map((entry) => ({ name: entry.name, command: entry.path, args: APP_ARGS }));
|
|
91
|
+
}
|
|
92
|
+
function buildWindowsCandidates() {
|
|
93
|
+
const programFiles = process.env["ProgramFiles"];
|
|
94
|
+
const programFilesX86 = process.env["ProgramFiles(x86)"];
|
|
95
|
+
const localAppData = process.env["LocalAppData"];
|
|
96
|
+
const paths = [
|
|
97
|
+
[programFiles, "Google/Chrome/Application/chrome.exe", "Google Chrome"],
|
|
98
|
+
[programFilesX86, "Google/Chrome/Application/chrome.exe", "Google Chrome (x86)"],
|
|
99
|
+
[localAppData, "Google/Chrome/Application/chrome.exe", "Google Chrome (User)"],
|
|
100
|
+
[programFiles, "Microsoft/Edge/Application/msedge.exe", "Microsoft Edge"],
|
|
101
|
+
[programFilesX86, "Microsoft/Edge/Application/msedge.exe", "Microsoft Edge (x86)"],
|
|
102
|
+
[localAppData, "Microsoft/Edge/Application/msedge.exe", "Microsoft Edge (User)"],
|
|
103
|
+
[programFiles, "BraveSoftware/Brave-Browser/Application/brave.exe", "Brave"],
|
|
104
|
+
[localAppData, "BraveSoftware/Brave-Browser/Application/brave.exe", "Brave (User)"],
|
|
105
|
+
[programFiles, "Chromium/Application/chromium.exe", "Chromium"],
|
|
106
|
+
];
|
|
107
|
+
return paths
|
|
108
|
+
.filter(([root]) => Boolean(root))
|
|
109
|
+
.map(([root, rel, name]) => ({
|
|
110
|
+
name,
|
|
111
|
+
command: path.join(root, rel),
|
|
112
|
+
args: APP_ARGS,
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
115
|
+
function buildLinuxCandidates() {
|
|
116
|
+
const names = [
|
|
117
|
+
"google-chrome",
|
|
118
|
+
"google-chrome-stable",
|
|
119
|
+
"chromium",
|
|
120
|
+
"chromium-browser",
|
|
121
|
+
"brave-browser",
|
|
122
|
+
"microsoft-edge",
|
|
123
|
+
"microsoft-edge-stable",
|
|
124
|
+
"vivaldi",
|
|
125
|
+
];
|
|
126
|
+
return names.map((name) => ({ name, command: name, args: APP_ARGS }));
|
|
127
|
+
}
|
|
128
|
+
function buildMacManualExamples(url) {
|
|
129
|
+
return [
|
|
130
|
+
`"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --app="${url}" --new-window`,
|
|
131
|
+
`"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge" --app="${url}" --new-window`,
|
|
132
|
+
`"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser" --app="${url}" --new-window`,
|
|
133
|
+
];
|
|
134
|
+
}
|
|
135
|
+
function buildWindowsManualExamples(url) {
|
|
136
|
+
return [
|
|
137
|
+
`"%ProgramFiles%\\Google\\Chrome\\Application\\chrome.exe" --app="${url}" --new-window`,
|
|
138
|
+
`"%ProgramFiles%\\Microsoft\\Edge\\Application\\msedge.exe" --app="${url}" --new-window`,
|
|
139
|
+
`"%ProgramFiles%\\BraveSoftware\\Brave-Browser\\Application\\brave.exe" --app="${url}" --new-window`,
|
|
140
|
+
];
|
|
141
|
+
}
|
|
142
|
+
function buildLinuxManualExamples(url) {
|
|
143
|
+
return [
|
|
144
|
+
`google-chrome --app="${url}" --new-window`,
|
|
145
|
+
`chromium --app="${url}" --new-window`,
|
|
146
|
+
`brave-browser --app="${url}" --new-window`,
|
|
147
|
+
`microsoft-edge --app="${url}" --new-window`,
|
|
148
|
+
];
|
|
149
|
+
}
|
package/dist/loader.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export async function resolve(specifier, context, defaultResolve) {
|
|
2
|
+
try {
|
|
3
|
+
return await defaultResolve(specifier, context, defaultResolve);
|
|
4
|
+
}
|
|
5
|
+
catch (error) {
|
|
6
|
+
if (shouldRetry(specifier, error)) {
|
|
7
|
+
const retried = specifier.endsWith(".js") ? specifier : `${specifier}.js`;
|
|
8
|
+
return defaultResolve(retried, context, defaultResolve);
|
|
9
|
+
}
|
|
10
|
+
throw error;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function shouldRetry(specifier, error) {
|
|
14
|
+
if (!error || error.code !== "ERR_MODULE_NOT_FOUND") {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
if (specifier.startsWith("./") || specifier.startsWith("../")) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
}
|