@qwen-code/qwen-code 0.21.12-preview.5 → 0.21.13
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.
- package/bundled/qc-helper/docs/configuration/settings.md +7 -5
- package/bundled/qc-helper/docs/features/channels/overview.md +1 -1
- package/bundled/qc-helper/docs/features/channels/plugins.md +11 -11
- package/bundled/qc-helper/docs/features/code-review.md +13 -12
- package/bundled/qc-helper/docs/qwen-serve.md +65 -0
- package/bundled/review/SKILL.md +96 -68
- package/chunks/{MaxSizedBox-6STELMXN.js → MaxSizedBox-UQALOVVT.js} +46 -46
- package/chunks/{StandaloneSessionPicker-LXMGCAIF.js → StandaloneSessionPicker-KEGXNUG6.js} +68 -69
- package/chunks/{acp-startup-profiler-TVI2OVUN.js → acp-startup-profiler-NMDXYGDN.js} +2 -2
- package/chunks/{acpAgent-NFRP4O5A.js → acpAgent-XPES32S7.js} +804 -380
- package/chunks/{agent-4AGYD6I6.js → agent-DPTOZFEM.js} +42 -42
- package/chunks/{agent-headless-GH4UIDXU.js → agent-headless-GJCQMURW.js} +42 -42
- package/chunks/{anthropicContentGenerator-ZBBX5VMY.js → anthropicContentGenerator-G7BVXTKN.js} +25 -25
- package/chunks/{artifact-tool-RWJAKYBZ.js → artifact-tool-GEXTOPVO.js} +5 -5
- package/chunks/{askUserQuestion-IQCA2SOX.js → askUserQuestion-B33XRSB7.js} +2 -2
- package/chunks/{bridge-3S4SKXSQ.js → bridge-YNQBAA4Z.js} +48 -48
- package/chunks/{build-RZS65IIX.js → build-GDBLPA24.js} +1 -1
- package/chunks/{channel-management-service-5ZYX4ROW.js → channel-management-service-GWY2GAIC.js} +4 -4
- package/chunks/{channel-settings-store-62E3TWVK.js → channel-settings-store-WNWYFHG7.js} +49 -49
- package/chunks/{channel-worker-group-QFJKXO7R.js → channel-worker-group-7LXCMZ77.js} +6 -6
- package/chunks/{channel-worker-manager-PWD2UURZ.js → channel-worker-manager-RYEME4ZZ.js} +6 -6
- package/chunks/{channel-worker-supervisor-XQJBGFCM.js → channel-worker-supervisor-OEVWBHGT.js} +4 -4
- package/chunks/{chunk-LHOG4E6Y.js → chunk-22C7BQ6D.js} +3 -3
- package/chunks/{chunk-KTWUFHS4.js → chunk-25EYDK42.js} +3 -3
- package/chunks/{chunk-QEWAHAW2.js → chunk-2B2BF7P7.js} +3 -3
- package/chunks/{chunk-2SB4SLKC.js → chunk-2IIJTXYF.js} +1 -3
- package/chunks/{chunk-6LDLDK6E.js → chunk-2M55OBEB.js} +1 -3
- package/chunks/{chunk-V3NMFQD2.js → chunk-3EZLLVDF.js} +2 -2
- package/chunks/{chunk-HUDUANHL.js → chunk-3U3VAL47.js} +1 -1
- package/chunks/{chunk-BKHCW2BI.js → chunk-3VUENPWF.js} +10 -0
- package/chunks/{chunk-XY7DGTIC.js → chunk-45NQKMYB.js} +1 -1
- package/chunks/{chunk-VGGNHRYZ.js → chunk-4PKCUT7F.js} +7 -7
- package/chunks/{chunk-T7YMWGFY.js → chunk-4S5337WV.js} +1491 -711
- package/chunks/{chunk-FVHLDSQS.js → chunk-4W5U2TUT.js} +3 -3
- package/chunks/{chunk-6SU6OW5Z.js → chunk-5CVO7YES.js} +1 -1
- package/chunks/{chunk-OZTGLK53.js → chunk-5EYKMUUY.js} +1 -1
- package/chunks/{chunk-ZRT36RSF.js → chunk-6HY6IF3Z.js} +1 -1
- package/chunks/{chunk-HRAFAUM7.js → chunk-6ORZ2EDC.js} +3 -3
- package/chunks/{chunk-JOVJCXN4.js → chunk-6QFDQMQX.js} +1 -1
- package/chunks/{chunk-CPTIJGUK.js → chunk-6YKYPVDV.js} +4 -4
- package/chunks/{chunk-62OKKUOX.js → chunk-76J3IJ3M.js} +9 -7
- package/chunks/{chunk-JVY7FHUZ.js → chunk-7U5G6JXI.js} +9 -0
- package/chunks/{chunk-TIM7NVEO.js → chunk-7UXUJ5T3.js} +1 -1
- package/chunks/{chunk-YCGXJ4Q3.js → chunk-A267JX7H.js} +6 -6
- package/chunks/{chunk-4JS2QK7P.js → chunk-A4MFR4C5.js} +1 -1
- package/chunks/{chunk-TN3REXN4.js → chunk-A4QRWUDE.js} +79 -36
- package/chunks/{chunk-JW5UEE3V.js → chunk-A6NRNRKE.js} +1 -1
- package/chunks/{chunk-T4G33L3W.js → chunk-AA2BEKV3.js} +3 -3
- package/chunks/{chunk-M3DWLXEO.js → chunk-AFSG32D5.js} +1 -1
- package/chunks/{chunk-R4YAQULI.js → chunk-AS5IN4GK.js} +5 -5
- package/chunks/{chunk-ADJDLEVO.js → chunk-AW27A43Y.js} +9 -11
- package/chunks/{chunk-RIDUB2GC.js → chunk-AW4TRXOC.js} +1 -1
- package/chunks/{chunk-XL6GYJL2.js → chunk-AXN7UPYQ.js} +2 -2
- package/chunks/{chunk-M4NWDIFU.js → chunk-AZQ3DT76.js} +1 -1
- package/chunks/{chunk-OSA2TFDI.js → chunk-BHILXOC3.js} +3 -3
- package/chunks/{chunk-YMIQ24FR.js → chunk-BKPPWD33.js} +2 -2
- package/chunks/{chunk-YMB77M76.js → chunk-BUQDLC2G.js} +59 -0
- package/chunks/{chunk-DXXYMK2U.js → chunk-BVJS5BSP.js} +1 -1
- package/chunks/{chunk-EGB2PIYM.js → chunk-BZ263IKX.js} +1 -1
- package/chunks/{chunk-6OJDN5ZT.js → chunk-CHHABXPE.js} +1 -1
- package/chunks/{chunk-ZPZANKVP.js → chunk-CKSJECTU.js} +4 -4
- package/chunks/{chunk-H6BFLALJ.js → chunk-CPHEPGAO.js} +1 -1
- package/chunks/{chunk-V6PERRH4.js → chunk-CU6GJD55.js} +1 -1
- package/chunks/{chunk-ZZ7RUTJ4.js → chunk-CZBYX5MY.js} +1 -1
- package/chunks/{chunk-2OFDCPMS.js → chunk-DGK6P3BQ.js} +13 -13
- package/chunks/{chunk-NM33GGOM.js → chunk-DGZEMW5R.js} +3 -3
- package/chunks/{chunk-UPUAGRKY.js → chunk-DXIBNLBZ.js} +2 -4
- package/chunks/{chunk-J5SUM3ZJ.js → chunk-E23IPNGS.js} +25 -2
- package/chunks/{chunk-TNETSI2A.js → chunk-E3DYKPYZ.js} +3 -3
- package/chunks/{chunk-3MJ44LNC.js → chunk-EL5SXY3T.js} +265 -138
- package/chunks/{chunk-AFKOAHC3.js → chunk-EZ5RP345.js} +13 -11
- package/chunks/{chunk-PSTHNTHF.js → chunk-FAAUPSY2.js} +1 -1
- package/chunks/{chunk-NW7SPXVG.js → chunk-FDGGZIYW.js} +1 -1
- package/chunks/{chunk-6YSSQFHQ.js → chunk-GGDBMYGZ.js} +5 -5
- package/chunks/{chunk-CDDLHCC2.js → chunk-GMIEIY3Y.js} +5 -5
- package/chunks/{chunk-6JFPUJ2O.js → chunk-GO7STP6N.js} +4 -4
- package/chunks/{chunk-7JL5YBSA.js → chunk-H4A72DE5.js} +1 -1
- package/chunks/{chunk-I3UEXUWJ.js → chunk-HUTNYWBG.js} +2 -2
- package/chunks/{chunk-UQPLUR4A.js → chunk-IA2K2HJE.js} +2 -2
- package/chunks/{chunk-Q7VJUIIB.js → chunk-IGGGG5CX.js} +4104 -1293
- package/chunks/{chunk-VE2UV7IN.js → chunk-IWPYVAO2.js} +4 -4
- package/chunks/{chunk-HAR4G5K2.js → chunk-JNDY2MDR.js} +2 -2
- package/chunks/{chunk-UALXTL5Y.js → chunk-JOOFMXGF.js} +6 -6
- package/chunks/{chunk-HOXEJHJQ.js → chunk-JUEPY766.js} +3 -3
- package/chunks/{chunk-Q7YDKOGY.js → chunk-JVEGA3MM.js} +1 -1
- package/chunks/{chunk-QBJYSIQ4.js → chunk-K3LPAED5.js} +53 -12
- package/chunks/{chunk-UHF5VBKO.js → chunk-KBXKR5R2.js} +1 -1
- package/chunks/{chunk-32SNBMNP.js → chunk-KD5BOPLP.js} +27 -27
- package/chunks/{chunk-67F2BEYW.js → chunk-KV27IEHM.js} +1 -1
- package/chunks/{chunk-DLDVO2NY.js → chunk-LJQAUZMR.js} +360 -174
- package/chunks/{chunk-BNRIQWXW.js → chunk-M732YJPW.js} +7 -7
- package/chunks/{chunk-JRTJEGSP.js → chunk-MA2HEDVP.js} +1 -1
- package/chunks/{chunk-5IW3FJGD.js → chunk-MC4TLKEI.js} +2 -2
- package/chunks/{chunk-2ASWIM4A.js → chunk-MIPFDQAF.js} +1 -1
- package/chunks/{chunk-6GTKI2YX.js → chunk-MLPXSYXR.js} +133 -28
- package/chunks/{chunk-KRXPRVGL.js → chunk-MLXTMF7H.js} +0 -1
- package/chunks/{chunk-NNGCKJAD.js → chunk-MRMJCLIY.js} +3 -3
- package/chunks/{chunk-E7XJWIWC.js → chunk-N5YPT6PH.js} +7 -7
- package/chunks/{chunk-72SKJ3E7.js → chunk-NEFOOD54.js} +3 -3
- package/chunks/{chunk-2U3UCXZ3.js → chunk-NHDR76JX.js} +45 -13
- package/chunks/{chunk-QLFTWYTO.js → chunk-NM5V5OVW.js} +3 -3
- package/chunks/{chunk-N4LVA3S6.js → chunk-NNHNLJ2X.js} +840 -60
- package/chunks/chunk-NYWWQ437.js +24 -0
- package/chunks/{chunk-DGNQ5AFX.js → chunk-O4D7SPJN.js} +2 -2
- package/chunks/{chunk-YY23TR4M.js → chunk-O565M6A4.js} +411 -10
- package/chunks/{chunk-VUTOV2HG.js → chunk-OD2WU5QY.js} +4 -3
- package/chunks/{chunk-B66LYK4B.js → chunk-OMLJNPBE.js} +42 -12
- package/chunks/{chunk-WAF6AR5Y.js → chunk-OOQUVWIG.js} +4 -4
- package/chunks/{chunk-A6GQUQ7I.js → chunk-OVZPVYZB.js} +2 -2
- package/chunks/{chunk-VPZMLGD3.js → chunk-OXCMMLED.js} +5 -5
- package/chunks/{chunk-646ZB2TS.js → chunk-OY5RNSV4.js} +3 -3
- package/chunks/{chunk-V7RNNPGC.js → chunk-P5Y23G2L.js} +18 -1
- package/chunks/{chunk-O6SLWH4X.js → chunk-P7MPQI75.js} +2 -2
- package/chunks/{chunk-3HXLH5QV.js → chunk-PP4FUZNV.js} +47 -4
- package/chunks/{chunk-4XX2LZ3E.js → chunk-PQ36L4F5.js} +1 -1
- package/chunks/{chunk-SKRHR6N2.js → chunk-PT4I7NBA.js} +1 -1
- package/chunks/{chunk-KQLW7LLV.js → chunk-QF2NHSPB.js} +603 -66
- package/chunks/{chunk-KK3FEHPJ.js → chunk-QFJ5JHQR.js} +1 -1
- package/chunks/{chunk-N2G4RA77.js → chunk-QIH2HAEN.js} +1 -1
- package/chunks/{chunk-QSWDGAIC.js → chunk-QILD6R27.js} +1 -1
- package/chunks/{chunk-NHZF4VCD.js → chunk-QNQAPSN2.js} +1 -1
- package/chunks/{chunk-6DH5YA3X.js → chunk-QRCNA3SR.js} +8 -8
- package/chunks/{chunk-3RC5Q66G.js → chunk-QV5YN5YD.js} +7 -5
- package/chunks/{chunk-7TKNMQ6L.js → chunk-RIAABG2K.js} +2 -2
- package/chunks/{chunk-LYRA6ZTI.js → chunk-RLKC46YT.js} +138 -11
- package/chunks/{chunk-YI5G32RU.js → chunk-ROIYNTHJ.js} +3 -3
- package/chunks/{chunk-UAAWNTOC.js → chunk-RVOJ2FBP.js} +12 -12
- package/chunks/{chunk-SNHBRO4C.js → chunk-RWDNJBWN.js} +2 -2
- package/chunks/{chunk-UFHPAMAV.js → chunk-S5DWMTHO.js} +11 -1
- package/chunks/{chunk-TROB4PZY.js → chunk-SG7ZP5PG.js} +4 -4
- package/chunks/{chunk-E74YSVIN.js → chunk-SXCOEJO4.js} +1 -1
- package/chunks/{chunk-U5C2GIN2.js → chunk-TIGA2IVL.js} +117 -3
- package/chunks/chunk-TS6625XH.js +488 -0
- package/chunks/{chunk-EHXS5MAC.js → chunk-TUGSVUJB.js} +7 -7
- package/chunks/{chunk-E3GLDLYB.js → chunk-TYAMGABM.js} +0 -6
- package/chunks/{chunk-ZLX7FTZQ.js → chunk-U3VNBPUO.js} +3 -3
- package/chunks/{chunk-F7PTQFTB.js → chunk-UKMR3CKV.js} +4 -4
- package/chunks/{chunk-7WUMS2UA.js → chunk-UPDOZBWO.js} +1 -1
- package/chunks/{chunk-YK4O72LT.js → chunk-UZPM4XHR.js} +4 -4
- package/chunks/{chunk-VKEA37IR.js → chunk-V26NVGAU.js} +1 -1
- package/chunks/{chunk-IJCZP2MA.js → chunk-V57QC6WW.js} +3 -3
- package/chunks/{chunk-LSMCI42W.js → chunk-WFSTRPRO.js} +3 -3
- package/chunks/{chunk-5KZNWF2M.js → chunk-WGHHA7ZH.js} +1 -1
- package/chunks/{chunk-A4BAHMJF.js → chunk-WSH6GRKG.js} +4 -4
- package/chunks/{chunk-OK727E5D.js → chunk-X26JYGTD.js} +1 -1
- package/chunks/{chunk-VAPNUDD5.js → chunk-XHRY7BXD.js} +4 -4
- package/chunks/{chunk-XNL23MGG.js → chunk-XIT3GURH.js} +3 -3
- package/chunks/{chunk-2RTRFLWH.js → chunk-XLLKYULU.js} +6 -6
- package/chunks/{chunk-C2DR57L6.js → chunk-XUJNK7Y6.js} +1 -1
- package/chunks/{chunk-AAZWJAPQ.js → chunk-Y3YCSWG5.js} +2 -2
- package/chunks/{chunk-ZTBFA7I6.js → chunk-YEYY7TEP.js} +7 -7
- package/chunks/{chunk-FTGU6G45.js → chunk-YZHRN3CF.js} +2 -2
- package/chunks/{chunk-2N6CV4PW.js → chunk-YZOSNW4R.js} +1 -1
- package/chunks/{chunk-U7ROFHSH.js → chunk-ZLCT4C5A.js} +1 -1
- package/chunks/{chunk-VBKTP7TH.js → chunk-ZYBBISBY.js} +15 -34
- package/chunks/{chunk-7ATQGA6V.js → chunk-ZYYTZUI2.js} +6 -6
- package/chunks/{chunk-RXX5T3IF.js → chunk-ZZO74WKW.js} +44 -8
- package/chunks/{computer-use-ZFBJYSR3.js → computer-use-77C5FHMW.js} +45 -45
- package/chunks/{config-utils-7JZQN6L2.js → config-utils-IVHRSXWI.js} +4 -4
- package/chunks/{contextCommand-G3TAIY7T.js → contextCommand-PJ77GBWL.js} +44 -44
- package/chunks/{core-runtime-K3MQVNSF.js → core-runtime-7VMIKUTG.js} +42 -42
- package/chunks/{create-sub-session-DMTLJPDG.js → create-sub-session-2L5MQRN4.js} +42 -42
- package/chunks/{create-sub-session-23ULO5PO.js → create-sub-session-KRQULJE6.js} +2 -2
- package/chunks/{cron-create-5WUTNKNF.js → cron-create-H7UEPDSN.js} +4 -4
- package/chunks/{cron-delete-JEQ27YPS.js → cron-delete-6SZK7YFM.js} +4 -4
- package/chunks/{cron-list-IXGCA7UR.js → cron-list-H25JIHEZ.js} +4 -4
- package/chunks/{daemon-UBVOQMWY.js → daemon-2KTG7ZBN.js} +108 -9
- package/chunks/daemon-git-worktree-guard-DXYIMWFT.js +2062 -0
- package/chunks/{daemon-status-provider-KFLEZGD7.js → daemon-status-provider-ZDOYJCU6.js} +52 -53
- package/chunks/{daemon-trust-policy-ZZ6DRDAC.js → daemon-trust-policy-E67OYUK2.js} +48 -48
- package/chunks/{daemon-trust-policy-monitor-CIKHNV2K.js → daemon-trust-policy-monitor-RYYGCQ3J.js} +48 -48
- package/chunks/{deferred-core-runtime-MM7X7UYR.js → deferred-core-runtime-3SGXFXEQ.js} +44 -44
- package/chunks/{devtools-X6ROTKHE.js → devtools-4QFYJT6U.js} +1 -1
- package/chunks/discovery-ORA5J7YP.js +27 -0
- package/chunks/{display-image-CAD7RAUM.js → display-image-ON3EYFRD.js} +4 -4
- package/chunks/{dist-B3ODKYEB.js → dist-4ZPG4BY6.js} +2 -2
- package/chunks/{dist-CCUH2Z4C.js → dist-BROOP2EG.js} +1 -1
- package/chunks/{dist-DANKRAB3.js → dist-IYYN3RUT.js} +2 -2
- package/chunks/{dist-5VDE7U3A.js → dist-JWMKPWT5.js} +3 -1
- package/chunks/{dist-6RK4U6VU.js → dist-K7IQB53U.js} +1 -1
- package/chunks/{dist-EZHCZSW6.js → dist-MAQXAQ2Y.js} +1 -1
- package/chunks/{dist-362MN6CP.js → dist-WJ4BHIEW.js} +2 -2
- package/chunks/{dist-M3XMEIP2.js → dist-YEPL4RAW.js} +1 -1
- package/chunks/{earlyInputCapture-O77TUBIF.js → earlyInputCapture-KJMLFVQV.js} +43 -43
- package/chunks/{edit-CZ23AVP6.js → edit-I4LQFAEC.js} +50 -49
- package/chunks/{enter-worktree-4EMS7IRL.js → enter-worktree-YNPOJSRH.js} +47 -47
- package/chunks/{enterPlanMode-TS6KO6DU.js → enterPlanMode-XCPK62ER.js} +47 -47
- package/chunks/{environment-7JAXEU6I.js → environment-S7CTIHMX.js} +44 -44
- package/chunks/{errors-NBABPF4S.js → errors-7HB2AIDS.js} +44 -44
- package/chunks/{exit-worktree-Q3NFHYUI.js → exit-worktree-AIIY7SR6.js} +47 -47
- package/chunks/{exitPlanMode-4JH6WLKL.js → exitPlanMode-R4JY7V2O.js} +42 -42
- package/chunks/{external-tool-guard-provider-5HTGOPGU.js → external-tool-guard-provider-TE4DRY36.js} +1 -1
- package/chunks/{fast-path-5LFDLPHJ.js → fast-path-NDJV3ZFJ.js} +3 -3
- package/chunks/{gemini-MB4S7YLN.js → gemini-RSUFP5OE.js} +108 -103
- package/chunks/{geminiContentGenerator-EQY2QU7K.js → geminiContentGenerator-SQ5XBPZ7.js} +11 -11
- package/chunks/{glob-LA5XO2H7.js → glob-J4RUJAHX.js} +49 -49
- package/chunks/{goal-tools-LQFO4BRY.js → goal-tools-VHTNVOKK.js} +56 -12
- package/chunks/{grep-KYBZMY36.js → grep-VJWPLFOT.js} +47 -47
- package/chunks/{handleAutoUpdate-HZJSAUNC.js → handleAutoUpdate-POCX2MNB.js} +46 -46
- package/chunks/{i18n-BSCIN4J4.js → i18n-RM5YOICI.js} +43 -43
- package/chunks/{image-gen-HGURQAHX.js → image-gen-EXECB5XM.js} +11 -11
- package/chunks/{initializer-WUHJXIB3.js → initializer-Z2AFGBNR.js} +49 -49
- package/chunks/{installationInfo-G3PDBWG2.js → installationInfo-4I5FXNMH.js} +43 -43
- package/chunks/{keychain-token-storage-GU75J2T2.js → keychain-token-storage-3XFJ5ZB2.js} +2 -2
- package/chunks/{list-IC7KDSZ6.js → list-ZMBFIGZA.js} +51 -51
- package/chunks/{list-agents-5PNMK2AM.js → list-agents-OSVDFI6S.js} +2 -2
- package/chunks/{loadedSettingsAdapter-Z3GOJRI7.js → loadedSettingsAdapter-T6TV4YJ7.js} +48 -48
- package/chunks/{loggingContentGenerator-E2QENFPH.js → loggingContentGenerator-WF4ZOJEZ.js} +99 -66
- package/chunks/{loop-wakeup-OV65FEGR.js → loop-wakeup-WQS6JYAG.js} +5 -5
- package/chunks/{ls-RPRSX26R.js → ls-D3HUFHDP.js} +6 -6
- package/chunks/{lsp-IWTJWFLT.js → lsp-3QDDJTCS.js} +2 -2
- package/chunks/{managed-npm-update-MX2OPCW4.js → managed-npm-update-E7IW6N7V.js} +43 -43
- package/chunks/{mcp-QQEWPNWV.js → mcp-6UNYX4HG.js} +48 -48
- package/chunks/{monitor-SV64FNV3.js → monitor-EE2UYMGE.js} +47 -47
- package/chunks/{node-YSOU44FX.js → node-UUDY34IG.js} +3 -3
- package/chunks/nonInteractiveCli-WAY237O4.js +163 -0
- package/chunks/{notebook-edit-QPYSWPRI.js → notebook-edit-NTDY4QDU.js} +47 -47
- package/chunks/{openaiContentGenerator-CMZXOSVA.js → openaiContentGenerator-YNFVJMRJ.js} +30 -30
- package/chunks/{pidfile-D5UXVVAI.js → pidfile-4XSFLYBZ.js} +43 -43
- package/chunks/{processUtils-ZEIMIVPX.js → processUtils-WDA2MJFD.js} +2 -2
- package/chunks/proper-lockfile-3LHWIM44.js +8 -0
- package/chunks/{qwenContentGenerator-JAXZKB7R.js → qwenContentGenerator-434M7QKY.js} +50 -50
- package/chunks/{qwenOAuth2-C2QWTD2G.js → qwenOAuth2-GMYZOO6A.js} +10 -10
- package/chunks/{read-file-2V5GE6ZW.js → read-file-TAFBKMNI.js} +11 -11
- package/chunks/{read-mcp-resource-THCSZHXO.js → read-mcp-resource-XD54ZQMC.js} +2 -2
- package/chunks/{record-artifact-76YYQA5F.js → record-artifact-SEYFJEJF.js} +3 -3
- package/chunks/{resumeHistoryUtils-UZ7GHPNY.js → resumeHistoryUtils-EVG3WYK2.js} +50 -50
- package/chunks/{ripGrep-MUTMPQSV.js → ripGrep-WOEK2PXS.js} +42 -42
- package/chunks/{run-qwen-serve-WU43JKEA.js → run-qwen-serve-3QSGRXAN.js} +417 -208
- package/chunks/{runtime-YLOFDP2P.js → runtime-5MLLZ7DC.js} +53 -53
- package/chunks/{scheduler-G44OPSZE.js → scheduler-RPBJ63CH.js} +44 -44
- package/chunks/{sdk-exporters-grpc-4QKV6MCX.js → sdk-exporters-grpc-54L4LS5L.js} +2 -2
- package/chunks/{sdk-exporters-http-A7XLKZO7.js → sdk-exporters-http-XUVP63H6.js} +12 -12
- package/chunks/{sdk-impl-XO4UF6PR.js → sdk-impl-YXUEN2Z2.js} +8 -8
- package/chunks/{send-message-P5SLP57G.js → send-message-VZENRWRH.js} +6 -6
- package/chunks/{serve-CZQDBDYV.js → serve-HS3XLPXU.js} +50 -50
- package/chunks/{server-HGI2KF3Y.js → server-TC4A7AAZ.js} +3850 -1630
- package/chunks/{session-OVMSHAO5.js → session-UBOFXVMN.js} +92 -95
- package/chunks/{settings-TWX6ROGP.js → settings-D5644OM5.js} +47 -47
- package/chunks/{shell-JDSWGVC7.js → shell-3PZULQQV.js} +42 -42
- package/chunks/{skill-QILHTMYJ.js → skill-PEVVXQ3L.js} +22 -22
- package/chunks/{skill-settings-RKRD34RZ.js → skill-settings-J65JKKES.js} +47 -47
- package/chunks/{spawnChannel-V5PYSDEI.js → spawnChannel-IYGXRHSQ.js} +45 -47
- package/chunks/{standalone-update-Y52CWCGG.js → standalone-update-IFM53PE7.js} +44 -44
- package/chunks/{startInteractiveUI-RVA62ZM6.js → startInteractiveUI-3AVH7L6H.js} +3340 -2460
- package/chunks/{syntheticOutput-SEW4NA47.js → syntheticOutput-7GWFIDXT.js} +3 -3
- package/chunks/{task-create-247EAVF7.js → task-create-FCBDX7UH.js} +12 -12
- package/chunks/{task-list-ZJN4QHLK.js → task-list-YIYIUFUA.js} +6 -6
- package/chunks/{task-stop-MAYQJ42I.js → task-stop-X37KYTKB.js} +2 -2
- package/chunks/{task-update-SU5TMZGG.js → task-update-MYPFVOVM.js} +12 -12
- package/chunks/{team-create-YMWUDIE3.js → team-create-ZAIA7KAV.js} +47 -47
- package/chunks/{team-delete-3XVRPQBP.js → team-delete-6UMU4XLS.js} +6 -6
- package/chunks/{team-plan-approval-3GPZAW46.js → team-plan-approval-UNIUS7OD.js} +47 -47
- package/chunks/{terminal-image-renderer-UGQKWDM3.js → terminal-image-renderer-G343P2RV.js} +44 -44
- package/chunks/{theme-manager-KRG4GGFY.js → theme-manager-Z3RIT7DB.js} +43 -43
- package/chunks/{todoWrite-IE2YTCK7.js → todoWrite-U2R4NVF4.js} +4 -4
- package/chunks/{tool-search-SZRO5G72.js → tool-search-5R2OE4C7.js} +17 -17
- package/chunks/{total-session-admission-JYHYOKWX.js → total-session-admission-4KBHMQQ2.js} +48 -48
- package/chunks/{trustedFolders-2BDCB5NJ.js → trustedFolders-LK6T4XC7.js} +43 -43
- package/chunks/{update-relaunch-XSYVPSDL.js → update-relaunch-UBKROIC6.js} +5 -5
- package/chunks/{updateCheck-SMMJ27GG.js → updateCheck-W4Y2GFSD.js} +45 -45
- package/chunks/{useAutoAcceptIndicator-HPG4UFIZ.js → useAutoAcceptIndicator-C7BEICBF.js} +51 -51
- package/chunks/{validateNonInterActiveAuth-IIL774NT.js → validateNonInterActiveAuth-LTEI2TB6.js} +84 -86
- package/chunks/{version-WSGAB2PA.js → version-G5A5DGVS.js} +1 -1
- package/chunks/{web-fetch-LKC2F5DM.js → web-fetch-RTEQTR5Z.js} +20 -20
- package/chunks/{web-search-BHMAMXEU.js → web-search-5OXHEZPV.js} +16 -16
- package/chunks/{workflow-A7AQ52HO.js → workflow-ISQJHPG2.js} +54 -53
- package/chunks/{workspace-providers-status-JRT57TLL.js → workspace-providers-status-2ZPZPUPZ.js} +51 -51
- package/chunks/{workspace-registration-store-EACJNCM5.js → workspace-registration-store-CYNY6IP6.js} +2 -2
- package/chunks/{workspace-registry-OV5SI4ES.js → workspace-registry-34GTUUHB.js} +50 -49
- package/chunks/{workspace-service-PUHU4EEK.js → workspace-service-XCDQLE2Y.js} +53 -53
- package/chunks/{workspace-skills-status-YAJE3UW3.js → workspace-skills-status-RS4O7AIJ.js} +49 -49
- package/chunks/{workspace-trust-reconciler-JP5UR2H6.js → workspace-trust-reconciler-AYGXC7A3.js} +57 -56
- package/chunks/{write-file-UBIHUP5M.js → write-file-EWXKVVXF.js} +42 -42
- package/chunks/{zoom-image-4QTKAMTP.js → zoom-image-4BFYJ3HG.js} +11 -11
- package/cli.js +18 -17
- package/package.json +3 -3
- package/web-shell/assets/{arc-lZ04kynw.js → arc-CgOpDKvm.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-B1wZVhzD.js → architectureDiagram-3BPJPVTR-0Ag_m34F.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-CO0e0yJt.js → blockDiagram-GPEHLZMM-IwTwFau0.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-Dfpo6Qie.js → c4Diagram-AAUBKEIU-DLa5GUv8.js} +1 -1
- package/web-shell/assets/channel-BrGVBa2L.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-BvxArftT.js → chunk-2J33WTMH-DcYP-WFG.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-BS2XXjGY.js → chunk-4BX2VUAB-C8MVPMiQ.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-CYL6h3Ph.js → chunk-55IACEB6-BUi4Yfv3.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-C-cWPX30.js → chunk-727SXJPM-Cy3Su2YY.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-CJLxNbVV.js → chunk-AQP2D5EJ-Dp8Teqv6.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-DwfzKywA.js → chunk-FMBD7UC4-BDTDM-4j.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-BI5raYHQ.js → chunk-ND2GUHAM-7HfDt0r2.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-_GkNI90J.js → chunk-QZHKN3VN-BIBU0uCF.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-B5TUzJzI.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-B5TUzJzI.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-BAVLNxh9.js → cose-bilkent-S5V4N54A-DRLdcg9p.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-BD4XNLqp.js → dagre-BM42HDAG-DCCgDwqW.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-WO567p8w.js → diagram-2AECGRRQ-CsBTBmk3.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-mAk23VWO.js → diagram-5GNKFQAL-C9qjH8Lt.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-YQEeHKze.js → diagram-KO2AKTUF-Brjs_lj2.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-CMVjxAjv.js → diagram-LMA3HP47-DtiWCl_F.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-42hPvbM-.js → diagram-OG6HWLK6-DmfKLkBT.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-CXU_cPfu.js → erDiagram-TEJ5UH35-Bve_4deH.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-D-3TdhMT.js → flowDiagram-I6XJVG4X-C2_kXCcV.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-CsgkXolz.js → ganttDiagram-6RSMTGT7-BSBIjiTF.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-B6Q3PBLD.js → gitGraphDiagram-PVQCEYII-CyebwI55.js} +1 -1
- package/web-shell/assets/index-CIDsgxTe.js +1792 -0
- package/web-shell/assets/index-DiQnWi_E.css +5 -0
- package/web-shell/assets/{index-BFrkGj2B.js → index-d0yfnV1M.js} +1 -1
- package/web-shell/assets/{infoDiagram-5YYISTIA-jiAfSXp8.js → infoDiagram-5YYISTIA-CSDGnWxU.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-BWif5KeJ.js → ishikawaDiagram-YF4QCWOH-BK4jU13p.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-B-GAZthS.js → journeyDiagram-JHISSGLW-D_W6j-oF.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-9TEuATdL.js → kanban-definition-UN3LZRKU-C7xf-SdC.js} +1 -1
- package/web-shell/assets/{linear-dy_QPfyE.js → linear-DQmzxpxd.js} +1 -1
- package/web-shell/assets/{mermaid.core-DB2uLAnq.js → mermaid.core-9P7AGOLG.js} +5 -5
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-ey_dyxi-.js → mindmap-definition-RKZ34NQL-DgcgMyPk.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-_6BuMdDj.js → pieDiagram-4H26LBE5-3wWGb9eG.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-B2rM19W2.js → quadrantDiagram-W4KKPZXB-BeCXnQw9.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-DWj8b7vW.js → requirementDiagram-4Y6WPE33-Bi1UOHDz.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-D5dtYh0N.js → sankeyDiagram-5OEKKPKP-lrLUjjbb.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-DVkdn_qW.js → sequenceDiagram-3UESZ5HK-BFuqKz6Q.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-DgwD_fi6.js → stateDiagram-AJRCARHV-8DemQLhu.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DhM5ixYd.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-vNr_1UNX.js → timeline-definition-PNZ67QCA-uzEuVQXg.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-ChFcGAcu.js → vennDiagram-CIIHVFJN-BQTeZ_-o.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-C8PXoSWk.js → wardley-L42UT6IY-B6yM5Im7.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-C2nqOV6i.js → wardleyDiagram-YWT4CUSO-ChM8bmgn.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-BntaqhSB.js → xychartDiagram-2RQKCTM6-oNG6HyB1.js} +1 -1
- package/web-shell/index.html +2 -2
- package/chunks/chunk-5PLOQW7H.js +0 -830
- package/chunks/chunk-DMODRHNL.js +0 -649
- package/chunks/chunk-L34XSHIZ.js +0 -28
- package/chunks/chunk-N2TNM3QB.js +0 -9
- package/chunks/chunk-RECPKBBD.js +0 -622
- package/chunks/chunk-WLML6VIA.js +0 -18
- package/chunks/chunk-ZBBVBZBR.js +0 -137
- package/chunks/chunk-bdqvmfwv-OHYAFAAO.js +0 -17446
- package/chunks/discovery-XLHITE74.js +0 -220
- package/chunks/dispatch-FW7DX2CR.js +0 -43
- package/chunks/nonInteractiveCli-3XFIFXBR.js +0 -166
- package/chunks/opentui-entry-TEHHLGN7.js +0 -52419
- package/chunks/runtime-gate-T4ICWGQJ.js +0 -89
- package/chunks/wrapper-46Z24CTM.js +0 -35
- package/web-shell/assets/channel-BxvRq3pV.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-tL8nAxYf.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-tL8nAxYf.js +0 -1
- package/web-shell/assets/index-BgjULKyF.css +0 -5
- package/web-shell/assets/index-CxXlPYfl.js +0 -1789
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BWGkVGVB.js +0 -1
- /package/chunks/{chunk-44CTCCLY.js → chunk-NWNEANAT.js} +0 -0
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
EventBus,
|
|
7
7
|
logEventSizingFailed,
|
|
8
8
|
serializedBridgeEventByteLength
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-7U5G6JXI.js";
|
|
10
10
|
import {
|
|
11
11
|
JOURNAL_GROWTH_HARD_CAP_BYTES,
|
|
12
12
|
normalizeCompactedReplayMaxBytes,
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
} from "./chunk-OCPBI7J5.js";
|
|
20
20
|
import {
|
|
21
21
|
defaultSpawnChannelFactory
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-NHDR76JX.js";
|
|
23
23
|
import {
|
|
24
24
|
BridgeChannelClosedError,
|
|
25
25
|
BridgeTimeoutError,
|
|
@@ -29,7 +29,7 @@ import {
|
|
|
29
29
|
SessionRestoreTimeoutError,
|
|
30
30
|
createIdleWorkspaceExtensionsStatus,
|
|
31
31
|
createIdleWorkspaceHooksStatus
|
|
32
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-QNQAPSN2.js";
|
|
33
33
|
import {
|
|
34
34
|
ACTIVE_WORK_CLOSE_IF_UNHELD_PARAM,
|
|
35
35
|
ACTIVE_WORK_CLOSE_TIMEOUT_MS,
|
|
@@ -41,6 +41,7 @@ import {
|
|
|
41
41
|
ACTIVE_WORK_MAX_SNAPSHOT_SESSIONS,
|
|
42
42
|
ACTIVE_WORK_NOTIFICATION_METHOD,
|
|
43
43
|
ACTIVE_WORK_STALE_INTERVALS,
|
|
44
|
+
CHANNEL_PROMPT_META_KEY,
|
|
44
45
|
CHANNEL_STARTUP_PROFILE_META_KEY,
|
|
45
46
|
CHANNEL_STARTUP_PROFILE_VERSION,
|
|
46
47
|
DAEMON_CHANNEL_DELIVERY_META_KEY,
|
|
@@ -61,8 +62,9 @@ import {
|
|
|
61
62
|
TODO_STOP_GUARD_QUEUE_RELEASE_METHOD,
|
|
62
63
|
WORKTREE_MCP_DEFER_META_KEY,
|
|
63
64
|
clampActiveWorkIntervalMs,
|
|
64
|
-
isValidTrustedModelPrompt
|
|
65
|
-
|
|
65
|
+
isValidTrustedModelPrompt,
|
|
66
|
+
sessionCloseDrainBudgetMs
|
|
67
|
+
} from "./chunk-S5DWMTHO.js";
|
|
66
68
|
import {
|
|
67
69
|
BranchWhilePromptActiveError,
|
|
68
70
|
BridgeChannelQuarantinedError,
|
|
@@ -101,7 +103,7 @@ import {
|
|
|
101
103
|
EXTERNAL_TOOL_GUARD_READY_META_KEY,
|
|
102
104
|
EXTERNAL_TOOL_GUARD_REQUIRED_VALUE,
|
|
103
105
|
isValidExternalToolGuardDenialReason
|
|
104
|
-
} from "./chunk-
|
|
106
|
+
} from "./chunk-3VUENPWF.js";
|
|
105
107
|
import {
|
|
106
108
|
ClientSideConnection,
|
|
107
109
|
PROTOCOL_VERSION,
|
|
@@ -119,16 +121,16 @@ import {
|
|
|
119
121
|
metadataBudgetBytes,
|
|
120
122
|
normalizeSnapshotPayload,
|
|
121
123
|
stableSessionArtifactId
|
|
122
|
-
} from "./chunk-
|
|
124
|
+
} from "./chunk-4S5337WV.js";
|
|
123
125
|
import {
|
|
124
126
|
DAEMON_TRACEPARENT_META_KEY,
|
|
125
127
|
DAEMON_TRACESTATE_META_KEY
|
|
126
|
-
} from "./chunk-
|
|
128
|
+
} from "./chunk-TIGA2IVL.js";
|
|
127
129
|
import {
|
|
128
130
|
INVOCATION_CONTEXT_META_KEY,
|
|
129
131
|
PRIVATE_ACP_CAPABILITY_ENV,
|
|
130
132
|
PRIVATE_PARENT_CAPABILITY_META_KEY
|
|
131
|
-
} from "./chunk-
|
|
133
|
+
} from "./chunk-RVOJ2FBP.js";
|
|
132
134
|
import {
|
|
133
135
|
init_esbuild_shims
|
|
134
136
|
} from "./chunk-5O2XNYP6.js";
|
|
@@ -297,6 +299,19 @@ var TurnBoundaryCompactionEngine = class {
|
|
|
297
299
|
this.makeHistoryTruncatedEvent(compactedTurns.length)
|
|
298
300
|
);
|
|
299
301
|
}
|
|
302
|
+
return {
|
|
303
|
+
compactedTurns,
|
|
304
|
+
liveJournal: this.liveJournalSnapshot(liveReplayMode),
|
|
305
|
+
lastEventId: this.lastEventId
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Snapshot of only the in-flight live journal — the events ingested
|
|
310
|
+
* since the last turn boundary (a boundary folds its turn into the
|
|
311
|
+
* replay window and resets the journal). Cheaper than `snapshot()`:
|
|
312
|
+
* no replay-window flatten.
|
|
313
|
+
*/
|
|
314
|
+
liveJournalSnapshot(liveReplayMode = "full") {
|
|
300
315
|
const journal = liveReplayMode === "summary" ? this.summaryJournal : this.fullJournal;
|
|
301
316
|
const journalRecordId = liveReplayMode === "summary" ? this.summaryRecordId : this.activeRecordId;
|
|
302
317
|
const liveJournal = journal.entries.map(
|
|
@@ -323,11 +338,7 @@ var TurnBoundaryCompactionEngine = class {
|
|
|
323
338
|
}
|
|
324
339
|
});
|
|
325
340
|
}
|
|
326
|
-
return
|
|
327
|
-
compactedTurns,
|
|
328
|
-
liveJournal,
|
|
329
|
-
lastEventId: this.lastEventId
|
|
330
|
-
};
|
|
341
|
+
return liveJournal;
|
|
331
342
|
}
|
|
332
343
|
seed(snapshot) {
|
|
333
344
|
if (this.closed) return;
|
|
@@ -594,7 +605,7 @@ var TurnBoundaryCompactionEngine = class {
|
|
|
594
605
|
const slot = this.slots[existingIdx];
|
|
595
606
|
slot.chunks.push(text);
|
|
596
607
|
if (event.id !== void 0) slot.lastEventId = event.id;
|
|
597
|
-
slot.lastMeta =
|
|
608
|
+
slot.lastMeta = mergeTranscriptUpdateMeta(slot.lastMeta, meta);
|
|
598
609
|
slot.lastEnvelopeMeta = event._meta ?? slot.lastEnvelopeMeta;
|
|
599
610
|
slot.lastTurn = captureTurnFields(event, slot.lastTurn);
|
|
600
611
|
slot.lastSessionId = captureSessionId(event) ?? slot.lastSessionId;
|
|
@@ -618,7 +629,7 @@ var TurnBoundaryCompactionEngine = class {
|
|
|
618
629
|
if (lastSlot && lastSlot.kind === kind && lastSlot.parentToolCallId == null && stringArraysEqual(lastSlot.sourceRecordIds, sourceRecordIds)) {
|
|
619
630
|
lastSlot.chunks.push(text);
|
|
620
631
|
if (event.id !== void 0) lastSlot.lastEventId = event.id;
|
|
621
|
-
lastSlot.lastMeta =
|
|
632
|
+
lastSlot.lastMeta = mergeTranscriptUpdateMeta(lastSlot.lastMeta, meta);
|
|
622
633
|
lastSlot.lastEnvelopeMeta = event._meta ?? lastSlot.lastEnvelopeMeta;
|
|
623
634
|
lastSlot.lastTurn = captureTurnFields(event, lastSlot.lastTurn);
|
|
624
635
|
lastSlot.lastSessionId = captureSessionId(event) ?? lastSlot.lastSessionId;
|
|
@@ -1043,13 +1054,26 @@ function mergeTranscriptUpdateMeta(existing, incoming) {
|
|
|
1043
1054
|
...extractSourceRecordIdsFromMeta(incomingRecord) ?? []
|
|
1044
1055
|
])
|
|
1045
1056
|
];
|
|
1057
|
+
const existingTranscript = extractTranscriptMeta(existingRecord);
|
|
1058
|
+
const incomingTranscript = extractTranscriptMeta(incomingRecord);
|
|
1046
1059
|
return {
|
|
1047
1060
|
...existingRecord ?? {},
|
|
1048
1061
|
...incomingRecord ?? {},
|
|
1049
|
-
...sourceRecordIds.length > 0 ? {
|
|
1062
|
+
...existingTranscript || incomingTranscript || sourceRecordIds.length > 0 ? {
|
|
1063
|
+
qwenTranscript: {
|
|
1064
|
+
...existingTranscript ?? {},
|
|
1065
|
+
...incomingTranscript ?? {},
|
|
1066
|
+
...sourceRecordIds.length > 0 ? { sourceRecordIds } : {}
|
|
1067
|
+
}
|
|
1068
|
+
} : {}
|
|
1050
1069
|
};
|
|
1051
1070
|
}
|
|
1052
1071
|
__name(mergeTranscriptUpdateMeta, "mergeTranscriptUpdateMeta");
|
|
1072
|
+
function extractTranscriptMeta(meta) {
|
|
1073
|
+
const transcript = meta?.["qwenTranscript"];
|
|
1074
|
+
return typeof transcript === "object" && transcript !== null ? transcript : void 0;
|
|
1075
|
+
}
|
|
1076
|
+
__name(extractTranscriptMeta, "extractTranscriptMeta");
|
|
1053
1077
|
|
|
1054
1078
|
// packages/acp-bridge/src/journalGrowthPolicy.ts
|
|
1055
1079
|
init_esbuild_shims();
|
|
@@ -2622,12 +2646,13 @@ var BridgeClient = class {
|
|
|
2622
2646
|
const toolCallId = params["toolCallId"];
|
|
2623
2647
|
const toolName = params["toolName"];
|
|
2624
2648
|
const args = params["arguments"];
|
|
2625
|
-
if (typeof sessionId !== "string" || sessionId.length === 0 || typeof promptId !== "string" || promptId.length === 0 || typeof toolCallId !== "string" || toolCallId.length === 0 || typeof toolName !== "string" || toolName.length === 0 || !isRecord2(args)) {
|
|
2649
|
+
if (typeof sessionId !== "string" || sessionId.length === 0 || promptId !== void 0 && (typeof promptId !== "string" || promptId.length === 0) || typeof toolCallId !== "string" || toolCallId.length === 0 || typeof toolName !== "string" || toolName.length === 0 || !isRecord2(args)) {
|
|
2626
2650
|
throw RequestError.invalidParams(
|
|
2627
2651
|
void 0,
|
|
2628
2652
|
"Invalid external tool guard request"
|
|
2629
2653
|
);
|
|
2630
2654
|
}
|
|
2655
|
+
const promptScoped = promptId !== void 0;
|
|
2631
2656
|
if (!this.ownsSession(sessionId)) {
|
|
2632
2657
|
throw RequestError.invalidParams(
|
|
2633
2658
|
void 0,
|
|
@@ -2635,21 +2660,26 @@ var BridgeClient = class {
|
|
|
2635
2660
|
);
|
|
2636
2661
|
}
|
|
2637
2662
|
const entry = this.resolveEntry(sessionId);
|
|
2638
|
-
if (!entry || !entry.promptActive || entry.activePromptId !== promptId) {
|
|
2663
|
+
if (!entry || promptScoped && (!entry.promptActive || entry.activePromptId !== promptId)) {
|
|
2639
2664
|
throw RequestError.invalidParams(
|
|
2640
2665
|
void 0,
|
|
2641
2666
|
"External tool guard prompt is not the active prompt"
|
|
2642
2667
|
);
|
|
2643
2668
|
}
|
|
2669
|
+
const invocationCwd = params["invocationCwd"];
|
|
2644
2670
|
const decision = await this.externalToolGuard({
|
|
2645
2671
|
sessionId: entry.sessionId,
|
|
2646
|
-
promptId:
|
|
2672
|
+
...promptScoped ? { promptId } : {},
|
|
2647
2673
|
toolCallId,
|
|
2648
2674
|
toolName,
|
|
2649
|
-
arguments: args
|
|
2675
|
+
arguments: args,
|
|
2676
|
+
effectiveCwd: entry.effectiveCwd,
|
|
2677
|
+
// Forwarded verbatim and explicitly untrusted: the host policy decides
|
|
2678
|
+
// whether it can establish this scope from state it owns.
|
|
2679
|
+
...typeof invocationCwd === "string" && invocationCwd.length > 0 ? { invocationCwd } : {}
|
|
2650
2680
|
});
|
|
2651
2681
|
const currentEntry = this.resolveEntry(sessionId);
|
|
2652
|
-
if (!this.ownsSession(sessionId) || currentEntry !== entry || !currentEntry.promptActive || currentEntry.activePromptId !== promptId) {
|
|
2682
|
+
if (!this.ownsSession(sessionId) || currentEntry !== entry || promptScoped && (!currentEntry.promptActive || currentEntry.activePromptId !== promptId)) {
|
|
2653
2683
|
throw RequestError.invalidParams(
|
|
2654
2684
|
void 0,
|
|
2655
2685
|
"External tool guard prompt is no longer active"
|
|
@@ -6660,18 +6690,27 @@ function broadcastPromptCancelledOnce(entry, sessionId, promptId, originatorClie
|
|
|
6660
6690
|
);
|
|
6661
6691
|
}
|
|
6662
6692
|
__name(broadcastPromptCancelledOnce, "broadcastPromptCancelledOnce");
|
|
6663
|
-
function broadcastTurnComplete(entry, sessionId, promptResult, promptId, originatorClientId) {
|
|
6693
|
+
function broadcastTurnComplete(entry, sessionId, promptResult, promptId, originatorClientId, mutateTurnState) {
|
|
6664
6694
|
try {
|
|
6665
|
-
|
|
6695
|
+
const meta = promptResult["_meta"] && typeof promptResult["_meta"] === "object" ? promptResult["_meta"] : void 0;
|
|
6696
|
+
const rawBranchPoint = meta?.["qwen.branchPoint"] && typeof meta["qwen.branchPoint"] === "object" ? meta["qwen.branchPoint"] : void 0;
|
|
6697
|
+
const branchPoint = promptResult.stopReason === "end_turn" && typeof rawBranchPoint?.["assistantRecordUuid"] === "string" && CHAT_RECORD_UUID_RE.test(rawBranchPoint["assistantRecordUuid"]) && typeof rawBranchPoint["checkpointUuid"] === "string" && CHAT_RECORD_UUID_RE.test(rawBranchPoint["checkpointUuid"]) ? {
|
|
6698
|
+
assistantRecordUuid: rawBranchPoint["assistantRecordUuid"],
|
|
6699
|
+
checkpointUuid: rawBranchPoint["checkpointUuid"]
|
|
6700
|
+
} : void 0;
|
|
6701
|
+
const published = entry.events.publish({
|
|
6666
6702
|
type: "turn_complete",
|
|
6667
6703
|
...promptId ? { promptId } : {},
|
|
6668
6704
|
data: {
|
|
6669
6705
|
sessionId,
|
|
6670
6706
|
stopReason: promptResult.stopReason ?? "end_turn",
|
|
6671
|
-
...promptId ? { promptId } : {}
|
|
6707
|
+
...promptId ? { promptId } : {},
|
|
6708
|
+
...branchPoint ? { branchPoint } : {}
|
|
6672
6709
|
},
|
|
6673
6710
|
...originatorClientId ? { originatorClientId } : {}
|
|
6674
6711
|
});
|
|
6712
|
+
if (mutateTurnState && published !== void 0)
|
|
6713
|
+
entry.turnErrorEvent = void 0;
|
|
6675
6714
|
} catch {
|
|
6676
6715
|
}
|
|
6677
6716
|
}
|
|
@@ -6703,6 +6742,14 @@ function extractJsonRpcErrorDetail(data) {
|
|
|
6703
6742
|
return void 0;
|
|
6704
6743
|
}
|
|
6705
6744
|
__name(extractJsonRpcErrorDetail, "extractJsonRpcErrorDetail");
|
|
6745
|
+
function extractJsonRpcErrorField(err, field) {
|
|
6746
|
+
if (typeof err !== "object" || err === null) return void 0;
|
|
6747
|
+
const data = err.data;
|
|
6748
|
+
if (typeof data !== "object" || data === null) return void 0;
|
|
6749
|
+
const value = data[field];
|
|
6750
|
+
return typeof value === "string" && value.length > 0 ? value : void 0;
|
|
6751
|
+
}
|
|
6752
|
+
__name(extractJsonRpcErrorField, "extractJsonRpcErrorField");
|
|
6706
6753
|
function extractErrorCode(err) {
|
|
6707
6754
|
if (typeof err !== "object" || err === null || !("code" in err))
|
|
6708
6755
|
return void 0;
|
|
@@ -6712,14 +6759,79 @@ function extractErrorCode(err) {
|
|
|
6712
6759
|
return void 0;
|
|
6713
6760
|
}
|
|
6714
6761
|
__name(extractErrorCode, "extractErrorCode");
|
|
6762
|
+
var REFRESH_APPEND_BOOKKEEPING_EVENT_TYPES = /* @__PURE__ */ new Set([
|
|
6763
|
+
"pending_prompt_added",
|
|
6764
|
+
"pending_prompt_completed",
|
|
6765
|
+
"prompt_cancelled",
|
|
6766
|
+
"model_switched",
|
|
6767
|
+
"model_switch_failed",
|
|
6768
|
+
"approval_mode_changed",
|
|
6769
|
+
"language_changed",
|
|
6770
|
+
"session_metadata_updated",
|
|
6771
|
+
"session_cwd_changed",
|
|
6772
|
+
"artifact_changed",
|
|
6773
|
+
"settings_changed",
|
|
6774
|
+
"extensions_changed",
|
|
6775
|
+
"mcp_server_changed",
|
|
6776
|
+
"mcp_server_added",
|
|
6777
|
+
"mcp_server_removed",
|
|
6778
|
+
"user_shell_command",
|
|
6779
|
+
"user_shell_result",
|
|
6780
|
+
// Workspace-level fan-out (workspace service, git watcher, memory /
|
|
6781
|
+
// agent CRUD, device-flow registry) reaches every session bus via
|
|
6782
|
+
// `publishWorkspaceEvent` while idle. The `auth_device_flow_*` members
|
|
6783
|
+
// mirror the closed `DeviceFlowEventEmission` union — audit that union
|
|
6784
|
+
// when it grows.
|
|
6785
|
+
"tool_toggled",
|
|
6786
|
+
"workspace_initialized",
|
|
6787
|
+
"mcp_server_restarted",
|
|
6788
|
+
"mcp_server_restart_refused",
|
|
6789
|
+
"settings_reloaded",
|
|
6790
|
+
"trust_change_requested",
|
|
6791
|
+
"memory_changed",
|
|
6792
|
+
"agent_changed",
|
|
6793
|
+
"git_status_changed",
|
|
6794
|
+
"git_branch_changed",
|
|
6795
|
+
"github_setup_completed",
|
|
6796
|
+
"auth_device_flow_started",
|
|
6797
|
+
"auth_device_flow_throttled",
|
|
6798
|
+
"auth_device_flow_authorized",
|
|
6799
|
+
"auth_device_flow_failed",
|
|
6800
|
+
"auth_device_flow_cancelled"
|
|
6801
|
+
]);
|
|
6802
|
+
function isIdleBookkeepingSessionUpdate(event) {
|
|
6803
|
+
if (event.type !== "session_update") return false;
|
|
6804
|
+
const data = event.data;
|
|
6805
|
+
if (!data || typeof data !== "object" || Array.isArray(data)) return false;
|
|
6806
|
+
const update = data["update"];
|
|
6807
|
+
if (!update || typeof update !== "object" || Array.isArray(update))
|
|
6808
|
+
return false;
|
|
6809
|
+
const updateRecord = update;
|
|
6810
|
+
const subtype = updateRecord["sessionUpdate"];
|
|
6811
|
+
if (subtype === "available_commands_update" || subtype === "current_mode_update") {
|
|
6812
|
+
return true;
|
|
6813
|
+
}
|
|
6814
|
+
const meta = updateRecord["_meta"];
|
|
6815
|
+
if (!meta || typeof meta !== "object" || Array.isArray(meta)) return false;
|
|
6816
|
+
return meta["source"] === "user-shell";
|
|
6817
|
+
}
|
|
6818
|
+
__name(isIdleBookkeepingSessionUpdate, "isIdleBookkeepingSessionUpdate");
|
|
6819
|
+
function isRefreshAppendTurnContent(event) {
|
|
6820
|
+
if (event.type === "history_truncated") return false;
|
|
6821
|
+
if (REFRESH_APPEND_BOOKKEEPING_EVENT_TYPES.has(event.type)) return false;
|
|
6822
|
+
return !isIdleBookkeepingSessionUpdate(event);
|
|
6823
|
+
}
|
|
6824
|
+
__name(isRefreshAppendTurnContent, "isRefreshAppendTurnContent");
|
|
6715
6825
|
function classifyTurnErrorKind(message) {
|
|
6716
6826
|
return message.trim().toLowerCase() === "terminated" ? "model_stream_interrupted" : void 0;
|
|
6717
6827
|
}
|
|
6718
6828
|
__name(classifyTurnErrorKind, "classifyTurnErrorKind");
|
|
6719
6829
|
function broadcastTurnError(entry, sessionId, err, promptId, originatorClientId, mutateTurnState) {
|
|
6720
6830
|
const message = extractErrorMessage(err);
|
|
6721
|
-
const
|
|
6722
|
-
const errorKind = classifyTurnErrorKind(message);
|
|
6831
|
+
const structuredErrorKind = extractJsonRpcErrorField(err, "errorKind");
|
|
6832
|
+
const errorKind = structuredErrorKind ?? classifyTurnErrorKind(message);
|
|
6833
|
+
const code = structuredErrorKind !== void 0 ? extractJsonRpcErrorField(err, "code") ?? extractErrorCode(err) : extractErrorCode(err);
|
|
6834
|
+
const loopType = extractJsonRpcErrorField(err, "loopType");
|
|
6723
6835
|
if (errorKind) {
|
|
6724
6836
|
writeServeDebugLine(
|
|
6725
6837
|
`turn_error classified session=${JSON.stringify(sessionId)} message=${JSON.stringify(message)} errorKind=${JSON.stringify(errorKind)}` + (code ? ` code=${JSON.stringify(code)}` : "") + (promptId ? ` promptId=${JSON.stringify(promptId)}` : "")
|
|
@@ -6734,7 +6846,7 @@ function broadcastTurnError(entry, sessionId, err, promptId, originatorClientId,
|
|
|
6734
6846
|
};
|
|
6735
6847
|
}
|
|
6736
6848
|
try {
|
|
6737
|
-
entry.events.publish({
|
|
6849
|
+
const published = entry.events.publish({
|
|
6738
6850
|
type: "turn_error",
|
|
6739
6851
|
...promptId ? { promptId } : {},
|
|
6740
6852
|
data: {
|
|
@@ -6742,10 +6854,14 @@ function broadcastTurnError(entry, sessionId, err, promptId, originatorClientId,
|
|
|
6742
6854
|
message,
|
|
6743
6855
|
...code ? { code } : {},
|
|
6744
6856
|
...errorKind ? { errorKind } : {},
|
|
6857
|
+
...loopType ? { loopType } : {},
|
|
6745
6858
|
...promptId ? { promptId } : {}
|
|
6746
6859
|
},
|
|
6747
6860
|
...originatorClientId ? { originatorClientId } : {}
|
|
6748
6861
|
});
|
|
6862
|
+
if (mutateTurnState) {
|
|
6863
|
+
entry.turnErrorEvent = published;
|
|
6864
|
+
}
|
|
6749
6865
|
} catch {
|
|
6750
6866
|
}
|
|
6751
6867
|
}
|
|
@@ -6759,13 +6875,21 @@ function publishPromptTerminal(entry, pendingEntry, terminal) {
|
|
|
6759
6875
|
}
|
|
6760
6876
|
pendingEntry.terminalPublished = true;
|
|
6761
6877
|
const originatorClientId = pendingEntry.originatorClientId;
|
|
6878
|
+
const mutateTurnState = pendingEntry.state === "running";
|
|
6879
|
+
if (!mutateTurnState && entry.turnErrorEvent) {
|
|
6880
|
+
const journal = entry.events.liveJournalSnapshot() ?? [];
|
|
6881
|
+
if (journal.some(isRefreshAppendTurnContent)) {
|
|
6882
|
+
entry.turnErrorEvent = void 0;
|
|
6883
|
+
}
|
|
6884
|
+
}
|
|
6762
6885
|
if (terminal.kind === "complete") {
|
|
6763
6886
|
broadcastTurnComplete(
|
|
6764
6887
|
entry,
|
|
6765
6888
|
entry.sessionId,
|
|
6766
6889
|
terminal.result,
|
|
6767
6890
|
pendingEntry.promptId,
|
|
6768
|
-
originatorClientId
|
|
6891
|
+
originatorClientId,
|
|
6892
|
+
mutateTurnState
|
|
6769
6893
|
);
|
|
6770
6894
|
} else if (terminal.kind === "cancelled") {
|
|
6771
6895
|
broadcastTurnComplete(
|
|
@@ -6773,7 +6897,8 @@ function publishPromptTerminal(entry, pendingEntry, terminal) {
|
|
|
6773
6897
|
entry.sessionId,
|
|
6774
6898
|
{ stopReason: "cancelled" },
|
|
6775
6899
|
pendingEntry.promptId,
|
|
6776
|
-
originatorClientId
|
|
6900
|
+
originatorClientId,
|
|
6901
|
+
mutateTurnState
|
|
6777
6902
|
);
|
|
6778
6903
|
} else {
|
|
6779
6904
|
broadcastTurnError(
|
|
@@ -6782,13 +6907,7 @@ function publishPromptTerminal(entry, pendingEntry, terminal) {
|
|
|
6782
6907
|
terminal.err,
|
|
6783
6908
|
pendingEntry.promptId,
|
|
6784
6909
|
originatorClientId,
|
|
6785
|
-
|
|
6786
|
-
// `state === 'running'` gate (not `activePromptId`) is deliberate:
|
|
6787
|
-
// on the normal settle path `settleActivePromptState` runs in
|
|
6788
|
-
// `promptPromise.finally` BEFORE the terminal is published, so
|
|
6789
|
-
// `activePromptId` is already cleared when a genuine active failure
|
|
6790
|
-
// lands here.
|
|
6791
|
-
pendingEntry.state === "running"
|
|
6910
|
+
mutateTurnState
|
|
6792
6911
|
);
|
|
6793
6912
|
}
|
|
6794
6913
|
}
|
|
@@ -6851,6 +6970,7 @@ var MAX_SHELL_OUTPUT_FOR_HISTORY = 1e4;
|
|
|
6851
6970
|
var MAX_MID_TURN_QUEUE_DEPTH = 20;
|
|
6852
6971
|
var DEFAULT_MAX_SESSIONS = 32;
|
|
6853
6972
|
var DEFAULT_MAX_PENDING_PROMPTS_PER_SESSION = 5;
|
|
6973
|
+
var CHAT_RECORD_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
6854
6974
|
var MAX_EVENT_RING_SIZE = 1e6;
|
|
6855
6975
|
var DEFAULT_PERMISSION_TIMEOUT_MS = 5 * 60 * 1e3;
|
|
6856
6976
|
var DEFAULT_MAX_PENDING_PER_SESSION = 64;
|
|
@@ -7046,6 +7166,12 @@ function createAcpSessionBridge(opts) {
|
|
|
7046
7166
|
if (entryHasLocalWork(entry)) return false;
|
|
7047
7167
|
const owner = channelInfoForEntry(entry);
|
|
7048
7168
|
if (owner?.pendingRestoreIds.has(entry.sessionId)) return false;
|
|
7169
|
+
const capability = owner?.activeWork;
|
|
7170
|
+
if (capability && !owner.isQuarantined && !owner.restoreSettlementOverdue && ACTIVE_WORK_HOLD_CATEGORIES.some(
|
|
7171
|
+
(category) => !capability.categories.includes(category)
|
|
7172
|
+
)) {
|
|
7173
|
+
return false;
|
|
7174
|
+
}
|
|
7049
7175
|
return !childReportsHeldWork(entry);
|
|
7050
7176
|
}
|
|
7051
7177
|
__name(entryIsAutoCloseCandidate, "entryIsAutoCloseCandidate");
|
|
@@ -7054,12 +7180,15 @@ function createAcpSessionBridge(opts) {
|
|
|
7054
7180
|
}
|
|
7055
7181
|
__name(isClosingOrAuthorizingClose, "isClosingOrAuthorizingClose");
|
|
7056
7182
|
async function maybeCloseIdleSession(entry, reason) {
|
|
7057
|
-
if (!
|
|
7058
|
-
|
|
7183
|
+
if (byId.get(entry.sessionId) === entry && !isClosingOrAuthorizingClose(entry) && entry.spawnOwnerWantedKill && entry.attachCount === 0) {
|
|
7184
|
+
writeStderrLine(
|
|
7185
|
+
`qwen serve: completing deferred kill of session ${JSON.stringify(entry.sessionId)} (${reason})`
|
|
7186
|
+
);
|
|
7059
7187
|
await bridgeApi.killSession(entry.sessionId).catch(() => {
|
|
7060
7188
|
});
|
|
7061
7189
|
return;
|
|
7062
7190
|
}
|
|
7191
|
+
if (!entryIsAutoCloseCandidate(entry)) return;
|
|
7063
7192
|
if (entry.clientIds.size > 0) return;
|
|
7064
7193
|
await closeIfChildUnheld(entry, {
|
|
7065
7194
|
trigger: reason,
|
|
@@ -7096,7 +7225,10 @@ function createAcpSessionBridge(opts) {
|
|
|
7096
7225
|
const response = await withTimeout(
|
|
7097
7226
|
entry.connection.extMethod(SERVE_CONTROL_EXT_METHODS.sessionClose, {
|
|
7098
7227
|
sessionId: entry.sessionId,
|
|
7099
|
-
[ACTIVE_WORK_CLOSE_IF_UNHELD_PARAM]: true
|
|
7228
|
+
[ACTIVE_WORK_CLOSE_IF_UNHELD_PARAM]: true,
|
|
7229
|
+
drainTimeoutMs: sessionCloseDrainBudgetMs(
|
|
7230
|
+
ACTIVE_WORK_CLOSE_TIMEOUT_MS
|
|
7231
|
+
)
|
|
7100
7232
|
}),
|
|
7101
7233
|
ACTIVE_WORK_CLOSE_TIMEOUT_MS,
|
|
7102
7234
|
SERVE_CONTROL_EXT_METHODS.sessionClose
|
|
@@ -7833,7 +7965,8 @@ function createAcpSessionBridge(opts) {
|
|
|
7833
7965
|
_meta: {
|
|
7834
7966
|
[ACTIVE_WORK_HEARTBEAT_META_KEY]: {
|
|
7835
7967
|
v: ACTIVE_WORK_HEARTBEAT_VERSION,
|
|
7836
|
-
intervalMs: ACTIVE_WORK_HEARTBEAT_INTERVAL_MS
|
|
7968
|
+
intervalMs: ACTIVE_WORK_HEARTBEAT_INTERVAL_MS,
|
|
7969
|
+
categories: [...ACTIVE_WORK_HOLD_CATEGORIES]
|
|
7837
7970
|
},
|
|
7838
7971
|
[CHANNEL_STARTUP_PROFILE_META_KEY]: {
|
|
7839
7972
|
v: CHANNEL_STARTUP_PROFILE_VERSION
|
|
@@ -8625,7 +8758,9 @@ function createAcpSessionBridge(opts) {
|
|
|
8625
8758
|
SERVE_CONTROL_EXT_METHODS.sessionClose,
|
|
8626
8759
|
{
|
|
8627
8760
|
sessionId: entry.sessionId,
|
|
8628
|
-
drainTimeoutMs:
|
|
8761
|
+
drainTimeoutMs: sessionCloseDrainBudgetMs(
|
|
8762
|
+
opts2?.timeoutMs ?? initTimeoutMs
|
|
8763
|
+
),
|
|
8629
8764
|
...opts2?.requireFlush === true ? { requireFlush: true } : {}
|
|
8630
8765
|
}
|
|
8631
8766
|
);
|
|
@@ -9124,8 +9259,19 @@ function createAcpSessionBridge(opts) {
|
|
|
9124
9259
|
if (cursor !== void 0) seenCursors.add(cursor);
|
|
9125
9260
|
} while (page.events.length === 0 && page.hasMore && cursor !== void 0 && page.partial !== true && page.replayError === void 0);
|
|
9126
9261
|
if (byId.get(entry.sessionId) === entry && !entry.promptActive && entry.events.epoch === eventEpoch && entry.events.lastEventId === lastEventId) {
|
|
9262
|
+
let compactedReplay = page.events;
|
|
9263
|
+
const turnErrorEvent = entry.turnErrorEvent;
|
|
9264
|
+
if (turnErrorEvent) {
|
|
9265
|
+
const journal = entry.events.liveJournalSnapshot() ?? [];
|
|
9266
|
+
const hasNewerTurnContent = journal.some(
|
|
9267
|
+
isRefreshAppendTurnContent
|
|
9268
|
+
);
|
|
9269
|
+
if (!hasNewerTurnContent) {
|
|
9270
|
+
compactedReplay = [...page.events, turnErrorEvent];
|
|
9271
|
+
}
|
|
9272
|
+
}
|
|
9127
9273
|
return {
|
|
9128
|
-
compactedReplay
|
|
9274
|
+
compactedReplay,
|
|
9129
9275
|
liveJournal: [],
|
|
9130
9276
|
lastEventId,
|
|
9131
9277
|
eventEpoch,
|
|
@@ -9415,7 +9561,7 @@ function createAcpSessionBridge(opts) {
|
|
|
9415
9561
|
SERVE_CONTROL_EXT_METHODS.sessionClose,
|
|
9416
9562
|
{
|
|
9417
9563
|
sessionId: req.sessionId,
|
|
9418
|
-
drainTimeoutMs:
|
|
9564
|
+
drainTimeoutMs: sessionCloseDrainBudgetMs(initTimeoutMs)
|
|
9419
9565
|
}
|
|
9420
9566
|
),
|
|
9421
9567
|
initTimeoutMs,
|
|
@@ -10548,6 +10694,7 @@ function createAcpSessionBridge(opts) {
|
|
|
10548
10694
|
delete meta[DAEMON_CHANNEL_DELIVERY_META_KEY];
|
|
10549
10695
|
delete meta[DAEMON_PROMPT_DISPLAY_TEXT_META_KEY];
|
|
10550
10696
|
delete meta[DAEMON_MODEL_PROMPT_META_KEY];
|
|
10697
|
+
delete meta[CHANNEL_PROMPT_META_KEY];
|
|
10551
10698
|
if (isRetry) {
|
|
10552
10699
|
meta[DAEMON_RETRY_META_KEY] = true;
|
|
10553
10700
|
}
|
|
@@ -10563,6 +10710,9 @@ function createAcpSessionBridge(opts) {
|
|
|
10563
10710
|
if (modelPrompt !== void 0) {
|
|
10564
10711
|
meta[DAEMON_MODEL_PROMPT_META_KEY] = modelPrompt;
|
|
10565
10712
|
}
|
|
10713
|
+
if (context?.channelPrompt === true) {
|
|
10714
|
+
meta[CHANNEL_PROMPT_META_KEY] = true;
|
|
10715
|
+
}
|
|
10566
10716
|
meta[INVOCATION_CONTEXT_META_KEY] = invocationContext;
|
|
10567
10717
|
if (Object.keys(meta).length > 0) {
|
|
10568
10718
|
copy._meta = meta;
|
|
@@ -10575,6 +10725,7 @@ function createAcpSessionBridge(opts) {
|
|
|
10575
10725
|
entry.activePromptId = pendingEntry.promptId;
|
|
10576
10726
|
delete entry.cancelBroadcastWithoutPrompt;
|
|
10577
10727
|
delete entry.turnError;
|
|
10728
|
+
delete entry.turnErrorEvent;
|
|
10578
10729
|
activePromptCounter++;
|
|
10579
10730
|
entry.sessionLastSeenAt = Date.now();
|
|
10580
10731
|
touchActivity();
|
|
@@ -10622,6 +10773,10 @@ function createAcpSessionBridge(opts) {
|
|
|
10622
10773
|
);
|
|
10623
10774
|
return;
|
|
10624
10775
|
}
|
|
10776
|
+
if (extractJsonRpcErrorField(err, "errorKind")) {
|
|
10777
|
+
cancelPendingForSession(sessionId);
|
|
10778
|
+
return;
|
|
10779
|
+
}
|
|
10625
10780
|
writeStderrLine(
|
|
10626
10781
|
`sendPrompt: forward failed for session ${sessionId}: ${extractErrorMessage(err)}`
|
|
10627
10782
|
);
|
|
@@ -10919,53 +11074,68 @@ function createAcpSessionBridge(opts) {
|
|
|
10919
11074
|
if (shuttingDown) throw new Error("AcpSessionBridge is shutting down");
|
|
10920
11075
|
const entry = byId.get(sessionId);
|
|
10921
11076
|
if (!entry) throw new SessionNotFoundError(sessionId);
|
|
11077
|
+
if (isClosingOrAuthorizingClose(entry)) {
|
|
11078
|
+
throw new SessionNotFoundError(sessionId, "The session is closing");
|
|
11079
|
+
}
|
|
10922
11080
|
const source = parseSessionSource(req.sourceType, req.sourceId);
|
|
10923
11081
|
if ("error" in source) {
|
|
10924
11082
|
throw new InvalidSessionMetadataError("sourceType", source.error);
|
|
10925
11083
|
}
|
|
10926
11084
|
const isSideTask = source.sourceType === "side_task";
|
|
10927
|
-
|
|
11085
|
+
const restoreBranch = isSideTask || req.atRecordId === void 0;
|
|
10928
11086
|
if (context?.clientId !== void 0) {
|
|
10929
|
-
|
|
11087
|
+
resolveTrustedClientId(entry, context.clientId);
|
|
10930
11088
|
}
|
|
10931
11089
|
const concurrentSideTask = isSideTask && entry.promptActive;
|
|
11090
|
+
if (!isSideTask && (entry.pendingPromptCount > 0 || entry.promptActive)) {
|
|
11091
|
+
throw new BranchWhilePromptActiveError(sessionId);
|
|
11092
|
+
}
|
|
10932
11093
|
const branchResult = (concurrentSideTask ? Promise.resolve() : entry.promptQueue).then(async () => {
|
|
10933
|
-
if (entry.
|
|
10934
|
-
throw new
|
|
11094
|
+
if (isClosingOrAuthorizingClose(entry) || byId.get(sessionId) !== entry) {
|
|
11095
|
+
throw new SessionNotFoundError(sessionId, "The session is closing");
|
|
10935
11096
|
}
|
|
10936
11097
|
assertFreshSessionsAvailable();
|
|
10937
|
-
|
|
10938
|
-
|
|
11098
|
+
let admission;
|
|
11099
|
+
if (restoreBranch) {
|
|
11100
|
+
if (byId.size + inFlightSpawns.size + inFlightRestores.size >= maxSessions) {
|
|
11101
|
+
throw new SessionLimitExceededError(maxSessions);
|
|
11102
|
+
}
|
|
11103
|
+
admission = reserveFreshSession({
|
|
11104
|
+
operation: "branch",
|
|
11105
|
+
workspaceCwd: boundWorkspace,
|
|
11106
|
+
sourceSessionId: sessionId
|
|
11107
|
+
});
|
|
10939
11108
|
}
|
|
10940
|
-
const admission = reserveFreshSession({
|
|
10941
|
-
operation: "branch",
|
|
10942
|
-
workspaceCwd: boundWorkspace,
|
|
10943
|
-
sourceSessionId: sessionId
|
|
10944
|
-
});
|
|
10945
11109
|
let admissionReleased = false;
|
|
10946
11110
|
const releaseAdmissionOnce = /* @__PURE__ */ __name(() => {
|
|
10947
|
-
if (admissionReleased) return;
|
|
11111
|
+
if (admissionReleased || !admission) return;
|
|
10948
11112
|
admissionReleased = true;
|
|
10949
11113
|
releaseFreshSessionReservation(admission);
|
|
10950
11114
|
}, "releaseAdmissionOnce");
|
|
10951
11115
|
try {
|
|
10952
|
-
|
|
10953
|
-
|
|
10954
|
-
|
|
10955
|
-
|
|
10956
|
-
|
|
10957
|
-
|
|
10958
|
-
|
|
10959
|
-
|
|
10960
|
-
cwd: boundWorkspace,
|
|
10961
|
-
name: req.name
|
|
10962
|
-
}
|
|
10963
|
-
),
|
|
10964
|
-
getTransportClosedReject(entry)
|
|
10965
|
-
]),
|
|
10966
|
-
initTimeoutMs,
|
|
10967
|
-
isSideTask ? "createSideTaskSession" : "branchSession"
|
|
11116
|
+
const mutation = entry.connection.extMethod(
|
|
11117
|
+
isSideTask ? SERVE_CONTROL_EXT_METHODS.sessionSideTask : SERVE_CONTROL_EXT_METHODS.sessionBranch,
|
|
11118
|
+
{
|
|
11119
|
+
sessionId,
|
|
11120
|
+
cwd: boundWorkspace,
|
|
11121
|
+
name: req.name,
|
|
11122
|
+
...req.atRecordId !== void 0 ? { atRecordId: req.atRecordId } : {}
|
|
11123
|
+
}
|
|
10968
11124
|
);
|
|
11125
|
+
let result;
|
|
11126
|
+
try {
|
|
11127
|
+
result = await Promise.race([
|
|
11128
|
+
mutation,
|
|
11129
|
+
getTransportClosedReject(entry)
|
|
11130
|
+
]);
|
|
11131
|
+
} catch (err) {
|
|
11132
|
+
const data = err?.data;
|
|
11133
|
+
if (!isSideTask && data && typeof data === "object" && data.errorKind === "session_busy") {
|
|
11134
|
+
const msg = err?.message ?? "Branch failed";
|
|
11135
|
+
throw new SessionBusyError(sessionId, msg);
|
|
11136
|
+
}
|
|
11137
|
+
throw err;
|
|
11138
|
+
}
|
|
10969
11139
|
if (!result || typeof result.newSessionId !== "string") {
|
|
10970
11140
|
throw new Error(
|
|
10971
11141
|
`branchSession: agent returned invalid response: ${JSON.stringify(result)}`
|
|
@@ -10973,6 +11143,17 @@ function createAcpSessionBridge(opts) {
|
|
|
10973
11143
|
}
|
|
10974
11144
|
const rawBranchName = result.displayName ?? result.title;
|
|
10975
11145
|
const branchDisplayName = typeof rawBranchName === "string" ? rawBranchName : result.newSessionId.slice(0, 8);
|
|
11146
|
+
if (!restoreBranch) {
|
|
11147
|
+
return {
|
|
11148
|
+
sessionId: result.newSessionId,
|
|
11149
|
+
displayName: branchDisplayName,
|
|
11150
|
+
forkedFrom: {
|
|
11151
|
+
sessionId,
|
|
11152
|
+
displayName: entry.displayName ?? sessionId.slice(0, 8)
|
|
11153
|
+
}
|
|
11154
|
+
};
|
|
11155
|
+
}
|
|
11156
|
+
const ci = await ensureChannel();
|
|
10976
11157
|
let restored;
|
|
10977
11158
|
try {
|
|
10978
11159
|
const hideInheritedHistory = req.replayInheritedHistory === false;
|
|
@@ -10995,7 +11176,7 @@ function createAcpSessionBridge(opts) {
|
|
|
10995
11176
|
releaseAdmissionOnce();
|
|
10996
11177
|
} catch (restoreErr) {
|
|
10997
11178
|
writeStderrLine(
|
|
10998
|
-
`qwen serve: branchSession load failed for ${result.newSessionId}
|
|
11179
|
+
`qwen serve: branchSession load failed for ${result.newSessionId}; closing partial live state while preserving the committed session...`
|
|
10999
11180
|
);
|
|
11000
11181
|
try {
|
|
11001
11182
|
if (!ci.isDying) {
|
|
@@ -11005,7 +11186,8 @@ function createAcpSessionBridge(opts) {
|
|
|
11005
11186
|
SERVE_CONTROL_EXT_METHODS.sessionClose,
|
|
11006
11187
|
{
|
|
11007
11188
|
sessionId: result.newSessionId,
|
|
11008
|
-
cwd: boundWorkspace
|
|
11189
|
+
cwd: boundWorkspace,
|
|
11190
|
+
drainTimeoutMs: sessionCloseDrainBudgetMs(initTimeoutMs)
|
|
11009
11191
|
}
|
|
11010
11192
|
),
|
|
11011
11193
|
channelUnavailableReject(
|
|
@@ -11019,7 +11201,7 @@ function createAcpSessionBridge(opts) {
|
|
|
11019
11201
|
}
|
|
11020
11202
|
} catch (cleanupErr) {
|
|
11021
11203
|
writeStderrLine(
|
|
11022
|
-
`qwen serve: branchSession
|
|
11204
|
+
`qwen serve: branchSession live-state close for ${result.newSessionId} failed: ${cleanupErr instanceof Error ? cleanupErr.message : cleanupErr}`
|
|
11023
11205
|
);
|
|
11024
11206
|
}
|
|
11025
11207
|
throw restoreErr;
|
|
@@ -11049,19 +11231,6 @@ function createAcpSessionBridge(opts) {
|
|
|
11049
11231
|
);
|
|
11050
11232
|
}
|
|
11051
11233
|
}
|
|
11052
|
-
if (!isSideTask) {
|
|
11053
|
-
const eventData = {
|
|
11054
|
-
sourceSessionId: sessionId,
|
|
11055
|
-
newSessionId: result.newSessionId,
|
|
11056
|
-
displayName: branchDisplayName
|
|
11057
|
-
};
|
|
11058
|
-
const branchEnvelope = {
|
|
11059
|
-
type: "session_branched",
|
|
11060
|
-
data: eventData,
|
|
11061
|
-
...originatorClientId ? { originatorClientId } : {}
|
|
11062
|
-
};
|
|
11063
|
-
newEntry?.events.publish(branchEnvelope);
|
|
11064
|
-
}
|
|
11065
11234
|
return {
|
|
11066
11235
|
...restored,
|
|
11067
11236
|
displayName: branchDisplayName,
|
|
@@ -11094,7 +11263,8 @@ function createAcpSessionBridge(opts) {
|
|
|
11094
11263
|
},
|
|
11095
11264
|
context
|
|
11096
11265
|
);
|
|
11097
|
-
const
|
|
11266
|
+
const restoredResult = result;
|
|
11267
|
+
const { forkedFrom: _forkedFrom, ...sideTask } = restoredResult;
|
|
11098
11268
|
return {
|
|
11099
11269
|
...sideTask,
|
|
11100
11270
|
parentSessionId: sessionId
|
|
@@ -12509,10 +12679,19 @@ function createAcpSessionBridge(opts) {
|
|
|
12509
12679
|
entry,
|
|
12510
12680
|
context?.clientId
|
|
12511
12681
|
);
|
|
12512
|
-
|
|
12513
|
-
|
|
12514
|
-
|
|
12515
|
-
|
|
12682
|
+
if (entry.pendingPromptCount > 0 || entry.promptActive) {
|
|
12683
|
+
throw new SessionBusyError(
|
|
12684
|
+
sessionId,
|
|
12685
|
+
"Cannot rewind while a prompt is running"
|
|
12686
|
+
);
|
|
12687
|
+
}
|
|
12688
|
+
const rewindResult = entry.promptQueue.then(async () => {
|
|
12689
|
+
if (entry.closing) {
|
|
12690
|
+
throw new SessionNotFoundError(sessionId, "The session is closing");
|
|
12691
|
+
}
|
|
12692
|
+
let response;
|
|
12693
|
+
try {
|
|
12694
|
+
response = await Promise.race([
|
|
12516
12695
|
entry.connection.extMethod(
|
|
12517
12696
|
SERVE_CONTROL_EXT_METHODS.sessionRewind,
|
|
12518
12697
|
{
|
|
@@ -12521,92 +12700,95 @@ function createAcpSessionBridge(opts) {
|
|
|
12521
12700
|
rewindFiles: req.rewindFiles !== false
|
|
12522
12701
|
}
|
|
12523
12702
|
),
|
|
12524
|
-
|
|
12525
|
-
|
|
12526
|
-
|
|
12527
|
-
|
|
12528
|
-
|
|
12529
|
-
|
|
12530
|
-
|
|
12531
|
-
|
|
12532
|
-
|
|
12533
|
-
|
|
12534
|
-
|
|
12535
|
-
|
|
12536
|
-
|
|
12537
|
-
if (kind === "invalid_rewind_target") {
|
|
12538
|
-
throw new InvalidRewindTargetError(sessionId, msg);
|
|
12703
|
+
getTransportClosedReject(entry)
|
|
12704
|
+
]);
|
|
12705
|
+
} catch (err) {
|
|
12706
|
+
const data = err?.data;
|
|
12707
|
+
if (data && typeof data === "object" && "errorKind" in data) {
|
|
12708
|
+
const kind = data.errorKind;
|
|
12709
|
+
const msg = err?.message ?? "Rewind failed";
|
|
12710
|
+
if (kind === "session_busy") {
|
|
12711
|
+
throw new SessionBusyError(sessionId, msg);
|
|
12712
|
+
}
|
|
12713
|
+
if (kind === "invalid_rewind_target") {
|
|
12714
|
+
throw new InvalidRewindTargetError(sessionId, msg);
|
|
12715
|
+
}
|
|
12539
12716
|
}
|
|
12717
|
+
throw err;
|
|
12540
12718
|
}
|
|
12541
|
-
|
|
12542
|
-
|
|
12543
|
-
|
|
12544
|
-
|
|
12545
|
-
|
|
12546
|
-
const artifactSnapshot = restoredArtifactSnapshotFromState(
|
|
12547
|
-
response
|
|
12548
|
-
);
|
|
12549
|
-
const artifactSnapshotUnavailable = artifactSnapshotUnavailableReason(
|
|
12550
|
-
response
|
|
12551
|
-
);
|
|
12552
|
-
const beforeArtifacts = (await entry.artifacts.list()).artifacts;
|
|
12553
|
-
const shouldRestoreArtifactSnapshot = artifactSnapshot !== void 0 && artifactSnapshotUnavailable === void 0;
|
|
12554
|
-
const artifactRestoreWarnings = artifactSnapshotUnavailable !== void 0 ? [
|
|
12555
|
-
`artifact snapshot rebuild unavailable during rewind: ${artifactSnapshotUnavailable}`
|
|
12556
|
-
] : shouldRestoreArtifactSnapshot ? await entry.artifacts.restore(artifactSnapshot, {
|
|
12557
|
-
preserveLiveEphemeral: true
|
|
12558
|
-
}) : [];
|
|
12559
|
-
const artifactRestoreFailed = artifactRestoreWarnings.some(
|
|
12560
|
-
isArtifactRestoreFailureWarning
|
|
12561
|
-
);
|
|
12562
|
-
const shouldRecordArtifactSnapshot = shouldRestoreArtifactSnapshot && !artifactRestoreFailed;
|
|
12563
|
-
const artifactSnapshotWarnings = shouldRecordArtifactSnapshot ? await entry.artifacts.recordSnapshot() : [];
|
|
12564
|
-
const artifactWarnings = [
|
|
12565
|
-
...artifactRestoreWarnings,
|
|
12566
|
-
...artifactSnapshotWarnings
|
|
12567
|
-
];
|
|
12568
|
-
for (const warning of artifactRestoreWarnings) {
|
|
12569
|
-
writeStderrLine(
|
|
12570
|
-
`[artifacts] session=${entry.sessionId} action=rewind_restore_warning warning=${JSON.stringify(
|
|
12571
|
-
warning
|
|
12572
|
-
)}`
|
|
12719
|
+
const targetTurnIndex = response["targetTurnIndex"] ?? 0;
|
|
12720
|
+
const filesChanged = response["filesChanged"] ?? [];
|
|
12721
|
+
const filesFailed = response["filesFailed"] ?? [];
|
|
12722
|
+
const artifactSnapshot = restoredArtifactSnapshotFromState(
|
|
12723
|
+
response
|
|
12573
12724
|
);
|
|
12574
|
-
|
|
12575
|
-
|
|
12576
|
-
writeStderrLine(
|
|
12577
|
-
`[artifacts] session=${entry.sessionId} action=rewind_snapshot_warning warning=${JSON.stringify(
|
|
12578
|
-
warning
|
|
12579
|
-
)}`
|
|
12725
|
+
const artifactSnapshotUnavailable = artifactSnapshotUnavailableReason(
|
|
12726
|
+
response
|
|
12580
12727
|
);
|
|
12581
|
-
|
|
12582
|
-
|
|
12583
|
-
|
|
12584
|
-
|
|
12585
|
-
|
|
12586
|
-
|
|
12728
|
+
const beforeArtifacts = (await entry.artifacts.list()).artifacts;
|
|
12729
|
+
const shouldRestoreArtifactSnapshot = artifactSnapshot !== void 0 && artifactSnapshotUnavailable === void 0;
|
|
12730
|
+
const artifactRestoreWarnings = artifactSnapshotUnavailable !== void 0 ? [
|
|
12731
|
+
`artifact snapshot rebuild unavailable during rewind: ${artifactSnapshotUnavailable}`
|
|
12732
|
+
] : shouldRestoreArtifactSnapshot ? await entry.artifacts.restore(artifactSnapshot, {
|
|
12733
|
+
preserveLiveEphemeral: true
|
|
12734
|
+
}) : [];
|
|
12735
|
+
const artifactRestoreFailed = artifactRestoreWarnings.some(
|
|
12736
|
+
isArtifactRestoreFailureWarning
|
|
12737
|
+
);
|
|
12738
|
+
const shouldRecordArtifactSnapshot = shouldRestoreArtifactSnapshot && !artifactRestoreFailed;
|
|
12739
|
+
const artifactSnapshotWarnings = shouldRecordArtifactSnapshot ? await entry.artifacts.recordSnapshot() : [];
|
|
12740
|
+
const artifactWarnings = [
|
|
12741
|
+
...artifactRestoreWarnings,
|
|
12742
|
+
...artifactSnapshotWarnings
|
|
12743
|
+
];
|
|
12744
|
+
for (const warning of artifactRestoreWarnings) {
|
|
12745
|
+
writeStderrLine(
|
|
12746
|
+
`[artifacts] session=${entry.sessionId} action=rewind_restore_warning warning=${JSON.stringify(
|
|
12747
|
+
warning
|
|
12748
|
+
)}`
|
|
12749
|
+
);
|
|
12750
|
+
}
|
|
12751
|
+
for (const warning of artifactSnapshotWarnings) {
|
|
12752
|
+
writeStderrLine(
|
|
12753
|
+
`[artifacts] session=${entry.sessionId} action=rewind_snapshot_warning warning=${JSON.stringify(
|
|
12754
|
+
warning
|
|
12755
|
+
)}`
|
|
12756
|
+
);
|
|
12757
|
+
}
|
|
12758
|
+
const afterArtifacts = (await entry.artifacts.list()).artifacts;
|
|
12759
|
+
publishArtifactChanges(
|
|
12760
|
+
entry,
|
|
12761
|
+
artifactReseedChanges(beforeArtifacts, afterArtifacts),
|
|
12762
|
+
originatorClientId
|
|
12763
|
+
);
|
|
12764
|
+
try {
|
|
12765
|
+
entry.events.publish({
|
|
12766
|
+
type: "session_rewound",
|
|
12767
|
+
data: {
|
|
12768
|
+
sessionId,
|
|
12769
|
+
promptId: req.promptId,
|
|
12770
|
+
targetTurnIndex,
|
|
12771
|
+
filesChanged,
|
|
12772
|
+
filesFailed,
|
|
12773
|
+
...artifactWarnings.length > 0 ? { warnings: artifactWarnings } : {}
|
|
12774
|
+
},
|
|
12775
|
+
...originatorClientId ? { originatorClientId } : {}
|
|
12776
|
+
});
|
|
12777
|
+
} catch {
|
|
12778
|
+
}
|
|
12779
|
+
return {
|
|
12780
|
+
rewound: filesFailed.length === 0,
|
|
12781
|
+
targetTurnIndex,
|
|
12782
|
+
filesChanged,
|
|
12783
|
+
filesFailed,
|
|
12784
|
+
...artifactWarnings.length > 0 ? { warnings: artifactWarnings } : {}
|
|
12785
|
+
};
|
|
12786
|
+
});
|
|
12787
|
+
entry.promptQueue = rewindResult.then(
|
|
12788
|
+
() => void 0,
|
|
12789
|
+
() => void 0
|
|
12587
12790
|
);
|
|
12588
|
-
|
|
12589
|
-
entry.events.publish({
|
|
12590
|
-
type: "session_rewound",
|
|
12591
|
-
data: {
|
|
12592
|
-
sessionId,
|
|
12593
|
-
promptId: req.promptId,
|
|
12594
|
-
targetTurnIndex,
|
|
12595
|
-
filesChanged,
|
|
12596
|
-
filesFailed,
|
|
12597
|
-
...artifactWarnings.length > 0 ? { warnings: artifactWarnings } : {}
|
|
12598
|
-
},
|
|
12599
|
-
...originatorClientId ? { originatorClientId } : {}
|
|
12600
|
-
});
|
|
12601
|
-
} catch {
|
|
12602
|
-
}
|
|
12603
|
-
return {
|
|
12604
|
-
rewound: filesFailed.length === 0,
|
|
12605
|
-
targetTurnIndex,
|
|
12606
|
-
filesChanged,
|
|
12607
|
-
filesFailed,
|
|
12608
|
-
...artifactWarnings.length > 0 ? { warnings: artifactWarnings } : {}
|
|
12609
|
-
};
|
|
12791
|
+
return rewindResult;
|
|
12610
12792
|
},
|
|
12611
12793
|
async manageMcpServer(serverName, action, originatorClientId) {
|
|
12612
12794
|
const info = await ensureChannel();
|
|
@@ -12934,6 +13116,10 @@ function createAcpSessionBridge(opts) {
|
|
|
12934
13116
|
timeoutMs: initTimeoutMs
|
|
12935
13117
|
});
|
|
12936
13118
|
} catch (error) {
|
|
13119
|
+
if (isDefinitiveAcpRequestError(error)) {
|
|
13120
|
+
entry.closing = false;
|
|
13121
|
+
return false;
|
|
13122
|
+
}
|
|
12937
13123
|
if (ci) {
|
|
12938
13124
|
await killChannelWithLog(
|
|
12939
13125
|
ci,
|