@qwen-code/qwen-code 0.20.2-headless-image-routing.1 → 0.21.0
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 +5 -0
- package/bundled/qc-helper/docs/features/sub-agents.md +23 -5
- package/bundled/qc-helper/docs/integration-github-action.md +9 -9
- package/bundled/review/SKILL.md +7 -3
- package/chunks/MaxSizedBox-5DPPWPGT.js +85 -0
- package/chunks/{StandaloneSessionPicker-PLQQB22E.js → StandaloneSessionPicker-BIRMPLRD.js} +66 -59
- package/chunks/{acp-startup-profiler-N3RHHXJ3.js → acp-startup-profiler-RV3IV562.js} +2 -2
- package/chunks/{acpAgent-AIVK2EM5.js → acpAgent-6J2U72PQ.js} +705 -182
- package/chunks/agent-6ODUANDO.js +81 -0
- package/chunks/agent-headless-7BYQTMHW.js +75 -0
- package/chunks/{anthropicContentGenerator-HGWAHO24.js → anthropicContentGenerator-75BKLTSP.js} +117 -43
- package/chunks/{artifact-tool-56T5IMBP.js → artifact-tool-Y5T7GG7F.js} +3 -3
- package/chunks/{askUserQuestion-E25OBIC2.js → askUserQuestion-2H6747FR.js} +3 -3
- package/chunks/bridge-ZUB64FAE.js +90 -0
- package/chunks/{build-GHIZ4MSZ.js → build-RV63TIRH.js} +2 -3
- package/chunks/{ca-N6VVUFVB.js → ca-25EDXPFZ.js} +2 -0
- package/chunks/{channel-worker-group-QZV2SP5U.js → channel-worker-group-2ZD7TVAT.js} +8 -7
- package/chunks/{channel-worker-manager-3GMAU45H.js → channel-worker-manager-4OA4BCGB.js} +190 -30
- package/chunks/{channel-worker-supervisor-QCXSXCRY.js → channel-worker-supervisor-V7KCFJTS.js} +7 -6
- package/chunks/{chunk-TYQMGACW.js → chunk-22C7BQ6D.js} +508 -10967
- package/chunks/chunk-2JZBVYTU.js +452 -0
- package/chunks/{chunk-H2XVO6NE.js → chunk-2MIN6GRR.js} +1 -1
- package/chunks/{chunk-4DWTDZGS.js → chunk-2NH6DYI4.js} +12 -12
- package/chunks/chunk-2SCDWPXI.js +246 -0
- package/chunks/{chunk-QE4KFTBS.js → chunk-2X55UKQE.js} +3 -3
- package/chunks/{chunk-QBUDF33N.js → chunk-3QMGYBFN.js} +1 -1
- package/chunks/{chunk-3OAKYHRG.js → chunk-3RN6GBKS.js} +1 -1
- package/chunks/{chunk-QR6U5QPP.js → chunk-3SJ43L4W.js} +4 -0
- package/chunks/chunk-46UV252V.js +128 -0
- package/chunks/{chunk-GHRSKGHF.js → chunk-4WIZGAH3.js} +7 -7
- package/chunks/{chunk-CAS7CB3T.js → chunk-55DJUCI2.js} +87 -29
- package/chunks/{chunk-QNLNLENL.js → chunk-5I2IWRSH.js} +2 -2
- package/chunks/{chunk-H24SOJIQ.js → chunk-5NBDS5S6.js} +147 -7
- package/chunks/{chunk-E4IMU4Y5.js → chunk-63P4EL5V.js} +1 -1
- package/chunks/chunk-6FGBXPWM.js +293 -0
- package/chunks/{chunk-FFFM6NJV.js → chunk-6GMVPFB2.js} +155 -73
- package/chunks/{chunk-KWK7UE6L.js → chunk-6OUGMXDC.js} +6 -6
- package/chunks/{chunk-QRUIS3DN.js → chunk-6PEXNQTX.js} +22 -1
- package/chunks/{chunk-FZPTCQY7.js → chunk-7JURR4JT.js} +1 -1
- package/chunks/{chunk-Q6NAKZTA.js → chunk-7MVVZO4N.js} +4 -4
- package/chunks/{chunk-6ZBPS62S.js → chunk-7ZCNENPP.js} +1 -1
- package/chunks/{chunk-6X4GWOPW.js → chunk-A5L3JMUA.js} +1 -1
- package/chunks/{chunk-YO2XRXY6.js → chunk-ACY3A37B.js} +3 -3
- package/chunks/chunk-AMDSOFFV.js +10860 -0
- package/chunks/{chunk-RV4C2ZFG.js → chunk-BIQWWWJN.js} +1 -1
- package/chunks/{chunk-ZHERRXZJ.js → chunk-BJX6ZSUK.js} +4 -4
- package/chunks/chunk-BK2UNYWD.js +29 -0
- package/chunks/{chunk-FRPDJNK3.js → chunk-BKHWX6I2.js} +3 -3
- package/chunks/chunk-BPJSQIJX.js +100 -0
- package/chunks/{chunk-M7WBGLYP.js → chunk-BULDBTYC.js} +2 -0
- package/chunks/{chunk-ZDP2Y2AL.js → chunk-CIKQ7KKO.js} +4625 -8645
- package/chunks/{chunk-PEJWA3QQ.js → chunk-D3UEZIQH.js} +4 -2
- package/chunks/chunk-DHHOYAPR.js +1462 -0
- package/chunks/{chunk-LESHKUWF.js → chunk-DLWL3Z7A.js} +5 -3
- package/chunks/{chunk-XHATNRQA.js → chunk-DP3IHZGG.js} +0 -2
- package/chunks/chunk-E5TUC6CA.js +479 -0
- package/chunks/{chunk-JC26SJ5Y.js → chunk-EBJQ6AXW.js} +13 -12
- package/chunks/{chunk-RCWKCN2Z.js → chunk-EPDRMGT4.js} +164 -17
- package/chunks/{chunk-FUFCALSJ.js → chunk-ETSW4KLJ.js} +2 -2
- package/chunks/{chunk-KHOVYUHX.js → chunk-FNQ6T3CV.js} +20 -3
- package/chunks/{chunk-SP5WRGVG.js → chunk-FQK6JAFG.js} +72 -23
- package/chunks/{chunk-NWZY2SPY.js → chunk-FSITMZJH.js} +8 -8
- package/chunks/{chunk-6RLROE6G.js → chunk-GLWP3FDB.js} +80 -15
- package/chunks/{chunk-KPBVP6SL.js → chunk-GSN55ZRI.js} +5 -5
- package/chunks/{chunk-MLYGPZGU.js → chunk-H4SBPHSA.js} +3 -3
- package/chunks/chunk-H5FFA6TH.js +902 -0
- package/chunks/{chunk-TDKQP3M6.js → chunk-HIJQF5B5.js} +1 -1
- package/chunks/{chunk-5G3ZVADU.js → chunk-IJTOWOD7.js} +17 -6
- package/chunks/chunk-IKCX4CCL.js +469 -0
- package/chunks/{chunk-LPEONXNV.js → chunk-IKYJHJNF.js} +3 -3
- package/chunks/{chunk-DTZY2SH2.js → chunk-IO3IX5Q4.js} +1 -1
- package/chunks/{chunk-RS7MT2QG.js → chunk-IPUUTYMV.js} +2 -4
- package/chunks/{chunk-XU457J4V.js → chunk-IRH27ZC2.js} +2 -2
- package/chunks/{chunk-46DK772E.js → chunk-J24WCGIN.js} +4 -4
- package/chunks/{chunk-4LVZNIDO.js → chunk-J56UI34H.js} +4 -13
- package/chunks/{chunk-TJTKSVIV.js → chunk-JLU636DO.js} +5 -1
- package/chunks/{chunk-RKWX4CMO.js → chunk-JVPM2ULZ.js} +6 -6
- package/chunks/{chunk-ENPCQK44.js → chunk-JXJFVC6E.js} +37 -18
- package/chunks/{chunk-NABLFI57.js → chunk-JZA3JUDJ.js} +1 -1
- package/chunks/{chunk-CGLQAVZE.js → chunk-K36B6G2O.js} +5 -5
- package/chunks/{chunk-GPSKDNEE.js → chunk-K4XWPEWB.js} +4 -4
- package/chunks/{chunk-QOZOIPSF.js → chunk-KIM5GUMA.js} +650 -113
- package/chunks/{chunk-JZSM2IZ3.js → chunk-KMQ33DO4.js} +7 -5
- package/chunks/{chunk-E2UVIFI2.js → chunk-KRXPRVGL.js} +0 -1
- package/chunks/{chunk-WHGVTP7Q.js → chunk-L26JL52R.js} +3 -3
- package/chunks/{chunk-7Z6JQEL6.js → chunk-L5UHQJTJ.js} +1 -1
- package/chunks/{chunk-O2XSCRCS.js → chunk-LB6DUZ26.js} +259 -67
- package/chunks/chunk-LEH5C7FV.js +232 -0
- package/chunks/{chunk-RWV32G2M.js → chunk-LH2BYDQ5.js} +6 -4
- package/chunks/{chunk-QKTHJXCS.js → chunk-LK7CHLVP.js} +79 -2
- package/chunks/{chunk-VRRF3GW5.js → chunk-LKEJ26GS.js} +11 -11
- package/chunks/{chunk-SQFXI7VK.js → chunk-LQIW3YFY.js} +227 -41
- package/chunks/chunk-LS77BEZP.js +405 -0
- package/chunks/{chunk-BSHD62QJ.js → chunk-M4FMGVY4.js} +3 -3
- package/chunks/{chunk-57FIIFJN.js → chunk-M5JM7OSF.js} +1 -1
- package/chunks/{chunk-7362QS5B.js → chunk-MB4MZHMJ.js} +80 -37
- package/chunks/{chunk-4K56OJFJ.js → chunk-MUP3T3AD.js} +1 -1
- package/chunks/{chunk-3HFNGB2O.js → chunk-MVSUYZDT.js} +4 -4
- package/chunks/{chunk-T5IO6FZ4.js → chunk-MZAXJAUM.js} +1 -1
- package/chunks/{chunk-QKNXKTZX.js → chunk-NH6KE4JX.js} +3 -3
- package/chunks/chunk-NIBLUX3Y.js +934 -0
- package/chunks/{chunk-OQB4EXO4.js → chunk-NL7LTRLR.js} +1 -1
- package/chunks/{chunk-CS2FSS7W.js → chunk-OFDOK3VM.js} +5 -5
- package/chunks/{chunk-LIZRAKPB.js → chunk-OHNBB4XR.js} +1 -1
- package/chunks/{chunk-MDZTPSXO.js → chunk-OKY7HXPG.js} +2 -2
- package/chunks/{chunk-NHDKSOEY.js → chunk-P3QQPMQA.js} +5 -5
- package/chunks/{chunk-7THPNISK.js → chunk-PC6JANNU.js} +5 -5
- package/chunks/{chunk-OTQ6PSZC.js → chunk-PHOF65IG.js} +3498 -1030
- package/chunks/{chunk-OQ5SYCPE.js → chunk-PJIZUQVC.js} +2 -2
- package/chunks/{chunk-5DTTYNB7.js → chunk-PQNHRFJC.js} +16 -3
- package/chunks/{chunk-YM3SZTH4.js → chunk-PR75REBZ.js} +18 -1
- package/chunks/{chunk-RECUEJ7B.js → chunk-PSOO6YXD.js} +18 -15
- package/chunks/{chunk-X6N25LXS.js → chunk-PWTZEM3C.js} +2 -2
- package/chunks/{chunk-5NJTNQUW.js → chunk-PWVFN2LF.js} +1 -1
- package/chunks/{chunk-7AUH6A4T.js → chunk-Q4M4MDQ4.js} +2 -2
- package/chunks/{chunk-EZPB6S2I.js → chunk-QAF7NMK7.js} +1 -1
- package/chunks/{chunk-5GI55PF5.js → chunk-R5AFZNQW.js} +5 -5
- package/chunks/{chunk-T5B5NQZX.js → chunk-RF3EXIHJ.js} +47 -60
- package/chunks/{chunk-4K7VDKAD.js → chunk-RHLZR4E5.js} +1 -1
- package/chunks/{chunk-TJDW42MV.js → chunk-RIBKPMRP.js} +220 -141
- package/chunks/{chunk-RVLZCXEE.js → chunk-RWTEFFPU.js} +82 -3
- package/chunks/{chunk-L5QZGCRH.js → chunk-RZIX2G32.js} +1 -1
- package/chunks/{chunk-LLKWRXSS.js → chunk-SQCQ4KO2.js} +350 -418
- package/chunks/{chunk-THJNPLI4.js → chunk-TARRHLLG.js} +1 -0
- package/chunks/{chunk-XCXYRDHB.js → chunk-TEHGS6UP.js} +47 -18
- package/chunks/{chunk-PQIVAWXN.js → chunk-TGILQ3YH.js} +8 -8
- package/chunks/{chunk-Q2YKNMLS.js → chunk-TOFQCPDC.js} +43 -10
- package/chunks/{chunk-L3KUB6XM.js → chunk-TPRQ7RZH.js} +586 -242
- package/chunks/{chunk-T4TZQJ7W.js → chunk-TWPJO254.js} +5 -16
- package/chunks/{chunk-HIP6TVWA.js → chunk-U7M2DMGW.js} +3 -3
- package/chunks/{chunk-ACW3VNUE.js → chunk-UDX5OBWR.js} +41 -9
- package/chunks/{chunk-LW2FUYBN.js → chunk-USTWD7QV.js} +6 -4
- package/chunks/{chunk-NPQDJGKU.js → chunk-UUUTRMI2.js} +1 -1
- package/chunks/chunk-UW5EOVUN.js +249 -0
- package/chunks/{chunk-6IL7KRLE.js → chunk-VAK25FTU.js} +1 -1
- package/chunks/{chunk-O4BHWVUD.js → chunk-VIA5XA4U.js} +5 -2
- package/chunks/{chunk-EBXZ2YGV.js → chunk-VRYUBFMC.js} +1 -1
- package/chunks/{chunk-TWVE5ZS5.js → chunk-VULLI6WQ.js} +172 -6
- package/chunks/{chunk-LNDD3IML.js → chunk-WCXCRJYB.js} +1 -1
- package/chunks/{chunk-2LI23QA6.js → chunk-X5XDDSSH.js} +1 -1
- package/chunks/{chunk-Q35QUZDQ.js → chunk-Y34KJKDC.js} +1 -1
- package/chunks/{chunk-7NR2AIK6.js → chunk-YBL3QUDD.js} +2 -2
- package/chunks/{chunk-H4AR2JQF.js → chunk-YH6G52F2.js} +3 -3
- package/chunks/{chunk-MBOJHHPI.js → chunk-YPE6A4GC.js} +2 -2
- package/chunks/{chunk-3EK5ZOUQ.js → chunk-YX324OPW.js} +1 -1
- package/chunks/{chunk-4PTLZ3NX.js → chunk-Z2BC6UJ5.js} +3 -3
- package/chunks/{chunk-QLJUC7TG.js → chunk-ZD6UTE4A.js} +1 -1
- package/chunks/{chunk-LX3COOXF.js → chunk-ZFDTEDCF.js} +6 -6
- package/chunks/chunk-ZJHVAS7M.js +289 -0
- package/chunks/{chunk-4OWXOUYF.js → chunk-ZNAUOR2I.js} +15 -12
- package/chunks/{chunk-T2L47JJK.js → chunk-ZOIFNCKL.js} +4 -4
- package/chunks/{computer-use-2VIV73WK.js → computer-use-SOQ4E3VX.js} +43 -35
- package/chunks/{config-utils-FYTBZLCJ.js → config-utils-7V7GGIW6.js} +3 -3
- package/chunks/contextCommand-JLHYA34Z.js +80 -0
- package/chunks/{create-sub-session-AZ77LBL3.js → create-sub-session-IWW2IZ2T.js} +3 -3
- package/chunks/{create-sub-session-XDHHC2P4.js → create-sub-session-QRJLW5BV.js} +43 -35
- package/chunks/{cron-create-KTWJM7QT.js → cron-create-YIID5XAW.js} +6 -6
- package/chunks/{cron-delete-2P3I5ULL.js → cron-delete-ZVHYCEP2.js} +5 -5
- package/chunks/{cron-list-PXDPGEDQ.js → cron-list-XEGS463Q.js} +5 -5
- package/chunks/{daemon-RAPSDJH7.js → daemon-YO6433NF.js} +350 -53
- package/chunks/daemon-status-provider-2233Q37D.js +89 -0
- package/chunks/{de-4IBXM7CN.js → de-HGRCYDEJ.js} +1 -0
- package/chunks/{dist-UIFWIFRO.js → dist-46NQKLTW.js} +2 -2
- package/chunks/{dist-XRYV6TJP.js → dist-AIKFMUKK.js} +50 -4
- package/chunks/{dist-XBJVSWS2.js → dist-BBLXMS3N.js} +14 -2
- package/chunks/{dist-OMW6WDEO.js → dist-F6IBUDR4.js} +40 -9
- package/chunks/{dist-PJLG2XYX.js → dist-WEAHOXDM.js} +1 -1
- package/chunks/{dist-OAV7LJGJ.js → dist-YFNEUWSE.js} +26 -2
- package/chunks/earlyInputCapture-A7NDU3PF.js +82 -0
- package/chunks/{edit-CS6SFEXC.js → edit-OBDSQURM.js} +43 -35
- package/chunks/{en-USMCCJAJ.js → en-MTWBNGDO.js} +15 -0
- package/chunks/{enter-worktree-LMAL75DY.js → enter-worktree-U6MRPQ2P.js} +43 -35
- package/chunks/{enterPlanMode-WVJB4DSS.js → enterPlanMode-BC5QUZZ2.js} +43 -35
- package/chunks/{environment-6YHC4JAJ.js → environment-W5UFC2CH.js} +46 -38
- package/chunks/errors-M7CLORXH.js +88 -0
- package/chunks/{exit-worktree-KPFD742L.js → exit-worktree-DGNYMECB.js} +43 -35
- package/chunks/{exitPlanMode-UEJS6CDY.js → exitPlanMode-GXTBWQAR.js} +43 -35
- package/chunks/{fast-path-G2N4NRCA.js → fast-path-JJZFJANL.js} +6 -6
- package/chunks/{fast-path-settings-DAOVFADC.js → fast-path-settings-WQJU2LAT.js} +2 -2
- package/chunks/{fr-WVHEBDDB.js → fr-45RLL55O.js} +1 -0
- package/chunks/{gemini-2MDVIOVT.js → gemini-QS36EBZV.js} +132 -102
- package/chunks/{geminiContentGenerator-ZXTDBMFR.js → geminiContentGenerator-AG4KB6CV.js} +14 -8
- package/chunks/{getMachineId-bsd-QFVLPUPT.js → getMachineId-bsd-V7W3GODC.js} +1 -1
- package/chunks/{getMachineId-darwin-DGMQQE2E.js → getMachineId-darwin-TDO75DQP.js} +1 -1
- package/chunks/{getMachineId-linux-R4Z6CSWC.js → getMachineId-linux-TF43WQT2.js} +1 -1
- package/chunks/{getMachineId-unsupported-Z3SBVBUV.js → getMachineId-unsupported-ZGUO3TXT.js} +1 -1
- package/chunks/{getMachineId-win-SCK5UFDT.js → getMachineId-win-ECFYZZFQ.js} +1 -1
- package/chunks/{glob-562XFLIZ.js → glob-V7R3PSK3.js} +43 -35
- package/chunks/{grep-MGEFBDQK.js → grep-QYPSK7OP.js} +43 -35
- package/chunks/handleAutoUpdate-6DBEZYPV.js +81 -0
- package/chunks/{i18n-R6HJENXA.js → i18n-VUJJZIMU.js} +44 -36
- package/chunks/image-gen-Z3VPGKRC.js +240 -0
- package/chunks/initializer-UWAK5U5O.js +86 -0
- package/chunks/installationInfo-6O2YAA52.js +80 -0
- package/chunks/{ja-KY4ROZTE.js → ja-B7DF7DFG.js} +1 -0
- package/chunks/{keychain-token-storage-6ACJDYIB.js → keychain-token-storage-MDTG3WRM.js} +3 -3
- package/chunks/{kittyProtocolDetector-HCNNKJTI.js → kittyProtocolDetector-MBRTDRBK.js} +5 -3
- package/chunks/list-GB4ESM3T.js +89 -0
- package/chunks/list-agents-5KJJHR6I.js +80 -0
- package/chunks/loadedSettingsAdapter-OT6JVQ7U.js +83 -0
- package/chunks/loggingContentGenerator-HS3S5H3Q.js +1077 -0
- package/chunks/{loop-wakeup-RNMRVA66.js → loop-wakeup-FXKNNYSY.js} +7 -7
- package/chunks/{ls-J2ZI5XYK.js → ls-NTK6VOQJ.js} +5 -5
- package/chunks/{lsp-UMS3NUB5.js → lsp-2JI24STP.js} +3 -3
- package/chunks/{managed-npm-update-4KNYSOYC.js → managed-npm-update-JYEMMXA3.js} +94 -38
- package/chunks/mcp-6DBDJPFU.js +83 -0
- package/chunks/{monitor-DMHKE4SW.js → monitor-R3ODH5U6.js} +45 -36
- package/chunks/node-UUDY34IG.js +305 -0
- package/chunks/nonInteractiveCli-MOYCYBBU.js +141 -0
- package/chunks/{notebook-edit-35SJGEOR.js → notebook-edit-BNOK452R.js} +43 -35
- package/chunks/{openaiContentGenerator-5LPAFXPF.js → openaiContentGenerator-WMCU3O2H.js} +27 -17
- package/chunks/pidfile-TFRZZZIO.js +86 -0
- package/chunks/{processUtils-GM2I55KF.js → processUtils-RT7UNCC2.js} +2 -2
- package/chunks/{pt-OK455PLH.js → pt-22Q3FP73.js} +1 -0
- package/chunks/{qwenContentGenerator-HKOYNP7H.js → qwenContentGenerator-HHCRK4SX.js} +56 -42
- package/chunks/{qwenOAuth2-NUUYC3V5.js → qwenOAuth2-OWLB5AKH.js} +14 -27
- package/chunks/read-file-APMO3PSX.js +31 -0
- package/chunks/{read-mcp-resource-F6HYMDUY.js → read-mcp-resource-4DKQWGHD.js} +3 -3
- package/chunks/{record-artifact-7GCFLDD7.js → record-artifact-RQKFYO5B.js} +3 -3
- package/chunks/resumeHistoryUtils-6KRYEAWZ.js +91 -0
- package/chunks/ripGrep-BEJDEDXW.js +73 -0
- package/chunks/{ru-7SPDGMGD.js → ru-FZCNZHDC.js} +1 -0
- package/chunks/{run-qwen-serve-5VH3F4NW.js → run-qwen-serve-FU6HEM4J.js} +271 -57
- package/chunks/{runtime-OH77YH7W.js → runtime-XXRRTNP6.js} +55 -45
- package/chunks/{scheduler-WJQSLCSV.js → scheduler-G2ZS2Z7E.js} +43 -35
- package/chunks/{sdk-exporters-grpc-ETLH47EP.js → sdk-exporters-grpc-AK3LGHNO.js} +3 -3
- package/chunks/{sdk-exporters-http-T3POX73F.js → sdk-exporters-http-FYBSUCPD.js} +6 -6
- package/chunks/{sdk-impl-NSLPDH6I.js → sdk-impl-GMVPB7NB.js} +6 -6
- package/chunks/{send-message-PYIJ2PZL.js → send-message-Q6OOR6BR.js} +46 -9
- package/chunks/serve-7BSTXJ4T.js +89 -0
- package/chunks/{server-E4N4AI6Z.js → server-4UMH7OIZ.js} +2362 -411
- package/chunks/{session-5YUWIOQE.js → session-K3O3Q2SV.js} +105 -87
- package/chunks/{settings-YY7ZSFO7.js → settings-CR2EWTBA.js} +53 -45
- package/chunks/shell-HH3PF3A2.js +83 -0
- package/chunks/{skill-PAIDX3EU.js → skill-I3SDA4MB.js} +17 -16
- package/chunks/spawnChannel-RWNDBXGA.js +82 -0
- package/chunks/{src-IZXLJI5M.js → src-GE4TTTML.js} +302 -184
- package/chunks/{standalone-update-X675JVBL.js → standalone-update-Q6WFRZZQ.js} +45 -37
- package/chunks/{startInteractiveUI-ND2IVBU3.js → startInteractiveUI-SLZGHRPH.js} +747 -310
- package/chunks/{syntheticOutput-H7RTI5KL.js → syntheticOutput-I3757IWH.js} +4 -4
- package/chunks/{task-create-7474AJJD.js → task-create-N7WQSGYA.js} +10 -10
- package/chunks/{task-list-633HGOIB.js → task-list-FOPULZEP.js} +7 -7
- package/chunks/{task-stop-MNUGHPIA.js → task-stop-H6RHXFVQ.js} +4 -4
- package/chunks/{task-update-66GQB5LI.js → task-update-M57TFZJT.js} +10 -10
- package/chunks/{team-create-2DEYNMMN.js → team-create-YJALH5D2.js} +46 -38
- package/chunks/{team-delete-BB3CG3QF.js → team-delete-QE2UXJL7.js} +7 -7
- package/chunks/{team-plan-approval-65AVAOCT.js → team-plan-approval-34QFYKGN.js} +43 -35
- package/chunks/theme-manager-SWRILQHI.js +77 -0
- package/chunks/{todoWrite-KRAUN54W.js → todoWrite-VQ7FKOHL.js} +5 -5
- package/chunks/{tool-search-ZQP3SMTV.js → tool-search-NF7GB6LE.js} +16 -16
- package/chunks/total-session-admission-DLHHHLD3.js +84 -0
- package/chunks/{tree-sitter-FS4VPMZA.js → tree-sitter-4D7QS7F6.js} +1 -1
- package/chunks/{tree-sitter-bash-6B46JJCV.js → tree-sitter-bash-VEJGF5XF.js} +1 -1
- package/chunks/{trustedFolders-LURI52LP.js → trustedFolders-KHXHY6PY.js} +44 -36
- package/chunks/{update-relaunch-BPWFIDLM.js → update-relaunch-WBUZJC5O.js} +5 -5
- package/chunks/updateCheck-RKL6M5XN.js +92 -0
- package/chunks/useAutoAcceptIndicator-CFQ5BUJL.js +93 -0
- package/chunks/{validateNonInterActiveAuth-HWD6Y22I.js → validateNonInterActiveAuth-3R223G3R.js} +89 -80
- package/chunks/{version-OD4JAFG7.js → version-HS7YSFHV.js} +1 -1
- package/chunks/{web-fetch-RFBKNU24.js → web-fetch-NKCSG7ZE.js} +18 -16
- package/chunks/{web-search-AKTVS5YZ.js → web-search-S62WAP4S.js} +13 -27
- package/chunks/{workflow-VZVCOSZN.js → workflow-QAGU5RU4.js} +44 -36
- package/chunks/workspace-providers-status-QSVZUETE.js +86 -0
- package/chunks/{workspace-registration-store-Q5SFJSX4.js → workspace-registration-store-24JMHDGF.js} +2 -2
- package/chunks/workspace-registry-UT4RBNBM.js +88 -0
- package/chunks/workspace-service-JFWRUS4V.js +98 -0
- package/chunks/workspace-skills-status-ZBBKJOI2.js +85 -0
- package/chunks/write-file-VHIXW5M7.js +73 -0
- package/chunks/{zh-WY5DWYZD.js → zh-LUIGBD55.js} +15 -0
- package/chunks/{zh-TW-BM47YBFH.js → zh-TW-F5KG2IYD.js} +15 -0
- package/cli-entry.js +10 -1
- package/cli.js +13 -13
- package/locales/ca.js +2 -0
- package/locales/de.js +1 -0
- package/locales/en.js +25 -0
- package/locales/fr.js +1 -0
- package/locales/ja.js +1 -0
- package/locales/pt.js +1 -0
- package/locales/ru.js +1 -0
- package/locales/zh-TW.js +23 -0
- package/locales/zh.js +23 -0
- package/package.json +3 -3
- package/web-shell/assets/{arc-BWFm0SI0.js → arc-DcbWnB9T.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-CZ_yL-DQ.js → architectureDiagram-3BPJPVTR-kMMF5sud.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-B9F9mJvG.js → blockDiagram-GPEHLZMM-Htl9vTJS.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-BUdwJW5f.js → c4Diagram-AAUBKEIU-BnZnm0mQ.js} +1 -1
- package/web-shell/assets/channel-Cq7YKtfC.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-w4cF-qlF.js → chunk-2J33WTMH-DziB7kDG.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-BXwURxHJ.js → chunk-4BX2VUAB-CmkD8daw.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-Gem3LalC.js → chunk-55IACEB6-CHAd9A_U.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-A3ddVojI.js → chunk-727SXJPM-Dqaam3fE.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-CjHZ5L_R.js → chunk-AQP2D5EJ-D_-saBYM.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-CKgdgcpv.js → chunk-FMBD7UC4-B9r_veWD.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-Cn2Dykjb.js → chunk-ND2GUHAM-B3EaCSpL.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN--0SyraC5.js → chunk-QZHKN3VN-CYq8x9mn.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-CQ9aC1Tg.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CQ9aC1Tg.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-CphhAity.js → cose-bilkent-S5V4N54A-D0ng4uiB.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-DU--jiKp.js → dagre-BM42HDAG-DCZollQv.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-BzvuZw1Y.js → diagram-2AECGRRQ-Dfk2pWS0.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-D84-49Y0.js → diagram-5GNKFQAL-kX38ltWR.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-DQTq-3_3.js → diagram-KO2AKTUF-CJz2vsXh.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-8FTrshzN.js → diagram-LMA3HP47-BvMLZm_7.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-BCjpDBCm.js → diagram-OG6HWLK6-l7kfStkO.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-BtRObkmg.js → erDiagram-TEJ5UH35-BSVa8GGT.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-DTrW6oxy.js → flowDiagram-I6XJVG4X-CoawKIXH.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-BgPNSW6j.js → ganttDiagram-6RSMTGT7-DFUDH0zF.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-BTclNgGV.js → gitGraphDiagram-PVQCEYII-Y2pvpT4e.js} +1 -1
- package/web-shell/assets/{index-CxA7AqY6.js → index-D0GX0zZf.js} +1 -1
- package/web-shell/assets/index-D9haPt0X.css +5 -0
- package/web-shell/assets/index-ckX9Pq5k.js +1230 -0
- package/web-shell/assets/{infoDiagram-5YYISTIA-DCE4AJt2.js → infoDiagram-5YYISTIA-CU8_zLiX.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-C8iE6q4Y.js → ishikawaDiagram-YF4QCWOH-AVQiV0DU.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-C_dxdyEc.js → journeyDiagram-JHISSGLW-DQ0VSKa3.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-Dw3n1u3w.js → kanban-definition-UN3LZRKU-BqnWqsE_.js} +1 -1
- package/web-shell/assets/{linear-C2BF2zJ9.js → linear-BkoihsaA.js} +1 -1
- package/web-shell/assets/{mermaid.core-CGTQU3MA.js → mermaid.core-5RJs-31j.js} +5 -5
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-BVFZm9ZC.js → mindmap-definition-RKZ34NQL-D33Bxnpd.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-Cc-TNN3n.js → pieDiagram-4H26LBE5-BuEAw3BH.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-CgW3Rzsi.js → quadrantDiagram-W4KKPZXB-Kox_usEq.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-BAaj0Y3B.js → requirementDiagram-4Y6WPE33-CNjeUif0.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-XJWmekxS.js → sankeyDiagram-5OEKKPKP-BCd2OL_U.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-CtRc_0wf.js → sequenceDiagram-3UESZ5HK-CF2ZTsz0.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-WCnvMGy5.js → stateDiagram-AJRCARHV-qenSzHtm.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-B7W4zlCr.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-C9cRx49L.js → timeline-definition-PNZ67QCA-B5DyWdgs.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-BvXOCEt-.js → vennDiagram-CIIHVFJN-DqP4I_o_.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-ByafGtzu.js → wardley-L42UT6IY-CJe2e4mg.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-CozAnw8x.js → wardleyDiagram-YWT4CUSO-BMDSw-Rr.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-Camu9Qvq.js → xychartDiagram-2RQKCTM6-BTVZYkxD.js} +1 -1
- package/web-shell/index.html +17 -13
- package/chunks/MaxSizedBox-3XQIBACV.js +0 -78
- package/chunks/agent-QXD5NSKA.js +0 -73
- package/chunks/agent-headless-4VXR2TBK.js +0 -67
- package/chunks/bridge-GIBRSPE6.js +0 -81
- package/chunks/chunk-CBOQ3HY7.js +0 -2019
- package/chunks/chunk-MA6GYKK7.js +0 -6928
- package/chunks/contextCommand-XQU7KLIH.js +0 -72
- package/chunks/daemon-status-provider-KQVNB4VA.js +0 -80
- package/chunks/earlyInputCapture-WP5SA3KH.js +0 -74
- package/chunks/errors-JEYPXX4S.js +0 -80
- package/chunks/handleAutoUpdate-2VJPAW43.js +0 -73
- package/chunks/initializer-UOX67ZFQ.js +0 -78
- package/chunks/installationInfo-NQNY34X3.js +0 -72
- package/chunks/list-2Z7KS7ZF.js +0 -81
- package/chunks/loadedSettingsAdapter-LIYY3LE4.js +0 -75
- package/chunks/mcp-AJ4QW3JA.js +0 -75
- package/chunks/nonInteractiveCli-PUSO5QF6.js +0 -134
- package/chunks/pidfile-EH2JW2PB.js +0 -78
- package/chunks/read-file-JZ5VXILQ.js +0 -31
- package/chunks/resumeHistoryUtils-Z3HG4WKM.js +0 -84
- package/chunks/ripGrep-JNLJCT2B.js +0 -65
- package/chunks/serve-NN5FXWR6.js +0 -81
- package/chunks/shell-FXT3NVC6.js +0 -75
- package/chunks/spawnChannel-XAWLXNOD.js +0 -74
- package/chunks/theme-manager-2WZHPK2M.js +0 -69
- package/chunks/total-session-admission-HULB2TEQ.js +0 -75
- package/chunks/updateCheck-D4ESCHBJ.js +0 -88
- package/chunks/useAutoAcceptIndicator-CBNLOF2P.js +0 -86
- package/chunks/workspace-providers-status-TJTVHORI.js +0 -78
- package/chunks/workspace-registry-H6VM5WXK.js +0 -79
- package/chunks/workspace-service-ZNKD3I2J.js +0 -90
- package/chunks/workspace-skills-status-OOBIXADG.js +0 -77
- package/chunks/write-file-CAKK5IAO.js +0 -65
- package/web-shell/assets/channel-DiLlxxIf.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-CkylTdM4.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CkylTdM4.js +0 -1
- package/web-shell/assets/index-CGtQqOIa.css +0 -5
- package/web-shell/assets/index-TtM0hVjU.js +0 -1207
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-D1gzH2Ue.js +0 -1
|
@@ -1,40 +1,36 @@
|
|
|
1
1
|
// Force strict mode and setup for ESM
|
|
2
2
|
"use strict";
|
|
3
|
+
import {
|
|
4
|
+
serveCommand
|
|
5
|
+
} from "./chunk-GSN55ZRI.js";
|
|
3
6
|
import {
|
|
4
7
|
listCommand
|
|
5
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-7MVVZO4N.js";
|
|
9
|
+
import {
|
|
10
|
+
getErrorMessage as getErrorMessage2
|
|
11
|
+
} from "./chunk-IKYJHJNF.js";
|
|
6
12
|
import {
|
|
7
13
|
ObservedChannelContactStore
|
|
8
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-RHLZR4E5.js";
|
|
9
15
|
import {
|
|
10
16
|
escapeAnsiCtrlCodes
|
|
11
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-IPUUTYMV.js";
|
|
12
18
|
import {
|
|
13
19
|
stringWidth
|
|
14
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-2MIN6GRR.js";
|
|
15
21
|
import {
|
|
16
22
|
loadUndici
|
|
17
23
|
} from "./chunk-3Z43GZUQ.js";
|
|
24
|
+
import {
|
|
25
|
+
resolvePath
|
|
26
|
+
} from "./chunk-ZD6UTE4A.js";
|
|
18
27
|
import {
|
|
19
28
|
isLoopbackBind
|
|
20
29
|
} from "./chunk-RXFQM6FQ.js";
|
|
21
|
-
import {
|
|
22
|
-
serveCommand
|
|
23
|
-
} from "./chunk-KPBVP6SL.js";
|
|
24
|
-
import {
|
|
25
|
-
getErrorMessage as getErrorMessage2
|
|
26
|
-
} from "./chunk-LPEONXNV.js";
|
|
27
|
-
import {
|
|
28
|
-
collectProviderModelsForProtocol,
|
|
29
|
-
getAuthTypeFromEnv,
|
|
30
|
-
resolveCliGenerationConfig
|
|
31
|
-
} from "./chunk-JZSM2IZ3.js";
|
|
32
|
-
import {
|
|
33
|
-
resolvePath
|
|
34
|
-
} from "./chunk-QLJUC7TG.js";
|
|
35
30
|
import {
|
|
36
31
|
channelLoopPath,
|
|
37
32
|
createChannel,
|
|
33
|
+
daemonChannelLoopPath,
|
|
38
34
|
daemonObservedContactsPath,
|
|
39
35
|
daemonSessionRoutesPath,
|
|
40
36
|
loadChannelsConfig,
|
|
@@ -46,26 +42,45 @@ import {
|
|
|
46
42
|
registerToolCallDispatch,
|
|
47
43
|
selectFirstModel,
|
|
48
44
|
sessionsPath
|
|
49
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-PSOO6YXD.js";
|
|
50
46
|
import {
|
|
51
47
|
getExtensionManager,
|
|
52
48
|
requestChoicePluginNonInteractive,
|
|
53
49
|
requestConsentNonInteractive,
|
|
54
50
|
requestConsentOrFail,
|
|
55
51
|
resolveExtensionCommandScope
|
|
56
|
-
} from "./chunk-
|
|
52
|
+
} from "./chunk-PC6JANNU.js";
|
|
53
|
+
import {
|
|
54
|
+
collectProviderModelsForProtocol,
|
|
55
|
+
getAuthTypeFromEnv,
|
|
56
|
+
resolveCliGenerationConfig
|
|
57
|
+
} from "./chunk-KMQ33DO4.js";
|
|
58
|
+
import {
|
|
59
|
+
DEFAULT_BASE_URL,
|
|
60
|
+
buildHeaders,
|
|
61
|
+
clearAccount,
|
|
62
|
+
loadAccount,
|
|
63
|
+
saveAccount
|
|
64
|
+
} from "./chunk-X5XDDSSH.js";
|
|
57
65
|
import {
|
|
58
66
|
parseChannelConfig
|
|
59
|
-
} from "./chunk-
|
|
67
|
+
} from "./chunk-4WIZGAH3.js";
|
|
60
68
|
import {
|
|
61
69
|
findCliEntryPath
|
|
62
70
|
} from "./chunk-V6WHFGST.js";
|
|
71
|
+
import {
|
|
72
|
+
assembleMcpServers,
|
|
73
|
+
getPendingGatedMcpServers,
|
|
74
|
+
mcpCommand
|
|
75
|
+
} from "./chunk-JVPM2ULZ.js";
|
|
63
76
|
import {
|
|
64
77
|
canonicalizeWorkspace
|
|
65
78
|
} from "./chunk-2RFKHEXL.js";
|
|
66
79
|
import {
|
|
67
80
|
CHANNEL_DAEMON_WORKER_SENTINEL,
|
|
68
81
|
CHANNEL_WORKER_HEARTBEAT_INTERVAL_MS,
|
|
82
|
+
ChannelDeliveryError,
|
|
83
|
+
MAX_CHANNEL_DELIVERIES_IN_FLIGHT,
|
|
69
84
|
MAX_CHANNEL_STARTUP_FAILURES,
|
|
70
85
|
MAX_CHANNEL_STARTUP_FAILURE_CHANNEL_LENGTH,
|
|
71
86
|
MAX_CHANNEL_STARTUP_FAILURE_CODE_LENGTH,
|
|
@@ -74,31 +89,19 @@ import {
|
|
|
74
89
|
QWEN_DAEMON_URL_ENV,
|
|
75
90
|
QWEN_DAEMON_WORKSPACE_ENV,
|
|
76
91
|
QWEN_SERVER_TOKEN_ENV,
|
|
92
|
+
isChannelDeliveryError,
|
|
93
|
+
isChannelDeliveryMessage,
|
|
77
94
|
isChannelStartupReportAckMessage,
|
|
78
95
|
isChannelWebhookTaskMessage,
|
|
79
96
|
normalizeWorkerDiagnostic,
|
|
80
97
|
sanitizeWorkerDiagnostic
|
|
81
|
-
} from "./chunk-
|
|
98
|
+
} from "./chunk-LK7CHLVP.js";
|
|
82
99
|
import {
|
|
83
100
|
normalizeServeChannelSelection
|
|
84
|
-
} from "./chunk-
|
|
101
|
+
} from "./chunk-JLU636DO.js";
|
|
85
102
|
import {
|
|
86
103
|
redactLogCredentials
|
|
87
104
|
} from "./chunk-M5GB774H.js";
|
|
88
|
-
import {
|
|
89
|
-
readServiceInfo,
|
|
90
|
-
removeServiceInfo,
|
|
91
|
-
signalService,
|
|
92
|
-
waitForExit,
|
|
93
|
-
writeServiceInfo
|
|
94
|
-
} from "./chunk-RV4C2ZFG.js";
|
|
95
|
-
import {
|
|
96
|
-
DEFAULT_BASE_URL,
|
|
97
|
-
buildHeaders,
|
|
98
|
-
clearAccount,
|
|
99
|
-
loadAccount,
|
|
100
|
-
saveAccount
|
|
101
|
-
} from "./chunk-2LI23QA6.js";
|
|
102
105
|
import {
|
|
103
106
|
AcpBridge,
|
|
104
107
|
ChannelLoopScheduler,
|
|
@@ -106,40 +109,39 @@ import {
|
|
|
106
109
|
DaemonChannelBridge,
|
|
107
110
|
PairingStore,
|
|
108
111
|
SessionRouter,
|
|
112
|
+
isChannelProactiveDeliveryError,
|
|
109
113
|
sanitizeLogText,
|
|
110
114
|
sanitizePromptText
|
|
111
|
-
} from "./chunk-
|
|
115
|
+
} from "./chunk-RWTEFFPU.js";
|
|
112
116
|
import {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
+
readServiceInfo,
|
|
118
|
+
removeServiceInfo,
|
|
119
|
+
signalService,
|
|
120
|
+
waitForExit,
|
|
121
|
+
writeServiceInfo
|
|
122
|
+
} from "./chunk-BIQWWWJN.js";
|
|
117
123
|
import {
|
|
118
124
|
loadSettings
|
|
119
|
-
} from "./chunk-
|
|
125
|
+
} from "./chunk-TEHGS6UP.js";
|
|
120
126
|
import {
|
|
121
127
|
detectSystemLanguage,
|
|
122
128
|
getCurrentLanguage,
|
|
123
129
|
initializeI18n,
|
|
124
130
|
resolveLanguageSetting,
|
|
125
131
|
t
|
|
126
|
-
} from "./chunk-
|
|
132
|
+
} from "./chunk-LKEJ26GS.js";
|
|
127
133
|
import {
|
|
128
134
|
loadEnvironment
|
|
129
|
-
} from "./chunk-
|
|
130
|
-
import {
|
|
131
|
-
hideBin,
|
|
132
|
-
yargs_default
|
|
133
|
-
} from "./chunk-XFSFZCM5.js";
|
|
135
|
+
} from "./chunk-LH2BYDQ5.js";
|
|
134
136
|
import {
|
|
135
137
|
getCliVersion
|
|
136
|
-
} from "./chunk-
|
|
138
|
+
} from "./chunk-YX324OPW.js";
|
|
137
139
|
import {
|
|
138
140
|
getPackageJson
|
|
139
141
|
} from "./chunk-VJNBRRZG.js";
|
|
140
142
|
import {
|
|
141
143
|
isWorkspaceTrusted
|
|
142
|
-
} from "./chunk-
|
|
144
|
+
} from "./chunk-Z2BC6UJ5.js";
|
|
143
145
|
import {
|
|
144
146
|
require_strip_json_comments
|
|
145
147
|
} from "./chunk-ALGGS7UH.js";
|
|
@@ -147,6 +149,10 @@ import {
|
|
|
147
149
|
writeStderrLine,
|
|
148
150
|
writeStdoutLine
|
|
149
151
|
} from "./chunk-OWAK7LMW.js";
|
|
152
|
+
import {
|
|
153
|
+
hideBin,
|
|
154
|
+
yargs_default
|
|
155
|
+
} from "./chunk-XFSFZCM5.js";
|
|
150
156
|
import {
|
|
151
157
|
Config,
|
|
152
158
|
DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
|
|
@@ -180,28 +186,32 @@ import {
|
|
|
180
186
|
unquoteCStylePath,
|
|
181
187
|
updateChannelMemoryEntry,
|
|
182
188
|
updateSetting
|
|
183
|
-
} from "./chunk-
|
|
189
|
+
} from "./chunk-PHOF65IG.js";
|
|
184
190
|
import {
|
|
185
191
|
nextFireTime,
|
|
186
192
|
parseCron
|
|
187
|
-
} from "./chunk-
|
|
193
|
+
} from "./chunk-IRH27ZC2.js";
|
|
194
|
+
import {
|
|
195
|
+
parseBooleanEnvFlag,
|
|
196
|
+
resolveTelemetrySettings
|
|
197
|
+
} from "./chunk-NIBLUX3Y.js";
|
|
188
198
|
import {
|
|
189
|
-
DEFAULT_QWEN_EMBEDDING_MODEL,
|
|
190
|
-
MODEL_GENERATION_CONFIG_FIELDS,
|
|
191
199
|
getAllGeminiMdFilenames,
|
|
192
|
-
resolveTelemetrySettings,
|
|
193
200
|
setGeminiMdFilename
|
|
194
|
-
} from "./chunk-
|
|
201
|
+
} from "./chunk-CIKQ7KKO.js";
|
|
202
|
+
import {
|
|
203
|
+
DEFAULT_QWEN_EMBEDDING_MODEL
|
|
204
|
+
} from "./chunk-IKCX4CCL.js";
|
|
195
205
|
import {
|
|
196
206
|
isTlsVerificationDisabled
|
|
197
|
-
} from "./chunk-
|
|
207
|
+
} from "./chunk-2JZBVYTU.js";
|
|
198
208
|
import {
|
|
199
209
|
recordChannelMemoryRecallMetrics
|
|
200
|
-
} from "./chunk-
|
|
210
|
+
} from "./chunk-MB4MZHMJ.js";
|
|
201
211
|
import {
|
|
202
212
|
SchemaValidator,
|
|
203
213
|
ToolNames
|
|
204
|
-
} from "./chunk-
|
|
214
|
+
} from "./chunk-PR75REBZ.js";
|
|
205
215
|
import {
|
|
206
216
|
FatalConfigError,
|
|
207
217
|
FatalSandboxError,
|
|
@@ -209,7 +219,7 @@ import {
|
|
|
209
219
|
createDebugLogger,
|
|
210
220
|
getErrorMessage,
|
|
211
221
|
isNodeError
|
|
212
|
-
} from "./chunk-
|
|
222
|
+
} from "./chunk-NL7LTRLR.js";
|
|
213
223
|
import {
|
|
214
224
|
init_esbuild_shims
|
|
215
225
|
} from "./chunk-5O2XNYP6.js";
|
|
@@ -2132,6 +2142,28 @@ var BridgeChannelMemoryIntentClassifier = class {
|
|
|
2132
2142
|
}
|
|
2133
2143
|
};
|
|
2134
2144
|
|
|
2145
|
+
// packages/cli/src/commands/channel/loop-runtime.ts
|
|
2146
|
+
init_esbuild_shims();
|
|
2147
|
+
function createChannelLoopController(store) {
|
|
2148
|
+
return {
|
|
2149
|
+
create: /* @__PURE__ */ __name((input) => store.create(input), "create"),
|
|
2150
|
+
createForTarget: /* @__PURE__ */ __name((input, maxEnabledLoops) => store.createForTarget(input, maxEnabledLoops), "createForTarget"),
|
|
2151
|
+
listForTarget: /* @__PURE__ */ __name((channelName, target) => store.listForTarget(channelName, target), "listForTarget"),
|
|
2152
|
+
disable: /* @__PURE__ */ __name((id) => store.disable(id), "disable"),
|
|
2153
|
+
validateCron: /* @__PURE__ */ __name((cron) => {
|
|
2154
|
+
parseCron(cron);
|
|
2155
|
+
nextFireTime(cron, /* @__PURE__ */ new Date());
|
|
2156
|
+
}, "validateCron"),
|
|
2157
|
+
nextFireTime: /* @__PURE__ */ __name((job) => nextFireTime(job.cron, new Date(job.lastFiredAt ?? job.createdAt)), "nextFireTime")
|
|
2158
|
+
};
|
|
2159
|
+
}
|
|
2160
|
+
__name(createChannelLoopController, "createChannelLoopController");
|
|
2161
|
+
function isChannelCronEnabled(settings) {
|
|
2162
|
+
if (process.env["QWEN_CODE_DISABLE_CRON"] === "1") return false;
|
|
2163
|
+
return settings.merged.experimental?.cron !== false;
|
|
2164
|
+
}
|
|
2165
|
+
__name(isChannelCronEnabled, "isChannelCronEnabled");
|
|
2166
|
+
|
|
2135
2167
|
// packages/cli/src/commands/channel/start.ts
|
|
2136
2168
|
var MAX_CRASH_RESTARTS = 3;
|
|
2137
2169
|
var CRASH_WINDOW_MS = 5 * 60 * 1e3;
|
|
@@ -2159,25 +2191,6 @@ function channelMemoryOptions(getBridge, cwd) {
|
|
|
2159
2191
|
};
|
|
2160
2192
|
}
|
|
2161
2193
|
__name(channelMemoryOptions, "channelMemoryOptions");
|
|
2162
|
-
function createLoopController(store) {
|
|
2163
|
-
return {
|
|
2164
|
-
create: /* @__PURE__ */ __name((input) => store.create(input), "create"),
|
|
2165
|
-
createForTarget: /* @__PURE__ */ __name((input, maxEnabledLoops) => store.createForTarget(input, maxEnabledLoops), "createForTarget"),
|
|
2166
|
-
listForTarget: /* @__PURE__ */ __name((channelName, target) => store.listForTarget(channelName, target), "listForTarget"),
|
|
2167
|
-
disable: /* @__PURE__ */ __name((id) => store.disable(id), "disable"),
|
|
2168
|
-
validateCron: /* @__PURE__ */ __name((cron) => {
|
|
2169
|
-
parseCron(cron);
|
|
2170
|
-
nextFireTime(cron, /* @__PURE__ */ new Date());
|
|
2171
|
-
}, "validateCron"),
|
|
2172
|
-
nextFireTime: /* @__PURE__ */ __name((job) => nextFireTime(job.cron, new Date(job.lastFiredAt ?? job.createdAt)), "nextFireTime")
|
|
2173
|
-
};
|
|
2174
|
-
}
|
|
2175
|
-
__name(createLoopController, "createLoopController");
|
|
2176
|
-
function isChannelCronEnabled(settings) {
|
|
2177
|
-
if (process.env["QWEN_CODE_DISABLE_CRON"] === "1") return false;
|
|
2178
|
-
return settings.merged.experimental?.cron !== false;
|
|
2179
|
-
}
|
|
2180
|
-
__name(isChannelCronEnabled, "isChannelCronEnabled");
|
|
2181
2194
|
function writeServiceInfoOrExit(channels, cleanup) {
|
|
2182
2195
|
try {
|
|
2183
2196
|
writeServiceInfo(channels);
|
|
@@ -2265,7 +2278,7 @@ async function startSingle(name, proxy, cronEnabled) {
|
|
|
2265
2278
|
sessionsPath()
|
|
2266
2279
|
);
|
|
2267
2280
|
const loopStore = cronEnabled ? new ChannelLoopStore({ filePath: channelLoopPath() }) : void 0;
|
|
2268
|
-
const loopController = loopStore ?
|
|
2281
|
+
const loopController = loopStore ? createChannelLoopController(loopStore) : void 0;
|
|
2269
2282
|
const channels = /* @__PURE__ */ new Map();
|
|
2270
2283
|
const channel = await createChannel(name, config, bridge, {
|
|
2271
2284
|
router,
|
|
@@ -2399,7 +2412,7 @@ async function startAll(proxy, cronEnabled) {
|
|
|
2399
2412
|
await bridge.start();
|
|
2400
2413
|
const router = new SessionRouter(bridge, defaultCwd, "user", sessionsPath());
|
|
2401
2414
|
const loopStore = cronEnabled ? new ChannelLoopStore({ filePath: channelLoopPath() }) : void 0;
|
|
2402
|
-
const loopController = loopStore ?
|
|
2415
|
+
const loopController = loopStore ? createChannelLoopController(loopStore) : void 0;
|
|
2403
2416
|
for (const { name, config } of parsed) {
|
|
2404
2417
|
router.setChannelScope(name, config.sessionScope);
|
|
2405
2418
|
}
|
|
@@ -2594,7 +2607,7 @@ var stopCommand = {
|
|
|
2594
2607
|
if (argv["daemon-url"]) {
|
|
2595
2608
|
const token = argv.token ?? process.env[QWEN_SERVER_TOKEN_ENV] ?? process.env[QWEN_DAEMON_TOKEN_ENV];
|
|
2596
2609
|
try {
|
|
2597
|
-
const sdk = await import("./daemon-
|
|
2610
|
+
const sdk = await import("./daemon-YO6433NF.js");
|
|
2598
2611
|
const client = new sdk.DaemonClient({
|
|
2599
2612
|
baseUrl: argv["daemon-url"],
|
|
2600
2613
|
...token ? { token } : {}
|
|
@@ -2780,7 +2793,7 @@ var statusCommand = {
|
|
|
2780
2793
|
if (argv["daemon-url"]) {
|
|
2781
2794
|
const token = argv.token ?? process.env[QWEN_SERVER_TOKEN_ENV] ?? process.env[QWEN_DAEMON_TOKEN_ENV];
|
|
2782
2795
|
try {
|
|
2783
|
-
const sdk = await import("./daemon-
|
|
2796
|
+
const sdk = await import("./daemon-YO6433NF.js");
|
|
2784
2797
|
const client = new sdk.DaemonClient({
|
|
2785
2798
|
baseUrl: argv["daemon-url"],
|
|
2786
2799
|
...token ? { token } : {}
|
|
@@ -2891,7 +2904,7 @@ var reloadCommand = {
|
|
|
2891
2904
|
const token = resolveToken(argv.token);
|
|
2892
2905
|
let sdk;
|
|
2893
2906
|
try {
|
|
2894
|
-
sdk = await import("./daemon-
|
|
2907
|
+
sdk = await import("./daemon-YO6433NF.js");
|
|
2895
2908
|
} catch (err) {
|
|
2896
2909
|
writeStderrLine(
|
|
2897
2910
|
`[Channel] Failed to load daemon SDK: ${safeChannelCommandErrorMessage(err)}`
|
|
@@ -2971,7 +2984,7 @@ var setCommand2 = {
|
|
|
2971
2984
|
const selection = names[0] === "all" ? { mode: "all" } : { mode: "names", names };
|
|
2972
2985
|
let sdk;
|
|
2973
2986
|
try {
|
|
2974
|
-
sdk = await import("./daemon-
|
|
2987
|
+
sdk = await import("./daemon-YO6433NF.js");
|
|
2975
2988
|
} catch (error) {
|
|
2976
2989
|
writeStderrLine(
|
|
2977
2990
|
`[Channel] Failed to load daemon SDK: ${safeChannelCommandErrorMessage(error)}`
|
|
@@ -3022,7 +3035,7 @@ var setCommand2 = {
|
|
|
3022
3035
|
init_esbuild_shims();
|
|
3023
3036
|
var SESSION_SHELL_COMMAND_FEATURE = "session_shell_command";
|
|
3024
3037
|
var MAX_ACTIVE_WEBHOOK_TASKS = 16;
|
|
3025
|
-
var
|
|
3038
|
+
var WORKER_SHUTDOWN_DRAIN_MS = 1e4;
|
|
3026
3039
|
function createDaemonSessionFactory({
|
|
3027
3040
|
client,
|
|
3028
3041
|
DaemonSessionClient,
|
|
@@ -3094,7 +3107,7 @@ function createDaemonChannelBridgeFacade(bridge, opts) {
|
|
|
3094
3107
|
}
|
|
3095
3108
|
__name(createDaemonChannelBridgeFacade, "createDaemonChannelBridgeFacade");
|
|
3096
3109
|
async function loadDaemonSdk() {
|
|
3097
|
-
return await import("./daemon-
|
|
3110
|
+
return await import("./daemon-YO6433NF.js");
|
|
3098
3111
|
}
|
|
3099
3112
|
__name(loadDaemonSdk, "loadDaemonSdk");
|
|
3100
3113
|
function selectedChannelNames(channelsConfig, selection) {
|
|
@@ -3256,6 +3269,10 @@ async function runChannelDaemonWorker(opts) {
|
|
|
3256
3269
|
const observedContacts = new ObservedChannelContactStore(
|
|
3257
3270
|
daemonObservedContactsPath(daemonWorkspace)
|
|
3258
3271
|
);
|
|
3272
|
+
const loopStore = isChannelCronEnabled(settings) ? new ChannelLoopStore({
|
|
3273
|
+
filePath: daemonChannelLoopPath(daemonWorkspace)
|
|
3274
|
+
}) : void 0;
|
|
3275
|
+
const loopController = loopStore ? createChannelLoopController(loopStore) : void 0;
|
|
3259
3276
|
const bridge = new DaemonChannelBridge({
|
|
3260
3277
|
cwd: daemonWorkspace,
|
|
3261
3278
|
sessionFactory: createDaemonSessionFactory({
|
|
@@ -3267,6 +3284,7 @@ async function runChannelDaemonWorker(opts) {
|
|
|
3267
3284
|
});
|
|
3268
3285
|
const channels = /* @__PURE__ */ new Map();
|
|
3269
3286
|
const connected = [];
|
|
3287
|
+
let scheduler;
|
|
3270
3288
|
let connectFailureCount = 0;
|
|
3271
3289
|
const diagnosticRedaction = {
|
|
3272
3290
|
...opts.daemonToken ? { daemonToken: opts.daemonToken } : {},
|
|
@@ -3332,7 +3350,8 @@ async function runChannelDaemonWorker(opts) {
|
|
|
3332
3350
|
observe: /* @__PURE__ */ __name((channelName, observation) => {
|
|
3333
3351
|
observedContacts.observe(channelName, observation);
|
|
3334
3352
|
}, "observe")
|
|
3335
|
-
}
|
|
3353
|
+
},
|
|
3354
|
+
...loopController ? { loopController } : {}
|
|
3336
3355
|
}),
|
|
3337
3356
|
startupSignal
|
|
3338
3357
|
)
|
|
@@ -3405,6 +3424,38 @@ async function runChannelDaemonWorker(opts) {
|
|
|
3405
3424
|
if (connected.length === 0) {
|
|
3406
3425
|
throw new Error("No channels connected.");
|
|
3407
3426
|
}
|
|
3427
|
+
if (loopStore) {
|
|
3428
|
+
const schedulerChannels = /* @__PURE__ */ new Map();
|
|
3429
|
+
for (const name of connected) {
|
|
3430
|
+
const channel = channels.get(name);
|
|
3431
|
+
schedulerChannels.set(name, {
|
|
3432
|
+
runLoopPrompt: /* @__PURE__ */ __name(async (job, options) => {
|
|
3433
|
+
let jobWorkspace;
|
|
3434
|
+
try {
|
|
3435
|
+
jobWorkspace = canonicalizeWorkspace(job.cwd);
|
|
3436
|
+
} catch {
|
|
3437
|
+
jobWorkspace = void 0;
|
|
3438
|
+
}
|
|
3439
|
+
if (jobWorkspace !== daemonWorkspace) {
|
|
3440
|
+
await loopStore.disable(job.id).catch(() => false);
|
|
3441
|
+
writeStderrLine(
|
|
3442
|
+
`[Channel] Disabled loop "${sanitizeLogText(job.id, 128)}": its workspace does not match this daemon worker.`
|
|
3443
|
+
);
|
|
3444
|
+
throw new Error(
|
|
3445
|
+
`Loop ${sanitizeLogText(job.id, 128)} is outside daemon workspace and was disabled.`
|
|
3446
|
+
);
|
|
3447
|
+
}
|
|
3448
|
+
return channel.runLoopPrompt(job, options);
|
|
3449
|
+
}, "runLoopPrompt")
|
|
3450
|
+
});
|
|
3451
|
+
}
|
|
3452
|
+
scheduler = new ChannelLoopScheduler({
|
|
3453
|
+
store: loopStore,
|
|
3454
|
+
channels: schedulerChannels,
|
|
3455
|
+
nextFireTime
|
|
3456
|
+
});
|
|
3457
|
+
scheduler.start();
|
|
3458
|
+
}
|
|
3408
3459
|
opts.sendReady?.({
|
|
3409
3460
|
channels: connected,
|
|
3410
3461
|
requestedChannels: parsed.map((p) => p.name),
|
|
@@ -3412,6 +3463,19 @@ async function runChannelDaemonWorker(opts) {
|
|
|
3412
3463
|
});
|
|
3413
3464
|
return {
|
|
3414
3465
|
channels: connected,
|
|
3466
|
+
async deliverChannelMessage(request) {
|
|
3467
|
+
const channel = channels.get(request.channelName);
|
|
3468
|
+
if (!channel || !connected.includes(request.channelName)) {
|
|
3469
|
+
throw new ChannelDeliveryError(
|
|
3470
|
+
"channel_worker_unavailable",
|
|
3471
|
+
`Channel "${request.channelName}" is not running.`
|
|
3472
|
+
);
|
|
3473
|
+
}
|
|
3474
|
+
await channel.deliverProactive(
|
|
3475
|
+
{ channelName: request.channelName, ...request.target },
|
|
3476
|
+
request.text
|
|
3477
|
+
);
|
|
3478
|
+
},
|
|
3415
3479
|
validateWebhookTask(task) {
|
|
3416
3480
|
const channel = channels.get(task.channelName);
|
|
3417
3481
|
if (!channel || !connected.includes(task.channelName)) {
|
|
@@ -3431,6 +3495,7 @@ async function runChannelDaemonWorker(opts) {
|
|
|
3431
3495
|
}
|
|
3432
3496
|
},
|
|
3433
3497
|
async close() {
|
|
3498
|
+
scheduler?.stop();
|
|
3434
3499
|
disconnectAll();
|
|
3435
3500
|
try {
|
|
3436
3501
|
bridge.stop();
|
|
@@ -3440,6 +3505,7 @@ async function runChannelDaemonWorker(opts) {
|
|
|
3440
3505
|
}
|
|
3441
3506
|
};
|
|
3442
3507
|
} catch (err) {
|
|
3508
|
+
scheduler?.stop();
|
|
3443
3509
|
disconnectAll();
|
|
3444
3510
|
try {
|
|
3445
3511
|
bridge.stop();
|
|
@@ -3601,8 +3667,58 @@ var daemonWorkerCommand = {
|
|
|
3601
3667
|
} catch {
|
|
3602
3668
|
}
|
|
3603
3669
|
}, "sendWebhookTaskResult");
|
|
3670
|
+
const sendChannelDeliveryResult = /* @__PURE__ */ __name((id, result) => {
|
|
3671
|
+
try {
|
|
3672
|
+
process.send?.({
|
|
3673
|
+
type: "channel_delivery_result",
|
|
3674
|
+
id,
|
|
3675
|
+
...result
|
|
3676
|
+
});
|
|
3677
|
+
} catch {
|
|
3678
|
+
}
|
|
3679
|
+
}, "sendChannelDeliveryResult");
|
|
3604
3680
|
const activeWebhookTasks = /* @__PURE__ */ new Map();
|
|
3681
|
+
const activeChannelDeliveries = /* @__PURE__ */ new Map();
|
|
3605
3682
|
const onMessage = /* @__PURE__ */ __name((message) => {
|
|
3683
|
+
if (isChannelDeliveryMessage(message)) {
|
|
3684
|
+
if (message.expiresAt <= Date.now()) {
|
|
3685
|
+
sendChannelDeliveryResult(message.id, {
|
|
3686
|
+
ok: false,
|
|
3687
|
+
code: "channel_delivery_timeout",
|
|
3688
|
+
error: "Channel delivery IPC timed out."
|
|
3689
|
+
});
|
|
3690
|
+
return;
|
|
3691
|
+
}
|
|
3692
|
+
if (activeChannelDeliveries.size >= MAX_CHANNEL_DELIVERIES_IN_FLIGHT) {
|
|
3693
|
+
sendChannelDeliveryResult(message.id, {
|
|
3694
|
+
ok: false,
|
|
3695
|
+
code: "channel_delivery_queue_full",
|
|
3696
|
+
error: "Channel delivery queue is full."
|
|
3697
|
+
});
|
|
3698
|
+
return;
|
|
3699
|
+
}
|
|
3700
|
+
const deliveryId = message.id;
|
|
3701
|
+
const delivery = handle.deliverChannelMessage(message.request).then(() => {
|
|
3702
|
+
sendChannelDeliveryResult(deliveryId, { ok: true });
|
|
3703
|
+
}).catch((error) => {
|
|
3704
|
+
sendChannelDeliveryResult(deliveryId, {
|
|
3705
|
+
ok: false,
|
|
3706
|
+
code: classifyChannelDeliveryError(error),
|
|
3707
|
+
error: sanitizeWorkerDiagnostic(
|
|
3708
|
+
error instanceof Error ? error.message : String(error),
|
|
3709
|
+
512,
|
|
3710
|
+
{
|
|
3711
|
+
...daemonToken ? { daemonToken } : {},
|
|
3712
|
+
workerEnv: process.env
|
|
3713
|
+
}
|
|
3714
|
+
)
|
|
3715
|
+
});
|
|
3716
|
+
}).finally(() => {
|
|
3717
|
+
activeChannelDeliveries.delete(deliveryId);
|
|
3718
|
+
});
|
|
3719
|
+
activeChannelDeliveries.set(deliveryId, delivery);
|
|
3720
|
+
return;
|
|
3721
|
+
}
|
|
3606
3722
|
if (!isChannelWebhookTaskMessage(message)) return;
|
|
3607
3723
|
if (message.expiresAt <= Date.now()) {
|
|
3608
3724
|
sendWebhookTaskResult(message.id, {
|
|
@@ -3684,17 +3800,26 @@ var daemonWorkerCommand = {
|
|
|
3684
3800
|
clearHeartbeat();
|
|
3685
3801
|
process.removeListener("message", onMessage);
|
|
3686
3802
|
try {
|
|
3687
|
-
|
|
3803
|
+
const deliveryCount = activeChannelDeliveries.size;
|
|
3804
|
+
const webhookCount = activeWebhookTasks.size;
|
|
3805
|
+
if (deliveryCount > 0) {
|
|
3806
|
+
writeStderrLine(
|
|
3807
|
+
`[Channel] shutdown: draining ${deliveryCount} channel delivery task(s)...`
|
|
3808
|
+
);
|
|
3809
|
+
}
|
|
3810
|
+
if (webhookCount > 0) {
|
|
3688
3811
|
writeStderrLine(
|
|
3689
|
-
`[Channel] shutdown: draining ${
|
|
3812
|
+
`[Channel] shutdown: draining ${webhookCount} webhook task(s)...`
|
|
3690
3813
|
);
|
|
3814
|
+
}
|
|
3815
|
+
if (deliveryCount > 0 || webhookCount > 0) {
|
|
3691
3816
|
await Promise.race([
|
|
3692
|
-
Promise.allSettled(
|
|
3817
|
+
Promise.allSettled([
|
|
3818
|
+
...activeChannelDeliveries.values(),
|
|
3819
|
+
...activeWebhookTasks.values()
|
|
3820
|
+
]),
|
|
3693
3821
|
new Promise((resolve13) => {
|
|
3694
|
-
const timer = setTimeout(
|
|
3695
|
-
resolve13,
|
|
3696
|
-
WEBHOOK_TASK_SHUTDOWN_DRAIN_MS
|
|
3697
|
-
);
|
|
3822
|
+
const timer = setTimeout(resolve13, WORKER_SHUTDOWN_DRAIN_MS);
|
|
3698
3823
|
timer.unref();
|
|
3699
3824
|
})
|
|
3700
3825
|
]);
|
|
@@ -3757,6 +3882,16 @@ function classifyWebhookTaskValidationError(error) {
|
|
|
3757
3882
|
return "channel_webhook_enqueue_failed";
|
|
3758
3883
|
}
|
|
3759
3884
|
__name(classifyWebhookTaskValidationError, "classifyWebhookTaskValidationError");
|
|
3885
|
+
function classifyChannelDeliveryError(error) {
|
|
3886
|
+
if (isChannelDeliveryError(error)) {
|
|
3887
|
+
return error.code;
|
|
3888
|
+
}
|
|
3889
|
+
if (isChannelProactiveDeliveryError(error) && error.disposition === "permanent") {
|
|
3890
|
+
return "channel_delivery_rejected";
|
|
3891
|
+
}
|
|
3892
|
+
return "channel_delivery_failed";
|
|
3893
|
+
}
|
|
3894
|
+
__name(classifyChannelDeliveryError, "classifyChannelDeliveryError");
|
|
3760
3895
|
|
|
3761
3896
|
// packages/cli/src/commands/channel/pairing.ts
|
|
3762
3897
|
init_esbuild_shims();
|
|
@@ -4638,6 +4773,8 @@ init_esbuild_shims();
|
|
|
4638
4773
|
var BRIEFS = {
|
|
4639
4774
|
"0": {
|
|
4640
4775
|
label: "Agent 0: Issue fidelity & root-cause ownership",
|
|
4776
|
+
publicLabel: "the linked-issue fidelity pass",
|
|
4777
|
+
publicLabelZh: "\u5173\u8054 issue \u4E00\u81F4\u6027\u68C0\u67E5",
|
|
4641
4778
|
readsDiff: true,
|
|
4642
4779
|
brief: `You are **Agent 0: Issue Fidelity & Root-Cause Ownership**. Your scope is issue fidelity, not general code review \u2014 do not report ordinary code defects; other agents own those.
|
|
4643
4780
|
|
|
@@ -4659,6 +4796,8 @@ If \`gh\` fails (auth, rate limit, network), **retry that fetch once**. If it fa
|
|
|
4659
4796
|
"1a": {
|
|
4660
4797
|
reviewsCode: true,
|
|
4661
4798
|
label: "Agent 1a: Line-by-line correctness",
|
|
4799
|
+
publicLabel: "the line-by-line correctness pass",
|
|
4800
|
+
publicLabelZh: "\u9010\u884C\u6B63\u786E\u6027\u68C0\u67E5",
|
|
4662
4801
|
readsDiff: true,
|
|
4663
4802
|
brief: `You are **Agent 1a: the line-by-line scan**. Your dimension is defined by *how you walk*, not by a topic \u2014 a topical "find correctness bugs" brief makes every agent converge on the same visibly-suspicious hunks, which is redundancy, not coverage.
|
|
4664
4803
|
|
|
@@ -4675,6 +4814,8 @@ Scope guard: reading the enclosing function is for **context**. A defect entirel
|
|
|
4675
4814
|
"1b": {
|
|
4676
4815
|
reviewsCode: true,
|
|
4677
4816
|
label: "Agent 1b: Removed-behavior audit",
|
|
4817
|
+
publicLabel: "the removed-behavior audit",
|
|
4818
|
+
publicLabelZh: "\u5220\u9664\u884C\u4E3A\u5BA1\u8BA1",
|
|
4678
4819
|
readsDiff: true,
|
|
4679
4820
|
brief: `You are **Agent 1b: the removed-behavior audit**. You own the diff's **deleted side**, and you are the only agent who can see it: the \`-\` lines exist *only* in the diff. The post-change tree carries no trace of what was removed \u2014 the line is simply not there, and nothing marks where it was \u2014 so no agent reading the new code alone can find this class of defect.
|
|
4680
4821
|
|
|
@@ -4691,6 +4832,8 @@ Each failure scenario must name what input or state now slips past the removed b
|
|
|
4691
4832
|
"1c": {
|
|
4692
4833
|
reviewsCode: true,
|
|
4693
4834
|
label: "Agent 1c: Cross-file tracer",
|
|
4835
|
+
publicLabel: "the cross-file consistency pass",
|
|
4836
|
+
publicLabelZh: "\u8DE8\u6587\u4EF6\u4E00\u81F4\u6027\u68C0\u67E5",
|
|
4694
4837
|
readsDiff: true,
|
|
4695
4838
|
brief: `You are **Agent 1c: the cross-file tracer**. You own the *whole* cross-file walk, end to end. It used to be a duty shared by six agents, and a duty shared by six agents is a duty nobody finishes while the same symbols get grepped six times.
|
|
4696
4839
|
|
|
@@ -4716,6 +4859,8 @@ Expect the three ends to be far apart. The declaration, the pass-through, and th
|
|
|
4716
4859
|
"2": {
|
|
4717
4860
|
reviewsCode: true,
|
|
4718
4861
|
label: "Agent 2: Security",
|
|
4862
|
+
publicLabel: "the security pass",
|
|
4863
|
+
publicLabelZh: "\u5B89\u5168\u68C0\u67E5",
|
|
4719
4864
|
readsDiff: true,
|
|
4720
4865
|
brief: `You are **Agent 2: Security**. Review the diff for:
|
|
4721
4866
|
|
|
@@ -4731,6 +4876,8 @@ Expect the three ends to be far apart. The declaration, the pass-through, and th
|
|
|
4731
4876
|
"3": {
|
|
4732
4877
|
reviewsCode: true,
|
|
4733
4878
|
label: "Agent 3: Code quality",
|
|
4879
|
+
publicLabel: "the code-quality pass",
|
|
4880
|
+
publicLabelZh: "\u4EE3\u7801\u8D28\u91CF\u68C0\u67E5",
|
|
4734
4881
|
readsDiff: true,
|
|
4735
4882
|
brief: `You are **Agent 3: Code Quality**. Review the diff for:
|
|
4736
4883
|
|
|
@@ -4743,6 +4890,8 @@ Expect the three ends to be far apart. The declaration, the pass-through, and th
|
|
|
4743
4890
|
"4": {
|
|
4744
4891
|
reviewsCode: true,
|
|
4745
4892
|
label: "Agent 4: Performance & efficiency",
|
|
4893
|
+
publicLabel: "the performance pass",
|
|
4894
|
+
publicLabelZh: "\u6027\u80FD\u68C0\u67E5",
|
|
4746
4895
|
readsDiff: true,
|
|
4747
4896
|
brief: `You are **Agent 4: Performance & Efficiency**. Review the diff for:
|
|
4748
4897
|
|
|
@@ -4756,6 +4905,8 @@ Expect the three ends to be far apart. The declaration, the pass-through, and th
|
|
|
4756
4905
|
"5": {
|
|
4757
4906
|
reviewsCode: true,
|
|
4758
4907
|
label: "Agent 5: Test coverage",
|
|
4908
|
+
publicLabel: "the test-coverage pass",
|
|
4909
|
+
publicLabelZh: "\u6D4B\u8BD5\u8986\u76D6\u68C0\u67E5",
|
|
4759
4910
|
readsDiff: true,
|
|
4760
4911
|
brief: `You are **Agent 5: Test Coverage**. Review the diff for:
|
|
4761
4912
|
|
|
@@ -4771,6 +4922,8 @@ Expect the three ends to be far apart. The declaration, the pass-through, and th
|
|
|
4771
4922
|
"6a": {
|
|
4772
4923
|
reviewsCode: true,
|
|
4773
4924
|
label: "Agent 6a: Undirected audit \u2014 attacker mindset",
|
|
4925
|
+
publicLabel: "the open-ended audit (attacker mindset)",
|
|
4926
|
+
publicLabelZh: "\u5F00\u653E\u5F0F\u5BA1\u8BA1\uFF08\u653B\u51FB\u8005\u89C6\u89D2\uFF09",
|
|
4774
4927
|
readsDiff: true,
|
|
4775
4928
|
brief: `You are **Agent 6a: the undirected audit, attacker mindset.**
|
|
4776
4929
|
|
|
@@ -4789,6 +4942,8 @@ You are undirected on purpose. Do not restrict yourself to the list.`
|
|
|
4789
4942
|
"6b": {
|
|
4790
4943
|
reviewsCode: true,
|
|
4791
4944
|
label: "Agent 6b: Undirected audit \u2014 3 AM oncall mindset",
|
|
4945
|
+
publicLabel: "the open-ended audit (oncall mindset)",
|
|
4946
|
+
publicLabelZh: "\u5F00\u653E\u5F0F\u5BA1\u8BA1\uFF08\u503C\u73ED\u6392\u969C\u89C6\u89D2\uFF09",
|
|
4792
4947
|
readsDiff: true,
|
|
4793
4948
|
brief: `You are **Agent 6b: the undirected audit, 3 AM oncall mindset.**
|
|
4794
4949
|
|
|
@@ -4807,6 +4962,8 @@ You are undirected on purpose. Do not restrict yourself to the list.`
|
|
|
4807
4962
|
"6c": {
|
|
4808
4963
|
reviewsCode: true,
|
|
4809
4964
|
label: "Agent 6c: Undirected audit \u2014 six-months-later maintainer",
|
|
4965
|
+
publicLabel: "the open-ended audit (maintainer mindset)",
|
|
4966
|
+
publicLabelZh: "\u5F00\u653E\u5F0F\u5BA1\u8BA1\uFF08\u540E\u7EED\u7EF4\u62A4\u8005\u89C6\u89D2\uFF09",
|
|
4810
4967
|
readsDiff: true,
|
|
4811
4968
|
brief: `You are **Agent 6c: the undirected audit, six-months-later maintainer mindset.**
|
|
4812
4969
|
|
|
@@ -4824,6 +4981,8 @@ You are undirected on purpose. Do not restrict yourself to the list.`
|
|
|
4824
4981
|
},
|
|
4825
4982
|
"7": {
|
|
4826
4983
|
label: "Agent 7: Build & test verification",
|
|
4984
|
+
publicLabel: "the build-and-test check",
|
|
4985
|
+
publicLabelZh: "\u6784\u5EFA\u4E0E\u6D4B\u8BD5\u9A8C\u8BC1",
|
|
4827
4986
|
readsDiff: false,
|
|
4828
4987
|
brief: `You are **Agent 7: Build & Test Verification**. You do not review the diff \u2014 you run the project's own deterministic checks and report what they say. Your evidence is **the commands you ran and their output**; a return that names no command has not done this job.
|
|
4829
4988
|
|
|
@@ -4838,6 +4997,8 @@ Use \`Source: [build]\` or \`Source: [test]\`, never \`[review]\`.`
|
|
|
4838
4997
|
},
|
|
4839
4998
|
"test-matrix": {
|
|
4840
4999
|
label: "Test coverage matrix (whole-diff)",
|
|
5000
|
+
publicLabel: "the whole-diff test-coverage check",
|
|
5001
|
+
publicLabelZh: "\u5168 diff \u6D4B\u8BD5\u8986\u76D6\u68C0\u67E5",
|
|
4841
5002
|
readsDiff: true,
|
|
4842
5003
|
brief: `You are the **test-coverage matrix** agent \u2014 Agent 5's cross-chunk counterpart. The territory agents each see either an implementation or a test, rarely both. You see the whole diff, so you own the pairing.
|
|
4843
5004
|
|
|
@@ -4848,6 +5009,8 @@ Use \`Source: [build]\` or \`Source: [test]\`, never \`[review]\`.`
|
|
|
4848
5009
|
"invariant-a": {
|
|
4849
5010
|
reviewsCode: true,
|
|
4850
5011
|
label: "Invariant agent A: state, timers, collections",
|
|
5012
|
+
publicLabel: "the invariant check (state, timers, collections)",
|
|
5013
|
+
publicLabelZh: "\u4E0D\u53D8\u91CF\u68C0\u67E5\uFF08\u72B6\u6001\u3001\u5B9A\u65F6\u5668\u3001\u96C6\u5408\uFF09",
|
|
4851
5014
|
readsDiff: true,
|
|
4852
5015
|
brief: `You are **invariant agent A: state, timers, and collections.**
|
|
4853
5016
|
|
|
@@ -4864,6 +5027,8 @@ Report a **Critical** for each violation, and give **both** locations that toget
|
|
|
4864
5027
|
"invariant-b": {
|
|
4865
5028
|
reviewsCode: true,
|
|
4866
5029
|
label: "Invariant agent B: counters, return values, error taxonomies",
|
|
5030
|
+
publicLabel: "the invariant check (counters, return values, error taxonomies)",
|
|
5031
|
+
publicLabelZh: "\u4E0D\u53D8\u91CF\u68C0\u67E5\uFF08\u8BA1\u6570\u5668\u3001\u8FD4\u56DE\u503C\u3001\u9519\u8BEF\u5206\u7C7B\uFF09",
|
|
4867
5032
|
readsDiff: true,
|
|
4868
5033
|
brief: `You are **invariant agent B: counters, return values, and error taxonomies.**
|
|
4869
5034
|
|
|
@@ -4880,6 +5045,8 @@ Report a **Critical** for each violation, and give **both** locations that toget
|
|
|
4880
5045
|
"invariant-c": {
|
|
4881
5046
|
reviewsCode: true,
|
|
4882
5047
|
label: "Invariant agent C: config fields, early returns",
|
|
5048
|
+
publicLabel: "the invariant check (config fields, early returns)",
|
|
5049
|
+
publicLabelZh: "\u4E0D\u53D8\u91CF\u68C0\u67E5\uFF08\u914D\u7F6E\u5B57\u6BB5\u3001\u63D0\u524D\u8FD4\u56DE\uFF09",
|
|
4883
5050
|
readsDiff: true,
|
|
4884
5051
|
brief: `You are **invariant agent C: config fields and early returns.**
|
|
4885
5052
|
|
|
@@ -4897,6 +5064,8 @@ Report a **Critical** for each violation, and give **both** locations that toget
|
|
|
4897
5064
|
output: "verdicts",
|
|
4898
5065
|
acceptsFindings: true,
|
|
4899
5066
|
label: "Verification agent",
|
|
5067
|
+
publicLabel: "verification",
|
|
5068
|
+
publicLabelZh: "\u9A8C\u8BC1",
|
|
4900
5069
|
readsDiff: true,
|
|
4901
5070
|
brief: `You are a **verification agent**. You do not look for new problems \u2014 you rule on the findings you were handed, listed in the message that launched you, each with a file, a line, an issue, and a **failure scenario**. The failure scenario is the finding's testable claim, and your verdict is the **result of tracing it through the real code**, not a plausibility vote on how the finding reads.
|
|
4902
5071
|
|
|
@@ -4925,6 +5094,8 @@ Return, for each finding, one verdict:
|
|
|
4925
5094
|
acceptsChunk: true,
|
|
4926
5095
|
acceptsFindings: true,
|
|
4927
5096
|
label: "Reverse audit agent",
|
|
5097
|
+
publicLabel: "reverse audit",
|
|
5098
|
+
publicLabelZh: "\u53CD\u5411\u5BA1\u8BA1",
|
|
4928
5099
|
readsDiff: true,
|
|
4929
5100
|
brief: `You are a **reverse audit agent**. Prior agents have already reviewed this diff and their confirmed findings are listed in the message that launched you. Your job is not to re-report them \u2014 it is to find the **gaps**: the important issues no prior agent or round caught.
|
|
4930
5101
|
|
|
@@ -5383,6 +5554,18 @@ function roleLabel(req) {
|
|
|
5383
5554
|
return req.file ? `${base} \u2014 ${req.file}` : base;
|
|
5384
5555
|
}
|
|
5385
5556
|
__name(roleLabel, "roleLabel");
|
|
5557
|
+
function publicRoleLabel(req) {
|
|
5558
|
+
if (req.role === "chunk") return void 0;
|
|
5559
|
+
const base = BRIEFS[req.role].publicLabel;
|
|
5560
|
+
return req.file ? `${base} on ${req.file}` : base;
|
|
5561
|
+
}
|
|
5562
|
+
__name(publicRoleLabel, "publicRoleLabel");
|
|
5563
|
+
function publicRoleLabelZh(req) {
|
|
5564
|
+
if (req.role === "chunk") return void 0;
|
|
5565
|
+
const base = BRIEFS[req.role].publicLabelZh;
|
|
5566
|
+
return req.file ? `${base}\uFF08${req.file}\uFF09` : base;
|
|
5567
|
+
}
|
|
5568
|
+
__name(publicRoleLabelZh, "publicRoleLabelZh");
|
|
5386
5569
|
function label(rec, chunk) {
|
|
5387
5570
|
if (chunk !== null) return `chunk ${chunk}`;
|
|
5388
5571
|
const first = rec.launchPrompt.split("\n")[0]?.trim() ?? "";
|
|
@@ -5399,8 +5582,15 @@ function coverageFromTranscripts(planPath, env = process.env) {
|
|
|
5399
5582
|
const unopenedAgents = [];
|
|
5400
5583
|
const rewrittenPrompts = [];
|
|
5401
5584
|
const disclosures = [];
|
|
5402
|
-
const disclose = /* @__PURE__ */ __name((subject, reason) => {
|
|
5403
|
-
disclosures.push({
|
|
5585
|
+
const disclose = /* @__PURE__ */ __name((subject, reason, pub) => {
|
|
5586
|
+
disclosures.push({
|
|
5587
|
+
subject,
|
|
5588
|
+
reason,
|
|
5589
|
+
publicSubject: pub?.subject,
|
|
5590
|
+
publicReason: pub?.reason,
|
|
5591
|
+
subjectZh: pub?.subjectZh,
|
|
5592
|
+
reasonZh: pub?.reasonZh
|
|
5593
|
+
});
|
|
5404
5594
|
return `${subject} \u2014 ${reason}`;
|
|
5405
5595
|
}, "disclose");
|
|
5406
5596
|
const covered = /* @__PURE__ */ new Set();
|
|
@@ -5455,7 +5645,10 @@ function coverageFromTranscripts(planPath, env = process.env) {
|
|
|
5455
5645
|
rewrittenPrompts.push(
|
|
5456
5646
|
disclose(
|
|
5457
5647
|
name,
|
|
5458
|
-
"ran on a prompt the run wrote itself (none was built for this chunk), so the brief with its method and rules never reached it"
|
|
5648
|
+
"ran on a prompt the run wrote itself (none was built for this chunk), so the brief with its method and rules never reached it",
|
|
5649
|
+
{
|
|
5650
|
+
reasonZh: "\u8FD0\u884C\u5728\u8FD9\u6B21 run \u81EA\u884C\u7F16\u5199\u7684 prompt \u4E0A\uFF08\u8BE5 chunk \u4ECE\u672A\u6784\u5EFA\u8FC7 prompt\uFF09\uFF0C\u627F\u8F7D\u65B9\u6CD5\u4E0E\u89C4\u5219\u7684 brief \u4ECE\u672A\u5230\u8FBE\u8BE5 agent"
|
|
5651
|
+
}
|
|
5459
5652
|
)
|
|
5460
5653
|
);
|
|
5461
5654
|
}
|
|
@@ -5465,7 +5658,8 @@ function coverageFromTranscripts(planPath, env = process.env) {
|
|
|
5465
5658
|
rewrittenPrompts.push(
|
|
5466
5659
|
disclose(
|
|
5467
5660
|
name,
|
|
5468
|
-
"launched with a prompt that is not the one the CLI built"
|
|
5661
|
+
"launched with a prompt that is not the one the CLI built",
|
|
5662
|
+
{ reasonZh: "\u542F\u52A8\u65F6\u4F7F\u7528\u7684 prompt \u4E0D\u662F CLI \u6784\u5EFA\u7684\u90A3\u4E00\u4EFD" }
|
|
5469
5663
|
)
|
|
5470
5664
|
);
|
|
5471
5665
|
}
|
|
@@ -5502,7 +5696,11 @@ function coverageFromTranscripts(planPath, env = process.env) {
|
|
|
5502
5696
|
missingRoles.push(
|
|
5503
5697
|
disclose(
|
|
5504
5698
|
"every dimension",
|
|
5505
|
-
`none of the ${roster.length} required agents is on record as launched with a prompt this skill built, so this diff was reviewed, if at all, from prompts the run wrote for itself: no record shows the severity bar, the finding format or this project's own rules reaching an agent
|
|
5699
|
+
`none of the ${roster.length} required agents is on record as launched with a prompt this skill built, so this diff was reviewed, if at all, from prompts the run wrote for itself: no record shows the severity bar, the finding format or this project's own rules reaching an agent`,
|
|
5700
|
+
{
|
|
5701
|
+
subjectZh: "\u6240\u6709\u7EF4\u5EA6",
|
|
5702
|
+
reasonZh: `${roster.length} \u4E2A\u5FC5\u9700 agent \u4E2D\u6CA1\u6709\u4EFB\u4F55\u4E00\u4E2A\u6709\u8BB0\u5F55\u8868\u660E\u662F\u7528\u672C skill \u6784\u5EFA\u7684 prompt \u542F\u52A8\u7684\uFF0C\u8FD9\u4E2A diff \u5373\u4FBF\u88AB\u5BA1\u67E5\u8FC7\uFF0C\u4E5F\u662F\u57FA\u4E8E\u8FD9\u6B21 run \u81EA\u884C\u7F16\u5199\u7684 prompt\uFF1A\u6CA1\u6709\u8BB0\u5F55\u8868\u660E\u4E25\u91CD\u7EA7\u522B\u6807\u51C6\u3001\u53D1\u73B0\u683C\u5F0F\u6216\u672C\u9879\u76EE\u81EA\u5DF1\u7684\u89C4\u5219\u5230\u8FBE\u8FC7\u4EFB\u4F55 agent`
|
|
5703
|
+
}
|
|
5506
5704
|
)
|
|
5507
5705
|
);
|
|
5508
5706
|
}
|
|
@@ -5549,7 +5747,12 @@ function coverageFromTranscripts(planPath, env = process.env) {
|
|
|
5549
5747
|
missingRoles.push(
|
|
5550
5748
|
disclose(
|
|
5551
5749
|
roleLabel(req),
|
|
5552
|
-
"no record shows its brief reaching an agent, so this dimension was reviewed, if at all, from a prompt the run wrote for itself"
|
|
5750
|
+
"no record shows its brief reaching an agent, so this dimension was reviewed, if at all, from a prompt the run wrote for itself",
|
|
5751
|
+
{
|
|
5752
|
+
subject: publicRoleLabel(req),
|
|
5753
|
+
subjectZh: publicRoleLabelZh(req),
|
|
5754
|
+
reasonZh: "\u6CA1\u6709\u8BB0\u5F55\u8868\u660E\u5B83\u7684 brief \u5230\u8FBE\u8FC7\u4EFB\u4F55 agent\uFF0C\u8FD9\u4E2A\u7EF4\u5EA6\u5373\u4FBF\u88AB\u5BA1\u67E5\u8FC7\uFF0C\u4E5F\u662F\u57FA\u4E8E\u8FD9\u6B21 run \u81EA\u884C\u7F16\u5199\u7684 prompt"
|
|
5755
|
+
}
|
|
5553
5756
|
)
|
|
5554
5757
|
);
|
|
5555
5758
|
}
|
|
@@ -5563,7 +5766,12 @@ function coverageFromTranscripts(planPath, env = process.env) {
|
|
|
5563
5766
|
missingRoles.push(
|
|
5564
5767
|
disclose(
|
|
5565
5768
|
roleLabel(req),
|
|
5566
|
-
anyMatch ? "its prompt reached only an agent already credited with another block; one agent was given several blocks, and one transcript cannot certify two dimensions" : "its prompt was built, but no agent on record was launched with it"
|
|
5769
|
+
anyMatch ? "its prompt reached only an agent already credited with another block; one agent was given several blocks, and one transcript cannot certify two dimensions" : "its prompt was built, but no agent on record was launched with it",
|
|
5770
|
+
{
|
|
5771
|
+
subject: publicRoleLabel(req),
|
|
5772
|
+
subjectZh: publicRoleLabelZh(req),
|
|
5773
|
+
reasonZh: anyMatch ? "\u5B83\u7684 prompt \u53EA\u5230\u8FBE\u4E86\u4E00\u4E2A\u5DF2\u88AB\u8BB0\u5165\u5176\u4ED6\u533A\u5757\u7684 agent\uFF1B\u4E00\u4E2A agent \u88AB\u585E\u8FDB\u4E86\u591A\u4E2A\u533A\u5757\uFF0C\u800C\u4E00\u4EFD\u8FD0\u884C\u8BB0\u5F55\u65E0\u6CD5\u4E3A\u4E24\u4E2A\u7EF4\u5EA6\u4F5C\u8BC1" : "\u5B83\u7684 prompt \u5DF2\u6784\u5EFA\uFF0C\u4F46\u6CA1\u6709\u4EFB\u4F55 agent \u6709\u8BB0\u5F55\u7528\u5B83\u542F\u52A8\u8FC7"
|
|
5774
|
+
}
|
|
5567
5775
|
)
|
|
5568
5776
|
);
|
|
5569
5777
|
missingRoleSelectors.push(selectorOf(req));
|
|
@@ -5577,7 +5785,13 @@ function coverageFromTranscripts(planPath, env = process.env) {
|
|
|
5577
5785
|
unreadBriefs.push(
|
|
5578
5786
|
disclose(
|
|
5579
5787
|
roleLabel(req),
|
|
5580
|
-
`never opened its brief (${brief}), so it reviewed without the instructions it was launched to follow
|
|
5788
|
+
`never opened its brief (${brief}), so it reviewed without the instructions it was launched to follow`,
|
|
5789
|
+
{
|
|
5790
|
+
subject: publicRoleLabel(req),
|
|
5791
|
+
reason: "never opened its brief, so it reviewed without the instructions it was launched to follow",
|
|
5792
|
+
subjectZh: publicRoleLabelZh(req),
|
|
5793
|
+
reasonZh: "\u4ECE\u672A\u6253\u5F00\u81EA\u5DF1\u7684 brief\uFF0C\u5BA1\u67E5\u65F6\u7F3A\u5931\u4E86\u5B83\u672C\u5E94\u9075\u5FAA\u7684\u6307\u4EE4"
|
|
5794
|
+
}
|
|
5581
5795
|
)
|
|
5582
5796
|
);
|
|
5583
5797
|
}
|
|
@@ -5602,7 +5816,11 @@ function coverageFromTranscripts(planPath, env = process.env) {
|
|
|
5602
5816
|
unreadBriefs,
|
|
5603
5817
|
missingChunks,
|
|
5604
5818
|
uncoverableChunks: [...uncoverable].sort((a, b) => a - b),
|
|
5605
|
-
coveredChunks: [...covered].sort((a, b) => a - b)
|
|
5819
|
+
coveredChunks: [...covered].sort((a, b) => a - b),
|
|
5820
|
+
plannedChunks: plan.chunks.map((c) => ({
|
|
5821
|
+
id: c.id,
|
|
5822
|
+
files: (c.files ?? []).map((f) => f?.path).filter((p) => typeof p === "string" && p !== "")
|
|
5823
|
+
}))
|
|
5606
5824
|
};
|
|
5607
5825
|
}
|
|
5608
5826
|
__name(coverageFromTranscripts, "coverageFromTranscripts");
|
|
@@ -5618,6 +5836,7 @@ var REVERSE_AUDIT_GAP = {
|
|
|
5618
5836
|
// provable ("no brief was built"), then what that costs ("if at all").
|
|
5619
5837
|
"not-built": {
|
|
5620
5838
|
gap: "no auditor was launched with a prompt this skill builds \u2014 the pass that hunts what the rest of the review missed ran, if at all, without the method its brief carries",
|
|
5839
|
+
gapZh: "\u6CA1\u6709\u5BA1\u8BA1 agent \u662F\u7528\u672C skill \u6784\u5EFA\u7684 prompt \u542F\u52A8\u7684\u2014\u2014\u8D1F\u8D23\u641C\u5BFB\u8BC4\u5BA1\u5176\u4F59\u90E8\u5206\u9057\u6F0F\u95EE\u9898\u7684\u8FD9\u9053\u5DE5\u5E8F\uFF0C\u5373\u4FBF\u8FD0\u884C\u8FC7\uFF0C\u4E5F\u7F3A\u5931\u4E86 brief \u627F\u8F7D\u7684\u65B9\u6CD5",
|
|
5621
5840
|
fix: rebuildFix("reverse-audit", "round")
|
|
5622
5841
|
},
|
|
5623
5842
|
// Same reach limit as `not-built`: a hand-written auditor that never opened
|
|
@@ -5625,6 +5844,7 @@ var REVERSE_AUDIT_GAP = {
|
|
|
5625
5844
|
// may not claim the pass did not run — only that it cannot be certified.
|
|
5626
5845
|
"not-launched": {
|
|
5627
5846
|
gap: "its prompt was built, but no agent was launched with it \u2014 the pass that hunts what the rest of the review missed ran, if at all, without the method its brief carries, and cannot be certified",
|
|
5847
|
+
gapZh: "\u5B83\u7684 prompt \u5DF2\u6784\u5EFA\uFF0C\u4F46\u6CA1\u6709 agent \u7528\u5B83\u542F\u52A8\u2014\u2014\u8D1F\u8D23\u641C\u5BFB\u8BC4\u5BA1\u5176\u4F59\u90E8\u5206\u9057\u6F0F\u95EE\u9898\u7684\u8FD9\u9053\u5DE5\u5E8F\uFF0C\u5373\u4FBF\u8FD0\u884C\u8FC7\uFF0C\u4E5F\u7F3A\u5931\u4E86 brief \u627F\u8F7D\u7684\u65B9\u6CD5\uFF0C\u65E0\u6CD5\u4F5C\u8BC1",
|
|
5628
5848
|
fix: rebuildFix("reverse-audit", "round")
|
|
5629
5849
|
},
|
|
5630
5850
|
// `rewritten` is reached only after a successful call OPENED the brief — so
|
|
@@ -5633,10 +5853,12 @@ var REVERSE_AUDIT_GAP = {
|
|
|
5633
5853
|
// findings, the exact ranges, the guarantee the skill certifies against.
|
|
5634
5854
|
rewritten: {
|
|
5635
5855
|
gap: "an auditor ran and opened its brief, but no agent was launched with the prompt the CLI built \u2014 the launch was written by hand, and what the agent was actually asked is not what this skill certifies",
|
|
5856
|
+
gapZh: "\u6709\u5BA1\u8BA1 agent \u8FD0\u884C\u5E76\u6253\u5F00\u4E86\u81EA\u5DF1\u7684 brief\uFF0C\u4F46\u6CA1\u6709 agent \u662F\u7528 CLI \u6784\u5EFA\u7684 prompt \u542F\u52A8\u7684\u2014\u2014\u542F\u52A8 prompt \u662F\u624B\u5199\u7684\uFF0Cagent \u5B9E\u9645\u88AB\u8981\u6C42\u505A\u7684\u5E76\u4E0D\u662F\u672C skill \u6240\u8BA4\u8BC1\u7684\u5185\u5BB9",
|
|
5636
5857
|
fix: rebuildFix("reverse-audit", "round")
|
|
5637
5858
|
},
|
|
5638
5859
|
"brief-unread": {
|
|
5639
5860
|
gap: "it was launched with the built prompt but never opened its brief, so it audited without the gaps-only method and the finding format it was launched to follow",
|
|
5861
|
+
gapZh: "\u5B83\u7528\u6784\u5EFA\u7684 prompt \u542F\u52A8\uFF0C\u5374\u4ECE\u672A\u6253\u5F00\u81EA\u5DF1\u7684 brief\uFF0C\u5BA1\u8BA1\u65F6\u7F3A\u5931\u4E86\u53EA\u62A5\u7F3A\u53E3\u7684\u65B9\u6CD5\u548C\u5B83\u672C\u5E94\u9075\u5FAA\u7684\u53D1\u73B0\u683C\u5F0F",
|
|
5640
5862
|
fix: "relaunch with the same printed prompt \u2014 the agent must OPEN the brief file the prompt names; that read is the receipt"
|
|
5641
5863
|
}
|
|
5642
5864
|
};
|
|
@@ -5645,21 +5867,43 @@ var VERIFY_GAP = {
|
|
|
5645
5867
|
// before the transcripts are consulted, so it may not assert nobody ran.
|
|
5646
5868
|
"not-built": {
|
|
5647
5869
|
gap: "the review posts findings, but no verifier was launched with a prompt this skill builds \u2014 they were ruled on, if at all, without the verdict bar its brief carries",
|
|
5870
|
+
gapZh: "\u672C\u6B21\u8BC4\u5BA1\u53D1\u5E03\u4E86\u53D1\u73B0\uFF0C\u4F46\u6CA1\u6709\u9A8C\u8BC1 agent \u662F\u7528\u672C skill \u6784\u5EFA\u7684 prompt \u542F\u52A8\u7684\u2014\u2014\u8FD9\u4E9B\u53D1\u73B0\u5373\u4FBF\u88AB\u88C1\u5B9A\u8FC7\uFF0C\u4E5F\u7F3A\u5931\u4E86 brief \u627F\u8F7D\u7684\u88C1\u5B9A\u6807\u51C6",
|
|
5648
5871
|
fix: rebuildFix("verify", "shard")
|
|
5649
5872
|
},
|
|
5650
5873
|
"not-launched": {
|
|
5651
5874
|
gap: "its prompt was built, but no agent was launched with it, so the posted findings cannot be counted as verified",
|
|
5875
|
+
gapZh: "\u5B83\u7684 prompt \u5DF2\u6784\u5EFA\uFF0C\u4F46\u6CA1\u6709 agent \u7528\u5B83\u542F\u52A8\uFF0C\u53D1\u5E03\u7684\u53D1\u73B0\u4E0D\u80FD\u7B97\u4F5C\u5DF2\u9A8C\u8BC1",
|
|
5652
5876
|
fix: rebuildFix("verify", "shard")
|
|
5653
5877
|
},
|
|
5654
5878
|
rewritten: {
|
|
5655
5879
|
gap: "a verifier ran and opened its brief, but no agent was launched with the prompt the CLI built \u2014 the launch was written by hand, and the posted findings cannot be counted as verified against it",
|
|
5880
|
+
gapZh: "\u6709\u9A8C\u8BC1 agent \u8FD0\u884C\u5E76\u6253\u5F00\u4E86\u81EA\u5DF1\u7684 brief\uFF0C\u4F46\u6CA1\u6709 agent \u662F\u7528 CLI \u6784\u5EFA\u7684 prompt \u542F\u52A8\u7684\u2014\u2014\u542F\u52A8 prompt \u662F\u624B\u5199\u7684\uFF0C\u53D1\u5E03\u7684\u53D1\u73B0\u4E0D\u80FD\u7B97\u4F5C\u7ECF\u5B83\u9A8C\u8BC1",
|
|
5656
5881
|
fix: rebuildFix("verify", "shard")
|
|
5657
5882
|
},
|
|
5658
5883
|
"brief-unread": {
|
|
5659
5884
|
gap: "it was launched with the built prompt but never opened its brief, so it ruled on the findings without the verdict bar it was launched to apply",
|
|
5885
|
+
gapZh: "\u5B83\u7528\u6784\u5EFA\u7684 prompt \u542F\u52A8\uFF0C\u5374\u4ECE\u672A\u6253\u5F00\u81EA\u5DF1\u7684 brief\uFF0C\u88C1\u5B9A\u53D1\u73B0\u65F6\u7F3A\u5931\u4E86\u5B83\u672C\u5E94\u4F7F\u7528\u7684\u88C1\u5B9A\u6807\u51C6",
|
|
5660
5886
|
fix: "relaunch with the same printed prompt \u2014 the agent must OPEN the brief file the prompt names; that read is the receipt"
|
|
5661
5887
|
}
|
|
5662
5888
|
};
|
|
5889
|
+
var COMBINED_STEP45_GAP = {
|
|
5890
|
+
"not-built": {
|
|
5891
|
+
en: "neither the verifier nor the reverse auditor was launched with a prompt this skill builds \u2014 the posted findings were ruled on, and the misses the rest of the review left were hunted, if at all, without the briefs this skill certifies against",
|
|
5892
|
+
zh: "\u9A8C\u8BC1 agent \u4E0E\u53CD\u5411\u5BA1\u8BA1 agent \u90FD\u6CA1\u6709\u7528\u672C skill \u6784\u5EFA\u7684 prompt \u542F\u52A8\u2014\u2014\u53D1\u5E03\u7684\u53D1\u73B0\u5373\u4FBF\u88AB\u88C1\u5B9A\u8FC7\u3001\u8BC4\u5BA1\u5176\u4F59\u90E8\u5206\u9057\u6F0F\u7684\u95EE\u9898\u5373\u4FBF\u88AB\u641C\u5BFB\u8FC7\uFF0C\u4E5F\u90FD\u7F3A\u5931\u4E86\u672C skill \u7528\u4EE5\u8BA4\u8BC1\u7684 brief"
|
|
5893
|
+
},
|
|
5894
|
+
"not-launched": {
|
|
5895
|
+
en: "both prompts were built, but no agent was launched with either \u2014 the posted findings cannot be counted as verified, and the pass that hunts what the rest of the review missed cannot be certified",
|
|
5896
|
+
zh: "\u4E24\u4EFD prompt \u90FD\u5DF2\u6784\u5EFA\uFF0C\u4F46\u90FD\u6CA1\u6709 agent \u7528\u5B83\u4EEC\u542F\u52A8\u2014\u2014\u53D1\u5E03\u7684\u53D1\u73B0\u4E0D\u80FD\u7B97\u4F5C\u5DF2\u9A8C\u8BC1\uFF0C\u641C\u5BFB\u8BC4\u5BA1\u9057\u6F0F\u95EE\u9898\u7684\u5DE5\u5E8F\u4E5F\u65E0\u6CD5\u4F5C\u8BC1"
|
|
5897
|
+
},
|
|
5898
|
+
rewritten: {
|
|
5899
|
+
en: "each ran and opened its brief, but neither was launched with the prompt the CLI built \u2014 the launches were written by hand, so the posted findings cannot be counted as verified, and what the agents were actually asked is not what this skill certifies",
|
|
5900
|
+
zh: "\u4E24\u8005\u90FD\u8FD0\u884C\u5E76\u6253\u5F00\u4E86\u5404\u81EA\u7684 brief\uFF0C\u4F46\u90FD\u4E0D\u662F\u7528 CLI \u6784\u5EFA\u7684 prompt \u542F\u52A8\u7684\u2014\u2014\u542F\u52A8 prompt \u662F\u624B\u5199\u7684\uFF0C\u53D1\u5E03\u7684\u53D1\u73B0\u4E0D\u80FD\u7B97\u4F5C\u5DF2\u9A8C\u8BC1\uFF0Cagent \u5B9E\u9645\u88AB\u8981\u6C42\u505A\u7684\u4E5F\u4E0D\u662F\u672C skill \u6240\u8BA4\u8BC1\u7684\u5185\u5BB9"
|
|
5901
|
+
},
|
|
5902
|
+
"brief-unread": {
|
|
5903
|
+
en: "each was launched with its built prompt and never opened its brief, so the findings were ruled on without the verdict bar, and the audit ran without the gaps-only method it was launched to follow",
|
|
5904
|
+
zh: "\u4E24\u8005\u90FD\u7528\u6784\u5EFA\u7684 prompt \u542F\u52A8\uFF0C\u5374\u90FD\u4ECE\u672A\u6253\u5F00\u81EA\u5DF1\u7684 brief\u2014\u2014\u53D1\u73B0\u7684\u88C1\u5B9A\u7F3A\u5931\u4E86\u88C1\u5B9A\u6807\u51C6\uFF0C\u5BA1\u8BA1\u4E5F\u7F3A\u5931\u4E86\u5B83\u672C\u5E94\u9075\u5FAA\u7684\u53EA\u62A5\u7F3A\u53E3\u7684\u65B9\u6CD5"
|
|
5905
|
+
}
|
|
5906
|
+
};
|
|
5663
5907
|
function verificationGaps(planPath, opts, env = process.env) {
|
|
5664
5908
|
const { plan, mtimeMs } = readPlan(planPath);
|
|
5665
5909
|
const records = readTranscripts(mtimeMs, env, plan.diffPathAbsolute);
|
|
@@ -5695,7 +5939,6 @@ function verificationGaps(planPath, opts, env = process.env) {
|
|
|
5695
5939
|
);
|
|
5696
5940
|
const reverse = bestDelivery(reverseKeys);
|
|
5697
5941
|
if (reverse !== "ok") {
|
|
5698
|
-
gaps.push(`reverse audit \u2014 ${REVERSE_AUDIT_GAP[reverse].gap}`);
|
|
5699
5942
|
remediation.push(
|
|
5700
5943
|
`reverse audit: ${REVERSE_AUDIT_GAP[reverse].fix.replace(
|
|
5701
5944
|
"--plan <plan>",
|
|
@@ -5704,14 +5947,14 @@ function verificationGaps(planPath, opts, env = process.env) {
|
|
|
5704
5947
|
);
|
|
5705
5948
|
}
|
|
5706
5949
|
let unverifiedFindings = false;
|
|
5950
|
+
let verify = null;
|
|
5707
5951
|
if (opts.postsFindings) {
|
|
5708
5952
|
const verifyKeys = [...built.keys()].filter(
|
|
5709
5953
|
(k) => k === "verify" || k.startsWith("verify--")
|
|
5710
5954
|
);
|
|
5711
|
-
|
|
5955
|
+
verify = bestDelivery(verifyKeys);
|
|
5712
5956
|
if (verify !== "ok") {
|
|
5713
5957
|
unverifiedFindings = true;
|
|
5714
|
-
gaps.push(`verification \u2014 ${VERIFY_GAP[verify].gap}`);
|
|
5715
5958
|
remediation.push(
|
|
5716
5959
|
`verification: ${VERIFY_GAP[verify].fix.replace(
|
|
5717
5960
|
"--plan <plan>",
|
|
@@ -5722,6 +5965,31 @@ function verificationGaps(planPath, opts, env = process.env) {
|
|
|
5722
5965
|
);
|
|
5723
5966
|
}
|
|
5724
5967
|
}
|
|
5968
|
+
if (reverse !== "ok" && verify !== null && verify === reverse) {
|
|
5969
|
+
gaps.push({
|
|
5970
|
+
subject: "verification and reverse audit",
|
|
5971
|
+
reason: COMBINED_STEP45_GAP[reverse].en,
|
|
5972
|
+
subjectZh: "\u9A8C\u8BC1\u4E0E\u53CD\u5411\u5BA1\u8BA1",
|
|
5973
|
+
reasonZh: COMBINED_STEP45_GAP[reverse].zh
|
|
5974
|
+
});
|
|
5975
|
+
} else {
|
|
5976
|
+
if (reverse !== "ok") {
|
|
5977
|
+
gaps.push({
|
|
5978
|
+
subject: "reverse audit",
|
|
5979
|
+
reason: REVERSE_AUDIT_GAP[reverse].gap,
|
|
5980
|
+
subjectZh: "\u53CD\u5411\u5BA1\u8BA1",
|
|
5981
|
+
reasonZh: REVERSE_AUDIT_GAP[reverse].gapZh
|
|
5982
|
+
});
|
|
5983
|
+
}
|
|
5984
|
+
if (verify !== null && verify !== "ok") {
|
|
5985
|
+
gaps.push({
|
|
5986
|
+
subject: "verification",
|
|
5987
|
+
reason: VERIFY_GAP[verify].gap,
|
|
5988
|
+
subjectZh: "\u9A8C\u8BC1",
|
|
5989
|
+
reasonZh: VERIFY_GAP[verify].gapZh
|
|
5990
|
+
});
|
|
5991
|
+
}
|
|
5992
|
+
}
|
|
5725
5993
|
return { ok: gaps.length === 0, gaps, remediation, unverifiedFindings };
|
|
5726
5994
|
}
|
|
5727
5995
|
__name(verificationGaps, "verificationGaps");
|
|
@@ -5819,6 +6087,8 @@ function composeReview(input) {
|
|
|
5819
6087
|
const remediation = [];
|
|
5820
6088
|
const planRef = input.planPath ? shellQuotePath(input.planPath) : "<plan>";
|
|
5821
6089
|
const missingReceipts = [];
|
|
6090
|
+
let plannedChunks = [];
|
|
6091
|
+
let coveredChunks = [];
|
|
5822
6092
|
const nonDeterministicBodyCriticals = bodyCriticals.filter(
|
|
5823
6093
|
(x) => !/\[(?:build|test)\]/i.test(x)
|
|
5824
6094
|
).length;
|
|
@@ -5827,12 +6097,16 @@ function composeReview(input) {
|
|
|
5827
6097
|
if (!input.planPath) {
|
|
5828
6098
|
coverageEntries.push({
|
|
5829
6099
|
subject: "coverage",
|
|
5830
|
-
reason: "no plan was given, so this run cannot show that any of the diff was read"
|
|
6100
|
+
reason: "no plan was given, so this run cannot show that any of the diff was read",
|
|
6101
|
+
subjectZh: "\u8986\u76D6\u60C5\u51B5",
|
|
6102
|
+
reasonZh: "\u672A\u63D0\u4F9B plan\uFF0C\u672C\u6B21\u8FD0\u884C\u65E0\u6CD5\u8BC1\u660E diff \u7684\u4EFB\u4F55\u90E8\u5206\u88AB\u8BFB\u8FC7"
|
|
5831
6103
|
});
|
|
5832
6104
|
criticalsUnverified = criticalsNeedingVerify >= 1;
|
|
5833
6105
|
} else {
|
|
5834
6106
|
try {
|
|
5835
6107
|
const cov = coverageFromTranscripts(input.planPath, input.env);
|
|
6108
|
+
plannedChunks = cov.plannedChunks;
|
|
6109
|
+
coveredChunks = cov.coveredChunks;
|
|
5836
6110
|
for (const id of cov.missingChunks) missingReceipts.push(id);
|
|
5837
6111
|
for (const id of cov.uncoverableChunks) {
|
|
5838
6112
|
const prefix = `chunk ${id}`;
|
|
@@ -5844,7 +6118,8 @@ function composeReview(input) {
|
|
|
5844
6118
|
for (const label2 of cov.idleAgents) {
|
|
5845
6119
|
coverageEntries.push({
|
|
5846
6120
|
subject: label2,
|
|
5847
|
-
reason: "the agent made no tool call: it read nothing"
|
|
6121
|
+
reason: "the agent made no tool call: it read nothing",
|
|
6122
|
+
reasonZh: "\u8BE5 agent \u672A\u53D1\u8D77\u4EFB\u4F55\u5DE5\u5177\u8C03\u7528\uFF1A\u5B83\u4EC0\u4E48\u90FD\u6CA1\u8BFB"
|
|
5848
6123
|
});
|
|
5849
6124
|
}
|
|
5850
6125
|
if (cov.idleAgents.length > 0) {
|
|
@@ -5855,7 +6130,8 @@ function composeReview(input) {
|
|
|
5855
6130
|
for (const label2 of cov.blindAgents) {
|
|
5856
6131
|
coverageEntries.push({
|
|
5857
6132
|
subject: label2,
|
|
5858
|
-
reason: "launched with a prompt that never named the diff file, so it could not have read it"
|
|
6133
|
+
reason: "launched with a prompt that never named the diff file, so it could not have read it",
|
|
6134
|
+
reasonZh: "\u542F\u52A8 prompt \u4ECE\u672A\u63D0\u5230 diff \u6587\u4EF6\uFF0C\u5B83\u4E0D\u53EF\u80FD\u8BFB\u8FC7 diff"
|
|
5859
6135
|
});
|
|
5860
6136
|
}
|
|
5861
6137
|
if (cov.blindAgents.length > 0) {
|
|
@@ -5866,7 +6142,8 @@ function composeReview(input) {
|
|
|
5866
6142
|
for (const label2 of cov.unopenedAgents) {
|
|
5867
6143
|
coverageEntries.push({
|
|
5868
6144
|
subject: label2,
|
|
5869
|
-
reason: "pointed at diff lines it never opened: it made tool calls, but none of them read the diff"
|
|
6145
|
+
reason: "pointed at diff lines it never opened: it made tool calls, but none of them read the diff",
|
|
6146
|
+
reasonZh: "\u5B83\u88AB\u6307\u5411 diff \u7684\u884C\u5374\u4ECE\u672A\u6253\u5F00\uFF1A\u6709\u5DE5\u5177\u8C03\u7528\uFF0C\u4F46\u6CA1\u6709\u4E00\u6B21\u8BFB\u53D6 diff"
|
|
5870
6147
|
});
|
|
5871
6148
|
}
|
|
5872
6149
|
if (cov.unopenedAgents.length > 0) {
|
|
@@ -5892,9 +6169,12 @@ function composeReview(input) {
|
|
|
5892
6169
|
}
|
|
5893
6170
|
} catch (err) {
|
|
5894
6171
|
const why = err instanceof TranscriptsUnavailableError ? `could not read the agents' transcripts (${err.message})` : `the plan could not be used (${err.message})`;
|
|
6172
|
+
const whyZh = err instanceof TranscriptsUnavailableError ? `\u65E0\u6CD5\u8BFB\u53D6 agent \u7684\u8FD0\u884C\u8BB0\u5F55\uFF08${err.message}\uFF09` : `plan \u65E0\u6CD5\u4F7F\u7528\uFF08${err.message}\uFF09`;
|
|
5895
6173
|
coverageEntries.push({
|
|
5896
6174
|
subject: "coverage",
|
|
5897
|
-
reason: `${why}, so this run cannot show that any of the diff was read
|
|
6175
|
+
reason: `${why}, so this run cannot show that any of the diff was read`,
|
|
6176
|
+
subjectZh: "\u8986\u76D6\u60C5\u51B5",
|
|
6177
|
+
reasonZh: `${whyZh}\uFF0C\u672C\u6B21\u8FD0\u884C\u65E0\u6CD5\u8BC1\u660E diff \u7684\u4EFB\u4F55\u90E8\u5206\u88AB\u8BFB\u8FC7`
|
|
5898
6178
|
});
|
|
5899
6179
|
}
|
|
5900
6180
|
try {
|
|
@@ -5905,20 +6185,21 @@ function composeReview(input) {
|
|
|
5905
6185
|
input.env
|
|
5906
6186
|
);
|
|
5907
6187
|
for (const gap of verification.gaps) {
|
|
5908
|
-
|
|
5909
|
-
|
|
5910
|
-
|
|
5911
|
-
|
|
5912
|
-
|
|
5913
|
-
|
|
5914
|
-
);
|
|
6188
|
+
coverageEntries.push({
|
|
6189
|
+
subject: gap.subject,
|
|
6190
|
+
reason: gap.reason,
|
|
6191
|
+
subjectZh: gap.subjectZh,
|
|
6192
|
+
reasonZh: gap.reasonZh
|
|
6193
|
+
});
|
|
5915
6194
|
}
|
|
5916
6195
|
remediation.push(...verification.remediation);
|
|
5917
6196
|
criticalsUnverified = verification.unverifiedFindings && criticalsNeedingVerify >= 1;
|
|
5918
6197
|
} catch (err) {
|
|
5919
6198
|
coverageEntries.push({
|
|
5920
6199
|
subject: "verification",
|
|
5921
|
-
reason: `could not check that Step 4 and Step 5 ran (${err.message})
|
|
6200
|
+
reason: `could not check that Step 4 and Step 5 ran (${err.message})`,
|
|
6201
|
+
subjectZh: "\u9A8C\u8BC1",
|
|
6202
|
+
reasonZh: `\u65E0\u6CD5\u68C0\u67E5\u6B65\u9AA4 4 \u4E0E\u6B65\u9AA4 5 \u662F\u5426\u8FD0\u884C\uFF08${err.message}\uFF09`
|
|
5922
6203
|
});
|
|
5923
6204
|
criticalsUnverified = criticalsNeedingVerify >= 1;
|
|
5924
6205
|
}
|
|
@@ -5982,9 +6263,23 @@ function composeReview(input) {
|
|
|
5982
6263
|
downgradedFrom = "Request changes";
|
|
5983
6264
|
}
|
|
5984
6265
|
const footer = `_\u2014 ${modelId} via Qwen Code /review_`;
|
|
5985
|
-
const
|
|
6266
|
+
const bilingual = bilingualFromPlan(input.planPath);
|
|
6267
|
+
const render = /* @__PURE__ */ __name((parts, sep3) => {
|
|
6268
|
+
const en = parts.map((p) => p.en).join(sep3);
|
|
6269
|
+
if (en === "") return "";
|
|
6270
|
+
const zh = parts.map((p) => p.zh).join(sep3);
|
|
6271
|
+
const text = bilingual && zh !== en ? `${en}
|
|
6272
|
+
|
|
6273
|
+
<details>
|
|
6274
|
+
<summary>\u4E2D\u6587\u8BF4\u660E</summary>
|
|
6275
|
+
|
|
6276
|
+
${zh}
|
|
5986
6277
|
|
|
5987
|
-
|
|
6278
|
+
</details>` : en;
|
|
6279
|
+
return `${text}
|
|
6280
|
+
|
|
6281
|
+
${footer}`;
|
|
6282
|
+
}, "render");
|
|
5988
6283
|
const notReviewedParts = [];
|
|
5989
6284
|
if (missingReceipts.length > 0) {
|
|
5990
6285
|
remediation.push(
|
|
@@ -5995,15 +6290,29 @@ ${footer}`, "finish");
|
|
|
5995
6290
|
(id) => !disclosedSubjects.has(`chunk ${id}`)
|
|
5996
6291
|
);
|
|
5997
6292
|
if (unexplainedReceipts.length > 0) {
|
|
5998
|
-
|
|
5999
|
-
|
|
6000
|
-
|
|
6293
|
+
const gap = describeChunkGap(unexplainedReceipts, plannedChunks);
|
|
6294
|
+
const pron = gap.plural ? "them" : "it";
|
|
6295
|
+
notReviewedParts.push({
|
|
6296
|
+
en: `Not reviewed: ${gap.phrase} \u2014 no agent reported covering ${pron}; nobody read ${pron}.`,
|
|
6297
|
+
zh: `\u672A\u5BA1\u67E5\uFF1A${gap.phraseZh}\u2014\u2014\u6CA1\u6709 agent \u62A5\u544A\u8986\u76D6\u8FC7\u8FD9\u90E8\u5206\uFF0C\u4E5F\u6CA1\u6709\u4EBA\u8BFB\u8FC7\u5B83\u3002`
|
|
6298
|
+
});
|
|
6001
6299
|
}
|
|
6002
6300
|
}
|
|
6003
6301
|
if (uncoverable.length > 0) {
|
|
6004
|
-
|
|
6005
|
-
|
|
6006
|
-
)
|
|
6302
|
+
const bareIds = [];
|
|
6303
|
+
const callerNamed = [];
|
|
6304
|
+
for (const e of uncoverable) {
|
|
6305
|
+
const m = /^chunk (\d+)$/.exec(e);
|
|
6306
|
+
if (m) bareIds.push(Number(m[1]));
|
|
6307
|
+
else callerNamed.push(e);
|
|
6308
|
+
}
|
|
6309
|
+
const bareGap = bareIds.length > 0 ? describeChunkGap(bareIds, plannedChunks) : null;
|
|
6310
|
+
const shown = [...bareGap ? [bareGap.phrase] : [], ...callerNamed];
|
|
6311
|
+
const shownZh = [...bareGap ? [bareGap.phraseZh] : [], ...callerNamed];
|
|
6312
|
+
notReviewedParts.push({
|
|
6313
|
+
en: `Not reviewed: ${shown.join(", ")} \u2014 a line there exceeds the read limit.`,
|
|
6314
|
+
zh: `\u672A\u5BA1\u67E5\uFF1A${shownZh.join("\u3001")}\u2014\u2014\u5176\u4E2D\u6709\u4E00\u884C\u8D85\u51FA\u5355\u6B21\u8BFB\u53D6\u4E0A\u9650\u3002`
|
|
6315
|
+
});
|
|
6007
6316
|
}
|
|
6008
6317
|
const covEntries = coverageEntries;
|
|
6009
6318
|
const callerLeft = [];
|
|
@@ -6019,32 +6328,67 @@ ${footer}`, "finish");
|
|
|
6019
6328
|
const whiffedDimensions = callerLeft.filter((d) => !d.includes(" \u2014 "));
|
|
6020
6329
|
const explainedCaller = callerLeft.filter((d) => d.includes(" \u2014 "));
|
|
6021
6330
|
if (whiffedDimensions.length > 0) {
|
|
6022
|
-
notReviewedParts.push(
|
|
6023
|
-
`Not reviewed: ${whiffedDimensions.join(", ")} \u2014 the agent returned no evidence of its walk twice
|
|
6024
|
-
|
|
6331
|
+
notReviewedParts.push({
|
|
6332
|
+
en: `Not reviewed: ${whiffedDimensions.join(", ")} \u2014 the agent returned no evidence of its walk twice.`,
|
|
6333
|
+
zh: `\u672A\u5BA1\u67E5\uFF1A${whiffedDimensions.join("\u3001")}\u2014\u2014\u8BE5 agent \u8FDE\u7EED\u4E24\u6B21\u672A\u8FD4\u56DE\u4EFB\u4F55\u68C0\u67E5\u8FC7\u7A0B\u7684\u8BC1\u636E\u3002`
|
|
6334
|
+
});
|
|
6025
6335
|
}
|
|
6026
6336
|
for (const d of explainedCaller) {
|
|
6027
|
-
notReviewedParts.push(
|
|
6337
|
+
notReviewedParts.push({
|
|
6338
|
+
en: `Not reviewed: ${d}.`,
|
|
6339
|
+
zh: `\u672A\u5BA1\u67E5\uFF1A${d}\u3002`
|
|
6340
|
+
});
|
|
6028
6341
|
}
|
|
6029
6342
|
const seenSubjects = /* @__PURE__ */ new Set();
|
|
6030
6343
|
const byReason = /* @__PURE__ */ new Map();
|
|
6031
|
-
|
|
6032
|
-
|
|
6033
|
-
seenSubjects.
|
|
6034
|
-
|
|
6035
|
-
|
|
6036
|
-
byReason.
|
|
6037
|
-
|
|
6038
|
-
|
|
6039
|
-
|
|
6040
|
-
|
|
6041
|
-
);
|
|
6344
|
+
const reasonZhOf = /* @__PURE__ */ new Map();
|
|
6345
|
+
for (const e of covEntries) {
|
|
6346
|
+
if (seenSubjects.has(e.subject)) continue;
|
|
6347
|
+
seenSubjects.add(e.subject);
|
|
6348
|
+
const key = e.publicReason ?? e.reason;
|
|
6349
|
+
const group = byReason.get(key) ?? [];
|
|
6350
|
+
group.push({
|
|
6351
|
+
subject: e.subject,
|
|
6352
|
+
publicSubject: e.publicSubject,
|
|
6353
|
+
subjectZh: e.subjectZh
|
|
6354
|
+
});
|
|
6355
|
+
byReason.set(key, group);
|
|
6356
|
+
if (e.reasonZh !== void 0 && !reasonZhOf.has(key)) {
|
|
6357
|
+
reasonZhOf.set(key, e.reasonZh);
|
|
6358
|
+
}
|
|
6359
|
+
}
|
|
6360
|
+
for (const [reason, entries] of byReason) {
|
|
6361
|
+
const chunkIds = [];
|
|
6362
|
+
const named = [];
|
|
6363
|
+
const namedZh = [];
|
|
6364
|
+
for (const e of entries) {
|
|
6365
|
+
const m = /^chunk (\d+)$/.exec(e.subject);
|
|
6366
|
+
if (m) chunkIds.push(Number(m[1]));
|
|
6367
|
+
else {
|
|
6368
|
+
named.push(e.publicSubject ?? e.subject);
|
|
6369
|
+
namedZh.push(e.subjectZh ?? e.publicSubject ?? e.subject);
|
|
6370
|
+
}
|
|
6371
|
+
}
|
|
6372
|
+
const gap = chunkIds.length > 0 ? describeChunkGap(chunkIds, plannedChunks) : null;
|
|
6373
|
+
const shown = [...gap ? [gap.phrase] : [], ...named];
|
|
6374
|
+
const shownZh = [...gap ? [gap.phraseZh] : [], ...namedZh];
|
|
6375
|
+
const reasonZh = reasonZhOf.get(reason) ?? reason;
|
|
6376
|
+
notReviewedParts.push({
|
|
6377
|
+
en: reason ? `Not reviewed: ${shown.join(", ")} \u2014 ${reason}.` : `Not reviewed: ${shown.join(", ")}.`,
|
|
6378
|
+
zh: reason ? `\u672A\u5BA1\u67E5\uFF1A${shownZh.join("\u3001")}\u2014\u2014${reasonZh}\u3002` : `\u672A\u5BA1\u67E5\uFF1A${shownZh.join("\u3001")}\u3002`
|
|
6379
|
+
});
|
|
6042
6380
|
}
|
|
6043
6381
|
const cannotTellBlock = cannotTell.length === 0 ? [] : [
|
|
6044
|
-
|
|
6382
|
+
{
|
|
6383
|
+
en: `Unresolved, please confirm: ${cannotTell.map((l) => withMarker(l)).join(" ")}`,
|
|
6384
|
+
zh: `\u672A\u51B3\uFF0C\u8BF7\u786E\u8BA4\uFF1A${cannotTell.map((l) => withMarker(l)).join(" ")}`
|
|
6385
|
+
}
|
|
6045
6386
|
];
|
|
6046
|
-
const bodyCriticalBlock = bodyCriticals.map((l) => withMarker(l));
|
|
6047
|
-
const contextUnavailableClause =
|
|
6387
|
+
const bodyCriticalBlock = bodyCriticals.map((l) => withMarker(l)).map((l) => ({ en: l, zh: l }));
|
|
6388
|
+
const contextUnavailableClause = {
|
|
6389
|
+
en: "Reviewed diff-only \u2014 the PR\u2019s existing discussion could not be fetched, so this is not an approval and not a no-blockers claim.",
|
|
6390
|
+
zh: '\u4EC5\u5BA1\u67E5\u4E86 diff\u2014\u2014\u65E0\u6CD5\u83B7\u53D6 PR \u5DF2\u6709\u7684\u8BA8\u8BBA\uFF0C\u56E0\u6B64\u8FD9\u4E0D\u6784\u6210\u6279\u51C6\uFF0C\u4E5F\u4E0D\u6784\u6210"\u65E0\u963B\u65AD\u95EE\u9898"\u7684\u7ED3\u8BBA\u3002'
|
|
6391
|
+
};
|
|
6048
6392
|
if (event === "REQUEST_CHANGES") {
|
|
6049
6393
|
const parts = [
|
|
6050
6394
|
...contextUnavailable ? [contextUnavailableClause] : [],
|
|
@@ -6054,7 +6398,7 @@ ${footer}`, "finish");
|
|
|
6054
6398
|
];
|
|
6055
6399
|
return {
|
|
6056
6400
|
event,
|
|
6057
|
-
body:
|
|
6401
|
+
body: render(parts, "\n\n"),
|
|
6058
6402
|
baseEvent,
|
|
6059
6403
|
cappedBy,
|
|
6060
6404
|
downgraded,
|
|
@@ -6065,7 +6409,10 @@ ${footer}`, "finish");
|
|
|
6065
6409
|
if (event === "APPROVE") {
|
|
6066
6410
|
return {
|
|
6067
6411
|
event,
|
|
6068
|
-
body:
|
|
6412
|
+
body: render(
|
|
6413
|
+
[{ en: "No issues found. LGTM! \u2705", zh: "\u672A\u53D1\u73B0\u95EE\u9898\u3002LGTM\uFF01\u2705" }],
|
|
6414
|
+
" "
|
|
6415
|
+
),
|
|
6069
6416
|
baseEvent,
|
|
6070
6417
|
cappedBy,
|
|
6071
6418
|
downgraded,
|
|
@@ -6076,9 +6423,11 @@ ${footer}`, "finish");
|
|
|
6076
6423
|
const clauses = [];
|
|
6077
6424
|
if (downgraded && downgradedFrom) {
|
|
6078
6425
|
const reasons = downgradeReasons.join("; ");
|
|
6079
|
-
|
|
6080
|
-
|
|
6081
|
-
|
|
6426
|
+
const fromZh = downgradedFrom === "Approve" ? "\u6279\u51C6" : "\u8BF7\u6C42\u4FEE\u6539";
|
|
6427
|
+
clauses.push({
|
|
6428
|
+
en: `\u26A0\uFE0F Downgraded from ${downgradedFrom} to Comment${reasons ? `: ${reasons}` : ""}.`,
|
|
6429
|
+
zh: `\u26A0\uFE0F \u5DF2\u4ECE${fromZh}\u964D\u7EA7\u4E3A\u8BC4\u8BBA${reasons ? `\uFF1A${reasons}` : ""}\u3002`
|
|
6430
|
+
});
|
|
6082
6431
|
}
|
|
6083
6432
|
if (contextUnavailable) {
|
|
6084
6433
|
clauses.push(contextUnavailableClause);
|
|
@@ -6087,14 +6436,28 @@ ${footer}`, "finish");
|
|
|
6087
6436
|
// body could open "Reviewed — no blockers." two lines above "nobody read
|
|
6088
6437
|
// them." Nothing nobody read can be certified blocker-free.
|
|
6089
6438
|
missingReceipts.length === 0;
|
|
6090
|
-
|
|
6091
|
-
|
|
6092
|
-
|
|
6093
|
-
|
|
6439
|
+
const disclosedChunkIds = /* @__PURE__ */ new Set();
|
|
6440
|
+
for (const e of coverageEntries) {
|
|
6441
|
+
const m = /^chunk (\d+)$/.exec(e.subject);
|
|
6442
|
+
if (m) disclosedChunkIds.add(Number(m[1]));
|
|
6443
|
+
}
|
|
6444
|
+
const nothingCertified = coverageEntries.some((e) => e.subject === "coverage") || plannedChunks.length > 0 && coveredChunks.every((id) => disclosedChunkIds.has(id));
|
|
6094
6445
|
clauses.push(
|
|
6095
|
-
|
|
6446
|
+
nothingCertified ? {
|
|
6447
|
+
en: "\u26A0\uFE0F This run could not certify that any of this diff was reviewed.",
|
|
6448
|
+
zh: "\u26A0\uFE0F \u672C\u6B21\u8FD0\u884C\u65E0\u6CD5\u8BC1\u660E\u8FD9\u4E2A diff \u7684\u4EFB\u4F55\u90E8\u5206\u7ECF\u8FC7\u4E86\u5BA1\u67E5\u3002"
|
|
6449
|
+
} : canCertify ? { en: "Reviewed \u2014 no blockers.", zh: "\u5DF2\u5BA1\u67E5\u2014\u2014\u65E0\u963B\u65AD\u95EE\u9898\u3002" } : { en: "Reviewed.", zh: "\u5DF2\u5BA1\u67E5\u3002" }
|
|
6096
6450
|
);
|
|
6097
6451
|
}
|
|
6452
|
+
if (suggestionsInline > 0) {
|
|
6453
|
+
clauses.push({ en: "Suggestions are inline.", zh: "\u5EFA\u8BAE\u89C1\u884C\u5185\u8BC4\u8BBA\u3002" });
|
|
6454
|
+
}
|
|
6455
|
+
if (suggestionsDiscarded > 0) {
|
|
6456
|
+
clauses.push({
|
|
6457
|
+
en: `${suggestionsDiscarded} Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here.`,
|
|
6458
|
+
zh: `${suggestionsDiscarded} \u6761\u5EFA\u8BAE\u7EA7\u53D1\u73B0\u65E0\u6CD5\u951A\u5B9A\u5230\u6539\u52A8\u884C\uFF0C\u5DF2\u4E22\u5F03\uFF1B\u6B64\u5904\u65E0\u9700\u8FDB\u4E00\u6B65\u5904\u7406\u3002`
|
|
6459
|
+
});
|
|
6460
|
+
}
|
|
6098
6461
|
clauses.push(...cannotTellBlock);
|
|
6099
6462
|
clauses.push(...notReviewedParts);
|
|
6100
6463
|
if (downgradedFrom === "Request changes" || criticalsUnverified) {
|
|
@@ -6102,7 +6465,7 @@ ${footer}`, "finish");
|
|
|
6102
6465
|
}
|
|
6103
6466
|
return {
|
|
6104
6467
|
event,
|
|
6105
|
-
body:
|
|
6468
|
+
body: render(clauses, " "),
|
|
6106
6469
|
baseEvent,
|
|
6107
6470
|
cappedBy,
|
|
6108
6471
|
downgraded,
|
|
@@ -6111,6 +6474,46 @@ ${footer}`, "finish");
|
|
|
6111
6474
|
};
|
|
6112
6475
|
}
|
|
6113
6476
|
__name(composeReview, "composeReview");
|
|
6477
|
+
function describeChunkGap(ids, planned) {
|
|
6478
|
+
const uniq = [...new Set(ids)].sort((a, b) => a - b);
|
|
6479
|
+
const inGap = new Set(uniq);
|
|
6480
|
+
if (planned.length > 0 && planned.every((p) => inGap.has(p.id))) {
|
|
6481
|
+
return { phrase: "the entire diff", phraseZh: "\u6574\u4E2A diff", plural: false };
|
|
6482
|
+
}
|
|
6483
|
+
const byId = new Map(planned.map((p) => [p.id, p.files]));
|
|
6484
|
+
const files = [];
|
|
6485
|
+
let allKnown = planned.length > 0;
|
|
6486
|
+
for (const id of uniq) {
|
|
6487
|
+
const f = byId.get(id) ?? [];
|
|
6488
|
+
if (f.length === 0) allKnown = false;
|
|
6489
|
+
for (const p of f) {
|
|
6490
|
+
if (!files.includes(p)) files.push(p);
|
|
6491
|
+
}
|
|
6492
|
+
}
|
|
6493
|
+
if (allKnown && files.length <= 4) {
|
|
6494
|
+
return {
|
|
6495
|
+
phrase: `the diff ${uniq.length === 1 ? "section" : "sections"} covering ${files.join(", ")}`,
|
|
6496
|
+
phraseZh: `\u6D89\u53CA ${files.join("\u3001")} \u7684 diff \u7247\u6BB5`,
|
|
6497
|
+
plural: uniq.length > 1
|
|
6498
|
+
};
|
|
6499
|
+
}
|
|
6500
|
+
return {
|
|
6501
|
+
phrase: planned.length > 0 ? `${uniq.length} of the diff's ${planned.length} sections` : `${uniq.length} ${uniq.length === 1 ? "section" : "sections"} of the diff`,
|
|
6502
|
+
phraseZh: planned.length > 0 ? `diff ${planned.length} \u4E2A\u7247\u6BB5\u4E2D\u7684 ${uniq.length} \u4E2A` : `diff \u4E2D\u7684 ${uniq.length} \u4E2A\u7247\u6BB5`,
|
|
6503
|
+
plural: uniq.length > 1
|
|
6504
|
+
};
|
|
6505
|
+
}
|
|
6506
|
+
__name(describeChunkGap, "describeChunkGap");
|
|
6507
|
+
function bilingualFromPlan(planPath) {
|
|
6508
|
+
if (!planPath) return false;
|
|
6509
|
+
try {
|
|
6510
|
+
const plan = JSON.parse(readFileSync7(planPath, "utf8"));
|
|
6511
|
+
return plan?.prDescriptionHasHan === true;
|
|
6512
|
+
} catch {
|
|
6513
|
+
return false;
|
|
6514
|
+
}
|
|
6515
|
+
}
|
|
6516
|
+
__name(bilingualFromPlan, "bilingualFromPlan");
|
|
6114
6517
|
function readDraftedComments(path3) {
|
|
6115
6518
|
let raw;
|
|
6116
6519
|
try {
|
|
@@ -6633,7 +7036,7 @@ async function runFetchPr(args) {
|
|
|
6633
7036
|
"--repo",
|
|
6634
7037
|
ownerRepo,
|
|
6635
7038
|
"--json",
|
|
6636
|
-
"headRefName,headRefOid,baseRefName,additions,deletions,changedFiles,isCrossRepository"
|
|
7039
|
+
"headRefName,headRefOid,baseRefName,additions,deletions,changedFiles,isCrossRepository,body"
|
|
6637
7040
|
);
|
|
6638
7041
|
meta = JSON.parse(json);
|
|
6639
7042
|
} catch (err) {
|
|
@@ -6721,6 +7124,7 @@ async function runFetchPr(args) {
|
|
|
6721
7124
|
baseFetchFailed,
|
|
6722
7125
|
diffPath,
|
|
6723
7126
|
diffPathAbsolute,
|
|
7127
|
+
prDescriptionHasHan: new RegExp("\\p{Script=Han}", "u").test(meta.body ?? ""),
|
|
6724
7128
|
...buildPlanReport(plan, (path3) => fileLineCount(fetchedSha, path3))
|
|
6725
7129
|
};
|
|
6726
7130
|
writeFileSync5(out, stringifyPlanReport(result), "utf8");
|
|
@@ -9041,9 +9445,12 @@ ${prompt}`;
|
|
|
9041
9445
|
const paramNote = typeof wt === "string" && wt ? `
|
|
9042
9446
|
|
|
9043
9447
|
**Agent tool parameters (worktree mode):** Set \`working_dir: "${wt}"\` and \`subagent_type: "general-purpose"\`, \`run_in_background: false\` on EVERY agent call below. Do NOT set \`isolation\` \u2014 the worktree already exists; \`isolation\` creates a new copy and is mutually exclusive with \`working_dir\`.` : "";
|
|
9448
|
+
const descNote = `
|
|
9449
|
+
|
|
9450
|
+
The \`description\` parameter of each Agent call is the task name the user watches while the agent runs \u2014 write it in your output language, translating the block's \u2500\u2500\u2500\u2500\u2500 separator label (keep the role/chunk id visible). Display only: the prompt itself stays the block VERBATIM.`;
|
|
9044
9451
|
writeStdoutLine(
|
|
9045
9452
|
[
|
|
9046
|
-
`${roster.length} agents required. Launch one agent per block below, passing its block VERBATIM \u2014 copy, do not retype. The \u2500\u2500\u2500\u2500\u2500 lines are separators, not part of any prompt. This is the same roster \`check-coverage\` reads out of the plan: a block you skip or reword is a dimension nobody reviewed. Blocks are numbered \`agent k of ${roster.length}\` and the output ends with an end-of-roster line \u2014 if either is missing, this output was truncated in transit: every prompt is also recorded on disk, so rebuild just the missing blocks with --chunk <id>, or --role <r> (--file <path> for an invariant agent), plus the same --rules this call was given.` + paramNote,
|
|
9453
|
+
`${roster.length} agents required. Launch one agent per block below, passing its block VERBATIM \u2014 copy, do not retype. The \u2500\u2500\u2500\u2500\u2500 lines are separators, not part of any prompt. This is the same roster \`check-coverage\` reads out of the plan: a block you skip or reword is a dimension nobody reviewed. Blocks are numbered \`agent k of ${roster.length}\` and the output ends with an end-of-roster line \u2014 if either is missing, this output was truncated in transit: every prompt is also recorded on disk, so rebuild just the missing blocks with --chunk <id>, or --role <r> (--file <path> for an invariant agent), plus the same --rules this call was given.` + descNote + paramNote,
|
|
9047
9454
|
...blocks,
|
|
9048
9455
|
`\u2500\u2500\u2500\u2500\u2500 end of roster \u2014 ${roster.length} agents \u2500\u2500\u2500\u2500\u2500`
|
|
9049
9456
|
].join("\n\n")
|
|
@@ -9079,7 +9486,7 @@ function runAllChunks(report, planPath, role, findingsContent, rules, round) {
|
|
|
9079
9486
|
});
|
|
9080
9487
|
writeStdoutLine(
|
|
9081
9488
|
[
|
|
9082
|
-
`${chunks.length} auditors required this round \u2014 one per chunk. Launch one agent per block below, passing its block VERBATIM \u2014 copy, do not retype, and NEVER sample this output (no \`| head\`): the text IS the deliverable, and a launch reconstructed from a sample matches no record. Blocks are numbered \`auditor k of ${chunks.length}\` and the output ends with an end-of-round line \u2014 if either is missing, the output was truncated in transit; rebuild just the missing chunks with --chunk <id
|
|
9489
|
+
`${chunks.length} auditors required this round \u2014 one per chunk. Launch one agent per block below, passing its block VERBATIM \u2014 copy, do not retype, and NEVER sample this output (no \`| head\`): the text IS the deliverable, and a launch reconstructed from a sample matches no record. Blocks are numbered \`auditor k of ${chunks.length}\` and the output ends with an end-of-round line \u2014 if either is missing, the output was truncated in transit; rebuild just the missing chunks with --chunk <id>. Write each Agent call's \`description\` (the task name the user watches) in your output language, translating the separator label \u2014 display only; the prompt stays the block VERBATIM.`,
|
|
9083
9490
|
...blocks,
|
|
9084
9491
|
`\u2500\u2500\u2500\u2500\u2500 end of round \u2014 ${chunks.length} auditors \u2500\u2500\u2500\u2500\u2500`
|
|
9085
9492
|
].join("\n\n")
|
|
@@ -10778,10 +11185,10 @@ var updateCommand3 = {
|
|
|
10778
11185
|
stdioHelpers,
|
|
10779
11186
|
{ updateEventEmitter }
|
|
10780
11187
|
] = await Promise.all([
|
|
10781
|
-
import("./settings-
|
|
10782
|
-
import("./updateCheck-
|
|
10783
|
-
import("./installationInfo-
|
|
10784
|
-
import("./standalone-update-
|
|
11188
|
+
import("./settings-CR2EWTBA.js"),
|
|
11189
|
+
import("./updateCheck-RKL6M5XN.js"),
|
|
11190
|
+
import("./installationInfo-6O2YAA52.js"),
|
|
11191
|
+
import("./standalone-update-Q6WFRZZQ.js"),
|
|
10785
11192
|
import("./stdioHelpers-HGIYTWAY.js"),
|
|
10786
11193
|
import("./updateEventEmitter-5MKC7BLQ.js")
|
|
10787
11194
|
]);
|
|
@@ -10876,64 +11283,6 @@ function isValidSessionId(value) {
|
|
|
10876
11283
|
}
|
|
10877
11284
|
__name(isValidSessionId, "isValidSessionId");
|
|
10878
11285
|
var debugLogger4 = createDebugLogger("CONFIG");
|
|
10879
|
-
var EXPERIMENTAL_VISION_MODEL_ENV = "VISION_MODEL";
|
|
10880
|
-
function getExperimentalVisionConfig(settings, enabled, authType, primaryModel, primaryGenerationConfig, primaryBaseUrl) {
|
|
10881
|
-
const visionModel = process.env[EXPERIMENTAL_VISION_MODEL_ENV]?.trim();
|
|
10882
|
-
if (!enabled || !visionModel || !authType || !primaryModel || authType === "qwen-oauth" /* QWEN_OAUTH */) {
|
|
10883
|
-
return {
|
|
10884
|
-
generationConfig: primaryGenerationConfig,
|
|
10885
|
-
modelProvidersConfig: settings.modelProviders,
|
|
10886
|
-
visionModel: settings.visionModel || void 0,
|
|
10887
|
-
registryBaseUrl: void 0
|
|
10888
|
-
};
|
|
10889
|
-
}
|
|
10890
|
-
const inheritedGenerationConfig = {};
|
|
10891
|
-
for (const field of MODEL_GENERATION_CONFIG_FIELDS) {
|
|
10892
|
-
const value = primaryGenerationConfig?.[field];
|
|
10893
|
-
if (value !== void 0) {
|
|
10894
|
-
Object.assign(inheritedGenerationConfig, { [field]: value });
|
|
10895
|
-
}
|
|
10896
|
-
}
|
|
10897
|
-
inheritedGenerationConfig.modalities = {
|
|
10898
|
-
...inheritedGenerationConfig.modalities,
|
|
10899
|
-
image: true
|
|
10900
|
-
};
|
|
10901
|
-
const configuredModels = settings.modelProviders?.[authType] ?? [];
|
|
10902
|
-
const primaryIndex = configuredModels.findIndex(
|
|
10903
|
-
(model) => model.id === primaryModel && (!model.baseUrl || model.baseUrl === primaryBaseUrl)
|
|
10904
|
-
);
|
|
10905
|
-
const configuredPrimary = configuredModels[primaryIndex];
|
|
10906
|
-
const primaryEntry = {
|
|
10907
|
-
...configuredPrimary,
|
|
10908
|
-
id: primaryModel,
|
|
10909
|
-
...primaryBaseUrl && { baseUrl: primaryBaseUrl },
|
|
10910
|
-
generationConfig: inheritedGenerationConfig
|
|
10911
|
-
};
|
|
10912
|
-
const syntheticVisionEntry = {
|
|
10913
|
-
id: visionModel,
|
|
10914
|
-
...primaryBaseUrl && { baseUrl: primaryBaseUrl },
|
|
10915
|
-
capabilities: { vision: true, agent: true },
|
|
10916
|
-
generationConfig: inheritedGenerationConfig
|
|
10917
|
-
};
|
|
10918
|
-
const remainingModels = configuredModels.filter(
|
|
10919
|
-
(model, index) => index !== primaryIndex && !(model.id === visionModel && (!model.baseUrl || model.baseUrl === primaryBaseUrl))
|
|
10920
|
-
);
|
|
10921
|
-
const modelProvidersConfig = {
|
|
10922
|
-
...settings.modelProviders,
|
|
10923
|
-
[authType]: [primaryEntry, syntheticVisionEntry, ...remainingModels]
|
|
10924
|
-
};
|
|
10925
|
-
const qualifiedVisionModel = `${authType}:${visionModel}`;
|
|
10926
|
-
return {
|
|
10927
|
-
generationConfig: {
|
|
10928
|
-
...primaryGenerationConfig,
|
|
10929
|
-
modalities: inheritedGenerationConfig.modalities
|
|
10930
|
-
},
|
|
10931
|
-
modelProvidersConfig,
|
|
10932
|
-
visionModel: primaryBaseUrl ? `${qualifiedVisionModel}\0${primaryBaseUrl}` : qualifiedVisionModel,
|
|
10933
|
-
registryBaseUrl: primaryBaseUrl || null
|
|
10934
|
-
};
|
|
10935
|
-
}
|
|
10936
|
-
__name(getExperimentalVisionConfig, "getExperimentalVisionConfig");
|
|
10937
11286
|
function resolveLocaleForExtensions(settings) {
|
|
10938
11287
|
const envLang = process.env["QWEN_CODE_LANG"];
|
|
10939
11288
|
if (envLang) return envLang;
|
|
@@ -11890,14 +12239,6 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
|
|
|
11890
12239
|
env: process.env
|
|
11891
12240
|
});
|
|
11892
12241
|
const { model: resolvedModel } = resolvedCliConfig;
|
|
11893
|
-
const experimentalVisionConfig = getExperimentalVisionConfig(
|
|
11894
|
-
settings,
|
|
11895
|
-
!interactive && !argv.acp && !argv.experimentalAcp,
|
|
11896
|
-
selectedAuthType,
|
|
11897
|
-
resolvedModel,
|
|
11898
|
-
resolvedCliConfig.generationConfig,
|
|
11899
|
-
resolvedCliConfig.baseUrl
|
|
11900
|
-
);
|
|
11901
12242
|
const toolSearchExplicitlyEnabled = settings.tools?.toolSearch?.enabled;
|
|
11902
12243
|
const shouldDisableToolSearch = toolSearchExplicitlyEnabled === false || toolSearchExplicitlyEnabled === void 0 && resolvedModel !== void 0 && /deepseek-(v3|v4|chat)/i.test(resolvedModel);
|
|
11903
12244
|
if (shouldDisableToolSearch) {
|
|
@@ -11970,7 +12311,7 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
|
|
|
11970
12311
|
}
|
|
11971
12312
|
sessionId = argv["sessionId"];
|
|
11972
12313
|
}
|
|
11973
|
-
const modelProvidersConfig =
|
|
12314
|
+
const modelProvidersConfig = settings.modelProviders;
|
|
11974
12315
|
const providerProtocolConfig = settings.providerProtocol;
|
|
11975
12316
|
const cliMcpServers = parseMcpConfig(argv.mcpConfig);
|
|
11976
12317
|
const topTierMcpServers = sessionMcpServers || cliMcpServers ? { ...sessionMcpServers, ...cliMcpServers ?? {} } : void 0;
|
|
@@ -11995,6 +12336,9 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
|
|
|
11995
12336
|
excludeTools: mergedDeny,
|
|
11996
12337
|
disabledSlashCommands: disabledSlashCommands.length > 0 ? disabledSlashCommands : void 0,
|
|
11997
12338
|
disabledSkillNamesProvider: bareMode || safeMode ? void 0 : disabledSkillNamesProvider,
|
|
12339
|
+
customSkillDirs: bareMode || safeMode ? void 0 : (Array.isArray(settings.skills?.directories) ? settings.skills.directories : []).filter(
|
|
12340
|
+
(d) => typeof d === "string" && d.trim().length > 0
|
|
12341
|
+
).map((d) => d.trim()),
|
|
11998
12342
|
disabledTools: disabledTools.length > 0 ? disabledTools : void 0,
|
|
11999
12343
|
visibleTools: visibleTools.length > 0 ? visibleTools : void 0,
|
|
12000
12344
|
// New unified permissions (PermissionManager source of truth).
|
|
@@ -12033,14 +12377,13 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
|
|
|
12033
12377
|
},
|
|
12034
12378
|
showResponseTokensPerSecond: settings.ui?.showResponseTokensPerSecond === true,
|
|
12035
12379
|
telemetry: telemetrySettings,
|
|
12036
|
-
// Ordinary interactive TUI defers telemetry until after first paint
|
|
12037
|
-
//
|
|
12038
|
-
//
|
|
12039
|
-
// "prompt"`
|
|
12040
|
-
|
|
12041
|
-
deferTelemetryInitialization: interactive && !isAcpMode && !question,
|
|
12380
|
+
// Ordinary interactive TUI defers telemetry until after first paint; ACP
|
|
12381
|
+
// defers it until after the initialize response is written. Events emitted
|
|
12382
|
+
// before deferred init are an accepted startup-latency tradeoff. `qwen -i
|
|
12383
|
+
// "prompt"` still initializes eagerly because it auto-submits after render.
|
|
12384
|
+
deferTelemetryInitialization: isAcpMode || interactive && !question,
|
|
12042
12385
|
outboundCorrelation: settings.outboundCorrelation,
|
|
12043
|
-
usageStatisticsEnabled: settings.privacy?.usageStatisticsEnabled ?? true,
|
|
12386
|
+
usageStatisticsEnabled: parseBooleanEnvFlag(process.env["QWEN_USAGE_STATISTICS_ENABLED"]) ?? settings.privacy?.usageStatisticsEnabled ?? true,
|
|
12044
12387
|
clearContextOnIdle: settings.context?.clearContextOnIdle,
|
|
12045
12388
|
fileFiltering: settings.context?.fileFiltering,
|
|
12046
12389
|
plansDirectory: settings.plansDirectory,
|
|
@@ -12101,8 +12444,8 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
|
|
|
12101
12444
|
modelProvidersConfig,
|
|
12102
12445
|
providerProtocolConfig,
|
|
12103
12446
|
generationConfigSources: resolvedCliConfig.sources,
|
|
12104
|
-
generationConfig:
|
|
12105
|
-
initialModelRegistryBaseUrl:
|
|
12447
|
+
generationConfig: resolvedCliConfig.generationConfig,
|
|
12448
|
+
initialModelRegistryBaseUrl: resolvedCliConfig.registryBaseUrl,
|
|
12106
12449
|
warnings: resolvedCliConfig.warnings,
|
|
12107
12450
|
bareMode,
|
|
12108
12451
|
safeMode,
|
|
@@ -12142,7 +12485,8 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
|
|
|
12142
12485
|
memoryAgentTimeoutMinutes: settings.memory?.agentTimeoutMinutes,
|
|
12143
12486
|
fastModel: settings.fastModel || void 0,
|
|
12144
12487
|
webSearch: bareMode || safeMode ? void 0 : resolveWebSearchSettings(settings),
|
|
12145
|
-
visionModel:
|
|
12488
|
+
visionModel: settings.visionModel || void 0,
|
|
12489
|
+
imageModel: settings.imageModel || void 0,
|
|
12146
12490
|
visionBridgeTimeoutMs: settings.visionBridgeTimeoutMs,
|
|
12147
12491
|
modelFallbacks: resolveModelFallbacks(
|
|
12148
12492
|
argv.fallbackModel,
|