@qwen-code/qwen-code 0.19.2 → 0.19.3-nightly.20260630.e00fe6a27
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/extension-creator/SKILL.md +357 -0
- package/bundled/loop/SKILL.md +21 -7
- package/bundled/loop/SKILL.test.ts +41 -0
- package/bundled/loop/loop-task-file.test.ts +1064 -0
- package/bundled/loop/loop-task-file.ts +404 -0
- package/bundled/loop/loop-tick-resolver.test.ts +665 -0
- package/bundled/loop/loop-tick-resolver.ts +347 -0
- package/bundled/qc-helper/SKILL.md +26 -19
- package/bundled/qc-helper/docs/configuration/auth.md +11 -11
- package/bundled/qc-helper/docs/configuration/model-providers.md +13 -13
- package/bundled/qc-helper/docs/configuration/settings.md +76 -75
- package/bundled/qc-helper/docs/features/channels/plugins.md +1 -1
- package/bundled/qc-helper/docs/features/commands.md +108 -77
- package/bundled/qc-helper/docs/features/hooks.md +6 -1
- package/bundled/qc-helper/docs/features/memory.md +52 -0
- package/bundled/qc-helper/docs/qwen-serve.md +24 -2
- package/bundled/qc-helper/docs/support/tos-privacy.md +16 -3
- package/bundled/qc-helper/docs/support/troubleshooting.md +6 -0
- package/chunks/{MaxSizedBox-7RERNLFK.js → MaxSizedBox-T5X5MN5Q.js} +29 -27
- package/chunks/{StandaloneSessionPicker-S22XBSN6.js → StandaloneSessionPicker-P3E3WTOQ.js} +42 -37
- package/chunks/{acpAgent-4MCETHF2.js → acpAgent-QEP6DXFW.js} +864 -175
- package/chunks/{agent-K3ENVYSB.js → agent-UDANDUF7.js} +24 -23
- package/chunks/{agent-headless-HO3V3A3A.js → agent-headless-KYVSZHSO.js} +24 -23
- package/chunks/{anthropicContentGenerator-E3TQ5XJJ.js → anthropicContentGenerator-KWSJAQ7B.js} +33 -12
- package/chunks/{artifact-tool-QA4KRO3B.js → artifact-tool-D2X7G3C3.js} +2 -2
- package/chunks/{askUserQuestion-HMWXW6VN.js → askUserQuestion-UGETICJQ.js} +2 -2
- package/chunks/{bridge-4LV2HBH2.js → bridge-X42LXPTA.js} +31 -30
- package/chunks/{ca-7WC7ELX6.js → ca-IUFWESZL.js} +1 -0
- package/chunks/{chunk-JXQ23SNT.js → chunk-2JKEQWDZ.js} +623 -78
- package/chunks/{chunk-2TJ3YN6Q.js → chunk-2RJA6J57.js} +416 -401
- package/chunks/{chunk-3UALQ56H.js → chunk-3227DZO4.js} +1 -1
- package/chunks/{chunk-BGUDAULQ.js → chunk-3CPCDXFR.js} +5 -5
- package/chunks/{chunk-5RVSM6NW.js → chunk-3HUHAQF3.js} +1 -1
- package/chunks/{chunk-D5E5TMYH.js → chunk-3M4W4U5G.js} +16 -2
- package/chunks/{chunk-DBZUXSSV.js → chunk-4X7NIEQJ.js} +3 -3
- package/chunks/chunk-5GOVVXEV.js +73 -0
- package/chunks/{chunk-2BAQ3ACS.js → chunk-5SM4VT6V.js} +405 -5
- package/chunks/{chunk-NYOHZYHM.js → chunk-5XQ4A26L.js} +45 -3
- package/chunks/{chunk-CI5O6SQL.js → chunk-6FKEVYCD.js} +4 -4
- package/chunks/{chunk-ZD3NW5KL.js → chunk-7LM4XHPE.js} +63 -9
- package/chunks/chunk-7UNP2XM7.js +840 -0
- package/chunks/{chunk-OQHQHJRK.js → chunk-ARYCHZ4B.js} +151 -4775
- package/chunks/chunk-BC3C4F3Q.js +40 -0
- package/chunks/{chunk-CGEGHF2C.js → chunk-BKXBARJZ.js} +1 -1
- package/chunks/chunk-BMFMJINR.js +45 -0
- package/chunks/chunk-BOJWHRMX.js +11273 -0
- package/chunks/{chunk-CGOMICBE.js → chunk-BSZEQNUA.js} +34 -1
- package/chunks/{chunk-OIC6S73E.js → chunk-BUUQ5HPX.js} +1 -1
- package/chunks/{chunk-2BIF2NVV.js → chunk-BVSVIN45.js} +2 -2
- package/chunks/{chunk-TOEGRAVX.js → chunk-BX5YO7UW.js} +17 -5
- package/chunks/{chunk-4W4T77MO.js → chunk-BXVWV4GI.js} +109 -6
- package/chunks/{chunk-VQRYPFCV.js → chunk-CYHVPQYT.js} +10 -460
- package/chunks/{chunk-PRYMDRBV.js → chunk-DDMOU62Q.js} +1 -1
- package/chunks/{chunk-S566HKUS.js → chunk-DHXWNSJA.js} +15 -1
- package/chunks/{chunk-F6XNTYNE.js → chunk-E6XQPQXW.js} +30 -307
- package/chunks/{chunk-QBZ22PQX.js → chunk-EWALXUAD.js} +3 -1
- package/chunks/{chunk-EL5IHQON.js → chunk-EWYQFWYF.js} +6 -27
- package/chunks/{chunk-HG6YKEBI.js → chunk-F2DOT6UZ.js} +161 -30
- package/chunks/{chunk-JTYRZODB.js → chunk-FOOIZCWL.js} +16 -7
- package/chunks/{chunk-EX4W6ZYG.js → chunk-G5G4TFZ7.js} +1 -1
- package/chunks/{chunk-EW6C27XX.js → chunk-GEHVIWAT.js} +9 -3
- package/chunks/chunk-HEVBZSXG.js +4923 -0
- package/chunks/chunk-HFQ2XSE7.js +690 -0
- package/chunks/{chunk-PF523XJX.js → chunk-HPGTGMP3.js} +1 -1
- package/chunks/{chunk-OTBK43JR.js → chunk-HYCC3XM3.js} +1 -1
- package/chunks/{chunk-TMBPDHXD.js → chunk-I4H7PRWQ.js} +1 -1
- package/chunks/{chunk-EEEZIVFJ.js → chunk-JOLIREYR.js} +1 -1
- package/chunks/{chunk-TZM5JIAX.js → chunk-JYPQTRA3.js} +10 -7
- package/chunks/chunk-K5XU6E4T.js +167 -0
- package/chunks/{chunk-BS64PXY3.js → chunk-KFVU7ODN.js} +1 -1
- package/chunks/{chunk-3RJ3ZPPR.js → chunk-KKQWC6WS.js} +7 -7
- package/chunks/{chunk-3QFE4OTE.js → chunk-LBW7NW7X.js} +4 -4
- package/chunks/{chunk-Z7XXFPGP.js → chunk-LDWTYE33.js} +1 -1
- package/chunks/{chunk-EXMX5YHG.js → chunk-LP5E4YIH.js} +1 -1
- package/chunks/{chunk-ZUAXI2OA.js → chunk-M2U5NM24.js} +188 -11366
- package/chunks/{chunk-I5T6PIBQ.js → chunk-MBV2CTRL.js} +1010 -925
- package/chunks/{chunk-5JZLXFPD.js → chunk-MTHMXSNT.js} +11 -11
- package/chunks/{chunk-FPACXT7T.js → chunk-MTJVHQDP.js} +534 -164
- package/chunks/chunk-NDOC6M5S.js +481 -0
- package/chunks/{chunk-HGNSRCRB.js → chunk-NL4C3H6C.js} +1 -1
- package/chunks/{chunk-GZCJS5WH.js → chunk-O2VBQ3Y2.js} +2 -2
- package/chunks/{chunk-UN3C6GOR.js → chunk-PPFWEV7G.js} +10 -108
- package/chunks/{chunk-RS4HRC75.js → chunk-QI2CFVRF.js} +85 -8
- package/chunks/{chunk-XU5P23GN.js → chunk-QLDPRILK.js} +3 -3
- package/chunks/chunk-QYUE6W3T.js +123 -0
- package/chunks/{chunk-USGMPVOY.js → chunk-R3LHDWF2.js} +21 -12
- package/chunks/{chunk-BNXANYLH.js → chunk-RD6YJJJ6.js} +81 -1
- package/chunks/{chunk-PXFFKNCO.js → chunk-RIP623NO.js} +4877 -2469
- package/chunks/{chunk-XKBP7M7A.js → chunk-RYBSUGOR.js} +142 -30
- package/chunks/{chunk-BG4BIP7F.js → chunk-SBBN4BWR.js} +4 -2
- package/chunks/{chunk-T2VDEFUU.js → chunk-SKQZZVAV.js} +2 -2
- package/chunks/{chunk-5R4SBCX6.js → chunk-SL5MOGQH.js} +3 -3
- package/chunks/chunk-SMXULRAN.js +37 -0
- package/chunks/{chunk-WA5OJGFL.js → chunk-SS6WJMQK.js} +363 -76
- package/chunks/{chunk-UAARVVBI.js → chunk-TNWFHGN6.js} +1 -1
- package/chunks/{chunk-I2RFAW6Q.js → chunk-TT6Q3EN4.js} +7 -5
- package/chunks/chunk-UAKXW3DN.js +30 -0
- package/chunks/{chunk-C4K3FEQ2.js → chunk-UX4SGCGN.js} +32 -3
- package/chunks/{chunk-J6AW7O5D.js → chunk-WHDQZHRU.js} +2 -2
- package/chunks/{chunk-WGAEWQTF.js → chunk-WN6K47NR.js} +1 -2
- package/chunks/{chunk-UAARJR2G.js → chunk-WQT5SOI6.js} +2 -2
- package/chunks/{chunk-VYFMN7C6.js → chunk-WUMVIRTN.js} +225 -37
- package/chunks/{chunk-R36VMVEP.js → chunk-XJMKOTVV.js} +5 -5
- package/chunks/{chunk-TXVGVZYR.js → chunk-XJYUPHRC.js} +3 -3
- package/chunks/{chunk-2JD55C6G.js → chunk-Y6YMRS3U.js} +2 -2
- package/chunks/{chunk-LLFFKXZZ.js → chunk-YALKC62D.js} +56 -29
- package/chunks/{chunk-GYZQA2FO.js → chunk-YLZJCUH6.js} +1 -1
- package/chunks/chunk-YTFBURQD.js +313 -0
- package/chunks/{chunk-KBXLIVWQ.js → chunk-ZFPRYHWR.js} +2 -2
- package/chunks/{chunk-X6EDWN44.js → chunk-ZP6UKOPB.js} +1 -1
- package/chunks/{computer-use-6BBRNT6S.js → computer-use-LF2S6LUZ.js} +103 -49
- package/chunks/{contextCommand-UJAJ6N57.js → contextCommand-VPX5UG55.js} +26 -25
- package/chunks/{cron-create-4KQE6YLH.js → cron-create-SKEY55RG.js} +4 -4
- package/chunks/{cron-delete-THME66UP.js → cron-delete-I3NAT32Z.js} +6 -6
- package/chunks/{cron-list-7A54SJ5N.js → cron-list-6XRRL6TH.js} +5 -5
- package/chunks/{daemon-status-provider-CSL3BUOY.js → daemon-status-provider-5JAWZS4V.js} +34 -34
- package/chunks/{de-ACHALDED.js → de-EOW5PVHF.js} +1 -0
- package/chunks/{dist-BD27IA3L.js → dist-4FCNM6KJ.js} +2 -2
- package/chunks/{dist-OD2FY543.js → dist-O3H4PABL.js} +2 -2
- package/chunks/{dist-BOOH5JWN.js → dist-SCAAUWPS.js} +18 -4
- package/chunks/{dist-QHJRBCMP.js → dist-UKPWQJCL.js} +44 -2
- package/chunks/{dist-QFFZWACU.js → dist-VD7HXTML.js} +20 -9
- package/chunks/{earlyInputCapture-X6KMCSHD.js → earlyInputCapture-7FRQMU4P.js} +25 -24
- package/chunks/{edit-7J6WXARF.js → edit-REKJDIRL.js} +68 -27
- package/chunks/{en-NCUBOJOY.js → en-HPWEJBTR.js} +8 -0
- package/chunks/{enter-worktree-KULCKJPJ.js → enter-worktree-GBKUDCD3.js} +24 -23
- package/chunks/{enterPlanMode-H2CIOLMH.js → enterPlanMode-WB3Y4FGT.js} +24 -23
- package/chunks/{errors-6G2JYR54.js → errors-2XJDYO3M.js} +26 -25
- package/chunks/{exit-worktree-ECBWBVC5.js → exit-worktree-KKC7O2ZV.js} +24 -23
- package/chunks/{exitPlanMode-DQV56GTW.js → exitPlanMode-7HMS3TF7.js} +24 -23
- package/chunks/{fast-path-35JJFS3C.js → fast-path-XVNIYWGG.js} +4 -4
- package/chunks/{fast-path-settings-TSVI53EB.js → fast-path-settings-UQLRFDQP.js} +3 -2
- package/chunks/{fr-GVKZ27MF.js → fr-BN5NKSAC.js} +1 -0
- package/chunks/{gemini-NDTG7WAX.js → gemini-U5TPU3IQ.js} +210 -104
- package/chunks/{geminiContentGenerator-XTG6SFLA.js → geminiContentGenerator-ZVWRHXOO.js} +4 -4
- package/chunks/{glob-SJ2JBZK4.js → glob-FEJWIH2W.js} +24 -23
- package/chunks/{grep-BRMWFEWR.js → grep-KMP25IIA.js} +24 -23
- package/chunks/{headlessSafetyWarnings-LJ6FJX77.js → headlessSafetyWarnings-5DEDET4M.js} +24 -23
- package/chunks/{initializer-P5AXF7PV.js → initializer-FJTACLOH.js} +31 -28
- package/chunks/{ja-FKZ2WZ4D.js → ja-7DEUB2TS.js} +1 -0
- package/chunks/{keychain-token-storage-CSYMNRPP.js → keychain-token-storage-YLMDLKXT.js} +2 -2
- package/chunks/{list-6COK34BP.js → list-SCQXYJUW.js} +32 -29
- package/chunks/{loadedSettingsAdapter-XIUTN245.js → loadedSettingsAdapter-P6KPNAG7.js} +30 -27
- package/chunks/{loop-wakeup-33GPXJLA.js → loop-wakeup-FYEQEJUA.js} +7 -7
- package/chunks/{ls-BYQY7RVV.js → ls-R5WP4BGZ.js} +4 -4
- package/chunks/{lsp-X54RO4IV.js → lsp-GSICJMMW.js} +2 -2
- package/chunks/{monitor-DH7KFSJV.js → monitor-JU3HHHVY.js} +24 -23
- package/chunks/nonInteractiveCli-IZEKUHU3.js +100 -0
- package/chunks/{notebook-edit-D4R4ZLMA.js → notebook-edit-YHY3Z2QQ.js} +52 -23
- package/chunks/{openaiContentGenerator-F74IPQ6E.js → openaiContentGenerator-4WUVA3Q2.js} +13 -12
- package/chunks/{pt-SY5NCFGR.js → pt-TNZRNLQB.js} +1 -0
- package/chunks/{qwenContentGenerator-ATTK5P4D.js → qwenContentGenerator-MVYYR44B.js} +26 -25
- package/chunks/{qwenOAuth2-K4AASPCV.js → qwenOAuth2-6HNGHALT.js} +5 -4
- package/chunks/{read-file-767G23OY.js → read-file-NABEO2X4.js} +8 -8
- package/chunks/{read-mcp-resource-I5HCZJ6X.js → read-mcp-resource-DQQW7H7T.js} +2 -2
- package/chunks/{ripGrep-4OMMGSWX.js → ripGrep-YXLK6UTX.js} +24 -23
- package/chunks/{ru-FWNXJG4F.js → ru-NIAUBKCN.js} +1 -0
- package/chunks/{run-qwen-serve-REKSTYRA.js → run-qwen-serve-4B5QBMLQ.js} +144 -41
- package/chunks/{scheduler-UNTFDQLG.js → scheduler-XAKIYBDL.js} +24 -23
- package/chunks/{send-message-2DAFXEYP.js → send-message-EE4TWKVU.js} +2 -2
- package/chunks/{serve-KZ56QB5S.js → serve-4RXVLUKD.js} +30 -28
- package/chunks/{server-BV5TZUMU.js → server-7PA5QGIA.js} +11037 -8747
- package/chunks/{session-OIBXFSGD.js → session-WNVWRYAH.js} +194 -57
- package/chunks/{settings-WJTCBIRA.js → settings-YJH32TFF.js} +30 -27
- package/chunks/{shell-WC52IBHW.js → shell-YFLABOS5.js} +24 -23
- package/chunks/{skill-U7F7JR4M.js → skill-N3J7FUAY.js} +38 -11
- package/chunks/{spawnChannel-EI2E5BCW.js → spawnChannel-D6WVMFZJ.js} +26 -25
- package/chunks/{src-4F6FBZFI.js → src-IU5GDBEH.js} +88 -28
- package/chunks/{startInteractiveUI-SFRVB3CE.js → startInteractiveUI-QIPQTRT4.js} +2784 -2474
- package/chunks/{syntheticOutput-PPS3HDVA.js → syntheticOutput-T5YHQ6S2.js} +3 -3
- package/chunks/{task-create-OUYCA553.js → task-create-BLY7RHXX.js} +6 -6
- package/chunks/{task-list-WAX7I2IA.js → task-list-3QUYNVYR.js} +5 -5
- package/chunks/{task-stop-CAIL6FNH.js → task-stop-U4RATK2V.js} +2 -2
- package/chunks/{task-update-AHEO5OUT.js → task-update-U54O7KJX.js} +6 -6
- package/chunks/{team-create-3WC7CIIW.js → team-create-TP4CLLM3.js} +24 -23
- package/chunks/{team-delete-HGHFG23B.js → team-delete-LKBYPASD.js} +5 -5
- package/chunks/{theme-manager-DICFCT3P.js → theme-manager-N2TBIBZT.js} +25 -24
- package/chunks/{todoWrite-IFBMN3FH.js → todoWrite-OYXKTVYN.js} +4 -4
- package/chunks/{tool-search-L5K7HLER.js → tool-search-GBBSICYB.js} +101 -16
- package/chunks/trustedFolders-F7TBU5CD.js +76 -0
- package/chunks/types-QX5C3CHJ.js +12 -0
- package/chunks/{validateNonInterActiveAuth-GCH4Z6KI.js → validateNonInterActiveAuth-EQDQPSMI.js} +55 -50
- package/chunks/{web-fetch-B5IIQ5TT.js → web-fetch-PCVCML2X.js} +29 -15
- package/chunks/{workflow-OB3AND7I.js → workflow-ANJ4FYBK.js} +32 -30
- package/chunks/{workspace-providers-status-ZIR5EPOO.js → workspace-providers-status-462QQKQM.js} +32 -29
- package/chunks/workspace-service-VTG4G6CW.js +75 -0
- package/chunks/{write-file-SEXBNDZM.js → write-file-3P3WMQQW.js} +63 -27
- package/chunks/{zh-RBEGQVQT.js → zh-5EUYXASN.js} +8 -0
- package/chunks/{zh-TW-QGAVRXT3.js → zh-TW-TR3XYGE5.js} +8 -0
- package/cli-entry.js +20 -9
- package/cli.js +6 -6
- package/locales/ca.js +2 -0
- package/locales/de.js +2 -0
- package/locales/en.js +14 -0
- package/locales/fr.js +2 -0
- package/locales/ja.js +1 -0
- package/locales/pt.js +2 -0
- package/locales/ru.js +2 -0
- package/locales/zh-TW.js +12 -0
- package/locales/zh.js +12 -0
- package/node_modules/@qwen-code/audio-capture/dist/index.d.ts +35 -0
- package/node_modules/@qwen-code/audio-capture/dist/index.js +48 -0
- package/node_modules/@qwen-code/audio-capture/dist/index.js.map +1 -0
- package/node_modules/@qwen-code/audio-capture/dist/platform.d.ts +7 -0
- package/node_modules/@qwen-code/audio-capture/dist/platform.js +18 -0
- package/node_modules/@qwen-code/audio-capture/dist/platform.js.map +1 -0
- package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/LICENSE +21 -0
- package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/README.md +58 -0
- package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/SECURITY.md +5 -0
- package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/bin.js +84 -0
- package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/build-test.js +19 -0
- package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/index.js +6 -0
- package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/node-gyp-build.js +207 -0
- package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/optional.js +7 -0
- package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/package.json +43 -0
- package/node_modules/@qwen-code/audio-capture/package.json +30 -0
- package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-arm64/@qwen-code+audio-capture.node +0 -0
- package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-x64/@qwen-code+audio-capture.node +0 -0
- package/node_modules/@qwen-code/audio-capture/prebuilds/linux-arm64/@qwen-code+audio-capture.node +0 -0
- package/node_modules/@qwen-code/audio-capture/prebuilds/linux-x64/@qwen-code+audio-capture.node +0 -0
- package/node_modules/@qwen-code/audio-capture/prebuilds/win32-x64/@qwen-code+audio-capture.node +0 -0
- package/package.json +18 -6
- package/patches/chrome-devtools-mcp+1.4.0.patch +31 -0
- package/postinstall.js +50 -0
- package/web-shell/assets/{arc-D_ae_Y9k.js → arc-DIemsO_F.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-BMLRjppa.js → architectureDiagram-3BPJPVTR-CTlUvIQv.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-qVDQC8KL.js → blockDiagram-GPEHLZMM-DG0jmIZK.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-CxWS6MBd.js → c4Diagram-AAUBKEIU-WljDBi55.js} +1 -1
- package/web-shell/assets/channel-CbzRbdpA.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-BtNuY5Yp.js → chunk-2J33WTMH-8nc6onr2.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-BU-x368d.js → chunk-4BX2VUAB-EopXix8Z.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-DRgTLvBu.js → chunk-55IACEB6-BE4Jz3N3.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-D2aElv7q.js → chunk-727SXJPM-C_eErgDN.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-BwHCMRQ0.js → chunk-AQP2D5EJ-DFtVW-Is.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-BMyPH-ku.js → chunk-FMBD7UC4-CJPyxIg9.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-BNKTstUf.js → chunk-ND2GUHAM-Bk-xgj6M.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-gD3vsFId.js → chunk-QZHKN3VN-p3Y4yaFB.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-BFdyQ52h.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BFdyQ52h.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-BG9FAsXE.js → cose-bilkent-S5V4N54A-BCMO6Js3.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-Cy1sR7om.js → dagre-BM42HDAG-DUMrwASf.js} +1 -1
- package/web-shell/assets/default-aEtf0G7-.svg +1 -0
- package/web-shell/assets/{diagram-2AECGRRQ-Bxi1I_Vu.js → diagram-2AECGRRQ-C5d7qJbL.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-BGCJjO6y.js → diagram-5GNKFQAL-CjLzMhbT.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-CMTeLXp7.js → diagram-KO2AKTUF-RCoNWeAm.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-BN1wyAGh.js → diagram-LMA3HP47-KThXjaNV.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-UYSG_zcp.js → diagram-OG6HWLK6-DKsC2BWz.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-DqXL08lw.js → erDiagram-TEJ5UH35-DJ2ukmq0.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-BPJ9SFji.js → flowDiagram-I6XJVG4X-zzqaARRX.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-BEd9Pnms.js → ganttDiagram-6RSMTGT7-kFUg-gqT.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-DrNRH3oi.js → gitGraphDiagram-PVQCEYII-C6JnMVzD.js} +1 -1
- package/web-shell/assets/index-B3XUm7dw.js +713 -0
- package/web-shell/assets/index-CHmzAWys.css +5 -0
- package/web-shell/assets/{infoDiagram-5YYISTIA-CFYBrkVI.js → infoDiagram-5YYISTIA-XqPVhp89.js} +1 -1
- package/web-shell/assets/insert-DmRbh9Rv.svg +1 -0
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-Dxsddth7.js → ishikawaDiagram-YF4QCWOH-D2k8sGpf.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-DxaDK80t.js → journeyDiagram-JHISSGLW-CQEST1GE.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-Q0jQCOct.js → kanban-definition-UN3LZRKU-DZ7kqVBC.js} +1 -1
- package/web-shell/assets/{linear-DGGM2kcP.js → linear-B6C_6q_E.js} +1 -1
- package/web-shell/assets/{mermaid.core-ByoxnWut.js → mermaid.core-CsyNP1qt.js} +5 -5
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-C0ZseHsi.js → mindmap-definition-RKZ34NQL-B1VDIzJq.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-MQXNhl5A.js → pieDiagram-4H26LBE5-DN0E7Jwu.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-DIR4ee2A.js → quadrantDiagram-W4KKPZXB-UKTQdHKm.js} +1 -1
- package/web-shell/assets/queue-DWpnpFgW.svg +1 -0
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-BTR0UdYQ.js → requirementDiagram-4Y6WPE33-BRGceQvN.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-sfnhMELN.js → sankeyDiagram-5OEKKPKP-2DDyu41v.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-DXczHOHH.js → sequenceDiagram-3UESZ5HK-CT5iE8ZU.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-DdE_KQFH.js → stateDiagram-AJRCARHV-CqMQ_s4G.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-CamhV5pM.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-DIc61uE8.js → timeline-definition-PNZ67QCA-Di37QSZU.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-BF7ODmxB.js → vennDiagram-CIIHVFJN-DCXvpz5S.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-3pc1MEaw.js → wardley-L42UT6IY-CpUCk6OX.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-9jnPcZuP.js → wardleyDiagram-YWT4CUSO-D01pVEBg.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-DcthaZK6.js → xychartDiagram-2RQKCTM6-DOu5JDoz.js} +1 -1
- package/web-shell/index.html +2 -2
- package/chunks/chunk-B6HQGTYR.js +0 -410
- package/chunks/chunk-R2BXK7SX.js +0 -13
- package/chunks/chunk-RKIZXJMB.js +0 -13
- package/chunks/nonInteractiveCli-7575LBXP.js +0 -91
- package/chunks/workspace-service-OM5D4OI2.js +0 -60
- package/web-shell/assets/channel-DYPNiTww.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-p_g25Tni.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-p_g25Tni.js +0 -1
- package/web-shell/assets/index-CpOXWDPh.js +0 -714
- package/web-shell/assets/index-oVK7qhre.css +0 -5
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BHUSEndU.js +0 -1
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
// Force strict mode and setup for ESM
|
|
2
|
+
"use strict";
|
|
3
|
+
import {
|
|
4
|
+
require_undici
|
|
5
|
+
} from "./chunk-M2U5NM24.js";
|
|
6
|
+
import {
|
|
7
|
+
writeStderrLine
|
|
8
|
+
} from "./chunk-Y6Z2O3WR.js";
|
|
9
|
+
import {
|
|
10
|
+
createDebugLogger
|
|
11
|
+
} from "./chunk-UX4SGCGN.js";
|
|
12
|
+
import {
|
|
13
|
+
init_esbuild_shims
|
|
14
|
+
} from "./chunk-A4BMJM77.js";
|
|
15
|
+
import {
|
|
16
|
+
__name,
|
|
17
|
+
__toESM
|
|
18
|
+
} from "./chunk-J2S4EL5Y.js";
|
|
19
|
+
|
|
20
|
+
// packages/cli/src/services/setup-github.ts
|
|
21
|
+
init_esbuild_shims();
|
|
22
|
+
var import_undici2 = __toESM(require_undici(), 1);
|
|
23
|
+
import { promises as fsp } from "node:fs";
|
|
24
|
+
import * as path from "node:path";
|
|
25
|
+
|
|
26
|
+
// packages/cli/src/utils/gitUtils.ts
|
|
27
|
+
init_esbuild_shims();
|
|
28
|
+
var import_undici = __toESM(require_undici(), 1);
|
|
29
|
+
import * as childProcess from "node:child_process";
|
|
30
|
+
var debugLogger = createDebugLogger("GIT");
|
|
31
|
+
async function runGit(args, opts = {}) {
|
|
32
|
+
return await new Promise((resolve2, reject) => {
|
|
33
|
+
childProcess.execFile(
|
|
34
|
+
"git",
|
|
35
|
+
args,
|
|
36
|
+
{
|
|
37
|
+
encoding: "utf-8",
|
|
38
|
+
...opts.cwd ? { cwd: opts.cwd } : {}
|
|
39
|
+
},
|
|
40
|
+
(err, stdout) => {
|
|
41
|
+
if (err) {
|
|
42
|
+
reject(err);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
resolve2(String(stdout ?? "").trim());
|
|
46
|
+
}
|
|
47
|
+
);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
__name(runGit, "runGit");
|
|
51
|
+
var isGitHubRepositoryAsync = /* @__PURE__ */ __name(async (opts = {}) => {
|
|
52
|
+
try {
|
|
53
|
+
const remotes = await runGit(["remote", "-v"], opts);
|
|
54
|
+
return remotes.split("\n").some((line) => {
|
|
55
|
+
const remoteUrl = line.trim().split(/\s+/)[1];
|
|
56
|
+
return remoteUrl ? isGitHubRemoteUrl(remoteUrl) : false;
|
|
57
|
+
});
|
|
58
|
+
} catch (_error) {
|
|
59
|
+
debugLogger.debug(`Failed to get git remote:`, _error);
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}, "isGitHubRepositoryAsync");
|
|
63
|
+
function isGitHubRemoteUrl(remoteUrl) {
|
|
64
|
+
if (remoteUrl.startsWith("git@github.com:")) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
if (remoteUrl.startsWith("git@")) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
return new URL(remoteUrl).hostname === "github.com";
|
|
72
|
+
} catch {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
__name(isGitHubRemoteUrl, "isGitHubRemoteUrl");
|
|
77
|
+
var getGitRepoRootAsync = /* @__PURE__ */ __name(async (opts = {}) => {
|
|
78
|
+
const gitRepoRoot = await runGit(["rev-parse", "--show-toplevel"], opts);
|
|
79
|
+
if (!gitRepoRoot) {
|
|
80
|
+
throw new Error(`Git repo returned empty value`);
|
|
81
|
+
}
|
|
82
|
+
return gitRepoRoot;
|
|
83
|
+
}, "getGitRepoRootAsync");
|
|
84
|
+
var getLatestGitHubRelease = /* @__PURE__ */ __name(async (proxy) => {
|
|
85
|
+
try {
|
|
86
|
+
const controller = new AbortController();
|
|
87
|
+
const endpoint = `https://api.github.com/repos/QwenLM/qwen-code-action/releases/latest`;
|
|
88
|
+
const response = await fetch(endpoint, {
|
|
89
|
+
method: "GET",
|
|
90
|
+
headers: {
|
|
91
|
+
Accept: "application/vnd.github+json",
|
|
92
|
+
"Content-Type": "application/json",
|
|
93
|
+
"X-GitHub-Api-Version": "2022-11-28"
|
|
94
|
+
},
|
|
95
|
+
dispatcher: proxy ? new import_undici.ProxyAgent(proxy) : void 0,
|
|
96
|
+
signal: AbortSignal.any([AbortSignal.timeout(3e4), controller.signal])
|
|
97
|
+
});
|
|
98
|
+
if (!response.ok) {
|
|
99
|
+
throw new Error(
|
|
100
|
+
`Invalid response code: ${response.status} - ${response.statusText}`
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
const releaseTag = (await response.json()).tag_name;
|
|
104
|
+
if (!releaseTag) {
|
|
105
|
+
throw new Error(`Response did not include tag_name field`);
|
|
106
|
+
}
|
|
107
|
+
return releaseTag;
|
|
108
|
+
} catch (_error) {
|
|
109
|
+
debugLogger.debug(
|
|
110
|
+
`Failed to determine latest qwen-code-action release:`,
|
|
111
|
+
_error
|
|
112
|
+
);
|
|
113
|
+
throw new Error(
|
|
114
|
+
`Unable to determine the latest qwen-code-action release on GitHub.`
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
}, "getLatestGitHubRelease");
|
|
118
|
+
async function getGitHubRepoInfoAsync(opts = {}) {
|
|
119
|
+
return parseGitHubRepoInfo(
|
|
120
|
+
await runGit(["remote", "get-url", "origin"], opts)
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
__name(getGitHubRepoInfoAsync, "getGitHubRepoInfoAsync");
|
|
124
|
+
function parseGitHubRepoInfo(remoteUrl) {
|
|
125
|
+
let urlToParse = remoteUrl;
|
|
126
|
+
if (remoteUrl.startsWith("git@github.com:")) {
|
|
127
|
+
urlToParse = remoteUrl.replace("git@github.com:", "");
|
|
128
|
+
} else if (remoteUrl.startsWith("git@")) {
|
|
129
|
+
throw new Error(
|
|
130
|
+
`Owner & repo could not be extracted from remote URL: ${remoteUrl}`
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
let parsedUrl;
|
|
134
|
+
try {
|
|
135
|
+
parsedUrl = new URL(urlToParse, "https://github.com");
|
|
136
|
+
} catch {
|
|
137
|
+
throw new Error(
|
|
138
|
+
`Owner & repo could not be extracted from remote URL: ${remoteUrl}`
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
if (parsedUrl.hostname !== "github.com") {
|
|
142
|
+
throw new Error(
|
|
143
|
+
`Owner & repo could not be extracted from remote URL: ${remoteUrl}`
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
const parts = parsedUrl.pathname.split("/").filter((part) => part !== "");
|
|
147
|
+
if (parts.length !== 2 || !parts[0] || !parts[1]) {
|
|
148
|
+
throw new Error(
|
|
149
|
+
`Owner & repo could not be extracted from remote URL: ${remoteUrl}`
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
return { owner: parts[0], repo: parts[1].replace(/\.git$/, "") };
|
|
153
|
+
}
|
|
154
|
+
__name(parseGitHubRepoInfo, "parseGitHubRepoInfo");
|
|
155
|
+
|
|
156
|
+
// packages/cli/src/services/setup-github.ts
|
|
157
|
+
var debugLogger2 = createDebugLogger("SETUP_GITHUB");
|
|
158
|
+
var GITHUB_WORKFLOW_PATHS = [
|
|
159
|
+
"qwen-dispatch/qwen-dispatch.yml",
|
|
160
|
+
"qwen-assistant/qwen-invoke.yml",
|
|
161
|
+
"issue-triage/qwen-triage.yml",
|
|
162
|
+
"issue-triage/qwen-scheduled-triage.yml",
|
|
163
|
+
"pr-review/qwen-review.yml"
|
|
164
|
+
];
|
|
165
|
+
var GITIGNORE_ENTRIES = [".qwen/", "gha-creds-*.json"];
|
|
166
|
+
var MAX_WORKFLOW_DOWNLOAD_BYTES = 5 * 1024 * 1024;
|
|
167
|
+
var SetupGithubError = class extends Error {
|
|
168
|
+
static {
|
|
169
|
+
__name(this, "SetupGithubError");
|
|
170
|
+
}
|
|
171
|
+
code;
|
|
172
|
+
status;
|
|
173
|
+
partial;
|
|
174
|
+
partialResult;
|
|
175
|
+
constructor(code, message, status, partialResult) {
|
|
176
|
+
super(message);
|
|
177
|
+
this.name = "SetupGithubError";
|
|
178
|
+
this.code = code;
|
|
179
|
+
this.status = status;
|
|
180
|
+
this.partial = partialResult !== void 0;
|
|
181
|
+
this.partialResult = partialResult;
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
var nodeFileOps = {
|
|
185
|
+
assertCanWrite() {
|
|
186
|
+
},
|
|
187
|
+
async ensureWorkflowDirectory(gitRepoRoot) {
|
|
188
|
+
await fsp.mkdir(path.join(gitRepoRoot, ".github", "workflows"), {
|
|
189
|
+
recursive: true
|
|
190
|
+
});
|
|
191
|
+
},
|
|
192
|
+
async writeTextFile(gitRepoRoot, relativePath, content) {
|
|
193
|
+
const target = path.join(gitRepoRoot, relativePath);
|
|
194
|
+
await fsp.writeFile(target, content, { mode: 420 });
|
|
195
|
+
return { sizeBytes: Buffer.byteLength(content, "utf8") };
|
|
196
|
+
},
|
|
197
|
+
async readTextFile(gitRepoRoot, relativePath) {
|
|
198
|
+
try {
|
|
199
|
+
return await fsp.readFile(path.join(gitRepoRoot, relativePath), "utf8");
|
|
200
|
+
} catch (error) {
|
|
201
|
+
if (error.code === "ENOENT") {
|
|
202
|
+
return void 0;
|
|
203
|
+
}
|
|
204
|
+
throw error;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
async function setupGithub(options = {}) {
|
|
209
|
+
const cwd = options.cwd ?? process.cwd();
|
|
210
|
+
const fileOps = options.fileOps ?? nodeFileOps;
|
|
211
|
+
if (!await isGitHubRepositoryAsync({ cwd })) {
|
|
212
|
+
throw new SetupGithubError(
|
|
213
|
+
"github_repository_not_found",
|
|
214
|
+
"Unable to determine the GitHub repository. /setup-github must be run from a git repository.",
|
|
215
|
+
400
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
let gitRepoRoot;
|
|
219
|
+
try {
|
|
220
|
+
gitRepoRoot = await getGitRepoRootAsync({ cwd });
|
|
221
|
+
} catch (error) {
|
|
222
|
+
debugLogger2.debug("Failed to get git repo root:", error);
|
|
223
|
+
throw new SetupGithubError(
|
|
224
|
+
"github_repository_not_found",
|
|
225
|
+
"Unable to determine the GitHub repository. /setup-github must be run from a git repository.",
|
|
226
|
+
400
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
if (options.workspaceRoot) {
|
|
230
|
+
const [gitRootReal, workspaceReal] = await Promise.all([
|
|
231
|
+
realpathOrResolve(gitRepoRoot),
|
|
232
|
+
realpathOrResolve(options.workspaceRoot)
|
|
233
|
+
]);
|
|
234
|
+
if (gitRootReal !== workspaceReal) {
|
|
235
|
+
throw new SetupGithubError(
|
|
236
|
+
"github_git_root_mismatch",
|
|
237
|
+
"The Git repository root must match the daemon workspace root.",
|
|
238
|
+
400
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
fileOps.assertCanWrite?.();
|
|
243
|
+
let releaseTag;
|
|
244
|
+
try {
|
|
245
|
+
releaseTag = await getLatestGitHubRelease(options.proxy);
|
|
246
|
+
} catch (error) {
|
|
247
|
+
writeStderrLine(
|
|
248
|
+
`qwen setup-github: failed to determine latest qwen-code-action release: ${error instanceof Error ? error.message : String(error)}`
|
|
249
|
+
);
|
|
250
|
+
debugLogger2.debug(
|
|
251
|
+
"Failed to determine latest qwen-code-action release:",
|
|
252
|
+
error
|
|
253
|
+
);
|
|
254
|
+
throw new SetupGithubError(
|
|
255
|
+
"github_release_lookup_failed",
|
|
256
|
+
"Unable to determine the latest qwen-code-action release on GitHub.",
|
|
257
|
+
502
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
const readmeUrl = `https://github.com/QwenLM/qwen-code-action/blob/${releaseTag}/README.md#quick-start`;
|
|
261
|
+
const secretsUrl = await resolveSecretsUrl(cwd);
|
|
262
|
+
const downloads = await downloadWorkflows({
|
|
263
|
+
releaseTag,
|
|
264
|
+
proxy: options.proxy,
|
|
265
|
+
abortSignal: options.abortSignal,
|
|
266
|
+
fetchImpl: options.fetchImpl ?? fetch
|
|
267
|
+
});
|
|
268
|
+
const result = {
|
|
269
|
+
kind: "github_setup",
|
|
270
|
+
workspaceCwd: options.workspaceRoot ?? gitRepoRoot,
|
|
271
|
+
gitRepoRoot,
|
|
272
|
+
releaseTag,
|
|
273
|
+
readmeUrl,
|
|
274
|
+
...secretsUrl ? { secretsUrl } : {},
|
|
275
|
+
workflows: [],
|
|
276
|
+
gitignore: { path: ".gitignore", status: "skipped" },
|
|
277
|
+
warnings: []
|
|
278
|
+
};
|
|
279
|
+
result.gitignore = await updateGitignore(gitRepoRoot, fileOps);
|
|
280
|
+
if (result.gitignore.status === "failed") {
|
|
281
|
+
result.warnings.push("Failed to update .gitignore.");
|
|
282
|
+
}
|
|
283
|
+
try {
|
|
284
|
+
await fileOps.ensureWorkflowDirectory(gitRepoRoot);
|
|
285
|
+
for (const workflow of downloads) {
|
|
286
|
+
const relativePath = path.posix.join(
|
|
287
|
+
".github",
|
|
288
|
+
"workflows",
|
|
289
|
+
path.posix.basename(workflow.sourcePath)
|
|
290
|
+
);
|
|
291
|
+
try {
|
|
292
|
+
const write = await fileOps.writeTextFile(
|
|
293
|
+
gitRepoRoot,
|
|
294
|
+
relativePath,
|
|
295
|
+
workflow.content
|
|
296
|
+
);
|
|
297
|
+
result.workflows.push({
|
|
298
|
+
sourcePath: workflow.sourcePath,
|
|
299
|
+
path: relativePath,
|
|
300
|
+
status: "written",
|
|
301
|
+
sizeBytes: write.sizeBytes
|
|
302
|
+
});
|
|
303
|
+
} catch (error) {
|
|
304
|
+
result.partial = true;
|
|
305
|
+
result.workflows.push({
|
|
306
|
+
sourcePath: workflow.sourcePath,
|
|
307
|
+
path: relativePath,
|
|
308
|
+
status: "failed",
|
|
309
|
+
error: error instanceof Error ? error.message : String(error)
|
|
310
|
+
});
|
|
311
|
+
throw new SetupGithubError(
|
|
312
|
+
"github_workflow_write_failed",
|
|
313
|
+
`Unable to write ${relativePath}.`,
|
|
314
|
+
500,
|
|
315
|
+
result
|
|
316
|
+
);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
} catch (error) {
|
|
320
|
+
if (error instanceof SetupGithubError) throw error;
|
|
321
|
+
throw new SetupGithubError(
|
|
322
|
+
"github_workflow_write_failed",
|
|
323
|
+
"Unable to create .github/workflows.",
|
|
324
|
+
500,
|
|
325
|
+
result
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
return result;
|
|
329
|
+
}
|
|
330
|
+
__name(setupGithub, "setupGithub");
|
|
331
|
+
async function updateGitignore(gitRepoRoot, fileOps = nodeFileOps) {
|
|
332
|
+
try {
|
|
333
|
+
const existingContent = await fileOps.readTextFile(
|
|
334
|
+
gitRepoRoot,
|
|
335
|
+
".gitignore"
|
|
336
|
+
);
|
|
337
|
+
if (existingContent === void 0) {
|
|
338
|
+
const content = GITIGNORE_ENTRIES.join("\n") + "\n";
|
|
339
|
+
await fileOps.writeTextFile(gitRepoRoot, ".gitignore", content);
|
|
340
|
+
return {
|
|
341
|
+
path: ".gitignore",
|
|
342
|
+
status: "created",
|
|
343
|
+
added: [...GITIGNORE_ENTRIES]
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
const missingEntries = GITIGNORE_ENTRIES.filter(
|
|
347
|
+
(entry) => !existingContent.split(/\r?\n/).some((line) => line.split("#")[0].trim() === entry)
|
|
348
|
+
);
|
|
349
|
+
if (missingEntries.length === 0) {
|
|
350
|
+
return { path: ".gitignore", status: "unchanged" };
|
|
351
|
+
}
|
|
352
|
+
const nextContent = existingContent + "\n" + missingEntries.join("\n") + "\n";
|
|
353
|
+
await fileOps.writeTextFile(gitRepoRoot, ".gitignore", nextContent);
|
|
354
|
+
return {
|
|
355
|
+
path: ".gitignore",
|
|
356
|
+
status: "updated",
|
|
357
|
+
added: missingEntries
|
|
358
|
+
};
|
|
359
|
+
} catch (error) {
|
|
360
|
+
debugLogger2.debug("Failed to update .gitignore:", error);
|
|
361
|
+
return {
|
|
362
|
+
path: ".gitignore",
|
|
363
|
+
status: "failed",
|
|
364
|
+
error: error instanceof Error ? error.message : String(error)
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
__name(updateGitignore, "updateGitignore");
|
|
369
|
+
async function downloadWorkflows(options) {
|
|
370
|
+
const internalAbort = new AbortController();
|
|
371
|
+
try {
|
|
372
|
+
const dispatcher = options.proxy ? new import_undici2.ProxyAgent(options.proxy) : void 0;
|
|
373
|
+
return await Promise.all(
|
|
374
|
+
GITHUB_WORKFLOW_PATHS.map(async (workflow) => {
|
|
375
|
+
const endpoint = `https://raw.githubusercontent.com/QwenLM/qwen-code-action/refs/tags/${options.releaseTag}/examples/workflows/${workflow}`;
|
|
376
|
+
const response = await options.fetchImpl(endpoint, {
|
|
377
|
+
method: "GET",
|
|
378
|
+
dispatcher,
|
|
379
|
+
signal: AbortSignal.any([
|
|
380
|
+
AbortSignal.timeout(3e4),
|
|
381
|
+
internalAbort.signal,
|
|
382
|
+
...options.abortSignal ? [options.abortSignal] : []
|
|
383
|
+
])
|
|
384
|
+
});
|
|
385
|
+
if (!response.ok) {
|
|
386
|
+
throw new Error(
|
|
387
|
+
`Invalid response code downloading ${endpoint}: ${response.status} - ${response.statusText}`
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
return {
|
|
391
|
+
sourcePath: workflow,
|
|
392
|
+
content: await readResponseTextWithLimit(response, workflow)
|
|
393
|
+
};
|
|
394
|
+
})
|
|
395
|
+
);
|
|
396
|
+
} catch (error) {
|
|
397
|
+
internalAbort.abort();
|
|
398
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
399
|
+
debugLogger2.debug("Failed to download qwen-code-action workflows:", error);
|
|
400
|
+
throw new SetupGithubError(
|
|
401
|
+
"github_workflow_download_failed",
|
|
402
|
+
`Unable to download qwen-code-action workflows from GitHub. ${message}`,
|
|
403
|
+
502
|
|
404
|
+
);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
__name(downloadWorkflows, "downloadWorkflows");
|
|
408
|
+
async function readResponseTextWithLimit(response, sourcePath) {
|
|
409
|
+
const contentLength = response.headers.get("content-length");
|
|
410
|
+
if (contentLength !== null) {
|
|
411
|
+
const parsedLength = Number(contentLength);
|
|
412
|
+
if (Number.isFinite(parsedLength) && parsedLength > MAX_WORKFLOW_DOWNLOAD_BYTES) {
|
|
413
|
+
throw new Error(
|
|
414
|
+
`${sourcePath} exceeds download limit of ${MAX_WORKFLOW_DOWNLOAD_BYTES} bytes`
|
|
415
|
+
);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
if (!response.body) return "";
|
|
419
|
+
const reader = response.body.getReader();
|
|
420
|
+
const chunks = [];
|
|
421
|
+
let totalBytes = 0;
|
|
422
|
+
try {
|
|
423
|
+
while (true) {
|
|
424
|
+
const { done, value } = await reader.read();
|
|
425
|
+
if (done) break;
|
|
426
|
+
if (!value) continue;
|
|
427
|
+
totalBytes += value.byteLength;
|
|
428
|
+
if (totalBytes > MAX_WORKFLOW_DOWNLOAD_BYTES) {
|
|
429
|
+
await reader.cancel().catch(() => {
|
|
430
|
+
});
|
|
431
|
+
throw new Error(
|
|
432
|
+
`${sourcePath} exceeds download limit of ${MAX_WORKFLOW_DOWNLOAD_BYTES} bytes`
|
|
433
|
+
);
|
|
434
|
+
}
|
|
435
|
+
chunks.push(value);
|
|
436
|
+
}
|
|
437
|
+
} finally {
|
|
438
|
+
reader.releaseLock();
|
|
439
|
+
}
|
|
440
|
+
const body = new Uint8Array(totalBytes);
|
|
441
|
+
let offset = 0;
|
|
442
|
+
for (const chunk of chunks) {
|
|
443
|
+
body.set(chunk, offset);
|
|
444
|
+
offset += chunk.byteLength;
|
|
445
|
+
}
|
|
446
|
+
return new TextDecoder().decode(body);
|
|
447
|
+
}
|
|
448
|
+
__name(readResponseTextWithLimit, "readResponseTextWithLimit");
|
|
449
|
+
async function resolveSecretsUrl(cwd) {
|
|
450
|
+
try {
|
|
451
|
+
const repoInfo = await getGitHubRepoInfoAsync({ cwd });
|
|
452
|
+
return `https://github.com/${repoInfo.owner}/${repoInfo.repo}/settings/secrets/actions`;
|
|
453
|
+
} catch {
|
|
454
|
+
return void 0;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
__name(resolveSecretsUrl, "resolveSecretsUrl");
|
|
458
|
+
async function realpathOrResolve(input) {
|
|
459
|
+
try {
|
|
460
|
+
return await fsp.realpath(input);
|
|
461
|
+
} catch {
|
|
462
|
+
return path.resolve(input);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
__name(realpathOrResolve, "realpathOrResolve");
|
|
466
|
+
|
|
467
|
+
export {
|
|
468
|
+
GITHUB_WORKFLOW_PATHS,
|
|
469
|
+
SetupGithubError,
|
|
470
|
+
setupGithub
|
|
471
|
+
};
|
|
472
|
+
/**
|
|
473
|
+
* @license
|
|
474
|
+
* Copyright 2025 Google LLC
|
|
475
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
476
|
+
*/
|
|
477
|
+
/**
|
|
478
|
+
* @license
|
|
479
|
+
* Copyright 2025 Qwen Team
|
|
480
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
481
|
+
*/
|
|
@@ -5,11 +5,11 @@ import {
|
|
|
5
5
|
} from "./chunk-OMX7CUOE.js";
|
|
6
6
|
import {
|
|
7
7
|
atomicWriteJSON
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-3227DZO4.js";
|
|
9
9
|
import {
|
|
10
10
|
Storage,
|
|
11
11
|
getProjectHash
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-UX4SGCGN.js";
|
|
13
13
|
import {
|
|
14
14
|
init_esbuild_shims
|
|
15
15
|
} from "./chunk-A4BMJM77.js";
|
|
@@ -4,83 +4,9 @@ import {
|
|
|
4
4
|
init_esbuild_shims
|
|
5
5
|
} from "./chunk-A4BMJM77.js";
|
|
6
6
|
import {
|
|
7
|
-
__commonJS,
|
|
8
7
|
__name
|
|
9
8
|
} from "./chunk-J2S4EL5Y.js";
|
|
10
9
|
|
|
11
|
-
// node_modules/strip-json-comments/index.js
|
|
12
|
-
var require_strip_json_comments = __commonJS({
|
|
13
|
-
"node_modules/strip-json-comments/index.js"(exports, module) {
|
|
14
|
-
"use strict";
|
|
15
|
-
init_esbuild_shims();
|
|
16
|
-
var singleComment = Symbol("singleComment");
|
|
17
|
-
var multiComment = Symbol("multiComment");
|
|
18
|
-
var stripWithoutWhitespace = /* @__PURE__ */ __name(() => "", "stripWithoutWhitespace");
|
|
19
|
-
var stripWithWhitespace = /* @__PURE__ */ __name((string, start, end) => string.slice(start, end).replace(/\S/g, " "), "stripWithWhitespace");
|
|
20
|
-
var isEscaped = /* @__PURE__ */ __name((jsonString, quotePosition) => {
|
|
21
|
-
let index = quotePosition - 1;
|
|
22
|
-
let backslashCount = 0;
|
|
23
|
-
while (jsonString[index] === "\\") {
|
|
24
|
-
index -= 1;
|
|
25
|
-
backslashCount += 1;
|
|
26
|
-
}
|
|
27
|
-
return Boolean(backslashCount % 2);
|
|
28
|
-
}, "isEscaped");
|
|
29
|
-
module.exports = (jsonString, options = {}) => {
|
|
30
|
-
if (typeof jsonString !== "string") {
|
|
31
|
-
throw new TypeError(`Expected argument \`jsonString\` to be a \`string\`, got \`${typeof jsonString}\``);
|
|
32
|
-
}
|
|
33
|
-
const strip = options.whitespace === false ? stripWithoutWhitespace : stripWithWhitespace;
|
|
34
|
-
let insideString = false;
|
|
35
|
-
let insideComment = false;
|
|
36
|
-
let offset = 0;
|
|
37
|
-
let result = "";
|
|
38
|
-
for (let i = 0; i < jsonString.length; i++) {
|
|
39
|
-
const currentCharacter = jsonString[i];
|
|
40
|
-
const nextCharacter = jsonString[i + 1];
|
|
41
|
-
if (!insideComment && currentCharacter === '"') {
|
|
42
|
-
const escaped = isEscaped(jsonString, i);
|
|
43
|
-
if (!escaped) {
|
|
44
|
-
insideString = !insideString;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
if (insideString) {
|
|
48
|
-
continue;
|
|
49
|
-
}
|
|
50
|
-
if (!insideComment && currentCharacter + nextCharacter === "//") {
|
|
51
|
-
result += jsonString.slice(offset, i);
|
|
52
|
-
offset = i;
|
|
53
|
-
insideComment = singleComment;
|
|
54
|
-
i++;
|
|
55
|
-
} else if (insideComment === singleComment && currentCharacter + nextCharacter === "\r\n") {
|
|
56
|
-
i++;
|
|
57
|
-
insideComment = false;
|
|
58
|
-
result += strip(jsonString, offset, i);
|
|
59
|
-
offset = i;
|
|
60
|
-
continue;
|
|
61
|
-
} else if (insideComment === singleComment && currentCharacter === "\n") {
|
|
62
|
-
insideComment = false;
|
|
63
|
-
result += strip(jsonString, offset, i);
|
|
64
|
-
offset = i;
|
|
65
|
-
} else if (!insideComment && currentCharacter + nextCharacter === "/*") {
|
|
66
|
-
result += jsonString.slice(offset, i);
|
|
67
|
-
offset = i;
|
|
68
|
-
insideComment = multiComment;
|
|
69
|
-
i++;
|
|
70
|
-
continue;
|
|
71
|
-
} else if (insideComment === multiComment && currentCharacter + nextCharacter === "*/") {
|
|
72
|
-
i++;
|
|
73
|
-
insideComment = false;
|
|
74
|
-
result += strip(jsonString, offset, i + 1);
|
|
75
|
-
offset = i + 1;
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
return result + (insideComment ? strip(jsonString.slice(offset)) : jsonString.slice(offset));
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
|
|
84
10
|
// packages/cli/src/config/migration/versions/v1-to-v2-shared.ts
|
|
85
11
|
init_esbuild_shims();
|
|
86
12
|
var V1_TO_V2_MIGRATION_MAP = {
|
|
@@ -246,7 +172,16 @@ var PROJECT_ENV_HARDCODED_EXCLUSIONS = [
|
|
|
246
172
|
"QWEN_CODE_MCP_APPROVALS_PATH",
|
|
247
173
|
"QWEN_CODE_TRUSTED_FOLDERS_PATH",
|
|
248
174
|
ENV_CORRUPTED_PATH,
|
|
249
|
-
ENV_WAS_RECOVERED
|
|
175
|
+
ENV_WAS_RECOVERED,
|
|
176
|
+
// QWEN_TLS_INSECURE (and NODE_TLS_REJECT_UNAUTHORIZED, which it mirrors)
|
|
177
|
+
// disable TLS certificate verification for all outbound API connections. A
|
|
178
|
+
// project `.env` must never enable either — that would let an untrusted repo
|
|
179
|
+
// silently turn off MITM protection. Opt-in stays with the user via the
|
|
180
|
+
// `--insecure` flag, the shell environment, or a home `.env`. The initial
|
|
181
|
+
// `.env` load only consults this list, so both keys must be here (not just
|
|
182
|
+
// RELOAD_EXCLUDED_KEYS, which only applies on reload).
|
|
183
|
+
"QWEN_TLS_INSECURE",
|
|
184
|
+
"NODE_TLS_REJECT_UNAUTHORIZED"
|
|
250
185
|
];
|
|
251
186
|
var HOME_ENV_BOOTSTRAP_KEYS = [
|
|
252
187
|
"QWEN_HOME",
|
|
@@ -308,35 +243,6 @@ function getSystemDefaultsPath() {
|
|
|
308
243
|
}
|
|
309
244
|
__name(getSystemDefaultsPath, "getSystemDefaultsPath");
|
|
310
245
|
|
|
311
|
-
// packages/cli/src/config/path-comparison.ts
|
|
312
|
-
init_esbuild_shims();
|
|
313
|
-
import * as fs from "node:fs";
|
|
314
|
-
import * as path2 from "node:path";
|
|
315
|
-
function isWithinRoot(childPath, parentPath) {
|
|
316
|
-
const relativePath = path2.relative(parentPath, childPath);
|
|
317
|
-
return relativePath === "" || !relativePath.startsWith(`..${path2.sep}`) && relativePath !== ".." && !path2.isAbsolute(relativePath);
|
|
318
|
-
}
|
|
319
|
-
__name(isWithinRoot, "isWithinRoot");
|
|
320
|
-
function getPathComparisonVariants(rawPath) {
|
|
321
|
-
const variants = /* @__PURE__ */ new Set([path2.normalize(path2.resolve(rawPath))]);
|
|
322
|
-
try {
|
|
323
|
-
variants.add(path2.normalize(fs.realpathSync(rawPath)));
|
|
324
|
-
} catch {
|
|
325
|
-
}
|
|
326
|
-
return variants;
|
|
327
|
-
}
|
|
328
|
-
__name(getPathComparisonVariants, "getPathComparisonVariants");
|
|
329
|
-
function arePathsEquivalent(left, right) {
|
|
330
|
-
const rightVariants = getPathComparisonVariants(right);
|
|
331
|
-
for (const leftVariant of getPathComparisonVariants(left)) {
|
|
332
|
-
if (rightVariants.has(leftVariant)) {
|
|
333
|
-
return true;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
return false;
|
|
337
|
-
}
|
|
338
|
-
__name(arePathsEquivalent, "arePathsEquivalent");
|
|
339
|
-
|
|
340
246
|
// packages/cli/src/utils/envVarResolver.ts
|
|
341
247
|
init_esbuild_shims();
|
|
342
248
|
function resolveEnvVarsInString(value, customEnv) {
|
|
@@ -398,7 +304,6 @@ function resolveEnvVarsInObjectInternal(obj, visited, customEnv) {
|
|
|
398
304
|
__name(resolveEnvVarsInObjectInternal, "resolveEnvVarsInObjectInternal");
|
|
399
305
|
|
|
400
306
|
export {
|
|
401
|
-
require_strip_json_comments,
|
|
402
307
|
V1_TO_V2_MIGRATION_MAP,
|
|
403
308
|
V2_CONTAINER_KEYS,
|
|
404
309
|
V1_TO_V2_PRESERVE_DISABLE_MAP,
|
|
@@ -414,9 +319,6 @@ export {
|
|
|
414
319
|
getGlobalQwenDirLite,
|
|
415
320
|
getSystemSettingsPath,
|
|
416
321
|
getSystemDefaultsPath,
|
|
417
|
-
isWithinRoot,
|
|
418
|
-
getPathComparisonVariants,
|
|
419
|
-
arePathsEquivalent,
|
|
420
322
|
resolveEnvVarsInObject
|
|
421
323
|
};
|
|
422
324
|
/**
|