crewx 0.9.0-rc.14 → 0.9.0-rc.141

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.
Files changed (528) hide show
  1. package/bin/cli-commands.js +4 -2
  2. package/bin/crewx-lib.js +104 -6
  3. package/bin/crewx-ui.js +0 -6
  4. package/bin/crewx.ico +0 -0
  5. package/bin/crewx.js +117 -8
  6. package/crewx-host.js +6 -0
  7. package/dist/assets/GitDiffEditor-B836lFO2.css +1 -0
  8. package/dist/assets/GitDiffEditor-fK_K5gYH.js +762 -0
  9. package/dist/assets/MarketPage-D43REtkL.js +41 -0
  10. package/dist/assets/PromptTab-1X_Ts7F3.js +27 -0
  11. package/dist/assets/abap-BrgZPUOV.js +6 -0
  12. package/dist/assets/apex-DyP6w7ZV.js +6 -0
  13. package/dist/assets/{arc-BBMQPf9Z.js → arc-CdRvcSaU.js} +1 -1
  14. package/dist/assets/{architectureDiagram-UYN6MBPD-Uinv3ruS.js → architectureDiagram-UYN6MBPD-p2J8Rh6f.js} +1 -1
  15. package/dist/assets/azcli-BaLxmfj-.js +6 -0
  16. package/dist/assets/bat-CFOPXBzS.js +6 -0
  17. package/dist/assets/bicep-BfEKNvv3.js +7 -0
  18. package/dist/assets/{blockDiagram-ZHA2E4KO-CM8iVhUy.js → blockDiagram-ZHA2E4KO-qYZ1yLKk.js} +5 -5
  19. package/dist/assets/{c4Diagram-6F5ED5ID-D6HM4dEk.js → c4Diagram-6F5ED5ID-DlSji_w3.js} +1 -1
  20. package/dist/assets/cameligo-BFG1Mk7z.js +6 -0
  21. package/dist/assets/channel-BgLTdot9.js +1 -0
  22. package/dist/assets/{chunk-5HRBRIJM-CsiffIEz.js → chunk-5HRBRIJM-Ca-eIlHR.js} +1 -1
  23. package/dist/assets/{chunk-7U56Z5CX-kgH95T9a.js → chunk-7U56Z5CX-NaOV3IWh.js} +1 -1
  24. package/dist/assets/{chunk-ASOPGD6M-dKFyf37d.js → chunk-ASOPGD6M-B4pzS5s3.js} +1 -1
  25. package/dist/assets/{chunk-KFBOBJHC-Det1gu-Y.js → chunk-KFBOBJHC-Bsu4Eu-3.js} +1 -1
  26. package/dist/assets/{chunk-T2TOU4HS-DMk7ilyN.js → chunk-T2TOU4HS-BeDVowlp.js} +1 -1
  27. package/dist/assets/{chunk-TMUBEWPD-drsYJGIt.js → chunk-TMUBEWPD-BiMIruJ7.js} +1 -1
  28. package/dist/assets/classDiagram-LNE6IOMH-DMks7Rvy.js +1 -0
  29. package/dist/assets/classDiagram-v2-MQ7JQ4JX-DMks7Rvy.js +1 -0
  30. package/dist/assets/clojure-DTECt2xU.js +6 -0
  31. package/dist/assets/codicon-DCmgc-ay.ttf +0 -0
  32. package/dist/assets/coffee-CDGzqUPQ.js +6 -0
  33. package/dist/assets/cpp-CLLBncYj.js +6 -0
  34. package/dist/assets/csharp-dUCx_-0o.js +6 -0
  35. package/dist/assets/csp-5Rap-vPy.js +6 -0
  36. package/dist/assets/css-D3h14YRZ.js +8 -0
  37. package/dist/assets/css.worker-CVdCITaq.js +84 -0
  38. package/dist/assets/cssMode-DFfIq7T6.js +9 -0
  39. package/dist/assets/cypher-DrQuvNYM.js +6 -0
  40. package/dist/assets/{dagre-4EVJKHTY-DKMJYrr5.js → dagre-4EVJKHTY-CibzfEaQ.js} +1 -1
  41. package/dist/assets/dart-CFKIUWau.js +6 -0
  42. package/dist/assets/{diagram-QW4FP2JN-BNyGnAGw.js → diagram-QW4FP2JN-wYD5JLhL.js} +1 -1
  43. package/dist/assets/dockerfile-Zznr-cwX.js +6 -0
  44. package/dist/assets/ecl-Ce3n6wWz.js +6 -0
  45. package/dist/assets/editor.worker-D_iEFMe4.js +12 -0
  46. package/dist/assets/elixir-deUWdS0T.js +6 -0
  47. package/dist/assets/{erDiagram-6RL3IURR-qo27Uk30.js → erDiagram-6RL3IURR-ilUqYeNp.js} +1 -1
  48. package/dist/assets/flow9-i9-g7ZhI.js +6 -0
  49. package/dist/assets/{flowDiagram-7ASYPVHJ-BudDObQU.js → flowDiagram-7ASYPVHJ-IrScF7kt.js} +1 -1
  50. package/dist/assets/freemarker2-D1nGx6Mh.js +8 -0
  51. package/dist/assets/fsharp-CzKuDChf.js +6 -0
  52. package/dist/assets/{ganttDiagram-NTVNEXSI-DCFf5efZ.js → ganttDiagram-NTVNEXSI-bkDBSQ3B.js} +3 -3
  53. package/dist/assets/{gitGraph-YCYPL57B-Cv8vXWsN.js → gitGraph-YCYPL57B-DyIX84yy.js} +1 -1
  54. package/dist/assets/{gitGraphDiagram-NRZ2UAAF-DJUV3_64.js → gitGraphDiagram-NRZ2UAAF-BfosgLKn.js} +1 -1
  55. package/dist/assets/go-Cphgjts3.js +6 -0
  56. package/dist/assets/graphql-Cg7bfA9N.js +6 -0
  57. package/dist/assets/handlebars-0kTPPGmp.js +6 -0
  58. package/dist/assets/hcl-0cvrggvQ.js +6 -0
  59. package/dist/assets/html-D0PIEb3W.js +6 -0
  60. package/dist/assets/html.worker-BWKvDFG4.js +461 -0
  61. package/dist/assets/htmlMode-BGzMAz_9.js +9 -0
  62. package/dist/assets/{infoDiagram-A4XQUW5V-BlzLOJuh.js → infoDiagram-A4XQUW5V-DiWURfLu.js} +1 -1
  63. package/dist/assets/ini-Drc7WvVn.js +6 -0
  64. package/dist/assets/java-B_fMsGYe.js +6 -0
  65. package/dist/assets/javascript-BZak_nqg.js +6 -0
  66. package/dist/assets/{journeyDiagram-G5WM74LC-BoBDY7uv.js → journeyDiagram-G5WM74LC-DxFAdAr8.js} +1 -1
  67. package/dist/assets/json.worker-BDor654j.js +49 -0
  68. package/dist/assets/jsonMode-D-Si39ZR.js +15 -0
  69. package/dist/assets/julia-Bqgm2twL.js +6 -0
  70. package/dist/assets/{kanban-definition-QRCXZQQD-BKgHIztA.js → kanban-definition-QRCXZQQD-BQUix3Lv.js} +1 -1
  71. package/dist/assets/kotlin-BSkB5QuD.js +6 -0
  72. package/dist/assets/less-BsTHnhdd.js +7 -0
  73. package/dist/assets/lexon-YWi4-JPR.js +6 -0
  74. package/dist/assets/{linear-CoIZ0x19.js → linear-sgqlq9pg.js} +1 -1
  75. package/dist/assets/liquid-B79aSz_6.js +6 -0
  76. package/dist/assets/lua-nf6ki56Z.js +6 -0
  77. package/dist/assets/m3-Cpb6xl2v.js +6 -0
  78. package/dist/assets/main-CaU2JtPQ.css +10 -0
  79. package/dist/assets/main-tj2z4Rpj.js +1998 -0
  80. package/dist/assets/markdown-DSZPf7rp.js +6 -0
  81. package/dist/assets/mdx-BgJrcFc0.js +6 -0
  82. package/dist/assets/{mindmap-definition-GWI6TPTV-B4T62xYW.js → mindmap-definition-GWI6TPTV-BjVJim1N.js} +1 -1
  83. package/dist/assets/mips-B_c3zf-v.js +6 -0
  84. package/dist/assets/msdax-rUNN04Wq.js +6 -0
  85. package/dist/assets/mysql-DDwshQtU.js +6 -0
  86. package/dist/assets/objective-c-B5zXfXm9.js +6 -0
  87. package/dist/assets/pascal-CXOwvkN_.js +6 -0
  88. package/dist/assets/pascaligo-Bc-ZgV77.js +6 -0
  89. package/dist/assets/perl-CwNk8-XU.js +6 -0
  90. package/dist/assets/pgsql-tGk8EFnU.js +6 -0
  91. package/dist/assets/php-CpIb_Oan.js +6 -0
  92. package/dist/assets/{pieDiagram-YF2LJOPJ-C570Jl7r.js → pieDiagram-YF2LJOPJ-CZ1xluKC.js} +1 -1
  93. package/dist/assets/pla-B03wrqEc.js +6 -0
  94. package/dist/assets/postiats-BKlk5iyT.js +6 -0
  95. package/dist/assets/powerquery-Bhzvs7bI.js +6 -0
  96. package/dist/assets/powershell-Dd3NCNK9.js +6 -0
  97. package/dist/assets/protobuf-COyEY5Pt.js +7 -0
  98. package/dist/assets/pug-BaJupSGV.js +6 -0
  99. package/dist/assets/python-BT--9Jww.js +6 -0
  100. package/dist/assets/qsharp-DXyYeYxl.js +6 -0
  101. package/dist/assets/{quadrantDiagram-OS5C2QUG-D9kamKQz.js → quadrantDiagram-OS5C2QUG-B337LyVG.js} +1 -1
  102. package/dist/assets/r-CdQndTaG.js +6 -0
  103. package/dist/assets/razor-Dn3ozELc.js +6 -0
  104. package/dist/assets/redis-CVwtpugi.js +6 -0
  105. package/dist/assets/redshift-25W9uPmb.js +6 -0
  106. package/dist/assets/{requirementDiagram-MIRIMTAZ-CbI9--NI.js → requirementDiagram-MIRIMTAZ-gJmkHX_d.js} +1 -1
  107. package/dist/assets/restructuredtext-DfzH4Xui.js +6 -0
  108. package/dist/assets/ruby-Cp1zYvxS.js +6 -0
  109. package/dist/assets/rust-D5C2fndG.js +6 -0
  110. package/dist/assets/{sankeyDiagram-Y46BX6SQ-5AYnNxm5.js → sankeyDiagram-Y46BX6SQ-DytYwwfu.js} +1 -1
  111. package/dist/assets/sb-CDntyWJ8.js +6 -0
  112. package/dist/assets/scala-BoFRg7Ot.js +6 -0
  113. package/dist/assets/scheme-Bio4gycK.js +6 -0
  114. package/dist/assets/scss-4Ik7cdeQ.js +8 -0
  115. package/dist/assets/{sequenceDiagram-G6AWOVSC-awwP3H4O.js → sequenceDiagram-G6AWOVSC-DKUhGxo6.js} +1 -1
  116. package/dist/assets/shell-CX-rkNHf.js +6 -0
  117. package/dist/assets/solidity-Tw7wswEv.js +6 -0
  118. package/dist/assets/sophia-C5WLch3f.js +6 -0
  119. package/dist/assets/sparql-DHaeiCBh.js +6 -0
  120. package/dist/assets/sql-CCSDG5nI.js +6 -0
  121. package/dist/assets/st-pnP8ivHi.js +6 -0
  122. package/dist/assets/{stateDiagram-MAYHULR4-DsTGBCid.js → stateDiagram-MAYHULR4-Kgbc7I_f.js} +1 -1
  123. package/dist/assets/stateDiagram-v2-4JROLMXI-DRU0WKIM.js +1 -0
  124. package/dist/assets/swift-DwJ7jVG9.js +8 -0
  125. package/dist/assets/systemverilog-B9Xyijhd.js +6 -0
  126. package/dist/assets/tcl-DnHyzjbg.js +6 -0
  127. package/dist/assets/{timeline-definition-U7ZMHBDA-Dur75zzR.js → timeline-definition-U7ZMHBDA-CqDod8uq.js} +1 -1
  128. package/dist/assets/{transformers.web-CBYsiihV.js → transformers.web-CMMWdGqs.js} +1 -1
  129. package/dist/assets/ts.worker-DM5dOG-y.js +51334 -0
  130. package/dist/assets/tsMode-DV9KFCRc.js +16 -0
  131. package/dist/assets/twig-CPajHgWi.js +6 -0
  132. package/dist/assets/typescript-cEc1hNEI.js +6 -0
  133. package/dist/assets/typespec-D-MeaMDU.js +6 -0
  134. package/dist/assets/vb-DgyLZaXg.js +6 -0
  135. package/dist/assets/wgsl-BIv9DU6q.js +303 -0
  136. package/dist/assets/xml-BzYNz0pA.js +6 -0
  137. package/dist/assets/{xychartDiagram-6QU3TZC5-zevo9T1B.js → xychartDiagram-6QU3TZC5-AeN3uUFI.js} +1 -1
  138. package/dist/assets/yaml-DFu16Cre.js +6 -0
  139. package/dist/index.html +145 -4
  140. package/dist/ui-build.json +4 -0
  141. package/dist-apps/bundle-index.json +1 -0
  142. package/dist-server/app.module.js +37 -2
  143. package/dist-server/bootstrap/browser-open.js +4 -0
  144. package/dist-server/bootstrap/codex-writable-roots.js +23 -0
  145. package/dist-server/bootstrap/crewx-server.js +34 -10
  146. package/dist-server/bootstrap/env.js +45 -0
  147. package/dist-server/bootstrap/tls.js +797 -50
  148. package/dist-server/common/cache/provider-limit-cache.js +474 -0
  149. package/dist-server/common/cache-db.js +239 -0
  150. package/dist-server/common/crewx-workspace-root.js +42 -0
  151. package/dist-server/common/current-user.js +14 -0
  152. package/dist-server/common/decorator/cached.decorator.js +35 -0
  153. package/dist-server/common/guard/request-log-metadata.guard.js +58 -0
  154. package/dist-server/common/interceptor/http-logging.interceptor.js +293 -37
  155. package/dist-server/common/mcp-app-sandbox-boundary.js +188 -0
  156. package/dist-server/common/mcp-app-sandbox-contract.js +802 -0
  157. package/dist-server/common/middleware/request-log-lifecycle.middleware.js +65 -0
  158. package/dist-server/common/pending-instruction.js +27 -0
  159. package/dist-server/common/product-app-bundle.generated.js +7 -0
  160. package/dist-server/common/product-app-bundle.js +54 -0
  161. package/dist-server/common/request-log/request-log-context.js +138 -0
  162. package/dist-server/common/request-log/request-log-principal.js +75 -0
  163. package/dist-server/common/security/instruction-sanitizer.js +191 -0
  164. package/dist-server/common/security/secret-mask.js +48 -0
  165. package/dist-server/common/task-display-provider.js +61 -0
  166. package/dist-server/common/task-error-projection.js +416 -0
  167. package/dist-server/common/task-log/progress-steps.js +70 -0
  168. package/dist-server/common/task-log/provider-resume.js +406 -0
  169. package/dist-server/common/task-log/public-log-projection.fixtures.js +153 -0
  170. package/dist-server/common/task-log/public-log-projection.js +196 -0
  171. package/dist-server/common/task-log/public-log-projection.past-tool-use.fixtures.js +242 -0
  172. package/dist-server/common/task-log/stdout-json-fallback.js +6 -196
  173. package/dist-server/common/task-result-projection.js +25 -0
  174. package/dist-server/common/task-stop.js +44 -0
  175. package/dist-server/common/task-terminal-reason.js +14 -0
  176. package/dist-server/common/task-usage-accounting.js +34 -0
  177. package/dist-server/common/ui/derive-ui-actor.js +39 -0
  178. package/dist-server/common/ui/resolve-task-actor.js +37 -0
  179. package/dist-server/common/ui/ui-runtime-http-error.js +48 -0
  180. package/dist-server/common/validation.pipe.js +79 -0
  181. package/dist-server/domain/account/account-auth-url.js +17 -0
  182. package/dist-server/domain/account/account-error.constants.js +23 -0
  183. package/dist-server/domain/account/account-error.exception-filter.js +32 -0
  184. package/dist-server/domain/account/account-profile.service.js +106 -0
  185. package/dist-server/domain/account/account-session.guard.js +34 -0
  186. package/dist-server/domain/account/account.controller.js +244 -0
  187. package/dist-server/domain/account/account.module.js +95 -0
  188. package/dist-server/domain/account/auth-json.store.js +45 -0
  189. package/dist-server/domain/account/auth-json.types.js +2 -0
  190. package/dist-server/domain/account/device-flow.service.js +274 -0
  191. package/dist-server/domain/account/token-refresh.service.js +183 -0
  192. package/dist-server/domain/agent/agent.controller.js +14 -0
  193. package/dist-server/domain/agent/agent.service.js +625 -32
  194. package/dist-server/domain/agent/builtin-agent-loader.js +47 -0
  195. package/dist-server/domain/agent/dto/create-agent.dto.js +15 -1
  196. package/dist-server/domain/agent/dto/remote-provider.dto.js +82 -0
  197. package/dist-server/domain/agent/dto/update-agent.dto.js +3 -1
  198. package/dist-server/domain/agent-suggestion/agent-suggestion.controller.js +104 -0
  199. package/dist-server/domain/agent-suggestion/agent-suggestion.module.js +27 -0
  200. package/dist-server/domain/agent-suggestion/agent-suggestion.service.js +582 -0
  201. package/dist-server/domain/agent-suggestion/analysis/h1-evidence.js +257 -0
  202. package/dist-server/domain/agent-suggestion/analysis/h1-prompt.js +246 -0
  203. package/dist-server/domain/agent-suggestion/analysis/h3-rules.js +85 -0
  204. package/dist-server/domain/agent-suggestion/analysis/index.js +22 -0
  205. package/dist-server/domain/agent-suggestion/analysis/merge3.js +192 -0
  206. package/dist-server/domain/agent-suggestion/analysis/secret-redaction.js +49 -0
  207. package/dist-server/domain/agent-suggestion/analysis/types.js +7 -0
  208. package/dist-server/domain/agent-suggestion/dto/apply-batch.dto.js +26 -0
  209. package/dist-server/domain/agent-suggestion/dto/suggestion-response.dto.js +2 -0
  210. package/dist-server/domain/app/app-list.types.js +9 -0
  211. package/dist-server/domain/app/app.controller.js +53 -0
  212. package/dist-server/domain/app/app.module.js +26 -0
  213. package/dist-server/domain/app/app.service.js +475 -0
  214. package/dist-server/domain/app/dto/app-list.dto.js +2 -0
  215. package/dist-server/domain/app-dev/app-dev.controller.js +342 -0
  216. package/dist-server/domain/app-dev/app-dev.module.js +27 -0
  217. package/dist-server/domain/app-dev/app-dev.service.js +1251 -0
  218. package/dist-server/domain/auth/auth-cookie-policy.js +61 -0
  219. package/dist-server/domain/auth/auth.controller.js +125 -15
  220. package/dist-server/domain/auth/auth.module.js +8 -7
  221. package/dist-server/domain/auth/guards/base-auth.guard.js +179 -28
  222. package/dist-server/domain/auth/guards/csrf.guard.js +58 -0
  223. package/dist-server/domain/auth/guards/local-only.guard.js +48 -0
  224. package/dist-server/domain/auth/guards/shortcut-csrf.guard.js +12 -0
  225. package/dist-server/domain/auth/local-pairing.service.js +148 -0
  226. package/dist-server/domain/auth/local-secret.js +251 -0
  227. package/dist-server/domain/auth/local-transport-policy.js +305 -0
  228. package/dist-server/domain/auth/session-store.js +170 -15
  229. package/dist-server/domain/auth/sessions-db.js +104 -0
  230. package/dist-server/domain/auth/utils/ip.utils.js +10 -5
  231. package/dist-server/domain/board/board.controller.js +115 -0
  232. package/dist-server/domain/board/board.module.js +26 -0
  233. package/dist-server/domain/board/board.service.js +747 -0
  234. package/dist-server/domain/board/board.types.js +2 -0
  235. package/dist-server/domain/board/dto/create-board-batch.dto.js +25 -0
  236. package/dist-server/domain/board/dto/create-board.dto.js +54 -0
  237. package/dist-server/domain/board/dto/plan-board.dto.js +24 -0
  238. package/dist-server/domain/board/dto/update-board.dto.js +31 -0
  239. package/dist-server/domain/cli/cli-local-only.guard.js +46 -0
  240. package/dist-server/domain/cli/cli.controller.js +62 -4
  241. package/dist-server/domain/cli/cli.module.js +5 -1
  242. package/dist-server/domain/cli/cli.service.js +1154 -165
  243. package/dist-server/domain/cli/dto/cli-auth-status-query.dto.js +25 -0
  244. package/dist-server/domain/cli/dto/login-cli.dto.js +2 -2
  245. package/dist-server/domain/cron/cron-bootstrap.service.js +1048 -0
  246. package/dist-server/domain/cron/cron-runtime-host.module.js +41 -0
  247. package/dist-server/domain/cron/cron-runtime-sync.port.js +13 -0
  248. package/dist-server/domain/cron/cron-runtime-sync.service.js +259 -0
  249. package/dist-server/domain/cron/cron.controller.js +38 -3
  250. package/dist-server/domain/cron/cron.module.js +2 -0
  251. package/dist-server/domain/cron/cron.service.js +295 -39
  252. package/dist-server/domain/cron/dto/cron.dto.js +48 -2
  253. package/dist-server/domain/doc/doc.controller.js +149 -14
  254. package/dist-server/domain/doc/doc.module.js +4 -1
  255. package/dist-server/domain/doc/doc.service.js +97 -41
  256. package/dist-server/domain/doc/dto/doc.dto.js +11 -1
  257. package/dist-server/domain/doc/image-constants.js +3 -1
  258. package/dist-server/domain/env/dto/put-env.dto.js +23 -0
  259. package/dist-server/domain/env/env.controller.js +71 -0
  260. package/dist-server/domain/env/env.module.js +22 -0
  261. package/dist-server/domain/env/env.service.js +234 -0
  262. package/dist-server/domain/events/server-conversation.plugin.js +11 -5
  263. package/dist-server/domain/events/workspace-event.bus.js +8 -2
  264. package/dist-server/domain/events/workspace-event.types.js +21 -2
  265. package/dist-server/domain/events/workspace-events-test.controller.js +18 -4
  266. package/dist-server/domain/events/workspace-events.controller.js +17 -6
  267. package/dist-server/domain/fs/fs.service.js +2 -1
  268. package/dist-server/domain/git/git.service.js +88 -1
  269. package/dist-server/domain/health/health.controller.js +19 -2
  270. package/dist-server/domain/health/health.module.js +3 -0
  271. package/dist-server/domain/health/ui-asset-revision.service.js +40 -0
  272. package/dist-server/domain/knowledge/knowledge.service.js +6 -3
  273. package/dist-server/domain/market/__fixtures__/build-fixture.js +118 -0
  274. package/dist-server/domain/market/__fixtures__/marketplace-anonymous-install.contract.js +36 -0
  275. package/dist-server/domain/market/dto/install-apply.dto.js +23 -0
  276. package/dist-server/domain/market/dto/install-cancel.dto.js +25 -0
  277. package/dist-server/domain/market/dto/install-plan.dto.js +31 -0
  278. package/dist-server/domain/market/dto/invite-accept.dto.js +25 -0
  279. package/dist-server/domain/market/dto/publish-plan.dto.js +43 -0
  280. package/dist-server/domain/market/dto/publish-run.dto.js +18 -0
  281. package/dist-server/domain/market/dto/publisher-funnel.dto.js +72 -0
  282. package/dist-server/domain/market/dto/publisher-invite.dto.js +50 -0
  283. package/dist-server/domain/market/dto/shr-response.dto.js +20 -0
  284. package/dist-server/domain/market/first-run-event.listener.js +94 -0
  285. package/dist-server/domain/market/install-error.exception-filter.js +94 -0
  286. package/dist-server/domain/market/install-id.validation.js +4 -0
  287. package/dist-server/domain/market/install-plan-expired.exception-filter.js +28 -0
  288. package/dist-server/domain/market/install.service.js +889 -0
  289. package/dist-server/domain/market/market.controller.js +290 -2
  290. package/dist-server/domain/market/market.module.js +166 -4
  291. package/dist-server/domain/market/market.service.js +399 -38
  292. package/dist-server/domain/market/marketplace-api.client.js +616 -0
  293. package/dist-server/domain/market/marketplace-target.js +35 -0
  294. package/dist-server/domain/market/publish.controller.js +64 -0
  295. package/dist-server/domain/market/publish.service.js +343 -0
  296. package/dist-server/domain/market/publisher-invite-labels-ledger.service.js +174 -0
  297. package/dist-server/domain/market/publisher-invite.service.js +323 -0
  298. package/dist-server/domain/market/sharing-event.client.js +263 -0
  299. package/dist-server/domain/market/sharing-installs-ledger.service.js +303 -0
  300. package/dist-server/domain/market/sharing-updates.service.js +67 -0
  301. package/dist-server/domain/market/source-coordinate.js +72 -0
  302. package/dist-server/domain/market/template-installer.js +1433 -0
  303. package/dist-server/domain/mcp/app-debug-log.js +254 -0
  304. package/dist-server/domain/mcp/crewx-tool.factory.js +187 -37
  305. package/dist-server/domain/mcp/default-apps/shared.js +37 -0
  306. package/dist-server/domain/mcp/dto/open-mcp-app.dto.js +46 -0
  307. package/dist-server/domain/mcp/html-viewer.controller.js +98 -0
  308. package/dist-server/domain/mcp/html-viewer.service.js +415 -0
  309. package/dist-server/domain/mcp/mcp-app-actions.js +1005 -0
  310. package/dist-server/domain/mcp/mcp-app-assets.js +31 -0
  311. package/dist-server/domain/mcp/mcp-app-resource-csp.interceptor.js +85 -0
  312. package/dist-server/domain/mcp/mcp-app-runtime.controller.js +59 -0
  313. package/dist-server/domain/mcp/mcp-app-runtime.service.js +150 -0
  314. package/dist-server/domain/mcp/mcp-app-sandbox.service.js +937 -0
  315. package/dist-server/domain/mcp/mcp-app-workspace-asset-catalog-resolver.js +94 -0
  316. package/dist-server/domain/mcp/mcp-apps.js +2956 -0
  317. package/dist-server/domain/mcp/mcp-auth.guard.js +0 -10
  318. package/dist-server/domain/mcp/mcp.constants.js +16 -1
  319. package/dist-server/domain/mcp/mcp.controller.js +2 -0
  320. package/dist-server/domain/mcp/mcp.module.js +20 -3
  321. package/dist-server/domain/mcp/mcp.service.js +1171 -30
  322. package/dist-server/domain/mcp/product-app-bundle-assets.js +65 -0
  323. package/dist-server/domain/mcp/skill-backend.port.js +1123 -0
  324. package/dist-server/domain/mcp/ui-content-channel.service.js +220 -0
  325. package/dist-server/domain/message/dto/send-message.dto.js +79 -4
  326. package/dist-server/domain/message/message.controller.js +91 -18
  327. package/dist-server/domain/message/message.module.js +2 -1
  328. package/dist-server/domain/message/message.multipart.js +295 -0
  329. package/dist-server/domain/message/message.service.js +576 -97
  330. package/dist-server/domain/notification/dto/create-notification.dto.js +79 -0
  331. package/dist-server/domain/notification/dto/list-notifications.dto.js +27 -0
  332. package/dist-server/domain/notification/notification.controller.js +135 -0
  333. package/dist-server/domain/notification/notification.module.js +34 -0
  334. package/dist-server/domain/notification/notification.service.js +65 -0
  335. package/dist-server/domain/project/dto/create-project-ledger.dto.js +89 -0
  336. package/dist-server/domain/project/project-ledger.controller.js +72 -0
  337. package/dist-server/domain/project/project-ledger.service.js +124 -0
  338. package/dist-server/domain/project/project.module.js +5 -3
  339. package/dist-server/domain/settings/local-ai-server/local-ai-server.controller.js +96 -0
  340. package/dist-server/domain/settings/local-ai-server/local-ai-server.dto.js +37 -0
  341. package/dist-server/domain/settings/local-ai-server/local-ai-server.network-policy.js +416 -0
  342. package/dist-server/domain/settings/local-ai-server/local-ai-server.service.js +298 -0
  343. package/dist-server/domain/settings/local-ai-server/local-ai-server.types.js +10 -0
  344. package/dist-server/domain/settings/request-log-maintenance.js +131 -0
  345. package/dist-server/domain/settings/request-log-maintenance.service.js +208 -0
  346. package/dist-server/domain/settings/request-log-maintenance.worker.js +58 -0
  347. package/dist-server/domain/settings/request-log-prune.js +225 -0
  348. package/dist-server/domain/settings/request-log-rollup.js +396 -0
  349. package/dist-server/domain/settings/request-log-store.js +126 -0
  350. package/dist-server/domain/settings/request-logs.controller.js +81 -0
  351. package/dist-server/domain/settings/request-logs.service.js +308 -0
  352. package/dist-server/domain/settings/request-logs.types.js +5 -0
  353. package/dist-server/domain/settings/settings.controller.js +11 -0
  354. package/dist-server/domain/settings/settings.module.js +38 -3
  355. package/dist-server/domain/settings/settings.service.js +428 -4
  356. package/dist-server/domain/settings/storage-retention.js +998 -0
  357. package/dist-server/domain/settings/storage-retention.worker.js +336 -0
  358. package/dist-server/domain/settings/storage.controller.js +95 -0
  359. package/dist-server/domain/settings/storage.service.js +276 -0
  360. package/dist-server/domain/settings/storage.types.js +2 -0
  361. package/dist-server/domain/system/desktop-control.guard.js +67 -0
  362. package/dist-server/domain/system/shortcut.service.js +353 -0
  363. package/dist-server/domain/system/shortcut.types.js +8 -0
  364. package/dist-server/domain/system/shutdown.dto.js +22 -0
  365. package/dist-server/domain/system/system.controller.js +240 -13
  366. package/dist-server/domain/system/system.module.js +19 -0
  367. package/dist-server/domain/system/system.service.js +50 -0
  368. package/dist-server/domain/system/task-ownership.js +32 -0
  369. package/dist-server/domain/system/update-gate.service.js +234 -0
  370. package/dist-server/domain/task/child-task-projection.js +111 -0
  371. package/dist-server/domain/task/dto/descendants.dto.js +46 -0
  372. package/dist-server/domain/task/dto/task-prompt.dto.js +40 -0
  373. package/dist-server/domain/task/prompt-composition.js +443 -0
  374. package/dist-server/domain/task/task-execution-path.js +47 -0
  375. package/dist-server/domain/task/task.constants.js +1 -8
  376. package/dist-server/domain/task/task.controller.js +132 -9
  377. package/dist-server/domain/task/task.module.js +4 -2
  378. package/dist-server/domain/task/task.service.js +1108 -364
  379. package/dist-server/domain/terminal/terminal-audit.service.js +99 -0
  380. package/dist-server/domain/terminal/terminal-csp.js +37 -0
  381. package/dist-server/domain/terminal/terminal-local-only.guard.js +56 -0
  382. package/dist-server/domain/terminal/terminal-session.service.js +372 -0
  383. package/dist-server/domain/terminal/terminal-ticket.service.js +108 -0
  384. package/dist-server/domain/terminal/terminal-ws.service.js +242 -0
  385. package/dist-server/domain/terminal/terminal.controller.js +96 -0
  386. package/dist-server/domain/terminal/terminal.module.js +36 -0
  387. package/dist-server/domain/thread/dto/highlight.dto.js +114 -0
  388. package/dist-server/domain/thread/dto/list-threads.dto.js +48 -1
  389. package/dist-server/domain/thread/dto/thread-label.dto.js +104 -0
  390. package/dist-server/domain/thread/dto/timeline-query.dto.js +51 -0
  391. package/dist-server/domain/thread/dto/update-thread.dto.js +44 -0
  392. package/dist-server/domain/thread/thread-highlight-flight.service.js +53 -0
  393. package/dist-server/domain/thread/thread-highlight-regeneration.service.js +277 -0
  394. package/dist-server/domain/thread/thread-highlight-trigger.service.js +722 -0
  395. package/dist-server/domain/thread/thread-highlight.constants.js +5 -0
  396. package/dist-server/domain/thread/thread-label.controller.js +104 -0
  397. package/dist-server/domain/thread/thread-label.service.js +249 -0
  398. package/dist-server/domain/thread/thread-preview.controller.js +44 -0
  399. package/dist-server/domain/thread/thread-title.backfill.js +42 -0
  400. package/dist-server/domain/thread/thread-title.types.js +27 -0
  401. package/dist-server/domain/thread/thread.controller.js +110 -9
  402. package/dist-server/domain/thread/thread.module.js +19 -4
  403. package/dist-server/domain/thread/thread.service.js +944 -260
  404. package/dist-server/domain/token/token.module.js +5 -1
  405. package/dist-server/domain/token/token.service.js +213 -11
  406. package/dist-server/domain/usage/codex-rate-limits.client.js +513 -0
  407. package/dist-server/domain/usage/usage.controller.js +16 -12
  408. package/dist-server/domain/usage/usage.service.js +1057 -282
  409. package/dist-server/domain/usage-report/report-findings.js +109 -0
  410. package/dist-server/domain/usage-report/usage-report.service.js +5 -0
  411. package/dist-server/domain/wi/dto/create-wi.dto.js +67 -0
  412. package/dist-server/domain/wi/dto/update-wi-status.dto.js +24 -0
  413. package/dist-server/domain/wi/wi.controller.js +43 -1
  414. package/dist-server/domain/wi/wi.service.js +410 -70
  415. package/dist-server/domain/workflow/chat-card-proof.service.js +17 -3
  416. package/dist-server/domain/workflow/dto/thread-app-launch.dto.js +49 -0
  417. package/dist-server/domain/workflow/thread-app-launch.controller.js +330 -0
  418. package/dist-server/domain/workflow/ui-instance.controller.js +1536 -0
  419. package/dist-server/domain/workflow/workflow-approval-v2.js +748 -0
  420. package/dist-server/domain/workflow/workflow.controller.js +21 -5
  421. package/dist-server/domain/workflow/workflow.module.js +60 -2
  422. package/dist-server/domain/workflow/workflow.service.js +640 -201
  423. package/dist-server/domain/workspace/dto/create-workspace.dto.js +26 -9
  424. package/dist-server/domain/workspace/dto/rename-workspace.dto.js +27 -0
  425. package/dist-server/domain/workspace/workspace.controller.js +31 -3
  426. package/dist-server/domain/workspace/workspace.module.js +2 -0
  427. package/dist-server/domain/workspace/workspace.service.js +167 -6
  428. package/dist-server/main.js +128 -22
  429. package/dist-server/modules/crewx-pool.service.js +444 -60
  430. package/dist-server/modules/crewx.module.js +8 -2
  431. package/dist-server/modules/workspace-config.store.js +111 -0
  432. package/dist-server/repository/agent-suggestion.repository.js +39 -0
  433. package/dist-server/repository/notification.repository.js +33 -0
  434. package/dist-server/repository/project.repository.js +10 -0
  435. package/dist-server/repository/repository.module.js +6 -0
  436. package/dist-server/repository/request-log.repository.js +16 -0
  437. package/dist-server/repository/task.repository.js +641 -70
  438. package/dist-server/repository/thread-label.repository.js +86 -0
  439. package/dist-server/repository/thread.repository.js +763 -1
  440. package/dist-server/shared/attachment-path.js +50 -0
  441. package/dist-server/shared/attachment-policy.js +191 -0
  442. package/dist-server/shared/crewx-home.js +6 -56
  443. package/dist-server/shared/doc-heading.js +69 -0
  444. package/dist-server/shared/marketplace-api.constants.js +12 -0
  445. package/dist-server/shared/thread-label.js +8 -0
  446. package/dist-server/shared/workflow-run.contract.js +8 -0
  447. package/dist-server/test-utils/request-log-fixtures.js +163 -0
  448. package/examples/mcp-apps/dist/sandbox/sandbox.html +14 -0
  449. package/examples/mcp-apps/dist/workflow/workflow-card.html +161 -0
  450. package/package.json +192 -29
  451. package/packages/cli/dist/bootstrap/codex-writable-roots.d.ts +13 -0
  452. package/packages/cli/dist/bootstrap/codex-writable-roots.js +25 -0
  453. package/packages/cli/dist/bootstrap/crewx-cli.js +27 -6
  454. package/packages/cli/dist/builtin.d.ts +1 -1
  455. package/packages/cli/dist/builtin.js +7 -2
  456. package/packages/cli/dist/commands/agent.js +1 -107
  457. package/packages/cli/dist/commands/cal.d.ts +15 -0
  458. package/packages/cli/dist/commands/cal.js +44 -0
  459. package/packages/cli/dist/commands/db.d.ts +3 -0
  460. package/packages/cli/dist/commands/db.js +533 -1
  461. package/packages/cli/dist/commands/detached.d.ts +95 -0
  462. package/packages/cli/dist/commands/detached.js +620 -0
  463. package/packages/cli/dist/commands/doctor.d.ts +77 -0
  464. package/packages/cli/dist/commands/doctor.js +475 -22
  465. package/packages/cli/dist/commands/emit-trailer.d.ts +25 -0
  466. package/packages/cli/dist/commands/emit-trailer.js +33 -0
  467. package/packages/cli/dist/commands/execute.d.ts +8 -4
  468. package/packages/cli/dist/commands/execute.js +200 -51
  469. package/packages/cli/dist/commands/hook/command-marker.d.ts +2 -0
  470. package/packages/cli/dist/commands/hook/command-marker.js +5 -0
  471. package/packages/cli/dist/commands/hook/install.d.ts +0 -1
  472. package/packages/cli/dist/commands/hook/install.js +75 -61
  473. package/packages/cli/dist/commands/hook/status.js +3 -3
  474. package/packages/cli/dist/commands/hook/uninstall.js +2 -2
  475. package/packages/cli/dist/commands/init.d.ts +34 -0
  476. package/packages/cli/dist/commands/init.js +132 -59
  477. package/packages/cli/dist/commands/kill.d.ts +2 -8
  478. package/packages/cli/dist/commands/kill.js +6 -47
  479. package/packages/cli/dist/commands/log.js +4 -3
  480. package/packages/cli/dist/commands/parse-common-flags.d.ts +5 -1
  481. package/packages/cli/dist/commands/parse-common-flags.js +35 -4
  482. package/packages/cli/dist/commands/ps.d.ts +2 -2
  483. package/packages/cli/dist/commands/ps.js +25 -15
  484. package/packages/cli/dist/commands/publish.d.ts +1 -0
  485. package/packages/cli/dist/commands/publish.js +303 -0
  486. package/packages/cli/dist/commands/query.d.ts +7 -2
  487. package/packages/cli/dist/commands/query.js +195 -48
  488. package/packages/cli/dist/commands/registry.js +4 -2
  489. package/packages/cli/dist/commands/resolve-prompt.js +23 -1
  490. package/packages/cli/dist/commands/resolve-recipient.d.ts +14 -0
  491. package/packages/cli/dist/commands/resolve-recipient.js +47 -0
  492. package/packages/cli/dist/commands/restart.d.ts +3 -1
  493. package/packages/cli/dist/commands/restart.js +14 -4
  494. package/packages/cli/dist/commands/result.d.ts +8 -3
  495. package/packages/cli/dist/commands/result.js +149 -10
  496. package/packages/cli/dist/commands/shortcut.d.ts +1 -0
  497. package/packages/cli/dist/commands/shortcut.js +267 -0
  498. package/packages/cli/dist/commands/slack.js +2 -1
  499. package/packages/cli/dist/commands/stop.d.ts +8 -0
  500. package/packages/cli/dist/commands/stop.js +119 -0
  501. package/packages/cli/dist/index.d.ts +1 -1
  502. package/packages/cli/dist/index.js +4 -1
  503. package/packages/cli/dist/logging.d.ts +1 -1
  504. package/packages/cli/dist/logging.js +3 -2
  505. package/packages/cli/dist/main.d.ts +3 -2
  506. package/packages/cli/dist/main.js +99 -24
  507. package/packages/cli/dist/utils/env-defaults.d.ts +2 -5
  508. package/packages/cli/dist/utils/env-defaults.js +10 -5
  509. package/packages/cli/dist/utils/inherited-trace.d.ts +24 -0
  510. package/packages/cli/dist/utils/inherited-trace.js +40 -0
  511. package/packages/cli/dist/utils/product-package-root.d.ts +6 -0
  512. package/packages/cli/dist/utils/product-package-root.js +39 -0
  513. package/packages/cli/dist/utils/sdk-compat.d.ts +24 -0
  514. package/packages/cli/dist/utils/sdk-compat.js +120 -0
  515. package/packages/cli/package.json +5 -1
  516. package/server.js +6 -2
  517. package/dist/assets/MarketPage-BgAWacd7.js +0 -41
  518. package/dist/assets/PromptTab-LML0dhnv.js +0 -27
  519. package/dist/assets/channel-cs9O3fiH.js +0 -1
  520. package/dist/assets/classDiagram-LNE6IOMH-veS4tD2p.js +0 -1
  521. package/dist/assets/classDiagram-v2-MQ7JQ4JX-veS4tD2p.js +0 -1
  522. package/dist/assets/main-BOcmSxv5.css +0 -10
  523. package/dist/assets/main-CZQslZK1.js +0 -1526
  524. package/dist/assets/stateDiagram-v2-4JROLMXI-B8Exp_99.js +0 -1
  525. package/dist-electron/main.js +0 -194
  526. package/dist-electron/overlay.js +0 -129
  527. package/dist-electron/package.json +0 -1
  528. package/dist-electron/preload.js +0 -12
@@ -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. 'electron' verb → electron
36
- * 5. No arguments → web-default (browser auto-open)
37
- * 6. Unknown first argument → error with hint
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. New verb: electron
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
- // 5. No arguments → web default
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 { setupSignalForwarding, resolveRoute, ensureCrewxDirs } from './crewx-lib.js';
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');
package/crewx-host.js ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ // Entry point that server.js spawns for `crewx serve`.
3
+ // It keeps `dist-server/main.js` out of this process's command line, so a
4
+ // pattern stop aimed at development servers (`pkill -f "dist-server/main.js"`)
5
+ // does not also stop an installed server such as the RC.
6
+ require('./dist-server/main.js');