@qwen-code/qwen-code 0.23.2-preview.0 → 0.23.3-nightly.20260910.c46cb85cf2

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 (409) hide show
  1. package/README.md +35 -15
  2. package/bundled/computer-use/SKILL.md +1 -1
  3. package/bundled/goal-draft/SKILL.md +2 -2
  4. package/bundled/qc-helper/docs/configuration/auth.md +1 -1
  5. package/bundled/qc-helper/docs/configuration/model-providers.md +76 -34
  6. package/bundled/qc-helper/docs/configuration/settings.md +5 -3
  7. package/bundled/qc-helper/docs/features/_meta.ts +1 -0
  8. package/bundled/qc-helper/docs/features/channels/dingtalk.md +1 -21
  9. package/bundled/qc-helper/docs/features/channels/dws.md +7 -1
  10. package/bundled/qc-helper/docs/features/channels/github.md +1 -9
  11. package/bundled/qc-helper/docs/features/channels/overview.md +30 -56
  12. package/bundled/qc-helper/docs/features/channels/qqbot.md +1 -2
  13. package/bundled/qc-helper/docs/features/commands.md +105 -18
  14. package/bundled/qc-helper/docs/features/computer-use.md +1 -1
  15. package/bundled/qc-helper/docs/features/cross-session-protocol.md +320 -0
  16. package/bundled/qc-helper/docs/features/goals.md +5 -3
  17. package/bundled/qc-helper/docs/features/hooks.md +14 -13
  18. package/bundled/qc-helper/docs/features/sub-agents.md +8 -0
  19. package/bundled/qc-helper/docs/qwen-serve.md +84 -53
  20. package/bundled/review/SKILL.md +82 -79
  21. package/bundled/review/references/posting.md +31 -14
  22. package/chunks/{MaxSizedBox-ZZJT3PJF.js → MaxSizedBox-UZW24XUX.js} +63 -55
  23. package/chunks/{StandaloneSessionPicker-DIOSZTMX.js → StandaloneSessionPicker-IDK7NAZL.js} +85 -77
  24. package/chunks/{acp-startup-profiler-KEU6VAYR.js → acp-startup-profiler-ARO4II44.js} +2 -2
  25. package/chunks/acp-subagent-executor-7TLJGISS.js +919 -0
  26. package/chunks/{acpAgent-62JUP5A7.js → acpAgent-YRCNNIIU.js} +939 -306
  27. package/chunks/{agent-NLPEQQDZ.js → agent-SGU5EE7U.js} +47 -41
  28. package/chunks/{agent-headless-Y2GR5F2Q.js → agent-headless-JVYBLNLT.js} +47 -41
  29. package/chunks/{anthropicContentGenerator-I7LQZH26.js → anthropicContentGenerator-SGIR5IKF.js} +68 -36
  30. package/chunks/{artifact-tool-P52OKKEF.js → artifact-tool-PMYZCYNH.js} +2 -2
  31. package/chunks/{askUserQuestion-I5W5S3D6.js → askUserQuestion-4M4YYIB4.js} +2 -2
  32. package/chunks/{bridge-Q66BD62H.js → bridge-YF6NYRPZ.js} +68 -60
  33. package/chunks/{ca-KC2AISNS.js → ca-MX3WCEEG.js} +1 -1
  34. package/chunks/{channel-management-service-TRTLQTSV.js → channel-management-service-E4HTMU7T.js} +9 -9
  35. package/chunks/{channel-settings-store-R5STFWUW.js → channel-settings-store-FZ5VKHQD.js} +74 -66
  36. package/chunks/{channel-worker-group-PIYPVCTF.js → channel-worker-group-X6WH4XWF.js} +9 -9
  37. package/chunks/{channel-worker-manager-FQHEDTD2.js → channel-worker-manager-SICFJDPJ.js} +19 -10
  38. package/chunks/{channel-worker-supervisor-XJPZZ3VK.js → channel-worker-supervisor-HSFAKML6.js} +6 -6
  39. package/chunks/{chunk-CLKE4IY3.js → chunk-2SZH22YO.js} +1 -1
  40. package/chunks/{chunk-OIPUQE3S.js → chunk-34ZYDM3F.js} +27 -12
  41. package/chunks/{chunk-HIXUUCGY.js → chunk-36HCNKDS.js} +1 -1
  42. package/chunks/{chunk-6YEOCHSE.js → chunk-3FPYT6QC.js} +101 -31
  43. package/chunks/{chunk-NFIDVZND.js → chunk-3I7W2POO.js} +3 -22
  44. package/chunks/{chunk-W3ONSAYO.js → chunk-3VPFA6L2.js} +3 -3
  45. package/chunks/chunk-532WHF4F.js +127 -0
  46. package/chunks/{chunk-J3TJH52D.js → chunk-5FFAUU4T.js} +1 -1
  47. package/chunks/{chunk-G5QLLD53.js → chunk-5FKZ7KFQ.js} +1864 -35
  48. package/chunks/{chunk-B44JBZBB.js → chunk-5GLDOLNQ.js} +132 -27
  49. package/chunks/{chunk-ORREXWOM.js → chunk-5ZJ3KK5J.js} +5 -5
  50. package/chunks/{chunk-2OR32P5M.js → chunk-6EDWSKN4.js} +125 -10
  51. package/chunks/{chunk-EA4NFWVG.js → chunk-6EOMQPTS.js} +4 -4
  52. package/chunks/{chunk-45ROPFQY.js → chunk-6NONRGYX.js} +1 -1
  53. package/chunks/{chunk-EHTKOO6W.js → chunk-6UK77U7D.js} +46 -3
  54. package/chunks/{chunk-QXXBW2G4.js → chunk-72BGC7RT.js} +4 -4
  55. package/chunks/{chunk-CRZBDVP2.js → chunk-74JEYK2C.js} +10 -10
  56. package/chunks/{chunk-B54PFQS5.js → chunk-7CLLH5TI.js} +1 -1
  57. package/chunks/{chunk-CG2PDIGD.js → chunk-7XM6KEVW.js} +1 -1
  58. package/chunks/{chunk-CALNF3Z3.js → chunk-7XVQNDFB.js} +1 -1
  59. package/chunks/{chunk-TK4XHPKW.js → chunk-7ZKDPTYO.js} +2 -2
  60. package/chunks/{chunk-ZIPYCXQP.js → chunk-7ZVIGDZF.js} +1 -1
  61. package/chunks/chunk-AEY27Z35.js +1411 -0
  62. package/chunks/{chunk-WIRYFL2L.js → chunk-ATH66AEU.js} +64 -59
  63. package/chunks/{chunk-33MLFMCL.js → chunk-AW2SIT3B.js} +3 -3
  64. package/chunks/{chunk-4BLTSTF6.js → chunk-AWMJRE5N.js} +4 -4
  65. package/chunks/chunk-AYEJOTIU.js +43 -0
  66. package/chunks/{chunk-M73KHGNR.js → chunk-B2TGBZXY.js} +420 -227
  67. package/chunks/{chunk-XDNFODER.js → chunk-B6BDT4RX.js} +1 -1
  68. package/chunks/{chunk-WZ4YULVF.js → chunk-BHR6IN2X.js} +3251 -974
  69. package/chunks/{chunk-GXIHBIHC.js → chunk-BI3WSRQE.js} +61 -72
  70. package/chunks/{chunk-NVS4Z6GT.js → chunk-BQOP3K76.js} +1 -1
  71. package/chunks/{chunk-R2266LQ5.js → chunk-BTWGOKHU.js} +2 -2
  72. package/chunks/{process-registry-OAEG6WGC.js → chunk-BYUAT5OC.js} +1 -0
  73. package/chunks/{chunk-XVTCSVBK.js → chunk-C4NLHK7X.js} +227 -298
  74. package/chunks/{chunk-NOO4QFXM.js → chunk-C75BXMPM.js} +1 -3
  75. package/chunks/chunk-CAAMI77K.js +937 -0
  76. package/chunks/chunk-CF5KXZZX.js +150 -0
  77. package/chunks/{chunk-SOA4HKRJ.js → chunk-CGKEUUYG.js} +2 -2
  78. package/chunks/{chunk-BF3RUIVP.js → chunk-CH2YDT6X.js} +36 -38
  79. package/chunks/{chunk-5HBA2Z7V.js → chunk-CJ3DHN5I.js} +3 -3
  80. package/chunks/{chunk-3BTHHXXE.js → chunk-CSHX5ZC4.js} +1 -1
  81. package/chunks/{chunk-UYDQYDW2.js → chunk-CUK6F5UF.js} +1 -1
  82. package/chunks/{chunk-RPFJJ33Z.js → chunk-DLH7YIX6.js} +3 -3
  83. package/chunks/{chunk-L6ZME3W7.js → chunk-DMX7RF6E.js} +1 -1
  84. package/chunks/{chunk-TRWQQBVH.js → chunk-DTNV6UZY.js} +1 -1
  85. package/chunks/{chunk-FDOGGKAA.js → chunk-E4UEO3XM.js} +5 -2
  86. package/chunks/{chunk-RN6V5HKE.js → chunk-E5GQNSJY.js} +3 -3
  87. package/chunks/chunk-ELRMZTPF.js +374 -0
  88. package/chunks/chunk-ERU3SDXT.js +27 -0
  89. package/chunks/{chunk-O2FEO2CB.js → chunk-EUURTIV6.js} +18 -2
  90. package/chunks/{chunk-4HOEU2OR.js → chunk-EWJTAP3Y.js} +1 -19
  91. package/chunks/{chunk-ZELCTN6Y.js → chunk-F23YN37B.js} +10 -0
  92. package/chunks/{chunk-BL6B2QS2.js → chunk-F2RKL5I2.js} +809 -1195
  93. package/chunks/{chunk-J4ECGDA3.js → chunk-F45SKYIQ.js} +3 -3
  94. package/chunks/{chunk-5WC2ECUK.js → chunk-FCQJLMA2.js} +114 -8
  95. package/chunks/{chunk-4JKLPTV6.js → chunk-FGRDUDCI.js} +13 -6
  96. package/chunks/{chunk-ZUNWKOAP.js → chunk-FGV2QEAO.js} +5 -27
  97. package/chunks/{chunk-4VY3ITHR.js → chunk-FN3JNDRU.js} +3 -3
  98. package/chunks/{chunk-XI7RST4D.js → chunk-FRVV5SSD.js} +2 -2
  99. package/chunks/{chunk-UXDVUFKU.js → chunk-FYZ5NZ3V.js} +2 -20
  100. package/chunks/{chunk-ALMR3E6Q.js → chunk-GDWE23OR.js} +3 -3
  101. package/chunks/{chunk-W7PXLIZJ.js → chunk-GP47UR3M.js} +6 -6
  102. package/chunks/{chunk-LNYV4GXX.js → chunk-GSKX53AN.js} +0 -139
  103. package/chunks/{chunk-MA5OUNN6.js → chunk-HG46TTAG.js} +1 -1
  104. package/chunks/{chunk-FETY36NQ.js → chunk-HGEUHUEV.js} +1 -1
  105. package/chunks/{chunk-UULHYZ4W.js → chunk-HL2DQG3Y.js} +148 -23
  106. package/chunks/{chunk-E6TI726I.js → chunk-HUXPEUFL.js} +1 -1
  107. package/chunks/{chunk-5DQ4YTIZ.js → chunk-HZTXKVSV.js} +1 -1
  108. package/chunks/{chunk-LYT2OU7D.js → chunk-IAEXTMED.js} +1 -1
  109. package/chunks/{chunk-CPJRFFPH.js → chunk-IFHJIEMN.js} +576 -169
  110. package/chunks/{chunk-IW6RQPQB.js → chunk-IJOS26LH.js} +1 -3
  111. package/chunks/{chunk-ORFIYTI2.js → chunk-IK2MWJP5.js} +1 -1
  112. package/chunks/{chunk-MWEF5MUK.js → chunk-IOUBOANU.js} +42 -13
  113. package/chunks/{chunk-KA5HR3G2.js → chunk-IUVIBDKU.js} +2 -2
  114. package/chunks/{chunk-PQWM4SX2.js → chunk-J2RNOJRV.js} +2 -2
  115. package/chunks/{chunk-VHPG7BH6.js → chunk-J5PYQVD2.js} +2 -2
  116. package/chunks/{chunk-JDPBJIKI.js → chunk-JDEW3V5B.js} +1 -1
  117. package/chunks/{chunk-RX3FYFCN.js → chunk-JEMDIKGQ.js} +7 -7
  118. package/chunks/chunk-JL6APGBX.js +43 -0
  119. package/chunks/{chunk-UHUT4IDM.js → chunk-JOMCZWX7.js} +9 -15
  120. package/chunks/{chunk-43CI6YWJ.js → chunk-JV5YASQA.js} +2777 -2151
  121. package/chunks/{chunk-N6S3NUYJ.js → chunk-JXNIF2O5.js} +1 -1
  122. package/chunks/chunk-K2OJUPOE.js +78 -0
  123. package/chunks/{chunk-QLM7D7W3.js → chunk-KFGPNCCY.js} +8 -8
  124. package/chunks/{chunk-7RXOEUFF.js → chunk-KHIBLKNK.js} +1 -1
  125. package/chunks/{chunk-5GD7LYOH.js → chunk-KVBNJ4K2.js} +5 -5
  126. package/chunks/{chunk-QJAFSFYA.js → chunk-KZ2CU2LH.js} +1 -1
  127. package/chunks/{chunk-DCPRCDSR.js → chunk-L2KF7HUE.js} +6 -6
  128. package/chunks/{chunk-4ALNJDHL.js → chunk-L3DTX6U4.js} +3 -1
  129. package/chunks/{chunk-3SH53ANB.js → chunk-LAP7X6EC.js} +12 -0
  130. package/chunks/{chunk-GM44O6F7.js → chunk-LEGNDA46.js} +1 -1
  131. package/chunks/{chunk-WXFCI3O5.js → chunk-LG5Y4OWO.js} +2 -2
  132. package/chunks/{chunk-3LPJ776W.js → chunk-LILGKQ4B.js} +10 -7
  133. package/chunks/{chunk-LBKYQ33T.js → chunk-LIR7YS2O.js} +18 -12
  134. package/chunks/{chunk-5Z4FCEPY.js → chunk-LK2WUCDQ.js} +625 -119
  135. package/chunks/{chunk-W673V2H3.js → chunk-LY2GK2PR.js} +4 -4
  136. package/chunks/{chunk-PQSCGZT2.js → chunk-MOS5OAOG.js} +36 -10
  137. package/chunks/chunk-MXOALJIL.js +691 -0
  138. package/chunks/chunk-NFXXBWSE.js +463 -0
  139. package/chunks/chunk-NUQ4GK5I.js +315 -0
  140. package/chunks/{chunk-J3VZF2AL.js → chunk-NUQVB25K.js} +2 -2
  141. package/chunks/{chunk-GNY7B3CA.js → chunk-NVIBH7WS.js} +1 -1
  142. package/chunks/{chunk-M6YLOETP.js → chunk-O3MKRN2I.js} +4 -4
  143. package/chunks/{chunk-ISPBBKJN.js → chunk-ONGZNOIP.js} +7 -2
  144. package/chunks/{chunk-Q2F43WTJ.js → chunk-OOLSYRZ7.js} +36 -19
  145. package/chunks/{chunk-63ACHB2H.js → chunk-PIGUW2U2.js} +197 -28
  146. package/chunks/{chunk-QAZ2MGYT.js → chunk-PLLIWEM3.js} +2 -2
  147. package/chunks/{chunk-ULY4ISY2.js → chunk-PMS4FVLY.js} +23 -8
  148. package/chunks/{chunk-NB3NDQQK.js → chunk-Q2XLNLAV.js} +1 -1
  149. package/chunks/{chunk-6GRDHIVI.js → chunk-Q6HXLBZF.js} +12 -12
  150. package/chunks/{chunk-EUXF6URV.js → chunk-QPWZX4ZV.js} +32 -34
  151. package/chunks/{chunk-DTB5BXRG.js → chunk-RJZTX2OF.js} +30 -17
  152. package/chunks/{chunk-PQEISIKS.js → chunk-SAH4BD2J.js} +0 -67
  153. package/chunks/{chunk-LUVXLLMS.js → chunk-SAWPURIU.js} +2 -2
  154. package/chunks/{chunk-WZS3X663.js → chunk-SNZWDV67.js} +43 -18
  155. package/chunks/{chunk-IRKQ4YYX.js → chunk-SVWWF5TZ.js} +29 -1
  156. package/chunks/{chunk-5VZFJTL2.js → chunk-SXEE6PND.js} +2 -2
  157. package/chunks/{chunk-743XE7N7.js → chunk-T4JVQR7Z.js} +2 -2
  158. package/chunks/{chunk-6RZX2HIH.js → chunk-TBEXLLAO.js} +2 -2
  159. package/chunks/{chunk-LN3WBOKU.js → chunk-TP2DUOB6.js} +8 -8
  160. package/chunks/{chunk-MWIO7MF6.js → chunk-TP6FYVQT.js} +2 -0
  161. package/chunks/{chunk-HRPFBHW7.js → chunk-TPKQIA7G.js} +1 -0
  162. package/chunks/{chunk-VH764G6B.js → chunk-TWC3FHUI.js} +4 -4
  163. package/chunks/{chunk-H3Q3RSKZ.js → chunk-U7O65WKL.js} +1 -1
  164. package/chunks/{chunk-IUJLW6ZI.js → chunk-UBEYS536.js} +7 -7
  165. package/chunks/{chunk-VEQBVJYH.js → chunk-UGS62IR2.js} +3 -3
  166. package/chunks/{chunk-VF6D6EGV.js → chunk-UKMWZ5NS.js} +109 -842
  167. package/chunks/{chunk-7GZCCHJL.js → chunk-VHKOULAI.js} +6 -5
  168. package/chunks/{chunk-ODBNTMZW.js → chunk-VID4BW52.js} +97 -86
  169. package/chunks/{chunk-7L35FKPF.js → chunk-VLZOU6UH.js} +7 -7
  170. package/chunks/{chunk-XBLG564H.js → chunk-VTBPMLRO.js} +12 -12
  171. package/chunks/{chunk-QTNCGZHQ.js → chunk-VX63RJXE.js} +9 -0
  172. package/chunks/{chunk-7VEYUF3N.js → chunk-W5ZQMAEM.js} +1 -1
  173. package/chunks/{chunk-XQ4RDO5B.js → chunk-WBCPROWX.js} +1 -1
  174. package/chunks/{chunk-RDV4NLI3.js → chunk-WS7MOFK6.js} +3 -3
  175. package/chunks/{chunk-FV4DM2M4.js → chunk-WXFK4MH7.js} +32 -12
  176. package/chunks/{chunk-XAXTQURR.js → chunk-WY4N6KS7.js} +4 -4
  177. package/chunks/{chunk-CABDNUJ4.js → chunk-XDQUDARC.js} +11 -14
  178. package/chunks/{chunk-YHDGABDC.js → chunk-XKBFYTCD.js} +1 -1
  179. package/chunks/{chunk-2EKVPSIJ.js → chunk-Y2MYW47X.js} +1 -1
  180. package/chunks/{chunk-Y6ZWXM44.js → chunk-YIU5PEAT.js} +2 -2
  181. package/chunks/{chunk-PSPAM24S.js → chunk-YKK2XXHF.js} +4 -0
  182. package/chunks/{chunk-HZ2HUXX7.js → chunk-YS2ZJSOA.js} +29 -12
  183. package/chunks/{chunk-OFVAS4AR.js → chunk-ZGQIIGNQ.js} +2 -2
  184. package/chunks/{chunk-HNLMYDQE.js → chunk-ZHECLGA6.js} +2 -4
  185. package/chunks/{chunk-XBVNNDPK.js → chunk-ZHKTKHMO.js} +8 -1
  186. package/chunks/{chunk-OWCFKIFQ.js → chunk-ZKYR7QS4.js} +1 -1
  187. package/chunks/{chunk-YZTGGCEE.js → chunk-ZKZHSB5W.js} +1 -1
  188. package/chunks/{chunk-ERXNTINK.js → chunk-ZT6EPPBY.js} +1 -1
  189. package/chunks/{chunk-565U2ANU.js → chunk-ZTTC7T4X.js} +1 -1
  190. package/chunks/{chunk-MMMA36MN.js → chunk-ZUQVZTWG.js} +3 -3
  191. package/chunks/{chunk-7OCIQNKX.js → chunk-ZW2EUO2A.js} +1 -1
  192. package/chunks/{config-utils-37FHWPTP.js → config-utils-S5LFS4RN.js} +67 -59
  193. package/chunks/{contextCommand-R4JUBV5N.js → contextCommand-XXKZMMSQ.js} +64 -56
  194. package/chunks/{core-runtime-6U4OXU5C.js → core-runtime-YGUA42AZ.js} +68 -59
  195. package/chunks/{create-sub-session-LLUYAGZN.js → create-sub-session-SEK6KCYR.js} +64 -56
  196. package/chunks/{create-sub-session-TGIX63YU.js → create-sub-session-TIGCFGCS.js} +2 -2
  197. package/chunks/{cron-create-GTPVMJCF.js → cron-create-AKWX67FO.js} +1 -1
  198. package/chunks/{cron-delete-ZBK27Z4K.js → cron-delete-XPB6IYZJ.js} +1 -1
  199. package/chunks/{cron-list-KTFKFDKC.js → cron-list-XBKO4WU5.js} +1 -1
  200. package/chunks/{daemon-UI6SQSBV.js → daemon-G5TYKZD6.js} +2 -2
  201. package/chunks/{daemon-git-worktree-guard-O2UTNFJC.js → daemon-git-worktree-guard-3AWINPPX.js} +65 -57
  202. package/chunks/{daemon-status-provider-7GMAKSTX.js → daemon-status-provider-RTKHKUFJ.js} +73 -65
  203. package/chunks/{daemon-trust-policy-VNP76VMO.js → daemon-trust-policy-6YQOC7B6.js} +69 -61
  204. package/chunks/{daemon-trust-policy-monitor-TD5O3BZA.js → daemon-trust-policy-monitor-EN5L23GS.js} +69 -61
  205. package/chunks/{de-UU2YTO37.js → de-OOLZAU2U.js} +1 -1
  206. package/chunks/{deferred-core-runtime-NJM63YJS.js → deferred-core-runtime-JPLQRVZO.js} +62 -54
  207. package/chunks/{display-image-CTNHJRZC.js → display-image-NAH3AZ63.js} +3 -3
  208. package/chunks/{dist-STAGIFNB.js → dist-3BJVSJ7D.js} +389 -724
  209. package/chunks/{dist-OR2ZQTXZ.js → dist-65Q3TRLH.js} +16 -36
  210. package/chunks/{dist-24TCWK5H.js → dist-HX2LG76F.js} +233 -35
  211. package/chunks/{dist-XJ25G6OH.js → dist-J7PDFK53.js} +13 -38
  212. package/chunks/{dist-WZTUKIDR.js → dist-JCXKXRH6.js} +3 -6
  213. package/chunks/{dist-M4CBX53H.js → dist-LHGMHIDK.js} +2 -6
  214. package/chunks/{dist-5I4HLUTO.js → dist-QPTIRE3U.js} +4 -13
  215. package/chunks/{dist-FDISN4AK.js → dist-SBK33YLC.js} +5 -40
  216. package/chunks/{dist-NQ2636VT.js → dist-WMFHZG3R.js} +2 -5
  217. package/chunks/{edit-GL7OA6RV.js → edit-QXJZIWRQ.js} +50 -44
  218. package/chunks/{en-YJNRUQG4.js → en-7BZ2OZKH.js} +2 -1
  219. package/chunks/{enter-worktree-YFTKHXHZ.js → enter-worktree-54L5QJ3N.js} +4 -4
  220. package/chunks/{enterPlanMode-VC4BCSZE.js → enterPlanMode-2ITCVQ5N.js} +47 -41
  221. package/chunks/{environment-BI6IBAZJ.js → environment-URPO5ORZ.js} +65 -57
  222. package/chunks/{errors-D6G2ZM2R.js → errors-TDUYLEKI.js} +64 -56
  223. package/chunks/{exit-worktree-NF2XEMES.js → exit-worktree-EORJDKDS.js} +4 -4
  224. package/chunks/{exitPlanMode-DX446CA6.js → exitPlanMode-RA7KMUEW.js} +47 -41
  225. package/chunks/{fast-path-MAYDLJIP.js → fast-path-Q2JYP64P.js} +7 -7
  226. package/chunks/{fast-path-settings-SATXY3PD.js → fast-path-settings-GTHZLVSS.js} +2 -2
  227. package/chunks/{fr-HKNWVXRJ.js → fr-JJWM2HUS.js} +1 -1
  228. package/chunks/{glob-TVKRFY36.js → glob-VHSV4BKE.js} +50 -44
  229. package/chunks/{goal-tools-CA6YANRN.js → goal-tools-5FIE56CK.js} +53 -43
  230. package/chunks/{grep-BLHF2S5D.js → grep-3PKFKLCA.js} +2 -2
  231. package/chunks/{handleAutoUpdate-AW4ZAHON.js → handleAutoUpdate-7FZFLKNZ.js} +65 -57
  232. package/chunks/{i18n-IH5CRAY7.js → i18n-NTFQDWKR.js} +63 -55
  233. package/chunks/{image-gen-XP4NNIYG.js → image-gen-TF3IQWSH.js} +7 -6
  234. package/chunks/{initializer-UBR37ZNM.js → initializer-LB3T635H.js} +69 -61
  235. package/chunks/{installationInfo-Y52756EC.js → installationInfo-KRO433ZG.js} +62 -54
  236. package/chunks/{ja-GJS5RZGU.js → ja-L67TXFDJ.js} +1 -1
  237. package/chunks/{list-7V5JDZPO.js → list-NEP3WPZ7.js} +72 -64
  238. package/chunks/{list-agents-I5TRH3J7.js → list-agents-QLDXS5OD.js} +18 -8
  239. package/chunks/{llm-QDB6JVF5.js → llm-AZEJEIAD.js} +141 -128
  240. package/chunks/{llm-content-generator-EO6MZCEO.js → llm-content-generator-KWXFHBR3.js} +6 -5
  241. package/chunks/{loadedSettingsAdapter-I3YQKMC4.js → loadedSettingsAdapter-NZORJLSD.js} +69 -61
  242. package/chunks/{loggingContentGenerator-MNXYUGDG.js → loggingContentGenerator-NGHVU6AK.js} +69 -62
  243. package/chunks/{loop-wakeup-HL6XOWI4.js → loop-wakeup-HHMYIC7Z.js} +2 -2
  244. package/chunks/{ls-YV7RKLKY.js → ls-N7ABR6HI.js} +4 -4
  245. package/chunks/{lsp-NO3AMRZT.js → lsp-LTOFWG5P.js} +1 -1
  246. package/chunks/{managed-npm-update-EA3EXPTO.js → managed-npm-update-3LHNBEAG.js} +62 -54
  247. package/chunks/{mcp-QTAJ544Y.js → mcp-4SWJKDX7.js} +69 -61
  248. package/chunks/{monitor-6FQKQOTP.js → monitor-V5EFBZC7.js} +49 -43
  249. package/chunks/{nonInteractiveCli-MRCTZL5X.js → nonInteractiveCli-5UFUBUAT.js} +117 -109
  250. package/chunks/{notebook-edit-BQQCKI7K.js → notebook-edit-ATV46KWD.js} +48 -42
  251. package/chunks/{open-with-auth-D6JD6LDS.js → open-with-auth-6MVIHMXB.js} +1 -1
  252. package/chunks/openai-WX26N5OJ.js +47 -0
  253. package/chunks/{openaiContentGenerator-TTSKXNVH.js → openaiContentGenerator-BKTO5QJK.js} +31 -25
  254. package/chunks/openaiResponsesContentGenerator-RTCAJ5V5.js +1658 -0
  255. package/chunks/{pidfile-KPIS6RIT.js → pidfile-JAIOWPI3.js} +65 -55
  256. package/chunks/process-registry-X6ZCASEN.js +10 -0
  257. package/chunks/{processUtils-ZCASPKK4.js → processUtils-TCQH3LVD.js} +2 -2
  258. package/chunks/{prompt-terminal-ledger-D6HM6TV7.js → prompt-terminal-ledger-BYXHEUHX.js} +63 -55
  259. package/chunks/{pt-FXMYXEUV.js → pt-77SBDL4B.js} +1 -1
  260. package/chunks/{qwenContentGenerator-GGZEFLBD.js → qwenContentGenerator-K5TJK75P.js} +60 -52
  261. package/chunks/{qwenOAuth2-KX6LVYQ3.js → qwenOAuth2-NOXRK323.js} +6 -5
  262. package/chunks/{read-file-VE5GDFLP.js → read-file-DL7GNZD5.js} +11 -9
  263. package/chunks/{read-mcp-resource-D3N75DGF.js → read-mcp-resource-B37WANAQ.js} +1 -1
  264. package/chunks/{record-artifact-Q5CRGJTP.js → record-artifact-OAXWXZ5D.js} +2 -2
  265. package/chunks/record-source-D7R7X3GT.js +22 -0
  266. package/chunks/{report-findings-TJ34R7QK.js → report-findings-AR3VC6EQ.js} +3 -3
  267. package/chunks/{request-shutdown-LRKMTBAD.js → request-shutdown-IKNWTX5M.js} +5 -5
  268. package/chunks/{resumeHistoryUtils-HSSGMYDC.js → resumeHistoryUtils-OYKXZ4YO.js} +68 -60
  269. package/chunks/{ripGrep-SEJE7AA6.js → ripGrep-EOUMIU4K.js} +15 -13
  270. package/chunks/{ru-RMHURE5U.js → ru-UYWHKWF2.js} +1 -1
  271. package/chunks/{run-qwen-serve-OJYVH7N6.js → run-qwen-serve-PPTGWC5B.js} +471 -152
  272. package/chunks/{runtime-KGMQQFJD.js → runtime-5RO22P2N.js} +77 -67
  273. package/chunks/{scheduled-tasks-7H5HWHYD.js → scheduled-tasks-YGERFWLZ.js} +70 -62
  274. package/chunks/{scheduler-BE42AKDG.js → scheduler-S6WU6M3C.js} +64 -56
  275. package/chunks/{sdk-exporters-grpc-MXTVSE3C.js → sdk-exporters-grpc-Y2ZUQDUQ.js} +2 -2
  276. package/chunks/{sdk-exporters-http-7R2ARBPV.js → sdk-exporters-http-VWTF4W6K.js} +3 -3
  277. package/chunks/{sdk-impl-YOLO7LV4.js → sdk-impl-G6FVTBQZ.js} +9 -9
  278. package/chunks/{send-message-AWKUDJBH.js → send-message-TWOGWCBG.js} +13 -10
  279. package/chunks/{serve-KZVKYMSL.js → serve-HT4WOCWS.js} +70 -62
  280. package/chunks/{server-PJRALPJQ.js → server-SWXVPRCS.js} +2977 -617
  281. package/chunks/{session-IHITXU2S.js → session-6DSFUOMO.js} +154 -119
  282. package/chunks/{session-attachments-root-GQ2TUI3Y.js → session-attachments-root-SOZCTQWW.js} +62 -54
  283. package/chunks/{session-pr-refresh-H43LULTE.js → session-pr-refresh-F7XUBQBH.js} +70 -62
  284. package/chunks/{settings-RKEQQDFC.js → settings-SWQH36PO.js} +74 -66
  285. package/chunks/{shell-6PJ444U5.js → shell-XUQL6EYV.js} +47 -41
  286. package/chunks/{skill-Q3UP7B5V.js → skill-HNRDD54C.js} +33 -23
  287. package/chunks/{skill-settings-LZR5YRRW.js → skill-settings-JU72PCII.js} +68 -60
  288. package/chunks/{spawnChannel-WM3DT2BF.js → spawnChannel-7ZVM3GBU.js} +65 -57
  289. package/chunks/{standalone-update-E5474IBI.js → standalone-update-64JQY2LX.js} +64 -56
  290. package/chunks/{start-opentui-ui-WLWZNQ2I.js → start-opentui-ui-RSLBXESU.js} +554 -297
  291. package/chunks/{startInteractiveUI-FBQSGWGO.js → startInteractiveUI-ZDPHD7XE.js} +1282 -1915
  292. package/chunks/{syntheticOutput-D2P5V6RG.js → syntheticOutput-F6F27JMK.js} +2 -2
  293. package/chunks/{task-create-PMAFST2T.js → task-create-Y623TBHB.js} +10 -10
  294. package/chunks/{task-list-R2HSY2NC.js → task-list-FCPEEGWL.js} +3 -3
  295. package/chunks/{task-stop-BFSKRTGV.js → task-stop-QTKZXLPH.js} +1 -1
  296. package/chunks/{task-update-JYC57USF.js → task-update-YLSXF25N.js} +10 -10
  297. package/chunks/{team-create-VIGUFUT4.js → team-create-U52VYSNO.js} +49 -43
  298. package/chunks/{team-delete-CBHVBTPB.js → team-delete-S7TLHZCF.js} +3 -3
  299. package/chunks/{team-plan-approval-HQVZA3MD.js → team-plan-approval-IQ4ADQIK.js} +47 -41
  300. package/chunks/{terminal-image-renderer-LUKNCOVM.js → terminal-image-renderer-ZEMF7LB2.js} +64 -56
  301. package/chunks/{theme-manager-LOENKYLY.js → theme-manager-DK2S2SOX.js} +62 -54
  302. package/chunks/{todoWrite-5ERKFWAK.js → todoWrite-5QI2H2FW.js} +4 -4
  303. package/chunks/{tool-search-ZIFAQCE2.js → tool-search-6U4OQG7K.js} +21 -15
  304. package/chunks/{total-session-admission-FUUJH3QH.js → total-session-admission-BOARHBZU.js} +68 -60
  305. package/chunks/{trustedFolders-C76KYROP.js → trustedFolders-GKQZXZSV.js} +63 -55
  306. package/chunks/{update-relaunch-4G2SRXKX.js → update-relaunch-GLACF7PX.js} +5 -5
  307. package/chunks/{updateCheck-EIZIO7HI.js → updateCheck-NLBSZB4Q.js} +64 -56
  308. package/chunks/{useAutoAcceptIndicator-EAA6KSY4.js → useAutoAcceptIndicator-3X3BYU7H.js} +72 -64
  309. package/chunks/{validateNonInterActiveAuth-BRX22QCN.js → validateNonInterActiveAuth-NE3JLOIR.js} +114 -106
  310. package/chunks/{version-E56RU7PR.js → version-6H5YAT4N.js} +3 -1
  311. package/chunks/{web-fetch-AAUCD7RM.js → web-fetch-RWSO7TTN.js} +15 -13
  312. package/chunks/{web-search-HFUQF44Q.js → web-search-DADI3LV5.js} +560 -322
  313. package/chunks/{web-shell-static-POZHGGXE.js → web-shell-static-CCN4JZEE.js} +5 -4
  314. package/chunks/workflow-LPGCZCIT.js +1224 -0
  315. package/chunks/workspace-providers-status-QBRBEFTO.js +127 -0
  316. package/chunks/{workspace-registration-store-YL7HLYYI.js → workspace-registration-store-WUKTMJPW.js} +3 -2
  317. package/chunks/{workspace-registry-BNRP2ELW.js → workspace-registry-CJV7KVGF.js} +68 -60
  318. package/chunks/{workspace-runtime-coordinator-WKGF7VHS.js → workspace-runtime-coordinator-7LYMFMFF.js} +71 -61
  319. package/chunks/{workspace-service-4MYO72MM.js → workspace-service-HWXZSA4J.js} +75 -67
  320. package/chunks/{workspace-skills-status-SU66TJLZ.js → workspace-skills-status-D6QXUWCC.js} +70 -62
  321. package/chunks/{workspace-trust-reconciler-D5QT7WQB.js → workspace-trust-reconciler-VZX7G7CZ.js} +75 -67
  322. package/chunks/{write-file-NVPQE2AZ.js → write-file-KKHV26YV.js} +49 -43
  323. package/chunks/{zh-VBFCRQBL.js → zh-J2GLI64H.js} +2 -1
  324. package/chunks/{zh-TW-N2TBF2F2.js → zh-TW-TBAICUJQ.js} +2 -1
  325. package/chunks/{zoom-image-RJHC66WG.js → zoom-image-OG7X7KAA.js} +12 -10
  326. package/cli.js +14 -14
  327. package/export-transcript-document.css +1 -0
  328. package/export-transcript-document.js +164 -165
  329. package/locales/ca.js +2 -2
  330. package/locales/de.js +2 -2
  331. package/locales/en.js +3 -2
  332. package/locales/fr.js +2 -2
  333. package/locales/ja.js +2 -2
  334. package/locales/pt.js +2 -2
  335. package/locales/ru.js +2 -2
  336. package/locales/zh-TW.js +3 -2
  337. package/locales/zh.js +3 -2
  338. package/package.json +6 -5
  339. package/web-shell/assets/{abnfDiagram-VCTEODGH-DHc6plZn.js → abnfDiagram-VCTEODGH-NT0lTLRG.js} +1 -1
  340. package/web-shell/assets/{arc-BQ9m8TDV.js → arc-DDqnIMMx.js} +1 -1
  341. package/web-shell/assets/{architectureDiagram-5GKGNRK7-D5ap3oVB.js → architectureDiagram-5GKGNRK7-DfYghE3W.js} +1 -1
  342. package/web-shell/assets/{blockDiagram-NRAW4CY4-BIbnyNph.js → blockDiagram-NRAW4CY4-DlqJIx5c.js} +1 -1
  343. package/web-shell/assets/{c4Diagram-UCG6FXSJ-BRsdx_iG.js → c4Diagram-UCG6FXSJ-CinqLGU4.js} +1 -1
  344. package/web-shell/assets/channel-BHGoSkEv.js +1 -0
  345. package/web-shell/assets/{chunk-2Q5K7J3B-3lf1fNlx.js → chunk-2Q5K7J3B-CsjJX5M7.js} +1 -1
  346. package/web-shell/assets/{chunk-5VM5RSS4-DP8VNRc4.js → chunk-5VM5RSS4-CaVb2tdH.js} +1 -1
  347. package/web-shell/assets/{chunk-F27PBJKO-DrohDmZ6.js → chunk-F27PBJKO-CRyErlzW.js} +1 -1
  348. package/web-shell/assets/{chunk-G27WJ6UU-UZ2QhSx6.js → chunk-G27WJ6UU-7I79DZCf.js} +1 -1
  349. package/web-shell/assets/{chunk-JWPE2WC7-BIMHVcZK.js → chunk-JWPE2WC7-Dz4cac5F.js} +1 -1
  350. package/web-shell/assets/{chunk-LCL6LL3I-izRxdSDd.js → chunk-LCL6LL3I-Ls24Derb.js} +1 -1
  351. package/web-shell/assets/{chunk-POPQ4Y6H-CXADD4PP.js → chunk-POPQ4Y6H-JzYe4qx7.js} +1 -1
  352. package/web-shell/assets/{chunk-SVP7TREG-B96d8Y_1.js → chunk-SVP7TREG-BxDwesA-.js} +1 -1
  353. package/web-shell/assets/{chunk-XXDRQBXY-CF2sVQpv.js → chunk-XXDRQBXY-CW4hjgWc.js} +1 -1
  354. package/web-shell/assets/classDiagram-DTDB5LWJ-E47Xnn15.js +1 -0
  355. package/web-shell/assets/classDiagram-v2-JRS7N3AN-E47Xnn15.js +1 -0
  356. package/web-shell/assets/{cose-bilkent-JH36ORCC-CT6tXVAS.js → cose-bilkent-JH36ORCC-DxikE9iF.js} +1 -1
  357. package/web-shell/assets/{cynefin-OW5HDTMX-X1NS4vtV.js → cynefin-OW5HDTMX-CvVsIkVN.js} +1 -1
  358. package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-DNsKNOT4.js → cynefinDiagram-5FMLGOSQ-CDHkk3wq.js} +1 -1
  359. package/web-shell/assets/{dagre-3AP2YEHR-9-AHKqsb.js → dagre-3AP2YEHR-BgLdkVLT.js} +1 -1
  360. package/web-shell/assets/{diagram-S7CK7UJ4-Bjgms7j6.js → diagram-S7CK7UJ4-DP43cGhe.js} +1 -1
  361. package/web-shell/assets/{diagram-UQ7AKVKN-h6bCprbE.js → diagram-UQ7AKVKN-BWrZYhoT.js} +1 -1
  362. package/web-shell/assets/{diagram-VSXAHHWV-4SbQXVLt.js → diagram-VSXAHHWV-B80wjH_n.js} +1 -1
  363. package/web-shell/assets/{diagram-VX7I27RA-B5gPCzzB.js → diagram-VX7I27RA-DPpKmDsY.js} +1 -1
  364. package/web-shell/assets/{diagram-Z3DM3KII-DFJXIA3A.js → diagram-Z3DM3KII-kaEBNbNU.js} +1 -1
  365. package/web-shell/assets/{ebnfDiagram-PWID7BFC-FwyaU7VY.js → ebnfDiagram-PWID7BFC-1-qbEZvk.js} +1 -1
  366. package/web-shell/assets/{erDiagram-SSCWMZ5O-8vJQh2te.js → erDiagram-SSCWMZ5O-CrK2gMkV.js} +1 -1
  367. package/web-shell/assets/{flowDiagram-A5DVABFB-BzA_1gMN.js → flowDiagram-A5DVABFB-Dic2xofW.js} +1 -1
  368. package/web-shell/assets/{ganttDiagram-EL5Y4UJY-Co-ABbVX.js → ganttDiagram-EL5Y4UJY-DJko8vT7.js} +1 -1
  369. package/web-shell/assets/{gitGraphDiagram-WWUBYQGX-DW_FcyrX.js → gitGraphDiagram-WWUBYQGX-DxsQ-bHT.js} +1 -1
  370. package/web-shell/assets/index-DY8CxdBr.js +2173 -0
  371. package/web-shell/assets/index-eBxK3rs2.css +36 -0
  372. package/web-shell/assets/{index-BbMXfhNG.js → index-t7VBrUeD.js} +1 -1
  373. package/web-shell/assets/{infoDiagram-RXCK75RN-BEgfhUFN.js → infoDiagram-RXCK75RN-DcRUJbNi.js} +1 -1
  374. package/web-shell/assets/{ishikawaDiagram-5VMMS53U-DCsMxQmc.js → ishikawaDiagram-5VMMS53U-CUPw-2_e.js} +1 -1
  375. package/web-shell/assets/{journeyDiagram-EYS64GPL-DyIEYoHz.js → journeyDiagram-EYS64GPL-yOHhZxkW.js} +1 -1
  376. package/web-shell/assets/{kanban-definition-3QL26DDD-CkxjqCNr.js → kanban-definition-3QL26DDD-CFUGBbqz.js} +1 -1
  377. package/web-shell/assets/{layout-BEWc0Al9.js → layout-BoilNfBU.js} +1 -1
  378. package/web-shell/assets/{linear-CNuNxirL.js → linear-DOuHaPrl.js} +1 -1
  379. package/web-shell/assets/{mermaid.core-DZBre674.js → mermaid.core-1G1fXWda.js} +6 -6
  380. package/web-shell/assets/{mindmap-definition-FBJOCRG2-CpafFz_F.js → mindmap-definition-FBJOCRG2-B8BhkrOX.js} +1 -1
  381. package/web-shell/assets/{pegDiagram-XKGWAZYB-DfZqk_dq.js → pegDiagram-XKGWAZYB-CipC5K1D.js} +1 -1
  382. package/web-shell/assets/{pieDiagram-E7YTZNPT-S0UWXlgC.js → pieDiagram-E7YTZNPT-CHBDFDUJ.js} +1 -1
  383. package/web-shell/assets/{quadrantDiagram-AXDQQJYC-dd37_Ohj.js → quadrantDiagram-AXDQQJYC-_iiBkoZO.js} +1 -1
  384. package/web-shell/assets/{railroadDiagram-O6MQD6OU-CH8NJZ7u.js → railroadDiagram-O6MQD6OU-Cx1peHDi.js} +1 -1
  385. package/web-shell/assets/{requirementDiagram-EFPCY7ZU-CFdqWYih.js → requirementDiagram-EFPCY7ZU-CBRiPbdQ.js} +1 -1
  386. package/web-shell/assets/{sankeyDiagram-P5KCCOFB-CsddcEGD.js → sankeyDiagram-P5KCCOFB-TT6GcHaZ.js} +1 -1
  387. package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-BZ270mGw.js → sequenceDiagram-WJ2MYXX4-CWP42PNb.js} +1 -1
  388. package/web-shell/assets/{sizeCapture-X5ZJPWSS-CGaS4DBV.js → sizeCapture-X5ZJPWSS-Bp94roEG.js} +1 -1
  389. package/web-shell/assets/{stateDiagram-HBIQ2CUA-COpIzMu6.js → stateDiagram-HBIQ2CUA-0ftrzTAy.js} +1 -1
  390. package/web-shell/assets/stateDiagram-v2-4QOOHH4V-PgAST0dK.js +1 -0
  391. package/web-shell/assets/{swimlanes-XN3QIQJK-CMF889m3.js → swimlanes-XN3QIQJK-D-FsenYJ.js} +1 -1
  392. package/web-shell/assets/swimlanesDiagram-VK2B7HYN-BcWcB5bj.js +8 -0
  393. package/web-shell/assets/{timeline-definition-24CTP7MA-BelnxYz5.js → timeline-definition-24CTP7MA-Ctvrj28y.js} +1 -1
  394. package/web-shell/assets/{vennDiagram-4TSXK5OY-CU-NRqIB.js → vennDiagram-4TSXK5OY-5DZncjOt.js} +1 -1
  395. package/web-shell/assets/{wardleyDiagram-VM6X3IG4-CDNKqWh-.js → wardleyDiagram-VM6X3IG4-jZjYwPY7.js} +1 -1
  396. package/web-shell/assets/{xychartDiagram-S5SC5T6Z-CLqguL5D.js → xychartDiagram-S5SC5T6Z-Ci6Q2C2_.js} +1 -1
  397. package/web-shell/index.html +29 -5
  398. package/chunks/chunk-V7RNNPGC.js +0 -44
  399. package/chunks/chunk-X35VIWWJ.js +0 -276
  400. package/chunks/workflow-3MABM53N.js +0 -2771
  401. package/chunks/workspace-providers-status-2FRLBZ5I.js +0 -119
  402. package/web-shell/assets/channel-uMMdTrYk.js +0 -1
  403. package/web-shell/assets/classDiagram-DTDB5LWJ-DcY-26Ig.js +0 -1
  404. package/web-shell/assets/classDiagram-v2-JRS7N3AN-DcY-26Ig.js +0 -1
  405. package/web-shell/assets/index-Bu-rZoJ-.js +0 -2150
  406. package/web-shell/assets/index-CsPwZ1ut.css +0 -36
  407. package/web-shell/assets/stateDiagram-v2-4QOOHH4V-D6qEVAji.js +0 -1
  408. package/web-shell/assets/swimlanesDiagram-VK2B7HYN-mem5Jj4m.js +0 -8
  409. /package/chunks/{chunk-JA5CBKRP.js → chunk-7NXSVSFB.js} +0 -0
