@qwen-code/qwen-code 0.21.4 → 0.21.5
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/model-providers.md +8 -7
- package/bundled/qc-helper/docs/configuration/settings.md +1 -1
- package/bundled/qc-helper/docs/features/code-review.md +2 -0
- package/bundled/qc-helper/docs/features/mcp.md +11 -3
- package/bundled/review/SKILL.md +32 -1
- package/chunks/{MaxSizedBox-5XDFQHTQ.js → MaxSizedBox-2MWU5JYB.js} +16 -16
- package/chunks/{StandaloneSessionPicker-DLADA54K.js → StandaloneSessionPicker-B6MI5NTB.js} +30 -30
- package/chunks/{acpAgent-MVEFZSBS.js → acpAgent-MRPYN6FH.js} +674 -290
- package/chunks/{agent-RB6LCRZX.js → agent-NAOXNW4I.js} +16 -16
- package/chunks/{agent-headless-272ZACJV.js → agent-headless-L4PPVFKW.js} +16 -16
- package/chunks/{artifact-tool-TBOYEKTY.js → artifact-tool-RROCCJDA.js} +1 -1
- package/chunks/{askUserQuestion-23Y5WZFJ.js → askUserQuestion-2EPPBPUZ.js} +1 -1
- package/chunks/{bridge-GXUXFSHK.js → bridge-LHXGYNCO.js} +17 -17
- package/chunks/{channel-settings-store-5UA2SABE.js → channel-settings-store-QB54TLYE.js} +21 -21
- package/chunks/{chunk-PWCQRLM5.js → chunk-2AGOQ7QO.js} +1 -1
- package/chunks/{chunk-XSOAW7FC.js → chunk-2JBETW4S.js} +5 -5
- package/chunks/{chunk-O4IWFYUW.js → chunk-3GOCVBYR.js} +4 -4
- package/chunks/{chunk-3PHUGFPH.js → chunk-3H5RFLTS.js} +1 -1
- package/chunks/{chunk-OOPFAIWP.js → chunk-3P4GP4S2.js} +1 -1
- package/chunks/{chunk-YXEVDA66.js → chunk-4LLUH3A7.js} +19 -18
- package/chunks/{chunk-ZRQY5BBS.js → chunk-4NEBUDWS.js} +10 -10
- package/chunks/{chunk-C5YFS6VR.js → chunk-4NNR24EP.js} +4 -4
- package/chunks/{chunk-RL2NPV5E.js → chunk-4O6HLCOF.js} +1 -1
- package/chunks/{chunk-AFJSRJTO.js → chunk-5HWAJ4BK.js} +1 -1
- package/chunks/{chunk-O2ZYHG33.js → chunk-5L6CQ4ZU.js} +131 -67
- package/chunks/{chunk-AWTLFUVN.js → chunk-5XNO4AW7.js} +13 -13
- package/chunks/{chunk-LLMGP5IC.js → chunk-6WBWIPBF.js} +2 -2
- package/chunks/{chunk-4CTV3FZH.js → chunk-7M2RLFNX.js} +23 -19
- package/chunks/{chunk-X6QNZOTC.js → chunk-7MFQLOHZ.js} +1 -1
- package/chunks/{chunk-DZPOYHBT.js → chunk-7W5KOBYU.js} +1 -1
- package/chunks/{chunk-SBBHZ3YT.js → chunk-AEWOKOJY.js} +1 -1
- package/chunks/{chunk-2CCUHZP5.js → chunk-B2RBYP7Z.js} +2 -2
- package/chunks/{chunk-URVJ4AZC.js → chunk-B3EBIZUY.js} +1 -1
- package/chunks/{chunk-GDREW3U5.js → chunk-BWLUCN35.js} +1 -1
- package/chunks/{chunk-DJA7YBLJ.js → chunk-C6ARWPCG.js} +2 -2
- package/chunks/{chunk-RNKGMZEW.js → chunk-CAX76R46.js} +1 -1
- package/chunks/{chunk-CFDR3GNL.js → chunk-D7D7RXIJ.js} +11 -0
- package/chunks/{chunk-PCVMRBLN.js → chunk-D7QAZ5DF.js} +1 -1
- package/chunks/{chunk-THLV7YGY.js → chunk-EXHQZBVJ.js} +2 -2
- package/chunks/{chunk-DOCBJIBL.js → chunk-FEUXV3DC.js} +1 -1
- package/chunks/{chunk-QZQ72YF6.js → chunk-G2UXFO2B.js} +1 -1
- package/chunks/{chunk-QXTGHZCX.js → chunk-GBY3ODW7.js} +3 -3
- package/chunks/{chunk-LPLMUGIM.js → chunk-GEP54CHX.js} +5 -5
- package/chunks/{chunk-2T3RYG4L.js → chunk-GP4IMBX5.js} +420 -94
- package/chunks/{chunk-XPAY4EMH.js → chunk-IK3RYLAD.js} +3 -3
- package/chunks/{chunk-I32URQI7.js → chunk-IWGMDSC3.js} +5 -5
- package/chunks/{chunk-WDLQGFWP.js → chunk-IWYXZAGT.js} +27 -27
- package/chunks/{chunk-HBCKZF2A.js → chunk-IZ2CMEYO.js} +1 -1
- package/chunks/{chunk-PQEIKQXN.js → chunk-J7I2BZHS.js} +4 -3
- package/chunks/{chunk-PQ5JFCNL.js → chunk-JDNWIXHJ.js} +3 -3
- package/chunks/{chunk-KHSJSMFS.js → chunk-K2ETEWG6.js} +1 -1
- package/chunks/{chunk-FV4TUUDE.js → chunk-K64OI7S7.js} +1 -1
- package/chunks/{chunk-C6FU76AA.js → chunk-K6VEL5KP.js} +1 -1
- package/chunks/{chunk-B3EBXISV.js → chunk-KH2BIJ4H.js} +3 -3
- package/chunks/{chunk-G7XXKQYS.js → chunk-LKRMNRSN.js} +27 -1
- package/chunks/{chunk-G6KI6B5L.js → chunk-LMNM37OE.js} +1 -1
- package/chunks/{chunk-SV5X2EUV.js → chunk-LSYVASZS.js} +1 -1
- package/chunks/{chunk-4PZ7SPD5.js → chunk-LYPXNRBX.js} +1 -1
- package/chunks/{chunk-HFVW54NL.js → chunk-MBEMTXQT.js} +9 -2
- package/chunks/{chunk-RPYYTL7E.js → chunk-MGSSJT27.js} +2 -2
- package/chunks/{chunk-M2L4TMH3.js → chunk-N3RERU5N.js} +3 -3
- package/chunks/{chunk-HI4YGRJD.js → chunk-NLQIEY6W.js} +3 -3
- package/chunks/{chunk-UATJZOAJ.js → chunk-OGAARVN7.js} +3 -3
- package/chunks/{chunk-6KQUOXT5.js → chunk-OIGB253L.js} +6 -6
- package/chunks/{chunk-EIAPOG76.js → chunk-P3SLTSNY.js} +3 -3
- package/chunks/{chunk-BC4LTKEG.js → chunk-Q2V4AOQL.js} +1 -1
- package/chunks/{chunk-KB6VSG2U.js → chunk-RM3F46UT.js} +6 -6
- package/chunks/{chunk-6ME3PVMM.js → chunk-SJMCYCUQ.js} +5 -5
- package/chunks/{chunk-2JN5V3I7.js → chunk-SQTA6PAY.js} +1 -1
- package/chunks/{chunk-2ON2O4MD.js → chunk-SVIEVA3L.js} +3 -3
- package/chunks/{chunk-FPPVCCAH.js → chunk-TCOJPG2P.js} +1 -1
- package/chunks/{chunk-BOWKLLWA.js → chunk-TJ56V3AR.js} +2 -2
- package/chunks/{chunk-A7PONO5G.js → chunk-URJHXOSO.js} +2 -2
- package/chunks/{chunk-EJXATV5R.js → chunk-VJPF6GF2.js} +2 -2
- package/chunks/{chunk-5XGI4IPK.js → chunk-VOA2UPZM.js} +3 -3
- package/chunks/{chunk-XGA6XHH3.js → chunk-WTM5QONI.js} +3 -3
- package/chunks/{chunk-IMGNGOGC.js → chunk-WU5NBSLD.js} +3 -3
- package/chunks/{chunk-7UXI6P72.js → chunk-WVAESIM6.js} +2 -2
- package/chunks/{chunk-TXZDRD36.js → chunk-XD2PNH3K.js} +5 -5
- package/chunks/{chunk-E2SYUEIA.js → chunk-YLL3SC5S.js} +743 -312
- package/chunks/{chunk-M6RNMBUO.js → chunk-YMUZQ3MQ.js} +4 -4
- package/chunks/{chunk-DHNFB7NC.js → chunk-YO4JI7B4.js} +5 -5
- package/chunks/{chunk-VA5NLVPT.js → chunk-Z7JILXGX.js} +1 -1
- package/chunks/{chunk-P5UJMCVS.js → chunk-ZLGPHA34.js} +4 -4
- package/chunks/{chunk-JDJ7SC4E.js → chunk-ZPGMDT4S.js} +237 -106
- package/chunks/{chunk-UEJESCS7.js → chunk-ZPPP6VCL.js} +1 -1
- package/chunks/{computer-use-MDOMIVTL.js → computer-use-XDOGP2KA.js} +16 -16
- package/chunks/{contextCommand-FCK3CB37.js → contextCommand-N3LQDCYJ.js} +18 -18
- package/chunks/{core-runtime-UHRHHU2O.js → core-runtime-STAFP45W.js} +16 -16
- package/chunks/{create-sub-session-MIXUVLWW.js → create-sub-session-2B3JENWD.js} +16 -16
- package/chunks/{create-sub-session-J32WC64U.js → create-sub-session-6EWLAZD5.js} +1 -1
- package/chunks/{cron-create-HMFSHIAR.js → cron-create-CCRIULJE.js} +1 -1
- package/chunks/{cron-delete-ZJFHOX57.js → cron-delete-FCFW6BGP.js} +1 -1
- package/chunks/{cron-list-ZEX2NBMN.js → cron-list-QDBVCHRF.js} +1 -1
- package/chunks/{daemon-status-provider-6LC7LUNR.js → daemon-status-provider-PPAH3ATF.js} +21 -21
- package/chunks/{daemon-trust-policy-Y36HGRAM.js → daemon-trust-policy-X6XL3MB4.js} +21 -21
- package/chunks/{daemon-trust-policy-monitor-ROTBBDOH.js → daemon-trust-policy-monitor-M5LBL2HD.js} +21 -21
- package/chunks/{deferred-core-runtime-ZQ4JIAJD.js → deferred-core-runtime-O54YPTBU.js} +16 -16
- package/chunks/{display-image-2WOG27DY.js → display-image-GUJA352B.js} +2 -2
- package/chunks/{earlyInputCapture-GPRUNXTP.js → earlyInputCapture-CBIT2RGT.js} +16 -16
- package/chunks/{edit-YK3UP6D2.js → edit-KW2TOC6A.js} +17 -17
- package/chunks/{enter-worktree-QMVQW7UG.js → enter-worktree-YL34NEU5.js} +16 -16
- package/chunks/{enterPlanMode-TZAYQ5MP.js → enterPlanMode-JFJTDASQ.js} +16 -16
- package/chunks/{environment-3UQURCZG.js → environment-IATU5GXG.js} +18 -18
- package/chunks/{errors-VBIMTNNI.js → errors-SAVRDE7Q.js} +18 -18
- package/chunks/{exit-worktree-4EC7LBBC.js → exit-worktree-5M43QPBB.js} +16 -16
- package/chunks/{exitPlanMode-K5Y3REU2.js → exitPlanMode-W4EICZ4N.js} +16 -16
- package/chunks/{fast-path-KS6IE7YR.js → fast-path-YQJPIKMP.js} +2 -2
- package/chunks/{gemini-LTUCUOJH.js → gemini-FUF5SSPR.js} +47 -47
- package/chunks/{geminiContentGenerator-M3HJTHKR.js → geminiContentGenerator-LLLZBOUG.js} +1 -1
- package/chunks/{glob-SKUYGTF2.js → glob-LJFFMN4D.js} +16 -16
- package/chunks/{goal-tools-SPQ5M6D3.js → goal-tools-3AZKX5WQ.js} +2 -18
- package/chunks/{grep-SQ7RD7SV.js → grep-Q64EAM73.js} +16 -16
- package/chunks/{handleAutoUpdate-OK7OX23A.js → handleAutoUpdate-QBMPRTSQ.js} +20 -20
- package/chunks/{i18n-P77YBKY4.js → i18n-LDUW5DMN.js} +17 -17
- package/chunks/{image-gen-2ZWPS42A.js → image-gen-G7RLG3KR.js} +2 -2
- package/chunks/{initializer-PIOYXVW7.js → initializer-74A7DMMD.js} +21 -21
- package/chunks/{installationInfo-IWMM6DPV.js → installationInfo-OFDYLDFD.js} +17 -17
- package/chunks/{list-3DCR4TRI.js → list-JA2EWRHJ.js} +24 -24
- package/chunks/{list-agents-TWEGRJWO.js → list-agents-GC4BRET7.js} +1 -1
- package/chunks/{loadedSettingsAdapter-EJC6CU5N.js → loadedSettingsAdapter-2GNJOQ3L.js} +21 -21
- package/chunks/{loggingContentGenerator-2JEFU25T.js → loggingContentGenerator-B6B5EGB3.js} +8 -8
- package/chunks/{loop-wakeup-6LLEOQYV.js → loop-wakeup-SQQSBMEY.js} +2 -2
- package/chunks/{ls-H5WX22VK.js → ls-63CC3NNX.js} +1 -1
- package/chunks/{lsp-G6FXYEIS.js → lsp-P6NVJVNT.js} +1 -1
- package/chunks/{managed-npm-update-EGVQPSBR.js → managed-npm-update-4YZHLUER.js} +17 -17
- package/chunks/{mcp-KFFH2MBV.js → mcp-LLK5YJVH.js} +21 -21
- package/chunks/{monitor-6Y3NDMTI.js → monitor-NYJPAWVP.js} +16 -16
- package/chunks/{nonInteractiveCli-426IQDPE.js → nonInteractiveCli-HZBBBDJD.js} +45 -45
- package/chunks/{notebook-edit-373IQQLE.js → notebook-edit-LLM6UXFX.js} +17 -17
- package/chunks/{openaiContentGenerator-PGFSOMIQ.js → openaiContentGenerator-2AEXDN55.js} +8 -8
- package/chunks/{pidfile-Y4INDMHG.js → pidfile-3JUWX7G2.js} +16 -16
- package/chunks/{processUtils-6BCPCJZW.js → processUtils-JLLRVZHT.js} +2 -2
- package/chunks/{qwenContentGenerator-QC3KSHSX.js → qwenContentGenerator-2FESCF27.js} +17 -17
- package/chunks/{qwenOAuth2-IOAXKJ3L.js → qwenOAuth2-2KKPYA5J.js} +1 -1
- package/chunks/{read-file-2T54FYZV.js → read-file-5GVXLY74.js} +6 -6
- package/chunks/{read-mcp-resource-DRZSI3HE.js → read-mcp-resource-RTSSEER5.js} +1 -1
- package/chunks/{record-artifact-IPIRWMFY.js → record-artifact-L3BAHQFN.js} +2 -2
- package/chunks/{resumeHistoryUtils-O62RDCZ3.js → resumeHistoryUtils-Z4OFBXPM.js} +19 -19
- package/chunks/{ripGrep-3H72KY7S.js → ripGrep-TKOJTIAB.js} +16 -16
- package/chunks/{run-qwen-serve-3AIDNNHO.js → run-qwen-serve-K5W6MM6M.js} +27 -27
- package/chunks/{runtime-AZ4EHHFV.js → runtime-IADXMRCY.js} +22 -22
- package/chunks/{scheduler-L4UUCU4Z.js → scheduler-T7AV37LD.js} +16 -16
- package/chunks/{sdk-exporters-http-IKNWQJNV.js → sdk-exporters-http-IL2346MJ.js} +6 -2
- package/chunks/{sdk-impl-7CUUMQDB.js → sdk-impl-SYKGVWOZ.js} +2 -2
- package/chunks/{send-message-LHJLVWFD.js → send-message-TL6FIMMN.js} +3 -3
- package/chunks/{serve-CLXGSYOE.js → serve-ROEGMS3I.js} +21 -21
- package/chunks/{server-MEAE3WMM.js → server-NGXMRODI.js} +40 -40
- package/chunks/{session-OSLD2LT5.js → session-RCDLDJA4.js} +46 -46
- package/chunks/{settings-ILWAOKA4.js → settings-E6H3AURD.js} +20 -20
- package/chunks/{shell-RT5DBH6B.js → shell-RHGGJ6BE.js} +16 -16
- package/chunks/{skill-LVGA3ATZ.js → skill-GQ7PBS25.js} +7 -7
- package/chunks/{skill-settings-WTZE7EPE.js → skill-settings-E2F7OCBL.js} +20 -20
- package/chunks/{spawnChannel-BOBS7DVM.js → spawnChannel-Q2IQBHME.js} +16 -16
- package/chunks/{standalone-update-Y5JB4S2K.js → standalone-update-NYYZEHLD.js} +18 -18
- package/chunks/{startInteractiveUI-ZV25CD2S.js → startInteractiveUI-IX6I3Y2Z.js} +62 -59
- package/chunks/{syntheticOutput-EYL7DWO7.js → syntheticOutput-BN7E626U.js} +2 -2
- package/chunks/{task-create-4ALZMGP5.js → task-create-2X4UP4F3.js} +4 -4
- package/chunks/{task-list-6CVQPORX.js → task-list-WOLJPZ64.js} +1 -1
- package/chunks/{task-stop-Y5ZTFVRX.js → task-stop-TNXRNAL2.js} +1 -1
- package/chunks/{task-update-IKCEEWJ6.js → task-update-VDUSN36E.js} +4 -4
- package/chunks/{team-create-ZVPQIXCP.js → team-create-UTRVUEDA.js} +16 -16
- package/chunks/{team-delete-CE7DC53R.js → team-delete-D2VMSDOT.js} +1 -1
- package/chunks/{team-plan-approval-5UHUBY3W.js → team-plan-approval-YZNB4U5U.js} +16 -16
- package/chunks/{terminal-image-renderer-NWC2RALG.js → terminal-image-renderer-QRSCS2BE.js} +17 -17
- package/chunks/{theme-manager-5KICSBOB.js → theme-manager-EKZBY34I.js} +16 -16
- package/chunks/{todoWrite-FTZWQRZH.js → todoWrite-MHWHO5UO.js} +1 -1
- package/chunks/{tool-search-2AOU77H4.js → tool-search-N2R7LVMC.js} +8 -8
- package/chunks/{total-session-admission-FR7RMHVL.js → total-session-admission-HBIYARPO.js} +17 -17
- package/chunks/{trustedFolders-V7UUPQXO.js → trustedFolders-ZQLYRCSY.js} +17 -17
- package/chunks/{update-relaunch-TBWRMQD6.js → update-relaunch-PJWXMPCR.js} +5 -5
- package/chunks/{updateCheck-42SPCLH7.js → updateCheck-ZXRCGY66.js} +19 -19
- package/chunks/{useAutoAcceptIndicator-4C2KM345.js → useAutoAcceptIndicator-ZYQW5SGJ.js} +22 -22
- package/chunks/{validateNonInterActiveAuth-UVFRXV3Z.js → validateNonInterActiveAuth-M7J7OTRH.js} +42 -42
- package/chunks/{version-HKTV6TPN.js → version-2AOHMPK3.js} +1 -1
- package/chunks/{web-fetch-ZRXSV5AN.js → web-fetch-DS34CJ3R.js} +6 -6
- package/chunks/{web-search-WOLV3L6T.js → web-search-ITFPD7V4.js} +4 -4
- package/chunks/{workflow-F63ES3OB.js → workflow-LZQ4PGNS.js} +17 -17
- package/chunks/{workspace-providers-status-PJMGMYMC.js → workspace-providers-status-ZPTLKOBM.js} +23 -23
- package/chunks/{workspace-registration-store-LNBOX5TJ.js → workspace-registration-store-OTFKSGG7.js} +1 -1
- package/chunks/{workspace-registry-4PR7VDQ3.js → workspace-registry-YZ3OXPHP.js} +17 -17
- package/chunks/{workspace-service-PVI3VUNQ.js → workspace-service-OCZXOOSQ.js} +24 -24
- package/chunks/{workspace-skills-status-2Q5ZISO6.js → workspace-skills-status-K2ALGUCD.js} +21 -21
- package/chunks/{workspace-trust-reconciler-NOILUH3C.js → workspace-trust-reconciler-KMRZISJP.js} +22 -22
- package/chunks/{write-file-MOM4JDHG.js → write-file-AWBI4GJS.js} +16 -16
- package/chunks/{zoom-image-E3VHRCFU.js → zoom-image-NHKN6F77.js} +6 -6
- package/cli.js +12 -12
- package/package.json +3 -3
- package/web-shell/assets/{arc-GpdmhIxr.js → arc-Dpg66jw7.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-C-LhCgH_.js → architectureDiagram-3BPJPVTR-BJ4FIBxN.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-CzNdTCm-.js → blockDiagram-GPEHLZMM-VXmYdtYT.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-Ce7hbrRM.js → c4Diagram-AAUBKEIU-BNLDb8FE.js} +1 -1
- package/web-shell/assets/channel-Bd9wOnaA.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-BBSEn1PK.js → chunk-2J33WTMH-DR5yHxr0.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-_llgjfe5.js → chunk-4BX2VUAB-Czkq8UZU.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-9fJZ_oZE.js → chunk-55IACEB6-DugUgM6s.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-DgEzQWOu.js → chunk-727SXJPM-Dw6quA1K.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-B4RthUTc.js → chunk-AQP2D5EJ-BoVYOTTz.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-CDI-emMW.js → chunk-FMBD7UC4--Amcse-j.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-jM2-yOd8.js → chunk-ND2GUHAM-ajaEYAC8.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-XGZHlKPF.js → chunk-QZHKN3VN-CUNDZ7im.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-XhCT8FE3.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-XhCT8FE3.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-90nbW1xQ.js → cose-bilkent-S5V4N54A-BnfkD-m1.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-BtzlyqZ9.js → dagre-BM42HDAG-BuUdFk7Z.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-DAaqGWaH.js → diagram-2AECGRRQ-B2ZXxoab.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-CxlzSIFa.js → diagram-5GNKFQAL-BsgOICzM.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-8kj-1H6u.js → diagram-KO2AKTUF-DTTjG6U-.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-6NhjFwRF.js → diagram-LMA3HP47-temLf1x7.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-Bn9kvInz.js → diagram-OG6HWLK6-CRFjScs2.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-CaRoGsAt.js → erDiagram-TEJ5UH35-D4oaY-rQ.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-TkLweHdf.js → flowDiagram-I6XJVG4X-BqG8B49b.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-ruwhCKBl.js → ganttDiagram-6RSMTGT7-DffQBdd5.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-DNI_PxoU.js → gitGraphDiagram-PVQCEYII-CMDPfseF.js} +1 -1
- package/web-shell/assets/{index-T4KluHvu.js → index-2F4RsNzd.js} +322 -322
- package/web-shell/assets/index-CaucmEO_.css +5 -0
- package/web-shell/assets/{index-p1gz-sxE.js → index-qTQR_smP.js} +1 -1
- package/web-shell/assets/{infoDiagram-5YYISTIA-DarXq1-A.js → infoDiagram-5YYISTIA-Cn3T83MA.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-GxDaDlT0.js → ishikawaDiagram-YF4QCWOH-ijFs7e25.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-mDEoGBzY.js → journeyDiagram-JHISSGLW-CINTv8VB.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-Ds0t-Mup.js → kanban-definition-UN3LZRKU-CMGRZCxx.js} +1 -1
- package/web-shell/assets/{linear-05nJ0xZ7.js → linear-Co-2_37d.js} +1 -1
- package/web-shell/assets/{mermaid.core-Bua24ThM.js → mermaid.core-DijbyaN5.js} +5 -5
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-D_zRdvUS.js → mindmap-definition-RKZ34NQL-k_sDYDPZ.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-DZHr1x16.js → pieDiagram-4H26LBE5-CG-oz8V3.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-HA06Wf0h.js → quadrantDiagram-W4KKPZXB-Baq7HIG2.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-DH3urmJf.js → requirementDiagram-4Y6WPE33-CDM3ZvBt.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-C4xgz0TT.js → sankeyDiagram-5OEKKPKP-C2dJbWKN.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-DAUoZWgv.js → sequenceDiagram-3UESZ5HK-Cf1_h59p.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-v7NzXy4l.js → stateDiagram-AJRCARHV-CI5clUEc.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BDc8asKD.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-B3GTYR2W.js → timeline-definition-PNZ67QCA-B2O8cAZX.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-BWHjSPAq.js → vennDiagram-CIIHVFJN-BLsJ_h9s.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-m9r6IUBC.js → wardley-L42UT6IY-BlPU4FTA.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-kT0FkVfK.js → wardleyDiagram-YWT4CUSO-D_U-RdU4.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-CYRm10z5.js → xychartDiagram-2RQKCTM6-BynXGSTl.js} +1 -1
- package/web-shell/index.html +2 -2
- package/web-shell/assets/channel-95y6Rcp3.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-pfzVkmjQ.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-pfzVkmjQ.js +0 -1
- package/web-shell/assets/index-WxSvj2tI.css +0 -5
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-CtdFexEf.js +0 -1
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
import {
|
|
4
4
|
serveCommand
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-SVIEVA3L.js";
|
|
6
6
|
import {
|
|
7
7
|
listCommand
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-ZLGPHA34.js";
|
|
9
9
|
import {
|
|
10
10
|
getErrorMessage as getErrorMessage2
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-VJPF6GF2.js";
|
|
12
12
|
import {
|
|
13
13
|
ObservedChannelContactStore
|
|
14
14
|
} from "./chunk-DYA25Y7U.js";
|
|
@@ -46,19 +46,19 @@ import {
|
|
|
46
46
|
registerToolCallDispatch,
|
|
47
47
|
selectFirstModel,
|
|
48
48
|
sessionsPath
|
|
49
|
-
} from "./chunk-
|
|
49
|
+
} from "./chunk-VOA2UPZM.js";
|
|
50
50
|
import {
|
|
51
51
|
getExtensionManager,
|
|
52
52
|
requestChoicePluginNonInteractive,
|
|
53
53
|
requestConsentNonInteractive,
|
|
54
54
|
requestConsentOrFail,
|
|
55
55
|
resolveExtensionCommandScope
|
|
56
|
-
} from "./chunk-
|
|
56
|
+
} from "./chunk-3GOCVBYR.js";
|
|
57
57
|
import {
|
|
58
58
|
collectProviderModelsForProtocol,
|
|
59
59
|
getAuthTypeFromEnv,
|
|
60
60
|
resolveCliGenerationConfig
|
|
61
|
-
} from "./chunk-
|
|
61
|
+
} from "./chunk-WU5NBSLD.js";
|
|
62
62
|
import {
|
|
63
63
|
parseChannelConfig
|
|
64
64
|
} from "./chunk-LEZFUYPM.js";
|
|
@@ -128,29 +128,29 @@ import {
|
|
|
128
128
|
assembleMcpServers,
|
|
129
129
|
getPendingGatedMcpServers,
|
|
130
130
|
mcpCommand
|
|
131
|
-
} from "./chunk-
|
|
131
|
+
} from "./chunk-SJMCYCUQ.js";
|
|
132
132
|
import {
|
|
133
133
|
loadSettings
|
|
134
|
-
} from "./chunk-
|
|
134
|
+
} from "./chunk-RM3F46UT.js";
|
|
135
135
|
import {
|
|
136
136
|
detectSystemLanguage,
|
|
137
137
|
getCurrentLanguage,
|
|
138
138
|
initializeI18n,
|
|
139
139
|
resolveLanguageSetting,
|
|
140
140
|
t
|
|
141
|
-
} from "./chunk-
|
|
141
|
+
} from "./chunk-K64OI7S7.js";
|
|
142
142
|
import {
|
|
143
143
|
loadEnvironment
|
|
144
|
-
} from "./chunk-
|
|
144
|
+
} from "./chunk-LYPXNRBX.js";
|
|
145
145
|
import {
|
|
146
146
|
getCliVersion
|
|
147
|
-
} from "./chunk-
|
|
147
|
+
} from "./chunk-IZ2CMEYO.js";
|
|
148
148
|
import {
|
|
149
149
|
getPackageJson
|
|
150
150
|
} from "./chunk-VJNBRRZG.js";
|
|
151
151
|
import {
|
|
152
152
|
isWorkspaceTrusted
|
|
153
|
-
} from "./chunk-
|
|
153
|
+
} from "./chunk-B3EBIZUY.js";
|
|
154
154
|
import {
|
|
155
155
|
require_strip_json_comments
|
|
156
156
|
} from "./chunk-ALGGS7UH.js";
|
|
@@ -191,7 +191,7 @@ import {
|
|
|
191
191
|
unquoteCStylePath,
|
|
192
192
|
updateChannelMemoryEntry,
|
|
193
193
|
updateSetting
|
|
194
|
-
} from "./chunk-
|
|
194
|
+
} from "./chunk-YLL3SC5S.js";
|
|
195
195
|
import {
|
|
196
196
|
nextFireTime,
|
|
197
197
|
parseCron
|
|
@@ -202,18 +202,18 @@ import {
|
|
|
202
202
|
import {
|
|
203
203
|
parseBooleanEnvFlag,
|
|
204
204
|
resolveTelemetrySettings
|
|
205
|
-
} from "./chunk-
|
|
205
|
+
} from "./chunk-MGSSJT27.js";
|
|
206
206
|
import {
|
|
207
207
|
getAllGeminiMdFilenames,
|
|
208
208
|
setGeminiMdFilename
|
|
209
|
-
} from "./chunk-
|
|
209
|
+
} from "./chunk-ZPGMDT4S.js";
|
|
210
210
|
import {
|
|
211
211
|
SchemaValidator,
|
|
212
212
|
ToolNames
|
|
213
|
-
} from "./chunk-
|
|
213
|
+
} from "./chunk-D7D7RXIJ.js";
|
|
214
214
|
import {
|
|
215
215
|
DEFAULT_QWEN_EMBEDDING_MODEL
|
|
216
|
-
} from "./chunk-
|
|
216
|
+
} from "./chunk-XD2PNH3K.js";
|
|
217
217
|
import {
|
|
218
218
|
isTlsVerificationDisabled
|
|
219
219
|
} from "./chunk-BFHXDAR7.js";
|
|
@@ -222,7 +222,7 @@ import {
|
|
|
222
222
|
} from "./chunk-UH7Z7Y45.js";
|
|
223
223
|
import {
|
|
224
224
|
recordChannelMemoryRecallMetrics
|
|
225
|
-
} from "./chunk-
|
|
225
|
+
} from "./chunk-5L6CQ4ZU.js";
|
|
226
226
|
import {
|
|
227
227
|
FatalConfigError,
|
|
228
228
|
FatalSandboxError,
|
|
@@ -358,9 +358,9 @@ var require_command_exists = __commonJS({
|
|
|
358
358
|
cleanInput = /* @__PURE__ */ __name(function(s) {
|
|
359
359
|
var isPathName = /[\\]/.test(s);
|
|
360
360
|
if (isPathName) {
|
|
361
|
-
var
|
|
361
|
+
var dirname24 = '"' + path3.dirname(s) + '"';
|
|
362
362
|
var basename6 = '"' + path3.basename(s) + '"';
|
|
363
|
-
return
|
|
363
|
+
return dirname24 + ":" + basename6;
|
|
364
364
|
}
|
|
365
365
|
return '"' + s + '"';
|
|
366
366
|
}, "cleanInput");
|
|
@@ -368,10 +368,10 @@ var require_command_exists = __commonJS({
|
|
|
368
368
|
module.exports = /* @__PURE__ */ __name(function commandExists2(commandName, callback) {
|
|
369
369
|
var cleanedCommandName = cleanInput(commandName);
|
|
370
370
|
if (!callback && typeof Promise !== "undefined") {
|
|
371
|
-
return new Promise(function(
|
|
371
|
+
return new Promise(function(resolve24, reject) {
|
|
372
372
|
commandExists2(commandName, function(error, output) {
|
|
373
373
|
if (output) {
|
|
374
|
-
|
|
374
|
+
resolve24(commandName);
|
|
375
375
|
} else {
|
|
376
376
|
reject(error);
|
|
377
377
|
}
|
|
@@ -2255,8 +2255,8 @@ function createBridgeReadinessGate() {
|
|
|
2255
2255
|
current: /* @__PURE__ */ __name(() => pending, "current"),
|
|
2256
2256
|
block: /* @__PURE__ */ __name(() => {
|
|
2257
2257
|
if (pending) return;
|
|
2258
|
-
pending = new Promise((
|
|
2259
|
-
releasePending =
|
|
2258
|
+
pending = new Promise((resolve24) => {
|
|
2259
|
+
releasePending = resolve24;
|
|
2260
2260
|
});
|
|
2261
2261
|
}, "block"),
|
|
2262
2262
|
release: /* @__PURE__ */ __name(() => {
|
|
@@ -2338,7 +2338,7 @@ function createBridgeRecovery(options) {
|
|
|
2338
2338
|
writeStderrLine(
|
|
2339
2339
|
`[Channel] Bridge crashed (${recentCrashCount}/${MAX_CRASH_RESTARTS} in window). Restarting in ${RESTART_DELAY_MS / 1e3}s...`
|
|
2340
2340
|
);
|
|
2341
|
-
await new Promise((
|
|
2341
|
+
await new Promise((resolve24) => setTimeout(resolve24, RESTART_DELAY_MS));
|
|
2342
2342
|
const bridge = new AcpBridge(bridgeOpts);
|
|
2343
2343
|
setBridge(bridge);
|
|
2344
2344
|
attachDisconnectHandler(bridge);
|
|
@@ -3206,12 +3206,12 @@ async function abortableStartup(value, signal) {
|
|
|
3206
3206
|
const promise = Promise.resolve(value);
|
|
3207
3207
|
if (!signal) return await promise;
|
|
3208
3208
|
if (signal.aborted) throw startupAbortError();
|
|
3209
|
-
return await new Promise((
|
|
3209
|
+
return await new Promise((resolve24, reject) => {
|
|
3210
3210
|
const onAbort = /* @__PURE__ */ __name(() => {
|
|
3211
3211
|
reject(startupAbortError());
|
|
3212
3212
|
}, "onAbort");
|
|
3213
3213
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
3214
|
-
promise.then(
|
|
3214
|
+
promise.then(resolve24, reject).finally(() => {
|
|
3215
3215
|
signal.removeEventListener("abort", onAbort);
|
|
3216
3216
|
});
|
|
3217
3217
|
});
|
|
@@ -3619,7 +3619,7 @@ function reportStartupToSupervisor(message, signal, subscribeMessage = (listener
|
|
|
3619
3619
|
if (!send) {
|
|
3620
3620
|
return Promise.reject(new Error("Channel worker IPC is unavailable."));
|
|
3621
3621
|
}
|
|
3622
|
-
return new Promise((
|
|
3622
|
+
return new Promise((resolve24, reject) => {
|
|
3623
3623
|
let settled = false;
|
|
3624
3624
|
let unsubscribeMessage = /* @__PURE__ */ __name(() => {
|
|
3625
3625
|
}, "unsubscribeMessage");
|
|
@@ -3633,7 +3633,7 @@ function reportStartupToSupervisor(message, signal, subscribeMessage = (listener
|
|
|
3633
3633
|
settled = true;
|
|
3634
3634
|
cleanup();
|
|
3635
3635
|
if (error) reject(error);
|
|
3636
|
-
else
|
|
3636
|
+
else resolve24();
|
|
3637
3637
|
}, "finish");
|
|
3638
3638
|
const onMessage = /* @__PURE__ */ __name((value) => {
|
|
3639
3639
|
if (isChannelStartupReportAckMessage(value)) {
|
|
@@ -3881,8 +3881,8 @@ var daemonWorkerCommand = {
|
|
|
3881
3881
|
let shuttingDown = false;
|
|
3882
3882
|
let exitCode = 0;
|
|
3883
3883
|
let finish;
|
|
3884
|
-
const finished = new Promise((
|
|
3885
|
-
finish =
|
|
3884
|
+
const finished = new Promise((resolve24) => {
|
|
3885
|
+
finish = resolve24;
|
|
3886
3886
|
});
|
|
3887
3887
|
const shutdown = /* @__PURE__ */ __name(async (reason) => {
|
|
3888
3888
|
if (shuttingDown) {
|
|
@@ -3910,8 +3910,8 @@ var daemonWorkerCommand = {
|
|
|
3910
3910
|
...activeChannelDeliveries.values(),
|
|
3911
3911
|
...activeWebhookTasks.values()
|
|
3912
3912
|
]),
|
|
3913
|
-
new Promise((
|
|
3914
|
-
const timer = setTimeout(
|
|
3913
|
+
new Promise((resolve24) => {
|
|
3914
|
+
const timer = setTimeout(resolve24, WORKER_SHUTDOWN_DRAIN_MS);
|
|
3915
3915
|
timer.unref();
|
|
3916
3916
|
})
|
|
3917
3917
|
]);
|
|
@@ -6283,6 +6283,11 @@ function coverageFromTranscripts(planPath, env = process.env) {
|
|
|
6283
6283
|
const idleAgents = [];
|
|
6284
6284
|
const unopenedAgents = [];
|
|
6285
6285
|
const rewrittenPrompts = [];
|
|
6286
|
+
const driftedLaunches = [];
|
|
6287
|
+
const openedBriefOf = /* @__PURE__ */ __name((rec, key) => {
|
|
6288
|
+
const needle = JSON.stringify(briefPath(planPath, key));
|
|
6289
|
+
return rec.successfulCallArgs.some((a) => a.includes(needle));
|
|
6290
|
+
}, "openedBriefOf");
|
|
6286
6291
|
const disclosures = [];
|
|
6287
6292
|
const disclose = /* @__PURE__ */ __name((subject, reason, pub) => {
|
|
6288
6293
|
disclosures.push({
|
|
@@ -6355,15 +6360,23 @@ function coverageFromTranscripts(planPath, env = process.env) {
|
|
|
6355
6360
|
);
|
|
6356
6361
|
}
|
|
6357
6362
|
} else if (!wasDeliveredVerbatim(rec.launchPrompt, b)) {
|
|
6358
|
-
|
|
6359
|
-
|
|
6360
|
-
|
|
6361
|
-
|
|
6362
|
-
|
|
6363
|
-
|
|
6364
|
-
|
|
6365
|
-
|
|
6366
|
-
)
|
|
6363
|
+
if (openedBriefOf(rec, `chunk-${chunk2}`) && rec.diffToolCalls > 0) {
|
|
6364
|
+
if (!superseded(rec, chunk2)) {
|
|
6365
|
+
driftedLaunches.push(
|
|
6366
|
+
`${name} \u2014 launched with a near-verbatim prompt; its brief was opened and the diff was read, so the delivery stands`
|
|
6367
|
+
);
|
|
6368
|
+
}
|
|
6369
|
+
} else {
|
|
6370
|
+
rewrittenThisRecord = true;
|
|
6371
|
+
if (!superseded(rec, chunk2)) {
|
|
6372
|
+
rewrittenPrompts.push(
|
|
6373
|
+
disclose(
|
|
6374
|
+
name,
|
|
6375
|
+
"launched with a prompt that is not the one the CLI built",
|
|
6376
|
+
{ reasonZh: "\u542F\u52A8\u65F6\u4F7F\u7528\u7684 prompt \u4E0D\u662F CLI \u6784\u5EFA\u7684\u90A3\u4E00\u4EFD" }
|
|
6377
|
+
)
|
|
6378
|
+
);
|
|
6379
|
+
}
|
|
6367
6380
|
}
|
|
6368
6381
|
}
|
|
6369
6382
|
}
|
|
@@ -6407,16 +6420,12 @@ function coverageFromTranscripts(planPath, env = process.env) {
|
|
|
6407
6420
|
);
|
|
6408
6421
|
}
|
|
6409
6422
|
const buildable = roster.filter((r) => builtOf(r.key) !== void 0);
|
|
6410
|
-
const openedBrief = /* @__PURE__ */ __name((rec, key) => {
|
|
6411
|
-
const needle = JSON.stringify(briefPath(planPath, key));
|
|
6412
|
-
return rec.successfulCallArgs.some((a) => a.includes(needle));
|
|
6413
|
-
}, "openedBrief");
|
|
6414
6423
|
const candidatesOf = buildable.map((req) => {
|
|
6415
6424
|
const b = builtOf(req.key);
|
|
6416
6425
|
return records.filter((r) => wasDeliveredVerbatim(r.launchPrompt, b));
|
|
6417
6426
|
});
|
|
6418
6427
|
const openedOfReq = buildable.map(
|
|
6419
|
-
(req, i) => candidatesOf[i].filter((r) =>
|
|
6428
|
+
(req, i) => candidatesOf[i].filter((r) => openedBriefOf(r, req.key))
|
|
6420
6429
|
);
|
|
6421
6430
|
const matchedRec = /* @__PURE__ */ new Map();
|
|
6422
6431
|
const augment = /* @__PURE__ */ __name((i, edges, seen) => {
|
|
@@ -6441,6 +6450,7 @@ function coverageFromTranscripts(planPath, env = process.env) {
|
|
|
6441
6450
|
}
|
|
6442
6451
|
const assignment = /* @__PURE__ */ new Map();
|
|
6443
6452
|
for (const [rec, i] of matchedRec) assignment.set(i, rec);
|
|
6453
|
+
const rescued = /* @__PURE__ */ new Set();
|
|
6444
6454
|
let buildableIdx = -1;
|
|
6445
6455
|
for (const req of roster) {
|
|
6446
6456
|
const b = builtOf(req.key);
|
|
@@ -6465,6 +6475,21 @@ function coverageFromTranscripts(planPath, env = process.env) {
|
|
|
6465
6475
|
const pick2 = assignment.get(buildableIdx);
|
|
6466
6476
|
if (pick2 === void 0) {
|
|
6467
6477
|
const anyMatch = candidatesOf[buildableIdx].length > 0;
|
|
6478
|
+
if (!anyMatch) {
|
|
6479
|
+
const needsDiff = req.role === "chunk" || BRIEFS[req.role].readsDiff;
|
|
6480
|
+
const rescue = records.find(
|
|
6481
|
+
(r) => !matchedRec.has(r) && !rescued.has(r) && r.successfulToolCalls > 0 && (!needsDiff || r.diffToolCalls > 0) && openedBriefOf(r, req.key)
|
|
6482
|
+
);
|
|
6483
|
+
if (rescue !== void 0) {
|
|
6484
|
+
rescued.add(rescue);
|
|
6485
|
+
if (req.role !== "chunk") {
|
|
6486
|
+
driftedLaunches.push(
|
|
6487
|
+
`${roleLabel(req)} \u2014 no launch matched its block verbatim, but an agent opened this role's brief and did the work, so the delivery stands`
|
|
6488
|
+
);
|
|
6489
|
+
}
|
|
6490
|
+
continue;
|
|
6491
|
+
}
|
|
6492
|
+
}
|
|
6468
6493
|
missingRoles.push(
|
|
6469
6494
|
disclose(
|
|
6470
6495
|
roleLabel(req),
|
|
@@ -6512,6 +6537,7 @@ function coverageFromTranscripts(planPath, env = process.env) {
|
|
|
6512
6537
|
idleAgents,
|
|
6513
6538
|
unopenedAgents,
|
|
6514
6539
|
rewrittenPrompts,
|
|
6540
|
+
driftedLaunches,
|
|
6515
6541
|
missingRoles,
|
|
6516
6542
|
missingRoleSelectors,
|
|
6517
6543
|
disclosures,
|
|
@@ -7217,25 +7243,25 @@ function composeReviewBody(input, cliVersion) {
|
|
|
7217
7243
|
}
|
|
7218
7244
|
if (contextUnavailable) cappedBy.push("context-unavailable");
|
|
7219
7245
|
if (criticalsUnverified) cappedBy.push("criticals-unverified");
|
|
7220
|
-
let
|
|
7221
|
-
if (
|
|
7246
|
+
let event2 = baseEvent;
|
|
7247
|
+
if (event2 === "APPROVE" && cappedBy.length > 0) event2 = "COMMENT";
|
|
7222
7248
|
const deterministicBodyCriticals = bodyCriticals.length - nonDeterministicBodyCriticals;
|
|
7223
|
-
if (
|
|
7224
|
-
|
|
7249
|
+
if (event2 === "REQUEST_CHANGES" && criticalsUnverified && deterministicBodyCriticals === 0) {
|
|
7250
|
+
event2 = "COMMENT";
|
|
7225
7251
|
}
|
|
7226
7252
|
let downgraded = false;
|
|
7227
7253
|
let downgradedFrom = null;
|
|
7228
|
-
if (
|
|
7229
|
-
|
|
7254
|
+
if (event2 === "APPROVE" && downgradeApprove) {
|
|
7255
|
+
event2 = "COMMENT";
|
|
7230
7256
|
downgraded = true;
|
|
7231
7257
|
downgradedFrom = "Approve";
|
|
7232
|
-
} else if ((
|
|
7233
|
-
|
|
7258
|
+
} else if ((event2 === "REQUEST_CHANGES" || baseEvent === "REQUEST_CHANGES" && criticalsUnverified) && downgradeRequestChanges) {
|
|
7259
|
+
event2 = "COMMENT";
|
|
7234
7260
|
downgraded = true;
|
|
7235
7261
|
downgradedFrom = "Request changes";
|
|
7236
7262
|
}
|
|
7237
7263
|
let lowSignal = null;
|
|
7238
|
-
if (
|
|
7264
|
+
if (event2 === "APPROVE" && input.planPath) {
|
|
7239
7265
|
try {
|
|
7240
7266
|
const plan = JSON.parse(
|
|
7241
7267
|
readFileSync8(input.planPath, "utf8")
|
|
@@ -7249,10 +7275,10 @@ function composeReviewBody(input, cliVersion) {
|
|
|
7249
7275
|
}
|
|
7250
7276
|
const footer = `_\u2014 ${modelId} via Qwen Code /review (v${cliVersion})_`;
|
|
7251
7277
|
const bilingual = bilingualFromPlan(input.planPath, input.prBodyFetcher);
|
|
7252
|
-
const render = /* @__PURE__ */ __name((parts,
|
|
7253
|
-
const en = parts.map((p) => p.en).join(
|
|
7278
|
+
const render = /* @__PURE__ */ __name((parts, sep5) => {
|
|
7279
|
+
const en = parts.map((p) => p.en).join(sep5);
|
|
7254
7280
|
if (en === "") return "";
|
|
7255
|
-
const zh = parts.map((p) => p.zh).join(
|
|
7281
|
+
const zh = parts.map((p) => p.zh).join(sep5);
|
|
7256
7282
|
const text = bilingual && zh !== en ? `${en}
|
|
7257
7283
|
|
|
7258
7284
|
<details>
|
|
@@ -7386,7 +7412,7 @@ ${footer}`;
|
|
|
7386
7412
|
zh: `Test Plan\uFF08\u975E\u963B\u65AD\uFF09\uFF1A${testPlanNotes.join("; ")}\u3002`
|
|
7387
7413
|
}
|
|
7388
7414
|
] : [];
|
|
7389
|
-
if (
|
|
7415
|
+
if (event2 === "REQUEST_CHANGES") {
|
|
7390
7416
|
const parts = [
|
|
7391
7417
|
...contextUnavailable ? [contextUnavailableClause] : [],
|
|
7392
7418
|
...cannotTellBlock,
|
|
@@ -7396,7 +7422,7 @@ ${footer}`;
|
|
|
7396
7422
|
...bodyCriticalBlock
|
|
7397
7423
|
];
|
|
7398
7424
|
return {
|
|
7399
|
-
event,
|
|
7425
|
+
event: event2,
|
|
7400
7426
|
body: render(parts, "\n\n"),
|
|
7401
7427
|
baseEvent,
|
|
7402
7428
|
cappedBy,
|
|
@@ -7406,9 +7432,9 @@ ${footer}`;
|
|
|
7406
7432
|
lowSignal
|
|
7407
7433
|
};
|
|
7408
7434
|
}
|
|
7409
|
-
if (
|
|
7435
|
+
if (event2 === "APPROVE") {
|
|
7410
7436
|
return {
|
|
7411
|
-
event,
|
|
7437
|
+
event: event2,
|
|
7412
7438
|
body: render(
|
|
7413
7439
|
[
|
|
7414
7440
|
{ en: "No issues found. LGTM! \u2705", zh: "\u672A\u53D1\u73B0\u95EE\u9898\u3002LGTM\uFF01\u2705" },
|
|
@@ -7471,7 +7497,7 @@ ${footer}`;
|
|
|
7471
7497
|
clauses.push(...bodyCriticalBlock);
|
|
7472
7498
|
}
|
|
7473
7499
|
return {
|
|
7474
|
-
event,
|
|
7500
|
+
event: event2,
|
|
7475
7501
|
body: render(clauses, " "),
|
|
7476
7502
|
baseEvent,
|
|
7477
7503
|
cappedBy,
|
|
@@ -7901,8 +7927,8 @@ function parseLocations(o, index) {
|
|
|
7901
7927
|
const lo = l;
|
|
7902
7928
|
const file2 = asString(lo, "file");
|
|
7903
7929
|
if (!file2) fail(index, `location ${j} is missing a non-empty "file".`);
|
|
7904
|
-
if (lo["line"] !== void 0 && typeof lo["line"] !== "number") {
|
|
7905
|
-
fail(index, `location ${j} has
|
|
7930
|
+
if (lo["line"] !== void 0 && (typeof lo["line"] !== "number" || !Number.isSafeInteger(lo["line"]) || lo["line"] <= 0)) {
|
|
7931
|
+
fail(index, `location ${j} has an invalid "line".`);
|
|
7906
7932
|
}
|
|
7907
7933
|
return {
|
|
7908
7934
|
file: file2,
|
|
@@ -7918,8 +7944,8 @@ function parseLocations(o, index) {
|
|
|
7918
7944
|
'needs a non-empty "file" (or a "locations" array for a pattern aggregate).'
|
|
7919
7945
|
);
|
|
7920
7946
|
}
|
|
7921
|
-
if (o["line"] !== void 0 && typeof o["line"] !== "number") {
|
|
7922
|
-
fail(index, 'has
|
|
7947
|
+
if (o["line"] !== void 0 && (typeof o["line"] !== "number" || !Number.isSafeInteger(o["line"]) || o["line"] <= 0)) {
|
|
7948
|
+
fail(index, 'has an invalid "line".');
|
|
7923
7949
|
}
|
|
7924
7950
|
return [
|
|
7925
7951
|
{
|
|
@@ -11398,8 +11424,8 @@ function validateRequests(raw) {
|
|
|
11398
11424
|
);
|
|
11399
11425
|
}
|
|
11400
11426
|
}
|
|
11401
|
-
if (o["line"] !== void 0 && typeof o["line"] !== "number") {
|
|
11402
|
-
throw new Error(`Finding "${o["id"]}" has
|
|
11427
|
+
if (o["line"] !== void 0 && (typeof o["line"] !== "number" || !Number.isSafeInteger(o["line"]) || o["line"] <= 0)) {
|
|
11428
|
+
throw new Error(`Finding "${o["id"]}" has an invalid "line".`);
|
|
11403
11429
|
}
|
|
11404
11430
|
return {
|
|
11405
11431
|
id: o["id"],
|
|
@@ -11547,6 +11573,11 @@ This is an environment problem, not a finding about the agents. Coverage cannot
|
|
|
11547
11573
|
`ERROR: ${report.rewrittenPrompts.length} agent(s) were not launched with the prompt this CLI built for them \u2014 ${report.rewrittenPrompts.join("; ")}. \`agent-prompt\` prints a prompt to be passed VERBATIM; a summary of it is not it. The last run to paraphrase one dropped the rule against reciting a stock sentence and replaced the project's review rules with three sentences of its own. Re-run \`"\${QWEN_CODE_CLI:-qwen}" review agent-prompt\` and pass its output unedited \u2014 copy it, do not retype it.`
|
|
11548
11574
|
);
|
|
11549
11575
|
}
|
|
11576
|
+
if (report.driftedLaunches.length > 0) {
|
|
11577
|
+
writeStderrLine(
|
|
11578
|
+
`NOTE: ${report.driftedLaunches.length} agent(s) launched with a near-verbatim prompt \u2014 ${report.driftedLaunches.join("; ")}. Their briefs were opened and the work is on record, so the delivery stands and NO relaunch is owed. Copy future blocks exactly \u2014 one edited word is what turns a clean pass into this note.`
|
|
11579
|
+
);
|
|
11580
|
+
}
|
|
11550
11581
|
if (report.missingRoles.length > 0) {
|
|
11551
11582
|
writeStderrLine(
|
|
11552
11583
|
// No count: when no role was briefed at all, `missingRoles` collapses to one
|
|
@@ -14762,12 +14793,12 @@ function structuralProblems(payload) {
|
|
|
14762
14793
|
return problems;
|
|
14763
14794
|
}
|
|
14764
14795
|
__name(structuralProblems, "structuralProblems");
|
|
14765
|
-
function inconsistencies(payload,
|
|
14796
|
+
function inconsistencies(payload, event2) {
|
|
14766
14797
|
const problems = [];
|
|
14767
14798
|
const comments = payload.comments ?? [];
|
|
14768
|
-
if (!EVENTS.has(
|
|
14799
|
+
if (!EVENTS.has(event2)) {
|
|
14769
14800
|
problems.push(
|
|
14770
|
-
`computed \`event\` is ${JSON.stringify(
|
|
14801
|
+
`computed \`event\` is ${JSON.stringify(event2)}; GitHub accepts only ${[...EVENTS].join(", ")}`
|
|
14771
14802
|
);
|
|
14772
14803
|
}
|
|
14773
14804
|
comments.forEach((c, i) => {
|
|
@@ -14849,18 +14880,18 @@ Posting is a public, irreversible write, and this run has no authorisation for o
|
|
|
14849
14880
|
` + structural.map((p) => ` - ${p}`).join("\n")
|
|
14850
14881
|
);
|
|
14851
14882
|
}
|
|
14852
|
-
let
|
|
14883
|
+
let event2;
|
|
14853
14884
|
let body;
|
|
14854
14885
|
let cappedBy;
|
|
14855
14886
|
try {
|
|
14856
|
-
({ event, body, cappedBy } = compose(payload, cliVersion));
|
|
14887
|
+
({ event: event2, body, cappedBy } = compose(payload, cliVersion));
|
|
14857
14888
|
} catch (err) {
|
|
14858
14889
|
throw new Error(
|
|
14859
14890
|
`The review state does not compose into a verdict; refusing to post:
|
|
14860
14891
|
- ${err.message}`
|
|
14861
14892
|
);
|
|
14862
14893
|
}
|
|
14863
|
-
const problems = inconsistencies(payload,
|
|
14894
|
+
const problems = inconsistencies(payload, event2);
|
|
14864
14895
|
if (problems.length > 0) {
|
|
14865
14896
|
throw new Error(
|
|
14866
14897
|
`The review payload contradicts itself; refusing to post it:
|
|
@@ -14869,7 +14900,7 @@ Posting is a public, irreversible write, and this run has no authorisation for o
|
|
|
14869
14900
|
}
|
|
14870
14901
|
const post = {
|
|
14871
14902
|
commit_id: payload.commit_id,
|
|
14872
|
-
event,
|
|
14903
|
+
event: event2,
|
|
14873
14904
|
body,
|
|
14874
14905
|
comments: payload.comments ?? []
|
|
14875
14906
|
};
|
|
@@ -14880,7 +14911,7 @@ Posting is a public, irreversible write, and this run has no authorisation for o
|
|
|
14880
14911
|
);
|
|
14881
14912
|
writeStdoutLine(
|
|
14882
14913
|
JSON.stringify(
|
|
14883
|
-
{ posted: false, wouldPost: true, target, event, cappedBy },
|
|
14914
|
+
{ posted: false, wouldPost: true, target, event: event2, cappedBy },
|
|
14884
14915
|
null,
|
|
14885
14916
|
2
|
|
14886
14917
|
)
|
|
@@ -14903,20 +14934,20 @@ Posting is a public, irreversible write, and this run has no authorisation for o
|
|
|
14903
14934
|
mkdirSync22(REVIEW_TMP_DIR, { recursive: true });
|
|
14904
14935
|
atomicWriteFileSync(
|
|
14905
14936
|
receiptPath,
|
|
14906
|
-
`${JSON.stringify({ reviewIds, event, postedAt: (/* @__PURE__ */ new Date()).toISOString() })}
|
|
14937
|
+
`${JSON.stringify({ reviewIds, event: event2, postedAt: (/* @__PURE__ */ new Date()).toISOString() })}
|
|
14907
14938
|
`
|
|
14908
14939
|
);
|
|
14909
14940
|
}
|
|
14910
14941
|
} catch {
|
|
14911
14942
|
}
|
|
14912
14943
|
writeStderrLine(
|
|
14913
|
-
`Posted ${
|
|
14944
|
+
`Posted ${event2} to ${args.repo}#${args.pr} \u2014 ${auth.why}` + (cappedBy.length ? ` (capped by ${cappedBy.join(", ")})` : "") + "."
|
|
14914
14945
|
);
|
|
14915
14946
|
writeStdoutLine(
|
|
14916
14947
|
JSON.stringify(
|
|
14917
14948
|
{
|
|
14918
14949
|
posted: true,
|
|
14919
|
-
event,
|
|
14950
|
+
event: event2,
|
|
14920
14951
|
cappedBy,
|
|
14921
14952
|
inlineComments: post.comments.length
|
|
14922
14953
|
},
|
|
@@ -17093,9 +17124,9 @@ function newestArtifactSince(dir, pattern, startMs) {
|
|
|
17093
17124
|
return best ? best.path : null;
|
|
17094
17125
|
}
|
|
17095
17126
|
__name(newestArtifactSince, "newestArtifactSince");
|
|
17096
|
-
function exitCodeFor(completed,
|
|
17127
|
+
function exitCodeFor(completed, event2, failOn) {
|
|
17097
17128
|
if (!completed) return 1;
|
|
17098
|
-
if (failOn === "request-changes" &&
|
|
17129
|
+
if (failOn === "request-changes" && event2 === "REQUEST_CHANGES") return 3;
|
|
17099
17130
|
return 0;
|
|
17100
17131
|
}
|
|
17101
17132
|
__name(exitCodeFor, "exitCodeFor");
|
|
@@ -17332,13 +17363,308 @@ var runCommand = {
|
|
|
17332
17363
|
}, "handler")
|
|
17333
17364
|
};
|
|
17334
17365
|
|
|
17366
|
+
// packages/cli/src/commands/review/save-artifact.ts
|
|
17367
|
+
init_esbuild_shims();
|
|
17368
|
+
import {
|
|
17369
|
+
existsSync as existsSync14,
|
|
17370
|
+
lstatSync as lstatSync5,
|
|
17371
|
+
mkdirSync as mkdirSync25,
|
|
17372
|
+
readFileSync as readFileSync29,
|
|
17373
|
+
statSync as statSync10
|
|
17374
|
+
} from "node:fs";
|
|
17375
|
+
import {
|
|
17376
|
+
dirname as dirname23,
|
|
17377
|
+
isAbsolute as isAbsolute4,
|
|
17378
|
+
join as join21,
|
|
17379
|
+
relative as relative3,
|
|
17380
|
+
resolve as resolve22,
|
|
17381
|
+
sep as sep4,
|
|
17382
|
+
toNamespacedPath
|
|
17383
|
+
} from "node:path";
|
|
17384
|
+
import { isDeepStrictEqual } from "node:util";
|
|
17385
|
+
function workspaceRoot() {
|
|
17386
|
+
return resolve22(process.env["QWEN_CODE_PROJECT_DIR"] ?? process.cwd());
|
|
17387
|
+
}
|
|
17388
|
+
__name(workspaceRoot, "workspaceRoot");
|
|
17389
|
+
function isWithin(parent, child) {
|
|
17390
|
+
const rel = relative3(parent, child);
|
|
17391
|
+
return rel === "" || !isAbsolute4(rel) && rel !== ".." && !rel.startsWith(`..${sep4}`);
|
|
17392
|
+
}
|
|
17393
|
+
__name(isWithin, "isWithin");
|
|
17394
|
+
function workspacePath(root, value, label2) {
|
|
17395
|
+
const absolute = resolve22(root, value);
|
|
17396
|
+
if (!isWithin(root, absolute)) {
|
|
17397
|
+
throw new Error(
|
|
17398
|
+
`${label2} must be inside the workspace: ${JSON.stringify(value)}.`
|
|
17399
|
+
);
|
|
17400
|
+
}
|
|
17401
|
+
return absolute;
|
|
17402
|
+
}
|
|
17403
|
+
__name(workspacePath, "workspacePath");
|
|
17404
|
+
function rejectSymlinkPath(root, path3, label2) {
|
|
17405
|
+
const rel = relative3(root, path3);
|
|
17406
|
+
let current = root;
|
|
17407
|
+
for (const segment of rel.split(sep4)) {
|
|
17408
|
+
current = join21(current, segment);
|
|
17409
|
+
if (existsSync14(current) && lstatSync5(current).isSymbolicLink()) {
|
|
17410
|
+
throw new Error(`${label2} must not traverse a symbolic link.`);
|
|
17411
|
+
}
|
|
17412
|
+
}
|
|
17413
|
+
}
|
|
17414
|
+
__name(rejectSymlinkPath, "rejectSymlinkPath");
|
|
17415
|
+
function sameFile(left, right) {
|
|
17416
|
+
if (left === right) return true;
|
|
17417
|
+
if (!existsSync14(left) || !existsSync14(right)) return false;
|
|
17418
|
+
const leftStat = statSync10(left);
|
|
17419
|
+
const rightStat = statSync10(right);
|
|
17420
|
+
return leftStat.dev === rightStat.dev && leftStat.ino === rightStat.ino;
|
|
17421
|
+
}
|
|
17422
|
+
__name(sameFile, "sameFile");
|
|
17423
|
+
function readText(path3, label2) {
|
|
17424
|
+
try {
|
|
17425
|
+
return readFileSync29(path3, "utf8");
|
|
17426
|
+
} catch (error) {
|
|
17427
|
+
throw new Error(
|
|
17428
|
+
`Could not read the ${label2} file at ${JSON.stringify(path3)}: ${error instanceof Error ? error.message : String(error)}`
|
|
17429
|
+
);
|
|
17430
|
+
}
|
|
17431
|
+
}
|
|
17432
|
+
__name(readText, "readText");
|
|
17433
|
+
function readJson2(path3, label2) {
|
|
17434
|
+
const text = readText(path3, label2);
|
|
17435
|
+
try {
|
|
17436
|
+
return JSON.parse(text);
|
|
17437
|
+
} catch (error) {
|
|
17438
|
+
throw new Error(
|
|
17439
|
+
`The ${label2} file at ${JSON.stringify(path3)} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`
|
|
17440
|
+
);
|
|
17441
|
+
}
|
|
17442
|
+
}
|
|
17443
|
+
__name(readJson2, "readJson");
|
|
17444
|
+
function object(value, label2) {
|
|
17445
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
17446
|
+
throw new Error(`${label2} must be an object.`);
|
|
17447
|
+
}
|
|
17448
|
+
return value;
|
|
17449
|
+
}
|
|
17450
|
+
__name(object, "object");
|
|
17451
|
+
function string(value, label2) {
|
|
17452
|
+
if (typeof value !== "string") {
|
|
17453
|
+
throw new Error(`${label2} must be a string.`);
|
|
17454
|
+
}
|
|
17455
|
+
return value;
|
|
17456
|
+
}
|
|
17457
|
+
__name(string, "string");
|
|
17458
|
+
function nonEmptyString(value, label2) {
|
|
17459
|
+
const text = string(value, label2);
|
|
17460
|
+
if (text.trim() === "") {
|
|
17461
|
+
throw new Error(`${label2} must be a non-empty string.`);
|
|
17462
|
+
}
|
|
17463
|
+
return text;
|
|
17464
|
+
}
|
|
17465
|
+
__name(nonEmptyString, "nonEmptyString");
|
|
17466
|
+
function stringArray2(value, label2) {
|
|
17467
|
+
if (!Array.isArray(value) || value.some((entry) => typeof entry !== "string")) {
|
|
17468
|
+
throw new Error(`${label2} must be an array of strings.`);
|
|
17469
|
+
}
|
|
17470
|
+
return value;
|
|
17471
|
+
}
|
|
17472
|
+
__name(stringArray2, "stringArray");
|
|
17473
|
+
function event(value, label2) {
|
|
17474
|
+
if (value !== "APPROVE" && value !== "COMMENT" && value !== "REQUEST_CHANGES") {
|
|
17475
|
+
throw new Error(`${label2} has an unsupported value.`);
|
|
17476
|
+
}
|
|
17477
|
+
return value;
|
|
17478
|
+
}
|
|
17479
|
+
__name(event, "event");
|
|
17480
|
+
function validateVerdict(value) {
|
|
17481
|
+
const verdict = object(value, "Composed verdict");
|
|
17482
|
+
const downgradedFrom = verdict["downgradedFrom"];
|
|
17483
|
+
if (downgradedFrom !== null && downgradedFrom !== "Approve" && downgradedFrom !== "Request changes") {
|
|
17484
|
+
throw new Error(
|
|
17485
|
+
"Composed verdict.downgradedFrom has an unsupported value."
|
|
17486
|
+
);
|
|
17487
|
+
}
|
|
17488
|
+
if (typeof verdict["downgraded"] !== "boolean") {
|
|
17489
|
+
throw new Error("Composed verdict.downgraded must be a boolean.");
|
|
17490
|
+
}
|
|
17491
|
+
const lowSignal = verdict["lowSignal"];
|
|
17492
|
+
if (lowSignal !== null) {
|
|
17493
|
+
const signal = object(lowSignal, "Composed verdict.lowSignal");
|
|
17494
|
+
for (const key of ["agents", "srcDiffLines"]) {
|
|
17495
|
+
if (typeof signal[key] !== "number" || !Number.isInteger(signal[key]) || signal[key] < 0) {
|
|
17496
|
+
throw new Error(
|
|
17497
|
+
`Composed verdict.lowSignal.${key} must be a non-negative integer.`
|
|
17498
|
+
);
|
|
17499
|
+
}
|
|
17500
|
+
}
|
|
17501
|
+
}
|
|
17502
|
+
return {
|
|
17503
|
+
event: event(verdict["event"], "Composed verdict.event"),
|
|
17504
|
+
body: string(verdict["body"], "Composed verdict.body"),
|
|
17505
|
+
baseEvent: event(verdict["baseEvent"], "Composed verdict.baseEvent"),
|
|
17506
|
+
cappedBy: stringArray2(verdict["cappedBy"], "Composed verdict.cappedBy"),
|
|
17507
|
+
downgraded: verdict["downgraded"],
|
|
17508
|
+
downgradedFrom,
|
|
17509
|
+
remediation: stringArray2(
|
|
17510
|
+
verdict["remediation"],
|
|
17511
|
+
"Composed verdict.remediation"
|
|
17512
|
+
),
|
|
17513
|
+
lowSignal: lowSignal === null ? null : {
|
|
17514
|
+
agents: lowSignal["agents"],
|
|
17515
|
+
srcDiffLines: lowSignal["srcDiffLines"]
|
|
17516
|
+
},
|
|
17517
|
+
verdictLine: nonEmptyString(
|
|
17518
|
+
verdict["verdictLine"],
|
|
17519
|
+
"Composed verdict.verdictLine"
|
|
17520
|
+
)
|
|
17521
|
+
};
|
|
17522
|
+
}
|
|
17523
|
+
__name(validateVerdict, "validateVerdict");
|
|
17524
|
+
function validateFindingsReport(value) {
|
|
17525
|
+
const report = object(value, "Canonical findings report");
|
|
17526
|
+
if (typeof report["outcomesRecorded"] !== "boolean") {
|
|
17527
|
+
throw new Error(
|
|
17528
|
+
"Canonical findings report.outcomesRecorded must be a boolean."
|
|
17529
|
+
);
|
|
17530
|
+
}
|
|
17531
|
+
const canonical = buildReport(validateFindings(report["findings"]));
|
|
17532
|
+
const supplied = {
|
|
17533
|
+
findings: report["findings"],
|
|
17534
|
+
counts: report["counts"],
|
|
17535
|
+
outcomesRecorded: report["outcomesRecorded"]
|
|
17536
|
+
};
|
|
17537
|
+
if (!isDeepStrictEqual(supplied, canonical)) {
|
|
17538
|
+
throw new Error(
|
|
17539
|
+
"Canonical findings report is malformed or inconsistent with its findings."
|
|
17540
|
+
);
|
|
17541
|
+
}
|
|
17542
|
+
return supplied;
|
|
17543
|
+
}
|
|
17544
|
+
__name(validateFindingsReport, "validateFindingsReport");
|
|
17545
|
+
function saveReviewArtifact(args) {
|
|
17546
|
+
const root = workspaceRoot();
|
|
17547
|
+
const findingsPath = workspacePath(root, args.findings, "Findings input");
|
|
17548
|
+
const composedPath = workspacePath(root, args.composed, "Composed input");
|
|
17549
|
+
const reportPath = workspacePath(root, args.report, "Markdown report");
|
|
17550
|
+
const outputPath = workspacePath(root, args.out, "Output");
|
|
17551
|
+
const reviewsRoot = resolve22(root, REVIEWS_DIR);
|
|
17552
|
+
if (!isWithin(reviewsRoot, reportPath) || reportPath === reviewsRoot) {
|
|
17553
|
+
throw new Error(
|
|
17554
|
+
`Markdown report must be a file under ${JSON.stringify(REVIEWS_DIR)}: ${JSON.stringify(args.report)}.`
|
|
17555
|
+
);
|
|
17556
|
+
}
|
|
17557
|
+
if (!isWithin(reviewsRoot, outputPath) || outputPath === reviewsRoot) {
|
|
17558
|
+
throw new Error(
|
|
17559
|
+
`Output must be a file under ${JSON.stringify(REVIEWS_DIR)}: ${JSON.stringify(args.out)}.`
|
|
17560
|
+
);
|
|
17561
|
+
}
|
|
17562
|
+
for (const [label2, inputPath] of [
|
|
17563
|
+
["findings input", findingsPath],
|
|
17564
|
+
["composed input", composedPath],
|
|
17565
|
+
["Markdown report", reportPath]
|
|
17566
|
+
]) {
|
|
17567
|
+
if (sameFile(outputPath, inputPath)) {
|
|
17568
|
+
throw new Error(`Output must not overwrite the ${label2}.`);
|
|
17569
|
+
}
|
|
17570
|
+
}
|
|
17571
|
+
rejectSymlinkPath(root, findingsPath, "Findings input");
|
|
17572
|
+
rejectSymlinkPath(root, composedPath, "Composed input");
|
|
17573
|
+
rejectSymlinkPath(root, reportPath, "Markdown report");
|
|
17574
|
+
rejectSymlinkPath(root, outputPath, "Output");
|
|
17575
|
+
if (!EFFORT_LEVELS.has(args.effort)) {
|
|
17576
|
+
throw new Error(
|
|
17577
|
+
`Unsupported review effort: ${JSON.stringify(args.effort)}.`
|
|
17578
|
+
);
|
|
17579
|
+
}
|
|
17580
|
+
if (args.effort === "low") {
|
|
17581
|
+
throw new Error(
|
|
17582
|
+
"save-artifact does not support low-effort reviews: low has no canonical composed verdict to persist."
|
|
17583
|
+
);
|
|
17584
|
+
}
|
|
17585
|
+
nonEmptyString(args.target, "Target");
|
|
17586
|
+
const findings = validateFindingsReport(
|
|
17587
|
+
readJson2(findingsPath, "canonical findings")
|
|
17588
|
+
);
|
|
17589
|
+
const verdict = validateVerdict(readJson2(composedPath, "composed verdict"));
|
|
17590
|
+
let reportIsFile;
|
|
17591
|
+
try {
|
|
17592
|
+
reportIsFile = statSync10(reportPath).isFile();
|
|
17593
|
+
} catch {
|
|
17594
|
+
}
|
|
17595
|
+
if (reportIsFile === false) {
|
|
17596
|
+
throw new Error(
|
|
17597
|
+
`Markdown report is not a file: ${JSON.stringify(args.report)}.`
|
|
17598
|
+
);
|
|
17599
|
+
}
|
|
17600
|
+
readText(reportPath, "Markdown report");
|
|
17601
|
+
const markdownReportPath = relative3(root, reportPath).split(sep4).join("/");
|
|
17602
|
+
const document = {
|
|
17603
|
+
schemaVersion: 1,
|
|
17604
|
+
target: args.target,
|
|
17605
|
+
effort: args.effort,
|
|
17606
|
+
verdict,
|
|
17607
|
+
findings: findings.findings,
|
|
17608
|
+
counts: findings.counts,
|
|
17609
|
+
outcomesRecorded: findings.outcomesRecorded,
|
|
17610
|
+
markdownReportPath
|
|
17611
|
+
};
|
|
17612
|
+
mkdirSync25(dirname23(outputPath), { recursive: true });
|
|
17613
|
+
atomicWriteFileSync(
|
|
17614
|
+
toNamespacedPath(outputPath),
|
|
17615
|
+
`${JSON.stringify(document, null, 2)}
|
|
17616
|
+
`,
|
|
17617
|
+
{ encoding: "utf8", noFollow: true }
|
|
17618
|
+
);
|
|
17619
|
+
return {
|
|
17620
|
+
path: outputPath,
|
|
17621
|
+
workspacePath: relative3(root, outputPath).split(sep4).join("/")
|
|
17622
|
+
};
|
|
17623
|
+
}
|
|
17624
|
+
__name(saveReviewArtifact, "saveReviewArtifact");
|
|
17625
|
+
var saveArtifactCommand = {
|
|
17626
|
+
command: "save-artifact",
|
|
17627
|
+
describe: "Create a durable versioned code-review JSON document from canonical review artifacts",
|
|
17628
|
+
builder: /* @__PURE__ */ __name((yargs) => yargs.option("findings", {
|
|
17629
|
+
type: "string",
|
|
17630
|
+
demandOption: true,
|
|
17631
|
+
describe: "Canonical findings JSON"
|
|
17632
|
+
}).option("composed", {
|
|
17633
|
+
type: "string",
|
|
17634
|
+
demandOption: true,
|
|
17635
|
+
describe: "Composed verdict JSON"
|
|
17636
|
+
}).option("report", {
|
|
17637
|
+
type: "string",
|
|
17638
|
+
demandOption: true,
|
|
17639
|
+
describe: "Existing durable Markdown report"
|
|
17640
|
+
}).option("target", {
|
|
17641
|
+
type: "string",
|
|
17642
|
+
demandOption: true,
|
|
17643
|
+
describe: "Review target label"
|
|
17644
|
+
}).option("effort", {
|
|
17645
|
+
type: "string",
|
|
17646
|
+
choices: [...EFFORT_LEVELS].filter((effort) => effort !== "low"),
|
|
17647
|
+
demandOption: true,
|
|
17648
|
+
describe: "Resolved review effort"
|
|
17649
|
+
}).option("out", {
|
|
17650
|
+
type: "string",
|
|
17651
|
+
demandOption: true,
|
|
17652
|
+
describe: "Output path under .qwen/reviews/"
|
|
17653
|
+
}), "builder"),
|
|
17654
|
+
handler: /* @__PURE__ */ __name((argv) => {
|
|
17655
|
+
const saved = saveReviewArtifact(argv);
|
|
17656
|
+
writeStdoutLine(JSON.stringify(saved));
|
|
17657
|
+
writeStderrLine(`save-artifact: wrote ${saved.path}`);
|
|
17658
|
+
}, "handler")
|
|
17659
|
+
};
|
|
17660
|
+
|
|
17335
17661
|
// packages/cli/src/commands/review.ts
|
|
17336
17662
|
var reviewCommand = {
|
|
17337
17663
|
command: "review",
|
|
17338
17664
|
describe: "Run a review non-interactively (`run`), plus the internal helpers used by the /review skill (PR worktree setup, context fetch, rules loading, presubmit checks, cleanup)",
|
|
17339
|
-
builder: /* @__PURE__ */ __name((yargs) => yargs.command(runCommand).command(parseArgsCommand).command(fetchPrCommand).command(captureLocalCommand).command(planDiffCommand).command(prContextCommand).command(commentStatusCommand).command(loadRulesCommand).command(agentPromptCommand).command(buildTestCommand).command(baseTreeCommand).command(testDeltaCommand).command(driveCommand).command(mockProviderCommand).command(extractStepCommand).command(scriptLintCommand).command(resolveAnchorsCommand).command(checkCoverageCommand).command(presubmitCommand).command(testEfficacyCommand).command(testPlanCommand).command(findingsCommand).command(publishAssetsCommand).command(composeReviewCommand).command(submitCommand).command(cleanupCommand).demandCommand(
|
|
17665
|
+
builder: /* @__PURE__ */ __name((yargs) => yargs.command(runCommand).command(parseArgsCommand).command(fetchPrCommand).command(captureLocalCommand).command(planDiffCommand).command(prContextCommand).command(commentStatusCommand).command(loadRulesCommand).command(agentPromptCommand).command(buildTestCommand).command(baseTreeCommand).command(testDeltaCommand).command(driveCommand).command(mockProviderCommand).command(extractStepCommand).command(scriptLintCommand).command(resolveAnchorsCommand).command(checkCoverageCommand).command(presubmitCommand).command(testEfficacyCommand).command(testPlanCommand).command(findingsCommand).command(publishAssetsCommand).command(composeReviewCommand).command(saveArtifactCommand).command(submitCommand).command(cleanupCommand).demandCommand(
|
|
17340
17666
|
1,
|
|
17341
|
-
"Specify a subcommand: run, parse-args, fetch-pr, capture-local, plan-diff, pr-context, comment-status, load-rules, agent-prompt, build-test, base-tree, test-delta, drive, mock-provider, extract-step, script-lint, resolve-anchors, check-coverage, presubmit, test-efficacy, test-plan, findings, publish-assets, compose-review, submit, or cleanup."
|
|
17667
|
+
"Specify a subcommand: run, parse-args, fetch-pr, capture-local, plan-diff, pr-context, comment-status, load-rules, agent-prompt, build-test, base-tree, test-delta, drive, mock-provider, extract-step, script-lint, resolve-anchors, check-coverage, presubmit, test-efficacy, test-plan, findings, publish-assets, compose-review, save-artifact, submit, or cleanup."
|
|
17342
17668
|
).version(false), "builder"),
|
|
17343
17669
|
handler: /* @__PURE__ */ __name(() => {
|
|
17344
17670
|
}, "handler")
|
|
@@ -17538,10 +17864,10 @@ var updateCommand3 = {
|
|
|
17538
17864
|
stdioHelpers,
|
|
17539
17865
|
{ updateEventEmitter }
|
|
17540
17866
|
] = await Promise.all([
|
|
17541
|
-
import("./settings-
|
|
17542
|
-
import("./updateCheck-
|
|
17543
|
-
import("./installationInfo-
|
|
17544
|
-
import("./standalone-update-
|
|
17867
|
+
import("./settings-E6H3AURD.js"),
|
|
17868
|
+
import("./updateCheck-ZXRCGY66.js"),
|
|
17869
|
+
import("./installationInfo-OFDYLDFD.js"),
|
|
17870
|
+
import("./standalone-update-NYYZEHLD.js"),
|
|
17545
17871
|
import("./stdioHelpers-HGIYTWAY.js"),
|
|
17546
17872
|
import("./updateEventEmitter-5MKC7BLQ.js")
|
|
17547
17873
|
]);
|
|
@@ -18708,7 +19034,7 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
|
|
|
18708
19034
|
disabledSlashCommands: disabledSlashCommands.length > 0 ? disabledSlashCommands : void 0,
|
|
18709
19035
|
disabledSkillNamesProvider: bareMode || safeMode ? void 0 : disabledSkillNamesProvider,
|
|
18710
19036
|
terminalImageRenderSupportProvider: interactive ? async () => {
|
|
18711
|
-
const { getTerminalImageRenderSupport } = await import("./terminal-image-renderer-
|
|
19037
|
+
const { getTerminalImageRenderSupport } = await import("./terminal-image-renderer-QRSCS2BE.js");
|
|
18712
19038
|
return getTerminalImageRenderSupport();
|
|
18713
19039
|
} : void 0,
|
|
18714
19040
|
disabledSkillLevels: bareMode || safeMode || !Array.isArray(settings.skills?.disabledLevels) ? void 0 : settings.skills.disabledLevels.filter(isSkillLevel),
|
|
@@ -18984,11 +19310,11 @@ var ExtensionRefreshState = class {
|
|
|
18984
19310
|
contentChangedDuringReload = false;
|
|
18985
19311
|
suppressionDepth = 0;
|
|
18986
19312
|
suppressUntil = 0;
|
|
18987
|
-
on(
|
|
18988
|
-
this.events.on(
|
|
19313
|
+
on(event2, listener) {
|
|
19314
|
+
this.events.on(event2, listener);
|
|
18989
19315
|
}
|
|
18990
|
-
off(
|
|
18991
|
-
this.events.off(
|
|
19316
|
+
off(event2, listener) {
|
|
19317
|
+
this.events.off(event2, listener);
|
|
18992
19318
|
}
|
|
18993
19319
|
markExtensionsChanged(reason) {
|
|
18994
19320
|
if (this.isSuppressed()) {
|