@qwen-code/qwen-code 0.23.2 → 0.23.3-nightly.20260911.aaa6a32aae
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/README.md +35 -15
- package/bundled/computer-use/SKILL.md +1 -1
- package/bundled/goal-draft/SKILL.md +10 -10
- package/bundled/qc-helper/docs/configuration/model-providers.md +66 -28
- package/bundled/qc-helper/docs/configuration/settings.md +8 -3
- package/bundled/qc-helper/docs/features/_meta.ts +1 -0
- package/bundled/qc-helper/docs/features/channels/dingtalk.md +0 -20
- package/bundled/qc-helper/docs/features/channels/dws.md +7 -1
- package/bundled/qc-helper/docs/features/channels/overview.md +5 -6
- package/bundled/qc-helper/docs/features/commands.md +62 -9
- package/bundled/qc-helper/docs/features/computer-use.md +1 -1
- package/bundled/qc-helper/docs/features/cross-session-protocol.md +338 -0
- package/bundled/qc-helper/docs/features/goals.md +22 -18
- package/bundled/qc-helper/docs/features/hooks.md +28 -22
- package/bundled/qc-helper/docs/features/sub-agents.md +27 -0
- package/bundled/qc-helper/docs/qwen-serve.md +23 -6
- package/bundled/review/SKILL.md +93 -80
- package/bundled/review/references/persistence.md +2 -0
- package/bundled/review/references/posting.md +31 -14
- package/bundled/workflow-authoring/SKILL.md +410 -0
- package/bundled/workflow-creator/SKILL.md +1 -1
- package/chunks/{MaxSizedBox-4C3BKKKY.js → MaxSizedBox-7C5XTBZI.js} +64 -53
- package/chunks/{StandaloneSessionPicker-TXVF65YW.js → StandaloneSessionPicker-IGTT3ZRX.js} +88 -76
- package/chunks/{acp-startup-profiler-KEU6VAYR.js → acp-startup-profiler-RUQNTNU5.js} +2 -2
- package/chunks/acp-subagent-executor-IUHVNVVO.js +140 -0
- package/chunks/{acpAgent-H5XBKGB4.js → acpAgent-W43WM2K4.js} +957 -243
- package/chunks/{agent-T5LEFJIU.js → agent-2XMXC5JW.js} +48 -38
- package/chunks/{agent-headless-VZKSRH36.js → agent-headless-2HHBVCP6.js} +48 -38
- package/chunks/{anthropicContentGenerator-PRJWWVYJ.js → anthropicContentGenerator-7RI3MPIW.js} +69 -36
- package/chunks/{artifact-tool-G5LHNECG.js → artifact-tool-HHVHCPNG.js} +59 -109
- package/chunks/{askUserQuestion-I5W5S3D6.js → askUserQuestion-RFMXTD3B.js} +2 -2
- package/chunks/{bridge-AOX5IY44.js → bridge-ID6N4IH5.js} +69 -58
- package/chunks/{ca-KC2AISNS.js → ca-MX3WCEEG.js} +1 -1
- package/chunks/{channel-management-service-MWQGHPAS.js → channel-management-service-ASCXI7FR.js} +6 -6
- package/chunks/{channel-settings-store-XZCGDGHW.js → channel-settings-store-TPJFQAZY.js} +76 -65
- package/chunks/{channel-worker-group-SQ5FRWOH.js → channel-worker-group-JR6JOELM.js} +9 -9
- package/chunks/{channel-worker-manager-TU4ZNWOE.js → channel-worker-manager-AVKJEZFL.js} +19 -10
- package/chunks/{channel-worker-supervisor-EMITFMCP.js → channel-worker-supervisor-OOYY7BAQ.js} +7 -7
- package/chunks/{chunk-4WMGYG3F.js → chunk-22FWWGSM.js} +2 -2
- package/chunks/{chunk-LWX4WDFF.js → chunk-2S5RIGZJ.js} +43 -15
- package/chunks/{chunk-CLKE4IY3.js → chunk-2SZH22YO.js} +1 -1
- package/chunks/{chunk-HJ5UJQQL.js → chunk-2UKKQGRA.js} +3639 -1804
- package/chunks/{chunk-MWIO7MF6.js → chunk-2WSLXP3W.js} +4 -0
- package/chunks/{chunk-HNLMYDQE.js → chunk-33LYAC4R.js} +10 -6
- package/chunks/{chunk-VBLAI2HA.js → chunk-3FPYT6QC.js} +0 -31
- package/chunks/{chunk-F53KKZUD.js → chunk-3LMDSCLU.js} +158 -10
- package/chunks/{chunk-WXFCI3O5.js → chunk-3MAUPOZ4.js} +2 -2
- package/chunks/{chunk-CRZBDVP2.js → chunk-432JQKIO.js} +10 -10
- package/chunks/{chunk-IRGDIDGJ.js → chunk-43RQ552L.js} +364 -84
- package/chunks/{chunk-PFKGV6PO.js → chunk-465USTVK.js} +9 -15
- package/chunks/{chunk-WG7BL3FY.js → chunk-473RJLIH.js} +1 -1
- package/chunks/{chunk-J3VZF2AL.js → chunk-4O2AXZXU.js} +2 -2
- package/chunks/{chunk-N6S3NUYJ.js → chunk-55VOWZ4C.js} +1 -1
- package/chunks/{chunk-OWCFKIFQ.js → chunk-5CZMWDJI.js} +2 -2
- package/chunks/{chunk-7NDZKE2M.js → chunk-5MUIHID6.js} +5 -5
- package/chunks/{chunk-RM244SCQ.js → chunk-5Z74GE4N.js} +1 -1
- package/chunks/{chunk-G5VOXCRX.js → chunk-6375QMAO.js} +2 -2
- package/chunks/{chunk-3LPJ776W.js → chunk-63GQZKXL.js} +164 -31
- package/chunks/{chunk-O2FEO2CB.js → chunk-6GDELAVL.js} +18 -2
- package/chunks/{chunk-7PD7ZMX5.js → chunk-6HI2I3OM.js} +168 -6
- package/chunks/{chunk-CALNF3Z3.js → chunk-7C57HCOR.js} +1 -1
- package/chunks/{chunk-UYDQYDW2.js → chunk-7IBS746B.js} +1 -1
- package/chunks/{chunk-AUTUFD5X.js → chunk-ABNX6E6K.js} +1 -1
- package/chunks/chunk-ACHCT36C.js +28 -0
- package/chunks/{chunk-2WC3Y7YY.js → chunk-AEY27Z35.js} +401 -23
- package/chunks/{chunk-AO2VMS72.js → chunk-AQFRRH73.js} +3 -3
- package/chunks/{chunk-PDN7FJZV.js → chunk-ASWEMQIZ.js} +4 -4
- package/chunks/chunk-AYEJOTIU.js +43 -0
- package/chunks/{chunk-QFJZAY7W.js → chunk-BKFRA4F5.js} +5 -5
- package/chunks/{chunk-KCF2436G.js → chunk-BNLW5N6U.js} +4 -4
- package/chunks/{chunk-GOKAOSCN.js → chunk-BRFOZEPA.js} +2 -2
- package/chunks/{process-registry-OAEG6WGC.js → chunk-BYUAT5OC.js} +1 -0
- package/chunks/chunk-C5CECJ46.js +340 -0
- package/chunks/{chunk-NOO4QFXM.js → chunk-C75BXMPM.js} +1 -3
- package/chunks/chunk-CAAMI77K.js +937 -0
- package/chunks/{chunk-QTB4VP4K.js → chunk-CBGHRAWM.js} +304 -23
- package/chunks/chunk-CF5KXZZX.js +150 -0
- package/chunks/chunk-CFMZLE3L.js +75 -0
- package/chunks/{chunk-TGNNLRC3.js → chunk-CJ3DHN5I.js} +1 -0
- package/chunks/{chunk-ERXNTINK.js → chunk-CQZJYGRX.js} +1 -1
- package/chunks/{chunk-WBU2PIZ5.js → chunk-CSDKDHWV.js} +23 -16
- package/chunks/{chunk-2EKVPSIJ.js → chunk-D754KKNZ.js} +9 -2
- package/chunks/{chunk-E6TI726I.js → chunk-DGC7BKEZ.js} +1 -1
- package/chunks/{chunk-7SVM3RP2.js → chunk-DMMOQWRF.js} +4 -6
- package/chunks/{chunk-J3TJH52D.js → chunk-DOTF2PF2.js} +1 -1
- package/chunks/{chunk-2BMXHB6N.js → chunk-DWBNQR53.js} +7 -7
- package/chunks/{chunk-ZN5TKAVR.js → chunk-E5LTUWKZ.js} +3 -3
- package/chunks/chunk-EGW3ZP6Y.js +32 -0
- package/chunks/chunk-ELRMZTPF.js +374 -0
- package/chunks/{chunk-RNAJVXUG.js → chunk-ENAUXRPG.js} +6 -6
- package/chunks/{chunk-WXD7INFV.js → chunk-EO4U2X47.js} +10 -8
- package/chunks/{chunk-WDVV3LRM.js → chunk-EPVEPTI3.js} +45 -152
- package/chunks/chunk-ERU3SDXT.js +27 -0
- package/chunks/{chunk-4HOEU2OR.js → chunk-EWJTAP3Y.js} +1 -19
- package/chunks/{chunk-GSFV5RQW.js → chunk-EYN3G5XD.js} +328 -4
- package/chunks/{chunk-QB3KS3N3.js → chunk-FGROOEKM.js} +5 -40
- package/chunks/{chunk-TOOOLHVS.js → chunk-FH5AVEWJ.js} +3 -3
- package/chunks/{chunk-DAI65CMX.js → chunk-FJZWRNEW.js} +1 -1
- package/chunks/{chunk-GNY7B3CA.js → chunk-FUQK5ZNL.js} +1 -1
- package/chunks/{chunk-GOEVQADN.js → chunk-GDIPPCW6.js} +330 -175
- package/chunks/{chunk-ALMR3E6Q.js → chunk-GDWE23OR.js} +3 -3
- package/chunks/{chunk-LNYV4GXX.js → chunk-GSKX53AN.js} +0 -139
- package/chunks/{chunk-ELD3OBPU.js → chunk-GWOVD63C.js} +3 -3
- package/chunks/{chunk-IWABUX6T.js → chunk-GX5FF2IE.js} +6 -6
- package/chunks/{chunk-22GORRNY.js → chunk-GZMNHAYC.js} +1 -1
- package/chunks/{chunk-YZTGGCEE.js → chunk-H3TFIFX3.js} +1 -1
- package/chunks/{chunk-6G4V7SE4.js → chunk-HG46TTAG.js} +1 -1
- package/chunks/{chunk-FETY36NQ.js → chunk-HGEUHUEV.js} +1 -1
- package/chunks/{chunk-KEPC5BOL.js → chunk-IBRQG2MP.js} +12 -15
- package/chunks/{chunk-OXR34GCD.js → chunk-IILWL3KY.js} +2054 -146
- package/chunks/{chunk-IW6RQPQB.js → chunk-IJOS26LH.js} +1 -3
- package/chunks/{chunk-ORFIYTI2.js → chunk-IK2MWJP5.js} +1 -1
- package/chunks/{chunk-CMWU6P4D.js → chunk-IRJRB3OD.js} +1 -1
- package/chunks/{chunk-QHLHE2OT.js → chunk-IUN5ZMFY.js} +1 -1
- package/chunks/{chunk-LYT2OU7D.js → chunk-IXXV6BVB.js} +172 -6
- package/chunks/{chunk-R3JIDRUL.js → chunk-J6H4JP25.js} +4 -4
- package/chunks/{chunk-NB3NDQQK.js → chunk-J6SBP5G2.js} +1 -1
- package/chunks/{chunk-TRQNRP2H.js → chunk-J7LBAKDH.js} +46 -3
- package/chunks/{chunk-67XTVRVB.js → chunk-JJFHISXU.js} +30 -25
- package/chunks/chunk-JL6APGBX.js +43 -0
- package/chunks/{chunk-NX7ZTXFF.js → chunk-JSKEW4E7.js} +2 -1
- package/chunks/{chunk-BK7D2JR6.js → chunk-JVTXAA35.js} +3 -3
- package/chunks/chunk-K2OJUPOE.js +78 -0
- package/chunks/{chunk-G3ZUMSFS.js → chunk-K3U6VB3O.js} +6 -6
- package/chunks/{chunk-4I3WFI3U.js → chunk-K4KWLF7Q.js} +12 -12
- package/chunks/{chunk-WXPPUPHM.js → chunk-KWFFJ6AK.js} +1 -1
- package/chunks/{chunk-46MMBZHI.js → chunk-KZYOFJ6V.js} +4 -4
- package/chunks/{chunk-ULZECEIP.js → chunk-LDQHA6L4.js} +2 -20
- package/chunks/{chunk-7LTCFO6T.js → chunk-LQBAFO5D.js} +6 -5
- package/chunks/{chunk-SOA4HKRJ.js → chunk-LT2XFADM.js} +2 -2
- package/chunks/{chunk-JYGIJA4W.js → chunk-LWWRJRCD.js} +1 -1
- package/chunks/{chunk-YQGW3M6Z.js → chunk-MFQWRBFB.js} +5 -5
- package/chunks/{chunk-TODNHE76.js → chunk-MUFGTWQH.js} +5 -5
- package/chunks/{chunk-5DQ4YTIZ.js → chunk-MV5XRRML.js} +3 -3
- package/chunks/{chunk-IR6JKBAP.js → chunk-NOUK63IR.js} +2 -2
- package/chunks/{chunk-XQ4RDO5B.js → chunk-NV77SEX3.js} +1 -1
- package/chunks/{chunk-OFVAS4AR.js → chunk-NWDPOFJI.js} +2 -2
- package/chunks/chunk-NY6OPAPS.js +820 -0
- package/chunks/{chunk-WDN64MVT.js → chunk-O5VX66FB.js} +127 -18
- package/chunks/{chunk-MV5DTLJV.js → chunk-OHCR4O3U.js} +1 -1
- package/chunks/{chunk-LEAOJ43M.js → chunk-OKOPKQ2X.js} +1310 -2107
- package/chunks/{chunk-B25JYXZE.js → chunk-ONLJBOI2.js} +971 -17
- package/chunks/{chunk-QQK4L3UU.js → chunk-OWUAZXXN.js} +132 -26
- package/chunks/{chunk-R457KFV7.js → chunk-P42IUOAO.js} +3 -3
- package/chunks/{chunk-LUNC5KCL.js → chunk-PRELUGCQ.js} +214 -39
- package/chunks/{chunk-5OZUKLL7.js → chunk-QSMQKTXV.js} +4 -4
- package/chunks/{chunk-FAJPLSYF.js → chunk-QTQYLQ5A.js} +85 -81
- package/chunks/{chunk-CALTQWTZ.js → chunk-QVZDV4ZS.js} +2 -2
- package/chunks/{chunk-J6MB5ZHZ.js → chunk-QZW6WRB7.js} +2 -1
- package/chunks/{chunk-KFECPHLV.js → chunk-RBWAGV73.js} +3 -3
- package/chunks/{chunk-4VY3ITHR.js → chunk-RF5RQRTD.js} +3 -3
- package/chunks/{chunk-HIXUUCGY.js → chunk-RPMXMR6U.js} +2 -2
- package/chunks/{chunk-3OAXF3UK.js → chunk-RRQEZBL2.js} +3756 -1343
- package/chunks/{chunk-4ALNJDHL.js → chunk-RSGEAWFJ.js} +19 -1
- package/chunks/{chunk-5BH2AIEY.js → chunk-RUE62UH6.js} +2 -2
- package/chunks/{chunk-PQEISIKS.js → chunk-SAH4BD2J.js} +0 -67
- package/chunks/{chunk-A7EFXK7P.js → chunk-SAOJHRWY.js} +2 -2
- package/chunks/{chunk-JO77FGNZ.js → chunk-SDUIETBG.js} +19 -7
- package/chunks/{chunk-6RZX2HIH.js → chunk-TBEXLLAO.js} +2 -2
- package/chunks/{chunk-PSPAM24S.js → chunk-TBSCTWKF.js} +6 -0
- package/chunks/{chunk-HRPFBHW7.js → chunk-TPKQIA7G.js} +1 -0
- package/chunks/{chunk-XDNFODER.js → chunk-TUIW5LLK.js} +1 -1
- package/chunks/{chunk-APXIW2TF.js → chunk-TVV5FA3G.js} +4 -4
- package/chunks/chunk-U6H3XTFA.js +95 -0
- package/chunks/{chunk-S5QR6CB5.js → chunk-UKMWZ5NS.js} +108 -887
- package/chunks/{chunk-U6REWGVR.js → chunk-VG2BRSEK.js} +2 -2
- package/chunks/chunk-VGBOJH2D.js +127 -0
- package/chunks/chunk-VGY2RGXL.js +100 -0
- package/chunks/{chunk-ZP5XDLSA.js → chunk-VLWG3EHY.js} +12 -12
- package/chunks/{chunk-4JNHNVAZ.js → chunk-W547PYQ7.js} +9 -4
- package/chunks/{chunk-7VEYUF3N.js → chunk-W5ZQMAEM.js} +1 -1
- package/chunks/{chunk-QAZ2MGYT.js → chunk-W7JJLUSB.js} +2 -2
- package/chunks/{chunk-CCBTNJB4.js → chunk-W7Q7XDQI.js} +39 -27
- package/chunks/{chunk-DARWOZY6.js → chunk-WD6YQI5M.js} +1 -1
- package/chunks/{chunk-F2NYVASI.js → chunk-WXAWG3JS.js} +30 -13
- package/chunks/{chunk-NPKCVSXX.js → chunk-XB5JRCAM.js} +11 -9
- package/chunks/{chunk-XSOXPG2L.js → chunk-XE46RQFI.js} +136 -8
- package/chunks/{chunk-QTNCGZHQ.js → chunk-XX5HQLCZ.js} +16 -0
- package/chunks/{chunk-2Z3T52OC.js → chunk-Y5TM7SBV.js} +7 -2
- package/chunks/chunk-YC6XOB5N.js +691 -0
- package/chunks/{chunk-CWVZBIZJ.js → chunk-YDW4ERSS.js} +1 -1
- package/chunks/{chunk-TRWQQBVH.js → chunk-YGCTOXUT.js} +10 -24
- package/chunks/{chunk-WK7P62DV.js → chunk-YKC67ZEF.js} +6 -6
- package/chunks/{chunk-KA5HR3G2.js → chunk-YKM6MITI.js} +5 -5
- package/chunks/{chunk-X7LFJF5D.js → chunk-YM6KUQ2S.js} +36 -84
- package/chunks/{chunk-HZ2HUXX7.js → chunk-YS2ZJSOA.js} +29 -12
- package/chunks/{chunk-G37O7YO6.js → chunk-ZAWM6KRF.js} +3 -3
- package/chunks/{chunk-H3Q3RSKZ.js → chunk-ZFIWHBJ3.js} +1 -1
- package/chunks/{chunk-XBVNNDPK.js → chunk-ZHKTKHMO.js} +8 -1
- package/chunks/{chunk-YLOHCA6I.js → chunk-ZKWO4CF4.js} +2 -2
- package/chunks/{chunk-VJJXG73H.js → chunk-ZMQL5BL5.js} +21 -6
- package/chunks/{chunk-FGHPZGOP.js → chunk-ZMUYBOYB.js} +39 -55
- package/chunks/{chunk-FV4DM2M4.js → chunk-ZNI3YJHS.js} +26 -6
- package/chunks/{chunk-565U2ANU.js → chunk-ZTTC7T4X.js} +1 -1
- package/chunks/{chunk-7OCIQNKX.js → chunk-ZW2EUO2A.js} +1 -1
- package/chunks/codex-subagent-executor-26XOHVKH.js +585 -0
- package/chunks/{config-utils-GPLIABL2.js → config-utils-JUG3MOYN.js} +68 -57
- package/chunks/{contextCommand-NCUQUDBY.js → contextCommand-6K3POZFA.js} +65 -54
- package/chunks/{core-runtime-WKYKWVYU.js → core-runtime-XQFZLA2V.js} +66 -55
- package/chunks/{create-sub-session-TGIX63YU.js → create-sub-session-4UJ6RM6W.js} +5 -2
- package/chunks/{create-sub-session-PPLXB3JJ.js → create-sub-session-T4IYIOC7.js} +178 -91
- package/chunks/{cron-create-GTPVMJCF.js → cron-create-6466RWSO.js} +2 -2
- package/chunks/{cron-delete-ZBK27Z4K.js → cron-delete-W4QUWHOA.js} +2 -2
- package/chunks/{cron-list-KTFKFDKC.js → cron-list-Q5LJ5PZE.js} +2 -2
- package/chunks/{daemon-2CKIAO3I.js → daemon-PHPJUXDZ.js} +4 -2
- package/chunks/{daemon-git-worktree-guard-73ZWOLKL.js → daemon-git-worktree-guard-5WEMZ64U.js} +65 -54
- package/chunks/{daemon-status-provider-OK7VONJG.js → daemon-status-provider-GMD7QD4T.js} +74 -63
- package/chunks/{daemon-trust-policy-CAUCREG2.js → daemon-trust-policy-IPBZES2Z.js} +71 -60
- package/chunks/{daemon-trust-policy-monitor-3Y36OOEQ.js → daemon-trust-policy-monitor-MHYEN7X7.js} +71 -60
- package/chunks/{de-UU2YTO37.js → de-OOLZAU2U.js} +1 -1
- package/chunks/{deferred-core-runtime-Q7WFWYD3.js → deferred-core-runtime-CY43FZNZ.js} +63 -52
- package/chunks/{discovery-XP4RMDUM.js → discovery-5KUEPR65.js} +2 -2
- package/chunks/{display-image-CTNHJRZC.js → display-image-6AZIHP3J.js} +3 -3
- package/chunks/{dist-F34J4FZX.js → dist-2QYIVNS6.js} +2 -5
- package/chunks/{dist-6YDUH3BB.js → dist-GIMQXYLI.js} +10 -631
- package/chunks/{dist-NP7QKLVG.js → dist-GUB7QRYA.js} +3 -6
- package/chunks/{dist-Y5KC3IHW.js → dist-L45UB6DG.js} +233 -35
- package/chunks/{dist-XLV33CLY.js → dist-MPUZZOG5.js} +5 -18
- package/chunks/{dist-ZDNJK74R.js → dist-PA7WPFVE.js} +6 -37
- package/chunks/{dist-F6JLAJLE.js → dist-T6DDPDLQ.js} +16 -36
- package/chunks/{dist-BNQVF565.js → dist-TFGETXFN.js} +14 -37
- package/chunks/{dist-UFTFGI6I.js → dist-VDLSBCLM.js} +2 -6
- package/chunks/{edit-YJD6IETK.js → edit-6NUP5IPX.js} +48 -38
- package/chunks/{en-YJNRUQG4.js → en-ZSZW3PZX.js} +4 -1
- package/chunks/{enter-worktree-YFTKHXHZ.js → enter-worktree-EETDMJRF.js} +5 -5
- package/chunks/{enterPlanMode-EFPVTWIH.js → enterPlanMode-AZHYHEII.js} +48 -38
- package/chunks/{environment-HP3AXFTB.js → environment-ON6GIQ4F.js} +66 -55
- package/chunks/{errors-22ON46G7.js → errors-DQE63SCC.js} +65 -54
- package/chunks/exec-66WQIVYU.js +505 -0
- package/chunks/{exit-worktree-NF2XEMES.js → exit-worktree-DIPJ6S55.js} +5 -5
- package/chunks/{exitPlanMode-MOQUNCBH.js → exitPlanMode-NHBV6LAI.js} +48 -38
- package/chunks/{fast-path-2X7BPMXX.js → fast-path-EPJSUZZC.js} +7 -7
- package/chunks/{fast-path-settings-SATXY3PD.js → fast-path-settings-XDYX7X5Z.js} +2 -2
- package/chunks/{fr-HKNWVXRJ.js → fr-JJWM2HUS.js} +1 -1
- package/chunks/{glob-Y7ACIB3P.js → glob-MNEXQ2NV.js} +51 -41
- package/chunks/{goal-tools-DABMICUC.js → goal-tools-D2A4QBCJ.js} +54 -40
- package/chunks/{grep-BLHF2S5D.js → grep-EFWPV3MM.js} +2 -2
- package/chunks/{handleAutoUpdate-MCAMHYDI.js → handleAutoUpdate-2RY3OQA6.js} +67 -56
- package/chunks/{i18n-C3GDCALP.js → i18n-HTHDB3I7.js} +64 -53
- package/chunks/{image-gen-XP4NNIYG.js → image-gen-2PHED3P4.js} +8 -6
- package/chunks/{initializer-4URDQL2G.js → initializer-JEVLJCQA.js} +71 -60
- package/chunks/{installationInfo-LBOL6SBV.js → installationInfo-ITRB6J4L.js} +63 -52
- package/chunks/{ja-GJS5RZGU.js → ja-L67TXFDJ.js} +1 -1
- package/chunks/list-KOUIMHT5.js +133 -0
- package/chunks/{list-agents-2CXPGJUE.js → list-agents-IY4NEWLP.js} +17 -7
- package/chunks/{llm-2KPNSAVY.js → llm-F7WHGESY.js} +132 -120
- package/chunks/{llm-content-generator-GR3FOHLB.js → llm-content-generator-NYQ2NAVA.js} +6 -5
- package/chunks/{loadedSettingsAdapter-DVKROEJD.js → loadedSettingsAdapter-HZUAX5CX.js} +71 -60
- package/chunks/{loggingContentGenerator-P4K6K5W4.js → loggingContentGenerator-WMNU7C5J.js} +70 -59
- package/chunks/{loop-wakeup-HL6XOWI4.js → loop-wakeup-ANX25YW2.js} +3 -3
- package/chunks/{ls-YV7RKLKY.js → ls-4XCMJNZF.js} +4 -4
- package/chunks/{lsp-NO3AMRZT.js → lsp-K5E2Y64R.js} +1 -1
- package/chunks/{managed-npm-update-VWBKHNIN.js → managed-npm-update-EJJB65QI.js} +63 -52
- package/chunks/mcp-I73R6HS3.js +127 -0
- package/chunks/{monitor-A255TNZR.js → monitor-T56GJNA4.js} +50 -40
- package/chunks/{nonInteractiveCli-LXGIKQAT.js → nonInteractiveCli-CKHHJ423.js} +120 -109
- package/chunks/{notebook-edit-5UYHS2DM.js → notebook-edit-W5TU3EZ3.js} +48 -38
- package/chunks/openai-WX26N5OJ.js +47 -0
- package/chunks/{openaiContentGenerator-A6MAMEO5.js → openaiContentGenerator-TH6YAWAH.js} +33 -25
- package/chunks/openaiResponsesContentGenerator-EWLWQPKS.js +1738 -0
- package/chunks/{pidfile-B7DZC4TP.js → pidfile-RCC6TCEM.js} +63 -52
- package/chunks/process-registry-X6ZCASEN.js +10 -0
- package/chunks/{processUtils-BPZ2MCZS.js → processUtils-DQDQBRMC.js} +2 -2
- package/chunks/{prompt-terminal-ledger-FYYTAOXS.js → prompt-terminal-ledger-2LXWAGWU.js} +64 -53
- package/chunks/{pt-FXMYXEUV.js → pt-77SBDL4B.js} +1 -1
- package/chunks/{qwenContentGenerator-4IOJFD4S.js → qwenContentGenerator-LG65Z2YV.js} +61 -49
- package/chunks/{qwenOAuth2-KX6LVYQ3.js → qwenOAuth2-PJ63CCFD.js} +7 -5
- package/chunks/{read-file-A4H4O3VQ.js → read-file-72HMRUT4.js} +12 -9
- package/chunks/{read-mcp-resource-D3N75DGF.js → read-mcp-resource-NPF44YSC.js} +1 -1
- package/chunks/{record-artifact-Q5CRGJTP.js → record-artifact-MDXCCW2J.js} +3 -3
- package/chunks/record-source-VJLKDGGR.js +22 -0
- package/chunks/{report-findings-TJ34R7QK.js → report-findings-CZTYMZTC.js} +4 -4
- package/chunks/{request-shutdown-LRKMTBAD.js → request-shutdown-KOZHPVZU.js} +5 -5
- package/chunks/{resumeHistoryUtils-YQQ43E4N.js → resumeHistoryUtils-S2Q3M3EH.js} +69 -58
- package/chunks/{ripGrep-W32NWFTA.js → ripGrep-B2I3L5CO.js} +17 -13
- package/chunks/{ru-RMHURE5U.js → ru-UYWHKWF2.js} +1 -1
- package/chunks/{run-qwen-serve-WBSWWIRV.js → run-qwen-serve-AOPYFCVP.js} +305 -132
- package/chunks/{runtime-VRVBX2E5.js → runtime-TZMHKZAP.js} +77 -66
- package/chunks/{scheduled-tasks-D65KJDA3.js → scheduled-tasks-7RL6ZOYT.js} +72 -60
- package/chunks/{scheduler-M2YPN7Z7.js → scheduler-D6RLOFNU.js} +65 -54
- package/chunks/{sdk-exporters-grpc-MXTVSE3C.js → sdk-exporters-grpc-Y2ZUQDUQ.js} +2 -2
- package/chunks/{sdk-exporters-http-7R2ARBPV.js → sdk-exporters-http-VWTF4W6K.js} +3 -3
- package/chunks/{sdk-impl-YOLO7LV4.js → sdk-impl-G6FVTBQZ.js} +9 -9
- package/chunks/{send-message-76BKWKFZ.js → send-message-MMZVSS7P.js} +12 -9
- package/chunks/{serve-BE3H2P6P.js → serve-HWWDYI37.js} +72 -61
- package/chunks/{server-FLY5JERG.js → server-MD2X5U5L.js} +3156 -564
- package/chunks/{session-JVN62R5K.js → session-AFUMFNN7.js} +124 -113
- package/chunks/{session-attachments-root-7ACGLHXA.js → session-attachments-root-QPN3YWTY.js} +63 -52
- package/chunks/{session-pr-refresh-TQS57SDK.js → session-pr-refresh-4Y2ANMJX.js} +72 -60
- package/chunks/{settings-D44YMZFT.js → settings-QQRQ2LR7.js} +74 -63
- package/chunks/{shell-3VE6I4V5.js → shell-NUYUYMVI.js} +48 -38
- package/chunks/{skill-FHEGRRZU.js → skill-KHLDVOXW.js} +68 -30
- package/chunks/{skill-settings-VHEJMBFL.js → skill-settings-INLEGDEZ.js} +70 -59
- package/chunks/{spawnChannel-T6MX2ZDN.js → spawnChannel-KBGZHW2G.js} +67 -56
- package/chunks/{standalone-update-QUGHFMCS.js → standalone-update-3QP5NDVJ.js} +65 -54
- package/chunks/{start-opentui-ui-IHIIZ2LE.js → start-opentui-ui-VBT3XDWN.js} +2682 -2153
- package/chunks/{startInteractiveUI-LR7K2ARZ.js → startInteractiveUI-AZHKCHMR.js} +1562 -2317
- package/chunks/{syntheticOutput-D2P5V6RG.js → syntheticOutput-KRASPDE3.js} +2 -2
- package/chunks/{task-create-MWXJFRRM.js → task-create-TNXNT7ZD.js} +8 -8
- package/chunks/{task-list-EYO3FE57.js → task-list-FHNIJDKT.js} +1 -1
- package/chunks/{task-stop-BFSKRTGV.js → task-stop-MG4ZMTEI.js} +1 -1
- package/chunks/{task-update-2JJJRHMT.js → task-update-4HU62CJT.js} +8 -8
- package/chunks/{team-create-GY3VFY47.js → team-create-K5DNSJXR.js} +50 -40
- package/chunks/{team-delete-IQZ6XGFI.js → team-delete-2T44GUNN.js} +1 -1
- package/chunks/{team-plan-approval-BQPGZOT5.js → team-plan-approval-2ZNAQT2A.js} +48 -38
- package/chunks/{terminal-image-renderer-YNYW5CQG.js → terminal-image-renderer-23CW4A6Q.js} +65 -54
- package/chunks/{theme-manager-U6CIK3GM.js → theme-manager-G2333AMH.js} +63 -52
- package/chunks/{todoWrite-5ERKFWAK.js → todoWrite-BO2GR5MN.js} +4 -4
- package/chunks/{tool-search-XI3QWD5I.js → tool-search-MKQCKXN5.js} +22 -15
- package/chunks/{total-session-admission-3SNSJJ32.js → total-session-admission-ENKTM2KX.js} +69 -58
- package/chunks/{trustedFolders-OVAQKNV5.js → trustedFolders-2ETDL7OD.js} +64 -53
- package/chunks/{update-relaunch-XV5O74E3.js → update-relaunch-FMVNN5KA.js} +5 -5
- package/chunks/{updateCheck-CHUYWD6L.js → updateCheck-KWRV5KLJ.js} +66 -55
- package/chunks/{useAutoAcceptIndicator-VKSVIXZC.js → useAutoAcceptIndicator-7AUXAIQF.js} +73 -62
- package/chunks/{validateNonInterActiveAuth-ZNUTD3E5.js → validateNonInterActiveAuth-NETKLLDV.js} +117 -106
- package/chunks/{version-EK7VAGSI.js → version-DACNN2ZM.js} +1 -1
- package/chunks/{web-fetch-24KZO763.js → web-fetch-CIVCRET4.js} +16 -12
- package/chunks/{web-search-CRNXKZ2X.js → web-search-GOHZRGMM.js} +389 -327
- package/chunks/{web-shell-static-BFDESDD4.js → web-shell-static-T7UGLVE4.js} +2 -7
- package/chunks/workflow-IL2FOALZ.js +1324 -0
- package/chunks/workspace-providers-status-YGXL6N5U.js +131 -0
- package/chunks/{workspace-registration-store-HKLJEDQX.js → workspace-registration-store-E4IAOFFZ.js} +3 -1
- package/chunks/{workspace-registry-7RDDOBLN.js → workspace-registry-KX6BIBYK.js} +69 -58
- package/chunks/{workspace-runtime-coordinator-LEPDPXJO.js → workspace-runtime-coordinator-2KYYGDDR.js} +72 -59
- package/chunks/{workspace-service-5IFDCNN3.js → workspace-service-5Q6LWBYR.js} +76 -65
- package/chunks/{workspace-skills-status-FJ3HNH4H.js → workspace-skills-status-PJZTFPVV.js} +72 -61
- package/chunks/{workspace-trust-reconciler-PQFHIWLR.js → workspace-trust-reconciler-HS6PWNEA.js} +77 -66
- package/chunks/{write-file-ERG67ZFX.js → write-file-JB3DRM7O.js} +50 -40
- package/chunks/{zh-VBFCRQBL.js → zh-7UJA4ICT.js} +4 -1
- package/chunks/{zh-TW-N2TBF2F2.js → zh-TW-RV24PWUI.js} +4 -1
- package/chunks/{zoom-image-WQYEC3SR.js → zoom-image-AVHQFOOQ.js} +12 -9
- package/cli.js +16 -16
- package/codeModeHost.js +4425 -0
- package/export-transcript-document.css +1 -0
- package/export-transcript-document.js +164 -165
- package/locales/ca.js +2 -2
- package/locales/de.js +2 -2
- package/locales/en.js +5 -2
- package/locales/fr.js +2 -2
- package/locales/ja.js +2 -2
- package/locales/pt.js +2 -2
- package/locales/ru.js +2 -2
- package/locales/zh-TW.js +5 -2
- package/locales/zh.js +5 -2
- package/package.json +6 -4
- package/web-shell/assets/{abnfDiagram-VCTEODGH-BRLgQbnT.js → abnfDiagram-VCTEODGH-BH2nK5Z_.js} +1 -1
- package/web-shell/assets/{arc-qAF9_XsR.js → arc-CUUQ6krv.js} +1 -1
- package/web-shell/assets/{architectureDiagram-5GKGNRK7-BorUttEz.js → architectureDiagram-5GKGNRK7-CJjiRuGx.js} +1 -1
- package/web-shell/assets/{blockDiagram-NRAW4CY4-Bj0qZVxu.js → blockDiagram-NRAW4CY4-GCDyU9ZX.js} +1 -1
- package/web-shell/assets/{c4Diagram-UCG6FXSJ-BTqJis32.js → c4Diagram-UCG6FXSJ-C68MiN6h.js} +1 -1
- package/web-shell/assets/channel-DauVlmdF.js +1 -0
- package/web-shell/assets/{chunk-2Q5K7J3B-RrQ5X8m-.js → chunk-2Q5K7J3B-_8B6frXZ.js} +1 -1
- package/web-shell/assets/{chunk-5VM5RSS4-uUjDl8wO.js → chunk-5VM5RSS4-CroSinX7.js} +1 -1
- package/web-shell/assets/{chunk-F27PBJKO-C3JhpyzI.js → chunk-F27PBJKO-CGn4Z0Fx.js} +1 -1
- package/web-shell/assets/{chunk-G27WJ6UU-C8ZNFs7F.js → chunk-G27WJ6UU-BI5nLQcf.js} +1 -1
- package/web-shell/assets/{chunk-JWPE2WC7-DNpXtEOs.js → chunk-JWPE2WC7-CYJH0FuH.js} +1 -1
- package/web-shell/assets/{chunk-LCL6LL3I-DagA2ZLw.js → chunk-LCL6LL3I-DjWZUqA1.js} +1 -1
- package/web-shell/assets/{chunk-POPQ4Y6H-R23uH7Xm.js → chunk-POPQ4Y6H-DcTkIHm8.js} +1 -1
- package/web-shell/assets/{chunk-SVP7TREG-Qz9RN_BR.js → chunk-SVP7TREG-E8sZT5uK.js} +1 -1
- package/web-shell/assets/{chunk-XXDRQBXY-jYb1_hni.js → chunk-XXDRQBXY-CurjPKw_.js} +1 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-BuIh7bj1.js +1 -0
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-BuIh7bj1.js +1 -0
- package/web-shell/assets/{cose-bilkent-JH36ORCC-Cv2OunpE.js → cose-bilkent-JH36ORCC-CJEnNhth.js} +1 -1
- package/web-shell/assets/{cynefin-OW5HDTMX-LH42KFJx.js → cynefin-OW5HDTMX-jwEkm0yw.js} +1 -1
- package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-Dha4_OoR.js → cynefinDiagram-5FMLGOSQ-B-OVQ6AO.js} +1 -1
- package/web-shell/assets/{dagre-3AP2YEHR-Br5lnUKD.js → dagre-3AP2YEHR-CKKK9WNR.js} +1 -1
- package/web-shell/assets/{diagram-S7CK7UJ4-dpKq2bBX.js → diagram-S7CK7UJ4-D486veFQ.js} +1 -1
- package/web-shell/assets/{diagram-UQ7AKVKN-BAgHWpXr.js → diagram-UQ7AKVKN-C3GujqHv.js} +1 -1
- package/web-shell/assets/{diagram-VSXAHHWV-GRRzpyE2.js → diagram-VSXAHHWV-BrOTDwuU.js} +1 -1
- package/web-shell/assets/{diagram-VX7I27RA-BNFiaYpG.js → diagram-VX7I27RA-C4D9kWE3.js} +1 -1
- package/web-shell/assets/{diagram-Z3DM3KII-BisZzB_h.js → diagram-Z3DM3KII-7rAManT0.js} +1 -1
- package/web-shell/assets/{ebnfDiagram-PWID7BFC-B1xbwycf.js → ebnfDiagram-PWID7BFC-CqVzKOdr.js} +1 -1
- package/web-shell/assets/{erDiagram-SSCWMZ5O-CQMzbGE5.js → erDiagram-SSCWMZ5O-D2s08fc_.js} +1 -1
- package/web-shell/assets/{flowDiagram-A5DVABFB-CZ_Zondl.js → flowDiagram-A5DVABFB-CrKtBxB2.js} +1 -1
- package/web-shell/assets/{ganttDiagram-EL5Y4UJY-BTh2ShxS.js → ganttDiagram-EL5Y4UJY-CD1CKdlt.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-WWUBYQGX-oHOB-Uxt.js → gitGraphDiagram-WWUBYQGX-CHDXdVNn.js} +1 -1
- package/web-shell/assets/index-D8tzgUOC.css +36 -0
- package/web-shell/assets/{index-DWoFMu5x.js → index-DWz95m74.js} +1 -1
- package/web-shell/assets/index-cDFf68Wd.js +2204 -0
- package/web-shell/assets/{infoDiagram-RXCK75RN-C0QpudbG.js → infoDiagram-RXCK75RN-Cr1oLCwe.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-5VMMS53U-a6B741uT.js → ishikawaDiagram-5VMMS53U--RghV1mm.js} +1 -1
- package/web-shell/assets/{journeyDiagram-EYS64GPL-Dbht9ICp.js → journeyDiagram-EYS64GPL-MN1ZkGW8.js} +1 -1
- package/web-shell/assets/{kanban-definition-3QL26DDD-D4OFR8-h.js → kanban-definition-3QL26DDD-DL05VTn0.js} +1 -1
- package/web-shell/assets/{layout-Dvdh5jRH.js → layout-D_TvQzvn.js} +1 -1
- package/web-shell/assets/{linear-Dvc6KIW2.js → linear-B_0OH6XF.js} +1 -1
- package/web-shell/assets/{mermaid.core-CB36RfIb.js → mermaid.core-B9Nklh9I.js} +6 -6
- package/web-shell/assets/{mindmap-definition-FBJOCRG2-Fmqo1CjP.js → mindmap-definition-FBJOCRG2-CevIQ0LR.js} +1 -1
- package/web-shell/assets/{pegDiagram-XKGWAZYB-CCxYBoA4.js → pegDiagram-XKGWAZYB-DQ8PIv0d.js} +1 -1
- package/web-shell/assets/{pieDiagram-E7YTZNPT-BVHKQFzt.js → pieDiagram-E7YTZNPT-BVTV1pPe.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-AXDQQJYC-l95IznwR.js → quadrantDiagram-AXDQQJYC-DHN6nhpe.js} +1 -1
- package/web-shell/assets/qwen-code-notification-BRVagufF.png +0 -0
- package/web-shell/assets/{railroadDiagram-O6MQD6OU-BlLdRdXp.js → railroadDiagram-O6MQD6OU-8HOyX0u-.js} +1 -1
- package/web-shell/assets/{requirementDiagram-EFPCY7ZU-BkDLBR5w.js → requirementDiagram-EFPCY7ZU-9W4_14i8.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-P5KCCOFB-jAIqRp65.js → sankeyDiagram-P5KCCOFB-DSUBB2XP.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-f-soZYPr.js → sequenceDiagram-WJ2MYXX4-DD3jH6Jn.js} +1 -1
- package/web-shell/assets/{sizeCapture-X5ZJPWSS-BzOuAfB2.js → sizeCapture-X5ZJPWSS-RAFTU3Cz.js} +1 -1
- package/web-shell/assets/{stateDiagram-HBIQ2CUA-BPLSs12r.js → stateDiagram-HBIQ2CUA-Drk-oZ2x.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-QzYteVIm.js +1 -0
- package/web-shell/assets/{swimlanes-XN3QIQJK-D-9E_RIR.js → swimlanes-XN3QIQJK-Cy2nlOGx.js} +1 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-xTr-HG26.js +8 -0
- package/web-shell/assets/{timeline-definition-24CTP7MA-CT56K-gV.js → timeline-definition-24CTP7MA-B7outYof.js} +1 -1
- package/web-shell/assets/{vennDiagram-4TSXK5OY-B-vi4IyO.js → vennDiagram-4TSXK5OY-Di_u1Ic6.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-VM6X3IG4-C9O7Ju98.js → wardleyDiagram-VM6X3IG4-DYocuCAM.js} +1 -1
- package/web-shell/assets/{xychartDiagram-S5SC5T6Z-6d8w3jg2.js → xychartDiagram-S5SC5T6Z-AADDse54.js} +1 -1
- package/web-shell/index.html +29 -5
- package/chunks/chunk-V7RNNPGC.js +0 -44
- package/chunks/list-JOGBAC2R.js +0 -122
- package/chunks/mcp-6YYNSYLK.js +0 -116
- package/chunks/workflow-HD5NYMW5.js +0 -2907
- package/chunks/workspace-providers-status-MAM42IZS.js +0 -120
- package/web-shell/assets/channel-COIuCrVH.js +0 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-DoX6OYqu.js +0 -1
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-DoX6OYqu.js +0 -1
- package/web-shell/assets/index-CI1ysIEv.js +0 -2154
- package/web-shell/assets/index-CpxXGH-8.css +0 -36
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-IRul-LaT.js +0 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-D6lgKepA.js +0 -8
- package/chunks/{chunk-JA5CBKRP.js → chunk-7NXSVSFB.js} +0 -0
- package/chunks/{open-with-auth-6MVIHMXB.js → open-with-auth-XFCCJOO6.js} +3 -3
|
@@ -0,0 +1,691 @@
|
|
|
1
|
+
// Force strict mode and setup for ESM
|
|
2
|
+
"use strict";
|
|
3
|
+
import {
|
|
4
|
+
DropNoticeThrottle,
|
|
5
|
+
DropReceiptCoalescer,
|
|
6
|
+
getPeerControllerRegistryPath,
|
|
7
|
+
readPeerControllerRegistrySync,
|
|
8
|
+
resolveControllerToken,
|
|
9
|
+
startPeerInbox
|
|
10
|
+
} from "./chunk-GDIPPCW6.js";
|
|
11
|
+
import {
|
|
12
|
+
InboundGate,
|
|
13
|
+
MAX_HELD_MESSAGES,
|
|
14
|
+
PEER_ADMISSION_LIMITS,
|
|
15
|
+
canonicalizeMsgId,
|
|
16
|
+
drainSendPacer,
|
|
17
|
+
forgetSendPacerMessages,
|
|
18
|
+
peerSenderKey,
|
|
19
|
+
refundSendPacerMessage,
|
|
20
|
+
refundSendPacerToken,
|
|
21
|
+
sendDeliveryStatus,
|
|
22
|
+
settleSentPeerMessage
|
|
23
|
+
} from "./chunk-YM6KUQ2S.js";
|
|
24
|
+
import {
|
|
25
|
+
formatPeerDisplay,
|
|
26
|
+
formatPeerEnvelope
|
|
27
|
+
} from "./chunk-OWUAZXXN.js";
|
|
28
|
+
import {
|
|
29
|
+
createDebugLogger
|
|
30
|
+
} from "./chunk-ZAFYHRVY.js";
|
|
31
|
+
import {
|
|
32
|
+
MESSAGING_SOCKET_ENV,
|
|
33
|
+
MESSAGING_TOKEN_ENV,
|
|
34
|
+
clearInheritedPeerMessagingEnv
|
|
35
|
+
} from "./chunk-V5U2NZNJ.js";
|
|
36
|
+
import {
|
|
37
|
+
init_esbuild_shims
|
|
38
|
+
} from "./chunk-5O2XNYP6.js";
|
|
39
|
+
import {
|
|
40
|
+
__name
|
|
41
|
+
} from "./chunk-J2S4EL5Y.js";
|
|
42
|
+
|
|
43
|
+
// packages/cli/src/peerMessaging/peer-messaging.ts
|
|
44
|
+
init_esbuild_shims();
|
|
45
|
+
import { randomBytes } from "node:crypto";
|
|
46
|
+
var debugLogger = createDebugLogger("PEER_MESSAGING");
|
|
47
|
+
var MAX_ACCEPTED_BACKLOG = MAX_HELD_MESSAGES;
|
|
48
|
+
var CLOSE_DROP_FLUSH_BOUND_MS = 1e3;
|
|
49
|
+
var MAX_UNHEARD_DROP_NOTICES = 20;
|
|
50
|
+
var RECEIVER_REFILL_MS = PEER_ADMISSION_LIMITS.bucketCapacity / PEER_ADMISSION_LIMITS.refillPerSecond * 1e3;
|
|
51
|
+
var PeerMessaging = class _PeerMessaging {
|
|
52
|
+
static {
|
|
53
|
+
__name(this, "PeerMessaging");
|
|
54
|
+
}
|
|
55
|
+
inbox = null;
|
|
56
|
+
gate = null;
|
|
57
|
+
updateSessionRegistryIpcPath = /* @__PURE__ */ __name(async () => {
|
|
58
|
+
}, "updateSessionRegistryIpcPath");
|
|
59
|
+
getSessionId = null;
|
|
60
|
+
ownsSessionId = null;
|
|
61
|
+
settleSentMessage = settleSentPeerMessage;
|
|
62
|
+
reassertSessionRecord = null;
|
|
63
|
+
drainMirror = drainSendPacer;
|
|
64
|
+
forgetMirror = forgetSendPacerMessages;
|
|
65
|
+
refundMirror = refundSendPacerMessage;
|
|
66
|
+
refundMirrorToken = refundSendPacerToken;
|
|
67
|
+
receiptListeners = /* @__PURE__ */ new Set();
|
|
68
|
+
dropListeners = /* @__PURE__ */ new Set();
|
|
69
|
+
/** Notices raised before anything subscribed; see `onDropped`. */
|
|
70
|
+
unheardDrops = [];
|
|
71
|
+
/** Folds dropped receipts so a flood draws few connections, not many. */
|
|
72
|
+
dropReceipts = null;
|
|
73
|
+
submitFn = null;
|
|
74
|
+
buffered = [];
|
|
75
|
+
controllerRegistryPath = null;
|
|
76
|
+
validControllerIds = null;
|
|
77
|
+
/**
|
|
78
|
+
* Accepted frames whose 'delivered' receipt has not been earned yet:
|
|
79
|
+
* still buffered here or still queued in the session's input queue.
|
|
80
|
+
* Settled with a corrective receipt at close.
|
|
81
|
+
*/
|
|
82
|
+
outstanding = [];
|
|
83
|
+
queuedPeerCount = null;
|
|
84
|
+
heldListeners = /* @__PURE__ */ new Set();
|
|
85
|
+
listedHeld = null;
|
|
86
|
+
closed = false;
|
|
87
|
+
// Options are consumed by `start`, which wires them into the gate and the
|
|
88
|
+
// inbox; the instance itself holds none of them.
|
|
89
|
+
constructor() {
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Bind the socket and start accepting messages.
|
|
93
|
+
*
|
|
94
|
+
* Returns null when the inbox could not be bound. Callers treat that as
|
|
95
|
+
* "this session is not reachable" and carry on — it is never fatal.
|
|
96
|
+
*/
|
|
97
|
+
static async start(options) {
|
|
98
|
+
if (options.getSessionId && options.ownsSessionId) {
|
|
99
|
+
throw new Error(
|
|
100
|
+
"PeerMessaging: pass getSessionId or ownsSessionId, not both"
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
const messaging = new _PeerMessaging();
|
|
104
|
+
const controllerRegistryPath = options.controllerRegistryPath ?? getPeerControllerRegistryPath();
|
|
105
|
+
messaging.controllerRegistryPath = controllerRegistryPath;
|
|
106
|
+
const dropReceipts = new DropReceiptCoalescer(
|
|
107
|
+
({ frame, reason, droppedMsgIds }) => {
|
|
108
|
+
if (!frame.from) return;
|
|
109
|
+
return sendDeliveryStatus(
|
|
110
|
+
frame.from,
|
|
111
|
+
{
|
|
112
|
+
status: "dropped",
|
|
113
|
+
origMsgId: frame.msgId,
|
|
114
|
+
from: messaging.inbox?.socketPath,
|
|
115
|
+
dropReason: reason,
|
|
116
|
+
droppedMsgIds
|
|
117
|
+
},
|
|
118
|
+
frame.replyToken
|
|
119
|
+
);
|
|
120
|
+
},
|
|
121
|
+
options.dropReceiptTrailMs !== void 0 ? { trailMs: options.dropReceiptTrailMs } : {}
|
|
122
|
+
);
|
|
123
|
+
messaging.dropReceipts = dropReceipts;
|
|
124
|
+
const dropNotices = new DropNoticeThrottle(
|
|
125
|
+
(notice) => messaging.emitDropped(notice)
|
|
126
|
+
);
|
|
127
|
+
const gate = new InboundGate({
|
|
128
|
+
getApprovalMode: options.getApprovalMode,
|
|
129
|
+
getPolicySetting: options.getPolicySetting,
|
|
130
|
+
...options.getHeldExpiryMs !== void 0 ? { getHeldExpiryMs: options.getHeldExpiryMs } : {},
|
|
131
|
+
...options.getPolicyScope ? { getPolicyScope: options.getPolicyScope } : {},
|
|
132
|
+
isControllerValid: /* @__PURE__ */ __name((id) => messaging.validControllerIds?.has(id) ?? true, "isControllerValid"),
|
|
133
|
+
...options.admission ? { admission: options.admission } : {},
|
|
134
|
+
getSessionId: options.getSessionId,
|
|
135
|
+
...options.ownsSessionId ? { ownsSessionId: options.ownsSessionId } : {},
|
|
136
|
+
deliver: /* @__PURE__ */ __name((frame, origin) => messaging.deliver(frame, origin), "deliver"),
|
|
137
|
+
reportDropped: /* @__PURE__ */ __name((frame, reason, origin) => dropReceipts.note(frame, origin ?? { selfSent: false }, reason), "reportDropped"),
|
|
138
|
+
onDropped: /* @__PURE__ */ __name((frame, origin, reason) => dropNotices.note(frame, origin, reason), "onDropped"),
|
|
139
|
+
reportStatus: /* @__PURE__ */ __name((frame, status) => {
|
|
140
|
+
if (!frame.from) return;
|
|
141
|
+
return sendDeliveryStatus(
|
|
142
|
+
frame.from,
|
|
143
|
+
{
|
|
144
|
+
status,
|
|
145
|
+
origMsgId: frame.msgId,
|
|
146
|
+
from: messaging.inbox?.socketPath
|
|
147
|
+
},
|
|
148
|
+
frame.replyToken
|
|
149
|
+
);
|
|
150
|
+
}, "reportStatus"),
|
|
151
|
+
onHeldChange: /* @__PURE__ */ __name((held) => messaging.emitHeldChange(held), "onHeldChange")
|
|
152
|
+
});
|
|
153
|
+
messaging.gate = gate;
|
|
154
|
+
messaging.getSessionId = options.getSessionId ?? null;
|
|
155
|
+
messaging.ownsSessionId = options.ownsSessionId ?? null;
|
|
156
|
+
messaging.settleSentMessage = options.settleSentMessage ?? settleSentPeerMessage;
|
|
157
|
+
messaging.reassertSessionRecord = options.reassertSessionRecord ?? null;
|
|
158
|
+
messaging.drainMirror = options.drainMirror ?? drainSendPacer;
|
|
159
|
+
messaging.forgetMirror = options.forgetMirror ?? forgetSendPacerMessages;
|
|
160
|
+
messaging.refundMirror = options.refundMirror ?? refundSendPacerMessage;
|
|
161
|
+
messaging.refundMirrorToken = options.refundMirrorToken ?? refundSendPacerToken;
|
|
162
|
+
clearInheritedPeerMessagingEnv();
|
|
163
|
+
const ipcToken = options.ipcToken ?? randomBytes(32).toString("hex");
|
|
164
|
+
const childToken = options.childToken ?? randomBytes(32).toString("hex");
|
|
165
|
+
const inbox = await startPeerInbox({
|
|
166
|
+
...options.socketPath !== void 0 ? { socketPath: options.socketPath } : {},
|
|
167
|
+
requiredToken: ipcToken,
|
|
168
|
+
childToken,
|
|
169
|
+
// Read from disk per auth line rather than captured here: a grant
|
|
170
|
+
// the user mints or revokes mid-session must take effect on the
|
|
171
|
+
// next connection, with nothing to restart.
|
|
172
|
+
resolveController: /* @__PURE__ */ __name((presented) => resolveControllerToken(presented, controllerRegistryPath), "resolveController"),
|
|
173
|
+
onFrame: /* @__PURE__ */ __name((frame, auth, controller) => messaging.onFrame(frame, {
|
|
174
|
+
selfSent: auth === "child",
|
|
175
|
+
...controller ? { controller } : {}
|
|
176
|
+
}), "onFrame")
|
|
177
|
+
});
|
|
178
|
+
if (!inbox) return null;
|
|
179
|
+
messaging.inbox = inbox;
|
|
180
|
+
messaging.updateSessionRegistryIpcPath = options.updateSessionRegistryIpcPath;
|
|
181
|
+
await messaging.updateSessionRegistryIpcPath(inbox.socketPath, ipcToken);
|
|
182
|
+
process.env[MESSAGING_SOCKET_ENV] = inbox.socketPath;
|
|
183
|
+
process.env[MESSAGING_TOKEN_ENV] = childToken;
|
|
184
|
+
return messaging;
|
|
185
|
+
}
|
|
186
|
+
get socketPath() {
|
|
187
|
+
return this.inbox?.socketPath;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Register the TUI's submit function and flush anything accepted before
|
|
191
|
+
* the queue existed.
|
|
192
|
+
*/
|
|
193
|
+
setSubmitFn(fn) {
|
|
194
|
+
if (this.closed) return;
|
|
195
|
+
this.withControllerValidity(() => {
|
|
196
|
+
this.submitFn = fn;
|
|
197
|
+
while (this.buffered.length > 0) {
|
|
198
|
+
const head = this.buffered[0];
|
|
199
|
+
if (!head || !this.submit(head.frame, head.origin)) break;
|
|
200
|
+
this.buffered.shift();
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Register a counter for the peer entries still waiting in the
|
|
206
|
+
* session's input queue. At close, that many of the most recently
|
|
207
|
+
* submitted frames are settled alongside the buffered ones: the queue
|
|
208
|
+
* drains in order, so the unconsumed tail is exactly the queue's
|
|
209
|
+
* current depth.
|
|
210
|
+
*/
|
|
211
|
+
setQueuedPeerCount(fn) {
|
|
212
|
+
this.queuedPeerCount = fn;
|
|
213
|
+
}
|
|
214
|
+
getHeld() {
|
|
215
|
+
return this.withControllerValidity(() => this.gate?.getHeld() ?? []);
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* How long a held message has to live, in milliseconds, or null when
|
|
219
|
+
* holds do not expire. Used by `/peers` to show what is left.
|
|
220
|
+
*/
|
|
221
|
+
getHeldExpiryMs() {
|
|
222
|
+
return this.gate?.getHeldExpiryMs() ?? null;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Remember the held entries the `/peers` listing just showed the user.
|
|
226
|
+
*
|
|
227
|
+
* Accept/deny decisions are bound to this snapshot: the held set moves
|
|
228
|
+
* between listing and decision (arrivals, evictions, releases), and a
|
|
229
|
+
* handle that uniquely named the message the user reviewed must not
|
|
230
|
+
* resolve to a different one by decide time. The snapshot pins each
|
|
231
|
+
* entry's `heldAt` as well as its id: once an id's eviction tombstone
|
|
232
|
+
* is pruned from the gate's bounded settled-memory, a peer can re-send
|
|
233
|
+
* it with a swapped body, and only the fresh hold timestamp tells the
|
|
234
|
+
* re-admitted entry apart from the one the user reviewed.
|
|
235
|
+
*/
|
|
236
|
+
recordHeldListing(heldEntries) {
|
|
237
|
+
this.listedHeld = heldEntries.map((entry) => ({
|
|
238
|
+
id: entry.frame.msgId,
|
|
239
|
+
heldAt: entry.heldAt
|
|
240
|
+
}));
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* True when the held set no longer matches the last recorded listing.
|
|
244
|
+
*
|
|
245
|
+
* Entries *leaving* the set are not a change. The expiry timer removes
|
|
246
|
+
* them with no peer or user activity -- a fourth mover the rationale
|
|
247
|
+
* above does not name -- and a shrinking set can never make a printed
|
|
248
|
+
* handle resolve to a different message: `resolveHeld` prefix-matches
|
|
249
|
+
* over the current set, so removing entries only narrows it. Bouncing
|
|
250
|
+
* those refuses a decision that would have been correct, and tells the
|
|
251
|
+
* user the list changed when what they can still uniquely name is
|
|
252
|
+
* exactly what they reviewed.
|
|
253
|
+
*
|
|
254
|
+
* Dropping an expired entry is safe because the gate tombstones it
|
|
255
|
+
* before it leaves the set, so a re-admitted id arrives with a fresh
|
|
256
|
+
* `heldAt` and still mismatches the pin below.
|
|
257
|
+
*
|
|
258
|
+
* What must still bounce: an arrival, and a re-sent id whose body may
|
|
259
|
+
* have been swapped, which the `heldAt` pin is what catches.
|
|
260
|
+
*/
|
|
261
|
+
heldSetChangedSinceListing() {
|
|
262
|
+
const listed = this.listedHeld;
|
|
263
|
+
if (listed === null) return true;
|
|
264
|
+
const pinned = new Map(listed.map((entry) => [entry.id, entry.heldAt]));
|
|
265
|
+
const current = this.getHeld();
|
|
266
|
+
if (current.some((entry) => pinned.get(entry.frame.msgId) !== entry.heldAt))
|
|
267
|
+
return true;
|
|
268
|
+
const liveIds = current.map(
|
|
269
|
+
(entry) => canonicalizeMsgId(entry.frame.msgId)
|
|
270
|
+
);
|
|
271
|
+
const liveSet = new Set(liveIds);
|
|
272
|
+
for (const id of pinned.keys()) {
|
|
273
|
+
const departed = canonicalizeMsgId(id);
|
|
274
|
+
if (liveSet.has(departed)) continue;
|
|
275
|
+
if (liveIds.some((live) => live.startsWith(departed))) return true;
|
|
276
|
+
}
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
decide(msgId, decision) {
|
|
280
|
+
return this.withControllerValidity(
|
|
281
|
+
() => this.gate?.decide(msgId, decision) ?? "gone"
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
/** Remove a revoked grant's authority from messages already waiting. */
|
|
285
|
+
forgetController(id) {
|
|
286
|
+
return this.withControllerValidity(
|
|
287
|
+
() => this.gate?.forgetController(id) ?? 0
|
|
288
|
+
);
|
|
289
|
+
}
|
|
290
|
+
/** Release everything the gate now considers acceptable. */
|
|
291
|
+
reevaluate(reason) {
|
|
292
|
+
return this.withControllerValidity(
|
|
293
|
+
() => this.gate?.reevaluate(reason) ?? 0
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
onHeldChange(listener) {
|
|
297
|
+
this.heldListeners.add(listener);
|
|
298
|
+
try {
|
|
299
|
+
listener(this.getHeld());
|
|
300
|
+
} catch (error) {
|
|
301
|
+
debugLogger.debug(
|
|
302
|
+
`held-change listener threw: ${error instanceof Error ? error.message : String(error)}`
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
return () => this.heldListeners.delete(listener);
|
|
306
|
+
}
|
|
307
|
+
/** Subscribe to receipts for messages this session sent. */
|
|
308
|
+
onReceipt(listener) {
|
|
309
|
+
this.receiptListeners.add(listener);
|
|
310
|
+
return () => this.receiptListeners.delete(listener);
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Subscribe to notices about messages this session turned away.
|
|
314
|
+
*
|
|
315
|
+
* Already throttled when they get here: one per sender per minute,
|
|
316
|
+
* carrying the count of what it stands for.
|
|
317
|
+
*/
|
|
318
|
+
onDropped(listener) {
|
|
319
|
+
const first = this.dropListeners.size === 0;
|
|
320
|
+
this.dropListeners.add(listener);
|
|
321
|
+
if (first && this.unheardDrops.length > 0) {
|
|
322
|
+
const unheard = this.unheardDrops.splice(0, this.unheardDrops.length);
|
|
323
|
+
for (const notice of unheard) {
|
|
324
|
+
try {
|
|
325
|
+
listener(notice);
|
|
326
|
+
} catch (error) {
|
|
327
|
+
debugLogger.debug(
|
|
328
|
+
`drop listener threw on replay: ${error instanceof Error ? error.message : String(error)}`
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return () => this.dropListeners.delete(listener);
|
|
334
|
+
}
|
|
335
|
+
emitDropped(notice) {
|
|
336
|
+
if (this.dropListeners.size === 0) {
|
|
337
|
+
if (this.unheardDrops.length < MAX_UNHEARD_DROP_NOTICES) {
|
|
338
|
+
this.unheardDrops.push(notice);
|
|
339
|
+
}
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
for (const listener of this.dropListeners) {
|
|
343
|
+
try {
|
|
344
|
+
listener(notice);
|
|
345
|
+
} catch (error) {
|
|
346
|
+
debugLogger.debug(
|
|
347
|
+
`drop listener threw: ${error instanceof Error ? error.message : String(error)}`
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
emitReceipt(receipt) {
|
|
353
|
+
for (const listener of this.receiptListeners) {
|
|
354
|
+
try {
|
|
355
|
+
listener(receipt);
|
|
356
|
+
} catch (error) {
|
|
357
|
+
debugLogger.debug(
|
|
358
|
+
`receipt listener threw: ${error instanceof Error ? error.message : String(error)}`
|
|
359
|
+
);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
async close() {
|
|
364
|
+
if (this.closed) return;
|
|
365
|
+
this.closed = true;
|
|
366
|
+
const shuttingDown = this.gate?.shutdown();
|
|
367
|
+
await this.inbox?.close();
|
|
368
|
+
await shuttingDown;
|
|
369
|
+
await this.settleUnconsumed();
|
|
370
|
+
clearInheritedPeerMessagingEnv();
|
|
371
|
+
await this.updateSessionRegistryIpcPath(void 0);
|
|
372
|
+
await this.dropReceipts?.flush(CLOSE_DROP_FLUSH_BOUND_MS);
|
|
373
|
+
this.dropReceipts?.dispose();
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Correct the 'delivered' receipts of accepted messages the session
|
|
377
|
+
* never consumed. Without this, a sender told "delivered" about a
|
|
378
|
+
* message that dies in the buffer or the input queue at exit cannot
|
|
379
|
+
* tell that from "delivered and read" — the distinction the receipts
|
|
380
|
+
* exist to carry.
|
|
381
|
+
*/
|
|
382
|
+
async settleUnconsumed() {
|
|
383
|
+
const queued = this.queuedPeerCount?.() ?? 0;
|
|
384
|
+
const dropped = this.outstanding.slice(
|
|
385
|
+
Math.max(0, this.outstanding.length - this.buffered.length - queued)
|
|
386
|
+
);
|
|
387
|
+
const receipts = dropped.filter((frame) => frame.from !== void 0).map(
|
|
388
|
+
(frame) => sendDeliveryStatus(
|
|
389
|
+
frame.from,
|
|
390
|
+
{
|
|
391
|
+
status: "expired",
|
|
392
|
+
origMsgId: frame.msgId,
|
|
393
|
+
from: this.inbox?.socketPath
|
|
394
|
+
},
|
|
395
|
+
frame.replyToken
|
|
396
|
+
)
|
|
397
|
+
);
|
|
398
|
+
await Promise.allSettled(receipts);
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Apply a receipt that says a burst of this session's messages was
|
|
402
|
+
* turned away at the far inbox.
|
|
403
|
+
*
|
|
404
|
+
* Every id it names is settled, but only ids this session actually sent
|
|
405
|
+
* and has not settled already — the same rule every other receipt
|
|
406
|
+
* follows, applied to a list. A receipt that moves nothing is noise
|
|
407
|
+
* from a stranger, or a repeat, and says nothing to the user.
|
|
408
|
+
*
|
|
409
|
+
* One notice for the whole batch: the point of folding the receipt was
|
|
410
|
+
* that a flood must not become a flood of lines, and unfolding it here
|
|
411
|
+
* would undo that.
|
|
412
|
+
*/
|
|
413
|
+
onDroppedReceipt(frame) {
|
|
414
|
+
const ids = [frame.origMsgId, ...frame.droppedMsgIds ?? []];
|
|
415
|
+
let first;
|
|
416
|
+
let settledCount = 0;
|
|
417
|
+
const settledByPath = /* @__PURE__ */ new Map();
|
|
418
|
+
for (const id of ids) {
|
|
419
|
+
const settled = this.settleSentMessage(id, "dropped");
|
|
420
|
+
if (!settled) continue;
|
|
421
|
+
first ??= settled;
|
|
422
|
+
settledCount += 1;
|
|
423
|
+
const entry = settledByPath.get(settled.ipcPath) ?? {
|
|
424
|
+
ids: [],
|
|
425
|
+
freshestAgeMs: Number.POSITIVE_INFINITY
|
|
426
|
+
};
|
|
427
|
+
entry.ids.push(id);
|
|
428
|
+
entry.freshestAgeMs = Math.min(entry.freshestAgeMs, settled.ageMs);
|
|
429
|
+
settledByPath.set(settled.ipcPath, entry);
|
|
430
|
+
}
|
|
431
|
+
if (!first) {
|
|
432
|
+
debugLogger.debug(
|
|
433
|
+
`ignoring dropped receipt for ${frame.origMsgId}: unknown message or repeated receipt`
|
|
434
|
+
);
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
debugLogger.debug(
|
|
438
|
+
`dropped receipt from ${first.address} (${frame.dropReason ?? "unspecified"}) settled ${settledCount} message(s)`
|
|
439
|
+
);
|
|
440
|
+
if (frame.dropReason === "duplicate") {
|
|
441
|
+
for (const [ipcPath, entry] of settledByPath) {
|
|
442
|
+
for (const id of entry.ids) this.refundMirrorToken(ipcPath, id);
|
|
443
|
+
}
|
|
444
|
+
} else {
|
|
445
|
+
for (const [ipcPath, entry] of settledByPath) {
|
|
446
|
+
this.forgetMirror(ipcPath, entry.ids);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
if (frame.dropReason === "rate-limited") {
|
|
450
|
+
for (const [ipcPath, entry] of settledByPath) {
|
|
451
|
+
if (entry.freshestAgeMs <= RECEIVER_REFILL_MS)
|
|
452
|
+
this.drainMirror(ipcPath);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
this.emitReceipt({
|
|
456
|
+
status: "dropped",
|
|
457
|
+
address: first.address,
|
|
458
|
+
origMsgId: frame.origMsgId,
|
|
459
|
+
// A drop can only follow `pending`; the ledger enforced that above.
|
|
460
|
+
previous: "pending",
|
|
461
|
+
...frame.dropReason ? { dropReason: frame.dropReason } : {},
|
|
462
|
+
dropped: settledCount
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* `origin` is what the transport established from the connection's auth
|
|
467
|
+
* line — the child token, or a controller grant the user minted. None
|
|
468
|
+
* of it is ever read off the frame.
|
|
469
|
+
*/
|
|
470
|
+
onFrame(frame, origin) {
|
|
471
|
+
if (frame.type === "control") {
|
|
472
|
+
if (frame.status === "dropped") {
|
|
473
|
+
this.onDroppedReceipt(frame);
|
|
474
|
+
return;
|
|
475
|
+
}
|
|
476
|
+
const settled = this.settleSentMessage(frame.origMsgId, frame.status);
|
|
477
|
+
if (!settled) {
|
|
478
|
+
debugLogger.debug(
|
|
479
|
+
`ignoring delivery status ${frame.status} for ${frame.origMsgId}: unknown message or repeated receipt`
|
|
480
|
+
);
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
debugLogger.debug(
|
|
484
|
+
`delivery status from ${settled.address}: ${settled.previous} -> ${frame.status} for ${frame.origMsgId}`
|
|
485
|
+
);
|
|
486
|
+
if (frame.status !== "held" && frame.status !== "delivered") {
|
|
487
|
+
if (frame.status === "misaddressed") {
|
|
488
|
+
this.refundMirror(settled.ipcPath, frame.origMsgId);
|
|
489
|
+
} else {
|
|
490
|
+
this.forgetMirror(settled.ipcPath, [frame.origMsgId]);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
this.emitReceipt({
|
|
494
|
+
status: frame.status,
|
|
495
|
+
address: settled.address,
|
|
496
|
+
origMsgId: frame.origMsgId,
|
|
497
|
+
previous: settled.previous
|
|
498
|
+
});
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
const ownSessionId = this.getSessionId?.();
|
|
502
|
+
const ownsSessionId = this.ownsSessionId;
|
|
503
|
+
const misaddressed = ownsSessionId ? (
|
|
504
|
+
// Hosting several sessions: a frame has to say which, and name one
|
|
505
|
+
// this process still holds.
|
|
506
|
+
frame.toSessionId === void 0 || !ownsSessionId(frame.toSessionId)
|
|
507
|
+
) : frame.toSessionId !== void 0 && ownSessionId !== void 0 && frame.toSessionId !== ownSessionId;
|
|
508
|
+
if (misaddressed) {
|
|
509
|
+
debugLogger.debug(
|
|
510
|
+
`refusing peer message ${frame.msgId}: addressed to session ${frame.toSessionId ?? "(unspecified)"}, this process does not hold it`
|
|
511
|
+
);
|
|
512
|
+
if (frame.from) {
|
|
513
|
+
void sendDeliveryStatus(
|
|
514
|
+
frame.from,
|
|
515
|
+
{
|
|
516
|
+
status: "misaddressed",
|
|
517
|
+
origMsgId: frame.msgId,
|
|
518
|
+
from: this.inbox?.socketPath
|
|
519
|
+
},
|
|
520
|
+
frame.replyToken
|
|
521
|
+
);
|
|
522
|
+
}
|
|
523
|
+
void this.reassertSessionRecord?.().catch((error) => {
|
|
524
|
+
debugLogger.debug(
|
|
525
|
+
`re-asserting the session record failed: ${error instanceof Error ? error.message : String(error)}`
|
|
526
|
+
);
|
|
527
|
+
});
|
|
528
|
+
return;
|
|
529
|
+
}
|
|
530
|
+
this.gate?.admit(frame, origin);
|
|
531
|
+
}
|
|
532
|
+
deliver(frame, origin) {
|
|
533
|
+
if (!this.submitFn) {
|
|
534
|
+
if (this.buffered.length >= MAX_ACCEPTED_BACKLOG) {
|
|
535
|
+
throw new Error("accepted-message backlog is full");
|
|
536
|
+
}
|
|
537
|
+
this.buffered.push({ frame, origin });
|
|
538
|
+
this.trackOutstanding(frame);
|
|
539
|
+
return;
|
|
540
|
+
}
|
|
541
|
+
if (this.buffered.length > 0) {
|
|
542
|
+
this.withControllerValidity(() => {
|
|
543
|
+
while (this.buffered.length > 0) {
|
|
544
|
+
const head = this.buffered[0];
|
|
545
|
+
if (!head || !this.submit(head.frame, head.origin)) {
|
|
546
|
+
throw new Error("accepted-message backlog is full");
|
|
547
|
+
}
|
|
548
|
+
this.buffered.shift();
|
|
549
|
+
}
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
if (!this.submit(frame, origin)) {
|
|
553
|
+
throw new Error("accepted-message backlog is full");
|
|
554
|
+
}
|
|
555
|
+
this.trackOutstanding(frame);
|
|
556
|
+
}
|
|
557
|
+
trackOutstanding(frame) {
|
|
558
|
+
this.outstanding.push(frame);
|
|
559
|
+
while (this.outstanding.length > 2 * MAX_ACCEPTED_BACKLOG) {
|
|
560
|
+
this.outstanding.shift();
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
withControllerValidity(action) {
|
|
564
|
+
if (this.controllerRegistryPath === null || this.validControllerIds) {
|
|
565
|
+
return action();
|
|
566
|
+
}
|
|
567
|
+
this.validControllerIds = new Set(
|
|
568
|
+
readPeerControllerRegistrySync(
|
|
569
|
+
this.controllerRegistryPath
|
|
570
|
+
).controllers.map((controller) => controller.id)
|
|
571
|
+
);
|
|
572
|
+
for (const delivery of this.buffered) {
|
|
573
|
+
const controller = delivery.origin.controller;
|
|
574
|
+
if (controller && !this.validControllerIds.has(controller.id)) {
|
|
575
|
+
delete delivery.origin.controller;
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
try {
|
|
579
|
+
return action();
|
|
580
|
+
} finally {
|
|
581
|
+
this.validControllerIds = null;
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
submit(frame, origin) {
|
|
585
|
+
const from = frame.from ?? (origin.controller ? "controller" : origin.selfSent ? "own process" : "unknown session");
|
|
586
|
+
const attribution = {
|
|
587
|
+
selfSent: origin.selfSent,
|
|
588
|
+
...origin.controller ? { controller: origin.controller } : {}
|
|
589
|
+
};
|
|
590
|
+
return this.submitFn?.(
|
|
591
|
+
formatPeerEnvelope({
|
|
592
|
+
from,
|
|
593
|
+
...frame.fromName !== void 0 ? { fromName: frame.fromName } : {},
|
|
594
|
+
content: frame.message.content,
|
|
595
|
+
...attribution
|
|
596
|
+
}),
|
|
597
|
+
formatPeerDisplay({
|
|
598
|
+
from,
|
|
599
|
+
...frame.fromName !== void 0 ? { fromName: frame.fromName } : {},
|
|
600
|
+
content: frame.message.content,
|
|
601
|
+
...attribution
|
|
602
|
+
}),
|
|
603
|
+
{
|
|
604
|
+
msgId: frame.msgId,
|
|
605
|
+
admissionKey: peerSenderKey(frame, origin),
|
|
606
|
+
...frame.from !== void 0 ? { from: frame.from } : {},
|
|
607
|
+
...frame.replyToken !== void 0 ? { replyToken: frame.replyToken } : {},
|
|
608
|
+
...frame.toSessionId !== void 0 ? { toSessionId: frame.toSessionId } : {}
|
|
609
|
+
}
|
|
610
|
+
) ?? false;
|
|
611
|
+
}
|
|
612
|
+
/** Drop a queued frame if an in-process session swap invalidated its pin. */
|
|
613
|
+
drainQueuedFrame(delivery) {
|
|
614
|
+
const ownSessionId = this.getSessionId?.();
|
|
615
|
+
if (delivery?.toSessionId === void 0 || ownSessionId === void 0 || delivery.toSessionId === ownSessionId) {
|
|
616
|
+
return true;
|
|
617
|
+
}
|
|
618
|
+
debugLogger.debug(
|
|
619
|
+
`dropping queued peer message ${delivery.msgId}: addressed to session ${delivery.toSessionId}, this is ${ownSessionId}`
|
|
620
|
+
);
|
|
621
|
+
if (delivery.from) {
|
|
622
|
+
void sendDeliveryStatus(
|
|
623
|
+
delivery.from,
|
|
624
|
+
{
|
|
625
|
+
status: "misaddressed",
|
|
626
|
+
origMsgId: delivery.msgId,
|
|
627
|
+
from: this.inbox?.socketPath
|
|
628
|
+
},
|
|
629
|
+
delivery.replyToken
|
|
630
|
+
);
|
|
631
|
+
}
|
|
632
|
+
if (delivery.admissionKey !== void 0) {
|
|
633
|
+
this.gate?.forgetAdmittedMessage(delivery.admissionKey, delivery.msgId);
|
|
634
|
+
}
|
|
635
|
+
return false;
|
|
636
|
+
}
|
|
637
|
+
emitHeldChange(held) {
|
|
638
|
+
for (const listener of this.heldListeners) {
|
|
639
|
+
try {
|
|
640
|
+
listener(held);
|
|
641
|
+
} catch (error) {
|
|
642
|
+
debugLogger.debug(
|
|
643
|
+
`held-change listener threw: ${error instanceof Error ? error.message : String(error)}`
|
|
644
|
+
);
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
};
|
|
649
|
+
|
|
650
|
+
// packages/cli/src/utils/classify-api-error.ts
|
|
651
|
+
init_esbuild_shims();
|
|
652
|
+
function classifyApiError(error) {
|
|
653
|
+
const status = error.status;
|
|
654
|
+
const message = error.message?.toLowerCase() ?? "";
|
|
655
|
+
if (status === 429 || message.includes("rate limit")) {
|
|
656
|
+
return "rate_limit";
|
|
657
|
+
}
|
|
658
|
+
if (status === 401 || message.includes("unauthorized")) {
|
|
659
|
+
return "authentication_failed";
|
|
660
|
+
}
|
|
661
|
+
if (status === 402 || status === 403 || message.includes("billing") || message.includes("quota")) {
|
|
662
|
+
return "billing_error";
|
|
663
|
+
}
|
|
664
|
+
if (status === 400 || message.includes("invalid")) {
|
|
665
|
+
return "invalid_request";
|
|
666
|
+
}
|
|
667
|
+
if (status !== void 0 && status >= 500) {
|
|
668
|
+
return "server_error";
|
|
669
|
+
}
|
|
670
|
+
if (message.includes("max_tokens") || message.includes("token limit")) {
|
|
671
|
+
return "max_output_tokens";
|
|
672
|
+
}
|
|
673
|
+
return "unknown";
|
|
674
|
+
}
|
|
675
|
+
__name(classifyApiError, "classifyApiError");
|
|
676
|
+
|
|
677
|
+
export {
|
|
678
|
+
classifyApiError,
|
|
679
|
+
MAX_ACCEPTED_BACKLOG,
|
|
680
|
+
PeerMessaging
|
|
681
|
+
};
|
|
682
|
+
/**
|
|
683
|
+
* @license
|
|
684
|
+
* Copyright 2026 Qwen
|
|
685
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
686
|
+
*/
|
|
687
|
+
/**
|
|
688
|
+
* @license
|
|
689
|
+
* Copyright 2025 Google LLC
|
|
690
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
691
|
+
*/
|