termdock 1.4.295 → 1.4.296

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 (337) hide show
  1. package/dist/client/assets/App-BiLjlrk-.js +171 -0
  2. package/dist/client/assets/App-BiLjlrk-.js.br +0 -0
  3. package/dist/client/assets/App-BiLjlrk-.js.gz +0 -0
  4. package/dist/client/assets/{ChangeWalkthroughPanel-Dv5XRtRh.js → ChangeWalkthroughPanel-DXprT-7m.js} +1 -1
  5. package/dist/client/assets/ChangeWalkthroughPanel-DXprT-7m.js.br +0 -0
  6. package/dist/client/assets/ChangeWalkthroughPanel-DXprT-7m.js.gz +0 -0
  7. package/dist/client/assets/{DagPlayground-mq69dKyr.js → DagPlayground-DZcUunT5.js} +1 -1
  8. package/dist/client/assets/DagPlayground-DZcUunT5.js.br +0 -0
  9. package/dist/client/assets/DagPlayground-DZcUunT5.js.gz +0 -0
  10. package/dist/client/assets/{DiffLab-BqdHYGi5.js → DiffLab-Brv4DCTb.js} +1 -1
  11. package/dist/client/assets/DiffLab-Brv4DCTb.js.br +0 -0
  12. package/dist/client/assets/DiffLab-Brv4DCTb.js.gz +0 -0
  13. package/dist/client/assets/{DiffReview-BvzGxpuc.js → DiffReview-BuLu1qCi.js} +1 -1
  14. package/dist/client/assets/DiffReview-BuLu1qCi.js.br +0 -0
  15. package/dist/client/assets/DiffReview-BuLu1qCi.js.gz +0 -0
  16. package/dist/client/assets/{DiffReviewLab-DrfddB7x.js → DiffReviewLab-DSGamuAD.js} +1 -1
  17. package/dist/client/assets/DiffReviewLab-DSGamuAD.js.br +0 -0
  18. package/dist/client/assets/DiffReviewLab-DSGamuAD.js.gz +0 -0
  19. package/dist/client/assets/{DiffViewer-3bJV_A5s.js → DiffViewer-BUCYxg27.js} +1 -1
  20. package/dist/client/assets/DiffViewer-BUCYxg27.js.br +0 -0
  21. package/dist/client/assets/DiffViewer-BUCYxg27.js.gz +0 -0
  22. package/dist/client/assets/{ModelPreview-CX7VtoJB.js → ModelPreview-Bnlo-oVE.js} +1 -1
  23. package/dist/client/assets/ModelPreview-Bnlo-oVE.js.br +0 -0
  24. package/dist/client/assets/ModelPreview-Bnlo-oVE.js.gz +0 -0
  25. package/dist/client/assets/{RightSidebar-BK6vWNw3.js → RightSidebar-r_3Lk5Rp.js} +45 -45
  26. package/dist/client/assets/RightSidebar-r_3Lk5Rp.js.br +0 -0
  27. package/dist/client/assets/RightSidebar-r_3Lk5Rp.js.gz +0 -0
  28. package/dist/client/assets/{abnfDiagram-VCTEODGH-PJwhLTPH.js → abnfDiagram-VCTEODGH-K6Ppkrbt.js} +1 -1
  29. package/dist/client/assets/abnfDiagram-VCTEODGH-K6Ppkrbt.js.br +0 -0
  30. package/dist/client/assets/abnfDiagram-VCTEODGH-K6Ppkrbt.js.gz +0 -0
  31. package/dist/client/assets/{app-C7pXMvSE.js → app-CATnTUZF.js} +8 -8
  32. package/dist/client/assets/app-CATnTUZF.js.br +0 -0
  33. package/dist/client/assets/app-CATnTUZF.js.gz +0 -0
  34. package/dist/client/assets/{arc-l3FXjCEl.js → arc-Co2OQqtH.js} +1 -1
  35. package/dist/client/assets/arc-Co2OQqtH.js.br +0 -0
  36. package/dist/client/assets/arc-Co2OQqtH.js.gz +0 -0
  37. package/dist/client/assets/{architectureDiagram-5GKGNRK7-DdNbKi-4.js → architectureDiagram-5GKGNRK7-BQnl7tVF.js} +1 -1
  38. package/dist/client/assets/architectureDiagram-5GKGNRK7-BQnl7tVF.js.br +0 -0
  39. package/dist/client/assets/architectureDiagram-5GKGNRK7-BQnl7tVF.js.gz +0 -0
  40. package/dist/client/assets/{blockDiagram-I7D4REHJ-Cu63oaxR.js → blockDiagram-I7D4REHJ-Bm5D5-qq.js} +1 -1
  41. package/dist/client/assets/blockDiagram-I7D4REHJ-Bm5D5-qq.js.br +0 -0
  42. package/dist/client/assets/blockDiagram-I7D4REHJ-Bm5D5-qq.js.gz +0 -0
  43. package/dist/client/assets/{c4Diagram-7LVT6UL2-DQiV_yk6.js → c4Diagram-7LVT6UL2-B9oPpey8.js} +1 -1
  44. package/dist/client/assets/c4Diagram-7LVT6UL2-B9oPpey8.js.br +0 -0
  45. package/dist/client/assets/c4Diagram-7LVT6UL2-B9oPpey8.js.gz +0 -0
  46. package/dist/client/assets/channel-Czv2W4qA.js +1 -0
  47. package/dist/client/assets/{chunk-2Q5K7J3B-COKJ79Ld.js → chunk-2Q5K7J3B-TMaWHH0U.js} +1 -1
  48. package/dist/client/assets/{chunk-5VM5RSS4-BfV-m7oa.js → chunk-5VM5RSS4-CH7XpknV.js} +1 -1
  49. package/dist/client/assets/{chunk-F27PBJKO-sLDCEnU8.js → chunk-F27PBJKO-CJ1rotBe.js} +1 -1
  50. package/dist/client/assets/chunk-F27PBJKO-CJ1rotBe.js.br +0 -0
  51. package/dist/client/assets/chunk-F27PBJKO-CJ1rotBe.js.gz +0 -0
  52. package/dist/client/assets/{chunk-IMKFNOWR-DYu5qS7g.js → chunk-IMKFNOWR-UYKZ5uOG.js} +1 -1
  53. package/dist/client/assets/chunk-IMKFNOWR-UYKZ5uOG.js.br +0 -0
  54. package/dist/client/assets/chunk-IMKFNOWR-UYKZ5uOG.js.gz +0 -0
  55. package/dist/client/assets/{chunk-JWPE2WC7-DixkILcl.js → chunk-JWPE2WC7-BYL8aXjQ.js} +1 -1
  56. package/dist/client/assets/{chunk-POPQ4Y6H-CfW5Vm_-.js → chunk-POPQ4Y6H-C3E8yfU2.js} +1 -1
  57. package/dist/client/assets/{chunk-SVP7TREG-nJnbUFzs.js → chunk-SVP7TREG-DCTDYa1E.js} +1 -1
  58. package/dist/client/assets/chunk-SVP7TREG-DCTDYa1E.js.br +0 -0
  59. package/dist/client/assets/chunk-SVP7TREG-DCTDYa1E.js.gz +0 -0
  60. package/dist/client/assets/{chunk-TICWLB2K-BwyiSQgx.js → chunk-TICWLB2K-wHiaOsBh.js} +1 -1
  61. package/dist/client/assets/chunk-TICWLB2K-wHiaOsBh.js.br +0 -0
  62. package/dist/client/assets/chunk-TICWLB2K-wHiaOsBh.js.gz +0 -0
  63. package/dist/client/assets/{chunk-XXDRQBXY-TCk4c2XN.js → chunk-XXDRQBXY-D_d479hK.js} +1 -1
  64. package/dist/client/assets/classDiagram-ZZMXUADV-BdvOOL9k.js +1 -0
  65. package/dist/client/assets/classDiagram-v2-VYDZK3BY-BdvOOL9k.js +1 -0
  66. package/dist/client/assets/{cose-bilkent-JH36ORCC-rroo-EOb.js → cose-bilkent-JH36ORCC-DnhlPBLr.js} +1 -1
  67. package/dist/client/assets/cose-bilkent-JH36ORCC-DnhlPBLr.js.br +0 -0
  68. package/dist/client/assets/cose-bilkent-JH36ORCC-DnhlPBLr.js.gz +0 -0
  69. package/dist/client/assets/{cynefin-OW5HDTMX-CkFeV85k.js → cynefin-OW5HDTMX-BsjzNqJZ.js} +1 -1
  70. package/dist/client/assets/cynefin-OW5HDTMX-BsjzNqJZ.js.br +0 -0
  71. package/dist/client/assets/cynefin-OW5HDTMX-BsjzNqJZ.js.gz +0 -0
  72. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-hBwpU_bW.js → cynefinDiagram-5FMLGOSQ-sVUb0zY5.js} +1 -1
  73. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-sVUb0zY5.js.br +0 -0
  74. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-sVUb0zY5.js.gz +0 -0
  75. package/dist/client/assets/{dagre-GXQ25YYZ-B321-hdp.js → dagre-GXQ25YYZ-YErk8S-c.js} +1 -1
  76. package/dist/client/assets/dagre-GXQ25YYZ-YErk8S-c.js.br +0 -0
  77. package/dist/client/assets/dagre-GXQ25YYZ-YErk8S-c.js.gz +0 -0
  78. package/dist/client/assets/{diagram-S7CK7UJ4-bY87_ptA.js → diagram-S7CK7UJ4-BaHbV5ho.js} +1 -1
  79. package/dist/client/assets/diagram-S7CK7UJ4-BaHbV5ho.js.br +0 -0
  80. package/dist/client/assets/diagram-S7CK7UJ4-BaHbV5ho.js.gz +0 -0
  81. package/dist/client/assets/{diagram-UQ7AKVKN--cez0H_o.js → diagram-UQ7AKVKN-BocCYx3V.js} +1 -1
  82. package/dist/client/assets/diagram-UQ7AKVKN-BocCYx3V.js.br +0 -0
  83. package/dist/client/assets/diagram-UQ7AKVKN-BocCYx3V.js.gz +0 -0
  84. package/dist/client/assets/{diagram-VSXAHHWV-BupH_VRK.js → diagram-VSXAHHWV-ZMTYwWOQ.js} +1 -1
  85. package/dist/client/assets/diagram-VSXAHHWV-ZMTYwWOQ.js.br +0 -0
  86. package/dist/client/assets/diagram-VSXAHHWV-ZMTYwWOQ.js.gz +0 -0
  87. package/dist/client/assets/{diagram-VX7I27RA-DewqaxvF.js → diagram-VX7I27RA-xmk_EY1h.js} +1 -1
  88. package/dist/client/assets/diagram-VX7I27RA-xmk_EY1h.js.br +0 -0
  89. package/dist/client/assets/diagram-VX7I27RA-xmk_EY1h.js.gz +0 -0
  90. package/dist/client/assets/{diagram-Z3DM3KII-wDumcTuR.js → diagram-Z3DM3KII-DKDY_cG6.js} +1 -1
  91. package/dist/client/assets/diagram-Z3DM3KII-DKDY_cG6.js.br +0 -0
  92. package/dist/client/assets/diagram-Z3DM3KII-DKDY_cG6.js.gz +0 -0
  93. package/dist/client/assets/{ebnfDiagram-PWID7BFC-C0OY91We.js → ebnfDiagram-PWID7BFC-C_0z-Jx9.js} +1 -1
  94. package/dist/client/assets/ebnfDiagram-PWID7BFC-C_0z-Jx9.js.br +0 -0
  95. package/dist/client/assets/ebnfDiagram-PWID7BFC-C_0z-Jx9.js.gz +0 -0
  96. package/dist/client/assets/{erDiagram-RLTQ6QDP-Cw9aNqvJ.js → erDiagram-RLTQ6QDP-DHUaG7mt.js} +1 -1
  97. package/dist/client/assets/erDiagram-RLTQ6QDP-DHUaG7mt.js.br +0 -0
  98. package/dist/client/assets/erDiagram-RLTQ6QDP-DHUaG7mt.js.gz +0 -0
  99. package/dist/client/assets/{flowDiagram-HODETNUW-BC7XUXeI.js → flowDiagram-HODETNUW-BMNsdMBD.js} +1 -1
  100. package/dist/client/assets/flowDiagram-HODETNUW-BMNsdMBD.js.br +0 -0
  101. package/dist/client/assets/flowDiagram-HODETNUW-BMNsdMBD.js.gz +0 -0
  102. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-DovhJIz5.js → ganttDiagram-EL5Y4UJY-BH1AiKuF.js} +1 -1
  103. package/dist/client/assets/ganttDiagram-EL5Y4UJY-BH1AiKuF.js.br +0 -0
  104. package/dist/client/assets/ganttDiagram-EL5Y4UJY-BH1AiKuF.js.gz +0 -0
  105. package/dist/client/assets/{gestureArbiter-wjVok2Lg.js → gestureArbiter-DvupkPra.js} +1 -1
  106. package/dist/client/assets/gestureArbiter-DvupkPra.js.br +0 -0
  107. package/dist/client/assets/gestureArbiter-DvupkPra.js.gz +0 -0
  108. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-BmrbbyW1.js → gitGraphDiagram-WWUBYQGX-DAgV0MV-.js} +1 -1
  109. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DAgV0MV-.js.br +0 -0
  110. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DAgV0MV-.js.gz +0 -0
  111. package/dist/client/assets/{index-BeD4iJ6L.css → index-Bi9A6QUP.css} +1 -1
  112. package/dist/client/assets/index-Bi9A6QUP.css.br +0 -0
  113. package/dist/client/assets/index-Bi9A6QUP.css.gz +0 -0
  114. package/dist/client/assets/{infoDiagram-27XIBGKW-CQEu4Jwy.js → infoDiagram-27XIBGKW-C7iSg0cB.js} +1 -1
  115. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-BPqibqsm.js → ishikawaDiagram-5VMMS53U-BpZwsQvw.js} +1 -1
  116. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BpZwsQvw.js.br +0 -0
  117. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BpZwsQvw.js.gz +0 -0
  118. package/dist/client/assets/{journeyDiagram-3NMN7TZE-DIkhubnf.js → journeyDiagram-3NMN7TZE-DXEeFLvw.js} +1 -1
  119. package/dist/client/assets/journeyDiagram-3NMN7TZE-DXEeFLvw.js.br +0 -0
  120. package/dist/client/assets/journeyDiagram-3NMN7TZE-DXEeFLvw.js.gz +0 -0
  121. package/dist/client/assets/{kanban-definition-UXKFOSKX-CBT0DIUR.js → kanban-definition-UXKFOSKX-CV9ivL5u.js} +1 -1
  122. package/dist/client/assets/kanban-definition-UXKFOSKX-CV9ivL5u.js.br +0 -0
  123. package/dist/client/assets/kanban-definition-UXKFOSKX-CV9ivL5u.js.gz +0 -0
  124. package/dist/client/assets/{layout-C1CMlOIU.js → layout-DsKKsJKX.js} +1 -1
  125. package/dist/client/assets/layout-DsKKsJKX.js.br +0 -0
  126. package/dist/client/assets/layout-DsKKsJKX.js.gz +0 -0
  127. package/dist/client/assets/{linear-C4gyqor0.js → linear-Dl9MDNV3.js} +1 -1
  128. package/dist/client/assets/linear-Dl9MDNV3.js.br +0 -0
  129. package/dist/client/assets/linear-Dl9MDNV3.js.gz +0 -0
  130. package/dist/client/assets/{mermaid.core-CMfa4ncd.js → mermaid.core-CxZFe3as.js} +5 -5
  131. package/dist/client/assets/mermaid.core-CxZFe3as.js.br +0 -0
  132. package/dist/client/assets/mermaid.core-CxZFe3as.js.gz +0 -0
  133. package/dist/client/assets/{mindmap-definition-YA3MSWOX-C-JmgKOI.js → mindmap-definition-YA3MSWOX-C3ormYdL.js} +1 -1
  134. package/dist/client/assets/mindmap-definition-YA3MSWOX-C3ormYdL.js.br +0 -0
  135. package/dist/client/assets/mindmap-definition-YA3MSWOX-C3ormYdL.js.gz +0 -0
  136. package/dist/client/assets/{passwordBootstrap-BmUG2IwA.js → passwordBootstrap-a8z6jJNY.js} +2 -2
  137. package/dist/client/assets/passwordBootstrap-a8z6jJNY.js.br +0 -0
  138. package/dist/client/assets/passwordBootstrap-a8z6jJNY.js.gz +0 -0
  139. package/dist/client/assets/{pegDiagram-XKGWAZYB-IY-AEKQa.js → pegDiagram-XKGWAZYB-CG0wNylH.js} +1 -1
  140. package/dist/client/assets/pegDiagram-XKGWAZYB-CG0wNylH.js.br +0 -0
  141. package/dist/client/assets/pegDiagram-XKGWAZYB-CG0wNylH.js.gz +0 -0
  142. package/dist/client/assets/{pieDiagram-E7YTZNPT-9Qq43qED.js → pieDiagram-E7YTZNPT-D2-ydqyX.js} +1 -1
  143. package/dist/client/assets/pieDiagram-E7YTZNPT-D2-ydqyX.js.br +0 -0
  144. package/dist/client/assets/pieDiagram-E7YTZNPT-D2-ydqyX.js.gz +0 -0
  145. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-BjQncx5i.js → quadrantDiagram-AXDQQJYC-CK3fRC18.js} +1 -1
  146. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CK3fRC18.js.br +0 -0
  147. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CK3fRC18.js.gz +0 -0
  148. package/dist/client/assets/{railroadDiagram-O6MQD6OU-Cr1rL0wZ.js → railroadDiagram-O6MQD6OU-V4EFlydu.js} +1 -1
  149. package/dist/client/assets/railroadDiagram-O6MQD6OU-V4EFlydu.js.br +0 -0
  150. package/dist/client/assets/railroadDiagram-O6MQD6OU-V4EFlydu.js.gz +0 -0
  151. package/dist/client/assets/{referenceLongPress-ConC5-ym.js → referenceLongPress-BjmYd1vB.js} +1 -1
  152. package/dist/client/assets/referenceLongPress-BjmYd1vB.js.br +0 -0
  153. package/dist/client/assets/referenceLongPress-BjmYd1vB.js.gz +0 -0
  154. package/dist/client/assets/{requirementDiagram-BXWQKSXE-DU2q_iZg.js → requirementDiagram-BXWQKSXE-Di1_tyAX.js} +1 -1
  155. package/dist/client/assets/requirementDiagram-BXWQKSXE-Di1_tyAX.js.br +0 -0
  156. package/dist/client/assets/requirementDiagram-BXWQKSXE-Di1_tyAX.js.gz +0 -0
  157. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-BYlx9kXC.js → sankeyDiagram-P5KCCOFB-D-qpWNza.js} +1 -1
  158. package/dist/client/assets/sankeyDiagram-P5KCCOFB-D-qpWNza.js.br +0 -0
  159. package/dist/client/assets/sankeyDiagram-P5KCCOFB-D-qpWNza.js.gz +0 -0
  160. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-D_uAKme-.js → sequenceDiagram-WJ2MYXX4-DmIxafrB.js} +1 -1
  161. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DmIxafrB.js.br +0 -0
  162. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DmIxafrB.js.gz +0 -0
  163. package/dist/client/assets/{sizeCapture-INFHLROL-H_uqscf4.js → sizeCapture-INFHLROL-4MTh3tTt.js} +1 -1
  164. package/dist/client/assets/sizeCapture-INFHLROL-4MTh3tTt.js.br +0 -0
  165. package/dist/client/assets/sizeCapture-INFHLROL-4MTh3tTt.js.gz +0 -0
  166. package/dist/client/assets/{sparkles-D2z4Ue6G.js → sparkles-Dk93lHg0.js} +1 -1
  167. package/dist/client/assets/{stateDiagram-D77RDMKH-BvsQjIIW.js → stateDiagram-D77RDMKH-CgYgneIv.js} +1 -1
  168. package/dist/client/assets/stateDiagram-D77RDMKH-CgYgneIv.js.br +0 -0
  169. package/dist/client/assets/stateDiagram-D77RDMKH-CgYgneIv.js.gz +0 -0
  170. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CvPf0fxf.js +1 -0
  171. package/dist/client/assets/{swimlanes-42K2YHIH-LmUJag-p.js → swimlanes-42K2YHIH-OWA9HFVf.js} +1 -1
  172. package/dist/client/assets/swimlanes-42K2YHIH-OWA9HFVf.js.br +0 -0
  173. package/dist/client/assets/swimlanes-42K2YHIH-OWA9HFVf.js.gz +0 -0
  174. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-CZ_OauyW.js +8 -0
  175. package/dist/client/assets/{timeline-definition-24CTP7MA-DZ5n0Pim.js → timeline-definition-24CTP7MA-BAzx5DyO.js} +1 -1
  176. package/dist/client/assets/timeline-definition-24CTP7MA-BAzx5DyO.js.br +0 -0
  177. package/dist/client/assets/timeline-definition-24CTP7MA-BAzx5DyO.js.gz +0 -0
  178. package/dist/client/assets/{triangle-alert-Ct6iIBmv.js → triangle-alert-CUIBOwqW.js} +1 -1
  179. package/dist/client/assets/{vennDiagram-4TSXK5OY-BkTA_Ciz.js → vennDiagram-4TSXK5OY-CBZ-PhTQ.js} +1 -1
  180. package/dist/client/assets/vennDiagram-4TSXK5OY-CBZ-PhTQ.js.br +0 -0
  181. package/dist/client/assets/vennDiagram-4TSXK5OY-CBZ-PhTQ.js.gz +0 -0
  182. package/dist/client/assets/{videoCompression-VZIoFnyJ.js → videoCompression-BCnqCkRK.js} +1 -1
  183. package/dist/client/assets/videoCompression-BCnqCkRK.js.br +0 -0
  184. package/dist/client/assets/videoCompression-BCnqCkRK.js.gz +0 -0
  185. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-7hzU176j.js → wardleyDiagram-VM6X3IG4-DbWzC6l5.js} +1 -1
  186. package/dist/client/assets/wardleyDiagram-VM6X3IG4-DbWzC6l5.js.br +0 -0
  187. package/dist/client/assets/wardleyDiagram-VM6X3IG4-DbWzC6l5.js.gz +0 -0
  188. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-Bx4P96Bb.js → xychartDiagram-S5SC5T6Z-BmApnTWE.js} +1 -1
  189. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmApnTWE.js.br +0 -0
  190. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmApnTWE.js.gz +0 -0
  191. package/dist/client/index.html +2 -2
  192. package/dist/client/index.html.br +0 -0
  193. package/dist/client/index.html.gz +0 -0
  194. package/dist/client/sw.js +1 -1
  195. package/dist/client/sw.js.br +0 -0
  196. package/dist/client/sw.js.gz +0 -0
  197. package/dist/server/agent/collaborationCli.js +45 -4
  198. package/dist/server/agent/collaborationDeliveryWorker.js +1 -1
  199. package/dist/server/agent/collaborationPeerTransport.js +8 -2
  200. package/dist/server/agent/collaborationRoutes.js +18 -2
  201. package/dist/server/agent/collaborationService.js +43 -1
  202. package/dist/server/agent/collaborationTaskBundles.js +121 -0
  203. package/dist/server/agent/collaborationTaskCli.js +54 -0
  204. package/dist/server/agent/collaborationTaskRoutes.js +58 -0
  205. package/dist/server/agent/collaborationTaskService.js +355 -0
  206. package/dist/server/agent/collaborationTaskStore.js +773 -0
  207. package/dist/server/agent/collaborationTaskTypes.js +1 -0
  208. package/dist/server/agent/collaborationTaskWorkspace.js +100 -0
  209. package/dist/server/entry.js +11 -1
  210. package/dist/server/federation/runtime.js +6 -1
  211. package/dist/server/routes/terminal.js +66 -2
  212. package/package.json +1 -1
  213. package/runtime-manifest.json +3 -3
  214. package/dist/client/assets/App-D-cerXsD.js +0 -158
  215. package/dist/client/assets/App-D-cerXsD.js.br +0 -0
  216. package/dist/client/assets/App-D-cerXsD.js.gz +0 -0
  217. package/dist/client/assets/ChangeWalkthroughPanel-Dv5XRtRh.js.br +0 -0
  218. package/dist/client/assets/ChangeWalkthroughPanel-Dv5XRtRh.js.gz +0 -0
  219. package/dist/client/assets/DagPlayground-mq69dKyr.js.br +0 -0
  220. package/dist/client/assets/DagPlayground-mq69dKyr.js.gz +0 -0
  221. package/dist/client/assets/DiffLab-BqdHYGi5.js.br +0 -0
  222. package/dist/client/assets/DiffLab-BqdHYGi5.js.gz +0 -0
  223. package/dist/client/assets/DiffReview-BvzGxpuc.js.br +0 -0
  224. package/dist/client/assets/DiffReview-BvzGxpuc.js.gz +0 -0
  225. package/dist/client/assets/DiffReviewLab-DrfddB7x.js.br +0 -0
  226. package/dist/client/assets/DiffReviewLab-DrfddB7x.js.gz +0 -0
  227. package/dist/client/assets/DiffViewer-3bJV_A5s.js.br +0 -0
  228. package/dist/client/assets/DiffViewer-3bJV_A5s.js.gz +0 -0
  229. package/dist/client/assets/ModelPreview-CX7VtoJB.js.br +0 -0
  230. package/dist/client/assets/ModelPreview-CX7VtoJB.js.gz +0 -0
  231. package/dist/client/assets/RightSidebar-BK6vWNw3.js.br +0 -0
  232. package/dist/client/assets/RightSidebar-BK6vWNw3.js.gz +0 -0
  233. package/dist/client/assets/abnfDiagram-VCTEODGH-PJwhLTPH.js.br +0 -0
  234. package/dist/client/assets/abnfDiagram-VCTEODGH-PJwhLTPH.js.gz +0 -0
  235. package/dist/client/assets/app-C7pXMvSE.js.br +0 -0
  236. package/dist/client/assets/app-C7pXMvSE.js.gz +0 -0
  237. package/dist/client/assets/arc-l3FXjCEl.js.br +0 -0
  238. package/dist/client/assets/arc-l3FXjCEl.js.gz +0 -0
  239. package/dist/client/assets/architectureDiagram-5GKGNRK7-DdNbKi-4.js.br +0 -0
  240. package/dist/client/assets/architectureDiagram-5GKGNRK7-DdNbKi-4.js.gz +0 -0
  241. package/dist/client/assets/blockDiagram-I7D4REHJ-Cu63oaxR.js.br +0 -0
  242. package/dist/client/assets/blockDiagram-I7D4REHJ-Cu63oaxR.js.gz +0 -0
  243. package/dist/client/assets/c4Diagram-7LVT6UL2-DQiV_yk6.js.br +0 -0
  244. package/dist/client/assets/c4Diagram-7LVT6UL2-DQiV_yk6.js.gz +0 -0
  245. package/dist/client/assets/channel-CwC957gi.js +0 -1
  246. package/dist/client/assets/chunk-F27PBJKO-sLDCEnU8.js.br +0 -0
  247. package/dist/client/assets/chunk-F27PBJKO-sLDCEnU8.js.gz +0 -0
  248. package/dist/client/assets/chunk-IMKFNOWR-DYu5qS7g.js.br +0 -0
  249. package/dist/client/assets/chunk-IMKFNOWR-DYu5qS7g.js.gz +0 -0
  250. package/dist/client/assets/chunk-SVP7TREG-nJnbUFzs.js.br +0 -0
  251. package/dist/client/assets/chunk-SVP7TREG-nJnbUFzs.js.gz +0 -0
  252. package/dist/client/assets/chunk-TICWLB2K-BwyiSQgx.js.br +0 -0
  253. package/dist/client/assets/chunk-TICWLB2K-BwyiSQgx.js.gz +0 -0
  254. package/dist/client/assets/classDiagram-ZZMXUADV-CmoJ7-rE.js +0 -1
  255. package/dist/client/assets/classDiagram-v2-VYDZK3BY-CmoJ7-rE.js +0 -1
  256. package/dist/client/assets/cose-bilkent-JH36ORCC-rroo-EOb.js.br +0 -0
  257. package/dist/client/assets/cose-bilkent-JH36ORCC-rroo-EOb.js.gz +0 -0
  258. package/dist/client/assets/cynefin-OW5HDTMX-CkFeV85k.js.br +0 -0
  259. package/dist/client/assets/cynefin-OW5HDTMX-CkFeV85k.js.gz +0 -0
  260. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-hBwpU_bW.js.br +0 -0
  261. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-hBwpU_bW.js.gz +0 -0
  262. package/dist/client/assets/dagre-GXQ25YYZ-B321-hdp.js.br +0 -0
  263. package/dist/client/assets/dagre-GXQ25YYZ-B321-hdp.js.gz +0 -0
  264. package/dist/client/assets/diagram-S7CK7UJ4-bY87_ptA.js.br +0 -0
  265. package/dist/client/assets/diagram-S7CK7UJ4-bY87_ptA.js.gz +0 -0
  266. package/dist/client/assets/diagram-UQ7AKVKN--cez0H_o.js.br +0 -0
  267. package/dist/client/assets/diagram-UQ7AKVKN--cez0H_o.js.gz +0 -0
  268. package/dist/client/assets/diagram-VSXAHHWV-BupH_VRK.js.br +0 -0
  269. package/dist/client/assets/diagram-VSXAHHWV-BupH_VRK.js.gz +0 -0
  270. package/dist/client/assets/diagram-VX7I27RA-DewqaxvF.js.br +0 -0
  271. package/dist/client/assets/diagram-VX7I27RA-DewqaxvF.js.gz +0 -0
  272. package/dist/client/assets/diagram-Z3DM3KII-wDumcTuR.js.br +0 -0
  273. package/dist/client/assets/diagram-Z3DM3KII-wDumcTuR.js.gz +0 -0
  274. package/dist/client/assets/ebnfDiagram-PWID7BFC-C0OY91We.js.br +0 -0
  275. package/dist/client/assets/ebnfDiagram-PWID7BFC-C0OY91We.js.gz +0 -0
  276. package/dist/client/assets/erDiagram-RLTQ6QDP-Cw9aNqvJ.js.br +0 -0
  277. package/dist/client/assets/erDiagram-RLTQ6QDP-Cw9aNqvJ.js.gz +0 -0
  278. package/dist/client/assets/flowDiagram-HODETNUW-BC7XUXeI.js.br +0 -0
  279. package/dist/client/assets/flowDiagram-HODETNUW-BC7XUXeI.js.gz +0 -0
  280. package/dist/client/assets/ganttDiagram-EL5Y4UJY-DovhJIz5.js.br +0 -0
  281. package/dist/client/assets/ganttDiagram-EL5Y4UJY-DovhJIz5.js.gz +0 -0
  282. package/dist/client/assets/gestureArbiter-wjVok2Lg.js.br +0 -0
  283. package/dist/client/assets/gestureArbiter-wjVok2Lg.js.gz +0 -0
  284. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BmrbbyW1.js.br +0 -0
  285. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BmrbbyW1.js.gz +0 -0
  286. package/dist/client/assets/index-BeD4iJ6L.css.br +0 -0
  287. package/dist/client/assets/index-BeD4iJ6L.css.gz +0 -0
  288. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BPqibqsm.js.br +0 -0
  289. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BPqibqsm.js.gz +0 -0
  290. package/dist/client/assets/journeyDiagram-3NMN7TZE-DIkhubnf.js.br +0 -0
  291. package/dist/client/assets/journeyDiagram-3NMN7TZE-DIkhubnf.js.gz +0 -0
  292. package/dist/client/assets/kanban-definition-UXKFOSKX-CBT0DIUR.js.br +0 -0
  293. package/dist/client/assets/kanban-definition-UXKFOSKX-CBT0DIUR.js.gz +0 -0
  294. package/dist/client/assets/layout-C1CMlOIU.js.br +0 -0
  295. package/dist/client/assets/layout-C1CMlOIU.js.gz +0 -0
  296. package/dist/client/assets/linear-C4gyqor0.js.br +0 -0
  297. package/dist/client/assets/linear-C4gyqor0.js.gz +0 -0
  298. package/dist/client/assets/mermaid.core-CMfa4ncd.js.br +0 -0
  299. package/dist/client/assets/mermaid.core-CMfa4ncd.js.gz +0 -0
  300. package/dist/client/assets/mindmap-definition-YA3MSWOX-C-JmgKOI.js.br +0 -0
  301. package/dist/client/assets/mindmap-definition-YA3MSWOX-C-JmgKOI.js.gz +0 -0
  302. package/dist/client/assets/passwordBootstrap-BmUG2IwA.js.br +0 -0
  303. package/dist/client/assets/passwordBootstrap-BmUG2IwA.js.gz +0 -0
  304. package/dist/client/assets/pegDiagram-XKGWAZYB-IY-AEKQa.js.br +0 -0
  305. package/dist/client/assets/pegDiagram-XKGWAZYB-IY-AEKQa.js.gz +0 -0
  306. package/dist/client/assets/pieDiagram-E7YTZNPT-9Qq43qED.js.br +0 -0
  307. package/dist/client/assets/pieDiagram-E7YTZNPT-9Qq43qED.js.gz +0 -0
  308. package/dist/client/assets/quadrantDiagram-AXDQQJYC-BjQncx5i.js.br +0 -0
  309. package/dist/client/assets/quadrantDiagram-AXDQQJYC-BjQncx5i.js.gz +0 -0
  310. package/dist/client/assets/railroadDiagram-O6MQD6OU-Cr1rL0wZ.js.br +0 -0
  311. package/dist/client/assets/railroadDiagram-O6MQD6OU-Cr1rL0wZ.js.gz +0 -0
  312. package/dist/client/assets/referenceLongPress-ConC5-ym.js.br +0 -0
  313. package/dist/client/assets/referenceLongPress-ConC5-ym.js.gz +0 -0
  314. package/dist/client/assets/requirementDiagram-BXWQKSXE-DU2q_iZg.js.br +0 -0
  315. package/dist/client/assets/requirementDiagram-BXWQKSXE-DU2q_iZg.js.gz +0 -0
  316. package/dist/client/assets/sankeyDiagram-P5KCCOFB-BYlx9kXC.js.br +0 -0
  317. package/dist/client/assets/sankeyDiagram-P5KCCOFB-BYlx9kXC.js.gz +0 -0
  318. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D_uAKme-.js.br +0 -0
  319. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D_uAKme-.js.gz +0 -0
  320. package/dist/client/assets/sizeCapture-INFHLROL-H_uqscf4.js.br +0 -0
  321. package/dist/client/assets/sizeCapture-INFHLROL-H_uqscf4.js.gz +0 -0
  322. package/dist/client/assets/stateDiagram-D77RDMKH-BvsQjIIW.js.br +0 -0
  323. package/dist/client/assets/stateDiagram-D77RDMKH-BvsQjIIW.js.gz +0 -0
  324. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-DNgoExtD.js +0 -1
  325. package/dist/client/assets/swimlanes-42K2YHIH-LmUJag-p.js.br +0 -0
  326. package/dist/client/assets/swimlanes-42K2YHIH-LmUJag-p.js.gz +0 -0
  327. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-BRuArMR5.js +0 -8
  328. package/dist/client/assets/timeline-definition-24CTP7MA-DZ5n0Pim.js.br +0 -0
  329. package/dist/client/assets/timeline-definition-24CTP7MA-DZ5n0Pim.js.gz +0 -0
  330. package/dist/client/assets/vennDiagram-4TSXK5OY-BkTA_Ciz.js.br +0 -0
  331. package/dist/client/assets/vennDiagram-4TSXK5OY-BkTA_Ciz.js.gz +0 -0
  332. package/dist/client/assets/videoCompression-VZIoFnyJ.js.br +0 -0
  333. package/dist/client/assets/videoCompression-VZIoFnyJ.js.gz +0 -0
  334. package/dist/client/assets/wardleyDiagram-VM6X3IG4-7hzU176j.js.br +0 -0
  335. package/dist/client/assets/wardleyDiagram-VM6X3IG4-7hzU176j.js.gz +0 -0
  336. package/dist/client/assets/xychartDiagram-S5SC5T6Z-Bx4P96Bb.js.br +0 -0
  337. package/dist/client/assets/xychartDiagram-S5SC5T6Z-Bx4P96Bb.js.gz +0 -0