@@ -9,6 +9,9 @@ import {
9
9
  CLIENT_ID_RE,
10
10
  MAX_CLIENT_ID_LENGTH
11
11
  } from "./chunk-LAUEEBDL.js";
12
+ import {
13
+ isPreAuthWebShellRequest
14
+ } from "./chunk-SVWWF5TZ.js";
12
15
  import {
13
16
  formatHostForAuthority,
14
17
  isLoopbackBind
@@ -21,7 +24,10 @@ import {
21
24
  } from "./chunk-2Z3T52OC.js";
22
25
  import {
23
26
  CLIENT_MCP_OVER_WS_CONFIG_FLAG
24
- } from "./chunk-PSPAM24S.js";
27
+ } from "./chunk-YKK2XXHF.js";
28
+ import {
29
+ MAX_REGISTERED_WORKSPACES
30
+ } from "./chunk-SNZWDV67.js";
25
31
  import {
26
32
  parseToolWriteOriginMeta
27
33
  } from "./chunk-GELRJXE2.js";
@@ -923,78 +929,6 @@ function isDeepHealthQuery(raw) {
923
929
  }
924
930
  __name(isDeepHealthQuery, "isDeepHealthQuery");
925
931
 
926
- // packages/cli/src/serve/server/self-origin.ts
927
- init_esbuild_shims();
928
- function installSelfOriginStripMiddleware(app, getPort, bind) {
929
- let cachedStripPort = -1;
930
- let cachedSelfOrigins = /* @__PURE__ */ new Set();
931
- const boundHost = isLoopbackBind(bind) ? formatHostForAuthority(bind) : void 0;
932
- app.use((req, _res, next) => {
933
- const origin = req.headers.origin;
934
- if (origin) {
935
- const port = getPort();
936
- if (port !== cachedStripPort) {
937
- cachedStripPort = port;
938
- cachedSelfOrigins = /* @__PURE__ */ new Set([
939
- `http://127.0.0.1:${port}`,
940
- `http://localhost:${port}`,
941
- `http://[::1]:${port}`,
942
- `http://host.docker.internal:${port}`,
943
- `https://127.0.0.1:${port}`,
944
- `https://localhost:${port}`,
945
- `https://[::1]:${port}`,
946
- `https://host.docker.internal:${port}`
947
- ]);
948
- if (boundHost) {
949
- cachedSelfOrigins.add(`http://${boundHost}:${port}`);
950
- cachedSelfOrigins.add(`https://${boundHost}:${port}`);
951
- }
952
- if (port === 80) {
953
- for (const host of [
954
- "127.0.0.1",
955
- "localhost",
956
- "[::1]",
957
- "host.docker.internal"
958
- ]) {
959
- cachedSelfOrigins.add(`http://${host}`);
960
- }
961
- if (boundHost) {
962
- cachedSelfOrigins.add(`http://${boundHost}`);
963
- }
964
- } else if (port === 443) {
965
- for (const host of [
966
- "127.0.0.1",
967
- "localhost",
968
- "[::1]",
969
- "host.docker.internal"
970
- ]) {
971
- cachedSelfOrigins.add(`https://${host}`);
972
- }
973
- if (boundHost) {
974
- cachedSelfOrigins.add(`https://${boundHost}`);
975
- }
976
- }
977
- }
978
- if (cachedSelfOrigins.has(origin)) {
979
- delete req.headers.origin;
980
- }
981
- }
982
- next();
983
- });
984
- }
985
- __name(installSelfOriginStripMiddleware, "installSelfOriginStripMiddleware");
986
-
987
- // packages/cli/src/serve/acp-child-extra-args.ts
988
- init_esbuild_shims();
989
- function acpChildExtraArgs(opts) {
990
- const extraArgs = [
991
- ...opts.experimentalLsp === true ? ["--experimental-lsp"] : [],
992
- ...opts.restoreAskUserQuestion === true ? ["--restore-ask-user-question"] : []
993
- ];
994
- return extraArgs.length > 0 ? extraArgs : void 0;
995
- }
996
- __name(acpChildExtraArgs, "acpChildExtraArgs");
997
-
998
932
  // packages/cli/src/serve/local-control/credentials.ts
