termdock 1.4.321 → 1.4.324

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 (375) hide show
  1. package/dist/client/assets/App-7IUcmCLC.js +186 -0
  2. package/dist/client/assets/App-7IUcmCLC.js.br +0 -0
  3. package/dist/client/assets/App-7IUcmCLC.js.gz +0 -0
  4. package/dist/client/assets/{ArchitecturePanel-BIlIOGx7.js → ArchitecturePanel-CUAB0wFe.js} +6 -6
  5. package/dist/client/assets/ArchitecturePanel-CUAB0wFe.js.br +0 -0
  6. package/dist/client/assets/ArchitecturePanel-CUAB0wFe.js.gz +0 -0
  7. package/dist/client/assets/{ChangeWalkthroughPanel-BtXqyUzD.js → ChangeWalkthroughPanel-CKIG8diY.js} +2 -2
  8. package/dist/client/assets/ChangeWalkthroughPanel-CKIG8diY.js.br +0 -0
  9. package/dist/client/assets/ChangeWalkthroughPanel-CKIG8diY.js.gz +0 -0
  10. package/dist/client/assets/CollaborationMainWorkspace-CIq-JAbF.js +1 -0
  11. package/dist/client/assets/CollaborationMainWorkspace-CIq-JAbF.js.br +0 -0
  12. package/dist/client/assets/CollaborationMainWorkspace-CIq-JAbF.js.gz +0 -0
  13. package/dist/client/assets/CollaborationTaskContent-7vWDzH-d.js +2 -0
  14. package/dist/client/assets/{ComputerControlView-D81udDZO.js → ComputerControlView-CPSI-M86.js} +2 -2
  15. package/dist/client/assets/ComputerControlView-CPSI-M86.js.br +0 -0
  16. package/dist/client/assets/ComputerControlView-CPSI-M86.js.gz +0 -0
  17. package/dist/client/assets/{DagPlayground-B3hTlIFu.js → DagPlayground-BxocNRPm.js} +1 -1
  18. package/dist/client/assets/DagPlayground-BxocNRPm.js.br +0 -0
  19. package/dist/client/assets/DagPlayground-BxocNRPm.js.gz +0 -0
  20. package/dist/client/assets/{DiffLab-C5sDPAZ5.js → DiffLab-COGOFO0s.js} +2 -2
  21. package/dist/client/assets/DiffLab-COGOFO0s.js.br +0 -0
  22. package/dist/client/assets/DiffLab-COGOFO0s.js.gz +0 -0
  23. package/dist/client/assets/{DiffReview-DQFgOJPF.js → DiffReview-5ERdwz1C.js} +1 -1
  24. package/dist/client/assets/DiffReview-5ERdwz1C.js.br +0 -0
  25. package/dist/client/assets/DiffReview-5ERdwz1C.js.gz +0 -0
  26. package/dist/client/assets/{DiffReviewLab-CZvBmujD.js → DiffReviewLab-BSz9IND6.js} +1 -1
  27. package/dist/client/assets/DiffReviewLab-BSz9IND6.js.br +0 -0
  28. package/dist/client/assets/DiffReviewLab-BSz9IND6.js.gz +0 -0
  29. package/dist/client/assets/{DiffViewer-DOvGC9bh.js → DiffViewer-RT-p-ZBo.js} +8 -8
  30. package/dist/client/assets/DiffViewer-RT-p-ZBo.js.br +0 -0
  31. package/dist/client/assets/DiffViewer-RT-p-ZBo.js.gz +0 -0
  32. package/dist/client/assets/{ModelPreview-ClKH4BQ7.js → ModelPreview-DI9anVWA.js} +1 -1
  33. package/dist/client/assets/ModelPreview-DI9anVWA.js.br +0 -0
  34. package/dist/client/assets/ModelPreview-DI9anVWA.js.gz +0 -0
  35. package/dist/client/assets/{RightSidebar-BeegDfBO.js → RightSidebar-DOLn8R7c.js} +36 -36
  36. package/dist/client/assets/RightSidebar-DOLn8R7c.js.br +0 -0
  37. package/dist/client/assets/RightSidebar-DOLn8R7c.js.gz +0 -0
  38. package/dist/client/assets/{abnfDiagram-VCTEODGH-CHUZIHQo.js → abnfDiagram-VCTEODGH-CXd0unH5.js} +1 -1
  39. package/dist/client/assets/abnfDiagram-VCTEODGH-CXd0unH5.js.br +0 -0
  40. package/dist/client/assets/abnfDiagram-VCTEODGH-CXd0unH5.js.gz +0 -0
  41. package/dist/client/assets/app-DCFOZi_L.js +35 -0
  42. package/dist/client/assets/app-DCFOZi_L.js.br +0 -0
  43. package/dist/client/assets/app-DCFOZi_L.js.gz +0 -0
  44. package/dist/client/assets/{arc-CIJEXYV7.js → arc-DCqJmX8M.js} +1 -1
  45. package/dist/client/assets/arc-DCqJmX8M.js.br +0 -0
  46. package/dist/client/assets/arc-DCqJmX8M.js.gz +0 -0
  47. package/dist/client/assets/{architectureDiagram-5GKGNRK7-CcX1UBXG.js → architectureDiagram-5GKGNRK7-DGu_m54H.js} +1 -1
  48. package/dist/client/assets/architectureDiagram-5GKGNRK7-DGu_m54H.js.br +0 -0
  49. package/dist/client/assets/architectureDiagram-5GKGNRK7-DGu_m54H.js.gz +0 -0
  50. package/dist/client/assets/{blockDiagram-I7D4REHJ-gDLrIBDk.js → blockDiagram-I7D4REHJ-BI0gsxDN.js} +1 -1
  51. package/dist/client/assets/blockDiagram-I7D4REHJ-BI0gsxDN.js.br +0 -0
  52. package/dist/client/assets/blockDiagram-I7D4REHJ-BI0gsxDN.js.gz +0 -0
  53. package/dist/client/assets/{c4Diagram-7LVT6UL2-BQA7WLEL.js → c4Diagram-7LVT6UL2-Ct3xzGtD.js} +1 -1
  54. package/dist/client/assets/c4Diagram-7LVT6UL2-Ct3xzGtD.js.br +0 -0
  55. package/dist/client/assets/c4Diagram-7LVT6UL2-Ct3xzGtD.js.gz +0 -0
  56. package/dist/client/assets/channel-BLSCUksA.js +1 -0
  57. package/dist/client/assets/{chunk-2Q5K7J3B-CPCY618J.js → chunk-2Q5K7J3B-BPd2UShA.js} +1 -1
  58. package/dist/client/assets/{chunk-5VM5RSS4-Cc3Czx6A.js → chunk-5VM5RSS4-CoFZ5Fo3.js} +1 -1
  59. package/dist/client/assets/{chunk-F27PBJKO-3scxqZTK.js → chunk-F27PBJKO-C5gZrGp4.js} +1 -1
  60. package/dist/client/assets/chunk-F27PBJKO-C5gZrGp4.js.br +0 -0
  61. package/dist/client/assets/chunk-F27PBJKO-C5gZrGp4.js.gz +0 -0
  62. package/dist/client/assets/{chunk-IMKFNOWR-BOCOE1VY.js → chunk-IMKFNOWR-GW8b9ya-.js} +1 -1
  63. package/dist/client/assets/chunk-IMKFNOWR-GW8b9ya-.js.br +0 -0
  64. package/dist/client/assets/chunk-IMKFNOWR-GW8b9ya-.js.gz +0 -0
  65. package/dist/client/assets/{chunk-JWPE2WC7-DX2Onu68.js → chunk-JWPE2WC7-GpMoViQf.js} +1 -1
  66. package/dist/client/assets/{chunk-POPQ4Y6H-C4MN3QRd.js → chunk-POPQ4Y6H-C_vgVPaw.js} +1 -1
  67. package/dist/client/assets/{chunk-SVP7TREG-DOKo3BNt.js → chunk-SVP7TREG-bA7RXwWn.js} +1 -1
  68. package/dist/client/assets/chunk-SVP7TREG-bA7RXwWn.js.br +0 -0
  69. package/dist/client/assets/chunk-SVP7TREG-bA7RXwWn.js.gz +0 -0
  70. package/dist/client/assets/{chunk-TICWLB2K-CPpFFmO9.js → chunk-TICWLB2K-BG8DAtll.js} +1 -1
  71. package/dist/client/assets/chunk-TICWLB2K-BG8DAtll.js.br +0 -0
  72. package/dist/client/assets/chunk-TICWLB2K-BG8DAtll.js.gz +0 -0
  73. package/dist/client/assets/{chunk-XXDRQBXY-Zp_XOFU2.js → chunk-XXDRQBXY-Ces56sud.js} +1 -1
  74. package/dist/client/assets/classDiagram-ZZMXUADV-DkVIqOvw.js +1 -0
  75. package/dist/client/assets/classDiagram-v2-VYDZK3BY-DkVIqOvw.js +1 -0
  76. package/dist/client/assets/{cose-bilkent-JH36ORCC-iYXdWZMG.js → cose-bilkent-JH36ORCC-Bwch0qL5.js} +1 -1
  77. package/dist/client/assets/cose-bilkent-JH36ORCC-Bwch0qL5.js.br +0 -0
  78. package/dist/client/assets/cose-bilkent-JH36ORCC-Bwch0qL5.js.gz +0 -0
  79. package/dist/client/assets/{cynefin-OW5HDTMX-CXRpxmcA.js → cynefin-OW5HDTMX-CrAXyA2Z.js} +1 -1
  80. package/dist/client/assets/cynefin-OW5HDTMX-CrAXyA2Z.js.br +0 -0
  81. package/dist/client/assets/cynefin-OW5HDTMX-CrAXyA2Z.js.gz +0 -0
  82. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CH1TQhgO.js → cynefinDiagram-5FMLGOSQ-YlP0Q93l.js} +1 -1
  83. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-YlP0Q93l.js.br +0 -0
  84. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-YlP0Q93l.js.gz +0 -0
  85. package/dist/client/assets/{dagre-GXQ25YYZ-BdshuKJr.js → dagre-GXQ25YYZ-CZ4XcPK9.js} +1 -1
  86. package/dist/client/assets/dagre-GXQ25YYZ-CZ4XcPK9.js.br +0 -0
  87. package/dist/client/assets/dagre-GXQ25YYZ-CZ4XcPK9.js.gz +0 -0
  88. package/dist/client/assets/{diagram-S7CK7UJ4-VbNBimIR.js → diagram-S7CK7UJ4-c_8HfHGA.js} +1 -1
  89. package/dist/client/assets/diagram-S7CK7UJ4-c_8HfHGA.js.br +0 -0
  90. package/dist/client/assets/diagram-S7CK7UJ4-c_8HfHGA.js.gz +0 -0
  91. package/dist/client/assets/{diagram-UQ7AKVKN-D_NUFcq3.js → diagram-UQ7AKVKN-BGtRfxMR.js} +1 -1
  92. package/dist/client/assets/diagram-UQ7AKVKN-BGtRfxMR.js.br +0 -0
  93. package/dist/client/assets/diagram-UQ7AKVKN-BGtRfxMR.js.gz +0 -0
  94. package/dist/client/assets/{diagram-VSXAHHWV-CfYRQ4mq.js → diagram-VSXAHHWV-_9yZnhuv.js} +1 -1
  95. package/dist/client/assets/diagram-VSXAHHWV-_9yZnhuv.js.br +0 -0
  96. package/dist/client/assets/diagram-VSXAHHWV-_9yZnhuv.js.gz +0 -0
  97. package/dist/client/assets/{diagram-VX7I27RA-YHy6vMjY.js → diagram-VX7I27RA-C_mnc4_u.js} +1 -1
  98. package/dist/client/assets/diagram-VX7I27RA-C_mnc4_u.js.br +0 -0
  99. package/dist/client/assets/diagram-VX7I27RA-C_mnc4_u.js.gz +0 -0
  100. package/dist/client/assets/{diagram-Z3DM3KII-DvHqYL0O.js → diagram-Z3DM3KII-sZ_AiSpj.js} +1 -1
  101. package/dist/client/assets/diagram-Z3DM3KII-sZ_AiSpj.js.br +0 -0
  102. package/dist/client/assets/diagram-Z3DM3KII-sZ_AiSpj.js.gz +0 -0
  103. package/dist/client/assets/{ebnfDiagram-PWID7BFC-Bl9bDxAP.js → ebnfDiagram-PWID7BFC-Dm-BXeqS.js} +1 -1
  104. package/dist/client/assets/ebnfDiagram-PWID7BFC-Dm-BXeqS.js.br +0 -0
  105. package/dist/client/assets/ebnfDiagram-PWID7BFC-Dm-BXeqS.js.gz +0 -0
  106. package/dist/client/assets/{erDiagram-RLTQ6QDP-DauNoBZZ.js → erDiagram-RLTQ6QDP-Dz4cBepd.js} +1 -1
  107. package/dist/client/assets/erDiagram-RLTQ6QDP-Dz4cBepd.js.br +0 -0
  108. package/dist/client/assets/erDiagram-RLTQ6QDP-Dz4cBepd.js.gz +0 -0
  109. package/dist/client/assets/{flowDiagram-HODETNUW-D6eDWfJY.js → flowDiagram-HODETNUW-CbRG8-WW.js} +1 -1
  110. package/dist/client/assets/flowDiagram-HODETNUW-CbRG8-WW.js.br +0 -0
  111. package/dist/client/assets/flowDiagram-HODETNUW-CbRG8-WW.js.gz +0 -0
  112. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-CWHSwTR6.js → ganttDiagram-EL5Y4UJY-CmBXWlr0.js} +1 -1
  113. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CmBXWlr0.js.br +0 -0
  114. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CmBXWlr0.js.gz +0 -0
  115. package/dist/client/assets/{gestureArbiter-nU4jhK3S.js → gestureArbiter-B26W6rS7.js} +1 -1
  116. package/dist/client/assets/gestureArbiter-B26W6rS7.js.br +0 -0
  117. package/dist/client/assets/gestureArbiter-B26W6rS7.js.gz +0 -0
  118. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-BHYt5-_X.js → gitGraphDiagram-WWUBYQGX-JW5QMYEk.js} +1 -1
  119. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-JW5QMYEk.js.br +0 -0
  120. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-JW5QMYEk.js.gz +0 -0
  121. package/dist/client/assets/index-Ctz-IDjR.css +1 -0
  122. package/dist/client/assets/index-Ctz-IDjR.css.br +0 -0
  123. package/dist/client/assets/{index-B4bEMUyn.css.gz → index-Ctz-IDjR.css.gz} +0 -0
  124. package/dist/client/assets/{infoDiagram-27XIBGKW-DPmlcUaZ.js → infoDiagram-27XIBGKW-CsA6WdPn.js} +1 -1
  125. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-DAn65XKZ.js → ishikawaDiagram-5VMMS53U-CsKPUwTw.js} +1 -1
  126. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-DAn65XKZ.js.br → ishikawaDiagram-5VMMS53U-CsKPUwTw.js.br} +0 -0
  127. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CsKPUwTw.js.gz +0 -0
  128. package/dist/client/assets/{journeyDiagram-3NMN7TZE-B2c5x9jb.js → journeyDiagram-3NMN7TZE-DpN98gN0.js} +1 -1
  129. package/dist/client/assets/journeyDiagram-3NMN7TZE-DpN98gN0.js.br +0 -0
  130. package/dist/client/assets/journeyDiagram-3NMN7TZE-DpN98gN0.js.gz +0 -0
  131. package/dist/client/assets/{kanban-definition-UXKFOSKX-CMeEp_9r.js → kanban-definition-UXKFOSKX-RHO--43O.js} +1 -1
  132. package/dist/client/assets/kanban-definition-UXKFOSKX-RHO--43O.js.br +0 -0
  133. package/dist/client/assets/kanban-definition-UXKFOSKX-RHO--43O.js.gz +0 -0
  134. package/dist/client/assets/{layout-Db99ysGT.js → layout-Cm_prknW.js} +1 -1
  135. package/dist/client/assets/layout-Cm_prknW.js.br +0 -0
  136. package/dist/client/assets/layout-Cm_prknW.js.gz +0 -0
  137. package/dist/client/assets/{linear-B6mREmTG.js → linear-BVAsPkvS.js} +1 -1
  138. package/dist/client/assets/linear-BVAsPkvS.js.br +0 -0
  139. package/dist/client/assets/linear-BVAsPkvS.js.gz +0 -0
  140. package/dist/client/assets/{mermaid.core-DndzUmju.js → mermaid.core-ufe77Xaz.js} +5 -5
  141. package/dist/client/assets/mermaid.core-ufe77Xaz.js.br +0 -0
  142. package/dist/client/assets/mermaid.core-ufe77Xaz.js.gz +0 -0
  143. package/dist/client/assets/{mindmap-definition-YA3MSWOX-qYAlDvc4.js → mindmap-definition-YA3MSWOX-CRyy1U2d.js} +1 -1
  144. package/dist/client/assets/mindmap-definition-YA3MSWOX-CRyy1U2d.js.br +0 -0
  145. package/dist/client/assets/mindmap-definition-YA3MSWOX-CRyy1U2d.js.gz +0 -0
  146. package/dist/client/assets/passwordBootstrap-3_SIzSH7.js +2 -0
  147. package/dist/client/assets/passwordBootstrap-3_SIzSH7.js.br +0 -0
  148. package/dist/client/assets/passwordBootstrap-3_SIzSH7.js.gz +0 -0
  149. package/dist/client/assets/{pegDiagram-XKGWAZYB-Dg5DCFIn.js → pegDiagram-XKGWAZYB-DSHgdU9q.js} +1 -1
  150. package/dist/client/assets/pegDiagram-XKGWAZYB-DSHgdU9q.js.br +0 -0
  151. package/dist/client/assets/pegDiagram-XKGWAZYB-DSHgdU9q.js.gz +0 -0
  152. package/dist/client/assets/{pieDiagram-E7YTZNPT-dje1AAFI.js → pieDiagram-E7YTZNPT-lIUeAuhN.js} +1 -1
  153. package/dist/client/assets/pieDiagram-E7YTZNPT-lIUeAuhN.js.br +0 -0
  154. package/dist/client/assets/pieDiagram-E7YTZNPT-lIUeAuhN.js.gz +0 -0
  155. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-DLXI6hrS.js → quadrantDiagram-AXDQQJYC-CIgG9vBX.js} +1 -1
  156. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CIgG9vBX.js.br +0 -0
  157. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CIgG9vBX.js.gz +0 -0
  158. package/dist/client/assets/{railroadDiagram-O6MQD6OU-DcY-P8Q_.js → railroadDiagram-O6MQD6OU-DjP8oesA.js} +1 -1
  159. package/dist/client/assets/railroadDiagram-O6MQD6OU-DjP8oesA.js.br +0 -0
  160. package/dist/client/assets/railroadDiagram-O6MQD6OU-DjP8oesA.js.gz +0 -0
  161. package/dist/client/assets/{rdpSession-JkZuPKb3.js → rdpSession-BshIobdj.js} +1 -1
  162. package/dist/client/assets/rdpSession-BshIobdj.js.br +0 -0
  163. package/dist/client/assets/rdpSession-BshIobdj.js.gz +0 -0
  164. package/dist/client/assets/{referenceLongPress-CR3uo3V0.js → referenceLongPress-DBJnfFHa.js} +1 -1
  165. package/dist/client/assets/referenceLongPress-DBJnfFHa.js.br +0 -0
  166. package/dist/client/assets/referenceLongPress-DBJnfFHa.js.gz +0 -0
  167. package/dist/client/assets/{requirementDiagram-BXWQKSXE-B-GLzS7h.js → requirementDiagram-BXWQKSXE-Dbvu6IC_.js} +1 -1
  168. package/dist/client/assets/requirementDiagram-BXWQKSXE-Dbvu6IC_.js.br +0 -0
  169. package/dist/client/assets/requirementDiagram-BXWQKSXE-Dbvu6IC_.js.gz +0 -0
  170. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CINtGjgu.js → sankeyDiagram-P5KCCOFB-1mZ4s-lv.js} +1 -1
  171. package/dist/client/assets/sankeyDiagram-P5KCCOFB-1mZ4s-lv.js.br +0 -0
  172. package/dist/client/assets/sankeyDiagram-P5KCCOFB-1mZ4s-lv.js.gz +0 -0
  173. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-BRE-_raI.js → sequenceDiagram-WJ2MYXX4-Cu3hhzlV.js} +1 -1
  174. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Cu3hhzlV.js.br +0 -0
  175. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Cu3hhzlV.js.gz +0 -0
  176. package/dist/client/assets/{sizeCapture-INFHLROL-v2bGYNk3.js → sizeCapture-INFHLROL-xfm69HlR.js} +1 -1
  177. package/dist/client/assets/sizeCapture-INFHLROL-xfm69HlR.js.br +0 -0
  178. package/dist/client/assets/sizeCapture-INFHLROL-xfm69HlR.js.gz +0 -0
  179. package/dist/client/assets/{sparkles-Dx518Xui.js → sparkles-CDonlwGu.js} +1 -1
  180. package/dist/client/assets/{stateDiagram-D77RDMKH-CIQ1zGkb.js → stateDiagram-D77RDMKH-u-bh6mDK.js} +1 -1
  181. package/dist/client/assets/stateDiagram-D77RDMKH-u-bh6mDK.js.br +0 -0
  182. package/dist/client/assets/stateDiagram-D77RDMKH-u-bh6mDK.js.gz +0 -0
  183. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BQ_m8Gzd.js +1 -0
  184. package/dist/client/assets/{swimlanes-42K2YHIH-DEjGaJr6.js → swimlanes-42K2YHIH-U8WN__SO.js} +1 -1
  185. package/dist/client/assets/swimlanes-42K2YHIH-U8WN__SO.js.br +0 -0
  186. package/dist/client/assets/swimlanes-42K2YHIH-U8WN__SO.js.gz +0 -0
  187. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-FDEo3QWw.js +8 -0
  188. package/dist/client/assets/{timeline-definition-24CTP7MA-BPbZrudq.js → timeline-definition-24CTP7MA-CMsoNo4F.js} +1 -1
  189. package/dist/client/assets/timeline-definition-24CTP7MA-CMsoNo4F.js.br +0 -0
  190. package/dist/client/assets/timeline-definition-24CTP7MA-CMsoNo4F.js.gz +0 -0
  191. package/dist/client/assets/{triangle-alert-CVm2qdGE.js → triangle-alert-BgErMO2V.js} +1 -1
  192. package/dist/client/assets/{vennDiagram-4TSXK5OY-CAsKNSfN.js → vennDiagram-4TSXK5OY-CPE6pVwh.js} +1 -1
  193. package/dist/client/assets/vennDiagram-4TSXK5OY-CPE6pVwh.js.br +0 -0
  194. package/dist/client/assets/vennDiagram-4TSXK5OY-CPE6pVwh.js.gz +0 -0
  195. package/dist/client/assets/{videoCompression-CCOgxfhm.js → videoCompression-BWkZvEjM.js} +1 -1
  196. package/dist/client/assets/videoCompression-BWkZvEjM.js.br +0 -0
  197. package/dist/client/assets/videoCompression-BWkZvEjM.js.gz +0 -0
  198. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-EeabO9yU.js → wardleyDiagram-VM6X3IG4-4lWd-R4N.js} +1 -1
  199. package/dist/client/assets/wardleyDiagram-VM6X3IG4-4lWd-R4N.js.br +0 -0
  200. package/dist/client/assets/wardleyDiagram-VM6X3IG4-4lWd-R4N.js.gz +0 -0
  201. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-MSUoQl2z.js → xychartDiagram-S5SC5T6Z-CpKJMCWV.js} +1 -1
  202. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CpKJMCWV.js.br +0 -0
  203. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CpKJMCWV.js.gz +0 -0
  204. package/dist/client/index.html +2 -2
  205. package/dist/client/index.html.br +0 -0
  206. package/dist/client/index.html.gz +0 -0
  207. package/dist/client/sw-encrypted-background.js +1 -1
  208. package/dist/client/sw-encrypted-background.js.br +0 -0
  209. package/dist/client/sw-encrypted-background.js.gz +0 -0
  210. package/dist/client/sw.js +1 -1
  211. package/dist/client/sw.js.br +0 -0
  212. package/dist/client/sw.js.gz +0 -0
  213. package/dist/server/agent/collaborationCli.js +5 -1
  214. package/dist/server/agent/collaborationGroupRoutes.js +15 -0
  215. package/dist/server/agent/collaborationRoutes.js +2 -0
  216. package/dist/server/agent/collaborationStore.js +63 -2
  217. package/dist/server/agent/collaborationTaskCli.js +1 -1
  218. package/dist/server/agent/collaborationTaskGuidance.js +2 -0
  219. package/dist/server/agent/collaborationTaskRoutes.js +5 -1
  220. package/dist/server/agent/collaborationTaskStore.js +18 -11
  221. package/dist/server/agent/collaborationTmuxDelivery.js +3 -2
  222. package/dist/server/agent/integrationCli.js +44 -20
  223. package/dist/server/agent/integrationServer.js +20 -1
  224. package/dist/server/agent/promptDelivery.js +2 -2
  225. package/dist/server/agent/sessionLaunchState.js +20 -0
  226. package/dist/server/agent/terminalInput.js +17 -0
  227. package/dist/server/federation/packets.js +179 -28
  228. package/dist/server/federation/requestContext.js +6 -1
  229. package/dist/server/federation/runtime.js +19 -8
  230. package/dist/server/routes/terminal.js +108 -57
  231. package/dist/server/utils/autoUpdate.js +55 -8
  232. package/dist/server/utils/npmUpdate.js +84 -8
  233. package/dist/server/utils/terminalPasteBuffer.js +66 -0
  234. package/dist/server/utils/tmuxClientCapabilities.js +4 -0
  235. package/dist/server/utils/tmuxCopySelection.js +94 -0
  236. package/dist/server/utils/tmuxEmptyServerProbe.js +15 -0
  237. package/docs/integrations.md +85 -0
  238. package/package.json +5 -2
  239. package/runtime-manifest.json +3 -3
  240. package/.desktop-dist/main.js +0 -1989
  241. package/dist/client/assets/App-VAvoVlm2.js +0 -186
  242. package/dist/client/assets/App-VAvoVlm2.js.br +0 -0
  243. package/dist/client/assets/App-VAvoVlm2.js.gz +0 -0
  244. package/dist/client/assets/ArchitecturePanel-BIlIOGx7.js.br +0 -0
  245. package/dist/client/assets/ArchitecturePanel-BIlIOGx7.js.gz +0 -0
  246. package/dist/client/assets/ChangeWalkthroughPanel-BtXqyUzD.js.br +0 -0
  247. package/dist/client/assets/ChangeWalkthroughPanel-BtXqyUzD.js.gz +0 -0
  248. package/dist/client/assets/CollaborationMainWorkspace-DUw3cqW-.js +0 -1
  249. package/dist/client/assets/CollaborationMainWorkspace-DUw3cqW-.js.br +0 -0
  250. package/dist/client/assets/CollaborationMainWorkspace-DUw3cqW-.js.gz +0 -0
  251. package/dist/client/assets/CollaborationTaskContent-C2sQQp6K.js +0 -2
  252. package/dist/client/assets/ComputerControlView-D81udDZO.js.br +0 -0
  253. package/dist/client/assets/ComputerControlView-D81udDZO.js.gz +0 -0
  254. package/dist/client/assets/DagPlayground-B3hTlIFu.js.br +0 -0
  255. package/dist/client/assets/DagPlayground-B3hTlIFu.js.gz +0 -0
  256. package/dist/client/assets/DiffLab-C5sDPAZ5.js.br +0 -0
  257. package/dist/client/assets/DiffLab-C5sDPAZ5.js.gz +0 -0
  258. package/dist/client/assets/DiffReview-DQFgOJPF.js.br +0 -0
  259. package/dist/client/assets/DiffReview-DQFgOJPF.js.gz +0 -0
  260. package/dist/client/assets/DiffReviewLab-CZvBmujD.js.br +0 -0
  261. package/dist/client/assets/DiffReviewLab-CZvBmujD.js.gz +0 -0
  262. package/dist/client/assets/DiffViewer-DOvGC9bh.js.br +0 -0
  263. package/dist/client/assets/DiffViewer-DOvGC9bh.js.gz +0 -0
  264. package/dist/client/assets/ModelPreview-ClKH4BQ7.js.br +0 -0
  265. package/dist/client/assets/ModelPreview-ClKH4BQ7.js.gz +0 -0
  266. package/dist/client/assets/RightSidebar-BeegDfBO.js.br +0 -0
  267. package/dist/client/assets/RightSidebar-BeegDfBO.js.gz +0 -0
  268. package/dist/client/assets/abnfDiagram-VCTEODGH-CHUZIHQo.js.br +0 -0
  269. package/dist/client/assets/abnfDiagram-VCTEODGH-CHUZIHQo.js.gz +0 -0
  270. package/dist/client/assets/app-Bj0N393t.js +0 -35
  271. package/dist/client/assets/app-Bj0N393t.js.br +0 -0
  272. package/dist/client/assets/app-Bj0N393t.js.gz +0 -0
  273. package/dist/client/assets/arc-CIJEXYV7.js.br +0 -0
  274. package/dist/client/assets/arc-CIJEXYV7.js.gz +0 -0
  275. package/dist/client/assets/architectureDiagram-5GKGNRK7-CcX1UBXG.js.br +0 -0
  276. package/dist/client/assets/architectureDiagram-5GKGNRK7-CcX1UBXG.js.gz +0 -0
  277. package/dist/client/assets/blockDiagram-I7D4REHJ-gDLrIBDk.js.br +0 -0
  278. package/dist/client/assets/blockDiagram-I7D4REHJ-gDLrIBDk.js.gz +0 -0
  279. package/dist/client/assets/c4Diagram-7LVT6UL2-BQA7WLEL.js.br +0 -0
  280. package/dist/client/assets/c4Diagram-7LVT6UL2-BQA7WLEL.js.gz +0 -0
  281. package/dist/client/assets/channel-OHMJip5O.js +0 -1
  282. package/dist/client/assets/chunk-F27PBJKO-3scxqZTK.js.br +0 -0
  283. package/dist/client/assets/chunk-F27PBJKO-3scxqZTK.js.gz +0 -0
  284. package/dist/client/assets/chunk-IMKFNOWR-BOCOE1VY.js.br +0 -0
  285. package/dist/client/assets/chunk-IMKFNOWR-BOCOE1VY.js.gz +0 -0
  286. package/dist/client/assets/chunk-SVP7TREG-DOKo3BNt.js.br +0 -0
  287. package/dist/client/assets/chunk-SVP7TREG-DOKo3BNt.js.gz +0 -0
  288. package/dist/client/assets/chunk-TICWLB2K-CPpFFmO9.js.br +0 -0
  289. package/dist/client/assets/chunk-TICWLB2K-CPpFFmO9.js.gz +0 -0
  290. package/dist/client/assets/classDiagram-ZZMXUADV-DwA5mGyC.js +0 -1
  291. package/dist/client/assets/classDiagram-v2-VYDZK3BY-DwA5mGyC.js +0 -1
  292. package/dist/client/assets/cose-bilkent-JH36ORCC-iYXdWZMG.js.br +0 -0
  293. package/dist/client/assets/cose-bilkent-JH36ORCC-iYXdWZMG.js.gz +0 -0
  294. package/dist/client/assets/cynefin-OW5HDTMX-CXRpxmcA.js.br +0 -0
  295. package/dist/client/assets/cynefin-OW5HDTMX-CXRpxmcA.js.gz +0 -0
  296. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CH1TQhgO.js.br +0 -0
  297. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CH1TQhgO.js.gz +0 -0
  298. package/dist/client/assets/dagre-GXQ25YYZ-BdshuKJr.js.br +0 -0
  299. package/dist/client/assets/dagre-GXQ25YYZ-BdshuKJr.js.gz +0 -0
  300. package/dist/client/assets/diagram-S7CK7UJ4-VbNBimIR.js.br +0 -0
  301. package/dist/client/assets/diagram-S7CK7UJ4-VbNBimIR.js.gz +0 -0
  302. package/dist/client/assets/diagram-UQ7AKVKN-D_NUFcq3.js.br +0 -0
  303. package/dist/client/assets/diagram-UQ7AKVKN-D_NUFcq3.js.gz +0 -0
  304. package/dist/client/assets/diagram-VSXAHHWV-CfYRQ4mq.js.br +0 -0
  305. package/dist/client/assets/diagram-VSXAHHWV-CfYRQ4mq.js.gz +0 -0
  306. package/dist/client/assets/diagram-VX7I27RA-YHy6vMjY.js.br +0 -0
  307. package/dist/client/assets/diagram-VX7I27RA-YHy6vMjY.js.gz +0 -0
  308. package/dist/client/assets/diagram-Z3DM3KII-DvHqYL0O.js.br +0 -0
  309. package/dist/client/assets/diagram-Z3DM3KII-DvHqYL0O.js.gz +0 -0
  310. package/dist/client/assets/ebnfDiagram-PWID7BFC-Bl9bDxAP.js.br +0 -0
  311. package/dist/client/assets/ebnfDiagram-PWID7BFC-Bl9bDxAP.js.gz +0 -0
  312. package/dist/client/assets/erDiagram-RLTQ6QDP-DauNoBZZ.js.br +0 -0
  313. package/dist/client/assets/erDiagram-RLTQ6QDP-DauNoBZZ.js.gz +0 -0
  314. package/dist/client/assets/flowDiagram-HODETNUW-D6eDWfJY.js.br +0 -0
  315. package/dist/client/assets/flowDiagram-HODETNUW-D6eDWfJY.js.gz +0 -0
  316. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CWHSwTR6.js.br +0 -0
  317. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CWHSwTR6.js.gz +0 -0
  318. package/dist/client/assets/gestureArbiter-nU4jhK3S.js.br +0 -0
  319. package/dist/client/assets/gestureArbiter-nU4jhK3S.js.gz +0 -0
  320. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BHYt5-_X.js.br +0 -0
  321. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BHYt5-_X.js.gz +0 -0
  322. package/dist/client/assets/index-B4bEMUyn.css +0 -1
  323. package/dist/client/assets/index-B4bEMUyn.css.br +0 -0
  324. package/dist/client/assets/ishikawaDiagram-5VMMS53U-DAn65XKZ.js.gz +0 -0
  325. package/dist/client/assets/journeyDiagram-3NMN7TZE-B2c5x9jb.js.br +0 -0
  326. package/dist/client/assets/journeyDiagram-3NMN7TZE-B2c5x9jb.js.gz +0 -0
  327. package/dist/client/assets/kanban-definition-UXKFOSKX-CMeEp_9r.js.br +0 -0
  328. package/dist/client/assets/kanban-definition-UXKFOSKX-CMeEp_9r.js.gz +0 -0
  329. package/dist/client/assets/layout-Db99ysGT.js.br +0 -0
  330. package/dist/client/assets/layout-Db99ysGT.js.gz +0 -0
  331. package/dist/client/assets/linear-B6mREmTG.js.br +0 -0
  332. package/dist/client/assets/linear-B6mREmTG.js.gz +0 -0
  333. package/dist/client/assets/mermaid.core-DndzUmju.js.br +0 -0
  334. package/dist/client/assets/mermaid.core-DndzUmju.js.gz +0 -0
  335. package/dist/client/assets/mindmap-definition-YA3MSWOX-qYAlDvc4.js.br +0 -0
  336. package/dist/client/assets/mindmap-definition-YA3MSWOX-qYAlDvc4.js.gz +0 -0
  337. package/dist/client/assets/passwordBootstrap-DaJXVcdB.js +0 -2
  338. package/dist/client/assets/passwordBootstrap-DaJXVcdB.js.br +0 -0
  339. package/dist/client/assets/passwordBootstrap-DaJXVcdB.js.gz +0 -0
  340. package/dist/client/assets/pegDiagram-XKGWAZYB-Dg5DCFIn.js.br +0 -0
  341. package/dist/client/assets/pegDiagram-XKGWAZYB-Dg5DCFIn.js.gz +0 -0
  342. package/dist/client/assets/pieDiagram-E7YTZNPT-dje1AAFI.js.br +0 -0
  343. package/dist/client/assets/pieDiagram-E7YTZNPT-dje1AAFI.js.gz +0 -0
  344. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DLXI6hrS.js.br +0 -0
  345. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DLXI6hrS.js.gz +0 -0
  346. package/dist/client/assets/railroadDiagram-O6MQD6OU-DcY-P8Q_.js.br +0 -0
  347. package/dist/client/assets/railroadDiagram-O6MQD6OU-DcY-P8Q_.js.gz +0 -0
  348. package/dist/client/assets/rdpSession-JkZuPKb3.js.br +0 -0
  349. package/dist/client/assets/rdpSession-JkZuPKb3.js.gz +0 -0
  350. package/dist/client/assets/referenceLongPress-CR3uo3V0.js.br +0 -0
  351. package/dist/client/assets/referenceLongPress-CR3uo3V0.js.gz +0 -0
  352. package/dist/client/assets/requirementDiagram-BXWQKSXE-B-GLzS7h.js.br +0 -0
  353. package/dist/client/assets/requirementDiagram-BXWQKSXE-B-GLzS7h.js.gz +0 -0
  354. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CINtGjgu.js.br +0 -0
  355. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CINtGjgu.js.gz +0 -0
  356. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BRE-_raI.js.br +0 -0
  357. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BRE-_raI.js.gz +0 -0
  358. package/dist/client/assets/sizeCapture-INFHLROL-v2bGYNk3.js.br +0 -0
  359. package/dist/client/assets/sizeCapture-INFHLROL-v2bGYNk3.js.gz +0 -0
  360. package/dist/client/assets/stateDiagram-D77RDMKH-CIQ1zGkb.js.br +0 -0
  361. package/dist/client/assets/stateDiagram-D77RDMKH-CIQ1zGkb.js.gz +0 -0
  362. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-DCGuhzdh.js +0 -1
  363. package/dist/client/assets/swimlanes-42K2YHIH-DEjGaJr6.js.br +0 -0
  364. package/dist/client/assets/swimlanes-42K2YHIH-DEjGaJr6.js.gz +0 -0
  365. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-Bj14fTzZ.js +0 -8
  366. package/dist/client/assets/timeline-definition-24CTP7MA-BPbZrudq.js.br +0 -0
  367. package/dist/client/assets/timeline-definition-24CTP7MA-BPbZrudq.js.gz +0 -0
  368. package/dist/client/assets/vennDiagram-4TSXK5OY-CAsKNSfN.js.br +0 -0
  369. package/dist/client/assets/vennDiagram-4TSXK5OY-CAsKNSfN.js.gz +0 -0
  370. package/dist/client/assets/videoCompression-CCOgxfhm.js.br +0 -0
  371. package/dist/client/assets/videoCompression-CCOgxfhm.js.gz +0 -0
  372. package/dist/client/assets/wardleyDiagram-VM6X3IG4-EeabO9yU.js.br +0 -0
  373. package/dist/client/assets/wardleyDiagram-VM6X3IG4-EeabO9yU.js.gz +0 -0
  374. package/dist/client/assets/xychartDiagram-S5SC5T6Z-MSUoQl2z.js.br +0 -0
  375. package/dist/client/assets/xychartDiagram-S5SC5T6Z-MSUoQl2z.js.gz +0 -0
