@qwen-code/qwen-code 0.21.14 → 0.21.15

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 (318) hide show
  1. package/bundled/qc-helper/docs/features/channels/dingtalk.md +1 -1
  2. package/bundled/qc-helper/docs/features/code-review.md +20 -2
  3. package/bundled/qc-helper/docs/qwen-serve.md +1 -1
  4. package/bundled/review/SKILL.md +66 -36
  5. package/chunks/{MaxSizedBox-67IDQILY.js → MaxSizedBox-E7CUU3UN.js} +43 -43
  6. package/chunks/{StandaloneSessionPicker-G4QJIRMH.js → StandaloneSessionPicker-XYUB75AQ.js} +63 -63
  7. package/chunks/{acp-startup-profiler-HUYGO57H.js → acp-startup-profiler-DDVSJKJK.js} +2 -2
  8. package/chunks/{acpAgent-BS3YYO33.js → acpAgent-5QZS4VMN.js} +507 -176
  9. package/chunks/{agent-EHHEXKWN.js → agent-242BTA6Q.js} +40 -40
  10. package/chunks/{agent-headless-UT2ZF76T.js → agent-headless-4BF7W4TJ.js} +40 -40
  11. package/chunks/{anthropicContentGenerator-M7XRJMSK.js → anthropicContentGenerator-CU3G53RX.js} +7 -7
  12. package/chunks/{artifact-tool-GEXTOPVO.js → artifact-tool-LIUSI4XK.js} +3 -3
  13. package/chunks/{askUserQuestion-B33XRSB7.js → askUserQuestion-454X3UIV.js} +3 -3
  14. package/chunks/{bridge-WQ4IL2RF.js → bridge-MG4F5NOH.js} +46 -45
  15. package/chunks/{channel-management-service-X6LCQUAD.js → channel-management-service-KHPAWCX7.js} +1 -1
  16. package/chunks/{channel-settings-store-ZDFXY7VY.js → channel-settings-store-GQUCL2YM.js} +47 -47
  17. package/chunks/{channel-worker-group-TJ35JDPE.js → channel-worker-group-IN2UPYHP.js} +6 -5
  18. package/chunks/{channel-worker-manager-G5LKWGOG.js → channel-worker-manager-4CQPHVD4.js} +6 -5
  19. package/chunks/{channel-worker-supervisor-OEVWBHGT.js → channel-worker-supervisor-CPPSL7ZH.js} +4 -3
  20. package/chunks/{chunk-3EZLLVDF.js → chunk-263JC66E.js} +3 -3
  21. package/chunks/{chunk-OO4FKHLO.js → chunk-2GM44E7D.js} +10 -298
  22. package/chunks/{chunk-LSO6EL4Y.js → chunk-2MDUS4XE.js} +2 -2
  23. package/chunks/{chunk-WGHHA7ZH.js → chunk-3C55EUJX.js} +1 -1
  24. package/chunks/{chunk-47L5MLB5.js → chunk-3EAGKRLN.js} +5 -5
  25. package/chunks/{chunk-WPVUOVYX.js → chunk-3EQHT3IC.js} +2 -2
  26. package/chunks/{chunk-OEZCXK7Y.js → chunk-3JZ2AZC6.js} +4 -4
  27. package/chunks/{chunk-PCETXVVV.js → chunk-3X6KVX37.js} +1 -1
  28. package/chunks/{chunk-J63PKMYA.js → chunk-435GZDTF.js} +2 -2
  29. package/chunks/{chunk-I3N2Z25H.js → chunk-47VTGCYK.js} +3 -3
  30. package/chunks/{chunk-3PWNVF6N.js → chunk-4APB4SP2.js} +1 -1
  31. package/chunks/{chunk-MA2HEDVP.js → chunk-4CKU5K2R.js} +1 -1
  32. package/chunks/{chunk-OJB5FYVK.js → chunk-4IOBHNV2.js} +1 -1
  33. package/chunks/{chunk-MIPFDQAF.js → chunk-4W4BROUS.js} +1 -1
  34. package/chunks/{chunk-ZIGC3MUS.js → chunk-55P2ESI6.js} +1 -1
  35. package/chunks/{chunk-CHHABXPE.js → chunk-5AAW6E3C.js} +1 -1
  36. package/chunks/{chunk-J6YS7Z25.js → chunk-5I2U4PDY.js} +12 -12
  37. package/chunks/{chunk-NWNEANAT.js → chunk-5M7YKTYX.js} +6 -6
  38. package/chunks/{chunk-RXHBTKMG.js → chunk-5MA4E4EG.js} +3 -3
  39. package/chunks/{chunk-CEXU72GE.js → chunk-5NAJDTVP.js} +3 -3
  40. package/chunks/{chunk-U657UZJN.js → chunk-5WEMSDPR.js} +5 -5
  41. package/chunks/{chunk-73JUK3ZW.js → chunk-63AIQ2IZ.js} +96 -15
  42. package/chunks/{chunk-E5WQMF3K.js → chunk-67L6PVD6.js} +2 -2
  43. package/chunks/{chunk-CZK622ZK.js → chunk-6IFWBM24.js} +3 -3
  44. package/chunks/{chunk-CPHEPGAO.js → chunk-722JBVVW.js} +1 -1
  45. package/chunks/chunk-7NLDU6J2.js +367 -0
  46. package/chunks/{chunk-AKBOLMUF.js → chunk-7S22SX2L.js} +2 -2
  47. package/chunks/{chunk-SCZU65AI.js → chunk-7VRNXKKK.js} +8 -8
  48. package/chunks/{chunk-XUJNK7Y6.js → chunk-7WVB4FMG.js} +1 -1
  49. package/chunks/{chunk-55VKMB7X.js → chunk-A7MIUCUQ.js} +6 -6
  50. package/chunks/{chunk-NVRMCWTP.js → chunk-A7NBZBGQ.js} +3 -3
  51. package/chunks/{chunk-N6RSOOWJ.js → chunk-AAG7I5CR.js} +7 -7
  52. package/chunks/{chunk-EOPBFLA5.js → chunk-AKN26LMT.js} +3 -3
  53. package/chunks/{chunk-UC67T4SF.js → chunk-AQFWV4YF.js} +2 -1
  54. package/chunks/{chunk-DVR7XKO5.js → chunk-B5LEKTE7.js} +2 -2
  55. package/chunks/{chunk-V6WEMZPD.js → chunk-B72KNVKO.js} +3 -3
  56. package/chunks/{chunk-544KT7X4.js → chunk-BBMVUTXO.js} +1 -1
  57. package/chunks/{chunk-DHUPMYMC.js → chunk-BORX4PBQ.js} +12 -12
  58. package/chunks/{chunk-5IJSFWQO.js → chunk-BUZESYJT.js} +4 -4
  59. package/chunks/{chunk-Y4RVDOXV.js → chunk-DF7KFKCL.js} +4 -4
  60. package/chunks/{chunk-K2Y45XXS.js → chunk-DFOKBPH5.js} +108 -26
  61. package/chunks/{chunk-3SL2P3WX.js → chunk-DIHJXVT4.js} +1 -1
  62. package/chunks/{chunk-WAO53ZQF.js → chunk-DITDNF3D.js} +22 -2
  63. package/chunks/{chunk-2A6VQJYK.js → chunk-DK4HL3IB.js} +7 -7
  64. package/chunks/{chunk-6BJSYAML.js → chunk-DPXZUGDQ.js} +46 -21
  65. package/chunks/{chunk-MVHJZ3FZ.js → chunk-DZNQHKZZ.js} +2 -2
  66. package/chunks/{chunk-SNQZZ765.js → chunk-EB27VF5Z.js} +2 -2
  67. package/chunks/{chunk-KC4WMLZO.js → chunk-EXY6APEA.js} +81 -50
  68. package/chunks/{chunk-7VNHO4MN.js → chunk-F3FRTY4Q.js} +16 -7
  69. package/chunks/{chunk-FS5NGKWC.js → chunk-F5JZDC4O.js} +3 -3
  70. package/chunks/{chunk-6QFDQMQX.js → chunk-F7ZK5VMA.js} +1 -1
  71. package/chunks/{chunk-2B2BF7P7.js → chunk-FAIJ5UIU.js} +3 -3
  72. package/chunks/{chunk-G6KI5UOJ.js → chunk-FQ6G527Y.js} +3 -3
  73. package/chunks/{chunk-WSSH2BNO.js → chunk-FQZBD3PY.js} +1 -1
  74. package/chunks/{chunk-OVY67CYC.js → chunk-G32ESUUC.js} +1 -1
  75. package/chunks/{chunk-OBJYN4MX.js → chunk-G64PEZZ5.js} +2 -2
  76. package/chunks/{chunk-QRVHGEVY.js → chunk-GCWILQKA.js} +3 -3
  77. package/chunks/{chunk-QUGAUQGJ.js → chunk-GX2THELY.js} +1 -0
  78. package/chunks/{chunk-L3T4V5GZ.js → chunk-GYVB4P5B.js} +721 -331
  79. package/chunks/{chunk-FAAUPSY2.js → chunk-HEMFCAHG.js} +1 -1
  80. package/chunks/{chunk-AZQ3DT76.js → chunk-HGGMEDDY.js} +2 -2
  81. package/chunks/{chunk-SG7ZP5PG.js → chunk-HHNSO2Y4.js} +4 -4
  82. package/chunks/{chunk-YHXQK4SR.js → chunk-HSCPOEBL.js} +3 -3
  83. package/chunks/{chunk-H3SHU2XU.js → chunk-I3AB5DOZ.js} +3 -3
  84. package/chunks/{chunk-SFJMFZT5.js → chunk-IBUXQJHH.js} +1 -1
  85. package/chunks/{chunk-FN6M5WUL.js → chunk-IFOR6I5C.js} +4 -4
  86. package/chunks/{chunk-PHN4R2ZV.js → chunk-IU2XWUSI.js} +1 -1
  87. package/chunks/{chunk-OJOP26ET.js → chunk-J2LZ5OCH.js} +3 -3
  88. package/chunks/{chunk-4ZMS3JCR.js → chunk-JBSW7JA6.js} +83 -4
  89. package/chunks/{chunk-QAVTWAHL.js → chunk-JIR6JDGE.js} +3 -3
  90. package/chunks/{chunk-UGK4K2N2.js → chunk-JS73NNWF.js} +8 -0
  91. package/chunks/{chunk-2M55OBEB.js → chunk-JV443R5X.js} +1 -1
  92. package/chunks/{chunk-QEHH23OM.js → chunk-K6GQS2WN.js} +1 -1
  93. package/chunks/{chunk-6LAPGPVA.js → chunk-KCUGOZPL.js} +2 -2
  94. package/chunks/{chunk-KV27IEHM.js → chunk-L5JHSPET.js} +1 -1
  95. package/chunks/{chunk-OFTPCOGR.js → chunk-L7RG5PVT.js} +2902 -1393
  96. package/chunks/{chunk-TSMPNGBC.js → chunk-LBQBFRFN.js} +2 -2
  97. package/chunks/chunk-LJZSMWOH.js +18 -0
  98. package/chunks/{chunk-IA2K2HJE.js → chunk-M53UJS6H.js} +2 -2
  99. package/chunks/{chunk-KBXKR5R2.js → chunk-M5AIO24H.js} +1 -1
  100. package/chunks/{chunk-ROIYNTHJ.js → chunk-MD7XDTW7.js} +3 -3
  101. package/chunks/{chunk-3PWCMXIR.js → chunk-MGEWDLRO.js} +1 -1
  102. package/chunks/{chunk-4ZS3BLER.js → chunk-NAGJPIPW.js} +22 -7
  103. package/chunks/{chunk-3YRVPHT3.js → chunk-NCTHX2Z3.js} +14 -14
  104. package/chunks/{chunk-YP5KH5Y7.js → chunk-ND7NOI4P.js} +1 -1
  105. package/chunks/{chunk-4W5U2TUT.js → chunk-NGY7B7VF.js} +1 -1
  106. package/chunks/{chunk-S7N3HUIB.js → chunk-NMSSH43P.js} +6 -6
  107. package/chunks/{chunk-UYDGFWIJ.js → chunk-NYN4RD3K.js} +66 -7
  108. package/chunks/{chunk-DGJ7O55J.js → chunk-O327G3QW.js} +3 -3
  109. package/chunks/{chunk-2C6HJMG3.js → chunk-O75QDGQF.js} +3 -3
  110. package/chunks/{chunk-SFTKAX4O.js → chunk-OFJ6OFIT.js} +1 -1
  111. package/chunks/{chunk-6HY6IF3Z.js → chunk-OUYRA764.js} +1 -1
  112. package/chunks/{chunk-OEYAK5O6.js → chunk-OVS33JJM.js} +5 -5
  113. package/chunks/{chunk-VFP5YOHJ.js → chunk-PRIX4D6T.js} +6 -6
  114. package/chunks/{chunk-H4A72DE5.js → chunk-PTMVPFCZ.js} +1 -1
  115. package/chunks/{chunk-W7EYJGN7.js → chunk-PWQPWISR.js} +8 -8
  116. package/chunks/{chunk-QFJ5JHQR.js → chunk-PXOIRYE5.js} +1 -1
  117. package/chunks/{chunk-4SR45OM4.js → chunk-Q5QDZXKL.js} +1 -1
  118. package/chunks/{chunk-YECDICIO.js → chunk-Q6ETBOWF.js} +1 -1
  119. package/chunks/{chunk-WP4WIUOJ.js → chunk-QQUVPMMZ.js} +2 -2
  120. package/chunks/{chunk-C3T6M24E.js → chunk-RLYXWNS3.js} +3 -3
  121. package/chunks/{chunk-XT4RKHVE.js → chunk-RZ4PE3ER.js} +512 -24
  122. package/chunks/{chunk-6RDZLBSJ.js → chunk-SGKUVDBX.js} +80 -44
  123. package/chunks/{chunk-YZHRN3CF.js → chunk-SWOKDPS5.js} +2 -2
  124. package/chunks/{chunk-SLILKYV2.js → chunk-T2LUUKRI.js} +3 -3
  125. package/chunks/{chunk-5CVO7YES.js → chunk-U4GL4WDY.js} +1 -1
  126. package/chunks/{chunk-QEJZUXSK.js → chunk-U53XZHAE.js} +1 -1
  127. package/chunks/{chunk-XYRBK56E.js → chunk-U7U3CX4K.js} +3353 -1306
  128. package/chunks/{chunk-HIBNSEJE.js → chunk-UDG5EZJI.js} +0 -2
  129. package/chunks/{chunk-BQWNIPTE.js → chunk-V4UBYT3Y.js} +1 -1
  130. package/chunks/{chunk-XITLNXLX.js → chunk-VWS7DWY6.js} +3 -3
  131. package/chunks/{chunk-PT4I7NBA.js → chunk-VX7TFATF.js} +1 -1
  132. package/chunks/{chunk-VTOLYFWM.js → chunk-W3M6P3UR.js} +2 -2
  133. package/chunks/{chunk-CH5OFRV7.js → chunk-W4MLKRZD.js} +3 -3
  134. package/chunks/chunk-W5YD3QRT.js +367 -0
  135. package/chunks/{chunk-5IYS4WWR.js → chunk-WAPL2PHU.js} +1 -1
  136. package/chunks/{chunk-NRPXRNN4.js → chunk-WXFFCRKG.js} +1 -1
  137. package/chunks/{chunk-E3DYKPYZ.js → chunk-X7EQHW5L.js} +3 -3
  138. package/chunks/{chunk-BUQDLC2G.js → chunk-XFRYCCVC.js} +3 -3
  139. package/chunks/{chunk-DRAONPUW.js → chunk-XZ3J6E5Z.js} +2 -2
  140. package/chunks/{chunk-P3AA6S7O.js → chunk-Y7JGWFTK.js} +1 -1
  141. package/chunks/{chunk-SXCOEJO4.js → chunk-YLFFVY3G.js} +1 -1
  142. package/chunks/{chunk-YZOSNW4R.js → chunk-YO7PNVBJ.js} +1 -1
  143. package/chunks/{chunk-MDIGJH5X.js → chunk-ZL3HKVEQ.js} +4 -4
  144. package/chunks/{chunk-Y7QY6DKW.js → chunk-ZTLSYXFY.js} +4 -4
  145. package/chunks/{chunk-RWDNJBWN.js → chunk-ZUISK67X.js} +2 -2
  146. package/chunks/{chunk-PJSD2FOR.js → chunk-ZVJ5R5LM.js} +33 -33
  147. package/chunks/{chunk-XLLKYULU.js → chunk-ZWWU6KNS.js} +2 -2
  148. package/chunks/{computer-use-YORZJQE5.js → computer-use-34X5XJMV.js} +40 -40
  149. package/chunks/{config-utils-NJQA5YLJ.js → config-utils-XJTGZVY3.js} +2 -2
  150. package/chunks/{contextCommand-PACHGIF4.js → contextCommand-Q54VMGPA.js} +42 -42
  151. package/chunks/{core-runtime-6HD5DSPX.js → core-runtime-TIWTFHOR.js} +45 -44
  152. package/chunks/{create-sub-session-IQFIPUQA.js → create-sub-session-DPEBT657.js} +40 -40
  153. package/chunks/{create-sub-session-KRQULJE6.js → create-sub-session-TCKWBXEM.js} +6 -4
  154. package/chunks/{cron-create-NFRZEOQX.js → cron-create-PUCRMWQ6.js} +5 -5
  155. package/chunks/{cron-delete-GFVSVO7C.js → cron-delete-EOQR5CXU.js} +5 -5
  156. package/chunks/{cron-list-NRW34CLU.js → cron-list-7O22SQBF.js} +5 -5
  157. package/chunks/{daemon-XH76IXOC.js → daemon-JE2UIWSY.js} +304 -160
  158. package/chunks/{daemon-git-worktree-guard-6P27GKSU.js → daemon-git-worktree-guard-XSZ3362V.js} +40 -40
  159. package/chunks/daemon-status-provider-JBEST4SF.js +104 -0
  160. package/chunks/{daemon-trust-policy-5QJHAS3N.js → daemon-trust-policy-S6LBG4WN.js} +46 -46
  161. package/chunks/{daemon-trust-policy-monitor-JA2WZRZ3.js → daemon-trust-policy-monitor-NFO3OIBN.js} +46 -46
  162. package/chunks/{deferred-core-runtime-R2VWOVG3.js → deferred-core-runtime-Z2TLD2L7.js} +40 -40
  163. package/chunks/{display-image-ON3EYFRD.js → display-image-6FCICTXS.js} +5 -5
  164. package/chunks/{dist-IYYN3RUT.js → dist-IELOWDOT.js} +81 -17
  165. package/chunks/{earlyInputCapture-PQEEOFKJ.js → earlyInputCapture-KCZDAQWY.js} +41 -41
  166. package/chunks/{edit-RASZHTU2.js → edit-3UADXGNC.js} +41 -41
  167. package/chunks/{enter-worktree-CH5OMHJE.js → enter-worktree-J66YDAJE.js} +40 -40
  168. package/chunks/{enterPlanMode-AQKR3CAH.js → enterPlanMode-YUZUKY5F.js} +40 -40
  169. package/chunks/{environment-7QRYIEBA.js → environment-6IEK2353.js} +42 -42
  170. package/chunks/{errors-P2LL5452.js → errors-RVLRX7XI.js} +42 -42
  171. package/chunks/{exit-worktree-WUDL26CY.js → exit-worktree-SNMPATZE.js} +40 -40
  172. package/chunks/{exitPlanMode-JM75SAUI.js → exitPlanMode-DP4TURUC.js} +40 -40
  173. package/chunks/{fast-path-KVNSOHVA.js → fast-path-5CC6RKES.js} +2 -2
  174. package/chunks/{gemini-ADMD2EOS.js → gemini-F64ZP4SG.js} +83 -82
  175. package/chunks/{geminiContentGenerator-CS3M7SOS.js → geminiContentGenerator-KAFSMFA6.js} +7 -7
  176. package/chunks/{getMachineId-bsd-FG7IUY6U.js → getMachineId-bsd-LSY4WMOF.js} +1 -1
  177. package/chunks/{getMachineId-darwin-GLCJI2RA.js → getMachineId-darwin-JOFR4UIT.js} +1 -1
  178. package/chunks/{getMachineId-linux-O6OPPAKO.js → getMachineId-linux-QEDBS6GI.js} +1 -1
  179. package/chunks/{getMachineId-unsupported-S6CKYVGC.js → getMachineId-unsupported-IPZ3YRKP.js} +1 -1
  180. package/chunks/{getMachineId-win-X5SRNEH7.js → getMachineId-win-TJ2OZ7AA.js} +1 -1
  181. package/chunks/{glob-WIJOGYVV.js → glob-OE27ZGK4.js} +40 -40
  182. package/chunks/{goal-tools-K5OHOJ6B.js → goal-tools-YIADM4RZ.js} +5 -5
  183. package/chunks/{grep-CIFRQBR7.js → grep-VBV6BWSP.js} +40 -40
  184. package/chunks/{handleAutoUpdate-KJ4SN7DM.js → handleAutoUpdate-YDMS57ZN.js} +46 -44
  185. package/chunks/{i18n-36SZUO4C.js → i18n-JIW77MSO.js} +41 -41
  186. package/chunks/{image-gen-R4B5VUYB.js → image-gen-L4A2ISEH.js} +11 -11
  187. package/chunks/{initializer-CW5YCAOL.js → initializer-F7I7QDHK.js} +47 -47
  188. package/chunks/{installationInfo-NMQIOUGY.js → installationInfo-KOUBU7MH.js} +43 -41
  189. package/chunks/{keychain-token-storage-3XFJ5ZB2.js → keychain-token-storage-7SL4ZWQQ.js} +3 -3
  190. package/chunks/{list-HHGT3S4P.js → list-AJ5BRB7C.js} +49 -49
  191. package/chunks/{list-agents-OSVDFI6S.js → list-agents-XO4EONWC.js} +6 -6
  192. package/chunks/{loadedSettingsAdapter-SJ2MJF35.js → loadedSettingsAdapter-X7FC5332.js} +46 -46
  193. package/chunks/{loggingContentGenerator-GR2QQ2C5.js → loggingContentGenerator-5G4ZR5D5.js} +22 -22
  194. package/chunks/{loop-wakeup-HWVUU5CF.js → loop-wakeup-HWSTFUTQ.js} +6 -6
  195. package/chunks/{ls-D3HUFHDP.js → ls-52HUW4B6.js} +5 -5
  196. package/chunks/{lsp-3QDDJTCS.js → lsp-VJESYEC6.js} +3 -3
  197. package/chunks/{managed-npm-update-ADQJHKTO.js → managed-npm-update-ZR2T2ST3.js} +41 -41
  198. package/chunks/{mcp-QW3OTL5W.js → mcp-TZNHG7CF.js} +46 -46
  199. package/chunks/{monitor-RJKPVERH.js → monitor-TN6Z4SXF.js} +40 -40
  200. package/chunks/{nonInteractiveCli-MROMHSTL.js → nonInteractiveCli-I7K6KH5U.js} +81 -80
  201. package/chunks/{notebook-edit-2ENWDBZO.js → notebook-edit-77V2IP3Y.js} +40 -40
  202. package/chunks/{openaiContentGenerator-Z3GPWJU4.js → openaiContentGenerator-2S2UT4RR.js} +25 -26
  203. package/chunks/{pidfile-5G42YSTP.js → pidfile-WDSDXBY3.js} +41 -41
  204. package/chunks/{processUtils-ZDMXYKQY.js → processUtils-JOJNZOW4.js} +2 -2
  205. package/chunks/prompt-terminal-ledger-RW62JIPP.js +93 -0
  206. package/chunks/{qwenContentGenerator-NLEMBZVU.js → qwenContentGenerator-G3H2TCXF.js} +45 -45
  207. package/chunks/{qwenOAuth2-EBV52DWJ.js → qwenOAuth2-UI2OC2RN.js} +10 -10
  208. package/chunks/{read-file-5BYIF53O.js → read-file-DI64TNOE.js} +13 -14
  209. package/chunks/{read-mcp-resource-XD54ZQMC.js → read-mcp-resource-6VFF47Z3.js} +3 -3
  210. package/chunks/{record-artifact-GLU3UWBV.js → record-artifact-TJTN2GBV.js} +5 -5
  211. package/chunks/{resumeHistoryUtils-AFTBRS3G.js → resumeHistoryUtils-3FIDQ6YQ.js} +46 -46
  212. package/chunks/{ripGrep-NN7AOLQY.js → ripGrep-EUTGRCN3.js} +40 -40
  213. package/chunks/{run-qwen-serve-UR3DYDAF.js → run-qwen-serve-SQBF7QZM.js} +505 -161
  214. package/chunks/{runtime-PR5RKGNH.js → runtime-7QGB6SY4.js} +49 -49
  215. package/chunks/{scheduler-GPMLVKJM.js → scheduler-V6AZCQVU.js} +42 -42
  216. package/chunks/{sdk-exporters-grpc-54L4LS5L.js → sdk-exporters-grpc-P3LA24AV.js} +3 -3
  217. package/chunks/{sdk-exporters-http-NC746HLT.js → sdk-exporters-http-K3LH2SD7.js} +9 -11
  218. package/chunks/{sdk-impl-YVL7BP6Y.js → sdk-impl-WCUNMLVX.js} +11 -6
  219. package/chunks/{send-message-TNBG5EVA.js → send-message-NUK5DTTI.js} +7 -7
  220. package/chunks/{serve-E7V2JVA2.js → serve-WVNAO2NA.js} +46 -46
  221. package/chunks/{server-YXB3DBN7.js → server-ZMZPHJEC.js} +992 -271
  222. package/chunks/{session-DZEAUT7S.js → session-JV74G6EZ.js} +82 -81
  223. package/chunks/{settings-ESZ3NWAP.js → settings-GBBVKBQ2.js} +45 -45
  224. package/chunks/{shell-JMSK5WIL.js → shell-JNNRUZPA.js} +40 -40
  225. package/chunks/{skill-5K5CSUJV.js → skill-JRGRCWD5.js} +18 -18
  226. package/chunks/{skill-settings-V64NIOTI.js → skill-settings-VEC7C44Z.js} +45 -45
  227. package/chunks/{spawnChannel-S63APBZZ.js → spawnChannel-TVKIFXXA.js} +42 -42
  228. package/chunks/{standalone-update-P42HDFXX.js → standalone-update-OSHF2CX3.js} +42 -42
  229. package/chunks/{startInteractiveUI-LFBLFHJ4.js → startInteractiveUI-2HTUHVQO.js} +310 -156
  230. package/chunks/{syntheticOutput-7GWFIDXT.js → syntheticOutput-GZV6O6UL.js} +4 -4
  231. package/chunks/{task-create-EILHJJB7.js → task-create-BXGKNND4.js} +11 -11
  232. package/chunks/{task-list-WGJR6YL5.js → task-list-4ZMIDYGD.js} +6 -6
  233. package/chunks/{task-stop-X37KYTKB.js → task-stop-WBO7LWTS.js} +3 -3
  234. package/chunks/{task-update-XZAHVXJ5.js → task-update-UFO3BI7O.js} +11 -11
  235. package/chunks/{team-create-EDNOUM2U.js → team-create-DTPGJ6RH.js} +40 -40
  236. package/chunks/{team-delete-UEP4QOOT.js → team-delete-OCFJS444.js} +6 -6
  237. package/chunks/{team-plan-approval-QRSNK2DX.js → team-plan-approval-4433RWHB.js} +40 -40
  238. package/chunks/{terminal-image-renderer-6J2NPL32.js → terminal-image-renderer-QZLIKIVA.js} +42 -42
  239. package/chunks/{theme-manager-WJMLRBXS.js → theme-manager-RM7C7Q3L.js} +41 -41
  240. package/chunks/{todoWrite-ATS62CAP.js → todoWrite-BGM5MCPY.js} +5 -5
  241. package/chunks/{tool-search-MZ6WU7DM.js → tool-search-4NQJASFC.js} +17 -18
  242. package/chunks/{total-session-admission-DQVW2LIP.js → total-session-admission-NZNCU5NU.js} +46 -45
  243. package/chunks/{trustedFolders-QMH25GOX.js → trustedFolders-FDJ2Q4ZK.js} +41 -41
  244. package/chunks/{update-relaunch-EG75LLW5.js → update-relaunch-HZMDPRTF.js} +5 -5
  245. package/chunks/{updateCheck-MTZIVGT5.js → updateCheck-ZB2CRVVG.js} +43 -43
  246. package/chunks/{useAutoAcceptIndicator-IGCW5EPO.js → useAutoAcceptIndicator-O3JI4KTR.js} +48 -48
  247. package/chunks/{validateNonInterActiveAuth-D5FPAB2C.js → validateNonInterActiveAuth-7Z4KG4N5.js} +78 -77
  248. package/chunks/{version-UOLDLLRB.js → version-RFVS6QDY.js} +1 -1
  249. package/chunks/{web-fetch-QKKW6CWH.js → web-fetch-RAN377BH.js} +17 -18
  250. package/chunks/{web-search-JYRBZMCW.js → web-search-XKS6ZPY7.js} +10 -10
  251. package/chunks/{workflow-SR7SEAU7.js → workflow-HF6G5XNX.js} +232 -73
  252. package/chunks/{workspace-providers-status-OXGV4EFF.js → workspace-providers-status-LNMP7NED.js} +49 -49
  253. package/chunks/{workspace-registration-store-V5EGKLBH.js → workspace-registration-store-QZ3P3ILN.js} +1 -1
  254. package/chunks/{workspace-registry-KJVIYTF5.js → workspace-registry-KWPGC2LG.js} +46 -45
  255. package/chunks/{workspace-service-6RLSGUB5.js → workspace-service-RWB4KMY3.js} +51 -51
  256. package/chunks/{workspace-skills-status-BHFEPDGH.js → workspace-skills-status-P3XXZY7C.js} +47 -47
  257. package/chunks/{workspace-trust-reconciler-DB5ERSUN.js → workspace-trust-reconciler-XU6WB2MF.js} +52 -51
  258. package/chunks/{write-file-IUP4GTZ4.js → write-file-V7Y6KUPR.js} +40 -40
  259. package/chunks/{zoom-image-SRBDTIVA.js → zoom-image-N4RSASH7.js} +13 -14
  260. package/cli.js +13 -13
  261. package/package.json +3 -3
  262. package/web-shell/assets/{arc-DItbX0DI.js → arc-CN-xeqBM.js} +1 -1
  263. package/web-shell/assets/{architectureDiagram-3BPJPVTR-CmnIlH8y.js → architectureDiagram-3BPJPVTR-XQJ6hBnv.js} +1 -1
  264. package/web-shell/assets/{blockDiagram-GPEHLZMM-pObnB9kw.js → blockDiagram-GPEHLZMM-n35AKogw.js} +1 -1
  265. package/web-shell/assets/{c4Diagram-AAUBKEIU-BNBmMS0Y.js → c4Diagram-AAUBKEIU-DXeDVokb.js} +1 -1
  266. package/web-shell/assets/channel-BdTBh3qf.js +1 -0
  267. package/web-shell/assets/{chunk-2J33WTMH-Dz4JBOO6.js → chunk-2J33WTMH-BYcmYjz_.js} +1 -1
  268. package/web-shell/assets/{chunk-4BX2VUAB-Cz2GnvAR.js → chunk-4BX2VUAB-w3UyeGtt.js} +1 -1
  269. package/web-shell/assets/{chunk-55IACEB6-CC6kOQYx.js → chunk-55IACEB6-Td3JbOH_.js} +1 -1
  270. package/web-shell/assets/{chunk-727SXJPM-Z4lY4gbh.js → chunk-727SXJPM-gC_NR7u6.js} +1 -1
  271. package/web-shell/assets/{chunk-AQP2D5EJ-Yz0hZr3D.js → chunk-AQP2D5EJ-aD7bI3c3.js} +1 -1
  272. package/web-shell/assets/{chunk-FMBD7UC4-nKmTWTv9.js → chunk-FMBD7UC4-sHMhD16X.js} +1 -1
  273. package/web-shell/assets/{chunk-ND2GUHAM-CjZz0f6Y.js → chunk-ND2GUHAM-DiV49BLl.js} +1 -1
  274. package/web-shell/assets/{chunk-QZHKN3VN-Bab3FpuS.js → chunk-QZHKN3VN-Dnoagqin.js} +1 -1
  275. package/web-shell/assets/classDiagram-4FO5ZUOK-qVxLMMuK.js +1 -0
  276. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-qVxLMMuK.js +1 -0
  277. package/web-shell/assets/{cose-bilkent-S5V4N54A-BuSAGFox.js → cose-bilkent-S5V4N54A-K6l_zsrZ.js} +1 -1
  278. package/web-shell/assets/{dagre-BM42HDAG-CRZXTg3g.js → dagre-BM42HDAG-Chh9hQ0a.js} +1 -1
  279. package/web-shell/assets/{diagram-2AECGRRQ-BFx1Ayrz.js → diagram-2AECGRRQ-Clrbd8SB.js} +1 -1
  280. package/web-shell/assets/{diagram-5GNKFQAL-B2hMZ3gS.js → diagram-5GNKFQAL-BkNExywD.js} +1 -1
  281. package/web-shell/assets/{diagram-KO2AKTUF-DKxAQLmc.js → diagram-KO2AKTUF-kTX14ngI.js} +1 -1
  282. package/web-shell/assets/{diagram-LMA3HP47-Bo1xGqVY.js → diagram-LMA3HP47-Ba1QOCJy.js} +1 -1
  283. package/web-shell/assets/{diagram-OG6HWLK6-B9NG78d-.js → diagram-OG6HWLK6-CtH5BVYm.js} +1 -1
  284. package/web-shell/assets/{erDiagram-TEJ5UH35-DltQKiqQ.js → erDiagram-TEJ5UH35-DCxSIC83.js} +1 -1
  285. package/web-shell/assets/{flowDiagram-I6XJVG4X-5xXGmS4I.js → flowDiagram-I6XJVG4X-C4rNAypQ.js} +1 -1
  286. package/web-shell/assets/{ganttDiagram-6RSMTGT7-bhGL5n0l.js → ganttDiagram-6RSMTGT7-s3P5tBwL.js} +1 -1
  287. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-ZYnz9hgh.js → gitGraphDiagram-PVQCEYII-C7Eg-1ok.js} +1 -1
  288. package/web-shell/assets/index-BXoIYIJg.css +5 -0
  289. package/web-shell/assets/{index-CBBeUArD.js → index-CszoC8cN.js} +1 -1
  290. package/web-shell/assets/index-Dxj7Naa0.js +1788 -0
  291. package/web-shell/assets/{infoDiagram-5YYISTIA-Cg-jamQf.js → infoDiagram-5YYISTIA-BDKsgMt6.js} +1 -1
  292. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-CcmvKlyq.js → ishikawaDiagram-YF4QCWOH-CkcSHbvL.js} +1 -1
  293. package/web-shell/assets/{journeyDiagram-JHISSGLW-BRsOQZp1.js → journeyDiagram-JHISSGLW-CDWt-t81.js} +1 -1
  294. package/web-shell/assets/{kanban-definition-UN3LZRKU-xW-dmEHK.js → kanban-definition-UN3LZRKU-FI2owcEa.js} +1 -1
  295. package/web-shell/assets/{linear-ClBfEZH2.js → linear-BQzLqkJi.js} +1 -1
  296. package/web-shell/assets/{mermaid.core-D65NDkzc.js → mermaid.core-CvV91DP1.js} +5 -5
  297. package/web-shell/assets/{mindmap-definition-RKZ34NQL-CyvFslYa.js → mindmap-definition-RKZ34NQL-Dx2kLUpN.js} +1 -1
  298. package/web-shell/assets/{pieDiagram-4H26LBE5-BwSefMyG.js → pieDiagram-4H26LBE5-CMXOmBrj.js} +1 -1
  299. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-GqBJspFS.js → quadrantDiagram-W4KKPZXB-Bziww7Co.js} +1 -1
  300. package/web-shell/assets/{requirementDiagram-4Y6WPE33-B137PlTJ.js → requirementDiagram-4Y6WPE33-DMOXAxzp.js} +1 -1
  301. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-maHkkt8i.js → sankeyDiagram-5OEKKPKP-B3y1cfVV.js} +1 -1
  302. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-DJ1mRaG3.js → sequenceDiagram-3UESZ5HK-ChrV1jiM.js} +1 -1
  303. package/web-shell/assets/{stateDiagram-AJRCARHV-aRmP7Q4i.js → stateDiagram-AJRCARHV-CWuLzLFE.js} +1 -1
  304. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DEDPMLgq.js +1 -0
  305. package/web-shell/assets/{timeline-definition-PNZ67QCA-CIQ3BRPA.js → timeline-definition-PNZ67QCA-Cl6am_to.js} +1 -1
  306. package/web-shell/assets/{vennDiagram-CIIHVFJN-DR9VPd5h.js → vennDiagram-CIIHVFJN-OuocxGAu.js} +1 -1
  307. package/web-shell/assets/{wardley-L42UT6IY-ZcfIbT4D.js → wardley-L42UT6IY-DLYdvSJW.js} +1 -1
  308. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-D0jgPi4T.js → wardleyDiagram-YWT4CUSO-7a3DreXX.js} +1 -1
  309. package/web-shell/assets/{xychartDiagram-2RQKCTM6-BGWU4s5o.js → xychartDiagram-2RQKCTM6-CgfjUxW_.js} +1 -1
  310. package/web-shell/index.html +2 -2
  311. package/chunks/chunk-D34RDOLP.js +0 -529
  312. package/chunks/daemon-status-provider-SXS66ZIR.js +0 -103
  313. package/web-shell/assets/channel-hZnMfWA9.js +0 -1
  314. package/web-shell/assets/classDiagram-4FO5ZUOK-BRnxm8DX.js +0 -1
  315. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BRnxm8DX.js +0 -1
  316. package/web-shell/assets/index-CbgU-jUo.css +0 -5
  317. package/web-shell/assets/index-_nhzXqab.js +0 -1750
  318. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-Db39gvZ_.js +0 -1
