crewx 0.9.0-rc.13 → 0.9.0-rc.130
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/bin/cli-commands.js +4 -2
- package/bin/crewx-lib.js +104 -6
- package/bin/crewx-ui.js +0 -6
- package/bin/crewx.ico +0 -0
- package/bin/crewx.js +117 -8
- package/dist/assets/GitDiffEditor-B836lFO2.css +1 -0
- package/dist/assets/GitDiffEditor-CkqVpe3t.js +762 -0
- package/dist/assets/MarketPage-CWNnzvyi.js +41 -0
- package/dist/assets/PromptTab-DjfyLv_Q.js +27 -0
- package/dist/assets/abap-BrgZPUOV.js +6 -0
- package/dist/assets/apex-DyP6w7ZV.js +6 -0
- package/dist/assets/{arc-BBMQPf9Z.js → arc-CyscygvL.js} +1 -1
- package/dist/assets/{architectureDiagram-UYN6MBPD-Uinv3ruS.js → architectureDiagram-UYN6MBPD-_WF-aDra.js} +1 -1
- package/dist/assets/azcli-BaLxmfj-.js +6 -0
- package/dist/assets/bat-CFOPXBzS.js +6 -0
- package/dist/assets/bicep-BfEKNvv3.js +7 -0
- package/dist/assets/{blockDiagram-ZHA2E4KO-CM8iVhUy.js → blockDiagram-ZHA2E4KO-DY5ZaPFI.js} +5 -5
- package/dist/assets/{c4Diagram-6F5ED5ID-D6HM4dEk.js → c4Diagram-6F5ED5ID-CQetgz_K.js} +1 -1
- package/dist/assets/cameligo-BFG1Mk7z.js +6 -0
- package/dist/assets/channel-DcvLtuJm.js +1 -0
- package/dist/assets/{chunk-5HRBRIJM-CsiffIEz.js → chunk-5HRBRIJM-Du3i7--2.js} +1 -1
- package/dist/assets/{chunk-7U56Z5CX-kgH95T9a.js → chunk-7U56Z5CX-CHHyt7AE.js} +1 -1
- package/dist/assets/{chunk-ASOPGD6M-dKFyf37d.js → chunk-ASOPGD6M-DLjJyDpJ.js} +1 -1
- package/dist/assets/{chunk-KFBOBJHC-Det1gu-Y.js → chunk-KFBOBJHC-D-CpA5yr.js} +1 -1
- package/dist/assets/{chunk-T2TOU4HS-DMk7ilyN.js → chunk-T2TOU4HS-_SS0cO6s.js} +1 -1
- package/dist/assets/{chunk-TMUBEWPD-drsYJGIt.js → chunk-TMUBEWPD-BL8HMUms.js} +1 -1
- package/dist/assets/classDiagram-LNE6IOMH-B2DrR-Ob.js +1 -0
- package/dist/assets/classDiagram-v2-MQ7JQ4JX-B2DrR-Ob.js +1 -0
- package/dist/assets/clojure-DTECt2xU.js +6 -0
- package/dist/assets/codicon-DCmgc-ay.ttf +0 -0
- package/dist/assets/coffee-CDGzqUPQ.js +6 -0
- package/dist/assets/cpp-CLLBncYj.js +6 -0
- package/dist/assets/csharp-dUCx_-0o.js +6 -0
- package/dist/assets/csp-5Rap-vPy.js +6 -0
- package/dist/assets/css-D3h14YRZ.js +8 -0
- package/dist/assets/css.worker-CVdCITaq.js +84 -0
- package/dist/assets/cssMode-eCMGRxDR.js +9 -0
- package/dist/assets/cypher-DrQuvNYM.js +6 -0
- package/dist/assets/{dagre-4EVJKHTY-DKMJYrr5.js → dagre-4EVJKHTY-CK2bbVto.js} +1 -1
- package/dist/assets/dart-CFKIUWau.js +6 -0
- package/dist/assets/{diagram-QW4FP2JN-BNyGnAGw.js → diagram-QW4FP2JN-dAqU7JxQ.js} +1 -1
- package/dist/assets/dockerfile-Zznr-cwX.js +6 -0
- package/dist/assets/ecl-Ce3n6wWz.js +6 -0
- package/dist/assets/editor.worker-D_iEFMe4.js +12 -0
- package/dist/assets/elixir-deUWdS0T.js +6 -0
- package/dist/assets/{erDiagram-6RL3IURR-qo27Uk30.js → erDiagram-6RL3IURR-DmO32u4Y.js} +1 -1
- package/dist/assets/flow9-i9-g7ZhI.js +6 -0
- package/dist/assets/{flowDiagram-7ASYPVHJ-BudDObQU.js → flowDiagram-7ASYPVHJ-DckgGmco.js} +1 -1
- package/dist/assets/freemarker2-B6I9TcK4.js +8 -0
- package/dist/assets/fsharp-CzKuDChf.js +6 -0
- package/dist/assets/{ganttDiagram-NTVNEXSI-DCFf5efZ.js → ganttDiagram-NTVNEXSI-DN2-Ny6n.js} +3 -3
- package/dist/assets/gitGraph-YCYPL57B-BuJMAPTQ.js +133 -0
- package/dist/assets/{gitGraphDiagram-NRZ2UAAF-DJUV3_64.js → gitGraphDiagram-NRZ2UAAF-Cr_DZo5O.js} +1 -1
- package/dist/assets/go-Cphgjts3.js +6 -0
- package/dist/assets/graphql-Cg7bfA9N.js +6 -0
- package/dist/assets/handlebars-C3QaTy6J.js +6 -0
- package/dist/assets/hcl-0cvrggvQ.js +6 -0
- package/dist/assets/html-Cd2hQORB.js +6 -0
- package/dist/assets/html.worker-BWKvDFG4.js +461 -0
- package/dist/assets/htmlMode-CouDMsGU.js +9 -0
- package/dist/assets/{infoDiagram-A4XQUW5V-BlzLOJuh.js → infoDiagram-A4XQUW5V-YB20Td6e.js} +1 -1
- package/dist/assets/ini-Drc7WvVn.js +6 -0
- package/dist/assets/java-B_fMsGYe.js +6 -0
- package/dist/assets/javascript-Cr15jQf1.js +6 -0
- package/dist/assets/{journeyDiagram-G5WM74LC-BoBDY7uv.js → journeyDiagram-G5WM74LC-IdXV715X.js} +1 -1
- package/dist/assets/json.worker-BDor654j.js +49 -0
- package/dist/assets/jsonMode-_3gJtzSf.js +15 -0
- package/dist/assets/julia-Bqgm2twL.js +6 -0
- package/dist/assets/{kanban-definition-QRCXZQQD-BKgHIztA.js → kanban-definition-QRCXZQQD-BoQljhMe.js} +1 -1
- package/dist/assets/kotlin-BSkB5QuD.js +6 -0
- package/dist/assets/less-BsTHnhdd.js +7 -0
- package/dist/assets/lexon-YWi4-JPR.js +6 -0
- package/dist/assets/{linear-CoIZ0x19.js → linear-UppTmshD.js} +1 -1
- package/dist/assets/liquid-B26fwCY6.js +6 -0
- package/dist/assets/lua-nf6ki56Z.js +6 -0
- package/dist/assets/m3-Cpb6xl2v.js +6 -0
- package/dist/assets/main-C6SmpfO3.css +10 -0
- package/dist/assets/main-CdIDkdJn.js +1890 -0
- package/dist/assets/markdown-DSZPf7rp.js +6 -0
- package/dist/assets/mdx-Beyz-jDW.js +6 -0
- package/dist/assets/{mindmap-definition-GWI6TPTV-B4T62xYW.js → mindmap-definition-GWI6TPTV-ZXWmWre9.js} +1 -1
- package/dist/assets/mips-B_c3zf-v.js +6 -0
- package/dist/assets/msdax-rUNN04Wq.js +6 -0
- package/dist/assets/mysql-DDwshQtU.js +6 -0
- package/dist/assets/objective-c-B5zXfXm9.js +6 -0
- package/dist/assets/pascal-CXOwvkN_.js +6 -0
- package/dist/assets/pascaligo-Bc-ZgV77.js +6 -0
- package/dist/assets/perl-CwNk8-XU.js +6 -0
- package/dist/assets/pgsql-tGk8EFnU.js +6 -0
- package/dist/assets/php-CpIb_Oan.js +6 -0
- package/dist/assets/{pieDiagram-YF2LJOPJ-C570Jl7r.js → pieDiagram-YF2LJOPJ-CjQiJ_BV.js} +1 -1
- package/dist/assets/pla-B03wrqEc.js +6 -0
- package/dist/assets/postiats-BKlk5iyT.js +6 -0
- package/dist/assets/powerquery-Bhzvs7bI.js +6 -0
- package/dist/assets/powershell-Dd3NCNK9.js +6 -0
- package/dist/assets/protobuf-COyEY5Pt.js +7 -0
- package/dist/assets/pug-BaJupSGV.js +6 -0
- package/dist/assets/python-Bh6AQCBY.js +6 -0
- package/dist/assets/qsharp-DXyYeYxl.js +6 -0
- package/dist/assets/{quadrantDiagram-OS5C2QUG-D9kamKQz.js → quadrantDiagram-OS5C2QUG-C7inCBLl.js} +1 -1
- package/dist/assets/r-CdQndTaG.js +6 -0
- package/dist/assets/razor-BT4WX97o.js +6 -0
- package/dist/assets/redis-CVwtpugi.js +6 -0
- package/dist/assets/redshift-25W9uPmb.js +6 -0
- package/dist/assets/{requirementDiagram-MIRIMTAZ-CbI9--NI.js → requirementDiagram-MIRIMTAZ-Vjvdu-bC.js} +1 -1
- package/dist/assets/restructuredtext-DfzH4Xui.js +6 -0
- package/dist/assets/ruby-Cp1zYvxS.js +6 -0
- package/dist/assets/rust-D5C2fndG.js +6 -0
- package/dist/assets/{sankeyDiagram-Y46BX6SQ-5AYnNxm5.js → sankeyDiagram-Y46BX6SQ-BuNmUVWn.js} +1 -1
- package/dist/assets/sb-CDntyWJ8.js +6 -0
- package/dist/assets/scala-BoFRg7Ot.js +6 -0
- package/dist/assets/scheme-Bio4gycK.js +6 -0
- package/dist/assets/scss-4Ik7cdeQ.js +8 -0
- package/dist/assets/{sequenceDiagram-G6AWOVSC-awwP3H4O.js → sequenceDiagram-G6AWOVSC-D57iTQmb.js} +1 -1
- package/dist/assets/shell-CX-rkNHf.js +6 -0
- package/dist/assets/solidity-Tw7wswEv.js +6 -0
- package/dist/assets/sophia-C5WLch3f.js +6 -0
- package/dist/assets/sparql-DHaeiCBh.js +6 -0
- package/dist/assets/sql-CCSDG5nI.js +6 -0
- package/dist/assets/st-pnP8ivHi.js +6 -0
- package/dist/assets/{stateDiagram-MAYHULR4-DsTGBCid.js → stateDiagram-MAYHULR4-CRuUUGuz.js} +1 -1
- package/dist/assets/stateDiagram-v2-4JROLMXI-BJQKqklG.js +1 -0
- package/dist/assets/swift-DwJ7jVG9.js +8 -0
- package/dist/assets/systemverilog-B9Xyijhd.js +6 -0
- package/dist/assets/tcl-DnHyzjbg.js +6 -0
- package/dist/assets/{timeline-definition-U7ZMHBDA-Dur75zzR.js → timeline-definition-U7ZMHBDA-BRfqLAIq.js} +1 -1
- package/dist/assets/{transformers.web-CBYsiihV.js → transformers.web-DEPiewqN.js} +1 -1
- package/dist/assets/ts.worker-DM5dOG-y.js +51334 -0
- package/dist/assets/tsMode-BgtBH1sA.js +16 -0
- package/dist/assets/twig-CPajHgWi.js +6 -0
- package/dist/assets/typescript-zQGNOndA.js +6 -0
- package/dist/assets/typespec-D-MeaMDU.js +6 -0
- package/dist/assets/vb-DgyLZaXg.js +6 -0
- package/dist/assets/wgsl-BIv9DU6q.js +303 -0
- package/dist/assets/xml-Bc3MWklX.js +6 -0
- package/dist/assets/{xychartDiagram-6QU3TZC5-zevo9T1B.js → xychartDiagram-6QU3TZC5-BC7qvYIu.js} +1 -1
- package/dist/assets/yaml-BjdR185Q.js +6 -0
- package/dist/index.html +4 -3
- package/dist/ui-build.json +4 -0
- package/dist-apps/bundle-index.json +1 -0
- package/dist-electron/cli-bootstrap.js +1 -0
- package/dist-electron/main.js +63 -193
- package/dist-electron/overlay-preload.js +1 -0
- package/dist-electron/overlay.js +1 -129
- package/dist-electron/package.json +1 -1
- package/dist-electron/preload.js +1 -12
- package/dist-electron/shell-preload.js +1 -0
- package/dist-server/app.module.js +37 -2
- package/dist-server/bootstrap/browser-open.js +4 -0
- package/dist-server/bootstrap/codex-writable-roots.js +23 -0
- package/dist-server/bootstrap/crewx-server.js +34 -10
- package/dist-server/bootstrap/env.js +45 -0
- package/dist-server/bootstrap/tls.js +797 -50
- package/dist-server/common/cache/provider-limit-cache.js +474 -0
- package/dist-server/common/cache-db.js +239 -0
- package/dist-server/common/crewx-workspace-root.js +42 -0
- package/dist-server/common/current-user.js +14 -0
- package/dist-server/common/decorator/cached.decorator.js +35 -0
- package/dist-server/common/guard/request-log-metadata.guard.js +46 -0
- package/dist-server/common/interceptor/http-logging.interceptor.js +159 -31
- package/dist-server/common/mcp-app-sandbox-boundary.js +188 -0
- package/dist-server/common/mcp-app-sandbox-contract.js +719 -0
- package/dist-server/common/middleware/request-log-lifecycle.middleware.js +55 -0
- package/dist-server/common/pending-instruction.js +27 -0
- package/dist-server/common/product-app-bundle.generated.js +7 -0
- package/dist-server/common/product-app-bundle.js +54 -0
- package/dist-server/common/request-log/request-log-context.js +94 -0
- package/dist-server/common/security/instruction-sanitizer.js +191 -0
- package/dist-server/common/security/secret-mask.js +48 -0
- package/dist-server/common/task-error-projection.js +399 -0
- package/dist-server/common/task-log/progress-steps.js +70 -0
- package/dist-server/common/task-log/provider-resume.js +406 -0
- package/dist-server/common/task-log/public-log-projection.fixtures.js +153 -0
- package/dist-server/common/task-log/public-log-projection.js +187 -0
- package/dist-server/common/task-log/stdout-json-fallback.js +6 -196
- package/dist-server/common/task-result-projection.js +26 -0
- package/dist-server/common/task-stop.js +40 -0
- package/dist-server/common/task-usage-accounting.js +34 -0
- package/dist-server/common/ui/derive-ui-actor.js +39 -0
- package/dist-server/common/ui/resolve-task-actor.js +37 -0
- package/dist-server/common/ui/ui-runtime-http-error.js +48 -0
- package/dist-server/common/validation.pipe.js +79 -0
- package/dist-server/domain/account/account-auth-url.js +17 -0
- package/dist-server/domain/account/account-error.constants.js +23 -0
- package/dist-server/domain/account/account-error.exception-filter.js +32 -0
- package/dist-server/domain/account/account-profile.service.js +106 -0
- package/dist-server/domain/account/account-session.guard.js +34 -0
- package/dist-server/domain/account/account.controller.js +244 -0
- package/dist-server/domain/account/account.module.js +95 -0
- package/dist-server/domain/account/auth-json.store.js +45 -0
- package/dist-server/domain/account/auth-json.types.js +2 -0
- package/dist-server/domain/account/device-flow.service.js +274 -0
- package/dist-server/domain/account/token-refresh.service.js +183 -0
- package/dist-server/domain/agent/agent.controller.js +14 -0
- package/dist-server/domain/agent/agent.service.js +625 -32
- package/dist-server/domain/agent/builtin-agent-loader.js +47 -0
- package/dist-server/domain/agent/dto/create-agent.dto.js +15 -1
- package/dist-server/domain/agent/dto/remote-provider.dto.js +82 -0
- package/dist-server/domain/agent/dto/update-agent.dto.js +3 -1
- package/dist-server/domain/agent-suggestion/agent-suggestion.controller.js +104 -0
- package/dist-server/domain/agent-suggestion/agent-suggestion.module.js +27 -0
- package/dist-server/domain/agent-suggestion/agent-suggestion.service.js +582 -0
- package/dist-server/domain/agent-suggestion/analysis/h1-evidence.js +257 -0
- package/dist-server/domain/agent-suggestion/analysis/h1-prompt.js +246 -0
- package/dist-server/domain/agent-suggestion/analysis/h3-rules.js +85 -0
- package/dist-server/domain/agent-suggestion/analysis/index.js +22 -0
- package/dist-server/domain/agent-suggestion/analysis/merge3.js +192 -0
- package/dist-server/domain/agent-suggestion/analysis/secret-redaction.js +49 -0
- package/dist-server/domain/agent-suggestion/analysis/types.js +7 -0
- package/dist-server/domain/agent-suggestion/dto/apply-batch.dto.js +26 -0
- package/dist-server/domain/agent-suggestion/dto/suggestion-response.dto.js +2 -0
- package/dist-server/domain/app/app-list.types.js +9 -0
- package/dist-server/domain/app/app.controller.js +53 -0
- package/dist-server/domain/app/app.module.js +26 -0
- package/dist-server/domain/app/app.service.js +470 -0
- package/dist-server/domain/app/dto/app-list.dto.js +2 -0
- package/dist-server/domain/app-dev/app-dev.controller.js +334 -0
- package/dist-server/domain/app-dev/app-dev.module.js +26 -0
- package/dist-server/domain/app-dev/app-dev.service.js +1008 -0
- package/dist-server/domain/auth/auth-cookie-policy.js +61 -0
- package/dist-server/domain/auth/auth.controller.js +128 -15
- package/dist-server/domain/auth/auth.module.js +8 -7
- package/dist-server/domain/auth/guards/base-auth.guard.js +179 -28
- package/dist-server/domain/auth/guards/csrf.guard.js +58 -0
- package/dist-server/domain/auth/guards/local-only.guard.js +48 -0
- package/dist-server/domain/auth/guards/shortcut-csrf.guard.js +12 -0
- package/dist-server/domain/auth/local-pairing.service.js +148 -0
- package/dist-server/domain/auth/local-secret.js +251 -0
- package/dist-server/domain/auth/local-transport-policy.js +305 -0
- package/dist-server/domain/auth/session-store.js +170 -15
- package/dist-server/domain/auth/sessions-db.js +104 -0
- package/dist-server/domain/auth/utils/ip.utils.js +10 -5
- package/dist-server/domain/board/board.controller.js +115 -0
- package/dist-server/domain/board/board.module.js +26 -0
- package/dist-server/domain/board/board.service.js +747 -0
- package/dist-server/domain/board/board.types.js +2 -0
- package/dist-server/domain/board/dto/create-board-batch.dto.js +25 -0
- package/dist-server/domain/board/dto/create-board.dto.js +54 -0
- package/dist-server/domain/board/dto/plan-board.dto.js +24 -0
- package/dist-server/domain/board/dto/update-board.dto.js +31 -0
- package/dist-server/domain/cli/cli-local-only.guard.js +46 -0
- package/dist-server/domain/cli/cli.controller.js +62 -4
- package/dist-server/domain/cli/cli.module.js +5 -1
- package/dist-server/domain/cli/cli.service.js +669 -162
- package/dist-server/domain/cli/dto/cli-auth-status-query.dto.js +25 -0
- package/dist-server/domain/cli/dto/login-cli.dto.js +2 -2
- package/dist-server/domain/cron/cron-bootstrap.service.js +1048 -0
- package/dist-server/domain/cron/cron-runtime-host.module.js +41 -0
- package/dist-server/domain/cron/cron-runtime-sync.port.js +13 -0
- package/dist-server/domain/cron/cron-runtime-sync.service.js +259 -0
- package/dist-server/domain/cron/cron.controller.js +38 -3
- package/dist-server/domain/cron/cron.module.js +2 -0
- package/dist-server/domain/cron/cron.service.js +295 -39
- package/dist-server/domain/cron/dto/cron.dto.js +48 -2
- package/dist-server/domain/doc/doc.controller.js +149 -14
- package/dist-server/domain/doc/doc.module.js +4 -1
- package/dist-server/domain/doc/doc.service.js +97 -41
- package/dist-server/domain/doc/dto/doc.dto.js +11 -1
- package/dist-server/domain/doc/image-constants.js +3 -1
- package/dist-server/domain/env/dto/put-env.dto.js +23 -0
- package/dist-server/domain/env/env.controller.js +71 -0
- package/dist-server/domain/env/env.module.js +22 -0
- package/dist-server/domain/env/env.service.js +234 -0
- package/dist-server/domain/events/server-conversation.plugin.js +11 -5
- package/dist-server/domain/events/workspace-event.bus.js +8 -2
- package/dist-server/domain/events/workspace-event.types.js +20 -2
- package/dist-server/domain/events/workspace-events-test.controller.js +10 -2
- package/dist-server/domain/events/workspace-events.controller.js +17 -6
- package/dist-server/domain/fs/fs.service.js +2 -1
- package/dist-server/domain/git/git.service.js +88 -1
- package/dist-server/domain/health/health.controller.js +19 -2
- package/dist-server/domain/health/health.module.js +3 -0
- package/dist-server/domain/health/ui-asset-revision.service.js +40 -0
- package/dist-server/domain/knowledge/knowledge.service.js +6 -3
- package/dist-server/domain/market/__fixtures__/build-fixture.js +118 -0
- package/dist-server/domain/market/__fixtures__/marketplace-anonymous-install.contract.js +36 -0
- package/dist-server/domain/market/dto/install-apply.dto.js +23 -0
- package/dist-server/domain/market/dto/install-cancel.dto.js +25 -0
- package/dist-server/domain/market/dto/install-plan.dto.js +31 -0
- package/dist-server/domain/market/dto/invite-accept.dto.js +25 -0
- package/dist-server/domain/market/dto/publish-plan.dto.js +43 -0
- package/dist-server/domain/market/dto/publish-run.dto.js +18 -0
- package/dist-server/domain/market/dto/publisher-funnel.dto.js +72 -0
- package/dist-server/domain/market/dto/publisher-invite.dto.js +50 -0
- package/dist-server/domain/market/dto/shr-response.dto.js +20 -0
- package/dist-server/domain/market/first-run-event.listener.js +94 -0
- package/dist-server/domain/market/install-error.exception-filter.js +94 -0
- package/dist-server/domain/market/install-id.validation.js +4 -0
- package/dist-server/domain/market/install-plan-expired.exception-filter.js +28 -0
- package/dist-server/domain/market/install.service.js +889 -0
- package/dist-server/domain/market/market.controller.js +293 -2
- package/dist-server/domain/market/market.module.js +166 -4
- package/dist-server/domain/market/market.service.js +399 -38
- package/dist-server/domain/market/marketplace-api.client.js +616 -0
- package/dist-server/domain/market/marketplace-target.js +35 -0
- package/dist-server/domain/market/publish.controller.js +64 -0
- package/dist-server/domain/market/publish.service.js +343 -0
- package/dist-server/domain/market/publisher-invite-labels-ledger.service.js +174 -0
- package/dist-server/domain/market/publisher-invite.service.js +323 -0
- package/dist-server/domain/market/sharing-event.client.js +263 -0
- package/dist-server/domain/market/sharing-installs-ledger.service.js +303 -0
- package/dist-server/domain/market/sharing-updates.service.js +67 -0
- package/dist-server/domain/market/source-coordinate.js +72 -0
- package/dist-server/domain/market/template-installer.js +1399 -0
- package/dist-server/domain/mcp/app-debug-log.js +254 -0
- package/dist-server/domain/mcp/crewx-tool.factory.js +187 -37
- package/dist-server/domain/mcp/default-apps/shared.js +37 -0
- package/dist-server/domain/mcp/dto/open-mcp-app.dto.js +46 -0
- package/dist-server/domain/mcp/html-viewer.controller.js +101 -0
- package/dist-server/domain/mcp/html-viewer.service.js +415 -0
- package/dist-server/domain/mcp/mcp-app-actions.js +934 -0
- package/dist-server/domain/mcp/mcp-app-assets.js +31 -0
- package/dist-server/domain/mcp/mcp-app-resource-csp.interceptor.js +85 -0
- package/dist-server/domain/mcp/mcp-app-runtime.controller.js +59 -0
- package/dist-server/domain/mcp/mcp-app-runtime.service.js +146 -0
- package/dist-server/domain/mcp/mcp-app-sandbox.service.js +676 -0
- package/dist-server/domain/mcp/mcp-app-workspace-asset-catalog-resolver.js +94 -0
- package/dist-server/domain/mcp/mcp-apps.js +2563 -0
- package/dist-server/domain/mcp/mcp-auth.guard.js +0 -10
- package/dist-server/domain/mcp/mcp.constants.js +16 -1
- package/dist-server/domain/mcp/mcp.controller.js +2 -0
- package/dist-server/domain/mcp/mcp.module.js +20 -3
- package/dist-server/domain/mcp/mcp.service.js +1169 -30
- package/dist-server/domain/mcp/product-app-bundle-assets.js +65 -0
- package/dist-server/domain/mcp/skill-backend.port.js +1089 -0
- package/dist-server/domain/mcp/ui-content-channel.service.js +220 -0
- package/dist-server/domain/message/dto/send-message.dto.js +79 -4
- package/dist-server/domain/message/message.controller.js +91 -18
- package/dist-server/domain/message/message.module.js +2 -1
- package/dist-server/domain/message/message.multipart.js +295 -0
- package/dist-server/domain/message/message.service.js +570 -97
- package/dist-server/domain/notification/dto/create-notification.dto.js +79 -0
- package/dist-server/domain/notification/dto/list-notifications.dto.js +27 -0
- package/dist-server/domain/notification/notification.controller.js +135 -0
- package/dist-server/domain/notification/notification.module.js +34 -0
- package/dist-server/domain/notification/notification.service.js +65 -0
- package/dist-server/domain/project/dto/create-project-ledger.dto.js +89 -0
- package/dist-server/domain/project/project-ledger.controller.js +72 -0
- package/dist-server/domain/project/project-ledger.service.js +124 -0
- package/dist-server/domain/project/project.module.js +5 -3
- package/dist-server/domain/settings/local-ai-server/local-ai-server.controller.js +96 -0
- package/dist-server/domain/settings/local-ai-server/local-ai-server.dto.js +37 -0
- package/dist-server/domain/settings/local-ai-server/local-ai-server.network-policy.js +416 -0
- package/dist-server/domain/settings/local-ai-server/local-ai-server.service.js +298 -0
- package/dist-server/domain/settings/local-ai-server/local-ai-server.types.js +10 -0
- package/dist-server/domain/settings/request-logs.controller.js +81 -0
- package/dist-server/domain/settings/request-logs.service.js +364 -0
- package/dist-server/domain/settings/request-logs.types.js +5 -0
- package/dist-server/domain/settings/settings.controller.js +11 -0
- package/dist-server/domain/settings/settings.module.js +36 -3
- package/dist-server/domain/settings/settings.service.js +427 -3
- package/dist-server/domain/settings/storage-retention.js +969 -0
- package/dist-server/domain/settings/storage-retention.worker.js +191 -0
- package/dist-server/domain/settings/storage.controller.js +95 -0
- package/dist-server/domain/settings/storage.service.js +255 -0
- package/dist-server/domain/settings/storage.types.js +2 -0
- package/dist-server/domain/system/desktop-control.guard.js +67 -0
- package/dist-server/domain/system/shortcut.service.js +353 -0
- package/dist-server/domain/system/shortcut.types.js +8 -0
- package/dist-server/domain/system/shutdown.dto.js +22 -0
- package/dist-server/domain/system/system.controller.js +240 -13
- package/dist-server/domain/system/system.module.js +19 -0
- package/dist-server/domain/system/system.service.js +50 -0
- package/dist-server/domain/system/task-ownership.js +32 -0
- package/dist-server/domain/system/update-gate.service.js +234 -0
- package/dist-server/domain/task/child-task-projection.js +94 -0
- package/dist-server/domain/task/dto/task-prompt.dto.js +40 -0
- package/dist-server/domain/task/prompt-composition.js +443 -0
- package/dist-server/domain/task/task-execution-path.js +47 -0
- package/dist-server/domain/task/task.constants.js +1 -8
- package/dist-server/domain/task/task.controller.js +116 -9
- package/dist-server/domain/task/task.module.js +4 -2
- package/dist-server/domain/task/task.service.js +1085 -363
- package/dist-server/domain/terminal/terminal-audit.service.js +99 -0
- package/dist-server/domain/terminal/terminal-csp.js +37 -0
- package/dist-server/domain/terminal/terminal-local-only.guard.js +56 -0
- package/dist-server/domain/terminal/terminal-session.service.js +372 -0
- package/dist-server/domain/terminal/terminal-ticket.service.js +108 -0
- package/dist-server/domain/terminal/terminal-ws.service.js +242 -0
- package/dist-server/domain/terminal/terminal.controller.js +98 -0
- package/dist-server/domain/terminal/terminal.module.js +36 -0
- package/dist-server/domain/thread/dto/highlight.dto.js +114 -0
- package/dist-server/domain/thread/dto/list-threads.dto.js +48 -1
- package/dist-server/domain/thread/dto/thread-label.dto.js +104 -0
- package/dist-server/domain/thread/dto/timeline-query.dto.js +51 -0
- package/dist-server/domain/thread/dto/update-thread.dto.js +44 -0
- package/dist-server/domain/thread/thread-highlight-flight.service.js +53 -0
- package/dist-server/domain/thread/thread-highlight-regeneration.service.js +277 -0
- package/dist-server/domain/thread/thread-highlight-trigger.service.js +727 -0
- package/dist-server/domain/thread/thread-highlight.constants.js +5 -0
- package/dist-server/domain/thread/thread-label.controller.js +104 -0
- package/dist-server/domain/thread/thread-label.service.js +249 -0
- package/dist-server/domain/thread/thread-preview.controller.js +44 -0
- package/dist-server/domain/thread/thread-title.backfill.js +42 -0
- package/dist-server/domain/thread/thread-title.types.js +27 -0
- package/dist-server/domain/thread/thread.controller.js +105 -6
- package/dist-server/domain/thread/thread.module.js +19 -4
- package/dist-server/domain/thread/thread.service.js +923 -258
- package/dist-server/domain/token/token.module.js +5 -1
- package/dist-server/domain/token/token.service.js +213 -11
- package/dist-server/domain/usage/codex-rate-limits.client.js +513 -0
- package/dist-server/domain/usage/usage.controller.js +16 -12
- package/dist-server/domain/usage/usage.service.js +1045 -278
- package/dist-server/domain/usage-report/report-findings.js +109 -0
- package/dist-server/domain/usage-report/usage-report.service.js +5 -0
- package/dist-server/domain/wi/dto/create-wi.dto.js +67 -0
- package/dist-server/domain/wi/dto/update-wi-status.dto.js +24 -0
- package/dist-server/domain/wi/wi.controller.js +43 -1
- package/dist-server/domain/wi/wi.service.js +402 -70
- package/dist-server/domain/workflow/chat-card-proof.service.js +17 -3
- package/dist-server/domain/workflow/dto/thread-app-launch.dto.js +49 -0
- package/dist-server/domain/workflow/thread-app-launch.controller.js +327 -0
- package/dist-server/domain/workflow/ui-instance.controller.js +1503 -0
- package/dist-server/domain/workflow/workflow-approval-v2.js +748 -0
- package/dist-server/domain/workflow/workflow.controller.js +21 -5
- package/dist-server/domain/workflow/workflow.module.js +60 -2
- package/dist-server/domain/workflow/workflow.service.js +639 -201
- package/dist-server/domain/workspace/dto/create-workspace.dto.js +26 -9
- package/dist-server/domain/workspace/dto/rename-workspace.dto.js +27 -0
- package/dist-server/domain/workspace/workspace.controller.js +31 -3
- package/dist-server/domain/workspace/workspace.module.js +2 -0
- package/dist-server/domain/workspace/workspace.service.js +167 -6
- package/dist-server/main.js +128 -22
- package/dist-server/modules/crewx-pool.service.js +383 -60
- package/dist-server/modules/crewx.module.js +8 -2
- package/dist-server/modules/workspace-config.store.js +111 -0
- package/dist-server/repository/agent-suggestion.repository.js +39 -0
- package/dist-server/repository/notification.repository.js +33 -0
- package/dist-server/repository/project.repository.js +10 -0
- package/dist-server/repository/repository.module.js +6 -0
- package/dist-server/repository/request-log.repository.js +3 -0
- package/dist-server/repository/task.repository.js +632 -69
- package/dist-server/repository/thread-label.repository.js +86 -0
- package/dist-server/repository/thread.repository.js +735 -0
- package/dist-server/shared/attachment-path.js +50 -0
- package/dist-server/shared/attachment-policy.js +191 -0
- package/dist-server/shared/crewx-home.js +6 -56
- package/dist-server/shared/doc-heading.js +69 -0
- package/dist-server/shared/marketplace-api.constants.js +12 -0
- package/dist-server/shared/thread-label.js +8 -0
- package/dist-server/shared/workflow-run.contract.js +8 -0
- package/examples/mcp-apps/dist/sandbox/sandbox.html +14 -0
- package/examples/mcp-apps/dist/workflow/workflow-card.html +161 -0
- package/package.json +187 -29
- package/packages/cli/dist/bootstrap/codex-writable-roots.d.ts +13 -0
- package/packages/cli/dist/bootstrap/codex-writable-roots.js +25 -0
- package/packages/cli/dist/bootstrap/crewx-cli.js +27 -6
- package/packages/cli/dist/builtin.d.ts +1 -1
- package/packages/cli/dist/builtin.js +7 -2
- package/packages/cli/dist/commands/agent.js +1 -107
- package/packages/cli/dist/commands/cal.d.ts +15 -0
- package/packages/cli/dist/commands/cal.js +44 -0
- package/packages/cli/dist/commands/db.d.ts +2 -0
- package/packages/cli/dist/commands/db.js +381 -1
- package/packages/cli/dist/commands/detached.d.ts +95 -0
- package/packages/cli/dist/commands/detached.js +620 -0
- package/packages/cli/dist/commands/doctor.d.ts +77 -0
- package/packages/cli/dist/commands/doctor.js +475 -22
- package/packages/cli/dist/commands/emit-trailer.d.ts +25 -0
- package/packages/cli/dist/commands/emit-trailer.js +33 -0
- package/packages/cli/dist/commands/execute.d.ts +8 -4
- package/packages/cli/dist/commands/execute.js +201 -49
- package/packages/cli/dist/commands/hook/command-marker.d.ts +2 -0
- package/packages/cli/dist/commands/hook/command-marker.js +5 -0
- package/packages/cli/dist/commands/hook/install.d.ts +0 -1
- package/packages/cli/dist/commands/hook/install.js +75 -61
- package/packages/cli/dist/commands/hook/status.js +3 -3
- package/packages/cli/dist/commands/hook/uninstall.js +2 -2
- package/packages/cli/dist/commands/init.d.ts +34 -0
- package/packages/cli/dist/commands/init.js +132 -59
- package/packages/cli/dist/commands/kill.d.ts +2 -8
- package/packages/cli/dist/commands/kill.js +6 -47
- package/packages/cli/dist/commands/log.js +4 -3
- package/packages/cli/dist/commands/parse-common-flags.d.ts +7 -1
- package/packages/cli/dist/commands/parse-common-flags.js +37 -4
- package/packages/cli/dist/commands/ps.d.ts +2 -2
- package/packages/cli/dist/commands/ps.js +25 -15
- package/packages/cli/dist/commands/publish.d.ts +1 -0
- package/packages/cli/dist/commands/publish.js +303 -0
- package/packages/cli/dist/commands/query.d.ts +7 -2
- package/packages/cli/dist/commands/query.js +196 -46
- package/packages/cli/dist/commands/registry.js +4 -2
- package/packages/cli/dist/commands/resolve-prompt.js +23 -1
- package/packages/cli/dist/commands/resolve-recipient.d.ts +14 -0
- package/packages/cli/dist/commands/resolve-recipient.js +47 -0
- package/packages/cli/dist/commands/result.d.ts +8 -3
- package/packages/cli/dist/commands/result.js +139 -7
- package/packages/cli/dist/commands/shortcut.d.ts +1 -0
- package/packages/cli/dist/commands/shortcut.js +267 -0
- package/packages/cli/dist/commands/slack.js +2 -1
- package/packages/cli/dist/commands/stop.d.ts +8 -0
- package/packages/cli/dist/commands/stop.js +119 -0
- package/packages/cli/dist/commands/write-output.d.ts +3 -0
- package/packages/cli/dist/commands/write-output.js +24 -0
- package/packages/cli/dist/index.d.ts +1 -1
- package/packages/cli/dist/index.js +4 -1
- package/packages/cli/dist/logging.d.ts +1 -1
- package/packages/cli/dist/logging.js +3 -2
- package/packages/cli/dist/main.d.ts +3 -2
- package/packages/cli/dist/main.js +96 -24
- package/packages/cli/dist/utils/env-defaults.d.ts +2 -5
- package/packages/cli/dist/utils/env-defaults.js +10 -5
- package/packages/cli/dist/utils/inherited-trace.d.ts +24 -0
- package/packages/cli/dist/utils/inherited-trace.js +40 -0
- package/packages/cli/dist/utils/product-package-root.d.ts +6 -0
- package/packages/cli/dist/utils/product-package-root.js +39 -0
- package/packages/cli/dist/utils/sdk-compat.d.ts +24 -0
- package/packages/cli/dist/utils/sdk-compat.js +120 -0
- package/packages/cli/package.json +5 -1
- package/server.js +2 -2
- package/dist/assets/MarketPage-BgAWacd7.js +0 -41
- package/dist/assets/PromptTab-LML0dhnv.js +0 -27
- package/dist/assets/channel-cs9O3fiH.js +0 -1
- package/dist/assets/classDiagram-LNE6IOMH-veS4tD2p.js +0 -1
- package/dist/assets/classDiagram-v2-MQ7JQ4JX-veS4tD2p.js +0 -1
- package/dist/assets/gitGraph-YCYPL57B-Cv8vXWsN.js +0 -133
- package/dist/assets/main-BOcmSxv5.css +0 -10
- package/dist/assets/main-CZQslZK1.js +0 -1526
- package/dist/assets/stateDiagram-v2-4JROLMXI-B8Exp_99.js +0 -1
package/bin/cli-commands.js
CHANGED
|
@@ -14,16 +14,18 @@ export const CLI_SUBCOMMANDS = new Set([
|
|
|
14
14
|
|
|
15
15
|
// Agent / Task
|
|
16
16
|
'agent',
|
|
17
|
-
'ps', 'kill', 'result', 'log', 'restart',
|
|
17
|
+
'ps', 'stop', 'kill', 'result', 'log', 'restart',
|
|
18
18
|
|
|
19
19
|
// Diagnostics / Init / DB
|
|
20
20
|
'doctor', 'init',
|
|
21
21
|
'db',
|
|
22
22
|
'help',
|
|
23
|
+
'shortcut',
|
|
24
|
+
'publish',
|
|
23
25
|
|
|
24
26
|
// Built-in tools
|
|
25
27
|
'memory', 'search', 'doc', 'wbs', 'cron', 'workflow', 'skill', 'dreaming',
|
|
26
|
-
'wi', 'chromex',
|
|
28
|
+
'wi', 'chromex', 'notify', 'app',
|
|
27
29
|
|
|
28
30
|
// Hook platform
|
|
29
31
|
'hook', 'hook-dispatch',
|
package/bin/crewx-lib.js
CHANGED
|
@@ -1,12 +1,104 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* crewx launcher library — testable pure-logic functions extracted from crewx.js.
|
|
3
3
|
*/
|
|
4
|
-
import { mkdirSync } from 'fs';
|
|
4
|
+
import { lstatSync, mkdirSync, readFileSync } from 'fs';
|
|
5
5
|
import { homedir } from 'os';
|
|
6
6
|
import { join } from 'path';
|
|
7
|
+
import { getCrewxHome } from '@crewx/sdk';
|
|
7
8
|
import { CLI_SUBCOMMANDS } from './cli-commands.js';
|
|
8
9
|
import { buildHintMessage } from './launcher-flags.js';
|
|
9
10
|
|
|
11
|
+
const PAIRING_CREDENTIAL_MODE = 0o600;
|
|
12
|
+
const PAIRING_CREDENTIAL_NAME = 'pairing.token';
|
|
13
|
+
const DEFAULT_PAIRING_ENDPOINT = 'http://localhost:8150';
|
|
14
|
+
// Mirrors the WI-028 packages/built-in/shared/crewx-api-credential contract.
|
|
15
|
+
const PAIRING_CREDENTIAL_PATTERN = /^crewxrt_pairing_[0-9a-f]{64}$/;
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
function currentUid() {
|
|
19
|
+
return process.platform === 'win32' || typeof process.getuid !== 'function'
|
|
20
|
+
? undefined
|
|
21
|
+
: process.getuid();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Return the canonical runtime credential path used by the local server.
|
|
26
|
+
* The path is intentionally resolved through the SDK's shared home helper.
|
|
27
|
+
*
|
|
28
|
+
* @returns {string}
|
|
29
|
+
*/
|
|
30
|
+
export function pairingCredentialPath() {
|
|
31
|
+
return join(getCrewxHome(), 'auth', 'runtime', PAIRING_CREDENTIAL_NAME);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Read the purpose-scoped pairing credential with the WI-028 file contract.
|
|
36
|
+
* Missing, unreadable, or insecure files throw before any HTTP request can be
|
|
37
|
+
* made. Error messages never include the credential value.
|
|
38
|
+
*
|
|
39
|
+
* @returns {string}
|
|
40
|
+
*/
|
|
41
|
+
export function readPairingCredential() {
|
|
42
|
+
const filePath = pairingCredentialPath();
|
|
43
|
+
let fileStat;
|
|
44
|
+
try {
|
|
45
|
+
fileStat = lstatSync(filePath);
|
|
46
|
+
} catch (error) {
|
|
47
|
+
if (error?.code === 'ENOENT') {
|
|
48
|
+
throw new Error('Pairing runtime credential is missing; start the CrewX server once to create pairing.token.');
|
|
49
|
+
}
|
|
50
|
+
throw new Error('Pairing runtime credential is not readable.');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (!fileStat.isFile()) {
|
|
54
|
+
throw new Error('Pairing runtime credential is not a regular file.');
|
|
55
|
+
}
|
|
56
|
+
if (process.platform !== 'win32' && (fileStat.mode & 0o777) !== PAIRING_CREDENTIAL_MODE) {
|
|
57
|
+
throw new Error('Pairing runtime credential permissions are invalid; expected mode 0600.');
|
|
58
|
+
}
|
|
59
|
+
const uid = currentUid();
|
|
60
|
+
if (uid !== undefined && fileStat.uid !== uid) {
|
|
61
|
+
throw new Error('Pairing runtime credential must be owned by the current user.');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
let credential;
|
|
65
|
+
try {
|
|
66
|
+
credential = readFileSync(filePath, 'utf8');
|
|
67
|
+
} catch {
|
|
68
|
+
throw new Error('Pairing runtime credential is not readable.');
|
|
69
|
+
}
|
|
70
|
+
if (!PAIRING_CREDENTIAL_PATTERN.test(credential)) {
|
|
71
|
+
throw new Error('Pairing runtime credential has an invalid format.');
|
|
72
|
+
}
|
|
73
|
+
return credential;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Resolve the server endpoint for `crewx pair`.
|
|
78
|
+
* Explicit --port wins over CREWX_ENDPOINT, which wins over the local default.
|
|
79
|
+
*
|
|
80
|
+
* @param {{ port?: number, env?: NodeJS.ProcessEnv }} options
|
|
81
|
+
* @returns {string}
|
|
82
|
+
*/
|
|
83
|
+
export function resolvePairEndpoint({ port, env = process.env } = {}) {
|
|
84
|
+
const rawEndpoint = port === undefined
|
|
85
|
+
? (env.CREWX_ENDPOINT?.trim() || DEFAULT_PAIRING_ENDPOINT)
|
|
86
|
+
: `http://localhost:${port}`;
|
|
87
|
+
let endpoint;
|
|
88
|
+
try {
|
|
89
|
+
endpoint = new URL(rawEndpoint);
|
|
90
|
+
} catch {
|
|
91
|
+
throw new Error('Invalid CrewX endpoint. Use an http:// or https:// URL.');
|
|
92
|
+
}
|
|
93
|
+
if (endpoint.protocol !== 'http:' && endpoint.protocol !== 'https:') {
|
|
94
|
+
throw new Error('Invalid CrewX endpoint. Use an http:// or https:// URL.');
|
|
95
|
+
}
|
|
96
|
+
if (endpoint.username || endpoint.password || endpoint.search || endpoint.hash) {
|
|
97
|
+
throw new Error('Invalid CrewX endpoint. Do not include credentials, query, or fragment data.');
|
|
98
|
+
}
|
|
99
|
+
return endpoint.toString().replace(/\/$/, '');
|
|
100
|
+
}
|
|
101
|
+
|
|
10
102
|
|
|
11
103
|
/**
|
|
12
104
|
* Parse --port option from extra CLI args.
|
|
@@ -32,9 +124,10 @@ export function parseWebPort(extraArgs) {
|
|
|
32
124
|
* 1. --help/-h, --version/-v → CLI (global options handled by CLI engine)
|
|
33
125
|
* 2. Known CLI subcommand → CLI
|
|
34
126
|
* 3. 'serve' verb → serve
|
|
35
|
-
* 4. '
|
|
36
|
-
* 5.
|
|
37
|
-
* 6.
|
|
127
|
+
* 4. 'pair' verb → pair
|
|
128
|
+
* 5. 'electron' verb → electron
|
|
129
|
+
* 6. No arguments → web-default (browser auto-open)
|
|
130
|
+
* 7. Unknown first argument → error with hint
|
|
38
131
|
*
|
|
39
132
|
* @param {string[]} args - process.argv.slice(2)
|
|
40
133
|
* @returns {{ route: string, routeArgs: string[], error?: string }}
|
|
@@ -60,12 +153,17 @@ export function resolveRoute(args) {
|
|
|
60
153
|
return { route: 'serve', routeArgs: args.slice(1) };
|
|
61
154
|
}
|
|
62
155
|
|
|
63
|
-
// 4.
|
|
156
|
+
// 4. Local browser pairing code requester
|
|
157
|
+
if (firstArg === 'pair') {
|
|
158
|
+
return { route: 'pair', routeArgs: args.slice(1) };
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// 5. New verb: electron
|
|
64
162
|
if (firstArg === 'electron') {
|
|
65
163
|
return { route: 'electron', routeArgs: args.slice(1) };
|
|
66
164
|
}
|
|
67
165
|
|
|
68
|
-
//
|
|
166
|
+
// 6. No arguments → web default
|
|
69
167
|
if (firstArg === undefined) {
|
|
70
168
|
return { route: 'web-default', routeArgs: [] };
|
|
71
169
|
}
|
package/bin/crewx-ui.js
CHANGED
|
@@ -53,12 +53,6 @@ if (isElectron || isOverlay) {
|
|
|
53
53
|
? join(__dirname, '..', 'dist-electron', 'overlay.js')
|
|
54
54
|
: join(__dirname, '..', 'dist-electron', 'main.js');
|
|
55
55
|
|
|
56
|
-
if (process.env.ELECTRON_RUN_AS_NODE) {
|
|
57
|
-
console.warn(
|
|
58
|
-
'[crewx-ui] Ignoring ELECTRON_RUN_AS_NODE for Electron UI launch (it forces Electron into Node mode).',
|
|
59
|
-
);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
56
|
const child = spawn(String(electronPath), [entryFile], {
|
|
63
57
|
stdio: 'inherit',
|
|
64
58
|
env: getElectronSpawnEnv(),
|
package/bin/crewx.ico
ADDED
|
Binary file
|
package/bin/crewx.js
CHANGED
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
* [--https] → Enable HTTPS with auto-generated certificate
|
|
11
11
|
* [--trust] → Install CA to system trust store (requires --https)
|
|
12
12
|
* [--no-open] → Do not open browser
|
|
13
|
+
* crewx pair [--port N] → Request a one-time browser pairing link
|
|
14
|
+
* [--open] → Open the pairing link in a browser
|
|
13
15
|
* crewx electron [--overlay] → Electron desktop or overlay window
|
|
14
16
|
* crewx --version → CLI version output
|
|
15
17
|
* crewx --help → CLI help output
|
|
@@ -22,7 +24,13 @@ import { dirname, join } from 'path';
|
|
|
22
24
|
import { homedir, tmpdir } from 'os';
|
|
23
25
|
import { createRequire } from 'module';
|
|
24
26
|
import { defineCommand, runCommand, renderUsage } from 'citty';
|
|
25
|
-
import {
|
|
27
|
+
import {
|
|
28
|
+
setupSignalForwarding,
|
|
29
|
+
resolveRoute,
|
|
30
|
+
ensureCrewxDirs,
|
|
31
|
+
readPairingCredential,
|
|
32
|
+
resolvePairEndpoint,
|
|
33
|
+
} from './crewx-lib.js';
|
|
26
34
|
|
|
27
35
|
const __filename = fileURLToPath(import.meta.url);
|
|
28
36
|
const __dirname = dirname(__filename);
|
|
@@ -47,12 +55,6 @@ function launchElectron(entryFile, routeArgs = []) {
|
|
|
47
55
|
return false; // Electron not installed
|
|
48
56
|
}
|
|
49
57
|
|
|
50
|
-
if (process.env.ELECTRON_RUN_AS_NODE) {
|
|
51
|
-
console.warn(
|
|
52
|
-
'[crewx] Ignoring ELECTRON_RUN_AS_NODE for Electron UI launch (it forces Electron into Node mode).',
|
|
53
|
-
);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
58
|
const child = spawn(String(electronPath), [entryFile, ...routeArgs], {
|
|
57
59
|
stdio: 'inherit',
|
|
58
60
|
env: getElectronSpawnEnv(),
|
|
@@ -132,7 +134,7 @@ function launchWeb({ port, token, tokenFile, open: openFlag, https, trust } = {}
|
|
|
132
134
|
);
|
|
133
135
|
}
|
|
134
136
|
|
|
135
|
-
const child = spawn(process.execPath, [serverScript], {
|
|
137
|
+
const child = spawn(process.execPath, ['--disable-sigusr1', serverScript], {
|
|
136
138
|
stdio: 'inherit',
|
|
137
139
|
env,
|
|
138
140
|
});
|
|
@@ -146,6 +148,111 @@ function launchWeb({ port, token, tokenFile, open: openFlag, https, trust } = {}
|
|
|
146
148
|
});
|
|
147
149
|
}
|
|
148
150
|
|
|
151
|
+
function parsePairPort(value) {
|
|
152
|
+
const port = Number(value);
|
|
153
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535) {
|
|
154
|
+
console.error('❌ Invalid port number. Use 1-65535.');
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
return port;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function isPairingUrl(value) {
|
|
161
|
+
if (typeof value !== 'string' || value.length === 0) return false;
|
|
162
|
+
try {
|
|
163
|
+
const url = new URL(value);
|
|
164
|
+
return (url.protocol === 'http:' || url.protocol === 'https:')
|
|
165
|
+
&& url.search === ''
|
|
166
|
+
&& /^#pair=.{1,}$/.test(url.hash);
|
|
167
|
+
} catch {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
async function requestPairingLink(endpoint, credential) {
|
|
173
|
+
let response;
|
|
174
|
+
try {
|
|
175
|
+
response = await fetch(`${endpoint}/api/v1/auth/local/code`, {
|
|
176
|
+
method: 'POST',
|
|
177
|
+
headers: {
|
|
178
|
+
Accept: 'application/json',
|
|
179
|
+
Authorization: `Bearer ${credential}`,
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
} catch {
|
|
183
|
+
throw new Error(`Could not reach the CrewX server at ${endpoint}.`);
|
|
184
|
+
}
|
|
185
|
+
if (!response.ok) {
|
|
186
|
+
throw new Error(`Pairing code request failed (HTTP ${response.status}).`);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
let payload;
|
|
190
|
+
try {
|
|
191
|
+
payload = await response.json();
|
|
192
|
+
} catch {
|
|
193
|
+
throw new Error('Pairing code response was not valid JSON.');
|
|
194
|
+
}
|
|
195
|
+
if (!isPairingUrl(payload?.url)) {
|
|
196
|
+
throw new Error('Pairing code response did not contain a valid pairing URL.');
|
|
197
|
+
}
|
|
198
|
+
return payload.url;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const pairCommand = defineCommand({
|
|
202
|
+
meta: { name: 'pair', description: 'Request a one-time local browser pairing link' },
|
|
203
|
+
args: {
|
|
204
|
+
port: { type: 'string', description: 'Port of the CrewX web server' },
|
|
205
|
+
open: { type: 'boolean', description: 'Open the pairing link in a browser', default: false },
|
|
206
|
+
help: { type: 'boolean', alias: 'h', description: 'Show this help' },
|
|
207
|
+
},
|
|
208
|
+
async run({ args }) {
|
|
209
|
+
if (args.help) {
|
|
210
|
+
const usage = await renderUsage(pairCommand);
|
|
211
|
+
process.stdout.write(usage + '\n');
|
|
212
|
+
process.exit(0);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const knownArgs = new Set(['_', 'port', 'open', 'help', 'h']);
|
|
216
|
+
for (const key of Object.keys(args)) {
|
|
217
|
+
if (!knownArgs.has(key)) {
|
|
218
|
+
console.error(`❌ Unknown option for "crewx pair": --${key}`);
|
|
219
|
+
console.error(' Run `crewx pair --help` for usage.');
|
|
220
|
+
process.exit(2);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const port = args.port === undefined ? undefined : parsePairPort(args.port);
|
|
225
|
+
let endpoint;
|
|
226
|
+
let credential;
|
|
227
|
+
try {
|
|
228
|
+
endpoint = resolvePairEndpoint({ port });
|
|
229
|
+
credential = readPairingCredential();
|
|
230
|
+
} catch (error) {
|
|
231
|
+
console.error(`❌ ${error instanceof Error ? error.message : 'Unable to read pairing credential.'}`);
|
|
232
|
+
process.exit(1);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
let pairingUrl;
|
|
236
|
+
try {
|
|
237
|
+
pairingUrl = await requestPairingLink(endpoint, credential);
|
|
238
|
+
} catch (error) {
|
|
239
|
+
console.error(`❌ ${error instanceof Error ? error.message : 'Unable to request pairing link.'}`);
|
|
240
|
+
process.exit(1);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
process.stdout.write(`${pairingUrl}\n`);
|
|
244
|
+
if (args.open) {
|
|
245
|
+
try {
|
|
246
|
+
const open = (await import('open')).default;
|
|
247
|
+
await open(pairingUrl);
|
|
248
|
+
} catch {
|
|
249
|
+
console.error('❌ Could not open the pairing link automatically.');
|
|
250
|
+
process.exit(1);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
|
|
149
256
|
const serveCommand = defineCommand({
|
|
150
257
|
meta: { name: 'serve', description: 'Launch CrewX web server' },
|
|
151
258
|
args: {
|
|
@@ -215,6 +322,8 @@ const { route, routeArgs, error } = resolveRoute(args);
|
|
|
215
322
|
|
|
216
323
|
if (route === 'serve') {
|
|
217
324
|
runCommand(serveCommand, { rawArgs: routeArgs });
|
|
325
|
+
} else if (route === 'pair') {
|
|
326
|
+
runCommand(pairCommand, { rawArgs: routeArgs });
|
|
218
327
|
} else if (route === 'electron') {
|
|
219
328
|
// Electron: desktop (default) or overlay (--overlay flag)
|
|
220
329
|
const isOverlay = routeArgs.includes('--overlay');
|