@qwen-code/qwen-code 0.21.6 → 0.21.7

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 (288) hide show
  1. package/bundled/qc-helper/docs/configuration/settings.md +19 -9
  2. package/bundled/qc-helper/docs/features/channels/dingtalk.md +1 -1
  3. package/bundled/qc-helper/docs/features/code-review.md +27 -0
  4. package/bundled/qc-helper/docs/qwen-serve.md +1 -1
  5. package/bundled/review/SKILL.md +48 -16
  6. package/chunks/{MaxSizedBox-2HFKP4LI.js → MaxSizedBox-ANWZBPTS.js} +38 -38
  7. package/chunks/{StandaloneSessionPicker-RBV72M5N.js → StandaloneSessionPicker-XKS3VU3A.js} +54 -53
  8. package/chunks/{acpAgent-WO6JFCVQ.js → acpAgent-KUAZ3GCZ.js} +80 -80
  9. package/chunks/{agent-AHGLYNZ4.js → agent-T6PTGX5R.js} +35 -35
  10. package/chunks/{agent-headless-NTXKKGRO.js → agent-headless-PR7YCB7S.js} +35 -35
  11. package/chunks/{anthropicContentGenerator-3CAHEZBM.js → anthropicContentGenerator-DTMVEL5M.js} +7 -7
  12. package/chunks/{artifact-tool-RROCCJDA.js → artifact-tool-U4VOZIK5.js} +2 -2
  13. package/chunks/{askUserQuestion-2EPPBPUZ.js → askUserQuestion-XOBQLPFA.js} +2 -2
  14. package/chunks/{bridge-RPAU64CA.js → bridge-NU6YEEHK.js} +39 -39
  15. package/chunks/{channel-management-service-IGEUOVRT.js → channel-management-service-FSQ7SHYI.js} +1 -1
  16. package/chunks/{channel-settings-store-ON64MF7G.js → channel-settings-store-35VQVUVV.js} +41 -41
  17. package/chunks/{chunk-XC656O42.js → chunk-22NBYCPD.js} +3 -3
  18. package/chunks/{chunk-T4JSA7KU.js → chunk-23RZCH76.js} +3 -3
  19. package/chunks/{chunk-PX5DNLSA.js → chunk-2U3WZGZG.js} +18 -10
  20. package/chunks/chunk-2VSTGY6M.js +107 -0
  21. package/chunks/{chunk-QZKYZCN3.js → chunk-33ACCIIY.js} +3 -3
  22. package/chunks/{chunk-MBEMTXQT.js → chunk-3K7FH2KQ.js} +1 -32
  23. package/chunks/{chunk-ODPXHGLL.js → chunk-3NB7TSE2.js} +2 -2
  24. package/chunks/{chunk-QYPT3QUD.js → chunk-3ULCB3NE.js} +3 -3
  25. package/chunks/{chunk-C4CBJQKY.js → chunk-55LYDVPU.js} +1 -1
  26. package/chunks/{chunk-NKSF7HYF.js → chunk-5KH532V7.js} +1 -1
  27. package/chunks/{chunk-BOGOR4HB.js → chunk-6EOI4HOK.js} +7 -7
  28. package/chunks/{chunk-CA4UIDFU.js → chunk-6GONZVLS.js} +1 -1
  29. package/chunks/{chunk-3UOLYNTF.js → chunk-6HVUFDS2.js} +6 -6
  30. package/chunks/{chunk-5L6CQ4ZU.js → chunk-6M26GBKX.js} +2 -2
  31. package/chunks/{chunk-XA4TMLFN.js → chunk-6UWFTUQL.js} +530 -388
  32. package/chunks/{chunk-W5DXUTXD.js → chunk-6XJMFJ4D.js} +8 -8
  33. package/chunks/{chunk-ACZRB7AD.js → chunk-6XU3PH66.js} +3 -3
  34. package/chunks/{chunk-NGJOAKJY.js → chunk-72LNFGUY.js} +3 -3
  35. package/chunks/{chunk-33FNCQSY.js → chunk-7MH4J33A.js} +2 -2
  36. package/chunks/{chunk-2AGOQ7QO.js → chunk-7UFKAV7Y.js} +118 -6
  37. package/chunks/{chunk-O7V7N4G7.js → chunk-AE77C5ZU.js} +198 -35
  38. package/chunks/{chunk-JELIWHXD.js → chunk-AOHJKPKL.js} +1 -1
  39. package/chunks/{chunk-GLNBDYUX.js → chunk-AXMWHKXA.js} +6 -2
  40. package/chunks/{chunk-H36SETQS.js → chunk-B2GJNDTV.js} +1 -1
  41. package/chunks/{chunk-QMBEW7EW.js → chunk-BGG4MBYD.js} +2 -2
  42. package/chunks/{chunk-6WBWIPBF.js → chunk-BVWVWGLE.js} +2 -2
  43. package/chunks/{chunk-GK2H5GRC.js → chunk-CB2464BK.js} +5 -5
  44. package/chunks/{chunk-2UISUFHQ.js → chunk-CJXIIILK.js} +3 -3
  45. package/chunks/{chunk-WK4TJUEA.js → chunk-CKASRHZI.js} +1 -1
  46. package/chunks/{chunk-Z7JILXGX.js → chunk-CNIID3TV.js} +3 -3
  47. package/chunks/{chunk-5MJGUQU5.js → chunk-CSZEXZBE.js} +3 -3
  48. package/chunks/{chunk-KKN2IE7Q.js → chunk-CTJLZLB5.js} +1 -1
  49. package/chunks/{chunk-HY25ULVN.js → chunk-CXE7E23H.js} +131 -48
  50. package/chunks/{chunk-4WTAQEHV.js → chunk-CYR3HI5X.js} +3 -3
  51. package/chunks/{chunk-KHUA3NQV.js → chunk-DBOFL3LQ.js} +2 -2
  52. package/chunks/{chunk-4LKVQFHM.js → chunk-DREZZAZM.js} +2 -2
  53. package/chunks/{chunk-SQC6K5HI.js → chunk-E33LOKRA.js} +1 -1
  54. package/chunks/{chunk-2DNKEBXY.js → chunk-EI3HZX6C.js} +1 -1
  55. package/chunks/{chunk-U25CMJYY.js → chunk-EKPKKXY2.js} +1 -1
  56. package/chunks/{chunk-RHTTKJTP.js → chunk-EORNAQDT.js} +1 -1
  57. package/chunks/{chunk-432XCUHF.js → chunk-EQL65XGA.js} +1 -1
  58. package/chunks/{chunk-TYERNYH4.js → chunk-EUNWC2VS.js} +2 -2
  59. package/chunks/{chunk-OWSW7EYP.js → chunk-EUQTXRKZ.js} +6 -6
  60. package/chunks/{chunk-UH7Z7Y45.js → chunk-FOGU3LJX.js} +1 -1
  61. package/chunks/{chunk-536SWZTA.js → chunk-FPM27XN4.js} +4 -4
  62. package/chunks/{chunk-E4WHKETF.js → chunk-FVKHVJZQ.js} +2 -49
  63. package/chunks/{chunk-YMBOEAF4.js → chunk-FZBZSYKU.js} +1 -1
  64. package/chunks/{chunk-YZQTA3ID.js → chunk-GDXET5XU.js} +31 -3396
  65. package/chunks/{chunk-A5YZ3FA2.js → chunk-GM463R2B.js} +1 -1
  66. package/chunks/{chunk-MOHAWIAW.js → chunk-GNPNYXJB.js} +2 -2
  67. package/chunks/{chunk-2POQWYM6.js → chunk-GSS34377.js} +3 -3
  68. package/chunks/{chunk-CJ5WLD5Y.js → chunk-H2UQ2M5Z.js} +2 -2
  69. package/chunks/{chunk-SUKEUUAA.js → chunk-HQB2KUAN.js} +1 -1
  70. package/chunks/{chunk-JE44IPH6.js → chunk-HYRDKNUY.js} +2 -2
  71. package/chunks/{chunk-D7D7RXIJ.js → chunk-IC4Z6LX6.js} +1 -1
  72. package/chunks/{chunk-HU5TUALO.js → chunk-IIJEYBNH.js} +3 -3
  73. package/chunks/{chunk-EMYZIABH.js → chunk-IUFV6FYU.js} +1 -1
  74. package/chunks/{chunk-4S4OEQ6U.js → chunk-J6SZID63.js} +2 -2
  75. package/chunks/{chunk-BFHXDAR7.js → chunk-KKBPOU75.js} +1 -1
  76. package/chunks/{chunk-XM2O73NC.js → chunk-KKJJB5X6.js} +2455 -1314
  77. package/chunks/{chunk-SLSWFHDF.js → chunk-KR4ZSC7K.js} +4 -4
  78. package/chunks/{chunk-RFUHDCNF.js → chunk-KXSDEOFU.js} +1 -1
  79. package/chunks/{chunk-MGSSJT27.js → chunk-L4N6TIP7.js} +5 -3
  80. package/chunks/{chunk-OP2OHZ7K.js → chunk-LA7YLSR6.js} +6 -6
  81. package/chunks/{chunk-EXCEQD22.js → chunk-LEMXGVEP.js} +4 -4
  82. package/chunks/{chunk-WVAESIM6.js → chunk-LZC3B5N2.js} +4 -4
  83. package/chunks/{chunk-6O5DVH27.js → chunk-M6HMMKVG.js} +1 -1
  84. package/chunks/{chunk-75QMRMO7.js → chunk-MAJS7AT4.js} +3 -3
  85. package/chunks/{chunk-T5U6IM4C.js → chunk-MVUQRLOH.js} +3 -3
  86. package/chunks/{chunk-GLWP3FDB.js → chunk-MZSJ43WV.js} +31 -2
  87. package/chunks/{chunk-ZPPP6VCL.js → chunk-NG2R4N5O.js} +1 -1
  88. package/chunks/{chunk-UGTWD35F.js → chunk-NLREQJFK.js} +1 -1
  89. package/chunks/{chunk-N2GJU6KI.js → chunk-OFI7IGST.js} +12 -12
  90. package/chunks/{chunk-VGFPFM4U.js → chunk-OH2VKQXH.js} +42 -16
  91. package/chunks/{chunk-G5NNWEYE.js → chunk-OHJLEW5J.js} +4 -4
  92. package/chunks/{chunk-3RXUYQJI.js → chunk-OIVKILPI.js} +49 -0
  93. package/chunks/{chunk-VNQCPBC2.js → chunk-OMKQH5C5.js} +3 -3
  94. package/chunks/{chunk-LBWNSLJK.js → chunk-ONSZH6VM.js} +2 -2
  95. package/chunks/{chunk-DYA25Y7U.js → chunk-OWMAZHIX.js} +1 -1
  96. package/chunks/{chunk-4JH77A2U.js → chunk-P2AJ7FTI.js} +1 -1
  97. package/chunks/{chunk-WNU7TZTO.js → chunk-P3LEG54R.js} +3 -3
  98. package/chunks/{chunk-VSALQLT7.js → chunk-PJOBIWUG.js} +1 -1
  99. package/chunks/{chunk-PPUOYL77.js → chunk-PQBHU2IA.js} +49 -18
  100. package/chunks/{chunk-WO2B5E5B.js → chunk-Q3JQ7OSU.js} +1 -1
  101. package/chunks/{chunk-IMOQO6YL.js → chunk-QETYKPMG.js} +1 -1
  102. package/chunks/{chunk-DVBEGGLG.js → chunk-RERATVSK.js} +10 -9
  103. package/chunks/chunk-RGSBTHSU.js +3381 -0
  104. package/chunks/{chunk-DIT4V3XH.js → chunk-RMH5OWLD.js} +1 -1
  105. package/chunks/{chunk-TOGZTG4X.js → chunk-RNVQB725.js} +2 -2
  106. package/chunks/{chunk-GESMMPAK.js → chunk-RUL4S3K3.js} +79 -59
  107. package/chunks/{chunk-3LZKY4V4.js → chunk-RZHU3ILK.js} +5 -5
  108. package/chunks/{chunk-SKNE3KQC.js → chunk-SCI7K3GM.js} +4 -4
  109. package/chunks/{chunk-YAVY33G4.js → chunk-SEZ556DZ.js} +1 -1
  110. package/chunks/{chunk-Q5RM32DR.js → chunk-SHZYHGQH.js} +1 -1
  111. package/chunks/chunk-SOORFWKY.js +155 -0
  112. package/chunks/{chunk-K2B3X3E7.js → chunk-SPMY6CX6.js} +4 -4
  113. package/chunks/{chunk-FZFP7RZI.js → chunk-TDXGKHDN.js} +3 -3
  114. package/chunks/{chunk-R5RBXLNC.js → chunk-TLV2IMHR.js} +5 -5
  115. package/chunks/{chunk-U4AF3QLU.js → chunk-TRLYP7OF.js} +8 -8
  116. package/chunks/{chunk-ULPQQSDN.js → chunk-TYKC75AX.js} +3 -3
  117. package/chunks/{chunk-KVUBYJDM.js → chunk-TZEZYNYD.js} +1 -1
  118. package/chunks/{chunk-XC2VAFVZ.js → chunk-UVX4Y6IN.js} +1 -1
  119. package/chunks/{chunk-RK2EE3T7.js → chunk-VOARQPTA.js} +2 -2
  120. package/chunks/{chunk-TGGEZINK.js → chunk-W4B7UBUS.js} +7 -7
  121. package/chunks/{chunk-URN76TKR.js → chunk-WCG5O7IP.js} +2 -2
  122. package/chunks/{chunk-TSERKWCX.js → chunk-XCWO3SMQ.js} +3 -3
  123. package/chunks/{chunk-OXX3FG2N.js → chunk-Y4EWSQF7.js} +3 -3
  124. package/chunks/{chunk-3PRJYMXC.js → chunk-Y4NGLFGJ.js} +1 -1
  125. package/chunks/{chunk-A4VTILZT.js → chunk-Y7E5LNLO.js} +115 -85
  126. package/chunks/{chunk-3LGZEYOF.js → chunk-YHEEE624.js} +2 -2
  127. package/chunks/{chunk-SQOMTWQT.js → chunk-YJQCUTT2.js} +4 -4
  128. package/chunks/{chunk-GWRHVJY2.js → chunk-ZJ3VGYHK.js} +20 -20
  129. package/chunks/{chunk-LAAFLUQV.js → chunk-ZXU5UHMI.js} +1 -1
  130. package/chunks/{computer-use-5HXJ2P4X.js → computer-use-KEAPATUY.js} +35 -35
  131. package/chunks/{config-utils-VXD4SPVR.js → config-utils-K7SCOWHD.js} +2 -2
  132. package/chunks/{contextCommand-7BEHRX2H.js → contextCommand-ZJA6A5K5.js} +37 -37
  133. package/chunks/{core-runtime-U4VJ5TIV.js → core-runtime-QMJPWHCI.js} +35 -35
  134. package/chunks/{create-sub-session-QZNQY332.js → create-sub-session-DJE6XICH.js} +35 -35
  135. package/chunks/{create-sub-session-6EWLAZD5.js → create-sub-session-E4PBYXV5.js} +2 -2
  136. package/chunks/{cron-create-CCRIULJE.js → cron-create-GRBWYMIJ.js} +4 -4
  137. package/chunks/{cron-delete-FCFW6BGP.js → cron-delete-4CMKBR2M.js} +4 -4
  138. package/chunks/{cron-list-QDBVCHRF.js → cron-list-W7K4ASOA.js} +4 -4
  139. package/chunks/{daemon-YI5RY62O.js → daemon-SCTQMM7Z.js} +50 -2
  140. package/chunks/{daemon-status-provider-UJUGTDTL.js → daemon-status-provider-FSWDPE2G.js} +43 -43
  141. package/chunks/{daemon-trust-policy-ZHDD5VYQ.js → daemon-trust-policy-P5L5VFAY.js} +40 -40
  142. package/chunks/{daemon-trust-policy-monitor-5SHYBDGA.js → daemon-trust-policy-monitor-73JYN6ET.js} +40 -40
  143. package/chunks/{deferred-core-runtime-QWAEBTR5.js → deferred-core-runtime-BWRCCFTE.js} +35 -35
  144. package/chunks/{display-image-GUJA352B.js → display-image-O2XFPQTC.js} +4 -4
  145. package/chunks/{dist-A7H2KKUC.js → dist-K4WWQBHS.js} +277 -98
  146. package/chunks/{earlyInputCapture-5BMSGKOI.js → earlyInputCapture-L5ST23A6.js} +36 -36
  147. package/chunks/{edit-IVQQVYYK.js → edit-LHHRFNFK.js} +35 -35
  148. package/chunks/{enter-worktree-P3DF2N6O.js → enter-worktree-6NXCRZPF.js} +35 -35
  149. package/chunks/{enterPlanMode-KKTDVLAD.js → enterPlanMode-ZVQT4U7D.js} +35 -35
  150. package/chunks/{environment-W5TRDM3G.js → environment-GJ2HWJOS.js} +37 -37
  151. package/chunks/{errors-GJJB36IG.js → errors-6RLH3XXC.js} +37 -37
  152. package/chunks/{exit-worktree-LV5RLOCU.js → exit-worktree-I2YLUHHY.js} +35 -35
  153. package/chunks/{exitPlanMode-TUGOB2LL.js → exitPlanMode-7CCWKO7I.js} +35 -35
  154. package/chunks/{fast-path-2FU23PAQ.js → fast-path-DVFD4HQD.js} +2 -2
  155. package/chunks/{gemini-KDULDQPP.js → gemini-7FWGOYD4.js} +72 -72
  156. package/chunks/{geminiContentGenerator-LOCFHNVA.js → geminiContentGenerator-V2WVLIXU.js} +6 -6
  157. package/chunks/{glob-Z4NQFKWS.js → glob-3N6GGI75.js} +35 -35
  158. package/chunks/{goal-tools-3AZKX5WQ.js → goal-tools-APOW6UXL.js} +3 -3
  159. package/chunks/{grep-Z67Z7EN6.js → grep-V43ILZVX.js} +35 -35
  160. package/chunks/{handleAutoUpdate-DFUZE6I6.js → handleAutoUpdate-A5WFVWIA.js} +39 -39
  161. package/chunks/{i18n-R4FMZ7N2.js → i18n-PLVQ4FBZ.js} +36 -36
  162. package/chunks/{image-gen-4CQJPQP5.js → image-gen-7C6IK6DC.js} +9 -9
  163. package/chunks/{initializer-DK672ZVE.js → initializer-CVAIKZYL.js} +41 -41
  164. package/chunks/{installationInfo-PO4Z3ES7.js → installationInfo-J6QDHNTK.js} +36 -36
  165. package/chunks/{keychain-token-storage-7BT4TQ2A.js → keychain-token-storage-TVAMTNP7.js} +2 -2
  166. package/chunks/{list-QXQF6C53.js → list-ZZ4OUUWV.js} +43 -43
  167. package/chunks/{list-agents-GC4BRET7.js → list-agents-KFFIIS2G.js} +2 -2
  168. package/chunks/{loadedSettingsAdapter-4D7GUGW6.js → loadedSettingsAdapter-QRYRJSWL.js} +40 -40
  169. package/chunks/{loggingContentGenerator-2P3MNACM.js → loggingContentGenerator-OJCO75HM.js} +17 -17
  170. package/chunks/{loop-wakeup-SQQSBMEY.js → loop-wakeup-TLMJPMMP.js} +5 -5
  171. package/chunks/{ls-63CC3NNX.js → ls-UVVE2XGE.js} +4 -4
  172. package/chunks/{lsp-P6NVJVNT.js → lsp-QMEA2VLB.js} +2 -2
  173. package/chunks/{managed-npm-update-LWVJQTWO.js → managed-npm-update-PCOSCP2N.js} +36 -36
  174. package/chunks/{mcp-GHETAR6V.js → mcp-M3WKKWKY.js} +40 -40
  175. package/chunks/{monitor-4T7W4M6Q.js → monitor-GN24FH6C.js} +35 -35
  176. package/chunks/{nonInteractiveCli-P4UKCJFM.js → nonInteractiveCli-KPTU3VSQ.js} +72 -72
  177. package/chunks/{notebook-edit-OC2V7U5D.js → notebook-edit-4YM65BBO.js} +35 -35
  178. package/chunks/{openaiContentGenerator-RAJUFWQY.js → openaiContentGenerator-EDQT6GTV.js} +19 -19
  179. package/chunks/{pidfile-HVPYVRLS.js → pidfile-JOIIRN2C.js} +36 -36
  180. package/chunks/{processUtils-VIQ4JHVX.js → processUtils-5SV4MX3Q.js} +2 -2
  181. package/chunks/{qwenContentGenerator-2QLCUFNZ.js → qwenContentGenerator-ODRJSUGR.js} +40 -40
  182. package/chunks/{qwenOAuth2-J2X3EN43.js → qwenOAuth2-NESCMZ47.js} +8 -8
  183. package/chunks/{read-file-ZNAN2B26.js → read-file-HPSODLPK.js} +10 -10
  184. package/chunks/{read-mcp-resource-RTSSEER5.js → read-mcp-resource-2TNSJTC3.js} +2 -2
  185. package/chunks/{record-artifact-E6AWQU2Z.js → record-artifact-RAON52FC.js} +3 -3
  186. package/chunks/{resumeHistoryUtils-RCY7AL5Y.js → resumeHistoryUtils-TXCOFFMQ.js} +41 -40
  187. package/chunks/{ripGrep-C3KMLZM5.js → ripGrep-ZKQGTQAO.js} +35 -35
  188. package/chunks/{run-qwen-serve-3JN75CIQ.js → run-qwen-serve-ZPKPKECF.js} +65 -43
  189. package/chunks/{runtime-VUA4WQYD.js → runtime-2FLNNM36.js} +43 -43
  190. package/chunks/{scheduler-Z4IBXCOY.js → scheduler-365PJHNR.js} +35 -35
  191. package/chunks/{sdk-exporters-http-IL2346MJ.js → sdk-exporters-http-KHAB5JSD.js} +2 -2
  192. package/chunks/{sdk-impl-SYKGVWOZ.js → sdk-impl-KD7FSTC3.js} +2 -2
  193. package/chunks/{send-message-TL6FIMMN.js → send-message-ZM7MRUGP.js} +5 -5
  194. package/chunks/{serve-67T3P7XI.js → serve-QD2RNLKJ.js} +41 -41
  195. package/chunks/{server-46ZO2CLV.js → server-XLJVLTYM.js} +621 -332
  196. package/chunks/{session-B4IFAFC4.js → session-3VTUHH4Q.js} +73 -73
  197. package/chunks/{settings-AI2BTBOZ.js → settings-KULVPCQC.js} +39 -39
  198. package/chunks/{shell-BKII3B6E.js → shell-3SWW22MH.js} +35 -35
  199. package/chunks/{skill-6CFOWVGA.js → skill-KDHWYS7W.js} +14 -14
  200. package/chunks/{skill-settings-6BFQWMW4.js → skill-settings-NMY4JEJC.js} +39 -39
  201. package/chunks/{spawnChannel-FJXW35U7.js → spawnChannel-ZKS4Q5OU.js} +37 -37
  202. package/chunks/{standalone-update-WVINHRNS.js → standalone-update-7CXPGAQ4.js} +37 -37
  203. package/chunks/{startInteractiveUI-YE57CJ57.js → startInteractiveUI-2QQLEKM6.js} +399 -159
  204. package/chunks/{syntheticOutput-BN7E626U.js → syntheticOutput-ZLCUTKO2.js} +3 -3
  205. package/chunks/{task-create-Q727MXHJ.js → task-create-CQP5UEA3.js} +9 -9
  206. package/chunks/{task-list-G6KPQ5JT.js → task-list-XLEZOJXP.js} +5 -5
  207. package/chunks/{task-stop-TNXRNAL2.js → task-stop-7ZQM5CFF.js} +2 -2
  208. package/chunks/{task-update-YB7PXO4R.js → task-update-JA75U2SN.js} +9 -9
  209. package/chunks/{team-create-GNC7NFY6.js → team-create-2WTNGAOX.js} +35 -35
  210. package/chunks/{team-delete-GDO7H2T4.js → team-delete-MHY3UZGY.js} +5 -5
  211. package/chunks/{team-plan-approval-ECALJLIO.js → team-plan-approval-LZTYLEG4.js} +35 -35
  212. package/chunks/{terminal-image-renderer-II74TFVW.js → terminal-image-renderer-R5HHAFJN.js} +41 -36
  213. package/chunks/{theme-manager-2MGEDD22.js → theme-manager-PAUCSJFF.js} +36 -36
  214. package/chunks/{todoWrite-MHWHO5UO.js → todoWrite-UPVOHYGD.js} +4 -4
  215. package/chunks/{tool-search-S6LRRACA.js → tool-search-2BFCGLI6.js} +13 -13
  216. package/chunks/{total-session-admission-7WVAWQPU.js → total-session-admission-MK4SINFK.js} +39 -39
  217. package/chunks/{trustedFolders-NFS4KHO4.js → trustedFolders-TJ5S26N7.js} +36 -36
  218. package/chunks/{update-relaunch-Q5HLZ6UW.js → update-relaunch-N7AYLARF.js} +5 -5
  219. package/chunks/{updateCheck-UOVZSTP7.js → updateCheck-QRZ3DVT5.js} +38 -38
  220. package/chunks/{useAutoAcceptIndicator-PC6MOJCO.js → useAutoAcceptIndicator-DBJ7Y5AF.js} +42 -42
  221. package/chunks/{validateNonInterActiveAuth-YMQP3ZM7.js → validateNonInterActiveAuth-6ZQWUDS3.js} +69 -69
  222. package/chunks/{version-T4AQFZJH.js → version-AJQGQWXC.js} +1 -1
  223. package/chunks/{web-fetch-JQCJHEEX.js → web-fetch-QWJYRXFL.js} +13 -13
  224. package/chunks/{web-search-QGZ2KY4G.js → web-search-2AOXJGHU.js} +9 -9
  225. package/chunks/web-shell-static-O73YPVVC.js +33 -0
  226. package/chunks/{workflow-YIT27YWZ.js → workflow-ERH3SJG2.js} +36 -36
  227. package/chunks/{workspace-providers-status-FIDZQ2PL.js → workspace-providers-status-HZ474RA4.js} +43 -43
  228. package/chunks/{workspace-registration-store-RCSPE4DU.js → workspace-registration-store-6EUP4JXG.js} +1 -1
  229. package/chunks/{workspace-registry-5PEUCY6E.js → workspace-registry-R4APRRNC.js} +39 -39
  230. package/chunks/{workspace-service-LANDVPL7.js → workspace-service-HFIFDMU7.js} +45 -45
  231. package/chunks/{workspace-skills-status-2IQVJNIN.js → workspace-skills-status-HAHEIHGK.js} +41 -41
  232. package/chunks/{workspace-trust-reconciler-CZPZZCZC.js → workspace-trust-reconciler-65GTAGDK.js} +45 -45
  233. package/chunks/{write-file-G5VNGCOG.js → write-file-B34CDELV.js} +35 -35
  234. package/chunks/{zoom-image-6RBLD7X6.js → zoom-image-HPRBZHSS.js} +10 -10
  235. package/cli.js +12 -12
  236. package/package.json +3 -3
  237. package/web-shell/assets/{arc-B-Vtkp1W.js → arc-Ip-FFDJ0.js} +1 -1
  238. package/web-shell/assets/{architectureDiagram-3BPJPVTR-qmTXIj64.js → architectureDiagram-3BPJPVTR-CChqgwIb.js} +1 -1
  239. package/web-shell/assets/{blockDiagram-GPEHLZMM-ZlnXEtdP.js → blockDiagram-GPEHLZMM-BHN-Tfss.js} +1 -1
  240. package/web-shell/assets/{c4Diagram-AAUBKEIU-Wyoirf6Z.js → c4Diagram-AAUBKEIU-BhyjzDjN.js} +1 -1
  241. package/web-shell/assets/channel-Cu8qd6OB.js +1 -0
  242. package/web-shell/assets/{chunk-2J33WTMH-WQwbq9d8.js → chunk-2J33WTMH-BB9eyHrx.js} +1 -1
  243. package/web-shell/assets/{chunk-4BX2VUAB-DQKnAXC4.js → chunk-4BX2VUAB-BeV7ce_J.js} +1 -1
  244. package/web-shell/assets/{chunk-55IACEB6-DIdgXNcO.js → chunk-55IACEB6-DO7kXDiV.js} +1 -1
  245. package/web-shell/assets/{chunk-727SXJPM-CUwGOLEd.js → chunk-727SXJPM-B27MPznD.js} +1 -1
  246. package/web-shell/assets/{chunk-AQP2D5EJ-CCBGZFZ4.js → chunk-AQP2D5EJ-DHIjqjD_.js} +1 -1
  247. package/web-shell/assets/{chunk-FMBD7UC4-DMGXProk.js → chunk-FMBD7UC4-DabMqyN2.js} +1 -1
  248. package/web-shell/assets/{chunk-ND2GUHAM-yejcFqsh.js → chunk-ND2GUHAM-Dw7Nnnxc.js} +1 -1
  249. package/web-shell/assets/{chunk-QZHKN3VN-DxCyqTf7.js → chunk-QZHKN3VN-DdaZew1Q.js} +1 -1
  250. package/web-shell/assets/classDiagram-4FO5ZUOK-BI3KrXhq.js +1 -0
  251. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BI3KrXhq.js +1 -0
  252. package/web-shell/assets/{cose-bilkent-S5V4N54A-DOrF3cg_.js → cose-bilkent-S5V4N54A-CgBpCYH5.js} +1 -1
  253. package/web-shell/assets/{dagre-BM42HDAG-Be6CdYQ_.js → dagre-BM42HDAG-BB4IU8G0.js} +1 -1
  254. package/web-shell/assets/{diagram-2AECGRRQ-B_Rjsft2.js → diagram-2AECGRRQ-BcUTHU37.js} +1 -1
  255. package/web-shell/assets/{diagram-5GNKFQAL-BvQbKSm1.js → diagram-5GNKFQAL-B6Lyihyv.js} +1 -1
  256. package/web-shell/assets/{diagram-KO2AKTUF-BsdmMdpS.js → diagram-KO2AKTUF-CRIJOjpG.js} +1 -1
  257. package/web-shell/assets/{diagram-LMA3HP47-CrQlBaNr.js → diagram-LMA3HP47-DdNiwWWT.js} +1 -1
  258. package/web-shell/assets/{diagram-OG6HWLK6-aB1MD_DL.js → diagram-OG6HWLK6-Dz4b32Do.js} +1 -1
  259. package/web-shell/assets/{erDiagram-TEJ5UH35-F-eUUn9n.js → erDiagram-TEJ5UH35-D-8NGw77.js} +1 -1
  260. package/web-shell/assets/{flowDiagram-I6XJVG4X-DY_d8lUK.js → flowDiagram-I6XJVG4X-Dun26LyM.js} +1 -1
  261. package/web-shell/assets/{ganttDiagram-6RSMTGT7-Dqu7KBPg.js → ganttDiagram-6RSMTGT7-F10Hu1Gc.js} +1 -1
  262. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-2IkU_VEj.js → gitGraphDiagram-PVQCEYII-Bf8Ez6-D.js} +1 -1
  263. package/web-shell/assets/{index-BuSbqggh.js → index-BXqw-nGq.js} +1 -1
  264. package/web-shell/assets/{index-DrfC2e9s.js → index-hcgjV7vS.js} +333 -333
  265. package/web-shell/assets/{infoDiagram-5YYISTIA-C4orwzPw.js → infoDiagram-5YYISTIA-DVgTMLvj.js} +1 -1
  266. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-fXUEfef_.js → ishikawaDiagram-YF4QCWOH-uT-KepvK.js} +1 -1
  267. package/web-shell/assets/{journeyDiagram-JHISSGLW-Bs0I1_J5.js → journeyDiagram-JHISSGLW-Vg_XadQf.js} +1 -1
  268. package/web-shell/assets/{kanban-definition-UN3LZRKU-BPRj1dw_.js → kanban-definition-UN3LZRKU-Dyv1ESBE.js} +1 -1
  269. package/web-shell/assets/{linear-DFS6ZDpW.js → linear-BMIepYX3.js} +1 -1
  270. package/web-shell/assets/{mermaid.core-CZxjWMaO.js → mermaid.core-zA8pJ9ag.js} +5 -5
  271. package/web-shell/assets/{mindmap-definition-RKZ34NQL-Dsr3PmNs.js → mindmap-definition-RKZ34NQL-BCW_BZ_5.js} +1 -1
  272. package/web-shell/assets/{pieDiagram-4H26LBE5-D5Ngpz5Y.js → pieDiagram-4H26LBE5-DseNEGp2.js} +1 -1
  273. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-WJK9I25z.js → quadrantDiagram-W4KKPZXB-6Z7wr1Fi.js} +1 -1
  274. package/web-shell/assets/{requirementDiagram-4Y6WPE33-CmrYcwOH.js → requirementDiagram-4Y6WPE33-CVOlCRPf.js} +1 -1
  275. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-7SjCc4Mv.js → sankeyDiagram-5OEKKPKP-CGhgrUJZ.js} +1 -1
  276. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-Dl9E0IRM.js → sequenceDiagram-3UESZ5HK-dlqmpLuQ.js} +1 -1
  277. package/web-shell/assets/{stateDiagram-AJRCARHV-CRRio7yV.js → stateDiagram-AJRCARHV-B9EW10Xb.js} +1 -1
  278. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-CJTZJJ5X.js +1 -0
  279. package/web-shell/assets/{timeline-definition-PNZ67QCA-DVyXjjfq.js → timeline-definition-PNZ67QCA-BBRh0mgZ.js} +1 -1
  280. package/web-shell/assets/{vennDiagram-CIIHVFJN-Nb2Lckzq.js → vennDiagram-CIIHVFJN-B8Gs-REP.js} +1 -1
  281. package/web-shell/assets/{wardley-L42UT6IY-DuL_otIP.js → wardley-L42UT6IY-D_y80Ur7.js} +1 -1
  282. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-DVI9Q4Aa.js → wardleyDiagram-YWT4CUSO-D-CNfHJ-.js} +1 -1
  283. package/web-shell/assets/{xychartDiagram-2RQKCTM6-BNjAm7KD.js → xychartDiagram-2RQKCTM6-DQ5CvELo.js} +1 -1
  284. package/web-shell/index.html +1 -1
  285. package/web-shell/assets/channel-DXaHnfjS.js +0 -1
  286. package/web-shell/assets/classDiagram-4FO5ZUOK-BigU82A0.js +0 -1
  287. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BigU82A0.js +0 -1
  288. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-1atT7XaU.js +0 -1
