termdock 1.4.230 → 1.4.232

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.
Files changed (326) hide show
  1. package/.desktop-dist/main.js +9 -0
  2. package/dist/client/assets/App-Di12Ej1O.js +155 -0
  3. package/dist/client/assets/App-Di12Ej1O.js.br +0 -0
  4. package/dist/client/assets/App-Di12Ej1O.js.gz +0 -0
  5. package/dist/client/assets/{ChangeWalkthroughPanel-BoJ_fimI.js → ChangeWalkthroughPanel-pOBFJTxi.js} +1 -1
  6. package/dist/client/assets/ChangeWalkthroughPanel-pOBFJTxi.js.br +0 -0
  7. package/dist/client/assets/ChangeWalkthroughPanel-pOBFJTxi.js.gz +0 -0
  8. package/dist/client/assets/{DagPlayground-Ds7ArhFS.js → DagPlayground-DWaLn2pa.js} +1 -1
  9. package/dist/client/assets/DagPlayground-DWaLn2pa.js.br +0 -0
  10. package/dist/client/assets/DagPlayground-DWaLn2pa.js.gz +0 -0
  11. package/dist/client/assets/{DiffLab-Bbse8Ju0.js → DiffLab-DMvlScEP.js} +1 -1
  12. package/dist/client/assets/DiffLab-DMvlScEP.js.br +0 -0
  13. package/dist/client/assets/DiffLab-DMvlScEP.js.gz +0 -0
  14. package/dist/client/assets/{DiffReview-83Xj6PCu.js → DiffReview-D1M9kVJy.js} +1 -1
  15. package/dist/client/assets/DiffReview-D1M9kVJy.js.br +0 -0
  16. package/dist/client/assets/DiffReview-D1M9kVJy.js.gz +0 -0
  17. package/dist/client/assets/{DiffReviewLab-DFn8TDlG.js → DiffReviewLab-BVkhfOhb.js} +1 -1
  18. package/dist/client/assets/DiffReviewLab-BVkhfOhb.js.br +0 -0
  19. package/dist/client/assets/DiffReviewLab-BVkhfOhb.js.gz +0 -0
  20. package/dist/client/assets/{DiffViewer-DbOviqxz.js → DiffViewer-DN5Akyco.js} +7 -7
  21. package/dist/client/assets/DiffViewer-DN5Akyco.js.br +0 -0
  22. package/dist/client/assets/DiffViewer-DN5Akyco.js.gz +0 -0
  23. package/dist/client/assets/{ModelPreview-DTbtvbXf.js → ModelPreview-D5Vl9PdY.js} +1 -1
  24. package/dist/client/assets/ModelPreview-D5Vl9PdY.js.br +0 -0
  25. package/dist/client/assets/ModelPreview-D5Vl9PdY.js.gz +0 -0
  26. package/dist/client/assets/{RightSidebar-CkBjWyP3.js → RightSidebar-CNICBrOL.js} +22 -22
  27. package/dist/client/assets/RightSidebar-CNICBrOL.js.br +0 -0
  28. package/dist/client/assets/RightSidebar-CNICBrOL.js.gz +0 -0
  29. package/dist/client/assets/{abnfDiagram-VCTEODGH-DNI-fpHF.js → abnfDiagram-VCTEODGH-Coq8shqQ.js} +1 -1
  30. package/dist/client/assets/abnfDiagram-VCTEODGH-Coq8shqQ.js.br +0 -0
  31. package/dist/client/assets/abnfDiagram-VCTEODGH-Coq8shqQ.js.gz +0 -0
  32. package/dist/client/assets/app-BNPa5Xzm.js +35 -0
  33. package/dist/client/assets/app-BNPa5Xzm.js.br +0 -0
  34. package/dist/client/assets/app-BNPa5Xzm.js.gz +0 -0
  35. package/dist/client/assets/{arc-BTzsKyvV.js → arc-D9F88oM8.js} +1 -1
  36. package/dist/client/assets/arc-D9F88oM8.js.br +0 -0
  37. package/dist/client/assets/arc-D9F88oM8.js.gz +0 -0
  38. package/dist/client/assets/{architectureDiagram-5GKGNRK7-zSPsJaBw.js → architectureDiagram-5GKGNRK7-Ci04e9H2.js} +1 -1
  39. package/dist/client/assets/architectureDiagram-5GKGNRK7-Ci04e9H2.js.br +0 -0
  40. package/dist/client/assets/architectureDiagram-5GKGNRK7-Ci04e9H2.js.gz +0 -0
  41. package/dist/client/assets/{blockDiagram-I7D4REHJ-DrKjCBZz.js → blockDiagram-I7D4REHJ-B0V-2mCO.js} +1 -1
  42. package/dist/client/assets/blockDiagram-I7D4REHJ-B0V-2mCO.js.br +0 -0
  43. package/dist/client/assets/blockDiagram-I7D4REHJ-B0V-2mCO.js.gz +0 -0
  44. package/dist/client/assets/{c4Diagram-7LVT6UL2-TcGgIvXV.js → c4Diagram-7LVT6UL2-CgHFeNkR.js} +1 -1
  45. package/dist/client/assets/c4Diagram-7LVT6UL2-CgHFeNkR.js.br +0 -0
  46. package/dist/client/assets/c4Diagram-7LVT6UL2-CgHFeNkR.js.gz +0 -0
  47. package/dist/client/assets/channel-Cf-_AhxJ.js +1 -0
  48. package/dist/client/assets/{chunk-2Q5K7J3B-BtkT5EO8.js → chunk-2Q5K7J3B-C1R3c0d8.js} +1 -1
  49. package/dist/client/assets/{chunk-5VM5RSS4-Plu2bVNV.js → chunk-5VM5RSS4-USD4Kst0.js} +1 -1
  50. package/dist/client/assets/{chunk-F27PBJKO-D7sV_zVS.js → chunk-F27PBJKO-D-1deMoU.js} +1 -1
  51. package/dist/client/assets/chunk-F27PBJKO-D-1deMoU.js.br +0 -0
  52. package/dist/client/assets/chunk-F27PBJKO-D-1deMoU.js.gz +0 -0
  53. package/dist/client/assets/{chunk-IMKFNOWR-8EiaBwNr.js → chunk-IMKFNOWR-DyunJ4J2.js} +1 -1
  54. package/dist/client/assets/chunk-IMKFNOWR-DyunJ4J2.js.br +0 -0
  55. package/dist/client/assets/chunk-IMKFNOWR-DyunJ4J2.js.gz +0 -0
  56. package/dist/client/assets/{chunk-JWPE2WC7-MSPgHaTm.js → chunk-JWPE2WC7-ClM1w-Bz.js} +1 -1
  57. package/dist/client/assets/{chunk-POPQ4Y6H-D0-gOtAK.js → chunk-POPQ4Y6H-Dmz_lI83.js} +1 -1
  58. package/dist/client/assets/{chunk-SVP7TREG-BNSQ1QfI.js → chunk-SVP7TREG-JSkpe0Ru.js} +1 -1
  59. package/dist/client/assets/chunk-SVP7TREG-JSkpe0Ru.js.br +0 -0
  60. package/dist/client/assets/chunk-SVP7TREG-JSkpe0Ru.js.gz +0 -0
  61. package/dist/client/assets/{chunk-TICWLB2K-DDkkYDMp.js → chunk-TICWLB2K-DNRVmHct.js} +1 -1
  62. package/dist/client/assets/chunk-TICWLB2K-DNRVmHct.js.br +0 -0
  63. package/dist/client/assets/chunk-TICWLB2K-DNRVmHct.js.gz +0 -0
  64. package/dist/client/assets/{chunk-XXDRQBXY-DPtyGiHW.js → chunk-XXDRQBXY-C_nQBcA8.js} +1 -1
  65. package/dist/client/assets/classDiagram-ZZMXUADV-CCnYK6Cj.js +1 -0
  66. package/dist/client/assets/classDiagram-v2-VYDZK3BY-CCnYK6Cj.js +1 -0
  67. package/dist/client/assets/{cose-bilkent-JH36ORCC-D1SSHh8-.js → cose-bilkent-JH36ORCC-D2_1Vg5L.js} +1 -1
  68. package/dist/client/assets/cose-bilkent-JH36ORCC-D2_1Vg5L.js.br +0 -0
  69. package/dist/client/assets/cose-bilkent-JH36ORCC-D2_1Vg5L.js.gz +0 -0
  70. package/dist/client/assets/{cynefin-OW5HDTMX-BwyEKhRj.js → cynefin-OW5HDTMX-C_zLtwow.js} +1 -1
  71. package/dist/client/assets/cynefin-OW5HDTMX-C_zLtwow.js.br +0 -0
  72. package/dist/client/assets/cynefin-OW5HDTMX-C_zLtwow.js.gz +0 -0
  73. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-C-37gprr.js → cynefinDiagram-5FMLGOSQ-B0Wvfl0v.js} +1 -1
  74. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-B0Wvfl0v.js.br +0 -0
  75. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-B0Wvfl0v.js.gz +0 -0
  76. package/dist/client/assets/{dagre-GXQ25YYZ-D-CrfEPO.js → dagre-GXQ25YYZ-D4dD95T3.js} +1 -1
  77. package/dist/client/assets/dagre-GXQ25YYZ-D4dD95T3.js.br +0 -0
  78. package/dist/client/assets/dagre-GXQ25YYZ-D4dD95T3.js.gz +0 -0
  79. package/dist/client/assets/{diagram-S7CK7UJ4-CWcwLpnZ.js → diagram-S7CK7UJ4-2nnj1lep.js} +1 -1
  80. package/dist/client/assets/diagram-S7CK7UJ4-2nnj1lep.js.br +0 -0
  81. package/dist/client/assets/diagram-S7CK7UJ4-2nnj1lep.js.gz +0 -0
  82. package/dist/client/assets/{diagram-UQ7AKVKN-DYBHXnFg.js → diagram-UQ7AKVKN-C9N4zQ8r.js} +1 -1
  83. package/dist/client/assets/diagram-UQ7AKVKN-C9N4zQ8r.js.br +0 -0
  84. package/dist/client/assets/diagram-UQ7AKVKN-C9N4zQ8r.js.gz +0 -0
  85. package/dist/client/assets/{diagram-VSXAHHWV-ChHGrhQk.js → diagram-VSXAHHWV-Cv7_lYe4.js} +1 -1
  86. package/dist/client/assets/diagram-VSXAHHWV-Cv7_lYe4.js.br +0 -0
  87. package/dist/client/assets/diagram-VSXAHHWV-Cv7_lYe4.js.gz +0 -0
  88. package/dist/client/assets/{diagram-VX7I27RA-BLRGz0tZ.js → diagram-VX7I27RA-BcgskUTT.js} +1 -1
  89. package/dist/client/assets/diagram-VX7I27RA-BcgskUTT.js.br +0 -0
  90. package/dist/client/assets/diagram-VX7I27RA-BcgskUTT.js.gz +0 -0
  91. package/dist/client/assets/{diagram-Z3DM3KII-1y-77z0j.js → diagram-Z3DM3KII-v37kk7HI.js} +1 -1
  92. package/dist/client/assets/diagram-Z3DM3KII-v37kk7HI.js.br +0 -0
  93. package/dist/client/assets/diagram-Z3DM3KII-v37kk7HI.js.gz +0 -0
  94. package/dist/client/assets/{ebnfDiagram-PWID7BFC-CkWYT96W.js → ebnfDiagram-PWID7BFC-CWRegGRp.js} +1 -1
  95. package/dist/client/assets/ebnfDiagram-PWID7BFC-CWRegGRp.js.br +0 -0
  96. package/dist/client/assets/ebnfDiagram-PWID7BFC-CWRegGRp.js.gz +0 -0
  97. package/dist/client/assets/{erDiagram-RLTQ6QDP-5UOgSbxO.js → erDiagram-RLTQ6QDP-C-a8Ptae.js} +1 -1
  98. package/dist/client/assets/erDiagram-RLTQ6QDP-C-a8Ptae.js.br +0 -0
  99. package/dist/client/assets/erDiagram-RLTQ6QDP-C-a8Ptae.js.gz +0 -0
  100. package/dist/client/assets/{flowDiagram-HODETNUW-B34ih9F5.js → flowDiagram-HODETNUW-CZQBLCvO.js} +1 -1
  101. package/dist/client/assets/flowDiagram-HODETNUW-CZQBLCvO.js.br +0 -0
  102. package/dist/client/assets/flowDiagram-HODETNUW-CZQBLCvO.js.gz +0 -0
  103. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-Df8xOtuv.js → ganttDiagram-EL5Y4UJY-CDJSVMvA.js} +1 -1
  104. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CDJSVMvA.js.br +0 -0
  105. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CDJSVMvA.js.gz +0 -0
  106. package/dist/client/assets/{gestureArbiter-BMlW6Vkl.js → gestureArbiter-3yU_eQSh.js} +1 -1
  107. package/dist/client/assets/gestureArbiter-3yU_eQSh.js.br +0 -0
  108. package/dist/client/assets/gestureArbiter-3yU_eQSh.js.gz +0 -0
  109. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-DCQxgM1e.js → gitGraphDiagram-WWUBYQGX-BpKnzvx5.js} +1 -1
  110. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BpKnzvx5.js.br +0 -0
  111. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BpKnzvx5.js.gz +0 -0
  112. package/dist/client/assets/{index-ovIMtffC.css → index-BzglvLj5.css} +1 -1
  113. package/dist/client/assets/{index-ovIMtffC.css.br → index-BzglvLj5.css.br} +0 -0
  114. package/dist/client/assets/{index-ovIMtffC.css.gz → index-BzglvLj5.css.gz} +0 -0
  115. package/dist/client/assets/{infoDiagram-27XIBGKW-BReB6pyw.js → infoDiagram-27XIBGKW-CvIbo5Yc.js} +1 -1
  116. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-Dxm41GIR.js → ishikawaDiagram-5VMMS53U-iTcusz9p.js} +1 -1
  117. package/dist/client/assets/ishikawaDiagram-5VMMS53U-iTcusz9p.js.br +0 -0
  118. package/dist/client/assets/ishikawaDiagram-5VMMS53U-iTcusz9p.js.gz +0 -0
  119. package/dist/client/assets/{journeyDiagram-3NMN7TZE-6EeNJsvk.js → journeyDiagram-3NMN7TZE-AnHrPTVQ.js} +1 -1
  120. package/dist/client/assets/journeyDiagram-3NMN7TZE-AnHrPTVQ.js.br +0 -0
  121. package/dist/client/assets/journeyDiagram-3NMN7TZE-AnHrPTVQ.js.gz +0 -0
  122. package/dist/client/assets/{kanban-definition-UXKFOSKX-Cqy7b348.js → kanban-definition-UXKFOSKX-BSGQKNkn.js} +1 -1
  123. package/dist/client/assets/kanban-definition-UXKFOSKX-BSGQKNkn.js.br +0 -0
  124. package/dist/client/assets/kanban-definition-UXKFOSKX-BSGQKNkn.js.gz +0 -0
  125. package/dist/client/assets/{layout-2zQZggOo.js → layout-DWfvuKxK.js} +1 -1
  126. package/dist/client/assets/layout-DWfvuKxK.js.br +0 -0
  127. package/dist/client/assets/layout-DWfvuKxK.js.gz +0 -0
  128. package/dist/client/assets/{linear-B_n7SwkQ.js → linear-YGUC9oFd.js} +1 -1
  129. package/dist/client/assets/linear-YGUC9oFd.js.br +0 -0
  130. package/dist/client/assets/linear-YGUC9oFd.js.gz +0 -0
  131. package/dist/client/assets/{mermaid.core-BbAe0O0I.js → mermaid.core-C2ofdbDu.js} +5 -5
  132. package/dist/client/assets/mermaid.core-C2ofdbDu.js.br +0 -0
  133. package/dist/client/assets/mermaid.core-C2ofdbDu.js.gz +0 -0
  134. package/dist/client/assets/{mindmap-definition-YA3MSWOX-9cQsoIK-.js → mindmap-definition-YA3MSWOX-DhpmPHTj.js} +1 -1
  135. package/dist/client/assets/mindmap-definition-YA3MSWOX-DhpmPHTj.js.br +0 -0
  136. package/dist/client/assets/mindmap-definition-YA3MSWOX-DhpmPHTj.js.gz +0 -0
  137. package/dist/client/assets/{passwordBootstrap-D20oiv4Y.js → passwordBootstrap-VsBMR4A9.js} +2 -2
  138. package/dist/client/assets/passwordBootstrap-VsBMR4A9.js.br +0 -0
  139. package/dist/client/assets/passwordBootstrap-VsBMR4A9.js.gz +0 -0
  140. package/dist/client/assets/{pegDiagram-XKGWAZYB-DAJtEqBo.js → pegDiagram-XKGWAZYB-BRFYfMc1.js} +1 -1
  141. package/dist/client/assets/pegDiagram-XKGWAZYB-BRFYfMc1.js.br +0 -0
  142. package/dist/client/assets/pegDiagram-XKGWAZYB-BRFYfMc1.js.gz +0 -0
  143. package/dist/client/assets/{pieDiagram-E7YTZNPT-BfTrVCVw.js → pieDiagram-E7YTZNPT-B3r-kmkG.js} +1 -1
  144. package/dist/client/assets/pieDiagram-E7YTZNPT-B3r-kmkG.js.br +0 -0
  145. package/dist/client/assets/pieDiagram-E7YTZNPT-B3r-kmkG.js.gz +0 -0
  146. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-O0-rsLC6.js → quadrantDiagram-AXDQQJYC-DR1I_zXC.js} +1 -1
  147. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DR1I_zXC.js.br +0 -0
  148. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DR1I_zXC.js.gz +0 -0
  149. package/dist/client/assets/{railroadDiagram-O6MQD6OU-BmnxmIkC.js → railroadDiagram-O6MQD6OU-Bvfl-CvM.js} +1 -1
  150. package/dist/client/assets/railroadDiagram-O6MQD6OU-Bvfl-CvM.js.br +0 -0
  151. package/dist/client/assets/railroadDiagram-O6MQD6OU-Bvfl-CvM.js.gz +0 -0
  152. package/dist/client/assets/{referenceLongPress-CCa3ab0P.js → referenceLongPress-X-OUHgyO.js} +1 -1
  153. package/dist/client/assets/referenceLongPress-X-OUHgyO.js.br +0 -0
  154. package/dist/client/assets/referenceLongPress-X-OUHgyO.js.gz +0 -0
  155. package/dist/client/assets/{requirementDiagram-BXWQKSXE-DDkFvkBr.js → requirementDiagram-BXWQKSXE-C77Ip0mm.js} +1 -1
  156. package/dist/client/assets/requirementDiagram-BXWQKSXE-C77Ip0mm.js.br +0 -0
  157. package/dist/client/assets/requirementDiagram-BXWQKSXE-C77Ip0mm.js.gz +0 -0
  158. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-D9FHbxr4.js → sankeyDiagram-P5KCCOFB-C1irBgQp.js} +1 -1
  159. package/dist/client/assets/sankeyDiagram-P5KCCOFB-C1irBgQp.js.br +0 -0
  160. package/dist/client/assets/sankeyDiagram-P5KCCOFB-C1irBgQp.js.gz +0 -0
  161. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-CNiMBOrr.js → sequenceDiagram-WJ2MYXX4-ziivSu_M.js} +1 -1
  162. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-ziivSu_M.js.br +0 -0
  163. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-ziivSu_M.js.gz +0 -0
  164. package/dist/client/assets/{sizeCapture-INFHLROL-aQkXiDbr.js → sizeCapture-INFHLROL-Bd6W2W84.js} +1 -1
  165. package/dist/client/assets/sizeCapture-INFHLROL-Bd6W2W84.js.br +0 -0
  166. package/dist/client/assets/sizeCapture-INFHLROL-Bd6W2W84.js.gz +0 -0
  167. package/dist/client/assets/{sparkles-DOMB8YK5.js → sparkles-CnZrFoGY.js} +1 -1
  168. package/dist/client/assets/{stateDiagram-D77RDMKH-Cy-ouYt1.js → stateDiagram-D77RDMKH-Dbp0hGDY.js} +1 -1
  169. package/dist/client/assets/stateDiagram-D77RDMKH-Dbp0hGDY.js.br +0 -0
  170. package/dist/client/assets/stateDiagram-D77RDMKH-Dbp0hGDY.js.gz +0 -0
  171. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-DC2wSMDB.js +1 -0
  172. package/dist/client/assets/{swimlanes-42K2YHIH-CzalwHK_.js → swimlanes-42K2YHIH-C2Dr-53Y.js} +1 -1
  173. package/dist/client/assets/swimlanes-42K2YHIH-C2Dr-53Y.js.br +0 -0
  174. package/dist/client/assets/swimlanes-42K2YHIH-C2Dr-53Y.js.gz +0 -0
  175. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-HYd7_s0l.js +8 -0
  176. package/dist/client/assets/{timeline-definition-24CTP7MA-6mx1eXdq.js → timeline-definition-24CTP7MA-D-bKj_yT.js} +1 -1
  177. package/dist/client/assets/timeline-definition-24CTP7MA-D-bKj_yT.js.br +0 -0
  178. package/dist/client/assets/{timeline-definition-24CTP7MA-6mx1eXdq.js.gz → timeline-definition-24CTP7MA-D-bKj_yT.js.gz} +0 -0
  179. package/dist/client/assets/{triangle-alert-Ddcj0Ymu.js → triangle-alert-D1EDVJ4z.js} +1 -1
  180. package/dist/client/assets/{vennDiagram-4TSXK5OY-lYrJr0Ul.js → vennDiagram-4TSXK5OY-Dxo8DU3z.js} +1 -1
  181. package/dist/client/assets/vennDiagram-4TSXK5OY-Dxo8DU3z.js.br +0 -0
  182. package/dist/client/assets/vennDiagram-4TSXK5OY-Dxo8DU3z.js.gz +0 -0
  183. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-n0hxf-l2.js → wardleyDiagram-VM6X3IG4-BZMkLNpR.js} +1 -1
  184. package/dist/client/assets/wardleyDiagram-VM6X3IG4-BZMkLNpR.js.br +0 -0
  185. package/dist/client/assets/wardleyDiagram-VM6X3IG4-BZMkLNpR.js.gz +0 -0
  186. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-CEAOqXIs.js → xychartDiagram-S5SC5T6Z-CbxLQ8Sa.js} +1 -1
  187. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CbxLQ8Sa.js.br +0 -0
  188. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CbxLQ8Sa.js.gz +0 -0
  189. package/dist/client/index.html +2 -2
  190. package/dist/client/index.html.br +0 -0
  191. package/dist/client/index.html.gz +0 -0
  192. package/dist/client/sw.js +1 -1
  193. package/dist/client/sw.js.br +0 -0
  194. package/dist/client/sw.js.gz +0 -0
  195. package/dist/server/agent/collaborationCli.js +113 -33
  196. package/dist/server/agent/collaborationPeerTransport.js +441 -0
  197. package/dist/server/agent/collaborationPrompt.js +10 -4
  198. package/dist/server/agent/collaborationRoutes.js +75 -15
  199. package/dist/server/agent/collaborationStore.js +108 -23
  200. package/dist/server/agent/collaborationText.js +5 -0
  201. package/dist/server/agent/collaborationTmuxDelivery.js +9 -6
  202. package/dist/server/entry.js +42 -2
  203. package/dist/server/federation/runtime.js +7 -2
  204. package/dist/server/routes/terminal.js +48 -20
  205. package/package.json +1 -1
  206. package/runtime-manifest.json +3 -3
  207. package/dist/client/assets/App-C2R-hBtg.js +0 -155
  208. package/dist/client/assets/App-C2R-hBtg.js.br +0 -0
  209. package/dist/client/assets/App-C2R-hBtg.js.gz +0 -0
  210. package/dist/client/assets/ChangeWalkthroughPanel-BoJ_fimI.js.br +0 -0
  211. package/dist/client/assets/ChangeWalkthroughPanel-BoJ_fimI.js.gz +0 -0
  212. package/dist/client/assets/DagPlayground-Ds7ArhFS.js.br +0 -0
  213. package/dist/client/assets/DagPlayground-Ds7ArhFS.js.gz +0 -0
  214. package/dist/client/assets/DiffLab-Bbse8Ju0.js.br +0 -0
  215. package/dist/client/assets/DiffLab-Bbse8Ju0.js.gz +0 -0
  216. package/dist/client/assets/DiffReview-83Xj6PCu.js.br +0 -0
  217. package/dist/client/assets/DiffReview-83Xj6PCu.js.gz +0 -0
  218. package/dist/client/assets/DiffReviewLab-DFn8TDlG.js.br +0 -0
  219. package/dist/client/assets/DiffReviewLab-DFn8TDlG.js.gz +0 -0
  220. package/dist/client/assets/DiffViewer-DbOviqxz.js.br +0 -0
  221. package/dist/client/assets/DiffViewer-DbOviqxz.js.gz +0 -0
  222. package/dist/client/assets/ModelPreview-DTbtvbXf.js.br +0 -0
  223. package/dist/client/assets/ModelPreview-DTbtvbXf.js.gz +0 -0
  224. package/dist/client/assets/RightSidebar-CkBjWyP3.js.br +0 -0
  225. package/dist/client/assets/RightSidebar-CkBjWyP3.js.gz +0 -0
  226. package/dist/client/assets/abnfDiagram-VCTEODGH-DNI-fpHF.js.br +0 -0
  227. package/dist/client/assets/abnfDiagram-VCTEODGH-DNI-fpHF.js.gz +0 -0
  228. package/dist/client/assets/app-pwlY5amH.js +0 -35
  229. package/dist/client/assets/app-pwlY5amH.js.br +0 -0
  230. package/dist/client/assets/app-pwlY5amH.js.gz +0 -0
  231. package/dist/client/assets/arc-BTzsKyvV.js.br +0 -0
  232. package/dist/client/assets/arc-BTzsKyvV.js.gz +0 -0
  233. package/dist/client/assets/architectureDiagram-5GKGNRK7-zSPsJaBw.js.br +0 -0
  234. package/dist/client/assets/architectureDiagram-5GKGNRK7-zSPsJaBw.js.gz +0 -0
  235. package/dist/client/assets/blockDiagram-I7D4REHJ-DrKjCBZz.js.br +0 -0
  236. package/dist/client/assets/blockDiagram-I7D4REHJ-DrKjCBZz.js.gz +0 -0
  237. package/dist/client/assets/c4Diagram-7LVT6UL2-TcGgIvXV.js.br +0 -0
  238. package/dist/client/assets/c4Diagram-7LVT6UL2-TcGgIvXV.js.gz +0 -0
  239. package/dist/client/assets/channel-DXA5J9pS.js +0 -1
  240. package/dist/client/assets/chunk-F27PBJKO-D7sV_zVS.js.br +0 -0
  241. package/dist/client/assets/chunk-F27PBJKO-D7sV_zVS.js.gz +0 -0
  242. package/dist/client/assets/chunk-IMKFNOWR-8EiaBwNr.js.br +0 -0
  243. package/dist/client/assets/chunk-IMKFNOWR-8EiaBwNr.js.gz +0 -0
  244. package/dist/client/assets/chunk-SVP7TREG-BNSQ1QfI.js.br +0 -0
  245. package/dist/client/assets/chunk-SVP7TREG-BNSQ1QfI.js.gz +0 -0
  246. package/dist/client/assets/chunk-TICWLB2K-DDkkYDMp.js.br +0 -0
  247. package/dist/client/assets/chunk-TICWLB2K-DDkkYDMp.js.gz +0 -0
  248. package/dist/client/assets/classDiagram-ZZMXUADV-CRTloq-v.js +0 -1
  249. package/dist/client/assets/classDiagram-v2-VYDZK3BY-CRTloq-v.js +0 -1
  250. package/dist/client/assets/cose-bilkent-JH36ORCC-D1SSHh8-.js.br +0 -0
  251. package/dist/client/assets/cose-bilkent-JH36ORCC-D1SSHh8-.js.gz +0 -0
  252. package/dist/client/assets/cynefin-OW5HDTMX-BwyEKhRj.js.br +0 -0
  253. package/dist/client/assets/cynefin-OW5HDTMX-BwyEKhRj.js.gz +0 -0
  254. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-C-37gprr.js.br +0 -0
  255. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-C-37gprr.js.gz +0 -0
  256. package/dist/client/assets/dagre-GXQ25YYZ-D-CrfEPO.js.br +0 -0
  257. package/dist/client/assets/dagre-GXQ25YYZ-D-CrfEPO.js.gz +0 -0
  258. package/dist/client/assets/diagram-S7CK7UJ4-CWcwLpnZ.js.br +0 -0
  259. package/dist/client/assets/diagram-S7CK7UJ4-CWcwLpnZ.js.gz +0 -0
  260. package/dist/client/assets/diagram-UQ7AKVKN-DYBHXnFg.js.br +0 -0
  261. package/dist/client/assets/diagram-UQ7AKVKN-DYBHXnFg.js.gz +0 -0
  262. package/dist/client/assets/diagram-VSXAHHWV-ChHGrhQk.js.br +0 -0
  263. package/dist/client/assets/diagram-VSXAHHWV-ChHGrhQk.js.gz +0 -0
  264. package/dist/client/assets/diagram-VX7I27RA-BLRGz0tZ.js.br +0 -0
  265. package/dist/client/assets/diagram-VX7I27RA-BLRGz0tZ.js.gz +0 -0
  266. package/dist/client/assets/diagram-Z3DM3KII-1y-77z0j.js.br +0 -0
  267. package/dist/client/assets/diagram-Z3DM3KII-1y-77z0j.js.gz +0 -0
  268. package/dist/client/assets/ebnfDiagram-PWID7BFC-CkWYT96W.js.br +0 -0
  269. package/dist/client/assets/ebnfDiagram-PWID7BFC-CkWYT96W.js.gz +0 -0
  270. package/dist/client/assets/erDiagram-RLTQ6QDP-5UOgSbxO.js.br +0 -0
  271. package/dist/client/assets/erDiagram-RLTQ6QDP-5UOgSbxO.js.gz +0 -0
  272. package/dist/client/assets/flowDiagram-HODETNUW-B34ih9F5.js.br +0 -0
  273. package/dist/client/assets/flowDiagram-HODETNUW-B34ih9F5.js.gz +0 -0
  274. package/dist/client/assets/ganttDiagram-EL5Y4UJY-Df8xOtuv.js.br +0 -0
  275. package/dist/client/assets/ganttDiagram-EL5Y4UJY-Df8xOtuv.js.gz +0 -0
  276. package/dist/client/assets/gestureArbiter-BMlW6Vkl.js.br +0 -0
  277. package/dist/client/assets/gestureArbiter-BMlW6Vkl.js.gz +0 -0
  278. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DCQxgM1e.js.br +0 -0
  279. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DCQxgM1e.js.gz +0 -0
  280. package/dist/client/assets/ishikawaDiagram-5VMMS53U-Dxm41GIR.js.br +0 -0
  281. package/dist/client/assets/ishikawaDiagram-5VMMS53U-Dxm41GIR.js.gz +0 -0
  282. package/dist/client/assets/journeyDiagram-3NMN7TZE-6EeNJsvk.js.br +0 -0
  283. package/dist/client/assets/journeyDiagram-3NMN7TZE-6EeNJsvk.js.gz +0 -0
  284. package/dist/client/assets/kanban-definition-UXKFOSKX-Cqy7b348.js.br +0 -0
  285. package/dist/client/assets/kanban-definition-UXKFOSKX-Cqy7b348.js.gz +0 -0
  286. package/dist/client/assets/layout-2zQZggOo.js.br +0 -0
  287. package/dist/client/assets/layout-2zQZggOo.js.gz +0 -0
  288. package/dist/client/assets/linear-B_n7SwkQ.js.br +0 -0
  289. package/dist/client/assets/linear-B_n7SwkQ.js.gz +0 -0
  290. package/dist/client/assets/mermaid.core-BbAe0O0I.js.br +0 -0
  291. package/dist/client/assets/mermaid.core-BbAe0O0I.js.gz +0 -0
  292. package/dist/client/assets/mindmap-definition-YA3MSWOX-9cQsoIK-.js.br +0 -0
  293. package/dist/client/assets/mindmap-definition-YA3MSWOX-9cQsoIK-.js.gz +0 -0
  294. package/dist/client/assets/passwordBootstrap-D20oiv4Y.js.br +0 -0
  295. package/dist/client/assets/passwordBootstrap-D20oiv4Y.js.gz +0 -0
  296. package/dist/client/assets/pegDiagram-XKGWAZYB-DAJtEqBo.js.br +0 -0
  297. package/dist/client/assets/pegDiagram-XKGWAZYB-DAJtEqBo.js.gz +0 -0
  298. package/dist/client/assets/pieDiagram-E7YTZNPT-BfTrVCVw.js.br +0 -0
  299. package/dist/client/assets/pieDiagram-E7YTZNPT-BfTrVCVw.js.gz +0 -0
  300. package/dist/client/assets/quadrantDiagram-AXDQQJYC-O0-rsLC6.js.br +0 -0
  301. package/dist/client/assets/quadrantDiagram-AXDQQJYC-O0-rsLC6.js.gz +0 -0
  302. package/dist/client/assets/railroadDiagram-O6MQD6OU-BmnxmIkC.js.br +0 -0
  303. package/dist/client/assets/railroadDiagram-O6MQD6OU-BmnxmIkC.js.gz +0 -0
  304. package/dist/client/assets/referenceLongPress-CCa3ab0P.js.br +0 -0
  305. package/dist/client/assets/referenceLongPress-CCa3ab0P.js.gz +0 -0
  306. package/dist/client/assets/requirementDiagram-BXWQKSXE-DDkFvkBr.js.br +0 -0
  307. package/dist/client/assets/requirementDiagram-BXWQKSXE-DDkFvkBr.js.gz +0 -0
  308. package/dist/client/assets/sankeyDiagram-P5KCCOFB-D9FHbxr4.js.br +0 -0
  309. package/dist/client/assets/sankeyDiagram-P5KCCOFB-D9FHbxr4.js.gz +0 -0
  310. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CNiMBOrr.js.br +0 -0
  311. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CNiMBOrr.js.gz +0 -0
  312. package/dist/client/assets/sizeCapture-INFHLROL-aQkXiDbr.js.br +0 -0
  313. package/dist/client/assets/sizeCapture-INFHLROL-aQkXiDbr.js.gz +0 -0
  314. package/dist/client/assets/stateDiagram-D77RDMKH-Cy-ouYt1.js.br +0 -0
  315. package/dist/client/assets/stateDiagram-D77RDMKH-Cy-ouYt1.js.gz +0 -0
  316. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BBcvA2eS.js +0 -1
  317. package/dist/client/assets/swimlanes-42K2YHIH-CzalwHK_.js.br +0 -0
  318. package/dist/client/assets/swimlanes-42K2YHIH-CzalwHK_.js.gz +0 -0
  319. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DG4zIqD3.js +0 -8
  320. package/dist/client/assets/timeline-definition-24CTP7MA-6mx1eXdq.js.br +0 -0
  321. package/dist/client/assets/vennDiagram-4TSXK5OY-lYrJr0Ul.js.br +0 -0
  322. package/dist/client/assets/vennDiagram-4TSXK5OY-lYrJr0Ul.js.gz +0 -0
  323. package/dist/client/assets/wardleyDiagram-VM6X3IG4-n0hxf-l2.js.br +0 -0
  324. package/dist/client/assets/wardleyDiagram-VM6X3IG4-n0hxf-l2.js.gz +0 -0
  325. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CEAOqXIs.js.br +0 -0
  326. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CEAOqXIs.js.gz +0 -0
