@qwen-code/qwen-code 0.19.12-preview.0 → 0.20.0-nightly.20260720.0c271659d
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/channels/overview.md +4 -2
- package/bundled/qc-helper/docs/integration-github-action.md +1 -1
- package/bundled/qc-helper/docs/qwen-serve.md +42 -5
- package/bundled/review/DESIGN.md +2 -2
- package/bundled/review/SKILL.md +13 -9
- package/chunks/{MaxSizedBox-3KIWAU6Z.js → MaxSizedBox-ED3QND6V.js} +30 -27
- package/chunks/{StandaloneSessionPicker-TF626NO7.js → StandaloneSessionPicker-NQVAOTKS.js} +50 -45
- package/chunks/{acpAgent-JDVJXVBO.js → acpAgent-HOBFF5B6.js} +353 -130
- package/chunks/{agent-BONWC4VY.js → agent-J7EPFLA6.js} +22 -22
- package/chunks/{agent-headless-H7HKMGLZ.js → agent-headless-RRG3JU7Q.js} +22 -22
- package/chunks/{anthropicContentGenerator-ZZRGFEES.js → anthropicContentGenerator-HVKLXOOU.js} +6 -5
- package/chunks/{artifact-tool-PHO5XEGZ.js → artifact-tool-WBCAMD3O.js} +2 -2
- package/chunks/{askUserQuestion-CEPBT47X.js → askUserQuestion-6DZC4UV5.js} +2 -2
- package/chunks/{bridge-ATN2TLWJ.js → bridge-OW5FZ6BF.js} +25 -25
- package/chunks/build-SSCNEHZZ.js +62 -0
- package/chunks/{channel-worker-group-S3H5QHTI.js → channel-worker-group-53CMOPFT.js} +4 -4
- package/chunks/{channel-worker-manager-ZJ4HTMO2.js → channel-worker-manager-UTXILKC2.js} +4 -4
- package/chunks/{channel-worker-supervisor-JA6VZ5V5.js → channel-worker-supervisor-ZGO2W2MD.js} +3 -3
- package/chunks/chunk-27AJEU6G.js +442 -0
- package/chunks/{chunk-53UMEONK.js → chunk-2HOVDT7W.js} +1 -1
- package/chunks/{chunk-6WZZHJSZ.js → chunk-2JOLZA6L.js} +5 -5
- package/chunks/{chunk-NSZJQACR.js → chunk-2TDSM7I6.js} +3 -3
- package/chunks/{chunk-ILQ42UG6.js → chunk-2YJLFCYI.js} +7 -7
- package/chunks/{chunk-CMHJEUVB.js → chunk-37MGCVTS.js} +1 -1
- package/chunks/{chunk-F2YCCUXI.js → chunk-3ML52IFS.js} +4 -4
- package/chunks/{chunk-3PE7OY2G.js → chunk-3QR5MOHP.js} +2 -2
- package/chunks/{chunk-4AGBO6RB.js → chunk-3SNKL6L6.js} +29 -13
- package/chunks/{chunk-OZWJAFFE.js → chunk-3ZL6YMO2.js} +3 -3
- package/chunks/chunk-43T5WDQ7.js +127 -0
- package/chunks/{chunk-E655RDRL.js → chunk-4ODB7WIB.js} +1 -1
- package/chunks/{chunk-66F4IJ4L.js → chunk-4UH63YE5.js} +5 -5
- package/chunks/{chunk-QGONRHUS.js → chunk-53OPIXUE.js} +3 -3
- package/chunks/{chunk-HTHUX2T5.js → chunk-5QWWOFGG.js} +0 -1
- package/chunks/{chunk-3DJY4IFO.js → chunk-5SCI6E3E.js} +1 -1
- package/chunks/{chunk-4CHDYDG3.js → chunk-6EFTQYW7.js} +1 -1
- package/chunks/{chunk-4W55BHOC.js → chunk-6HQW55TM.js} +29 -2
- package/chunks/{chunk-LODZMRXC.js → chunk-6MN6XJTR.js} +2379 -1291
- package/chunks/{chunk-EWPLL4OT.js → chunk-6VGRTGOG.js} +1 -1
- package/chunks/{chunk-R32BTEZY.js → chunk-7JQK6FXK.js} +198 -120
- package/chunks/{chunk-SMASS3CY.js → chunk-A4TJMY65.js} +1 -1
- package/chunks/{chunk-JUNVFQVY.js → chunk-AMRWCMX4.js} +4 -4
- package/chunks/{chunk-XAAEDML2.js → chunk-AYCDXHZB.js} +1 -1
- package/chunks/{chunk-VAJS2E2D.js → chunk-BDBMYST4.js} +1 -1
- package/chunks/{chunk-F2RR4HO2.js → chunk-BVLROR2T.js} +1 -1
- package/chunks/{chunk-UE5TZ55T.js → chunk-C27BYUX6.js} +29 -2
- package/chunks/{chunk-ZPVGEMVC.js → chunk-CL7IRYTA.js} +1 -1
- package/chunks/{chunk-DULSE2SH.js → chunk-COWNNAWJ.js} +1 -1
- package/chunks/{chunk-UOA2IHRI.js → chunk-CPCVCKKF.js} +1 -1
- package/chunks/{chunk-4RPARQ5D.js → chunk-D2VIDMVM.js} +2 -2
- package/chunks/{chunk-PTXVHS2O.js → chunk-DCCW7CRR.js} +6 -6
- package/chunks/chunk-DIKIJS6Z.js +114 -0
- package/chunks/{chunk-NVUGS23Y.js → chunk-DR5AUNJ2.js} +4 -4
- package/chunks/{chunk-7KS72E2N.js → chunk-DSBCU6JY.js} +3 -3
- package/chunks/{chunk-LKR7QQ63.js → chunk-EAUYY7SS.js} +3 -3
- package/chunks/{chunk-J2MKYJKZ.js → chunk-EIAK6Q2B.js} +2 -2
- package/chunks/{chunk-WEPXQKGP.js → chunk-EZVDJFZ7.js} +1 -1
- package/chunks/{chunk-WHQNBBWW.js → chunk-FLSVD6BS.js} +2 -2
- package/chunks/{chunk-XACBIZJB.js → chunk-FODJ5Q5K.js} +3 -3
- package/chunks/{chunk-4XCVGEEX.js → chunk-FSL5W5TI.js} +3 -3
- package/chunks/{chunk-K7P34F2J.js → chunk-FWT66O5E.js} +2 -2
- package/chunks/{chunk-OSSDHJDU.js → chunk-G45X5TRN.js} +1 -1
- package/chunks/{chunk-R4RIMOJL.js → chunk-G6MDKXDP.js} +12 -12
- package/chunks/{chunk-KANTXY7B.js → chunk-GKY2OJ7R.js} +2 -2
- package/chunks/chunk-GMGDLUC7.js +37 -0
- package/chunks/{chunk-J6NT5YTN.js → chunk-H2XVO6NE.js} +1 -289
- package/chunks/{chunk-7OZGMFHC.js → chunk-I4HZ4GOD.js} +8 -8
- package/chunks/{chunk-YN2I5I42.js → chunk-I6JUVU7J.js} +34 -24
- package/chunks/{chunk-LLIGYAQU.js → chunk-IDGTC5AS.js} +3 -3
- package/chunks/{chunk-LHEQDKAR.js → chunk-INL2RSLA.js} +1 -1
- package/chunks/{chunk-CXWUXRD5.js → chunk-INQQM52C.js} +18 -16
- package/chunks/{chunk-2DZ7E27L.js → chunk-JBCFW3IL.js} +2 -2
- package/chunks/{chunk-LPHGXXZX.js → chunk-JD3MKVKL.js} +1 -1
- package/chunks/{chunk-6TDA4EVC.js → chunk-JDPCOUZ3.js} +2282 -662
- package/chunks/{chunk-NUHSLBJZ.js → chunk-JNWZQ27S.js} +15 -9
- package/chunks/{chunk-IKLWU6YS.js → chunk-JRJ2LV6P.js} +6 -226
- package/chunks/{chunk-QSG4ZFG4.js → chunk-KTUQMDEP.js} +1 -1
- package/chunks/{chunk-HZXU6YZW.js → chunk-LTQ5C5AB.js} +4 -4
- package/chunks/{chunk-V4PCIS25.js → chunk-MAQQGNQ5.js} +44 -1
- package/chunks/{chunk-BEFQGC6H.js → chunk-NBMIC7DR.js} +2 -2
- package/chunks/{chunk-GEHSF7MS.js → chunk-NEEB7UEN.js} +2545 -1974
- package/chunks/{chunk-MHEZV3OY.js → chunk-NIJEXGV6.js} +250 -75
- package/chunks/{chunk-NGTQA57Y.js → chunk-NQVA6O7F.js} +2 -2
- package/chunks/{chunk-54KPEDM2.js → chunk-NT324EJ6.js} +13 -8
- package/chunks/{chunk-WTHRMVKB.js → chunk-O2SPEQFA.js} +5 -5
- package/chunks/{chunk-MCYZTKBV.js → chunk-OLMETXLX.js} +2 -2
- package/chunks/{chunk-JCJPZMJV.js → chunk-OOCI5VVU.js} +1 -1
- package/chunks/{chunk-XSPFQQRE.js → chunk-OONJNQ42.js} +3 -3
- package/chunks/{chunk-ANRANWVE.js → chunk-OP4MOGXF.js} +1 -1
- package/chunks/{chunk-SGPFJMRP.js → chunk-PBATSWUQ.js} +1 -1
- package/chunks/chunk-QKYTTBYW.js +624 -0
- package/chunks/{chunk-4OVECYBM.js → chunk-QOSKUG5P.js} +77 -20
- package/chunks/{chunk-76BFY7AF.js → chunk-QTERJVPZ.js} +1 -6
- package/chunks/{chunk-Y5UDBQYF.js → chunk-RB7NXUP5.js} +3 -3
- package/chunks/{chunk-HCCR43AY.js → chunk-RFIAR4YL.js} +1 -1
- package/chunks/{chunk-XFJU7SVP.js → chunk-RS5JPH6Y.js} +3 -3
- package/chunks/chunk-RS7MT2QG.js +305 -0
- package/chunks/{chunk-WACI4VES.js → chunk-SG2PEESS.js} +1106 -592
- package/chunks/{chunk-FEZXQXW2.js → chunk-SLLG5XXE.js} +1 -1
- package/chunks/{chunk-W4DFAUAO.js → chunk-SQMTULHJ.js} +1 -1
- package/chunks/{chunk-Z4ZCVYJ5.js → chunk-STFP7PJR.js} +6 -6
- package/chunks/chunk-SV5PQVQE.js +71 -0
- package/chunks/{chunk-7LMAKIWE.js → chunk-TFNZCC4B.js} +1 -1
- package/chunks/{chunk-ZFHHBRRA.js → chunk-THNJYTA6.js} +2 -2
- package/chunks/{chunk-6QGZVKOO.js → chunk-TN2BYMNH.js} +69 -2216
- package/chunks/{chunk-TFV3XVAZ.js → chunk-TQBA6DVX.js} +1 -1
- package/chunks/{chunk-AWOU24F6.js → chunk-U24E4R5U.js} +3 -3
- package/chunks/{chunk-4CA4WUMS.js → chunk-UEY4AYUL.js} +2 -2
- package/chunks/{chunk-DYUPBU7H.js → chunk-UGRL5B5F.js} +1 -1
- package/chunks/chunk-V7RNNPGC.js +44 -0
- package/chunks/{chunk-LYFDJTXE.js → chunk-VGFFYNBD.js} +1 -1
- package/chunks/chunk-VIOFKPPN.js +125 -0
- package/chunks/{chunk-BEZPRKD3.js → chunk-VLDBVLC4.js} +156 -2
- package/chunks/{chunk-HQ7MDVBO.js → chunk-VWLLDHAY.js} +6 -6
- package/chunks/chunk-WCDH2CRI.js +1187 -0
- package/chunks/{chunk-7SX6WZNO.js → chunk-XVVH63JG.js} +3 -3
- package/chunks/{chunk-HVWPSGDY.js → chunk-Y2ENGUD6.js} +1 -1
- package/chunks/{chunk-PSISZNIT.js → chunk-Y5534U4G.js} +346 -122
- package/chunks/{chunk-IQRQVPGN.js → chunk-YDZ6J2BY.js} +72 -159
- package/chunks/{chunk-7O7WZH7N.js → chunk-YNBP3YSU.js} +7 -6
- package/chunks/{chunk-NJQPQ4IO.js → chunk-YWEW33JY.js} +7 -7
- package/chunks/{chunk-335ECZTA.js → chunk-ZEOZL37W.js} +1 -1
- package/chunks/{chunk-SNONG66P.js → chunk-ZGJ4LDD2.js} +53 -28
- package/chunks/{computer-use-UY4A72X7.js → computer-use-ET5476VX.js} +22 -22
- package/chunks/{config-utils-KWTRFP7D.js → config-utils-AHQ6YZ66.js} +3 -3
- package/chunks/{contextCommand-3DZ2SVH6.js → contextCommand-QIULFDBF.js} +25 -26
- package/chunks/{create-sub-session-OT7WXLDO.js → create-sub-session-BVL2ZHTM.js} +22 -22
- package/chunks/{create-sub-session-DIJOV6HV.js → create-sub-session-P26FE5GG.js} +2 -2
- package/chunks/{cron-create-X462ERYA.js → cron-create-JWFHBDRQ.js} +4 -4
- package/chunks/{cron-delete-SL5UJUM3.js → cron-delete-GDX4E26G.js} +4 -4
- package/chunks/{cron-list-3MD6SVXI.js → cron-list-USMAIWPT.js} +4 -4
- package/chunks/{daemon-ZW6LHOXT.js → daemon-EE5T3KOW.js} +169 -84
- package/chunks/{daemon-status-provider-GTZOYSBO.js → daemon-status-provider-L5UW7TGV.js} +29 -29
- package/chunks/{dist-RZBJT5O2.js → dist-2BHAYBKP.js} +1 -1
- package/chunks/{dist-O2IP3G5D.js → dist-2MIU4UUH.js} +1 -1
- package/chunks/{dist-HCUUS6IH.js → dist-53PZYC5B.js} +2 -2
- package/chunks/{dist-ZJHKKWUD.js → dist-AU7NQQRP.js} +1 -1
- package/chunks/{dist-YTPTCUAD.js → dist-FUTEXY6A.js} +1 -1
- package/chunks/{dist-Y54RURGT.js → dist-WGTQO7F2.js} +1 -1
- package/chunks/{earlyInputCapture-GGWVGBZ7.js → earlyInputCapture-ZLAL5GTE.js} +23 -23
- package/chunks/{edit-JN467GIR.js → edit-4ZOPT6OC.js} +23 -23
- package/chunks/{enter-worktree-MMO4VBQE.js → enter-worktree-DFP5CZYS.js} +22 -22
- package/chunks/{enterPlanMode-BRZOG4DB.js → enterPlanMode-7VEJ7A2A.js} +22 -22
- package/chunks/{environment-LOCDCWMZ.js → environment-KHS35XJY.js} +24 -24
- package/chunks/{errors-XXSL5HGG.js → errors-574WBU5R.js} +24 -24
- package/chunks/{exit-worktree-UD7PI5H5.js → exit-worktree-5Q7V6D4C.js} +22 -22
- package/chunks/{exitPlanMode-EIUETQI6.js → exitPlanMode-SX2F6PDJ.js} +22 -22
- package/chunks/{fast-path-ULGAEUVK.js → fast-path-G7BLOZVF.js} +2 -2
- package/chunks/{gemini-KW3APZ4P.js → gemini-M4JWSTGU.js} +70 -68
- package/chunks/{geminiContentGenerator-4BQ5QHPR.js → geminiContentGenerator-MKXLUFUH.js} +4 -4
- package/chunks/{glob-FPKAMR6B.js → glob-FPKZY5W6.js} +22 -22
- package/chunks/{grep-MOGRCYB4.js → grep-RS22OMZG.js} +22 -22
- package/chunks/{handleAutoUpdate-QUMRZZOS.js → handleAutoUpdate-RFNQ36JC.js} +27 -28
- package/chunks/{i18n-F3W6YUYP.js → i18n-MAEWSKYF.js} +23 -23
- package/chunks/{initializer-KLU2KAIZ.js → initializer-T2BFZJBP.js} +28 -28
- package/chunks/{installationInfo-P3ZP2SIZ.js → installationInfo-3UETF773.js} +25 -23
- package/chunks/{keychain-token-storage-K23CFKGN.js → keychain-token-storage-DWRJMNH3.js} +2 -2
- package/chunks/{list-4X6D5JD2.js → list-FWZUKWD2.js} +30 -30
- package/chunks/{loadedSettingsAdapter-446B6WKA.js → loadedSettingsAdapter-3DUNHAPX.js} +27 -27
- package/chunks/{loop-wakeup-6H7OENTB.js → loop-wakeup-5GLTUBHA.js} +5 -5
- package/chunks/{ls-APTSOOS5.js → ls-FHBY3Y7I.js} +4 -4
- package/chunks/{lsp-HPACPJAN.js → lsp-B6VMEW6Y.js} +2 -2
- package/chunks/{mcp-JYVOJZOD.js → mcp-POXS7QWD.js} +27 -27
- package/chunks/{monitor-KY7YH7TL.js → monitor-2ZZC2NKH.js} +22 -22
- package/chunks/nonInteractiveCli-WSJVCB2W.js +126 -0
- package/chunks/{notebook-edit-IHGW42QK.js → notebook-edit-BMQLME3Q.js} +23 -23
- package/chunks/{openaiContentGenerator-FURUCKQJ.js → openaiContentGenerator-GOREG72R.js} +11 -11
- package/chunks/{pidfile-WKUVXDMR.js → pidfile-MVZDE5TC.js} +23 -23
- package/chunks/{processUtils-LHSRN76X.js → processUtils-RH5KNLDH.js} +2 -2
- package/chunks/{qwenContentGenerator-NRLM7R36.js → qwenContentGenerator-R55BCLRI.js} +24 -24
- package/chunks/{qwenOAuth2-5FNX3AWH.js → qwenOAuth2-QZBI2SOZ.js} +11 -11
- package/chunks/react-SG7JAQSZ.js +8 -0
- package/chunks/{read-file-VLEAEXFP.js → read-file-CPS2CYYG.js} +8 -8
- package/chunks/{read-mcp-resource-C6NT52T6.js → read-mcp-resource-AKCL7I43.js} +2 -2
- package/chunks/{record-artifact-ENCU7QCL.js → record-artifact-PEUB7727.js} +2 -2
- package/chunks/resumeHistoryUtils-YD6DSYHU.js +78 -0
- package/chunks/{ripGrep-MT23EIDD.js → ripGrep-UKGJ7RHZ.js} +22 -22
- package/chunks/{run-qwen-serve-5HWOQFLI.js → run-qwen-serve-GFKSKLF6.js} +1442 -148
- package/chunks/{runtime-6IVKJSLW.js → runtime-4KGNL3TP.js} +31 -31
- package/chunks/{scheduler-63GJG75U.js → scheduler-GJ3CELWI.js} +22 -22
- package/chunks/{send-message-5GZ4FX2V.js → send-message-3RHE7HSM.js} +3 -3
- package/chunks/{serve-3LL7RRDP.js → serve-UU6Z4C7W.js} +27 -27
- package/chunks/{server-AA24QLPA.js → server-RTJUMN24.js} +393 -256
- package/chunks/{session-LRVCFQQQ.js → session-EYD3CEB5.js} +79 -163
- package/chunks/{settings-ZX3OKUT4.js → settings-H5O22TGQ.js} +26 -26
- package/chunks/{shell-KR3IMYH6.js → shell-KVNHDHMT.js} +22 -22
- package/chunks/{skill-QLM2LSF7.js → skill-32525KCE.js} +10 -10
- package/chunks/{spawnChannel-6WFOK3SA.js → spawnChannel-G7DUQKHL.js} +24 -24
- package/chunks/{src-ADLNIPHD.js → src-DUFUUEHE.js} +52 -22
- package/chunks/{standalone-update-C54OTJWJ.js → standalone-update-UC6CWBLH.js} +24 -24
- package/chunks/{startInteractiveUI-KFAOS6HC.js → startInteractiveUI-A5YYAWLF.js} +5455 -2041
- package/chunks/{syntheticOutput-ULOVVLY4.js → syntheticOutput-FG5PQKIR.js} +3 -3
- package/chunks/{task-create-DUE2PMNI.js → task-create-HX32YXO7.js} +7 -7
- package/chunks/{task-list-WVPNX7BZ.js → task-list-QWSY4ZIU.js} +5 -5
- package/chunks/{task-stop-CPEQWOT6.js → task-stop-GWC6UWAL.js} +2 -2
- package/chunks/{task-update-HY2LNFFB.js → task-update-NCTAB73Q.js} +7 -7
- package/chunks/{team-create-Q5B5M7UD.js → team-create-LS2Q32Y4.js} +22 -22
- package/chunks/{team-delete-JJV6IUOA.js → team-delete-KK37HTOG.js} +5 -5
- package/chunks/{team-plan-approval-J55PXNY2.js → team-plan-approval-DWCZABX6.js} +22 -22
- package/chunks/{theme-manager-QWTDRPHV.js → theme-manager-E22CNBIL.js} +23 -23
- package/chunks/{todoWrite-JHHIDOIV.js → todoWrite-ERCAMLFS.js} +4 -4
- package/chunks/{tool-search-LSSKWZKH.js → tool-search-MHXUDFD2.js} +9 -9
- package/chunks/{total-session-admission-S6ATY5HY.js → total-session-admission-KOPTGDJZ.js} +25 -25
- package/chunks/{trustedFolders-CY4TUPDJ.js → trustedFolders-ANQXYAQT.js} +23 -23
- package/chunks/{update-relaunch-IOKOUV3K.js → update-relaunch-HFGRB7PE.js} +9 -9
- package/chunks/{updateCheck-YNRFE4V7.js → updateCheck-EKIPND4B.js} +33 -26
- package/chunks/useAutoAcceptIndicator-EE22V2F5.js +80 -0
- package/chunks/{validateNonInterActiveAuth-OXTECS4B.js → validateNonInterActiveAuth-RUICXVPH.js} +61 -63
- package/chunks/{version-2CZQQDL5.js → version-QLT755OV.js} +1 -1
- package/chunks/{web-fetch-7QTEGJI5.js → web-fetch-DINW4Z65.js} +10 -10
- package/chunks/{workflow-G3CZU256.js → workflow-GPMXRWKK.js} +23 -23
- package/chunks/{workspace-providers-status-UHQOIPAZ.js → workspace-providers-status-XCQKBVSX.js} +30 -30
- package/chunks/{workspace-registration-store-5WPCMX4F.js → workspace-registration-store-4I4KL7TN.js} +1 -1
- package/chunks/{workspace-registry-LAQCRQTH.js → workspace-registry-N4J57SFQ.js} +25 -25
- package/chunks/{workspace-service-6ZEUJY2Z.js → workspace-service-JJNJWVH3.js} +32 -32
- package/chunks/{workspace-skills-status-YG6OITSM.js → workspace-skills-status-CEHLAQ2Y.js} +28 -28
- package/chunks/{write-file-E7T3PU3B.js → write-file-XRGEJRCC.js} +23 -23
- package/cli.js +11 -11
- package/package.json +3 -3
- package/web-shell/assets/{arc-_dVIKMdB.js → arc-DwJhljn9.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-MuN3nKpL.js → architectureDiagram-3BPJPVTR-qdxSRav-.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-BtmvJjzx.js → blockDiagram-GPEHLZMM-2-dKM5aM.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-Dvi58_BU.js → c4Diagram-AAUBKEIU-Dt_Nu2HD.js} +1 -1
- package/web-shell/assets/channel-C6uyh95L.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-YqxOVhS1.js → chunk-2J33WTMH-CBCeeNfD.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-DoBgbC9z.js → chunk-4BX2VUAB-DPAzjqNs.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-3NEQrBAr.js → chunk-55IACEB6-yrqyxvIK.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-DrCZQxp0.js → chunk-727SXJPM-DguD_BBT.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-m_g3zjgv.js → chunk-AQP2D5EJ-KRUOG9v0.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-D1_crABJ.js → chunk-FMBD7UC4-C0lilT2U.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-BdhgVtBx.js → chunk-ND2GUHAM-DG9epIWK.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-BlmThhm-.js → chunk-QZHKN3VN-PdJDkYHw.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-Cv8Ulf-B.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-Cv8Ulf-B.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-Cbjm_00Z.js → cose-bilkent-S5V4N54A-BAOPPuJm.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-C39QNVgC.js → dagre-BM42HDAG-CDHJv82_.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-DNXSAixC.js → diagram-2AECGRRQ-C_hkG5fN.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-BCbGUPEA.js → diagram-5GNKFQAL-e9zo_eKt.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-1eujKSDC.js → diagram-KO2AKTUF-BFN41SCb.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-DUMKXgql.js → diagram-LMA3HP47-DG72N0W0.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-BFktU3_u.js → diagram-OG6HWLK6-Dkmp-tdv.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-BvJC7DLk.js → erDiagram-TEJ5UH35-CyS0GnQV.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-Cgu3PlOt.js → flowDiagram-I6XJVG4X-Cg1SRmzV.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-DLNXN5Xh.js → ganttDiagram-6RSMTGT7-CoNkSLs3.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-BQFRDv6R.js → gitGraphDiagram-PVQCEYII-DEA6GWPa.js} +1 -1
- package/web-shell/assets/index-B49xd8_A.css +5 -0
- package/web-shell/assets/{index-CdC3pjP3.js → index-CMaZgs6B.js} +1 -1
- package/web-shell/assets/index-D-cDAZgO.js +1192 -0
- package/web-shell/assets/{infoDiagram-5YYISTIA-DT2mOSvp.js → infoDiagram-5YYISTIA-BZshyoGT.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-9fy_K4bd.js → ishikawaDiagram-YF4QCWOH-CT2ssZqC.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-CoGSEuhE.js → journeyDiagram-JHISSGLW-BtMQ0rDG.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-BP9hHYIj.js → kanban-definition-UN3LZRKU-CoDbK5Db.js} +1 -1
- package/web-shell/assets/{linear-uIroDsmp.js → linear-CwhZ6u7u.js} +1 -1
- package/web-shell/assets/{mermaid.core-BUwoStsA.js → mermaid.core-C9nn0nrr.js} +5 -5
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-DZB-FWim.js → mindmap-definition-RKZ34NQL-BXUbjTeL.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-YPptloKl.js → pieDiagram-4H26LBE5-JddiYlWQ.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-dgk3DSzm.js → quadrantDiagram-W4KKPZXB-DK5HKzXO.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-BH2En2i9.js → requirementDiagram-4Y6WPE33-Y-uipa_6.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-BB98feeI.js → sankeyDiagram-5OEKKPKP-BbWeqo8H.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-CunAIGh8.js → sequenceDiagram-3UESZ5HK-tX2gOoo5.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-DTJs_-I2.js → stateDiagram-AJRCARHV-CACN457G.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DaUeO2zt.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-Cd4AN7O0.js → timeline-definition-PNZ67QCA-DnHWKSOq.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-xIG-rUU9.js → vennDiagram-CIIHVFJN-BO8Yl2FG.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-D1UyjIcG.js → wardley-L42UT6IY-1NMqqrBi.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-BVM0Mb99.js → wardleyDiagram-YWT4CUSO-C3eWgIvD.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-BX31JDSz.js → xychartDiagram-2RQKCTM6-D0h8FgFX.js} +1 -1
- package/web-shell/index.html +2 -2
- package/chunks/chunk-675SVDMD.js +0 -3288
- package/chunks/chunk-CHVH4DVN.js +0 -368
- package/chunks/chunk-JCYMQU5F.js +0 -709
- package/chunks/nonInteractiveCli-EK35TLVJ.js +0 -129
- package/web-shell/assets/channel-Bi5TehaT.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-BKhhRdd1.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BKhhRdd1.js +0 -1
- package/web-shell/assets/index-C_ouplMQ.js +0 -1187
- package/web-shell/assets/index-XGDFJE-X.css +0 -5
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DrfFMYta.js +0 -1
|
@@ -0,0 +1,1187 @@
|
|
|
1
|
+
// Force strict mode and setup for ESM
|
|
2
|
+
"use strict";
|
|
3
|
+
import {
|
|
4
|
+
BACKSLASH_ENTER_DETECTION_WINDOW_MS,
|
|
5
|
+
CHAR_CODE_ESC,
|
|
6
|
+
KITTY_CTRL_C,
|
|
7
|
+
KITTY_KEYCODE_BACKSPACE,
|
|
8
|
+
KITTY_KEYCODE_ENTER,
|
|
9
|
+
KITTY_KEYCODE_NUMPAD_ENTER,
|
|
10
|
+
KITTY_KEYCODE_TAB,
|
|
11
|
+
KITTY_MODIFIER_BASE,
|
|
12
|
+
KITTY_MODIFIER_EVENT_TYPES_OFFSET,
|
|
13
|
+
MAX_KITTY_SEQUENCE_LENGTH,
|
|
14
|
+
MODIFIER_ALT_BIT,
|
|
15
|
+
MODIFIER_CTRL_BIT,
|
|
16
|
+
MODIFIER_SHIFT_BIT,
|
|
17
|
+
clipboardHasImage
|
|
18
|
+
} from "./chunk-QKYTTBYW.js";
|
|
19
|
+
import {
|
|
20
|
+
noteInteraction
|
|
21
|
+
} from "./chunk-KW7NOTN6.js";
|
|
22
|
+
import {
|
|
23
|
+
require_jsx_runtime
|
|
24
|
+
} from "./chunk-SV5PQVQE.js";
|
|
25
|
+
import {
|
|
26
|
+
use_stdin_default,
|
|
27
|
+
use_stdout_default
|
|
28
|
+
} from "./chunk-NEEB7UEN.js";
|
|
29
|
+
import {
|
|
30
|
+
require_react
|
|
31
|
+
} from "./chunk-5QWWOFGG.js";
|
|
32
|
+
import {
|
|
33
|
+
KittySequenceOverflowEvent,
|
|
34
|
+
logKittySequenceOverflow
|
|
35
|
+
} from "./chunk-I6JUVU7J.js";
|
|
36
|
+
import {
|
|
37
|
+
createDebugLogger
|
|
38
|
+
} from "./chunk-C27BYUX6.js";
|
|
39
|
+
import {
|
|
40
|
+
init_esbuild_shims
|
|
41
|
+
} from "./chunk-5O2XNYP6.js";
|
|
42
|
+
import {
|
|
43
|
+
__name,
|
|
44
|
+
__toESM
|
|
45
|
+
} from "./chunk-J2S4EL5Y.js";
|
|
46
|
+
|
|
47
|
+
// packages/cli/src/ui/hooks/useKeypress.ts
|
|
48
|
+
init_esbuild_shims();
|
|
49
|
+
var import_react3 = __toESM(require_react(), 1);
|
|
50
|
+
|
|
51
|
+
// packages/cli/src/ui/contexts/KeypressContext.tsx
|
|
52
|
+
init_esbuild_shims();
|
|
53
|
+
var import_react2 = __toESM(require_react(), 1);
|
|
54
|
+
import readline from "node:readline";
|
|
55
|
+
import { PassThrough } from "node:stream";
|
|
56
|
+
|
|
57
|
+
// packages/cli/src/ui/utils/mouse.ts
|
|
58
|
+
init_esbuild_shims();
|
|
59
|
+
var ESC = "\x1B";
|
|
60
|
+
var SGR_EVENT_PREFIX = `${ESC}[<`;
|
|
61
|
+
var X11_EVENT_PREFIX = `${ESC}[M`;
|
|
62
|
+
var MAX_SGR_MOUSE_SEQUENCE_LENGTH = 50;
|
|
63
|
+
var SGR_MOUSE_REGEX = /^\x1b\[<(\d+);(\d+);(\d+)([mM])/;
|
|
64
|
+
function getEventName(buttonCode, isRelease) {
|
|
65
|
+
const isMove = (buttonCode & 32) !== 0;
|
|
66
|
+
if (buttonCode === 66) return "scroll-left";
|
|
67
|
+
if (buttonCode === 67) return "scroll-right";
|
|
68
|
+
if ((buttonCode & 64) === 64) {
|
|
69
|
+
return (buttonCode & 1) === 0 ? "scroll-up" : "scroll-down";
|
|
70
|
+
}
|
|
71
|
+
if (isMove) return "move";
|
|
72
|
+
const button = buttonCode & 3;
|
|
73
|
+
const type = isRelease ? "release" : "press";
|
|
74
|
+
switch (button) {
|
|
75
|
+
case 0:
|
|
76
|
+
return `left-${type}`;
|
|
77
|
+
case 1:
|
|
78
|
+
return `middle-${type}`;
|
|
79
|
+
case 2:
|
|
80
|
+
return `right-${type}`;
|
|
81
|
+
default:
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
__name(getEventName, "getEventName");
|
|
86
|
+
function buttonFromCode(code) {
|
|
87
|
+
switch (code & 3) {
|
|
88
|
+
case 0:
|
|
89
|
+
return "left";
|
|
90
|
+
case 1:
|
|
91
|
+
return "middle";
|
|
92
|
+
case 2:
|
|
93
|
+
return "right";
|
|
94
|
+
default:
|
|
95
|
+
return "none";
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
__name(buttonFromCode, "buttonFromCode");
|
|
99
|
+
function parseSGRMouseEvent(buffer) {
|
|
100
|
+
const match = buffer.match(SGR_MOUSE_REGEX);
|
|
101
|
+
if (!match) return null;
|
|
102
|
+
const buttonCode = parseInt(match[1], 10);
|
|
103
|
+
const col = parseInt(match[2], 10);
|
|
104
|
+
const row = parseInt(match[3], 10);
|
|
105
|
+
const isRelease = match[4] === "m";
|
|
106
|
+
const name = getEventName(buttonCode, isRelease);
|
|
107
|
+
if (!name) return null;
|
|
108
|
+
return {
|
|
109
|
+
event: {
|
|
110
|
+
name,
|
|
111
|
+
col,
|
|
112
|
+
row,
|
|
113
|
+
shift: (buttonCode & 4) !== 0,
|
|
114
|
+
meta: (buttonCode & 8) !== 0,
|
|
115
|
+
ctrl: (buttonCode & 16) !== 0,
|
|
116
|
+
button: buttonFromCode(buttonCode)
|
|
117
|
+
},
|
|
118
|
+
length: match[0].length
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
__name(parseSGRMouseEvent, "parseSGRMouseEvent");
|
|
122
|
+
var ENABLE_SGR_MOUSE = {
|
|
123
|
+
button: "\x1B[?1002h\x1B[?1006h",
|
|
124
|
+
any: "\x1B[?1003h\x1B[?1006h"
|
|
125
|
+
};
|
|
126
|
+
var DISABLE_SGR_MOUSE = {
|
|
127
|
+
button: "\x1B[?1006l\x1B[?1002l",
|
|
128
|
+
any: "\x1B[?1006l\x1B[?1003l"
|
|
129
|
+
};
|
|
130
|
+
function enableMouseEvents(stdout, tracking = "button") {
|
|
131
|
+
stdout.write(ENABLE_SGR_MOUSE[tracking]);
|
|
132
|
+
}
|
|
133
|
+
__name(enableMouseEvents, "enableMouseEvents");
|
|
134
|
+
function disableMouseEvents(stdout, tracking = "button") {
|
|
135
|
+
stdout.write(DISABLE_SGR_MOUSE[tracking]);
|
|
136
|
+
}
|
|
137
|
+
__name(disableMouseEvents, "disableMouseEvents");
|
|
138
|
+
|
|
139
|
+
// packages/cli/src/ui/hooks/useFocus.ts
|
|
140
|
+
init_esbuild_shims();
|
|
141
|
+
var import_react = __toESM(require_react(), 1);
|
|
142
|
+
var ENABLE_FOCUS_REPORTING = "\x1B[?1004h";
|
|
143
|
+
var DISABLE_FOCUS_REPORTING = "\x1B[?1004l";
|
|
144
|
+
var FOCUS_IN = "\x1B[I";
|
|
145
|
+
var FOCUS_OUT = "\x1B[O";
|
|
146
|
+
var useFocus = /* @__PURE__ */ __name(() => {
|
|
147
|
+
const { stdin } = use_stdin_default();
|
|
148
|
+
const { stdout } = use_stdout_default();
|
|
149
|
+
const [isFocused, setIsFocused] = (0, import_react.useState)(true);
|
|
150
|
+
(0, import_react.useEffect)(() => {
|
|
151
|
+
const handleData = /* @__PURE__ */ __name((data) => {
|
|
152
|
+
const sequence = data.toString();
|
|
153
|
+
const lastFocusIn = sequence.lastIndexOf(FOCUS_IN);
|
|
154
|
+
const lastFocusOut = sequence.lastIndexOf(FOCUS_OUT);
|
|
155
|
+
if (lastFocusIn > lastFocusOut) {
|
|
156
|
+
setIsFocused(true);
|
|
157
|
+
} else if (lastFocusOut > lastFocusIn) {
|
|
158
|
+
setIsFocused(false);
|
|
159
|
+
}
|
|
160
|
+
}, "handleData");
|
|
161
|
+
stdout?.write(ENABLE_FOCUS_REPORTING);
|
|
162
|
+
stdin?.on("data", handleData);
|
|
163
|
+
return () => {
|
|
164
|
+
stdout?.write(DISABLE_FOCUS_REPORTING);
|
|
165
|
+
stdin?.removeListener("data", handleData);
|
|
166
|
+
};
|
|
167
|
+
}, [stdin, stdout]);
|
|
168
|
+
useKeypress(
|
|
169
|
+
(_) => {
|
|
170
|
+
if (!isFocused) {
|
|
171
|
+
setIsFocused(true);
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
{ isActive: true }
|
|
175
|
+
);
|
|
176
|
+
return isFocused;
|
|
177
|
+
}, "useFocus");
|
|
178
|
+
|
|
179
|
+
// packages/cli/src/ui/contexts/KeypressContext.tsx
|
|
180
|
+
var import_jsx_runtime = __toESM(require_jsx_runtime(), 1);
|
|
181
|
+
var ESC2 = "\x1B";
|
|
182
|
+
var OPTION_T_COMPOSED_GLYPH = "\u2020";
|
|
183
|
+
var PASTE_MODE_PREFIX = `${ESC2}[200~`;
|
|
184
|
+
var PASTE_MODE_SUFFIX = `${ESC2}[201~`;
|
|
185
|
+
var KITTY_SEQUENCE_TIMEOUT_MS = 200;
|
|
186
|
+
var PASTE_IDLE_TIMEOUT_MS = 1e3;
|
|
187
|
+
var KITTY_KEYPAD_PRINTABLE_KEYCODE_TO_CHAR = {
|
|
188
|
+
57399: "0",
|
|
189
|
+
57400: "1",
|
|
190
|
+
57401: "2",
|
|
191
|
+
57402: "3",
|
|
192
|
+
57403: "4",
|
|
193
|
+
57404: "5",
|
|
194
|
+
57405: "6",
|
|
195
|
+
57406: "7",
|
|
196
|
+
57407: "8",
|
|
197
|
+
57408: "9",
|
|
198
|
+
57409: ".",
|
|
199
|
+
57410: "/",
|
|
200
|
+
57411: "*",
|
|
201
|
+
57412: "-",
|
|
202
|
+
57413: "+",
|
|
203
|
+
// 57414 is keypad Enter - handled separately via CSI~ sequence
|
|
204
|
+
57415: "=",
|
|
205
|
+
57416: ","
|
|
206
|
+
};
|
|
207
|
+
var KITTY_KEYPAD_FUNCTIONAL_KEYCODE_TO_NAME = {
|
|
208
|
+
57417: "left",
|
|
209
|
+
57418: "right",
|
|
210
|
+
57419: "up",
|
|
211
|
+
57420: "down",
|
|
212
|
+
57421: "pageup",
|
|
213
|
+
57422: "pagedown",
|
|
214
|
+
57423: "home",
|
|
215
|
+
57424: "end",
|
|
216
|
+
57425: "insert",
|
|
217
|
+
57426: "delete"
|
|
218
|
+
};
|
|
219
|
+
var KeypressContext = (0, import_react2.createContext)(
|
|
220
|
+
void 0
|
|
221
|
+
);
|
|
222
|
+
var debugLogger = createDebugLogger("KEYPRESS");
|
|
223
|
+
function useKeypressContext() {
|
|
224
|
+
const context = (0, import_react2.useContext)(KeypressContext);
|
|
225
|
+
if (!context) {
|
|
226
|
+
throw new Error(
|
|
227
|
+
"useKeypressContext must be used within a KeypressProvider"
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
return context;
|
|
231
|
+
}
|
|
232
|
+
__name(useKeypressContext, "useKeypressContext");
|
|
233
|
+
function KeypressProvider({
|
|
234
|
+
children,
|
|
235
|
+
kittyProtocolEnabled,
|
|
236
|
+
pasteWorkaround = false,
|
|
237
|
+
config,
|
|
238
|
+
debugKeystrokeLogging,
|
|
239
|
+
initialCapturedInput
|
|
240
|
+
}) {
|
|
241
|
+
const { stdin, setRawMode } = use_stdin_default();
|
|
242
|
+
const subscribers = (0, import_react2.useRef)(/* @__PURE__ */ new Set()).current;
|
|
243
|
+
const mouseSubscribers = (0, import_react2.useRef)(/* @__PURE__ */ new Set()).current;
|
|
244
|
+
const subscribe = (0, import_react2.useCallback)(
|
|
245
|
+
(handler) => {
|
|
246
|
+
subscribers.add(handler);
|
|
247
|
+
},
|
|
248
|
+
[subscribers]
|
|
249
|
+
);
|
|
250
|
+
const unsubscribe = (0, import_react2.useCallback)(
|
|
251
|
+
(handler) => {
|
|
252
|
+
subscribers.delete(handler);
|
|
253
|
+
},
|
|
254
|
+
[subscribers]
|
|
255
|
+
);
|
|
256
|
+
const subscribeMouse = (0, import_react2.useCallback)(
|
|
257
|
+
(handler) => {
|
|
258
|
+
mouseSubscribers.add(handler);
|
|
259
|
+
},
|
|
260
|
+
[mouseSubscribers]
|
|
261
|
+
);
|
|
262
|
+
const unsubscribeMouse = (0, import_react2.useCallback)(
|
|
263
|
+
(handler) => {
|
|
264
|
+
mouseSubscribers.delete(handler);
|
|
265
|
+
},
|
|
266
|
+
[mouseSubscribers]
|
|
267
|
+
);
|
|
268
|
+
(0, import_react2.useEffect)(() => {
|
|
269
|
+
setRawMode(true);
|
|
270
|
+
const capturedInput = initialCapturedInput ?? Buffer.alloc(0);
|
|
271
|
+
const keypressStream = new PassThrough();
|
|
272
|
+
let usePassthrough = false;
|
|
273
|
+
if (pasteWorkaround) {
|
|
274
|
+
usePassthrough = true;
|
|
275
|
+
}
|
|
276
|
+
let isPaste = false;
|
|
277
|
+
let pasteBuffer = Buffer.alloc(0);
|
|
278
|
+
let pasteAlreadyFlushed = false;
|
|
279
|
+
let pasteIdleTimeout = null;
|
|
280
|
+
const kittySequenceBufferRef = { current: "" };
|
|
281
|
+
let kittySequenceTimeout = null;
|
|
282
|
+
let backslashTimeout = null;
|
|
283
|
+
let waitingForEnterAfterBackslash = false;
|
|
284
|
+
let rawDataBuffer = Buffer.alloc(0);
|
|
285
|
+
let rawFlushTimeout = null;
|
|
286
|
+
let swallowingSgrMouse = false;
|
|
287
|
+
let sgrMouseBuffer = "";
|
|
288
|
+
let sgrMouseTimeout = null;
|
|
289
|
+
const resetSgrMouse = /* @__PURE__ */ __name(() => {
|
|
290
|
+
swallowingSgrMouse = false;
|
|
291
|
+
sgrMouseBuffer = "";
|
|
292
|
+
if (sgrMouseTimeout) {
|
|
293
|
+
clearTimeout(sgrMouseTimeout);
|
|
294
|
+
sgrMouseTimeout = null;
|
|
295
|
+
}
|
|
296
|
+
}, "resetSgrMouse");
|
|
297
|
+
const updateKittyBuffer = /* @__PURE__ */ __name((value) => {
|
|
298
|
+
kittySequenceBufferRef.current = value;
|
|
299
|
+
}, "updateKittyBuffer");
|
|
300
|
+
const clearKittyTimeout = /* @__PURE__ */ __name(() => {
|
|
301
|
+
if (kittySequenceTimeout) {
|
|
302
|
+
clearTimeout(kittySequenceTimeout);
|
|
303
|
+
kittySequenceTimeout = null;
|
|
304
|
+
}
|
|
305
|
+
}, "clearKittyTimeout");
|
|
306
|
+
const startKittyTimeout = /* @__PURE__ */ __name(() => {
|
|
307
|
+
clearKittyTimeout();
|
|
308
|
+
kittySequenceTimeout = setTimeout(() => {
|
|
309
|
+
if (kittySequenceBufferRef.current) {
|
|
310
|
+
while (kittySequenceBufferRef.current) {
|
|
311
|
+
const parsed = parseKittyPrefix(kittySequenceBufferRef.current);
|
|
312
|
+
if (parsed) {
|
|
313
|
+
kittySequenceBufferRef.current = kittySequenceBufferRef.current.slice(parsed.length);
|
|
314
|
+
broadcast(parsed.key);
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
const plain = parsePlainTextPrefix(kittySequenceBufferRef.current);
|
|
318
|
+
if (plain) {
|
|
319
|
+
kittySequenceBufferRef.current = kittySequenceBufferRef.current.slice(plain.length);
|
|
320
|
+
broadcast(plain.key);
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
325
|
+
if (kittySequenceBufferRef.current) {
|
|
326
|
+
if (debugKeystrokeLogging) {
|
|
327
|
+
debugLogger.debug(
|
|
328
|
+
"[DEBUG] Kitty buffer timeout, clearing:",
|
|
329
|
+
kittySequenceBufferRef.current
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
kittySequenceBufferRef.current = "";
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}, KITTY_SEQUENCE_TIMEOUT_MS);
|
|
336
|
+
}, "startKittyTimeout");
|
|
337
|
+
const clearKittyBufferAndTimeout = /* @__PURE__ */ __name(() => {
|
|
338
|
+
clearKittyTimeout();
|
|
339
|
+
kittySequenceBufferRef.current = "";
|
|
340
|
+
}, "clearKittyBufferAndTimeout");
|
|
341
|
+
const clearPasteIdleTimeout = /* @__PURE__ */ __name(() => {
|
|
342
|
+
if (pasteIdleTimeout) {
|
|
343
|
+
clearTimeout(pasteIdleTimeout);
|
|
344
|
+
pasteIdleTimeout = null;
|
|
345
|
+
}
|
|
346
|
+
}, "clearPasteIdleTimeout");
|
|
347
|
+
const forceFlushStuckPaste = /* @__PURE__ */ __name(() => {
|
|
348
|
+
clearPasteIdleTimeout();
|
|
349
|
+
if (!isPaste && pasteBuffer.length === 0) return;
|
|
350
|
+
const buffered = pasteBuffer.toString();
|
|
351
|
+
isPaste = false;
|
|
352
|
+
pasteBuffer = Buffer.alloc(0);
|
|
353
|
+
pasteAlreadyFlushed = true;
|
|
354
|
+
if (buffered.length > 0) {
|
|
355
|
+
broadcast({
|
|
356
|
+
name: "",
|
|
357
|
+
ctrl: false,
|
|
358
|
+
meta: false,
|
|
359
|
+
shift: false,
|
|
360
|
+
paste: true,
|
|
361
|
+
sequence: buffered
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
}, "forceFlushStuckPaste");
|
|
365
|
+
const startPasteIdleTimeout = /* @__PURE__ */ __name(() => {
|
|
366
|
+
clearPasteIdleTimeout();
|
|
367
|
+
pasteIdleTimeout = setTimeout(
|
|
368
|
+
forceFlushStuckPaste,
|
|
369
|
+
PASTE_IDLE_TIMEOUT_MS
|
|
370
|
+
);
|
|
371
|
+
}, "startPasteIdleTimeout");
|
|
372
|
+
const createPrintableKey = /* @__PURE__ */ __name((char) => {
|
|
373
|
+
const printableName = char === " " ? "space" : /^[A-Za-z]$/.test(char) ? char.toLowerCase() : char;
|
|
374
|
+
return {
|
|
375
|
+
name: printableName,
|
|
376
|
+
ctrl: false,
|
|
377
|
+
meta: false,
|
|
378
|
+
shift: false,
|
|
379
|
+
paste: false,
|
|
380
|
+
sequence: char,
|
|
381
|
+
kittyProtocol: true
|
|
382
|
+
};
|
|
383
|
+
}, "createPrintableKey");
|
|
384
|
+
const parseKittyPrefix = /* @__PURE__ */ __name((buffer) => {
|
|
385
|
+
const revTabLegacy = new RegExp(`^${ESC2}\\[Z`);
|
|
386
|
+
let m = buffer.match(revTabLegacy);
|
|
387
|
+
if (m) {
|
|
388
|
+
return {
|
|
389
|
+
key: {
|
|
390
|
+
name: "tab",
|
|
391
|
+
ctrl: false,
|
|
392
|
+
meta: false,
|
|
393
|
+
shift: true,
|
|
394
|
+
paste: false,
|
|
395
|
+
sequence: buffer.slice(0, m[0].length),
|
|
396
|
+
kittyProtocol: true
|
|
397
|
+
},
|
|
398
|
+
length: m[0].length
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
const revTabParam = new RegExp(`^${ESC2}\\[1;(\\d+)Z`);
|
|
402
|
+
m = buffer.match(revTabParam);
|
|
403
|
+
if (m) {
|
|
404
|
+
let mods = parseInt(m[1], 10);
|
|
405
|
+
if (mods >= KITTY_MODIFIER_EVENT_TYPES_OFFSET) {
|
|
406
|
+
mods -= KITTY_MODIFIER_EVENT_TYPES_OFFSET;
|
|
407
|
+
}
|
|
408
|
+
const bits = mods - KITTY_MODIFIER_BASE;
|
|
409
|
+
const alt = (bits & MODIFIER_ALT_BIT) === MODIFIER_ALT_BIT;
|
|
410
|
+
const ctrl = (bits & MODIFIER_CTRL_BIT) === MODIFIER_CTRL_BIT;
|
|
411
|
+
return {
|
|
412
|
+
key: {
|
|
413
|
+
name: "tab",
|
|
414
|
+
ctrl,
|
|
415
|
+
meta: alt,
|
|
416
|
+
// Reverse tab implies Shift behavior; force shift regardless of mods
|
|
417
|
+
shift: true,
|
|
418
|
+
paste: false,
|
|
419
|
+
sequence: buffer.slice(0, m[0].length),
|
|
420
|
+
kittyProtocol: true
|
|
421
|
+
},
|
|
422
|
+
length: m[0].length
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
const arrowPrefix = new RegExp(`^${ESC2}\\[1;(\\d+)([ABCDHFPQSR])`);
|
|
426
|
+
m = buffer.match(arrowPrefix);
|
|
427
|
+
if (m) {
|
|
428
|
+
let mods = parseInt(m[1], 10);
|
|
429
|
+
if (mods >= KITTY_MODIFIER_EVENT_TYPES_OFFSET) {
|
|
430
|
+
mods -= KITTY_MODIFIER_EVENT_TYPES_OFFSET;
|
|
431
|
+
}
|
|
432
|
+
const bits = mods - KITTY_MODIFIER_BASE;
|
|
433
|
+
const shift = (bits & MODIFIER_SHIFT_BIT) === MODIFIER_SHIFT_BIT;
|
|
434
|
+
const alt = (bits & MODIFIER_ALT_BIT) === MODIFIER_ALT_BIT;
|
|
435
|
+
const ctrl = (bits & MODIFIER_CTRL_BIT) === MODIFIER_CTRL_BIT;
|
|
436
|
+
const sym = m[2];
|
|
437
|
+
const symbolToName = {
|
|
438
|
+
A: "up",
|
|
439
|
+
B: "down",
|
|
440
|
+
C: "right",
|
|
441
|
+
D: "left",
|
|
442
|
+
H: "home",
|
|
443
|
+
F: "end",
|
|
444
|
+
P: "f1",
|
|
445
|
+
Q: "f2",
|
|
446
|
+
R: "f3",
|
|
447
|
+
S: "f4"
|
|
448
|
+
};
|
|
449
|
+
const name = symbolToName[sym] || "";
|
|
450
|
+
if (!name) return null;
|
|
451
|
+
return {
|
|
452
|
+
key: {
|
|
453
|
+
name,
|
|
454
|
+
ctrl,
|
|
455
|
+
meta: alt,
|
|
456
|
+
shift,
|
|
457
|
+
paste: false,
|
|
458
|
+
sequence: buffer.slice(0, m[0].length),
|
|
459
|
+
kittyProtocol: true
|
|
460
|
+
},
|
|
461
|
+
length: m[0].length
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
const csiUPrefix = new RegExp(
|
|
465
|
+
`^${ESC2}\\[(\\d+)(?::\\d+)*(?:;(\\d+)(?::\\d+)*)?(?:;\\d+)?([u~])`
|
|
466
|
+
);
|
|
467
|
+
m = buffer.match(csiUPrefix);
|
|
468
|
+
if (m) {
|
|
469
|
+
const keyCode = parseInt(m[1], 10);
|
|
470
|
+
let modifiers = m[2] ? parseInt(m[2], 10) : KITTY_MODIFIER_BASE;
|
|
471
|
+
if (modifiers >= KITTY_MODIFIER_EVENT_TYPES_OFFSET) {
|
|
472
|
+
modifiers -= KITTY_MODIFIER_EVENT_TYPES_OFFSET;
|
|
473
|
+
}
|
|
474
|
+
const modifierBits = modifiers - KITTY_MODIFIER_BASE;
|
|
475
|
+
const shift = (modifierBits & MODIFIER_SHIFT_BIT) === MODIFIER_SHIFT_BIT;
|
|
476
|
+
const alt = (modifierBits & MODIFIER_ALT_BIT) === MODIFIER_ALT_BIT;
|
|
477
|
+
const ctrl = (modifierBits & MODIFIER_CTRL_BIT) === MODIFIER_CTRL_BIT;
|
|
478
|
+
const terminator = m[3];
|
|
479
|
+
if (terminator === "~") {
|
|
480
|
+
let name2 = null;
|
|
481
|
+
switch (keyCode) {
|
|
482
|
+
case 1:
|
|
483
|
+
name2 = "home";
|
|
484
|
+
break;
|
|
485
|
+
case 2:
|
|
486
|
+
name2 = "insert";
|
|
487
|
+
break;
|
|
488
|
+
case 3:
|
|
489
|
+
name2 = "delete";
|
|
490
|
+
break;
|
|
491
|
+
case 4:
|
|
492
|
+
name2 = "end";
|
|
493
|
+
break;
|
|
494
|
+
case 5:
|
|
495
|
+
name2 = "pageup";
|
|
496
|
+
break;
|
|
497
|
+
case 6:
|
|
498
|
+
name2 = "pagedown";
|
|
499
|
+
break;
|
|
500
|
+
default:
|
|
501
|
+
break;
|
|
502
|
+
}
|
|
503
|
+
if (name2) {
|
|
504
|
+
return {
|
|
505
|
+
key: {
|
|
506
|
+
name: name2,
|
|
507
|
+
ctrl,
|
|
508
|
+
meta: alt,
|
|
509
|
+
shift,
|
|
510
|
+
paste: false,
|
|
511
|
+
sequence: buffer.slice(0, m[0].length),
|
|
512
|
+
kittyProtocol: true
|
|
513
|
+
},
|
|
514
|
+
length: m[0].length
|
|
515
|
+
};
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
const kittyKeyCodeToName = {
|
|
519
|
+
[CHAR_CODE_ESC]: "escape",
|
|
520
|
+
[KITTY_KEYCODE_TAB]: "tab",
|
|
521
|
+
[KITTY_KEYCODE_BACKSPACE]: "backspace",
|
|
522
|
+
[KITTY_KEYCODE_ENTER]: "return",
|
|
523
|
+
[KITTY_KEYCODE_NUMPAD_ENTER]: "return"
|
|
524
|
+
};
|
|
525
|
+
const name = kittyKeyCodeToName[keyCode];
|
|
526
|
+
if (name) {
|
|
527
|
+
return {
|
|
528
|
+
key: {
|
|
529
|
+
name,
|
|
530
|
+
ctrl,
|
|
531
|
+
meta: alt,
|
|
532
|
+
shift,
|
|
533
|
+
paste: false,
|
|
534
|
+
sequence: buffer.slice(0, m[0].length),
|
|
535
|
+
kittyProtocol: true
|
|
536
|
+
},
|
|
537
|
+
length: m[0].length
|
|
538
|
+
};
|
|
539
|
+
}
|
|
540
|
+
if (!ctrl) {
|
|
541
|
+
const keypadChar = KITTY_KEYPAD_PRINTABLE_KEYCODE_TO_CHAR[keyCode];
|
|
542
|
+
if (keypadChar) {
|
|
543
|
+
return {
|
|
544
|
+
key: {
|
|
545
|
+
name: keypadChar,
|
|
546
|
+
ctrl: false,
|
|
547
|
+
meta: alt,
|
|
548
|
+
shift,
|
|
549
|
+
paste: false,
|
|
550
|
+
sequence: keypadChar,
|
|
551
|
+
kittyProtocol: true
|
|
552
|
+
},
|
|
553
|
+
length: m[0].length
|
|
554
|
+
};
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
const keypadName = KITTY_KEYPAD_FUNCTIONAL_KEYCODE_TO_NAME[keyCode];
|
|
558
|
+
if (keypadName) {
|
|
559
|
+
return {
|
|
560
|
+
key: {
|
|
561
|
+
name: keypadName,
|
|
562
|
+
ctrl,
|
|
563
|
+
meta: alt,
|
|
564
|
+
shift,
|
|
565
|
+
paste: false,
|
|
566
|
+
sequence: buffer.slice(0, m[0].length),
|
|
567
|
+
kittyProtocol: true
|
|
568
|
+
},
|
|
569
|
+
length: m[0].length
|
|
570
|
+
};
|
|
571
|
+
}
|
|
572
|
+
if (terminator === "u" && !ctrl && keyCode >= 32 && keyCode !== 127 && keyCode <= 1114111 && !(keyCode >= 57344 && keyCode <= 63743)) {
|
|
573
|
+
return {
|
|
574
|
+
key: {
|
|
575
|
+
...createPrintableKey(String.fromCodePoint(keyCode)),
|
|
576
|
+
meta: alt,
|
|
577
|
+
shift
|
|
578
|
+
},
|
|
579
|
+
length: m[0].length
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
if (ctrl && keyCode >= "a".charCodeAt(0) && keyCode <= "z".charCodeAt(0)) {
|
|
583
|
+
const letter = String.fromCharCode(keyCode);
|
|
584
|
+
return {
|
|
585
|
+
key: {
|
|
586
|
+
name: letter,
|
|
587
|
+
ctrl: true,
|
|
588
|
+
meta: alt,
|
|
589
|
+
shift,
|
|
590
|
+
paste: false,
|
|
591
|
+
sequence: buffer.slice(0, m[0].length),
|
|
592
|
+
kittyProtocol: true
|
|
593
|
+
},
|
|
594
|
+
length: m[0].length
|
|
595
|
+
};
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
const legacyFuncKey = new RegExp(`^${ESC2}\\[([ABCDHF])`);
|
|
599
|
+
m = buffer.match(legacyFuncKey);
|
|
600
|
+
if (m) {
|
|
601
|
+
const sym = m[1];
|
|
602
|
+
const nameMap = {
|
|
603
|
+
A: "up",
|
|
604
|
+
B: "down",
|
|
605
|
+
C: "right",
|
|
606
|
+
D: "left",
|
|
607
|
+
H: "home",
|
|
608
|
+
F: "end"
|
|
609
|
+
};
|
|
610
|
+
const name = nameMap[sym];
|
|
611
|
+
return {
|
|
612
|
+
key: {
|
|
613
|
+
name,
|
|
614
|
+
ctrl: false,
|
|
615
|
+
meta: false,
|
|
616
|
+
shift: false,
|
|
617
|
+
paste: false,
|
|
618
|
+
sequence: buffer.slice(0, m[0].length),
|
|
619
|
+
kittyProtocol: true
|
|
620
|
+
},
|
|
621
|
+
length: m[0].length
|
|
622
|
+
};
|
|
623
|
+
}
|
|
624
|
+
return null;
|
|
625
|
+
}, "parseKittyPrefix");
|
|
626
|
+
const getCompleteCsiSequenceLength = /* @__PURE__ */ __name((buffer) => {
|
|
627
|
+
if (!buffer.startsWith(`${ESC2}[`)) {
|
|
628
|
+
return null;
|
|
629
|
+
}
|
|
630
|
+
for (let i = 2; i < buffer.length; i++) {
|
|
631
|
+
const code = buffer.charCodeAt(i);
|
|
632
|
+
if (code >= 64 && code <= 126) {
|
|
633
|
+
return i + 1;
|
|
634
|
+
}
|
|
635
|
+
if (code < 32 || code > 63) {
|
|
636
|
+
return 0;
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
return null;
|
|
640
|
+
}, "getCompleteCsiSequenceLength");
|
|
641
|
+
const parsePlainTextPrefix = /* @__PURE__ */ __name((buffer) => {
|
|
642
|
+
if (!buffer || buffer.startsWith(ESC2)) {
|
|
643
|
+
return null;
|
|
644
|
+
}
|
|
645
|
+
const [char] = Array.from(buffer);
|
|
646
|
+
if (!char) {
|
|
647
|
+
return null;
|
|
648
|
+
}
|
|
649
|
+
return {
|
|
650
|
+
key: createPrintableKey(char),
|
|
651
|
+
length: char.length
|
|
652
|
+
};
|
|
653
|
+
}, "parsePlainTextPrefix");
|
|
654
|
+
const broadcast = /* @__PURE__ */ __name((key) => {
|
|
655
|
+
noteInteraction();
|
|
656
|
+
for (const handler of subscribers) {
|
|
657
|
+
handler(key);
|
|
658
|
+
}
|
|
659
|
+
}, "broadcast");
|
|
660
|
+
const TERMINAL_RESPONSE_RE = /^\x1b\[[?>][\d;]*[uc]$/;
|
|
661
|
+
const handleKeypress = /* @__PURE__ */ __name(async (_, key) => {
|
|
662
|
+
if (TERMINAL_RESPONSE_RE.test(key.sequence)) {
|
|
663
|
+
return;
|
|
664
|
+
}
|
|
665
|
+
if (key.sequence === FOCUS_IN || key.sequence === FOCUS_OUT) {
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
668
|
+
if (isPaste) {
|
|
669
|
+
resetSgrMouse();
|
|
670
|
+
} else if (swallowingSgrMouse) {
|
|
671
|
+
if (key.ctrl && key.name === "c") {
|
|
672
|
+
resetSgrMouse();
|
|
673
|
+
} else if (key.name === "paste-start") {
|
|
674
|
+
resetSgrMouse();
|
|
675
|
+
} else {
|
|
676
|
+
sgrMouseBuffer += key.sequence;
|
|
677
|
+
if (key.name === "m" || key.sequence === "M") {
|
|
678
|
+
swallowingSgrMouse = false;
|
|
679
|
+
if (sgrMouseTimeout) {
|
|
680
|
+
clearTimeout(sgrMouseTimeout);
|
|
681
|
+
sgrMouseTimeout = null;
|
|
682
|
+
}
|
|
683
|
+
const parsed = parseSGRMouseEvent(sgrMouseBuffer);
|
|
684
|
+
if (parsed) {
|
|
685
|
+
for (const handler of mouseSubscribers) {
|
|
686
|
+
handler(parsed.event);
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
sgrMouseBuffer = "";
|
|
690
|
+
} else if (sgrMouseBuffer.length >= MAX_SGR_MOUSE_SEQUENCE_LENGTH) {
|
|
691
|
+
resetSgrMouse();
|
|
692
|
+
}
|
|
693
|
+
return;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
if (!isPaste && key.sequence === `${ESC2}[<`) {
|
|
697
|
+
swallowingSgrMouse = true;
|
|
698
|
+
sgrMouseBuffer = `${ESC2}[<`;
|
|
699
|
+
if (sgrMouseTimeout) {
|
|
700
|
+
clearTimeout(sgrMouseTimeout);
|
|
701
|
+
}
|
|
702
|
+
sgrMouseTimeout = setTimeout(() => {
|
|
703
|
+
swallowingSgrMouse = false;
|
|
704
|
+
sgrMouseBuffer = "";
|
|
705
|
+
sgrMouseTimeout = null;
|
|
706
|
+
}, KITTY_SEQUENCE_TIMEOUT_MS);
|
|
707
|
+
return;
|
|
708
|
+
}
|
|
709
|
+
const isCtrlCKey = key.ctrl && key.name === "c" || key.sequence === `${ESC2}${KITTY_CTRL_C}`;
|
|
710
|
+
if (isCtrlCKey) {
|
|
711
|
+
if (isPaste || pasteBuffer.length > 0) {
|
|
712
|
+
isPaste = false;
|
|
713
|
+
pasteBuffer = Buffer.alloc(0);
|
|
714
|
+
pasteAlreadyFlushed = true;
|
|
715
|
+
clearPasteIdleTimeout();
|
|
716
|
+
}
|
|
717
|
+
if (kittySequenceBufferRef.current && debugKeystrokeLogging) {
|
|
718
|
+
debugLogger.debug(
|
|
719
|
+
"[DEBUG] Kitty buffer cleared on Ctrl+C:",
|
|
720
|
+
kittySequenceBufferRef.current
|
|
721
|
+
);
|
|
722
|
+
}
|
|
723
|
+
clearKittyBufferAndTimeout();
|
|
724
|
+
if (key.sequence === `${ESC2}${KITTY_CTRL_C}`) {
|
|
725
|
+
broadcast({
|
|
726
|
+
name: "c",
|
|
727
|
+
ctrl: true,
|
|
728
|
+
meta: false,
|
|
729
|
+
shift: false,
|
|
730
|
+
paste: false,
|
|
731
|
+
sequence: key.sequence,
|
|
732
|
+
kittyProtocol: true
|
|
733
|
+
});
|
|
734
|
+
} else {
|
|
735
|
+
broadcast(key);
|
|
736
|
+
}
|
|
737
|
+
return;
|
|
738
|
+
}
|
|
739
|
+
if (key.name === "paste-start") {
|
|
740
|
+
isPaste = true;
|
|
741
|
+
pasteAlreadyFlushed = false;
|
|
742
|
+
startPasteIdleTimeout();
|
|
743
|
+
return;
|
|
744
|
+
}
|
|
745
|
+
if (key.name === "paste-end") {
|
|
746
|
+
clearPasteIdleTimeout();
|
|
747
|
+
if (pasteAlreadyFlushed) {
|
|
748
|
+
pasteAlreadyFlushed = false;
|
|
749
|
+
isPaste = false;
|
|
750
|
+
pasteBuffer = Buffer.alloc(0);
|
|
751
|
+
return;
|
|
752
|
+
}
|
|
753
|
+
isPaste = false;
|
|
754
|
+
if (pasteBuffer.toString().length > 0) {
|
|
755
|
+
broadcast({
|
|
756
|
+
name: "",
|
|
757
|
+
ctrl: false,
|
|
758
|
+
meta: false,
|
|
759
|
+
shift: false,
|
|
760
|
+
paste: true,
|
|
761
|
+
sequence: pasteBuffer.toString()
|
|
762
|
+
});
|
|
763
|
+
} else {
|
|
764
|
+
let clipboardImageUnavailable = false;
|
|
765
|
+
const hasImage = await clipboardHasImage(() => {
|
|
766
|
+
clipboardImageUnavailable = true;
|
|
767
|
+
});
|
|
768
|
+
broadcast({
|
|
769
|
+
name: "",
|
|
770
|
+
ctrl: false,
|
|
771
|
+
meta: false,
|
|
772
|
+
shift: false,
|
|
773
|
+
paste: true,
|
|
774
|
+
pasteImage: hasImage,
|
|
775
|
+
clipboardImageUnavailable,
|
|
776
|
+
sequence: pasteBuffer.toString()
|
|
777
|
+
});
|
|
778
|
+
}
|
|
779
|
+
pasteBuffer = Buffer.alloc(0);
|
|
780
|
+
return;
|
|
781
|
+
}
|
|
782
|
+
if (isPaste) {
|
|
783
|
+
pasteBuffer = Buffer.concat([pasteBuffer, Buffer.from(key.sequence)]);
|
|
784
|
+
startPasteIdleTimeout();
|
|
785
|
+
return;
|
|
786
|
+
}
|
|
787
|
+
if (key.name === "return" && waitingForEnterAfterBackslash) {
|
|
788
|
+
if (backslashTimeout) {
|
|
789
|
+
clearTimeout(backslashTimeout);
|
|
790
|
+
backslashTimeout = null;
|
|
791
|
+
}
|
|
792
|
+
waitingForEnterAfterBackslash = false;
|
|
793
|
+
broadcast({
|
|
794
|
+
...key,
|
|
795
|
+
shift: true,
|
|
796
|
+
sequence: "\r"
|
|
797
|
+
// Corrected escaping for newline
|
|
798
|
+
});
|
|
799
|
+
return;
|
|
800
|
+
}
|
|
801
|
+
if (key.sequence === "\\" && !key.name) {
|
|
802
|
+
waitingForEnterAfterBackslash = true;
|
|
803
|
+
backslashTimeout = setTimeout(() => {
|
|
804
|
+
waitingForEnterAfterBackslash = false;
|
|
805
|
+
backslashTimeout = null;
|
|
806
|
+
broadcast(key);
|
|
807
|
+
}, BACKSLASH_ENTER_DETECTION_WINDOW_MS);
|
|
808
|
+
return;
|
|
809
|
+
}
|
|
810
|
+
if (waitingForEnterAfterBackslash && key.name !== "return") {
|
|
811
|
+
if (backslashTimeout) {
|
|
812
|
+
clearTimeout(backslashTimeout);
|
|
813
|
+
backslashTimeout = null;
|
|
814
|
+
}
|
|
815
|
+
waitingForEnterAfterBackslash = false;
|
|
816
|
+
broadcast({
|
|
817
|
+
name: "",
|
|
818
|
+
sequence: "\\",
|
|
819
|
+
ctrl: false,
|
|
820
|
+
meta: false,
|
|
821
|
+
shift: false,
|
|
822
|
+
paste: false
|
|
823
|
+
});
|
|
824
|
+
}
|
|
825
|
+
if (["up", "down", "left", "right"].includes(key.name)) {
|
|
826
|
+
broadcast(key);
|
|
827
|
+
return;
|
|
828
|
+
}
|
|
829
|
+
if (kittyProtocolEnabled) {
|
|
830
|
+
if (kittySequenceBufferRef.current || key.sequence.startsWith(`${ESC2}[`) && !key.sequence.startsWith(PASTE_MODE_PREFIX) && !key.sequence.startsWith(PASTE_MODE_SUFFIX) && !key.sequence.startsWith(FOCUS_IN) && !key.sequence.startsWith(FOCUS_OUT)) {
|
|
831
|
+
updateKittyBuffer(kittySequenceBufferRef.current + key.sequence);
|
|
832
|
+
startKittyTimeout();
|
|
833
|
+
if (debugKeystrokeLogging) {
|
|
834
|
+
debugLogger.debug(
|
|
835
|
+
"[DEBUG] Kitty buffer accumulating:",
|
|
836
|
+
kittySequenceBufferRef.current
|
|
837
|
+
);
|
|
838
|
+
}
|
|
839
|
+
let bufferedInputHandled = false;
|
|
840
|
+
while (kittySequenceBufferRef.current) {
|
|
841
|
+
const parsed = parseKittyPrefix(kittySequenceBufferRef.current);
|
|
842
|
+
if (parsed) {
|
|
843
|
+
if (debugKeystrokeLogging) {
|
|
844
|
+
const parsedSequence = kittySequenceBufferRef.current.slice(
|
|
845
|
+
0,
|
|
846
|
+
parsed.length
|
|
847
|
+
);
|
|
848
|
+
if (kittySequenceBufferRef.current.length > parsed.length) {
|
|
849
|
+
debugLogger.debug(
|
|
850
|
+
"[DEBUG] Kitty sequence parsed successfully (prefix):",
|
|
851
|
+
parsedSequence
|
|
852
|
+
);
|
|
853
|
+
} else {
|
|
854
|
+
debugLogger.debug(
|
|
855
|
+
"[DEBUG] Kitty sequence parsed successfully:",
|
|
856
|
+
parsedSequence
|
|
857
|
+
);
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
updateKittyBuffer(
|
|
861
|
+
kittySequenceBufferRef.current.slice(parsed.length)
|
|
862
|
+
);
|
|
863
|
+
if (!kittySequenceBufferRef.current) {
|
|
864
|
+
clearKittyTimeout();
|
|
865
|
+
}
|
|
866
|
+
broadcast(parsed.key);
|
|
867
|
+
bufferedInputHandled = true;
|
|
868
|
+
continue;
|
|
869
|
+
}
|
|
870
|
+
const completeUnsupportedCsiLength = getCompleteCsiSequenceLength(
|
|
871
|
+
kittySequenceBufferRef.current
|
|
872
|
+
);
|
|
873
|
+
if (completeUnsupportedCsiLength) {
|
|
874
|
+
if (debugKeystrokeLogging) {
|
|
875
|
+
debugLogger.debug(
|
|
876
|
+
"[DEBUG] Dropping unsupported complete CSI sequence:",
|
|
877
|
+
kittySequenceBufferRef.current.slice(
|
|
878
|
+
0,
|
|
879
|
+
completeUnsupportedCsiLength
|
|
880
|
+
)
|
|
881
|
+
);
|
|
882
|
+
}
|
|
883
|
+
updateKittyBuffer(
|
|
884
|
+
kittySequenceBufferRef.current.slice(
|
|
885
|
+
completeUnsupportedCsiLength
|
|
886
|
+
)
|
|
887
|
+
);
|
|
888
|
+
if (!kittySequenceBufferRef.current) {
|
|
889
|
+
clearKittyTimeout();
|
|
890
|
+
}
|
|
891
|
+
bufferedInputHandled = true;
|
|
892
|
+
continue;
|
|
893
|
+
}
|
|
894
|
+
const plainTextPrefix = parsePlainTextPrefix(
|
|
895
|
+
kittySequenceBufferRef.current
|
|
896
|
+
);
|
|
897
|
+
if (plainTextPrefix) {
|
|
898
|
+
if (debugKeystrokeLogging) {
|
|
899
|
+
debugLogger.debug(
|
|
900
|
+
"[DEBUG] Recovered plain text after kitty sequence:",
|
|
901
|
+
plainTextPrefix.key.sequence
|
|
902
|
+
);
|
|
903
|
+
}
|
|
904
|
+
updateKittyBuffer(
|
|
905
|
+
kittySequenceBufferRef.current.slice(plainTextPrefix.length)
|
|
906
|
+
);
|
|
907
|
+
if (!kittySequenceBufferRef.current) {
|
|
908
|
+
clearKittyTimeout();
|
|
909
|
+
}
|
|
910
|
+
broadcast(plainTextPrefix.key);
|
|
911
|
+
bufferedInputHandled = true;
|
|
912
|
+
continue;
|
|
913
|
+
}
|
|
914
|
+
const nextStart = kittySequenceBufferRef.current.indexOf(
|
|
915
|
+
`${ESC2}[`,
|
|
916
|
+
1
|
|
917
|
+
);
|
|
918
|
+
if (nextStart > 0) {
|
|
919
|
+
if (debugKeystrokeLogging) {
|
|
920
|
+
debugLogger.debug(
|
|
921
|
+
"[DEBUG] Skipping incomplete/invalid CSI prefix:",
|
|
922
|
+
kittySequenceBufferRef.current.slice(0, nextStart)
|
|
923
|
+
);
|
|
924
|
+
}
|
|
925
|
+
updateKittyBuffer(
|
|
926
|
+
kittySequenceBufferRef.current.slice(nextStart)
|
|
927
|
+
);
|
|
928
|
+
if (!kittySequenceBufferRef.current) {
|
|
929
|
+
clearKittyTimeout();
|
|
930
|
+
}
|
|
931
|
+
bufferedInputHandled = true;
|
|
932
|
+
continue;
|
|
933
|
+
}
|
|
934
|
+
break;
|
|
935
|
+
}
|
|
936
|
+
if (bufferedInputHandled) return;
|
|
937
|
+
if (config?.getDebugMode() || debugKeystrokeLogging) {
|
|
938
|
+
const codes = Array.from(kittySequenceBufferRef.current).map(
|
|
939
|
+
(ch) => ch.charCodeAt(0)
|
|
940
|
+
);
|
|
941
|
+
debugLogger.warn("Kitty sequence buffer has char codes:", codes);
|
|
942
|
+
}
|
|
943
|
+
if (kittySequenceBufferRef.current.length > MAX_KITTY_SEQUENCE_LENGTH) {
|
|
944
|
+
if (debugKeystrokeLogging) {
|
|
945
|
+
debugLogger.debug(
|
|
946
|
+
"[DEBUG] Kitty buffer overflow, clearing:",
|
|
947
|
+
kittySequenceBufferRef.current
|
|
948
|
+
);
|
|
949
|
+
}
|
|
950
|
+
if (config) {
|
|
951
|
+
const event = new KittySequenceOverflowEvent(
|
|
952
|
+
kittySequenceBufferRef.current.length,
|
|
953
|
+
kittySequenceBufferRef.current
|
|
954
|
+
);
|
|
955
|
+
logKittySequenceOverflow(config, event);
|
|
956
|
+
}
|
|
957
|
+
clearKittyBufferAndTimeout();
|
|
958
|
+
} else {
|
|
959
|
+
return;
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
if (key.name === "return" && key.sequence === `${ESC2}\r`) {
|
|
964
|
+
key.meta = true;
|
|
965
|
+
}
|
|
966
|
+
if (process.platform === "darwin" && !isPaste && key.sequence === OPTION_T_COMPOSED_GLYPH) {
|
|
967
|
+
key.name = "t";
|
|
968
|
+
key.meta = true;
|
|
969
|
+
}
|
|
970
|
+
broadcast({ ...key, paste: isPaste });
|
|
971
|
+
}, "handleKeypress");
|
|
972
|
+
const clearRawFlushTimeout = /* @__PURE__ */ __name(() => {
|
|
973
|
+
if (rawFlushTimeout) {
|
|
974
|
+
clearTimeout(rawFlushTimeout);
|
|
975
|
+
rawFlushTimeout = null;
|
|
976
|
+
}
|
|
977
|
+
}, "clearRawFlushTimeout");
|
|
978
|
+
const createPasteKeyEvent = /* @__PURE__ */ __name((name = "", sequence = "") => ({
|
|
979
|
+
name,
|
|
980
|
+
ctrl: false,
|
|
981
|
+
meta: false,
|
|
982
|
+
shift: false,
|
|
983
|
+
paste: false,
|
|
984
|
+
sequence
|
|
985
|
+
}), "createPasteKeyEvent");
|
|
986
|
+
const shouldFlushRawDataAsPaste = /* @__PURE__ */ __name((data) => {
|
|
987
|
+
const hasReturn = data.includes(13);
|
|
988
|
+
const hasEmbeddedTab = data.length > 1 && data.includes(9);
|
|
989
|
+
const isSingleReturn = data.length <= 2 && hasReturn;
|
|
990
|
+
return !isSingleReturn && (hasReturn || hasEmbeddedTab);
|
|
991
|
+
}, "shouldFlushRawDataAsPaste");
|
|
992
|
+
const flushRawBuffer = /* @__PURE__ */ __name(() => {
|
|
993
|
+
if (!rawDataBuffer.length) {
|
|
994
|
+
return;
|
|
995
|
+
}
|
|
996
|
+
const pasteModePrefixBuffer = Buffer.from(PASTE_MODE_PREFIX);
|
|
997
|
+
const pasteModeSuffixBuffer = Buffer.from(PASTE_MODE_SUFFIX);
|
|
998
|
+
const data = rawDataBuffer;
|
|
999
|
+
let cursor = 0;
|
|
1000
|
+
while (cursor < data.length) {
|
|
1001
|
+
const prefixPos = data.indexOf(pasteModePrefixBuffer, cursor);
|
|
1002
|
+
const suffixPos = data.indexOf(pasteModeSuffixBuffer, cursor);
|
|
1003
|
+
const hasPrefix = prefixPos !== -1 && prefixPos + pasteModePrefixBuffer.length <= data.length;
|
|
1004
|
+
const hasSuffix = suffixPos !== -1 && suffixPos + pasteModeSuffixBuffer.length <= data.length;
|
|
1005
|
+
let markerPos = -1;
|
|
1006
|
+
let markerLength = 0;
|
|
1007
|
+
let markerType = null;
|
|
1008
|
+
if (hasPrefix && (!hasSuffix || prefixPos < suffixPos)) {
|
|
1009
|
+
markerPos = prefixPos;
|
|
1010
|
+
markerLength = pasteModePrefixBuffer.length;
|
|
1011
|
+
markerType = "prefix";
|
|
1012
|
+
} else if (hasSuffix) {
|
|
1013
|
+
markerPos = suffixPos;
|
|
1014
|
+
markerLength = pasteModeSuffixBuffer.length;
|
|
1015
|
+
markerType = "suffix";
|
|
1016
|
+
}
|
|
1017
|
+
if (markerPos === -1) {
|
|
1018
|
+
break;
|
|
1019
|
+
}
|
|
1020
|
+
const nextData = data.slice(cursor, markerPos);
|
|
1021
|
+
if (nextData.length > 0) {
|
|
1022
|
+
keypressStream.write(nextData);
|
|
1023
|
+
}
|
|
1024
|
+
if (markerType === "prefix") {
|
|
1025
|
+
handleKeypress(void 0, createPasteKeyEvent("paste-start"));
|
|
1026
|
+
} else if (markerType === "suffix") {
|
|
1027
|
+
handleKeypress(void 0, createPasteKeyEvent("paste-end"));
|
|
1028
|
+
}
|
|
1029
|
+
cursor = markerPos + markerLength;
|
|
1030
|
+
}
|
|
1031
|
+
rawDataBuffer = data.slice(cursor);
|
|
1032
|
+
if (rawDataBuffer.length === 0) {
|
|
1033
|
+
return;
|
|
1034
|
+
}
|
|
1035
|
+
if (isPaste || !shouldFlushRawDataAsPaste(rawDataBuffer)) {
|
|
1036
|
+
keypressStream.write(rawDataBuffer);
|
|
1037
|
+
} else {
|
|
1038
|
+
handleKeypress(void 0, createPasteKeyEvent("paste-start"));
|
|
1039
|
+
keypressStream.write(rawDataBuffer);
|
|
1040
|
+
handleKeypress(void 0, createPasteKeyEvent("paste-end"));
|
|
1041
|
+
}
|
|
1042
|
+
rawDataBuffer = Buffer.alloc(0);
|
|
1043
|
+
clearRawFlushTimeout();
|
|
1044
|
+
}, "flushRawBuffer");
|
|
1045
|
+
const handleRawKeypress = /* @__PURE__ */ __name((_data) => {
|
|
1046
|
+
const data = Buffer.isBuffer(_data) ? _data : Buffer.from(_data, "utf8");
|
|
1047
|
+
rawDataBuffer = Buffer.concat([rawDataBuffer, data]);
|
|
1048
|
+
clearRawFlushTimeout();
|
|
1049
|
+
const isReturnChar = rawDataBuffer.length <= 2 && rawDataBuffer.includes(13);
|
|
1050
|
+
if (isReturnChar) {
|
|
1051
|
+
rawFlushTimeout = setTimeout(flushRawBuffer, 100);
|
|
1052
|
+
} else {
|
|
1053
|
+
flushRawBuffer();
|
|
1054
|
+
}
|
|
1055
|
+
}, "handleRawKeypress");
|
|
1056
|
+
let rl;
|
|
1057
|
+
if (usePassthrough) {
|
|
1058
|
+
rl = readline.createInterface({
|
|
1059
|
+
input: keypressStream,
|
|
1060
|
+
escapeCodeTimeout: 0
|
|
1061
|
+
});
|
|
1062
|
+
readline.emitKeypressEvents(keypressStream, rl);
|
|
1063
|
+
keypressStream.on("keypress", handleKeypress);
|
|
1064
|
+
stdin.on("data", handleRawKeypress);
|
|
1065
|
+
} else {
|
|
1066
|
+
rl = readline.createInterface({ input: stdin, escapeCodeTimeout: 0 });
|
|
1067
|
+
readline.emitKeypressEvents(stdin, rl);
|
|
1068
|
+
stdin.on("keypress", handleKeypress);
|
|
1069
|
+
}
|
|
1070
|
+
let replayPending = false;
|
|
1071
|
+
if (capturedInput.length > 0) {
|
|
1072
|
+
debugLogger.debug(
|
|
1073
|
+
`Replaying ${capturedInput.length} bytes of captured input`
|
|
1074
|
+
);
|
|
1075
|
+
replayPending = true;
|
|
1076
|
+
setImmediate(() => {
|
|
1077
|
+
if (!replayPending) return;
|
|
1078
|
+
try {
|
|
1079
|
+
stdin.emit("data", capturedInput);
|
|
1080
|
+
} catch (err) {
|
|
1081
|
+
debugLogger.error("Failed to replay captured input:", err);
|
|
1082
|
+
}
|
|
1083
|
+
});
|
|
1084
|
+
}
|
|
1085
|
+
return () => {
|
|
1086
|
+
replayPending = false;
|
|
1087
|
+
if (usePassthrough) {
|
|
1088
|
+
keypressStream.removeListener("keypress", handleKeypress);
|
|
1089
|
+
stdin.removeListener("data", handleRawKeypress);
|
|
1090
|
+
} else {
|
|
1091
|
+
stdin.removeListener("keypress", handleKeypress);
|
|
1092
|
+
}
|
|
1093
|
+
rl.close();
|
|
1094
|
+
setRawMode(false);
|
|
1095
|
+
if (backslashTimeout) {
|
|
1096
|
+
clearTimeout(backslashTimeout);
|
|
1097
|
+
backslashTimeout = null;
|
|
1098
|
+
}
|
|
1099
|
+
clearKittyBufferAndTimeout();
|
|
1100
|
+
clearPasteIdleTimeout();
|
|
1101
|
+
resetSgrMouse();
|
|
1102
|
+
if (rawFlushTimeout) {
|
|
1103
|
+
clearTimeout(rawFlushTimeout);
|
|
1104
|
+
rawFlushTimeout = null;
|
|
1105
|
+
}
|
|
1106
|
+
if (isPaste) {
|
|
1107
|
+
broadcast({
|
|
1108
|
+
name: "",
|
|
1109
|
+
ctrl: false,
|
|
1110
|
+
meta: false,
|
|
1111
|
+
shift: false,
|
|
1112
|
+
paste: true,
|
|
1113
|
+
sequence: pasteBuffer.toString()
|
|
1114
|
+
});
|
|
1115
|
+
pasteBuffer = Buffer.alloc(0);
|
|
1116
|
+
}
|
|
1117
|
+
};
|
|
1118
|
+
}, [
|
|
1119
|
+
stdin,
|
|
1120
|
+
setRawMode,
|
|
1121
|
+
kittyProtocolEnabled,
|
|
1122
|
+
debugKeystrokeLogging,
|
|
1123
|
+
pasteWorkaround,
|
|
1124
|
+
config,
|
|
1125
|
+
subscribers,
|
|
1126
|
+
mouseSubscribers,
|
|
1127
|
+
initialCapturedInput
|
|
1128
|
+
]);
|
|
1129
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
1130
|
+
KeypressContext.Provider,
|
|
1131
|
+
{
|
|
1132
|
+
value: {
|
|
1133
|
+
subscribe,
|
|
1134
|
+
unsubscribe,
|
|
1135
|
+
subscribeMouse,
|
|
1136
|
+
unsubscribeMouse,
|
|
1137
|
+
pasteWorkaround
|
|
1138
|
+
},
|
|
1139
|
+
children
|
|
1140
|
+
}
|
|
1141
|
+
);
|
|
1142
|
+
}
|
|
1143
|
+
__name(KeypressProvider, "KeypressProvider");
|
|
1144
|
+
|
|
1145
|
+
// packages/cli/src/ui/hooks/useKeypress.ts
|
|
1146
|
+
function useKeypress(onKeypress, { isActive }) {
|
|
1147
|
+
const { subscribe, unsubscribe } = useKeypressContext();
|
|
1148
|
+
const onKeypressRef = (0, import_react3.useRef)(onKeypress);
|
|
1149
|
+
onKeypressRef.current = onKeypress;
|
|
1150
|
+
const handleKeypress = (0, import_react3.useCallback)((key) => {
|
|
1151
|
+
onKeypressRef.current(key);
|
|
1152
|
+
}, []);
|
|
1153
|
+
(0, import_react3.useEffect)(() => {
|
|
1154
|
+
if (!isActive) {
|
|
1155
|
+
return;
|
|
1156
|
+
}
|
|
1157
|
+
subscribe(handleKeypress);
|
|
1158
|
+
return () => {
|
|
1159
|
+
unsubscribe(handleKeypress);
|
|
1160
|
+
};
|
|
1161
|
+
}, [isActive, handleKeypress, subscribe, unsubscribe]);
|
|
1162
|
+
}
|
|
1163
|
+
__name(useKeypress, "useKeypress");
|
|
1164
|
+
|
|
1165
|
+
export {
|
|
1166
|
+
enableMouseEvents,
|
|
1167
|
+
disableMouseEvents,
|
|
1168
|
+
useKeypress,
|
|
1169
|
+
useFocus,
|
|
1170
|
+
useKeypressContext,
|
|
1171
|
+
KeypressProvider
|
|
1172
|
+
};
|
|
1173
|
+
/**
|
|
1174
|
+
* @license
|
|
1175
|
+
* Copyright 2025 Qwen
|
|
1176
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
1177
|
+
*
|
|
1178
|
+
* Adapted from gemini-cli (Google LLC, Apache-2.0):
|
|
1179
|
+
* packages/cli/src/ui/utils/mouse.ts + utils/input.ts. Trimmed to the
|
|
1180
|
+
* subset the virtual-viewport scroll path needs (SGR + X11 parsing,
|
|
1181
|
+
* incomplete-sequence detection, enable/disable helpers).
|
|
1182
|
+
*/
|
|
1183
|
+
/**
|
|
1184
|
+
* @license
|
|
1185
|
+
* Copyright 2025 Google LLC
|
|
1186
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
1187
|
+
*/
|