@qwen-code/qwen-code 0.23.0 → 0.23.1-preview.1

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 (453) hide show
  1. package/bundled/new-app/SKILL.md +1 -1
  2. package/bundled/qc-helper/docs/configuration/auth.md +84 -12
  3. package/bundled/qc-helper/docs/configuration/settings.md +76 -74
  4. package/bundled/qc-helper/docs/features/arena.md +15 -20
  5. package/bundled/qc-helper/docs/features/channels/overview.md +7 -2
  6. package/bundled/qc-helper/docs/features/code-review.md +22 -19
  7. package/bundled/qc-helper/docs/features/commands.md +51 -10
  8. package/bundled/qc-helper/docs/features/followup-suggestions.md +1 -1
  9. package/bundled/qc-helper/docs/features/goals.md +8 -0
  10. package/bundled/qc-helper/docs/features/headless.md +2 -2
  11. package/bundled/qc-helper/docs/features/hooks.md +19 -19
  12. package/bundled/qc-helper/docs/features/output-styles.md +35 -2
  13. package/bundled/qc-helper/docs/qwen-serve.md +67 -52
  14. package/bundled/qc-helper/docs/reference/keyboard-shortcuts.md +3 -1
  15. package/bundled/qc-helper/docs/support/troubleshooting.md +3 -3
  16. package/bundled/review/SKILL.md +45 -41
  17. package/bundled/review/references/aone.md +1 -1
  18. package/bundled/review/references/posting.md +1 -1
  19. package/bundled/workflow-creator/SKILL.md +48 -0
  20. package/bundled/zvec-grep-install/SKILL.md +57 -0
  21. package/chunks/MaxSizedBox-5ARLO5PR.js +116 -0
  22. package/chunks/{StandaloneSessionPicker-QUMO4LLQ.js → StandaloneSessionPicker-T6B322CB.js} +87 -82
  23. package/chunks/{acp-startup-profiler-M4X5F3VK.js → acp-startup-profiler-6ULXXQMS.js} +2 -2
  24. package/chunks/{acpAgent-2GTFCIEP.js → acpAgent-WTDEY5KD.js} +1041 -364
  25. package/chunks/{agent-XKF5SZWU.js → agent-NXPUXEVZ.js} +46 -43
  26. package/chunks/agent-headless-QQZTWOKO.js +88 -0
  27. package/chunks/{anthropicContentGenerator-L76MR5OR.js → anthropicContentGenerator-6XDHXIII.js} +16 -9
  28. package/chunks/{artifact-tool-MYCL2QCS.js → artifact-tool-DFVVJXL2.js} +3 -3
  29. package/chunks/askUserQuestion-GF7VQ44M.js +14 -0
  30. package/chunks/bridge-OHY5OGOZ.js +123 -0
  31. package/chunks/{ca-BNU7YNDE.js → ca-KC2AISNS.js} +1 -0
  32. package/chunks/{channel-management-service-4MTCEGJB.js → channel-management-service-ZDDG3G5S.js} +4 -4
  33. package/chunks/channel-settings-store-7BJAS2SU.js +126 -0
  34. package/chunks/{channel-worker-group-47F4ISUZ.js → channel-worker-group-2ISMRENV.js} +6 -6
  35. package/chunks/{channel-worker-manager-I5Y44GYR.js → channel-worker-manager-VSRPVPRH.js} +6 -6
  36. package/chunks/{channel-worker-supervisor-6VCLUXFE.js → channel-worker-supervisor-SRJBK72Z.js} +4 -4
  37. package/chunks/{chunk-5RTTI4GE.js → chunk-2RYWGYB3.js} +4 -3
  38. package/chunks/{chunk-FUO5V5KI.js → chunk-2UWQX4FP.js} +2 -2
  39. package/chunks/{chunk-L26ONV2Y.js → chunk-2WGJG2KW.js} +9 -8
  40. package/chunks/{chunk-JHN7UIDW.js → chunk-2XRE4KE4.js} +1 -1
  41. package/chunks/chunk-32CM56LO.js +20 -0
  42. package/chunks/{chunk-SI7WDR3U.js → chunk-32YDNYXP.js} +129 -14
  43. package/chunks/{chunk-ZHO2CW6D.js → chunk-3CZ2BQV6.js} +1 -1
  44. package/chunks/{chunk-FD5SJOWT.js → chunk-3K456UJF.js} +9 -4
  45. package/chunks/{chunk-5M6IDOMF.js → chunk-3K65MUKD.js} +105 -0
  46. package/chunks/chunk-3UMWOKJC.js +78 -0
  47. package/chunks/{chunk-UM2FFKXN.js → chunk-43JNQAHO.js} +3 -3
  48. package/chunks/{chunk-KM3XVTMO.js → chunk-43NOB5NM.js} +112 -12
  49. package/chunks/{chunk-G5PBOQWI.js → chunk-47BZVBTE.js} +3 -3
  50. package/chunks/{chunk-32LU3APX.js → chunk-4F2QRVW6.js} +1 -1
  51. package/chunks/{chunk-KMU3ZHH4.js → chunk-4HC4DYKN.js} +2 -2
  52. package/chunks/{chunk-22UH7VTP.js → chunk-4HOEU2OR.js} +1 -1
  53. package/chunks/{chunk-NXKOVOM5.js → chunk-4IQKBLTQ.js} +15 -9
  54. package/chunks/{chunk-M4KFODIP.js → chunk-4JAGXZR3.js} +1 -1
  55. package/chunks/{chunk-PDAKFU7M.js → chunk-4LIPOIXS.js} +1 -1
  56. package/chunks/{chunk-LEPCWS5A.js → chunk-4MCY33Y2.js} +3 -3
  57. package/chunks/{chunk-U6D2PPMN.js → chunk-4VUVBN3Y.js} +1 -1
  58. package/chunks/{chunk-37JFWFCD.js → chunk-4VZCORNT.js} +1 -1
  59. package/chunks/{daemon-RKDGBFLK.js → chunk-537SQ2AI.js} +2216 -1721
  60. package/chunks/{chunk-VNAYZAFX.js → chunk-54TF2ZIQ.js} +4 -4
  61. package/chunks/{chunk-OKTNXDVO.js → chunk-565U2ANU.js} +1 -1
  62. package/chunks/chunk-5ETULJLP.js +74 -0
  63. package/chunks/{chunk-ADYN7P2Y.js → chunk-5JLQWQK6.js} +8 -6
  64. package/chunks/{chunk-BFY33IB4.js → chunk-5MTARK4Y.js} +7 -7
  65. package/chunks/{chunk-BJXCYUGM.js → chunk-5YY5MZT6.js} +1 -1
  66. package/chunks/{chunk-4PSDSCW3.js → chunk-64MQTIX7.js} +3 -3
  67. package/chunks/{chunk-54C6PIGT.js → chunk-6UIACMGH.js} +3 -3
  68. package/chunks/{chunk-ALUYNJPM.js → chunk-7BZS4ZDV.js} +1362 -1140
  69. package/chunks/{chunk-LB3WQQJK.js → chunk-7OCIQNKX.js} +2 -2
  70. package/chunks/{chunk-QKDNS6FU.js → chunk-7VEYUF3N.js} +13 -2
  71. package/chunks/{chunk-AZJLY2XZ.js → chunk-AHBLRVD5.js} +5 -5
  72. package/chunks/{chunk-VWTSRH6C.js → chunk-AQ5NAGWI.js} +89 -17
  73. package/chunks/{chunk-MOF6VZN2.js → chunk-AXPOOQAW.js} +2 -2
  74. package/chunks/{chunk-CVX63TFJ.js → chunk-B44JBZBB.js} +3 -3
  75. package/chunks/{chunk-AI35S34R.js → chunk-B54PFQS5.js} +3 -3
  76. package/chunks/{chunk-373DQUVA.js → chunk-BF3RUIVP.js} +5 -4
  77. package/chunks/{chunk-RJUVTJEZ.js → chunk-BKNY7PDI.js} +1 -1
  78. package/chunks/{chunk-UKYXYWI2.js → chunk-BUQN5LTI.js} +2 -2
  79. package/chunks/{chunk-O5CD7T4T.js → chunk-BW4333PP.js} +0 -95
  80. package/chunks/{chunk-UPFRILIL.js → chunk-CWNC7M73.js} +2 -2
  81. package/chunks/{chunk-3L724BJ5.js → chunk-CZACBHAW.js} +6 -6
  82. package/chunks/{chunk-EBDGRBZX.js → chunk-D4CU6DKR.js} +6 -6
  83. package/chunks/{chunk-G7HBEEX7.js → chunk-D6PIMKY3.js} +9 -9
  84. package/chunks/{chunk-ENYUKMFK.js → chunk-DJXSOEFB.js} +1 -1
  85. package/chunks/{chunk-C2VWOXHS.js → chunk-DNPHKA72.js} +8 -8
  86. package/chunks/{chunk-UUASLXHW.js → chunk-E4L5BM2B.js} +5 -5
  87. package/chunks/{chunk-HT5S5TRQ.js → chunk-EDIDYZBT.js} +4 -11
  88. package/chunks/{chunk-5H5S4UY5.js → chunk-EFT7OMDN.js} +1 -1
  89. package/chunks/{chunk-GB4UKWY5.js → chunk-EJNYBDYC.js} +2 -2
  90. package/chunks/{chunk-NQ4L2CMD.js → chunk-ER273QE6.js} +53 -9
  91. package/chunks/{chunk-RKW36UWC.js → chunk-EWNKP4V4.js} +1 -1
  92. package/chunks/{chunk-UJ4DUYIH.js → chunk-F53KKZUD.js} +2 -2
  93. package/chunks/{chunk-EFTPIZIC.js → chunk-FDOGGKAA.js} +21 -0
  94. package/chunks/{chunk-AQ37AY7B.js → chunk-FKJM6JKY.js} +5 -0
  95. package/chunks/{chunk-KEVYJSI4.js → chunk-G34YLYCS.js} +13 -13
  96. package/chunks/{chunk-P6UIF2OW.js → chunk-GCFZ2LAX.js} +195 -10
  97. package/chunks/{chunk-VGHZT6JR.js → chunk-GELRJXE2.js} +1 -1
  98. package/chunks/{chunk-ZDFQGHZH.js → chunk-GMNLYQOS.js} +1 -1
  99. package/chunks/{chunk-KOGW3YWJ.js → chunk-GVVCLL2P.js} +12 -12
  100. package/chunks/{chunk-OSSTATJF.js → chunk-GXZHYPHZ.js} +428 -30
  101. package/chunks/{chunk-IPATA3T2.js → chunk-GZWW2QWR.js} +2 -2
  102. package/chunks/{chunk-C4TIXFDZ.js → chunk-H3UDNQLO.js} +6 -4
  103. package/chunks/chunk-HD7O6WLV.js +18 -0
  104. package/chunks/{chunk-4UANMABT.js → chunk-HFTB354P.js} +259 -49
  105. package/chunks/{chunk-LOBDDFYK.js → chunk-HJ34U5J4.js} +5 -5
  106. package/chunks/{chunk-M4LBBSVP.js → chunk-HY3DXYZK.js} +2 -2
  107. package/chunks/{chunk-4F7GQGXB.js → chunk-I72PHOKL.js} +1451 -415
  108. package/chunks/{chunk-YPWZTR7F.js → chunk-IFD3BTEA.js} +3 -3
  109. package/chunks/{chunk-EWRW2WQC.js → chunk-IKLFS6SC.js} +5 -5
  110. package/chunks/{chunk-VPSIC437.js → chunk-IQN2CCIE.js} +66 -6
  111. package/chunks/{chunk-F7NF2IOE.js → chunk-IXSGOSEG.js} +7 -7
  112. package/chunks/{chunk-ODZF64DM.js → chunk-IZ2U57NY.js} +1 -1
  113. package/chunks/{chunk-4BGDFKQE.js → chunk-J3O5I5ZD.js} +24 -7
  114. package/chunks/{chunk-DYTW3QVG.js → chunk-J6MB5ZHZ.js} +1 -1
  115. package/chunks/{chunk-HJBHMANB.js → chunk-JBTZUFR4.js} +11 -8
  116. package/chunks/{chunk-SRF4KTAG.js → chunk-JLWFGYXU.js} +4 -4
  117. package/chunks/{chunk-SX2QIMJV.js → chunk-JOPC3FND.js} +5 -5
  118. package/chunks/chunk-JPEAQJNS.js +2142 -0
  119. package/chunks/{chunk-ZTPGUFQV.js → chunk-JRYL3T2O.js} +24 -5
  120. package/chunks/{chunk-GXUTFQXK.js → chunk-KE3Q4JMY.js} +4 -4
  121. package/chunks/{chunk-LKODFJRD.js → chunk-KFFCDLKV.js} +1 -1
  122. package/chunks/{chunk-4M24B5J5.js → chunk-KJJPJYHI.js} +79 -30
  123. package/chunks/chunk-KK2GZGBK.js +21080 -0
  124. package/chunks/{chunk-64QH2UC6.js → chunk-KPXRFTT7.js} +12 -1
  125. package/chunks/{chunk-JZWOCUZ3.js → chunk-L4R7BCVV.js} +1 -1
  126. package/chunks/{chunk-IG4W5SJR.js → chunk-LDS57224.js} +3 -3
  127. package/chunks/{chunk-UAKRDON5.js → chunk-LK7S2D6V.js} +4 -4
  128. package/chunks/{chunk-4HVH57J3.js → chunk-LMJQSPWB.js} +21 -6
  129. package/chunks/{chunk-ANVG3BVV.js → chunk-LNYV4GXX.js} +13 -3
  130. package/chunks/{chunk-RM4WT2XB.js → chunk-LPBQODMR.js} +4 -4
  131. package/chunks/{chunk-XEAAO654.js → chunk-M3JGHRMQ.js} +1 -1
  132. package/chunks/{chunk-AMDSOFFV.js → chunk-MATEIJZF.js} +1 -0
  133. package/chunks/{chunk-LHBNR6EU.js → chunk-MNEYUNOE.js} +2 -2
  134. package/chunks/{chunk-I4NRYS6A.js → chunk-MUZCSTOO.js} +11 -11
  135. package/chunks/{chunk-I5N4EAS6.js → chunk-MWHY26G3.js} +1 -1
  136. package/chunks/{chunk-7XL4WRXM.js → chunk-N6VQ37ZZ.js} +2 -2
  137. package/chunks/{chunk-AHYTURFB.js → chunk-N7EYO2E7.js} +1 -1
  138. package/chunks/{chunk-LU77UT4D.js → chunk-N7VURC4O.js} +24 -26
  139. package/chunks/{chunk-DSX7KQPM.js → chunk-NAKALAL4.js} +227 -29
  140. package/chunks/{chunk-QQD2GART.js → chunk-NGX4NUNP.js} +3 -3
  141. package/chunks/{chunk-2M3EWQNG.js → chunk-NUQFUXOG.js} +17 -1
  142. package/chunks/{chunk-E4JNFXNI.js → chunk-NXWYCSPL.js} +3 -3
  143. package/chunks/{chunk-6A2D4QSO.js → chunk-O2GG7H4C.js} +4 -4
  144. package/chunks/{chunk-ZKFTS3OV.js → chunk-O45WBTNS.js} +6 -6
  145. package/chunks/{chunk-KGV55H53.js → chunk-OECNP26L.js} +1 -1
  146. package/chunks/{chunk-S6H3ELPG.js → chunk-P4RUUG64.js} +1 -1
  147. package/chunks/{chunk-GH2S4GD5.js → chunk-P5LDR7FI.js} +21 -68
  148. package/chunks/{chunk-RN3YGDCA.js → chunk-P6LATTDG.js} +4 -4
  149. package/chunks/{chunk-WP4AX3XD.js → chunk-PTFFWTTO.js} +3 -3
  150. package/chunks/{chunk-DTVQSSNM.js → chunk-PZUOHCWI.js} +3 -3
  151. package/chunks/{chunk-VYIUNFEA.js → chunk-PZV2FASB.js} +3 -3
  152. package/chunks/{chunk-XLXAZLDR.js → chunk-Q2SAQTEJ.js} +1 -1
  153. package/chunks/{chunk-47RYEQW5.js → chunk-QMFOYPGV.js} +2 -2
  154. package/chunks/{chunk-SULZPKTA.js → chunk-QSC5YOEC.js} +3 -3
  155. package/chunks/{chunk-F33GFWPR.js → chunk-QWZOOIR3.js} +58 -18
  156. package/chunks/{chunk-H43PSPYS.js → chunk-R355CUNQ.js} +4 -4
  157. package/chunks/{chunk-DQCKVAF5.js → chunk-RDKXZ2LS.js} +3 -3
  158. package/chunks/{chunk-7JMGTOH7.js → chunk-RPBMP6BN.js} +21 -1
  159. package/chunks/{chunk-5Q5RC2WE.js → chunk-RVNS7NWN.js} +2 -2
  160. package/chunks/{chunk-7RB56BRJ.js → chunk-SAZS4IWW.js} +6 -4
  161. package/chunks/{chunk-5EIOJGCR.js → chunk-SFMCYMVF.js} +4 -4
  162. package/chunks/{chunk-TMKTOTMQ.js → chunk-SN5FV4FY.js} +5 -5
  163. package/chunks/{chunk-QJGYU5PG.js → chunk-TDP7UULF.js} +1 -1
  164. package/chunks/{chunk-EIJT2PQ6.js → chunk-TIGXX4PA.js} +2 -2
  165. package/chunks/{chunk-PCRBLMIN.js → chunk-TMWB67LS.js} +21 -3
  166. package/chunks/{chunk-JUARRUMA.js → chunk-UEZOXZNI.js} +1358 -646
  167. package/chunks/{chunk-KFN2IZYR.js → chunk-UKADFFL2.js} +3 -3
  168. package/chunks/{chunk-TJYRTS4S.js → chunk-UKKYOIVT.js} +2 -2
  169. package/chunks/{chunk-EVFDRBUM.js → chunk-URSCX7S7.js} +12 -7
  170. package/chunks/{chunk-U4DJ5XB3.js → chunk-VDXYYVCD.js} +269 -70
  171. package/chunks/{chunk-4LIFGNI4.js → chunk-VEFRT7NX.js} +1 -1
  172. package/chunks/chunk-VFFQAOPR.js +18 -0
  173. package/chunks/{chunk-3AKCBZVW.js → chunk-VU7O7CGQ.js} +3 -3
  174. package/chunks/{chunk-RAFQIHN2.js → chunk-VUSSAGKI.js} +76 -5
  175. package/chunks/{chunk-TQHPVKO6.js → chunk-VY6UVU7G.js} +6 -6
  176. package/chunks/{chunk-S2T7H5MI.js → chunk-W4LL5RZO.js} +1 -1
  177. package/chunks/{chunk-ZGCKTAL5.js → chunk-WEXA2DNG.js} +2 -0
  178. package/chunks/{chunk-NVVJTUSL.js → chunk-WR3SH3EY.js} +136 -85
  179. package/chunks/{chunk-JR42V4UY.js → chunk-WTW36TJ3.js} +1 -1
  180. package/chunks/{chunk-TSZSGQ3N.js → chunk-WXC6OAWD.js} +1 -1
  181. package/chunks/{chunk-ZVP4PWBU.js → chunk-X35VIWWJ.js} +1 -1
  182. package/chunks/{chunk-KHP66DFN.js → chunk-XFFRI3WM.js} +1 -1
  183. package/chunks/{chunk-EIY7SUPZ.js → chunk-XHGGYCTA.js} +1 -1
  184. package/chunks/{chunk-BA4WJC4L.js → chunk-XOVVCGZX.js} +1 -1
  185. package/chunks/{chunk-VBWD6C27.js → chunk-XUSOYE2I.js} +1 -1
  186. package/chunks/{chunk-NUHOLAQ6.js → chunk-XWJFDJZK.js} +1 -1
  187. package/chunks/{chunk-65HWLGA7.js → chunk-XY3USGFE.js} +3 -3
  188. package/chunks/{chunk-STCVJXQB.js → chunk-Y3ZKI4RQ.js} +56 -26
  189. package/chunks/{chunk-QAK5475D.js → chunk-Y53DG2HA.js} +1 -1
  190. package/chunks/{chunk-3JQZVCBI.js → chunk-YCDL2SAS.js} +2 -2
  191. package/chunks/{chunk-NSUKQ4DN.js → chunk-YHDGABDC.js} +3 -3
  192. package/chunks/{chunk-FRICLXCZ.js → chunk-Z6WZPXQH.js} +3 -3
  193. package/chunks/{chunk-EAHOJF6V.js → chunk-ZAFYHRVY.js} +12 -0
  194. package/chunks/{chunk-MP6YZ4RK.js → chunk-ZAZ3NFL6.js} +852 -309
  195. package/chunks/{chunk-7TBU7PU2.js → chunk-ZSTCM3MX.js} +1 -1
  196. package/chunks/{chunk-NRL5CUZT.js → chunk-ZTAVGFKA.js} +1 -1
  197. package/chunks/config-utils-QXDOTXEQ.js +119 -0
  198. package/chunks/contextCommand-RN4KARWC.js +112 -0
  199. package/chunks/{core-runtime-B4UKKIAQ.js → core-runtime-NAZCOKHB.js} +63 -58
  200. package/chunks/{create-sub-session-NJ24B4US.js → create-sub-session-BCSM4WKB.js} +61 -56
  201. package/chunks/{create-sub-session-LUPWEUHR.js → create-sub-session-BQ3SE4TX.js} +3 -3
  202. package/chunks/{cron-create-CRSPET3H.js → cron-create-D6HQ7I7I.js} +4 -4
  203. package/chunks/{cron-delete-DB77SZTU.js → cron-delete-KK3D2SQV.js} +4 -4
  204. package/chunks/{cron-list-U2JNYWV6.js → cron-list-VBF3IZMF.js} +4 -4
  205. package/chunks/daemon-LCUELM6E.js +191 -0
  206. package/chunks/{daemon-git-worktree-guard-O2HPOBAB.js → daemon-git-worktree-guard-3K5CAU36.js} +62 -57
  207. package/chunks/daemon-status-provider-4X3ZZQTZ.js +122 -0
  208. package/chunks/daemon-trust-policy-R45CFUJA.js +118 -0
  209. package/chunks/{daemon-trust-policy-monitor-JL7F4Y4Q.js → daemon-trust-policy-monitor-DSSFCO3K.js} +69 -64
  210. package/chunks/{de-T4BLOKEC.js → de-UU2YTO37.js} +1 -0
  211. package/chunks/deferred-core-runtime-UO2M6WYI.js +120 -0
  212. package/chunks/{display-image-73C7XNRK.js → display-image-EVVTBVYE.js} +6 -6
  213. package/chunks/{dist-EDHQIBYD.js → dist-3T5MDUHP.js} +62 -20
  214. package/chunks/{dist-ZCJLKQSP.js → dist-AFH3BMZZ.js} +18 -10
  215. package/chunks/{dist-LXFYIJNG.js → dist-MK5PPBRF.js} +40 -9
  216. package/chunks/{dist-GT64AAUR.js → dist-PH5RSTEA.js} +56 -20
  217. package/chunks/{dist-62OZ7QXB.js → dist-QUU7TVE3.js} +35 -12
  218. package/chunks/{dist-JVXT4VUJ.js → dist-R5Y34V6T.js} +11 -2
  219. package/chunks/{dist-L6URO6CK.js → dist-SB2XRXZA.js} +5 -1
  220. package/chunks/{dist-QAF5DO3Y.js → dist-SIHF5MU2.js} +326 -131
  221. package/chunks/{dist-PDGNRVPY.js → dist-UVHW2U56.js} +20 -1
  222. package/chunks/earlyInputCapture-BXP7V2P3.js +22 -0
  223. package/chunks/{edit-SUGXY63Y.js → edit-VNBCTRWP.js} +48 -44
  224. package/chunks/{en-2RATMNX7.js → en-JMR535HP.js} +3 -1
  225. package/chunks/{enter-worktree-B6USKSIK.js → enter-worktree-CEVK7MQ2.js} +7 -7
  226. package/chunks/{enterPlanMode-MDX4RVVL.js → enterPlanMode-4KMZMUIA.js} +48 -45
  227. package/chunks/environment-S2HYQDON.js +135 -0
  228. package/chunks/errors-DAAN5TL7.js +119 -0
  229. package/chunks/{exit-worktree-DLQ73SJH.js → exit-worktree-D3YE6MUN.js} +7 -7
  230. package/chunks/exitPlanMode-HR36HG3D.js +86 -0
  231. package/chunks/{fast-path-Y73R42LV.js → fast-path-4IWSW3UV.js} +3 -3
  232. package/chunks/{fast-path-settings-MFUR3IWK.js → fast-path-settings-ISEJPRYE.js} +6 -4
  233. package/chunks/{fr-BGHGYX6A.js → fr-HKNWVXRJ.js} +1 -0
  234. package/chunks/{glob-DMGH7EZN.js → glob-IZYB2XH2.js} +46 -43
  235. package/chunks/{goal-tools-3RF3PXCL.js → goal-tools-VGUPKQDJ.js} +46 -43
  236. package/chunks/{grep-AJVLCVXC.js → grep-OUVLNXG7.js} +9 -8
  237. package/chunks/handleAutoUpdate-D56FMDTW.js +115 -0
  238. package/chunks/i18n-BKE5WO6T.js +130 -0
  239. package/chunks/{image-gen-VOIDOHOB.js → image-gen-SHVQ3XID.js} +8 -8
  240. package/chunks/initializer-MS4SGEHF.js +119 -0
  241. package/chunks/installationInfo-542MGC4S.js +113 -0
  242. package/chunks/{ja-G3FTD5XE.js → ja-GJS5RZGU.js} +1 -0
  243. package/chunks/{keychain-token-storage-REZVMJA6.js → keychain-token-storage-NQ5XWIPX.js} +2 -2
  244. package/chunks/list-H6XTKUWL.js +122 -0
  245. package/chunks/{list-agents-SBMONIUK.js → list-agents-ULYBGJXC.js} +6 -6
  246. package/chunks/{llm-K26SUDVK.js → llm-3NUC4EJY.js} +132 -113
  247. package/chunks/{llm-content-generator-TT6EAUD4.js → llm-content-generator-R4NL3OQN.js} +40 -13
  248. package/chunks/loadedSettingsAdapter-3XLKYDVT.js +116 -0
  249. package/chunks/{loggingContentGenerator-EYQBA4M4.js → loggingContentGenerator-ZYSWVNEO.js} +55 -52
  250. package/chunks/{loop-wakeup-QA6SHCZT.js → loop-wakeup-B27BEYRL.js} +5 -5
  251. package/chunks/{lowlight-J2OZNPCA.js → lowlight-BTE423KL.js} +3 -6
  252. package/chunks/{ls-HEJNCEYO.js → ls-3IIMMVKF.js} +5 -4
  253. package/chunks/{lsp-WOQKNZP6.js → lsp-VJAT7XKS.js} +2 -2
  254. package/chunks/{managed-npm-update-HIJTODQT.js → managed-npm-update-L2I53ZAI.js} +62 -57
  255. package/chunks/mcp-4PIXQASW.js +116 -0
  256. package/chunks/{monitor-DKNZQAB2.js → monitor-O2YQTOZZ.js} +50 -46
  257. package/chunks/{node-UETAYMMO.js → node-ISQAFKIS.js} +2 -2
  258. package/chunks/nonInteractiveCli-LV7CDBA2.js +198 -0
  259. package/chunks/{notebook-edit-MGHTRL2D.js → notebook-edit-4RE2ALH4.js} +48 -44
  260. package/chunks/{openaiContentGenerator-ZJIEQ3ZJ.js → openaiContentGenerator-7ND7K5CP.js} +30 -25
  261. package/chunks/pidfile-UFTLQ7NP.js +117 -0
  262. package/chunks/{processUtils-UY3SAJJZ.js → processUtils-3XBB4FYV.js} +2 -2
  263. package/chunks/prompt-terminal-ledger-2QASOGMM.js +111 -0
  264. package/chunks/{pt-D73IFYT7.js → pt-FXMYXEUV.js} +1 -0
  265. package/chunks/{qwenContentGenerator-VI4KATRY.js → qwenContentGenerator-AELTUTH6.js} +52 -49
  266. package/chunks/{qwenOAuth2-7AOCKSOQ.js → qwenOAuth2-BS5D2LYV.js} +7 -7
  267. package/chunks/{read-file-P7F4P7LV.js → read-file-PDWHZPHX.js} +13 -11
  268. package/chunks/{read-mcp-resource-GLAGB6R7.js → read-mcp-resource-YXJZ75UB.js} +2 -2
  269. package/chunks/{record-artifact-SWVR7NSU.js → record-artifact-WJDOV6XU.js} +4 -4
  270. package/chunks/{report-findings-AL5YW3KI.js → report-findings-Q4UACKWR.js} +5 -5
  271. package/chunks/{request-shutdown-5YK4IZ54.js → request-shutdown-2YZ3E3GH.js} +8 -8
  272. package/chunks/resumeHistoryUtils-QRXZEEBA.js +124 -0
  273. package/chunks/ripGrep-KSOOLE6H.js +39 -0
  274. package/chunks/{ru-QMISLKRH.js → ru-RMHURE5U.js} +1 -0
  275. package/chunks/{run-qwen-serve-OGTEEUR2.js → run-qwen-serve-RTAREPT6.js} +84 -70
  276. package/chunks/runtime-ESFSCJRZ.js +154 -0
  277. package/chunks/scheduled-tasks-6ZHRNBH6.js +133 -0
  278. package/chunks/{scheduler-73YXGUGW.js → scheduler-DQI6KV7T.js} +63 -58
  279. package/chunks/{sdk-exporters-http-3JO5TJNU.js → sdk-exporters-http-7R2ARBPV.js} +2 -2
  280. package/chunks/{sdk-impl-HZAUUTHJ.js → sdk-impl-YOLO7LV4.js} +4 -4
  281. package/chunks/{send-message-JC7NJTY6.js → send-message-PQCVSVMN.js} +24 -24
  282. package/chunks/serve-FY7ZEW52.js +124 -0
  283. package/chunks/{server-AOYZVVOM.js → server-KNDY6K5F.js} +1594 -273
  284. package/chunks/{session-UAWFNFGI.js → session-MCEPXAZP.js} +113 -105
  285. package/chunks/session-attachments-root-OLNAE6GF.js +109 -0
  286. package/chunks/{session-pr-refresh-CT2INROL.js → session-pr-refresh-HKJHQQQK.js} +67 -62
  287. package/chunks/{settings-BHRGDASJ.js → settings-VXO4WBMK.js} +68 -63
  288. package/chunks/shell-U263OTES.js +96 -0
  289. package/chunks/{skill-ZGBKNCHQ.js → skill-SDODGBKL.js} +19 -17
  290. package/chunks/skill-settings-YEIA22QJ.js +124 -0
  291. package/chunks/spawnChannel-4WJZVFPP.js +117 -0
  292. package/chunks/standalone-update-ZWVQUO64.js +124 -0
  293. package/chunks/{start-opentui-ui-FZ4USOU7.js → start-opentui-ui-BFYCJQRZ.js} +1199 -190
  294. package/chunks/{startInteractiveUI-E2WQJUOA.js → startInteractiveUI-JYAFCMHL.js} +2977 -2319
  295. package/chunks/{syntheticOutput-HJNZSEHN.js → syntheticOutput-AUAJBNXR.js} +3 -3
  296. package/chunks/{task-create-6RSD54S5.js → task-create-LD5ISM3E.js} +12 -12
  297. package/chunks/{task-list-IQSACPOM.js → task-list-YISJ4RJA.js} +5 -5
  298. package/chunks/{task-stop-HE2LRQNW.js → task-stop-65ZOVATJ.js} +2 -2
  299. package/chunks/{task-update-XAJ2NYOA.js → task-update-AAN4ZVEY.js} +15 -15
  300. package/chunks/{team-create-SOKMYSQU.js → team-create-KU7MABNO.js} +47 -44
  301. package/chunks/{team-delete-NGNNKGMG.js → team-delete-XFRRTJTT.js} +5 -5
  302. package/chunks/{team-plan-approval-U7ZWXYAY.js → team-plan-approval-DPB377A3.js} +46 -43
  303. package/chunks/terminal-image-renderer-WGWRENOF.js +124 -0
  304. package/chunks/theme-manager-GBUFULSO.js +108 -0
  305. package/chunks/{todoWrite-5UTVUXHA.js → todoWrite-G7NT4IFP.js} +5 -5
  306. package/chunks/{tool-search-IAI2RVWT.js → tool-search-6YUXHBPT.js} +19 -17
  307. package/chunks/total-session-admission-54R2JQ5L.js +118 -0
  308. package/chunks/trustedFolders-KAJIDJTH.js +128 -0
  309. package/chunks/{update-relaunch-5RWKZAL3.js → update-relaunch-XM4IWBFD.js} +5 -5
  310. package/chunks/updateCheck-W6UZFURI.js +124 -0
  311. package/chunks/useAutoAcceptIndicator-LAWYHY3U.js +126 -0
  312. package/chunks/{validateNonInterActiveAuth-QPFEKATS.js → validateNonInterActiveAuth-7WCKHRN2.js} +109 -101
  313. package/chunks/{version-JKNG7YDH.js → version-3ZU43RJ6.js} +1 -1
  314. package/chunks/{web-fetch-X3AHIIHW.js → web-fetch-QHI2SQL4.js} +16 -14
  315. package/chunks/{web-search-K2FMOGS5.js → web-search-3KZZKWNY.js} +9 -8
  316. package/chunks/{workflow-TOLPAK5G.js → workflow-HRW7Y2X4.js} +330 -1667
  317. package/chunks/workspace-providers-status-KTGCWCPC.js +120 -0
  318. package/chunks/{workspace-registration-store-KQWVVW4Y.js → workspace-registration-store-LHLPPWNE.js} +1 -1
  319. package/chunks/workspace-registry-X34MLN52.js +127 -0
  320. package/chunks/workspace-runtime-coordinator-U4PW4P7K.js +128 -0
  321. package/chunks/workspace-service-KD7BCGYL.js +132 -0
  322. package/chunks/workspace-skills-status-YJGO6Y3T.js +119 -0
  323. package/chunks/{workspace-trust-reconciler-IBDFQBQS.js → workspace-trust-reconciler-EUYHISCH.js} +74 -69
  324. package/chunks/write-file-EBSB34NJ.js +91 -0
  325. package/chunks/{zh-25DF7OGK.js → zh-DVFYHRK5.js} +3 -1
  326. package/chunks/{zh-TW-5EDMZVGK.js → zh-TW-W2GNP2IU.js} +3 -1
  327. package/chunks/{zoom-image-IFXSN74N.js → zoom-image-UJ5VKWKP.js} +13 -11
  328. package/cli.js +13 -13
  329. package/export-transcript-document.js +617 -0
  330. package/locales/ca.js +1 -0
  331. package/locales/de.js +1 -0
  332. package/locales/en.js +5 -2
  333. package/locales/fr.js +1 -0
  334. package/locales/ja.js +1 -0
  335. package/locales/pt.js +1 -0
  336. package/locales/ru.js +1 -0
  337. package/locales/zh-TW.js +5 -2
  338. package/locales/zh.js +5 -2
  339. package/package.json +5 -4
  340. package/web-shell/assets/{abnfDiagram-VCTEODGH-Cxf7xE_Z.js → abnfDiagram-VCTEODGH-Dur--luQ.js} +1 -1
  341. package/web-shell/assets/{arc-ESi1eNkE.js → arc-tYLobxFi.js} +1 -1
  342. package/web-shell/assets/{architectureDiagram-5GKGNRK7-D9l7-bDo.js → architectureDiagram-5GKGNRK7-IG6aXD03.js} +1 -1
  343. package/web-shell/assets/{blockDiagram-NRAW4CY4-Bc8DEasw.js → blockDiagram-NRAW4CY4-C6eBSkfA.js} +1 -1
  344. package/web-shell/assets/{c4Diagram-UCG6FXSJ-Dimb2Hmh.js → c4Diagram-UCG6FXSJ-BrX3HJqB.js} +1 -1
  345. package/web-shell/assets/channel-uEkvKckd.js +1 -0
  346. package/web-shell/assets/{chunk-2Q5K7J3B-jVDmOpAQ.js → chunk-2Q5K7J3B-B3fcJ8ee.js} +1 -1
  347. package/web-shell/assets/{chunk-5VM5RSS4-DbG_SwdB.js → chunk-5VM5RSS4-CeC90yKM.js} +1 -1
  348. package/web-shell/assets/{chunk-F27PBJKO-QEc4cY1v.js → chunk-F27PBJKO-CW44RVki.js} +1 -1
  349. package/web-shell/assets/{chunk-G27WJ6UU-iJ36lQ3X.js → chunk-G27WJ6UU-D1PAMukD.js} +1 -1
  350. package/web-shell/assets/{chunk-JWPE2WC7-DuArnVtF.js → chunk-JWPE2WC7-Dt3Y2Fvx.js} +1 -1
  351. package/web-shell/assets/{chunk-LCL6LL3I-DxOf1zwL.js → chunk-LCL6LL3I-CZHw2lLI.js} +1 -1
  352. package/web-shell/assets/{chunk-POPQ4Y6H-lVLu9Ild.js → chunk-POPQ4Y6H-ysNAdTGx.js} +1 -1
  353. package/web-shell/assets/{chunk-SVP7TREG-C6XYlIer.js → chunk-SVP7TREG-BdNXW6YQ.js} +1 -1
  354. package/web-shell/assets/{chunk-XXDRQBXY-CiG2j2Ji.js → chunk-XXDRQBXY-DgqQ9UA8.js} +1 -1
  355. package/web-shell/assets/classDiagram-DTDB5LWJ-DuPsnhWS.js +1 -0
  356. package/web-shell/assets/classDiagram-v2-JRS7N3AN-DuPsnhWS.js +1 -0
  357. package/web-shell/assets/{cose-bilkent-JH36ORCC-DGVHMMVm.js → cose-bilkent-JH36ORCC-BILImXzJ.js} +1 -1
  358. package/web-shell/assets/{cynefin-OW5HDTMX-D6cgpCnH.js → cynefin-OW5HDTMX-DR88Pund.js} +1 -1
  359. package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-BKv4Z-UX.js → cynefinDiagram-5FMLGOSQ-BYFbfkA6.js} +1 -1
  360. package/web-shell/assets/{dagre-3AP2YEHR-B4ABMIG-.js → dagre-3AP2YEHR-rfpyc6sX.js} +1 -1
  361. package/web-shell/assets/{diagram-S7CK7UJ4-DgCkp_Lm.js → diagram-S7CK7UJ4-BJxLmEwH.js} +1 -1
  362. package/web-shell/assets/{diagram-UQ7AKVKN-FG0FNokz.js → diagram-UQ7AKVKN-H34xm7k3.js} +1 -1
  363. package/web-shell/assets/{diagram-VSXAHHWV-JgkP9qg-.js → diagram-VSXAHHWV-HYxhwNLx.js} +1 -1
  364. package/web-shell/assets/{diagram-VX7I27RA-ADh2x83l.js → diagram-VX7I27RA-BJazso8F.js} +1 -1
  365. package/web-shell/assets/{diagram-Z3DM3KII-yXqoYF1J.js → diagram-Z3DM3KII-Clje1aNy.js} +1 -1
  366. package/web-shell/assets/{ebnfDiagram-PWID7BFC-Duk83Ek_.js → ebnfDiagram-PWID7BFC-M93YBkFh.js} +1 -1
  367. package/web-shell/assets/{erDiagram-SSCWMZ5O-DMdvxySG.js → erDiagram-SSCWMZ5O-DY8XzSHU.js} +1 -1
  368. package/web-shell/assets/{flowDiagram-A5DVABFB-DHjVgSji.js → flowDiagram-A5DVABFB-CE6Aylcq.js} +1 -1
  369. package/web-shell/assets/{ganttDiagram-EL5Y4UJY-DMM9DkCE.js → ganttDiagram-EL5Y4UJY-DI-5LL22.js} +1 -1
  370. package/web-shell/assets/{gitGraphDiagram-WWUBYQGX-t_ug9vO8.js → gitGraphDiagram-WWUBYQGX-C7BZWElk.js} +1 -1
  371. package/web-shell/assets/index-CVyqwW7y.js +2142 -0
  372. package/web-shell/assets/{index-zqvnpGHv.js → index-DclFHns9.js} +1 -1
  373. package/web-shell/assets/index-FO7JXPnH.css +36 -0
  374. package/web-shell/assets/{infoDiagram-RXCK75RN-eT1fANNm.js → infoDiagram-RXCK75RN-CGUSy4Pc.js} +1 -1
  375. package/web-shell/assets/{ishikawaDiagram-5VMMS53U-k3evzZNn.js → ishikawaDiagram-5VMMS53U-B5BVks9q.js} +1 -1
  376. package/web-shell/assets/{journeyDiagram-EYS64GPL-CGim3EAi.js → journeyDiagram-EYS64GPL-CFh6Tf7h.js} +1 -1
  377. package/web-shell/assets/{kanban-definition-3QL26DDD-WHfJo-22.js → kanban-definition-3QL26DDD-B7TlxP7c.js} +1 -1
  378. package/web-shell/assets/{layout-DkqIaFlJ.js → layout-Br_pZq2Q.js} +1 -1
  379. package/web-shell/assets/{linear-Bdkd3mCz.js → linear-BVlP6fte.js} +1 -1
  380. package/web-shell/assets/{mermaid.core-CGw0LkT_.js → mermaid.core-TrcYWoiF.js} +6 -6
  381. package/web-shell/assets/{mindmap-definition-FBJOCRG2-C9V4rBvo.js → mindmap-definition-FBJOCRG2-BJ4LzqjZ.js} +1 -1
  382. package/web-shell/assets/{pegDiagram-XKGWAZYB-CwoI2T5G.js → pegDiagram-XKGWAZYB-1b_MxlOl.js} +1 -1
  383. package/web-shell/assets/{pieDiagram-E7YTZNPT-DaTmBmPG.js → pieDiagram-E7YTZNPT-B8zl0YhY.js} +1 -1
  384. package/web-shell/assets/{quadrantDiagram-AXDQQJYC-plh6MyGI.js → quadrantDiagram-AXDQQJYC-CIZO8ukl.js} +1 -1
  385. package/web-shell/assets/{railroadDiagram-O6MQD6OU-D_b-S0iK.js → railroadDiagram-O6MQD6OU-CepHSbCj.js} +1 -1
  386. package/web-shell/assets/{requirementDiagram-EFPCY7ZU-zUzTN7VE.js → requirementDiagram-EFPCY7ZU-BCgxkcSW.js} +1 -1
  387. package/web-shell/assets/{sankeyDiagram-P5KCCOFB-m6AhoD0l.js → sankeyDiagram-P5KCCOFB-CE5CcoMM.js} +1 -1
  388. package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-Cwhzsine.js → sequenceDiagram-WJ2MYXX4-DvgHi-d5.js} +1 -1
  389. package/web-shell/assets/{sizeCapture-X5ZJPWSS-CcZuKIae.js → sizeCapture-X5ZJPWSS-T-fAsCPX.js} +1 -1
  390. package/web-shell/assets/{stateDiagram-HBIQ2CUA-CFoiJwD_.js → stateDiagram-HBIQ2CUA-DYHaul-5.js} +1 -1
  391. package/web-shell/assets/stateDiagram-v2-4QOOHH4V-BcYho9a4.js +1 -0
  392. package/web-shell/assets/{swimlanes-XN3QIQJK-CgS9hcaV.js → swimlanes-XN3QIQJK-Dbz3Qiej.js} +1 -1
  393. package/web-shell/assets/swimlanesDiagram-VK2B7HYN-D6HsOIgX.js +8 -0
  394. package/web-shell/assets/{timeline-definition-24CTP7MA-Dzzc05t9.js → timeline-definition-24CTP7MA-9NVRts3N.js} +1 -1
  395. package/web-shell/assets/{vennDiagram-4TSXK5OY-DemK0f7Y.js → vennDiagram-4TSXK5OY-C7cb7vnH.js} +1 -1
  396. package/web-shell/assets/{wardleyDiagram-VM6X3IG4-CquLxtMr.js → wardleyDiagram-VM6X3IG4-CG-8Ddjm.js} +1 -1
  397. package/web-shell/assets/{xychartDiagram-S5SC5T6Z-BTBKTM5g.js → xychartDiagram-S5SC5T6Z-iGeYAcP4.js} +1 -1
  398. package/web-shell/index.html +2 -2
  399. package/chunks/MaxSizedBox-B3D7545A.js +0 -111
  400. package/chunks/agent-headless-OC2IB55D.js +0 -85
  401. package/chunks/askUserQuestion-THQZMG44.js +0 -322
  402. package/chunks/bridge-IHSBI2YJ.js +0 -118
  403. package/chunks/channel-settings-store-BVKWAI2T.js +0 -121
  404. package/chunks/chunk-I2TMJPCV.js +0 -448
  405. package/chunks/chunk-QI27MKNQ.js +0 -4008
  406. package/chunks/config-utils-LVSYDLHZ.js +0 -114
  407. package/chunks/contextCommand-TZD7UAJK.js +0 -107
  408. package/chunks/daemon-status-provider-GRRVCJFW.js +0 -117
  409. package/chunks/daemon-trust-policy-YJL442BK.js +0 -113
  410. package/chunks/deferred-core-runtime-S32AYVZI.js +0 -115
  411. package/chunks/earlyInputCapture-BBPCIVZG.js +0 -108
  412. package/chunks/environment-VN6RXDVN.js +0 -130
  413. package/chunks/errors-UEY36PIT.js +0 -114
  414. package/chunks/exitPlanMode-EPHIEDAA.js +0 -83
  415. package/chunks/handleAutoUpdate-HVWQT2AU.js +0 -110
  416. package/chunks/i18n-5OR7NTRZ.js +0 -125
  417. package/chunks/initializer-JE5RQSOE.js +0 -114
  418. package/chunks/installationInfo-KO3CCSCK.js +0 -108
  419. package/chunks/list-3IORSFIY.js +0 -117
  420. package/chunks/loadedSettingsAdapter-KLLFZF3M.js +0 -111
  421. package/chunks/mcp-A2UEHETW.js +0 -111
  422. package/chunks/nonInteractiveCli-YA47F2F4.js +0 -190
  423. package/chunks/pidfile-ETHAZNMY.js +0 -112
  424. package/chunks/prompt-terminal-ledger-GZ747VYE.js +0 -106
  425. package/chunks/resumeHistoryUtils-DPZKFW24.js +0 -119
  426. package/chunks/ripGrep-C7LJKUPZ.js +0 -37
  427. package/chunks/runtime-LNBLEMZS.js +0 -149
  428. package/chunks/scheduled-tasks-FLDYZQOF.js +0 -128
  429. package/chunks/serve-3UR2H4CV.js +0 -119
  430. package/chunks/session-attachments-root-ZCGXQQTR.js +0 -104
  431. package/chunks/shell-YHOGC7TO.js +0 -93
  432. package/chunks/skill-settings-AKSP665O.js +0 -119
  433. package/chunks/spawnChannel-N25MBB6F.js +0 -112
  434. package/chunks/standalone-update-XGPWJDRN.js +0 -119
  435. package/chunks/terminal-image-renderer-KKM4OBLO.js +0 -117
  436. package/chunks/theme-manager-GQHF3A7T.js +0 -103
  437. package/chunks/total-session-admission-G4CGCSTG.js +0 -113
  438. package/chunks/trustedFolders-D2I3FDPB.js +0 -123
  439. package/chunks/updateCheck-ZXOQDFEI.js +0 -119
  440. package/chunks/useAutoAcceptIndicator-6EK4QGAH.js +0 -121
  441. package/chunks/workspace-providers-status-PCJK3RC7.js +0 -115
  442. package/chunks/workspace-registry-YNIOB6HJ.js +0 -122
  443. package/chunks/workspace-runtime-coordinator-WG2RNEN7.js +0 -123
  444. package/chunks/workspace-service-G4ZNBOFH.js +0 -127
  445. package/chunks/workspace-skills-status-FMTPPMWC.js +0 -114
  446. package/chunks/write-file-YTLFY2S5.js +0 -88
  447. package/web-shell/assets/channel-B7ohGDil.js +0 -1
  448. package/web-shell/assets/classDiagram-DTDB5LWJ-DdFpqpfD.js +0 -1
  449. package/web-shell/assets/classDiagram-v2-JRS7N3AN-DdFpqpfD.js +0 -1
  450. package/web-shell/assets/index-BGZRqbRo.css +0 -36
  451. package/web-shell/assets/index-DRri_6_x.js +0 -2067
  452. package/web-shell/assets/stateDiagram-v2-4QOOHH4V--H8HdEmk.js +0 -1
  453. package/web-shell/assets/swimlanesDiagram-VK2B7HYN-ShE9OIgf.js +0 -8