@@ -1,11 +1,11 @@
1
1
  // Force strict mode and setup for ESM
2
2
  "use strict";
3
+ import {
4
+ formatHistoryGapNotice
5
+ } from "./chunk-KXSDEOFU.js";
3
6
  import {
4
7
  sanitizeTerminalText
5
8
  } from "./chunk-4NFY2S7N.js";
6
- import {
7
- formatHistoryGapNotice
8
- } from "./chunk-RFUHDCNF.js";
9
9
  import {
10
10
  isGoalStatusKind,
11
11
  isTerminalGoalStatusKind
@@ -19,18 +19,18 @@ import {
19
19
  setGoalTerminalObserver,
20
20
  setLastGoalTerminal,
21
21
  unregisterGoalHook
22
- } from "./chunk-A4VTILZT.js";
22
+ } from "./chunk-Y7E5LNLO.js";
23
23
  import {
24
24
  apiActivityTracker,
25
25
  formatVisionBridgeNoticeDisplay,
26
26
  isVisionBridgeNoticeDisplay
27
- } from "./chunk-PX5DNLSA.js";
27
+ } from "./chunk-2U3WZGZG.js";
28
28
  import {
29
29
  ToolNames
30
- } from "./chunk-D7D7RXIJ.js";
30
+ } from "./chunk-IC4Z6LX6.js";
31
31
  import {
32
32
  createDebugLogger
33
- } from "./chunk-3RXUYQJI.js";
33
+ } from "./chunk-OIVKILPI.js";
34
34
  import {
35
35
  writeStderrLine,
36
36
  writeStderrLineSafe
@@ -2869,7 +2869,7 @@ async function extractMetadata(conversation, config) {
2869
2869
  const gitBranch = firstRecord?.gitBranch;
2870
2870
  let gitRepo;
2871
2871
  if (cwd) {
2872
- const { getGitRepoName } = await import("./deferred-core-runtime-QWAEBTR5.js");
2872
+ const { getGitRepoName } = await import("./deferred-core-runtime-BWRCCFTE.js");
2873
2873
  gitRepo = getGitRepoName(cwd);
2874
2874
  }
2875
2875
  let model;
@@ -10,19 +10,19 @@ import {
10
10
  } from "./chunk-MR3PXB6E.js";
11
11
  import {
12
12
  ideContextStore
13
- } from "./chunk-A4VTILZT.js";
13
+ } from "./chunk-Y7E5LNLO.js";
14
14
  import {
15
15
  require_proper_lockfile
16
16
  } from "./chunk-KRXPRVGL.js";
17
17
  import {
18
18
  atomicWriteFileSync
19
- } from "./chunk-UH7Z7Y45.js";
19
+ } from "./chunk-FOGU3LJX.js";
20
20
  import {
21
21
  FatalConfigError,
22
22
  Storage,
23
23
  createDebugLogger,
24
24
  getErrorMessage
25
- } from "./chunk-3RXUYQJI.js";
25
+ } from "./chunk-OIVKILPI.js";
26
26
  import {
27
27
  writeStderrLine
28
28
  } from "./chunk-KGJGEEVR.js";
