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