@@ -36,10 +36,11 @@ import {
36
36
  resolveAcpHttpEnabled,
37
37
  setDeferredRuntimeRequestTiming,
38
38
  toDaemonStatusMemoryLimits
39
- } from "./chunk-UYDGFWIJ.js";
39
+ } from "./chunk-NYN4RD3K.js";
40
40
  import "./chunk-VGHZT6JR.js";
41
41
  import {
42
- isLoopbackBind
42
+ isLoopbackBind,
43
+ normalizeSessionIdForLookup
43
44
  } from "./chunk-TQOF5KBL.js";
44
45
  import {
45
46
  formatMemoryBudgetStderr,
@@ -81,17 +82,17 @@ import {
81
82
  MAX_REGISTERED_WORKSPACES,
82
83
  resolveWorkspaceInputs,
83
84
  workspaceRegistrationId
84
- } from "./chunk-SFTKAX4O.js";
85
- import "./chunk-CH5OFRV7.js";
85
+ } from "./chunk-OFJ6OFIT.js";
86
+ import "./chunk-W4MLKRZD.js";
86
87
  import {
87
88
  LOAD_REPLAY_META_KEY
88
- } from "./chunk-WP4WIUOJ.js";
89
+ } from "./chunk-QQUVPMMZ.js";
89
90
  import "./chunk-624NHDGB.js";