@@ -18,6 +18,13 @@ export const COLLAB_HELP = `td collab — durable messages; no agent-specific ho
18
18
  Scheduled self-reminders: td automation create --name 'Review progress' --every 30 --self --prompt 'Review group progress and continue'
19
19
  Scheduling help: td automation --help
20
20
  status | capabilities
21
+ transport info
22
+ Print this service's public identity and CA fingerprint (no private keys).
23
+ transport register <group-id> --file <nodes.json>
24
+ One-time server peer registration; nodes.json is an array of public
25
+ {serviceId, origin, caFingerprint256?} entries, including this service.
26
+ Obtain pins from each administrator's transport info over a trusted channel.
27
+ Registered servers deliver without an open browser or Desktop client.
21
28
  rebind [--pane %3] (explicitly bind this peer to its current Agent; resumes queued delivery)
22
29
  send <session-id> <message> | reply <message-id> <message> | handoff <session-id> <message>
23
30
  (send fan-out: comma-separated same-group ids, e.g. send a,b "任务"; every
@@ -25,23 +32,27 @@ export const COLLAB_HELP = `td collab — durable messages; no agent-specific ho
25
32
  single-recipient sends only)
26
33
  --group <id> --thread <id> --idempotency-key <key>
27
34
  --file <path> | --stdin (instead of inline body; -- ends option parsing)