999
933
  init_esbuild_shims();
1000
934
  import { createHash, timingSafeEqual } from "node:crypto";
@@ -1094,11 +1028,203 @@ function listenerIdentityOfSocket(socket) {
1094
1028
  }
1095
1029
  __name(listenerIdentityOfSocket, "listenerIdentityOfSocket");
1096
1030
 
1031
+ // packages/cli/src/serve/server/access-log.ts
1032
+ init_esbuild_shims();
1033
+ init_esm();
1034
+ import { performance } from "node:perf_hooks";
1035
+
1036
+ // packages/cli/src/serve/server/telemetry-context.ts
1037
+ init_esbuild_shims();
1038
+ var daemonTelemetryResponseContext = Symbol(
1039
+ "daemonTelemetryResponseContext"
1040
+ );
1041
+ var daemonInboundTraceIdContext = Symbol(
1042
+ "daemonInboundTraceIdContext"
1043
+ );
1044
+ function getDaemonTelemetryInboundTraceId(res) {
1045
+ try {
1046
+ return res[daemonInboundTraceIdContext];
1047
+ } catch {
1048
+ return void 0;
1049
+ }
1050
+ }
1051
+ __name(getDaemonTelemetryInboundTraceId, "getDaemonTelemetryInboundTraceId");
1052
+
1053
+ // packages/cli/src/serve/server/access-log.ts
1054
+ var SESSION_ID_RE = /\/session\/([^/]+)/;
1055
+ var ACCESS_LOG_BURST = 60;
1056
+ var ACCESS_LOG_REFILL_PER_SECOND = 2;
1057
+ var ACCESS_LOG_REJECT_BURST = 30;
1058
+ var ACCESS_LOG_REJECT_REFILL_PER_SECOND = 1;
1059
+ var ROUTE_MAX_BYTES = 2 * 1024;
1060
+ var SESSION_ID_MAX_BYTES = 256;
1061
+ var CLIENT_ID_MAX_BYTES = 256;
1062
+ var ACCESS_LOG_CONTROLLER_LOCAL = "accessLogController";
1063
+ var ACCESS_LOG_REJECT_LOCAL = "accessLogPreAuthReject";
1064
+ function emptySuppressedCounts() {
1065
+ return {
1066
+ suppressed: 0,
1067
+ status2xx: 0,
1068
+ status3xx: 0,
1069
+ status4xx: 0,
1070
+ status5xx: 0,
1071
+ statusOther: 0
1072
+ };
1073
+ }
1074
+ __name(emptySuppressedCounts, "emptySuppressedCounts");
1075
+ function countSuppressed(counts, status) {
1076
+ counts.suppressed += 1;
1077
+ if (status >= 200 && status < 300) counts.status2xx += 1;
1078
+ else if (status >= 300 && status < 400) counts.status3xx += 1;
1079
+ else if (status >= 400 && status < 500) counts.status4xx += 1;
1080
+ else if (status >= 500 && status < 600) counts.status5xx += 1;
1081
+ else counts.statusOther += 1;
1082
+ }
1083
+ __name(countSuppressed, "countSuppressed");
1084
+ function firstRawHeader(rawHeaders, targetName) {
1085
+ for (let i = 0; i + 1 < rawHeaders.length; i += 2) {
1086
+ if (rawHeaders[i]?.toLowerCase() === targetName) return rawHeaders[i + 1];
1087
+ }
1088
+ return void 0;
1089
+ }
1090
+ __name(firstRawHeader, "firstRawHeader");
1091
+ function truncateUtf8(value, maxBytes) {
1092
+ const bytes = Buffer.from(value, "utf8");
1093
+ if (bytes.length <= maxBytes) return { value };
1094
+ let end = maxBytes;
1095
+ while (end > 0 && (bytes[end] & 192) === 128) end -= 1;
1096
+ return {
1097
+ value: bytes.subarray(0, end).toString("utf8"),
1098
+ originalBytes: bytes.length
1099
+ };
1100
+ }
1101
+ __name(truncateUtf8, "truncateUtf8");
1102
+ function installAccessLogMiddleware(app, daemonLog, monotonicNow = () => performance.now()) {
1103
+ let sealed = false;
1104
+ let tokens = ACCESS_LOG_BURST;
1105
+ let refillBaseline = monotonicNow();
1106
+ let rejectTokens = ACCESS_LOG_REJECT_BURST;
1107
+ let rejectRefillBaseline = refillBaseline;
1108
+ const suppressed = emptySuppressedCounts();
1109
+ const suppressedRejects = emptySuppressedCounts();
1110
+ const refill = /* @__PURE__ */ __name(() => {
1111
+ const now = Math.max(monotonicNow(), refillBaseline);
1112
+ tokens = Math.min(
1113
+ ACCESS_LOG_BURST,
1114
+ tokens + (now - refillBaseline) / 1e3 * ACCESS_LOG_REFILL_PER_SECOND
1115
+ );
1116
+ refillBaseline = now;
1117
+ }, "refill");
1118
+ const refillReject = /* @__PURE__ */ __name(() => {
1119
+ const now = Math.max(monotonicNow(), rejectRefillBaseline);
1120
+ rejectTokens = Math.min(
1121
+ ACCESS_LOG_REJECT_BURST,
1122
+ rejectTokens + (now - rejectRefillBaseline) / 1e3 * ACCESS_LOG_REJECT_REFILL_PER_SECOND
1123
+ );
1124
+ rejectRefillBaseline = now;
1125
+ }, "refillReject");
1126
+ const flushSuppressed = /* @__PURE__ */ __name((counts) => {
1127
+ if (!daemonLog || counts.suppressed === 0) return false;
1128
+ context.with(ROOT_CONTEXT, () => {
1129
+ daemonLog.warn("access logs suppressed", { ...counts });
1130
+ });
1131
+ Object.assign(counts, emptySuppressedCounts());
1132
+ return true;
1133
+ }, "flushSuppressed");
1134
+ const controller = {
1135
+ sealAndFlushSuppressed: /* @__PURE__ */ __name(() => {
1136
+ if (sealed) return;
1137
+ sealed = true;
1138
+ try {
1139
+ flushSuppressed(suppressed);
1140
+ flushSuppressed(suppressedRejects);
1141
+ } catch {
1142
+ }
1143
+ }, "sealAndFlushSuppressed")
1144
+ };
1145
+ app.locals[ACCESS_LOG_CONTROLLER_LOCAL] = controller;
1146
+ if (!daemonLog) return controller;
1147
+ app.use((req, res, next) => {
1148
+ const { method, path: reqPath } = req;
1149
+ if (method === "GET" && reqPath === "/health" || method === "POST" && reqPath.endsWith("/heartbeat")) {
1150
+ return next();
1151
+ }
1152
+ const startMs = monotonicNow();
1153
+ res.on("finish", () => {
1154
+ try {
1155
+ if (sealed) return;
1156
+ const status = res.statusCode;
1157
+ if (method === "GET" && reqPath.endsWith("/events") && status === 200) {
1158
+ return;
1159
+ }
1160
+ refill();
1161
+ refillReject();
1162
+ const isPreAuthReject = Boolean(
1163
+ res.locals?.[ACCESS_LOG_REJECT_LOCAL]
1164
+ );
1165
+ if (isPreAuthReject) {
1166
+ if (suppressedRejects.suppressed > 0 && rejectTokens >= 1) {
1167
+ rejectTokens -= 1;
1168
+ flushSuppressed(suppressedRejects);
1169
+ }
1170
+ if (rejectTokens < 1) {
1171
+ countSuppressed(suppressedRejects, status);
1172
+ return;
1173
+ }
1174
+ rejectTokens -= 1;
1175
+ } else {
1176
+ if (suppressed.suppressed > 0 && tokens >= 1) {
1177
+ tokens -= 1;
1178
+ flushSuppressed(suppressed);
1179
+ }
1180
+ if (tokens < 1) {
1181
+ countSuppressed(suppressed, status);
1182
+ return;
1183
+ }
1184
+ tokens -= 1;
1185
+ }
1186
+ const route = truncateUtf8(`${method} ${reqPath}`, ROUTE_MAX_BYTES);
1187
+ const sessionMatch = reqPath.match(SESSION_ID_RE);
1188
+ const sessionId = sessionMatch?.[1] ? truncateUtf8(sessionMatch[1], SESSION_ID_MAX_BYTES) : void 0;
1189
+ const rawClientId = firstRawHeader(req.rawHeaders, "x-qwen-client-id");
1190
+ const clientId = rawClientId ? truncateUtf8(rawClientId, CLIENT_ID_MAX_BYTES) : void 0;
1191
+ const inboundTraceId = getDaemonTelemetryInboundTraceId(res);
1192
+ const ctx = {
1193
+ route: route.value,
1194
+ ...route.originalBytes ? { routeOriginalBytes: route.originalBytes } : {},
1195
+ ...sessionId ? {
1196
+ sessionId: sessionId.value,
1197
+ ...sessionId.originalBytes ? { sessionIdOriginalBytes: sessionId.originalBytes } : {}
1198
+ } : {},
1199
+ ...clientId ? {
1200
+ clientId: clientId.value,
1201
+ ...clientId.originalBytes ? { clientIdOriginalBytes: clientId.originalBytes } : {}
1202
+ } : {},
1203
+ ...inboundTraceId ? { traceId: inboundTraceId } : {},
1204
+ status,
1205
+ durationMs: Math.max(0, Math.round(monotonicNow() - startMs))
1206
+ };
1207
+ if (status >= 400) daemonLog.warn("request completed", ctx);
1208
+ else daemonLog.info("request completed", ctx);
1209
+ } catch {
1210
+ }
1211
+ });
1212
+ next();
1213
+ });
1214
+ return controller;
1215
+ }
1216
+ __name(installAccessLogMiddleware, "installAccessLogMiddleware");
1217
+
1097
1218
  // packages/cli/src/serve/auth.ts