@@ -0,0 +1 @@
1
+ export function taskMemberKey(member) { return `${member.serviceId}:${member.sessionId}`; }
@@ -0,0 +1,100 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import { mkdir, readFile, writeFile, rename, realpath } from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import os from 'node:os';
6
+ const exec = promisify(execFile);
7
+ const git = async (cwd, args) => (await exec('git', ['-C', cwd, ...args], {
8
+ timeout: 30_000, maxBuffer: 2 * 1024 * 1024,
9
+ env: { ...process.env, GIT_TERMINAL_PROMPT: '0', GIT_MERGE_AUTOEDIT: 'no' },
10
+ })).stdout.trim();
11
+ const home = path.join(os.homedir(), '.termdock', 'task-workspaces');
12
+ /** Only committed code enters task worktrees; the user's checkout is never reset, cleaned or merged. */
13
+ export async function prepareTaskWorkspace(task, sourceCwd, dependencies, importCommit) {
14
+ if (!/^[a-f0-9]{32}$/.test(task.id))
15
+ throw new Error('任务标识无效');
16
+ const generation = task.events.filter(e => e.kind === 'scheduled').at(-1)?.id;
17
+ if (!generation || !/^[a-f0-9]{32}$/.test(generation))
18
+ throw new Error('缺少执行目录准备记录');
19
+ const repository = await git(sourceCwd, ['rev-parse', '--show-toplevel']);
20
+ const rootId = task.workflow?.rootTaskId ?? task.id;
21
+ const goalDir = path.join(home, rootId);
22
+ await mkdir(goalDir, { recursive: true, mode: 0o700 });
23
+ // Pin a base per repository and goal. A moved user HEAD cannot change later tasks' starting point.
24
+ const { createHash } = await import('node:crypto');
25
+ const common = await realpath(path.resolve(repository, await git(repository, ['rev-parse', '--git-common-dir'])));
26
+ const baseFile = path.join(goalDir, `${createHash('sha256').update(common).digest('hex').slice(0, 16)}.base`);
27
+ let base;
28
+ try {
29
+ base = (await readFile(baseFile, 'utf8')).trim();
30
+ }
31
+ catch (error) {
32
+ if (error.code !== 'ENOENT')
33
+ throw error;
34
+ base = await git(repository, ['rev-parse', 'HEAD']);
35
+ try {
36
+ await writeFile(baseFile, base, { flag: 'wx', mode: 0o600 });
37
+ }
38
+ catch (error) {
39
+ if (error.code !== 'EEXIST')
40
+ throw error;
41
+ base = (await readFile(baseFile, 'utf8')).trim();
42
+ }
43
+ }
44
+ if (!/^[a-f0-9]{40,64}$/.test(base))
45
+ throw new Error('目标基线无效');
46
+ const cwd = path.join(goalDir, `${task.id}-${generation.slice(0, 8)}`);
47
+ const branch = `termdock/task/${task.id}-${generation.slice(0, 8)}`;
48
+ try {
49
+ await readFile(path.join(cwd, '.git'), 'utf8');
50
+ }
51
+ catch (error) {
52
+ if (error.code !== 'ENOENT')
53
+ throw error;
54
+ await git(repository, ['worktree', 'add', '-b', branch, cwd, base]);
55
+ }
56
+ if (await git(cwd, ['rev-parse', '--show-toplevel']) !== cwd || await git(cwd, ['branch', '--show-current']) !== branch)
57
+ throw new Error('独立目录与任务分支不匹配,保留现场等待处理');
58
+ const readyFile = path.join(goalDir, `${task.id}-${generation.slice(0, 8)}.ready`);
59
+ let ready = false;
60
+ try {
61
+ ready = (await readFile(readyFile, 'utf8')) === generation;
62
+ }
63
+ catch (error) {
64
+ if (error.code !== 'ENOENT')
65
+ throw error;
66
+ }
67
+ if (!ready) {
68
+ // A failed merge is deliberately left in this task's worktree for a member to resolve.
69
+ if (await git(cwd, ['status', '--porcelain']))
70
+ throw new Error(`依赖集成需要处理,现场保留在 ${cwd};请协调者安排解决冲突后继续`);
71
+ for (const dependency of dependencies) {
72
+ const artifact = dependency.artifacts.find(a => a.id === dependency.acceptedArtifactId);
73
+ const commit = artifact?.evidence?.commit;
74
+ if (!commit || !/^[a-f0-9]{40,64}$/.test(commit))
75
+ throw new Error(`依赖「${dependency.title}」缺少已评审提交,请补充交付`);
76
+ try {
77
+ await git(cwd, ['cat-file', '-e', `${commit}^{commit}`]);
78
+ }
79
+ catch {
80
+ if (!importCommit)
81
+ throw new Error(`依赖「${dependency.title}」的提交在此仓库不可用,请协调者先同步提交`);
82
+ await importCommit(dependency, cwd);
83
+ await git(cwd, ['cat-file', '-e', `${commit}^{commit}`]);
84
+ }
85
+ await git(cwd, ['-c', 'user.name=Termdock', '-c', 'user.email=tasks@termdock.local', 'merge', '--no-edit', commit]);
86
+ }
87
+ const temp = `${readyFile}.${process.pid}.tmp`;
88
+ await writeFile(temp, generation, { mode: 0o600 });
89
+ await rename(temp, readyFile);
90
+ }
91
+ return { cwd, repository, branch, base };
92
+ }
93
+ export async function captureTaskCommit(workspace) {
94
+ if (!(await realpath(workspace.cwd)).startsWith(`${await realpath(home)}${path.sep}`) || await git(workspace.cwd, ['branch', '--show-current']) !== workspace.branch)
95
+ throw new Error('交付目录与任务分支不匹配');
96
+ if (await git(workspace.cwd, ['status', '--porcelain']))
97
+ throw new Error('独立目录还有未提交改动,请先提交再报告完成;不会自动暂存或提交');
98
+ const commit = await git(workspace.cwd, ['rev-parse', 'HEAD']);
99
+ return { commit, branch: workspace.branch, cwd: workspace.cwd, base: workspace.base };
100
+ }
@@ -1,7 +1,8 @@
1
1
  import { CollaborationService } from './agent/collaborationService.js';