28
- --wait-until queued|delivered|read --timeout 30s
35
+ --wait-until queued|delivered --timeout 30s
29
36
  --expect-reply ack|result|any
30
37
  --response-kind ack|progress|result --metadata '<JSON object>'
31
38
  --expires-at <ISO timestamp or epoch milliseconds>
32
39
  reply: --task-envelope '<JSON: task_id,status,progress?,evidence?,blocker?>'
33
40
  (status reporting happens only via reply; send/handoff dispatch carries no task state)
34
- message get <message-id> [--receipt-only]
41
+ message get <message-id> [--receipt-only] [--raw]
35
42
  message confirm-shell <message-id> (sender confirms delivery into a shell; continues the same message)
36
- message read <message-id> (explicit consumption; not application ACK)
37
- message watch <message-id> [--wait-until delivered|read] [--timeout 30s]
38
- inbox [--unread] [--since <ISO or epoch-ms>] [--after-id <id>]
43
+ message watch <message-id> [--wait-until delivered] [--timeout 30s]
44
+ inbox [--since <ISO or epoch-ms>] [--after-id <id>]
39
45
  [--cursor <token>] [--consumer <name>] [--limit 1..200]
40
46
  [--from <id>] [--group <id>] [--thread <id>] [--kind <kind>]
41
47
  [--response-kind ack|progress|result] [--follow] [--timeout 30s]