@@ -2,14 +2,14 @@
2
2
  "use strict";
3
3
  import {
4
4
  functionResponsePartsToString
5
- } from "./chunk-GESMMPAK.js";
5
+ } from "./chunk-RUL4S3K3.js";
6
6
  import {
7
7
  parseAndFormatApiError
8
- } from "./chunk-A4VTILZT.js";
8
+ } from "./chunk-Y7E5LNLO.js";
9
9
  import {
10
10
  formatVisionBridgeNoticeDisplay,
11
11
  isVisionBridgeNoticeDisplay
12
- } from "./chunk-PX5DNLSA.js";
12
+ } from "./chunk-2U3WZGZG.js";
13
13
  import {
14
14
  init_esbuild_shims
15
15
  } from "./chunk-5O2XNYP6.js";
@@ -10,11 +10,11 @@ import {
10
10
  } from "./chunk-CPBF7KYF.js";
11
11
  import {
12
12
  atomicWriteJSON
13
- } from "./chunk-UH7Z7Y45.js";
13
+ } from "./chunk-FOGU3LJX.js";
14
14
  import {
15
15
  Storage,
16
16
  isNodeError
17
- } from "./chunk-3RXUYQJI.js";
17
+ } from "./chunk-OIVKILPI.js";
18
18
  import {
19
19
  init_esbuild_shims
20
20
  } from "./chunk-5O2XNYP6.js";