1098
1219
  init_esbuild_shims();
1220
+ function markPreAuthReject(res) {
1221
+ (res.locals ??= {})[ACCESS_LOG_REJECT_LOCAL] = true;
1222
+ }
1223
+ __name(markPreAuthReject, "markPreAuthReject");
1099
1224
  var denyBrowserOriginCors = /* @__PURE__ */ __name((req, res, next) => {
1100
1225
  if (req.headers.origin) {
1101
1226
  res.setHeader("Vary", "Origin");
1227
+ markPreAuthReject(res);
1102
1228
  res.status(403).json({ error: "Request denied by CORS policy" });
1103
1229
  return;
1104
1230
  }
@@ -1201,6 +1327,7 @@ function allowOriginCors(patterns) {
1201
1327
  }
1202
1328
  if (origin === "null") {
1203
1329
  res.setHeader("Vary", "Origin");
1330
+ markPreAuthReject(res);
1204
1331
  res.status(403).json({ error: "Request denied by CORS policy" });
1205
1332
  return;
1206
1333
  }
@@ -1220,6 +1347,7 @@ function allowOriginCors(patterns) {
1220
1347
  return;
1221
1348
  }
1222
1349
  res.setHeader("Vary", "Origin");
1350
+ markPreAuthReject(res);
1223
1351
  res.status(403).json({ error: "Request denied by CORS policy" });
1224
1352
  };
1225
1353
  }
