@qwen-code/qwen-code 0.23.1 → 0.23.2-nightly.20260909.2e212144d3
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/qc-helper/docs/configuration/auth.md +1 -1
- package/bundled/qc-helper/docs/configuration/model-providers.md +19 -15
- package/bundled/qc-helper/docs/configuration/settings.md +1 -1
- package/bundled/qc-helper/docs/features/_meta.ts +1 -0
- package/bundled/qc-helper/docs/features/channels/dingtalk.md +1 -1
- package/bundled/qc-helper/docs/features/channels/github.md +1 -9
- package/bundled/qc-helper/docs/features/channels/overview.md +26 -51
- package/bundled/qc-helper/docs/features/channels/qqbot.md +1 -2
- package/bundled/qc-helper/docs/features/commands.md +79 -17
- package/bundled/qc-helper/docs/features/computer-use.md +1 -1
- package/bundled/qc-helper/docs/features/cross-session-protocol.md +291 -0
- package/bundled/qc-helper/docs/features/goals.md +3 -1
- package/bundled/qc-helper/docs/features/sub-agents.md +8 -0
- package/bundled/qc-helper/docs/qwen-serve.md +62 -48
- package/chunks/{MaxSizedBox-UDO6Y7RB.js → MaxSizedBox-ZBGWYJZW.js} +20 -19
- package/chunks/{StandaloneSessionPicker-D4CUOO4H.js → StandaloneSessionPicker-NR5ACIJZ.js} +35 -34
- package/chunks/{acpAgent-KWLJFADK.js → acpAgent-DM6XRCDQ.js} +307 -183
- package/chunks/{agent-GSUPGEOL.js → agent-EF3IIYE3.js} +13 -13
- package/chunks/{agent-headless-HNYCQUJB.js → agent-headless-5J2KFYR4.js} +13 -13
- package/chunks/{anthropicContentGenerator-I7LQZH26.js → anthropicContentGenerator-VIW2FG7G.js} +4 -4
- package/chunks/{artifact-tool-P52OKKEF.js → artifact-tool-G5LHNECG.js} +1 -1
- package/chunks/{askUserQuestion-I5W5S3D6.js → askUserQuestion-R3TXY77M.js} +1 -1
- package/chunks/{bridge-B7CV6RVI.js → bridge-LEMQM6QE.js} +21 -20
- package/chunks/{channel-management-service-TRTLQTSV.js → channel-management-service-TGF6XFXT.js} +4 -4
- package/chunks/{channel-settings-store-FW45IRUP.js → channel-settings-store-FV365JSF.js} +29 -28
- package/chunks/{channel-worker-group-PIYPVCTF.js → channel-worker-group-SQ5FRWOH.js} +5 -5
- package/chunks/{channel-worker-manager-FQHEDTD2.js → channel-worker-manager-TU4ZNWOE.js} +5 -5
- package/chunks/{channel-worker-supervisor-XJPZZ3VK.js → channel-worker-supervisor-EMITFMCP.js} +4 -4
- package/chunks/{chunk-3SH53ANB.js → chunk-22GORRNY.js} +12 -0
- package/chunks/{chunk-3LPJ776W.js → chunk-2HYOOFDS.js} +9 -6
- package/chunks/{chunk-S6QVI3MV.js → chunk-34VPADLG.js} +2 -2
- package/chunks/{chunk-WJDXKQIO.js → chunk-3A2IMUDH.js} +14 -2
- package/chunks/{chunk-DXQ6Z7AH.js → chunk-3O77M472.js} +224 -84
- package/chunks/{chunk-5CVY5Q2P.js → chunk-43EUMPKQ.js} +1 -1
- package/chunks/{chunk-ZNO5BUAD.js → chunk-4DIMJKWU.js} +46 -37
- package/chunks/{chunk-O2JBJQCF.js → chunk-5HV2HPO7.js} +1 -1
- package/chunks/{chunk-RXT4QBDX.js → chunk-5WBA3DEF.js} +1 -1
- package/chunks/{chunk-ARYNBBBM.js → chunk-6GAYNM3F.js} +3 -3
- package/chunks/{chunk-EEKU6COG.js → chunk-6S7YYUUH.js} +3 -3
- package/chunks/{chunk-OPMKGOLD.js → chunk-6VIATHL7.js} +1 -1
- package/chunks/{chunk-ENZDGHGJ.js → chunk-76I36BEM.js} +3 -3
- package/chunks/{chunk-B54PFQS5.js → chunk-7CLLH5TI.js} +1 -1
- package/chunks/{chunk-UHUT4IDM.js → chunk-7IDZFJAV.js} +9 -9
- package/chunks/{chunk-5Z4FCEPY.js → chunk-7K4GGN3D.js} +606 -109
- package/chunks/{chunk-ZPL2TZNA.js → chunk-7KZVXJ4U.js} +1 -1
- package/chunks/{chunk-FWRRUITH.js → chunk-7WCJEY3A.js} +4 -4
- package/chunks/{chunk-MFYH2VXV.js → chunk-A7QZIGRB.js} +2 -2
- package/chunks/{chunk-27LTEY6D.js → chunk-ATBLEXXV.js} +7 -2
- package/chunks/{chunk-3BTHHXXE.js → chunk-AUTUFD5X.js} +1 -1
- package/chunks/chunk-AXMWHKXA.js +42 -0
- package/chunks/{chunk-QZOXVQPK.js → chunk-AXWTG6R7.js} +2 -5
- package/chunks/{chunk-PDUMGZ2P.js → chunk-BDAVT6K2.js} +486 -409
- package/chunks/{chunk-2YS3NU4A.js → chunk-BDP3NTWD.js} +3 -3
- package/chunks/{chunk-IKG2YVRZ.js → chunk-BZUHZCUO.js} +2 -2
- package/chunks/{chunk-USN6VNTO.js → chunk-C24ZDDNY.js} +1 -1
- package/chunks/{chunk-RPFJJ33Z.js → chunk-CALTQWTZ.js} +1 -1
- package/chunks/{chunk-BF3RUIVP.js → chunk-CH2YDT6X.js} +36 -38
- package/chunks/{chunk-3VDLQUR2.js → chunk-D6AGS266.js} +1 -1
- package/chunks/{chunk-DO5SMV52.js → chunk-D7DFZAK2.js} +17 -11
- package/chunks/{chunk-GM44O6F7.js → chunk-DARWOZY6.js} +1 -1
- package/chunks/{chunk-HUX2DOTF.js → chunk-DGNRLJ6S.js} +3 -3
- package/chunks/{chunk-FW4E4QPG.js → chunk-DVOCOIS5.js} +1 -1
- package/chunks/{chunk-OESZTXTG.js → chunk-E4LXNQAK.js} +1 -1
- package/chunks/{chunk-TWAMIEQ2.js → chunk-EATP5QCN.js} +16 -18
- package/chunks/{chunk-DZ6D4B3K.js → chunk-EDSU3VUG.js} +12 -5
- package/chunks/{chunk-EOET4H7C.js → chunk-EE5ZD4XU.js} +3 -3
- package/chunks/{chunk-B3EL44K3.js → chunk-EN3Q2S3J.js} +3 -3
- package/chunks/{chunk-N7YQEKGX.js → chunk-EOLGAQ25.js} +16 -15
- package/chunks/{chunk-3YQMUBTS.js → chunk-EYCW6UF2.js} +7 -7
- package/chunks/{chunk-ZELCTN6Y.js → chunk-F23YN37B.js} +10 -0
- package/chunks/{chunk-FPGTNKCP.js → chunk-F3M6P6IQ.js} +199 -1
- package/chunks/{chunk-B44JBZBB.js → chunk-F4SAL7WM.js} +91 -3
- package/chunks/{chunk-XZ3Z43XL.js → chunk-FEEVHJOR.js} +3 -3
- package/chunks/{chunk-CHVU543W.js → chunk-FN4KHWCL.js} +1 -1
- package/chunks/{chunk-6QV7Z74P.js → chunk-FRS3P7MQ.js} +15 -2
- package/chunks/{chunk-FDOGGKAA.js → chunk-GSFV5RQW.js} +2 -0
- package/chunks/{chunk-XBVNNDPK.js → chunk-GSYD7MYP.js} +8 -3
- package/chunks/{chunk-VF6D6EGV.js → chunk-HSO6D4KX.js} +82 -25
- package/chunks/{chunk-L7V52QEZ.js → chunk-HUJJFSMO.js} +10 -10
- package/chunks/{chunk-CIKL2DQP.js → chunk-HW4MRP4V.js} +1 -1
- package/chunks/{chunk-TWWS7XUW.js → chunk-HWLLUDIA.js} +108 -16
- package/chunks/{chunk-75LBC7SV.js → chunk-IKK6NNS6.js} +32 -29
- package/chunks/{chunk-UXDVUFKU.js → chunk-JFAGT5YG.js} +2 -2
- package/chunks/{chunk-6SADVYQQ.js → chunk-JGTMTJSQ.js} +1 -1
- package/chunks/{chunk-45ROPFQY.js → chunk-JYGIJA4W.js} +1 -1
- package/chunks/{chunk-5WC2ECUK.js → chunk-KECCLCXM.js} +42 -8
- package/chunks/{chunk-CABDNUJ4.js → chunk-KEPC5BOL.js} +5 -5
- package/chunks/{chunk-WNISCNTA.js → chunk-L5VHJYHH.js} +2 -2
- package/chunks/{chunk-25CBAK3H.js → chunk-LKBOBUA2.js} +2 -2
- package/chunks/{chunk-6QILGINT.js → chunk-LOBKNYPR.js} +2 -2
- package/chunks/{chunk-2ZFO5JD7.js → chunk-LOVGQ3HZ.js} +9 -9
- package/chunks/{chunk-QK4K76T6.js → chunk-MUF4UGPB.js} +2 -2
- package/chunks/{chunk-JGDRB4FP.js → chunk-N3Z6Q7KC.js} +125 -10
- package/chunks/chunk-NFXXBWSE.js +463 -0
- package/chunks/{chunk-PQSCGZT2.js → chunk-NPKCVSXX.js} +26 -2
- package/chunks/{chunk-YCEKI7QX.js → chunk-NV4YYXFT.js} +1 -1
- package/chunks/{chunk-5IL2BZHW.js → chunk-O6BFERWN.js} +3 -3
- package/chunks/{chunk-TGC4264Q.js → chunk-OVTPETDL.js} +5 -5
- package/chunks/chunk-PLEBBGHL.js +1401 -0
- package/chunks/{chunk-3VWPPK5Q.js → chunk-PWR6BQ3U.js} +4 -4
- package/chunks/{chunk-D6AQNMUA.js → chunk-QA2B26PL.js} +3 -3
- package/chunks/{chunk-NFIDVZND.js → chunk-QB3KS3N3.js} +2 -21
- package/chunks/{chunk-LNCNUMJ5.js → chunk-SK6VACCM.js} +558 -158
- package/chunks/{chunk-YAC7H4K3.js → chunk-SM66GFKJ.js} +1 -1
- package/chunks/{chunk-MA5OUNN6.js → chunk-SNMUO5Z7.js} +1 -1
- package/chunks/{chunk-IRKQ4YYX.js → chunk-SVWWF5TZ.js} +29 -1
- package/chunks/{chunk-6JXHO7LG.js → chunk-SYKPMH2X.js} +3 -3
- package/chunks/{chunk-5HBA2Z7V.js → chunk-TGNNLRC3.js} +2 -3
- package/chunks/{chunk-EHTKOO6W.js → chunk-TRQNRP2H.js} +2 -2
- package/chunks/{chunk-LZGFVUWZ.js → chunk-UQOP2APG.js} +4 -24
- package/chunks/{chunk-T2IHCZLS.js → chunk-VAWM3A5N.js} +1 -1
- package/chunks/{chunk-M73KHGNR.js → chunk-VJJXG73H.js} +404 -226
- package/chunks/{chunk-WAASYFPK.js → chunk-VJWJOKOQ.js} +2 -2
- package/chunks/{chunk-WQMUGQ6G.js → chunk-VR6Y23FW.js} +1 -1
- package/chunks/{chunk-E7XSUYCZ.js → chunk-VX2NR3SD.js} +19 -4
- package/chunks/{chunk-XVTCSVBK.js → chunk-WDVV3LRM.js} +193 -169
- package/chunks/{chunk-RNYENHN5.js → chunk-WEU6O6VN.js} +2 -2
- package/chunks/{chunk-YHDGABDC.js → chunk-XKBFYTCD.js} +1 -1
- package/chunks/{chunk-66JBCTJF.js → chunk-Y7YHAY32.js} +23 -6
- package/chunks/{chunk-7SL55L5H.js → chunk-YIE6REQ5.js} +20 -15
- package/chunks/{chunk-ZU2T5JIS.js → chunk-ZEFWBG2C.js} +736 -1148
- package/chunks/{chunk-6TPVIESH.js → chunk-ZM2TCZZ7.js} +3 -3
- package/chunks/{chunk-2TMJRF46.js → chunk-ZZ7RVOTU.js} +50 -18
- package/chunks/{config-utils-KTDSQ4MU.js → config-utils-SXFK3G4X.js} +24 -23
- package/chunks/{contextCommand-UQ3KRYGK.js → contextCommand-QFPD26QO.js} +21 -20
- package/chunks/{core-runtime-JR34JAFH.js → core-runtime-VXKNBODM.js} +26 -24
- package/chunks/{create-sub-session-RGPJOI4S.js → create-sub-session-7WSQETFR.js} +20 -19
- package/chunks/{daemon-UI6SQSBV.js → daemon-U2456K5H.js} +2 -2
- package/chunks/{daemon-git-worktree-guard-H3OA26KQ.js → daemon-git-worktree-guard-I4DCSDUS.js} +20 -19
- package/chunks/{daemon-status-provider-6WZLKSZU.js → daemon-status-provider-5UV56RI4.js} +25 -24
- package/chunks/{daemon-trust-policy-3EDP2BYD.js → daemon-trust-policy-DKIBWTKU.js} +25 -24
- package/chunks/{daemon-trust-policy-monitor-CRHZPK52.js → daemon-trust-policy-monitor-CPSD7UKT.js} +25 -24
- package/chunks/{deferred-core-runtime-LO5NTQQ4.js → deferred-core-runtime-D2RF35BL.js} +20 -19
- package/chunks/{dist-STAGIFNB.js → dist-6YDUH3BB.js} +388 -102
- package/chunks/{dist-XJ25G6OH.js → dist-BNQVF565.js} +2 -8
- package/chunks/{dist-NQ2636VT.js → dist-F34J4FZX.js} +1 -1
- package/chunks/{dist-OR2ZQTXZ.js → dist-F6JLAJLE.js} +1 -1
- package/chunks/{dist-24TCWK5H.js → dist-K5GHMXIG.js} +2 -2
- package/chunks/{dist-WZTUKIDR.js → dist-NP7QKLVG.js} +2 -2
- package/chunks/{dist-M4CBX53H.js → dist-UFTFGI6I.js} +1 -1
- package/chunks/{dist-5I4HLUTO.js → dist-XLV33CLY.js} +1 -2
- package/chunks/{dist-FDISN4AK.js → dist-ZDNJK74R.js} +3 -7
- package/chunks/{edit-LB7Z7XK5.js → edit-4IBADZ3O.js} +13 -13
- package/chunks/{enterPlanMode-P6TVUFIY.js → enterPlanMode-YN3GPQU5.js} +13 -13
- package/chunks/{environment-QATJNNKI.js → environment-E272IJMF.js} +22 -21
- package/chunks/{errors-3XJ37PS2.js → errors-CVAH3RWQ.js} +22 -21
- package/chunks/{exitPlanMode-A3OKL5UO.js → exitPlanMode-24J5IHGC.js} +13 -13
- package/chunks/{fast-path-DBIT5YQQ.js → fast-path-M5IDBMXF.js} +3 -3
- package/chunks/{glob-73EDTXUE.js → glob-ERBD7JYP.js} +13 -13
- package/chunks/{goal-tools-DFI6YMSD.js → goal-tools-245ULLQT.js} +13 -13
- package/chunks/{handleAutoUpdate-2FUNJO3B.js → handleAutoUpdate-JDZHHZKK.js} +22 -21
- package/chunks/{i18n-FDIA6KFI.js → i18n-LA4D5IXM.js} +20 -19
- package/chunks/{initializer-4MJTJOTW.js → initializer-SHPTSWUZ.js} +25 -24
- package/chunks/{installationInfo-232RA2OK.js → installationInfo-QEQEPB3G.js} +20 -19
- package/chunks/{list-WN6WSGEB.js → list-IBHCQWTF.js} +28 -27
- package/chunks/{list-agents-I5TRH3J7.js → list-agents-EDPZCGKN.js} +5 -4
- package/chunks/{llm-UDFWQWZA.js → llm-JAWCQLA4.js} +68 -62
- package/chunks/{llm-content-generator-VLMZ2A7A.js → llm-content-generator-GOV3A23T.js} +2 -2
- package/chunks/{loadedSettingsAdapter-OBQEIXM7.js → loadedSettingsAdapter-RVE2GNVU.js} +25 -24
- package/chunks/{loggingContentGenerator-RGVUMUVX.js → loggingContentGenerator-SSHNN5YW.js} +15 -15
- package/chunks/{managed-npm-update-QBAJYCFU.js → managed-npm-update-BHSTITQO.js} +20 -19
- package/chunks/{mcp-OTIZZCPY.js → mcp-6ZZ7P2HU.js} +25 -24
- package/chunks/{monitor-BV5XF6LL.js → monitor-RKK6GSHG.js} +13 -13
- package/chunks/{nonInteractiveCli-W6MUKDVJ.js → nonInteractiveCli-UQHP3G6P.js} +58 -57
- package/chunks/{notebook-edit-HGBEKGTE.js → notebook-edit-YM47A7WO.js} +13 -13
- package/chunks/{open-with-auth-D6JD6LDS.js → open-with-auth-6MVIHMXB.js} +1 -1
- package/chunks/{openaiContentGenerator-NSU3ERBH.js → openaiContentGenerator-FHKDWNI2.js} +9 -9
- package/chunks/{pidfile-LE3TU4GE.js → pidfile-SIIEJEEH.js} +23 -20
- package/chunks/{processUtils-YFBGJK67.js → processUtils-JF7CWBJC.js} +2 -2
- package/chunks/{prompt-terminal-ledger-4W4W7DSO.js → prompt-terminal-ledger-FXXHAEQU.js} +21 -20
- package/chunks/{qwenContentGenerator-HTA57WFC.js → qwenContentGenerator-KFJ77JP6.js} +16 -16
- package/chunks/{read-file-KHPQ2MB6.js → read-file-S2NOCBIL.js} +4 -4
- package/chunks/{resumeHistoryUtils-K7RV3QBN.js → resumeHistoryUtils-QHHPSQWU.js} +22 -21
- package/chunks/{ripGrep-NBBVCMG4.js → ripGrep-F6TNOJUO.js} +5 -5
- package/chunks/{run-qwen-serve-A3JBOZCM.js → run-qwen-serve-KYBDQRDD.js} +216 -64
- package/chunks/{runtime-7YOU2KJ3.js → runtime-3WNOFLCR.js} +32 -29
- package/chunks/{scheduled-tasks-52LXK7LN.js → scheduled-tasks-RNBH56DJ.js} +23 -22
- package/chunks/{scheduler-J44M72VM.js → scheduler-ERMW7Q7B.js} +22 -21
- package/chunks/{send-message-AWKUDJBH.js → send-message-V5T3NMFM.js} +3 -3
- package/chunks/{serve-TRC6XJUB.js → serve-7NV46RMP.js} +25 -24
- package/chunks/{server-YPNTJLX2.js → server-6RZJR5QF.js} +106 -154
- package/chunks/{session-FMMIBFYX.js → session-Z4EV7NVV.js} +91 -63
- package/chunks/{session-attachments-root-LDJMNK7K.js → session-attachments-root-SG5FC52X.js} +20 -19
- package/chunks/{session-pr-refresh-NLR4EK2J.js → session-pr-refresh-ILC4Z3ZM.js} +22 -21
- package/chunks/{settings-A46L577J.js → settings-Y47SPE3X.js} +24 -23
- package/chunks/{shell-Q5LSQPPY.js → shell-YBVCOPVO.js} +13 -13
- package/chunks/{skill-75KPJRCM.js → skill-AXC63EBA.js} +4 -4
- package/chunks/{skill-settings-775YT4YR.js → skill-settings-AFPAYGLO.js} +24 -23
- package/chunks/{spawnChannel-XY73I5CU.js → spawnChannel-ZFL4J2V3.js} +20 -19
- package/chunks/{standalone-update-L46XXNQ2.js → standalone-update-Y2OZPLNJ.js} +21 -20
- package/chunks/{start-opentui-ui-WLV43247.js → start-opentui-ui-G6TKT4LI.js} +449 -210
- package/chunks/{startInteractiveUI-F5DKMLOV.js → startInteractiveUI-YTNDPW7J.js} +1182 -1245
- package/chunks/{task-create-PMAFST2T.js → task-create-MWXJFRRM.js} +3 -3
- package/chunks/{task-list-R2HSY2NC.js → task-list-EYO3FE57.js} +2 -2
- package/chunks/{task-update-JYC57USF.js → task-update-2JJJRHMT.js} +3 -3
- package/chunks/{team-create-2PATB77U.js → team-create-BUFLGGSH.js} +13 -13
- package/chunks/{team-delete-CBHVBTPB.js → team-delete-IQZ6XGFI.js} +2 -2
- package/chunks/{team-plan-approval-QTANEWOS.js → team-plan-approval-OUWWM42U.js} +13 -13
- package/chunks/{terminal-image-renderer-OGULCFNF.js → terminal-image-renderer-WH2WV5ES.js} +20 -19
- package/chunks/{theme-manager-CNO3QERP.js → theme-manager-5UDRARM2.js} +20 -19
- package/chunks/{tool-search-VXWEOZE7.js → tool-search-MCDIRPHN.js} +4 -4
- package/chunks/{total-session-admission-4KAADZPB.js → total-session-admission-VL27U74Z.js} +21 -20
- package/chunks/{trustedFolders-PPJSOPOT.js → trustedFolders-MSXT4VDD.js} +21 -20
- package/chunks/{update-relaunch-4PT4MW7B.js → update-relaunch-JKLEWVCB.js} +5 -5
- package/chunks/{updateCheck-WAVFLWNG.js → updateCheck-ARTHAJT2.js} +20 -19
- package/chunks/{useAutoAcceptIndicator-XNED4NRB.js → useAutoAcceptIndicator-YEAAGYVU.js} +26 -25
- package/chunks/{validateNonInterActiveAuth-J676DUQ2.js → validateNonInterActiveAuth-EMRQKH5S.js} +56 -55
- package/chunks/{version-J6SRRQB2.js → version-HFQU35WD.js} +3 -1
- package/chunks/{web-fetch-FMZZYX44.js → web-fetch-QBXAO6VF.js} +4 -4
- package/chunks/{web-search-3G2KXCX5.js → web-search-2URQXA3A.js} +186 -9
- package/chunks/{web-shell-static-POZHGGXE.js → web-shell-static-BFDESDD4.js} +5 -4
- package/chunks/{workflow-PPZZICQ7.js → workflow-JDD6WDAH.js} +204 -68
- package/chunks/{workspace-providers-status-IIYTAQST.js → workspace-providers-status-B4IKR6YJ.js} +27 -26
- package/chunks/{workspace-registration-store-VHCDXAV7.js → workspace-registration-store-PJ3YHR45.js} +1 -2
- package/chunks/{workspace-registry-I7VQIPS2.js → workspace-registry-WVYJ5UGB.js} +21 -20
- package/chunks/{workspace-runtime-coordinator-DBGNY32G.js → workspace-runtime-coordinator-DXL5YVAG.js} +21 -20
- package/chunks/{workspace-service-QSKB2T54.js → workspace-service-QNGAMVH7.js} +26 -25
- package/chunks/{workspace-skills-status-T7GPT65J.js → workspace-skills-status-BEISJIII.js} +25 -24
- package/chunks/{workspace-trust-reconciler-2PKRDAU4.js → workspace-trust-reconciler-ORYJF5L4.js} +26 -25
- package/chunks/{write-file-L76CGFTQ.js → write-file-DWLKFBTJ.js} +14 -14
- package/chunks/{zoom-image-TDJJY2VZ.js → zoom-image-BYVIXSNQ.js} +4 -4
- package/cli.js +12 -12
- package/export-transcript-document.js +106 -106
- package/package.json +4 -4
- package/web-shell/assets/{abnfDiagram-VCTEODGH-DHc6plZn.js → abnfDiagram-VCTEODGH-C_8kzsly.js} +1 -1
- package/web-shell/assets/{arc-BQ9m8TDV.js → arc-CDg7Zfpm.js} +1 -1
- package/web-shell/assets/{architectureDiagram-5GKGNRK7-D5ap3oVB.js → architectureDiagram-5GKGNRK7-DZzdCWyF.js} +1 -1
- package/web-shell/assets/{blockDiagram-NRAW4CY4-BIbnyNph.js → blockDiagram-NRAW4CY4-DI3B4gyR.js} +1 -1
- package/web-shell/assets/{c4Diagram-UCG6FXSJ-BRsdx_iG.js → c4Diagram-UCG6FXSJ-CfOgwHZW.js} +1 -1
- package/web-shell/assets/channel-e4xwS72w.js +1 -0
- package/web-shell/assets/{chunk-2Q5K7J3B-3lf1fNlx.js → chunk-2Q5K7J3B-B_PUth0g.js} +1 -1
- package/web-shell/assets/{chunk-5VM5RSS4-DP8VNRc4.js → chunk-5VM5RSS4-CrKtvBIL.js} +1 -1
- package/web-shell/assets/{chunk-F27PBJKO-DrohDmZ6.js → chunk-F27PBJKO-B4z2n8Py.js} +1 -1
- package/web-shell/assets/{chunk-G27WJ6UU-UZ2QhSx6.js → chunk-G27WJ6UU-BUtrFEO8.js} +1 -1
- package/web-shell/assets/{chunk-JWPE2WC7-BIMHVcZK.js → chunk-JWPE2WC7-Cqw3aXW0.js} +1 -1
- package/web-shell/assets/{chunk-LCL6LL3I-izRxdSDd.js → chunk-LCL6LL3I-CZolnvls.js} +1 -1
- package/web-shell/assets/{chunk-POPQ4Y6H-CXADD4PP.js → chunk-POPQ4Y6H-DivgasCa.js} +1 -1
- package/web-shell/assets/{chunk-SVP7TREG-B96d8Y_1.js → chunk-SVP7TREG--seyb1B6.js} +1 -1
- package/web-shell/assets/{chunk-XXDRQBXY-CF2sVQpv.js → chunk-XXDRQBXY-D7pHtuVM.js} +1 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-CzXfUUOt.js +1 -0
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-CzXfUUOt.js +1 -0
- package/web-shell/assets/{cose-bilkent-JH36ORCC-CT6tXVAS.js → cose-bilkent-JH36ORCC-4MWaRF_3.js} +1 -1
- package/web-shell/assets/{cynefin-OW5HDTMX-X1NS4vtV.js → cynefin-OW5HDTMX-nhJhAjgD.js} +1 -1
- package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-DNsKNOT4.js → cynefinDiagram-5FMLGOSQ-NF-PwXlq.js} +1 -1
- package/web-shell/assets/{dagre-3AP2YEHR-9-AHKqsb.js → dagre-3AP2YEHR-Bu0ncdWP.js} +1 -1
- package/web-shell/assets/{diagram-S7CK7UJ4-Bjgms7j6.js → diagram-S7CK7UJ4-CsvhFHZC.js} +1 -1
- package/web-shell/assets/{diagram-UQ7AKVKN-h6bCprbE.js → diagram-UQ7AKVKN-Ck61sIB3.js} +1 -1
- package/web-shell/assets/{diagram-VSXAHHWV-4SbQXVLt.js → diagram-VSXAHHWV-D0171zrb.js} +1 -1
- package/web-shell/assets/{diagram-VX7I27RA-B5gPCzzB.js → diagram-VX7I27RA-DvdxY4UL.js} +1 -1
- package/web-shell/assets/{diagram-Z3DM3KII-DFJXIA3A.js → diagram-Z3DM3KII-CGGpseiB.js} +1 -1
- package/web-shell/assets/{ebnfDiagram-PWID7BFC-FwyaU7VY.js → ebnfDiagram-PWID7BFC-K8-QMvY8.js} +1 -1
- package/web-shell/assets/{erDiagram-SSCWMZ5O-8vJQh2te.js → erDiagram-SSCWMZ5O-D316nAem.js} +1 -1
- package/web-shell/assets/{flowDiagram-A5DVABFB-BzA_1gMN.js → flowDiagram-A5DVABFB-B7siy_mn.js} +1 -1
- package/web-shell/assets/{ganttDiagram-EL5Y4UJY-Co-ABbVX.js → ganttDiagram-EL5Y4UJY-BZQDxzTu.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-WWUBYQGX-DW_FcyrX.js → gitGraphDiagram-WWUBYQGX-DZynLCSV.js} +1 -1
- package/web-shell/assets/{index-BbMXfhNG.js → index-9ie6xLTM.js} +1 -1
- package/web-shell/assets/{index-Bu-rZoJ-.js → index-DirkXQEg.js} +488 -474
- package/web-shell/assets/index-DzdST_7L.css +36 -0
- package/web-shell/assets/{infoDiagram-RXCK75RN-BEgfhUFN.js → infoDiagram-RXCK75RN-B0gr769A.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-5VMMS53U-DCsMxQmc.js → ishikawaDiagram-5VMMS53U-0pQFfjvX.js} +1 -1
- package/web-shell/assets/{journeyDiagram-EYS64GPL-DyIEYoHz.js → journeyDiagram-EYS64GPL-DEGtClWb.js} +1 -1
- package/web-shell/assets/{kanban-definition-3QL26DDD-CkxjqCNr.js → kanban-definition-3QL26DDD-CnN8gPzw.js} +1 -1
- package/web-shell/assets/{layout-BEWc0Al9.js → layout-C_70RhaT.js} +1 -1
- package/web-shell/assets/{linear-CNuNxirL.js → linear-BJ2ZLmcq.js} +1 -1
- package/web-shell/assets/{mermaid.core-DZBre674.js → mermaid.core-RlY0zPNC.js} +6 -6
- package/web-shell/assets/{mindmap-definition-FBJOCRG2-CpafFz_F.js → mindmap-definition-FBJOCRG2-CpVAxTNl.js} +1 -1
- package/web-shell/assets/{pegDiagram-XKGWAZYB-DfZqk_dq.js → pegDiagram-XKGWAZYB-DmrSv3hD.js} +1 -1
- package/web-shell/assets/{pieDiagram-E7YTZNPT-S0UWXlgC.js → pieDiagram-E7YTZNPT-CJmgp8KJ.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-AXDQQJYC-dd37_Ohj.js → quadrantDiagram-AXDQQJYC-UsgOyNco.js} +1 -1
- package/web-shell/assets/{railroadDiagram-O6MQD6OU-CH8NJZ7u.js → railroadDiagram-O6MQD6OU-DQ6gMs_W.js} +1 -1
- package/web-shell/assets/{requirementDiagram-EFPCY7ZU-CFdqWYih.js → requirementDiagram-EFPCY7ZU-DhqadamF.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-P5KCCOFB-CsddcEGD.js → sankeyDiagram-P5KCCOFB-R4WnURaE.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-BZ270mGw.js → sequenceDiagram-WJ2MYXX4-D7BwMi_D.js} +1 -1
- package/web-shell/assets/{sizeCapture-X5ZJPWSS-CGaS4DBV.js → sizeCapture-X5ZJPWSS-Bqngz088.js} +1 -1
- package/web-shell/assets/{stateDiagram-HBIQ2CUA-COpIzMu6.js → stateDiagram-HBIQ2CUA-DwaXPGqn.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-8GCQZAvv.js +1 -0
- package/web-shell/assets/{swimlanes-XN3QIQJK-CMF889m3.js → swimlanes-XN3QIQJK-BsaLeRDY.js} +1 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-BoRBF2Yw.js +8 -0
- package/web-shell/assets/{timeline-definition-24CTP7MA-BelnxYz5.js → timeline-definition-24CTP7MA-NJ9G-NUU.js} +1 -1
- package/web-shell/assets/{vennDiagram-4TSXK5OY-CU-NRqIB.js → vennDiagram-4TSXK5OY-Ca3W4rSq.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-VM6X3IG4-CDNKqWh-.js → wardleyDiagram-VM6X3IG4-OabvjC-6.js} +1 -1
- package/web-shell/assets/{xychartDiagram-S5SC5T6Z-CLqguL5D.js → xychartDiagram-S5SC5T6Z-C7rbjvpc.js} +1 -1
- package/web-shell/index.html +2 -2
- package/chunks/chunk-6YEOCHSE.js +0 -142
- package/chunks/chunk-X35VIWWJ.js +0 -276
- package/web-shell/assets/channel-uMMdTrYk.js +0 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-DcY-26Ig.js +0 -1
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-DcY-26Ig.js +0 -1
- package/web-shell/assets/index-CsPwZ1ut.css +0 -36
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-D6qEVAji.js +0 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-mem5Jj4m.js +0 -8
|
@@ -26,7 +26,7 @@ When first used, the skill runs these commands itself:
|
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
28
|
qwen mcp add --scope user node-repl npx -y @qwen-code/node-repl-mcp@0.1.3
|
|
29
|
-
npm install --no-save --package-lock=false @qwen-code/cua-sdk@0.20.
|
|
29
|
+
npm install --no-save --package-lock=false @qwen-code/cua-sdk@0.20.5
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
Restart Qwen Code after the MCP server is first added. The skill then resumes
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
# Cross-Session Protocol
|
|
2
|
+
|
|
3
|
+
This page is the contract for a program that wants to take part in
|
|
4
|
+
cross-session messaging without being a Qwen Code session: a voice
|
|
5
|
+
front-end, a relay daemon, a script that watches a build. It describes
|
|
6
|
+
what a session writes to the registry, what its inbox reads off a
|
|
7
|
+
connection, and what it sends back. Everything here is what the code
|
|
8
|
+
does today at schema version 1 and frame version 1; the last section
|
|
9
|
+
says what may change and how you will know.
|
|
10
|
+
|
|
11
|
+
Every value that crosses a process boundary is untrusted on arrival and
|
|
12
|
+
validated by the reader. Where this page says a field "must" have some
|
|
13
|
+
shape, a value that does not is dropped, never rejected with an error.
|
|
14
|
+
|
|
15
|
+
## 1. The session registry
|
|
16
|
+
|
|
17
|
+
A running session publishes one record:
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
$QWEN_HOME/sessions/<pid>.json (directory 0700, file 0600)
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
`$QWEN_HOME` defaults to `~/.qwen`. The file name is the writer's PID
|
|
24
|
+
and nothing else; a record whose `pid` field disagrees with its file
|
|
25
|
+
name is ignored.
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"schemaVersion": 1,
|
|
30
|
+
"pid": 41337,
|
|
31
|
+
"procStart": "a1b2c3d4-…-boot-uuid:8895124",
|
|
32
|
+
"pidNs": 4026531836,
|
|
33
|
+
"sessionId": "8e016be8-5b48-4c13-ad22-1f5326ae64ac",
|
|
34
|
+
"cwd": "/home/me/project",
|
|
35
|
+
"name": "project-3f",
|
|
36
|
+
"startedAt": 1788959000000,
|
|
37
|
+
"qwenVersion": "0.23.0",
|
|
38
|
+
"kind": "tui",
|
|
39
|
+
"ipcPath": "/run/user/1000/qwen-socks/41337.sock",
|
|
40
|
+
"ipcToken": "c0ffee…64 hex…"
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
| Field | Meaning |
|
|
45
|
+
| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
46
|
+
| `schemaVersion` | Always `1`. A reader skips a record with a higher version and never deletes it. |
|
|
47
|
+
| `pid` | The writer's process id. Must equal the file name. |
|
|
48
|
+
| `procStart` | `<boot id>:<process start ticks>` on Linux (`/proc/sys/kernel/random/boot_id` and field 22 of `/proc/<pid>/stat`); `null` elsewhere. Guards against PID reuse, and against records written on another machine that shares this home directory. |
|
|
49
|
+
| `pidNs` | Inode number of `/proc/self/ns/pid` on Linux; `null` elsewhere. A reader only lists and sweeps records from its own namespace. |
|
|
50
|
+
| `sessionId` | The session's id. `/clear` and `/resume` swap it under the same PID, so re-read the record before each send. |
|
|
51
|
+
| `cwd` | Working directory at registration. |
|
|
52
|
+
| `name` | Display name. Derived from the cwd basename (Unicode letters, marks, digits, `.`, `_`, `-`; up to 32 code points) plus `-` and the first two hex characters of `sha256(sessionId)`, unless the writer chose one. Not unique. |
|
|
53
|
+
| `startedAt` | Epoch milliseconds. Newest first is the listing order and the tie-break between twins. |
|
|
54
|
+
| `qwenVersion` | Free text or `null`. |
|
|
55
|
+
| `kind` | What registered: `tui` (someone at a terminal), `headless`, `serve`, `external`. Lowercase ASCII, digits and dashes, at most 16 characters; anything else is dropped on read. Absent means a writer older than the field, which reads as `tui`. A label for listings — never a credential; see below. |
|
|
56
|
+
| `ipcPath` | The inbox socket, present only while it is bound. Absent means discoverable but not messageable. |
|
|
57
|
+
| `ipcToken` | 64 hex characters. What a connection to `ipcPath` presents on its auth line. Absent means the inbox requires none (records from older builds). |
|
|
58
|
+
|
|
59
|
+
**A record is a self-report.** Every field in it was written by the
|
|
60
|
+
process it describes, so `name`, `cwd` and `kind` are claims, not facts a
|
|
61
|
+
reader can lean on. Nothing that decides what a sender may do reads
|
|
62
|
+
them — that is settled by what a connection presents (§3) and by the
|
|
63
|
+
receiving session's own policy (§6). Set `kind` so a listing can group
|
|
64
|
+
sessions honestly; do not expect it to buy you anything.
|
|
65
|
+
|
|
66
|
+
**Writing your own record.** An external process that wants to be
|
|
67
|
+
found — listed by `qwen sessions ps`, addressable from `send_message`,
|
|
68
|
+
able to receive receipts — writes the same record for itself: its own
|
|
69
|
+
`pid`, `procStart` and `pidNs` computed the same way, a `sessionId` it
|
|
70
|
+
mints (any UUID), `kind: "external"`, a `name` (yours, or derived the
|
|
71
|
+
same way; it is flattened to one line and bounded when displayed), and
|
|
72
|
+
`ipcPath` + `ipcToken` for an inbox it binds itself (§2). Write to a
|
|
73
|
+
temp file in the same directory and `rename` over the target; create the
|
|
74
|
+
file 0600; refuse to write through a symlink. Remove the record on exit.
|
|
75
|
+
A record whose process is gone is swept by the next session that lists,
|
|
76
|
+
but only when `procStart` proves the PID is not merely reused.
|
|
77
|
+
|
|
78
|
+
**Reading.** Anything that can read the directory can read every record,
|
|
79
|
+
including tokens: being able to discover a session and being able to
|
|
80
|
+
authenticate to it are one capability by design. Do not print
|
|
81
|
+
`ipcToken` anywhere a model or a log can see it.
|
|
82
|
+
|
|
83
|
+
**Liveness.** A record is live when all of these hold: the file name
|
|
84
|
+
matches `pid`; `pidNs` equals the reader's; the boot id inside
|
|
85
|
+
`procStart` equals the reader's (or `procStart` is `null`); and the PID
|
|
86
|
+
is alive with the same start ticks. A live record with an `ipcPath`
|
|
87
|
+
still has to be dialed before it is advertised as reachable — a socket
|
|
88
|
+
file outlives a crash.
|
|
89
|
+
|
|
90
|
+
**Refs.** Displayed handles use `ref = sha256(sessionId)[0:6]`. Two
|
|
91
|
+
sessions may share a `name`; the address grammar a sender types is
|
|
92
|
+
`name`, `name [ref]`, `[ref]` or the bare `ref`, and an ambiguous
|
|
93
|
+
`name` is an error rather than a guess.
|
|
94
|
+
|
|
95
|
+
## 2. The inbox socket
|
|
96
|
+
|
|
97
|
+
One UNIX domain socket per session, at the first of these that binds:
|
|
98
|
+
|
|
99
|
+
1. `$XDG_RUNTIME_DIR/qwen-socks/<pid>.sock`
|
|
100
|
+
2. `$TMPDIR/qwen-socks-<16 hex>/<pid>.sock`
|
|
101
|
+
3. `/tmp/qwen-socks-<16 hex>/<pid>.sock`
|
|
102
|
+
|
|
103
|
+
The directory is 0700 and the socket 0600. A path longer than 103 bytes
|
|
104
|
+
is skipped. When the PID-keyed name is already held by a live listener
|
|
105
|
+
(two PID namespaces sharing a runtime directory), the session binds
|
|
106
|
+
`<pid>-<8 hex>.sock` next to it instead. Peers never derive a socket
|
|
107
|
+
path; they read `ipcPath` from the record.
|
|
108
|
+
|
|
109
|
+
A connection carries newline-delimited JSON, one object per line, UTF-8.
|
|
110
|
+
A single line longer than 1 MiB (measured in UTF-16 code units) drops
|
|
111
|
+
the connection. A connection that goes 30 seconds without completing a
|
|
112
|
+
line that parses is dropped; junk lines do not extend the deadline. The
|
|
113
|
+
listener accepts at most 64 connections at once.
|
|
114
|
+
|
|
115
|
+
The expected exchange is one message per connection: connect, write the
|
|
116
|
+
auth line and the frame in one write, half-close, wait for the peer to
|
|
117
|
+
close. The receiver never writes on the same connection; anything it
|
|
118
|
+
has to say comes back as a separate connection to your own `ipcPath`.
|
|
119
|
+
|
|
120
|
+
## 3. The auth line
|
|
121
|
+
|
|
122
|
+
When the target record has an `ipcToken`, the first line must be:
|
|
123
|
+
|
|
124
|
+
```json
|
|
125
|
+
{ "msgV": 1, "type": "auth", "token": "<token>" }
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Three kinds of token are accepted, and the inbox remembers which one it
|
|
129
|
+
saw:
|
|
130
|
+
|
|
131
|
+
| Presented | The inbox concludes | Effect |
|
|
132
|
+
| ----------------------------------------------------------------------------- | ------------------------------ | -------------------------------------------------------------------------------- |
|
|
133
|
+
| The `ipcToken` from the target's registry record | an ordinary peer | subject to policy and mode parity (§6) |
|
|
134
|
+
| `QWEN_CODE_MESSAGING_TOKEN` from the target's own environment | a process that session started | delivered under the parity default; `origin="own-process"` |
|
|
135
|
+
| A controller token `qpc_<64 hex>` minted with `qwen sessions controllers add` | a program the user trusts | delivered under the parity default; `origin="controller"` with the grant's label |
|
|
136
|
+
|
|
137
|
+
A first line that is not an auth line, or that presents a token matching
|
|
138
|
+
none of the three, drops the connection silently. When the record has no
|
|
139
|
+
`ipcToken`, do not send an auth line; an older inbox reads it as an
|
|
140
|
+
unknown frame type and skips it, so leading with one is always safe.
|
|
141
|
+
|
|
142
|
+
Nothing here authenticates the _sender_: a token proves the connection is
|
|
143
|
+
allowed, not who opened it. `from`, `fromName`, `fromMode` and every
|
|
144
|
+
field of the record are claims.
|
|
145
|
+
|
|
146
|
+
This is also the whole of the trust model. A program the user wants
|
|
147
|
+
driving their sessions gets a controller token, minted by hand and given
|
|
148
|
+
to that one program; it is what makes the difference between a message
|
|
149
|
+
that is delivered and one that waits for review. Writing
|
|
150
|
+
`kind: "external"` or a familiar-looking `name` buys nothing.
|
|
151
|
+
|
|
152
|
+
## 4. The user frame
|
|
153
|
+
|
|
154
|
+
```json
|
|
155
|
+
{
|
|
156
|
+
"msgV": 1,
|
|
157
|
+
"msgId": "5f1d0c9e-3b2a-4e8f-9c7d-1a2b3c4d5e6f",
|
|
158
|
+
"type": "user",
|
|
159
|
+
"from": "/run/user/1000/qwen-socks/40011.sock",
|
|
160
|
+
"replyToken": "<my own ipcToken>",
|
|
161
|
+
"fromName": "project-3f",
|
|
162
|
+
"fromMode": "prompting",
|
|
163
|
+
"toSessionId": "8e016be8-…",
|
|
164
|
+
"priority": "next",
|
|
165
|
+
"message": { "role": "user", "content": "build finished, 0 failures" }
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
| Field | Rule |
|
|
170
|
+
| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
171
|
+
| `msgV` | Number. Must be ≤ 1; higher is dropped. |
|
|
172
|
+
| `msgId` | `^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$`, and must not canonicalize (dashes stripped, lower-cased) to `all`. Use a fresh UUID per message: the receiver remembers ids it has settled and repeats the old verdict for a re-sent one. |
|
|
173
|
+
| `type` | `"user"`. |
|
|
174
|
+
| `from` | Your `ipcPath`, if you have one. Where receipts go. Absent means no receipts. |
|
|
175
|
+
| `replyToken` | Your `ipcToken`, so the receiver can authenticate its receipts to you. |
|
|
176
|
+
| `fromName` | Display name; flattened to one line, at most 200 characters. |
|
|
177
|
+
| `fromMode` | `"prompting"` (a person reviews each action) or `"bypass"` (some actions apply without review). Absent means "asserts nothing", which is held for review (§6). |
|
|
178
|
+
| `toSessionId` | The `sessionId` you read from the record. A receiver holding a different id answers `misaddressed`. Always send it. |
|
|
179
|
+
| `priority` | `"now"` or `"next"`; anything else reads as `"next"`. Carried for a future interrupt path; today the receiver queues both for the next turn. |
|
|
180
|
+
| `message` | `role` must be `"user"`; `content` a non-empty string. |
|
|
181
|
+
|
|
182
|
+
Unknown fields are ignored.
|
|
183
|
+
|
|
184
|
+
## 5. The delivery-status frame
|
|
185
|
+
|
|
186
|
+
The receiver reports what became of a message with one control frame per
|
|
187
|
+
outcome, sent to the message's `from` and authenticated with its
|
|
188
|
+
`replyToken`:
|
|
189
|
+
|
|
190
|
+
```json
|
|
191
|
+
{
|
|
192
|
+
"msgV": 1,
|
|
193
|
+
"msgId": "<fresh id>",
|
|
194
|
+
"type": "control",
|
|
195
|
+
"action": "delivery_status",
|
|
196
|
+
"status": "held",
|
|
197
|
+
"origMsgId": "5f1d0c9e-…",
|
|
198
|
+
"from": "/run/user/1000/qwen-socks/41337.sock",
|
|
199
|
+
"reason": "Your message is held for the recipient user to review …"
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
| `status` | When | What to do |
|
|
204
|
+
| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
|
|
205
|
+
| `held` | Parked for the user to review. Repeated on a retry, and on a release that could not be queued. | Wait; a decision or an expiry follows. |
|
|
206
|
+
| `delivered` | Queued for the model. | Nothing. Not proof it was read. |
|
|
207
|
+
| `denied` | A person reviewed it and said no. | Do not re-send. |
|
|
208
|
+
| `refused` | The session's policy turns peer messages away; nobody saw it. Only ever the first receipt. | Stop; reach that user another way. |
|
|
209
|
+
| `expired` | A held message ran out its wait, the session exited with it unread, or it arrived while that session was shutting down. Can follow `held` or `delivered`. | Re-send later if it still matters. |
|
|
210
|
+
| `misaddressed` | `toSessionId` does not match the session at that address. | Re-read the registry. |
|
|
211
|
+
| `dropped` | The inbox turned it away before any policy ran (§6). | Treat as unsent. Do not retry in a loop; fold what matters into one later message. |
|
|
212
|
+
|
|
213
|
+
A `dropped` receipt carries two more fields. `dropReason` is
|
|
214
|
+
`rate-limited`, `duplicate` or `queue-full`. `droppedMsgIds` lists up to
|
|
215
|
+
256 further ids the same receipt settles: a burst is answered with one
|
|
216
|
+
receipt rather than one each, so a sender moves every message it lost to
|
|
217
|
+
a terminal state from a single frame. Both are meaningless on any other
|
|
218
|
+
status and are ignored there.
|
|
219
|
+
|
|
220
|
+
`reason` is free text for a human. Order of receipts is not guaranteed
|
|
221
|
+
across connections; apply them as state transitions:
|
|
222
|
+
|
|
223
|
+
```
|
|
224
|
+
pending → held | delivered | denied | refused | expired | misaddressed | dropped
|
|
225
|
+
held → delivered | denied | expired | misaddressed
|
|
226
|
+
delivered → expired | misaddressed
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Anything else is a repeat and should be ignored. A receipt for an id you
|
|
230
|
+
never sent is noise; ignore it. Receipts are best-effort on the
|
|
231
|
+
receiver's side: a full outbound limit or a dead `from` loses them
|
|
232
|
+
silently, so a sender must tolerate never hearing back.
|
|
233
|
+
|
|
234
|
+
Your own inbox receives these frames from the sessions you messaged. If
|
|
235
|
+
you only ever send, bind an inbox and give `from` anyway: without one you
|
|
236
|
+
are blind to every outcome above.
|
|
237
|
+
|
|
238
|
+
## 6. What the receiver does with a message
|
|
239
|
+
|
|
240
|
+
In order:
|
|
241
|
+
|
|
242
|
+
1. **Admission.** Per sender: a burst of 30, then one message every two seconds. All senders together: a burst of 32, then one a second — a sender names itself on the frame, so rotating that name buys a fresh allowance from the first limit but not the second. The same body from another session inside 30 seconds is a `duplicate`; a process the session started and a trusted controller are exempt from that check, and rate-limited like everyone else. A dropped message is never held, never delivered, and leaves no record, so a sender that waits out its burst and retries still lands.
|
|
243
|
+
2. **Settled ids.** A `msgId` the gate already decided repeats its earlier verdict.
|
|
244
|
+
3. **Policy.** `agents.crossSessionInbound` set to `accept`, `hold` or `refuse` wins. Unset: a process the session started or a trusted controller is accepted; otherwise a message is accepted only when `fromMode` names the same review class the receiver is in, and held in every other case, including when `fromMode` is absent.
|
|
245
|
+
4. **Hold.** Up to 50 messages wait. A message arriving at a full buffer is `dropped` with `queue-full` rather than evicting one already parked. A held message expires after `agents.crossSessionHeldExpiry` (`1m`, `5m`, `10m`, `never`; default `5m`). The user releases or denies from `/peers`; a mode change re-evaluates the backlog.
|
|
246
|
+
5. **Queue.** An accepted message joins the session's input queue, which holds at most 50 from peers. A full queue is `dropped` with `queue-full` too.
|
|
247
|
+
|
|
248
|
+
A sender does not have to discover the limits the hard way: a Qwen Code
|
|
249
|
+
session mirrors them per address and refuses its own send before writing
|
|
250
|
+
it, telling its model to batch instead.
|
|
251
|
+
|
|
252
|
+
The model sees a delivered message as:
|
|
253
|
+
|
|
254
|
+
```
|
|
255
|
+
<cross_session_message from="/run/user/1000/qwen-socks/40011.sock" name="project-3f">
|
|
256
|
+
build finished, 0 failures
|
|
257
|
+
</cross_session_message>
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
followed by a notice stating the sender's authority. `origin="own-process"`
|
|
261
|
+
or `origin="controller" controller="<label>"` is added by the receiver
|
|
262
|
+
from what the connection presented, never from the frame; a controller's
|
|
263
|
+
label comes from the grant the user minted, not from `fromName`. Tags
|
|
264
|
+
that look like the envelope are defanged inside `content`.
|
|
265
|
+
|
|
266
|
+
## 7. Compatibility
|
|
267
|
+
|
|
268
|
+
- A reader ignores fields it does not know. Adding a field to a record or
|
|
269
|
+
a frame is not a breaking change.
|
|
270
|
+
- `schemaVersion` and `msgV` are bumped only for a change to the shape of
|
|
271
|
+
existing fields. A reader drops a frame or skips a record with a
|
|
272
|
+
version above what it knows, and never deletes such a record.
|
|
273
|
+
- New `status` values may appear; treat an unknown one as "no transition"
|
|
274
|
+
and keep waiting. The same goes for a `kind` you do not recognize:
|
|
275
|
+
show it, do not correct it.
|
|
276
|
+
- Constants that may change without notice: the burst and rate figures,
|
|
277
|
+
the hold ceiling and expiry choices, the 1 MiB line cap, the 30-second
|
|
278
|
+
line deadline, the 64-connection cap.
|
|
279
|
+
|
|
280
|
+
## 8. Not settled yet
|
|
281
|
+
|
|
282
|
+
- **Name yielding.** Two sessions in one directory can register the same
|
|
283
|
+
`name`; today they are told apart only by `ref`. A registration that
|
|
284
|
+
yields to a live name, and a control frame that tells peers a session
|
|
285
|
+
renamed itself, are both still to come.
|
|
286
|
+
- **Same-name reporting.** `qwen sessions ps` and `list_agents` do not
|
|
287
|
+
flag records that still collide.
|
|
288
|
+
- **Daemon-managed sessions.** Only the interactive UI registers today, so
|
|
289
|
+
a session `qwen serve` drives is not in the registry, cannot be
|
|
290
|
+
addressed, and cannot send. The `serve` and `headless` kinds are
|
|
291
|
+
reserved for it.
|
|
@@ -18,7 +18,9 @@ Creating, editing, or resuming a Goal requires a trusted workspace (`/trust`). H
|
|
|
18
18
|
|
|
19
19
|
Once a Goal has billed a turn, the footer pill and every status card show what it has spent against the window it is allowed, as `1.2k/30.0m`. The figure counts the model calls the Goal makes in its own turns; subagents and the verifier's own checks are not included. The window is set by [`model.goalTokenBudget`](../configuration/settings.md); resuming a Goal that has spent its window grants another one on top of what it has already spent, so the figure reads `30.0m/60.0m` rather than starting over. A Goal with no budget shows only what it has spent. A Goal that has not billed a turn yet shows no figures at all.
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
Each turn the session takes on its own reports what the Goal has spent so far, how many turns are behind it, and — unless the Goal runs unbounded — the window it is allowed. Every such turn except the final wind-down hand-off also carries standing instructions to re-check the workspace rather than trust earlier turns' reports, to work toward the end state the objective asks for, to do something different when the previous turn changed nothing (from the second turn on, once there is a previous turn to judge), and to check every requirement against citable evidence before proposing that the Goal is done.
|
|
22
|
+
|
|
23
|
+
A long Goal periodically compresses the evidence it has recorded into checkpoint claims with a side model check, so later turns and the verifier still have it to cite. The check is bounded by [`model.goalCheckpointTimeoutSeconds`](../configuration/settings.md), 180 seconds by default. If its claims overrun the aggregate byte budget, or include a claim over the per-claim character limit, it makes one corrective model call and both calls share that ceiling. A check that does not finish in time is abandoned as inconclusive; it counts toward the checkpoint stall limit only when the evidence window has overflowed, while a non-overflowing check preserves the streak and retries on a later turn. The calls are streamed, so the per-request transport timeout bounds only connect and first response, and the ceiling itself stops at the stream guards' 15-minute lifetime cap because past that the guard, not the setting, ends the check. That 15-minute limit on the setting is fixed, and raising the stream guard's own cap does not lift it.
|
|
22
24
|
|
|
23
25
|
## Interrupting a Goal
|
|
24
26
|
|
|
@@ -131,6 +131,14 @@ When a session is restored, compatible background agents are added back to the s
|
|
|
131
131
|
|
|
132
132
|
Use continuation for related follow-up work. Launch a new agent when the task is unrelated or the previous agent cannot be resumed.
|
|
133
133
|
|
|
134
|
+
## Notification Queue
|
|
135
|
+
|
|
136
|
+
In the interactive TUI and ACP session, completion notifications from background agents, shells, monitors and workflows share a queue that drains into a model turn once the session is idle. These queues hold at most 20 notifications so a noisy producer cannot accumulate an unbounded backlog. The headless CLI's local queue is not capped by this rule.
|
|
137
|
+
|
|
138
|
+
When a 21st notification arrives, Qwen Code evicts an interim monitor pulse first — the monitor's next poll supersedes it — and otherwise the oldest queued notification. Agent results, workflow results and scheduled prompts are never evicted in the interactive TUI; a notification that would displace one is dropped instead, and so is an arriving pulse when only terminal results are queued.
|
|
139
|
+
|
|
140
|
+
Discarded notifications are reported rather than dropped quietly. The summary appears before the next notification in the live transcript. ACP also prefixes it to that turn's model input; the TUI keeps it parked for the next Notification batch so cron prompts still pass unchanged through slash, shell and `@` preprocessing. A daemon notification is recorded before it is acknowledged, so after a reload its durable record can precede the later overflow summary. ACP can discard a pending summary if the session is cleared or switched, or if a client cancels or preempts the notification turn. Discarding a notification never stops or deletes its task, and completed tasks retain their results; the summary points at `/tasks` and task output files when there is a task to inspect. A discarded scheduled prompt was never delivered and is not retried. A daemon notification that was recorded but could not be delivered live remains available in the session transcript and is reported separately from lost notifications.
|
|
141
|
+
|
|
134
142
|
## Agent Working Directory
|
|
135
143
|
|
|
136
144
|
For a named regular subagent, `working_dir` pins the agent to an existing git worktree of the current repository. Relative paths resolve from the current directory, and the worktree must already be registered with git as a linked worktree of this repository.
|