package/dist/client/sw.js CHANGED
@@ -1 +1 @@
1
- if(!self.define){let e,s={};const n=(n,i)=>(n=new URL(n+".js",i).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(i,a)=>{const o=e||("document"in self?document.currentScript.src:"")||location.href;if(s[o])return;let r={};const c=e=>n(e,o),d={module:{uri:o},exports:r,require:c};s[o]=Promise.all(i.map(e=>d[e]||c(e))).then(e=>(a(...e),r))}}define(["./workbox-9845bf53"],function(e){"use strict";importScripts("sw-encrypted-background.js","sw-notifications.js","sw-secure-api.js","sw-downloads.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"index.html",revision:"01b5814f40b4c1508395f92ef3ae26e1"},{url:"assets/app-Bj0N393t.js",revision:null},{url:"assets/react-XDCjal2T.js",revision:null},{url:"assets/dnd-BCFAPC0L.js",revision:null},{url:"assets/terminal-C7X98Amf.js",revision:null},{url:"assets/index-B4bEMUyn.css",revision:null},{url:"icons/agents/opencode.svg",revision:"851c2931d95821ba2b39b68587b48976"},{url:"icons/agents/kimi.svg",revision:"5366c710f4f763022fe159a69cf17409"},{url:"icons/agents/grok.svg",revision:"cd745b0b964545bc7a6b4f36021c3298"},{url:"icons/agents/goose.svg",revision:"c79b927278983c19098d77b4b0c11ab3"},{url:"icons/agents/gemini.svg",revision:"7a64f6d6f80a908255e9c0256903882e"},{url:"icons/agents/droid.svg",revision:"f28723b8c5c115e0908ba3c72613e256"},{url:"icons/agents/cursor.svg",revision:"a1528f3d3cda497f75a5db28defb19de"},{url:"icons/agents/copilot.svg",revision:"dd52e96c1eac0b6ec4bedcd0ddd3b52d"},{url:"icons/agents/codex.svg",revision:"608e55babb0b217e1f2da287342b46d3"},{url:"icons/agents/claude.svg",revision:"08af0225b7acdd8e8f573f3247e5e1c3"},{url:"icons/agents/amp.svg",revision:"af12f8b33faa81e4d46ea7b93c7e43f3"},{url:"apple-touch-icon-180x180.png",revision:"628c2e2f28a9b545aa57be1352025643"},{url:"boot-logo.png",revision:"2e3a25efd9b0b8ca1eab53b5f2284556"},{url:"favicon.ico",revision:"2994debfa6f59a0898e24eb0c54d64b5"},{url:"ipad-status-bar.js",revision:"3a8080edb8a5cc658a7908f6ad69537f"},{url:"maskable-icon-512x512.png",revision:"4d489331fd81f0713c400b26426442b9"},{url:"pwa-192x192.png",revision:"4d6f899888cfb8ccd7a1fd3c9e583ad2"},{url:"pwa-512x512.png",revision:"0885dd7ec8932e7f878b013d51a380a4"},{url:"robots.txt",revision:"d9339907142917dee4aac78494ac9cfe"},{url:"sw-downloads.js",revision:"48dab2e78bd93b4eee27fca487eccfde"},{url:"sw-notifications.js",revision:"fde578590ea8b0540d488ef448b48f45"},{url:"sw-secure-api.js",revision:"cf2bdbd03d41d66d60344c0b5a1075de"},{url:"manifest.webmanifest",revision:"83f9a43b74c236012adafb077fb6d774"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html"),{denylist:[/^\/api\//,/^\/__termdock-download\//,/^\/health$/]})),e.registerRoute(/\/assets\/.*\.(?:js|css)$/,new e.CacheFirst({cacheName:"termdock-lazy-assets-v1",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:96,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/terminal\/[^/]+-[a-f0-9]{12}\.woff2$/,new e.CacheFirst({cacheName:"termdock-fonts-v2",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:384,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/.*\.(?:woff2|ttf)$/,new e.StaleWhileRevalidate({cacheName:"termdock-fonts-v1",plugins:[new e.ExpirationPlugin({maxEntries:24,maxAgeSeconds:2592e3})]}),"GET")});
1
+ if(!self.define){let e,s={};const n=(n,i)=>(n=new URL(n+".js",i).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(i,a)=>{const o=e||("document"in self?document.currentScript.src:"")||location.href;if(s[o])return;let c={};const r=e=>n(e,o),d={module:{uri:o},exports:c,require:r};s[o]=Promise.all(i.map(e=>d[e]||r(e))).then(e=>(a(...e),c))}}define(["./workbox-9845bf53"],function(e){"use strict";importScripts("sw-encrypted-background.js","sw-notifications.js","sw-secure-api.js","sw-downloads.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"index.html",revision:"f9b108bacc5daf8e78dac614880ef432"},{url:"assets/app-DCFOZi_L.js",revision:null},{url:"assets/react-XDCjal2T.js",revision:null},{url:"assets/dnd-BCFAPC0L.js",revision:null},{url:"assets/terminal-C7X98Amf.js",revision:null},{url:"assets/index-Ctz-IDjR.css",revision:null},{url:"icons/agents/opencode.svg",revision:"851c2931d95821ba2b39b68587b48976"},{url:"icons/agents/kimi.svg",revision:"5366c710f4f763022fe159a69cf17409"},{url:"icons/agents/grok.svg",revision:"cd745b0b964545bc7a6b4f36021c3298"},{url:"icons/agents/goose.svg",revision:"c79b927278983c19098d77b4b0c11ab3"},{url:"icons/agents/gemini.svg",revision:"7a64f6d6f80a908255e9c0256903882e"},{url:"icons/agents/droid.svg",revision:"f28723b8c5c115e0908ba3c72613e256"},{url:"icons/agents/cursor.svg",revision:"a1528f3d3cda497f75a5db28defb19de"},{url:"icons/agents/copilot.svg",revision:"dd52e96c1eac0b6ec4bedcd0ddd3b52d"},{url:"icons/agents/codex.svg",revision:"608e55babb0b217e1f2da287342b46d3"},{url:"icons/agents/claude.svg",revision:"08af0225b7acdd8e8f573f3247e5e1c3"},{url:"icons/agents/amp.svg",revision:"af12f8b33faa81e4d46ea7b93c7e43f3"},{url:"apple-touch-icon-180x180.png",revision:"628c2e2f28a9b545aa57be1352025643"},{url:"boot-logo.png",revision:"2e3a25efd9b0b8ca1eab53b5f2284556"},{url:"favicon.ico",revision:"2994debfa6f59a0898e24eb0c54d64b5"},{url:"ipad-status-bar.js",revision:"3a8080edb8a5cc658a7908f6ad69537f"},{url:"maskable-icon-512x512.png",revision:"4d489331fd81f0713c400b26426442b9"},{url:"pwa-192x192.png",revision:"4d6f899888cfb8ccd7a1fd3c9e583ad2"},{url:"pwa-512x512.png",revision:"0885dd7ec8932e7f878b013d51a380a4"},{url:"robots.txt",revision:"d9339907142917dee4aac78494ac9cfe"},{url:"sw-downloads.js",revision:"48dab2e78bd93b4eee27fca487eccfde"},{url:"sw-notifications.js",revision:"fde578590ea8b0540d488ef448b48f45"},{url:"sw-secure-api.js",revision:"cf2bdbd03d41d66d60344c0b5a1075de"},{url:"manifest.webmanifest",revision:"83f9a43b74c236012adafb077fb6d774"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html"),{denylist:[/^\/api\//,/^\/__termdock-download\//,/^\/health$/]})),e.registerRoute(/\/assets\/.*\.(?:js|css)$/,new e.CacheFirst({cacheName:"termdock-lazy-assets-v1",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:96,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/terminal\/[^/]+-[a-f0-9]{12}\.woff2$/,new e.CacheFirst({cacheName:"termdock-fonts-v2",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:384,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/.*\.(?:woff2|ttf)$/,new e.StaleWhileRevalidate({cacheName:"termdock-fonts-v1",plugins:[new e.ExpirationPlugin({maxEntries:24,maxAgeSeconds:2592e3})]}),"GET")});
Binary file
Binary file
@@ -13,13 +13,14 @@ export const COLLAB_HELP = `td collab — durable messages; no agent-specific ho
13
13
  [--purpose interactive|automation](默认 interactive;automation 是独立后台记录,无需用户验收)
14
14
  task assign <任务id> --assignee <成员id> --revision <当前版本>
15
15
  task report <任务id> --attempt <尝试id> --status ack|working|blocked|complete|failed --content <正文>
16
+ working/blocked/failed/complete 支持 --summary;正文保留完整证据。
16
17
  task ask <任务id> --attempt <尝试id> --content <问题> [--options '["选项一","选项二"]']
17
18
  task plan <任务id> --attempt <尝试id> --content <方案>
18
19
  task review <任务id> --artifact <交付物id> --verdict pass|changes|blocked --content <独立评审>
19
20
  task request-review <任务id> --artifact <版本id> --assignee <评审成员id> --revision <当前版本>
20
21
  task comment <任务id> --content <补充说明>
21
22
  task revise|close|reopen <任务id> --revision <当前版本> [--content <说明>]
22
- task coordinate <目标id> --revision <当前版本> --content <本次协调说明>
23
+ task coordinate <目标id> --revision <当前版本> [--summary <用户可读进展>] --content <完整协调说明>
23
24
  task pause|resume|retry <任务id> --revision <当前版本>
24
25
  task create 支持 --managed --coordinator <成员id> --reviewers <成员id,成员id>;子任务用 --work-type read-only|code 分类,代码默认独立目录
25
26
  正文支持 --file <文本文件> 或 --stdin;变更支持 --idempotency-key。
@@ -75,6 +76,9 @@ export const COLLAB_HELP = `td collab — durable messages; no agent-specific ho
75
76
  不终止 Agent、不重建消失的承载、不自动补键;未知消息历史或操作结果拒绝。
76
77
  用 session get 查当前状态;同键回读原操作,重启不自动再启动。
77
78
  诊断由管理员 td integration diagnostics <id> 回读,需 session_launch_diagnostics=true。
79
+ 启动代次一致性修复需实际服务1.4.322及agent_launch_generation_consistency=true;只升级CLI不生效。
80
+ terminal_input_check_diagnostics=true时可查guard捕获/承载解析/队列阶段及target_change.check_phase。
81
+ TERMINAL_INPUT_TARGET_CHANGED仍拒绝真实换代,不据此自动重试或重复发送正文。
78
82
  失败码:SESSION_COLD_RETRY_NATIVE_BOUND/SESSION_COLD_RETRY_NOT_FAILED;
79
83
  SESSION_MESSAGE_HISTORY_PRESENT/SESSION_MESSAGE_HISTORY_UNCONFIRMED;
80
84
  SESSION_COLD_RETRY_RUNTIME_UNCONFIRMED/SESSION_COLD_RETRY_UNSUPPORTED;
@@ -9,6 +9,21 @@ export function collaborationGroupRoutes(options) {
9
9
  res.json({ federationVersion: 1, capabilities: { groupRevision: 1, groupPromotion: 1, groupMove: 1, serverCollaboration: options.save ? 1 : undefined },
10
10
  groups: options.store.list(), sessions: options.sessions() });
11
11
  });
12
+ for (const [verb, archived] of [['archive', true], ['unarchive', false]]) {
13
+ router.post(`/collaboration-groups/:groupId/${verb}`, (req, res) => {
14
+ try {
15
+ const body = req.body ?? {};
16
+ if (Object.keys(body).some(key => !['expectedUpdatedAt', 'idempotencyKey'].includes(key)))
17
+ throw new CollaborationError('INVALID_GROUP_ARCHIVE_REQUEST', 'Only expectedUpdatedAt and idempotencyKey are accepted', 400);
18
+ const result = options.store.setLocalGroupArchived(req.params.groupId, archived, body.expectedUpdatedAt, body.idempotencyKey);
19
+ res.json(result);
20
+ }
21
+ catch (error) {
22
+ res.status(error instanceof CollaborationError ? error.httpStatus : 500).json({ code: error instanceof CollaborationError ? error.code : 'GROUP_ARCHIVE_FAILED',
23
+ ...(error instanceof CollaborationError && error.details ? error.details : {}), error: error instanceof Error ? error.message : 'Group archive operation failed' });
24
+ }
25
+ });
26
+ }
12
27
  router.post('/collaboration-groups', async (req, res) => {
13
28
  try {
14
29
  const body = req.body ?? {};
@@ -163,6 +163,8 @@ export function collaborationRoutes({ store, resolveSession, deliver, rebind, di
163
163
  router.get('/capabilities', run((_req, res) => {
164
164
  res.json({ protocol_version: 2, server_version: getTermdockVersion(), limits: COLLAB_LIMITS,
165
165
  route_diagnostics: !!diagnoseRoute, route_identity_recovery: !!diagnoseRoute, route_identity_recovery_min_version: '1.4.321',
166
+ agent_launch_generation_consistency: true, agent_launch_generation_consistency_min_version: '1.4.322',
167
+ terminal_input_check_diagnostics: true,
166
168
  task_workflow: { version: 2, command: 'td collab task', single_authority: true, explicit_reports: true,
167
169
  managed_goals: true, automatic_review: true, dependency_dispatch: true, isolated_worktrees: true, encrypted_commit_transfer: true,
168
170
  durable_questions: true, user_acceptance: true, versioned_artifacts: true, independent_reviews: true,
@@ -82,6 +82,7 @@ export class CollaborationStore {
82
82
  historyAvailable = true;
83
83
  groupCreationAvailable = true;
84
84
  groupRenamesAvailable = true;
85
+ groupArchivesAvailable = true;
85
86
  /** `drawId` is the random source behind newCollaborationId. It is a
86
87
  * constructor seam so tests can force a collision and prove the guard
87
88
  * below actually skips it; production always uses the CSPRNG default. */
@@ -126,6 +127,16 @@ export class CollaborationStore {
126
127
  && typeof value.applied.name === 'string' && !!value.applied.name.trim() && value.applied.name.length <= 256
127
128
  && !COLLAB_NAME_FORBIDDEN.test(value.applied.name) && Number.isSafeInteger(value.applied.updatedAt) && value.applied.updatedAt >= 0));
128
129
  this.document.localGroupRenames = this.groupRenamesAvailable ? renames ?? {} : {};
130
+ const archives = parsed.localGroupArchives;
131
+ this.groupArchivesAvailable = [1, 2].includes(parsed.version ?? 0) && Array.isArray(parsed.groups)
132
+ && (parsed.localGroupArchivesComplete === undefined || parsed.localGroupArchivesComplete === true)
133
+ && (archives === undefined || archives !== null && typeof archives === 'object' && !Array.isArray(archives)
134
+ && Object.entries(archives).every(([key, value]) => /^[a-f0-9]{64}$/.test(key) && value && typeof value.hash === 'string' && /^[a-f0-9]{64}$/.test(value.hash)
135
+ && value.applied && typeof value.applied.id === 'string' && /^[a-zA-Z0-9._-]{1,80}$/.test(value.applied.id)
136
+ && typeof value.applied.name === 'string' && !!value.applied.name.trim() && value.applied.name.length <= 256
137
+ && !COLLAB_NAME_FORBIDDEN.test(value.applied.name) && Number.isSafeInteger(value.applied.updatedAt) && value.applied.updatedAt >= 0
138
+ && (value.applied.archivedAt === undefined || Number.isSafeInteger(value.applied.archivedAt) && value.applied.archivedAt >= 0)));
139
+ this.document.localGroupArchives = this.groupArchivesAvailable ? archives ?? {} : {};
129
140
  this.document.sequence = Math.max(parsed.sequence ?? 0, this.document.sequence ?? 0);
130
141
  this.document.idempotency = parsed.idempotency ?? {};
131
142
  this.document.consumers = parsed.consumers ?? {};
@@ -138,10 +149,12 @@ export class CollaborationStore {
138
149
  this.historyAvailable = error.code === 'ENOENT';
139
150
  this.groupCreationAvailable = this.historyAvailable;
140
151
  this.groupRenamesAvailable = this.historyAvailable;
152
+ this.groupArchivesAvailable = this.historyAvailable;
141
153
  }
142
154
  this.document.terminalHistoryComplete = this.historyAvailable;
143
155
  this.document.localGroupRequestsComplete = this.groupCreationAvailable;
144
156
  this.document.localGroupRenamesComplete = this.groupRenamesAvailable;
157
+ this.document.localGroupArchivesComplete = this.groupArchivesAvailable;
145
158
  this.persistedDocument = JSON.stringify(this.document);
146
159
  }
147
160
  list() {
@@ -248,7 +261,54 @@ export class CollaborationStore {
248
261
  throw new CollaborationError('GROUP_NOT_LOCAL', 'Administrator metadata operations require a local group', 409);
249
262
  if (!Number.isSafeInteger(group.updatedAt) || group.updatedAt < 0)
250
263
  throw new CollaborationError('GROUP_STATE_UNCONFIRMED', 'Group revision is unavailable', 409);
251
- return { id: group.id, name: group.name, updatedAt: group.updatedAt };
264
+ return { id: group.id, name: group.name, updatedAt: group.updatedAt, ...(group.archivedAt !== undefined ? { archivedAt: group.archivedAt } : {}) };
265
+ }
266
+ listLocalGroupMetadata(includeArchived = false) {
267
+ return this.list().filter(group => !group.federated && (includeArchived || group.archivedAt === undefined))
268
+ .map(group => ({ id: group.id, name: group.name, updatedAt: group.updatedAt,
269
+ ...(group.archivedAt !== undefined ? { archivedAt: group.archivedAt } : {}) }));
270
+ }
271
+ /** Archive is a reversible discovery flag; it never changes membership or message routing. */
272
+ setLocalGroupArchived(id, archived, expectedUpdatedAt, key) {
273
+ if (typeof id !== 'string' || !/^[a-zA-Z0-9._-]{1,80}$/.test(id))
274
+ throw new CollaborationError('INVALID_GROUP_ID', 'An exact group ID is required', 400);
275
+ if (typeof archived !== 'boolean')
276
+ throw new CollaborationError('INVALID_GROUP_ARCHIVE_REQUEST', 'Archive state must be explicit', 400);
277
+ if (!Number.isSafeInteger(expectedUpdatedAt) || expectedUpdatedAt < 0)
278
+ throw new CollaborationError('INVALID_GROUP_VERSION', 'expected_updated_at must be a non-negative safe integer', 400);
279
+ const requestKey = localGroupRequestKey(key);
280
+ if (!this.groupArchivesAvailable)
281
+ throw new CollaborationError('GROUP_ARCHIVE_STATE_UNCONFIRMED', 'Archive journal is unavailable; reconcile persisted state before changing group visibility', 409);
282
+ const hash = crypto.createHash('sha256').update(JSON.stringify(['archive-local-group', id, archived, expectedUpdatedAt])).digest('hex');
283
+ const previous = this.document.localGroupArchives?.[requestKey];
284
+ if (previous) {
285
+ if (previous.hash !== hash)
286
+ throw new CollaborationError('IDEMPOTENCY_CONFLICT', 'This administrator archive key was used with different parameters', 409);
287
+ const target = this.getGroup(id);
288
+ if (!target || target.deleted || target.federated)
289
+ throw new CollaborationError('GROUP_ARCHIVE_TARGET_UNAVAILABLE', 'Original local archive target is unavailable; no replacement is created', 409);
290
+ const group = this.getLocalGroupMetadata(id);
291
+ this.persist(true);
292
+ return { group, applied: { ...previous.applied }, replayed: true };
293
+ }
294
+ const current = this.getLocalGroupMetadata(id);
295
+ if (current.updatedAt !== expectedUpdatedAt)
296
+ throw new CollaborationError('GROUP_CHANGED', 'Group changed; read its current revision before deciding again', 409, { currentUpdatedAt: current.updatedAt });
297
+ if (Object.keys(this.document.localGroupArchives ?? {}).length >= 2000)
298
+ throw new CollaborationError('GROUP_ARCHIVE_LIMIT', 'Administrator archive journal has reached its 2000-record limit', 409);
299
+ const target = this.getGroup(id);
300
+ const currentlyArchived = target.archivedAt !== undefined;
301
+ const changed = currentlyArchived !== archived;
302
+ const updatedAt = changed ? Math.max(Date.now(), current.updatedAt + 1) : current.updatedAt;
303
+ if (!Number.isSafeInteger(updatedAt))
304
+ throw new CollaborationError('GROUP_STATE_UNCONFIRMED', 'Group revision cannot advance safely', 409);
305
+ const archivedAt = archived ? currentlyArchived ? target.archivedAt : Date.now() : undefined;
306
+ const applied = { id, name: target.name, updatedAt, ...(archivedAt !== undefined ? { archivedAt } : {}) };
307
+ this.document = { ...this.document, groups: this.document.groups.map(group => group.id === id
308
+ ? { ...group, updatedAt, ...(archivedAt !== undefined ? { archivedAt } : { archivedAt: undefined }) } : group),
309
+ localGroupArchives: { ...this.document.localGroupArchives, [requestKey]: { hash, applied } } };
310
+ this.persist(true);
311
+ return { group: { ...applied }, applied: { ...applied }, replayed: false };
252
312
  }
253
313
  /** Display metadata and its original receipt share a durable commit. */
254
314
  renameLocalGroup(id, value, expectedUpdatedAt, key) {
@@ -282,7 +342,8 @@ export class CollaborationStore {
282
342
  const updatedAt = name === current.name ? current.updatedAt : Math.max(Date.now(), current.updatedAt + 1);
283
343
  if (!Number.isSafeInteger(updatedAt))
284
344
  throw new CollaborationError('GROUP_STATE_UNCONFIRMED', 'Group revision cannot advance safely', 409);
285
- const applied = { id, name, updatedAt };
345
+ const target = this.getGroup(id);
346
+ const applied = { id, name, updatedAt, ...(target.archivedAt !== undefined ? { archivedAt: target.archivedAt } : {}) };
286
347
  this.document = { ...this.document, groups: this.document.groups.map(group => group.id === id ? { ...group, name, updatedAt } : group),
287
348
  localGroupRenames: { ...this.document.localGroupRenames, [requestKey]: { hash, applied } } };
288
349
  this.persist(true);
@@ -15,7 +15,7 @@ export async function executeTaskCommand(command, request, io) {
15
15
  plan: [...bodyOptions, 'attempt', 'evidence'], review: [...bodyOptions, 'artifact', 'evidence', 'verdict'], comment: bodyOptions,
16
16
  'request-review': [...bodyOptions, 'artifact', 'assignee', 'revision'],
17
17
  revise: [...bodyOptions, 'revision'], close: [...bodyOptions, 'revision'], reopen: [...bodyOptions, 'revision'],
18
- coordinate: [...bodyOptions, 'revision'], pause: [...bodyOptions, 'revision'], resume: [...bodyOptions, 'revision'], retry: [...bodyOptions, 'revision'],
18
+ coordinate: [...bodyOptions, 'revision', 'summary'], pause: [...bodyOptions, 'revision'], resume: [...bodyOptions, 'revision'], retry: [...bodyOptions, 'revision'],
19
19
  };
20
20
  for (const flag of Object.keys(o))
21
21
  if (![...allowed[operation], ...(o.principal ? originOptions : []), 'principal', 'session', 'json', 'jsonl', 'text', 'help'].includes(flag))
@@ -0,0 +1,2 @@
1
+ /** Shared across first dispatch and subsequent coordination wakes. */
2
+ export const GOAL_EXPERIENCE_GUIDE = "用户可理解的拆分与更新:一个用户目标保留一张主卡片,所有执行工作都挂在这个目标下;跟进与返工沿用原目标,不用新的顶层目标表达同一件事。子任务按可验收成果划分,一项有明确产物、负责人、完成标准和必要依赖;标题用简短动词加成果名称,不用角色名、过程日志、ID或‘好的/按计划’。简单问题只安排一个必要执行任务;复杂任务仅在产物或负责人可独立验收时拆分,不为采集、复述、重复汇总制造多份卡片。首次拆分后、范围或依赖变化、明确里程碑或受阻时,用 task coordinate --revision <最新版本> --summary '已完成什么;当前推进什么;下一步或需要用户什么' --content '工作划分、各项产物、依赖顺序和依据' 更新当前目标。摘要面向用户,简短说明变化和下一步,不堆哈希、路径、版本号和验证日志;完整证据保留正文。执行成员用 report --attempt <当前尝试> --status working|blocked|failed --summary '当前明确进展或缺少的条件';没有新事实不要重复发报告,不报告百分比、预估剩余时间或无法观测的内部活动。只有存在必要的人类决定时用 task ask,普通安排说明不要求用户确认方案。";
@@ -1,6 +1,7 @@
1
1
  import { Router } from 'express';
2
2
  import { CollaborationError } from './collaborationProtocol.js';
3
3
  import { assertPeerRegistrationAuthority } from './collaborationPeerTransport.js';
4
+ import { hasEncryptedServiceAccess } from '../federation/requestContext.js';
4
5
  export function collaborationTaskRoutes(options) {
5
6
  const router = Router();
6
7
  const groupId = (value) => {
@@ -15,8 +16,11 @@ export function collaborationTaskRoutes(options) {
15
16
  if (!tasks || !peers)
16
17
  throw new CollaborationError('TASK_SERVICE_STARTING', '任务服务正在启动,请稍后重试', 503);
17
18
  if (!options.agent) {
19
+ // Reading the inbox does not register peers or create durable authority.
20
+ // Open-mode full-service viewers may read; mutations still require admin.
18
21
  try {
19
- assertPeerRegistrationAuthority(req);
22
+ if (!(['GET', 'HEAD'].includes(req.method) && hasEncryptedServiceAccess(req)))
23
+ assertPeerRegistrationAuthority(req);
20
24
  }
21
25
  catch {
22
26
  throw new CollaborationError('TASK_PERMISSION_DENIED', '当前连接无权处理协作任务', 403);
@@ -1,3 +1,4 @@
1
+ import { GOAL_EXPERIENCE_GUIDE } from './collaborationTaskGuidance.js';
1
2
  import { randomBytes, createHash } from 'node:crypto';
2
3
  import { readFileSync, writeFileSync, mkdirSync, renameSync } from 'node:fs';
3
4
  import { dirname } from 'node:path';
@@ -186,15 +187,17 @@ export class CollaborationTaskStore {
186
187
  const current = task.attempts.find(a => a.id === task.activeAttemptId);
187
188
  const result = task.artifacts.filter(a => a.kind === 'result' && a.attemptId === task.activeAttemptId).at(-1);
188
189
  const plan = task.artifacts.filter(a => a.kind === 'plan' && a.attemptId === task.activeAttemptId).at(-1);
189
- const reportSummary = current?.report?.content.split(/\n\s*\n/).map(paragraph => paragraph.split('\n').filter(line => !/^#{1,6}\s/.test(line)).join('\n').trim()).find(Boolean)?.slice(0, 512);
190
+ const reportSummary = (current?.report?.summary || current?.report?.content.split(/\n\s*\n/).map(paragraph => paragraph.split('\n').filter(line => !/^#{1,6}\s/.test(line)).join('\n').trim()).find(Boolean))?.slice(0, 512);
191
+ const coordination = task.events.filter(e => e.kind === 'coordinate' && e.attemptId === task.activeAttemptId).at(-1);
190
192
  const automationIssueSource = task.automationIssue ? current?.report && ['blocked', 'failed'].includes(current.report.status)
191
193
  && task.automationIssue === current.report.content.slice(0, 1000) ? 'member-report' : 'system' : undefined;
192
- return { ...task, ...(task.purpose === 'automation' ? { execution: taskExecution(task) } : {}), automationIssueSource, spec: task.spec.slice(0, 512), constraints: '', acceptance: '',
194
+ return { ...task, ...(task.purpose === 'automation' ? { execution: taskExecution(task) } : {}), automationIssueSource, spec: task.spec.slice(0, 512), constraints: '', acceptance: task.acceptance.slice(0, 512),
193
195
  deliveries: task.deliveries.filter(d => d.attemptId === task.activeAttemptId && d.error).slice(-1),
194
- attempts: current ? [{ ...current, report: current.report ? { ...current.report, summary: reportSummary, content: '', evidence: undefined } : undefined }] : [],
196
+ attempts: current ? [{ ...current, report: current.report ? { ...current.report, summary: reportSummary, summarySource: current.report.summary?.trim() ? 'explicit' : 'excerpt', content: '', evidence: undefined } : undefined }] : [],
195
197
  artifacts: [plan, result, ...task.artifacts.filter(a => a.kind === 'review' && a.reviewsArtifactId === result?.id)].filter((a) => !!a).map(a => ({ ...a, content: '', summary: (a.summary || (a.kind === 'result' && collaborationResultPresentation(a.content).condensed ? collaborationResultPresentation(a.content).summary : undefined))?.slice(0, 800), evidence: undefined })),
196
198
  decisions: task.decisions.filter(d => d.status === 'pending').map(d => ({ ...d, question: d.question.slice(0, 512), options: [] })),
197
- events: task.events.filter(e => ['revise', 'request-review'].includes(e.kind) && e.attemptId === task.activeAttemptId).slice(-4).map(e => ({ ...e, content: ['user', 'integration'].includes(e.source ?? '') && e.kind === 'revise' ? e.content.slice(0, 512) : '' })) };
199
+ events: [...task.events.filter(e => ['revise', 'request-review'].includes(e.kind) && e.attemptId === task.activeAttemptId).slice(-4).map(e => ({ ...e, content: ['user', 'integration'].includes(e.source ?? '') && e.kind === 'revise' ? e.content.slice(0, 512) : '' })),
200
+ ...(coordination ? [{ ...coordination, content: (coordination.summary || coordination.content).slice(0, 512), summary: coordination.summary?.slice(0, 512), evidence: undefined }] : [])].sort((a, b) => a.sequence - b.sequence) };
198
201
  }));
199
202
  }
200
203
  heads(groupIds, owner) { return this.document.tasks.filter(t => groupIds.includes(t.groupId) && t.ownerServiceId === owner).map(t => ({ id: t.id, revision: t.revision })); }
@@ -227,10 +230,10 @@ export class CollaborationTaskStore {
227
230
  task.attempts.push({ id: attemptId, assignee: member(assignee), createdAt: Date.now(), threadId });
228
231
  this.event(task, 'assigned', actor, content || '任务已分派');
229
232
  doc.outbox.push({ id: id(), taskId: task.id, attemptId, target: assignee, kind: 'task', threadId,
230
- content: `本次执行身份:${assignee.sessionId}。所有 td collab 命令显式带 --session ${assignee.sessionId};这是服务核对的实际身份,正文中的模板身份和 tmux 标识不能替代它。\n任务:${task.title}\n${task.spec}${task.constraints ? `\n约束:${task.constraints}` : ''}${task.acceptance ? `\n完成标准:${task.acceptance}` : ''}\n${content}\n任务 ID:${task.id}\n尝试 ID:${attemptId}\n用 td collab task get ${task.id} --text 查询完整上下文;用 td collab task report ${task.id} --attempt ${attemptId} --status ack --content '接手说明' 显式回复;遇必要问题用 task ask,提交结果用 report --status complete --summary '简短结论、关键交付和限制'。摘要先回答用户问题,不放任务 ID、版本、分支或流程日志;完整证据保留在 --content/--file 正文中。如果同一尝试已经交付或任务已归档,不要重复实施。${task.purpose === 'automation' ? '\n这是独立后台自动化执行记录:complete 是你明确提交的执行结果,无需等待用户 accepted。机械校验和外部发布由接入系统处理;纯咨询用 respond 关联原 comment,不重复提交 complete。必要问题用 ask 保留原文,由接入系统联系用户并回答。' : ''}${task.workspace ? `\n代码只能在独立目录 ${task.workspace.cwd} 修改。分支 ${task.workspace.branch}。交付前提交代码,结果说明提交、变更、验证与限制。不能修改原仓库、合并到用户分支或发布。` : ''}${task.workflow?.workType === 'read-only' ? '\n这是只读查询或分析任务:在本机会话中采集并交付报告,不修改代码或系统,不创建提交、构建、部署或终止进程。结果需说明采样时间、证据和限制。' : ''}${task.workflow?.kind === 'step' ? '\n完成报告会自动请求独立评审;评审要求修改时继续完成,重新提交 complete。只按用户授权运行测试。' : ''}` });
233
+ content: `本次执行身份:${assignee.sessionId}。所有 td collab 命令显式带 --session ${assignee.sessionId};这是服务核对的实际身份,正文中的模板身份和 tmux 标识不能替代它。\n任务:${task.title}\n${task.spec}${task.constraints ? `\n约束:${task.constraints}` : ''}${task.acceptance ? `\n完成标准:${task.acceptance}` : ''}\n${content}\n任务 ID:${task.id}\n尝试 ID:${attemptId}\n用 td collab task get ${task.id} --text 查询完整上下文;用 td collab task report ${task.id} --attempt ${attemptId} --status ack --content '接手说明' 显式回复;遇必要问题用 task ask,提交结果用 report --status complete --summary '简短结论、关键交付和限制'。摘要先回答用户问题,不放任务 ID、版本、分支或流程日志;完整证据保留在 --content/--file 正文中。明确里程碑、交付范围变化或遇到阻塞时,可用 report --status working|blocked|failed --summary '用户能理解的当前进展与下一步' --content '原始说明与证据' 更新,不以终端有输出代替报告,不重复无变化的进展。如果同一尝试已经交付或任务已归档,不要重复实施。${task.purpose === 'automation' ? '\n这是独立后台自动化执行记录:complete 是你明确提交的执行结果,无需等待用户 accepted。机械校验和外部发布由接入系统处理;纯咨询用 respond 关联原 comment,不重复提交 complete。必要问题用 ask 保留原文,由接入系统联系用户并回答。' : ''}${task.workspace ? `\n代码只能在独立目录 ${task.workspace.cwd} 修改。分支 ${task.workspace.branch}。交付前提交代码,结果说明提交、变更、验证与限制。不能修改原仓库、合并到用户分支或发布。` : ''}${task.workflow?.workType === 'read-only' ? '\n这是只读查询或分析任务:在本机会话中采集并交付报告,不修改代码或系统,不创建提交、构建、部署或终止进程。结果需说明采样时间、证据和限制。' : ''}${task.workflow?.kind === 'step' ? '\n完成报告会自动请求独立评审;评审要求修改时继续完成,重新提交 complete。代码交付前运行受影响的测试和必要构建;查询交付核对数据来源、采样时间和限制。未实际验收的路径必须明确说明。' : ''}` });
231
234
  }
232
235
  goalInstructions(task) {
233
- return `${this.baseGoalInstructions(task)}\n启动 Agent 前,读取 task get 返回的 launchProfiles、defaultLaunchProfileId 和 roster.launchProfile。根据用户填写的 notes 判断适用任务;这些是选用建议,不是能力或性能保证。需要另一种模型或参数时,用 td collab spawn ${task.groupId} <agentSlug> --launch-profile <方案id> --cwd <项目目录> --session ${task.coordinator?.sessionId} 创建对应执行成员,再把子任务分派给它。已有成员及其代码执行会话保留创建时的启动方案,不因默认方案变更而更换模型。`;
236
+ return `${this.baseGoalInstructions(task)}\n${GOAL_EXPERIENCE_GUIDE}\n启动 Agent 前,读取 task get 返回的 launchProfiles、defaultLaunchProfileId 和 roster.launchProfile。根据用户填写的 notes 判断适用任务;这些是选用建议,不是能力或性能保证。需要另一种模型或参数时,用 td collab spawn ${task.groupId} <agentSlug> --launch-profile <方案id> --cwd <项目目录> --session ${task.coordinator?.sessionId} 创建对应执行成员,再把子任务分派给它。已有成员及其代码执行会话保留创建时的启动方案,不因默认方案变更而更换模型。`;
234
237
  }
235
238
  baseGoalInstructions(task) {
236
239
  return `你是此目标的协调者,负责把目标推进到可验收交付,不亲自实施子任务。\n目标:${task.spec}\n约束:${task.constraints || '未补充'}\n完成标准:${task.acceptance || '满足用户目标,说明交付与限制'}\n任务 ID:${task.id}\n当前协调身份:${task.coordinator?.sessionId};所有命令显式带 --session ${task.coordinator?.sessionId},不使用 tmux 标识。\n用 td collab task get ${task.id} --json 读取 roster、子任务、完整记录和 revision。\n先报告 ack;拆分为可交付子任务,用 td collab task create --group ${task.groupId} --parent ${task.id} --title '标题' --content '完整要求' --assignee <roster里的成员sessionId> --acceptance '明确标准' --work-type read-only|code。先按目标明确分类:查询、检查、研究、分析用 read-only,复用现有执行成员会话,不创建 Git 目录;修改代码用 code,才创建独立目录。简单问题只建一个必要任务,不为了形式拆成采集、复述、汇总多份任务。子任务继承自动评审与协调者。依赖任务用 --depends-on id,id,服务在依赖评审通过后自动分派。保持分工合理,不根据终端输出推断谁有空。\n每次收到明确更新后读取最新记录,处理失败与交接。服务自动安排独立评审、返工和依赖接续;不要重复请求评审或催促正在等待回复的成员。必要的人类决策用 task ask --attempt <本轮id>;方案需要用户确认时提交 task plan,不把普通回复当授权。\n只有已交付代码任务实际包含相对 base 的提交变化时,才需创建 --work-type code --integration 的最终集成子任务,--depends-on 依赖全部代码实施任务;独立目录会包含依赖的提交。不得在原仓库自动合并或发布。\n结束本次协调用 td collab task coordinate ${task.id} --revision <最新版本> --content '已安排的工作和下一步';有新事件服务会再次唤起你。所有子任务评审通过后报告 complete --summary '直接回答用户的简短结果和限制';只读目标直接汇总已核对结果,不创建集成或重复汇总任务。正文保留证据、评审结论和限制,仅代码目标补充目录、分支和提交,等待用户最终验收。任何异常都要留下明确说明,不伪造完成或进度。`;
@@ -354,8 +357,8 @@ export class CollaborationTaskStore {
354
357
  taskPurpose(input.purpose);
355
358
  const content = text(input.content, '内容');
356
359
  const summary = text(input.summary, '结果摘要', 2400);
357
- if (summary && (input.kind !== 'report' || input.status !== 'complete'))
358
- throw new CollaborationError('INVALID_SUMMARY', '摘要只能随完成结果提交');
360
+ if (summary && input.kind !== 'coordinate' && (input.kind !== 'report' || !['working', 'blocked', 'failed', 'complete'].includes(input.status ?? '')))
361
+ throw new CollaborationError('INVALID_SUMMARY', '摘要只能用于进展、阻塞、失败、结果或协调说明');
359
362
  if (input.verdict !== undefined && !['pass', 'changes', 'blocked'].includes(input.verdict))
360
363
  throw new CollaborationError('INVALID_VERDICT', '评审结论无效');
361
364
  if (input.evidence !== undefined && Buffer.byteLength(JSON.stringify(input.evidence)) > 16_384)
@@ -470,10 +473,12 @@ export class CollaborationTaskStore {
470
473
  if (plan && task.approvedPlanArtifactId !== plan.id)
471
474
  throw new CollaborationError('PLAN_PENDING', '方案尚未由用户确认,请先等待决定', 409);
472
475
  }
473
- attempt.report = { status: input.status, content, evidence: input.evidence, createdAt: Date.now() };
476
+ attempt.report = { status: input.status, content, ...(summary ? { summary } : {}), evidence: input.evidence, createdAt: Date.now() };
474
477
  const event = this.event(task, 'report', actor, content, attempt.id);
475
478
  event.reportStatus = input.status;
476
479
  event.evidence = input.evidence;
480
+ if (summary)
481
+ event.summary = summary;
477
482
  if (input.status === 'complete' && attempt.id === task.activeAttemptId && task.status === 'accepted') {
478
483
  task.status = 'open';
479
484
  delete task.acceptedArtifactId;
@@ -631,7 +636,9 @@ export class CollaborationTaskStore {
631
636
  else if (input.kind === 'coordinate') {
632
637
  if (task.workflow?.kind !== 'goal' || !sameMember(actor, task.coordinator) || !content)
633
638
  throw new CollaborationError('COORDINATOR_REQUIRED', '请由目标协调者提交本次协调说明', 403);
634
- this.event(task, 'coordinate', actor, content);
639
+ const event = this.event(task, 'coordinate', actor, content);
640
+ if (summary)
641
+ event.summary = summary;
635
642
  task.coordination = { notifiedSequence: task.events.at(-1).sequence, acknowledgedSequence: task.events.at(-1).sequence, notifiedAt: Date.now() };
636
643
  delete task.automationIssue;
637
644
  }
@@ -807,7 +814,7 @@ export class CollaborationTaskStore {
807
814
  else if (action === 'wake') {
808
815
  const updates = task.events.filter(e => e.sequence > task.coordination.notifiedSequence && e.kind !== 'coordinate');
809
816
  doc.outbox.push({ id: id(), taskId: task.id, attemptId: task.activeAttemptId, target: task.coordinator, kind: 'message', threadId: task.id,
810
- content: `当前协调身份:${task.coordinator.sessionId};命令带 --session ${task.coordinator.sessionId}。\n目标「${task.title}」有新的明确事件,请继续协调:\n${updates.slice(-8).map(e => `${new Date(e.createdAt).toISOString()} ${e.content.slice(0, 1200)}`).join('\n')}\n用 td collab task get ${task.id} --json 读取完整上下文与子任务;安排必要下一步后 task coordinate ${task.id} --revision <最新版本> --content '协调说明'。自动评审和依赖已由服务接续,不要重复分派。\n当前流程指南:查询、检查、分析必须 --work-type read-only,复用 roster 现有执行成员;只有修改代码才用 code 和独立目录。只读报告由你直接汇总,不新增仅转述的汇总子任务。已评审且 HEAD 等于 base 的交付没有代码变化,不需要集成;有代码变化才安排必要集成。用户有新要求时继续本目标,交付新版本,不重做已有采样。最终汇总通过评审且无新要求时等待用户验收,不重复提交相同结果。` });
817
+ content: `当前协调身份:${task.coordinator.sessionId};命令带 --session ${task.coordinator.sessionId}。\n目标「${task.title}」有新的明确事件,请继续协调:\n${updates.slice(-8).map(e => `${new Date(e.createdAt).toISOString()} ${e.content.slice(0, 1200)}`).join('\n')}\n用 td collab task get ${task.id} --json 读取完整上下文与子任务;安排必要下一步后 task coordinate ${task.id} --revision <最新版本> --content '协调说明'。自动评审和依赖已由服务接续,不要重复分派。\n当前流程指南:查询、检查、分析必须 --work-type read-only,复用 roster 现有执行成员;只有修改代码才用 code 和独立目录。只读报告由你直接汇总,不新增仅转述的汇总子任务。已评审且 HEAD 等于 base 的交付没有代码变化,不需要集成;有代码变化才安排必要集成。用户有新要求时继续本目标,交付新版本,不重做已有采样。最终汇总通过评审且无新要求时等待用户验收,不重复提交相同结果。\n${GOAL_EXPERIENCE_GUIDE}` });
811
818
  task.coordination.notifiedSequence = task.events.at(-1).sequence;
812
819
  task.coordination.notifiedAt = Date.now();
813
820
  }
@@ -40,6 +40,7 @@ export function writeCollaborationTmuxPane(run, pane, prompt, stdin, assertCurre
40
40
  progress?.('queue_wait');
41
41
  return serializeTerminalInput(paneInputKey(pane), () => {
42
42
  progress?.('queue_acquired');
43
+ assertCurrent?.('queue_acquired');
43
44
  return writeTmuxPrompt(run, pane, prompt, stdin, assertCurrent, progress);
44
45
  });
45
46
  }
@@ -47,7 +48,7 @@ async function writeTmuxPrompt(run, pane, prompt,
47
48
  /** Body travels on stdin so tmux cannot parse its semicolons/backslashes. */
48
49
  stdin, assertCurrent, progress) {
49
50
  await assertSamePane(run, pane);
50
- assertCurrent?.();
51
+ assertCurrent?.('before_paste');
51
52
  // A fixed pane target is independent of the current window, keyboard focus
52
53
  // and browser presence. Delivery goes through a named tmux buffer rather
53
54
  // than `send-keys -l`: while a pane is in copy-mode, literal bytes are
@@ -81,7 +82,7 @@ stdin, assertCurrent, progress) {
81
82
  progress?.('paste_written');
82
83
  await waitForPromptSubmit();
83
84
  await assertSamePane(run, pane);
84
- assertCurrent?.();
85
+ assertCurrent?.('before_submit');
85
86
  progress?.('submit_attempted');
86
87
  await run([
87
88
  // The submit key rides outside the paste block: inside it, an editor
@@ -26,6 +26,14 @@ export const INTEGRATION_HELP = `td integration — local scoped integration adm
26
26
  GROUP_CHANGED, GROUP_NOT_FOUND, GROUP_NOT_LOCAL, GROUP_STATE_UNCONFIRMED,
27
27
  GROUP_RENAME_TARGET_UNAVAILABLE, GROUP_RENAME_STATE_UNCONFIRMED,
28
28
  GROUP_RENAME_LIMIT, ADMIN_LOCAL_GROUP_RENAME_UNSUPPORTED.
29
+ group archive|unarchive <exact-group-id> --expected-updated-at <N> --idempotency-key <key>
30
+ Administrator only; minimum CLI/running service 1.4.323; admin_local_group_archive=true.
31
+ Reversible discovery metadata only. Default groups list hides archived groups;
32
+ groups --include-archived lists them. group get always includes archivedAt when set.
33
+ Membership, principals, sessions, runtime, messages and history are unchanged.
34
+ Retry uncertain results with the same operation, revision and key; GROUP_CHANGED
35
+ requires rereading current metadata and choosing a new key. Archive receipts are
36
+ retained separately from the immutable group-create snapshot.
29
37
  group create --name <name> --idempotency-key <key>
30
38
  Administrator only; create an empty local group without a terminal source.
31
39
  Minimum CLI/running service 1.4.318; admin_local_group_create=true.
@@ -61,6 +69,12 @@ export const INTEGRATION_HELP = `td integration — local scoped integration adm
61
69
  diagnostics <TD-session-id> (read stored launch/restore diagnostics; administrator only)
62
70
  1.4.314 adds phase/timestamps, paste/submit write facts and target-change
63
71
  evidence; no argv/environment/credentials or application readiness claim.
72
+ 1.4.322 adds guard_captured/runtime_resolving/runtime_resolved stages and
73
+ target_change.check_phase/guard_captured_at/checked_at, launch IDs and route revisions.
74
+ Check actual server agent_launch_generation_consistency=true (minimum 1.4.322),
75
+ terminal_input_check_diagnostics=true; upgrading only the CLI does not fix a running service.
76
+ TERMINAL_INPUT_TARGET_CHANGED still rejects an actually replaced target.
77
+ create never auto-retries; retry-cold remains a separate, explicitly authorized operation.
64
78
  Prior versions cannot reconstruct missing launch evidence retroactively.
65
79
  create --file <policy.json> --credential-file <private-output.json>
66
80
  update --file <policy.json> (same identity/group; preserves the credential)
@@ -119,29 +133,33 @@ export async function runIntegrationAdmin(argv, port, adminToken, write) {
119
133
  return 0;
120
134
  }
121
135
  const socketPath = integrationSocketPath(port);
122
- if (action === 'group' && ['get', 'rename'].includes(argv[1])) {
136
+ if (action === 'group' && ['get', 'rename', 'archive', 'unarchive'].includes(argv[1])) {
123
137
  const operation = argv[1], id = argv[2], args = {};
124
- const usage = 'Usage: td integration group get <exact-id> | group rename <exact-id> --name <name> --expected-updated-at <N> --idempotency-key <key>';
138
+ const usage = 'Usage: td integration group get <exact-id> | group rename <exact-id> --name <name> --expected-updated-at <N> --idempotency-key <key> | group archive|unarchive <exact-id> --expected-updated-at <N> --idempotency-key <key>';
125
139
  if (!id || !/^[a-zA-Z0-9._-]{1,80}$/.test(id))
126
140
  throw new CollaborationError('INVALID_GROUP_ID', usage, 400);
127
141
  if (operation === 'get' && argv.length !== 3)
128
142
  throw new CollaborationError('INVALID_GROUP_RENAME_REQUEST', usage, 400);
129
- if (operation === 'rename') {
143
+ if (operation !== 'get') {
130
144
  for (let i = 3; i < argv.length; i += 2) {
131
- if (!['--name', '--expected-updated-at', '--idempotency-key'].includes(argv[i]) || !argv[i + 1] || Object.hasOwn(args, argv[i]))
132
- throw new CollaborationError('INVALID_GROUP_RENAME_REQUEST', usage, 400);
145
+ const allowed = operation === 'rename' ? ['--name', '--expected-updated-at', '--idempotency-key'] : ['--expected-updated-at', '--idempotency-key'];
146
+ if (!allowed.includes(argv[i]) || !argv[i + 1] || Object.hasOwn(args, argv[i]))
147
+ throw new CollaborationError(operation === 'rename' ? 'INVALID_GROUP_RENAME_REQUEST' : 'INVALID_GROUP_ARCHIVE_REQUEST', usage, 400);
133
148
  args[argv[i]] = argv[i + 1];
134
149
  }
135
- if (Object.keys(args).length !== 3 || !args['--name']?.trim() || !args['--idempotency-key']?.trim())
136
- throw new CollaborationError('INVALID_GROUP_RENAME_REQUEST', usage, 400);
150
+ if (operation === 'rename' ? Object.keys(args).length !== 3 || !args['--name']?.trim() || !args['--idempotency-key']?.trim()
151
+ : Object.keys(args).length !== 2 || !args['--idempotency-key']?.trim())
152
+ throw new CollaborationError(operation === 'rename' ? 'INVALID_GROUP_RENAME_REQUEST' : 'INVALID_GROUP_ARCHIVE_REQUEST', usage, 400);
137
153
  if (!/^(0|[1-9][0-9]*)$/.test(args['--expected-updated-at']) || !Number.isSafeInteger(Number(args['--expected-updated-at'])))
138
154
  throw new CollaborationError('INVALID_GROUP_VERSION', usage, 400);
139
155
  }
140
156
  const capabilities = parsed(await request(socketPath, 'GET', '/admin/capabilities', undefined, headers(undefined, adminToken)));
141
- if (capabilities.admin_local_group_rename !== true)
142
- throw new CollaborationError('ADMIN_LOCAL_GROUP_RENAME_UNSUPPORTED', 'CLI and running service must support administrator group metadata operations (minimum 1.4.319)', 409);
143
- const body = operation === 'rename' ? { name: args['--name'], expected_updated_at: Number(args['--expected-updated-at']), idempotency_key: args['--idempotency-key'] } : undefined;
144
- write(JSON.stringify(parsed(await request(socketPath, body ? 'POST' : 'GET', `/admin/groups/${encodeURIComponent(id)}${body ? '/rename' : ''}`, body, headers(undefined, adminToken)))));
157
+ const isArchive = operation === 'archive' || operation === 'unarchive';
158
+ if (capabilities[isArchive ? 'admin_local_group_archive' : 'admin_local_group_rename'] !== true)
159
+ throw new CollaborationError(isArchive ? 'ADMIN_LOCAL_GROUP_ARCHIVE_UNSUPPORTED' : 'ADMIN_LOCAL_GROUP_RENAME_UNSUPPORTED', `CLI and running service must support this operation (minimum 1.4.${isArchive ? '323' : '319'})`, 409);
160
+ const body = operation === 'get' ? undefined : { ...(operation === 'rename' ? { name: args['--name'] } : {}), expected_updated_at: Number(args['--expected-updated-at']), idempotency_key: args['--idempotency-key'] };
161
+ const suffix = operation === 'get' ? '' : `/${operation}`;
162
+ write(JSON.stringify(parsed(await request(socketPath, body ? 'POST' : 'GET', `/admin/groups/${encodeURIComponent(id)}${suffix}`, body, headers(undefined, adminToken)))));
145
163
  return 0;
146
164
  }
147
165
  if (action === 'group') {
@@ -207,16 +225,22 @@ export async function runIntegrationAdmin(argv, port, adminToken, write) {
207
225
  write(JSON.stringify(parsed(await request(socketPath, 'GET', `/admin/sessions/${encodeURIComponent(argv[1])}/restore-diagnostics`, undefined, headers(undefined, adminToken)))));
208
226
  return 0;
209
227
  }
210
- for (let index = 1; index < argv.length; index += 2) {
211
- const flag = argv[index];
212
- if (!['--file', '--credential-file'].includes(flag) || !argv[index + 1] || options[flag])
213
- throw new Error('Invalid integration arguments');
214
- options[flag] = argv[index + 1];
215
- }
228
+ if (action !== 'groups' && action !== 'list')
229
+ for (let index = 1; index < argv.length; index += 2) {
230
+ const flag = argv[index];
231
+ if (!['--file', '--credential-file'].includes(flag) || !argv[index + 1] || options[flag])
232
+ throw new Error('Invalid integration arguments');
233
+ options[flag] = argv[index + 1];
234
+ }
216
235
  if (action === 'groups' || action === 'list') {
217
- if (argv.length !== 1)
218
- throw new Error('Unexpected arguments');
219
- write(JSON.stringify(parsed(await request(socketPath, 'GET', action === 'groups' ? '/admin/groups' : '/admin/principals', undefined, headers(undefined, adminToken)))));
236
+ if (action === 'list' && argv.length !== 1 || action === 'groups' && argv.length > 2 || action === 'groups' && argv.length === 2 && argv[1] !== '--include-archived')
237
+ throw new Error('Usage: td integration groups [--include-archived] | list');
238
+ if (action === 'groups' && argv[1] === '--include-archived') {
239
+ const capabilities = parsed(await request(socketPath, 'GET', '/admin/capabilities', undefined, headers(undefined, adminToken)));
240
+ if (capabilities.admin_local_group_archive !== true)
241
+ throw new CollaborationError('ADMIN_LOCAL_GROUP_ARCHIVE_UNSUPPORTED', 'CLI and running service must support archived group discovery (minimum 1.4.323)', 409);
242
+ }
243
+ write(JSON.stringify(parsed(await request(socketPath, 'GET', action === 'groups' ? `/admin/groups${argv[1] ? '?include_archived=true' : ''}` : '/admin/principals', undefined, headers(undefined, adminToken)))));
220
244
  return 0;
221
245
  }
222
246
  if (action === 'update') {
@@ -68,7 +68,7 @@ export class IntegrationRuntime {
68
68
  if (!expected.length || given.length !== expected.length || !timingSafeEqual(given, expected))
69
69
  integrationError('INTEGRATION_ADMIN_REQUIRED', 'Local administration credential is required', 401);
70
70
  };
71
- app.get('/admin/groups', run(req => { admin(req); return { groups: options.messages.list().filter(g => !g.federated).map(g => ({ id: g.id, name: g.name, updatedAt: g.updatedAt })) }; }));
71
+ app.get('/admin/groups', run(req => { admin(req); return { groups: options.messages.listLocalGroupMetadata(req.query.include_archived === 'true') }; }));
72
72
  app.get('/admin/groups/:id', run(req => { admin(req); return { group: options.messages.getLocalGroupMetadata(req.params.id) }; }));
73
73
  app.post('/admin/groups/:id/rename', run(req => {
74
74
  admin(req);
@@ -78,6 +78,22 @@ export class IntegrationRuntime {
78
78
  }
79
79
  return options.messages.renameLocalGroup(req.params.id, body.name, body.expected_updated_at, body.idempotency_key);
80
80
  }));
81
+ app.post('/admin/groups/:id/archive', run(req => {
82
+ admin(req);
83
+ const body = req.body;
84
+ if (!body || typeof body !== 'object' || Array.isArray(body) || Object.keys(body).some(key => !['expected_updated_at', 'idempotency_key'].includes(key))) {
85
+ integrationError('INVALID_GROUP_ARCHIVE_REQUEST', 'Specify only expected_updated_at and idempotency_key');
86
+ }
87
+ return options.messages.setLocalGroupArchived(req.params.id, true, body.expected_updated_at, body.idempotency_key);
88
+ }));
89
+ app.post('/admin/groups/:id/unarchive', run(req => {
90
+ admin(req);
91
+ const body = req.body;
92
+ if (!body || typeof body !== 'object' || Array.isArray(body) || Object.keys(body).some(key => !['expected_updated_at', 'idempotency_key'].includes(key))) {
93
+ integrationError('INVALID_GROUP_ARCHIVE_REQUEST', 'Specify only expected_updated_at and idempotency_key');
94
+ }
95
+ return options.messages.setLocalGroupArchived(req.params.id, false, body.expected_updated_at, body.idempotency_key);
96
+ }));
81
97
  app.post('/admin/groups', run(req => {
82
98
  admin(req);
83
99
  const body = req.body;
@@ -246,12 +262,15 @@ export class IntegrationRuntime {
246
262
  session_startup_input_clear: true, session_startup_input_clear_min_version: '1.4.310',
247
263
  agent_launch_process_check: true, agent_launch_process_check_min_version: '1.4.312',
248
264
  terminal_input_runtime_fence: true, terminal_input_runtime_fence_min_version: '1.4.313',
265
+ agent_launch_generation_consistency: true, agent_launch_generation_consistency_min_version: '1.4.322',
266
+ terminal_input_check_diagnostics: true,
249
267
  session_launch_diagnostics: true, session_launch_diagnostics_min_version: '1.4.314',
250
268
  session_cold_retry: true, session_cold_retry_min_version: '1.4.314',
251
269
  session_rename: true, session_rename_min_version: '1.4.315',
252
270
  session_close: true, session_close_min_version: '1.4.315',
253
271
  admin_local_group_create: true, admin_local_group_create_min_version: '1.4.318',
254
272
  admin_local_group_rename: true, admin_local_group_rename_min_version: '1.4.319',
273
+ admin_local_group_archive: true, admin_local_group_archive_min_version: '1.4.323',
255
274
  integration_policy_update: true,
256
275
  session_restore_diagnostics: true,
257
276
  native_identity_linux_flock_owner: process.platform === 'linux',
@@ -22,12 +22,12 @@ export function writeBracketedPrompt(target, prompt, assertCurrent, progress) {
22
22
  progress?.('queue_wait');
23
23
  return serializeTerminalInput(target, async () => {
24
24
  progress?.('queue_acquired');
25
- assertCurrent?.();
25
+ assertCurrent?.('queue_acquired');
26
26
  progress?.('paste_attempted');
27
27
  target.write(buildBracketedPasteBytes(prompt));
28
28
  progress?.('paste_written');
29
29
  await waitForPromptSubmit();
30
- assertCurrent?.();
30
+ assertCurrent?.('before_submit');
31
31
  progress?.('submit_attempted');
32
32
  target.write('\r');
33
33
  progress?.('submit_written');
@@ -0,0 +1,20 @@
1
+ import { TerminalInputTargetChangedError } from './terminalInput.js';
2
+ /** Display/identity metadata may have crossed an await with an old snapshot.
3
+ * Only the launch lifecycle can change these server-owned control fields. */
4
+ export function mergeSessionLaunchState(candidate, current, change) {
5
+ if (!change)
6
+ return current ? { ...candidate,
7
+ agentLaunchGeneration: current.agentLaunchGeneration ?? null,
8
+ agentLaunchCheck: current.agentLaunchCheck ?? null,
9
+ } : candidate;
10
+ if (!current || (current.agentLaunchGeneration ?? null) !== change.expectedGeneration
11
+ || (current.agentLaunchCheck?.id ?? null) !== change.expectedCheckId) {
12
+ throw new TerminalInputTargetChangedError({
13
+ expected_backend_session_id: candidate.backendSessionId, current_backend_session_id: current?.backendSessionId ?? null,
14
+ expected_launch_id: change.expectedGeneration, current_launch_id: current?.agentLaunchGeneration ?? null,
15
+ backend_instance_matches: !!current && candidate.backendSessionId === current.backendSessionId,
16
+ check_phase: 'launch_state_commit', checked_at: Date.now(),
17
+ });
18
+ }
19
+ return { ...candidate, agentLaunchGeneration: change.generation, agentLaunchCheck: change.check };
20
+ }
@@ -22,6 +22,23 @@ export class TerminalInputTargetChangedError extends Error {
22
22
  this.evidence = evidence;
23
23
  }
24
24
  }
25
+ /** Capture once, including for a launch's own command. Never adopt a newer
26
+ * generation simply because the physical backend has stayed the same. */
27
+ export function captureRuntimeInputGuard(current, expected = current()) {
28
+ const capturedAt = Date.now();
29
+ return (phase = 'guard_capture') => {
30
+ const actual = current();
31
+ const matches = actual.backendInstance === expected.backendInstance;
32
+ if (actual.backendSessionId !== expected.backendSessionId || !matches
33
+ || actual.launchId !== expected.launchId || actual.routeRevision !== expected.routeRevision) {
34
+ throw new TerminalInputTargetChangedError({ expected_backend_session_id: expected.backendSessionId,
35
+ current_backend_session_id: actual.backendSessionId, expected_launch_id: expected.launchId,
36
+ current_launch_id: actual.launchId, backend_instance_matches: matches, check_phase: phase,
37
+ guard_captured_at: capturedAt, checked_at: Date.now(), expected_route_revision: expected.routeRevision,
38
+ current_route_revision: actual.routeRevision });
39
+ }
40
+ };
41
+ }
25
42
  /** Clearing a one-time launch check does not change the runtime generation. */
26
43
  export function captureTerminalInputGuard(current, expected = current()) {
27
44
  return () => {