@qwen-code/qwen-code 0.21.6 → 0.21.7
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 +19 -9
- package/bundled/qc-helper/docs/features/channels/dingtalk.md +1 -1
- package/bundled/qc-helper/docs/features/code-review.md +27 -0
- package/bundled/qc-helper/docs/qwen-serve.md +1 -1
- package/bundled/review/SKILL.md +48 -16
- package/chunks/{MaxSizedBox-2HFKP4LI.js → MaxSizedBox-ANWZBPTS.js} +38 -38
- package/chunks/{StandaloneSessionPicker-RBV72M5N.js → StandaloneSessionPicker-XKS3VU3A.js} +54 -53
- package/chunks/{acpAgent-WO6JFCVQ.js → acpAgent-KUAZ3GCZ.js} +80 -80
- package/chunks/{agent-AHGLYNZ4.js → agent-T6PTGX5R.js} +35 -35
- package/chunks/{agent-headless-NTXKKGRO.js → agent-headless-PR7YCB7S.js} +35 -35
- package/chunks/{anthropicContentGenerator-3CAHEZBM.js → anthropicContentGenerator-DTMVEL5M.js} +7 -7
- package/chunks/{artifact-tool-RROCCJDA.js → artifact-tool-U4VOZIK5.js} +2 -2
- package/chunks/{askUserQuestion-2EPPBPUZ.js → askUserQuestion-XOBQLPFA.js} +2 -2
- package/chunks/{bridge-RPAU64CA.js → bridge-NU6YEEHK.js} +39 -39
- package/chunks/{channel-management-service-IGEUOVRT.js → channel-management-service-FSQ7SHYI.js} +1 -1
- package/chunks/{channel-settings-store-ON64MF7G.js → channel-settings-store-35VQVUVV.js} +41 -41
- package/chunks/{chunk-XC656O42.js → chunk-22NBYCPD.js} +3 -3
- package/chunks/{chunk-T4JSA7KU.js → chunk-23RZCH76.js} +3 -3
- package/chunks/{chunk-PX5DNLSA.js → chunk-2U3WZGZG.js} +18 -10
- package/chunks/chunk-2VSTGY6M.js +107 -0
- package/chunks/{chunk-QZKYZCN3.js → chunk-33ACCIIY.js} +3 -3
- package/chunks/{chunk-MBEMTXQT.js → chunk-3K7FH2KQ.js} +1 -32
- package/chunks/{chunk-ODPXHGLL.js → chunk-3NB7TSE2.js} +2 -2
- package/chunks/{chunk-QYPT3QUD.js → chunk-3ULCB3NE.js} +3 -3
- package/chunks/{chunk-C4CBJQKY.js → chunk-55LYDVPU.js} +1 -1
- package/chunks/{chunk-NKSF7HYF.js → chunk-5KH532V7.js} +1 -1
- package/chunks/{chunk-BOGOR4HB.js → chunk-6EOI4HOK.js} +7 -7
- package/chunks/{chunk-CA4UIDFU.js → chunk-6GONZVLS.js} +1 -1
- package/chunks/{chunk-3UOLYNTF.js → chunk-6HVUFDS2.js} +6 -6
- package/chunks/{chunk-5L6CQ4ZU.js → chunk-6M26GBKX.js} +2 -2
- package/chunks/{chunk-XA4TMLFN.js → chunk-6UWFTUQL.js} +530 -388
- package/chunks/{chunk-W5DXUTXD.js → chunk-6XJMFJ4D.js} +8 -8
- package/chunks/{chunk-ACZRB7AD.js → chunk-6XU3PH66.js} +3 -3
- package/chunks/{chunk-NGJOAKJY.js → chunk-72LNFGUY.js} +3 -3
- package/chunks/{chunk-33FNCQSY.js → chunk-7MH4J33A.js} +2 -2
- package/chunks/{chunk-2AGOQ7QO.js → chunk-7UFKAV7Y.js} +118 -6
- package/chunks/{chunk-O7V7N4G7.js → chunk-AE77C5ZU.js} +198 -35
- package/chunks/{chunk-JELIWHXD.js → chunk-AOHJKPKL.js} +1 -1
- package/chunks/{chunk-GLNBDYUX.js → chunk-AXMWHKXA.js} +6 -2
- package/chunks/{chunk-H36SETQS.js → chunk-B2GJNDTV.js} +1 -1
- package/chunks/{chunk-QMBEW7EW.js → chunk-BGG4MBYD.js} +2 -2
- package/chunks/{chunk-6WBWIPBF.js → chunk-BVWVWGLE.js} +2 -2
- package/chunks/{chunk-GK2H5GRC.js → chunk-CB2464BK.js} +5 -5
- package/chunks/{chunk-2UISUFHQ.js → chunk-CJXIIILK.js} +3 -3
- package/chunks/{chunk-WK4TJUEA.js → chunk-CKASRHZI.js} +1 -1
- package/chunks/{chunk-Z7JILXGX.js → chunk-CNIID3TV.js} +3 -3
- package/chunks/{chunk-5MJGUQU5.js → chunk-CSZEXZBE.js} +3 -3
- package/chunks/{chunk-KKN2IE7Q.js → chunk-CTJLZLB5.js} +1 -1
- package/chunks/{chunk-HY25ULVN.js → chunk-CXE7E23H.js} +131 -48
- package/chunks/{chunk-4WTAQEHV.js → chunk-CYR3HI5X.js} +3 -3
- package/chunks/{chunk-KHUA3NQV.js → chunk-DBOFL3LQ.js} +2 -2
- package/chunks/{chunk-4LKVQFHM.js → chunk-DREZZAZM.js} +2 -2
- package/chunks/{chunk-SQC6K5HI.js → chunk-E33LOKRA.js} +1 -1
- package/chunks/{chunk-2DNKEBXY.js → chunk-EI3HZX6C.js} +1 -1
- package/chunks/{chunk-U25CMJYY.js → chunk-EKPKKXY2.js} +1 -1
- package/chunks/{chunk-RHTTKJTP.js → chunk-EORNAQDT.js} +1 -1
- package/chunks/{chunk-432XCUHF.js → chunk-EQL65XGA.js} +1 -1
- package/chunks/{chunk-TYERNYH4.js → chunk-EUNWC2VS.js} +2 -2
- package/chunks/{chunk-OWSW7EYP.js → chunk-EUQTXRKZ.js} +6 -6
- package/chunks/{chunk-UH7Z7Y45.js → chunk-FOGU3LJX.js} +1 -1
- package/chunks/{chunk-536SWZTA.js → chunk-FPM27XN4.js} +4 -4
- package/chunks/{chunk-E4WHKETF.js → chunk-FVKHVJZQ.js} +2 -49
- package/chunks/{chunk-YMBOEAF4.js → chunk-FZBZSYKU.js} +1 -1
- package/chunks/{chunk-YZQTA3ID.js → chunk-GDXET5XU.js} +31 -3396
- package/chunks/{chunk-A5YZ3FA2.js → chunk-GM463R2B.js} +1 -1
- package/chunks/{chunk-MOHAWIAW.js → chunk-GNPNYXJB.js} +2 -2
- package/chunks/{chunk-2POQWYM6.js → chunk-GSS34377.js} +3 -3
- package/chunks/{chunk-CJ5WLD5Y.js → chunk-H2UQ2M5Z.js} +2 -2
- package/chunks/{chunk-SUKEUUAA.js → chunk-HQB2KUAN.js} +1 -1
- package/chunks/{chunk-JE44IPH6.js → chunk-HYRDKNUY.js} +2 -2
- package/chunks/{chunk-D7D7RXIJ.js → chunk-IC4Z6LX6.js} +1 -1
- package/chunks/{chunk-HU5TUALO.js → chunk-IIJEYBNH.js} +3 -3
- package/chunks/{chunk-EMYZIABH.js → chunk-IUFV6FYU.js} +1 -1
- package/chunks/{chunk-4S4OEQ6U.js → chunk-J6SZID63.js} +2 -2
- package/chunks/{chunk-BFHXDAR7.js → chunk-KKBPOU75.js} +1 -1
- package/chunks/{chunk-XM2O73NC.js → chunk-KKJJB5X6.js} +2455 -1314
- package/chunks/{chunk-SLSWFHDF.js → chunk-KR4ZSC7K.js} +4 -4
- package/chunks/{chunk-RFUHDCNF.js → chunk-KXSDEOFU.js} +1 -1
- package/chunks/{chunk-MGSSJT27.js → chunk-L4N6TIP7.js} +5 -3
- package/chunks/{chunk-OP2OHZ7K.js → chunk-LA7YLSR6.js} +6 -6
- package/chunks/{chunk-EXCEQD22.js → chunk-LEMXGVEP.js} +4 -4
- package/chunks/{chunk-WVAESIM6.js → chunk-LZC3B5N2.js} +4 -4
- package/chunks/{chunk-6O5DVH27.js → chunk-M6HMMKVG.js} +1 -1
- package/chunks/{chunk-75QMRMO7.js → chunk-MAJS7AT4.js} +3 -3
- package/chunks/{chunk-T5U6IM4C.js → chunk-MVUQRLOH.js} +3 -3
- package/chunks/{chunk-GLWP3FDB.js → chunk-MZSJ43WV.js} +31 -2
- package/chunks/{chunk-ZPPP6VCL.js → chunk-NG2R4N5O.js} +1 -1
- package/chunks/{chunk-UGTWD35F.js → chunk-NLREQJFK.js} +1 -1
- package/chunks/{chunk-N2GJU6KI.js → chunk-OFI7IGST.js} +12 -12
- package/chunks/{chunk-VGFPFM4U.js → chunk-OH2VKQXH.js} +42 -16
- package/chunks/{chunk-G5NNWEYE.js → chunk-OHJLEW5J.js} +4 -4
- package/chunks/{chunk-3RXUYQJI.js → chunk-OIVKILPI.js} +49 -0
- package/chunks/{chunk-VNQCPBC2.js → chunk-OMKQH5C5.js} +3 -3
- package/chunks/{chunk-LBWNSLJK.js → chunk-ONSZH6VM.js} +2 -2
- package/chunks/{chunk-DYA25Y7U.js → chunk-OWMAZHIX.js} +1 -1
- package/chunks/{chunk-4JH77A2U.js → chunk-P2AJ7FTI.js} +1 -1
- package/chunks/{chunk-WNU7TZTO.js → chunk-P3LEG54R.js} +3 -3
- package/chunks/{chunk-VSALQLT7.js → chunk-PJOBIWUG.js} +1 -1
- package/chunks/{chunk-PPUOYL77.js → chunk-PQBHU2IA.js} +49 -18
- package/chunks/{chunk-WO2B5E5B.js → chunk-Q3JQ7OSU.js} +1 -1
- package/chunks/{chunk-IMOQO6YL.js → chunk-QETYKPMG.js} +1 -1
- package/chunks/{chunk-DVBEGGLG.js → chunk-RERATVSK.js} +10 -9
- package/chunks/chunk-RGSBTHSU.js +3381 -0
- package/chunks/{chunk-DIT4V3XH.js → chunk-RMH5OWLD.js} +1 -1
- package/chunks/{chunk-TOGZTG4X.js → chunk-RNVQB725.js} +2 -2
- package/chunks/{chunk-GESMMPAK.js → chunk-RUL4S3K3.js} +79 -59
- package/chunks/{chunk-3LZKY4V4.js → chunk-RZHU3ILK.js} +5 -5
- package/chunks/{chunk-SKNE3KQC.js → chunk-SCI7K3GM.js} +4 -4
- package/chunks/{chunk-YAVY33G4.js → chunk-SEZ556DZ.js} +1 -1
- package/chunks/{chunk-Q5RM32DR.js → chunk-SHZYHGQH.js} +1 -1
- package/chunks/chunk-SOORFWKY.js +155 -0
- package/chunks/{chunk-K2B3X3E7.js → chunk-SPMY6CX6.js} +4 -4
- package/chunks/{chunk-FZFP7RZI.js → chunk-TDXGKHDN.js} +3 -3
- package/chunks/{chunk-R5RBXLNC.js → chunk-TLV2IMHR.js} +5 -5
- package/chunks/{chunk-U4AF3QLU.js → chunk-TRLYP7OF.js} +8 -8
- package/chunks/{chunk-ULPQQSDN.js → chunk-TYKC75AX.js} +3 -3
- package/chunks/{chunk-KVUBYJDM.js → chunk-TZEZYNYD.js} +1 -1
- package/chunks/{chunk-XC2VAFVZ.js → chunk-UVX4Y6IN.js} +1 -1
- package/chunks/{chunk-RK2EE3T7.js → chunk-VOARQPTA.js} +2 -2
- package/chunks/{chunk-TGGEZINK.js → chunk-W4B7UBUS.js} +7 -7
- package/chunks/{chunk-URN76TKR.js → chunk-WCG5O7IP.js} +2 -2
- package/chunks/{chunk-TSERKWCX.js → chunk-XCWO3SMQ.js} +3 -3
- package/chunks/{chunk-OXX3FG2N.js → chunk-Y4EWSQF7.js} +3 -3
- package/chunks/{chunk-3PRJYMXC.js → chunk-Y4NGLFGJ.js} +1 -1
- package/chunks/{chunk-A4VTILZT.js → chunk-Y7E5LNLO.js} +115 -85
- package/chunks/{chunk-3LGZEYOF.js → chunk-YHEEE624.js} +2 -2
- package/chunks/{chunk-SQOMTWQT.js → chunk-YJQCUTT2.js} +4 -4
- package/chunks/{chunk-GWRHVJY2.js → chunk-ZJ3VGYHK.js} +20 -20
- package/chunks/{chunk-LAAFLUQV.js → chunk-ZXU5UHMI.js} +1 -1
- package/chunks/{computer-use-5HXJ2P4X.js → computer-use-KEAPATUY.js} +35 -35
- package/chunks/{config-utils-VXD4SPVR.js → config-utils-K7SCOWHD.js} +2 -2
- package/chunks/{contextCommand-7BEHRX2H.js → contextCommand-ZJA6A5K5.js} +37 -37
- package/chunks/{core-runtime-U4VJ5TIV.js → core-runtime-QMJPWHCI.js} +35 -35
- package/chunks/{create-sub-session-QZNQY332.js → create-sub-session-DJE6XICH.js} +35 -35
- package/chunks/{create-sub-session-6EWLAZD5.js → create-sub-session-E4PBYXV5.js} +2 -2
- package/chunks/{cron-create-CCRIULJE.js → cron-create-GRBWYMIJ.js} +4 -4
- package/chunks/{cron-delete-FCFW6BGP.js → cron-delete-4CMKBR2M.js} +4 -4
- package/chunks/{cron-list-QDBVCHRF.js → cron-list-W7K4ASOA.js} +4 -4
- package/chunks/{daemon-YI5RY62O.js → daemon-SCTQMM7Z.js} +50 -2
- package/chunks/{daemon-status-provider-UJUGTDTL.js → daemon-status-provider-FSWDPE2G.js} +43 -43
- package/chunks/{daemon-trust-policy-ZHDD5VYQ.js → daemon-trust-policy-P5L5VFAY.js} +40 -40
- package/chunks/{daemon-trust-policy-monitor-5SHYBDGA.js → daemon-trust-policy-monitor-73JYN6ET.js} +40 -40
- package/chunks/{deferred-core-runtime-QWAEBTR5.js → deferred-core-runtime-BWRCCFTE.js} +35 -35
- package/chunks/{display-image-GUJA352B.js → display-image-O2XFPQTC.js} +4 -4
- package/chunks/{dist-A7H2KKUC.js → dist-K4WWQBHS.js} +277 -98
- package/chunks/{earlyInputCapture-5BMSGKOI.js → earlyInputCapture-L5ST23A6.js} +36 -36
- package/chunks/{edit-IVQQVYYK.js → edit-LHHRFNFK.js} +35 -35
- package/chunks/{enter-worktree-P3DF2N6O.js → enter-worktree-6NXCRZPF.js} +35 -35
- package/chunks/{enterPlanMode-KKTDVLAD.js → enterPlanMode-ZVQT4U7D.js} +35 -35
- package/chunks/{environment-W5TRDM3G.js → environment-GJ2HWJOS.js} +37 -37
- package/chunks/{errors-GJJB36IG.js → errors-6RLH3XXC.js} +37 -37
- package/chunks/{exit-worktree-LV5RLOCU.js → exit-worktree-I2YLUHHY.js} +35 -35
- package/chunks/{exitPlanMode-TUGOB2LL.js → exitPlanMode-7CCWKO7I.js} +35 -35
- package/chunks/{fast-path-2FU23PAQ.js → fast-path-DVFD4HQD.js} +2 -2
- package/chunks/{gemini-KDULDQPP.js → gemini-7FWGOYD4.js} +72 -72
- package/chunks/{geminiContentGenerator-LOCFHNVA.js → geminiContentGenerator-V2WVLIXU.js} +6 -6
- package/chunks/{glob-Z4NQFKWS.js → glob-3N6GGI75.js} +35 -35
- package/chunks/{goal-tools-3AZKX5WQ.js → goal-tools-APOW6UXL.js} +3 -3
- package/chunks/{grep-Z67Z7EN6.js → grep-V43ILZVX.js} +35 -35
- package/chunks/{handleAutoUpdate-DFUZE6I6.js → handleAutoUpdate-A5WFVWIA.js} +39 -39
- package/chunks/{i18n-R4FMZ7N2.js → i18n-PLVQ4FBZ.js} +36 -36
- package/chunks/{image-gen-4CQJPQP5.js → image-gen-7C6IK6DC.js} +9 -9
- package/chunks/{initializer-DK672ZVE.js → initializer-CVAIKZYL.js} +41 -41
- package/chunks/{installationInfo-PO4Z3ES7.js → installationInfo-J6QDHNTK.js} +36 -36
- package/chunks/{keychain-token-storage-7BT4TQ2A.js → keychain-token-storage-TVAMTNP7.js} +2 -2
- package/chunks/{list-QXQF6C53.js → list-ZZ4OUUWV.js} +43 -43
- package/chunks/{list-agents-GC4BRET7.js → list-agents-KFFIIS2G.js} +2 -2
- package/chunks/{loadedSettingsAdapter-4D7GUGW6.js → loadedSettingsAdapter-QRYRJSWL.js} +40 -40
- package/chunks/{loggingContentGenerator-2P3MNACM.js → loggingContentGenerator-OJCO75HM.js} +17 -17
- package/chunks/{loop-wakeup-SQQSBMEY.js → loop-wakeup-TLMJPMMP.js} +5 -5
- package/chunks/{ls-63CC3NNX.js → ls-UVVE2XGE.js} +4 -4
- package/chunks/{lsp-P6NVJVNT.js → lsp-QMEA2VLB.js} +2 -2
- package/chunks/{managed-npm-update-LWVJQTWO.js → managed-npm-update-PCOSCP2N.js} +36 -36
- package/chunks/{mcp-GHETAR6V.js → mcp-M3WKKWKY.js} +40 -40
- package/chunks/{monitor-4T7W4M6Q.js → monitor-GN24FH6C.js} +35 -35
- package/chunks/{nonInteractiveCli-P4UKCJFM.js → nonInteractiveCli-KPTU3VSQ.js} +72 -72
- package/chunks/{notebook-edit-OC2V7U5D.js → notebook-edit-4YM65BBO.js} +35 -35
- package/chunks/{openaiContentGenerator-RAJUFWQY.js → openaiContentGenerator-EDQT6GTV.js} +19 -19
- package/chunks/{pidfile-HVPYVRLS.js → pidfile-JOIIRN2C.js} +36 -36
- package/chunks/{processUtils-VIQ4JHVX.js → processUtils-5SV4MX3Q.js} +2 -2
- package/chunks/{qwenContentGenerator-2QLCUFNZ.js → qwenContentGenerator-ODRJSUGR.js} +40 -40
- package/chunks/{qwenOAuth2-J2X3EN43.js → qwenOAuth2-NESCMZ47.js} +8 -8
- package/chunks/{read-file-ZNAN2B26.js → read-file-HPSODLPK.js} +10 -10
- package/chunks/{read-mcp-resource-RTSSEER5.js → read-mcp-resource-2TNSJTC3.js} +2 -2
- package/chunks/{record-artifact-E6AWQU2Z.js → record-artifact-RAON52FC.js} +3 -3
- package/chunks/{resumeHistoryUtils-RCY7AL5Y.js → resumeHistoryUtils-TXCOFFMQ.js} +41 -40
- package/chunks/{ripGrep-C3KMLZM5.js → ripGrep-ZKQGTQAO.js} +35 -35
- package/chunks/{run-qwen-serve-3JN75CIQ.js → run-qwen-serve-ZPKPKECF.js} +65 -43
- package/chunks/{runtime-VUA4WQYD.js → runtime-2FLNNM36.js} +43 -43
- package/chunks/{scheduler-Z4IBXCOY.js → scheduler-365PJHNR.js} +35 -35
- package/chunks/{sdk-exporters-http-IL2346MJ.js → sdk-exporters-http-KHAB5JSD.js} +2 -2
- package/chunks/{sdk-impl-SYKGVWOZ.js → sdk-impl-KD7FSTC3.js} +2 -2
- package/chunks/{send-message-TL6FIMMN.js → send-message-ZM7MRUGP.js} +5 -5
- package/chunks/{serve-67T3P7XI.js → serve-QD2RNLKJ.js} +41 -41
- package/chunks/{server-46ZO2CLV.js → server-XLJVLTYM.js} +621 -332
- package/chunks/{session-B4IFAFC4.js → session-3VTUHH4Q.js} +73 -73
- package/chunks/{settings-AI2BTBOZ.js → settings-KULVPCQC.js} +39 -39
- package/chunks/{shell-BKII3B6E.js → shell-3SWW22MH.js} +35 -35
- package/chunks/{skill-6CFOWVGA.js → skill-KDHWYS7W.js} +14 -14
- package/chunks/{skill-settings-6BFQWMW4.js → skill-settings-NMY4JEJC.js} +39 -39
- package/chunks/{spawnChannel-FJXW35U7.js → spawnChannel-ZKS4Q5OU.js} +37 -37
- package/chunks/{standalone-update-WVINHRNS.js → standalone-update-7CXPGAQ4.js} +37 -37
- package/chunks/{startInteractiveUI-YE57CJ57.js → startInteractiveUI-2QQLEKM6.js} +399 -159
- package/chunks/{syntheticOutput-BN7E626U.js → syntheticOutput-ZLCUTKO2.js} +3 -3
- package/chunks/{task-create-Q727MXHJ.js → task-create-CQP5UEA3.js} +9 -9
- package/chunks/{task-list-G6KPQ5JT.js → task-list-XLEZOJXP.js} +5 -5
- package/chunks/{task-stop-TNXRNAL2.js → task-stop-7ZQM5CFF.js} +2 -2
- package/chunks/{task-update-YB7PXO4R.js → task-update-JA75U2SN.js} +9 -9
- package/chunks/{team-create-GNC7NFY6.js → team-create-2WTNGAOX.js} +35 -35
- package/chunks/{team-delete-GDO7H2T4.js → team-delete-MHY3UZGY.js} +5 -5
- package/chunks/{team-plan-approval-ECALJLIO.js → team-plan-approval-LZTYLEG4.js} +35 -35
- package/chunks/{terminal-image-renderer-II74TFVW.js → terminal-image-renderer-R5HHAFJN.js} +41 -36
- package/chunks/{theme-manager-2MGEDD22.js → theme-manager-PAUCSJFF.js} +36 -36
- package/chunks/{todoWrite-MHWHO5UO.js → todoWrite-UPVOHYGD.js} +4 -4
- package/chunks/{tool-search-S6LRRACA.js → tool-search-2BFCGLI6.js} +13 -13
- package/chunks/{total-session-admission-7WVAWQPU.js → total-session-admission-MK4SINFK.js} +39 -39
- package/chunks/{trustedFolders-NFS4KHO4.js → trustedFolders-TJ5S26N7.js} +36 -36
- package/chunks/{update-relaunch-Q5HLZ6UW.js → update-relaunch-N7AYLARF.js} +5 -5
- package/chunks/{updateCheck-UOVZSTP7.js → updateCheck-QRZ3DVT5.js} +38 -38
- package/chunks/{useAutoAcceptIndicator-PC6MOJCO.js → useAutoAcceptIndicator-DBJ7Y5AF.js} +42 -42
- package/chunks/{validateNonInterActiveAuth-YMQP3ZM7.js → validateNonInterActiveAuth-6ZQWUDS3.js} +69 -69
- package/chunks/{version-T4AQFZJH.js → version-AJQGQWXC.js} +1 -1
- package/chunks/{web-fetch-JQCJHEEX.js → web-fetch-QWJYRXFL.js} +13 -13
- package/chunks/{web-search-QGZ2KY4G.js → web-search-2AOXJGHU.js} +9 -9
- package/chunks/web-shell-static-O73YPVVC.js +33 -0
- package/chunks/{workflow-YIT27YWZ.js → workflow-ERH3SJG2.js} +36 -36
- package/chunks/{workspace-providers-status-FIDZQ2PL.js → workspace-providers-status-HZ474RA4.js} +43 -43
- package/chunks/{workspace-registration-store-RCSPE4DU.js → workspace-registration-store-6EUP4JXG.js} +1 -1
- package/chunks/{workspace-registry-5PEUCY6E.js → workspace-registry-R4APRRNC.js} +39 -39
- package/chunks/{workspace-service-LANDVPL7.js → workspace-service-HFIFDMU7.js} +45 -45
- package/chunks/{workspace-skills-status-2IQVJNIN.js → workspace-skills-status-HAHEIHGK.js} +41 -41
- package/chunks/{workspace-trust-reconciler-CZPZZCZC.js → workspace-trust-reconciler-65GTAGDK.js} +45 -45
- package/chunks/{write-file-G5VNGCOG.js → write-file-B34CDELV.js} +35 -35
- package/chunks/{zoom-image-6RBLD7X6.js → zoom-image-HPRBZHSS.js} +10 -10
- package/cli.js +12 -12
- package/package.json +3 -3
- package/web-shell/assets/{arc-B-Vtkp1W.js → arc-Ip-FFDJ0.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-qmTXIj64.js → architectureDiagram-3BPJPVTR-CChqgwIb.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-ZlnXEtdP.js → blockDiagram-GPEHLZMM-BHN-Tfss.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-Wyoirf6Z.js → c4Diagram-AAUBKEIU-BhyjzDjN.js} +1 -1
- package/web-shell/assets/channel-Cu8qd6OB.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-WQwbq9d8.js → chunk-2J33WTMH-BB9eyHrx.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-DQKnAXC4.js → chunk-4BX2VUAB-BeV7ce_J.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-DIdgXNcO.js → chunk-55IACEB6-DO7kXDiV.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-CUwGOLEd.js → chunk-727SXJPM-B27MPznD.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-CCBGZFZ4.js → chunk-AQP2D5EJ-DHIjqjD_.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-DMGXProk.js → chunk-FMBD7UC4-DabMqyN2.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-yejcFqsh.js → chunk-ND2GUHAM-Dw7Nnnxc.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-DxCyqTf7.js → chunk-QZHKN3VN-DdaZew1Q.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-BI3KrXhq.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BI3KrXhq.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-DOrF3cg_.js → cose-bilkent-S5V4N54A-CgBpCYH5.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-Be6CdYQ_.js → dagre-BM42HDAG-BB4IU8G0.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-B_Rjsft2.js → diagram-2AECGRRQ-BcUTHU37.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-BvQbKSm1.js → diagram-5GNKFQAL-B6Lyihyv.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-BsdmMdpS.js → diagram-KO2AKTUF-CRIJOjpG.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-CrQlBaNr.js → diagram-LMA3HP47-DdNiwWWT.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-aB1MD_DL.js → diagram-OG6HWLK6-Dz4b32Do.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-F-eUUn9n.js → erDiagram-TEJ5UH35-D-8NGw77.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-DY_d8lUK.js → flowDiagram-I6XJVG4X-Dun26LyM.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-Dqu7KBPg.js → ganttDiagram-6RSMTGT7-F10Hu1Gc.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-2IkU_VEj.js → gitGraphDiagram-PVQCEYII-Bf8Ez6-D.js} +1 -1
- package/web-shell/assets/{index-BuSbqggh.js → index-BXqw-nGq.js} +1 -1
- package/web-shell/assets/{index-DrfC2e9s.js → index-hcgjV7vS.js} +333 -333
- package/web-shell/assets/{infoDiagram-5YYISTIA-C4orwzPw.js → infoDiagram-5YYISTIA-DVgTMLvj.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-fXUEfef_.js → ishikawaDiagram-YF4QCWOH-uT-KepvK.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-Bs0I1_J5.js → journeyDiagram-JHISSGLW-Vg_XadQf.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-BPRj1dw_.js → kanban-definition-UN3LZRKU-Dyv1ESBE.js} +1 -1
- package/web-shell/assets/{linear-DFS6ZDpW.js → linear-BMIepYX3.js} +1 -1
- package/web-shell/assets/{mermaid.core-CZxjWMaO.js → mermaid.core-zA8pJ9ag.js} +5 -5
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-Dsr3PmNs.js → mindmap-definition-RKZ34NQL-BCW_BZ_5.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-D5Ngpz5Y.js → pieDiagram-4H26LBE5-DseNEGp2.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-WJK9I25z.js → quadrantDiagram-W4KKPZXB-6Z7wr1Fi.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-CmrYcwOH.js → requirementDiagram-4Y6WPE33-CVOlCRPf.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-7SjCc4Mv.js → sankeyDiagram-5OEKKPKP-CGhgrUJZ.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-Dl9E0IRM.js → sequenceDiagram-3UESZ5HK-dlqmpLuQ.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-CRRio7yV.js → stateDiagram-AJRCARHV-B9EW10Xb.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-CJTZJJ5X.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-DVyXjjfq.js → timeline-definition-PNZ67QCA-BBRh0mgZ.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-Nb2Lckzq.js → vennDiagram-CIIHVFJN-B8Gs-REP.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-DuL_otIP.js → wardley-L42UT6IY-D_y80Ur7.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-DVI9Q4Aa.js → wardleyDiagram-YWT4CUSO-D-CNfHJ-.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-BNjAm7KD.js → xychartDiagram-2RQKCTM6-DQ5CvELo.js} +1 -1
- package/web-shell/index.html +1 -1
- package/web-shell/assets/channel-DXaHnfjS.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-BigU82A0.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BigU82A0.js +0 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-1atT7XaU.js +0 -1
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// Force strict mode and setup for ESM
|
|
2
2
|
"use strict";
|
|
3
|
+
import {
|
|
4
|
+
formatHistoryGapNotice
|
|
5
|
+
} from "./chunk-KXSDEOFU.js";
|
|
3
6
|
import {
|
|
4
7
|
sanitizeTerminalText
|
|
5
8
|
} from "./chunk-4NFY2S7N.js";
|
|
6
|
-
import {
|
|
7
|
-
formatHistoryGapNotice
|
|
8
|
-
} from "./chunk-RFUHDCNF.js";
|
|
9
9
|
import {
|
|
10
10
|
isGoalStatusKind,
|
|
11
11
|
isTerminalGoalStatusKind
|
|
@@ -19,18 +19,18 @@ import {
|
|
|
19
19
|
setGoalTerminalObserver,
|
|
20
20
|
setLastGoalTerminal,
|
|
21
21
|
unregisterGoalHook
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-Y7E5LNLO.js";
|
|
23
23
|
import {
|
|
24
24
|
apiActivityTracker,
|
|
25
25
|
formatVisionBridgeNoticeDisplay,
|
|
26
26
|
isVisionBridgeNoticeDisplay
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-2U3WZGZG.js";
|
|
28
28
|
import {
|
|
29
29
|
ToolNames
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-IC4Z6LX6.js";
|
|
31
31
|
import {
|
|
32
32
|
createDebugLogger
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-OIVKILPI.js";
|
|
34
34
|
import {
|
|
35
35
|
writeStderrLine,
|
|
36
36
|
writeStderrLineSafe
|
|
@@ -2869,7 +2869,7 @@ async function extractMetadata(conversation, config) {
|
|
|
2869
2869
|
const gitBranch = firstRecord?.gitBranch;
|
|
2870
2870
|
let gitRepo;
|
|
2871
2871
|
if (cwd) {
|
|
2872
|
-
const { getGitRepoName } = await import("./deferred-core-runtime-
|
|
2872
|
+
const { getGitRepoName } = await import("./deferred-core-runtime-BWRCCFTE.js");
|
|
2873
2873
|
gitRepo = getGitRepoName(cwd);
|
|
2874
2874
|
}
|
|
2875
2875
|
let model;
|
|
@@ -10,19 +10,19 @@ import {
|
|
|
10
10
|
} from "./chunk-MR3PXB6E.js";
|
|
11
11
|
import {
|
|
12
12
|
ideContextStore
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-Y7E5LNLO.js";
|
|
14
14
|
import {
|
|
15
15
|
require_proper_lockfile
|
|
16
16
|
} from "./chunk-KRXPRVGL.js";
|
|
17
17
|
import {
|
|
18
18
|
atomicWriteFileSync
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-FOGU3LJX.js";
|
|
20
20
|
import {
|
|
21
21
|
FatalConfigError,
|
|
22
22
|
Storage,
|
|
23
23
|
createDebugLogger,
|
|
24
24
|
getErrorMessage
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-OIVKILPI.js";
|
|
26
26
|
import {
|
|
27
27
|
writeStderrLine
|
|
28
28
|
} from "./chunk-KGJGEEVR.js";
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
import {
|
|
4
4
|
functionResponsePartsToString
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-RUL4S3K3.js";
|
|
6
6
|
import {
|
|
7
7
|
parseAndFormatApiError
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-Y7E5LNLO.js";
|
|
9
9
|
import {
|
|
10
10
|
formatVisionBridgeNoticeDisplay,
|
|
11
11
|
isVisionBridgeNoticeDisplay
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-2U3WZGZG.js";
|
|
13
13
|
import {
|
|
14
14
|
init_esbuild_shims
|
|
15
15
|
} from "./chunk-5O2XNYP6.js";
|
|
@@ -10,11 +10,11 @@ import {
|
|
|
10
10
|
} from "./chunk-CPBF7KYF.js";
|
|
11
11
|
import {
|
|
12
12
|
atomicWriteJSON
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-FOGU3LJX.js";
|
|
14
14
|
import {
|
|
15
15
|
Storage,
|
|
16
16
|
isNodeError
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-OIVKILPI.js";
|
|
18
18
|
import {
|
|
19
19
|
init_esbuild_shims
|
|
20
20
|
} from "./chunk-5O2XNYP6.js";
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
// Force strict mode and setup for ESM
|
|
2
2
|
"use strict";
|
|
3
|
+
import {
|
|
4
|
+
MAX_INLINE_IMAGE_ENCODED_LENGTH
|
|
5
|
+
} from "./chunk-2VSTGY6M.js";
|
|
3
6
|
import {
|
|
4
7
|
MAX_TERMINAL_IMAGE_BYTES
|
|
5
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-IC4Z6LX6.js";
|
|
6
9
|
import {
|
|
7
10
|
init_esbuild_shims
|
|
8
11
|
} from "./chunk-5O2XNYP6.js";
|
|
@@ -847,11 +850,15 @@ var MAX_PREVIEW_ROWS = 24;
|
|
|
847
850
|
var ESTIMATED_CELL_WIDTH_PX = 8;
|
|
848
851
|
var ESTIMATED_CELL_HEIGHT_PX = 16;
|
|
849
852
|
var MAX_REASON_CHARS = 200;
|
|
853
|
+
var MAX_INLINE_IMAGE_DIMENSION = 1e6;
|
|
854
|
+
var MAX_INLINE_IMAGE_PIXELS = 64e6;
|
|
850
855
|
var CMD_SHELL_METACHARACTERS = /[&|<>^%"!()\n\r]/;
|
|
851
856
|
var RENDER_CACHE_LIMIT = 40;
|
|
852
857
|
var RENDER_CACHE_BYTE_LIMIT = 32 * 1024 * 1024;
|
|
853
858
|
var renderCache = /* @__PURE__ */ new Map();
|
|
854
859
|
var renderCacheBytes = 0;
|
|
860
|
+
var INLINE_DECODE_CACHE_LIMIT = 4;
|
|
861
|
+
var inlineDecodeCache = /* @__PURE__ */ new Map();
|
|
855
862
|
var TRANSMITTED_KEY_LIMIT = 256;
|
|
856
863
|
var transmittedKeys = /* @__PURE__ */ new Set();
|
|
857
864
|
function wasKittyImageWritten(key) {
|
|
@@ -896,6 +903,44 @@ function containsCmdShellMetacharacters(filePath) {
|
|
|
896
903
|
return CMD_SHELL_METACHARACTERS.test(filePath);
|
|
897
904
|
}
|
|
898
905
|
__name(containsCmdShellMetacharacters, "containsCmdShellMetacharacters");
|
|
906
|
+
function prepareInlineTerminalImage({
|
|
907
|
+
data,
|
|
908
|
+
mimeType,
|
|
909
|
+
contentWidth,
|
|
910
|
+
availableTerminalHeight,
|
|
911
|
+
env = process.env,
|
|
912
|
+
stdoutIsTTY = process.stdout.isTTY,
|
|
913
|
+
disabled = false
|
|
914
|
+
}) {
|
|
915
|
+
const format = getImageFormat(mimeType);
|
|
916
|
+
const emptyFallback = format ? `[image: ${format}]` : "[image]";
|
|
917
|
+
if (format !== "png") {
|
|
918
|
+
return { fallbackText: emptyFallback, result: null };
|
|
919
|
+
}
|
|
920
|
+
const decoded = getDecodedInlinePng(data);
|
|
921
|
+
if (!decoded) {
|
|
922
|
+
return { fallbackText: emptyFallback, result: null };
|
|
923
|
+
}
|
|
924
|
+
const { png, size } = decoded;
|
|
925
|
+
const fallbackText = `[image: ${size.width}x${size.height} png]`;
|
|
926
|
+
if (disabled) {
|
|
927
|
+
return { fallbackText, result: null };
|
|
928
|
+
}
|
|
929
|
+
const shape = fitImageToTerminal2(size, contentWidth, availableTerminalHeight);
|
|
930
|
+
const useKitty = supportsKittyImageProtocol(env, stdoutIsTTY);
|
|
931
|
+
const chafaPath = useKitty ? null : findExecutable("chafa", env);
|
|
932
|
+
const cacheKey = createInlineRenderCacheKey(png, shape, useKitty, chafaPath);
|
|
933
|
+
const cached = getCachedRenderResult(cacheKey);
|
|
934
|
+
if (cached) {
|
|
935
|
+
return { fallbackText, result: cached };
|
|
936
|
+
}
|
|
937
|
+
const result = useKitty ? { ...renderKitty(png, shape), key: cacheKey } : renderWithChafa({ data: png }, shape, env, chafaPath);
|
|
938
|
+
if (result.kind !== "unavailable") {
|
|
939
|
+
rememberRenderResult(cacheKey, result);
|
|
940
|
+
}
|
|
941
|
+
return { fallbackText, result };
|
|
942
|
+
}
|
|
943
|
+
__name(prepareInlineTerminalImage, "prepareInlineTerminalImage");
|
|
899
944
|
function renderTerminalImage({
|
|
900
945
|
display,
|
|
901
946
|
contentWidth,
|
|
@@ -959,7 +1004,7 @@ function renderTerminalImage({
|
|
|
959
1004
|
reason: `Image exceeds the ${MAX_TERMINAL_IMAGE_BYTES} byte display limit.`
|
|
960
1005
|
};
|
|
961
1006
|
}
|
|
962
|
-
const result = useKitty ? { ...renderKitty(png, shape), key: cacheKey } : renderWithChafa(display.filePath, shape, env, chafaPath);
|
|
1007
|
+
const result = useKitty ? { ...renderKitty(png, shape), key: cacheKey } : renderWithChafa({ filePath: display.filePath }, shape, env, chafaPath);
|
|
963
1008
|
if (result.kind !== "unavailable") {
|
|
964
1009
|
rememberRenderResult(cacheKey, result);
|
|
965
1010
|
}
|
|
@@ -996,6 +1041,70 @@ function createRenderCacheKey(filePath, stat, shape, useKitty, chafaPath) {
|
|
|
996
1041
|
].join("\0");
|
|
997
1042
|
}
|
|
998
1043
|
__name(createRenderCacheKey, "createRenderCacheKey");
|
|
1044
|
+
function createInlineRenderCacheKey(png, shape, useKitty, chafaPath) {
|
|
1045
|
+
return [
|
|
1046
|
+
"inline",
|
|
1047
|
+
crypto2.createHash("sha256").update(png).digest("hex"),
|
|
1048
|
+
shape.widthCells,
|
|
1049
|
+
shape.rows,
|
|
1050
|
+
useKitty ? "kitty" : chafaPath ?? "none"
|
|
1051
|
+
].join("\0");
|
|
1052
|
+
}
|
|
1053
|
+
__name(createInlineRenderCacheKey, "createInlineRenderCacheKey");
|
|
1054
|
+
function getImageFormat(mimeType) {
|
|
1055
|
+
const match = /^image\/([a-z0-9][a-z0-9.+-]*)$/.exec(
|
|
1056
|
+
mimeType.trim().toLowerCase()
|
|
1057
|
+
);
|
|
1058
|
+
return match?.[1] ?? null;
|
|
1059
|
+
}
|
|
1060
|
+
__name(getImageFormat, "getImageFormat");
|
|
1061
|
+
function decodeInlineImage(data) {
|
|
1062
|
+
if (data.length === 0 || data.length > MAX_INLINE_IMAGE_ENCODED_LENGTH) {
|
|
1063
|
+
return null;
|
|
1064
|
+
}
|
|
1065
|
+
const normalized = data.replace(/\s/g, "");
|
|
1066
|
+
if (normalized.length === 0 || normalized.length % 4 === 1 || !/^[A-Za-z0-9+/]*={0,2}$/.test(normalized)) {
|
|
1067
|
+
return null;
|
|
1068
|
+
}
|
|
1069
|
+
const decoded = Buffer.from(normalized, "base64");
|
|
1070
|
+
if (decoded.length === 0 || decoded.length > MAX_TERMINAL_IMAGE_BYTES || decoded.toString("base64").replace(/=+$/, "") !== normalized.replace(/=+$/, "")) {
|
|
1071
|
+
return null;
|
|
1072
|
+
}
|
|
1073
|
+
return decoded;
|
|
1074
|
+
}
|
|
1075
|
+
__name(decodeInlineImage, "decodeInlineImage");
|
|
1076
|
+
function getDecodedInlinePng(data) {
|
|
1077
|
+
const cached = inlineDecodeCache.get(data);
|
|
1078
|
+
if (cached) {
|
|
1079
|
+
inlineDecodeCache.delete(data);
|
|
1080
|
+
inlineDecodeCache.set(data, cached);
|
|
1081
|
+
return cached;
|
|
1082
|
+
}
|
|
1083
|
+
const png = decodeInlineImage(data);
|
|
1084
|
+
if (!png) return null;
|
|
1085
|
+
const size = readValidatedInlinePngSize(png);
|
|
1086
|
+
if (!size) return null;
|
|
1087
|
+
const decoded = { png, size };
|
|
1088
|
+
inlineDecodeCache.set(data, decoded);
|
|
1089
|
+
while (inlineDecodeCache.size > INLINE_DECODE_CACHE_LIMIT) {
|
|
1090
|
+
const oldest = inlineDecodeCache.keys().next().value;
|
|
1091
|
+
if (oldest === void 0) break;
|
|
1092
|
+
inlineDecodeCache.delete(oldest);
|
|
1093
|
+
}
|
|
1094
|
+
return decoded;
|
|
1095
|
+
}
|
|
1096
|
+
__name(getDecodedInlinePng, "getDecodedInlinePng");
|
|
1097
|
+
function readValidatedInlinePngSize(png) {
|
|
1098
|
+
if (png.length < 24 || png.readUInt32BE(8) !== 13 || png.subarray(12, 16).toString("ascii") !== "IHDR") {
|
|
1099
|
+
return null;
|
|
1100
|
+
}
|
|
1101
|
+
const size = readPngSize(png);
|
|
1102
|
+
if (!size || !Number.isInteger(size.width) || !Number.isInteger(size.height) || size.width <= 0 || size.height <= 0 || size.width > MAX_INLINE_IMAGE_DIMENSION || size.height > MAX_INLINE_IMAGE_DIMENSION || size.width * size.height > MAX_INLINE_IMAGE_PIXELS) {
|
|
1103
|
+
return null;
|
|
1104
|
+
}
|
|
1105
|
+
return size;
|
|
1106
|
+
}
|
|
1107
|
+
__name(readValidatedInlinePngSize, "readValidatedInlinePngSize");
|
|
999
1108
|
function getCachedRenderResult(key) {
|
|
1000
1109
|
const cached = renderCache.get(key);
|
|
1001
1110
|
if (cached) {
|
|
@@ -1097,7 +1206,7 @@ function renderKitty(png, shape) {
|
|
|
1097
1206
|
};
|
|
1098
1207
|
}
|
|
1099
1208
|
__name(renderKitty, "renderKitty");
|
|
1100
|
-
function renderWithChafa(
|
|
1209
|
+
function renderWithChafa(source, shape, env, chafaPath) {
|
|
1101
1210
|
if (!chafaPath) {
|
|
1102
1211
|
return {
|
|
1103
1212
|
kind: "unavailable",
|
|
@@ -1105,7 +1214,7 @@ function renderWithChafa(filePath, shape, env, chafaPath) {
|
|
|
1105
1214
|
};
|
|
1106
1215
|
}
|
|
1107
1216
|
const useShell = shouldRunThroughShell(chafaPath);
|
|
1108
|
-
if (useShell && containsCmdShellMetacharacters(filePath)) {
|
|
1217
|
+
if (useShell && "filePath" in source && containsCmdShellMetacharacters(source.filePath)) {
|
|
1109
1218
|
return {
|
|
1110
1219
|
kind: "unavailable",
|
|
1111
1220
|
reason: "Image path contains characters that cannot be safely passed to the renderer on this platform."
|
|
@@ -1120,14 +1229,15 @@ function renderWithChafa(filePath, shape, env, chafaPath) {
|
|
|
1120
1229
|
"--format=symbols",
|
|
1121
1230
|
"--symbols=block",
|
|
1122
1231
|
`--size=${shape.widthCells}x${shape.rows}`,
|
|
1123
|
-
filePath
|
|
1232
|
+
"filePath" in source ? source.filePath : "-"
|
|
1124
1233
|
],
|
|
1125
1234
|
{
|
|
1126
1235
|
encoding: "utf8",
|
|
1127
1236
|
env: createRendererChildEnv(env),
|
|
1128
1237
|
shell: useShell,
|
|
1129
1238
|
maxBuffer: CHAFA_MAX_OUTPUT_BYTES,
|
|
1130
|
-
timeout: CHAFA_TIMEOUT_MS
|
|
1239
|
+
timeout: CHAFA_TIMEOUT_MS,
|
|
1240
|
+
..."data" in source ? { input: source.data } : {}
|
|
1131
1241
|
}
|
|
1132
1242
|
);
|
|
1133
1243
|
const lines = stdout.split(/\r?\n/).filter((line) => line.length > 0);
|
|
@@ -1150,12 +1260,14 @@ __name(firstLineBounded, "firstLineBounded");
|
|
|
1150
1260
|
|
|
1151
1261
|
export {
|
|
1152
1262
|
renderMermaidImageAsync,
|
|
1263
|
+
MAX_INLINE_IMAGE_PIXELS,
|
|
1153
1264
|
TRANSMITTED_KEY_LIMIT,
|
|
1154
1265
|
wasKittyImageWritten,
|
|
1155
1266
|
markKittyImageWritten,
|
|
1156
1267
|
supportsKittyImageProtocol,
|
|
1157
1268
|
getTerminalImageRenderSupport,
|
|
1158
1269
|
containsCmdShellMetacharacters,
|
|
1270
|
+
prepareInlineTerminalImage,
|
|
1159
1271
|
renderTerminalImage
|
|
1160
1272
|
};
|
|
1161
1273
|
/**
|
|
@@ -5,14 +5,14 @@ import {
|
|
|
5
5
|
isTranscribableVoiceModel,
|
|
6
6
|
readVoiceLanguage,
|
|
7
7
|
resolveVoiceTransport
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-55LYDVPU.js";
|
|
9
9
|
import {
|
|
10
10
|
resolvePath
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-AOHJKPKL.js";
|
|
12
12
|
import {
|
|
13
13
|
createDebugLogger,
|
|
14
14
|
isSubpath
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-OIVKILPI.js";
|
|
16
16
|
import {
|
|
17
17
|
init_esbuild_shims
|
|
18
18
|
} from "./chunk-5O2XNYP6.js";
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
init_esbuild_shims();
|
|
25
25
|
import process from "node:process";
|
|
26
26
|
import { lookup as dnsLookup } from "node:dns/promises";
|
|
27
|
-
import { isIP } from "node:net";
|
|
27
|
+
import { BlockList, isIP } from "node:net";
|
|
28
28
|
|
|
29
29
|
// packages/cli/src/services/voice-keyterms.ts
|
|
30
30
|
init_esbuild_shims();
|
|
@@ -238,6 +238,14 @@ var MIN_KEYTERM_ECHO_TOKENS = 8;
|
|
|
238
238
|
var MIN_ABSOLUTE_KEYTERM_ECHO_TOKENS = 10;
|
|
239
239
|
var MIN_KEYTERM_SET_ECHO_RATIO = 0.3;
|
|
240
240
|
var debugLogger = createDebugLogger("VOICE_TRANSCRIBER");
|
|
241
|
+
var BLOCKED_TRANSITION_IPV6_ADDRESSES = new BlockList();
|
|
242
|
+
for (const [address, prefix] of [
|
|
243
|
+
["64:ff9b:1::", 48],
|
|
244
|
+
["2001::", 23],
|
|
245
|
+
["2002::", 16]
|
|
246
|
+
]) {
|
|
247
|
+
BLOCKED_TRANSITION_IPV6_ADDRESSES.addSubnet(address, prefix, "ipv6");
|
|
248
|
+
}
|
|
241
249
|
function trimTrailingSlashes(value) {
|
|
242
250
|
return value.replace(/\/+$/, "");
|
|
243
251
|
}
|
|
@@ -264,35 +272,78 @@ function normalizeBaseUrl(baseUrl, modelName) {
|
|
|
264
272
|
} catch {
|
|
265
273
|
throw new Error(`Voice model '${modelName}' has an invalid baseUrl.`);
|
|
266
274
|
}
|
|
267
|
-
url.username
|
|
268
|
-
|
|
275
|
+
if (url.username || url.password) {
|
|
276
|
+
throw new Error(
|
|
277
|
+
`Voice model '${modelName}' baseUrl must not contain embedded credentials.`
|
|
278
|
+
);
|
|
279
|
+
}
|
|
269
280
|
return trimTrailingSlashes(url.toString());
|
|
270
281
|
}
|
|
271
282
|
__name(normalizeBaseUrl, "normalizeBaseUrl");
|
|
283
|
+
function normalizeAllowedVoiceBaseUrl(baseUrl) {
|
|
284
|
+
try {
|
|
285
|
+
const url = new URL(baseUrl.trim());
|
|
286
|
+
if (url.username || url.password) {
|
|
287
|
+
return void 0;
|
|
288
|
+
}
|
|
289
|
+
return trimTrailingSlashes(url.toString());
|
|
290
|
+
} catch {
|
|
291
|
+
return void 0;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
__name(normalizeAllowedVoiceBaseUrl, "normalizeAllowedVoiceBaseUrl");
|
|
295
|
+
function isInsecureVoiceBaseUrlAllowed(settings, normalizedBaseUrl) {
|
|
296
|
+
const allowed = settings.merged.security?.allowedInsecureVoiceBaseUrls;
|
|
297
|
+
return Array.isArray(allowed) && allowed.some(
|
|
298
|
+
(candidate) => typeof candidate === "string" && normalizeAllowedVoiceBaseUrl(candidate) === normalizedBaseUrl
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
__name(isInsecureVoiceBaseUrlAllowed, "isInsecureVoiceBaseUrlAllowed");
|
|
272
302
|
function normalizeHostname(hostname) {
|
|
273
303
|
return hostname.toLowerCase().replace(/^\[|\]$/g, "");
|
|
274
304
|
}
|
|
275
305
|
__name(normalizeHostname, "normalizeHostname");
|
|
306
|
+
function normalizeIpAddress(address) {
|
|
307
|
+
const host = normalizeHostname(address);
|
|
308
|
+
if (isIP(host) !== 6) {
|
|
309
|
+
return host;
|
|
310
|
+
}
|
|
311
|
+
try {
|
|
312
|
+
return normalizeHostname(new URL(`http://[${host}]/`).hostname);
|
|
313
|
+
} catch {
|
|
314
|
+
return host;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
__name(normalizeIpAddress, "normalizeIpAddress");
|
|
276
318
|
function isLoopbackHost(hostname) {
|
|
277
319
|
const host = normalizeHostname(hostname);
|
|
278
320
|
return host === "localhost" || host === "127.0.0.1" || host === "::1";
|
|
279
321
|
}
|
|
280
322
|
__name(isLoopbackHost, "isLoopbackHost");
|
|
323
|
+
function isAwsIpv6MetadataAddress(hostname) {
|
|
324
|
+
const host = normalizeHostname(hostname);
|
|
325
|
+
if (isIP(host) !== 6) {
|
|
326
|
+
return false;
|
|
327
|
+
}
|
|
328
|
+
try {
|
|
329
|
+
return normalizeHostname(new URL(`http://[${host}]/`).hostname) === "fd00:ec2::254";
|
|
330
|
+
} catch {
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
__name(isAwsIpv6MetadataAddress, "isAwsIpv6MetadataAddress");
|
|
281
335
|
function readIpv4CompatibleIpv6(host) {
|
|
282
336
|
if (!host.startsWith("::") || host.startsWith("::ffff:")) {
|
|
283
337
|
return void 0;
|
|
284
338
|
}
|
|
285
339
|
const parts = host.slice(2).split(":");
|
|
286
|
-
if (parts.length === 0 || parts.length > 2 || parts.some((
|
|
340
|
+
if (parts.length === 0 || parts.length > 2 || parts.some((part) => !part)) {
|
|
287
341
|
return void 0;
|
|
288
342
|
}
|
|
289
343
|
if (parts.some((part) => !/^[0-9a-f]{1,4}$/i.test(part))) {
|
|
290
344
|
return void 0;
|
|
291
345
|
}
|
|
292
346
|
const hextets = parts.map((part) => Number.parseInt(part, 16));
|
|
293
|
-
if (hextets.some((part) => !Number.isInteger(part) || part < 0 || part > 65535)) {
|
|
294
|
-
return void 0;
|
|
295
|
-
}
|
|
296
347
|
const value = hextets.length === 1 ? hextets[0] : hextets[0] << 16 | hextets[1];
|
|
297
348
|
return [
|
|
298
349
|
value >>> 24 & 255,
|
|
@@ -302,39 +353,130 @@ function readIpv4CompatibleIpv6(host) {
|
|
|
302
353
|
].join(".");
|
|
303
354
|
}
|
|
304
355
|
__name(readIpv4CompatibleIpv6, "readIpv4CompatibleIpv6");
|
|
305
|
-
function
|
|
306
|
-
const
|
|
307
|
-
if (
|
|
308
|
-
return
|
|
356
|
+
function readIpv4MappedIpv6(host) {
|
|
357
|
+
const dotted = host.match(/^::ffff:(\d+(?:\.\d+){3})$/i);
|
|
358
|
+
if (dotted && isIP(dotted[1]) === 4) {
|
|
359
|
+
return dotted[1];
|
|
309
360
|
}
|
|
310
|
-
const
|
|
361
|
+
const hex = host.match(/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i);
|
|
362
|
+
if (!hex) {
|
|
363
|
+
return void 0;
|
|
364
|
+
}
|
|
365
|
+
return readIpv4HexPair(hex[1], hex[2]);
|
|
366
|
+
}
|
|
367
|
+
__name(readIpv4MappedIpv6, "readIpv4MappedIpv6");
|
|
368
|
+
function readIpv4HexPair(highHex, lowHex) {
|
|
369
|
+
const high = Number.parseInt(highHex, 16);
|
|
370
|
+
const low = Number.parseInt(lowHex, 16);
|
|
371
|
+
return [high >>> 8, high & 255, low >>> 8, low & 255].join(".");
|
|
372
|
+
}
|
|
373
|
+
__name(readIpv4HexPair, "readIpv4HexPair");
|
|
374
|
+
function readWellKnownNat64Ipv6(host) {
|
|
375
|
+
const prefix = "64:ff9b::";
|
|
376
|
+
if (!host.startsWith(prefix)) {
|
|
377
|
+
return void 0;
|
|
378
|
+
}
|
|
379
|
+
const suffix = host.slice(prefix.length);
|
|
380
|
+
if (!suffix) {
|
|
381
|
+
return "0.0.0.0";
|
|
382
|
+
}
|
|
383
|
+
const groups = suffix.split(":");
|
|
384
|
+
if (groups.length > 2 || groups.some((group) => !/^[0-9a-f]{1,4}$/i.test(group))) {
|
|
385
|
+
return void 0;
|
|
386
|
+
}
|
|
387
|
+
return groups.length === 1 ? readIpv4HexPair("0", groups[0]) : readIpv4HexPair(groups[0], groups[1]);
|
|
388
|
+
}
|
|
389
|
+
__name(readWellKnownNat64Ipv6, "readWellKnownNat64Ipv6");
|
|
390
|
+
function isBlockedTransitionIpv6Address(host) {
|
|
391
|
+
return isIP(host) === 6 && BLOCKED_TRANSITION_IPV6_ADDRESSES.check(host, "ipv6");
|
|
392
|
+
}
|
|
393
|
+
__name(isBlockedTransitionIpv6Address, "isBlockedTransitionIpv6Address");
|
|
394
|
+
function unwrapIpv6TransitionStep(host) {
|
|
395
|
+
const ipv4Mapped = readIpv4MappedIpv6(host);
|
|
311
396
|
if (ipv4Mapped) {
|
|
312
|
-
return
|
|
397
|
+
return { address: ipv4Mapped };
|
|
313
398
|
}
|
|
314
|
-
const ipv4Compatible = host
|
|
399
|
+
const ipv4Compatible = readIpv4CompatibleIpv6(host);
|
|
315
400
|
if (ipv4Compatible) {
|
|
316
|
-
return
|
|
401
|
+
return { address: ipv4Compatible };
|
|
317
402
|
}
|
|
318
|
-
const
|
|
319
|
-
if (
|
|
320
|
-
return
|
|
403
|
+
const nat64 = readWellKnownNat64Ipv6(host);
|
|
404
|
+
if (nat64) {
|
|
405
|
+
return { address: nat64 };
|
|
321
406
|
}
|
|
322
407
|
if (host.startsWith("::ffff:")) {
|
|
408
|
+
return "blocked";
|
|
409
|
+
}
|
|
410
|
+
return void 0;
|
|
411
|
+
}
|
|
412
|
+
__name(unwrapIpv6TransitionStep, "unwrapIpv6TransitionStep");
|
|
413
|
+
function isPrivateNetworkIp(hostname) {
|
|
414
|
+
const host = normalizeIpAddress(hostname);
|
|
415
|
+
if (isBlockedTransitionIpv6Address(host)) {
|
|
323
416
|
return true;
|
|
324
417
|
}
|
|
418
|
+
if (isLoopbackHost(host)) {
|
|
419
|
+
return false;
|
|
420
|
+
}
|
|
421
|
+
const step = unwrapIpv6TransitionStep(host);
|
|
422
|
+
if (step === "blocked") {
|
|
423
|
+
return true;
|
|
424
|
+
}
|
|
425
|
+
if (step) {
|
|
426
|
+
return isPrivateNetworkIp(step.address);
|
|
427
|
+
}
|
|
325
428
|
if (isIP(host) === 4) {
|
|
326
429
|
const [first = 0, second = 0] = host.split(".").map(Number);
|
|
327
430
|
return first === 0 || first === 10 || first === 127 || first === 169 && second === 254 || first === 172 && second >= 16 && second <= 31 || first === 192 && second === 168 || first === 100 && second >= 64 && second <= 127;
|
|
328
431
|
}
|
|
329
432
|
if (isIP(host) === 6) {
|
|
330
|
-
const firstHextet = Number.parseInt(host.split(":", 1)[0] || "", 16);
|
|
331
|
-
|
|
332
|
-
const isUniqueLocal = (firstHextet & 65024) === 64512;
|
|
333
|
-
return host === "::" || isLinkLocal || isUniqueLocal;
|
|
433
|
+
const firstHextet = Number.parseInt(host.split(":", 1)[0] || "0", 16);
|
|
434
|
+
return host === "::" || (firstHextet & 65472) === 65152 || (firstHextet & 65024) === 64512;
|
|
334
435
|
}
|
|
335
436
|
return false;
|
|
336
437
|
}
|
|
337
438
|
__name(isPrivateNetworkIp, "isPrivateNetworkIp");
|
|
439
|
+
function isAlwaysBlockedVoiceAddress(address) {
|
|
440
|
+
const host = normalizeIpAddress(address);
|
|
441
|
+
if (isBlockedTransitionIpv6Address(host)) {
|
|
442
|
+
return true;
|
|
443
|
+
}
|
|
444
|
+
if (isLoopbackHost(host)) {
|
|
445
|
+
return true;
|
|
446
|
+
}
|
|
447
|
+
const step = unwrapIpv6TransitionStep(host);
|
|
448
|
+
if (step === "blocked") {
|
|
449
|
+
return true;
|
|
450
|
+
}
|
|
451
|
+
if (step) {
|
|
452
|
+
return isAlwaysBlockedVoiceAddress(step.address);
|
|
453
|
+
}
|
|
454
|
+
if (isIP(host) === 4) {
|
|
455
|
+
const [first = 0, second = 0] = host.split(".").map(Number);
|
|
456
|
+
return first === 0 || first === 127 || first === 169 && second === 254 || host === "100.100.100.200";
|
|
457
|
+
}
|
|
458
|
+
if (isIP(host) === 6) {
|
|
459
|
+
const firstHextet = Number.parseInt(host.split(":", 1)[0] || "0", 16);
|
|
460
|
+
return host === "::" || isAwsIpv6MetadataAddress(host) || (firstHextet & 65472) === 65152;
|
|
461
|
+
}
|
|
462
|
+
return false;
|
|
463
|
+
}
|
|
464
|
+
__name(isAlwaysBlockedVoiceAddress, "isAlwaysBlockedVoiceAddress");
|
|
465
|
+
function isLoopbackVoiceAddress(address) {
|
|
466
|
+
const host = normalizeIpAddress(address);
|
|
467
|
+
if (isLoopbackHost(host)) {
|
|
468
|
+
return true;
|
|
469
|
+
}
|
|
470
|
+
const step = unwrapIpv6TransitionStep(host);
|
|
471
|
+
if (step && step !== "blocked") {
|
|
472
|
+
return isLoopbackVoiceAddress(step.address);
|
|
473
|
+
}
|
|
474
|
+
if (isIP(host) === 4) {
|
|
475
|
+
return host.startsWith("127.");
|
|
476
|
+
}
|
|
477
|
+
return false;
|
|
478
|
+
}
|
|
479
|
+
__name(isLoopbackVoiceAddress, "isLoopbackVoiceAddress");
|
|
338
480
|
async function defaultLookupHost(hostname) {
|
|
339
481
|
return dnsLookup(hostname, { all: true });
|
|
340
482
|
}
|
|
@@ -345,9 +487,9 @@ async function assertVoiceBaseUrlNetworkAllowed(voiceConfig, lookupHost, abortSi
|
|
|
345
487
|
return;
|
|
346
488
|
}
|
|
347
489
|
if (isIP(hostname) !== 0) {
|
|
348
|
-
if (isPrivateNetworkIp(hostname)) {
|
|
490
|
+
if (isAlwaysBlockedVoiceAddress(hostname) || !voiceConfig.allowInsecureBaseUrl && isPrivateNetworkIp(hostname)) {
|
|
349
491
|
throw new Error(
|
|
350
|
-
`Voice model '${voiceConfig.model}' resolved to a private-network address.`
|
|
492
|
+
isLoopbackVoiceAddress(hostname) ? `Voice model '${voiceConfig.model}' uses a loopback address outside the accepted spellings. To use a local ASR endpoint, set the baseUrl to http://localhost, http://127.0.0.1, or http://[::1].` : `Voice model '${voiceConfig.model}' resolved to a private-network address.`
|
|
351
493
|
);
|
|
352
494
|
}
|
|
353
495
|
return;
|
|
@@ -378,9 +520,13 @@ async function assertVoiceBaseUrlNetworkAllowed(voiceConfig, lookupHost, abortSi
|
|
|
378
520
|
if (onAbort) abortSignal?.removeEventListener("abort", onAbort);
|
|
379
521
|
}
|
|
380
522
|
const records = Array.isArray(result) ? result : [result];
|
|
381
|
-
if (records.some(
|
|
523
|
+
if (records.some(
|
|
524
|
+
(record) => isAlwaysBlockedVoiceAddress(record.address) || !voiceConfig.allowInsecureBaseUrl && isPrivateNetworkIp(record.address)
|
|
525
|
+
)) {
|
|
382
526
|
throw new Error(
|
|
383
|
-
`Voice model '${voiceConfig.model}' resolved to a
|
|
527
|
+
records.some((record) => isLoopbackVoiceAddress(record.address)) ? `Voice model '${voiceConfig.model}' resolved to a loopback address. Loopback DNS results are always blocked; to use a local ASR endpoint, configure an explicit loopback baseUrl: http://localhost, http://127.0.0.1, or http://[::1].` : voiceConfig.allowInsecureBaseUrl && records.some(
|
|
528
|
+
(record) => isAlwaysBlockedVoiceAddress(record.address)
|
|
529
|
+
) ? `Voice model '${voiceConfig.model}' resolved to an address that is always blocked (metadata, link-local, or transition range), even when the baseUrl is listed in security.allowedInsecureVoiceBaseUrls.` : `Voice model '${voiceConfig.model}' resolved to a private-network address.`
|
|
384
530
|
);
|
|
385
531
|
}
|
|
386
532
|
}
|
|
@@ -390,7 +536,8 @@ function readApiKey(settings, model, baseUrl, env) {
|
|
|
390
536
|
return void 0;
|
|
391
537
|
}
|
|
392
538
|
const envKey = model.envKey ?? DEFAULT_OPENAI_API_KEY;
|
|
393
|
-
const
|
|
539
|
+
const envSource = env ?? process.env;
|
|
540
|
+
const envValue = Object.hasOwn(envSource, envKey) ? envSource[envKey] : void 0;
|
|
394
541
|
if (envValue && envValue.trim().length > 0) {
|
|
395
542
|
return envValue.trim();
|
|
396
543
|
}
|
|
@@ -431,14 +578,28 @@ function resolveVoiceTranscriptionConfig({
|
|
|
431
578
|
const normalizedBaseUrl = normalizeBaseUrl(baseUrl, voiceModel);
|
|
432
579
|
const parsedBaseUrl = new URL(normalizedBaseUrl);
|
|
433
580
|
const isLocalhost = isLoopbackHost(parsedBaseUrl.hostname);
|
|
434
|
-
|
|
581
|
+
const allowInsecureBaseUrl = isInsecureVoiceBaseUrlAllowed(
|
|
582
|
+
settings,
|
|
583
|
+
normalizedBaseUrl
|
|
584
|
+
);
|
|
585
|
+
if (parsedBaseUrl.protocol !== "http:" && parsedBaseUrl.protocol !== "https:") {
|
|
586
|
+
throw new Error(
|
|
587
|
+
`Voice model '${voiceModel}' must use an http or https baseUrl.`
|
|
588
|
+
);
|
|
589
|
+
}
|
|
590
|
+
if (!isLocalhost && isAlwaysBlockedVoiceAddress(parsedBaseUrl.hostname)) {
|
|
591
|
+
throw new Error(
|
|
592
|
+
isLoopbackVoiceAddress(parsedBaseUrl.hostname) ? `Voice model '${voiceModel}' uses a loopback address outside the accepted spellings. To use a local ASR endpoint, set the baseUrl to http://localhost, http://127.0.0.1, or http://[::1].` : `Voice model '${voiceModel}' must not use a private-network baseUrl.`
|
|
593
|
+
);
|
|
594
|
+
}
|
|
595
|
+
if (parsedBaseUrl.protocol !== "https:" && !isLocalhost && !allowInsecureBaseUrl) {
|
|
435
596
|
throw new Error(
|
|
436
|
-
`Voice model '${voiceModel}' must use an https baseUrl. Voice audio must not be transmitted in cleartext.`
|
|
597
|
+
`Voice model '${voiceModel}' must use an https baseUrl. Voice audio must not be transmitted in cleartext. To trust this managed endpoint, add its exact complete normalized URL (${normalizedBaseUrl}) to security.allowedInsecureVoiceBaseUrls. This setting is only honored from User, System, or SystemDefaults scope settings; Workspace entries are ignored.`
|
|
437
598
|
);
|
|
438
599
|
}
|
|
439
|
-
if (isPrivateNetworkIp(parsedBaseUrl.hostname)) {
|
|
600
|
+
if (!isLocalhost && !allowInsecureBaseUrl && isPrivateNetworkIp(parsedBaseUrl.hostname)) {
|
|
440
601
|
throw new Error(
|
|
441
|
-
`Voice model '${voiceModel}' must not use a private-network baseUrl.`
|
|
602
|
+
`Voice model '${voiceModel}' must not use a private-network baseUrl. To trust this managed endpoint, add its exact complete normalized URL (${normalizedBaseUrl}) to security.allowedInsecureVoiceBaseUrls. This setting is only honored from User, System, or SystemDefaults scope settings; Workspace entries are ignored.`
|
|
442
603
|
);
|
|
443
604
|
}
|
|
444
605
|
const apiKey = readApiKey(settings, model, normalizedBaseUrl, env);
|
|
@@ -448,7 +609,8 @@ function resolveVoiceTranscriptionConfig({
|
|
|
448
609
|
return {
|
|
449
610
|
model: voiceModel,
|
|
450
611
|
baseUrl: normalizedBaseUrl,
|
|
451
|
-
...apiKey ? { apiKey } : {}
|
|
612
|
+
...apiKey ? { apiKey } : {},
|
|
613
|
+
...allowInsecureBaseUrl ? { allowInsecureBaseUrl: true } : {}
|
|
452
614
|
};
|
|
453
615
|
}
|
|
454
616
|
__name(resolveVoiceTranscriptionConfig, "resolveVoiceTranscriptionConfig");
|
|
@@ -472,6 +634,7 @@ function resolveVoiceStreamConfig(args) {
|
|
|
472
634
|
baseUrl: base.baseUrl,
|
|
473
635
|
model: base.model,
|
|
474
636
|
...base.apiKey ? { apiKey: base.apiKey } : {},
|
|
637
|
+
...base.allowInsecureBaseUrl ? { allowInsecureBaseUrl: true } : {},
|
|
475
638
|
...language ? { language } : {},
|
|
476
639
|
...keytermsContext ? { keytermsContext } : {}
|
|
477
640
|
};
|