@@ -1,8 +1,11 @@
1
1
  // Force strict mode and setup for ESM
2
2
  "use strict";
3
+ import {
4
+ MAX_INLINE_IMAGE_ENCODED_LENGTH
5
+ } from "./chunk-2VSTGY6M.js";
3
6
  import {
4
7
  MAX_TERMINAL_IMAGE_BYTES
5
- } from "./chunk-D7D7RXIJ.js";
8
+ } from "./chunk-IC4Z6LX6.js";
6
9
  import {
7
10
  init_esbuild_shims
8
11
  } from "./chunk-5O2XNYP6.js";
@@ -847,11 +850,15 @@ var MAX_PREVIEW_ROWS = 24;
847
850
  var ESTIMATED_CELL_WIDTH_PX = 8;
848
851
  var ESTIMATED_CELL_HEIGHT_PX = 16;
849
852
  var MAX_REASON_CHARS = 200;
853
+ var MAX_INLINE_IMAGE_DIMENSION = 1e6;
854
+ var MAX_INLINE_IMAGE_PIXELS = 64e6;
850
855
  var CMD_SHELL_METACHARACTERS = /[&|<>^%"!()\n\r]/;
851
856
  var RENDER_CACHE_LIMIT = 40;
852
857
  var RENDER_CACHE_BYTE_LIMIT = 32 * 1024 * 1024;
853
858
  var renderCache = /* @__PURE__ */ new Map();
854
859
  var renderCacheBytes = 0;
860
+ var INLINE_DECODE_CACHE_LIMIT = 4;
861
+ var inlineDecodeCache = /* @__PURE__ */ new Map();
855
862
  var TRANSMITTED_KEY_LIMIT = 256;
856
863
  var transmittedKeys = /* @__PURE__ */ new Set();
857
864
  function wasKittyImageWritten(key) {
@@ -896,6 +903,44 @@ function containsCmdShellMetacharacters(filePath) {
896
903
  return CMD_SHELL_METACHARACTERS.test(filePath);
897
904
  }
898
905
  __name(containsCmdShellMetacharacters, "containsCmdShellMetacharacters");
906
+ function prepareInlineTerminalImage({
907
+ data,
908
+ mimeType,
909
+ contentWidth,
910
+ availableTerminalHeight,
911
+ env = process.env,
912
+ stdoutIsTTY = process.stdout.isTTY,
913
+ disabled = false
914
+ }) {
915
+ const format = getImageFormat(mimeType);
916
+ const emptyFallback = format ? `[image: ${format}]` : "[image]";
917
+ if (format !== "png") {
918
+ return { fallbackText: emptyFallback, result: null };
919
+ }
920
+ const decoded = getDecodedInlinePng(data);
921
+ if (!decoded) {
922
+ return { fallbackText: emptyFallback, result: null };
923
+ }
924
+ const { png, size } = decoded;
925
+ const fallbackText = `[image: ${size.width}x${size.height} png]`;
926
+ if (disabled) {
927
+ return { fallbackText, result: null };
928
+ }
929
+ const shape = fitImageToTerminal2(size, contentWidth, availableTerminalHeight);
930
+ const useKitty = supportsKittyImageProtocol(env, stdoutIsTTY);
931
+ const chafaPath = useKitty ? null : findExecutable("chafa", env);
932
+ const cacheKey = createInlineRenderCacheKey(png, shape, useKitty, chafaPath);
933
+ const cached = getCachedRenderResult(cacheKey);
934
+ if (cached) {
935
+ return { fallbackText, result: cached };
936
+ }
937
+ const result = useKitty ? { ...renderKitty(png, shape), key: cacheKey } : renderWithChafa({ data: png }, shape, env, chafaPath);
938
+ if (result.kind !== "unavailable") {
939
+ rememberRenderResult(cacheKey, result);
940
+ }
941
+ return { fallbackText, result };
942
+ }
943
+ __name(prepareInlineTerminalImage, "prepareInlineTerminalImage");
899
944
  function renderTerminalImage({
900
945
  display,
901
946
  contentWidth,
@@ -959,7 +1004,7 @@ function renderTerminalImage({
959
1004
  reason: `Image exceeds the ${MAX_TERMINAL_IMAGE_BYTES} byte display limit.`
960
1005
  };
961
1006
  }
962
- const result = useKitty ? { ...renderKitty(png, shape), key: cacheKey } : renderWithChafa(display.filePath, shape, env, chafaPath);
1007
+ const result = useKitty ? { ...renderKitty(png, shape), key: cacheKey } : renderWithChafa({ filePath: display.filePath }, shape, env, chafaPath);
963
1008
  if (result.kind !== "unavailable") {
964
1009
  rememberRenderResult(cacheKey, result);
965
1010
  }
@@ -996,6 +1041,70 @@ function createRenderCacheKey(filePath, stat, shape, useKitty, chafaPath) {
996
1041
  ].join("\0");
997
1042
  }
998
1043
  __name(createRenderCacheKey, "createRenderCacheKey");
1044
+ function createInlineRenderCacheKey(png, shape, useKitty, chafaPath) {
1045
+ return [
1046
+ "inline",
1047
+ crypto2.createHash("sha256").update(png).digest("hex"),
1048
+ shape.widthCells,
1049
+ shape.rows,
1050
+ useKitty ? "kitty" : chafaPath ?? "none"
1051
+ ].join("\0");
1052
+ }
1053
+ __name(createInlineRenderCacheKey, "createInlineRenderCacheKey");
1054
+ function getImageFormat(mimeType) {
1055
+ const match = /^image\/([a-z0-9][a-z0-9.+-]*)$/.exec(
1056
+ mimeType.trim().toLowerCase()
1057
+ );
1058
+ return match?.[1] ?? null;
1059
+ }
1060
+ __name(getImageFormat, "getImageFormat");
1061
+ function decodeInlineImage(data) {
1062
+ if (data.length === 0 || data.length > MAX_INLINE_IMAGE_ENCODED_LENGTH) {
1063
+ return null;
1064
+ }
1065
+ const normalized = data.replace(/\s/g, "");
1066
+ if (normalized.length === 0 || normalized.length % 4 === 1 || !/^[A-Za-z0-9+/]*={0,2}$/.test(normalized)) {
1067
+ return null;
1068
+ }
1069
+ const decoded = Buffer.from(normalized, "base64");
1070
+ if (decoded.length === 0 || decoded.length > MAX_TERMINAL_IMAGE_BYTES || decoded.toString("base64").replace(/=+$/, "") !== normalized.replace(/=+$/, "")) {
1071
+ return null;
1072
+ }
1073
+ return decoded;
1074
+ }
1075
+ __name(decodeInlineImage, "decodeInlineImage");
1076
+ function getDecodedInlinePng(data) {
1077
+ const cached = inlineDecodeCache.get(data);
1078
+ if (cached) {
1079
+ inlineDecodeCache.delete(data);
1080
+ inlineDecodeCache.set(data, cached);
1081
+ return cached;
1082
+ }
1083
+ const png = decodeInlineImage(data);
1084
+ if (!png) return null;
1085
+ const size = readValidatedInlinePngSize(png);
1086
+ if (!size) return null;
1087
+ const decoded = { png, size };
1088
+ inlineDecodeCache.set(data, decoded);
1089
+ while (inlineDecodeCache.size > INLINE_DECODE_CACHE_LIMIT) {
1090
+ const oldest = inlineDecodeCache.keys().next().value;
1091
+ if (oldest === void 0) break;
1092
+ inlineDecodeCache.delete(oldest);
1093
+ }
1094
+ return decoded;
1095
+ }
1096
+ __name(getDecodedInlinePng, "getDecodedInlinePng");
1097
+ function readValidatedInlinePngSize(png) {
1098
+ if (png.length < 24 || png.readUInt32BE(8) !== 13 || png.subarray(12, 16).toString("ascii") !== "IHDR") {
1099
+ return null;
1100
+ }
1101
+ const size = readPngSize(png);
1102
+ if (!size || !Number.isInteger(size.width) || !Number.isInteger(size.height) || size.width <= 0 || size.height <= 0 || size.width > MAX_INLINE_IMAGE_DIMENSION || size.height > MAX_INLINE_IMAGE_DIMENSION || size.width * size.height > MAX_INLINE_IMAGE_PIXELS) {
1103
+ return null;
1104
+ }
1105
+ return size;
1106
+ }
1107
+ __name(readValidatedInlinePngSize, "readValidatedInlinePngSize");
999
1108
  function getCachedRenderResult(key) {
1000
1109
  const cached = renderCache.get(key);
1001
1110
  if (cached) {
@@ -1097,7 +1206,7 @@ function renderKitty(png, shape) {
1097
1206
  };
1098
1207
  }
1099
1208
  __name(renderKitty, "renderKitty");
1100
- function renderWithChafa(filePath, shape, env, chafaPath) {
1209
+ function renderWithChafa(source, shape, env, chafaPath) {
1101
1210
  if (!chafaPath) {
1102
1211
  return {
1103
1212
  kind: "unavailable",
@@ -1105,7 +1214,7 @@ function renderWithChafa(filePath, shape, env, chafaPath) {
1105
1214
  };
1106
1215
  }
1107
1216
  const useShell = shouldRunThroughShell(chafaPath);
1108
- if (useShell && containsCmdShellMetacharacters(filePath)) {
1217
+ if (useShell && "filePath" in source && containsCmdShellMetacharacters(source.filePath)) {
1109
1218
  return {
1110
1219
  kind: "unavailable",
1111
1220
  reason: "Image path contains characters that cannot be safely passed to the renderer on this platform."
@@ -1120,14 +1229,15 @@ function renderWithChafa(filePath, shape, env, chafaPath) {
1120
1229
  "--format=symbols",
1121
1230
  "--symbols=block",
1122
1231
  `--size=${shape.widthCells}x${shape.rows}`,
1123
- filePath
1232
+ "filePath" in source ? source.filePath : "-"
1124
1233
  ],
1125
1234
  {
1126
1235
  encoding: "utf8",
1127
1236
  env: createRendererChildEnv(env),
1128
1237
  shell: useShell,
1129
1238
  maxBuffer: CHAFA_MAX_OUTPUT_BYTES,
1130
- timeout: CHAFA_TIMEOUT_MS
1239
+ timeout: CHAFA_TIMEOUT_MS,
1240
+ ..."data" in source ? { input: source.data } : {}
1131
1241
  }
1132
1242
  );
1133
1243
  const lines = stdout.split(/\r?\n/).filter((line) => line.length > 0);
@@ -1150,12 +1260,14 @@ __name(firstLineBounded, "firstLineBounded");
1150
1260
 
1151
1261
  export {
1152
1262
  renderMermaidImageAsync,
1263
+ MAX_INLINE_IMAGE_PIXELS,
1153
1264
  TRANSMITTED_KEY_LIMIT,
1154
1265
  wasKittyImageWritten,
1155
1266
  markKittyImageWritten,
1156
1267
  supportsKittyImageProtocol,
1157
1268
  getTerminalImageRenderSupport,
1158
1269
  containsCmdShellMetacharacters,
1270
+ prepareInlineTerminalImage,
1159
1271
  renderTerminalImage
1160
1272
  };
1161
1273
  /**
@@ -5,14 +5,14 @@ import {
5
5
  isTranscribableVoiceModel,
6
6
  readVoiceLanguage,
7
7
  resolveVoiceTransport
8
- } from "./chunk-C4CBJQKY.js";
8
+ } from "./chunk-55LYDVPU.js";
9
9
  import {
10
10
  resolvePath
11
- } from "./chunk-JELIWHXD.js";
11
+ } from "./chunk-AOHJKPKL.js";
12
12
  import {
13
13
  createDebugLogger,
14
14
  isSubpath
15
- } from "./chunk-3RXUYQJI.js";
15
+ } from "./chunk-OIVKILPI.js";
16
16
  import {
17
17
  init_esbuild_shims
18
18
  } from "./chunk-5O2XNYP6.js";
@@ -24,7 +24,7 @@ import {
24
24
  init_esbuild_shims();
25
25
  import process from "node:process";
26
26
  import { lookup as dnsLookup } from "node:dns/promises";
27
- import { isIP } from "node:net";
27
+ import { BlockList, isIP } from "node:net";
28
28
 
29
29
  // packages/cli/src/services/voice-keyterms.ts
30
30
  init_esbuild_shims();
@@ -238,6 +238,14 @@ var MIN_KEYTERM_ECHO_TOKENS = 8;
238
238
  var MIN_ABSOLUTE_KEYTERM_ECHO_TOKENS = 10;
239
239
  var MIN_KEYTERM_SET_ECHO_RATIO = 0.3;
240
240
  var debugLogger = createDebugLogger("VOICE_TRANSCRIBER");
241
+ var BLOCKED_TRANSITION_IPV6_ADDRESSES = new BlockList();
242
+ for (const [address, prefix] of [
243
+ ["64:ff9b:1::", 48],
244
+ ["2001::", 23],
245
+ ["2002::", 16]
246
+ ]) {
247
+ BLOCKED_TRANSITION_IPV6_ADDRESSES.addSubnet(address, prefix, "ipv6");
248
+ }
241
249
  function trimTrailingSlashes(value) {
242
250
  return value.replace(/\/+$/, "");
243
251
  }
@@ -264,35 +272,78 @@ function normalizeBaseUrl(baseUrl, modelName) {
264
272
  } catch {
265
273
  throw new Error(`Voice model '${modelName}' has an invalid baseUrl.`);
266
274
  }
267
- url.username = "";
268
- url.password = "";
275
+ if (url.username || url.password) {
276
+ throw new Error(
277
+ `Voice model '${modelName}' baseUrl must not contain embedded credentials.`
278
+ );
279
+ }
269
280
  return trimTrailingSlashes(url.toString());
270
281
  }
271
282
  __name(normalizeBaseUrl, "normalizeBaseUrl");
283
+ function normalizeAllowedVoiceBaseUrl(baseUrl) {
284
+ try {
285
+ const url = new URL(baseUrl.trim());
286
+ if (url.username || url.password) {
287
+ return void 0;
288
+ }
289
+ return trimTrailingSlashes(url.toString());
290
+ } catch {
291
+ return void 0;
292
+ }
293
+ }
294
+ __name(normalizeAllowedVoiceBaseUrl, "normalizeAllowedVoiceBaseUrl");
295
+ function isInsecureVoiceBaseUrlAllowed(settings, normalizedBaseUrl) {
296
+ const allowed = settings.merged.security?.allowedInsecureVoiceBaseUrls;
297
+ return Array.isArray(allowed) && allowed.some(
298
+ (candidate) => typeof candidate === "string" && normalizeAllowedVoiceBaseUrl(candidate) === normalizedBaseUrl
299
+ );
300
+ }
301
+ __name(isInsecureVoiceBaseUrlAllowed, "isInsecureVoiceBaseUrlAllowed");
272
302
  function normalizeHostname(hostname) {
273
303
  return hostname.toLowerCase().replace(/^\[|\]$/g, "");
274
304
  }
275
305
  __name(normalizeHostname, "normalizeHostname");
306
+ function normalizeIpAddress(address) {
307
+ const host = normalizeHostname(address);
308
+ if (isIP(host) !== 6) {
309
+ return host;
310
+ }
311
+ try {
312
+ return normalizeHostname(new URL(`http://[${host}]/`).hostname);
313
+ } catch {
314
+ return host;
315
+ }
316
+ }
317
+ __name(normalizeIpAddress, "normalizeIpAddress");
276
318
  function isLoopbackHost(hostname) {
277
319
  const host = normalizeHostname(hostname);
278
320
  return host === "localhost" || host === "127.0.0.1" || host === "::1";
279
321
  }
280
322
  __name(isLoopbackHost, "isLoopbackHost");
323
+ function isAwsIpv6MetadataAddress(hostname) {
324
+ const host = normalizeHostname(hostname);
325
+ if (isIP(host) !== 6) {
326
+ return false;
327
+ }
328
+ try {
329
+ return normalizeHostname(new URL(`http://[${host}]/`).hostname) === "fd00:ec2::254";
330
+ } catch {
331
+ return false;
332
+ }
333
+ }
334
+ __name(isAwsIpv6MetadataAddress, "isAwsIpv6MetadataAddress");
281
335
  function readIpv4CompatibleIpv6(host) {
282
336
  if (!host.startsWith("::") || host.startsWith("::ffff:")) {
283
337
  return void 0;
284
338
  }
285
339
  const parts = host.slice(2).split(":");
286
- if (parts.length === 0 || parts.length > 2 || parts.some((p) => !p)) {
340
+ if (parts.length === 0 || parts.length > 2 || parts.some((part) => !part)) {
287
341
  return void 0;
288
342
  }
289
343
  if (parts.some((part) => !/^[0-9a-f]{1,4}$/i.test(part))) {
290
344
  return void 0;
291
345
  }
292
346
  const hextets = parts.map((part) => Number.parseInt(part, 16));
293
- if (hextets.some((part) => !Number.isInteger(part) || part < 0 || part > 65535)) {
294
- return void 0;
295
- }
296
347
  const value = hextets.length === 1 ? hextets[0] : hextets[0] << 16 | hextets[1];
297
348
  return [
298
349
  value >>> 24 & 255,
@@ -302,39 +353,130 @@ function readIpv4CompatibleIpv6(host) {
302
353
  ].join(".");
303
354
  }
304
355
  __name(readIpv4CompatibleIpv6, "readIpv4CompatibleIpv6");
305
- function isPrivateNetworkIp(hostname) {
306
- const host = normalizeHostname(hostname);
307
- if (isLoopbackHost(host)) {
308
- return false;
356
+ function readIpv4MappedIpv6(host) {
357
+ const dotted = host.match(/^::ffff:(\d+(?:\.\d+){3})$/i);
358
+ if (dotted && isIP(dotted[1]) === 4) {
359
+ return dotted[1];
309
360
  }
310
- const ipv4Mapped = host.match(/^::ffff:(\d+\.\d+\.\d+\.\d+)$/);
361
+ const hex = host.match(/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i);
362
+ if (!hex) {
363
+ return void 0;
364
+ }
365
+ return readIpv4HexPair(hex[1], hex[2]);
366
+ }
367
+ __name(readIpv4MappedIpv6, "readIpv4MappedIpv6");
368
+ function readIpv4HexPair(highHex, lowHex) {
369
+ const high = Number.parseInt(highHex, 16);
370
+ const low = Number.parseInt(lowHex, 16);
371
+ return [high >>> 8, high & 255, low >>> 8, low & 255].join(".");
372
+ }
373
+ __name(readIpv4HexPair, "readIpv4HexPair");
374
+ function readWellKnownNat64Ipv6(host) {
375
+ const prefix = "64:ff9b::";
376
+ if (!host.startsWith(prefix)) {
377
+ return void 0;
378
+ }
379
+ const suffix = host.slice(prefix.length);
380
+ if (!suffix) {
381
+ return "0.0.0.0";
382
+ }
383
+ const groups = suffix.split(":");
384
+ if (groups.length > 2 || groups.some((group) => !/^[0-9a-f]{1,4}$/i.test(group))) {
385
+ return void 0;
386
+ }
387
+ return groups.length === 1 ? readIpv4HexPair("0", groups[0]) : readIpv4HexPair(groups[0], groups[1]);
388
+ }
389
+ __name(readWellKnownNat64Ipv6, "readWellKnownNat64Ipv6");
390
+ function isBlockedTransitionIpv6Address(host) {
391
+ return isIP(host) === 6 && BLOCKED_TRANSITION_IPV6_ADDRESSES.check(host, "ipv6");
392
+ }
393
+ __name(isBlockedTransitionIpv6Address, "isBlockedTransitionIpv6Address");
394
+ function unwrapIpv6TransitionStep(host) {
395
+ const ipv4Mapped = readIpv4MappedIpv6(host);
311
396
  if (ipv4Mapped) {
312
- return isPrivateNetworkIp(ipv4Mapped[1]);
397
+ return { address: ipv4Mapped };
313
398
  }
314
- const ipv4Compatible = host.match(/^::(\d+\.\d+\.\d+\.\d+)$/);
399
+ const ipv4Compatible = readIpv4CompatibleIpv6(host);
315
400
  if (ipv4Compatible) {
316
- return isPrivateNetworkIp(ipv4Compatible[1]);
401
+ return { address: ipv4Compatible };
317
402
  }
318
- const normalizedIpv4Compatible = readIpv4CompatibleIpv6(host);
319
- if (normalizedIpv4Compatible) {
320
- return isPrivateNetworkIp(normalizedIpv4Compatible);
403
+ const nat64 = readWellKnownNat64Ipv6(host);
404
+ if (nat64) {
405
+ return { address: nat64 };
321
406
  }
322
407
  if (host.startsWith("::ffff:")) {
408
+ return "blocked";
409
+ }
410
+ return void 0;
411
+ }
412
+ __name(unwrapIpv6TransitionStep, "unwrapIpv6TransitionStep");
413
+ function isPrivateNetworkIp(hostname) {
414
+ const host = normalizeIpAddress(hostname);
415
+ if (isBlockedTransitionIpv6Address(host)) {
323
416
  return true;
324
417
  }
418
+ if (isLoopbackHost(host)) {
419
+ return false;
420
+ }
421
+ const step = unwrapIpv6TransitionStep(host);
422
+ if (step === "blocked") {
423
+ return true;
424
+ }
425
+ if (step) {
426
+ return isPrivateNetworkIp(step.address);
427
+ }
325
428
  if (isIP(host) === 4) {
326
429
  const [first = 0, second = 0] = host.split(".").map(Number);
327
430
  return first === 0 || first === 10 || first === 127 || first === 169 && second === 254 || first === 172 && second >= 16 && second <= 31 || first === 192 && second === 168 || first === 100 && second >= 64 && second <= 127;
328
431
  }
329
432
  if (isIP(host) === 6) {
330
- const firstHextet = Number.parseInt(host.split(":", 1)[0] || "", 16);
331
- const isLinkLocal = firstHextet >= 65152 && firstHextet <= 65215;
332
- const isUniqueLocal = (firstHextet & 65024) === 64512;
333
- return host === "::" || isLinkLocal || isUniqueLocal;
433
+ const firstHextet = Number.parseInt(host.split(":", 1)[0] || "0", 16);
434
+ return host === "::" || (firstHextet & 65472) === 65152 || (firstHextet & 65024) === 64512;
334
435
  }
335
436
  return false;
336
437
  }
337
438
  __name(isPrivateNetworkIp, "isPrivateNetworkIp");
439
+ function isAlwaysBlockedVoiceAddress(address) {
440
+ const host = normalizeIpAddress(address);
441
+ if (isBlockedTransitionIpv6Address(host)) {
442
+ return true;
443
+ }
444
+ if (isLoopbackHost(host)) {
445
+ return true;
446
+ }
447
+ const step = unwrapIpv6TransitionStep(host);
448
+ if (step === "blocked") {
449
+ return true;
450
+ }
451
+ if (step) {
452
+ return isAlwaysBlockedVoiceAddress(step.address);
453
+ }
454
+ if (isIP(host) === 4) {
455
+ const [first = 0, second = 0] = host.split(".").map(Number);
456
+ return first === 0 || first === 127 || first === 169 && second === 254 || host === "100.100.100.200";
457
+ }
458
+ if (isIP(host) === 6) {
459
+ const firstHextet = Number.parseInt(host.split(":", 1)[0] || "0", 16);
460
+ return host === "::" || isAwsIpv6MetadataAddress(host) || (firstHextet & 65472) === 65152;
461
+ }
462
+ return false;
463
+ }
464
+ __name(isAlwaysBlockedVoiceAddress, "isAlwaysBlockedVoiceAddress");
465
+ function isLoopbackVoiceAddress(address) {
466
+ const host = normalizeIpAddress(address);
467
+ if (isLoopbackHost(host)) {
468
+ return true;
469
+ }
470
+ const step = unwrapIpv6TransitionStep(host);
471
+ if (step && step !== "blocked") {
472
+ return isLoopbackVoiceAddress(step.address);
473
+ }
474
+ if (isIP(host) === 4) {
475
+ return host.startsWith("127.");
476
+ }
477
+ return false;
478
+ }
479
+ __name(isLoopbackVoiceAddress, "isLoopbackVoiceAddress");
338
480
  async function defaultLookupHost(hostname) {
339
481
  return dnsLookup(hostname, { all: true });
340
482
  }
@@ -345,9 +487,9 @@ async function assertVoiceBaseUrlNetworkAllowed(voiceConfig, lookupHost, abortSi
345
487
  return;
346
488
  }
347
489
  if (isIP(hostname) !== 0) {
348
- if (isPrivateNetworkIp(hostname)) {
490
+ if (isAlwaysBlockedVoiceAddress(hostname) || !voiceConfig.allowInsecureBaseUrl && isPrivateNetworkIp(hostname)) {
349
491
  throw new Error(
350
- `Voice model '${voiceConfig.model}' resolved to a private-network address.`
492
+ isLoopbackVoiceAddress(hostname) ? `Voice model '${voiceConfig.model}' uses a loopback address outside the accepted spellings. To use a local ASR endpoint, set the baseUrl to http://localhost, http://127.0.0.1, or http://[::1].` : `Voice model '${voiceConfig.model}' resolved to a private-network address.`
351
493
  );
352
494
  }
353
495
  return;
@@ -378,9 +520,13 @@ async function assertVoiceBaseUrlNetworkAllowed(voiceConfig, lookupHost, abortSi
378
520
  if (onAbort) abortSignal?.removeEventListener("abort", onAbort);
379
521
  }
380
522
  const records = Array.isArray(result) ? result : [result];
381
- if (records.some((record) => isPrivateNetworkIp(record.address))) {
523
+ if (records.some(
524
+ (record) => isAlwaysBlockedVoiceAddress(record.address) || !voiceConfig.allowInsecureBaseUrl && isPrivateNetworkIp(record.address)
525
+ )) {
382
526
  throw new Error(
383
- `Voice model '${voiceConfig.model}' resolved to a private-network address.`
527
+ records.some((record) => isLoopbackVoiceAddress(record.address)) ? `Voice model '${voiceConfig.model}' resolved to a loopback address. Loopback DNS results are always blocked; to use a local ASR endpoint, configure an explicit loopback baseUrl: http://localhost, http://127.0.0.1, or http://[::1].` : voiceConfig.allowInsecureBaseUrl && records.some(
528
+ (record) => isAlwaysBlockedVoiceAddress(record.address)
529
+ ) ? `Voice model '${voiceConfig.model}' resolved to an address that is always blocked (metadata, link-local, or transition range), even when the baseUrl is listed in security.allowedInsecureVoiceBaseUrls.` : `Voice model '${voiceConfig.model}' resolved to a private-network address.`
384
530
  );
385
531
  }
386
532
  }
@@ -390,7 +536,8 @@ function readApiKey(settings, model, baseUrl, env) {
390
536
  return void 0;
391
537
  }
392
538
  const envKey = model.envKey ?? DEFAULT_OPENAI_API_KEY;
393
- const envValue = (env ?? process.env)[envKey];
539
+ const envSource = env ?? process.env;
540
+ const envValue = Object.hasOwn(envSource, envKey) ? envSource[envKey] : void 0;
394
541
  if (envValue && envValue.trim().length > 0) {
395
542
  return envValue.trim();
396
543
  }
@@ -431,14 +578,28 @@ function resolveVoiceTranscriptionConfig({
431
578
  const normalizedBaseUrl = normalizeBaseUrl(baseUrl, voiceModel);
432
579
  const parsedBaseUrl = new URL(normalizedBaseUrl);
433
580
  const isLocalhost = isLoopbackHost(parsedBaseUrl.hostname);
434
- if (parsedBaseUrl.protocol !== "https:" && !isLocalhost) {
581
+ const allowInsecureBaseUrl = isInsecureVoiceBaseUrlAllowed(
582
+ settings,
583
+ normalizedBaseUrl
584
+ );
585
+ if (parsedBaseUrl.protocol !== "http:" && parsedBaseUrl.protocol !== "https:") {
586
+ throw new Error(
587
+ `Voice model '${voiceModel}' must use an http or https baseUrl.`
588
+ );
589
+ }
590
+ if (!isLocalhost && isAlwaysBlockedVoiceAddress(parsedBaseUrl.hostname)) {
591
+ throw new Error(
592
+ isLoopbackVoiceAddress(parsedBaseUrl.hostname) ? `Voice model '${voiceModel}' uses a loopback address outside the accepted spellings. To use a local ASR endpoint, set the baseUrl to http://localhost, http://127.0.0.1, or http://[::1].` : `Voice model '${voiceModel}' must not use a private-network baseUrl.`
593
+ );
594
+ }
595
+ if (parsedBaseUrl.protocol !== "https:" && !isLocalhost && !allowInsecureBaseUrl) {
435
596
  throw new Error(
436
- `Voice model '${voiceModel}' must use an https baseUrl. Voice audio must not be transmitted in cleartext.`
597
+ `Voice model '${voiceModel}' must use an https baseUrl. Voice audio must not be transmitted in cleartext. To trust this managed endpoint, add its exact complete normalized URL (${normalizedBaseUrl}) to security.allowedInsecureVoiceBaseUrls. This setting is only honored from User, System, or SystemDefaults scope settings; Workspace entries are ignored.`
437
598
  );
438
599
  }
439
- if (isPrivateNetworkIp(parsedBaseUrl.hostname)) {
600
+ if (!isLocalhost && !allowInsecureBaseUrl && isPrivateNetworkIp(parsedBaseUrl.hostname)) {
440
601
  throw new Error(
441
- `Voice model '${voiceModel}' must not use a private-network baseUrl.`
602
+ `Voice model '${voiceModel}' must not use a private-network baseUrl. To trust this managed endpoint, add its exact complete normalized URL (${normalizedBaseUrl}) to security.allowedInsecureVoiceBaseUrls. This setting is only honored from User, System, or SystemDefaults scope settings; Workspace entries are ignored.`
442
603
  );
443
604
  }
444
605
  const apiKey = readApiKey(settings, model, normalizedBaseUrl, env);
@@ -448,7 +609,8 @@ function resolveVoiceTranscriptionConfig({
448
609
  return {
449
610
  model: voiceModel,
450
611
  baseUrl: normalizedBaseUrl,
451
- ...apiKey ? { apiKey } : {}
612
+ ...apiKey ? { apiKey } : {},
613
+ ...allowInsecureBaseUrl ? { allowInsecureBaseUrl: true } : {}
452
614
  };
453
615
  }
454
616
  __name(resolveVoiceTranscriptionConfig, "resolveVoiceTranscriptionConfig");
@@ -472,6 +634,7 @@ function resolveVoiceStreamConfig(args) {
472
634
  baseUrl: base.baseUrl,
473
635
  model: base.model,
474
636
  ...base.apiKey ? { apiKey: base.apiKey } : {},
637
+ ...base.allowInsecureBaseUrl ? { allowInsecureBaseUrl: true } : {},
475
638
  ...language ? { language } : {},
476
639
  ...keytermsContext ? { keytermsContext } : {}
477
640
  };
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
  import {
4
4
  expandHomeDir
5
- } from "./chunk-3RXUYQJI.js";
5
+ } from "./chunk-OIVKILPI.js";
6
6
  import {
7
7
  init_esbuild_shims
8
8
  } from "./chunk-5O2XNYP6.js";