@@ -579,6 +579,7 @@ var PERMISSION_MODES = [
579
579
  ];
580
580
 
581
581
  // packages/sdk-typescript/src/daemon/types.ts
582
+ var GOAL_PAUSE_REASON_COMMAND = "Paused with /goal pause.";
582
583
  var DaemonCapabilityMissingError = class extends Error {
583
584
  static {
584
585
  __name(this, "DaemonCapabilityMissingError");
@@ -1058,6 +1059,9 @@ var urlEncode = encodeURIComponent;
1058
1059
  function transcriptPageSuffix(opts) {
1059
1060
  const query = new URLSearchParams();
1060
1061
  if (opts.cursor !== void 0) query.set("cursor", opts.cursor);
1062
+ if (opts.direction !== void 0) query.set("direction", opts.direction);
1063
+ if (opts.atRecordId !== void 0) query.set("atRecordId", opts.atRecordId);
1064
+ if (opts.snapshot !== void 0) query.set("snapshot", opts.snapshot);
1061
1065
  if (opts.beforeRecordId !== void 0) {
1062
1066
  query.set("beforeRecordId", opts.beforeRecordId);
1063
1067
  }
@@ -1066,6 +1070,15 @@ function transcriptPageSuffix(opts) {
1066
1070
  return value ? `?${value}` : "";
1067
1071
  }
1068
1072
  __name(transcriptPageSuffix, "transcriptPageSuffix");
1073
+ function turnIndexPageSuffix(opts) {
1074
+ const query = new URLSearchParams();
1075
+ if (opts.snapshot !== void 0) query.set("snapshot", opts.snapshot);
1076
+ if (opts.start !== void 0) query.set("start", String(opts.start));
1077
+ if (opts.limit !== void 0) query.set("limit", String(opts.limit));
1078
+ const value = query.toString();
1079
+ return value ? `?${value}` : "";
1080
+ }
1081
+ __name(turnIndexPageSuffix, "turnIndexPageSuffix");
1069
1082
  function normalizePermissionRuleInput(rule) {
1070
1083
  const trimmed = rule.trim();
1071
1084
  if (!trimmed) {
@@ -1650,6 +1663,16 @@ var DaemonClient = class {
1650
1663
  }
1651
1664
  );
1652
1665
  }
1666
+ workspaceConfigSkills() {
1667
+ return this.jsonRequest("/workspace/config/skills", "Skills config", {
1668
+ mode: "rest"
1669
+ });
1670
+ }
1671
+ workspaceRuntimeSkills() {
1672
+ return this.jsonRequest("/workspace/runtime/skills", "Skills runtime", {
1673
+ mode: "rest"
1674
+ });
1675
+ }
1653
1676
  async workspaceAcpPreheat(timeoutMs) {
1654
1677
  const serverBudgetMs = timeoutMs ?? 5e3;
1655
1678
  const suffix = timeoutMs !== void 0 ? `?timeoutMs=${encodeURIComponent(timeoutMs)}` : "";
@@ -1721,6 +1744,13 @@ var DaemonClient = class {
1721
1744
  }
1722
1745
  );
1723
1746
  }
1747
+ async sessionResources(sessionId, clientId) {
1748
+ return await this.jsonRequest(
1749
+ `/session/${urlEncode(sessionId)}/resources`,
1750
+ "GET /session/:id/resources",
1751
+ { clientId, mode: "rest" }
1752
+ );
1753
+ }
1724
1754
  async workspaceExtensions() {
1725
1755
  return await this.jsonRequest(
1726
1756
  "/workspace/extensions",
@@ -2958,6 +2988,13 @@ var DaemonClient = class {
2958
2988
  }
2959
2989
  );
2960
2990
  }
2991
+ async getSessionTurnIndexPage(sessionId, opts = {}) {
2992
+ return await this.jsonRequest(
2993
+ `/session/${urlEncode(sessionId)}/turn-index${turnIndexPageSuffix(opts)}`,
2994
+ "GET /session/:id/turn-index",
2995
+ { clientId: opts.clientId, mode: "rest" }
2996
+ );
2997
+ }
2961
2998
  async resolveSubagentSession(sessionId, subagentRef, clientId) {
2962
2999
  return await this.jsonRequest(
2963
3000
  `/session/${urlEncode(sessionId)}/subagents/${urlEncode(subagentRef)}`,
@@ -3098,6 +3135,35 @@ var DaemonClient = class {
3098
3135
  }
3099
3136
  );
3100
3137
  }
3138
+ async sessionAgents(sessionId, clientId, signal) {
3139
+ return await this.fetchWithTimeout(
3140
+ `${this.baseUrl}/session/${urlEncode(sessionId)}/agents`,
3141
+ { headers: this.headers({}, clientId), signal },
3142
+ async (res) => {
3143
+ if (!res.ok) {
3144
+ throw await this.failOnError(res, "GET /session/:id/agents");
3145
+ }
3146
+ return await res.json();
3147
+ }
3148
+ );
3149
+ }
3150
+ async sessionAgentTrace(sessionId, opts = {}) {
3151
+ const query = new URLSearchParams();
3152
+ if (opts.rootAgentId) {
3153
+ query.set("rootAgentId", opts.rootAgentId);
3154
+ }
3155
+ const suffix = query.size > 0 ? `?${query}` : "";
3156
+ return await this.fetchWithTimeout(
3157
+ `${this.baseUrl}/session/${urlEncode(sessionId)}/agent-trace${suffix}`,
3158
+ { headers: this.headers({}, opts.clientId), signal: opts.signal },
3159
+ async (res) => {
3160
+ if (!res.ok) {
3161
+ throw await this.failOnError(res, "GET /session/:id/agent-trace");
3162
+ }
3163
+ return await res.json();
3164
+ }
3165
+ );
3166
+ }
3101
3167
  async sessionWorkflowTasks(sessionId, clientId) {
3102
3168
  return await this.fetchWithTimeout(
3103
3169
  `${this.baseUrl}/session/${urlEncode(sessionId)}/tasks?includeWorkflows=true`,
@@ -3110,6 +3176,21 @@ var DaemonClient = class {
3110
3176
  }
3111
3177
  );
3112
3178
  }
3179
+ async sessionSavedWorkflow(sessionId, name, clientId) {
3180
+ return await this.fetchWithTimeout(
3181
+ `${this.baseUrl}/session/${urlEncode(sessionId)}/saved-workflows/${urlEncode(name)}`,
3182
+ { headers: this.headers({}, clientId) },
3183
+ async (res) => {
3184
+ if (!res.ok) {
3185
+ throw await this.failOnError(
3186
+ res,
3187
+ "GET /session/:id/saved-workflows/:name"
3188
+ );
3189
+ }
3190
+ return await res.json();
3191
+ }
3192
+ );
3193
+ }
3113
3194
  async sessionLspStatus(sessionId, clientId) {
3114
3195
  return await this.fetchWithTimeout(
3115
3196
  `${this.baseUrl}/session/${urlEncode(sessionId)}/lsp`,
@@ -3438,6 +3519,23 @@ var DaemonClient = class {
3438
3519
  }
3439
3520
  );
3440
3521
  }
3522
+ async listSessionAttachments(sessionId, opts) {
3523
+ return await this.fetchWithTimeout(
3524
+ `${this.baseUrl}/session/${urlEncode(sessionId)}/attachments`,
3525
+ {
3526
+ method: "GET",
3527
+ headers: this.headers({}, opts?.clientId),
3528
+ signal: opts?.signal
3529
+ },
3530
+ async (res) => {
3531
+ if (!res.ok) {
3532
+ throw await this.failOnError(res, "GET /session/:id/attachments");
3533
+ }
3534
+ const body = await res.json();
3535
+ return Array.isArray(body.attachments) ? body.attachments : [];
3536
+ }
3537
+ );
3538
+ }
3441
3539
  async removeSessionAttachment(sessionId, attachmentId, opts) {
3442
3540
  return await this.fetchWithTimeout(
3443
3541
  `${this.baseUrl}/session/${urlEncode(sessionId)}/attachments/${urlEncode(attachmentId)}`,
@@ -3713,6 +3811,20 @@ var DaemonClient = class {
3713
3811
  { method: "DELETE" }
3714
3812
  );
3715
3813
  }
3814
+ installWorkspaceConfigSkill(request) {
3815
+ return this.jsonRequest("/workspace/config/skills/install", "Skill", {
3816
+ method: "POST",
3817
+ body: request,
3818
+ mode: "rest"
3819
+ });
3820
+ }
3821
+ deleteWorkspaceConfigSkill(skillName, scope) {
3822
+ return this.jsonRequest(
3823
+ `/workspace/config/skills/${urlEncode(skillName)}?scope=${scope}`,
3824
+ "Skill",
3825
+ { method: "DELETE", mode: "rest" }
3826
+ );
3827
+ }
3716
3828
  async workspaceSettings(opts) {
3717
3829
  return await this.fetchWithTimeout(
3718
3830
  `${this.baseUrl}/workspace/settings`,
@@ -5495,6 +5607,51 @@ var WorkspaceDaemonClient = class {
5495
5607
  workspaceSkills() {
5496
5608
  return this.get("/skills", "GET /workspaces/:workspace/skills");
5497
5609
  }
5610
+ workspaceConfigSkills() {
5611
+ return this.client.workspaceJsonRequest(
5612
+ this.workspaceSelector,
5613
+ "/config/skills",
5614
+ "GET /workspaces/:workspace/config/skills",
5615
+ { mode: "rest" }
5616
+ );
5617
+ }
5618
+ workspaceRuntimeSkills() {
5619
+ return this.client.workspaceJsonRequest(
5620
+ this.workspaceSelector,
5621
+ "/runtime/skills",
5622
+ "GET /workspaces/:workspace/runtime/skills",
5623
+ { mode: "rest" }
5624
+ );
5625
+ }
5626
+ setWorkspaceConfigSkillEnabled(skillName, enabled, opts) {
5627
+ return this.client.workspaceJsonRequest(
5628
+ this.workspaceSelector,
5629
+ `/config/skills/${urlEncode(skillName)}/enable`,
5630
+ "POST /workspaces/:workspace/config/skills/:name/enable",
5631
+ {
5632
+ method: "POST",
5633
+ body: { enabled },
5634
+ clientId: opts?.clientId,
5635
+ mode: "rest"
5636
+ }
5637
+ );
5638
+ }
5639
+ installWorkspaceConfigSkill(request) {
5640
+ return this.client.workspaceJsonRequest(
5641
+ this.workspaceSelector,
5642
+ "/config/skills/install",
5643
+ "POST /workspaces/:workspace/config/skills/install",
5644
+ { method: "POST", body: request, mode: "rest" }
5645
+ );
5646
+ }
5647
+ deleteWorkspaceConfigSkill(skillName, scope) {
5648
+ return this.client.workspaceJsonRequest(
5649
+ this.workspaceSelector,
5650
+ `/config/skills/${urlEncode(skillName)}?scope=${scope}`,
5651
+ "DELETE /workspaces/:workspace/config/skills/:name",
5652
+ { method: "DELETE", mode: "rest" }
5653
+ );
5654
+ }
5498
5655
  workspaceProviders() {
5499
5656
  return this.get("/providers", "GET /workspaces/:workspace/providers");
5500
5657
  }
@@ -5652,6 +5809,15 @@ var WorkspaceDaemonClient = class {
5652
5809
  { clientId: opts.clientId, mode: "rest" }
5653
5810
  );
5654
5811
  }
5812
+ /** Read one sparse page of persisted navigation turns in this workspace. */
5813
+ getSessionTurnIndexPage(sessionId, opts = {}) {
5814
+ return this.client.workspaceJsonRequest(
5815
+ this.workspaceSelector,
5816
+ `/session/${urlEncode(sessionId)}/turn-index${turnIndexPageSuffix(opts)}`,
5817
+ "GET /workspaces/:workspace/session/:id/turn-index",
5818
+ { clientId: opts.clientId, mode: "rest" }
5819
+ );
5820
+ }
5655
5821
  /** Export an active persisted session from this registered workspace. */
5656
5822
  exportSession(sessionId, opts = {}) {
5657
5823
  return this.client.sessionExportRequest(
@@ -6314,6 +6480,9 @@ var DaemonSessionClient = class _DaemonSessionClient {
6314
6480
  get worktree() {
6315
6481
  return this.session.worktree;
6316
6482
  }
6483
+ get worktreeState() {
6484
+ return this.session.worktreeState;
6485
+ }
6317
6486
  get branch() {
6318
6487
  return this.session.branch;
6319
6488
  }
@@ -6449,6 +6618,14 @@ var DaemonSessionClient = class _DaemonSessionClient {
6449
6618
  })
6450
6619
  );
6451
6620
  }
6621
+ async listAttachments(signal) {
6622
+ return await this.withClientIdSelfHeal(
6623
+ () => this.client.listSessionAttachments(this.sessionId, {
6624
+ ...signal ? { signal } : {},
6625
+ ...this.clientId ? { clientId: this.clientId } : {}
6626
+ })
6627
+ );
6628
+ }
6452
6629
  async removeAttachment(attachmentId, signal) {
6453
6630
  const removed = await this.withClientIdSelfHeal(
6454
6631
  () => this.client.removeSessionAttachment(this.sessionId, attachmentId, {
@@ -6493,7 +6670,19 @@ var DaemonSessionClient = class _DaemonSessionClient {
6493
6670
  const resume = this.restoreStrategy.kind === "standalone" ? this.client.resumeStandaloneSession(this.sessionId) : this.client.resumeSession(this.sessionId, {
6494
6671
  workspaceCwd: this.restoreStrategy.workspaceCwd
6495
6672
  });
6496
- this.reattaching = resume.then((session) => {
6673
+ this.reattaching = resume.then(async (session) => {
6674
+ if (this.session.worktreeState === "persisted-v1") {
6675
+ const sameWorktree = session.worktreeState === "persisted-v1" && session.worktree?.path === this.session.worktree?.path;
6676
+ if (!sameWorktree) {
6677
+ await this.client.detachSession(session.sessionId, session.clientId).catch(() => {
6678
+ });
6679
+ throw new Error(
6680
+ `Daemon lost durable worktree identity for session ${this.sessionId}`
6681
+ );
6682
+ }
6683
+ this.session.worktree = session.worktree;
6684
+ this.session.worktreeState = session.worktreeState;
6685
+ }
6497
6686
  this.session.clientId = session.clientId;
6498
6687
  });
6499
6688
  try {
@@ -6657,6 +6846,12 @@ var DaemonSessionClient = class _DaemonSessionClient {
6657
6846
  )
6658
6847
  };
6659
6848
  }
6849
+ async getTurnIndexPage(opts = {}) {
6850
+ return this.client.getSessionTurnIndexPage(this.sessionId, {
6851
+ ...opts,
6852
+ clientId: opts.clientId ?? this.clientId
6853
+ });
6854
+ }
6660
6855
  removePendingPrompt(promptId) {
6661
6856
  return this.client.removePendingPrompt(this.sessionId, promptId, {
6662
6857
  ...this.clientId ? { clientId: this.clientId } : {}
@@ -6689,12 +6884,31 @@ var DaemonSessionClient = class _DaemonSessionClient {
6689
6884
  tasks() {
6690
6885
  return this.client.sessionTasks(this.sessionId, this.clientId);
6691
6886
  }
6887
+ agents(signal) {
6888
+ return this.client.sessionAgents(this.sessionId, this.clientId, signal);
6889
+ }
6890
+ agentTrace(opts = {}) {
6891
+ return this.client.sessionAgentTrace(this.sessionId, {
6892
+ ...opts,
6893
+ clientId: this.clientId
6894
+ });
6895
+ }
6692
6896
  workflowTasks() {
6693
6897
  return this.client.sessionWorkflowTasks(this.sessionId, this.clientId);
6694
6898
  }
6899
+ savedWorkflow(name) {
6900
+ return this.client.sessionSavedWorkflow(
6901
+ this.sessionId,
6902
+ name,
6903
+ this.clientId
6904
+ );
6905
+ }
6695
6906
  lspStatus() {
6696
6907
  return this.client.sessionLspStatus(this.sessionId, this.clientId);
6697
6908
  }
6909
+ resources() {
6910
+ return this.client.sessionResources(this.sessionId, this.clientId);
6911
+ }
6698
6912
  cancelTask(taskId, kind) {
6699
6913
  return this.client.sessionTaskCancel(
6700
6914
  this.sessionId,
@@ -6959,7 +7173,11 @@ var DaemonSessionClient = class _DaemonSessionClient {
6959
7173
  return {
6960
7174
  type: "image",
6961
7175
  data: attachment.data,
6962
- mimeType: attachment.mimeType
7176
+ mimeType: attachment.mimeType,
7177
+ // Keep the reference id on the hydrated block so message images stay
7178
+ // re-fetchable after a reload (Web Shell previews persist the id
7179
+ // instead of the data URL).
7180
+ attachmentId: block.attachmentId
6963
7181
  };
6964
7182
  } catch (err) {
6965
7183
  if (err instanceof DaemonHttpError && (err.status === 404 || err.status === 410)) {
@@ -7121,7 +7339,7 @@ var DAEMON_KNOWN_EVENT_TYPE_VALUES = [
7121
7339
  // Daemon assist push events. `followup_suggestion`: server-side
7122
7340
  // ghost-text "what you might want to ask next" suggestion, generated
7123
7341
  // after each end_turn by the ACP child and forwarded through the per-
7124
- // session SSE bus so the webui (and other future daemon adapters)
7342
+ // session SSE bus so Web Shell (and other future daemon adapters)
7125
7343
  // can render the suggestion in their input placeholder. The wire
7126
7344
  // carries only post-filter suggestions (`getFilterReason()===null`);
7127
7345
  // generator-side suppression telemetry stays on the daemon. Old SDK
@@ -8019,7 +8237,7 @@ function isDaemonSkillToggleMutation(value) {
8019
8237
  const skills = value["skills"];
8020
8238
  return isNonEmptyString(value["id"]) && value["kind"] === "skill_toggle" && Array.isArray(skills) && skills.length > 0 && skills.every(
8021
8239
  (skill) => isRecord(skill) && isNonEmptyString(skill["name"]) && typeof skill["enabled"] === "boolean"
8022
- ) && (activation === "applied" || activation === "deferred" || activation === "partial") && isFiniteNumber(value["sessionsRefreshed"]) && isFiniteNumber(value["sessionsFailed"]);
8240
+ ) && (activation === "applied" || activation === "deferred" || activation === "reconciling" || activation === "partial") && isFiniteNumber(value["sessionsRefreshed"]) && isFiniteNumber(value["sessionsFailed"]);
8023
8241
  }
8024
8242
  __name(isDaemonSkillToggleMutation, "isDaemonSkillToggleMutation");
8025
8243
  function isSettingsChangedData(value) {
@@ -8284,6 +8502,9 @@ function isUnrecognizedDiagnosticReason(reason) {
8284
8502
  }
8285
8503
  __name(isUnrecognizedDiagnosticReason, "isUnrecognizedDiagnosticReason");
8286
8504
 
8505
+ // packages/sdk-typescript/src/daemon/ui/toolPreview.ts
8506
+ init_esbuild_shims();
8507
+
8287
8508
  // packages/sdk-typescript/src/daemon/ui/utils.ts
8288
8509
  init_esbuild_shims();
8289
8510
  function isRecord2(value) {
@@ -8478,1860 +8699,2053 @@ var dcsSequencePattern = new RegExp(
8478
8699
  var csiSequencePattern = new RegExp(`${escapeChar}\\[[0-?]*[ -/]*[@-~]`, "g");
8479
8700
  var bidiControlPattern = /[\u200e\u200f\u202a-\u202e\u2066-\u2069]/g;
8480
8701
 
8481
- // packages/sdk-typescript/src/daemon/ui/normalizer.ts
8482
- var DAEMON_ERROR_KIND_SET = new Set(DAEMON_ERROR_KINDS);
8483
- var DEVICE_FLOW_PROVIDER_SET = /* @__PURE__ */ new Set(["qwen", "qwen-oauth"]);
8484
- var MCP_RESTART_REFUSED_REASONS2 = /* @__PURE__ */ new Set([
8485
- "in_flight",
8486
- "disabled",
8487
- "budget_would_exceed",
8488
- "authentication_required"
8489
- ]);
8490
- var MALFORMED_MEMORY_CHANGED = "malformed memory_changed payload";
8491
- var SESSION_RECORDING_DEGRADED_MESSAGE = "Session recording stopped after a write failure. New messages for the affected session will not be saved. Check disk space and permissions, then start a new session to resume recording.";
8492
- var ATTACHMENT_UNAVAILABLE_TEXT = "[Attachment is no longer available]";
8493
- function normalizeDaemonEvent(event, opts = {}) {
8494
- const base = createBase(event, opts);
8495
- switch (event.type) {
8496
- case "session_update":
8497
- return normalizeSessionUpdate(event, base, opts);
8498
- case "shell_output": {
8499
- const text = getOutputText(event.data);
8500
- const stream = getShellStream(event.data);
8501
- const source = getSource(event.data);
8502
- return text ? [
8702
+ // packages/sdk-typescript/src/daemon/ui/toolPreview.ts
8703
+ var MAX_TOOL_PREVIEW_DEPTH = 8;
8704
+ var MAX_TODO_PREVIEW_ENTRIES = 1e3;
8705
+ var MAX_TOOL_RESULT_PREVIEW_LENGTH = 1e5;
8706
+ var MAX_TODO_ID_LENGTH = 512;
8707
+ function createDaemonToolPreview(input, opts = {}, depth = 0) {
8708
+ if (depth > MAX_TOOL_PREVIEW_DEPTH) {
8709
+ const summary2 = opts.title ?? opts.toolName ?? opts.toolKind;
8710
+ return { kind: "generic", ...summary2 ? { summary: summary2 } : {} };
8711
+ }
8712
+ if (isRecord2(input)) {
8713
+ const nestedInput = input["rawInput"] ?? input["input"] ?? input["args"];
8714
+ if (nestedInput !== void 0 && nestedInput !== input) {
8715
+ const meta = isRecord2(input["_meta"]) ? input["_meta"] : void 0;
8716
+ const nested = createDaemonToolPreview(
8717
+ nestedInput,
8503
8718
  {
8504
- ...base,
8505
- type: source === "user-shell" ? "user.shell.output" : "shell.output",
8506
- text,
8507
- ...stream ? { stream } : {}
8508
- }
8509
- ] : [];
8719
+ title: opts.title ?? getFirstString(input, ["title"]),
8720
+ toolName: opts.toolName ?? getFirstString(input, ["toolName", "name"]) ?? (meta ? getFirstString(meta, ["toolName"]) : void 0),
8721
+ toolKind: opts.toolKind ?? getFirstString(input, ["kind"])
8722
+ },
8723
+ depth + 1
8724
+ );
8725
+ if (nested.kind !== "generic" || !nested.summary) return nested;
8510
8726
  }
8511
- case "permission_request":
8512
- return normalizePermissionRequest(event, base);
8513
- case "permission_resolved":
8514
- case "permission_already_resolved":
8515
- return normalizePermissionResolved(event, base);
8516
- case "model_switched":
8517
- return [
8518
- {
8519
- ...base,
8520
- type: "model.changed",
8521
- modelId: getString2(event.data, "modelId") ?? "unknown"
8522
- }
8523
- ];
8524
- case "model_switch_failed":
8525
- return [
8526
- {
8527
- ...base,
8528
- type: "error",
8529
- recoverable: true,
8530
- text: getString2(event.data, "error") ?? "Model switch failed (no details available)"
8531
- }
8532
- ];
8533
- case "session_died": {
8534
- const errorKind = asDaemonErrorKind(getString2(event.data, "errorKind"));
8535
- return [
8536
- {
8537
- ...base,
8538
- type: "error",
8539
- recoverable: false,
8540
- ...errorKind ? { errorKind } : {},
8541
- text: getString2(event.data, "reason") ?? "Session died (no details available)"
8542
- }
8543
- ];
8727
+ }
8728
+ const askUserQuestions = extractAskUserQuestions(input);
8729
+ if (askUserQuestions.length > 0) {
8730
+ return { kind: "ask_user_question", questions: askUserQuestions };
8731
+ }
8732
+ const todoList = detectTodoList(input, opts, true);
8733
+ if (todoList) return todoList;
8734
+ const mcpPreview = detectMcpInvocation(input, opts);
8735
+ if (mcpPreview) return mcpPreview;
8736
+ const subagent = detectSubagentDelegation(input, opts);
8737
+ if (subagent) return subagent;
8738
+ const search = detectSearch(input, opts);
8739
+ if (search) return search;
8740
+ const imageGeneration = detectImageGeneration(input, opts);
8741
+ if (imageGeneration) return imageGeneration;
8742
+ const fileDiff = detectFileDiff(input, opts);
8743
+ if (fileDiff) return fileDiff;
8744
+ const fileRead = detectFileRead(input, opts);
8745
+ if (fileRead) return fileRead;
8746
+ const webFetch = detectWebFetch(input);
8747
+ if (webFetch) return webFetch;
8748
+ const codeBlock = detectCodeBlock(input, opts);
8749
+ if (codeBlock) return codeBlock;
8750
+ const tabular = detectTabular(input);
8751
+ if (tabular) return tabular;
8752
+ if (isRecord2(input)) {
8753
+ const command = getFirstString(input, ["command", "cmd"]);
8754
+ if (command) {
8755
+ const cwd = getFirstString(input, [
8756
+ "cwd",
8757
+ "directory",
8758
+ "workingDirectory"
8759
+ ]);
8760
+ return { kind: "command", command, ...cwd ? { cwd } : {} };
8544
8761
  }
8545
- case "session_closed":
8546
- return [
8547
- {
8548
- ...base,
8549
- type: "status",
8550
- text: `Session closed: ${getString2(event.data, "reason") ?? "closed"}`
8551
- }
8552
- ];
8553
- case "session_recording_degraded": {
8554
- const sessionId = getString2(event.data, "sessionId");
8555
- if (!sessionId || getString2(event.data, "reason") !== "write_failed") {
8556
- return fallbackDebug(event, base, "malformed recording state");
8557
- }
8558
- return [
8559
- {
8560
- ...base,
8561
- type: "error",
8562
- recoverable: true,
8563
- code: "session_recording_degraded",
8564
- text: SESSION_RECORDING_DEGRADED_MESSAGE
8565
- }
8566
- ];
8567
- }
8568
- case "session_snapshot": {
8569
- if (!isRecord2(event.data) || !getString2(event.data, "sessionId")) {
8570
- return fallbackDebug(event, base, "malformed recording snapshot");
8571
- }
8572
- const recordingDegraded = event.data["recordingDegraded"];
8573
- if (recordingDegraded !== void 0 && typeof recordingDegraded !== "boolean") {
8574
- return fallbackDebug(event, base, "malformed recording snapshot");
8575
- }
8576
- if (recordingDegraded === true) {
8577
- return [
8578
- {
8579
- ...base,
8580
- type: "error",
8581
- recoverable: true,
8582
- code: "session_recording_degraded",
8583
- text: SESSION_RECORDING_DEGRADED_MESSAGE
8584
- }
8585
- ];
8586
- }
8587
- return [];
8588
- }
8589
- case "client_evicted":
8590
- return [
8591
- {
8592
- ...base,
8593
- type: "error",
8594
- recoverable: true,
8595
- text: getString2(event.data, "reason") ?? "SSE client evicted (no details available)"
8596
- }
8597
- ];
8598
- case "slow_client_warning":
8599
- return [
8600
- {
8601
- ...base,
8602
- type: "status",
8603
- text: "SSE stream is lagging"
8604
- }
8605
- ];
8606
- case "stream_error": {
8607
- const errorKind = asDaemonErrorKind(getString2(event.data, "errorKind"));
8608
- return [
8609
- {
8610
- ...base,
8611
- type: "error",
8612
- recoverable: true,
8613
- ...errorKind ? { errorKind } : {},
8614
- text: getString2(event.data, "error") ?? "SSE stream error (no details available)"
8615
- }
8616
- ];
8617
- }
8618
- case "turn_error": {
8619
- const code = getString2(event.data, "code");
8620
- const errorKind = asDaemonErrorKind(getString2(event.data, "errorKind"));
8621
- const promptId = getString2(event.data, "promptId");
8622
- return [
8623
- {
8624
- ...base,
8625
- type: "error",
8626
- source: "turn_error",
8627
- recoverable: true,
8628
- ...code ? { code } : {},
8629
- ...errorKind ? { errorKind } : {},
8630
- ...promptId ? { promptId } : {},
8631
- text: getString2(event.data, "message") ?? "Prompt failed (no details available)"
8632
- }
8633
- ];
8762
+ const rows = collectPreviewRows(input);
8763
+ if (rows.length > 0) {
8764
+ return { kind: "key_value", rows };
8634
8765
  }
8635
- case "state_resync_required":
8636
- return normalizeStateResyncRequired(event, base);
8637
- case "history_truncated":
8638
- return normalizeHistoryTruncated(event, base);
8639
- case "session_rewound":
8640
- return normalizeSessionRewound(event, base);
8641
- case "session_branched":
8642
- return normalizeSessionBranched(event, base);
8643
- case "prompt_cancelled": {
8644
- const reason = stringField(event.data, "reason");
8645
- return [
8646
- { ...base, type: "prompt.cancelled", ...reason ? { reason } : {} }
8647
- ];
8766
+ }
8767
+ const summary = opts.title ?? opts.toolName ?? opts.toolKind;
8768
+ return { kind: "generic", ...summary ? { summary } : {} };
8769
+ }
8770
+ __name(createDaemonToolPreview, "createDaemonToolPreview");
8771
+ function createDaemonToolResultPreview(output, content, opts = {}) {
8772
+ const todoList = detectTodoList(output, opts, false);
8773
+ if (todoList) return todoList;
8774
+ return createDaemonToolResultTextPreview(
8775
+ extractDisplayContentText(content) ?? ""
8776
+ );
8777
+ }
8778
+ __name(createDaemonToolResultPreview, "createDaemonToolResultPreview");
8779
+ function createDaemonToolResultTextPreview(text) {
8780
+ return text.length > 0 && text.length <= MAX_TOOL_RESULT_PREVIEW_LENGTH ? { kind: "text", text } : void 0;
8781
+ }
8782
+ __name(createDaemonToolResultTextPreview, "createDaemonToolResultTextPreview");
8783
+ function detectTodoList(input, opts, includeLegacySummary) {
8784
+ if (!isRecord2(input)) return void 0;
8785
+ const toolName = opts.toolName?.toLowerCase();
8786
+ const entries = Array.isArray(input["entries"]) ? input["entries"] : Array.isArray(input["todos"]) ? input["todos"] : void 0;
8787
+ if (!entries || toolName !== "todo_write" && toolName !== "todowrite") {
8788
+ return void 0;
8789
+ }
8790
+ const retainedEntries = entries.slice(0, MAX_TODO_PREVIEW_ENTRIES);
8791
+ const authoredIds = /* @__PURE__ */ new Set();
8792
+ for (const entry of retainedEntries) {
8793
+ if (!isRecord2(entry)) continue;
8794
+ const meta2 = isRecord2(entry["_meta"]) ? entry["_meta"] : void 0;
8795
+ const qwenTodo = meta2 && isRecord2(meta2["qwenTodo"]) ? meta2["qwenTodo"] : void 0;
8796
+ const authoredId = getFirstString(qwenTodo, ["id"]) ?? getFirstString(entry, ["id"]);
8797
+ if (authoredId && authoredId.length <= MAX_TODO_ID_LENGTH) {
8798
+ authoredIds.add(authoredId);
8799
+ }
8800
+ }
8801
+ const normalized = [];
8802
+ const usedIds = /* @__PURE__ */ new Set();
8803
+ let truncated = entries.length > MAX_TODO_PREVIEW_ENTRIES;
8804
+ let remainingText = MAX_TOOL_RESULT_PREVIEW_LENGTH;
8805
+ let remainingDependencyInputs = MAX_TODO_PREVIEW_ENTRIES;
8806
+ retainedEntries.forEach((entry, index) => {
8807
+ if (!isRecord2(entry)) {
8808
+ truncated = true;
8809
+ return;
8648
8810
  }
8649
- case "followup_suggestion":
8650
- return normalizeFollowupSuggestion(event, base);
8651
- case "mid_turn_message_injected":
8652
- return normalizeMidTurnMessageInjected(event, base);
8653
- case "pending_prompt_added":
8654
- case "pending_prompt_started":
8655
- case "pending_prompt_completed":
8656
- return [];
8657
- case "user_shell_command": {
8658
- const command = getString2(event.data, "command");
8659
- const cwd = getString2(event.data, "cwd");
8660
- return command ? [
8661
- {
8662
- ...base,
8663
- type: "user.shell.command",
8664
- command,
8665
- ...cwd ? { cwd } : {}
8666
- },
8667
- { ...base, type: "user.text.delta", text: `$ ${command}` }
8668
- ] : [];
8811
+ const rawContent = getFirstString(entry, ["content", "text", "title"]);
8812
+ if (!rawContent) {
8813
+ truncated = true;
8814
+ return;
8669
8815
  }
8670
- case "user_shell_result": {
8671
- const exitCode = numberField(event.data, "exitCode");
8672
- const aborted = isRecord2(event.data) && event.data["aborted"] === true;
8673
- const text = aborted ? "Shell command was aborted" : `Shell command exited with code ${exitCode ?? "unknown"}`;
8674
- return [{ ...base, type: "status", text }];
8816
+ if (remainingText === 0) {
8817
+ truncated = true;
8818
+ return;
8675
8819
  }
8676
- case "replay_complete": {
8677
- const replayedCount = numberField(event.data, "replayedCount") ?? 0;
8678
- const lastReplayedEventId = numberField(event.data, "lastReplayedEventId") ?? numberField(event.data, "lastEventId");
8679
- return [
8680
- {
8681
- ...base,
8682
- type: "session.replay_complete",
8683
- replayedCount,
8684
- ...lastReplayedEventId !== void 0 ? { lastReplayedEventId } : {}
8685
- }
8686
- ];
8820
+ const content = detachString(rawContent.slice(0, remainingText));
8821
+ if (content.length < rawContent.length) truncated = true;
8822
+ remainingText -= content.length;
8823
+ const meta2 = isRecord2(entry["_meta"]) ? entry["_meta"] : void 0;
8824
+ const qwenTodo = meta2 && isRecord2(meta2["qwenTodo"]) ? meta2["qwenTodo"] : void 0;
8825
+ const qwenTodoId = getFirstString(qwenTodo, ["id"]);
8826
+ const entryId = getFirstString(entry, ["id"]);
8827
+ const authoredId = qwenTodoId ?? entryId;
8828
+ const rawId = authoredId ?? `plan-${index}`;
8829
+ if (qwenTodo?.["id"] !== void 0 !== !!qwenTodoId || entry["id"] !== void 0 !== !!entryId) {
8830
+ truncated = true;
8831
+ }
8832
+ let id = rawId.length <= MAX_TODO_ID_LENGTH ? rawId : `plan-${index}`;
8833
+ if (id !== rawId) truncated = true;
8834
+ const idWasSynthesized = authoredId === void 0 || id !== rawId;
8835
+ if (usedIds.has(id) || idWasSynthesized && authoredIds.has(id)) {
8836
+ id = allocateUniqueTodoId(id, authoredIds, usedIds);
8837
+ }
8838
+ usedIds.add(id);
8839
+ const rawStatus = getFirstString(entry, ["status"]);
8840
+ if (entry["status"] !== void 0 && rawStatus === void 0) {
8841
+ truncated = true;
8842
+ }
8843
+ const status = rawStatus === "completed" || rawStatus === "in_progress" ? rawStatus : "pending";
8844
+ if (rawStatus !== void 0 && rawStatus !== "pending" && rawStatus !== "in_progress" && rawStatus !== "completed") {
8845
+ truncated = true;
8846
+ }
8847
+ const rawPriority = getFirstString(entry, ["priority"]);
8848
+ const priority = rawPriority === "high" || rawPriority === "medium" || rawPriority === "low" ? rawPriority : void 0;
8849
+ if (entry["priority"] !== void 0 !== !!priority) {
8850
+ truncated = true;
8851
+ }
8852
+ const blockedBySource = qwenTodo?.["blockedBy"] ?? entry["blockedBy"];
8853
+ const rawBlockedBy = Array.isArray(blockedBySource) ? blockedBySource : [];
8854
+ if (blockedBySource !== void 0 && !Array.isArray(blockedBySource)) {
8855
+ truncated = true;
8856
+ }
8857
+ const blockedBy = [];
8858
+ for (const dependency of rawBlockedBy) {
8859
+ if (remainingDependencyInputs === 0) {
8860
+ truncated = true;
8861
+ break;
8862
+ }
8863
+ remainingDependencyInputs -= 1;
8864
+ if (typeof dependency !== "string" || dependency.length === 0 || dependency.length > MAX_TODO_ID_LENGTH) {
8865
+ truncated = true;
8866
+ continue;
8867
+ }
8868
+ blockedBy.push(dependency);
8687
8869
  }
8688
- // ── Session-meta events ──────────────────────────────────────────────
8689
- case "session_metadata_updated":
8690
- return normalizeSessionMetadataUpdated(event, base);
8691
- case "approval_mode_changed":
8692
- return normalizeApprovalModeChanged(event, base);
8693
- // ── Workspace events ──────────────────────────────────────
8694
- case "git_branch_changed":
8695
- return [];
8696
- case "git_status_changed":
8697
- return [];
8698
- case "memory_changed":
8699
- return normalizeMemoryChanged(event, base);
8700
- case "agent_changed":
8701
- return normalizeAgentChanged(event, base);
8702
- case "tool_toggled":
8703
- return normalizeToolToggled(event, base);
8704
- case "settings_changed":
8705
- return normalizeSettingsChanged(event, base);
8706
- case "settings_reloaded":
8707
- return normalizeSettingsReloaded(event, base);
8708
- case "trust_change_requested":
8709
- return normalizeTrustChangeRequested(event, base);
8710
- case "workspace_initialized":
8711
- return normalizeWorkspaceInitialized(event, base);
8712
- case "github_setup_completed":
8713
- return normalizeGithubSetupCompleted(event, base);
8714
- case "mcp_budget_warning":
8715
- return normalizeMcpBudgetWarning(event, base);
8716
- case "mcp_child_refused_batch":
8717
- return normalizeMcpChildRefused(event, base);
8718
- case "mcp_server_restarted":
8719
- return normalizeMcpServerRestarted(event, base);
8720
- case "mcp_server_restart_refused":
8721
- return normalizeMcpServerRestartRefused(event, base);
8722
- case "mcp_server_added":
8723
- return normalizeMcpServerChanged(event, base, "added");
8724
- case "mcp_server_removed":
8725
- return normalizeMcpServerChanged(event, base, "removed");
8726
- case "mcp_server_changed":
8727
- return normalizeMcpServerChanged(event, base);
8728
- case "extensions_changed":
8729
- return normalizeExtensionsChanged(event, base);
8730
- case "artifact_changed":
8731
- return normalizeArtifactChanged(event, base);
8732
- // ── Auth device-flow events (RFC 8628) ─────────────────
8733
- case "auth_device_flow_started":
8734
- return normalizeAuthDeviceFlowStarted(event, base);
8735
- case "auth_device_flow_throttled":
8736
- return normalizeAuthDeviceFlowThrottled(event, base);
8737
- case "auth_device_flow_authorized":
8738
- return normalizeAuthDeviceFlowAuthorized(event, base);
8739
- case "auth_device_flow_failed":
8740
- return normalizeAuthDeviceFlowFailed(event, base);
8741
- case "auth_device_flow_cancelled":
8742
- return normalizeAuthDeviceFlowCancelled(event, base);
8743
- default:
8744
- return normalizeUnrecognizedEvent(event, base);
8745
- }
8870
+ normalized.push({
8871
+ id,
8872
+ content,
8873
+ status,
8874
+ ...priority ? { priority } : {},
8875
+ ...blockedBy.length > 0 ? { blockedBy } : {}
8876
+ });
8877
+ });
8878
+ const meta = isRecord2(input["_meta"]) ? input["_meta"] : void 0;
8879
+ const todoPlan = meta && isRecord2(meta["qwenTodoPlan"]) ? meta["qwenTodoPlan"] : void 0;
8880
+ const plan = isRecord2(input["plan"]) ? input["plan"] : void 0;
8881
+ const todoPlanId = getFirstString(todoPlan, ["id"]);
8882
+ const nestedPlanId = getFirstString(plan, ["id"]);
8883
+ const inputPlanId = getFirstString(input, ["planId"]);
8884
+ const rawPlanId = todoPlanId ?? nestedPlanId ?? inputPlanId;
8885
+ if (todoPlan?.["id"] !== void 0 !== !!todoPlanId || plan?.["id"] !== void 0 !== !!nestedPlanId || input["planId"] !== void 0 !== !!inputPlanId) {
8886
+ truncated = true;
8887
+ }
8888
+ const planId = rawPlanId && rawPlanId.length <= MAX_TODO_ID_LENGTH ? rawPlanId : void 0;
8889
+ if (rawPlanId && !planId) truncated = true;
8890
+ const rawRevision = todoPlan?.["revision"] ?? plan?.["revision"] ?? input["revision"];
8891
+ const revision = typeof rawRevision === "number" && Number.isSafeInteger(rawRevision) && rawRevision >= 0 ? rawRevision : void 0;
8892
+ if (rawRevision !== void 0 && revision === void 0) truncated = true;
8893
+ const summary = opts.title ?? opts.toolName ?? opts.toolKind;
8894
+ return {
8895
+ kind: "todo_list",
8896
+ entries: normalized,
8897
+ ...includeLegacySummary && summary ? { summary } : {},
8898
+ ...truncated ? { truncated: true } : {},
8899
+ ...planId ? { planId } : {},
8900
+ ...revision !== void 0 ? { revision } : {}
8901
+ };
8746
8902
  }
8747
- __name(normalizeDaemonEvent, "normalizeDaemonEvent");
8748
- function normalizeUnrecognizedEvent(event, base) {
8749
- return [
8750
- {
8751
- ...base,
8752
- type: "debug",
8753
- debugReason: "unrecognized_event",
8754
- text: debugBlockText(
8755
- `${event.type} (unrecognized daemon event)`,
8756
- event.data
8757
- )
8903
+ __name(detectTodoList, "detectTodoList");
8904
+ function allocateUniqueTodoId(base, authoredIds, usedIds) {
8905
+ for (let attempt = 1; ; attempt += 1) {
8906
+ const suffix = attempt === 1 ? "-s" : `-s${attempt}`;
8907
+ const candidate = `${base.slice(0, MAX_TODO_ID_LENGTH - suffix.length)}${suffix}`;
8908
+ if (!authoredIds.has(candidate) && !usedIds.has(candidate)) {
8909
+ return candidate;
8910
+ }
8911
+ }
8912
+ }
8913
+ __name(allocateUniqueTodoId, "allocateUniqueTodoId");
8914
+ function extractDisplayContentText(content) {
8915
+ if (!Array.isArray(content)) return void 0;
8916
+ let text = "";
8917
+ for (const entry of content) {
8918
+ if (!isRecord2(entry) || entry["type"] !== "content") continue;
8919
+ const body = isRecord2(entry["content"]) ? entry["content"] : void 0;
8920
+ const next = typeof body?.["text"] === "string" ? body["text"] : void 0;
8921
+ if (!next) continue;
8922
+ if (text.length + (text ? 1 : 0) + next.length > MAX_TOOL_RESULT_PREVIEW_LENGTH) {
8923
+ return void 0;
8758
8924
  }
8759
- ];
8760
- }
8761
- __name(normalizeUnrecognizedEvent, "normalizeUnrecognizedEvent");
8762
- function normalizeStateResyncRequired(event, base) {
8763
- const reason = getString2(event.data, "reason");
8764
- const lastDeliveredId = numberField(event.data, "lastDeliveredId");
8765
- const earliestAvailableId = numberField(event.data, "earliestAvailableId");
8766
- if (!reason || lastDeliveredId === void 0 || earliestAvailableId === void 0) {
8767
- return fallbackDebug(
8768
- event,
8769
- base,
8770
- "malformed state_resync_required payload"
8771
- );
8925
+ text += `${text ? "\n" : ""}${next}`;
8772
8926
  }
8773
- return [
8774
- {
8775
- ...base,
8776
- type: "session.state_resync_required",
8777
- reason,
8778
- lastDeliveredId,
8779
- earliestAvailableId
8780
- }
8781
- ];
8927
+ return text || void 0;
8782
8928
  }
8783
- __name(normalizeStateResyncRequired, "normalizeStateResyncRequired");
8784
- function normalizeHistoryTruncated(event, base) {
8785
- const reason = getString2(event.data, "reason");
8786
- const truncatedEvents = numberField(event.data, "truncatedEvents");
8787
- const retainedEvents = numberField(event.data, "retainedEvents");
8788
- const maxBytes = numberField(event.data, "maxBytes");
8789
- const maxEvents = numberField(event.data, "maxEvents");
8790
- if (reason !== "replay_window_exceeded" || truncatedEvents === void 0 || retainedEvents === void 0 || maxBytes === void 0 || !isRecord2(event.data) || typeof event.data["fullTranscriptAvailable"] !== "boolean") {
8791
- return fallbackDebug(event, base, "malformed history_truncated payload");
8792
- }
8793
- const scope = getString2(event.data, "scope");
8794
- if (event.data["scope"] !== void 0 && !scope || event.data["maxEvents"] !== void 0 && (maxEvents === void 0 || !Number.isInteger(maxEvents) || maxEvents < 0)) {
8795
- return fallbackDebug(event, base, "malformed history_truncated payload");
8796
- }
8797
- const fullTranscriptAvailable = event.data["fullTranscriptAvailable"];
8798
- const limits = [
8799
- maxEvents === void 0 ? void 0 : `${maxEvents} ${scope === "live_journal" ? "replay entries" : "events"}`,
8800
- `${maxBytes} bytes`
8801
- ].filter((limit) => limit !== void 0).join(" / ");
8802
- const text = scope === "live_journal" ? `History truncated for live turn replay: kept the latest ${retainedEvents} source events and dropped ${truncatedEvents} older source events (limits: ${limits}). ${fullTranscriptAvailable ? "Complete content remains available after the turn finishes." : "Complete content is not available for automatic recovery."}` : scope === void 0 ? `History truncated in replay history: kept the latest ${retainedEvents} events and dropped ${truncatedEvents} older replay events (limits: ${limits}). ${fullTranscriptAvailable ? "Older content remains available from the full transcript." : "Older content is not available from a full transcript."}` : `History truncated: kept the latest ${retainedEvents} events and dropped ${truncatedEvents} older replay events (limits: ${limits}). ${fullTranscriptAvailable ? "Full transcript content remains available." : "Full transcript content is not available."}`;
8803
- return [
8804
- {
8805
- ...base,
8806
- type: "status",
8807
- text,
8808
- source: "history_truncated",
8809
- data: event.data
8810
- }
8811
- ];
8929
+ __name(extractDisplayContentText, "extractDisplayContentText");
8930
+ function detectFileDiff(input, opts = {}) {
8931
+ if (!isRecord2(input)) return void 0;
8932
+ const path = getFirstString(input, [
8933
+ "path",
8934
+ "filePath",
8935
+ "file_path",
8936
+ "absolutePath"
8937
+ ]);
8938
+ if (!path) return void 0;
8939
+ const oldText = getFirstString(input, [
8940
+ "oldText",
8941
+ "old_text",
8942
+ "old_string",
8943
+ "old_str",
8944
+ "old_string",
8945
+ "oldString"
8946
+ ]);
8947
+ const explicitNewText = getFirstString(input, [
8948
+ "newText",
8949
+ "new_text",
8950
+ "new_string",
8951
+ "new_str",
8952
+ "new_string",
8953
+ "newString"
8954
+ ]);
8955
+ const toolNameLower = (opts.toolName ?? "").toLowerCase();
8956
+ const writeIntent = /(?:^|[_-])(write|create|edit|replace|save|update|overwrite|modify|patch|generate)(?:$|[_-])/.test(
8957
+ toolNameLower
8958
+ ) || !!oldText;
8959
+ const contentField = explicitNewText === void 0 && writeIntent ? getFirstString(input, ["content"]) : void 0;
8960
+ const newText = explicitNewText ?? contentField;
8961
+ const patch = getFirstString(input, ["patch", "diff", "unified_diff"]);
8962
+ if (!oldText && !newText && !patch) return void 0;
8963
+ return {
8964
+ kind: "file_diff",
8965
+ path,
8966
+ ...oldText ? { oldText } : {},
8967
+ ...newText ? { newText } : {},
8968
+ ...patch ? { patch } : {}
8969
+ };
8812
8970
  }
8813
- __name(normalizeHistoryTruncated, "normalizeHistoryTruncated");
8814
- function normalizeSessionRewound(event, base) {
8815
- const promptId = getString2(event.data, "promptId");
8816
- const targetTurnIndex = numberField(event.data, "targetTurnIndex");
8817
- if (!promptId || targetTurnIndex === void 0) {
8818
- return fallbackDebug(event, base, "malformed session_rewound payload");
8819
- }
8820
- const sessionId = getString2(event.data, "sessionId");
8821
- return [
8822
- {
8823
- ...base,
8824
- type: "session.rewound",
8825
- promptId,
8826
- targetTurnIndex,
8827
- ...sessionId ? { sessionId } : {}
8971
+ __name(detectFileDiff, "detectFileDiff");
8972
+ function detectFileRead(input, opts) {
8973
+ if (!isRecord2(input)) return void 0;
8974
+ const path = getFirstString(input, [
8975
+ "path",
8976
+ "filePath",
8977
+ "file_path",
8978
+ "absolutePath"
8979
+ ]);
8980
+ if (!path) return void 0;
8981
+ const toolName = opts.toolName ?? getFirstString(input, ["toolName", "name"]);
8982
+ const looksLikeRead = toolName !== void 0 && /read|view|cat/i.test(toolName);
8983
+ const rangeArr = input["lineRange"] ?? input["line_range"] ?? input["range"];
8984
+ let range;
8985
+ if (Array.isArray(rangeArr) && rangeArr.length === 2 && typeof rangeArr[0] === "number" && typeof rangeArr[1] === "number") {
8986
+ range = [rangeArr[0], rangeArr[1]];
8987
+ } else {
8988
+ const offset = input["offset"];
8989
+ const limit = input["limit"];
8990
+ if (typeof offset === "number" && typeof limit === "number" && limit > 0) {
8991
+ range = [offset + 1, offset + limit];
8828
8992
  }
8829
- ];
8830
- }
8831
- __name(normalizeSessionRewound, "normalizeSessionRewound");
8832
- function normalizeSessionBranched(event, base) {
8833
- const sourceSessionId = getString2(event.data, "sourceSessionId");
8834
- const newSessionId = getString2(event.data, "newSessionId");
8835
- const displayName = getString2(event.data, "displayName");
8836
- if (!sourceSessionId || !newSessionId || !displayName) {
8837
- return fallbackDebug(event, base, "malformed session_branched payload");
8838
8993
  }
8839
- return [
8840
- {
8841
- ...base,
8842
- type: "session.branched",
8843
- sourceSessionId,
8844
- newSessionId,
8845
- displayName
8846
- }
8847
- ];
8994
+ if (!looksLikeRead && !range) return void 0;
8995
+ return {
8996
+ kind: "file_read",
8997
+ path,
8998
+ ...range ? { range } : {}
8999
+ };
8848
9000
  }
8849
- __name(normalizeSessionBranched, "normalizeSessionBranched");
8850
- function normalizeFollowupSuggestion(event, base) {
8851
- const sessionId = getString2(event.data, "sessionId");
8852
- const suggestion = getString2(event.data, "suggestion");
8853
- const promptId = getString2(event.data, "promptId");
8854
- if (!sessionId || !suggestion || !promptId) {
8855
- return fallbackDebug(event, base, "malformed followup_suggestion payload");
8856
- }
8857
- return [
8858
- {
8859
- ...base,
8860
- type: "followup.suggestion",
8861
- sessionId,
8862
- suggestion,
8863
- promptId
8864
- }
8865
- ];
9001
+ __name(detectFileRead, "detectFileRead");
9002
+ function detectWebFetch(input) {
9003
+ if (!isRecord2(input)) return void 0;
9004
+ const url = getFirstString(input, ["url", "uri", "href"]);
9005
+ if (!url) return void 0;
9006
+ if (!/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(url)) return void 0;
9007
+ const method = getFirstString(input, ["method", "httpMethod"]);
9008
+ return {
9009
+ kind: "web_fetch",
9010
+ url,
9011
+ ...method ? { method } : {}
9012
+ };
8866
9013
  }
8867
- __name(normalizeFollowupSuggestion, "normalizeFollowupSuggestion");
8868
- function normalizeMidTurnMessageInjected(event, base) {
8869
- if (!isRecord2(event.data)) {
8870
- return fallbackDebug(event, base, "malformed mid_turn_message_injected");
9014
+ __name(detectWebFetch, "detectWebFetch");
9015
+ function detectMcpInvocation(input, opts) {
9016
+ const toolName = opts.toolName ?? (isRecord2(input) ? getFirstString(input, ["toolName", "name"]) : void 0);
9017
+ if (!toolName || !toolName.startsWith("mcp__")) return void 0;
9018
+ const rest = toolName.slice("mcp__".length);
9019
+ const sep = rest.indexOf("__");
9020
+ if (sep <= 0) return void 0;
9021
+ const serverId = rest.slice(0, sep);
9022
+ const toolPart = rest.slice(sep + 2);
9023
+ let argsSummary;
9024
+ if (isRecord2(input)) {
9025
+ const args = input["arguments"] ?? input["args"] ?? input;
9026
+ if (isRecord2(args)) {
9027
+ const firstEntry = Object.entries(args).filter(([key]) => key !== "name" && key !== "toolName").slice(0, 1).map(([key, value]) => {
9028
+ const v = isSensitiveKey(key) ? "[redacted]" : typeof value === "string" ? value : stringifyCompactRedactedJson(value);
9029
+ const trimmed = v.length > 60 ? `${v.slice(0, 60)}\u2026` : v;
9030
+ return `${key}=${trimmed}`;
9031
+ })[0];
9032
+ if (firstEntry) argsSummary = firstEntry;
9033
+ }
8871
9034
  }
8872
- const data = event.data;
8873
- const rawMessages = data["messages"];
8874
- const messages = Array.isArray(rawMessages) && rawMessages.every(
8875
- (message) => typeof message === "string"
8876
- ) ? rawMessages : [];
8877
- const items = data["items"];
8878
- const hasRenderableItemContent = Array.isArray(items) && items.some(
8879
- (item) => isRecord2(item) && Array.isArray(item["content"]) && item["content"].some(
8880
- (block) => isRecord2(block) && (block["type"] === "image" || block["type"] === "resource" || block["type"] === "text" && typeof block["text"] === "string" && block["text"].length > 0)
8881
- )
8882
- );
8883
- if (messages.length === 0 || !messages.some(Boolean) && !hasRenderableItemContent) {
8884
- return fallbackDebug(event, base, "malformed mid_turn_message_injected");
9035
+ return {
9036
+ kind: "mcp_invocation",
9037
+ serverId,
9038
+ toolName: toolPart,
9039
+ ...argsSummary ? { argsSummary } : {}
9040
+ };
9041
+ }
9042
+ __name(detectMcpInvocation, "detectMcpInvocation");
9043
+ function stringifyCompactRedactedJson(value) {
9044
+ try {
9045
+ return JSON.stringify(redactSensitiveFields(value)) ?? String(value);
9046
+ } catch {
9047
+ return String(value);
8885
9048
  }
8886
- const messageIds = Array.isArray(data["messageIds"]) ? data["messageIds"] : [];
8887
- return messages.map((text, index) => {
8888
- const item = Array.isArray(items) ? items[index] : void 0;
8889
- const messageId = messageIds[index];
9049
+ }
9050
+ __name(stringifyCompactRedactedJson, "stringifyCompactRedactedJson");
9051
+ function extractAskUserQuestions(input) {
9052
+ if (!isRecord2(input) || !Array.isArray(input["questions"])) return [];
9053
+ return input["questions"].filter(isRecord2).map((question) => {
9054
+ const header = getFirstString(question, ["header", "title", "label"]);
9055
+ const prompt = getFirstString(question, ["question", "prompt", "text"]) ?? "Question";
9056
+ const options = Array.isArray(question["options"]) ? question["options"].filter(isRecord2).map(normalizeQuestionOption) : [];
8890
9057
  return {
8891
- ...base,
8892
- type: "status",
8893
- text,
8894
- source: "mid_turn_message_injected",
8895
- data: {
8896
- ...data,
8897
- messages: [text],
8898
- ...Array.isArray(items) ? { items: item !== void 0 ? [item] : [] } : {},
8899
- ...typeof messageId === "string" ? { messageIds: [messageId] } : Array.isArray(data["messageIds"]) ? { messageIds: [] } : {}
8900
- }
9058
+ ...header ? { header } : {},
9059
+ question: prompt,
9060
+ options,
9061
+ raw: question
8901
9062
  };
8902
9063
  });
8903
9064
  }
8904
- __name(normalizeMidTurnMessageInjected, "normalizeMidTurnMessageInjected");
8905
- function createBase(event, opts) {
8906
- const serverTimestamp = extractServerTimestamp(event);
8907
- const sourceRecordIds = extractSourceRecordIds(event);
8908
- const branchRecordId = extractBranchRecordId(event);
9065
+ __name(extractAskUserQuestions, "extractAskUserQuestions");
9066
+ function normalizeQuestionOption(option) {
9067
+ const label = getFirstString(option, ["label", "title", "value"]) ?? "Option";
9068
+ const description = getFirstString(option, ["description", "detail", "text"]);
8909
9069
  return {
8910
- ...event.id !== void 0 ? { eventId: event.id } : {},
8911
- ...serverTimestamp !== void 0 ? { serverTimestamp } : {},
8912
- ...sourceRecordIds ? { sourceRecordIds } : {},
8913
- ...event.promptId ? { promptId: event.promptId } : {},
8914
- ...branchRecordId ? { branchRecordId } : {},
8915
- ...event.originatorClientId ? { originatorClientId: event.originatorClientId } : {},
8916
- ...opts.includeRawEvent ? { rawEvent: { ...event, data: redactSensitiveFields(event.data) } } : {}
9070
+ label,
9071
+ ...description ? { description } : {},
9072
+ raw: option
8917
9073
  };
8918
9074
  }
8919
- __name(createBase, "createBase");
8920
- function extractBranchRecordId(event) {
8921
- if (!isRecord2(event.data)) return void 0;
8922
- const update = getSessionUpdatePayload(event.data);
8923
- const meta = update && isRecord2(update["_meta"]) ? update["_meta"] : void 0;
8924
- const transcript = meta && isRecord2(meta["qwenTranscript"]) ? meta["qwenTranscript"] : void 0;
8925
- return transcript ? getString2(transcript, "branchRecordId") : void 0;
8926
- }
8927
- __name(extractBranchRecordId, "extractBranchRecordId");
8928
- function extractServerTimestamp(event) {
8929
- const direct = event.serverTimestamp;
8930
- if (typeof direct === "number" && Number.isFinite(direct)) return direct;
8931
- const envelopeMeta = event._meta;
8932
- if (isRecord2(envelopeMeta)) {
8933
- const ts = envelopeMeta["serverTimestamp"];
8934
- if (typeof ts === "number" && Number.isFinite(ts)) return ts;
8935
- }
8936
- if (isRecord2(event.data)) {
8937
- const dataMeta = event.data["_meta"];
8938
- const update = event.data["update"];
8939
- const updateMeta = isRecord2(update) ? update["_meta"] : void 0;
8940
- if (isRecord2(dataMeta)) {
8941
- const ts = dataMeta["serverTimestamp"];
8942
- if (typeof ts === "number" && Number.isFinite(ts)) return ts;
8943
- }
8944
- if (isRecord2(updateMeta)) {
8945
- const serverTs = updateMeta["serverTimestamp"];
8946
- if (typeof serverTs === "number" && Number.isFinite(serverTs)) {
8947
- return serverTs;
8948
- }
8949
- }
8950
- const timestampCandidates = [
8951
- isRecord2(updateMeta) ? updateMeta["timestamp"] : void 0,
8952
- isRecord2(update) ? update["timestamp"] : void 0,
8953
- isRecord2(dataMeta) ? dataMeta["timestamp"] : void 0,
8954
- event.data["timestamp"]
8955
- ];
8956
- for (const candidate of timestampCandidates) {
8957
- const timestamp = parseTimestamp(candidate);
8958
- if (timestamp !== void 0) return timestamp;
8959
- }
9075
+ __name(normalizeQuestionOption, "normalizeQuestionOption");
9076
+ function collectPreviewRows(input) {
9077
+ const rows = [];
9078
+ const candidates = [
9079
+ ["Path", ["path", "filePath", "file_path", "absolutePath"]],
9080
+ ["Cwd", ["cwd", "directory", "workingDirectory"]],
9081
+ ["Query", ["query", "pattern", "search"]],
9082
+ ["Note", ["description", "reason"]]
9083
+ ];
9084
+ for (const [label, keys] of candidates) {
9085
+ const value = getFirstString(input, keys);
9086
+ if (value) rows.push({ label, value });
8960
9087
  }
8961
- return void 0;
8962
- }
8963
- __name(extractServerTimestamp, "extractServerTimestamp");
8964
- function parseTimestamp(value) {
8965
- if (typeof value === "number" && Number.isFinite(value)) return value;
8966
- if (typeof value !== "string") return void 0;
8967
- if (/^\d+$/.test(value)) {
8968
- const numeric = Number(value);
8969
- return Number.isFinite(numeric) ? numeric : void 0;
9088
+ if (rows.length > 0) return rows;
9089
+ for (const [key, value] of Object.entries(input).slice(0, 4)) {
9090
+ if (value === void 0 || value === null || Array.isArray(value)) continue;
9091
+ if (isRecord2(value)) continue;
9092
+ rows.push({
9093
+ label: key,
9094
+ value: isSensitiveKey(key) ? "[redacted]" : capDetails(stringifyRedactedJson(value))
9095
+ });
8970
9096
  }
8971
- const parsed = Date.parse(value);
8972
- return Number.isFinite(parsed) ? parsed : void 0;
9097
+ return rows;
8973
9098
  }
8974
- __name(parseTimestamp, "parseTimestamp");
8975
- function isAttachmentReferenceContent(value) {
8976
- return isRecord2(value) && (value["type"] === "image" || value["type"] === "resource") && typeof value["attachmentId"] === "string" && value["attachmentId"].length > 0 && value["data"] === void 0 && value["url"] === void 0 && value["source"] === void 0;
9099
+ __name(collectPreviewRows, "collectPreviewRows");
9100
+ var MAX_TABULAR_ROWS = 50;
9101
+ var MAX_SEARCH_TOP_RESULTS = 5;
9102
+ function detectSubagentDelegation(input, opts) {
9103
+ const toolName = opts.toolName ?? "";
9104
+ const looksLikeDelegate = /^task$/i.test(toolName) || /(?:^|_)(?:delegate|subagent|spawn[_-]?task)$/i.test(toolName) || /agent/i.test(opts.toolKind ?? "");
9105
+ if (!looksLikeDelegate) return void 0;
9106
+ if (!isRecord2(input)) return void 0;
9107
+ const agentName = getFirstString(input, [
9108
+ "subagent_type",
9109
+ "agent",
9110
+ "agentName",
9111
+ "agent_name",
9112
+ "subagent"
9113
+ ]);
9114
+ const task = getFirstString(input, [
9115
+ "prompt",
9116
+ "task",
9117
+ "description",
9118
+ "instruction",
9119
+ "query"
9120
+ ]);
9121
+ if (!agentName && !task) return void 0;
9122
+ const parentDelegationId = getFirstString(input, [
9123
+ "parentDelegationId",
9124
+ "parent_delegation_id",
9125
+ "parent_id"
9126
+ ]);
9127
+ return {
9128
+ kind: "subagent_delegation",
9129
+ agentName: agentName ?? "subagent",
9130
+ task: task ?? "(no task description)",
9131
+ ...parentDelegationId ? { parentDelegationId } : {}
9132
+ };
8977
9133
  }
8978
- __name(isAttachmentReferenceContent, "isAttachmentReferenceContent");
8979
- function normalizeSessionUpdate(event, base, opts) {
8980
- const update = getSessionUpdatePayload(event.data);
8981
- if (!update) {
8982
- return [
8983
- {
8984
- ...base,
8985
- type: "debug",
8986
- debugReason: "malformed_payload",
8987
- text: debugBlockText("session_update", event.data)
9134
+ __name(detectSubagentDelegation, "detectSubagentDelegation");
9135
+ function detectSearch(input, opts) {
9136
+ if (!isRecord2(input)) return void 0;
9137
+ const query = getFirstString(input, ["query", "pattern", "search", "q"]);
9138
+ if (!query) return void 0;
9139
+ const toolName = opts.toolName ?? "";
9140
+ const looksLikeSearch = /(grep|search|find|ripgrep|rg|glob|lookup)/i.test(toolName) || typeof input["resultCount"] === "number" || Array.isArray(input["results"]) || Array.isArray(input["matches"]);
9141
+ if (!looksLikeSearch) return void 0;
9142
+ const resultCount = typeof input["resultCount"] === "number" ? input["resultCount"] : typeof input["total"] === "number" ? input["total"] : Array.isArray(input["results"]) ? input["results"].length : Array.isArray(input["matches"]) ? input["matches"].length : void 0;
9143
+ let top;
9144
+ const rawResults = input["results"] ?? input["matches"];
9145
+ if (Array.isArray(rawResults)) {
9146
+ top = rawResults.slice(0, MAX_SEARCH_TOP_RESULTS).map((item) => {
9147
+ if (typeof item === "string") return item;
9148
+ if (isRecord2(item)) {
9149
+ return getFirstString(item, ["path", "file", "name", "title", "text"]) ?? stringifyJson(item).slice(0, 120);
8988
9150
  }
8989
- ];
9151
+ return String(item);
9152
+ }).filter(Boolean);
9153
+ if (top.length === 0) top = void 0;
8990
9154
  }
8991
- const kind = getString2(update, "sessionUpdate");
8992
- switch (kind) {
8993
- case "user_message_chunk": {
8994
- if (opts.suppressOwnUserEcho && opts.clientId && event.originatorClientId === opts.clientId) {
8995
- return [];
8996
- }
8997
- const meta = extractUpdateMeta(update);
8998
- const content = update["content"];
8999
- const part = extractContentPart(content);
9000
- if (part) {
9001
- if (part.kind === "image") {
9002
- const data = part.source.data;
9003
- let mimeType = part.mediaType || "image/*";
9004
- if (mimeType === "image/*" && data) {
9005
- const rawData = data.startsWith("data:") ? data.split(",")[1] ?? "" : data;
9006
- const prefix = rawData.slice(0, 10);
9007
- if (prefix.startsWith("iVBORw0KGg")) mimeType = "image/png";
9008
- else if (prefix.startsWith("/9j/")) mimeType = "image/jpeg";
9009
- else if (prefix.startsWith("R0lGOD")) mimeType = "image/gif";
9010
- else if (prefix.startsWith("UklGR")) mimeType = "image/webp";
9011
- }
9012
- if (data) {
9013
- return [
9014
- {
9015
- ...base,
9016
- type: "user.image.delta",
9017
- data,
9018
- mimeType,
9019
- ...meta ? { meta } : {}
9020
- }
9021
- ];
9022
- }
9023
- return [];
9024
- }
9025
- if (part.kind === "text") {
9026
- return part.text ? [
9027
- {
9028
- ...base,
9029
- type: "user.text.delta",
9030
- text: part.text,
9031
- ...meta ? { meta } : {}
9032
- }
9033
- ] : [];
9034
- }
9035
- return [];
9036
- }
9037
- if (isAttachmentReferenceContent(content)) {
9038
- if (content["type"] === "resource") {
9039
- const attachmentId = content["attachmentId"];
9040
- const mimeType = content["mimeType"];
9041
- return [
9042
- {
9043
- ...base,
9044
- type: "user.file.delta",
9045
- name: attachmentId,
9046
- attachmentId,
9047
- mimeType: typeof mimeType === "string" ? mimeType : "",
9048
- ...meta ? { meta } : {}
9049
- }
9050
- ];
9051
- }
9052
- return [
9053
- {
9054
- ...base,
9055
- type: "user.text.delta",
9056
- text: ATTACHMENT_UNAVAILABLE_TEXT,
9057
- ...meta ? { meta } : {}
9058
- }
9059
- ];
9060
- }
9061
- const text = getTextContent(content);
9155
+ return {
9156
+ kind: "search",
9157
+ query,
9158
+ ...resultCount !== void 0 ? { resultCount } : {},
9159
+ ...top ? { top } : {}
9160
+ };
9161
+ }
9162
+ __name(detectSearch, "detectSearch");
9163
+ function detectImageGeneration(input, opts) {
9164
+ const toolName = opts.toolName ?? "";
9165
+ const looksLikeImageGen = /(image[_-]?gen|generate[_-]?image|diffusion|dalle|imagen|flux|stable[_-]?diffusion|midjourney|sora)/i.test(
9166
+ toolName
9167
+ );
9168
+ if (!looksLikeImageGen) return void 0;
9169
+ if (!isRecord2(input)) return void 0;
9170
+ const prompt = getFirstString(input, ["prompt", "description", "query"]);
9171
+ if (!prompt) return void 0;
9172
+ const thumbnailUrl = getFirstString(input, [
9173
+ "thumbnailUrl",
9174
+ "thumbnail",
9175
+ "url",
9176
+ "imageUrl",
9177
+ "preview"
9178
+ ]);
9179
+ const model = getFirstString(input, ["model", "modelId", "model_name"]);
9180
+ return {
9181
+ kind: "image_generation",
9182
+ prompt,
9183
+ ...thumbnailUrl ? { thumbnailUrl } : {},
9184
+ ...model ? { model } : {}
9185
+ };
9186
+ }
9187
+ __name(detectImageGeneration, "detectImageGeneration");
9188
+ function detectCodeBlock(input, opts) {
9189
+ if (!isRecord2(input)) return void 0;
9190
+ const code = getFirstString(input, ["code", "snippet", "source"]);
9191
+ if (!code) return void 0;
9192
+ const language = getFirstString(input, [
9193
+ "language",
9194
+ "lang",
9195
+ "codeLanguage",
9196
+ "syntax"
9197
+ ]);
9198
+ const toolName = opts.toolName ?? "";
9199
+ const codeTool = /(repl|format|prettier|eslint|tsc|compile|exec[_-]?code)/i.test(toolName);
9200
+ if (!language && !codeTool) return void 0;
9201
+ const origin = getFirstString(input, ["origin", "source_location", "path"]);
9202
+ return {
9203
+ kind: "code_block",
9204
+ code,
9205
+ ...language ? { language } : {},
9206
+ ...origin ? { origin } : {}
9207
+ };
9208
+ }
9209
+ __name(detectCodeBlock, "detectCodeBlock");
9210
+ function detectTabular(input) {
9211
+ if (!isRecord2(input)) return void 0;
9212
+ const explicitColumns = input["columns"];
9213
+ const explicitRows = input["rows"];
9214
+ if (Array.isArray(explicitColumns) && Array.isArray(explicitRows)) {
9215
+ const columns = explicitColumns.filter((c) => typeof c === "string").slice(0, 30);
9216
+ if (columns.length === 0) return void 0;
9217
+ const rows = explicitRows.slice(0, MAX_TABULAR_ROWS).map(
9218
+ (row) => Array.isArray(row) ? row.map(
9219
+ (cell) => typeof cell === "string" ? cell : stringifyJson(cell).slice(0, 80)
9220
+ ) : []
9221
+ );
9222
+ return {
9223
+ kind: "tabular",
9224
+ columns,
9225
+ rows,
9226
+ ...explicitRows.length > rows.length ? { totalRows: explicitRows.length } : {}
9227
+ };
9228
+ }
9229
+ const data = input["data"] ?? input["records"];
9230
+ if (Array.isArray(data) && data.length > 0 && isRecord2(data[0])) {
9231
+ const columns = Object.keys(data[0]).slice(
9232
+ 0,
9233
+ 30
9234
+ );
9235
+ if (columns.length === 0) return void 0;
9236
+ const rows = data.slice(0, MAX_TABULAR_ROWS).map((row) => {
9237
+ const r = row;
9238
+ return columns.map((col) => {
9239
+ const v = r[col];
9240
+ return typeof v === "string" ? v : stringifyJson(v).slice(0, 80);
9241
+ });
9242
+ });
9243
+ return {
9244
+ kind: "tabular",
9245
+ columns,
9246
+ rows,
9247
+ ...data.length > rows.length ? { totalRows: data.length } : {}
9248
+ };
9249
+ }
9250
+ return void 0;
9251
+ }
9252
+ __name(detectTabular, "detectTabular");
9253
+
9254
+ // packages/sdk-typescript/src/daemon/ui/normalizer.ts
9255
+ var DAEMON_ERROR_KIND_SET = new Set(DAEMON_ERROR_KINDS);
9256
+ var DEVICE_FLOW_PROVIDER_SET = /* @__PURE__ */ new Set(["qwen", "qwen-oauth"]);
9257
+ var MCP_RESTART_REFUSED_REASONS2 = /* @__PURE__ */ new Set([
9258
+ "in_flight",
9259
+ "disabled",
9260
+ "budget_would_exceed",
9261
+ "authentication_required"
9262
+ ]);
9263
+ var MALFORMED_MEMORY_CHANGED = "malformed memory_changed payload";
9264
+ var SESSION_RECORDING_DEGRADED_MESSAGE = "Session recording stopped after a write failure. New messages for the affected session will not be saved. Check disk space and permissions, then start a new session to resume recording.";
9265
+ var ATTACHMENT_UNAVAILABLE_TEXT = "[Attachment is no longer available]";
9266
+ function normalizeDaemonEvent(event, opts = {}) {
9267
+ const base = createBase(event, opts);
9268
+ switch (event.type) {
9269
+ case "session_update":
9270
+ return normalizeSessionUpdate(event, base, opts);
9271
+ case "shell_output": {
9272
+ const text = getOutputText(event.data);
9273
+ const stream = getShellStream(event.data);
9274
+ const source = getSource(event.data);
9062
9275
  return text ? [
9063
9276
  {
9064
9277
  ...base,
9065
- type: "user.text.delta",
9278
+ type: source === "user-shell" ? "user.shell.output" : "shell.output",
9066
9279
  text,
9067
- ...meta ? { meta } : {}
9280
+ ...stream ? { stream } : {}
9068
9281
  }
9069
9282
  ] : [];
9070
9283
  }
9071
- case "agent_message_chunk": {
9072
- const text = getTextContent(update["content"]);
9073
- const parentToolCallId = extractParentToolCallId(update);
9074
- const meta = extractUpdateMeta(update);
9075
- const events = [];
9076
- if (text) {
9077
- events.push({
9284
+ case "permission_request":
9285
+ return normalizePermissionRequest(event, base);
9286
+ case "permission_resolved":
9287
+ case "permission_already_resolved":
9288
+ return normalizePermissionResolved(event, base);
9289
+ case "model_switched":
9290
+ return [
9291
+ {
9078
9292
  ...base,
9079
- type: "assistant.text.delta",
9080
- text,
9081
- ...parentToolCallId ? { parentToolCallId } : {},
9082
- ...meta ? { meta } : {}
9083
- });
9084
- }
9085
- const usage = extractAssistantUsage(update);
9086
- if (usage) {
9087
- events.push({
9293
+ type: "model.changed",
9294
+ modelId: getString2(event.data, "modelId") ?? "unknown"
9295
+ }
9296
+ ];
9297
+ case "model_switch_failed":
9298
+ return [
9299
+ {
9088
9300
  ...base,
9089
- type: "assistant.usage",
9090
- usage,
9091
- ...parentToolCallId ? { parentToolCallId } : {}
9092
- });
9093
- }
9094
- return events;
9301
+ type: "error",
9302
+ recoverable: true,
9303
+ text: getString2(event.data, "error") ?? "Model switch failed (no details available)"
9304
+ }
9305
+ ];
9306
+ case "session_died": {
9307
+ const errorKind = asDaemonErrorKind(getString2(event.data, "errorKind"));
9308
+ return [
9309
+ {
9310
+ ...base,
9311
+ type: "error",
9312
+ recoverable: false,
9313
+ ...errorKind ? { errorKind } : {},
9314
+ text: getString2(event.data, "reason") ?? "Session died (no details available)"
9315
+ }
9316
+ ];
9095
9317
  }
9096
- case "agent_thought_chunk": {
9097
- const text = getTextContent(update["content"]);
9098
- if (!text) return [];
9099
- const parentToolCallId = extractParentToolCallId(update);
9100
- const meta = extractUpdateMeta(update);
9318
+ case "session_closed":
9101
9319
  return [
9102
9320
  {
9103
9321
  ...base,
9104
- type: "thought.text.delta",
9105
- text,
9106
- ...parentToolCallId ? { parentToolCallId } : {},
9107
- ...meta ? { meta } : {}
9322
+ type: "status",
9323
+ text: `Session closed: ${getString2(event.data, "reason") ?? "closed"}`
9324
+ }
9325
+ ];
9326
+ case "session_recording_degraded": {
9327
+ const sessionId = getString2(event.data, "sessionId");
9328
+ if (!sessionId || getString2(event.data, "reason") !== "write_failed") {
9329
+ return fallbackDebug(event, base, "malformed recording state");
9330
+ }
9331
+ return [
9332
+ {
9333
+ ...base,
9334
+ type: "error",
9335
+ recoverable: true,
9336
+ code: "session_recording_degraded",
9337
+ text: SESSION_RECORDING_DEGRADED_MESSAGE
9108
9338
  }
9109
9339
  ];
9110
9340
  }
9111
- case "tool_call":
9112
- case "tool_call_update": {
9113
- const meta = isRecord2(update["_meta"]) ? update["_meta"] : void 0;
9114
- if (getString2(update, "status") === "in_progress" && getString2(update, "kind") === void 0 && meta?.["shellProgress"] !== void 0) {
9115
- return [];
9341
+ case "session_snapshot": {
9342
+ if (!isRecord2(event.data) || !getString2(event.data, "sessionId")) {
9343
+ return fallbackDebug(event, base, "malformed recording snapshot");
9116
9344
  }
9117
- return [normalizeToolUpdate(update, base)];
9345
+ const recordingDegraded = event.data["recordingDegraded"];
9346
+ if (recordingDegraded !== void 0 && typeof recordingDegraded !== "boolean") {
9347
+ return fallbackDebug(event, base, "malformed recording snapshot");
9348
+ }
9349
+ if (recordingDegraded === true) {
9350
+ return [
9351
+ {
9352
+ ...base,
9353
+ type: "error",
9354
+ recoverable: true,
9355
+ code: "session_recording_degraded",
9356
+ text: SESSION_RECORDING_DEGRADED_MESSAGE
9357
+ }
9358
+ ];
9359
+ }
9360
+ return [];
9118
9361
  }
9119
- case "shell_output":
9120
- case "tool_output": {
9121
- const text = getOutputText(update);
9122
- const stream = getShellStream(update) ?? getShellStream(event.data);
9123
- const source = getSource(update) ?? getSource(event.data);
9124
- return text ? [
9362
+ case "client_evicted":
9363
+ return [
9125
9364
  {
9126
9365
  ...base,
9127
- type: source === "user-shell" ? "user.shell.output" : "shell.output",
9128
- text,
9129
- ...stream ? { stream } : {}
9366
+ type: "error",
9367
+ recoverable: true,
9368
+ text: getString2(event.data, "reason") ?? "SSE client evicted (no details available)"
9130
9369
  }
9131
- ] : [];
9370
+ ];
9371
+ case "slow_client_warning":
9372
+ return [
9373
+ {
9374
+ ...base,
9375
+ type: "status",
9376
+ text: "SSE stream is lagging"
9377
+ }
9378
+ ];
9379
+ case "stream_error": {
9380
+ const errorKind = asDaemonErrorKind(getString2(event.data, "errorKind"));
9381
+ return [
9382
+ {
9383
+ ...base,
9384
+ type: "error",
9385
+ recoverable: true,
9386
+ ...errorKind ? { errorKind } : {},
9387
+ text: getString2(event.data, "error") ?? "SSE stream error (no details available)"
9388
+ }
9389
+ ];
9132
9390
  }
9133
- case "available_commands_update": {
9134
- const rawCommands = Array.isArray(update["availableCommands"]) ? update["availableCommands"] : [];
9135
- const commands = rawCommands.filter(isRecord2);
9391
+ case "turn_error": {
9392
+ const code = getString2(event.data, "code");
9393
+ const errorKind = asDaemonErrorKind(getString2(event.data, "errorKind"));
9394
+ const promptId = getString2(event.data, "promptId");
9136
9395
  return [
9137
9396
  {
9138
9397
  ...base,
9139
- type: "session.available_commands",
9140
- count: commands.length,
9141
- commands
9398
+ type: "error",
9399
+ source: "turn_error",
9400
+ recoverable: true,
9401
+ ...code ? { code } : {},
9402
+ ...errorKind ? { errorKind } : {},
9403
+ ...promptId ? { promptId } : {},
9404
+ text: getString2(event.data, "message") ?? "Prompt failed (no details available)"
9142
9405
  }
9143
9406
  ];
9144
9407
  }
9145
- case "plan":
9146
- return [normalizePlanUpdate(update, base)];
9147
- case "current_mode_update":
9148
- case "usage_update":
9408
+ case "state_resync_required":
9409
+ return normalizeStateResyncRequired(event, base);
9410
+ case "history_truncated":
9411
+ return normalizeHistoryTruncated(event, base);
9412
+ case "session_rewound":
9413
+ return normalizeSessionRewound(event, base);
9414
+ case "session_branched":
9415
+ return normalizeSessionBranched(event, base);
9416
+ case "prompt_cancelled": {
9417
+ const reason = stringField(event.data, "reason");
9418
+ return [
9419
+ { ...base, type: "prompt.cancelled", ...reason ? { reason } : {} }
9420
+ ];
9421
+ }
9422
+ case "followup_suggestion":
9423
+ return normalizeFollowupSuggestion(event, base);
9424
+ case "mid_turn_message_injected":
9425
+ return normalizeMidTurnMessageInjected(event, base);
9426
+ case "pending_prompt_added":
9427
+ case "pending_prompt_started":
9428
+ case "pending_prompt_completed":
9149
9429
  return [];
9150
- default:
9430
+ case "user_shell_command": {
9431
+ const command = getString2(event.data, "command");
9432
+ const cwd = getString2(event.data, "cwd");
9433
+ return command ? [
9434
+ {
9435
+ ...base,
9436
+ type: "user.shell.command",
9437
+ command,
9438
+ ...cwd ? { cwd } : {}
9439
+ },
9440
+ { ...base, type: "user.text.delta", text: `$ ${command}` }
9441
+ ] : [];
9442
+ }
9443
+ case "user_shell_result": {
9444
+ const exitCode = numberField(event.data, "exitCode");
9445
+ const aborted = isRecord2(event.data) && event.data["aborted"] === true;
9446
+ const text = aborted ? "Shell command was aborted" : `Shell command exited with code ${exitCode ?? "unknown"}`;
9447
+ return [{ ...base, type: "status", text }];
9448
+ }
9449
+ case "replay_complete": {
9450
+ const replayedCount = numberField(event.data, "replayedCount") ?? 0;
9451
+ const lastReplayedEventId = numberField(event.data, "lastReplayedEventId") ?? numberField(event.data, "lastEventId");
9151
9452
  return [
9152
9453
  {
9153
9454
  ...base,
9154
- type: "debug",
9155
- // `getSessionUpdatePayload` accepts any record, so `kind` is
9156
- // `undefined` for a payload whose discriminator is missing, empty or
9157
- // not a string. That is a broken frame, not a kind from a newer
9158
- // daemon — classifying it as unrecognized would hide the only
9159
- // diagnostic a malformed `session_update` produces. A whitespace-only
9160
- // discriminator is truthy but no more usable than an empty one, so
9161
- // apply the same `trim()` convention `getFirstString` uses.
9162
- debugReason: kind?.trim() ? "unrecognized_session_update" : "malformed_payload",
9163
- text: debugBlockText(kind ?? "session_update", update)
9455
+ type: "session.replay_complete",
9456
+ replayedCount,
9457
+ ...lastReplayedEventId !== void 0 ? { lastReplayedEventId } : {}
9164
9458
  }
9165
9459
  ];
9460
+ }
9461
+ // ── Session-meta events ──────────────────────────────────────────────
9462
+ case "session_metadata_updated":
9463
+ return normalizeSessionMetadataUpdated(event, base);
9464
+ case "approval_mode_changed":
9465
+ return normalizeApprovalModeChanged(event, base);
9466
+ // ── Workspace events ──────────────────────────────────────
9467
+ case "git_branch_changed":
9468
+ return [];
9469
+ case "git_status_changed":
9470
+ return [];
9471
+ case "memory_changed":
9472
+ return normalizeMemoryChanged(event, base);
9473
+ case "agent_changed":
9474
+ return normalizeAgentChanged(event, base);
9475
+ case "tool_toggled":
9476
+ return normalizeToolToggled(event, base);
9477
+ case "settings_changed":
9478
+ return normalizeSettingsChanged(event, base);
9479
+ case "settings_reloaded":
9480
+ return normalizeSettingsReloaded(event, base);
9481
+ case "trust_change_requested":
9482
+ return normalizeTrustChangeRequested(event, base);
9483
+ case "workspace_initialized":
9484
+ return normalizeWorkspaceInitialized(event, base);
9485
+ case "github_setup_completed":
9486
+ return normalizeGithubSetupCompleted(event, base);
9487
+ case "mcp_budget_warning":
9488
+ return normalizeMcpBudgetWarning(event, base);
9489
+ case "mcp_child_refused_batch":
9490
+ return normalizeMcpChildRefused(event, base);
9491
+ case "mcp_server_restarted":
9492
+ return normalizeMcpServerRestarted(event, base);
9493
+ case "mcp_server_restart_refused":
9494
+ return normalizeMcpServerRestartRefused(event, base);
9495
+ case "mcp_server_added":
9496
+ return normalizeMcpServerChanged(event, base, "added");
9497
+ case "mcp_server_removed":
9498
+ return normalizeMcpServerChanged(event, base, "removed");
9499
+ case "mcp_server_changed":
9500
+ return normalizeMcpServerChanged(event, base);
9501
+ case "extensions_changed":
9502
+ return normalizeExtensionsChanged(event, base);
9503
+ case "artifact_changed":
9504
+ return normalizeArtifactChanged(event, base);
9505
+ // ── Auth device-flow events (RFC 8628) ─────────────────
9506
+ case "auth_device_flow_started":
9507
+ return normalizeAuthDeviceFlowStarted(event, base);
9508
+ case "auth_device_flow_throttled":
9509
+ return normalizeAuthDeviceFlowThrottled(event, base);
9510
+ case "auth_device_flow_authorized":
9511
+ return normalizeAuthDeviceFlowAuthorized(event, base);
9512
+ case "auth_device_flow_failed":
9513
+ return normalizeAuthDeviceFlowFailed(event, base);
9514
+ case "auth_device_flow_cancelled":
9515
+ return normalizeAuthDeviceFlowCancelled(event, base);
9516
+ default:
9517
+ return normalizeUnrecognizedEvent(event, base);
9166
9518
  }
9167
9519
  }
9168
- __name(normalizeSessionUpdate, "normalizeSessionUpdate");
9169
- function extractParentToolCallId(update) {
9170
- const meta = isRecord2(update["_meta"]) ? update["_meta"] : void 0;
9171
- return meta ? getString2(meta, "parentToolCallId") : void 0;
9172
- }
9173
- __name(extractParentToolCallId, "extractParentToolCallId");
9174
- function extractUpdateMeta(update) {
9175
- const meta = isRecord2(update["_meta"]) ? update["_meta"] : void 0;
9176
- if (!meta) return void 0;
9177
- const { qwenTranscript: _qwenTranscript, ...displayMeta } = meta;
9178
- return Object.keys(displayMeta).length > 0 ? displayMeta : void 0;
9179
- }
9180
- __name(extractUpdateMeta, "extractUpdateMeta");
9181
- function extractSourceRecordIds(event) {
9182
- if (!isRecord2(event.data)) return void 0;
9183
- const update = getSessionUpdatePayload(event.data);
9184
- const meta = update && isRecord2(update["_meta"]) ? update["_meta"] : void 0;
9185
- const transcript = meta && isRecord2(meta["qwenTranscript"]) ? meta["qwenTranscript"] : void 0;
9186
- const values = transcript?.["sourceRecordIds"];
9187
- if (!Array.isArray(values)) return void 0;
9188
- const ids = [
9189
- ...new Set(
9190
- values.filter((value) => typeof value === "string")
9191
- )
9192
- ];
9193
- return ids.length > 0 ? ids : void 0;
9194
- }
9195
- __name(extractSourceRecordIds, "extractSourceRecordIds");
9196
- function extractAssistantUsage(update) {
9197
- const meta = isRecord2(update["_meta"]) ? update["_meta"] : void 0;
9198
- const usage = meta && isRecord2(meta["usage"]) ? meta["usage"] : void 0;
9199
- if (!usage) return void 0;
9200
- const inputTokens = numberField(usage, "inputTokens");
9201
- const outputTokens = numberField(usage, "outputTokens");
9202
- if (inputTokens === void 0 && outputTokens === void 0) return void 0;
9203
- const cachedTokens = numberField(usage, "cachedReadTokens");
9204
- return {
9205
- inputTokens: inputTokens ?? 0,
9206
- outputTokens: outputTokens ?? 0,
9207
- ...cachedTokens !== void 0 ? { cachedTokens } : {}
9208
- };
9209
- }
9210
- __name(extractAssistantUsage, "extractAssistantUsage");
9211
- function normalizeToolUpdate(update, base) {
9212
- const metadata = isRecord2(update["_meta"]) ? update["_meta"] : void 0;
9213
- const toolName = getString2(update, "toolName") ?? getString2(update, "name") ?? (metadata ? getString2(metadata, "toolName") : void 0) ?? (metadata ? getString2(metadata, "name") : void 0);
9214
- const toolKind = getString2(update, "kind");
9215
- const explicitTitle = getString2(update, "title");
9216
- const title = explicitTitle ?? (getString2(update, "sessionUpdate") === "tool_call" ? toolName ?? toolKind : void 0);
9217
- const rawInputSource = update["rawInput"] ?? update["input"] ?? update["args"];
9218
- const rawOutputSource = update["rawOutput"] ?? update["output"] ?? update["result"];
9219
- const rawInput = rawInputSource !== void 0 ? redactSensitiveFields(rawInputSource) : void 0;
9220
- const rawOutput = rawOutputSource !== void 0 ? redactSensitiveFields(rawOutputSource) : void 0;
9221
- const content = update["content"] !== void 0 ? redactSensitiveFields(update["content"]) : void 0;
9222
- const locations = update["locations"] !== void 0 ? redactSensitiveFields(update["locations"]) : void 0;
9223
- const toolCallId = getString2(update, "toolCallId");
9224
- const status = getString2(update, "status");
9225
- if (!toolCallId) {
9226
- return {
9520
+ __name(normalizeDaemonEvent, "normalizeDaemonEvent");
9521
+ function normalizeUnrecognizedEvent(event, base) {
9522
+ return [
9523
+ {
9227
9524
  ...base,
9228
- type: "error",
9229
- code: "daemon.protocol.tool_update_missing_tool_call_id",
9230
- recoverable: true,
9231
- text: `Tool update missing toolCallId${title ? ` (${title})` : ""}`
9232
- };
9233
- }
9234
- const { provenance, serverId } = extractToolProvenance(update, toolName);
9235
- const rawParentToolCallId = getString2(update, "parentToolCallId") ?? (metadata ? getString2(metadata, "parentToolCallId") : void 0);
9236
- const parentToolCallId = rawParentToolCallId && rawParentToolCallId !== toolCallId ? rawParentToolCallId : void 0;
9237
- const subagentType = getString2(update, "subagentType") ?? (metadata ? getString2(metadata, "subagentType") : void 0);
9238
- return {
9239
- ...base,
9240
- type: "tool.update",
9241
- toolCallId,
9242
- ...status ? { status } : {},
9243
- ...title ? { title } : {},
9244
- ...toolName ? { toolName } : {},
9245
- ...toolKind ? { toolKind } : {},
9246
- ...content !== void 0 ? { content } : {},
9247
- ...locations !== void 0 ? { locations } : {},
9248
- ...provenance ? { provenance } : {},
9249
- ...serverId ? { serverId } : {},
9250
- ...parentToolCallId ? { parentToolCallId } : {},
9251
- ...subagentType ? { subagentType } : {},
9252
- ...rawInput !== void 0 ? { rawInput } : {},
9253
- ...rawOutput !== void 0 ? { rawOutput } : {},
9254
- ...rawInput !== void 0 ? { details: capDetails(stringifyRedactedJson(rawInput)) } : rawOutput !== void 0 ? { details: capDetails(stringifyRedactedJson(rawOutput)) } : {}
9255
- };
9256
- }
9257
- __name(normalizeToolUpdate, "normalizeToolUpdate");
9258
- function normalizePlanUpdate(update, base) {
9259
- const entries = Array.isArray(update["entries"]) ? update["entries"] : [];
9260
- const contentText = capDetails(formatPlanEntries(entries));
9261
- const meta = isRecord2(update["_meta"]) ? update["_meta"] : void 0;
9262
- const transcript = meta && isRecord2(meta["qwenTranscript"]) ? meta["qwenTranscript"] : void 0;
9263
- const planCallId = getString2(transcript, "planToolCallId") ?? (base.eventId !== void 0 ? `${DAEMON_PLAN_TOOL_CALL_ID}-${base.eventId}` : DAEMON_PLAN_TOOL_CALL_ID);
9264
- const stats = meta && isRecord2(meta["stats"]) ? meta["stats"] : void 0;
9265
- const todoPlan = meta && isRecord2(meta["qwenTodoPlan"]) ? meta["qwenTodoPlan"] : void 0;
9266
- const planId = getString2(todoPlan, "id");
9267
- const sessionWorkflow = meta?.["qwenSessionWorkflow"] === true;
9268
- return {
9269
- ...base,
9270
- type: "tool.update",
9271
- toolCallId: planCallId,
9272
- title: "Updated Plan",
9273
- status: "completed",
9274
- toolName: "todo_write",
9275
- toolKind: "updated_plan",
9276
- content: [
9277
- {
9278
- type: "content",
9279
- content: { type: "text", text: contentText }
9280
- }
9281
- ],
9282
- rawOutput: {
9283
- entries,
9284
- ...stats ? { stats } : {},
9285
- ...planId ? { plan: { id: planId, sourceCallId: planCallId } } : {},
9286
- ...sessionWorkflow ? { sessionWorkflow: true } : {}
9525
+ type: "debug",
9526
+ debugReason: "unrecognized_event",
9527
+ text: debugBlockText(
9528
+ `${event.type} (unrecognized daemon event)`,
9529
+ event.data
9530
+ )
9287
9531
  }
9288
- };
9289
- }
9290
- __name(normalizePlanUpdate, "normalizePlanUpdate");
9291
- function formatPlanEntries(entries) {
9292
- return entries.flatMap((entry) => {
9293
- if (!isRecord2(entry)) return [];
9294
- const content = getString2(entry, "content");
9295
- if (!content) return [];
9296
- const marker = getPlanEntryMarker(getString2(entry, "status"));
9297
- return [`- [${marker}] ${content}`];
9298
- }).join("\n");
9299
- }
9300
- __name(formatPlanEntries, "formatPlanEntries");
9301
- function getPlanEntryMarker(status) {
9302
- switch (status) {
9303
- case "completed":
9304
- return "x";
9305
- case "in_progress":
9306
- return "-";
9307
- default:
9308
- return " ";
9309
- }
9532
+ ];
9310
9533
  }
9311
- __name(getPlanEntryMarker, "getPlanEntryMarker");
9312
- function extractToolProvenance(update, toolName) {
9313
- const explicit = getString2(update, "provenance");
9314
- const explicitServerId = getString2(update, "serverId");
9315
- if (explicit === "builtin" || explicit === "mcp" || explicit === "subagent") {
9316
- return {
9317
- provenance: explicit,
9318
- ...explicit === "mcp" && explicitServerId ? { serverId: explicitServerId } : {}
9319
- };
9534
+ __name(normalizeUnrecognizedEvent, "normalizeUnrecognizedEvent");
9535
+ function normalizeStateResyncRequired(event, base) {
9536
+ const reason = getString2(event.data, "reason");
9537
+ const lastDeliveredId = numberField(event.data, "lastDeliveredId");
9538
+ const earliestAvailableId = numberField(event.data, "earliestAvailableId");
9539
+ if (!reason || lastDeliveredId === void 0 || earliestAvailableId === void 0) {
9540
+ return fallbackDebug(
9541
+ event,
9542
+ base,
9543
+ "malformed state_resync_required payload"
9544
+ );
9320
9545
  }
9321
- if (toolName && toolName.startsWith("mcp__")) {
9322
- const rest = toolName.slice("mcp__".length);
9323
- const sep = rest.indexOf("__");
9324
- if (sep > 0) {
9325
- return { provenance: "mcp", serverId: rest.slice(0, sep) };
9546
+ return [
9547
+ {
9548
+ ...base,
9549
+ type: "session.state_resync_required",
9550
+ reason,
9551
+ lastDeliveredId,
9552
+ earliestAvailableId
9326
9553
  }
9327
- }
9328
- return {};
9329
- }
9330
- __name(extractToolProvenance, "extractToolProvenance");
9331
- function asDaemonErrorKind(value) {
9332
- if (!value) return void 0;
9333
- return DAEMON_ERROR_KIND_SET.has(value) ? value : void 0;
9334
- }
9335
- __name(asDaemonErrorKind, "asDaemonErrorKind");
9336
- function debugBlockText(prefix, data) {
9337
- return capDetails(`${prefix}: ${stringifyRedactedJson(data)}`);
9554
+ ];
9338
9555
  }
9339
- __name(debugBlockText, "debugBlockText");
9340
- function normalizePermissionRequest(event, base) {
9341
- if (!isRecord2(event.data)) {
9342
- return [
9343
- {
9344
- ...base,
9345
- type: "debug",
9346
- debugReason: "malformed_payload",
9347
- text: debugBlockText("permission_request", event.data)
9348
- }
9349
- ];
9556
+ __name(normalizeStateResyncRequired, "normalizeStateResyncRequired");
9557
+ function normalizeHistoryTruncated(event, base) {
9558
+ const reason = getString2(event.data, "reason");
9559
+ const truncatedEvents = numberField(event.data, "truncatedEvents");
9560
+ const retainedEvents = numberField(event.data, "retainedEvents");
9561
+ const maxBytes = numberField(event.data, "maxBytes");
9562
+ const maxEvents = numberField(event.data, "maxEvents");
9563
+ if (reason !== "replay_window_exceeded" || truncatedEvents === void 0 || retainedEvents === void 0 || maxBytes === void 0 || !isRecord2(event.data) || typeof event.data["fullTranscriptAvailable"] !== "boolean") {
9564
+ return fallbackDebug(event, base, "malformed history_truncated payload");
9350
9565
  }
9351
- const requestId = getString2(event.data, "requestId");
9352
- if (!requestId) {
9353
- return [
9354
- {
9355
- ...base,
9356
- type: "debug",
9357
- debugReason: "malformed_payload",
9358
- text: debugBlockText("permission_request", event.data)
9359
- }
9360
- ];
9566
+ const scope = getString2(event.data, "scope");
9567
+ if (event.data["scope"] !== void 0 && !scope || event.data["maxEvents"] !== void 0 && (maxEvents === void 0 || !Number.isInteger(maxEvents) || maxEvents < 0)) {
9568
+ return fallbackDebug(event, base, "malformed history_truncated payload");
9361
9569
  }
9362
- const toolCall = event.data["toolCall"] !== void 0 ? redactSensitiveFields(event.data["toolCall"]) : void 0;
9570
+ const fullTranscriptAvailable = event.data["fullTranscriptAvailable"];
9571
+ const limits = [
9572
+ maxEvents === void 0 ? void 0 : `${maxEvents} ${scope === "live_journal" ? "replay entries" : "events"}`,
9573
+ `${maxBytes} bytes`
9574
+ ].filter((limit) => limit !== void 0).join(" / ");
9575
+ const text = scope === "live_journal" ? `History truncated for live turn replay: kept the latest ${retainedEvents} source events and dropped ${truncatedEvents} older source events (limits: ${limits}). ${fullTranscriptAvailable ? "Complete content remains available after the turn finishes." : "Complete content is not available for automatic recovery."}` : scope === void 0 ? `History truncated in replay history: kept the latest ${retainedEvents} events and dropped ${truncatedEvents} older replay events (limits: ${limits}). ${fullTranscriptAvailable ? "Older content remains available from the full transcript." : "Older content is not available from a full transcript."}` : `History truncated: kept the latest ${retainedEvents} events and dropped ${truncatedEvents} older replay events (limits: ${limits}). ${fullTranscriptAvailable ? "Full transcript content remains available." : "Full transcript content is not available."}`;
9363
9576
  return [
9364
9577
  {
9365
9578
  ...base,
9366
- type: "permission.request",
9367
- requestId,
9368
- sessionId: getString2(event.data, "sessionId"),
9369
- title: describeToolCall(toolCall),
9370
- options: normalizePermissionOptions(event.data["options"]),
9371
- toolCall
9579
+ type: "status",
9580
+ text,
9581
+ source: "history_truncated",
9582
+ data: event.data
9372
9583
  }
9373
9584
  ];
9374
9585
  }
9375
- __name(normalizePermissionRequest, "normalizePermissionRequest");
9376
- function normalizePermissionResolved(event, base) {
9377
- const requestId = getString2(event.data, "requestId");
9378
- if (!requestId) {
9379
- return [
9380
- {
9381
- ...base,
9382
- type: "debug",
9383
- debugReason: "malformed_payload",
9384
- text: debugBlockText(event.type, event.data)
9385
- }
9386
- ];
9586
+ __name(normalizeHistoryTruncated, "normalizeHistoryTruncated");
9587
+ function normalizeSessionRewound(event, base) {
9588
+ const promptId = getString2(event.data, "promptId");
9589
+ const targetTurnIndex = numberField(event.data, "targetTurnIndex");
9590
+ if (!promptId || targetTurnIndex === void 0) {
9591
+ return fallbackDebug(event, base, "malformed session_rewound payload");
9387
9592
  }
9388
- const voterClientId = getString2(event.data, "voterClientId") ?? base.originatorClientId;
9593
+ const sessionId = getString2(event.data, "sessionId");
9389
9594
  return [
9390
9595
  {
9391
9596
  ...base,
9392
- type: "permission.resolved",
9393
- requestId,
9394
- outcome: describePermissionOutcome(event.data),
9395
- ...voterClientId ? { voterClientId } : {}
9597
+ type: "session.rewound",
9598
+ promptId,
9599
+ targetTurnIndex,
9600
+ ...sessionId ? { sessionId } : {}
9396
9601
  }
9397
9602
  ];
9398
9603
  }
9399
- __name(normalizePermissionResolved, "normalizePermissionResolved");
9400
- function getSessionUpdatePayload(value) {
9401
- if (!isRecord2(value)) return void 0;
9402
- const update = value["update"];
9403
- return isRecord2(update) ? update : value;
9404
- }
9405
- __name(getSessionUpdatePayload, "getSessionUpdatePayload");
9406
- function normalizePermissionOptions(value) {
9407
- if (!Array.isArray(value)) return [];
9408
- return value.flatMap((option) => {
9409
- if (!isRecord2(option)) return [];
9410
- const optionId = getString2(option, "optionId");
9411
- if (!optionId) return [];
9412
- return [
9413
- {
9414
- optionId,
9415
- label: getString2(option, "label") ?? getString2(option, "title") ?? getString2(option, "name") ?? optionId,
9416
- ...getString2(option, "description") ? { description: getString2(option, "description") } : {},
9417
- raw: option
9418
- }
9419
- ];
9420
- });
9421
- }
9422
- __name(normalizePermissionOptions, "normalizePermissionOptions");
9423
- function describePermissionOutcome(value) {
9424
- if (!isRecord2(value)) return stringifyJson(value);
9425
- const outcome = value["outcome"];
9426
- if (typeof outcome === "string") return outcome;
9427
- if (isRecord2(outcome)) {
9428
- const kind = getString2(outcome, "outcome") ?? "selected";
9429
- const optionId = getString2(outcome, "optionId");
9430
- return optionId ? `${kind}:${optionId}` : kind;
9604
+ __name(normalizeSessionRewound, "normalizeSessionRewound");
9605
+ function normalizeSessionBranched(event, base) {
9606
+ const sourceSessionId = getString2(event.data, "sourceSessionId");
9607
+ const newSessionId = getString2(event.data, "newSessionId");
9608
+ const displayName = getString2(event.data, "displayName");
9609
+ if (!sourceSessionId || !newSessionId || !displayName) {
9610
+ return fallbackDebug(event, base, "malformed session_branched payload");
9431
9611
  }
9432
- return getFirstString(value, ["status", "reason"]) ?? stringifyJson(value);
9433
- }
9434
- __name(describePermissionOutcome, "describePermissionOutcome");
9435
- function describeToolCall(value) {
9436
- if (!isRecord2(value)) return "Tool permission";
9437
- return getString2(value, "title") ?? getString2(value, "name") ?? getString2(value, "kind") ?? getString2(value, "toolName") ?? "Tool permission";
9438
- }
9439
- __name(describeToolCall, "describeToolCall");
9440
- function getShellStream(value) {
9441
- const stream = getString2(value, "stream");
9442
- return stream === "stdout" || stream === "stderr" ? stream : void 0;
9443
- }
9444
- __name(getShellStream, "getShellStream");
9445
- function getSource(value) {
9446
- if (!isRecord2(value)) return void 0;
9447
- const direct = getString2(value, "source");
9448
- if (direct) return direct;
9449
- const meta = value["_meta"];
9450
- return isRecord2(meta) ? getString2(meta, "source") : void 0;
9451
- }
9452
- __name(getSource, "getSource");
9453
- function fallbackDebug(event, base, reason) {
9454
9612
  return [
9455
9613
  {
9456
9614
  ...base,
9457
- type: "debug",
9458
- debugReason: "malformed_payload",
9459
- text: `${event.type}: ${reason}`
9615
+ type: "session.branched",
9616
+ sourceSessionId,
9617
+ newSessionId,
9618
+ displayName
9460
9619
  }
9461
9620
  ];
9462
9621
  }
9463
- __name(fallbackDebug, "fallbackDebug");
9464
- function normalizeSessionMetadataUpdated(event, base) {
9622
+ __name(normalizeSessionBranched, "normalizeSessionBranched");
9623
+ function normalizeFollowupSuggestion(event, base) {
9465
9624
  const sessionId = getString2(event.data, "sessionId");
9466
- if (!sessionId) return fallbackDebug(event, base, "missing sessionId");
9467
- const displayName = getString2(event.data, "displayName");
9625
+ const suggestion = getString2(event.data, "suggestion");
9626
+ const promptId = getString2(event.data, "promptId");
9627
+ if (!sessionId || !suggestion || !promptId) {
9628
+ return fallbackDebug(event, base, "malformed followup_suggestion payload");
9629
+ }
9468
9630
  return [
9469
9631
  {
9470
9632
  ...base,
9471
- type: "session.metadata.changed",
9633
+ type: "followup.suggestion",
9472
9634
  sessionId,
9473
- ...displayName !== void 0 ? { displayName } : {}
9635
+ suggestion,
9636
+ promptId
9474
9637
  }
9475
9638
  ];
9476
9639
  }
9477
- __name(normalizeSessionMetadataUpdated, "normalizeSessionMetadataUpdated");
9478
- function normalizeArtifactChanged(event, base) {
9479
- const sessionId = getString2(event.data, "sessionId");
9480
- const change = isRecord2(event.data) ? event.data["change"] : void 0;
9481
- if (!sessionId || !isRecord2(change)) {
9482
- return fallbackDebug(event, base, "malformed artifact_changed payload");
9640
+ __name(normalizeFollowupSuggestion, "normalizeFollowupSuggestion");
9641
+ function normalizeMidTurnMessageInjected(event, base) {
9642
+ if (!isRecord2(event.data)) {
9643
+ return fallbackDebug(event, base, "malformed mid_turn_message_injected");
9483
9644
  }
9484
- const action = getString2(change, "action");
9485
- const artifactId = getString2(change, "artifactId");
9486
- if (!action || !artifactId) {
9487
- return fallbackDebug(event, base, "missing action or artifactId");
9645
+ const data = event.data;
9646
+ const rawMessages = data["messages"];
9647
+ const messages = Array.isArray(rawMessages) && rawMessages.every(
9648
+ (message) => typeof message === "string"
9649
+ ) ? rawMessages : [];
9650
+ const items = data["items"];
9651
+ const hasRenderableItemContent = Array.isArray(items) && items.some(
9652
+ (item) => isRecord2(item) && Array.isArray(item["content"]) && item["content"].some(
9653
+ (block) => isRecord2(block) && (block["type"] === "image" || block["type"] === "resource" || block["type"] === "text" && typeof block["text"] === "string" && block["text"].length > 0)
9654
+ )
9655
+ );
9656
+ if (messages.length === 0 || !messages.some(Boolean) && !hasRenderableItemContent) {
9657
+ return fallbackDebug(event, base, "malformed mid_turn_message_injected");
9658
+ }
9659
+ const messageIds = Array.isArray(data["messageIds"]) ? data["messageIds"] : [];
9660
+ return messages.map((text, index) => {
9661
+ const item = Array.isArray(items) ? items[index] : void 0;
9662
+ const messageId = messageIds[index];
9663
+ return {
9664
+ ...base,
9665
+ type: "status",
9666
+ text,
9667
+ source: "mid_turn_message_injected",
9668
+ data: {
9669
+ ...data,
9670
+ messages: [text],
9671
+ ...Array.isArray(items) ? { items: item !== void 0 ? [item] : [] } : {},
9672
+ ...typeof messageId === "string" ? { messageIds: [messageId] } : Array.isArray(data["messageIds"]) ? { messageIds: [] } : {}
9673
+ }
9674
+ };
9675
+ });
9676
+ }
9677
+ __name(normalizeMidTurnMessageInjected, "normalizeMidTurnMessageInjected");
9678
+ function createBase(event, opts) {
9679
+ const serverTimestamp = extractServerTimestamp(event);
9680
+ const sourceRecordIds = extractSourceRecordIds(event);
9681
+ const segmentId = extractTranscriptSegmentId(event);
9682
+ const branchRecordId = extractBranchRecordId(event);
9683
+ return {
9684
+ ...event.id !== void 0 ? { eventId: event.id } : {},
9685
+ ...serverTimestamp !== void 0 ? { serverTimestamp } : {},
9686
+ ...sourceRecordIds ? { sourceRecordIds } : {},
9687
+ ...segmentId ? { segmentId } : {},
9688
+ ...event.promptId ? { promptId: event.promptId } : {},
9689
+ ...branchRecordId ? { branchRecordId } : {},
9690
+ ...event.originatorClientId ? { originatorClientId: event.originatorClientId } : {},
9691
+ ...opts.includeRawEvent ? { rawEvent: { ...event, data: redactSensitiveFields(event.data) } } : {}
9692
+ };
9693
+ }
9694
+ __name(createBase, "createBase");
9695
+ function extractTranscriptSegmentId(event) {
9696
+ if (!isRecord2(event.data)) return void 0;
9697
+ const update = getSessionUpdatePayload(event.data);
9698
+ const meta = update && isRecord2(update["_meta"]) ? update["_meta"] : void 0;
9699
+ const transcript = meta && isRecord2(meta["qwenTranscript"]) ? meta["qwenTranscript"] : void 0;
9700
+ const segmentId = getString2(transcript, "segmentId");
9701
+ return segmentId && segmentId.length <= 512 ? segmentId : void 0;
9702
+ }
9703
+ __name(extractTranscriptSegmentId, "extractTranscriptSegmentId");
9704
+ function extractBranchRecordId(event) {
9705
+ if (!isRecord2(event.data)) return void 0;
9706
+ const update = getSessionUpdatePayload(event.data);
9707
+ const meta = update && isRecord2(update["_meta"]) ? update["_meta"] : void 0;
9708
+ const transcript = meta && isRecord2(meta["qwenTranscript"]) ? meta["qwenTranscript"] : void 0;
9709
+ return transcript ? getString2(transcript, "branchRecordId") : void 0;
9710
+ }
9711
+ __name(extractBranchRecordId, "extractBranchRecordId");
9712
+ function extractServerTimestamp(event) {
9713
+ const direct = event.serverTimestamp;
9714
+ if (typeof direct === "number" && Number.isFinite(direct)) return direct;
9715
+ const envelopeMeta = event._meta;
9716
+ if (isRecord2(envelopeMeta)) {
9717
+ const ts = envelopeMeta["serverTimestamp"];
9718
+ if (typeof ts === "number" && Number.isFinite(ts)) return ts;
9488
9719
  }
9489
- return [
9490
- {
9491
- ...base,
9492
- type: "session.artifact.changed",
9493
- sessionId,
9494
- change
9720
+ if (isRecord2(event.data)) {
9721
+ const dataMeta = event.data["_meta"];
9722
+ const update = event.data["update"];
9723
+ const updateMeta = isRecord2(update) ? update["_meta"] : void 0;
9724
+ if (isRecord2(dataMeta)) {
9725
+ const ts = dataMeta["serverTimestamp"];
9726
+ if (typeof ts === "number" && Number.isFinite(ts)) return ts;
9495
9727
  }
9496
- ];
9728
+ if (isRecord2(updateMeta)) {
9729
+ const serverTs = updateMeta["serverTimestamp"];
9730
+ if (typeof serverTs === "number" && Number.isFinite(serverTs)) {
9731
+ return serverTs;
9732
+ }
9733
+ }
9734
+ const timestampCandidates = [
9735
+ isRecord2(updateMeta) ? updateMeta["timestamp"] : void 0,
9736
+ isRecord2(update) ? update["timestamp"] : void 0,
9737
+ isRecord2(dataMeta) ? dataMeta["timestamp"] : void 0,
9738
+ event.data["timestamp"]
9739
+ ];
9740
+ for (const candidate of timestampCandidates) {
9741
+ const timestamp = parseTimestamp(candidate);
9742
+ if (timestamp !== void 0) return timestamp;
9743
+ }
9744
+ }
9745
+ return void 0;
9497
9746
  }
9498
- __name(normalizeArtifactChanged, "normalizeArtifactChanged");
9499
- function normalizeApprovalModeChanged(event, base) {
9500
- const sessionId = getString2(event.data, "sessionId");
9501
- const previous = getString2(event.data, "previous");
9502
- const next = getString2(event.data, "next");
9503
- if (!sessionId || !previous || !next) {
9504
- return fallbackDebug(event, base, "missing sessionId / previous / next");
9747
+ __name(extractServerTimestamp, "extractServerTimestamp");
9748
+ function parseTimestamp(value) {
9749
+ if (typeof value === "number" && Number.isFinite(value)) return value;
9750
+ if (typeof value !== "string") return void 0;
9751
+ if (/^\d+$/.test(value)) {
9752
+ const numeric = Number(value);
9753
+ return Number.isFinite(numeric) ? numeric : void 0;
9505
9754
  }
9506
- const persisted = isRecord2(event.data) && typeof event.data["persisted"] === "boolean" ? event.data["persisted"] : false;
9507
- return [
9508
- {
9509
- ...base,
9510
- type: "session.approval_mode.changed",
9511
- sessionId,
9512
- previous,
9513
- next,
9514
- persisted
9515
- }
9516
- ];
9755
+ const parsed = Date.parse(value);
9756
+ return Number.isFinite(parsed) ? parsed : void 0;
9517
9757
  }
9518
- __name(normalizeApprovalModeChanged, "normalizeApprovalModeChanged");
9519
- function normalizeMemoryChanged(event, base) {
9520
- const scope = getString2(event.data, "scope");
9521
- if (scope === "managed") {
9522
- const source = getString2(event.data, "source");
9523
- const taskId = getString2(event.data, "taskId");
9524
- const touchedScopes = event.data?.["touchedScopes"];
9525
- if (!(source && taskId && Array.isArray(touchedScopes)) || touchedScopes.some((s) => s !== "user" && s !== "project")) {
9526
- return fallbackDebug(event, base, MALFORMED_MEMORY_CHANGED);
9527
- }
9758
+ __name(parseTimestamp, "parseTimestamp");
9759
+ function isAttachmentReferenceContent(value) {
9760
+ return isRecord2(value) && (value["type"] === "image" || value["type"] === "resource") && typeof value["attachmentId"] === "string" && value["attachmentId"].length > 0 && value["data"] === void 0 && value["url"] === void 0 && value["source"] === void 0;
9761
+ }
9762
+ __name(isAttachmentReferenceContent, "isAttachmentReferenceContent");
9763
+ function normalizeSessionUpdate(event, base, opts) {
9764
+ const update = getSessionUpdatePayload(event.data);
9765
+ if (!update) {
9528
9766
  return [
9529
9767
  {
9530
9768
  ...base,
9531
- type: "workspace.memory.changed",
9532
- scope,
9533
- source,
9534
- taskId,
9535
- touchedScopes
9769
+ type: "debug",
9770
+ debugReason: "malformed_payload",
9771
+ text: debugBlockText("session_update", event.data)
9536
9772
  }
9537
9773
  ];
9538
9774
  }
9539
- const filePath = getString2(event.data, "filePath");
9540
- const mode = getString2(event.data, "mode");
9541
- const bytesWritten = numberField(
9542
- isRecord2(event.data) ? event.data : void 0,
9543
- "bytesWritten"
9544
- );
9545
- if (scope !== "workspace" && scope !== "global" || !filePath || mode !== "append" && mode !== "replace" || bytesWritten === void 0) {
9546
- return fallbackDebug(event, base, MALFORMED_MEMORY_CHANGED);
9547
- }
9548
- return [
9549
- {
9550
- ...base,
9551
- type: "workspace.memory.changed",
9552
- scope,
9553
- filePath,
9554
- mode,
9555
- bytesWritten
9775
+ const kind = getString2(update, "sessionUpdate");
9776
+ switch (kind) {
9777
+ case "user_message_chunk": {
9778
+ if (opts.suppressOwnUserEcho && opts.clientId && event.originatorClientId === opts.clientId) {
9779
+ return [];
9780
+ }
9781
+ const meta = extractUpdateMeta(update);
9782
+ const content = update["content"];
9783
+ const part = extractContentPart(content);
9784
+ if (part) {
9785
+ if (part.kind === "image") {
9786
+ const data = part.source.data;
9787
+ let mimeType = part.mediaType || "image/*";
9788
+ if (mimeType === "image/*" && data) {
9789
+ const rawData = data.startsWith("data:") ? data.split(",")[1] ?? "" : data;
9790
+ const prefix = rawData.slice(0, 10);
9791
+ if (prefix.startsWith("iVBORw0KGg")) mimeType = "image/png";
9792
+ else if (prefix.startsWith("/9j/")) mimeType = "image/jpeg";
9793
+ else if (prefix.startsWith("R0lGOD")) mimeType = "image/gif";
9794
+ else if (prefix.startsWith("UklGR")) mimeType = "image/webp";
9795
+ }
9796
+ if (data) {
9797
+ const contentRecord = isRecord2(content) ? content : void 0;
9798
+ const attachmentId = typeof contentRecord?.["attachmentId"] === "string" ? contentRecord["attachmentId"] : void 0;
9799
+ return [
9800
+ {
9801
+ ...base,
9802
+ type: "user.image.delta",
9803
+ data,
9804
+ mimeType,
9805
+ ...attachmentId ? { attachmentId } : {},
9806
+ ...meta ? { meta } : {}
9807
+ }
9808
+ ];
9809
+ }
9810
+ return [];
9811
+ }
9812
+ if (part.kind === "text") {
9813
+ return part.text ? [
9814
+ {
9815
+ ...base,
9816
+ type: "user.text.delta",
9817
+ text: part.text,
9818
+ ...meta ? { meta } : {}
9819
+ }
9820
+ ] : [];
9821
+ }
9822
+ return [];
9823
+ }
9824
+ if (isAttachmentReferenceContent(content)) {
9825
+ if (content["type"] === "resource") {
9826
+ const attachmentId = content["attachmentId"];
9827
+ const mimeType = content["mimeType"];
9828
+ return [
9829
+ {
9830
+ ...base,
9831
+ type: "user.file.delta",
9832
+ name: attachmentId,
9833
+ attachmentId,
9834
+ mimeType: typeof mimeType === "string" ? mimeType : "",
9835
+ ...meta ? { meta } : {}
9836
+ }
9837
+ ];
9838
+ }
9839
+ return [
9840
+ {
9841
+ ...base,
9842
+ type: "user.text.delta",
9843
+ text: ATTACHMENT_UNAVAILABLE_TEXT,
9844
+ ...meta ? { meta } : {}
9845
+ }
9846
+ ];
9847
+ }
9848
+ const text = getTextContent(content);
9849
+ return text ? [
9850
+ {
9851
+ ...base,
9852
+ type: "user.text.delta",
9853
+ text,
9854
+ ...meta ? { meta } : {}
9855
+ }
9856
+ ] : [];
9857
+ }
9858
+ case "agent_message_chunk": {
9859
+ const text = getTextContent(update["content"]);
9860
+ const parentToolCallId = extractParentToolCallId(update);
9861
+ const meta = extractUpdateMeta(update);
9862
+ const events = [];
9863
+ if (text) {
9864
+ events.push({
9865
+ ...base,
9866
+ type: "assistant.text.delta",
9867
+ text,
9868
+ ...parentToolCallId ? { parentToolCallId } : {},
9869
+ ...meta ? { meta } : {}
9870
+ });
9871
+ }
9872
+ const usage = extractAssistantUsage(update);
9873
+ if (usage) {
9874
+ events.push({
9875
+ ...base,
9876
+ type: "assistant.usage",
9877
+ usage,
9878
+ ...parentToolCallId ? { parentToolCallId } : {}
9879
+ });
9880
+ }
9881
+ return events;
9882
+ }
9883
+ case "agent_thought_chunk": {
9884
+ const text = getTextContent(update["content"]);
9885
+ if (!text) return [];
9886
+ const parentToolCallId = extractParentToolCallId(update);
9887
+ const meta = extractUpdateMeta(update);
9888
+ return [
9889
+ {
9890
+ ...base,
9891
+ type: "thought.text.delta",
9892
+ text,
9893
+ ...parentToolCallId ? { parentToolCallId } : {},
9894
+ ...meta ? { meta } : {}
9895
+ }
9896
+ ];
9897
+ }
9898
+ case "tool_call":
9899
+ case "tool_call_update": {
9900
+ const meta = isRecord2(update["_meta"]) ? update["_meta"] : void 0;
9901
+ if (getString2(update, "status") === "in_progress" && getString2(update, "kind") === void 0 && (meta?.["shellProgress"] !== void 0 || meta?.subagentProgress === true)) {
9902
+ return [];
9903
+ }
9904
+ return [normalizeToolUpdate(update, base)];
9905
+ }
9906
+ case "shell_output":
9907
+ case "tool_output": {
9908
+ const text = getOutputText(update);
9909
+ const stream = getShellStream(update) ?? getShellStream(event.data);
9910
+ const source = getSource(update) ?? getSource(event.data);
9911
+ return text ? [
9912
+ {
9913
+ ...base,
9914
+ type: source === "user-shell" ? "user.shell.output" : "shell.output",
9915
+ text,
9916
+ ...stream ? { stream } : {}
9917
+ }
9918
+ ] : [];
9919
+ }
9920
+ case "available_commands_update": {
9921
+ const rawCommands = Array.isArray(update["availableCommands"]) ? update["availableCommands"] : [];
9922
+ const commands = rawCommands.filter(isRecord2);
9923
+ return [
9924
+ {
9925
+ ...base,
9926
+ type: "session.available_commands",
9927
+ count: commands.length,
9928
+ commands
9929
+ }
9930
+ ];
9556
9931
  }
9557
- ];
9558
- }
9559
- __name(normalizeMemoryChanged, "normalizeMemoryChanged");
9560
- function normalizeAgentChanged(event, base) {
9561
- const change = getString2(event.data, "change");
9562
- const name = getString2(event.data, "name");
9563
- const level = getString2(event.data, "level");
9564
- if (change !== "created" && change !== "updated" && change !== "deleted" || !name || level !== "project" && level !== "user") {
9565
- return fallbackDebug(event, base, "malformed agent_changed payload");
9932
+ case "plan":
9933
+ return [normalizePlanUpdate(update, base)];
9934
+ case "current_mode_update":
9935
+ case "session_info_update":
9936
+ case "usage_update":
9937
+ return [];
9938
+ default:
9939
+ return [
9940
+ {
9941
+ ...base,
9942
+ type: "debug",
9943
+ // `getSessionUpdatePayload` accepts any record, so `kind` is
9944
+ // `undefined` for a payload whose discriminator is missing, empty or
9945
+ // not a string. That is a broken frame, not a kind from a newer
9946
+ // daemon — classifying it as unrecognized would hide the only
9947
+ // diagnostic a malformed `session_update` produces. A whitespace-only
9948
+ // discriminator is truthy but no more usable than an empty one, so
9949
+ // apply the same `trim()` convention `getFirstString` uses.
9950
+ debugReason: kind?.trim() ? "unrecognized_session_update" : "malformed_payload",
9951
+ text: debugBlockText(kind ?? "session_update", update)
9952
+ }
9953
+ ];
9566
9954
  }
9567
- return [
9568
- {
9569
- ...base,
9570
- type: "workspace.agent.changed",
9571
- change,
9572
- name,
9573
- level
9574
- }
9575
- ];
9576
9955
  }
9577
- __name(normalizeAgentChanged, "normalizeAgentChanged");
9578
- function normalizeToolToggled(event, base) {
9579
- const toolName = getString2(event.data, "toolName");
9580
- const enabled = isRecord2(event.data) && typeof event.data["enabled"] === "boolean" ? event.data["enabled"] : void 0;
9581
- if (!toolName || enabled === void 0) {
9582
- return fallbackDebug(event, base, "malformed tool_toggled payload");
9583
- }
9584
- return [
9585
- {
9586
- ...base,
9587
- type: "workspace.tool.toggled",
9588
- toolName,
9589
- enabled
9590
- }
9591
- ];
9956
+ __name(normalizeSessionUpdate, "normalizeSessionUpdate");
9957
+ function extractParentToolCallId(update) {
9958
+ const meta = isRecord2(update["_meta"]) ? update["_meta"] : void 0;
9959
+ return meta ? getString2(meta, "parentToolCallId") : void 0;
9592
9960
  }
9593
- __name(normalizeToolToggled, "normalizeToolToggled");
9594
- function normalizeSettingsChanged(event, base) {
9595
- const key = getString2(event.data, "key");
9596
- const scope = getString2(event.data, "scope");
9597
- if (!key) {
9598
- return fallbackDebug(event, base, "malformed settings_changed payload");
9599
- }
9600
- const mutation = isSettingsChangedData(event.data) && event.data.mutation;
9601
- return [
9602
- {
9603
- ...base,
9604
- type: "workspace.settings.changed",
9605
- key,
9606
- scope: scope ?? "workspace",
9607
- value: isRecord2(event.data) ? event.data["value"] : void 0,
9608
- ...mutation ? { mutation } : {}
9609
- }
9610
- ];
9961
+ __name(extractParentToolCallId, "extractParentToolCallId");
9962
+ function extractUpdateMeta(update) {
9963
+ const meta = isRecord2(update["_meta"]) ? update["_meta"] : void 0;
9964
+ if (!meta) return void 0;
9965
+ const { qwenTranscript: _qwenTranscript, ...displayMeta } = meta;
9966
+ return Object.keys(displayMeta).length > 0 ? displayMeta : void 0;
9611
9967
  }
9612
- __name(normalizeSettingsChanged, "normalizeSettingsChanged");
9613
- function normalizeSettingsReloaded(event, base) {
9614
- if (!isRecord2(event.data)) {
9615
- return fallbackDebug(event, base, "malformed settings_reloaded payload");
9616
- }
9617
- return [
9618
- {
9619
- ...base,
9620
- type: "workspace.settings.changed",
9621
- key: "settings_reloaded",
9622
- scope: "workspace",
9623
- value: event.data
9624
- }
9968
+ __name(extractUpdateMeta, "extractUpdateMeta");
9969
+ function extractSourceRecordIds(event) {
9970
+ if (!isRecord2(event.data)) return void 0;
9971
+ const update = getSessionUpdatePayload(event.data);
9972
+ const meta = update && isRecord2(update["_meta"]) ? update["_meta"] : void 0;
9973
+ const transcript = meta && isRecord2(meta["qwenTranscript"]) ? meta["qwenTranscript"] : void 0;
9974
+ const values = transcript?.["sourceRecordIds"];
9975
+ if (!Array.isArray(values)) return void 0;
9976
+ const ids = [
9977
+ ...new Set(
9978
+ values.filter((value) => typeof value === "string")
9979
+ )
9625
9980
  ];
9981
+ return ids.length > 0 ? ids : void 0;
9626
9982
  }
9627
- __name(normalizeSettingsReloaded, "normalizeSettingsReloaded");
9628
- function normalizeWorkspaceInitialized(event, base) {
9629
- const path = getString2(event.data, "path");
9630
- const action = getString2(event.data, "action");
9631
- if (!path || action !== "created" && action !== "overwrote" && action !== "noop") {
9632
- return fallbackDebug(
9633
- event,
9634
- base,
9635
- "malformed workspace_initialized payload"
9636
- );
9637
- }
9638
- return [{ ...base, type: "workspace.initialized", path, action }];
9983
+ __name(extractSourceRecordIds, "extractSourceRecordIds");
9984
+ function extractAssistantUsage(update) {
9985
+ const meta = isRecord2(update["_meta"]) ? update["_meta"] : void 0;
9986
+ const usage = meta && isRecord2(meta["usage"]) ? meta["usage"] : void 0;
9987
+ if (!usage) return void 0;
9988
+ const inputTokens = numberField(usage, "inputTokens");
9989
+ const outputTokens = numberField(usage, "outputTokens");
9990
+ if (inputTokens === void 0 && outputTokens === void 0) return void 0;
9991
+ const cachedTokens = numberField(usage, "cachedReadTokens");
9992
+ return {
9993
+ inputTokens: inputTokens ?? 0,
9994
+ outputTokens: outputTokens ?? 0,
9995
+ ...cachedTokens !== void 0 ? { cachedTokens } : {}
9996
+ };
9639
9997
  }
9640
- __name(normalizeWorkspaceInitialized, "normalizeWorkspaceInitialized");
9641
- function normalizeTrustChangeRequested(event, base) {
9642
- const workspaceCwd = getString2(event.data, "workspaceCwd");
9643
- const desiredState = getString2(event.data, "desiredState");
9644
- const reason = getString2(event.data, "reason");
9645
- if (!workspaceCwd || desiredState !== "trusted" && desiredState !== "untrusted") {
9646
- return fallbackDebug(event, base, "bad trust_change_requested payload");
9647
- }
9648
- return [
9649
- {
9998
+ __name(extractAssistantUsage, "extractAssistantUsage");
9999
+ function normalizeToolUpdate(update, base) {
10000
+ const metadata = isRecord2(update["_meta"]) ? update["_meta"] : void 0;
10001
+ const transcript = metadata && isRecord2(metadata["qwenTranscript"]) ? metadata["qwenTranscript"] : void 0;
10002
+ const resultPreview = createDaemonToolResultTextPreview(
10003
+ getString2(transcript, "resultPreviewText") ?? ""
10004
+ );
10005
+ const toolName = getString2(update, "toolName") ?? getString2(update, "name") ?? (metadata ? getString2(metadata, "toolName") : void 0) ?? (metadata ? getString2(metadata, "name") : void 0);
10006
+ const toolKind = getString2(update, "kind");
10007
+ const explicitTitle = getString2(update, "title");
10008
+ const title = explicitTitle ?? (getString2(update, "sessionUpdate") === "tool_call" ? toolName ?? toolKind : void 0);
10009
+ const rawInputSource = update["rawInput"] ?? update["input"] ?? update["args"];
10010
+ const rawOutputSource = update["rawOutput"] ?? update["output"] ?? update["result"];
10011
+ const rawInput = rawInputSource !== void 0 ? redactSensitiveFields(rawInputSource) : void 0;
10012
+ const rawOutput = rawOutputSource !== void 0 ? redactSensitiveFields(rawOutputSource) : void 0;
10013
+ const content = update["content"] !== void 0 ? redactSensitiveFields(update["content"]) : void 0;
10014
+ const locations = update["locations"] !== void 0 ? redactSensitiveFields(update["locations"]) : void 0;
10015
+ const toolCallId = getString2(update, "toolCallId");
10016
+ const status = getString2(update, "status");
10017
+ if (!toolCallId) {
10018
+ return {
9650
10019
  ...base,
9651
- type: "workspace.trust.change.requested",
9652
- workspaceCwd,
9653
- desiredState,
9654
- ...reason !== void 0 ? { reason } : {}
9655
- }
9656
- ];
9657
- }
9658
- __name(normalizeTrustChangeRequested, "normalizeTrustChangeRequested");
9659
- function normalizeGithubSetupCompleted(event, base) {
9660
- const releaseTag = getString2(event.data, "releaseTag");
9661
- const readmeUrl = getString2(event.data, "readmeUrl");
9662
- if (!releaseTag || !readmeUrl || !isRecord2(event.data)) {
9663
- return fallbackDebug(
9664
- event,
9665
- base,
9666
- "malformed github_setup_completed payload"
9667
- );
10020
+ type: "error",
10021
+ code: "daemon.protocol.tool_update_missing_tool_call_id",
10022
+ recoverable: true,
10023
+ text: `Tool update missing toolCallId${title ? ` (${title})` : ""}`
10024
+ };
9668
10025
  }
9669
- const workflows = event.data["workflows"];
9670
- const warnings = event.data["warnings"];
9671
- return [
9672
- {
9673
- ...base,
9674
- type: "workspace.github.setup.completed",
9675
- releaseTag,
9676
- readmeUrl,
9677
- ...typeof event.data["secretsUrl"] === "string" ? { secretsUrl: event.data["secretsUrl"] } : {},
9678
- workflows: Array.isArray(workflows) ? workflows : [],
9679
- gitignore: event.data["gitignore"],
9680
- warnings: Array.isArray(warnings) ? warnings.filter(
9681
- (warning) => typeof warning === "string"
9682
- ) : []
9683
- }
9684
- ];
10026
+ const { provenance, serverId } = extractToolProvenance(update, toolName);
10027
+ const rawParentToolCallId = getString2(update, "parentToolCallId") ?? (metadata ? getString2(metadata, "parentToolCallId") : void 0);
10028
+ const parentToolCallId = rawParentToolCallId && rawParentToolCallId !== toolCallId ? rawParentToolCallId : void 0;
10029
+ const subagentType = getString2(update, "subagentType") ?? (metadata ? getString2(metadata, "subagentType") : void 0);
10030
+ return {
10031
+ ...base,
10032
+ type: "tool.update",
10033
+ toolCallId,
10034
+ ...status ? { status } : {},
10035
+ ...title ? { title } : {},
10036
+ ...toolName ? { toolName } : {},
10037
+ ...toolKind ? { toolKind } : {},
10038
+ ...content !== void 0 ? { content } : {},
10039
+ ...locations !== void 0 ? { locations } : {},
10040
+ ...provenance ? { provenance } : {},
10041
+ ...serverId ? { serverId } : {},
10042
+ ...parentToolCallId ? { parentToolCallId } : {},
10043
+ ...subagentType ? { subagentType } : {},
10044
+ ...rawInput !== void 0 ? { rawInput } : {},
10045
+ ...rawOutput !== void 0 ? { rawOutput } : {},
10046
+ ...resultPreview ? { resultPreview } : {},
10047
+ ...rawInput !== void 0 ? { details: capDetails(stringifyRedactedJson(rawInput)) } : rawOutput !== void 0 ? { details: capDetails(stringifyRedactedJson(rawOutput)) } : {}
10048
+ };
9685
10049
  }
9686
- __name(normalizeGithubSetupCompleted, "normalizeGithubSetupCompleted");
9687
- function normalizeMcpBudgetWarning(event, base) {
9688
- if (!isRecord2(event.data)) {
9689
- return fallbackDebug(event, base, "non-object payload");
9690
- }
9691
- const liveCount = numberField(event.data, "liveCount");
9692
- const reservedCount = numberField(event.data, "reservedCount");
9693
- const budget = numberField(event.data, "budget");
9694
- const thresholdRatio = numberField(event.data, "thresholdRatio");
9695
- const mode = getString2(event.data, "mode");
9696
- if (liveCount === void 0 || reservedCount === void 0 || budget === void 0 || thresholdRatio === void 0 || mode !== "warn" && mode !== "enforce") {
9697
- return fallbackDebug(event, base, "malformed mcp_budget_warning payload");
9698
- }
9699
- return [
9700
- {
9701
- ...base,
9702
- type: "workspace.mcp.budget_warning",
9703
- liveCount,
9704
- reservedCount,
9705
- budget,
9706
- thresholdRatio,
9707
- mode
10050
+ __name(normalizeToolUpdate, "normalizeToolUpdate");
10051
+ function normalizePlanUpdate(update, base) {
10052
+ const entries = Array.isArray(update["entries"]) ? update["entries"] : [];
10053
+ const contentText = capDetails(formatPlanEntries(entries));
10054
+ const meta = isRecord2(update["_meta"]) ? update["_meta"] : void 0;
10055
+ const transcript = meta && isRecord2(meta["qwenTranscript"]) ? meta["qwenTranscript"] : void 0;
10056
+ const planCallId = getString2(transcript, "planToolCallId") ?? (base.eventId !== void 0 ? `${DAEMON_PLAN_TOOL_CALL_ID}-${base.eventId}` : DAEMON_PLAN_TOOL_CALL_ID);
10057
+ const stats = meta && isRecord2(meta["stats"]) ? meta["stats"] : void 0;
10058
+ const todoPlan = meta && isRecord2(meta["qwenTodoPlan"]) ? meta["qwenTodoPlan"] : void 0;
10059
+ const planId = getString2(todoPlan, "id");
10060
+ const sessionWorkflow = meta?.["qwenSessionWorkflow"] === true;
10061
+ return {
10062
+ ...base,
10063
+ type: "tool.update",
10064
+ toolCallId: planCallId,
10065
+ title: "Updated Plan",
10066
+ status: "completed",
10067
+ toolName: "todo_write",
10068
+ toolKind: "updated_plan",
10069
+ content: [
10070
+ {
10071
+ type: "content",
10072
+ content: { type: "text", text: contentText }
10073
+ }
10074
+ ],
10075
+ rawOutput: {
10076
+ entries,
10077
+ ...stats ? { stats } : {},
10078
+ ...planId ? { plan: { id: planId, sourceCallId: planCallId } } : {},
10079
+ ...sessionWorkflow ? { sessionWorkflow: true } : {}
9708
10080
  }
9709
- ];
10081
+ };
9710
10082
  }
9711
- __name(normalizeMcpBudgetWarning, "normalizeMcpBudgetWarning");
9712
- function normalizeMcpChildRefused(event, base) {
9713
- if (!isRecord2(event.data)) {
9714
- return fallbackDebug(event, base, "non-object payload");
10083
+ __name(normalizePlanUpdate, "normalizePlanUpdate");
10084
+ function formatPlanEntries(entries) {
10085
+ return entries.flatMap((entry) => {
10086
+ if (!isRecord2(entry)) return [];
10087
+ const content = getString2(entry, "content");
10088
+ if (!content) return [];
10089
+ const marker = getPlanEntryMarker(getString2(entry, "status"));
10090
+ return [`- [${marker}] ${content}`];
10091
+ }).join("\n");
10092
+ }
10093
+ __name(formatPlanEntries, "formatPlanEntries");
10094
+ function getPlanEntryMarker(status) {
10095
+ switch (status) {
10096
+ case "completed":
10097
+ return "x";
10098
+ case "in_progress":
10099
+ return "-";
10100
+ default:
10101
+ return " ";
9715
10102
  }
9716
- const refusedServers = Array.isArray(event.data["refusedServers"]) ? event.data["refusedServers"].filter(isRecord2).map((s) => {
9717
- const name = getString2(s, "name");
9718
- const transport = getString2(s, "transport");
9719
- const reason = getString2(s, "reason");
9720
- if (!name || !transport || reason !== "budget_exhausted") return null;
10103
+ }
10104
+ __name(getPlanEntryMarker, "getPlanEntryMarker");
10105
+ function extractToolProvenance(update, toolName) {
10106
+ const explicit = getString2(update, "provenance");
10107
+ const explicitServerId = getString2(update, "serverId");
10108
+ if (explicit === "builtin" || explicit === "mcp" || explicit === "subagent") {
9721
10109
  return {
9722
- name,
9723
- transport,
9724
- reason: "budget_exhausted"
10110
+ provenance: explicit,
10111
+ ...explicit === "mcp" && explicitServerId ? { serverId: explicitServerId } : {}
9725
10112
  };
9726
- }).filter(
9727
- (v) => v !== null
9728
- ) : [];
9729
- const budget = numberField(event.data, "budget");
9730
- const liveCount = numberField(event.data, "liveCount");
9731
- const reservedCount = numberField(event.data, "reservedCount");
9732
- if (refusedServers.length === 0 || budget === void 0 || liveCount === void 0 || reservedCount === void 0) {
9733
- return fallbackDebug(
9734
- event,
9735
- base,
9736
- "malformed mcp_child_refused_batch payload"
9737
- );
9738
10113
  }
9739
- return [
9740
- {
9741
- ...base,
9742
- type: "workspace.mcp.child_refused",
9743
- refusedServers,
9744
- budget,
9745
- liveCount,
9746
- reservedCount
10114
+ if (toolName && toolName.startsWith("mcp__")) {
10115
+ const rest = toolName.slice("mcp__".length);
10116
+ const sep = rest.indexOf("__");
10117
+ if (sep > 0) {
10118
+ return { provenance: "mcp", serverId: rest.slice(0, sep) };
9747
10119
  }
9748
- ];
10120
+ }
10121
+ return {};
9749
10122
  }
9750
- __name(normalizeMcpChildRefused, "normalizeMcpChildRefused");
9751
- function normalizeMcpServerRestarted(event, base) {
9752
- const serverName = getString2(event.data, "serverName");
9753
- const durationMs = numberField(event.data, "durationMs");
9754
- if (!serverName || durationMs === void 0) {
9755
- return fallbackDebug(event, base, "malformed mcp_server_restarted payload");
10123
+ __name(extractToolProvenance, "extractToolProvenance");
10124
+ function asDaemonErrorKind(value) {
10125
+ if (!value) return void 0;
10126
+ return DAEMON_ERROR_KIND_SET.has(value) ? value : void 0;
10127
+ }
10128
+ __name(asDaemonErrorKind, "asDaemonErrorKind");
10129
+ function debugBlockText(prefix, data) {
10130
+ return capDetails(`${prefix}: ${stringifyRedactedJson(data)}`);
10131
+ }
10132
+ __name(debugBlockText, "debugBlockText");
10133
+ function normalizePermissionRequest(event, base) {
10134
+ if (!isRecord2(event.data)) {
10135
+ return [
10136
+ {
10137
+ ...base,
10138
+ type: "debug",
10139
+ debugReason: "malformed_payload",
10140
+ text: debugBlockText("permission_request", event.data)
10141
+ }
10142
+ ];
10143
+ }
10144
+ const requestId = getString2(event.data, "requestId");
10145
+ if (!requestId) {
10146
+ return [
10147
+ {
10148
+ ...base,
10149
+ type: "debug",
10150
+ debugReason: "malformed_payload",
10151
+ text: debugBlockText("permission_request", event.data)
10152
+ }
10153
+ ];
9756
10154
  }
10155
+ const toolCall = event.data["toolCall"] !== void 0 ? redactSensitiveFields(event.data["toolCall"]) : void 0;
9757
10156
  return [
9758
10157
  {
9759
10158
  ...base,
9760
- type: "workspace.mcp.server_restarted",
9761
- serverName,
9762
- durationMs
10159
+ type: "permission.request",
10160
+ requestId,
10161
+ sessionId: getString2(event.data, "sessionId"),
10162
+ title: describeToolCall(toolCall),
10163
+ options: normalizePermissionOptions(event.data["options"]),
10164
+ toolCall
9763
10165
  }
9764
10166
  ];
9765
10167
  }
9766
- __name(normalizeMcpServerRestarted, "normalizeMcpServerRestarted");
9767
- function normalizeMcpServerRestartRefused(event, base) {
9768
- const serverName = getString2(event.data, "serverName");
9769
- const reason = getString2(event.data, "reason");
9770
- if (!serverName || !reason || !MCP_RESTART_REFUSED_REASONS2.has(reason)) {
9771
- return fallbackDebug(
9772
- event,
9773
- base,
9774
- "malformed mcp_server_restart_refused payload"
9775
- );
10168
+ __name(normalizePermissionRequest, "normalizePermissionRequest");
10169
+ function normalizePermissionResolved(event, base) {
10170
+ const requestId = getString2(event.data, "requestId");
10171
+ if (!requestId) {
10172
+ return [
10173
+ {
10174
+ ...base,
10175
+ type: "debug",
10176
+ debugReason: "malformed_payload",
10177
+ text: debugBlockText(event.type, event.data)
10178
+ }
10179
+ ];
9776
10180
  }
10181
+ const voterClientId = getString2(event.data, "voterClientId") ?? base.originatorClientId;
9777
10182
  return [
9778
10183
  {
9779
10184
  ...base,
9780
- type: "workspace.mcp.server_restart_refused",
9781
- serverName,
9782
- reason
10185
+ type: "permission.resolved",
10186
+ requestId,
10187
+ outcome: describePermissionOutcome(event.data),
10188
+ ...voterClientId ? { voterClientId } : {}
9783
10189
  }
9784
10190
  ];
9785
10191
  }
9786
- __name(normalizeMcpServerRestartRefused, "normalizeMcpServerRestartRefused");
9787
- function normalizeMcpServerChanged(event, base, fixedAction) {
9788
- const serverName = getString2(event.data, fixedAction ? "name" : "serverName");
9789
- const action = fixedAction ?? getString2(event.data, "action");
9790
- if (!serverName || !action || ![
9791
- "added",
9792
- "removed",
9793
- "approve",
9794
- "enable",
9795
- "disable",
9796
- "authenticate",
9797
- "clear-auth"
9798
- ].includes(action)) {
9799
- return fallbackDebug(event, base, `malformed ${event.type} payload`);
10192
+ __name(normalizePermissionResolved, "normalizePermissionResolved");
10193
+ function getSessionUpdatePayload(value) {
10194
+ if (!isRecord2(value)) return void 0;
10195
+ const update = value["update"];
10196
+ return isRecord2(update) ? update : value;
10197
+ }
10198
+ __name(getSessionUpdatePayload, "getSessionUpdatePayload");
10199
+ function normalizePermissionOptions(value) {
10200
+ if (!Array.isArray(value)) return [];
10201
+ return value.flatMap((option) => {
10202
+ if (!isRecord2(option)) return [];
10203
+ const optionId = getString2(option, "optionId");
10204
+ if (!optionId) return [];
10205
+ return [
10206
+ {
10207
+ optionId,
10208
+ label: getString2(option, "label") ?? getString2(option, "title") ?? getString2(option, "name") ?? optionId,
10209
+ ...getString2(option, "description") ? { description: getString2(option, "description") } : {},
10210
+ raw: option
10211
+ }
10212
+ ];
10213
+ });
10214
+ }
10215
+ __name(normalizePermissionOptions, "normalizePermissionOptions");
10216
+ function describePermissionOutcome(value) {
10217
+ if (!isRecord2(value)) return stringifyJson(value);
10218
+ const outcome = value["outcome"];
10219
+ if (typeof outcome === "string") return outcome;
10220
+ if (isRecord2(outcome)) {
10221
+ const kind = getString2(outcome, "outcome") ?? "selected";
10222
+ const optionId = getString2(outcome, "optionId");
10223
+ return optionId ? `${kind}:${optionId}` : kind;
9800
10224
  }
10225
+ return getFirstString(value, ["status", "reason"]) ?? stringifyJson(value);
10226
+ }
10227
+ __name(describePermissionOutcome, "describePermissionOutcome");
10228
+ function describeToolCall(value) {
10229
+ if (!isRecord2(value)) return "Tool permission";
10230
+ return getString2(value, "title") ?? getString2(value, "name") ?? getString2(value, "kind") ?? getString2(value, "toolName") ?? "Tool permission";
10231
+ }
10232
+ __name(describeToolCall, "describeToolCall");
10233
+ function getShellStream(value) {
10234
+ const stream = getString2(value, "stream");
10235
+ return stream === "stdout" || stream === "stderr" ? stream : void 0;
10236
+ }
10237
+ __name(getShellStream, "getShellStream");
10238
+ function getSource(value) {
10239
+ if (!isRecord2(value)) return void 0;
10240
+ const direct = getString2(value, "source");
10241
+ if (direct) return direct;
10242
+ const meta = value["_meta"];
10243
+ return isRecord2(meta) ? getString2(meta, "source") : void 0;
10244
+ }
10245
+ __name(getSource, "getSource");
10246
+ function fallbackDebug(event, base, reason) {
9801
10247
  return [
9802
10248
  {
9803
10249
  ...base,
9804
- type: "workspace.mcp.server_changed",
9805
- serverName,
9806
- action
10250
+ type: "debug",
10251
+ debugReason: "malformed_payload",
10252
+ text: `${event.type}: ${reason}`
9807
10253
  }
9808
10254
  ];
9809
10255
  }
9810
- __name(normalizeMcpServerChanged, "normalizeMcpServerChanged");
9811
- function normalizeExtensionsChanged(event, base) {
9812
- const refreshed = numberField(event.data, "refreshed");
9813
- const failed = numberField(event.data, "failed");
9814
- const status = getString2(event.data, "status");
9815
- const source = getString2(event.data, "source");
9816
- const name = getString2(event.data, "name");
9817
- const version = getString2(event.data, "version");
9818
- const error = getString2(event.data, "error");
9819
- if (refreshed === void 0 || failed === void 0) {
9820
- return fallbackDebug(event, base, "malformed extensions_changed payload");
9821
- }
9822
- if (status !== void 0 && status !== "installed" && status !== "enabled" && status !== "disabled" && status !== "updated" && status !== "uninstalled" && status !== "failed") {
9823
- return fallbackDebug(event, base, "malformed extensions_changed payload");
9824
- }
10256
+ __name(fallbackDebug, "fallbackDebug");
10257
+ function normalizeSessionMetadataUpdated(event, base) {
10258
+ const sessionId = getString2(event.data, "sessionId");
10259
+ if (!sessionId) return fallbackDebug(event, base, "missing sessionId");
10260
+ const displayName = getString2(event.data, "displayName");
9825
10261
  return [
9826
10262
  {
9827
10263
  ...base,
9828
- type: "workspace.extensions.changed",
9829
- refreshed,
9830
- failed,
9831
- ...status ? { status } : {},
9832
- ...source ? { source } : {},
9833
- ...name ? { name } : {},
9834
- ...version ? { version } : {},
9835
- ...error ? { error } : {}
10264
+ type: "session.metadata.changed",
10265
+ sessionId,
10266
+ ...displayName !== void 0 ? { displayName } : {}
9836
10267
  }
9837
10268
  ];
9838
10269
  }
9839
- __name(normalizeExtensionsChanged, "normalizeExtensionsChanged");
9840
- function normalizeAuthDeviceFlowStarted(event, base) {
9841
- const deviceFlowId = getString2(event.data, "deviceFlowId");
9842
- const providerId = getString2(event.data, "providerId");
9843
- const expiresAt = numberField(event.data, "expiresAt");
9844
- if (!deviceFlowId || !providerId || !DEVICE_FLOW_PROVIDER_SET.has(providerId) || expiresAt === void 0) {
9845
- return fallbackDebug(
9846
- event,
9847
- base,
9848
- "malformed auth_device_flow_started payload"
9849
- );
10270
+ __name(normalizeSessionMetadataUpdated, "normalizeSessionMetadataUpdated");
10271
+ function normalizeArtifactChanged(event, base) {
10272
+ const sessionId = getString2(event.data, "sessionId");
10273
+ const change = isRecord2(event.data) ? event.data["change"] : void 0;
10274
+ if (!sessionId || !isRecord2(change)) {
10275
+ return fallbackDebug(event, base, "malformed artifact_changed payload");
10276
+ }
10277
+ const action = getString2(change, "action");
10278
+ const artifactId = getString2(change, "artifactId");
10279
+ if (!action || !artifactId) {
10280
+ return fallbackDebug(event, base, "missing action or artifactId");
9850
10281
  }
9851
10282
  return [
9852
10283
  {
9853
10284
  ...base,
9854
- type: "auth.device_flow.started",
9855
- deviceFlowId,
9856
- providerId,
9857
- expiresAt
10285
+ type: "session.artifact.changed",
10286
+ sessionId,
10287
+ change
9858
10288
  }
9859
10289
  ];
9860
10290
  }
9861
- __name(normalizeAuthDeviceFlowStarted, "normalizeAuthDeviceFlowStarted");
9862
- function normalizeAuthDeviceFlowThrottled(event, base) {
9863
- const deviceFlowId = getString2(event.data, "deviceFlowId");
9864
- const intervalMs = numberField(event.data, "intervalMs");
9865
- if (!deviceFlowId || intervalMs === void 0) {
9866
- return fallbackDebug(
9867
- event,
9868
- base,
9869
- "malformed auth_device_flow_throttled payload"
9870
- );
10291
+ __name(normalizeArtifactChanged, "normalizeArtifactChanged");
10292
+ function normalizeApprovalModeChanged(event, base) {
10293
+ const sessionId = getString2(event.data, "sessionId");
10294
+ const previous = getString2(event.data, "previous");
10295
+ const next = getString2(event.data, "next");
10296
+ if (!sessionId || !previous || !next) {
10297
+ return fallbackDebug(event, base, "missing sessionId / previous / next");
9871
10298
  }
10299
+ const persisted = isRecord2(event.data) && typeof event.data["persisted"] === "boolean" ? event.data["persisted"] : false;
9872
10300
  return [
9873
10301
  {
9874
10302
  ...base,
9875
- type: "auth.device_flow.throttled",
9876
- deviceFlowId,
9877
- intervalMs
10303
+ type: "session.approval_mode.changed",
10304
+ sessionId,
10305
+ previous,
10306
+ next,
10307
+ persisted
9878
10308
  }
9879
10309
  ];
9880
10310
  }
9881
- __name(normalizeAuthDeviceFlowThrottled, "normalizeAuthDeviceFlowThrottled");
9882
- function normalizeAuthDeviceFlowAuthorized(event, base) {
9883
- const deviceFlowId = getString2(event.data, "deviceFlowId");
9884
- const providerId = getString2(event.data, "providerId");
9885
- if (!deviceFlowId || !providerId || !DEVICE_FLOW_PROVIDER_SET.has(providerId)) {
9886
- return fallbackDebug(
9887
- event,
9888
- base,
9889
- "malformed auth_device_flow_authorized payload"
9890
- );
10311
+ __name(normalizeApprovalModeChanged, "normalizeApprovalModeChanged");
10312
+ function normalizeMemoryChanged(event, base) {
10313
+ const scope = getString2(event.data, "scope");
10314
+ if (scope === "managed") {
10315
+ const source = getString2(event.data, "source");
10316
+ const taskId = getString2(event.data, "taskId");
10317
+ const touchedScopes = event.data?.["touchedScopes"];
10318
+ if (!(source && taskId && Array.isArray(touchedScopes)) || touchedScopes.some((s) => s !== "user" && s !== "project")) {
10319
+ return fallbackDebug(event, base, MALFORMED_MEMORY_CHANGED);
10320
+ }
10321
+ return [
10322
+ {
10323
+ ...base,
10324
+ type: "workspace.memory.changed",
10325
+ scope,
10326
+ source,
10327
+ taskId,
10328
+ touchedScopes
10329
+ }
10330
+ ];
10331
+ }
10332
+ const filePath = getString2(event.data, "filePath");
10333
+ const mode = getString2(event.data, "mode");
10334
+ const bytesWritten = numberField(
10335
+ isRecord2(event.data) ? event.data : void 0,
10336
+ "bytesWritten"
10337
+ );
10338
+ if (scope !== "workspace" && scope !== "global" || !filePath || mode !== "append" && mode !== "replace" || bytesWritten === void 0) {
10339
+ return fallbackDebug(event, base, MALFORMED_MEMORY_CHANGED);
9891
10340
  }
9892
- const expiresAt = numberField(event.data, "expiresAt");
9893
- const accountAlias = getString2(event.data, "accountAlias");
9894
10341
  return [
9895
10342
  {
9896
10343
  ...base,
9897
- type: "auth.device_flow.authorized",
9898
- deviceFlowId,
9899
- providerId,
9900
- ...expiresAt !== void 0 ? { expiresAt } : {},
9901
- ...accountAlias ? { accountAlias } : {}
10344
+ type: "workspace.memory.changed",
10345
+ scope,
10346
+ filePath,
10347
+ mode,
10348
+ bytesWritten
9902
10349
  }
9903
10350
  ];
9904
10351
  }
9905
- __name(normalizeAuthDeviceFlowAuthorized, "normalizeAuthDeviceFlowAuthorized");
9906
- function normalizeAuthDeviceFlowFailed(event, base) {
9907
- const deviceFlowId = getString2(event.data, "deviceFlowId");
9908
- const errorKind = getString2(event.data, "errorKind");
9909
- if (!deviceFlowId || !isDeviceFlowErrorKind(errorKind)) {
9910
- return fallbackDebug(
9911
- event,
9912
- base,
9913
- "malformed auth_device_flow_failed payload"
9914
- );
10352
+ __name(normalizeMemoryChanged, "normalizeMemoryChanged");
10353
+ function normalizeAgentChanged(event, base) {
10354
+ const change = getString2(event.data, "change");
10355
+ const name = getString2(event.data, "name");
10356
+ const level = getString2(event.data, "level");
10357
+ if (change !== "created" && change !== "updated" && change !== "deleted" || !name || level !== "project" && level !== "user") {
10358
+ return fallbackDebug(event, base, "malformed agent_changed payload");
9915
10359
  }
9916
- const hint = getString2(event.data, "hint");
9917
10360
  return [
9918
10361
  {
9919
10362
  ...base,
9920
- type: "auth.device_flow.failed",
9921
- deviceFlowId,
9922
- errorKind,
9923
- ...hint ? { hint } : {}
10363
+ type: "workspace.agent.changed",
10364
+ change,
10365
+ name,
10366
+ level
9924
10367
  }
9925
10368
  ];
9926
10369
  }
9927
- __name(normalizeAuthDeviceFlowFailed, "normalizeAuthDeviceFlowFailed");
9928
- function isDeviceFlowErrorKind(value) {
9929
- return typeof value === "string" && value.trim().length > 0;
9930
- }
9931
- __name(isDeviceFlowErrorKind, "isDeviceFlowErrorKind");
9932
- function normalizeAuthDeviceFlowCancelled(event, base) {
9933
- const deviceFlowId = getString2(event.data, "deviceFlowId");
9934
- if (!deviceFlowId) {
9935
- return fallbackDebug(
9936
- event,
9937
- base,
9938
- "malformed auth_device_flow_cancelled payload"
9939
- );
9940
- }
9941
- return [{ ...base, type: "auth.device_flow.cancelled", deviceFlowId }];
9942
- }
9943
- __name(normalizeAuthDeviceFlowCancelled, "normalizeAuthDeviceFlowCancelled");
9944
- function numberField(value, key) {
9945
- if (!isRecord2(value)) return void 0;
9946
- const v = value[key];
9947
- return typeof v === "number" && Number.isFinite(v) ? v : void 0;
9948
- }
9949
- __name(numberField, "numberField");
9950
- function stringField(value, key) {
9951
- if (!isRecord2(value)) return void 0;
9952
- const v = value[key];
9953
- return typeof v === "string" && v.length > 0 ? v : void 0;
9954
- }
9955
- __name(stringField, "stringField");
9956
-
9957
- // packages/sdk-typescript/src/daemon/ui/toolPreview.ts
9958
- init_esbuild_shims();
9959
- var MAX_TOOL_PREVIEW_DEPTH = 8;
9960
- function createDaemonToolPreview(input, opts = {}, depth = 0) {
9961
- if (depth > MAX_TOOL_PREVIEW_DEPTH) {
9962
- const summary2 = opts.title ?? opts.toolName ?? opts.toolKind;
9963
- return { kind: "generic", ...summary2 ? { summary: summary2 } : {} };
10370
+ __name(normalizeAgentChanged, "normalizeAgentChanged");
10371
+ function normalizeToolToggled(event, base) {
10372
+ const toolName = getString2(event.data, "toolName");
10373
+ const enabled = isRecord2(event.data) && typeof event.data["enabled"] === "boolean" ? event.data["enabled"] : void 0;
10374
+ if (!toolName || enabled === void 0) {
10375
+ return fallbackDebug(event, base, "malformed tool_toggled payload");
9964
10376
  }
9965
- if (isRecord2(input)) {
9966
- const nestedInput = input["rawInput"] ?? input["input"] ?? input["args"];
9967
- if (nestedInput !== void 0 && nestedInput !== input) {
9968
- const meta = isRecord2(input["_meta"]) ? input["_meta"] : void 0;
9969
- const nested = createDaemonToolPreview(
9970
- nestedInput,
9971
- {
9972
- title: opts.title ?? getFirstString(input, ["title"]),
9973
- toolName: opts.toolName ?? getFirstString(input, ["toolName", "name"]) ?? (meta ? getFirstString(meta, ["toolName"]) : void 0),
9974
- toolKind: opts.toolKind ?? getFirstString(input, ["kind"])
9975
- },
9976
- depth + 1
9977
- );
9978
- if (nested.kind !== "generic" || !nested.summary) return nested;
10377
+ return [
10378
+ {
10379
+ ...base,
10380
+ type: "workspace.tool.toggled",
10381
+ toolName,
10382
+ enabled
9979
10383
  }
10384
+ ];
10385
+ }
10386
+ __name(normalizeToolToggled, "normalizeToolToggled");
10387
+ function normalizeSettingsChanged(event, base) {
10388
+ const key = getString2(event.data, "key");
10389
+ const scope = getString2(event.data, "scope");
10390
+ if (!key) {
10391
+ return fallbackDebug(event, base, "malformed settings_changed payload");
9980
10392
  }
9981
- const askUserQuestions = extractAskUserQuestions(input);
9982
- if (askUserQuestions.length > 0) {
9983
- return { kind: "ask_user_question", questions: askUserQuestions };
9984
- }
9985
- const mcpPreview = detectMcpInvocation(input, opts);
9986
- if (mcpPreview) return mcpPreview;
9987
- const subagent = detectSubagentDelegation(input, opts);
9988
- if (subagent) return subagent;
9989
- const search = detectSearch(input, opts);
9990
- if (search) return search;
9991
- const imageGeneration = detectImageGeneration(input, opts);
9992
- if (imageGeneration) return imageGeneration;
9993
- const fileDiff = detectFileDiff(input, opts);
9994
- if (fileDiff) return fileDiff;
9995
- const fileRead = detectFileRead(input, opts);
9996
- if (fileRead) return fileRead;
9997
- const webFetch = detectWebFetch(input);
9998
- if (webFetch) return webFetch;
9999
- const codeBlock = detectCodeBlock(input, opts);
10000
- if (codeBlock) return codeBlock;
10001
- const tabular = detectTabular(input);
10002
- if (tabular) return tabular;
10003
- if (isRecord2(input)) {
10004
- const command = getFirstString(input, ["command", "cmd"]);
10005
- if (command) {
10006
- const cwd = getFirstString(input, [
10007
- "cwd",
10008
- "directory",
10009
- "workingDirectory"
10010
- ]);
10011
- return { kind: "command", command, ...cwd ? { cwd } : {} };
10012
- }
10013
- const rows = collectPreviewRows(input);
10014
- if (rows.length > 0) {
10015
- return { kind: "key_value", rows };
10393
+ const mutation = isSettingsChangedData(event.data) && event.data.mutation;
10394
+ return [
10395
+ {
10396
+ ...base,
10397
+ type: "workspace.settings.changed",
10398
+ key,
10399
+ scope: scope ?? "workspace",
10400
+ value: isRecord2(event.data) ? event.data["value"] : void 0,
10401
+ ...mutation ? { mutation } : {}
10016
10402
  }
10017
- }
10018
- const summary = opts.title ?? opts.toolName ?? opts.toolKind;
10019
- return { kind: "generic", ...summary ? { summary } : {} };
10020
- }
10021
- __name(createDaemonToolPreview, "createDaemonToolPreview");
10022
- function detectFileDiff(input, opts = {}) {
10023
- if (!isRecord2(input)) return void 0;
10024
- const path = getFirstString(input, [
10025
- "path",
10026
- "filePath",
10027
- "file_path",
10028
- "absolutePath"
10029
- ]);
10030
- if (!path) return void 0;
10031
- const oldText = getFirstString(input, [
10032
- "oldText",
10033
- "old_text",
10034
- "old_string",
10035
- "old_str",
10036
- "oldString"
10037
- ]);
10038
- const explicitNewText = getFirstString(input, [
10039
- "newText",
10040
- "new_text",
10041
- "new_string",
10042
- "new_str",
10043
- "newString"
10044
- ]);
10045
- const toolNameLower = (opts.toolName ?? "").toLowerCase();
10046
- const writeIntent = /(?:^|[_-])(write|create|edit|replace|save|update|overwrite|modify|patch|generate)(?:$|[_-])/.test(
10047
- toolNameLower
10048
- ) || !!oldText;
10049
- const contentField = explicitNewText === void 0 && writeIntent ? getFirstString(input, ["content"]) : void 0;
10050
- const newText = explicitNewText ?? contentField;
10051
- const patch = getFirstString(input, ["patch", "diff", "unified_diff"]);
10052
- if (!oldText && !newText && !patch) return void 0;
10053
- return {
10054
- kind: "file_diff",
10055
- path,
10056
- ...oldText ? { oldText } : {},
10057
- ...newText ? { newText } : {},
10058
- ...patch ? { patch } : {}
10059
- };
10403
+ ];
10060
10404
  }
10061
- __name(detectFileDiff, "detectFileDiff");
10062
- function detectFileRead(input, opts) {
10063
- if (!isRecord2(input)) return void 0;
10064
- const path = getFirstString(input, [
10065
- "path",
10066
- "filePath",
10067
- "file_path",
10068
- "absolutePath"
10069
- ]);
10070
- if (!path) return void 0;
10071
- const toolName = opts.toolName ?? getFirstString(input, ["toolName", "name"]);
10072
- const looksLikeRead = toolName !== void 0 && /read|view|cat/i.test(toolName);
10073
- const rangeArr = input["lineRange"] ?? input["line_range"] ?? input["range"];
10074
- let range;
10075
- if (Array.isArray(rangeArr) && rangeArr.length === 2 && typeof rangeArr[0] === "number" && typeof rangeArr[1] === "number") {
10076
- range = [rangeArr[0], rangeArr[1]];
10077
- } else {
10078
- const offset = input["offset"];
10079
- const limit = input["limit"];
10080
- if (typeof offset === "number" && typeof limit === "number" && limit > 0) {
10081
- range = [offset + 1, offset + limit];
10405
+ __name(normalizeSettingsChanged, "normalizeSettingsChanged");
10406
+ function normalizeSettingsReloaded(event, base) {
10407
+ if (!isRecord2(event.data)) {
10408
+ return fallbackDebug(event, base, "malformed settings_reloaded payload");
10409
+ }
10410
+ return [
10411
+ {
10412
+ ...base,
10413
+ type: "workspace.settings.changed",
10414
+ key: "settings_reloaded",
10415
+ scope: "workspace",
10416
+ value: event.data
10082
10417
  }
10418
+ ];
10419
+ }
10420
+ __name(normalizeSettingsReloaded, "normalizeSettingsReloaded");
10421
+ function normalizeWorkspaceInitialized(event, base) {
10422
+ const path = getString2(event.data, "path");
10423
+ const action = getString2(event.data, "action");
10424
+ if (!path || action !== "created" && action !== "overwrote" && action !== "noop") {
10425
+ return fallbackDebug(
10426
+ event,
10427
+ base,
10428
+ "malformed workspace_initialized payload"
10429
+ );
10083
10430
  }
10084
- if (!looksLikeRead && !range) return void 0;
10085
- return {
10086
- kind: "file_read",
10087
- path,
10088
- ...range ? { range } : {}
10089
- };
10431
+ return [{ ...base, type: "workspace.initialized", path, action }];
10090
10432
  }
10091
- __name(detectFileRead, "detectFileRead");
10092
- function detectWebFetch(input) {
10093
- if (!isRecord2(input)) return void 0;
10094
- const url = getFirstString(input, ["url", "uri", "href"]);
10095
- if (!url) return void 0;
10096
- if (!/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(url)) return void 0;
10097
- const method = getFirstString(input, ["method", "httpMethod"]);
10098
- return {
10099
- kind: "web_fetch",
10100
- url,
10101
- ...method ? { method } : {}
10102
- };
10433
+ __name(normalizeWorkspaceInitialized, "normalizeWorkspaceInitialized");
10434
+ function normalizeTrustChangeRequested(event, base) {
10435
+ const workspaceCwd = getString2(event.data, "workspaceCwd");
10436
+ const desiredState = getString2(event.data, "desiredState");
10437
+ const reason = getString2(event.data, "reason");
10438
+ if (!workspaceCwd || desiredState !== "trusted" && desiredState !== "untrusted") {
10439
+ return fallbackDebug(event, base, "bad trust_change_requested payload");
10440
+ }
10441
+ return [
10442
+ {
10443
+ ...base,
10444
+ type: "workspace.trust.change.requested",
10445
+ workspaceCwd,
10446
+ desiredState,
10447
+ ...reason !== void 0 ? { reason } : {}
10448
+ }
10449
+ ];
10103
10450
  }
10104
- __name(detectWebFetch, "detectWebFetch");
10105
- function detectMcpInvocation(input, opts) {
10106
- const toolName = opts.toolName ?? (isRecord2(input) ? getFirstString(input, ["toolName", "name"]) : void 0);
10107
- if (!toolName || !toolName.startsWith("mcp__")) return void 0;
10108
- const rest = toolName.slice("mcp__".length);
10109
- const sep = rest.indexOf("__");
10110
- if (sep <= 0) return void 0;
10111
- const serverId = rest.slice(0, sep);
10112
- const toolPart = rest.slice(sep + 2);
10113
- let argsSummary;
10114
- if (isRecord2(input)) {
10115
- const args = input["arguments"] ?? input["args"] ?? input;
10116
- if (isRecord2(args)) {
10117
- const firstEntry = Object.entries(args).filter(([key]) => key !== "name" && key !== "toolName").slice(0, 1).map(([key, value]) => {
10118
- const v = typeof value === "string" ? value : JSON.stringify(value);
10119
- const trimmed = v.length > 60 ? `${v.slice(0, 60)}\u2026` : v;
10120
- return `${key}=${trimmed}`;
10121
- })[0];
10122
- if (firstEntry) argsSummary = firstEntry;
10451
+ __name(normalizeTrustChangeRequested, "normalizeTrustChangeRequested");
10452
+ function normalizeGithubSetupCompleted(event, base) {
10453
+ const releaseTag = getString2(event.data, "releaseTag");
10454
+ const readmeUrl = getString2(event.data, "readmeUrl");
10455
+ if (!releaseTag || !readmeUrl || !isRecord2(event.data)) {
10456
+ return fallbackDebug(
10457
+ event,
10458
+ base,
10459
+ "malformed github_setup_completed payload"
10460
+ );
10461
+ }
10462
+ const workflows = event.data["workflows"];
10463
+ const warnings = event.data["warnings"];
10464
+ return [
10465
+ {
10466
+ ...base,
10467
+ type: "workspace.github.setup.completed",
10468
+ releaseTag,
10469
+ readmeUrl,
10470
+ ...typeof event.data["secretsUrl"] === "string" ? { secretsUrl: event.data["secretsUrl"] } : {},
10471
+ workflows: Array.isArray(workflows) ? workflows : [],
10472
+ gitignore: event.data["gitignore"],
10473
+ warnings: Array.isArray(warnings) ? warnings.filter(
10474
+ (warning) => typeof warning === "string"
10475
+ ) : []
10123
10476
  }
10477
+ ];
10478
+ }
10479
+ __name(normalizeGithubSetupCompleted, "normalizeGithubSetupCompleted");
10480
+ function normalizeMcpBudgetWarning(event, base) {
10481
+ if (!isRecord2(event.data)) {
10482
+ return fallbackDebug(event, base, "non-object payload");
10124
10483
  }
10125
- return {
10126
- kind: "mcp_invocation",
10127
- serverId,
10128
- toolName: toolPart,
10129
- ...argsSummary ? { argsSummary } : {}
10130
- };
10484
+ const liveCount = numberField(event.data, "liveCount");
10485
+ const reservedCount = numberField(event.data, "reservedCount");
10486
+ const budget = numberField(event.data, "budget");
10487
+ const thresholdRatio = numberField(event.data, "thresholdRatio");
10488
+ const mode = getString2(event.data, "mode");
10489
+ if (liveCount === void 0 || reservedCount === void 0 || budget === void 0 || thresholdRatio === void 0 || mode !== "warn" && mode !== "enforce") {
10490
+ return fallbackDebug(event, base, "malformed mcp_budget_warning payload");
10491
+ }
10492
+ return [
10493
+ {
10494
+ ...base,
10495
+ type: "workspace.mcp.budget_warning",
10496
+ liveCount,
10497
+ reservedCount,
10498
+ budget,
10499
+ thresholdRatio,
10500
+ mode
10501
+ }
10502
+ ];
10131
10503
  }
10132
- __name(detectMcpInvocation, "detectMcpInvocation");
10133
- function extractAskUserQuestions(input) {
10134
- if (!isRecord2(input) || !Array.isArray(input["questions"])) return [];
10135
- return input["questions"].filter(isRecord2).map((question) => {
10136
- const header = getFirstString(question, ["header", "title", "label"]);
10137
- const prompt = getFirstString(question, ["question", "prompt", "text"]) ?? "Question";
10138
- const options = Array.isArray(question["options"]) ? question["options"].filter(isRecord2).map(normalizeQuestionOption) : [];
10504
+ __name(normalizeMcpBudgetWarning, "normalizeMcpBudgetWarning");
10505
+ function normalizeMcpChildRefused(event, base) {
10506
+ if (!isRecord2(event.data)) {
10507
+ return fallbackDebug(event, base, "non-object payload");
10508
+ }
10509
+ const refusedServers = Array.isArray(event.data["refusedServers"]) ? event.data["refusedServers"].filter(isRecord2).map((s) => {
10510
+ const name = getString2(s, "name");
10511
+ const transport = getString2(s, "transport");
10512
+ const reason = getString2(s, "reason");
10513
+ if (!name || !transport || reason !== "budget_exhausted") return null;
10139
10514
  return {
10140
- ...header ? { header } : {},
10141
- question: prompt,
10142
- options,
10143
- raw: question
10515
+ name,
10516
+ transport,
10517
+ reason: "budget_exhausted"
10144
10518
  };
10145
- });
10146
- }
10147
- __name(extractAskUserQuestions, "extractAskUserQuestions");
10148
- function normalizeQuestionOption(option) {
10149
- const label = getFirstString(option, ["label", "title", "value"]) ?? "Option";
10150
- const description = getFirstString(option, ["description", "detail", "text"]);
10151
- return {
10152
- label,
10153
- ...description ? { description } : {},
10154
- raw: option
10155
- };
10156
- }
10157
- __name(normalizeQuestionOption, "normalizeQuestionOption");
10158
- function collectPreviewRows(input) {
10159
- const rows = [];
10160
- const candidates = [
10161
- ["Path", ["path", "filePath", "file_path", "absolutePath"]],
10162
- ["Cwd", ["cwd", "directory", "workingDirectory"]],
10163
- ["Query", ["query", "pattern", "search"]],
10164
- ["Note", ["description", "reason"]]
10519
+ }).filter(
10520
+ (v) => v !== null
10521
+ ) : [];
10522
+ const budget = numberField(event.data, "budget");
10523
+ const liveCount = numberField(event.data, "liveCount");
10524
+ const reservedCount = numberField(event.data, "reservedCount");
10525
+ if (refusedServers.length === 0 || budget === void 0 || liveCount === void 0 || reservedCount === void 0) {
10526
+ return fallbackDebug(
10527
+ event,
10528
+ base,
10529
+ "malformed mcp_child_refused_batch payload"
10530
+ );
10531
+ }
10532
+ return [
10533
+ {
10534
+ ...base,
10535
+ type: "workspace.mcp.child_refused",
10536
+ refusedServers,
10537
+ budget,
10538
+ liveCount,
10539
+ reservedCount
10540
+ }
10165
10541
  ];
10166
- for (const [label, keys] of candidates) {
10167
- const value = getFirstString(input, keys);
10168
- if (value) rows.push({ label, value });
10542
+ }
10543
+ __name(normalizeMcpChildRefused, "normalizeMcpChildRefused");
10544
+ function normalizeMcpServerRestarted(event, base) {
10545
+ const serverName = getString2(event.data, "serverName");
10546
+ const durationMs = numberField(event.data, "durationMs");
10547
+ if (!serverName || durationMs === void 0) {
10548
+ return fallbackDebug(event, base, "malformed mcp_server_restarted payload");
10169
10549
  }
10170
- if (rows.length > 0) return rows;
10171
- for (const [key, value] of Object.entries(input).slice(0, 4)) {
10172
- if (value === void 0 || value === null || Array.isArray(value)) continue;
10173
- if (isRecord2(value)) continue;
10174
- rows.push({
10175
- label: key,
10176
- value: isSensitiveKey(key) ? "[redacted]" : capDetails(stringifyRedactedJson(value))
10177
- });
10550
+ return [
10551
+ {
10552
+ ...base,
10553
+ type: "workspace.mcp.server_restarted",
10554
+ serverName,
10555
+ durationMs
10556
+ }
10557
+ ];
10558
+ }
10559
+ __name(normalizeMcpServerRestarted, "normalizeMcpServerRestarted");
10560
+ function normalizeMcpServerRestartRefused(event, base) {
10561
+ const serverName = getString2(event.data, "serverName");
10562
+ const reason = getString2(event.data, "reason");
10563
+ if (!serverName || !reason || !MCP_RESTART_REFUSED_REASONS2.has(reason)) {
10564
+ return fallbackDebug(
10565
+ event,
10566
+ base,
10567
+ "malformed mcp_server_restart_refused payload"
10568
+ );
10178
10569
  }
10179
- return rows;
10570
+ return [
10571
+ {
10572
+ ...base,
10573
+ type: "workspace.mcp.server_restart_refused",
10574
+ serverName,
10575
+ reason
10576
+ }
10577
+ ];
10180
10578
  }
10181
- __name(collectPreviewRows, "collectPreviewRows");
10182
- var MAX_TABULAR_ROWS = 50;
10183
- var MAX_SEARCH_TOP_RESULTS = 5;
10184
- function detectSubagentDelegation(input, opts) {
10185
- const toolName = opts.toolName ?? "";
10186
- const looksLikeDelegate = /^task$/i.test(toolName) || /(?:^|_)(?:delegate|subagent|spawn[_-]?task)$/i.test(toolName) || /agent/i.test(opts.toolKind ?? "");
10187
- if (!looksLikeDelegate) return void 0;
10188
- if (!isRecord2(input)) return void 0;
10189
- const agentName = getFirstString(input, [
10190
- "subagent_type",
10191
- "agent",
10192
- "agentName",
10193
- "agent_name",
10194
- "subagent"
10195
- ]);
10196
- const task = getFirstString(input, [
10197
- "prompt",
10198
- "task",
10199
- "description",
10200
- "instruction",
10201
- "query"
10202
- ]);
10203
- if (!agentName && !task) return void 0;
10204
- const parentDelegationId = getFirstString(input, [
10205
- "parentDelegationId",
10206
- "parent_delegation_id",
10207
- "parent_id"
10208
- ]);
10209
- return {
10210
- kind: "subagent_delegation",
10211
- agentName: agentName ?? "subagent",
10212
- task: task ?? "(no task description)",
10213
- ...parentDelegationId ? { parentDelegationId } : {}
10214
- };
10579
+ __name(normalizeMcpServerRestartRefused, "normalizeMcpServerRestartRefused");
10580
+ function normalizeMcpServerChanged(event, base, fixedAction) {
10581
+ const serverName = getString2(event.data, fixedAction ? "name" : "serverName");
10582
+ const action = fixedAction ?? getString2(event.data, "action");
10583
+ if (!serverName || !action || ![
10584
+ "added",
10585
+ "removed",
10586
+ "approve",
10587
+ "enable",
10588
+ "disable",
10589
+ "authenticate",
10590
+ "clear-auth"
10591
+ ].includes(action)) {
10592
+ return fallbackDebug(event, base, `malformed ${event.type} payload`);
10593
+ }
10594
+ return [
10595
+ {
10596
+ ...base,
10597
+ type: "workspace.mcp.server_changed",
10598
+ serverName,
10599
+ action
10600
+ }
10601
+ ];
10215
10602
  }
10216
- __name(detectSubagentDelegation, "detectSubagentDelegation");
10217
- function detectSearch(input, opts) {
10218
- if (!isRecord2(input)) return void 0;
10219
- const query = getFirstString(input, ["query", "pattern", "search", "q"]);
10220
- if (!query) return void 0;
10221
- const toolName = opts.toolName ?? "";
10222
- const looksLikeSearch = /(grep|search|find|ripgrep|rg|glob|lookup)/i.test(toolName) || typeof input["resultCount"] === "number" || Array.isArray(input["results"]) || Array.isArray(input["matches"]);
10223
- if (!looksLikeSearch) return void 0;
10224
- const resultCount = typeof input["resultCount"] === "number" ? input["resultCount"] : typeof input["total"] === "number" ? input["total"] : Array.isArray(input["results"]) ? input["results"].length : Array.isArray(input["matches"]) ? input["matches"].length : void 0;
10225
- let top;
10226
- const rawResults = input["results"] ?? input["matches"];
10227
- if (Array.isArray(rawResults)) {
10228
- top = rawResults.slice(0, MAX_SEARCH_TOP_RESULTS).map((item) => {
10229
- if (typeof item === "string") return item;
10230
- if (isRecord2(item)) {
10231
- return getFirstString(item, ["path", "file", "name", "title", "text"]) ?? stringifyJson(item).slice(0, 120);
10232
- }
10233
- return String(item);
10234
- }).filter(Boolean);
10235
- if (top.length === 0) top = void 0;
10603
+ __name(normalizeMcpServerChanged, "normalizeMcpServerChanged");
10604
+ function normalizeExtensionsChanged(event, base) {
10605
+ const refreshed = numberField(event.data, "refreshed");
10606
+ const failed = numberField(event.data, "failed");
10607
+ const status = getString2(event.data, "status");
10608
+ const source = getString2(event.data, "source");
10609
+ const name = getString2(event.data, "name");
10610
+ const version = getString2(event.data, "version");
10611
+ const error = getString2(event.data, "error");
10612
+ if (refreshed === void 0 || failed === void 0) {
10613
+ return fallbackDebug(event, base, "malformed extensions_changed payload");
10236
10614
  }
10237
- return {
10238
- kind: "search",
10239
- query,
10240
- ...resultCount !== void 0 ? { resultCount } : {},
10241
- ...top ? { top } : {}
10242
- };
10615
+ if (status !== void 0 && status !== "installed" && status !== "enabled" && status !== "disabled" && status !== "updated" && status !== "uninstalled" && status !== "failed") {
10616
+ return fallbackDebug(event, base, "malformed extensions_changed payload");
10617
+ }
10618
+ return [
10619
+ {
10620
+ ...base,
10621
+ type: "workspace.extensions.changed",
10622
+ refreshed,
10623
+ failed,
10624
+ ...status ? { status } : {},
10625
+ ...source ? { source } : {},
10626
+ ...name ? { name } : {},
10627
+ ...version ? { version } : {},
10628
+ ...error ? { error } : {}
10629
+ }
10630
+ ];
10243
10631
  }
10244
- __name(detectSearch, "detectSearch");
10245
- function detectImageGeneration(input, opts) {
10246
- const toolName = opts.toolName ?? "";
10247
- const looksLikeImageGen = /(image[_-]?gen|generate[_-]?image|diffusion|dalle|imagen|flux|stable[_-]?diffusion|midjourney|sora)/i.test(
10248
- toolName
10249
- );
10250
- if (!looksLikeImageGen) return void 0;
10251
- if (!isRecord2(input)) return void 0;
10252
- const prompt = getFirstString(input, ["prompt", "description", "query"]);
10253
- if (!prompt) return void 0;
10254
- const thumbnailUrl = getFirstString(input, [
10255
- "thumbnailUrl",
10256
- "thumbnail",
10257
- "url",
10258
- "imageUrl",
10259
- "preview"
10260
- ]);
10261
- const model = getFirstString(input, ["model", "modelId", "model_name"]);
10262
- return {
10263
- kind: "image_generation",
10264
- prompt,
10265
- ...thumbnailUrl ? { thumbnailUrl } : {},
10266
- ...model ? { model } : {}
10267
- };
10632
+ __name(normalizeExtensionsChanged, "normalizeExtensionsChanged");
10633
+ function normalizeAuthDeviceFlowStarted(event, base) {
10634
+ const deviceFlowId = getString2(event.data, "deviceFlowId");
10635
+ const providerId = getString2(event.data, "providerId");
10636
+ const expiresAt = numberField(event.data, "expiresAt");
10637
+ if (!deviceFlowId || !providerId || !DEVICE_FLOW_PROVIDER_SET.has(providerId) || expiresAt === void 0) {
10638
+ return fallbackDebug(
10639
+ event,
10640
+ base,
10641
+ "malformed auth_device_flow_started payload"
10642
+ );
10643
+ }
10644
+ return [
10645
+ {
10646
+ ...base,
10647
+ type: "auth.device_flow.started",
10648
+ deviceFlowId,
10649
+ providerId,
10650
+ expiresAt
10651
+ }
10652
+ ];
10268
10653
  }
10269
- __name(detectImageGeneration, "detectImageGeneration");
10270
- function detectCodeBlock(input, opts) {
10271
- if (!isRecord2(input)) return void 0;
10272
- const code = getFirstString(input, ["code", "snippet", "source"]);
10273
- if (!code) return void 0;
10274
- const language = getFirstString(input, [
10275
- "language",
10276
- "lang",
10277
- "codeLanguage",
10278
- "syntax"
10279
- ]);
10280
- const toolName = opts.toolName ?? "";
10281
- const codeTool = /(repl|format|prettier|eslint|tsc|compile|exec[_-]?code)/i.test(toolName);
10282
- if (!language && !codeTool) return void 0;
10283
- const origin = getFirstString(input, ["origin", "source_location", "path"]);
10284
- return {
10285
- kind: "code_block",
10286
- code,
10287
- ...language ? { language } : {},
10288
- ...origin ? { origin } : {}
10289
- };
10654
+ __name(normalizeAuthDeviceFlowStarted, "normalizeAuthDeviceFlowStarted");
10655
+ function normalizeAuthDeviceFlowThrottled(event, base) {
10656
+ const deviceFlowId = getString2(event.data, "deviceFlowId");
10657
+ const intervalMs = numberField(event.data, "intervalMs");
10658
+ if (!deviceFlowId || intervalMs === void 0) {
10659
+ return fallbackDebug(
10660
+ event,
10661
+ base,
10662
+ "malformed auth_device_flow_throttled payload"
10663
+ );
10664
+ }
10665
+ return [
10666
+ {
10667
+ ...base,
10668
+ type: "auth.device_flow.throttled",
10669
+ deviceFlowId,
10670
+ intervalMs
10671
+ }
10672
+ ];
10290
10673
  }
10291
- __name(detectCodeBlock, "detectCodeBlock");
10292
- function detectTabular(input) {
10293
- if (!isRecord2(input)) return void 0;
10294
- const explicitColumns = input["columns"];
10295
- const explicitRows = input["rows"];
10296
- if (Array.isArray(explicitColumns) && Array.isArray(explicitRows)) {
10297
- const columns = explicitColumns.filter((c) => typeof c === "string").slice(0, 30);
10298
- if (columns.length === 0) return void 0;
10299
- const rows = explicitRows.slice(0, MAX_TABULAR_ROWS).map(
10300
- (row) => Array.isArray(row) ? row.map(
10301
- (cell) => typeof cell === "string" ? cell : stringifyJson(cell).slice(0, 80)
10302
- ) : []
10674
+ __name(normalizeAuthDeviceFlowThrottled, "normalizeAuthDeviceFlowThrottled");
10675
+ function normalizeAuthDeviceFlowAuthorized(event, base) {
10676
+ const deviceFlowId = getString2(event.data, "deviceFlowId");
10677
+ const providerId = getString2(event.data, "providerId");
10678
+ if (!deviceFlowId || !providerId || !DEVICE_FLOW_PROVIDER_SET.has(providerId)) {
10679
+ return fallbackDebug(
10680
+ event,
10681
+ base,
10682
+ "malformed auth_device_flow_authorized payload"
10303
10683
  );
10304
- return {
10305
- kind: "tabular",
10306
- columns,
10307
- rows,
10308
- ...explicitRows.length > rows.length ? { totalRows: explicitRows.length } : {}
10309
- };
10310
10684
  }
10311
- const data = input["data"] ?? input["records"];
10312
- if (Array.isArray(data) && data.length > 0 && isRecord2(data[0])) {
10313
- const columns = Object.keys(data[0]).slice(
10314
- 0,
10315
- 30
10685
+ const expiresAt = numberField(event.data, "expiresAt");
10686
+ const accountAlias = getString2(event.data, "accountAlias");
10687
+ return [
10688
+ {
10689
+ ...base,
10690
+ type: "auth.device_flow.authorized",
10691
+ deviceFlowId,
10692
+ providerId,
10693
+ ...expiresAt !== void 0 ? { expiresAt } : {},
10694
+ ...accountAlias ? { accountAlias } : {}
10695
+ }
10696
+ ];
10697
+ }
10698
+ __name(normalizeAuthDeviceFlowAuthorized, "normalizeAuthDeviceFlowAuthorized");
10699
+ function normalizeAuthDeviceFlowFailed(event, base) {
10700
+ const deviceFlowId = getString2(event.data, "deviceFlowId");
10701
+ const errorKind = getString2(event.data, "errorKind");
10702
+ if (!deviceFlowId || !isDeviceFlowErrorKind(errorKind)) {
10703
+ return fallbackDebug(
10704
+ event,
10705
+ base,
10706
+ "malformed auth_device_flow_failed payload"
10316
10707
  );
10317
- if (columns.length === 0) return void 0;
10318
- const rows = data.slice(0, MAX_TABULAR_ROWS).map((row) => {
10319
- const r = row;
10320
- return columns.map((col) => {
10321
- const v = r[col];
10322
- return typeof v === "string" ? v : stringifyJson(v).slice(0, 80);
10323
- });
10324
- });
10325
- return {
10326
- kind: "tabular",
10327
- columns,
10328
- rows,
10329
- ...data.length > rows.length ? { totalRows: data.length } : {}
10330
- };
10331
10708
  }
10332
- return void 0;
10709
+ const hint = getString2(event.data, "hint");
10710
+ return [
10711
+ {
10712
+ ...base,
10713
+ type: "auth.device_flow.failed",
10714
+ deviceFlowId,
10715
+ errorKind,
10716
+ ...hint ? { hint } : {}
10717
+ }
10718
+ ];
10333
10719
  }
10334
- __name(detectTabular, "detectTabular");
10720
+ __name(normalizeAuthDeviceFlowFailed, "normalizeAuthDeviceFlowFailed");
10721
+ function isDeviceFlowErrorKind(value) {
10722
+ return typeof value === "string" && value.trim().length > 0;
10723
+ }
10724
+ __name(isDeviceFlowErrorKind, "isDeviceFlowErrorKind");
10725
+ function normalizeAuthDeviceFlowCancelled(event, base) {
10726
+ const deviceFlowId = getString2(event.data, "deviceFlowId");
10727
+ if (!deviceFlowId) {
10728
+ return fallbackDebug(
10729
+ event,
10730
+ base,
10731
+ "malformed auth_device_flow_cancelled payload"
10732
+ );
10733
+ }
10734
+ return [{ ...base, type: "auth.device_flow.cancelled", deviceFlowId }];
10735
+ }
10736
+ __name(normalizeAuthDeviceFlowCancelled, "normalizeAuthDeviceFlowCancelled");
10737
+ function numberField(value, key) {
10738
+ if (!isRecord2(value)) return void 0;
10739
+ const v = value[key];
10740
+ return typeof v === "number" && Number.isFinite(v) ? v : void 0;
10741
+ }
10742
+ __name(numberField, "numberField");
10743
+ function stringField(value, key) {
10744
+ if (!isRecord2(value)) return void 0;
10745
+ const v = value[key];
10746
+ return typeof v === "string" && v.length > 0 ? v : void 0;
10747
+ }
10748
+ __name(stringField, "stringField");
10335
10749
 
10336
10750
  // packages/sdk-typescript/src/daemon/ui/transcript.ts
10337
10751
  init_esbuild_shims();
@@ -10447,6 +10861,15 @@ function reduceDaemonTranscriptEvents(state, events, opts = {}) {
10447
10861
  return result;
10448
10862
  }
10449
10863
  __name(reduceDaemonTranscriptEvents, "reduceDaemonTranscriptEvents");
10864
+ function finalizeOfflineDaemonTranscriptState(state) {
10865
+ const next = cloneTranscriptState(state, { now: 0 });
10866
+ finishAssistant(next);
10867
+ next.activeUserBlockId = void 0;
10868
+ Object.freeze(next.blocks);
10869
+ Object.freeze(next.blockIndexById);
10870
+ return next;
10871
+ }
10872
+ __name(finalizeOfflineDaemonTranscriptState, "finalizeOfflineDaemonTranscriptState");
10450
10873
  function rebuildDaemonTranscriptBlockIndex(blocks) {
10451
10874
  const blockIndexById = createIndex();
10452
10875
  blocks.forEach((block, index) => {
@@ -10470,7 +10893,8 @@ function userBlockForAttachment(next, event) {
10470
10893
  event.serverTimestamp,
10471
10894
  event.meta,
10472
10895
  event.sourceRecordIds,
10473
- event.promptId
10896
+ event.promptId,
10897
+ event.segmentId
10474
10898
  );
10475
10899
  appendBlock(next, block);
10476
10900
  next.activeUserBlockId = block.id;
@@ -10508,7 +10932,11 @@ function applyDaemonTranscriptEvent(next, event) {
10508
10932
  if (event.meta) block.meta = { ...block.meta, ...event.meta };
10509
10933
  block.images = [
10510
10934
  ...block.images ?? [],
10511
- { data: event.data, mimeType: event.mimeType }
10935
+ {
10936
+ data: event.data,
10937
+ mimeType: event.mimeType,
10938
+ ...event.attachmentId ? { attachmentId: event.attachmentId } : {}
10939
+ }
10512
10940
  ];
10513
10941
  next.retainedBytes += estimateBlockBytes(block) - bytesBefore;
10514
10942
  break;
@@ -10827,7 +11255,8 @@ function appendTextDelta(state, kind, activeKey, text, event) {
10827
11255
  const effectiveId = parentMap && parentId != null ? parentMap[parentId] : state[activeKey];
10828
11256
  const existing = getWritableBlockById(state, effectiveId);
10829
11257
  if (existing && existing.kind === kind && canMergeTextDelta(existing, event)) {
10830
- existing.text = appendBoundedText(state, existing, text);
11258
+ const separator = kind === "user" && existing.text.length > 0 && text.length > 0 && existing.segmentId !== event.segmentId && !existing.text.endsWith("\n") && !text.startsWith("\n") ? "\n" : "";
11259
+ existing.text = appendBoundedText(state, existing, separator + text);
10831
11260
  existing.updatedAt = state.now;
10832
11261
  if (event.eventId !== void 0) existing.eventId = event.eventId;
10833
11262
  if (event.serverTimestamp !== void 0) {
@@ -10839,6 +11268,9 @@ function appendTextDelta(state, kind, activeKey, text, event) {
10839
11268
  if (existing.promptId === void 0 && event.promptId !== void 0) {
10840
11269
  existing.promptId = event.promptId;
10841
11270
  }
11271
+ if (event.segmentId !== void 0) {
11272
+ existing.segmentId = event.segmentId;
11273
+ }
10842
11274
  if (kind === "assistant" && event.branchRecordId) {
10843
11275
  existing.branchRecordId = event.branchRecordId;
10844
11276
  }
@@ -10857,7 +11289,8 @@ function appendTextDelta(state, kind, activeKey, text, event) {
10857
11289
  event.serverTimestamp,
10858
11290
  "meta" in event ? event.meta : void 0,
10859
11291
  event.sourceRecordIds,
10860
- event.promptId
11292
+ event.promptId,
11293
+ event.segmentId
10861
11294
  );
10862
11295
  if (kind === "assistant" && event.branchRecordId) {
10863
11296
  block.branchRecordId = event.branchRecordId;
@@ -10891,13 +11324,19 @@ function canMergeTextDelta(existing, event) {
10891
11324
  if (existing.kind !== "user" && existing.kind !== "assistant" && existing.kind !== "thought") {
10892
11325
  return false;
10893
11326
  }
10894
- if (existing.meta?.qwenDiscreteMessage === true) return false;
11327
+ const sameRecordedUser = existing.kind === "user" && (existing.sourceRecordIds?.length ?? 0) > 0 && (event.sourceRecordIds?.length ?? 0) > 0;
11328
+ if (!sameRecordedUser && existing.meta?.qwenDiscreteMessage === true) {
11329
+ return false;
11330
+ }
10895
11331
  if (existing.promptId !== void 0 && event.promptId !== void 0 && existing.promptId !== event.promptId)
10896
11332
  return false;
11333
+ if (!sameRecordedUser && existing.segmentId !== event.segmentId) {
11334
+ return false;
11335
+ }
10897
11336
  if (!stringArraysEqual(existing.sourceRecordIds, event.sourceRecordIds)) {
10898
11337
  return false;
10899
11338
  }
10900
- return !("meta" in event) || event.meta?.qwenDiscreteMessage !== true;
11339
+ return sameRecordedUser || !("meta" in event) || event.meta?.qwenDiscreteMessage !== true;
10901
11340
  }
10902
11341
  __name(canMergeTextDelta, "canMergeTextDelta");
10903
11342
  function findFinalVisibleAssistantForPrompt(state, promptId) {
@@ -11005,6 +11444,19 @@ function upsertToolBlock(state, event) {
11005
11444
  }
11006
11445
  }
11007
11446
  existing.rawOutput = rawOutput;
11447
+ if (isBackgroundToolOutput(rawOutput)) existing.background = true;
11448
+ }
11449
+ const resultPreview2 = event.resultPreview ?? createDaemonToolResultPreview(
11450
+ rawOutput ?? existing.rawOutput,
11451
+ event.content ?? existing.content,
11452
+ {
11453
+ toolName: event.toolName ?? existing.toolName,
11454
+ toolKind: event.toolKind ?? existing.toolKind
11455
+ }
11456
+ );
11457
+ if (resultPreview2) existing.resultPreview = resultPreview2;
11458
+ else if (event.resultPreview !== void 0 || rawOutput !== void 0 || event.content !== void 0) {
11459
+ delete existing.resultPreview;
11008
11460
  }
11009
11461
  existing.sourceRecordIds = unionStrings(
11010
11462
  existing.sourceRecordIds,
@@ -11029,6 +11481,10 @@ function upsertToolBlock(state, event) {
11029
11481
  return;
11030
11482
  }
11031
11483
  const parentBlockId = event.parentToolCallId && state.toolBlockByCallId[event.parentToolCallId] !== TRIMMED_TOOL_BLOCK_ID ? state.toolBlockByCallId[event.parentToolCallId] : void 0;
11484
+ const resultPreview = event.resultPreview ?? createDaemonToolResultPreview(rawOutput, event.content, {
11485
+ toolName: event.toolName,
11486
+ toolKind: event.toolKind
11487
+ });
11032
11488
  const block = {
11033
11489
  id: allocateBlockId(state, "tool"),
11034
11490
  kind: "tool",
@@ -11040,12 +11496,15 @@ function upsertToolBlock(state, event) {
11040
11496
  toolName: event.toolName,
11041
11497
  toolKind: event.toolKind
11042
11498
  }),
11499
+ ...resultPreview ? { resultPreview } : {},
11500
+ ...isBackgroundToolOutput(rawOutput) ? { background: true } : {},
11043
11501
  clientReceivedAt: state.now,
11044
11502
  createdAt: state.now,
11045
11503
  updatedAt: state.now,
11046
11504
  ...event.eventId !== void 0 ? { eventId: event.eventId } : {},
11047
11505
  ...event.serverTimestamp !== void 0 ? { serverTimestamp: event.serverTimestamp } : {},
11048
11506
  ...event.sourceRecordIds ? { sourceRecordIds: [...event.sourceRecordIds] } : {},
11507
+ ...event.segmentId ? { segmentId: event.segmentId } : {},
11049
11508
  ...event.details ? { details: event.details } : {},
11050
11509
  ...!compactTaskOutput && event.content !== void 0 ? { content: event.content } : {},
11051
11510
  ...event.locations !== void 0 ? { locations: event.locations } : {},
@@ -11071,6 +11530,10 @@ function upsertToolBlock(state, event) {
11071
11530
  clearActiveText(state, event.parentToolCallId);
11072
11531
  }
11073
11532
  __name(upsertToolBlock, "upsertToolBlock");
11533
+ function isBackgroundToolOutput(value) {
11534
+ return isRecord2(value) && value["status"] === "background";
11535
+ }
11536
+ __name(isBackgroundToolOutput, "isBackgroundToolOutput");
11074
11537
  function discardToolBlock(state, toolCallId) {
11075
11538
  const blockId = state.toolBlockByCallId[toolCallId];
11076
11539
  if (!blockId || blockId === TRIMMED_TOOL_BLOCK_ID) return;
@@ -11157,7 +11620,7 @@ __name(propagateCancellationToInFlightTools, "propagateCancellationToInFlightToo
11157
11620
  function appendShellBlock(state, event) {
11158
11621
  if (!event.text) return;
11159
11622
  const last = state.blocks[state.blocks.length - 1];
11160
- if (last?.kind === "shell" && last.stream === event.stream) {
11623
+ if (last?.kind === "shell" && last.stream === event.stream && last.segmentId === event.segmentId) {
11161
11624
  const writable = getWritableBlockById(state, last.id);
11162
11625
  if (writable?.kind === "shell") {
11163
11626
  writable.text = appendBoundedText(state, writable, event.text);
@@ -11176,6 +11639,7 @@ function appendShellBlock(state, event) {
11176
11639
  updatedAt: state.now,
11177
11640
  ...event.eventId !== void 0 ? { eventId: event.eventId } : {},
11178
11641
  ...event.serverTimestamp !== void 0 ? { serverTimestamp: event.serverTimestamp } : {},
11642
+ ...event.segmentId ? { segmentId: event.segmentId } : {},
11179
11643
  ...event.stream ? { stream: event.stream } : {}
11180
11644
  };
11181
11645
  appendBlock(state, block);
@@ -11185,7 +11649,7 @@ __name(appendShellBlock, "appendShellBlock");
11185
11649
  function appendUserShellBlock(state, event) {
11186
11650
  if (!event.text) return;
11187
11651
  const last = state.blocks[state.blocks.length - 1];
11188
- if (last?.kind === "user_shell" && last.stream === event.stream && !state.pendingUserShellCommand) {
11652
+ if (last?.kind === "user_shell" && last.stream === event.stream && last.segmentId === event.segmentId && !state.pendingUserShellCommand) {
11189
11653
  const writable = getWritableBlockById(state, last.id);
11190
11654
  if (writable?.kind === "user_shell") {
11191
11655
  writable.text = appendBoundedText(state, writable, event.text);
@@ -11208,6 +11672,7 @@ function appendUserShellBlock(state, event) {
11208
11672
  updatedAt: state.now,
11209
11673
  ...event.eventId !== void 0 ? { eventId: event.eventId } : {},
11210
11674
  ...event.serverTimestamp !== void 0 ? { serverTimestamp: event.serverTimestamp } : {},
11675
+ ...event.segmentId ? { segmentId: event.segmentId } : {},
11211
11676
  ...event.stream ? { stream: event.stream } : {}
11212
11677
  };
11213
11678
  state.pendingUserShellCommand = void 0;
@@ -11222,11 +11687,15 @@ function upsertPermissionBlock(state, event) {
11222
11687
  const preview = createDaemonToolPreview(event.toolCall, {
11223
11688
  title: event.title
11224
11689
  });
11690
+ const toolIdentity = getPermissionToolIdentity(event.toolCall);
11225
11691
  if (existing?.kind === "permission") {
11226
11692
  existing.title = event.title;
11227
11693
  existing.options = event.options.map((option) => ({ ...option }));
11228
11694
  existing.toolCall = event.toolCall;
11229
11695
  existing.preview = preview;
11696
+ if (toolIdentity.toolCallId) existing.toolCallId = toolIdentity.toolCallId;
11697
+ if (toolIdentity.toolName) existing.toolName = toolIdentity.toolName;
11698
+ if (toolIdentity.toolKind) existing.toolKind = toolIdentity.toolKind;
11230
11699
  existing.updatedAt = state.now;
11231
11700
  if (event.eventId !== void 0) existing.eventId = event.eventId;
11232
11701
  return;
@@ -11238,11 +11707,13 @@ function upsertPermissionBlock(state, event) {
11238
11707
  title: event.title,
11239
11708
  options: event.options.map((option) => ({ ...option })),
11240
11709
  preview,
11710
+ ...toolIdentity,
11241
11711
  clientReceivedAt: state.now,
11242
11712
  createdAt: state.now,
11243
11713
  updatedAt: state.now,
11244
11714
  ...event.eventId !== void 0 ? { eventId: event.eventId } : {},
11245
11715
  ...event.serverTimestamp !== void 0 ? { serverTimestamp: event.serverTimestamp } : {},
11716
+ ...event.segmentId ? { segmentId: event.segmentId } : {},
11246
11717
  ...event.sessionId ? { sessionId: event.sessionId } : {},
11247
11718
  ...event.toolCall !== void 0 ? { toolCall: event.toolCall } : {}
11248
11719
  };
@@ -11275,7 +11746,8 @@ function resolvePermissionBlock(state, event) {
11275
11746
  createdAt: state.now,
11276
11747
  updatedAt: state.now,
11277
11748
  ...event.eventId !== void 0 ? { eventId: event.eventId } : {},
11278
- ...event.serverTimestamp !== void 0 ? { serverTimestamp: event.serverTimestamp } : {}
11749
+ ...event.serverTimestamp !== void 0 ? { serverTimestamp: event.serverTimestamp } : {},
11750
+ ...event.segmentId ? { segmentId: event.segmentId } : {}
11279
11751
  };
11280
11752
  appendBlock(state, block);
11281
11753
  state.permissionBlockByRequestId[event.requestId] = block.id;
@@ -11314,6 +11786,7 @@ function appendStatusBlock(state, kind, text, event, opts = {}) {
11314
11786
  updatedAt: state.now,
11315
11787
  ...event?.eventId !== void 0 ? { eventId: event.eventId } : {},
11316
11788
  ...event?.serverTimestamp !== void 0 ? { serverTimestamp: event.serverTimestamp } : {},
11789
+ ...event?.segmentId ? { segmentId: event.segmentId } : {},
11317
11790
  ...event?.type === "error" && event.code ? { code: event.code } : {},
11318
11791
  ...event?.type === "error" && event.promptId ? { promptId: event.promptId } : {},
11319
11792
  ...event?.type === "error" && event.errorKind ? { errorKind: event.errorKind } : {},
@@ -11344,13 +11817,14 @@ function appendPromptCancelledBlock(state, event) {
11344
11817
  updatedAt: state.now,
11345
11818
  ...event.reason ? { reason: event.reason } : {},
11346
11819
  ...event.eventId !== void 0 ? { eventId: event.eventId } : {},
11347
- ...event.serverTimestamp !== void 0 ? { serverTimestamp: event.serverTimestamp } : {}
11820
+ ...event.serverTimestamp !== void 0 ? { serverTimestamp: event.serverTimestamp } : {},
11821
+ ...event.segmentId ? { segmentId: event.segmentId } : {}
11348
11822
  };
11349
11823
  appendBlock(state, block);
11350
11824
  clearActiveText(state);
11351
11825
  }
11352
11826
  __name(appendPromptCancelledBlock, "appendPromptCancelledBlock");
11353
- function createTextBlock(state, kind, text, eventId, serverTimestamp, meta, sourceRecordIds, promptId) {
11827
+ function createTextBlock(state, kind, text, eventId, serverTimestamp, meta, sourceRecordIds, promptId, segmentId) {
11354
11828
  const blockId = allocateBlockId(state, kind);
11355
11829
  return {
11356
11830
  id: blockId,
@@ -11362,6 +11836,7 @@ function createTextBlock(state, kind, text, eventId, serverTimestamp, meta, sour
11362
11836
  ...eventId !== void 0 ? { eventId } : {},
11363
11837
  ...serverTimestamp !== void 0 ? { serverTimestamp } : {},
11364
11838
  ...sourceRecordIds ? { sourceRecordIds: [...sourceRecordIds] } : {},
11839
+ ...segmentId ? { segmentId } : {},
11365
11840
  ...promptId ? { promptId } : {},
11366
11841
  ...meta ? { meta: { ...meta } } : {}
11367
11842
  };
@@ -11671,6 +12146,7 @@ function cloneBlockForWrite(block) {
11671
12146
  return {
11672
12147
  ...block,
11673
12148
  preview: cloneJsonLike(block.preview),
12149
+ resultPreview: cloneJsonLike(block.resultPreview),
11674
12150
  content: cloneJsonLike(block.content),
11675
12151
  locations: cloneJsonLike(block.locations),
11676
12152
  rawInput: cloneJsonLike(block.rawInput),
@@ -11686,6 +12162,19 @@ function allocateBlockId(state, prefix) {
11686
12162
  return id;
11687
12163
  }
11688
12164
  __name(allocateBlockId, "allocateBlockId");
12165
+ function getPermissionToolIdentity(toolCall) {
12166
+ if (!isRecord2(toolCall)) return {};
12167
+ const meta = isRecord2(toolCall["_meta"]) ? toolCall["_meta"] : void 0;
12168
+ const toolCallId = getFirstString(toolCall, ["toolCallId", "id"]);
12169
+ const toolName = getFirstString(meta, ["toolName"]) ?? getFirstString(toolCall, ["toolName", "name"]);
12170
+ const toolKind = getFirstString(toolCall, ["kind"]);
12171
+ const identity = {};
12172
+ if (toolCallId) identity.toolCallId = toolCallId;
12173
+ if (toolName) identity.toolName = toolName;
12174
+ if (toolKind) identity.toolKind = toolKind;
12175
+ return identity;
12176
+ }
12177
+ __name(getPermissionToolIdentity, "getPermissionToolIdentity");
11689
12178
  function clearActiveText(state, parentToolCallId) {
11690
12179
  if (parentToolCallId) {
11691
12180
  clearActiveAssistantForParent(state, parentToolCallId);
@@ -12652,6 +13141,7 @@ function daemonToolPreviewToMarkdown(preview, opts = {}) {
12652
13141
  opts
12653
13142
  )}`
12654
13143
  ).join("\n");
13144
+ case "todo_list":
12655
13145
  case "generic":
12656
13146
  return preview.summary ? `_${escapeMarkdownText(preview.summary, opts)}_` : "";
12657
13147
  default:
@@ -12784,6 +13274,7 @@ ${cap(preview.code)}` : cap(preview.code);
12784
13274
  return `delegate to ${cap(preview.agentName)}: ${cap(preview.task)}`;
12785
13275
  case "key_value":
12786
13276
  return preview.rows.map((r) => `${cap(r.label)}: ${cap(r.value)}`).join("\n");
13277
+ case "todo_list":
12787
13278
  case "generic":
12788
13279
  return preview.summary ? cap(preview.summary) : "";
12789
13280
  default:
@@ -13303,96 +13794,100 @@ var DAEMON_UI_CONFORMANCE_FIXTURES = [
13303
13794
  expectedContains: ["code-reviewer", "review the diff", "TODO"]
13304
13795
  }
13305
13796
  ];
13797
+
13306
13798
  export {
13307
- DAEMON_APPROVAL_MODES,
13308
- DAEMON_ERROR_KINDS,
13309
- DAEMON_GOAL_STATUS_SENTINEL_PREFIX,
13310
- DAEMON_KNOWN_EVENT_TYPE_VALUES,
13311
- DAEMON_PLAN_TOOL_CALL_ID,
13312
- DAEMON_UI_CONFORMANCE_FIXTURES,
13313
- DAEMON_UI_DEBUG_REASONS,
13314
- DAEMON_UI_UNRECOGNIZED_DIAGNOSTIC_REASONS,
13799
+ DaemonHttpError,
13800
+ isSubagentSessionNotFound,
13801
+ isSessionLevelNotFound,
13315
13802
  DEVICE_FLOW_EXPIRY_GRACE_MS,
13316
13803
  DaemonAuthFlow,
13804
+ DaemonTransportClosedError,
13805
+ SseFramingError,
13806
+ parseSseStream,
13807
+ GOAL_PAUSE_REASON_COMMAND,
13317
13808
  DaemonCapabilityMissingError,
13318
- DaemonClient,
13319
- DaemonHttpError,
13809
+ requireWorkspaceCwd,
13810
+ DAEMON_ERROR_KINDS,
13811
+ isDaemonContentHash,
13812
+ DAEMON_APPROVAL_MODES,
13813
+ STANDALONE_SESSIONS_CAPABILITY,
13814
+ STANDALONE_SESSION_OPTIONS_CAPABILITY,
13815
+ DaemonStandaloneProtocolError,
13816
+ DaemonStandaloneCreationOutcomeUnknownError,
13817
+ isStandaloneSessionNotFoundError,
13818
+ isStandaloneCreationOutcomeUnknown,
13320
13819
  DaemonPendingPromptLimitError,
13321
- DaemonSessionClient,
13322
13820
  DaemonSessionIdProtocolError,
13323
- DaemonStandaloneCreationOutcomeUnknownError,
13324
- DaemonStandaloneProtocolError,
13325
- DaemonTransportClosedError,
13326
13821
  EXTENSION_ARCHIVE_UPLOAD_TIMEOUT_MS,
13822
+ isDaemonTurnError,
13823
+ isStaleBranchPointError,
13824
+ DaemonClient,
13825
+ WorkspaceDaemonClient,
13826
+ matchTurnEvent,
13827
+ isNonBlockingAccepted,
13828
+ DaemonSessionClient,
13327
13829
  MID_TURN_MESSAGE_INJECTED_EVENT,
13328
13830
  PENDING_PROMPT_ADDED_EVENT,
13329
- PENDING_PROMPT_COMPLETED_EVENT,
13330
13831
  PENDING_PROMPT_STARTED_EVENT,
13331
- STANDALONE_SESSIONS_CAPABILITY,
13332
- STANDALONE_SESSION_OPTIONS_CAPABILITY,
13333
- SseFramingError,
13334
- UNRECOGNIZED_DIAGNOSTICS_LIMIT,
13335
- WorkspaceDaemonClient,
13336
- appendLocalUserTranscriptMessage,
13832
+ PENDING_PROMPT_COMPLETED_EVENT,
13833
+ DAEMON_KNOWN_EVENT_TYPE_VALUES,
13834
+ createDaemonSessionViewState,
13835
+ isKnownDaemonEvent,
13836
+ isDaemonEventType,
13837
+ isWorkspaceScopedBudgetEvent,
13337
13838
  asKnownDaemonEvent,
13839
+ reduceDaemonSessionEvent,
13840
+ reduceDaemonSessionEvents,
13338
13841
  createDaemonAuthState,
13339
- createDaemonSessionViewState,
13340
- createDaemonToolPreview,
13341
- createDaemonTranscriptState,
13342
- createDaemonTranscriptStore,
13343
- daemonBlockToHtml,
13344
- daemonBlockToMarkdown,
13345
- daemonBlockToPlainText,
13346
- daemonToolPreviewToMarkdown,
13347
- daemonUiEventToTerminalText,
13348
- estimateDaemonTranscriptBlockBytes,
13842
+ reduceDaemonAuthEvent,
13843
+ reduceDaemonAuthEvents,
13844
+ DAEMON_PLAN_TOOL_CALL_ID,
13845
+ DAEMON_UI_DEBUG_REASONS,
13846
+ DAEMON_UI_UNRECOGNIZED_DIAGNOSTIC_REASONS,
13847
+ isUnrecognizedDiagnosticReason,
13848
+ stringifyJson,
13849
+ redactSensitiveFields,
13850
+ isSensitiveKey,
13349
13851
  extractContentPart,
13852
+ getOutputText,
13853
+ sanitizeTerminalText,
13854
+ stripOscSequences,
13855
+ createDaemonToolPreview,
13856
+ createDaemonToolResultPreview,
13857
+ normalizeDaemonEvent,
13350
13858
  extractServerTimestamp,
13351
- formatBlockTimestamp,
13352
- getOutputText as getDaemonUiOutputText,
13353
13859
  getSessionUpdatePayload,
13354
- isDaemonContentHash,
13355
- isDaemonEventType,
13356
- isDaemonTurnError,
13357
- isSensitiveKey as isDaemonUiSensitiveKey,
13358
- isKnownDaemonEvent,
13359
- isNonBlockingAccepted,
13360
- isSessionLevelNotFound,
13361
- isStaleBranchPointError,
13362
- isStandaloneCreationOutcomeUnknown,
13363
- isStandaloneSessionNotFoundError,
13364
- isSubagentChildBlock,
13365
- isSubagentSessionNotFound,
13366
- isTaskExecutionMode,
13367
- isTrimmedPermissionBlockId,
13860
+ UNRECOGNIZED_DIAGNOSTICS_LIMIT,
13368
13861
  isTrimmedToolBlockId,
13369
- isUnrecognizedDiagnosticReason,
13370
- isWorkspaceScopedBudgetEvent,
13371
- matchTurnEvent,
13372
- normalizeDaemonEvent,
13373
- parseSseStream,
13374
- rebuildDaemonTranscriptBlockIndex,
13375
- redactSensitiveFields as redactDaemonUiSensitiveFields,
13376
- reduceDaemonAuthEvent,
13377
- reduceDaemonAuthEvents,
13378
- reduceDaemonSessionEvent,
13379
- reduceDaemonSessionEvents,
13862
+ isTrimmedPermissionBlockId,
13863
+ createDaemonTranscriptState,
13864
+ appendLocalUserTranscriptMessage,
13380
13865
  reduceDaemonTranscriptEvents,
13381
- requireWorkspaceCwd,
13382
- runAdapterConformanceSuite,
13383
- sanitizeTerminalText as sanitizeDaemonTerminalText,
13384
- selectApprovalMode,
13385
- selectCurrentTool,
13386
- selectLastFollowupSuggestion,
13387
- selectPendingPermissionBlocks,
13388
- selectSubagentChildBlocks,
13389
- selectToolProgress,
13866
+ finalizeOfflineDaemonTranscriptState,
13867
+ rebuildDaemonTranscriptBlockIndex,
13390
13868
  selectTranscriptBlocks,
13869
+ selectPendingPermissionBlocks,
13870
+ isTaskExecutionMode,
13871
+ estimateDaemonTranscriptBlockBytes,
13391
13872
  selectTranscriptBlocksOrderedByEventId,
13873
+ selectCurrentTool,
13874
+ selectApprovalMode,
13875
+ selectLastFollowupSuggestion,
13392
13876
  selectUnrecognizedDiagnostics,
13393
- stringifyJson as stringifyDaemonUiJson,
13394
- stripOscSequences as stripDaemonOscSequences,
13395
- transcriptBlockToTerminalText
13877
+ selectToolProgress,
13878
+ selectSubagentChildBlocks,
13879
+ isSubagentChildBlock,
13880
+ formatBlockTimestamp,
13881
+ createDaemonTranscriptStore,
13882
+ DAEMON_GOAL_STATUS_SENTINEL_PREFIX,
13883
+ daemonUiEventToTerminalText,
13884
+ transcriptBlockToTerminalText,
13885
+ daemonBlockToMarkdown,
13886
+ daemonToolPreviewToMarkdown,
13887
+ daemonBlockToPlainText,
13888
+ daemonBlockToHtml,
13889
+ runAdapterConformanceSuite,
13890
+ DAEMON_UI_CONFORMANCE_FIXTURES
13396
13891
  };
13397
13892
  /**
13398
13893
  * @license