42
48
  cursor commit <token> --consumer <name> (commit after processing the page)
43
49
  add|remove <group-id> <session-id>
44
50
  spawn <group-id> <agent-slug> [--name <name>] [--cwd <path>] [--task <text>]
51
+ rules get <group-id> [--text]
52
+ rules set <group-id> <text> | --file <path> | --stdin [--if-version <version>]
53
+ rules clear <group-id> [--if-version <version>]
54
+ Shared group guidance, up to 8192 UTF-8 bytes; message envelopes retain its version.
55
+ traits list|set|unset (alias of role; long-lived capabilities/preferences)
45
56
  role list <group-id>
46
57
  role set <group-id> <session-id> <role…> (trailing words join as the role)
47
58
  role unset <group-id> <session-id>
@@ -49,7 +60,7 @@ export const COLLAB_HELP = `td collab — durable messages; no agent-specific ho
49
60
  rides the delivery shell header)
50
61
  rename <session-id> <name…> (rename a member of any shared group;
51
62
  trailing words join as the new name; roster and shells show it at once)
52
- capture <session-id> [--text]
63
+ capture <session-id> [--lines 1..10000] [--raw] [--text]
53
64
  (查看伙伴正在做什么:读取同组、本机 tmux 成员的当前屏幕,不发送按键、不打断对方。
54
65
  需要了解进展、排查卡住或决定是否跟进时先 capture;不是完整聊天历史或完成凭证。
55
66
  用 status --text 查成员 ID;不支持远端成员,远端请 send 询问进展。)
@@ -74,17 +85,17 @@ Exit codes: 0 requested condition met; 1 invalid request/network error;
74
85
  cleanup without --confirm prints the plan and refuses (also 1);
75
86
  2 wait timeout (message may still deliver); 3 failed/expired.
76
87
  Message limit: ${COLLAB_LIMITS.message_bytes} UTF-8 bytes; metadata: ${COLLAB_LIMITS.metadata_bytes} bytes.
77
- Idempotency retention: 7 days. read/ACK/result never imply each other.
78
- Inbox defaults to unread first, newest 50; cursor/consumer mode reads oldest unseen first.
79
- Reading never advances a consumer or marks messages read automatically.`;
88
+ Idempotency retention: 7 days. Terminal delivery, ACK and result never imply each other.
89
+ Inbox defaults to newest 50; cursor/consumer mode reads oldest unseen first.
90
+ Reading never advances a consumer. Read receipts are not supported.`;
80
91
  /** One roster row: prefer the member's human name, keep the full session id
81
92
  * reachable for role set/unset targeting, mark unset members explicitly. */
82
93
  function roleLine(member, role) {
83
94
  const label = member.name ? `${member.name} (${member.sessionId})` : member.sessionId;
84
95
  return role ? `- ${label}:${role}` : `- ${label}(未设置)`;
85
96
  }
86
- const BOOLEAN_OPTIONS = new Set(['json', 'jsonl', 'text', 'unread', 'follow', 'stdin', 'receipt-only', 'confirm', 'help']);
87
- const VALUE_OPTIONS = new Set(['session', 'group', 'thread', 'idempotency-key', 'file', 'wait-until', 'timeout', 'expect-reply', 'response-kind', 'metadata', 'task-envelope', 'expires-at', 'since', 'after-id', 'cursor', 'consumer', 'limit', 'from', 'kind', 'name', 'cwd', 'task', 'pane']);
97
+ const BOOLEAN_OPTIONS = new Set(['json', 'jsonl', 'text', 'follow', 'stdin', 'receipt-only', 'confirm', 'raw', 'help']);
98
+ const VALUE_OPTIONS = new Set(['session', 'group', 'thread', 'idempotency-key', 'file', 'wait-until', 'timeout', 'expect-reply', 'response-kind', 'metadata', 'task-envelope', 'expires-at', 'since', 'after-id', 'cursor', 'consumer', 'limit', 'from', 'kind', 'name', 'cwd', 'task', 'pane', 'lines', 'if-version']);
88
99
  export function parseCollaborationCommand(argv) {
89
100
  const options = {};
90
101
  const positional = [];
@@ -118,11 +129,11 @@ export function parseCollaborationCommand(argv) {
118
129
  // A discoverable read-only entry point, sharing capture's existing scope and transport.
119
130
  if (requestedAction === 'capture') {
120
131
  if (positional.length !== 1)
121
- throw new Error('Usage: td collab capture <session-id> [--text]');
132
+ throw new Error('Usage: td collab capture <session-id> [--lines 1..10000] [--raw] [--text]');
122
133
  positional.push('capture');
123
134
  }
124
- const action = (requestedAction === 'capture' ? 'drive' : requestedAction);
125
- if (!['status', 'inbox', 'send', 'handoff', 'reply', 'add', 'remove', 'spawn', 'message', 'cursor', 'rebind', 'role', 'rename', 'cleanup', 'drive', 'capabilities', 'help'].includes(action))
135
+ const action = (requestedAction === 'capture' ? 'drive' : requestedAction === 'traits' ? 'role' : requestedAction);
136
+ if (!['status', 'inbox', 'send', 'handoff', 'reply', 'add', 'remove', 'spawn', 'message', 'cursor', 'rebind', 'role', 'rename', 'cleanup', 'drive', 'capabilities', 'transport', 'rules', 'help'].includes(action))
126
137
  throw new Error('Unknown collaboration command; see td collab --help');
127
138
  if (typeof options.session === 'string' && !options.session.trim())
128
139
  throw new Error('--session requires a non-empty full Termdock session id');
@@ -130,8 +141,8 @@ export function parseCollaborationCommand(argv) {
130
141
  throw new Error('pane must be a tmux pane id such as %3');
131
142
  if (['json', 'jsonl', 'text'].filter((key) => options[key]).length > 1)
132
143
  throw new Error('Choose one output format');
133
- if (options['wait-until'] && !['queued', 'delivered', 'read'].includes(String(options['wait-until'])))
134
- throw new Error('wait-until must be queued, delivered or read');
144
+ if (options['wait-until'] && !['queued', 'delivered'].includes(String(options['wait-until'])))
145
+ throw new Error('wait-until must be queued or delivered');
135
146
  if (options['expect-reply'] && !['ack', 'result', 'any'].includes(String(options['expect-reply'])))
136
147
  throw new Error('expect-reply must be ack, result or any');
137
148
  if (options.timeout)
@@ -145,11 +156,29 @@ export function parseCollaborationCommand(argv) {
145
156
  if ([Boolean(command.message), Boolean(options.file), Boolean(options.stdin)].filter(Boolean).length !== 1)
146
157
  throw new Error('Choose inline body, --file, or --stdin');
147
158
  }
159
+ else if (action === 'rules') {
160
+ command.operation = positional.shift();
161
+ command.groupId = positional.shift();
162
+ command.message = positional.join(' ');
163
+ if (!command.groupId || !['get', 'set', 'clear'].includes(command.operation ?? ''))
164
+ throw new Error('Usage: td collab rules get|set|clear <group-id>');
165
+ if (command.operation === 'set' ? [Boolean(command.message), Boolean(options.file), Boolean(options.stdin)].filter(Boolean).length !== 1
166
+ : Boolean(command.message || options.file || options.stdin))
167
+ throw new Error('rules set requires inline text, --file or --stdin');
168
+ }
169
+ else if (action === 'transport') {
170
+ command.operation = positional.shift();
171
+ command.groupId = positional.shift();
172
+ if (positional.length || !['info', 'register'].includes(command.operation ?? '')
173
+ || (command.operation === 'info' ? command.groupId || options.file : !command.groupId || !options.file)) {
174
+ throw new Error('Usage: td collab transport info | transport register <group-id> --file <nodes.json>');
175
+ }
176
+ }
148
177
  else if (action === 'message') {
149
178
  command.operation = positional.shift();
150
179
  command.target = positional.shift();
151
- if (!['get', 'watch', 'read', 'confirm-shell'].includes(command.operation ?? '') || !command.target || positional.length)
152
- throw new Error('Usage: td collab message get|watch|read|confirm-shell <id>');
180
+ if (!['get', 'watch', 'confirm-shell'].includes(command.operation ?? '') || !command.target || positional.length)
181
+ throw new Error('Usage: td collab message get|watch|confirm-shell <id>');
153
182
  }
154
183
  else if (action === 'cursor') {
155
184
  command.operation = positional.shift();
@@ -219,21 +248,23 @@ export function parseCollaborationCommand(argv) {
219
248
  throw new Error(`Unexpected arguments for ${action}`);
220
249
  const allowed = new Set(['json', 'jsonl', 'text', 'help', 'session']);
221
250
  const byAction = {
222
- status: [], capabilities: [], rebind: ['pane'], help: [...BOOLEAN_OPTIONS, ...VALUE_OPTIONS],
251
+ rules: ['file', 'stdin', 'if-version'], transport: ['file'], status: [], capabilities: [], rebind: ['pane'], help: [...BOOLEAN_OPTIONS, ...VALUE_OPTIONS],
223
252
  send: ['group', 'thread', 'idempotency-key', 'file', 'stdin', 'wait-until', 'timeout', 'expect-reply', 'response-kind', 'metadata', 'expires-at', 'kind'],
224
253
  handoff: ['group', 'thread', 'idempotency-key', 'file', 'stdin', 'wait-until', 'timeout', 'expect-reply', 'response-kind', 'metadata', 'expires-at'],
225
254
  reply: ['idempotency-key', 'file', 'stdin', 'wait-until', 'timeout', 'expect-reply', 'response-kind', 'metadata', 'task-envelope', 'expires-at'],
226
- inbox: ['unread', 'since', 'after-id', 'cursor', 'consumer', 'limit', 'from', 'group', 'thread', 'kind', 'response-kind', 'follow', 'timeout'],
227
- message: ['receipt-only', 'follow', 'wait-until', 'timeout', 'expect-reply'], cursor: ['consumer'],
228
- add: [], remove: [], spawn: ['name', 'cwd', 'task'], role: [], rename: [], cleanup: ['confirm'], drive: [],
255
+ inbox: ['raw', 'since', 'after-id', 'cursor', 'consumer', 'limit', 'from', 'group', 'thread', 'kind', 'response-kind', 'follow', 'timeout'],
256
+ message: ['raw', 'receipt-only', 'follow', 'wait-until', 'timeout', 'expect-reply'], cursor: ['consumer'],
257
+ add: [], remove: [], spawn: ['name', 'cwd', 'task'], role: [], rename: [], cleanup: ['confirm'], drive: ['lines', 'raw'],
229
258
  };
230
259
  for (const option of byAction[action])
231
260
  allowed.add(option);
232
261
  for (const option of Object.keys(options))
233
262
  if (!allowed.has(option))
234
263
  throw new Error(`--${option} is not supported by ${action}`);
235
- if (action === 'message' && command.operation === 'read' && Object.keys(options).some((option) => !['json', 'jsonl', 'text', 'help', 'session'].includes(option)))
236
- throw new Error('message read does not accept wait or filtering options');
264
+ if (options.lines && (!/^\d+$/.test(String(options.lines)) || Number(options.lines) < 1 || Number(options.lines) > 10000))
265
+ throw new Error('--lines must be 1..10000 history rows');
266
+ if (action === 'drive' && command.operation !== 'capture' && (options.lines || options.raw))
267
+ throw new Error('--lines/--raw only apply to capture');
237
268
  return command;
238
269
  }
239
270
  export function duration(value) {
@@ -244,7 +275,7 @@ export function duration(value) {
244
275
  return result;
245
276
  }
246
277
  export function waitSatisfied(receipt, stage, reply) {
247
- const reached = stage === 'queued' || (stage === 'delivered' && ['delivered', 'read'].includes(receipt.status)) || (stage === 'read' && receipt.status === 'read');
278
+ const reached = stage === 'queued' || (stage === 'delivered' && ['delivered', 'read'].includes(receipt.status));
248
279
  return reached && (!reply || (reply === 'ack' ? receipt.ack_at != null : reply === 'result' ? receipt.result_ids?.length > 0 : receipt.reply_ids?.length > 0));
249
280
  }
250
281
  export async function executeCollaborationCommand(command, context, io) {
@@ -279,12 +310,15 @@ export async function executeCollaborationCommand(command, context, io) {
279
310
  io.write(`同时发给了:${fanIds.map((id) => names[id] ?? id).join('、')}`);
280
311
  io.write(message.content);
281
312
  }
282
- else if (value.message)
313
+ else if (value.message) {
314
+ if (value.message.instructions?.text)
315
+ io.write(`协作约定(版本 ${value.message.instructions.version}):\n${value.message.instructions.text}`);
283
316
  io.write(`[${value.status}] ${canonicalShortId(String(value.message_id ?? ''))}\n${value.message.content}`);
317
+ }
284
318
  else if (value.message_id) {
285
319
  io.write(`${value.status} ${canonicalShortId(String(value.message_id))}${value.thread_id ? ` thread=${canonicalShortId(String(value.thread_id))}` : ''}${value.code ? ` ${value.code}` : ''}${value.failure_reason ? ` ${value.failure_reason}` : ''}`);
286
320
  // A timeout after the wait stage itself was reached means delivery
287
- // (or reading) completed — only the expected reply/result is late.
321
+ // completed — only the expected reply/result is late.
288
322
  if (value.code === 'WAIT_TIMEOUT' && value.stage_reached && value.expect_reply) {
289
323
  io.write(`\n投递已完成;等待${value.expect_reply === 'result' ? '结果' : '回复'}超时(expect-reply=${value.expect_reply})`);
290
324
  }
@@ -309,6 +343,37 @@ export async function executeCollaborationCommand(command, context, io) {
309
343
  let receipt;
310
344
  let idempotencyKey;
311
345
  try {
346
+ if (command.action === 'rules') {
347
+ let body;
348
+ if (command.operation === 'get')
349
+ body = await request('GET', `/rules?group=${encodeURIComponent(command.groupId)}`);
350
+ else {
351
+ if (o.stdin && !io.stdin)
352
+ throw new Error('stdin is unavailable');
353
+ if (o.file && fs.statSync(String(o.file)).size > 8192)
354
+ throw new Error('群规最多 8192 UTF-8 字节');
355
+ const text = command.operation === 'clear' ? '' : o.file ? fs.readFileSync(String(o.file), 'utf8') : o.stdin ? await io.stdin() : command.message;
356
+ body = await request('POST', '/rules', { group_id: command.groupId, text, expected_version: o['if-version'] });
357
+ }
358
+ if (o.text)
359
+ io.write(`群规版本:${body.instructions?.version ?? '未设置'}\n${body.instructions?.text ?? ''}`);
360
+ else
361
+ output(body);
362
+ return 0;
363
+ }
364
+ if (command.action === 'transport') {
365
+ if (command.operation === 'info')
366
+ output(await request('GET', '/transport'));
367
+ else {
368
+ if (fs.statSync(String(o.file)).size > 64 * 1024)
369
+ throw new Error('Peer registration is too large');
370
+ const raw = fs.readFileSync(String(o.file), 'utf8');
371
+ if (Buffer.byteLength(raw) > 64 * 1024)
372
+ throw new Error('Peer registration is too large');
373
+ output(await request('POST', '/transport', { groupId: command.groupId, nodes: JSON.parse(raw) }));
374
+ }
375
+ return 0;
376
+ }
312
377
  if (command.action === 'help') {
313
378
  io.write(COLLAB_HELP);
314
379
  // Append the caller's own groups with every member role — help doubles
@@ -334,6 +399,19 @@ export async function executeCollaborationCommand(command, context, io) {
334
399
  if (command.action === 'capabilities' || command.action === 'status') {
335
400
  const result = await request('GET', command.action === 'status' ? '/peers' : '/capabilities');
336
401
  output(result);
402
+ if (command.action === 'status' && o.text) {
403
+ for (const group of result.groups ?? []) {
404
+ io.write(`组「${group.name}」成员定位:`);
405
+ for (const id of group.sessionIds ?? []) {
406
+ const member = [...(result.peers ?? []), result.source].find(item => item?.sessionId === id);
407
+ io.write(roleLine({ sessionId: id, name: member?.name }, group.roles?.[id]));
408
+ }
409
+ }
410
+ for (const peer of result.peers ?? [])
411
+ if (peer.last_terminal_output_at && peer.activity_observed_at) {
412
+ io.write(`${peer.name || peer.sessionId}:观测时距终端输出 ${peer.output_idle_seconds ?? Math.max(0, Math.floor((peer.activity_observed_at - peer.last_terminal_output_at) / 1000))} 秒(不代表任务进度)`);
413
+ }
414
+ }
337
415
  if (command.action === 'status' && o.text && Array.isArray(result.peers) && result.peers.length) {
338
416
  io.write('查看伙伴当前屏幕(只读,仅本机 tmux):');
339
417
  for (const peer of result.peers) {
@@ -355,7 +433,7 @@ export async function executeCollaborationCommand(command, context, io) {
355
433
  let cursor = o.cursor;
356
434
  do {
357
435
  const params = new URLSearchParams();
358
- for (const key of ['unread', 'since', 'after-id', 'consumer', 'limit', 'from', 'group', 'thread', 'kind', 'response-kind'])
436
+ for (const key of ['raw', 'since', 'after-id', 'consumer', 'limit', 'from', 'group', 'thread', 'kind', 'response-kind'])
359
437
  if (o[key])
360
438
  params.set(key.replaceAll('-', '_'), String(o[key]));
361
439
  if (cursor) {
@@ -379,11 +457,11 @@ export async function executeCollaborationCommand(command, context, io) {
379
457
  }
380
458
  if (command.action === 'message') {
381
459
  const route = `/message/${encodeURIComponent(command.target)}`;
382
- if (command.operation === 'read' || command.operation === 'confirm-shell') {
460
+ if (command.operation === 'confirm-shell') {
383
461
  output(await request('POST', `${route}/${command.operation}`));
384
462
  return 0;
385
463
  }
386
- receipt = await request('GET', `${route}${o['receipt-only'] || command.operation === 'watch' ? '?receipt_only=true' : ''}`);
464
+ receipt = await request('GET', `${route}?receipt_only=${Boolean(o['receipt-only'] || command.operation === 'watch')}&raw=${Boolean(o.raw)}`);
387
465
  if (command.operation === 'get' && !o.follow && !o['wait-until'] && !o['expect-reply']) {
388
466
  output(receipt);
389
467
  return 0;
@@ -460,7 +538,7 @@ export async function executeCollaborationCommand(command, context, io) {
460
538
  return 0;
461
539
  }
462
540
  else if (command.action === 'drive') {
463
- const body = await request('POST', '/drive', { session: command.sessionId, action: command.operation, text: command.message });
541
+ const body = await request('POST', '/drive', { session: command.sessionId, action: command.operation, text: command.message, ...(o.lines ? { lines: Number(o.lines) } : {}), ...(o.raw ? { raw: true } : {}) });
464
542
  const result = body;
465
543
  if (o.text) {
466
544
  if (command.operation === 'run') {
@@ -523,7 +601,7 @@ export async function executeCollaborationCommand(command, context, io) {
523
601
  output(await request('POST', command.action === 'spawn' ? '/spawn' : '/members', body));
524
602
  return 0;
525
603
  }
526
- const stage = String(o['wait-until'] ?? (command.action === 'message' ? 'read' : 'queued'));
604
+ const stage = String(o['wait-until'] ?? (command.action === 'message' ? 'delivered' : 'queued'));
527
605
  let previous = '';
528
606
  for (;;) {
529
607
  if (['failed', 'expired'].includes(receipt.status)) {
@@ -543,7 +621,9 @@ export async function executeCollaborationCommand(command, context, io) {
543
621
  }
544
622
  if (now() >= deadline) {
545
623
  output({ ...receipt, ok: false, code: 'WAIT_TIMEOUT', wait_until: stage, stage_reached: waitSatisfied(receipt, stage, undefined),
546
- expect_reply: o['expect-reply'] ?? null, delivery_continues: true });
624
+ expect_reply: o['expect-reply'] ?? null, delivery_continues: true,
625
+ delivery: receipt.delivery ?? { status: receipt.status },
626
+ reply: { ...receipt.reply, status: o['expect-reply'] ? 'timeout' : receipt.reply?.status ?? 'pending', expected: o['expect-reply'] ?? null } });
547
627
  return 2;
548
628
  }
549
629
  await sleep(Math.min(500, deadline - now()));