90
91
  import {
91
92
  canonicalizeWorkspace,
92
93
  translateAndCheckAbsoluteWorkspacePath
93
94
  } from "./chunk-6PLDPT2C.js";
94
- import "./chunk-4W5U2TUT.js";
95
+ import "./chunk-NGY7B7VF.js";
95
96
  import "./chunk-FYJ7W2PI.js";
96
97
  import "./chunk-Z7B6SRPM.js";
97
98
  import {
@@ -99,7 +100,7 @@ import {
99
100
  ChannelWebhookEnqueueError,
100
101
  QWEN_SERVER_TOKEN_ENV,
101
102
  isChannelDeliveryError
102
- } from "./chunk-YP5KH5Y7.js";
103
+ } from "./chunk-ND7NOI4P.js";
103
104
  import {
104
105
  normalizeWorkerDiagnostic,
105
106
  sanitizeWorkerDiagnostic
@@ -107,7 +108,7 @@ import {
107
108
  import {
108
109
  channelSelectionNames
109
110
  } from "./chunk-ALMR3E6Q.js";
110
- import "./chunk-HIBNSEJE.js";
111
+ import "./chunk-UDG5EZJI.js";
111
112
  import "./chunk-M5GB774H.js";
112
113
  import {
113
114
  EXTERNAL_TOOL_GUARD_PROVIDER_ATTACHED_VALUE,
@@ -136,12 +137,13 @@ import {
136
137
  } from "./chunk-CXJHQVEK.js";
137
138
  import {
138
139
  getCliVersion
139
- } from "./chunk-PCETXVVV.js";
140
+ } from "./chunk-3X6KVX37.js";
140
141
  import "./chunk-WZMH7II3.js";
141
142
  import "./chunk-NPQ5ZKRP.js";
142
143
  import {
143
144
  isWithinRoot
144
145
  } from "./chunk-MR3PXB6E.js";
146
+ import "./chunk-LJZSMWOH.js";
145
147
  import "./chunk-GOFAQQZA.js";
146
148
  import "./chunk-5M6IDOMF.js";
147
149
  import "./chunk-TWPJO254.js";
@@ -167,7 +169,7 @@ import {
167
169
  init_esm,
168
170
  isSpanContextValid,
169
171
  trace
170
- } from "./chunk-QUGAUQGJ.js";
172
+ } from "./chunk-GX2THELY.js";
171
173
  import {
172
174
  init_esbuild_shims
173
175
  } from "./chunk-5O2XNYP6.js";
@@ -1388,7 +1390,7 @@ function createConcreteLogger(input) {
1388
1390
  }
1389
1391
  });
