@qwen-code/qwen-code 0.23.5-preview.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled/qc-helper/docs/features/_meta.ts +1 -0
- package/bundled/qc-helper/docs/features/goals.md +4 -2
- package/bundled/qc-helper/docs/features/omni-fixed-policies-preset.json +242 -0
- package/bundled/qc-helper/docs/features/omni-media-policies.md +443 -0
- package/bundled/qc-helper/docs/overview.md +1 -1
- package/bundled/qc-helper/docs/quickstart.md +2 -3
- package/chunks/MaxSizedBox-I5COUCHZ.js +148 -0
- package/chunks/{StandaloneSessionPicker-V635V72I.js → StandaloneSessionPicker-KUGOBVEW.js} +114 -90
- package/chunks/acp-subagent-executor-PRPMLKVJ.js +164 -0
- package/chunks/{acpAgent-3DPWZTNC.js → acpAgent-EHXZXVUB.js} +269 -194
- package/chunks/{agent-KIHGINKN.js → agent-FWPNJI6N.js} +59 -49
- package/chunks/agent-headless-M5Z7WIDL.js +104 -0
- package/chunks/{anthropicContentGenerator-4FGOM5LK.js → anthropicContentGenerator-FLTEUSIQ.js} +30 -27
- package/chunks/{artifact-tool-MUTNH4NI.js → artifact-tool-3MWM6SN2.js} +11 -7
- package/chunks/{askUserQuestion-AKIRLVB5.js → askUserQuestion-YFFBB4K3.js} +6 -4
- package/chunks/bridge-EWCKRGWY.js +156 -0
- package/chunks/{build-5KWQBWEQ.js → build-5OQN7CDU.js} +1 -1
- package/chunks/caption-audio-UXXLI3JZ.js +443 -0
- package/chunks/caption-image-B7O4TUFP.js +247 -0
- package/chunks/{channel-management-service-RRILWSXX.js → channel-management-service-GRJG5R46.js} +1 -1
- package/chunks/channel-settings-store-NXZNLT5L.js +158 -0
- package/chunks/{channel-worker-group-3DUJFZJR.js → channel-worker-group-SCSKCSBJ.js} +4 -4
- package/chunks/{channel-worker-manager-E5UW2VLA.js → channel-worker-manager-AHCZCKON.js} +4 -4
- package/chunks/{channel-worker-supervisor-VN33GSEC.js → channel-worker-supervisor-BGUAVITB.js} +3 -3
- package/chunks/{chunk-3LLEB5CU.js → chunk-24ZB2JNI.js} +2 -2
- package/chunks/{chunk-5NUKK2DT.js → chunk-25FMWESU.js} +47 -8
- package/chunks/{chunk-3WWPEFMX.js → chunk-2FQM443D.js} +82 -4
- package/chunks/{chunk-VEXUA6DX.js → chunk-2FRZ4ZP2.js} +13 -11
- package/chunks/{chunk-WBSJ6VPZ.js → chunk-2GNZTJRK.js} +3 -3
- package/chunks/{chunk-YP2K3WOS.js → chunk-2VWXODMY.js} +7 -4
- package/chunks/{chunk-L2A5VBDL.js → chunk-2ZCLSPE4.js} +9 -9
- package/chunks/{chunk-KEM7MWS7.js → chunk-366JNNY7.js} +6 -4
- package/chunks/{chunk-TKF4JINY.js → chunk-3FEGERVL.js} +1 -1
- package/chunks/{chunk-TDKUXSJO.js → chunk-3MW6PPA5.js} +1 -1
- package/chunks/{chunk-4LIPOIXS.js → chunk-3NHJLWOD.js} +1 -1
- package/chunks/{chunk-3UGMLA4V.js → chunk-3V7RNGLC.js} +10 -10
- package/chunks/{chunk-XICCGDWF.js → chunk-3WIPATJX.js} +2 -2
- package/chunks/chunk-43QUA4MC.js +135 -0
- package/chunks/{chunk-Q2SAQTEJ.js → chunk-4B7U3KQP.js} +1 -1
- package/chunks/{chunk-SFL6U7U7.js → chunk-4JFRCIMW.js} +2 -2
- package/chunks/{chunk-TPY6HW55.js → chunk-4OZY6LN2.js} +12 -6
- package/chunks/{chunk-IVFTLUZD.js → chunk-4SZ2636R.js} +3 -3
- package/chunks/{chunk-7CLLH5TI.js → chunk-4YS7RMCB.js} +6 -4
- package/chunks/{chunk-NQ272MQG.js → chunk-5XK2YELE.js} +7 -5
- package/chunks/{chunk-HX4WXX3H.js → chunk-65YADOPT.js} +89 -74
- package/chunks/chunk-6C3D7BKK.js +153 -0
- package/chunks/{chunk-DC4ZNGH4.js → chunk-6DB6UHY3.js} +3 -3
- package/chunks/{chunk-WZWTY7SG.js → chunk-6IW6SX75.js} +6 -6
- package/chunks/{chunk-HYHSMTRA.js → chunk-6XRR4RYH.js} +4 -4
- package/chunks/{chunk-AXPOOQAW.js → chunk-736AZVPL.js} +2 -2
- package/chunks/{chunk-UQGRJTDK.js → chunk-7JWD2EML.js} +3 -3
- package/chunks/{chunk-BUQN5LTI.js → chunk-7PQ65Z5F.js} +2 -2
- package/chunks/{chunk-43Y26NPF.js → chunk-A5EWSUYT.js} +3 -3
- package/chunks/{chunk-VQDWCQOE.js → chunk-ANKISCKU.js} +1 -0
- package/chunks/{chunk-NXUZFW3G.js → chunk-AUFTA63J.js} +1 -1
- package/chunks/{chunk-4QPVZA5J.js → chunk-AVVSSP4R.js} +3 -3
- package/chunks/{chunk-36SDZ2Q4.js → chunk-B3HGO6BB.js} +7 -5
- package/chunks/{chunk-6USYH3EU.js → chunk-B3XJFEEH.js} +5 -3
- package/chunks/{chunk-GSKX53AN.js → chunk-BA6AXQDA.js} +1 -1
- package/chunks/{chunk-FBY32737.js → chunk-BHHR5MEI.js} +4 -4
- package/chunks/{chunk-FX6PZBOV.js → chunk-BJ2TJY7V.js} +4 -4
- package/chunks/chunk-BKVPLSEI.js +133 -0
- package/chunks/chunk-BQMSZSG6.js +21 -0
- package/chunks/{chunk-BW2SMO6L.js → chunk-BXAU2UKM.js} +1 -1
- package/chunks/{chunk-3LMDSCLU.js → chunk-C4FISGDN.js} +2 -2
- package/chunks/{chunk-XFFRI3WM.js → chunk-CA63HYHU.js} +4 -2
- package/chunks/{chunk-IXO2OCIP.js → chunk-CKNBSVBC.js} +12 -8
- package/chunks/{chunk-347O2YZJ.js → chunk-CNG7ILRW.js} +39 -61
- package/chunks/chunk-CQULG2GJ.js +1330 -0
- package/chunks/{chunk-VVI7MK3V.js → chunk-CTGMXP4A.js} +9 -7
- package/chunks/{chunk-QT6Z2IBF.js → chunk-CYFQLCCG.js} +2 -2
- package/chunks/chunk-DBDJRURL.js +42 -0
- package/chunks/{chunk-X7AYIXC7.js → chunk-DJLCK66M.js} +5 -3
- package/chunks/chunk-DJYHML3Y.js +121 -0
- package/chunks/{chunk-MO4XID7S.js → chunk-DNDECZXY.js} +3 -3
- package/chunks/{chunk-D7JMO2GP.js → chunk-DNHL4S5B.js} +1 -1
- package/chunks/{chunk-WL36KHUQ.js → chunk-DTSG4EHA.js} +11 -9
- package/chunks/{chunk-M23GFJ5B.js → chunk-EHMLJKF5.js} +1 -1
- package/chunks/{chunk-TIGXX4PA.js → chunk-EKBQJ627.js} +2 -2
- package/chunks/{chunk-RSWBT7AZ.js → chunk-ERIBG3BX.js} +35 -551
- package/chunks/{chunk-PPJSG2PU.js → chunk-EVZT24AF.js} +6 -142
- package/chunks/{chunk-E2VSBAFA.js → chunk-FL2EJUOY.js} +5 -5
- package/chunks/{chunk-2C5TR6HN.js → chunk-FSNLTHNG.js} +1 -1
- package/chunks/chunk-FTKXJMQV.js +255 -0
- package/chunks/{chunk-TRZ22SG5.js → chunk-FXPP7VLM.js} +6 -4
- package/chunks/{chunk-CDDP4ONL.js → chunk-G3PBYAGM.js} +60 -134
- package/chunks/{chunk-AEWCOE64.js → chunk-GACWUBXV.js} +2 -2
- package/chunks/{chunk-OWUAZXXN.js → chunk-GHG4PQY2.js} +3 -3
- package/chunks/{chunk-VU3XMZ5I.js → chunk-GHZJQCSZ.js} +3 -3
- package/chunks/{chunk-FIJODK52.js → chunk-GJHAV2F7.js} +3 -3
- package/chunks/{chunk-36NRLIR6.js → chunk-GQZA7EYC.js} +11 -11
- package/chunks/{chunk-4JFLRHNE.js → chunk-GVHYY2RS.js} +1 -1
- package/chunks/{chunk-H6L4NEAT.js → chunk-GVMXFXQG.js} +1 -1
- package/chunks/{chunk-G45B3INR.js → chunk-GVTAFLWB.js} +2 -2
- package/chunks/{chunk-GJKP6XOB.js → chunk-GW5SJ3II.js} +16 -19
- package/chunks/{chunk-AQP3H22J.js → chunk-GY7FOHQP.js} +1 -1
- package/chunks/chunk-GZ5MEGA3.js +44 -0
- package/chunks/{chunk-FCPJXKDG.js → chunk-HA6DKD44.js} +9 -9
- package/chunks/{chunk-FEDFZBGR.js → chunk-HR4OWLKI.js} +3 -3
- package/chunks/{chunk-CXY6BICQ.js → chunk-HWKWZSZY.js} +162 -109
- package/chunks/{chunk-K4XMAIRX.js → chunk-I3NKMMHS.js} +12 -12
- package/chunks/{chunk-QMENOK5T.js → chunk-IH4TNUVS.js} +9 -7
- package/chunks/{chunk-FASYATAZ.js → chunk-IHUOMYBO.js} +1 -1
- package/chunks/{chunk-IZ2U57NY.js → chunk-IITTKFWM.js} +4 -2
- package/chunks/{chunk-M22WLKLI.js → chunk-IQGEZOGN.js} +7 -7
- package/chunks/chunk-IVPSLX4P.js +578 -0
- package/chunks/{chunk-BTICBRPL.js → chunk-IWMYX5LB.js} +3 -3
- package/chunks/{chunk-V4JJAVHQ.js → chunk-JCIDHFSB.js} +2 -2
- package/chunks/{chunk-PF7GAP6K.js → chunk-JENFAGVX.js} +65 -54
- package/chunks/{chunk-LO2UWNO5.js → chunk-JFEWKEKG.js} +3 -3
- package/chunks/{chunk-BHG3H6OZ.js → chunk-JJVDKHQU.js} +1 -1
- package/chunks/chunk-JYGESWZM.js +149 -0
- package/chunks/{chunk-KVC7HZWK.js → chunk-JYTJ5FCM.js} +1 -1
- package/chunks/{chunk-KVQ3QL4K.js → chunk-KCL6OMCX.js} +3 -3
- package/chunks/{chunk-3HTUE6ZR.js → chunk-KCRV4F3G.js} +4 -4
- package/chunks/{chunk-3WILPKTJ.js → chunk-KKPIFWTZ.js} +11 -6
- package/chunks/{chunk-CXONOVBN.js → chunk-KS6F6LZQ.js} +8 -6
- package/chunks/chunk-KSEKRQJO.js +253 -0
- package/chunks/{chunk-P42KMMU6.js → chunk-KWTLCPYY.js} +19 -6
- package/chunks/{chunk-U4AASWUQ.js → chunk-L4GF4IK2.js} +3 -3
- package/chunks/{chunk-5FK4MSHB.js → chunk-LADOQIYQ.js} +6 -4
- package/chunks/{chunk-DJXSOEFB.js → chunk-LAE6RY3L.js} +1 -1
- package/chunks/{chunk-CQPM66MG.js → chunk-LG475XAV.js} +4 -4
- package/chunks/{chunk-3BZI5GDP.js → chunk-M5YIHMXP.js} +6 -4
- package/chunks/{chunk-6WXVEDT2.js → chunk-MC2RYJMU.js} +5 -3
- package/chunks/chunk-MNU36NGH.js +233 -0
- package/chunks/{chunk-M4U2LTD2.js → chunk-MS4SXNJ6.js} +1 -1
- package/chunks/{chunk-ZFHKUQZ4.js → chunk-NEVUE35Z.js} +5 -5
- package/chunks/{chunk-DRAX5YAI.js → chunk-NFC4WTY2.js} +6 -4
- package/chunks/{chunk-SOLRBF7L.js → chunk-NSKNTJHU.js} +10 -10
- package/chunks/{chunk-B5TJK7B3.js → chunk-NZRX5WYI.js} +1 -1
- package/chunks/{chunk-YM6KUQ2S.js → chunk-O4A2B6V2.js} +3 -3
- package/chunks/{chunk-DX6JTDMR.js → chunk-OB57Y2WH.js} +1 -1
- package/chunks/{chunk-INN5ORKX.js → chunk-OLFTIODD.js} +1 -1
- package/chunks/chunk-PF3RVYRK.js +108 -0
- package/chunks/{chunk-WSJI6ODG.js → chunk-PGMF3LSO.js} +29 -27
- package/chunks/{chunk-OALXNGUA.js → chunk-PJ3GAHED.js} +10 -10
- package/chunks/{chunk-XWJFDJZK.js → chunk-PJSZXERN.js} +1 -1
- package/chunks/{chunk-GSAOVDTH.js → chunk-POMFSBEC.js} +4 -4
- package/chunks/{chunk-EWNKP4V4.js → chunk-PPVM7YLS.js} +1 -1
- package/chunks/{chunk-WK6DEH3Q.js → chunk-PQQV3OBW.js} +6 -4
- package/chunks/{chunk-BHVF3R6B.js → chunk-PZT2654P.js} +4 -4
- package/chunks/{chunk-ZSTCM3MX.js → chunk-Q5N5NEVT.js} +1 -1
- package/chunks/{chunk-KFFCDLKV.js → chunk-QE36VXWP.js} +1 -1
- package/chunks/{chunk-V545KI73.js → chunk-QPTE6BKL.js} +1 -1
- package/chunks/{chunk-5VQR2DD7.js → chunk-QQPRTJOM.js} +5 -3
- package/chunks/{chunk-QIPLWW6Q.js → chunk-QU7T5PKF.js} +1 -1
- package/chunks/{chunk-Y2KJC55Y.js → chunk-QYT7J3UM.js} +4 -4
- package/chunks/{chunk-SFHX5G2S.js → chunk-R34ALEH5.js} +14 -14
- package/chunks/{chunk-TXTCM3TC.js → chunk-R4DAJXOV.js} +18 -14
- package/chunks/{chunk-2GP6BQ2J.js → chunk-RA6PKQVM.js} +2 -2
- package/chunks/{chunk-HXUI5D4H.js → chunk-RDN5ITXF.js} +1 -1
- package/chunks/{chunk-G6UUOCUT.js → chunk-RMI3DKMV.js} +1 -1
- package/chunks/chunk-RSFNJ6UU.js +1252 -0
- package/chunks/{chunk-EDIDYZBT.js → chunk-RVT5L74D.js} +1 -1
- package/chunks/{chunk-GI7SLDOI.js → chunk-RXP5FVC4.js} +6 -6
- package/chunks/chunk-S34QJ6IR.js +290 -0
- package/chunks/chunk-S5BHLTHK.js +190 -0
- package/chunks/{chunk-2XRE4KE4.js → chunk-S7BE3FMA.js} +1 -1
- package/chunks/{chunk-7O5PYQ3M.js → chunk-SBP43AO6.js} +1 -1
- package/chunks/chunk-SLHYLVRW.js +1377 -0
- package/chunks/{chunk-HNFKYKHH.js → chunk-SMAAYU3F.js} +16 -16
- package/chunks/{chunk-KAYC5FBN.js → chunk-SNPYTKXI.js} +825 -234
- package/chunks/{chunk-IKBEIDOH.js → chunk-SOZJODVX.js} +13 -13
- package/chunks/{chunk-Y4NNIGYO.js → chunk-SSFOFDNL.js} +1 -1
- package/chunks/{chunk-WNQIJTOP.js → chunk-SSGVTJ2W.js} +243 -17
- package/chunks/{chunk-NFXXBWSE.js → chunk-SU64336V.js} +2 -2
- package/chunks/chunk-TFDCK56Y.js +154 -0
- package/chunks/{chunk-JRHKM3YQ.js → chunk-TS4JJ7NN.js} +2 -2
- package/chunks/{chunk-C4HBZQNH.js → chunk-U3MTHCJF.js} +1 -1
- package/chunks/{chunk-AUX2FL5T.js → chunk-UBQVV7MX.js} +625 -6
- package/chunks/{chunk-B6RMK4ED.js → chunk-UHBYCY7U.js} +9 -7
- package/chunks/{chunk-Y53DG2HA.js → chunk-UIWUFHRJ.js} +1 -1
- package/chunks/chunk-UQRDQCWF.js +102 -0
- package/chunks/{chunk-NKTMUPHJ.js → chunk-UVMU7DDP.js} +5 -3
- package/chunks/chunk-UXEI7POA.js +273 -0
- package/chunks/chunk-V2XJJTAB.js +228 -0
- package/chunks/chunk-VDNCKE2O.js +24 -0
- package/chunks/{chunk-YQQ2U7AS.js → chunk-VISF4MEY.js} +1 -1
- package/chunks/{chunk-RRI764F7.js → chunk-VPFKSRAB.js} +13 -11
- package/chunks/chunk-VPGRGNNH.js +578 -0
- package/chunks/{chunk-SYMXYRM5.js → chunk-W7JWIIRC.js} +1 -1
- package/chunks/{chunk-AZCTY64Z.js → chunk-WEUQIY3Q.js} +1 -1
- package/chunks/{chunk-SSWTA7CH.js → chunk-WIKUMTAB.js} +12 -12
- package/chunks/chunk-WL2CTQGT.js +1625 -0
- package/chunks/chunk-WL2V7PTE.js +78 -0
- package/chunks/{chunk-Q54O3EIA.js → chunk-WSZ6VS24.js} +45 -30
- package/chunks/{chunk-UZSB57EV.js → chunk-WX4W3FCV.js} +5 -5
- package/chunks/{chunk-OSG23MR3.js → chunk-X3T5IOX6.js} +2 -2
- package/chunks/{chunk-EIBECN2J.js → chunk-XGHVF5DC.js} +5 -5
- package/chunks/{chunk-D3KVGQUV.js → chunk-XJ52OCCN.js} +4 -4
- package/chunks/{chunk-YZXSDPOQ.js → chunk-XMAIUTED.js} +84 -40
- package/chunks/{chunk-QGEISOJ2.js → chunk-XQBZZVJA.js} +3 -3
- package/chunks/{chunk-OZEV3R3S.js → chunk-XYAB5R6E.js} +3 -3
- package/chunks/chunk-XZA32HII.js +19 -0
- package/chunks/{chunk-4FLUQWJ4.js → chunk-Y3Q5OK4D.js} +1 -1
- package/chunks/chunk-YDERQ7ZV.js +248 -0
- package/chunks/{chunk-AKRSSKUT.js → chunk-YFHX6MOF.js} +10 -10
- package/chunks/{chunk-ZMYKNKET.js → chunk-YPJZDZMP.js} +3 -3
- package/chunks/{chunk-3XBUCOWS.js → chunk-YSD6IY6F.js} +2 -2
- package/chunks/{chunk-CH2YDT6X.js → chunk-YVYK3JYU.js} +5 -3
- package/chunks/{chunk-YL3UJML3.js → chunk-YWDVNBGE.js} +4 -4
- package/chunks/{chunk-C3T6HPNM.js → chunk-ZGADNVME.js} +5 -5
- package/chunks/{chunk-M3JGHRMQ.js → chunk-ZJ7KIWG5.js} +1 -1
- package/chunks/{chunk-QHSOINX6.js → chunk-ZJBYZN5D.js} +2 -2
- package/chunks/{chunk-SYROIHU7.js → chunk-ZRQGTRHA.js} +4 -2
- package/chunks/{chunk-NCPFOLM2.js → chunk-ZTBP4SFC.js} +78 -18
- package/chunks/{chunk-ZAFYHRVY.js → chunk-ZYDMQCQP.js} +4 -274
- package/chunks/clip-audio-SH4L7AEY.js +255 -0
- package/chunks/clip-image-BQRPECIS.js +239 -0
- package/chunks/clip-video-JIRMV5IH.js +277 -0
- package/chunks/{codex-subagent-executor-AEAIQZDC.js → codex-subagent-executor-Y5ILNWG6.js} +92 -68
- package/chunks/config-3X4AXU45.js +21 -0
- package/chunks/config-T5RO4NJV.js +17 -0
- package/chunks/config-utils-3YNEDKT4.js +151 -0
- package/chunks/contextCommand-7JVXVYN4.js +144 -0
- package/chunks/convert-image-D52K2FFB.js +231 -0
- package/chunks/{core-runtime-ZI4RTOJQ.js → core-runtime-6IZNPJUN.js} +92 -67
- package/chunks/{create-sub-session-BBWFQARJ.js → create-sub-session-5XHUO2PW.js} +90 -66
- package/chunks/{create-sub-session-MSGNIM37.js → create-sub-session-6EDEANCD.js} +7 -5
- package/chunks/{cron-create-U2JJ5CCF.js → cron-create-GS7ORRO6.js} +8 -5
- package/chunks/{cron-delete-7DM4LJWD.js → cron-delete-3GGDNNXD.js} +8 -5
- package/chunks/{cron-list-VCUSZK2Y.js → cron-list-EX27DW4H.js} +8 -5
- package/chunks/{daemon-git-worktree-guard-KECEMV6A.js → daemon-git-worktree-guard-BULXRIDA.js} +90 -66
- package/chunks/daemon-status-provider-VSVXVY4O.js +155 -0
- package/chunks/daemon-trust-policy-WVSDS2WT.js +150 -0
- package/chunks/{daemon-trust-policy-monitor-546N5ZVL.js → daemon-trust-policy-monitor-HXQ2GLTX.js} +95 -71
- package/chunks/deferred-core-runtime-EXI7LXLE.js +153 -0
- package/chunks/{display-image-QTHALY6N.js → display-image-FTWDRBOP.js} +10 -7
- package/chunks/{dist-BNW423XT.js → dist-CXDHIHN4.js} +5 -0
- package/chunks/downsample-audio-LPDWX6GF.js +217 -0
- package/chunks/downsample-image-A5JEYIV5.js +249 -0
- package/chunks/downscale-video-4W5BX5KO.js +249 -0
- package/chunks/{earlyInputCapture-BXP7V2P3.js → earlyInputCapture-UJ3KFVZQ.js} +3 -2
- package/chunks/{edit-CMSQB7NP.js → edit-JJ34NKRC.js} +68 -56
- package/chunks/{en-56QLKXS2.js → en-FCK6MBTI.js} +16 -0
- package/chunks/{enter-worktree-DA6A4XC5.js → enter-worktree-QK7DR5EF.js} +12 -9
- package/chunks/{enterPlanMode-UDPMNESD.js → enterPlanMode-H6FBPVLB.js} +62 -51
- package/chunks/environment-7DMLANWW.js +167 -0
- package/chunks/errors-OH3DYEDL.js +151 -0
- package/chunks/{exec-RPKEY6HP.js → exec-7CFNHYCV.js} +31 -9
- package/chunks/{exit-worktree-4H6Z2VQI.js → exit-worktree-62COYIHF.js} +14 -10
- package/chunks/exitPlanMode-5YR5VWXS.js +102 -0
- package/chunks/extract-audio-GSSZQV6G.js +229 -0
- package/chunks/extract-keyframes-Q6DRMQAJ.js +621 -0
- package/chunks/{fast-path-F2CYDDZ4.js → fast-path-4DS2GR5O.js} +5 -5
- package/chunks/ffmpeg-N4LIIVNR.js +21 -0
- package/chunks/{glob-Z2JMJKKN.js → glob-GFID3F3R.js} +63 -51
- package/chunks/{goal-tools-HXVVLGCV.js → goal-tools-2OB5WPNH.js} +59 -49
- package/chunks/{grep-H2I33VAO.js → grep-JB5DGQ3B.js} +13 -9
- package/chunks/handleAutoUpdate-5OQL4YBU.js +147 -0
- package/chunks/i18n-TV5G7SXO.js +164 -0
- package/chunks/{image-gen-HIAZCB5T.js → image-gen-LX3C4V3R.js} +16 -11
- package/chunks/initializer-R2EI4UJ6.js +151 -0
- package/chunks/installationInfo-HYOWC3BN.js +145 -0
- package/chunks/{keychain-token-storage-NQ5XWIPX.js → keychain-token-storage-ZZNRE6D4.js} +3 -2
- package/chunks/list-ORJQQUNR.js +154 -0
- package/chunks/{list-agents-EWDCEPIW.js → list-agents-HS6HH4DJ.js} +10 -7
- package/chunks/{llm-LSUBOJAR.js → llm-YKBQVN7S.js} +159 -134
- package/chunks/{llm-content-generator-MLIONRXE.js → llm-content-generator-QJBXJRKT.js} +11 -9
- package/chunks/loadedSettingsAdapter-4FQH6Y3D.js +148 -0
- package/chunks/{loggingContentGenerator-TUPEXFMM.js → loggingContentGenerator-DEOANG3F.js} +74 -63
- package/chunks/{loop-wakeup-ZBVRI6VH.js → loop-wakeup-4B7OY3TV.js} +9 -6
- package/chunks/{ls-6ZB3BEIR.js → ls-EZ5PSWU2.js} +8 -5
- package/chunks/{lsp-M54FQARP.js → lsp-DYFFHKB3.js} +6 -3
- package/chunks/{managed-npm-update-WEA5XMFZ.js → managed-npm-update-36U25ZEZ.js} +91 -67
- package/chunks/mcp-ZI7LXLAQ.js +148 -0
- package/chunks/memory-side-query-DRV7FXK4.js +221 -0
- package/chunks/model-call-collection-RX7C24YP.js +171 -0
- package/chunks/model-configuration-3JIO6IRV.js +161 -0
- package/chunks/modelConfigUtils-2BJQI2S4.js +140 -0
- package/chunks/{monitor-CI7YE7MT.js → monitor-LXQRI2IF.js} +63 -51
- package/chunks/nonInteractiveCli-HRXVUV2H.js +235 -0
- package/chunks/nonInteractiveToolExecutor-QPAIKNPL.js +101 -0
- package/chunks/{notebook-edit-3WCVRNGL.js → notebook-edit-5CM3VYNK.js} +63 -52
- package/chunks/ocr-image-Q4HYJ3U7.js +252 -0
- package/chunks/omni-A5XLPNSH.js +147 -0
- package/chunks/{openaiContentGenerator-OGILGUZE.js → openaiContentGenerator-O5G3QCHX.js} +36 -31
- package/chunks/{openaiResponsesContentGenerator-NXOXUPFM.js → openaiResponsesContentGenerator-W2V7AYVE.js} +12 -10
- package/chunks/pidfile-MI5FGYF5.js +151 -0
- package/chunks/{processUtils-O4II3RYH.js → processUtils-EWKUPVJH.js} +2 -2
- package/chunks/prompt-terminal-ledger-5HEXZMWT.js +143 -0
- package/chunks/{qwenContentGenerator-I4LRYADV.js → qwenContentGenerator-HHNDIW2Q.js} +70 -60
- package/chunks/{qwenOAuth2-3J66TOT5.js → qwenOAuth2-GD3UIYUP.js} +9 -8
- package/chunks/reactive-degrade-KWCJUHXH.js +375 -0
- package/chunks/read-file-ZQKBXJSH.js +37 -0
- package/chunks/{read-mcp-resource-LPSWXVOD.js → read-mcp-resource-INJIV3UC.js} +8 -4
- package/chunks/recall-media-memory-tool-PEE2BWRY.js +198 -0
- package/chunks/{record-artifact-L3CFJOMA.js → record-artifact-KKW3AIMJ.js} +6 -4
- package/chunks/record-source-2VSQINX6.js +24 -0
- package/chunks/{report-findings-LY5HQY4K.js → report-findings-OZSLWYAS.js} +7 -5
- package/chunks/{request-shutdown-53SNYGVR.js → request-shutdown-3RUGTWRR.js} +12 -9
- package/chunks/resumeHistoryUtils-5V3KISJ6.js +156 -0
- package/chunks/ripGrep-F5MM4HGA.js +43 -0
- package/chunks/{run-qwen-serve-ZVEKGS7Y.js → run-qwen-serve-3K3D5MSR.js} +70 -70
- package/chunks/{runtime-SJCRYNPA.js → runtime-FAWN3GQH.js} +98 -74
- package/chunks/sandbox-BPRE7KYF.js +170 -0
- package/chunks/sandboxConfig-V3OHETXW.js +138 -0
- package/chunks/scheduled-tasks-LB2PINB3.js +167 -0
- package/chunks/scheduler-NHAWKARI.js +160 -0
- package/chunks/{sdk-exporters-http-DR4G663K.js → sdk-exporters-http-SWXTEEVT.js} +3 -2
- package/chunks/{sdk-impl-SJR26MQF.js → sdk-impl-FK4JY6LX.js} +5 -4
- package/chunks/{send-message-DN76MXDX.js → send-message-TLF36UW2.js} +16 -13
- package/chunks/serve-UQL5X5K7.js +156 -0
- package/chunks/{server-UHMKPCAZ.js → server-3HUUEDUC.js} +286 -261
- package/chunks/{session-ZLUK7E4P.js → session-XODWSTJ3.js} +151 -127
- package/chunks/session-attachments-root-BENUIMZM.js +141 -0
- package/chunks/{session-pr-refresh-3OMTQWCZ.js → session-pr-refresh-CSRULMTI.js} +95 -71
- package/chunks/{settings-P4DHIIUP.js → settings-42FFX5TK.js} +94 -70
- package/chunks/{shell-IMFUVQQ5.js → shell-NLNU2TPF.js} +59 -49
- package/chunks/{skill-NB5RJGZW.js → skill-KIRNNJMK.js} +22 -17
- package/chunks/skill-settings-MPHPE43F.js +164 -0
- package/chunks/spawnChannel-TXNLXP2R.js +152 -0
- package/chunks/standalone-update-XAC364AM.js +156 -0
- package/chunks/{start-opentui-ui-JKAIWGF7.js → start-opentui-ui-3OLDXRMX.js} +223 -189
- package/chunks/{startInteractiveUI-YRPOT6GH.js → startInteractiveUI-UB2HRTV7.js} +339 -295
- package/chunks/storage-VZECDJNX.js +17 -0
- package/chunks/{syntheticOutput-EX5L5GYI.js → syntheticOutput-SSXJ2NEY.js} +5 -3
- package/chunks/task-create-EEMYF6LY.js +30 -0
- package/chunks/{task-list-ZLJSMRFA.js → task-list-GA5GOR74.js} +9 -6
- package/chunks/{task-stop-MD7P6QGK.js → task-stop-3MXTDL7H.js} +6 -3
- package/chunks/{task-update-3LSYQDRW.js → task-update-JSBHKL4L.js} +16 -13
- package/chunks/{team-create-2XTBYRJF.js → team-create-VES6TOBA.js} +62 -51
- package/chunks/{team-delete-RIDINW6I.js → team-delete-V2CROTI6.js} +9 -6
- package/chunks/{team-plan-approval-CFNWW7ZQ.js → team-plan-approval-ZMCHBBUM.js} +61 -50
- package/chunks/terminal-image-renderer-73NDY7OJ.js +156 -0
- package/chunks/theme-manager-YG3L7BV6.js +140 -0
- package/chunks/{todoWrite-XSTG2VT5.js → todoWrite-CMBHPR66.js} +8 -5
- package/chunks/tool-result-media-V3LNDB5Q.js +45 -0
- package/chunks/{tool-search-ZHTJU2MV.js → tool-search-7XR7RHMB.js} +43 -21
- package/chunks/total-session-admission-QUZYGACG.js +151 -0
- package/chunks/transcribe-audio-AJQZPNEV.js +30 -0
- package/chunks/trustedFolders-QRII2BL7.js +160 -0
- package/chunks/understand-video-segments-5TMRDQUB.js +438 -0
- package/chunks/{update-relaunch-LI7GRP36.js → update-relaunch-735DXN5P.js} +5 -5
- package/chunks/updateCheck-FXXOM4YS.js +156 -0
- package/chunks/upload-cache-5YULQVZZ.js +17 -0
- package/chunks/upload-config-CKDIXTPK.js +25 -0
- package/chunks/useAutoAcceptIndicator-KXXTKOGD.js +158 -0
- package/chunks/{validateNonInterActiveAuth-YFPCYYNL.js → validateNonInterActiveAuth-DXCBDHIX.js} +143 -119
- package/chunks/{version-4MTL4JVU.js → version-76T4NBMQ.js} +1 -1
- package/chunks/{web-fetch-O6RG6ISB.js → web-fetch-UIDZX5RN.js} +27 -20
- package/chunks/{web-search-JHAXVEMD.js → web-search-VETWDOUJ.js} +14 -11
- package/chunks/{web-shell-static-FFWCUUZS.js → web-shell-static-XSCCMXKQ.js} +3 -3
- package/chunks/{workflow-O7L6VDYU.js → workflow-MHYBJHPP.js} +63 -52
- package/chunks/workspace-providers-status-WFBT3LS5.js +154 -0
- package/chunks/{workspace-registration-store-7G4E7YPY.js → workspace-registration-store-M3WKKBJQ.js} +1 -1
- package/chunks/workspace-registry-FIUB7MGD.js +160 -0
- package/chunks/workspace-runtime-coordinator-5Z7M36W7.js +163 -0
- package/chunks/workspace-service-TP4VRTZF.js +165 -0
- package/chunks/workspace-skills-status-CILWVQHU.js +151 -0
- package/chunks/{workspace-trust-reconciler-XEBW5FUL.js → workspace-trust-reconciler-2OPSTQNS.js} +98 -74
- package/chunks/write-file-N7NBKIYD.js +107 -0
- package/chunks/{zh-TW-S3YTQ4DS.js → zh-TW-SRB5QSER.js} +16 -0
- package/chunks/{zh-F76MZTL3.js → zh-UBQIFP4A.js} +16 -0
- package/chunks/{zoom-image-RDPRTP4B.js → zoom-image-3GHVMYEW.js} +18 -13
- package/cli.js +14 -14
- package/export-transcript-document.js +3 -3
- package/locales/en.js +18 -0
- package/locales/zh-TW.js +17 -0
- package/locales/zh.js +17 -0
- package/package.json +3 -3
- package/web-shell/assets/{abnfDiagram-VCTEODGH-RxykUDmi.js → abnfDiagram-VCTEODGH-vfbwxn7H.js} +1 -1
- package/web-shell/assets/{arc-CZpgGCJC.js → arc-BT0KMrP5.js} +1 -1
- package/web-shell/assets/{architectureDiagram-5GKGNRK7-BHSMzNDT.js → architectureDiagram-5GKGNRK7-B3TlGgP4.js} +1 -1
- package/web-shell/assets/{blockDiagram-NRAW4CY4-Bn4mF9SZ.js → blockDiagram-NRAW4CY4-DnwF5xi-.js} +1 -1
- package/web-shell/assets/{c4Diagram-UCG6FXSJ-CBM-Bj6t.js → c4Diagram-UCG6FXSJ-8qvMMfFg.js} +1 -1
- package/web-shell/assets/channel-CTm0xByY.js +1 -0
- package/web-shell/assets/{chunk-2Q5K7J3B-D5Fin58O.js → chunk-2Q5K7J3B-CHM51UX6.js} +1 -1
- package/web-shell/assets/{chunk-5VM5RSS4-CY05weF7.js → chunk-5VM5RSS4-BNXaOtyN.js} +1 -1
- package/web-shell/assets/{chunk-F27PBJKO-3neZnj5Y.js → chunk-F27PBJKO-DT-vcF3X.js} +1 -1
- package/web-shell/assets/{chunk-G27WJ6UU-Cd7EU4BE.js → chunk-G27WJ6UU-BXz8438J.js} +1 -1
- package/web-shell/assets/{chunk-JWPE2WC7-DwK1mqFw.js → chunk-JWPE2WC7-CP2ozL3M.js} +1 -1
- package/web-shell/assets/{chunk-LCL6LL3I-Sl7vY22C.js → chunk-LCL6LL3I-DTAWXvja.js} +1 -1
- package/web-shell/assets/{chunk-POPQ4Y6H-BXNzpbVg.js → chunk-POPQ4Y6H-DZENJpGx.js} +1 -1
- package/web-shell/assets/{chunk-SVP7TREG-DjjButcp.js → chunk-SVP7TREG-Dl8djRwv.js} +1 -1
- package/web-shell/assets/{chunk-XXDRQBXY-DNOiCjOJ.js → chunk-XXDRQBXY-B3lJllMA.js} +1 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-DhMuMK_E.js +1 -0
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-DhMuMK_E.js +1 -0
- package/web-shell/assets/{cose-bilkent-JH36ORCC-BUnker7a.js → cose-bilkent-JH36ORCC-DeosJDcB.js} +1 -1
- package/web-shell/assets/{cynefin-OW5HDTMX-DcUgdWE5.js → cynefin-OW5HDTMX-BvqcLoHm.js} +1 -1
- package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-CvDKsZsL.js → cynefinDiagram-5FMLGOSQ-BYS0pmSs.js} +1 -1
- package/web-shell/assets/{dagre-3AP2YEHR-jpCmUbr1.js → dagre-3AP2YEHR-IDScuL-R.js} +1 -1
- package/web-shell/assets/{diagram-S7CK7UJ4-DBe_bKE5.js → diagram-S7CK7UJ4-EYNlkkKJ.js} +1 -1
- package/web-shell/assets/{diagram-UQ7AKVKN-oXvPpDgs.js → diagram-UQ7AKVKN-D3x9g8Ep.js} +1 -1
- package/web-shell/assets/{diagram-VSXAHHWV-BD7-_SGh.js → diagram-VSXAHHWV-C35O1dtR.js} +1 -1
- package/web-shell/assets/{diagram-VX7I27RA-DOJL0wub.js → diagram-VX7I27RA-XvMv2aCN.js} +1 -1
- package/web-shell/assets/{diagram-Z3DM3KII-DRIiodDD.js → diagram-Z3DM3KII-CeryNvru.js} +1 -1
- package/web-shell/assets/{ebnfDiagram-PWID7BFC-Db31Ulmb.js → ebnfDiagram-PWID7BFC-DAmepjvB.js} +1 -1
- package/web-shell/assets/{erDiagram-SSCWMZ5O-CVHhwI2_.js → erDiagram-SSCWMZ5O-BkGfBZt_.js} +1 -1
- package/web-shell/assets/{flowDiagram-A5DVABFB-DWOFy1FK.js → flowDiagram-A5DVABFB-CzUCgun9.js} +1 -1
- package/web-shell/assets/{ganttDiagram-EL5Y4UJY-C0sxQtPd.js → ganttDiagram-EL5Y4UJY-BIFST90r.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-WWUBYQGX-CNituBYC.js → gitGraphDiagram-WWUBYQGX-jVvRSGcu.js} +1 -1
- package/web-shell/assets/{index-B15NlwB8.js → index-M1TfOjx2.js} +457 -457
- package/web-shell/assets/{index-gm9tLk7h.js → index-krCDFzE6.js} +1 -1
- package/web-shell/assets/{infoDiagram-RXCK75RN-CxhJYtIR.js → infoDiagram-RXCK75RN-DsU7vA4Q.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-5VMMS53U-By2mchUy.js → ishikawaDiagram-5VMMS53U-K9mTNAbN.js} +1 -1
- package/web-shell/assets/{journeyDiagram-EYS64GPL-CVH-OweI.js → journeyDiagram-EYS64GPL-BKuHLGxv.js} +1 -1
- package/web-shell/assets/{kanban-definition-3QL26DDD-Cc9dQXLy.js → kanban-definition-3QL26DDD-CXG9frQ_.js} +1 -1
- package/web-shell/assets/{layout-C_60ysHw.js → layout-6G_l7UoH.js} +1 -1
- package/web-shell/assets/{linear-BvAVfqwu.js → linear-DYpvB2mh.js} +1 -1
- package/web-shell/assets/{mermaid.core-C3CoBKAc.js → mermaid.core-Sj3dJttQ.js} +6 -6
- package/web-shell/assets/{mindmap-definition-FBJOCRG2-Cuu8Q8LM.js → mindmap-definition-FBJOCRG2-DNJ1e6qd.js} +1 -1
- package/web-shell/assets/{pegDiagram-XKGWAZYB-DmAeyDO2.js → pegDiagram-XKGWAZYB-D-KPklHv.js} +1 -1
- package/web-shell/assets/{pieDiagram-E7YTZNPT-B7vbB_xv.js → pieDiagram-E7YTZNPT-BQPm03g2.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-AXDQQJYC-BqOBkRR7.js → quadrantDiagram-AXDQQJYC-BubBXSqD.js} +1 -1
- package/web-shell/assets/{railroadDiagram-O6MQD6OU-sI06lZIu.js → railroadDiagram-O6MQD6OU-DatD6KIT.js} +1 -1
- package/web-shell/assets/{requirementDiagram-EFPCY7ZU-Bg13d10S.js → requirementDiagram-EFPCY7ZU-DiQ6jsZY.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-P5KCCOFB-WFOzZHrR.js → sankeyDiagram-P5KCCOFB-C07fyxbH.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-CCdRbA4E.js → sequenceDiagram-WJ2MYXX4-DWXtsWzI.js} +1 -1
- package/web-shell/assets/{sizeCapture-X5ZJPWSS-BH5F3bGg.js → sizeCapture-X5ZJPWSS-B0cQ1v0l.js} +1 -1
- package/web-shell/assets/{stateDiagram-HBIQ2CUA-NwS2X3QB.js → stateDiagram-HBIQ2CUA-zHgWc00n.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-C-3ZC2nf.js +1 -0
- package/web-shell/assets/{swimlanes-XN3QIQJK-Bm38pM28.js → swimlanes-XN3QIQJK-Dnrrhu0H.js} +1 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-Ded1L5cw.js +8 -0
- package/web-shell/assets/{timeline-definition-24CTP7MA-Do-agLSo.js → timeline-definition-24CTP7MA-8BV7W2Xq.js} +1 -1
- package/web-shell/assets/{vennDiagram-4TSXK5OY-aggLfZzl.js → vennDiagram-4TSXK5OY-tmBBtlnj.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-VM6X3IG4-D5JR3mXX.js → wardleyDiagram-VM6X3IG4-Cq96T3gb.js} +1 -1
- package/web-shell/assets/{xychartDiagram-S5SC5T6Z-DhtLDuXs.js → xychartDiagram-S5SC5T6Z-Dpzx_ZGQ.js} +1 -1
- package/web-shell/index.html +1 -1
- package/chunks/MaxSizedBox-FCF6M53W.js +0 -124
- package/chunks/acp-subagent-executor-TND6W2O5.js +0 -140
- package/chunks/agent-headless-EJ4QOUSM.js +0 -94
- package/chunks/bridge-MUX5YJZT.js +0 -132
- package/chunks/channel-settings-store-7CBIRZER.js +0 -134
- package/chunks/config-utils-KX2YS725.js +0 -127
- package/chunks/contextCommand-RV6Y5LNJ.js +0 -120
- package/chunks/daemon-status-provider-NULJNAEV.js +0 -131
- package/chunks/daemon-trust-policy-S4KWGPV3.js +0 -126
- package/chunks/deferred-core-runtime-T23ZT443.js +0 -128
- package/chunks/environment-TSQJUTPV.js +0 -143
- package/chunks/errors-RIVYJS6T.js +0 -127
- package/chunks/exitPlanMode-BYBBFN2T.js +0 -92
- package/chunks/handleAutoUpdate-FZP45KOR.js +0 -123
- package/chunks/i18n-OTB62AKW.js +0 -140
- package/chunks/initializer-4JXZEC4B.js +0 -127
- package/chunks/installationInfo-2IJV5QKC.js +0 -121
- package/chunks/list-KQSQ4A5G.js +0 -130
- package/chunks/loadedSettingsAdapter-TZTTNRHI.js +0 -124
- package/chunks/mcp-TFDTUPIA.js +0 -124
- package/chunks/model-configuration-ZCAKKIOF.js +0 -137
- package/chunks/modelConfigUtils-J3ZPW7ZK.js +0 -116
- package/chunks/nonInteractiveCli-GPT3TVOK.js +0 -211
- package/chunks/pidfile-GBTBIGHF.js +0 -127
- package/chunks/prompt-terminal-ledger-ILIXZI3E.js +0 -119
- package/chunks/read-file-G4XKW2CS.js +0 -31
- package/chunks/record-source-2GSY5JD5.js +0 -22
- package/chunks/resumeHistoryUtils-YPJU4XFE.js +0 -132
- package/chunks/ripGrep-AAKMALLM.js +0 -39
- package/chunks/sandbox-UIXL423Z.js +0 -146
- package/chunks/sandboxConfig-CY343YNJ.js +0 -114
- package/chunks/scheduled-tasks-5UGBEVNZ.js +0 -143
- package/chunks/scheduler-GCZYLZ2P.js +0 -136
- package/chunks/serve-2XXQLVK2.js +0 -132
- package/chunks/session-attachments-root-DHQM5IEZ.js +0 -117
- package/chunks/skill-settings-IXG5CTQO.js +0 -140
- package/chunks/spawnChannel-Q3YALTCJ.js +0 -128
- package/chunks/standalone-update-H5OJ7MM7.js +0 -132
- package/chunks/task-create-75HVPEAH.js +0 -28
- package/chunks/terminal-image-renderer-UDPJPGPQ.js +0 -132
- package/chunks/theme-manager-SK57EKMO.js +0 -116
- package/chunks/total-session-admission-UUZBDQCG.js +0 -127
- package/chunks/trustedFolders-4LDBLNTS.js +0 -136
- package/chunks/updateCheck-PKSSORPO.js +0 -132
- package/chunks/useAutoAcceptIndicator-I32UEQPI.js +0 -134
- package/chunks/workspace-providers-status-WRX6CJM4.js +0 -130
- package/chunks/workspace-registry-SXIMGT4D.js +0 -136
- package/chunks/workspace-runtime-coordinator-7DOEHXYT.js +0 -139
- package/chunks/workspace-service-HDXOZMYC.js +0 -141
- package/chunks/workspace-skills-status-VN4L37CA.js +0 -127
- package/chunks/write-file-LKX4ETIO.js +0 -97
- package/web-shell/assets/channel-DFYs_LlK.js +0 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-DnGrKXoM.js +0 -1
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-DnGrKXoM.js +0 -1
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-1aU2JZXO.js +0 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-Dp-u6kQG.js +0 -8
- package/chunks/{chunk-XAJZFGD2.js → chunk-PXXYQOZO.js} +8 -8
- package/chunks/{chunk-WVURIAEE.js → chunk-SVWWF5TZ.js} +3 -3
- package/chunks/{dist-G5UMXIGF.js → dist-I6D6XOWV.js} +1 -1
- package/chunks/{dist-UXVNLQHG.js → dist-VIKOMAGG.js} +3 -3
|
@@ -0,0 +1,621 @@
|
|
|
1
|
+
// Force strict mode and setup for ESM
|
|
2
|
+
"use strict";
|
|
3
|
+
import {
|
|
4
|
+
videoFrameDimensionsForTokenBudget
|
|
5
|
+
} from "./chunk-PF3RVYRK.js";
|
|
6
|
+
import {
|
|
7
|
+
BaseMediaPolicyTool,
|
|
8
|
+
BaseMediaPolicyToolInvocation,
|
|
9
|
+
MEDIA_POLICY_IO_SCHEMA_PROPERTIES,
|
|
10
|
+
assertMediaPolicyIo,
|
|
11
|
+
createPolicyToolTimeoutBudget,
|
|
12
|
+
ffmpegFailureMessage,
|
|
13
|
+
formatBytesShort,
|
|
14
|
+
mediaPolicyToolError,
|
|
15
|
+
mediaPolicyToolFailure,
|
|
16
|
+
policyOutputFileName,
|
|
17
|
+
resolvePolicyToolSettings,
|
|
18
|
+
resolvePolicyToolTimeoutMs
|
|
19
|
+
} from "./chunk-UXEI7POA.js";
|
|
20
|
+
import {
|
|
21
|
+
probeMediaMetadata,
|
|
22
|
+
runFfmpeg
|
|
23
|
+
} from "./chunk-KSEKRQJO.js";
|
|
24
|
+
import "./chunk-MNU36NGH.js";
|
|
25
|
+
import "./chunk-BQMSZSG6.js";
|
|
26
|
+
import "./chunk-VPGRGNNH.js";
|
|
27
|
+
import {
|
|
28
|
+
ToolNames
|
|
29
|
+
} from "./chunk-ERIBG3BX.js";
|
|
30
|
+
import "./chunk-ZYDMQCQP.js";
|
|
31
|
+
import "./chunk-S34QJ6IR.js";
|
|
32
|
+
import "./chunk-TBWQLLFO.js";
|
|
33
|
+
import {
|
|
34
|
+
init_esbuild_shims
|
|
35
|
+
} from "./chunk-5O2XNYP6.js";
|
|
36
|
+
import {
|
|
37
|
+
__name
|
|
38
|
+
} from "./chunk-J2S4EL5Y.js";
|
|
39
|
+
|
|
40
|
+
// packages/core/src/omni/policy/tools/extract-keyframes.ts
|
|
41
|
+
init_esbuild_shims();
|
|
42
|
+
import fs from "node:fs/promises";
|
|
43
|
+
import path from "node:path";
|
|
44
|
+
var OMNI_EXTRACT_KEYFRAMES_TOOL_NAME = ToolNames.OMNI_EXTRACT_KEYFRAMES;
|
|
45
|
+
var EXTRACT_KEYFRAMES_DEFAULTS = {
|
|
46
|
+
maxFrames: 8,
|
|
47
|
+
sceneThreshold: 0.2,
|
|
48
|
+
maxDimension: 768,
|
|
49
|
+
strategy: "scene",
|
|
50
|
+
fps: 1
|
|
51
|
+
};
|
|
52
|
+
function readTier(settings) {
|
|
53
|
+
const value = settings["frameTokenBudget"];
|
|
54
|
+
return value === "small" || value === "normal" || value === "large" ? value : void 0;
|
|
55
|
+
}
|
|
56
|
+
__name(readTier, "readTier");
|
|
57
|
+
function readStrategy(settings) {
|
|
58
|
+
const value = settings["strategy"];
|
|
59
|
+
return value === "scene" || value === "uniform" ? value : void 0;
|
|
60
|
+
}
|
|
61
|
+
__name(readStrategy, "readStrategy");
|
|
62
|
+
function readNumber(settings, key) {
|
|
63
|
+
const value = settings[key];
|
|
64
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : void 0;
|
|
65
|
+
}
|
|
66
|
+
__name(readNumber, "readNumber");
|
|
67
|
+
function readNonNegativeNumber(settings, key) {
|
|
68
|
+
const value = settings[key];
|
|
69
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : void 0;
|
|
70
|
+
}
|
|
71
|
+
__name(readNonNegativeNumber, "readNonNegativeNumber");
|
|
72
|
+
function frameFileMatcher(nameTemplate) {
|
|
73
|
+
const escaped = nameTemplate.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
74
|
+
return new RegExp(`^${escaped.replace("%04d", "(\\d{4})")}$`);
|
|
75
|
+
}
|
|
76
|
+
__name(frameFileMatcher, "frameFileMatcher");
|
|
77
|
+
var TUNABLE_SCHEMA_PROPERTIES = {
|
|
78
|
+
maxFrames: {
|
|
79
|
+
type: "number",
|
|
80
|
+
description: "Maximum number of frames to extract. Default 8.",
|
|
81
|
+
minimum: 1,
|
|
82
|
+
maximum: 64
|
|
83
|
+
},
|
|
84
|
+
sceneThreshold: {
|
|
85
|
+
type: "number",
|
|
86
|
+
description: "Scene-change threshold (0-1) for keyframe selection. Default 0.2.",
|
|
87
|
+
minimum: 0,
|
|
88
|
+
maximum: 1
|
|
89
|
+
},
|
|
90
|
+
maxDimension: {
|
|
91
|
+
type: "number",
|
|
92
|
+
description: "Longest-edge ceiling in pixels for the extracted frames (aspect ratio preserved, never enlarged). Default 768.",
|
|
93
|
+
minimum: 16
|
|
94
|
+
},
|
|
95
|
+
strategy: {
|
|
96
|
+
type: "string",
|
|
97
|
+
enum: ["scene", "uniform"],
|
|
98
|
+
description: "Frame-selection strategy: 'scene' (default; per-bucket scene detection with midpoint fallback) or 'uniform' (duration-adaptive even sampling at a dynamic fps \u2014 the lever for long videos, whose metered cost is frames\xD7pixels)."
|
|
99
|
+
},
|
|
100
|
+
fps: {
|
|
101
|
+
type: "number",
|
|
102
|
+
description: "Uniform strategy only: target frames per second; the frame count is clamp(duration \xD7 fps, 1, maxFrames). Default 1.",
|
|
103
|
+
exclusiveMinimum: 0,
|
|
104
|
+
maximum: 10
|
|
105
|
+
},
|
|
106
|
+
startSec: {
|
|
107
|
+
type: "number",
|
|
108
|
+
description: "Uniform strategy only: sampling window start in seconds. Default 0.",
|
|
109
|
+
minimum: 0
|
|
110
|
+
},
|
|
111
|
+
endSec: {
|
|
112
|
+
type: "number",
|
|
113
|
+
description: "Uniform strategy only: sampling window end in seconds. Default: the video's end.",
|
|
114
|
+
exclusiveMinimum: 0
|
|
115
|
+
},
|
|
116
|
+
frameTokenBudget: {
|
|
117
|
+
type: "string",
|
|
118
|
+
enum: ["small", "normal", "large"],
|
|
119
|
+
description: "Per-frame token-budget tier ('small'/'normal'/'large' = 80/256/1024 visual tokens): frames are resized onto the model patch grid inside the tier's pixel budget. Overrides maxDimension for frame sizing."
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
var DESCRIPTOR = {
|
|
123
|
+
kind: "media_policy",
|
|
124
|
+
// '2': outputs now carry `metadata.omniRole: 'keyframe'`, which memory
|
|
125
|
+
// maps to `sampled` coverage. Pre-'2' cache entries and recorded
|
|
126
|
+
// executions hold role-less outputs whose coverage was derived as
|
|
127
|
+
// `complete`; sharing a version would let them converge onto the same
|
|
128
|
+
// fingerprint and keep reporting sampled frames as complete visual
|
|
129
|
+
// coverage — the model would answer about footage it never saw.
|
|
130
|
+
version: "2",
|
|
131
|
+
inputMediaTypes: ["video"],
|
|
132
|
+
outputs: [
|
|
133
|
+
{
|
|
134
|
+
kind: "media",
|
|
135
|
+
mimeTypes: ["image/jpeg"],
|
|
136
|
+
required: true,
|
|
137
|
+
lossy: true
|
|
138
|
+
},
|
|
139
|
+
{ kind: "text", role: "disclosure", required: true }
|
|
140
|
+
],
|
|
141
|
+
settingsSchema: {
|
|
142
|
+
type: "object",
|
|
143
|
+
properties: TUNABLE_SCHEMA_PROPERTIES,
|
|
144
|
+
additionalProperties: false
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
function scaleFilter(maxDimension) {
|
|
148
|
+
return `scale='min(${maxDimension},iw)':'min(${maxDimension},ih)':force_original_aspect_ratio=decrease`;
|
|
149
|
+
}
|
|
150
|
+
__name(scaleFilter, "scaleFilter");
|
|
151
|
+
function parseShowinfoTimestamps(stderr) {
|
|
152
|
+
const timestamps = [];
|
|
153
|
+
const pattern = /\bn:\s*\d+.*?\bpts_time:(-?[\d.]+)/g;
|
|
154
|
+
for (const match of stderr.matchAll(pattern)) {
|
|
155
|
+
const t = Number(match[1]);
|
|
156
|
+
timestamps.push(Number.isFinite(t) && t >= 0 ? t : NaN);
|
|
157
|
+
}
|
|
158
|
+
return timestamps;
|
|
159
|
+
}
|
|
160
|
+
__name(parseShowinfoTimestamps, "parseShowinfoTimestamps");
|
|
161
|
+
async function listFrameFiles(outputDir, nameTemplate) {
|
|
162
|
+
const matcher = frameFileMatcher(nameTemplate);
|
|
163
|
+
const entries = await fs.readdir(outputDir);
|
|
164
|
+
return entries.filter((name) => matcher.test(name)).sort();
|
|
165
|
+
}
|
|
166
|
+
__name(listFrameFiles, "listFrameFiles");
|
|
167
|
+
var SCENE_SEARCH_WINDOW_SECONDS = 30;
|
|
168
|
+
function formatSeconds(seconds) {
|
|
169
|
+
return seconds.toFixed(3);
|
|
170
|
+
}
|
|
171
|
+
__name(formatSeconds, "formatSeconds");
|
|
172
|
+
function formatClock(totalSeconds, withHours) {
|
|
173
|
+
const s = Math.max(0, Math.round(totalSeconds));
|
|
174
|
+
const h = Math.floor(s / 3600);
|
|
175
|
+
const m = Math.floor(s % 3600 / 60);
|
|
176
|
+
const mm = String(m).padStart(2, "0");
|
|
177
|
+
const ss = String(s % 60).padStart(2, "0");
|
|
178
|
+
return withHours ? `${h}:${mm}:${ss}` : `${mm}:${ss}`;
|
|
179
|
+
}
|
|
180
|
+
__name(formatClock, "formatClock");
|
|
181
|
+
async function fileExists(filePath) {
|
|
182
|
+
try {
|
|
183
|
+
await fs.access(filePath);
|
|
184
|
+
return true;
|
|
185
|
+
} catch {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
__name(fileExists, "fileExists");
|
|
190
|
+
var SEEK_CONCURRENCY = 4;
|
|
191
|
+
var ExtractKeyframesInvocation = class extends BaseMediaPolicyToolInvocation {
|
|
192
|
+
constructor(params, settingsDefaults, timeoutMs) {
|
|
193
|
+
super(params);
|
|
194
|
+
this.settingsDefaults = settingsDefaults;
|
|
195
|
+
this.timeoutMs = timeoutMs;
|
|
196
|
+
}
|
|
197
|
+
static {
|
|
198
|
+
__name(this, "ExtractKeyframesInvocation");
|
|
199
|
+
}
|
|
200
|
+
getDescription() {
|
|
201
|
+
const maxFrames = this.params.maxFrames ?? EXTRACT_KEYFRAMES_DEFAULTS.maxFrames;
|
|
202
|
+
return `Extract up to ${maxFrames} keyframes from ${path.basename(this.params.inputPath)}`;
|
|
203
|
+
}
|
|
204
|
+
async execute(signal) {
|
|
205
|
+
const settings = this.settingsDefaults;
|
|
206
|
+
const maxFrames = Math.floor(
|
|
207
|
+
this.params.maxFrames ?? readNumber(settings, "maxFrames") ?? EXTRACT_KEYFRAMES_DEFAULTS.maxFrames
|
|
208
|
+
);
|
|
209
|
+
const sceneThreshold = this.params.sceneThreshold ?? readNonNegativeNumber(settings, "sceneThreshold") ?? EXTRACT_KEYFRAMES_DEFAULTS.sceneThreshold;
|
|
210
|
+
const maxDimension = this.params.maxDimension ?? readNumber(settings, "maxDimension") ?? EXTRACT_KEYFRAMES_DEFAULTS.maxDimension;
|
|
211
|
+
const strategy = this.params.strategy ?? readStrategy(settings) ?? EXTRACT_KEYFRAMES_DEFAULTS.strategy;
|
|
212
|
+
const fps = this.params.fps ?? readNumber(settings, "fps") ?? EXTRACT_KEYFRAMES_DEFAULTS.fps;
|
|
213
|
+
const startSec = this.params.startSec ?? readNonNegativeNumber(settings, "startSec");
|
|
214
|
+
const endSec = this.params.endSec ?? readNumber(settings, "endSec");
|
|
215
|
+
const frameTokenBudget = this.params.frameTokenBudget ?? readTier(settings);
|
|
216
|
+
try {
|
|
217
|
+
const { inputSizeBytes } = await assertMediaPolicyIo(this.params);
|
|
218
|
+
const probe = await probeMediaMetadata(
|
|
219
|
+
this.params.inputPath,
|
|
220
|
+
"video",
|
|
221
|
+
signal
|
|
222
|
+
);
|
|
223
|
+
const durationSeconds = probe.durationMs !== void 0 && probe.durationMs > 0 ? probe.durationMs / 1e3 : void 0;
|
|
224
|
+
let scaleVf = scaleFilter(maxDimension);
|
|
225
|
+
const sourceDimsKnown = probe.width !== void 0 && probe.height !== void 0 && probe.width > 0 && probe.height > 0;
|
|
226
|
+
let deliveredResolution = "";
|
|
227
|
+
if (frameTokenBudget && sourceDimsKnown) {
|
|
228
|
+
const target = videoFrameDimensionsForTokenBudget(
|
|
229
|
+
probe.width,
|
|
230
|
+
probe.height,
|
|
231
|
+
frameTokenBudget
|
|
232
|
+
);
|
|
233
|
+
scaleVf = `scale=${target.width}:${target.height}`;
|
|
234
|
+
deliveredResolution = `${target.width}\xD7${target.height}`;
|
|
235
|
+
} else if (sourceDimsKnown) {
|
|
236
|
+
const factor = Math.min(
|
|
237
|
+
1,
|
|
238
|
+
maxDimension / Math.max(probe.width, probe.height)
|
|
239
|
+
);
|
|
240
|
+
deliveredResolution = `${Math.round(probe.width * factor)}\xD7${Math.round(probe.height * factor)}`;
|
|
241
|
+
}
|
|
242
|
+
const remainingTimeoutMs = createPolicyToolTimeoutBudget(this.timeoutMs);
|
|
243
|
+
const context = {
|
|
244
|
+
maxFrames,
|
|
245
|
+
sceneThreshold,
|
|
246
|
+
maxDimension,
|
|
247
|
+
scaleVf,
|
|
248
|
+
remainingTimeoutMs,
|
|
249
|
+
signal
|
|
250
|
+
};
|
|
251
|
+
const extraction = strategy === "uniform" && durationSeconds !== void 0 ? await this.extractUniform(context, durationSeconds, {
|
|
252
|
+
fps,
|
|
253
|
+
startSec,
|
|
254
|
+
endSec
|
|
255
|
+
}) : durationSeconds !== void 0 && maxFrames > 1 ? await this.extractBucketed(context, durationSeconds) : await this.extractSinglePass(context);
|
|
256
|
+
if (!Array.isArray(extraction)) {
|
|
257
|
+
return extraction;
|
|
258
|
+
}
|
|
259
|
+
const frames = extraction;
|
|
260
|
+
const bucketed = strategy !== "uniform" && durationSeconds !== void 0 && maxFrames > 1;
|
|
261
|
+
const originalDuration = durationSeconds !== void 0 ? `${Math.round(durationSeconds)}s` : formatBytesShort(inputSizeBytes);
|
|
262
|
+
const originalResolution = probe.width !== void 0 && probe.height !== void 0 ? `/${probe.width}\xD7${probe.height}` : "";
|
|
263
|
+
const samplingNote = strategy === "uniform" ? `\u5747\u5300\u62BD\u5E27\uFF08\u52A8\u6001\u5E27\u7387 ${fps}fps \u76EE\u6807\uFF0C\u5171 ${frames.length} \u5E27\uFF09` : bucketed ? frames.length < maxFrames ? `\u9759\u6001\u62BD\u5E27\uFF08\u5168\u7247\u5206\u6876\u91C7\u6837\uFF0C\u4EC5\u8986\u76D6 ${frames.length}/${maxFrames} \u4E2A\u5206\u6876\uFF0C\u5176\u4F59\u65F6\u6BB5\u672A\u91C7\u6837\uFF09` : "\u9759\u6001\u62BD\u5E27\uFF08\u5168\u7247\u5206\u6876\u91C7\u6837\uFF09" : "\u9759\u6001\u62BD\u5E27";
|
|
264
|
+
const header = `\u539F\u89C6\u9891 ${originalDuration}${originalResolution} \u2192 \u5173\u952E\u5E27${deliveredResolution ? `\uFF0C\u7F29\u653E\u81F3 ${deliveredResolution}` : ""}\uFF0C${samplingNote}\uFF0C\u65F6\u95F4\u8FDE\u7EED\u6027\u4E22\u5931\u3002\u964D\u8D28\u5E27\u4E0D\u8DB3\u4EE5\u8FA8\u8BC6\u6587\u5B57/\u5C0F\u7269\u4F53/\u7CBE\u786E\u8BA1\u6570\uFF1A\u5148\u7528 omni_extract_keyframes\uFF08strategy=uniform\u3001startSec\u3001endSec\uFF09\u5728\u7591\u4F3C\u533A\u95F4\u52A0\u5BC6\u62BD\u5E27\u5B9A\u4F4D\uFF0C\u518D\u7528 omni_clip_video \u622A\u53D6 \u226420s \u540E read_file \u770B\u539F\u751F\u89C6\u9891\u3002\u770B\u4E0D\u6E05\u7684\u7EC6\u8282\u4E0D\u8981\u51ED\u731C\u6D4B\u4F5C\u7B54`;
|
|
265
|
+
const withHours = (durationSeconds ?? 0) >= 3600;
|
|
266
|
+
const artifacts = [];
|
|
267
|
+
for (const [index, frame] of frames.entries()) {
|
|
268
|
+
const sizeBytes = (await fs.stat(path.join(this.params.outputDir, frame.fileName))).size;
|
|
269
|
+
const t = frame.timeSeconds;
|
|
270
|
+
const marker = t !== void 0 && Number.isFinite(t) ? `<${formatClock(t, withHours)}>` : `<\u5173\u952E\u5E27 ${index + 1}/${frames.length}>`;
|
|
271
|
+
artifacts.push({
|
|
272
|
+
kind: "image",
|
|
273
|
+
storage: "workspace",
|
|
274
|
+
title: `Keyframe ${index + 1}/${frames.length}`,
|
|
275
|
+
workspacePath: frame.fileName,
|
|
276
|
+
mimeType: "image/jpeg",
|
|
277
|
+
sizeBytes,
|
|
278
|
+
metadata: {
|
|
279
|
+
// First frame: header + its marker; the rest: marker only. D8 is
|
|
280
|
+
// still satisfied — every lossy frame carries a non-empty
|
|
281
|
+
// disclosure.
|
|
282
|
+
omniDisclosure: index === 0 ? `${header}
|
|
283
|
+
${marker}` : marker,
|
|
284
|
+
// Marks the artifact as a sampled excerpt for downstream role
|
|
285
|
+
// consumers (output routing selectors, memory coverage).
|
|
286
|
+
omniRole: "keyframe"
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
const summary = `Extracted ${frames.length} keyframe(s) from ${path.basename(this.params.inputPath)} (${originalDuration}${originalResolution})`;
|
|
291
|
+
const outputPaths = frames.map((frame) => path.join(this.params.outputDir, frame.fileName)).join("\n");
|
|
292
|
+
return {
|
|
293
|
+
llmContent: `${summary}
|
|
294
|
+
Output files:
|
|
295
|
+
${outputPaths}
|
|
296
|
+
Use read_file with these absolute paths to inspect the results.`,
|
|
297
|
+
returnDisplay: summary,
|
|
298
|
+
artifacts
|
|
299
|
+
};
|
|
300
|
+
} catch (error) {
|
|
301
|
+
return mediaPolicyToolFailure(error);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Full-duration coverage: split the timeline into `maxFrames` equal
|
|
306
|
+
* buckets and extract one frame per bucket — a scene change from the
|
|
307
|
+
* bucket's opening window when one exists, the bucket midpoint
|
|
308
|
+
* otherwise. Input seeking (`-ss` before `-i`) jumps straight to each
|
|
309
|
+
* bucket without decoding the preceding footage; it also resets
|
|
310
|
+
* pts to ~0, so the absolute timestamp is bucketStart + showinfo
|
|
311
|
+
* pts_time. Individual bucket failures are tolerated (the last one is
|
|
312
|
+
* kept for the zero-frames diagnostic); the loop stops early when the
|
|
313
|
+
* shared budget is exhausted.
|
|
314
|
+
*/
|
|
315
|
+
async extractBucketed(context, durationSeconds) {
|
|
316
|
+
const { maxFrames, sceneThreshold, scaleVf, remainingTimeoutMs, signal } = context;
|
|
317
|
+
const bucket = durationSeconds / maxFrames;
|
|
318
|
+
const window = Math.min(bucket, SCENE_SEARCH_WINDOW_SECONDS);
|
|
319
|
+
const frames = [];
|
|
320
|
+
let lastFailure;
|
|
321
|
+
for (let i = 0; i < maxFrames; i++) {
|
|
322
|
+
if (remainingTimeoutMs() <= 1) {
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
325
|
+
const bucketStart = i * bucket;
|
|
326
|
+
const fileName = policyOutputFileName({
|
|
327
|
+
inputPath: this.params.inputPath,
|
|
328
|
+
operation: "keyframe",
|
|
329
|
+
variant: String(i + 1).padStart(4, "0"),
|
|
330
|
+
extension: ".jpg"
|
|
331
|
+
});
|
|
332
|
+
const outputPath = path.join(this.params.outputDir, fileName);
|
|
333
|
+
const sceneRun = await runFfmpeg(
|
|
334
|
+
[
|
|
335
|
+
"-y",
|
|
336
|
+
"-ss",
|
|
337
|
+
formatSeconds(bucketStart),
|
|
338
|
+
"-t",
|
|
339
|
+
formatSeconds(window),
|
|
340
|
+
"-i",
|
|
341
|
+
this.params.inputPath,
|
|
342
|
+
"-vf",
|
|
343
|
+
`select='gt(scene,${sceneThreshold})',${scaleVf},showinfo`,
|
|
344
|
+
"-vsync",
|
|
345
|
+
"vfr",
|
|
346
|
+
"-frames:v",
|
|
347
|
+
"1",
|
|
348
|
+
"-q:v",
|
|
349
|
+
"4",
|
|
350
|
+
"-update",
|
|
351
|
+
"1",
|
|
352
|
+
outputPath
|
|
353
|
+
],
|
|
354
|
+
{ signal, timeoutMs: remainingTimeoutMs() }
|
|
355
|
+
);
|
|
356
|
+
if (signal.aborted) {
|
|
357
|
+
return mediaPolicyToolError("keyframe extraction aborted");
|
|
358
|
+
}
|
|
359
|
+
if (sceneRun.code === 0 && await fileExists(outputPath)) {
|
|
360
|
+
const pts = parseShowinfoTimestamps(sceneRun.stderr)[0];
|
|
361
|
+
frames.push({
|
|
362
|
+
fileName,
|
|
363
|
+
timeSeconds: bucketStart + (pts !== void 0 && Number.isFinite(pts) ? pts : window / 2)
|
|
364
|
+
});
|
|
365
|
+
continue;
|
|
366
|
+
}
|
|
367
|
+
if (sceneRun.code !== 0) {
|
|
368
|
+
lastFailure = sceneRun;
|
|
369
|
+
}
|
|
370
|
+
const midpoint = bucketStart + bucket / 2;
|
|
371
|
+
const midpointRun = await runFfmpeg(
|
|
372
|
+
[
|
|
373
|
+
"-y",
|
|
374
|
+
"-ss",
|
|
375
|
+
formatSeconds(midpoint),
|
|
376
|
+
"-i",
|
|
377
|
+
this.params.inputPath,
|
|
378
|
+
"-vf",
|
|
379
|
+
scaleVf,
|
|
380
|
+
"-frames:v",
|
|
381
|
+
"1",
|
|
382
|
+
"-q:v",
|
|
383
|
+
"4",
|
|
384
|
+
"-update",
|
|
385
|
+
"1",
|
|
386
|
+
outputPath
|
|
387
|
+
],
|
|
388
|
+
{ signal, timeoutMs: remainingTimeoutMs() }
|
|
389
|
+
);
|
|
390
|
+
if (signal.aborted) {
|
|
391
|
+
return mediaPolicyToolError("keyframe extraction aborted");
|
|
392
|
+
}
|
|
393
|
+
if (midpointRun.code === 0 && await fileExists(outputPath)) {
|
|
394
|
+
frames.push({ fileName, timeSeconds: midpoint });
|
|
395
|
+
} else if (midpointRun.code !== 0) {
|
|
396
|
+
lastFailure = midpointRun;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
if (frames.length === 0) {
|
|
400
|
+
return mediaPolicyToolError(
|
|
401
|
+
lastFailure !== void 0 ? ffmpegFailureMessage(
|
|
402
|
+
lastFailure,
|
|
403
|
+
"extracting keyframes from",
|
|
404
|
+
this.params.inputPath
|
|
405
|
+
) : `no keyframes could be extracted from ${path.basename(this.params.inputPath)}`
|
|
406
|
+
);
|
|
407
|
+
}
|
|
408
|
+
return frames;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Uniform strategy (⓫, ported from the plugin's
|
|
412
|
+
* `compute_dynamic_fps` + `extract_frames_by_seeking`): the frame
|
|
413
|
+
* count adapts to the window length — clamp(window × fps, 1,
|
|
414
|
+
* maxFrames) — so long videos automatically thin out (the effective
|
|
415
|
+
* fps is nframes/window, capped at the native frame rate), and every
|
|
416
|
+
* timestamp is extracted by its own input-side seek (`-ss` before
|
|
417
|
+
* `-i`: no decode of the preceding footage) with bounded concurrency.
|
|
418
|
+
* `startSec`/`endSec` bound the sampling window (clip-and-sample in
|
|
419
|
+
* one pass). Per-frame timestamps are exact by construction.
|
|
420
|
+
*/
|
|
421
|
+
async extractUniform(context, durationSeconds, options) {
|
|
422
|
+
const { maxFrames, scaleVf, remainingTimeoutMs, signal } = context;
|
|
423
|
+
const { fps } = options;
|
|
424
|
+
const windowStart = Math.max(0, options.startSec ?? 0);
|
|
425
|
+
if (windowStart >= durationSeconds) {
|
|
426
|
+
return mediaPolicyToolError(
|
|
427
|
+
`startSec (${windowStart}) is at or beyond the end of the video (${Math.round(durationSeconds)}s)`
|
|
428
|
+
);
|
|
429
|
+
}
|
|
430
|
+
const windowEnd = Math.min(
|
|
431
|
+
options.endSec ?? durationSeconds,
|
|
432
|
+
durationSeconds
|
|
433
|
+
);
|
|
434
|
+
if (windowEnd <= windowStart) {
|
|
435
|
+
return mediaPolicyToolError(
|
|
436
|
+
`the sampling window [${windowStart}\u2013${windowEnd}] is empty`
|
|
437
|
+
);
|
|
438
|
+
}
|
|
439
|
+
const windowSeconds = windowEnd - windowStart;
|
|
440
|
+
const nframes = Math.max(
|
|
441
|
+
1,
|
|
442
|
+
Math.min(maxFrames, Math.floor(windowSeconds * fps))
|
|
443
|
+
);
|
|
444
|
+
const slice = windowSeconds / nframes;
|
|
445
|
+
const timestamps = Array.from(
|
|
446
|
+
{ length: nframes },
|
|
447
|
+
(_, i) => windowStart + (i + 0.5) * slice
|
|
448
|
+
);
|
|
449
|
+
const outcomes = new Array(nframes);
|
|
450
|
+
let nextIndex = 0;
|
|
451
|
+
const worker = /* @__PURE__ */ __name(async () => {
|
|
452
|
+
while (!signal.aborted) {
|
|
453
|
+
const index = nextIndex++;
|
|
454
|
+
if (index >= nframes) return;
|
|
455
|
+
if (remainingTimeoutMs() <= 1) return;
|
|
456
|
+
const timestamp = timestamps[index];
|
|
457
|
+
const fileName = policyOutputFileName({
|
|
458
|
+
inputPath: this.params.inputPath,
|
|
459
|
+
operation: "keyframe",
|
|
460
|
+
variant: String(index + 1).padStart(4, "0"),
|
|
461
|
+
extension: ".jpg"
|
|
462
|
+
});
|
|
463
|
+
const outputPath = path.join(this.params.outputDir, fileName);
|
|
464
|
+
const run = await runFfmpeg(
|
|
465
|
+
[
|
|
466
|
+
"-y",
|
|
467
|
+
"-ss",
|
|
468
|
+
formatSeconds(timestamp),
|
|
469
|
+
"-i",
|
|
470
|
+
this.params.inputPath,
|
|
471
|
+
"-vf",
|
|
472
|
+
scaleVf,
|
|
473
|
+
"-frames:v",
|
|
474
|
+
"1",
|
|
475
|
+
"-q:v",
|
|
476
|
+
"4",
|
|
477
|
+
"-update",
|
|
478
|
+
"1",
|
|
479
|
+
outputPath
|
|
480
|
+
],
|
|
481
|
+
{ signal, timeoutMs: remainingTimeoutMs() }
|
|
482
|
+
);
|
|
483
|
+
if (signal.aborted) return;
|
|
484
|
+
if (run.code === 0 && await fileExists(outputPath)) {
|
|
485
|
+
outcomes[index] = { fileName, timeSeconds: timestamp };
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}, "worker");
|
|
489
|
+
await Promise.all(
|
|
490
|
+
Array.from({ length: Math.min(SEEK_CONCURRENCY, nframes) }, worker)
|
|
491
|
+
);
|
|
492
|
+
if (signal.aborted) {
|
|
493
|
+
return mediaPolicyToolError("keyframe extraction aborted");
|
|
494
|
+
}
|
|
495
|
+
const frames = outcomes.filter((f) => f !== void 0);
|
|
496
|
+
if (frames.length === 0) {
|
|
497
|
+
return mediaPolicyToolError(
|
|
498
|
+
`no keyframes could be extracted from ${path.basename(this.params.inputPath)}`
|
|
499
|
+
);
|
|
500
|
+
}
|
|
501
|
+
return frames;
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* Single-pass scene detection (legacy path): frame 0 always selected,
|
|
505
|
+
* then every frame whose scene score exceeds the threshold, capped at
|
|
506
|
+
* maxFrames. Only used when the duration is unknown (buckets cannot
|
|
507
|
+
* be placed) or a single frame was requested. showinfo (after select)
|
|
508
|
+
* logs one stderr line per KEPT frame with its pts_time — the
|
|
509
|
+
* timestamps feed the per-frame disclosures.
|
|
510
|
+
*/
|
|
511
|
+
async extractSinglePass(context) {
|
|
512
|
+
const { maxFrames, sceneThreshold, scaleVf, remainingTimeoutMs, signal } = context;
|
|
513
|
+
const frameNameTemplate = policyOutputFileName({
|
|
514
|
+
inputPath: this.params.inputPath,
|
|
515
|
+
operation: "keyframe",
|
|
516
|
+
variant: "%04d",
|
|
517
|
+
extension: ".jpg"
|
|
518
|
+
});
|
|
519
|
+
const outputPattern = path.join(this.params.outputDir, frameNameTemplate);
|
|
520
|
+
const staleFrames = await listFrameFiles(
|
|
521
|
+
this.params.outputDir,
|
|
522
|
+
frameNameTemplate
|
|
523
|
+
);
|
|
524
|
+
await Promise.all(
|
|
525
|
+
staleFrames.map(
|
|
526
|
+
(name) => fs.rm(path.join(this.params.outputDir, name), { force: true }).catch(() => {
|
|
527
|
+
})
|
|
528
|
+
)
|
|
529
|
+
);
|
|
530
|
+
const scenePass = await runFfmpeg(
|
|
531
|
+
[
|
|
532
|
+
"-y",
|
|
533
|
+
"-i",
|
|
534
|
+
this.params.inputPath,
|
|
535
|
+
"-vf",
|
|
536
|
+
`select='eq(n,0)+gt(scene,${sceneThreshold})',${scaleVf},showinfo`,
|
|
537
|
+
"-vsync",
|
|
538
|
+
"vfr",
|
|
539
|
+
"-frames:v",
|
|
540
|
+
String(maxFrames),
|
|
541
|
+
"-q:v",
|
|
542
|
+
"4",
|
|
543
|
+
outputPattern
|
|
544
|
+
],
|
|
545
|
+
{ signal, timeoutMs: remainingTimeoutMs() }
|
|
546
|
+
);
|
|
547
|
+
if (signal.aborted) {
|
|
548
|
+
return mediaPolicyToolError("keyframe extraction aborted");
|
|
549
|
+
}
|
|
550
|
+
if (scenePass.code !== 0) {
|
|
551
|
+
return mediaPolicyToolError(
|
|
552
|
+
ffmpegFailureMessage(
|
|
553
|
+
scenePass,
|
|
554
|
+
"extracting keyframes from",
|
|
555
|
+
this.params.inputPath
|
|
556
|
+
)
|
|
557
|
+
);
|
|
558
|
+
}
|
|
559
|
+
const frameFiles = await listFrameFiles(
|
|
560
|
+
this.params.outputDir,
|
|
561
|
+
frameNameTemplate
|
|
562
|
+
);
|
|
563
|
+
if (frameFiles.length === 0) {
|
|
564
|
+
return mediaPolicyToolError(
|
|
565
|
+
`no keyframes could be extracted from ${path.basename(this.params.inputPath)}`
|
|
566
|
+
);
|
|
567
|
+
}
|
|
568
|
+
const timestamps = parseShowinfoTimestamps(scenePass.stderr);
|
|
569
|
+
return frameFiles.map((fileName, index) => {
|
|
570
|
+
const t = timestamps[index];
|
|
571
|
+
return {
|
|
572
|
+
fileName,
|
|
573
|
+
timeSeconds: t !== void 0 && Number.isFinite(t) ? t : void 0
|
|
574
|
+
};
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
};
|
|
578
|
+
var OmniExtractKeyframesTool = class extends BaseMediaPolicyTool {
|
|
579
|
+
static {
|
|
580
|
+
__name(this, "OmniExtractKeyframesTool");
|
|
581
|
+
}
|
|
582
|
+
constructor(config) {
|
|
583
|
+
super(
|
|
584
|
+
OMNI_EXTRACT_KEYFRAMES_TOOL_NAME,
|
|
585
|
+
"ExtractKeyframes",
|
|
586
|
+
"Extracts representative still frames spread across the full video duration (per-segment scene detection with midpoint fallback), producing JPEG keyframes with per-frame timestamps and a disclosure of the temporal loss.",
|
|
587
|
+
"other" /* Other */,
|
|
588
|
+
{
|
|
589
|
+
type: "object",
|
|
590
|
+
properties: {
|
|
591
|
+
...MEDIA_POLICY_IO_SCHEMA_PROPERTIES,
|
|
592
|
+
...TUNABLE_SCHEMA_PROPERTIES
|
|
593
|
+
},
|
|
594
|
+
required: ["outputDir"],
|
|
595
|
+
additionalProperties: false
|
|
596
|
+
},
|
|
597
|
+
config
|
|
598
|
+
);
|
|
599
|
+
}
|
|
600
|
+
get mediaPolicyDescriptor() {
|
|
601
|
+
return DESCRIPTOR;
|
|
602
|
+
}
|
|
603
|
+
createInvocation(params) {
|
|
604
|
+
return new ExtractKeyframesInvocation(
|
|
605
|
+
params,
|
|
606
|
+
resolvePolicyToolSettings(this.configView, this.name),
|
|
607
|
+
resolvePolicyToolTimeoutMs(this.configView, this.name)
|
|
608
|
+
);
|
|
609
|
+
}
|
|
610
|
+
};
|
|
611
|
+
export {
|
|
612
|
+
EXTRACT_KEYFRAMES_DEFAULTS,
|
|
613
|
+
OMNI_EXTRACT_KEYFRAMES_TOOL_NAME,
|
|
614
|
+
OmniExtractKeyframesTool,
|
|
615
|
+
parseShowinfoTimestamps
|
|
616
|
+
};
|
|
617
|
+
/**
|
|
618
|
+
* @license
|
|
619
|
+
* Copyright 2025 Google LLC
|
|
620
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
621
|
+
*/
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// Force strict mode and setup for ESM
|
|
2
2
|
"use strict";
|
|
3
|
-
import {
|
|
4
|
-
RUNTIME_STARTUP_CANCELLED_MESSAGE
|
|
5
|
-
} from "./chunk-QUPXZXLV.js";
|
|
6
3
|
import {
|
|
7
4
|
getHeadlessYoloSafetyWarning
|
|
8
5
|
} from "./chunk-6H67XLET.js";
|
|
6
|
+
import {
|
|
7
|
+
RUNTIME_STARTUP_CANCELLED_MESSAGE
|
|
8
|
+
} from "./chunk-QUPXZXLV.js";
|
|
9
9
|
import {
|
|
10
10
|
MAX_COMPACTED_REPLAY_MAX_BYTES
|
|
11
11
|
} from "./chunk-WCCLLK7X.js";
|
|
@@ -374,7 +374,7 @@ async function maybeOpenWebShellBrowser(handle, open, openWithAuth) {
|
|
|
374
374
|
} catch {
|
|
375
375
|
return;
|
|
376
376
|
}
|
|
377
|
-
const { maybeOpenWebShellBrowser: openBrowser } = await import("./serve-
|
|
377
|
+
const { maybeOpenWebShellBrowser: openBrowser } = await import("./serve-UQL5X5K7.js");
|
|
378
378
|
await openBrowser(handle, true, openWithAuth);
|
|
379
379
|
}
|
|
380
380
|
__name(maybeOpenWebShellBrowser, "maybeOpenWebShellBrowser");
|
|
@@ -447,7 +447,7 @@ async function tryRunServeFastPath(rawArgv = process.argv.slice(2)) {
|
|
|
447
447
|
process.exit(1);
|
|
448
448
|
}
|
|
449
449
|
}
|
|
450
|
-
const { runQwenServe } = await import("./run-qwen-serve-
|
|
450
|
+
const { runQwenServe } = await import("./run-qwen-serve-3K3D5MSR.js");
|
|
451
451
|
let handle;
|
|
452
452
|
try {
|
|
453
453
|
handle = await runQwenServe(parsed.options, {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Force strict mode and setup for ESM
|
|
2
|
+
"use strict";
|
|
3
|
+
import {
|
|
4
|
+
assertOmniRuntimeDependencies,
|
|
5
|
+
isFfmpegAvailable,
|
|
6
|
+
isFfprobeAvailable,
|
|
7
|
+
probeMediaMetadata,
|
|
8
|
+
resetFfmpegCachesForTests,
|
|
9
|
+
runFfmpeg
|
|
10
|
+
} from "./chunk-KSEKRQJO.js";
|
|
11
|
+
import "./chunk-S34QJ6IR.js";
|
|
12
|
+
import "./chunk-5O2XNYP6.js";
|
|
13
|
+
import "./chunk-J2S4EL5Y.js";
|
|
14
|
+
export {
|
|
15
|
+
assertOmniRuntimeDependencies,
|
|
16
|
+
isFfmpegAvailable,
|
|
17
|
+
isFfprobeAvailable,
|
|
18
|
+
probeMediaMetadata,
|
|
19
|
+
resetFfmpegCachesForTests,
|
|
20
|
+
runFfmpeg
|
|
21
|
+
};
|