2
2
  import { X509Certificate } from 'node:crypto';
3
3
  import { CollaborationPeerTransport, connectCollaborationRpc } from './agent/collaborationPeerTransport.js';
4
- import { collaborationStore, deliverPeerCollaboration, collaborationLocalActivity, collaborationDirectorySessions } from './routes/terminal.js';
4
+ import { collaborationStore, collaborationTaskStore, deliverPeerCollaboration, collaborationLocalActivity, collaborationDirectorySessions, prepareCollaborationTaskWorker } from './routes/terminal.js';
5
+ import { CollaborationTaskService } from './agent/collaborationTaskService.js';
5
6
  import { setPushTargetPeerId } from './notifications/pushService.js';
6
7
  import { desktopDirectTargets } from './federation/desktopTargets.js';
7
8
  import { createOpenAccessRouter } from './federation/openAccess.js';
@@ -616,11 +617,20 @@ export function startServer(options = {}) {
616
617
  collaborationService = new CollaborationService({ file: path.join(homedir(), '.termdock', 'federation', 'collaboration-services.json'),
617
618
  store: collaborationStore, transport: collaborationTransport, node: () => app.locals.collaborationNode,
618
619
  sessions: collaborationDirectorySessions, reverse: reverseCollaboration, connect: connectPeer,
620
+ tasks: {
621
+ receive: (peer, packet) => app.locals.collaborationTasks.receive(peer, packet),
622
+ heads: ids => app.locals.collaborationTasks?.heads(ids) ?? [],
623
+ sync: (peer, heads) => app.locals.collaborationTasks.sync(peer, heads),
624
+ },
619
625
  deviceScope: device => runtime.store.listEffective({ subjectId: device, serviceId: runtime.serviceId })
620
626
  .filter(grant => grant.scope.kind === 'sessions' && grant.actions.includes('session.input'))
621
627
  .flatMap(grant => grant.scope.kind === 'sessions' ? grant.scope.sessionIds : []),
622
628
  pairConnect: peer => connectCollaborationRpc(runtime.identity, peer) });
623
629
  app.locals.collaborationService = collaborationService;
630
+ const collaborationTasks = new CollaborationTaskService(collaborationTaskStore, collaborationStore, collaborationService, deliverPeerCollaboration, (task, template, dependencies) => prepareCollaborationTaskWorker(task, template, dependencies, collaborationService, (taskId, dependencyId, offset) => collaborationTasks.dependencyChunk(taskId, dependencyId, offset)));
631
+ app.locals.collaborationTasks = collaborationTasks;
632
+ collaborationTasks.start();
633
+ server.once('close', () => collaborationTasks.close());
624
634
  collaborationService.start();
625
635
  server.once('close', () => collaborationService?.close());
626
636
  collaborationTransport.start();
@@ -297,7 +297,12 @@ export async function createFederationRuntime(app, directory, handlers, options
297
297
  else if (packet.type === 'collaboration-service') {
298
298
  if (!options.collaborationService)
299
299
  throw new Error('COLLABORATION_UPGRADE_REQUIRED');
300
- send({ type: 'result', id: packet.id, ...options.collaborationService(subjectId, packet) });
300
+ // Task preparation may use the same channel for a directory request; do not block its reader.
301
+ void Promise.resolve(options.collaborationService(subjectId, packet)).then(result => send({ type: 'result', id: packet.id, ...result }))
302
+ .catch(error => { try {
303
+ send({ type: 'error', id: packet.id, error: error instanceof Error ? error.message : 'REQUEST_FAILED' });
304
+ }
305
+ catch { /* Connection closed. */ } });
301
306
  }
302
307
  else if (packet.type === 'collaboration-scoped-peer') {
303
308
  if (!options.registerScopedCollaborationPeer)
@@ -69,10 +69,15 @@ import { TermdockAutoUpdateManager } from '../utils/autoUpdate.js';
69
69
  import { AUTO_TITLE_LONG_RUNNING_DELAY_MS, AUTO_TITLE_MIN_CONTEXT_CHARS, cleanTerminalContext, generateAgentTitle, hasSubstantiveAutoTitleContext, isLongRunningAutoTitleTurnEligible, isNewAgentSessionId, isAutoTitleReevaluationDue, shouldReplaceAutoTitle, } from '../agent/autoTitle.js';
70
70
  import { getTitleNamerCatalog, invalidateTitleNamerCatalog, probePluginTitleNamer } from '../agent/titleNamerCatalog.js';
71
71
  import { RenderedTerminalContext } from '../agent/renderedTerminalContext.js';
72
+ import { CollaborationTaskStore } from '../agent/collaborationTaskStore.js';
73
+ import { collaborationTaskRoutes } from '../agent/collaborationTaskRoutes.js';
74
+ import { prepareTaskWorkspace } from '../agent/collaborationTaskWorkspace.js';
75
+ import { importTaskDependency } from '../agent/collaborationTaskBundles.js';
72
76
  const router = express.Router();
73
77
  const execFileAsync = promisify(execFile);
74
78
  const TERMDOCK_DIR = `${os.homedir()}/.termdock`;
75
79
  const automationStore = new AutomationStore(`${TERMDOCK_DIR}/automations.json`);
80
+ export const collaborationTaskStore = new CollaborationTaskStore(`${TERMDOCK_DIR}/collaboration-tasks.json`);
76
81
  export const collaborationStore = new CollaborationStore(`${TERMDOCK_DIR}/collaboration-groups.json`);
77
82
  const collaborationRouting = new CollaborationRoutingStore(`${TERMDOCK_DIR}/collaboration-routing.json`);
78
83
  const collaborationDeliveryWorker = new CollaborationDeliveryWorker({
@@ -1387,10 +1392,13 @@ function orchestrationSessionSnapshot(record) {
1387
1392
  const backendId = binding?.backendSessionId ?? record.backendSessionId;
1388
1393
  const backend = backendId ? terminalSessions.get(backendId) : null;
1389
1394
  const route = collaborationDeliveryWorker.state(record.sessionId);
1395
+ // A live terminal backend is observable even before the delivery worker has
1396
+ // inspected this session. It does not prove a pinned Agent target is writable.
1397
+ const terminalConnected = Boolean(backend);
1390
1398
  const slug = binding?.pane?.agentSlug ?? binding?.agentSlug ?? record.agentResume?.slug;
1391
1399
  const agent = slug ? agentBySlug(slug) : backend?.agent;
1392
1400
  return {
1393
- ...collaborationStore.sessionFacts(record.sessionId, route.state === 'ready'),
1401
+ ...collaborationStore.sessionFacts(record.sessionId, terminalConnected || route.state === 'ready' || route.state === 'shell'),
1394
1402
  last_terminal_output_at: backend?.lastOutputAt || null,
1395
1403
  activity_observed_at: backend ? Date.now() : null,
1396
1404
  activity_source: backend ? 'terminal_output' : 'unavailable',
@@ -1404,7 +1412,7 @@ function orchestrationSessionSnapshot(record) {
1404
1412
  name: record.name,
1405
1413
  cwd: backend?.cwd ?? record.cwd ?? '',
1406
1414
  agent: agent ? { slug: agent.slug, displayName: agent.displayName } : null,
1407
- status: route.state,
1415
+ status: route.state === 'unchecked' && terminalConnected ? 'terminal-connected' : route.state,
1408
1416
  capability: agent
1409
1417
  ? [agent.displayName, ...(agent.capabilities ?? []), backend?.activeProgram?.command || record.activeProgram || 'Agent 会话'].join(' · ')
1410
1418
  : (backend?.activeProgram?.command || record.activeProgram || 'Shell 终端'),
@@ -1779,6 +1787,60 @@ async function spawnCollaborationAgentSession(req, group, sourceSessionId, input
1779
1787
  }, 300).unref?.();
1780
1788
  return { group: updatedGroup, session: orchestrationSessionSnapshot(globalSessionState.sessions.find((candidate) => candidate.sessionId === frontendSessionId)) };
1781
1789
  }
1790
+ const preparingTaskWorkers = new Map();
1791
+ /** Dedicated persistent terminals leave existing member sessions and the user's checkout untouched. */
1792
+ export function prepareCollaborationTaskWorker(task, template, dependencies, service, readDependency) {
1793
+ const key = `${task.id}:${task.events.filter(e => e.kind === 'scheduled').at(-1)?.id}`;
1794
+ const pending = preparingTaskWorkers.get(key);
1795
+ if (pending)
1796
+ return pending;
1797
+ const operation = (async () => {
1798
+ const source = globalSessionState.sessions.find(s => s.sessionId === template.sessionId);
1799
+ if (!source || template.serviceId !== service.descriptor().serviceId)
1800
+ throw new Error('执行成员当前不可用,请协调者重新分派');
1801
+ const snapshot = orchestrationSessionSnapshot(source);
1802
+ const slug = snapshot.agent?.slug ?? source.agentResume?.slug;
1803
+ const launcher = (await listDetectedAgentLaunchers()).find(a => a.slug === slug);
1804
+ if (!launcher || !source.cwd)
1805
+ throw new Error('独立代码任务需要有项目目录的 Agent 成员,请选择可用成员');
1806
+ const workspace = await prepareTaskWorkspace(task, source.cwd, dependencies, (dependency, repository) => importTaskDependency(task, dependency, repository, service, readDependency));
1807
+ await pathValidator.allowSessionCwd(workspace.cwd);
1808
+ const existing = globalSessionState.sessions.find(s => s.cwd === workspace.cwd);
1809
+ const req = {};
1810
+ const opened = await openInventorySession(req, { preferredFrontendSessionId: existing?.sessionId,
1811
+ name: `执行 ${task.title.slice(0, 70)}`, customName: true, mode: 'tmux', cwd: workspace.cwd });
1812
+ const record = globalSessionState.sessions.find(s => s.sessionId === opened.session.sessionId);
1813
+ const backend = terminalSessions.get(opened.terminalSession.sessionId);
1814
+ if (!backend)
1815
+ throw new Error('独立执行终端创建失败,目录已保留');
1816
+ const currentAgent = orchestrationSessionSnapshot(record).agent;
1817
+ const launchFile = path.join(path.dirname(workspace.cwd), `${path.basename(workspace.cwd)}.worker.json`);
1818
+ let launch = null;
1819
+ try {
1820
+ launch = JSON.parse(await fs.promises.readFile(launchFile, 'utf8'));
1821
+ }
1822
+ catch (error) {
1823
+ if (error.code !== 'ENOENT')
1824
+ throw error;
1825
+ }
1826
+ if (!currentAgent && (!launch || launch.backendId !== opened.terminalSession.sessionId)) {
1827
+ // Persist before typing: a retry must never type the launcher into a newly booted Agent's prompt.
1828
+ const temporary = `${launchFile}.${process.pid}.tmp`;
1829
+ await fs.promises.writeFile(temporary, JSON.stringify({ sessionId: record.sessionId, backendId: opened.terminalSession.sessionId }), { mode: 0o600 });
1830
+ await fs.promises.rename(temporary, launchFile);
1831
+ writeTerminalInput(backend, `${buildCollaborationSpawnCommand({ slug: launcher.slug, command: launcher.command })}\r`);
1832
+ }
1833
+ const group = collaborationStore.getGroup(task.groupId);
1834
+ if (!group || group.deleted)
1835
+ throw new Error('协作组已删除,执行目录已保留');
1836
+ if (!group.sessionIds.includes(record.sessionId))
1837
+ await service.save({ id: group.id, name: group.name,
1838
+ sessionIds: [...group.sessionIds, record.sessionId], expectedUpdatedAt: group.updatedAt });
1839
+ return { sessionId: record.sessionId, workspace };
1840
+ })().finally(() => preparingTaskWorkers.delete(key));
1841
+ preparingTaskWorkers.set(key, operation);
1842
+ return operation;
1843
+ }
1782
1844
  function getTmuxBinary() {
1783
1845
  if (process.env.TMUX_BIN)
1784
1846
  return process.env.TMUX_BIN;
@@ -5631,6 +5693,8 @@ export function collaborationLocalActivity() {
5631
5693
  });
5632
5694
  }
5633
5695
  export function deliverPeerCollaboration(sessionId) { void tryDeliverCollaborationInbox(sessionId); }
5696
+ router.use('/operations/collaboration-tasks', collaborationTaskRoutes({ agent: false, store: collaborationStore, resolveSession: resolveFrontendSessionId }));
5697
+ router.use('/operations/orchestration/tasks', collaborationTaskRoutes({ agent: true, store: collaborationStore, resolveSession: resolveFrontendSessionId }));
5634
5698
  router.use('/operations', collaborationGroupRoutes({ store: collaborationStore,
5635
5699
  sessions: () => globalSessionState.sessions.map(orchestrationSessionSnapshot),
5636
5700
  save: (req, input) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.4.295",
3
+ "version": "1.4.296",
4
4
  "description": "A complete web-based terminal application with modern UI",
5
5
  "type": "module",
6
6
  "main": ".desktop-dist/main.js",
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "packageName": "termdock",
4
- "version": "1.4.295",
4
+ "version": "1.4.296",
5
5
  "runtimeProtocolVersion": 1,
6
6
  "minimumDesktopVersion": "1.4.46",
7
7
  "nodeMajor": 22,
8
8
  "dependencyHash": "sha256-+FK03eSUIISxxpGNQTlYLuAcpuytFuT+tiLAMYVhwl4=",
9
- "serverBundleHash": "sha256-iYtS9ldvYzDUfLm6SANDq/7AB44OIdxy6W8a0qifjnA=",
10
- "clientBundleHash": "sha256-0e7BcPx6z10Icj/9eD88DchjikmrZqCXJ+wgQ8d7lkw=",
9
+ "serverBundleHash": "sha256-Pey0kqNnGCviQazz2xMk+31zDfktp4wJFI/DN3CSzlc=",
10
+ "clientBundleHash": "sha256-xcl62Qc4opdlNYlyLKM+cu84NJTYyVxT/ezTJbkE9Ic=",
11
11
  "entrypoint": "dist/server/cli.js",
12
12
  "clientEntrypoint": "dist/client/index.html"
13
13
  }