1390
1392
  let timeout;
1391
- const deadline = new Promise((resolve3) => {
1393
+ const deadline = new Promise((resolve4) => {
1392
1394
  timeout = setTimeout(() => {
1393
1395
  try {
1394
1396
  input.warnOnce(
@@ -1397,7 +1399,7 @@ function createConcreteLogger(input) {
1397
1399
  );
1398
1400
  } catch {
1399
1401
  } finally {
1400
- resolve3();
1402
+ resolve4();
1401
1403
  }
1402
1404
  }, input.policy.closeDrainBudgetMs);
1403
1405
  timeout.unref();
@@ -1743,61 +1745,81 @@ __name(initDaemonLogger, "initDaemonLogger");
1743
1745
 
1744
1746
  // packages/cli/src/serve/conversations/conversation-workspace.ts
1745
1747
  init_esbuild_shims();
1746
- import { createHash as createHash2 } from "node:crypto";
1747
- import { lstat, mkdir, realpath, rmdir } from "node:fs/promises";
1748
+ import { readdir, rmdir } from "node:fs/promises";
1748
1749
  import { homedir } from "node:os";
1750
+ import { resolve as resolve2 } from "node:path";
1751
+
1752
+ // packages/cli/src/utils/conversation-directory-identity.ts
1753
+ init_esbuild_shims();
1754
+ import { createHash as createHash2 } from "node:crypto";
1755
+ import { lstat, mkdir, realpath } from "node:fs/promises";
1749
1756
  import { isAbsolute, join as join2, relative as relative2, resolve, sep } from "node:path";
1750
- var isSamePath = /* @__PURE__ */ __name((left, right) => process.platform === "win32" ? left.toLowerCase() === right.toLowerCase() : left === right, "isSamePath");
1751
- function conversationDirectoryName(sessionId) {
1752
- if (sessionId.length === 0 || sessionId.length > 256) {
1753
- throw new Error("Live conversation session id is invalid");
1757
+ function hasVerifiableInode(ino) {
1758
+ return Number(ino) !== 0;
1759
+ }
1760
+ __name(hasVerifiableInode, "hasVerifiableInode");
1761
+ var ConversationDirectoryIdentityError = class extends Error {
1762
+ constructor(scope, reason, cause) {
1763
+ super(
1764
+ `Conversation ${scope} identity validation failed: ${reason}`,
1765
+ cause !== void 0 ? { cause } : void 0
1766
+ );
1767
+ this.scope = scope;
1768
+ this.reason = reason;
1754
1769
  }
1755
- return `conversation-${createHash2("sha256").update(sessionId).digest("hex")}`;
1770
+ static {
1771
+ __name(this, "ConversationDirectoryIdentityError");
1772
+ }
1773
+ name = "ConversationDirectoryIdentityError";
1774
+ };
1775
+ function throwIdentityIoError(scope, cause) {
1776
+ throw new ConversationDirectoryIdentityError(scope, "io_error", cause);
1756
1777
  }
1757
- __name(conversationDirectoryName, "conversationDirectoryName");
1758
- function validateRootStats(stats, label = "root") {
1778
+ __name(throwIdentityIoError, "throwIdentityIoError");
1779
+ var isSameConversationPath = /* @__PURE__ */ __name((left, right) => process.platform === "win32" ? left.toLowerCase() === right.toLowerCase() : left === right, "isSameConversationPath");
1780
+ function getConversationDirectoryName(storageSessionId) {
1781
+ if (storageSessionId.length === 0 || storageSessionId.length > 256) {
1782
+ throw new ConversationDirectoryIdentityError("child", "invalid_session_id");
1783
+ }
1784
+ return `conversation-${createHash2("sha256").update(storageSessionId).digest("hex")}`;
1785
+ }
1786
+ __name(getConversationDirectoryName, "getConversationDirectoryName");
1787
+ function validateDirectoryStats(stats, scope) {
1759
1788
  if (stats.isSymbolicLink() || !stats.isDirectory()) {
1760
- throw new Error(
1761
- `Live conversation ${label} must be a non-symlink directory`
1762
- );
1789
+ throw new ConversationDirectoryIdentityError(scope, "not_directory");
1763
1790
  }
1764
1791
  if (process.platform !== "win32" && typeof process.getuid === "function" && stats.uid !== process.getuid()) {
1765
- throw new Error(
1766
- `Live conversation ${label} must be owned by the daemon user`
1767
- );
1792
+ throw new ConversationDirectoryIdentityError(scope, "wrong_owner");
1768
1793
  }
1769
1794
  if (process.platform !== "win32" && (stats.mode & 63) !== 0) {
1770
- throw new Error(
1771
- `Live conversation ${label} must be accessible only to its owner`
1772
- );
1773
- }
1774
- }
1775
- __name(validateRootStats, "validateRootStats");
1776
- function hasIdentity(stats, root) {
1777
- return stats.dev === root.device && stats.ino === root.inode;
1778
- }
1779
- __name(hasIdentity, "hasIdentity");
1780
- async function validateConversationDirectory(root, name, candidate, parent = root.canonicalRoot) {
1781
- const before = await lstat(candidate);
1782
- validateRootStats(before, "directory");
1783
- const canonical = await realpath(candidate);
1784
- const after = await lstat(canonical);
1785
- validateRootStats(after, "directory");
1786
- const child = relative2(parent, canonical);
1787
- if (child !== name || child.includes(sep) || child.startsWith("..") || isAbsolute(child) || before.dev !== after.dev || before.ino !== after.ino) {
1788
- throw new Error(
1789
- "Live conversation directory must be an owned direct child"
1790
- );
1791
- }
1792
- await revalidateConversationRoot(root);
1793
- return canonical;
1794
- }
1795
- __name(validateConversationDirectory, "validateConversationDirectory");
1796
- function getConversationRootPath(homeDir = homedir()) {
1797
- return resolve(homeDir, "Documents", "Qwen Code", "Conversations");
1798
- }
1799
- __name(getConversationRootPath, "getConversationRootPath");
1800
- async function createRoot(configuredRoot) {
1795
+ throw new ConversationDirectoryIdentityError(scope, "wrong_mode");
1796
+ }
1797
+ }
1798
+ __name(validateDirectoryStats, "validateDirectoryStats");
1799
+ function hasRootIdentity(stats, root) {
1800
+ if (!root.inodeVerifiable) return stats.dev === root.device;
1801
+ return hasVerifiableInode(stats.ino) && stats.dev === root.device && stats.ino === root.inode;
1802
+ }
1803
+ __name(hasRootIdentity, "hasRootIdentity");
1804
+ function isSameDirectoryIdentity(before, after) {
1805
+ if (!hasVerifiableInode(before.ino) || !hasVerifiableInode(after.ino)) {
1806
+ return before.dev === after.dev;
1807
+ }
1808
+ return before.dev === after.dev && before.ino === after.ino;
1809
+ }
1810
+ __name(isSameDirectoryIdentity, "isSameDirectoryIdentity");
1811
+ function hasExpectedDirectoryIdentity(identity, expected) {
1812
+ const inodesProvable = hasVerifiableInode(identity.inode) && hasVerifiableInode(expected.inode);
1813
+ return identity.storageSessionId === expected.storageSessionId && identity.name === expected.name && isSameConversationPath(identity.canonicalPath, expected.canonicalPath) && identity.device === expected.device && (!inodesProvable || identity.inode === expected.inode) && isSameConversationPath(
1814
+ identity.root.configuredRoot,
1815
+ expected.root.configuredRoot
1816
+ ) && isSameConversationPath(
1817
+ identity.root.canonicalRoot,
1818
+ expected.root.canonicalRoot
1819
+ ) && identity.root.device === expected.root.device && (!identity.root.inodeVerifiable || !expected.root.inodeVerifiable || identity.root.inode === expected.root.inode);
1820
+ }
1821
+ __name(hasExpectedDirectoryIdentity, "hasExpectedDirectoryIdentity");
1822
+ async function createConversationRootIdentity(configuredRoot) {
1801
1823
  try {
1802
1824
  await mkdir(configuredRoot, { recursive: true, mode: 448 });
1803
1825
  } catch (error) {
@@ -1805,61 +1827,246 @@ async function createRoot(configuredRoot) {
1805
1827
  try {
1806
1828
  existing = await lstat(configuredRoot);
1807
1829
  } catch {
1808
- throw error;
1830
+ throwIdentityIoError("root", error);
1809
1831
  }
1810
- validateRootStats(existing);
1811
- throw error;
1832
+ validateDirectoryStats(existing, "root");
1833
+ throwIdentityIoError("root", error);
1812
1834
  }
1813
- const before = await lstat(configuredRoot);
1814
- validateRootStats(before);
1815
- const canonicalRoot = await realpath(configuredRoot);
1816
- const after = await lstat(canonicalRoot);
1817
- validateRootStats(after);
1818
- if (before.dev !== after.dev || before.ino !== after.ino) {
1819
- throw new Error(
1820
- "Live conversation root identity changed during validation"
1821
- );
1835
+ let before;
1836
+ try {
1837
+ before = await lstat(configuredRoot);
1838
+ } catch (error) {
1839
+ throwIdentityIoError("root", error);
1840
+ }
1841
+ validateDirectoryStats(before, "root");
1842
+ let canonicalRoot;
1843
+ let after;
1844
+ try {
1845
+ canonicalRoot = await realpath(configuredRoot);
1846
+ after = await lstat(canonicalRoot);
1847
+ } catch (error) {
1848
+ throwIdentityIoError("root", error);
1849
+ }
1850
+ validateDirectoryStats(after, "root");
1851
+ if (!isSameDirectoryIdentity(before, after)) {
1852
+ throw new ConversationDirectoryIdentityError("root", "identity_changed");
1822
1853
  }
1823
1854
  return {
1824
1855
  configuredRoot,
1825
1856
  canonicalRoot,
1826
1857
  device: after.dev,
1827
- inode: after.ino
1858
+ inode: after.ino,
1859
+ inodeVerifiable: hasVerifiableInode(after.ino)
1828
1860
  };
1829
1861
  }
1830
- __name(createRoot, "createRoot");
1831
- async function revalidateConversationRoot(root) {
1832
- const configuredStats = await lstat(root.configuredRoot);
1833
- validateRootStats(configuredStats);
1834
- if (!hasIdentity(configuredStats, root)) {
1835
- throw new Error("Live conversation root identity changed");
1862
+ __name(createConversationRootIdentity, "createConversationRootIdentity");
1863
+ async function revalidateConversationRootIdentity(root) {
1864
+ let configuredStats;
1865
+ try {
1866
+ configuredStats = await lstat(root.configuredRoot);
1867
+ } catch (error) {
1868
+ throwIdentityIoError("root", error);
1869
+ }
1870
+ validateDirectoryStats(configuredStats, "root");
1871
+ if (!hasRootIdentity(configuredStats, root)) {
1872
+ throw new ConversationDirectoryIdentityError("root", "identity_changed");
1873
+ }
1874
+ let canonical;
1875
+ try {
1876
+ canonical = await realpath(root.configuredRoot);
1877
+ } catch (error) {
1878
+ throwIdentityIoError("root", error);
1879
+ }
1880
+ if (!isSameConversationPath(canonical, root.canonicalRoot)) {
1881
+ throw new ConversationDirectoryIdentityError(
1882
+ "root",
1883
+ "canonical_path_changed"
1884
+ );
1836
1885
  }
1837
- const canonical = await realpath(root.configuredRoot);
1838
- if (!isSamePath(canonical, root.canonicalRoot)) {
1839
- throw new Error("Live conversation root canonical path changed");
1886
+ let canonicalStats;
1887
+ try {
1888
+ canonicalStats = await lstat(root.canonicalRoot);
1889
+ } catch (error) {
1890
+ throwIdentityIoError("root", error);
1840
1891
  }
1841
- const canonicalStats = await lstat(root.canonicalRoot);
1842
- validateRootStats(canonicalStats);
1843
- if (!hasIdentity(canonicalStats, root)) {
1844
- throw new Error("Live conversation root identity changed");
1892
+ validateDirectoryStats(canonicalStats, "root");
1893
+ if (!hasRootIdentity(canonicalStats, root)) {
1894
+ throw new ConversationDirectoryIdentityError("root", "identity_changed");
1845
1895
  }
1846
1896
  return root;
1847
1897
  }
1848
- __name(revalidateConversationRoot, "revalidateConversationRoot");
1849
- async function assertExactConversationRoot(root, candidate) {
1850
- await revalidateConversationRoot(root);
1898
+ __name(revalidateConversationRootIdentity, "revalidateConversationRootIdentity");
1899
+ async function assertExactConversationRootIdentity(root, candidate) {
1900
+ await revalidateConversationRootIdentity(root);
1851
1901
  const resolvedCandidate = resolve(candidate);
1852
- if (!isSamePath(resolvedCandidate, root.configuredRoot) && !isSamePath(resolvedCandidate, root.canonicalRoot)) {
1853
- throw new Error("Workspace must be the exact Live conversation root");
1902
+ if (!isSameConversationPath(resolvedCandidate, root.configuredRoot) && !isSameConversationPath(resolvedCandidate, root.canonicalRoot)) {
1903
+ throw new ConversationDirectoryIdentityError("root", "unexpected_identity");
1854
1904
  }
1855
- const stats = await lstat(resolvedCandidate);
1856
- validateRootStats(stats);
1857
- const canonical = await realpath(resolvedCandidate);
1858
- if (!isSamePath(canonical, root.canonicalRoot) || !hasIdentity(stats, root)) {
1859
- throw new Error("Workspace must be the exact Live conversation root");
1905
+ let stats;
1906
+ let canonical;
1907
+ try {
1908
+ stats = await lstat(resolvedCandidate);
1909
+ validateDirectoryStats(stats, "root");
1910
+ canonical = await realpath(resolvedCandidate);
1911
+ } catch (error) {
1912
+ if (error instanceof ConversationDirectoryIdentityError) throw error;
1913
+ throwIdentityIoError("root", error);
1914
+ }
1915
+ if (!isSameConversationPath(canonical, root.canonicalRoot) || !hasRootIdentity(stats, root)) {
1916
+ throw new ConversationDirectoryIdentityError("root", "unexpected_identity");
1860
1917
  }
1861
1918
  return root;
1862
1919
  }
1920
+ __name(assertExactConversationRootIdentity, "assertExactConversationRootIdentity");
1921
+ async function inspectConversationDirectoryIdentity(root, storageSessionId, expected) {
1922
+ await revalidateConversationRootIdentity(root);
1923
+ const name = getConversationDirectoryName(storageSessionId);
1924
+ const candidate = join2(root.canonicalRoot, name);
1925
+ let before;
1926
+ try {
1927
+ before = await lstat(candidate);
1928
+ } catch (error) {
1929
+ if (error.code === "ENOENT") return void 0;
1930
+ throwIdentityIoError("child", error);
1931
+ }
1932
+ validateDirectoryStats(before, "child");
1933
+ let canonical;
1934
+ let after;
1935
+ try {
1936
+ canonical = await realpath(candidate);
1937
+ after = await lstat(canonical);
1938
+ } catch (error) {
1939
+ if (error.code === "ENOENT") {
1940
+ throw new ConversationDirectoryIdentityError("child", "identity_changed");
1941
+ }
1942
+ throwIdentityIoError("child", error);
1943
+ }
1944
+ validateDirectoryStats(after, "child");
1945
+ const child = relative2(root.canonicalRoot, canonical);
1946
+ if (child !== name || child.includes(sep) || child.startsWith("..") || isAbsolute(child)) {
1947
+ throw new ConversationDirectoryIdentityError("child", "not_direct_child");
1948
+ }
1949
+ if (!isSameDirectoryIdentity(before, after)) {
1950
+ throw new ConversationDirectoryIdentityError("child", "identity_changed");
1951
+ }
1952
+ await revalidateConversationRootIdentity(root);
1953
+ const identity = {
1954
+ root,
1955
+ storageSessionId,
1956
+ name,
1957
+ canonicalPath: canonical,
1958
+ device: after.dev,
1959
+ inode: after.ino
1960
+ };
1961
+ if (expected && !hasExpectedDirectoryIdentity(identity, expected)) {
1962
+ throw new ConversationDirectoryIdentityError(
1963
+ "child",
1964
+ "unexpected_identity"
1965
+ );
1966
+ }
1967
+ return identity;
1968
+ }
1969
+ __name(inspectConversationDirectoryIdentity, "inspectConversationDirectoryIdentity");
1970
+ async function materializeConversationDirectoryIdentity(root, storageSessionId) {
1971
+ await revalidateConversationRootIdentity(root);
1972
+ const name = getConversationDirectoryName(storageSessionId);
1973
+ const candidate = join2(root.canonicalRoot, name);
1974
+ let created = false;
1975
+ try {
1976
+ await mkdir(candidate, { mode: 448 });
1977
+ created = true;
1978
+ } catch (error) {
1979
+ if (error.code !== "EEXIST") {
1980
+ throwIdentityIoError("child", error);
1981
+ }
1982
+ }
1983
+ const identity = await inspectConversationDirectoryIdentity(
1984
+ root,
1985
+ storageSessionId
1986
+ );
1987
+ if (!identity) {
1988
+ throw new ConversationDirectoryIdentityError("child", "identity_changed");
1989
+ }
1990
+ return { identity, created };
1991
+ }
1992
+ __name(materializeConversationDirectoryIdentity, "materializeConversationDirectoryIdentity");
1993
+
1994
+ // packages/cli/src/serve/conversations/conversation-workspace.ts
1995
+ function liveIdentityError(error, exactRoot = false, creatingRoot = false) {
1996
+ if (!(error instanceof ConversationDirectoryIdentityError)) throw error;
1997
+ if (error.reason === "io_error" && error.cause !== void 0) {
1998
+ throw error.cause;
1999
+ }
2000
+ if (error.scope === "root") {
2001
+ switch (error.reason) {
2002
+ case "not_directory":
2003
+ throw new Error(
2004
+ "Live conversation root must be a non-symlink directory"
2005
+ );
2006
+ case "wrong_owner":
2007
+ throw new Error(
2008
+ "Live conversation root must be owned by the daemon user"
2009
+ );
2010
+ case "wrong_mode":
2011
+ throw new Error(
2012
+ "Live conversation root must be accessible only to its owner"
2013
+ );
2014
+ case "canonical_path_changed":
2015
+ throw new Error("Live conversation root canonical path changed");
2016
+ case "identity_changed":
2017
+ throw new Error(
2018
+ creatingRoot ? "Live conversation root identity changed during validation" : "Live conversation root identity changed"
2019
+ );
2020
+ case "unexpected_identity":
2021
+ if (exactRoot) {
2022
+ throw new Error("Workspace must be the exact Live conversation root");
2023
+ }
2024
+ throw new Error("Live conversation root identity changed");
2025
+ default:
2026
+ throw new Error("Live conversation root identity changed");
2027
+ }
2028
+ }
2029
+ switch (error.reason) {
2030
+ case "invalid_session_id":
2031
+ throw new Error("Live conversation session id is invalid");
2032
+ case "not_directory":
2033
+ throw new Error(
2034
+ "Live conversation directory must be a non-symlink directory"
2035
+ );
2036
+ case "wrong_owner":
2037
+ throw new Error(
2038
+ "Live conversation directory must be owned by the daemon user"
2039
+ );
2040
+ case "wrong_mode":
2041
+ throw new Error(
2042
+ "Live conversation directory must be accessible only to its owner"
2043
+ );
2044
+ default:
2045
+ throw new Error(
2046
+ "Live conversation directory must be an owned direct child"
2047
+ );
2048
+ }
2049
+ }
2050
+ __name(liveIdentityError, "liveIdentityError");
2051
+ function getConversationRootPath(homeDir = homedir()) {
2052
+ return resolve2(homeDir, "Documents", "Qwen Code", "Conversations");
2053
+ }
2054
+ __name(getConversationRootPath, "getConversationRootPath");
2055
+ async function revalidateConversationRoot(root) {
2056
+ try {
2057
+ return await revalidateConversationRootIdentity(root);
2058
+ } catch (error) {
2059
+ liveIdentityError(error);
2060
+ }
2061
+ }
2062
+ __name(revalidateConversationRoot, "revalidateConversationRoot");
2063
+ async function assertExactConversationRoot(root, candidate) {
2064
+ try {
2065
+ return await assertExactConversationRootIdentity(root, candidate);
2066
+ } catch (error) {
2067
+ liveIdentityError(error, true);
2068
+ }
2069
+ }
1863
2070
  __name(assertExactConversationRoot, "assertExactConversationRoot");
1864
2071
  var ConversationWorkspace = class {
1865
2072
  static {
@@ -1870,9 +2077,9 @@ var ConversationWorkspace = class {
1870
2077
  constructor(options = {}) {
1871
2078
  this.rootPath = getConversationRootPath(options.homeDir);
1872
2079
  }
1873
- async getRoot() {
2080
+ getRootIdentity() {
1874
2081
  if (!this.rootPromise) {
1875
- const pending = createRoot(this.rootPath);
2082
+ const pending = createConversationRootIdentity(this.rootPath);
1876
2083
  this.rootPromise = pending;
1877
2084
  void pending.catch(() => {
1878
2085
  if (this.rootPromise === pending) this.rootPromise = void 0;
@@ -1880,42 +2087,61 @@ var ConversationWorkspace = class {
1880
2087
  }
1881
2088
  return this.rootPromise;
1882
2089
  }
2090
+ async getRoot() {
2091
+ try {
2092
+ return await this.getRootIdentity();
2093
+ } catch (error) {
2094
+ liveIdentityError(error, false, true);
2095
+ }
2096
+ }
2097
+ async revalidateStandaloneRoot() {
2098
+ return revalidateConversationRootIdentity(await this.getRootIdentity());
2099
+ }
1883
2100
  async revalidate() {
1884
2101
  return revalidateConversationRoot(await this.getRoot());
1885
2102
  }
1886
2103
  async assertExactRoot(candidate) {
1887
2104
  return assertExactConversationRoot(await this.getRoot(), candidate);
1888
2105
  }
2106
+ /**
2107
+ * The private directory is derived from the canonical session id, not from
2108
+ * whatever spelling a caller happens to hold.
2109
+ *
2110
+ * `getConversationDirectoryName()` is a case-sensitive hash, and callers reach
2111
+ * these methods with a mix of request ids, live-entry ids and ids echoed back
2112
+ * from tool arguments. Canonicalizing here makes one session resolve to one
2113
+ * directory by construction instead of leaving it to every call site.
2114
+ */
2115
+ directoryKey(sessionId) {
2116
+ return normalizeSessionIdForLookup(sessionId);
2117
+ }
1889
2118
  async materializeConversationDirectory(sessionId) {
1890
2119
  const root = await this.revalidate();
1891
- const name = conversationDirectoryName(sessionId);
1892
- const candidate = join2(root.canonicalRoot, name);
1893
2120
  try {
1894
- await mkdir(candidate, { mode: 448 });
2121
+ return (await materializeConversationDirectoryIdentity(
2122
+ root,
2123
+ this.directoryKey(sessionId)
2124
+ )).identity.canonicalPath;
1895
2125
  } catch (error) {
1896
- if (!error || typeof error !== "object" || error.code !== "EEXIST") {
1897
- throw error;
1898
- }
2126
+ liveIdentityError(error);
1899
2127
  }
1900
- return validateConversationDirectory(root, name, candidate);
1901
2128
  }
1902
2129
  async discardEmptyConversationDirectory(sessionId) {
1903
2130
  const root = await this.revalidate();
1904
- const name = conversationDirectoryName(sessionId);
1905
- const candidate = join2(root.canonicalRoot, name);
1906
- let canonical;
2131
+ let identity;
1907
2132
  try {
1908
- canonical = await validateConversationDirectory(root, name, candidate);
2133
+ identity = await inspectConversationDirectoryIdentity(
2134
+ root,
2135
+ this.directoryKey(sessionId)
2136
+ );
1909
2137
  } catch (error) {
1910
- if (error && typeof error === "object" && error.code === "ENOENT") {
1911
- return false;
1912
- }
1913
- throw error;
2138
+ liveIdentityError(error);
1914
2139
  }
2140
+ if (!identity) return false;
1915
2141
  try {
1916
- await rmdir(canonical);
2142
+ await rmdir(identity.canonicalPath);
1917
2143
  } catch (error) {
1918
- if (error && typeof error === "object" && (error.code === "ENOENT" || error.code === "ENOTEMPTY")) {
2144
+ if (error.code === "ENOENT" || error.code === "ENOTEMPTY") {
1919
2145
  return false;
1920
2146
  }
1921
2147
  throw error;
@@ -1923,6 +2149,87 @@ var ConversationWorkspace = class {
1923
2149
  await revalidateConversationRoot(root);
1924
2150
  return true;
1925
2151
  }
2152
+ async prepareStandaloneDirectory(storageSessionId) {
2153
+ const root = await this.revalidateStandaloneRoot();
2154
+ const prepared = await materializeConversationDirectoryIdentity(
2155
+ root,
2156
+ storageSessionId
2157
+ );
2158
+ const identity = await inspectConversationDirectoryIdentity(
2159
+ root,
2160
+ storageSessionId,
2161
+ prepared.identity
2162
+ );
2163
+ if (!identity) {
2164
+ throw new ConversationDirectoryIdentityError("child", "identity_changed");
2165
+ }
2166
+ let entries;
2167
+ try {
2168
+ entries = await readdir(identity.canonicalPath);
2169
+ } catch (error) {
2170
+ if (error.code === "ENOENT") {
2171
+ throw new ConversationDirectoryIdentityError(
2172
+ "child",
2173
+ "identity_changed"
2174
+ );
2175
+ }
2176
+ throw new ConversationDirectoryIdentityError("child", "io_error", error);
2177
+ }
2178
+ if (entries.length > 0) {
2179
+ throw new ConversationDirectoryIdentityError("child", "not_empty");
2180
+ }
2181
+ return { identity, created: prepared.created };
2182
+ }
2183
+ async inspectStandaloneDirectory(storageSessionId, expected) {
2184
+ const root = await this.revalidateStandaloneRoot();
2185
+ try {
2186
+ const identity = await inspectConversationDirectoryIdentity(
2187
+ root,
2188
+ storageSessionId,
2189
+ expected
2190
+ );
2191
+ return identity ? { status: "ready", identity } : { status: "missing" };
2192
+ } catch (error) {
2193
+ if (error instanceof ConversationDirectoryIdentityError && error.scope === "child") {
2194
+ return { status: "compromised", error };
2195
+ }
2196
+ throw error;
2197
+ }
2198
+ }
2199
+ async ensureStandaloneDirectory(storageSessionId, expected) {
2200
+ const inspected = await this.inspectStandaloneDirectory(
2201
+ storageSessionId,
2202
+ expected
2203
+ );
2204
+ if (inspected.status !== "missing") return inspected;
2205
+ const root = await this.revalidateStandaloneRoot();
2206
+ try {
2207
+ const materialized = await materializeConversationDirectoryIdentity(
2208
+ root,
2209
+ storageSessionId
2210
+ );
2211
+ if (!materialized.created) {
2212
+ const raced = await this.inspectStandaloneDirectory(
2213
+ storageSessionId,
2214
+ expected
2215
+ );
2216
+ if (raced.status !== "missing") return raced;
2217
+ throw new ConversationDirectoryIdentityError(
2218
+ "child",
2219
+ "identity_changed"
2220
+ );
2221
+ }
2222
+ return {
2223
+ status: expected ? "recreated" : "created",
2224
+ identity: materialized.identity
2225
+ };
2226
+ } catch (error) {
2227
+ if (error instanceof ConversationDirectoryIdentityError && error.scope === "child") {
2228
+ return { status: "compromised", error };
2229
+ }
2230
+ throw error;
2231
+ }
2232
+ }
1926
2233
  };
1927
2234
 
1928
2235
  // packages/cli/src/serve/daemon-metrics-ring.ts
@@ -2783,8 +3090,8 @@ async function flushDaemonLogBounded(daemonLog, budgetMs) {
2783
3090
  await Promise.race([
2784
3091
  daemonLog.flush().catch(() => {
2785
3092
  }),
2786
- new Promise((resolve3) => {
2787
- timer = setTimeout(resolve3, budgetMs);
3093
+ new Promise((resolve4) => {
3094
+ timer = setTimeout(resolve4, budgetMs);
2788
3095
  timer.unref();
2789
3096
  })
2790
3097
  ]);
@@ -3038,12 +3345,12 @@ __name(hasRetryableChannelWorkerShutdownError, "hasRetryableChannelWorkerShutdow
3038
3345
  var channelWorkerRuntimePromise;
3039
3346
  async function loadChannelWorkerRuntime() {
3040
3347
  channelWorkerRuntimePromise ??= Promise.all([
3041
- import("./channel-worker-supervisor-OEVWBHGT.js"),
3042
- import("./pidfile-5G42YSTP.js"),
3043
- import("./runtime-PR5RKGNH.js"),
3348
+ import("./channel-worker-supervisor-CPPSL7ZH.js"),
3349
+ import("./pidfile-WDSDXBY3.js"),
3350
+ import("./runtime-7QGB6SY4.js"),
3044
3351
  import("./cli-entry-path-4VJ3Y6T2.js"),
3045
- import("./channel-worker-group-TJ35JDPE.js"),
3046
- import("./channel-worker-manager-G5LKWGOG.js")
3352
+ import("./channel-worker-group-IN2UPYHP.js"),
3353
+ import("./channel-worker-manager-4CQPHVD4.js")
3047
3354
  ]).then(
3048
3355
  ([
3049
3356
  supervisor,
@@ -3148,7 +3455,7 @@ function shouldPreheatBridge(deps) {
3148
3455
  __name(shouldPreheatBridge, "shouldPreheatBridge");
3149
3456
  var coreRuntimePromise;
3150
3457
  function loadCoreRuntime() {
3151
- coreRuntimePromise ??= import("./core-runtime-6HD5DSPX.js");
3458
+ coreRuntimePromise ??= import("./core-runtime-TIWTFHOR.js");
3152
3459
  return coreRuntimePromise;
3153
3460
  }
3154
3461
  __name(loadCoreRuntime, "loadCoreRuntime");
@@ -3184,10 +3491,10 @@ __name(resolveDaemonLogBaseDirForRun, "resolveDaemonLogBaseDirForRun");
3184
3491
  var settingsRuntimePromise;
3185
3492
  function loadSettingsRuntimeModules() {
3186
3493
  settingsRuntimePromise ??= Promise.all([
3187
- import("./settings-ESZ3NWAP.js"),
3188
- import("./environment-7QRYIEBA.js"),
3189
- import("./loadedSettingsAdapter-SJ2MJF35.js"),
3190
- import("./trustedFolders-QMH25GOX.js")
3494
+ import("./settings-GBBVKBQ2.js"),
3495
+ import("./environment-6IEK2353.js"),
3496
+ import("./loadedSettingsAdapter-X7FC5332.js"),
3497
+ import("./trustedFolders-FDJ2Q4ZK.js")
3191
3498
  ]).then(([settings, environment, loadedSettingsAdapter, trustedFolders]) => ({
3192
3499
  settings,
3193
3500
  environment,
@@ -3200,8 +3507,8 @@ __name(loadSettingsRuntimeModules, "loadSettingsRuntimeModules");
3200
3507
  var channelWebhookConfigRuntimePromise;
3201
3508
  function loadChannelWebhookConfigRuntime() {
3202
3509
  channelWebhookConfigRuntimePromise ??= Promise.all([
3203
- import("./runtime-PR5RKGNH.js"),
3204
- import("./config-utils-NJQA5YLJ.js")
3510
+ import("./runtime-7QGB6SY4.js"),
3511
+ import("./config-utils-XJTGZVY3.js")
3205
3512
  ]).then(([channelRuntime, configUtils]) => ({
3206
3513
  loadChannelsConfig: channelRuntime.loadChannelsConfig,
3207
3514
  parseChannelWebhookConfig: configUtils.parseChannelWebhookConfig
@@ -3224,19 +3531,21 @@ async function loadServeRuntimeModules() {
3224
3531
  workspaceProvidersStatusModule,
3225
3532
  workspaceSkillsStatusModule,
3226
3533
  totalSessionAdmissionModule,
3227
- workspaceRegistryModule
3534
+ workspaceRegistryModule,
3535
+ promptLedgerModule
3228
3536
  ] = await Promise.all([
3229
- import("./server-YXB3DBN7.js"),
3230
- import("./bridge-WQ4IL2RF.js"),
3231
- import("./spawnChannel-S63APBZZ.js"),
3537
+ import("./server-ZMZPHJEC.js"),
3538
+ import("./bridge-MG4F5NOH.js"),
3539
+ import("./spawnChannel-TVKIFXXA.js"),
3232
3540
  import("./process-registry-PMJOA5CO.js"),
3233
- import("./workspace-service-6RLSGUB5.js"),
3541
+ import("./workspace-service-RWB4KMY3.js"),
3234
3542
  import("./types-WYCFCEHR.js"),
3235
- import("./daemon-status-provider-SXS66ZIR.js"),
3236
- import("./workspace-providers-status-OXGV4EFF.js"),
3237
- import("./workspace-skills-status-BHFEPDGH.js"),
3238
- import("./total-session-admission-DQVW2LIP.js"),
3239
- import("./workspace-registry-KJVIYTF5.js")
3543
+ import("./daemon-status-provider-JBEST4SF.js"),
3544
+ import("./workspace-providers-status-LNMP7NED.js"),
3545
+ import("./workspace-skills-status-P3XXZY7C.js"),
3546
+ import("./total-session-admission-NZNCU5NU.js"),
3547
+ import("./workspace-registry-KWPGC2LG.js"),
3548
+ import("./prompt-terminal-ledger-RW62JIPP.js")
3240
3549
  ]);
3241
3550
  return {
3242
3551
  createServeApp: serverModule.createServeApp,
@@ -3256,7 +3565,8 @@ async function loadServeRuntimeModules() {
3256
3565
  createTotalSessionAdmissionController: totalSessionAdmissionModule.createTotalSessionAdmissionController,
3257
3566
  createWorkspaceRegistry: workspaceRegistryModule.createWorkspaceRegistry,
3258
3567
  createWorkspaceSessionOwnerIndex: workspaceRegistryModule.createWorkspaceSessionOwnerIndex,
3259
- createWorkspaceGenerationGuard: workspaceRegistryModule.createWorkspaceGenerationGuard
3568
+ createWorkspaceGenerationGuard: workspaceRegistryModule.createWorkspaceGenerationGuard,
3569
+ createPromptLedgerSink: promptLedgerModule.createPromptLedgerSink
3260
3570
  };
3261
3571
  }
3262
3572
  __name(loadServeRuntimeModules, "loadServeRuntimeModules");
@@ -3433,12 +3743,12 @@ async function waitForRuntimeStartingForShutdown(runtimeStarting, daemonLog, tim
3433
3743
  let timer;
3434
3744
  await Promise.race([
3435
3745
  runtimeStarting,
3436
- new Promise((resolve3) => {
3746
+ new Promise((resolve4) => {
3437
3747
  timer = setTimeout(() => {
3438
3748
  daemonLog.warn(
3439
3749
  `${timeoutMs}ms runtime-startup wait reached during shutdown; continuing listener close`
3440
3750
  );
3441
- resolve3();
3751
+ resolve4();
3442
3752
  }, timeoutMs);
3443
3753
  timer.unref();
3444
3754
  })
@@ -4275,7 +4585,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
4275
4585
  }
4276
4586
  let workspaceRegistrationStore = deps.workspaceRegistrationStore;
4277
4587
  if (workspaceRegistrationStore === void 0 && process.env["QWEN_SERVE_NO_PERSISTENT_REGISTRATION"] !== "1") {
4278
- const { WorkspaceRegistrationStore } = await import("./workspace-registration-store-V5EGKLBH.js");
4588
+ const { WorkspaceRegistrationStore } = await import("./workspace-registration-store-QZ3P3ILN.js");
4279
4589
  workspaceRegistrationStore = new WorkspaceRegistrationStore(boundWorkspace);
4280
4590
  }
4281
4591
  if (workspaceRegistrationStore) {
@@ -4559,7 +4869,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
4559
4869
  "qwen serve: required external tool guard handshake succeeded."
4560
4870
  );
4561
4871
  }
4562
- const { createDaemonToolGuard } = await import("./daemon-git-worktree-guard-6P27GKSU.js");
4872
+ const { createDaemonToolGuard } = await import("./daemon-git-worktree-guard-XSZ3362V.js");
4563
4873
  const daemonToolGuardHandler = createDaemonToolGuard(
4564
4874
  externalToolGuardHandler
4565
4875
  );
@@ -4602,8 +4912,8 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
4602
4912
  let resolveServeAppStartup;
4603
4913
  let rejectServeAppStartup;
4604
4914
  let serveAppStartupSettled = false;
4605
- const serveAppStartupReady = new Promise((resolve3, reject) => {
4606
- resolveServeAppStartup = resolve3;
4915
+ const serveAppStartupReady = new Promise((resolve4, reject) => {
4916
+ resolveServeAppStartup = resolve4;
4607
4917
  rejectServeAppStartup = reject;
4608
4918
  });
4609
4919
  void serveAppStartupReady.catch(() => void 0);
@@ -4633,8 +4943,8 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
4633
4943
  let startRuntimeAfterHealth;
4634
4944
  let startRuntimeForRequest;
4635
4945
  const deferRuntimeUntilFirstHealth = deps.resolveOnListen === true && deps.deferRuntimeUntilFirstHealth === true;
4636
- const runtimeReady = new Promise((resolve3, reject) => {
4637
- markRuntimeReady = resolve3;
4946
+ const runtimeReady = new Promise((resolve4, reject) => {
4947
+ markRuntimeReady = resolve4;
4638
4948
  markRuntimeFailed = reject;
4639
4949
  });
4640
4950
  void runtimeReady.catch(() => {
@@ -4895,7 +5205,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
4895
5205
  loadCoreRuntime(),
4896
5206
  loadSettingsRuntimeModules(),
4897
5207
  cliVersionPromise,
4898
- import("./daemon-trust-policy-5QJHAS3N.js")
5208
+ import("./daemon-trust-policy-S6LBG4WN.js")
4899
5209
  ]);
4900
5210
  cliVersion = resolvedCliVersion;
4901
5211
  settingsRuntime.environment.preResolveHomeEnvOverrides();
@@ -4988,6 +5298,10 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
4988
5298
  runtimeBootSettings,
4989
5299
  runtimeEnvSnapshot.effectiveEnv
4990
5300
  );
5301
+ const sessionAttachmentsRoot = /* @__PURE__ */ __name((workspace, runtimeBaseDir) => path.join(
5302
+ new core.Storage(workspace, runtimeBaseDir).getProjectTempDir(),
5303
+ "attachments"
5304
+ ), "sessionAttachmentsRoot");
4991
5305
  const runtimeEffectiveEnv = {
4992
5306
  ...runtimeEnvSnapshot.effectiveEnv,
4993
5307
  QWEN_RUNTIME_DIR: primarySessionRuntimeBaseDir
@@ -5267,7 +5581,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5267
5581
  resolveSkillSettings,
5268
5582
  skillSettingStrings,
5269
5583
  updateWorkspaceSkillSettingLists
5270
- } = await import("./skill-settings-V64NIOTI.js");
5584
+ } = await import("./skill-settings-VEC7C44Z.js");
5271
5585
  const fresh = loadSettingsForPersistence(workspace);
5272
5586
  const normalizedName = skillName.trim().toLowerCase();
5273
5587
  const resolved = resolveSkillSettings(fresh);
@@ -5332,7 +5646,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5332
5646
  resolveSkillSettings,
5333
5647
  skillSettingStrings,
5334
5648
  updateWorkspaceSkillSettingLists
5335
- } = await import("./skill-settings-V64NIOTI.js");
5649
+ } = await import("./skill-settings-VEC7C44Z.js");
5336
5650
  const fresh = loadSettingsForPersistence(workspace);
5337
5651
  const resolved = resolveSkillSettings(fresh);
5338
5652
  const initialDisabled = skillSettingStrings(
@@ -5437,7 +5751,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5437
5751
  );
5438
5752
  }
5439
5753
  }), "persistSettingsFn");
5440
- const { createSubSessionLauncher } = await import("./create-sub-session-IQFIPUQA.js");
5754
+ const { createSubSessionLauncher } = await import("./create-sub-session-DPEBT657.js");
5441
5755
  const subSessionLauncher = createSubSessionLauncher({
5442
5756
  getBridge: /* @__PURE__ */ __name(() => bridgeRef, "getBridge"),
5443
5757
  boundWorkspace,
@@ -5446,6 +5760,10 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5446
5760
  )
5447
5761
  });
5448
5762
  const bridge = deps.bridge ?? runtime.createAcpSessionBridge({
5763
+ sessionAttachmentsRoot: sessionAttachmentsRoot(
5764
+ boundWorkspace,
5765
+ primarySessionRuntimeBaseDir
5766
+ ),
5449
5767
  // Reverse tool channel: let `BridgeClient.extMethod` reach the WS
5450
5768
  // connection that hosts a named client MCP server (#5626).
5451
5769
  clientMcpSender: clientMcpSenderRegistry.lookup,
@@ -5482,6 +5800,12 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5482
5800
  ...opts.sessionIdleTimeoutMs !== void 0 ? { sessionIdleTimeoutMs: opts.sessionIdleTimeoutMs } : {},
5483
5801
  ...opts.permissionResponseTimeoutMs !== void 0 ? { permissionResponseTimeoutMs: opts.permissionResponseTimeoutMs } : {},
5484
5802
  boundWorkspace,
5803
+ // Prompt terminal ledger: persisted beside the transcript so a
5804
+ // restarted daemon can reconcile dangling prompts on cold load.
5805
+ promptLedger: runtime.createPromptLedgerSink(
5806
+ boundWorkspace,
5807
+ primarySessionRuntimeBaseDir
5808
+ ),
5485
5809
  sessionShellCommandEnabled,
5486
5810
  childEnvOverrides,
5487
5811
  channelFactory,
@@ -5761,6 +6085,10 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5761
6085
  )
5762
6086
  });
5763
6087
  const secondaryBridge = runtime.createAcpSessionBridge({
6088
+ sessionAttachmentsRoot: sessionAttachmentsRoot(
6089
+ workspaceInput.cwd,
6090
+ secondaryEnv.sessionRuntimeBaseDir
6091
+ ),
5764
6092
  clientMcpSender: secondaryClientMcpSenderRegistry.lookup,
5765
6093
  onCreateSubSession: secondarySubSessionLauncher.launch,
5766
6094
  onChannelDelivery: createBoundChannelDeliveryHandler(
@@ -5795,6 +6123,10 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5795
6123
  ...opts.sessionIdleTimeoutMs !== void 0 ? { sessionIdleTimeoutMs: opts.sessionIdleTimeoutMs } : {},
5796
6124
  ...opts.permissionResponseTimeoutMs !== void 0 ? { permissionResponseTimeoutMs: opts.permissionResponseTimeoutMs } : {},
5797
6125
  boundWorkspace: workspaceInput.cwd,
6126
+ promptLedger: runtime.createPromptLedgerSink(
6127
+ workspaceInput.cwd,
6128
+ secondaryEnv.sessionRuntimeBaseDir
6129
+ ),
5798
6130
  sessionShellCommandEnabled,
5799
6131
  childEnvOverrides,
5800
6132
  channelFactory: secondaryChannelFactory,
@@ -6133,6 +6465,10 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
6133
6465
  let wsBridge;
6134
6466
  try {
6135
6467
  wsBridge = runtime.createAcpSessionBridge({
6468
+ sessionAttachmentsRoot: sessionAttachmentsRoot(
6469
+ cwd,
6470
+ wsEnv.sessionRuntimeBaseDir
6471
+ ),
6136
6472
  clientMcpSender: wsClientMcpRegistry.lookup,
6137
6473
  onCreateSubSession: wsSubSessionLauncher.launch,
6138
6474
  onChannelDelivery: createBoundChannelDeliveryHandler(
@@ -6165,6 +6501,14 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
6165
6501
  ...opts.sessionIdleTimeoutMs !== void 0 ? { sessionIdleTimeoutMs: opts.sessionIdleTimeoutMs } : {},
6166
6502
  ...opts.permissionResponseTimeoutMs !== void 0 ? { permissionResponseTimeoutMs: opts.permissionResponseTimeoutMs } : {},
6167
6503
  boundWorkspace: cwd,
6504
+ // Live-conversation workspaces keep transcripts outside the
6505
+ // runtime storage layout, so no ledger sink is wired there.
6506
+ ...provenance === "live-conversation" ? {} : {
6507
+ promptLedger: runtime.createPromptLedgerSink(
6508
+ cwd,
6509
+ wsEnv.sessionRuntimeBaseDir
6510
+ )
6511
+ },
6168
6512
  sessionShellCommandEnabled,
6169
6513
  childEnvOverrides,
6170
6514
  channelFactory: wsChannelFactory,
@@ -6612,8 +6956,8 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
6612
6956
  { createChannelManagementService },
6613
6957
  { WorkspaceChannelSettingsStore }
6614
6958
  ] = await Promise.all([
6615
- import("./channel-management-service-X6LCQUAD.js"),
6616
- import("./channel-settings-store-ZDFXY7VY.js")
6959
+ import("./channel-management-service-KHPAWCX7.js"),
6960
+ import("./channel-settings-store-GQUCL2YM.js")
6617
6961
  ]);
6618
6962
  return createChannelManagementService({
6619
6963
  workspaceCwd: targetRuntime.workspaceCwd,
@@ -6816,8 +7160,8 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
6816
7160
  { createWorkspaceTrustReconciler },
6817
7161
  { createDaemonTrustPolicyMonitor }
6818
7162
  ] = await Promise.all([
6819
- import("./workspace-trust-reconciler-DB5ERSUN.js"),
6820
- import("./daemon-trust-policy-monitor-JA2WZRZ3.js")
7163
+ import("./workspace-trust-reconciler-XU6WB2MF.js"),
7164
+ import("./daemon-trust-policy-monitor-NFO3OIBN.js")
6821
7165
  ]);
6822
7166
  const materializationFor = /* @__PURE__ */ __name((entry, snapshot, decision) => {
6823
7167
  const boundWorkspaces2 = entry.primary && decision.targetTrusted ? runtime.resolveBoundWorkspacesFromIdeEnv(
@@ -6912,7 +7256,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
6912
7256
  handle?.disposeWorkspace(runtimeToDispose.workspaceId);
6913
7257
  const deadline = Date.now() + 1e3;
6914
7258
  while ((handle?.getWorkspaceActivity(runtimeToDispose.workspaceId).memoryTasks ?? 0) > 0 && Date.now() < deadline) {
6915
- await new Promise((resolve3) => setTimeout(resolve3, 25));
7259
+ await new Promise((resolve4) => setTimeout(resolve4, 25));
6916
7260
  }
6917
7261
  if ((handle?.getWorkspaceActivity(runtimeToDispose.workspaceId).memoryTasks ?? 0) > 0) {
6918
7262
  throw new Error(
@@ -7032,7 +7376,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
7032
7376
  );
7033
7377
  }
7034
7378
  const channelValidationSettingsRuntime = opts.channelSelection ? await loadSettingsRuntimeModules() : void 0;
7035
- const channelValidationTrustPolicy = opts.channelSelection ? await import("./daemon-trust-policy-5QJHAS3N.js") : void 0;
7379
+ const channelValidationTrustPolicy = opts.channelSelection ? await import("./daemon-trust-policy-S6LBG4WN.js") : void 0;
7036
7380
  const channelValidationTrustSnapshot = channelValidationTrustPolicy ? await channelValidationTrustPolicy.readDaemonTrustPolicySnapshot() : void 0;
7037
7381
  const resolveChannelWorkspaceGroupsAtListen = /* @__PURE__ */ __name(() => {
7038
7382
  if (!opts.channelSelection || !channelValidationSettingsRuntime || !channelRuntime) {
@@ -7138,7 +7482,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
7138
7482
  if (opts.channelSelection) {
7139
7483
  reserveChannelServicePidfile(opts.channelSelection);
7140
7484
  }
7141
- return await new Promise((resolve3, reject) => {
7485
+ return await new Promise((resolve4, reject) => {
7142
7486
  let closeHost;
7143
7487
  const onListening = /* @__PURE__ */ __name((error) => {
7144
7488
  if (error) return;
@@ -8108,7 +8452,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
8108
8452
  loggerPublished = true;
8109
8453
  loggerLifecycle.published();
8110
8454
  void (liveDiscoveryPublish ?? Promise.resolve()).then(
8111
- () => resolve3(handle)
8455
+ () => resolve4(handle)
8112
8456
  );
8113
8457
  } else {
8114
8458
  void runtimeReady.then(
@@ -8116,7 +8460,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
8116
8460
  await liveDiscoveryPublish;
8117
8461
  loggerPublished = true;
8118
8462
  loggerLifecycle.published();
8119
- resolve3(handle);
8463
+ resolve4(handle);
8120
8464
  },
8121
8465
  (err) => {
8122
8466
  void handle.close().then(
@@ -8165,10 +8509,10 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
8165
8509
  drainHost: /* @__PURE__ */ __name(() => {
8166
8510
  if (closeHost) return closeHost();
8167
8511
  if (!server.listening) return Promise.resolve();
8168
- return new Promise((resolve4, rejectClose) => {
8512
+ return new Promise((resolve5, rejectClose) => {
8169
8513
  server.close((error) => {
8170
8514
  if (error) rejectClose(error);
8171
- else resolve4();
8515
+ else resolve5();
8172
8516
  });
8173
8517
  });
8174
8518
  }, "drainHost")