@@ -1235,6 +1363,7 @@ function hostAllowlist(bind, getPort) {
1235
1363
  const host = (req.headers.host || "").toLowerCase();
1236
1364
  const browserHost = listener.origin === void 0 ? void 0 : new URL(listener.origin).host.toLowerCase();
1237
1365
  if (listener.authority === void 0 || host !== listener.authority && host !== browserHost) {
1366
+ markPreAuthReject(res);
1238
1367
  res.status(403).json({ error: "Invalid Host header" });
1239
1368
  return;
1240
1369
  }
@@ -1272,6 +1401,7 @@ function buildPrimaryHostGate(bind, getPort) {
1272
1401
  const port = getPort();
1273
1402
  const host = (req.headers.host || "").toLowerCase();
1274
1403
  if (!allowedFor(port).has(host)) {
1404
+ markPreAuthReject(res);
1275
1405
  res.status(403).json({ error: "Invalid Host header" });
1276
1406
  return;
1277
1407
  }
@@ -1353,6 +1483,119 @@ function createMutationGate(deps) {
1353
1483
  }
1354
1484
  __name(createMutationGate, "createMutationGate");
1355
1485
 
1486
+ // packages/cli/src/serve/server/self-origin.ts
1487
+ init_esbuild_shims();
1488
+ import { TLSSocket } from "node:tls";
1489
+ function installRemoteSelfOriginMiddleware(app, bind, token) {
1490
+ if (isLoopbackBind(bind) || !token) return;
1491
+ const authenticate = bearerAuth(token);
1492
+ app.use((req, res, next) => {
1493
+ const origin = req.headers.origin;
1494
+ const host = req.headers.host;
1495
+ if (!origin || !host || listenerIdentityOf(req).kind !== "primary") {
1496
+ next();
1497
+ return;
1498
+ }
1499
+ const scheme = req.socket instanceof TLSSocket && req.socket.encrypted ? "https" : "http";
1500
+ let authority = host.toLowerCase();
1501
+ if (scheme === "http" && authority.endsWith(":80"))
1502
+ authority = authority.slice(0, -3);
1503
+ else if (scheme === "https" && authority.endsWith(":443"))
1504
+ authority = authority.slice(0, -4);
1505
+ if (origin !== `${scheme}://${authority}`) {
1506
+ next();
1507
+ return;
1508
+ }
1509
+ try {
1510
+ if (new URL(origin).origin !== origin) {
1511
+ next();
1512
+ return;
1513
+ }
1514
+ } catch {
1515
+ next();
1516
+ return;
1517
+ }
1518
+ (res.locals ??= {})[ACCESS_LOG_REJECT_LOCAL] = true;
1519
+ const allow = /* @__PURE__ */ __name(() => {
1520
+ delete res.locals[ACCESS_LOG_REJECT_LOCAL];
1521
+ delete req.headers.origin;
1522
+ next();
1523
+ }, "allow");
1524
+ if (isPreAuthWebShellRequest(req)) allow();
1525
+ else authenticate(req, res, allow);
1526
+ });
1527
+ }
1528
+ __name(installRemoteSelfOriginMiddleware, "installRemoteSelfOriginMiddleware");
1529
+ function installSelfOriginStripMiddleware(app, getPort, bind) {
1530
+ let cachedStripPort = -1;
1531
+ let cachedSelfOrigins = /* @__PURE__ */ new Set();
1532
+ const boundHost = isLoopbackBind(bind) ? formatHostForAuthority(bind) : void 0;
1533
+ app.use((req, _res, next) => {
1534
+ const origin = req.headers.origin;
1535
+ if (origin) {
1536
+ const port = getPort();
1537
+ if (port !== cachedStripPort) {
1538
+ cachedStripPort = port;
1539
+ cachedSelfOrigins = /* @__PURE__ */ new Set([
1540
+ `http://127.0.0.1:${port}`,
1541
+ `http://localhost:${port}`,
1542
+ `http://[::1]:${port}`,
1543
+ `http://host.docker.internal:${port}`,
1544
+ `https://127.0.0.1:${port}`,
1545
+ `https://localhost:${port}`,
1546
+ `https://[::1]:${port}`,
1547
+ `https://host.docker.internal:${port}`
1548
+ ]);
1549
+ if (boundHost) {
1550
+ cachedSelfOrigins.add(`http://${boundHost}:${port}`);
1551
+ cachedSelfOrigins.add(`https://${boundHost}:${port}`);
1552
+ }
1553
+ if (port === 80) {
1554
+ for (const host of [
1555
+ "127.0.0.1",
1556
+ "localhost",
1557
+ "[::1]",
1558
+ "host.docker.internal"
1559
+ ]) {
1560
+ cachedSelfOrigins.add(`http://${host}`);
1561
+ }
1562
+ if (boundHost) {
1563
+ cachedSelfOrigins.add(`http://${boundHost}`);
1564
+ }
1565
+ } else if (port === 443) {
1566
+ for (const host of [
1567
+ "127.0.0.1",
1568
+ "localhost",
1569
+ "[::1]",
1570
+ "host.docker.internal"
1571
+ ]) {
1572
+ cachedSelfOrigins.add(`https://${host}`);
1573
+ }
1574
+ if (boundHost) {
1575
+ cachedSelfOrigins.add(`https://${boundHost}`);
1576
+ }
1577
+ }
1578
+ }
1579
+ if (cachedSelfOrigins.has(origin)) {
1580
+ delete req.headers.origin;
1581
+ }
1582
+ }
1583
+ next();
1584
+ });
1585
+ }
1586
+ __name(installSelfOriginStripMiddleware, "installSelfOriginStripMiddleware");
1587
+
1588
+ // packages/cli/src/serve/acp-child-extra-args.ts
1589
+ init_esbuild_shims();
1590
+ function acpChildExtraArgs(opts) {
1591
+ const extraArgs = [
1592
+ ...opts.experimentalLsp === true ? ["--experimental-lsp"] : [],
1593
+ ...opts.restoreAskUserQuestion === true ? ["--restore-ask-user-question"] : []
1594
+ ];
1595
+ return extraArgs.length > 0 ? extraArgs : void 0;
1596
+ }
1597
+ __name(acpChildExtraArgs, "acpChildExtraArgs");
1598
+
1356
1599
  // packages/cli/src/serve/acp-http/client-mcp-sender-registry.ts
1357
1600
  init_esbuild_shims();
1358
1601
  var ClientMcpSenderRegistry = class {
@@ -1645,6 +1888,7 @@ var SERVE_CAPABILITY_REGISTRY = {
1645
1888
  session_events: { since: "v1" },
1646
1889
  session_artifacts: { since: "v1" },
1647
1890
  session_artifacts_persistence: { since: "v1" },
1891
+ session_sources: { since: "v1" },
1648
1892
  // Daemon emits `slow_client_warning` synthetic frames at 75% queue
1649
1893
  // fill and honors `?maxQueued=N` (range [16, 2048]) on
1650
1894
  // `GET /session/:id/events`. Old daemons silently lack both — SDK
@@ -1791,6 +2035,11 @@ var SERVE_CAPABILITY_REGISTRY = {
1791
2035
  // operation after the activation operation commits.
1792
2036
  extension_activation_explicit_refresh: { since: "v1" },
1793
2037
  workspace_skill_manage: { since: "v1" },
2038
+ // `GET /brand` — the Web Shell's product name and logo, resolved from the
2039
+ // operator settings scopes. Unconditional because the route is registered
2040
+ // unconditionally. Advertised so a host can preflight rather than issue the
2041
+ // request and swallow a 404 from a daemon too old to have it.
2042
+ web_shell_brand: { since: "v1" },
1794
2043
  workspace_settings: { since: "v1" },
1795
2044
  // `GET /workspace/permissions` is always available when this tag is
1796
2045
  // advertised. `POST /workspace/permissions` updates the active ACP
@@ -2121,6 +2370,10 @@ var CONDITIONAL_SERVE_FEATURES = /* @__PURE__ */ new Map([
2121
2370
  "session_artifacts_persistence",
2122
2371
  (toggles) => toggles.sessionArtifactsPersistenceAvailable === true
2123
2372
  ],
2373
+ [
2374
+ "session_sources",
2375
+ (toggles) => toggles.sessionArtifactsPersistenceAvailable === true
2376
+ ],
2124
2377
  [
2125
2378
  "session_generation",
2126
2379
  (toggles) => toggles.sessionGenerationAvailable === true
@@ -3604,6 +3857,8 @@ async function buildDaemonStatusResponse(detail, input) {
3604
3857
  sessionShellCommandEnabled: input.sessionShellCommandEnabled
3605
3858
  },
3606
3859
  limits: {
3860
+ maxRegisteredWorkspaces: input.opts.maxRegisteredWorkspaces ?? MAX_REGISTERED_WORKSPACES,
3861
+ ...input.maxChannelControlWorkspaces !== void 0 ? { maxChannelControlWorkspaces: input.maxChannelControlWorkspaces } : {},
3607
3862
  maxSessions: bridgeSnapshot.limits.maxSessions,
3608
3863
  maxTotalSessions: positiveFiniteOrNull(input.opts.maxTotalSessions),
3609
3864
  maxPendingPromptsPerSession: bridgeSnapshot.limits.maxPendingPromptsPerSession,
@@ -4312,161 +4567,92 @@ var WorkspaceVoiceCoordinator = class {
4312
4567
  }
4313
4568
  };
4314
4569
 
4315
- // packages/cli/src/serve/server/access-log.ts
4316
- init_esbuild_shims();
4317
- init_esm();
4318
- import { performance } from "node:perf_hooks";
4319
-
4320
- // packages/cli/src/serve/server/telemetry-context.ts
4570
+ // packages/cli/src/serve/local-control/lan-interfaces.ts
4321
4571
  init_esbuild_shims();
4322
- var daemonTelemetryResponseContext = Symbol(
4323
- "daemonTelemetryResponseContext"
4324
- );
4325
- var daemonInboundTraceIdContext = Symbol(
4326
- "daemonInboundTraceIdContext"
4327
- );
4328
- function getDaemonTelemetryInboundTraceId(res) {
4329
- try {
4330
- return res[daemonInboundTraceIdContext];
4331
- } catch {
4332
- return void 0;
4572
+ import { networkInterfaces } from "node:os";
4573
+ function isLanIpv4(address) {
4574
+ const octets = address.split(".").map((part) => Number(part));
4575
+ if (octets.length !== 4 || octets.some((o) => !Number.isInteger(o))) {
4576
+ return false;
4333
4577
  }
4578
+ const [a, b] = octets;
4579
+ if (a === 10) return true;
4580
+ if (a === 172 && b >= 16 && b <= 31) return true;
4581
+ if (a === 192 && b === 168) return true;
4582
+ if (a === 169 && b === 254) return true;
4583
+ return false;
4334
4584
  }
4335
- __name(getDaemonTelemetryInboundTraceId, "getDaemonTelemetryInboundTraceId");
4336
-
4337
- // packages/cli/src/serve/server/access-log.ts
4338
- var SESSION_ID_RE = /\/session\/([^/]+)/;
4339
- var ACCESS_LOG_BURST = 60;
4340
- var ACCESS_LOG_REFILL_PER_SECOND = 2;
4341
- var ROUTE_MAX_BYTES = 2 * 1024;
4342
- var SESSION_ID_MAX_BYTES = 256;
4343
- var CLIENT_ID_MAX_BYTES = 256;
4344
- var ACCESS_LOG_CONTROLLER_LOCAL = "accessLogController";
4345
- function emptySuppressedCounts() {
4346
- return {
4347
- suppressed: 0,
4348
- status2xx: 0,
4349
- status3xx: 0,
4350
- status4xx: 0,
4351
- status5xx: 0,
4352
- statusOther: 0
4353
- };
4354
- }
4355
- __name(emptySuppressedCounts, "emptySuppressedCounts");
4356
- function countSuppressed(counts, status) {
4357
- counts.suppressed += 1;
4358
- if (status >= 200 && status < 300) counts.status2xx += 1;
4359
- else if (status >= 300 && status < 400) counts.status3xx += 1;
4360
- else if (status >= 400 && status < 500) counts.status4xx += 1;
4361
- else if (status >= 500 && status < 600) counts.status5xx += 1;
4362
- else counts.statusOther += 1;
4585
+ __name(isLanIpv4, "isLanIpv4");
4586
+ function isSoftwareNetwork(interfaceName) {
4587
+ if (/vpn/i.test(interfaceName)) return true;
4588
+ return /(^|[\s_.-])(utun|tun|tap|ppp|ipsec|wg|wireguard|tailscale|zerotier|zt[a-z0-9]*|hamachi|nordlynx|proton|wintun|docker|veth[0-9a-f]+|vmnet|vboxnet|vethernet|virtualbox|host[- ]only|podman|cni|lxcbr|lxdbr|flannel|virbr|br-[0-9a-f]+|bridge\d|anyconnect|globalprotect|pulse[\s-]secure|forticlient|fortinet|ivanti|cisco[\s_-]secure|citrix|sonicwall|cloudflare)(\d|[\s_.-]|$)/i.test(
4589
+ interfaceName
4590
+ );
4363
4591
  }
4364
- __name(countSuppressed, "countSuppressed");
4365
- function firstRawHeader(rawHeaders, targetName) {
4366
- for (let i = 0; i + 1 < rawHeaders.length; i += 2) {
4367
- if (rawHeaders[i]?.toLowerCase() === targetName) return rawHeaders[i + 1];
4592
+ __name(isSoftwareNetwork, "isSoftwareNetwork");
4593
+ function listLanCandidates(interfaces = networkInterfaces()) {
4594
+ const candidates = [];
4595
+ for (const [interfaceName, addresses] of Object.entries(interfaces).sort()) {
4596
+ if (isSoftwareNetwork(interfaceName)) continue;
4597
+ for (const address of addresses ?? []) {
4598
+ if (address.family !== "IPv4" || address.internal) continue;
4599
+ if (!isLanIpv4(address.address)) continue;
4600
+ candidates.push({ interfaceName, address: address.address });
4601
+ }
4368
4602
  }
4369
- return void 0;
4603
+ return candidates;
4370
4604
  }
4371
- __name(firstRawHeader, "firstRawHeader");
4372
- function truncateUtf8(value, maxBytes) {
4373
- const bytes = Buffer.from(value, "utf8");
4374
- if (bytes.length <= maxBytes) return { value };
4375
- let end = maxBytes;
4376
- while (end > 0 && (bytes[end] & 192) === 128) end -= 1;
4377
- return {
4378
- value: bytes.subarray(0, end).toString("utf8"),
4379
- originalBytes: bytes.length
4380
- };
4381
- }
4382
- __name(truncateUtf8, "truncateUtf8");
4383
- function installAccessLogMiddleware(app, daemonLog, monotonicNow = () => performance.now()) {
4384
- let sealed = false;
4385
- let tokens = ACCESS_LOG_BURST;
4386
- let refillBaseline = monotonicNow();
4387
- let suppressed = emptySuppressedCounts();
4388
- const refill = /* @__PURE__ */ __name(() => {
4389
- const now = Math.max(monotonicNow(), refillBaseline);
4390
- tokens = Math.min(
4391
- ACCESS_LOG_BURST,
4392
- tokens + (now - refillBaseline) / 1e3 * ACCESS_LOG_REFILL_PER_SECOND
4605
+ __name(listLanCandidates, "listLanCandidates");
4606
+ var NoLanInterfaceError = class extends Error {
4607
+ static {
4608
+ __name(this, "NoLanInterfaceError");
4609
+ }
4610
+ code = "no_lan_interface";
4611
+ constructor() {
4612
+ super(
4613
+ "No private IPv4 address is available. Local Control needs the host to be on a local network (Wi-Fi or Ethernet)."
4393
4614
  );
4394
- refillBaseline = now;
4395
- }, "refill");
4396
- const flushSuppressed = /* @__PURE__ */ __name(() => {
4397
- if (!daemonLog || suppressed.suppressed === 0) return false;
4398
- context.with(ROOT_CONTEXT, () => {
4399
- daemonLog.warn("access logs suppressed", suppressed);
4400
- });
4401
- suppressed = emptySuppressedCounts();
4402
- return true;
4403
- }, "flushSuppressed");
4404
- const controller = {
4405
- sealAndFlushSuppressed: /* @__PURE__ */ __name(() => {
4406
- if (sealed) return;
4407
- sealed = true;
4408
- try {
4409
- flushSuppressed();
4410
- } catch {
4411
- }
4412
- }, "sealAndFlushSuppressed")
4413
- };
4414
- app.locals[ACCESS_LOG_CONTROLLER_LOCAL] = controller;
4415
- if (!daemonLog) return controller;
4416
- app.use((req, res, next) => {
4417
- const { method, path: reqPath } = req;
4418
- if (method === "GET" && reqPath === "/health" || method === "POST" && reqPath.endsWith("/heartbeat")) {
4419
- return next();
4420
- }
4421
- const startMs = monotonicNow();
4422
- res.on("finish", () => {
4423
- try {
4424
- if (sealed) return;
4425
- const status = res.statusCode;
4426
- if (method === "GET" && reqPath.endsWith("/events") && status === 200) {
4427
- return;
4428
- }
4429
- refill();
4430
- if (suppressed.suppressed > 0 && tokens >= 1) {
4431
- tokens -= 1;
4432
- flushSuppressed();
4433
- }
4434
- if (tokens < 1) {
4435
- countSuppressed(suppressed, status);
4436
- return;
4437
- }
4438
- tokens -= 1;
4439
- const route = truncateUtf8(`${method} ${reqPath}`, ROUTE_MAX_BYTES);
4440
- const sessionMatch = reqPath.match(SESSION_ID_RE);
4441
- const sessionId = sessionMatch?.[1] ? truncateUtf8(sessionMatch[1], SESSION_ID_MAX_BYTES) : void 0;
4442
- const rawClientId = firstRawHeader(req.rawHeaders, "x-qwen-client-id");
4443
- const clientId = rawClientId ? truncateUtf8(rawClientId, CLIENT_ID_MAX_BYTES) : void 0;
4444
- const inboundTraceId = getDaemonTelemetryInboundTraceId(res);
4445
- const ctx = {
4446
- route: route.value,
4447
- ...route.originalBytes ? { routeOriginalBytes: route.originalBytes } : {},
4448
- ...sessionId ? {
4449
- sessionId: sessionId.value,
4450
- ...sessionId.originalBytes ? { sessionIdOriginalBytes: sessionId.originalBytes } : {}
4451
- } : {},
4452
- ...clientId ? {
4453
- clientId: clientId.value,
4454
- ...clientId.originalBytes ? { clientIdOriginalBytes: clientId.originalBytes } : {}
4455
- } : {},
4456
- ...inboundTraceId ? { traceId: inboundTraceId } : {},
4457
- status,
4458
- durationMs: Math.max(0, Math.round(monotonicNow() - startMs))
4459
- };
4460
- if (status >= 400) daemonLog.warn("request completed", ctx);
4461
- else daemonLog.info("request completed", ctx);
4462
- } catch {
4463
- }
4464
- });
4465
- next();
4466
- });
4467
- return controller;
4615
+ this.name = "NoLanInterfaceError";
4616
+ }
4617
+ };
4618
+ var AmbiguousLanInterfaceError = class extends Error {
4619
+ static {
4620
+ __name(this, "AmbiguousLanInterfaceError");
4621
+ }
4622
+ code = "ambiguous_lan_interface";
4623
+ candidates;
4624
+ constructor(candidates) {
4625
+ super(
4626
+ "Multiple local networks are available; choose which one to expose: " + candidates.map((c) => `${c.interfaceName} (${c.address})`).join(", ")
4627
+ );
4628
+ this.name = "AmbiguousLanInterfaceError";
4629
+ this.candidates = candidates;
4630
+ }
4631
+ };
4632
+ var UnknownLanInterfaceError = class extends Error {
4633
+ static {
4634
+ __name(this, "UnknownLanInterfaceError");
4635
+ }
4636
+ code = "unknown_lan_interface";
4637
+ constructor(requested) {
4638
+ super(
4639
+ `${requested} is not a private IPv4 address on this host right now. The network may have changed since the list was fetched.`
4640
+ );
4641
+ this.name = "UnknownLanInterfaceError";
4642
+ }
4643
+ };
4644
+ function selectLanAddress(preferredAddress, interfaces = networkInterfaces()) {
4645
+ const candidates = listLanCandidates(interfaces);
4646
+ if (candidates.length === 0) throw new NoLanInterfaceError();
4647
+ if (preferredAddress !== void 0) {
4648
+ const match = candidates.find((c) => c.address === preferredAddress);
4649
+ if (!match) throw new UnknownLanInterfaceError(preferredAddress);
4650
+ return match;
4651
+ }
4652
+ if (candidates.length > 1) throw new AmbiguousLanInterfaceError(candidates);
4653
+ return candidates[0];
4468
4654
  }
4469
- __name(installAccessLogMiddleware, "installAccessLogMiddleware");
4655
+ __name(selectLanAddress, "selectLanAddress");
4470
4656
 
4471
4657
  export {
4472
4658
  sanitizeForStderr,
@@ -4481,13 +4667,15 @@ export {
4481
4667
  createBridgeFileSystemAdapter,
4482
4668
  PathMutexRegistry,
4483
4669
  isDeepHealthQuery,
4484
- installSelfOriginStripMiddleware,
4485
- acpChildExtraArgs,
4486
4670
  CredentialStore,
4487
4671
  singleTokenCredentials,
4488
4672
  tagListener,
4489
4673
  listenerIdentityOf,
4490
4674
  listenerIdentityOfSocket,
4675
+ daemonTelemetryResponseContext,
4676
+ daemonInboundTraceIdContext,
4677
+ ACCESS_LOG_CONTROLLER_LOCAL,
4678
+ installAccessLogMiddleware,
4491
4679
  denyBrowserOriginCors,
4492
4680
  parseAllowOriginPatterns,
4493
4681
  findNonLoopbackHttpOrigin,
@@ -4498,6 +4686,15 @@ export {
4498
4686
  isTrustedLoopbackMode,
4499
4687
  requestHasOperatorAuthority,
4500
4688
  createMutationGate,
4689
+ installRemoteSelfOriginMiddleware,
4690
+ installSelfOriginStripMiddleware,
4691
+ isSoftwareNetwork,
4692
+ listLanCandidates,
4693
+ NoLanInterfaceError,
4694
+ AmbiguousLanInterfaceError,
4695
+ UnknownLanInterfaceError,
4696
+ selectLanAddress,
4697
+ acpChildExtraArgs,
4501
4698
  ClientMcpSenderRegistry,
4502
4699
  createClientMcpServerProvider,
4503
4700
  SERVE_CAPABILITY_REGISTRY,
@@ -4539,11 +4736,7 @@ export {
4539
4736
  isBrowserAutomationMcpAvailable,
4540
4737
  MAX_CONCURRENT_VOICE_SESSIONS,
4541
4738
  VoiceLeaseAbortError,
4542
- WorkspaceVoiceCoordinator,
4543
- daemonTelemetryResponseContext,
4544
- daemonInboundTraceIdContext,
4545
- ACCESS_LOG_CONTROLLER_LOCAL,
4546
- installAccessLogMiddleware
4739
+ WorkspaceVoiceCoordinator
4547
4740
  };
4548
4741
  /**
4549
4742
  * @license