termdock 1.4.310 → 1.4.312

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 (354) hide show
  1. package/dist/client/assets/{App-CytIMrFr.js → App-ChS2-lkz.js} +8 -8
  2. package/dist/client/assets/App-ChS2-lkz.js.br +0 -0
  3. package/dist/client/assets/App-ChS2-lkz.js.gz +0 -0
  4. package/dist/client/assets/ArchitecturePanel-JtjyyJoW.js +9 -0
  5. package/dist/client/assets/ArchitecturePanel-JtjyyJoW.js.br +0 -0
  6. package/dist/client/assets/ArchitecturePanel-JtjyyJoW.js.gz +0 -0
  7. package/dist/client/assets/{ChangeWalkthroughPanel-Bm9Tvd6H.js → ChangeWalkthroughPanel-BlQ5-VPp.js} +1 -1
  8. package/dist/client/assets/ChangeWalkthroughPanel-BlQ5-VPp.js.br +0 -0
  9. package/dist/client/assets/ChangeWalkthroughPanel-BlQ5-VPp.js.gz +0 -0
  10. package/dist/client/assets/{CollaborationMainWorkspace-BagYBDlJ.js → CollaborationMainWorkspace-aFLAMqDr.js} +1 -1
  11. package/dist/client/assets/CollaborationMainWorkspace-aFLAMqDr.js.br +0 -0
  12. package/dist/client/assets/CollaborationMainWorkspace-aFLAMqDr.js.gz +0 -0
  13. package/dist/client/assets/CollaborationTaskContent-BDQMRhU9.js +2 -0
  14. package/dist/client/assets/{ComputerControlView-CC6r2cD3.js → ComputerControlView-TAKDbBUl.js} +2 -2
  15. package/dist/client/assets/ComputerControlView-TAKDbBUl.js.br +0 -0
  16. package/dist/client/assets/ComputerControlView-TAKDbBUl.js.gz +0 -0
  17. package/dist/client/assets/{DagPlayground-BqAadqBT.js → DagPlayground-CR4uDFOx.js} +1 -1
  18. package/dist/client/assets/DagPlayground-CR4uDFOx.js.br +0 -0
  19. package/dist/client/assets/DagPlayground-CR4uDFOx.js.gz +0 -0
  20. package/dist/client/assets/{DiffLab-CrEVLy-j.js → DiffLab-BqeHMDOy.js} +1 -1
  21. package/dist/client/assets/DiffLab-BqeHMDOy.js.br +0 -0
  22. package/dist/client/assets/DiffLab-BqeHMDOy.js.gz +0 -0
  23. package/dist/client/assets/{DiffReview-C8e2GQxb.js → DiffReview-DqrOcRfP.js} +1 -1
  24. package/dist/client/assets/DiffReview-DqrOcRfP.js.br +0 -0
  25. package/dist/client/assets/DiffReview-DqrOcRfP.js.gz +0 -0
  26. package/dist/client/assets/{DiffReviewLab-RQ1NmpZE.js → DiffReviewLab-CEYpbrL6.js} +1 -1
  27. package/dist/client/assets/DiffReviewLab-CEYpbrL6.js.br +0 -0
  28. package/dist/client/assets/DiffReviewLab-CEYpbrL6.js.gz +0 -0
  29. package/dist/client/assets/{DiffViewer-KljgMa9h.js → DiffViewer-F-uQSmhG.js} +1 -1
  30. package/dist/client/assets/DiffViewer-F-uQSmhG.js.br +0 -0
  31. package/dist/client/assets/DiffViewer-F-uQSmhG.js.gz +0 -0
  32. package/dist/client/assets/{ModelPreview-B9UR1TR3.js → ModelPreview-KmXFkgij.js} +1 -1
  33. package/dist/client/assets/ModelPreview-KmXFkgij.js.br +0 -0
  34. package/dist/client/assets/ModelPreview-KmXFkgij.js.gz +0 -0
  35. package/dist/client/assets/{RightSidebar-DSH93gN5.js → RightSidebar-VMdXpo4h.js} +3 -3
  36. package/dist/client/assets/RightSidebar-VMdXpo4h.js.br +0 -0
  37. package/dist/client/assets/RightSidebar-VMdXpo4h.js.gz +0 -0
  38. package/dist/client/assets/{abnfDiagram-VCTEODGH-WFUf9n1A.js → abnfDiagram-VCTEODGH-CAMk1C0N.js} +1 -1
  39. package/dist/client/assets/abnfDiagram-VCTEODGH-CAMk1C0N.js.br +0 -0
  40. package/dist/client/assets/abnfDiagram-VCTEODGH-CAMk1C0N.js.gz +0 -0
  41. package/dist/client/assets/{app-Bey8S6UU.js → app-CHxLSuGQ.js} +3 -3
  42. package/dist/client/assets/app-CHxLSuGQ.js.br +0 -0
  43. package/dist/client/assets/app-CHxLSuGQ.js.gz +0 -0
  44. package/dist/client/assets/{arc-BXKxIsA3.js → arc-CYG_-1vC.js} +1 -1
  45. package/dist/client/assets/arc-CYG_-1vC.js.br +0 -0
  46. package/dist/client/assets/arc-CYG_-1vC.js.gz +0 -0
  47. package/dist/client/assets/{architectureDiagram-5GKGNRK7-DAfRrSxr.js → architectureDiagram-5GKGNRK7-BqHzezLR.js} +1 -1
  48. package/dist/client/assets/architectureDiagram-5GKGNRK7-BqHzezLR.js.br +0 -0
  49. package/dist/client/assets/architectureDiagram-5GKGNRK7-BqHzezLR.js.gz +0 -0
  50. package/dist/client/assets/{blockDiagram-I7D4REHJ-1HbSy7rb.js → blockDiagram-I7D4REHJ-D6GWRO_Z.js} +1 -1
  51. package/dist/client/assets/blockDiagram-I7D4REHJ-D6GWRO_Z.js.br +0 -0
  52. package/dist/client/assets/blockDiagram-I7D4REHJ-D6GWRO_Z.js.gz +0 -0
  53. package/dist/client/assets/{c4Diagram-7LVT6UL2-Dxwui-M_.js → c4Diagram-7LVT6UL2-CutmGIGb.js} +1 -1
  54. package/dist/client/assets/c4Diagram-7LVT6UL2-CutmGIGb.js.br +0 -0
  55. package/dist/client/assets/c4Diagram-7LVT6UL2-CutmGIGb.js.gz +0 -0
  56. package/dist/client/assets/channel-B3BKM2gg.js +1 -0
  57. package/dist/client/assets/{chunk-2Q5K7J3B-CJSdJ_A1.js → chunk-2Q5K7J3B-DwiUpGFu.js} +1 -1
  58. package/dist/client/assets/{chunk-5VM5RSS4-BNEXn4bI.js → chunk-5VM5RSS4-C35gLPSH.js} +1 -1
  59. package/dist/client/assets/{chunk-F27PBJKO-BaM6iLMb.js → chunk-F27PBJKO-CNptP19P.js} +1 -1
  60. package/dist/client/assets/chunk-F27PBJKO-CNptP19P.js.br +0 -0
  61. package/dist/client/assets/chunk-F27PBJKO-CNptP19P.js.gz +0 -0
  62. package/dist/client/assets/{chunk-IMKFNOWR-DxPJBdLq.js → chunk-IMKFNOWR-DHdpB9A0.js} +1 -1
  63. package/dist/client/assets/chunk-IMKFNOWR-DHdpB9A0.js.br +0 -0
  64. package/dist/client/assets/chunk-IMKFNOWR-DHdpB9A0.js.gz +0 -0
  65. package/dist/client/assets/{chunk-JWPE2WC7-BwEOSoiu.js → chunk-JWPE2WC7-CrKSOzdE.js} +1 -1
  66. package/dist/client/assets/{chunk-POPQ4Y6H-CbYcBz8G.js → chunk-POPQ4Y6H-CiZGLRSk.js} +1 -1
  67. package/dist/client/assets/{chunk-SVP7TREG-CpnycZ3K.js → chunk-SVP7TREG-B70pX8OB.js} +1 -1
  68. package/dist/client/assets/chunk-SVP7TREG-B70pX8OB.js.br +0 -0
  69. package/dist/client/assets/chunk-SVP7TREG-B70pX8OB.js.gz +0 -0
  70. package/dist/client/assets/{chunk-TICWLB2K-5oWwjAOF.js → chunk-TICWLB2K-Ba1mI99F.js} +1 -1
  71. package/dist/client/assets/chunk-TICWLB2K-Ba1mI99F.js.br +0 -0
  72. package/dist/client/assets/chunk-TICWLB2K-Ba1mI99F.js.gz +0 -0
  73. package/dist/client/assets/{chunk-XXDRQBXY-VWUm4Sz5.js → chunk-XXDRQBXY-DmKIl18h.js} +1 -1
  74. package/dist/client/assets/classDiagram-ZZMXUADV-CS4V_MQS.js +1 -0
  75. package/dist/client/assets/classDiagram-v2-VYDZK3BY-CS4V_MQS.js +1 -0
  76. package/dist/client/assets/{cose-bilkent-JH36ORCC-gpF5Tw44.js → cose-bilkent-JH36ORCC-C-NMDUHW.js} +1 -1
  77. package/dist/client/assets/cose-bilkent-JH36ORCC-C-NMDUHW.js.br +0 -0
  78. package/dist/client/assets/cose-bilkent-JH36ORCC-C-NMDUHW.js.gz +0 -0
  79. package/dist/client/assets/{cynefin-OW5HDTMX-HFr7zRQ0.js → cynefin-OW5HDTMX-CZgEc1ab.js} +1 -1
  80. package/dist/client/assets/cynefin-OW5HDTMX-CZgEc1ab.js.br +0 -0
  81. package/dist/client/assets/cynefin-OW5HDTMX-CZgEc1ab.js.gz +0 -0
  82. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-LccKgJj0.js → cynefinDiagram-5FMLGOSQ-CHQeSNm2.js} +1 -1
  83. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CHQeSNm2.js.br +0 -0
  84. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CHQeSNm2.js.gz +0 -0
  85. package/dist/client/assets/{dagre-GXQ25YYZ-C7eLk1r1.js → dagre-GXQ25YYZ-B_jkMdPS.js} +1 -1
  86. package/dist/client/assets/dagre-GXQ25YYZ-B_jkMdPS.js.br +0 -0
  87. package/dist/client/assets/dagre-GXQ25YYZ-B_jkMdPS.js.gz +0 -0
  88. package/dist/client/assets/{diagram-S7CK7UJ4-DkWPZYAg.js → diagram-S7CK7UJ4-nv6Lnsrp.js} +1 -1
  89. package/dist/client/assets/diagram-S7CK7UJ4-nv6Lnsrp.js.br +0 -0
  90. package/dist/client/assets/diagram-S7CK7UJ4-nv6Lnsrp.js.gz +0 -0
  91. package/dist/client/assets/{diagram-UQ7AKVKN-DluTsMXz.js → diagram-UQ7AKVKN-BZf2fzaA.js} +1 -1
  92. package/dist/client/assets/diagram-UQ7AKVKN-BZf2fzaA.js.br +0 -0
  93. package/dist/client/assets/diagram-UQ7AKVKN-BZf2fzaA.js.gz +0 -0
  94. package/dist/client/assets/{diagram-VSXAHHWV-BLXEmXmu.js → diagram-VSXAHHWV-CxL0_BH8.js} +1 -1
  95. package/dist/client/assets/diagram-VSXAHHWV-CxL0_BH8.js.br +0 -0
  96. package/dist/client/assets/diagram-VSXAHHWV-CxL0_BH8.js.gz +0 -0
  97. package/dist/client/assets/{diagram-VX7I27RA-DO3J99WU.js → diagram-VX7I27RA-Dm9MqpIE.js} +1 -1
  98. package/dist/client/assets/diagram-VX7I27RA-Dm9MqpIE.js.br +0 -0
  99. package/dist/client/assets/diagram-VX7I27RA-Dm9MqpIE.js.gz +0 -0
  100. package/dist/client/assets/{diagram-Z3DM3KII-kvkSusTy.js → diagram-Z3DM3KII-BIfTa7P5.js} +1 -1
  101. package/dist/client/assets/diagram-Z3DM3KII-BIfTa7P5.js.br +0 -0
  102. package/dist/client/assets/diagram-Z3DM3KII-BIfTa7P5.js.gz +0 -0
  103. package/dist/client/assets/{ebnfDiagram-PWID7BFC-Bxd9hatc.js → ebnfDiagram-PWID7BFC-D4XhCDFS.js} +1 -1
  104. package/dist/client/assets/ebnfDiagram-PWID7BFC-D4XhCDFS.js.br +0 -0
  105. package/dist/client/assets/ebnfDiagram-PWID7BFC-D4XhCDFS.js.gz +0 -0
  106. package/dist/client/assets/{erDiagram-RLTQ6QDP-BWc3uM23.js → erDiagram-RLTQ6QDP-Dxd48dXC.js} +1 -1
  107. package/dist/client/assets/erDiagram-RLTQ6QDP-Dxd48dXC.js.br +0 -0
  108. package/dist/client/assets/erDiagram-RLTQ6QDP-Dxd48dXC.js.gz +0 -0
  109. package/dist/client/assets/{flowDiagram-HODETNUW-BQhPtc9z.js → flowDiagram-HODETNUW-BXBMsEmE.js} +1 -1
  110. package/dist/client/assets/flowDiagram-HODETNUW-BXBMsEmE.js.br +0 -0
  111. package/dist/client/assets/flowDiagram-HODETNUW-BXBMsEmE.js.gz +0 -0
  112. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-DzmTLgVr.js → ganttDiagram-EL5Y4UJY-CBfDd-KZ.js} +1 -1
  113. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CBfDd-KZ.js.br +0 -0
  114. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CBfDd-KZ.js.gz +0 -0
  115. package/dist/client/assets/{gestureArbiter-BuNZMZ7A.js → gestureArbiter-DXLmNGli.js} +1 -1
  116. package/dist/client/assets/gestureArbiter-DXLmNGli.js.br +0 -0
  117. package/dist/client/assets/{gestureArbiter-BuNZMZ7A.js.gz → gestureArbiter-DXLmNGli.js.gz} +0 -0
  118. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-r0Onfl7K.js → gitGraphDiagram-WWUBYQGX-DtLM68fN.js} +1 -1
  119. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DtLM68fN.js.br +0 -0
  120. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DtLM68fN.js.gz +0 -0
  121. package/dist/client/assets/index-KuPaZyuZ.css +1 -0
  122. package/dist/client/assets/index-KuPaZyuZ.css.br +0 -0
  123. package/dist/client/assets/{index-C6D5a-dg.css.gz → index-KuPaZyuZ.css.gz} +0 -0
  124. package/dist/client/assets/{infoDiagram-27XIBGKW-C52jpDzv.js → infoDiagram-27XIBGKW-FRhqdJvW.js} +1 -1
  125. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-C-l0eHmO.js → ishikawaDiagram-5VMMS53U-DAHBvAZ-.js} +1 -1
  126. package/dist/client/assets/ishikawaDiagram-5VMMS53U-DAHBvAZ-.js.br +0 -0
  127. package/dist/client/assets/ishikawaDiagram-5VMMS53U-DAHBvAZ-.js.gz +0 -0
  128. package/dist/client/assets/{journeyDiagram-3NMN7TZE-DmhgEOjX.js → journeyDiagram-3NMN7TZE-CVuWuL3Z.js} +1 -1
  129. package/dist/client/assets/journeyDiagram-3NMN7TZE-CVuWuL3Z.js.br +0 -0
  130. package/dist/client/assets/journeyDiagram-3NMN7TZE-CVuWuL3Z.js.gz +0 -0
  131. package/dist/client/assets/{kanban-definition-UXKFOSKX-BnZWlxIT.js → kanban-definition-UXKFOSKX-ByQSUVJV.js} +1 -1
  132. package/dist/client/assets/kanban-definition-UXKFOSKX-ByQSUVJV.js.br +0 -0
  133. package/dist/client/assets/kanban-definition-UXKFOSKX-ByQSUVJV.js.gz +0 -0
  134. package/dist/client/assets/{layout-BrxPpC7u.js → layout-Bb3Nb1c4.js} +1 -1
  135. package/dist/client/assets/layout-Bb3Nb1c4.js.br +0 -0
  136. package/dist/client/assets/layout-Bb3Nb1c4.js.gz +0 -0
  137. package/dist/client/assets/{linear-DaEpqVcH.js → linear-DHMMQlOo.js} +1 -1
  138. package/dist/client/assets/linear-DHMMQlOo.js.br +0 -0
  139. package/dist/client/assets/linear-DHMMQlOo.js.gz +0 -0
  140. package/dist/client/assets/{mermaid.core-CidoOS12.js → mermaid.core-BYfniK0H.js} +5 -5
  141. package/dist/client/assets/mermaid.core-BYfniK0H.js.br +0 -0
  142. package/dist/client/assets/mermaid.core-BYfniK0H.js.gz +0 -0
  143. package/dist/client/assets/{mindmap-definition-YA3MSWOX-Bpr3CVLy.js → mindmap-definition-YA3MSWOX-EDLD5AyH.js} +1 -1
  144. package/dist/client/assets/mindmap-definition-YA3MSWOX-EDLD5AyH.js.br +0 -0
  145. package/dist/client/assets/mindmap-definition-YA3MSWOX-EDLD5AyH.js.gz +0 -0
  146. package/dist/client/assets/{passwordBootstrap-D7hFrc0r.js → passwordBootstrap-DCrtirwT.js} +1 -1
  147. package/dist/client/assets/passwordBootstrap-DCrtirwT.js.br +0 -0
  148. package/dist/client/assets/passwordBootstrap-DCrtirwT.js.gz +0 -0
  149. package/dist/client/assets/{pegDiagram-XKGWAZYB-Bw2JpSYn.js → pegDiagram-XKGWAZYB-BHYhkqJN.js} +1 -1
  150. package/dist/client/assets/pegDiagram-XKGWAZYB-BHYhkqJN.js.br +0 -0
  151. package/dist/client/assets/pegDiagram-XKGWAZYB-BHYhkqJN.js.gz +0 -0
  152. package/dist/client/assets/{pieDiagram-E7YTZNPT-BaKc3ifQ.js → pieDiagram-E7YTZNPT-BUIJlswC.js} +1 -1
  153. package/dist/client/assets/pieDiagram-E7YTZNPT-BUIJlswC.js.br +0 -0
  154. package/dist/client/assets/pieDiagram-E7YTZNPT-BUIJlswC.js.gz +0 -0
  155. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-B0Yi-dl9.js → quadrantDiagram-AXDQQJYC-D8Im-7yC.js} +1 -1
  156. package/dist/client/assets/quadrantDiagram-AXDQQJYC-D8Im-7yC.js.br +0 -0
  157. package/dist/client/assets/quadrantDiagram-AXDQQJYC-D8Im-7yC.js.gz +0 -0
  158. package/dist/client/assets/{railroadDiagram-O6MQD6OU-DCcCQofU.js → railroadDiagram-O6MQD6OU-D7n6z2G1.js} +1 -1
  159. package/dist/client/assets/railroadDiagram-O6MQD6OU-D7n6z2G1.js.br +0 -0
  160. package/dist/client/assets/railroadDiagram-O6MQD6OU-D7n6z2G1.js.gz +0 -0
  161. package/dist/client/assets/{rdpSession-DY81W5BY.js → rdpSession-DJlNIbVk.js} +1 -1
  162. package/dist/client/assets/rdpSession-DJlNIbVk.js.br +0 -0
  163. package/dist/client/assets/rdpSession-DJlNIbVk.js.gz +0 -0
  164. package/dist/client/assets/{referenceLongPress-CAzWqXsY.js → referenceLongPress-DFSrssSr.js} +1 -1
  165. package/dist/client/assets/referenceLongPress-DFSrssSr.js.br +0 -0
  166. package/dist/client/assets/referenceLongPress-DFSrssSr.js.gz +0 -0
  167. package/dist/client/assets/{requirementDiagram-BXWQKSXE-CEJFRPWH.js → requirementDiagram-BXWQKSXE-Ki0rR-F7.js} +1 -1
  168. package/dist/client/assets/requirementDiagram-BXWQKSXE-Ki0rR-F7.js.br +0 -0
  169. package/dist/client/assets/requirementDiagram-BXWQKSXE-Ki0rR-F7.js.gz +0 -0
  170. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-B3Wk45FA.js → sankeyDiagram-P5KCCOFB-36NmMqsW.js} +1 -1
  171. package/dist/client/assets/sankeyDiagram-P5KCCOFB-36NmMqsW.js.br +0 -0
  172. package/dist/client/assets/sankeyDiagram-P5KCCOFB-36NmMqsW.js.gz +0 -0
  173. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-BejEsITb.js → sequenceDiagram-WJ2MYXX4-5vsPuFyO.js} +1 -1
  174. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-5vsPuFyO.js.br +0 -0
  175. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-5vsPuFyO.js.gz +0 -0
  176. package/dist/client/assets/{sizeCapture-INFHLROL-DZ5NJZnM.js → sizeCapture-INFHLROL-DbAulwBg.js} +1 -1
  177. package/dist/client/assets/sizeCapture-INFHLROL-DbAulwBg.js.br +0 -0
  178. package/dist/client/assets/sizeCapture-INFHLROL-DbAulwBg.js.gz +0 -0
  179. package/dist/client/assets/{sparkles-DQGLdN2b.js → sparkles-CapLTKAs.js} +1 -1
  180. package/dist/client/assets/{stateDiagram-D77RDMKH-D8SSEwHa.js → stateDiagram-D77RDMKH-Bgwe0g5S.js} +1 -1
  181. package/dist/client/assets/stateDiagram-D77RDMKH-Bgwe0g5S.js.br +0 -0
  182. package/dist/client/assets/stateDiagram-D77RDMKH-Bgwe0g5S.js.gz +0 -0
  183. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-Bg6S3Zm0.js +1 -0
  184. package/dist/client/assets/{swimlanes-42K2YHIH-Dow-EKMG.js → swimlanes-42K2YHIH-COGAWe-g.js} +1 -1
  185. package/dist/client/assets/swimlanes-42K2YHIH-COGAWe-g.js.br +0 -0
  186. package/dist/client/assets/swimlanes-42K2YHIH-COGAWe-g.js.gz +0 -0
  187. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DwBBOocG.js +8 -0
  188. package/dist/client/assets/{timeline-definition-24CTP7MA-DpQ9D5f6.js → timeline-definition-24CTP7MA-C4gt5z68.js} +1 -1
  189. package/dist/client/assets/timeline-definition-24CTP7MA-C4gt5z68.js.br +0 -0
  190. package/dist/client/assets/timeline-definition-24CTP7MA-C4gt5z68.js.gz +0 -0
  191. package/dist/client/assets/{triangle-alert-Bdf_dBch.js → triangle-alert-xPHw25jD.js} +1 -1
  192. package/dist/client/assets/{vennDiagram-4TSXK5OY-DoemAmM2.js → vennDiagram-4TSXK5OY-CIEXh9oD.js} +1 -1
  193. package/dist/client/assets/vennDiagram-4TSXK5OY-CIEXh9oD.js.br +0 -0
  194. package/dist/client/assets/vennDiagram-4TSXK5OY-CIEXh9oD.js.gz +0 -0
  195. package/dist/client/assets/{videoCompression-Bg4gUQUf.js → videoCompression-CUkCS2-q.js} +1 -1
  196. package/dist/client/assets/videoCompression-CUkCS2-q.js.br +0 -0
  197. package/dist/client/assets/videoCompression-CUkCS2-q.js.gz +0 -0
  198. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-MernEZ54.js → wardleyDiagram-VM6X3IG4-gQhcW1vd.js} +1 -1
  199. package/dist/client/assets/wardleyDiagram-VM6X3IG4-gQhcW1vd.js.br +0 -0
  200. package/dist/client/assets/wardleyDiagram-VM6X3IG4-gQhcW1vd.js.gz +0 -0
  201. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-CzO3HEHD.js → xychartDiagram-S5SC5T6Z-BmIcdejz.js} +1 -1
  202. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmIcdejz.js.br +0 -0
  203. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmIcdejz.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.js +1 -1
  208. package/dist/client/sw.js.br +0 -0
  209. package/dist/client/sw.js.gz +0 -0
  210. package/dist/server/agent/agentLaunchCheck.js +22 -0
  211. package/dist/server/agent/collaborationCli.js +15 -4
  212. package/dist/server/agent/collaborationDeliveryWorker.js +3 -97
  213. package/dist/server/agent/collaborationTmuxDelivery.js +23 -51
  214. package/dist/server/agent/integrationServer.js +1 -0
  215. package/dist/server/agent/promptDelivery.js +20 -7
  216. package/dist/server/architecture/cli.js +30 -5
  217. package/dist/server/architecture/document.js +4 -4
  218. package/dist/server/architecture/documentDiff.js +5 -0
  219. package/dist/server/routes/terminal.js +103 -30
  220. package/docs/integrations.md +20 -1
  221. package/package.json +1 -1
  222. package/runtime-manifest.json +3 -3
  223. package/dist/client/assets/App-CytIMrFr.js.br +0 -0
  224. package/dist/client/assets/App-CytIMrFr.js.gz +0 -0
  225. package/dist/client/assets/ArchitecturePanel-BRTR2IsK.js +0 -9
  226. package/dist/client/assets/ArchitecturePanel-BRTR2IsK.js.br +0 -0
  227. package/dist/client/assets/ArchitecturePanel-BRTR2IsK.js.gz +0 -0
  228. package/dist/client/assets/ChangeWalkthroughPanel-Bm9Tvd6H.js.br +0 -0
  229. package/dist/client/assets/ChangeWalkthroughPanel-Bm9Tvd6H.js.gz +0 -0
  230. package/dist/client/assets/CollaborationMainWorkspace-BagYBDlJ.js.br +0 -0
  231. package/dist/client/assets/CollaborationMainWorkspace-BagYBDlJ.js.gz +0 -0
  232. package/dist/client/assets/CollaborationTaskContent-D7LXylWr.js +0 -2
  233. package/dist/client/assets/ComputerControlView-CC6r2cD3.js.br +0 -0
  234. package/dist/client/assets/ComputerControlView-CC6r2cD3.js.gz +0 -0
  235. package/dist/client/assets/DagPlayground-BqAadqBT.js.br +0 -0
  236. package/dist/client/assets/DagPlayground-BqAadqBT.js.gz +0 -0
  237. package/dist/client/assets/DiffLab-CrEVLy-j.js.br +0 -0
  238. package/dist/client/assets/DiffLab-CrEVLy-j.js.gz +0 -0
  239. package/dist/client/assets/DiffReview-C8e2GQxb.js.br +0 -0
  240. package/dist/client/assets/DiffReview-C8e2GQxb.js.gz +0 -0
  241. package/dist/client/assets/DiffReviewLab-RQ1NmpZE.js.br +0 -0
  242. package/dist/client/assets/DiffReviewLab-RQ1NmpZE.js.gz +0 -0
  243. package/dist/client/assets/DiffViewer-KljgMa9h.js.br +0 -0
  244. package/dist/client/assets/DiffViewer-KljgMa9h.js.gz +0 -0
  245. package/dist/client/assets/ModelPreview-B9UR1TR3.js.br +0 -0
  246. package/dist/client/assets/ModelPreview-B9UR1TR3.js.gz +0 -0
  247. package/dist/client/assets/RightSidebar-DSH93gN5.js.br +0 -0
  248. package/dist/client/assets/RightSidebar-DSH93gN5.js.gz +0 -0
  249. package/dist/client/assets/abnfDiagram-VCTEODGH-WFUf9n1A.js.br +0 -0
  250. package/dist/client/assets/abnfDiagram-VCTEODGH-WFUf9n1A.js.gz +0 -0
  251. package/dist/client/assets/app-Bey8S6UU.js.br +0 -0
  252. package/dist/client/assets/app-Bey8S6UU.js.gz +0 -0
  253. package/dist/client/assets/arc-BXKxIsA3.js.br +0 -0
  254. package/dist/client/assets/arc-BXKxIsA3.js.gz +0 -0
  255. package/dist/client/assets/architectureDiagram-5GKGNRK7-DAfRrSxr.js.br +0 -0
  256. package/dist/client/assets/architectureDiagram-5GKGNRK7-DAfRrSxr.js.gz +0 -0
  257. package/dist/client/assets/blockDiagram-I7D4REHJ-1HbSy7rb.js.br +0 -0
  258. package/dist/client/assets/blockDiagram-I7D4REHJ-1HbSy7rb.js.gz +0 -0
  259. package/dist/client/assets/c4Diagram-7LVT6UL2-Dxwui-M_.js.br +0 -0
  260. package/dist/client/assets/c4Diagram-7LVT6UL2-Dxwui-M_.js.gz +0 -0
  261. package/dist/client/assets/channel-Dkh0SMv-.js +0 -1
  262. package/dist/client/assets/chunk-F27PBJKO-BaM6iLMb.js.br +0 -0
  263. package/dist/client/assets/chunk-F27PBJKO-BaM6iLMb.js.gz +0 -0
  264. package/dist/client/assets/chunk-IMKFNOWR-DxPJBdLq.js.br +0 -0
  265. package/dist/client/assets/chunk-IMKFNOWR-DxPJBdLq.js.gz +0 -0
  266. package/dist/client/assets/chunk-SVP7TREG-CpnycZ3K.js.br +0 -0
  267. package/dist/client/assets/chunk-SVP7TREG-CpnycZ3K.js.gz +0 -0
  268. package/dist/client/assets/chunk-TICWLB2K-5oWwjAOF.js.br +0 -0
  269. package/dist/client/assets/chunk-TICWLB2K-5oWwjAOF.js.gz +0 -0
  270. package/dist/client/assets/classDiagram-ZZMXUADV-DqvmSdwt.js +0 -1
  271. package/dist/client/assets/classDiagram-v2-VYDZK3BY-DqvmSdwt.js +0 -1
  272. package/dist/client/assets/cose-bilkent-JH36ORCC-gpF5Tw44.js.br +0 -0
  273. package/dist/client/assets/cose-bilkent-JH36ORCC-gpF5Tw44.js.gz +0 -0
  274. package/dist/client/assets/cynefin-OW5HDTMX-HFr7zRQ0.js.br +0 -0
  275. package/dist/client/assets/cynefin-OW5HDTMX-HFr7zRQ0.js.gz +0 -0
  276. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-LccKgJj0.js.br +0 -0
  277. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-LccKgJj0.js.gz +0 -0
  278. package/dist/client/assets/dagre-GXQ25YYZ-C7eLk1r1.js.br +0 -0
  279. package/dist/client/assets/dagre-GXQ25YYZ-C7eLk1r1.js.gz +0 -0
  280. package/dist/client/assets/diagram-S7CK7UJ4-DkWPZYAg.js.br +0 -0
  281. package/dist/client/assets/diagram-S7CK7UJ4-DkWPZYAg.js.gz +0 -0
  282. package/dist/client/assets/diagram-UQ7AKVKN-DluTsMXz.js.br +0 -0
  283. package/dist/client/assets/diagram-UQ7AKVKN-DluTsMXz.js.gz +0 -0
  284. package/dist/client/assets/diagram-VSXAHHWV-BLXEmXmu.js.br +0 -0
  285. package/dist/client/assets/diagram-VSXAHHWV-BLXEmXmu.js.gz +0 -0
  286. package/dist/client/assets/diagram-VX7I27RA-DO3J99WU.js.br +0 -0
  287. package/dist/client/assets/diagram-VX7I27RA-DO3J99WU.js.gz +0 -0
  288. package/dist/client/assets/diagram-Z3DM3KII-kvkSusTy.js.br +0 -0
  289. package/dist/client/assets/diagram-Z3DM3KII-kvkSusTy.js.gz +0 -0
  290. package/dist/client/assets/ebnfDiagram-PWID7BFC-Bxd9hatc.js.br +0 -0
  291. package/dist/client/assets/ebnfDiagram-PWID7BFC-Bxd9hatc.js.gz +0 -0
  292. package/dist/client/assets/erDiagram-RLTQ6QDP-BWc3uM23.js.br +0 -0
  293. package/dist/client/assets/erDiagram-RLTQ6QDP-BWc3uM23.js.gz +0 -0
  294. package/dist/client/assets/flowDiagram-HODETNUW-BQhPtc9z.js.br +0 -0
  295. package/dist/client/assets/flowDiagram-HODETNUW-BQhPtc9z.js.gz +0 -0
  296. package/dist/client/assets/ganttDiagram-EL5Y4UJY-DzmTLgVr.js.br +0 -0
  297. package/dist/client/assets/ganttDiagram-EL5Y4UJY-DzmTLgVr.js.gz +0 -0
  298. package/dist/client/assets/gestureArbiter-BuNZMZ7A.js.br +0 -0
  299. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-r0Onfl7K.js.br +0 -0
  300. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-r0Onfl7K.js.gz +0 -0
  301. package/dist/client/assets/index-C6D5a-dg.css +0 -1
  302. package/dist/client/assets/index-C6D5a-dg.css.br +0 -0
  303. package/dist/client/assets/ishikawaDiagram-5VMMS53U-C-l0eHmO.js.br +0 -0
  304. package/dist/client/assets/ishikawaDiagram-5VMMS53U-C-l0eHmO.js.gz +0 -0
  305. package/dist/client/assets/journeyDiagram-3NMN7TZE-DmhgEOjX.js.br +0 -0
  306. package/dist/client/assets/journeyDiagram-3NMN7TZE-DmhgEOjX.js.gz +0 -0
  307. package/dist/client/assets/kanban-definition-UXKFOSKX-BnZWlxIT.js.br +0 -0
  308. package/dist/client/assets/kanban-definition-UXKFOSKX-BnZWlxIT.js.gz +0 -0
  309. package/dist/client/assets/layout-BrxPpC7u.js.br +0 -0
  310. package/dist/client/assets/layout-BrxPpC7u.js.gz +0 -0
  311. package/dist/client/assets/linear-DaEpqVcH.js.br +0 -0
  312. package/dist/client/assets/linear-DaEpqVcH.js.gz +0 -0
  313. package/dist/client/assets/mermaid.core-CidoOS12.js.br +0 -0
  314. package/dist/client/assets/mermaid.core-CidoOS12.js.gz +0 -0
  315. package/dist/client/assets/mindmap-definition-YA3MSWOX-Bpr3CVLy.js.br +0 -0
  316. package/dist/client/assets/mindmap-definition-YA3MSWOX-Bpr3CVLy.js.gz +0 -0
  317. package/dist/client/assets/passwordBootstrap-D7hFrc0r.js.br +0 -0
  318. package/dist/client/assets/passwordBootstrap-D7hFrc0r.js.gz +0 -0
  319. package/dist/client/assets/pegDiagram-XKGWAZYB-Bw2JpSYn.js.br +0 -0
  320. package/dist/client/assets/pegDiagram-XKGWAZYB-Bw2JpSYn.js.gz +0 -0
  321. package/dist/client/assets/pieDiagram-E7YTZNPT-BaKc3ifQ.js.br +0 -0
  322. package/dist/client/assets/pieDiagram-E7YTZNPT-BaKc3ifQ.js.gz +0 -0
  323. package/dist/client/assets/quadrantDiagram-AXDQQJYC-B0Yi-dl9.js.br +0 -0
  324. package/dist/client/assets/quadrantDiagram-AXDQQJYC-B0Yi-dl9.js.gz +0 -0
  325. package/dist/client/assets/railroadDiagram-O6MQD6OU-DCcCQofU.js.br +0 -0
  326. package/dist/client/assets/railroadDiagram-O6MQD6OU-DCcCQofU.js.gz +0 -0
  327. package/dist/client/assets/rdpSession-DY81W5BY.js.br +0 -0
  328. package/dist/client/assets/rdpSession-DY81W5BY.js.gz +0 -0
  329. package/dist/client/assets/referenceLongPress-CAzWqXsY.js.br +0 -0
  330. package/dist/client/assets/referenceLongPress-CAzWqXsY.js.gz +0 -0
  331. package/dist/client/assets/requirementDiagram-BXWQKSXE-CEJFRPWH.js.br +0 -0
  332. package/dist/client/assets/requirementDiagram-BXWQKSXE-CEJFRPWH.js.gz +0 -0
  333. package/dist/client/assets/sankeyDiagram-P5KCCOFB-B3Wk45FA.js.br +0 -0
  334. package/dist/client/assets/sankeyDiagram-P5KCCOFB-B3Wk45FA.js.gz +0 -0
  335. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BejEsITb.js.br +0 -0
  336. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BejEsITb.js.gz +0 -0
  337. package/dist/client/assets/sizeCapture-INFHLROL-DZ5NJZnM.js.br +0 -0
  338. package/dist/client/assets/sizeCapture-INFHLROL-DZ5NJZnM.js.gz +0 -0
  339. package/dist/client/assets/stateDiagram-D77RDMKH-D8SSEwHa.js.br +0 -0
  340. package/dist/client/assets/stateDiagram-D77RDMKH-D8SSEwHa.js.gz +0 -0
  341. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-D1KQOetv.js +0 -1
  342. package/dist/client/assets/swimlanes-42K2YHIH-Dow-EKMG.js.br +0 -0
  343. package/dist/client/assets/swimlanes-42K2YHIH-Dow-EKMG.js.gz +0 -0
  344. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DQbZCzq9.js +0 -8
  345. package/dist/client/assets/timeline-definition-24CTP7MA-DpQ9D5f6.js.br +0 -0
  346. package/dist/client/assets/timeline-definition-24CTP7MA-DpQ9D5f6.js.gz +0 -0
  347. package/dist/client/assets/vennDiagram-4TSXK5OY-DoemAmM2.js.br +0 -0
  348. package/dist/client/assets/vennDiagram-4TSXK5OY-DoemAmM2.js.gz +0 -0
  349. package/dist/client/assets/videoCompression-Bg4gUQUf.js.br +0 -0
  350. package/dist/client/assets/videoCompression-Bg4gUQUf.js.gz +0 -0
  351. package/dist/client/assets/wardleyDiagram-VM6X3IG4-MernEZ54.js.br +0 -0
  352. package/dist/client/assets/wardleyDiagram-VM6X3IG4-MernEZ54.js.gz +0 -0
  353. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CzO3HEHD.js.br +0 -0
  354. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CzO3HEHD.js.gz +0 -0
@@ -1,18 +1,9 @@
1
- import { collaborationMessageAnchorTokens } from './collaborationPrompt.js';
2
1
  export class CollaborationDeliveryWorker {
3
2
  options;
4
3
  running = new Map();
5
4
  states = new Map();
6
5
  failures = new Map();
7
6
  submitted = new Set();
8
- /** Sessions whose latest delivery was confirmed rendered in this process,
9
- * mapped to the timestamp until which confirmations are skipped. A recent
10
- * confirmed delivery means the agent is actively consuming input, so
11
- * follow-up messages settle immediately; once the cooldown lapses the
12
- * agent's state is unknown again (it may be mid-turn, or finishing one)
13
- * and the gate re-engages. Settled-but-unconfirmed deliveries never grant
14
- * cooldown — that would re-open the turn-handover hole the gate closes. */
15
- confirmedUntil = new Map();
16
7
  timer = null;
17
8
  ticking = null;
18
9
  constructor(options) {
@@ -131,34 +122,6 @@ export class CollaborationDeliveryWorker {
131
122
  return;
132
123
  }
133
124
  const attempts = store.diagnostic(message.id)?.attempt_count ?? 0;
134
- // Confirm gate: the route becoming ready only proves the agent process is
135
- // up, not that its TUI is consuming — a write landing while the agent
136
- // finishes another turn can sit unsubmitted in its input box. When the
137
- // route can read terminal history, watch for our message to appear there
138
- // (the agent rendered it) and, while it is missing, try the recovery
139
- // ladder: submit a paste left unsubmitted in the input box, dismiss a
140
- // blocking approval dialog.
141
- //
142
- // The gate never re-writes the body. A successful write already put the
143
- // bytes in the pty; a busy agent that has not echoed them yet is a
144
- // diagnosis, not a lost message, and re-writing would deliver the body
145
- // again the moment it does catch up (that is how one user message arrived
146
- // as three copies). Only a write that throws is treated as a failed
147
- // delivery and retried — that path is unchanged.
148
- const confirmMs = this.options.firstDeliveryConfirmMs ?? 1_500;
149
- const gateActive = !route.isShell && Boolean(route.confirm) && confirmMs > 0
150
- && Date.now() >= (this.confirmedUntil.get(id) ?? 0);
151
- // Differential baseline for stuck-paste recovery: captured before the
152
- // write so a later screen diff can tell our paste apart from stale ones.
153
- let baseline = '';
154
- if (gateActive && route.recoverStuck && !this.submitted.has(message.id) && route.capture) {
155
- try {
156
- baseline = (await route.capture()) ?? '';
157
- }
158
- catch {
159
- baseline = '';
160
- }
161
- }
162
125
  if (!this.submitted.has(message.id)) {
163
126
  store.recordTransport(message.id, {
164
127
  relay_online: null, peer_reachable: true,
@@ -190,75 +153,18 @@ export class CollaborationDeliveryWorker {
190
153
  catch { /* best-effort */ }
191
154
  }
192
155
  }
193
- if (gateActive) {
194
- const confirmed = await this.confirmConsumed(pending, route, confirmMs, baseline, collaborationMessageAnchorTokens(pending));
195
- // Confirmed rendered: refresh the exemption window so follow-ups in the
196
- // agent's active turn settle immediately.
197
- if (confirmed)
198
- this.confirmedUntil.set(id, Date.now() + (this.options.confirmCooldownMs ?? 30_000));
199
- // Either way the delivery settles here: the bytes are in the pty, and an
200
- // unconfirmed one keeps that diagnosis for the sender instead of
201
- // re-queuing a body that already arrived.
202
- this.complete(id, message, confirmed ? null : 'AGENT_CONSUME_UNCONFIRMED');
203
- return;
204
- }
205
156
  // If persistence fails after writing, the in-process guard avoids a
206
157
  // second write on retry. Across a crash, transport is at-least-once.
207
158
  this.complete(id, message);
208
159
  }
209
- /** Wait out the confirm window, then look for the written messages in the
210
- * recipient's terminal history. A message found there was rendered by the
211
- * agent and counts as consumed. While the agent is blocked on an approval
212
- * dialog (its Bash call needs permission) dismiss it once per cycle, and
213
- * on the first cycle submit a paste that arrived during turn handover and
214
- * is still sitting unsubmitted (differential baseline evidence only, at
215
- * most once per delivery). Each recovery sends Enter on evidence, never
216
- * blind. */
217
- async confirmConsumed(messages, route, delayMs, baseline, tokens) {
218
- let recovered = false;
219
- for (let attempt = 0; attempt < 3; attempt += 1) {
220
- await new Promise((resolve) => setTimeout(resolve, attempt === 0 ? delayMs : Math.min(1_200, delayMs)));
221
- let content = null;
222
- try {
223
- content = await route.confirm();
224
- }
225
- catch {
226
- content = null;
227
- }
228
- // Search the same token the formatter wrote into the delivered text:
229
- // short ids in the terminal, full ids in `messages`. Deriving it here
230
- // rather than reusing a literal is what keeps the two sides from
231
- // drifting apart — a text that carries a token the gate does not search
232
- // can never confirm, and the delivery is re-written to the bound.
233
- if (content && messages.some((message) => content.includes(tokens.get(message.id) ?? message.id)))
234
- return true;
235
- if (!recovered && route.recoverStuck && baseline) {
236
- try {
237
- recovered = await route.recoverStuck(baseline);
238
- }
239
- catch { /* a failed submit must not settle delivery */ }
240
- }
241
- if (content && route.approve) {
242
- try {
243
- await route.approve();
244
- }
245
- catch { /* a failed dismiss must not settle delivery */ }
246
- }
247
- }
248
- return false;
249
- }
250
- /** Settle a delivery as delivered. `unconfirmedReason`, when set, is a
251
- * diagnosis that survives the settle: the write reached the pty (there is
252
- * nothing more a retry may do) but the recipient never showed it, so the
253
- * sender can still see why. Never re-queues — that is what would wedge the
254
- * queue and duplicate the body. */
255
- complete(id, message, unconfirmedReason = null) {
160
+ /** Delivery records terminal writes only; Agent replies are separate. */
161
+ complete(id, message) {
256
162
  const { store } = this.options;
257
163
  store.markDelivered([message.id]);
258
164
  this.submitted.delete(message.id);
259
165
  store.recordTransport(message.id, {
260
166
  relay_online: null, peer_reachable: true, attempt_count: store.diagnostic(message.id)?.attempt_count ?? 1,
261
- next_retry_at: null, last_error: unconfirmedReason, checked_at: Date.now(),
167
+ next_retry_at: null, last_error: null, checked_at: Date.now(),
262
168
  });
263
169
  this.failures.delete(id);
264
170
  }
@@ -1,5 +1,5 @@
1
1
  import { plainCollaborationSnapshot } from './collaborationText.js';
2
- import { normalizePromptForPaste } from './promptDelivery.js';
2
+ import { normalizePromptForPaste, waitForPromptSubmit } from './promptDelivery.js';
3
3
  const TMUX_KEY_NAMES = {
4
4
  enter: 'Enter', escape: 'Escape', space: 'Space', left: 'Left', right: 'Right', up: 'Up', down: 'Down',
5
5
  };
@@ -19,26 +19,9 @@ const APPROVAL_DIALOG_PATTERNS = [
19
19
  /\b1\.\s*是\b/,
20
20
  /允许.*执行|确认.*执行/i,
21
21
  ];
22
- /** Agent TUIs collapse pasted input in the input box to a marker line like
23
- * "[Pasted text #3 +42 lines]". While the paste sits unsubmitted the marker
24
- * stays on screen; a submitted paste clears the box and only the transcript
25
- * holds the content. Session-unique #N lets us diff screen captures. */
26
- const PASTE_MARKER_PATTERN = /\[Pasted text #(\d+)/g;
27
22
  export function detectApprovalDialog(content) {
28
23
  return APPROVAL_DIALOG_PATTERNS.some((pattern) => pattern.test(content));
29
24
  }
30
- /** Paste marker sequence numbers visible in a screen capture. */
31
- export function extractPasteMarkerNumbers(content) {
32
- return new Set([...content.matchAll(PASTE_MARKER_PATTERN)].map((match) => Number(match[1])));
33
- }
34
- /** True when `after` shows a paste marker that was not in `before`. Diffing
35
- * prevents a recovery Enter from submitting a stale paste that predates this
36
- * delivery (or someone else's draft): we only ever submit what we just put
37
- * there, at most once per delivery. */
38
- export function hasNewPasteMarker(after, before) {
39
- const beforeNumbers = extractPasteMarkerNumbers(before);
40
- return [...extractPasteMarkerNumbers(after)].some((number) => !beforeNumbers.has(number));
41
- }
42
25
  async function assertSamePane(run, pane) {
43
26
  const identity = (await run(['display-message', '-p', '-t', pane.paneId,
44
27
  '#{pid}:#{session_id}:#{pane_id}:#{pane_pid}'])).trim();
@@ -48,15 +31,19 @@ async function assertSamePane(run, pane) {
48
31
  /** Unique-per-process buffer name so concurrent deliveries to different panes
49
32
  * never share (or clobber) a buffer. */
50
33
  let bufferSequence = 0;
51
- export async function writeCollaborationTmuxPane(run, pane, prompt,
52
- /** Sends `input` to the tmux client's stdin. The steps below are one `\;`
53
- * chain (see the comment inside), and a chain is argv, so the body must not
54
- * ride in argv: tmux treats an element that is exactly `;` as a separator
55
- * even after `--`, and its backslash unescaping is version-dependent
56
- * (`\\` survives verbatim while `\;` collapses to `;`). Reading the body
57
- * from stdin sidesteps both — every byte round-trips unchanged. Required,
58
- * not optional: a run() that ignored the payload would load an empty buffer
59
- * and fail the delivery rather than deliver the wrong thing. */
34
+ const paneWrites = new Map();
35
+ /** Serialize TD paste/submit pairs for this exact runtime pane. */
36
+ export function writeCollaborationTmuxPane(run, pane, prompt, stdin) {
37
+ const key = `${pane.serverPid}:${pane.sessionId}:${pane.paneId}:${pane.panePid}`;
38
+ const previous = paneWrites.get(key) ?? Promise.resolve();
39
+ const operation = previous.catch(() => undefined).then(() => writeTmuxPrompt(run, pane, prompt, stdin))
40
+ .finally(() => { if (paneWrites.get(key) === operation)
41
+ paneWrites.delete(key); });
42
+ paneWrites.set(key, operation);
43
+ return operation;
44
+ }
45
+ async function writeTmuxPrompt(run, pane, prompt,
46
+ /** Body travels on stdin so tmux cannot parse its semicolons/backslashes. */
60
47
  stdin) {
61
48
  await assertSamePane(run, pane);
62
49
  // A fixed pane target is independent of the current window, keyboard focus
@@ -77,13 +64,8 @@ stdin) {
77
64
  // every tmux version.
78
65
  const buffer = `termdock-collab-${process.pid}-${bufferSequence++}`;
79
66
  try {
80
- // The four steps ride one client invocation joined by tmux's `\;`: the
81
- // server runs them back to back in a single queue item, so no other
82
- // client's paste can interleave between our text and our submit CR
83
- // (measured: one contiguous block, 0ms apart, versus two invocations
84
- // ~14ms apart). A failing step stops the rest — verified on 3.4 and 3.7 —
85
- // which is the safe direction: a failed text paste is never followed by a
86
- // bare CR into whatever the input box already held.
67
+ // Paste once, then send one unbracketed CR after 50ms. No screen parsing,
68
+ // Agent-specific recovery, consumption confirmation or additional Enter.
87
69
  await stdin([
88
70
  // The body arrives on stdin, not argv: it is user content, and in a
89
71
  // `\;` chain argv is a language where `;` and `\` mean something.
@@ -91,13 +73,17 @@ stdin) {
91
73
  // -r keeps LF as LF rather than the separator default of CR. The
92
74
  // normalizer already folded every line break to CR, so no LF is left
93
75
  // for it to rewrite — the flag is insurance, not the mechanism.
94
- 'paste-buffer', '-p', '-r', '-d', '-b', buffer, '-t', pane.paneId, ';',
76
+ 'paste-buffer', '-p', '-r', '-d', '-b', buffer, '-t', pane.paneId,
77
+ ], normalizePromptForPaste(prompt));
78
+ await waitForPromptSubmit();
79
+ await assertSamePane(run, pane);
80
+ await run([
95
81
  // The submit key rides outside the paste block: inside it, an editor
96
82
  // inserts a pasted CR as text instead of acting on it. Pasting the bare
97
83
  // CR (no -p) keeps the key in the same mode-proof channel as the text.
98
84
  'set-buffer', '-b', buffer, '--', '\r', ';',
99
85
  'paste-buffer', '-d', '-b', buffer, '-t', pane.paneId,
100
- ], normalizePromptForPaste(prompt));
86
+ ]);
101
87
  }
102
88
  finally {
103
89
  // -d consumed the buffer on the happy path; this sweeps up after a failed
@@ -139,21 +125,7 @@ export async function approveCollaborationDialog(run, pane) {
139
125
  await sendTmuxPaneKey(run, pane, 'enter');
140
126
  return true;
141
127
  }
142
- /** Submit a paste that arrived while the agent was finishing its previous
143
- * turn and is still sitting unsubmitted in the input box. Only acts on
144
- * differential evidence — a paste marker that appeared after the write —
145
- * never on pre-existing stale markers, and returns whether Enter was sent.
146
- * Committing the whole input buffer is safe: each delivery is written once,
147
- * so each marker's content enters the transcript exactly once. */
148
- export async function recoverStuckPaste(run, pane, baseline) {
149
- const viewport = await captureTmuxPaneText(run, pane);
150
- if (!hasNewPasteMarker(viewport, baseline))
151
- return false;
152
- await sendTmuxPaneKey(run, pane, 'enter');
153
- return true;
154
- }
155
- /** History-inclusive pane text (scrollback + viewport) used to confirm a
156
- * delivery was actually rendered by the agent, not wiped by a boot clear. */
128
+ /** History-inclusive terminal observation, without inferring consumption. */
157
129
  export async function captureTmuxPaneHistory(run, pane, lines = 800, rawOutput = false) {
158
130
  await assertSamePane(run, pane);
159
131
  if (!Number.isInteger(lines) || lines < 1 || lines > 10000)
@@ -224,6 +224,7 @@ export class IntegrationRuntime {
224
224
  startup_input_conditions: true, session_runtime_release: true, stable_session_identity: true, session_lifecycle_generation: true,
225
225
  session_resume_configuration: true, session_lifecycle_min_version: '1.4.309',
226
226
  session_startup_input_clear: true, session_startup_input_clear_min_version: '1.4.310',
227
+ agent_launch_process_check: true, agent_launch_process_check_min_version: '1.4.312',
227
228
  integration_policy_update: true,
228
229
  session_restore_diagnostics: true,
229
230
  native_identity_linux_flock_owner: process.platform === 'linux',
@@ -8,13 +8,26 @@
8
8
  export function normalizePromptForPaste(prompt) {
9
9
  return prompt.replace(/\r\n|\r|\n/g, '\r').replace(/\x1b/g, '␛');
10
10
  }
11
- /**
12
- * Encode a prompt as one bracketed-paste block followed by one real Enter.
13
- * Agent TUIs then keep embedded newlines inside the editor instead of treating
14
- * each line as a separate submission.
15
- */
16
- export function buildBracketedSubmitBytes(prompt) {
17
- return `\x1b[200~${normalizePromptForPaste(prompt)}\x1b[201~\r`;
11
+ /** Separate the paste and its single unbracketed CR by 50ms. */
12
+ export const PROMPT_SUBMIT_DELAY_MS = 50;
13
+ export function waitForPromptSubmit() {
14
+ return new Promise((resolve) => setTimeout(resolve, PROMPT_SUBMIT_DELAY_MS));
15
+ }
16
+ export function buildBracketedPasteBytes(prompt) {
17
+ return `\x1b[200~${normalizePromptForPaste(prompt)}\x1b[201~`;
18
+ }
19
+ const promptWrites = new WeakMap();
20
+ /** Serialize TD prompt pairs per PTY. Success only records terminal writes. */
21
+ export function writeBracketedPrompt(target, prompt) {
22
+ const previous = promptWrites.get(target) ?? Promise.resolve();
23
+ const operation = previous.catch(() => undefined).then(async () => {
24
+ target.write(buildBracketedPasteBytes(prompt));
25
+ await waitForPromptSubmit();
26
+ target.write('\r');
27
+ }).finally(() => { if (promptWrites.get(target) === operation)
28
+ promptWrites.delete(target); });
29
+ promptWrites.set(target, operation);
30
+ return operation;
18
31
  }
19
32
  /**
20
33
  * Process detection and hook events are independent Agent signals. A target is
@@ -29,6 +29,19 @@ Fields: description, diagram, context, constraint, concern, todo, note.
29
29
  Examples: td architecture prompt --project .
30
30
  td architecture write --format omm overall-architecture/auth description -
31
31
  td architecture save --file .termdock/architecture.json -`;
32
+ function elementPath(view, node) {
33
+ if (!node)
34
+ return view.id;
35
+ if (node.documentPath)
36
+ return node.documentPath;
37
+ const parts = [node.id];
38
+ let parent = node.parentId;
39
+ while (parent) {
40
+ parts.unshift(parent);
41
+ parent = view.nodes.find(item => item.id === parent)?.parentId;
42
+ }
43
+ return [view.id, ...parts].join('/');
44
+ }
32
45
  function target(document, element) {
33
46
  const [perspective, ...parts] = element.split('/');
34
47
  const view = document.perspectives.find(view => view.id === perspective);
@@ -78,10 +91,14 @@ export async function runArchitectureCli(args, io = { write: value => process.st
78
91
  if (options.format && !['native', 'omm'].includes(options.format))
79
92
  throw new Error('Format must be native or omm');
80
93
  const file = options.file ?? (omm ? '.omm' : ARCHITECTURE_FILE);
94
+ const instructions = async () => {
95
+ const language = options.language ?? (omm ? (await store.config()).language : 'en');
96
+ return omm ? buildOmmScanPrompt(root, language) : buildArchitecturePrompt(root, language === 'zh' ? 'zh' : 'en');
97
+ };
81
98
  const input = async (values) => values[0] === '-' ? io.stdin() : values.join(' ');
82
99
  const json = (value) => io.write(JSON.stringify(value, null, 2));
83
100
  if (command === 'prompt' || command === 'scan') {
84
- io.write(omm ? buildOmmScanPrompt(root, options.language === 'zh' ? 'zh' : 'en') : buildArchitecturePrompt(root, options.language === 'zh' ? 'zh' : 'en'));
101
+ io.write(await instructions());
85
102
  return 0;
86
103
  }
87
104
  if (command === 'setup') {
@@ -112,7 +129,7 @@ export async function runArchitectureCli(args, io = { write: value => process.st
112
129
  io.write(`Removed ${relative}`);
113
130
  continue;
114
131
  }
115
- const prompt = omm ? buildOmmScanPrompt(root, options.language === 'zh' ? 'zh' : 'en') : buildArchitecturePrompt(root, options.language === 'zh' ? 'zh' : 'en');
132
+ const prompt = await instructions();
116
133
  await fs.writeFile(destination, `---\nname: termdock-architecture\ndescription: Recursively analyze or update this project's Termdock code architecture.\n---\n${marker}\n\n${prompt}\n`, { mode: 0o600 });
117
134
  io.write(`Installed ${relative}`);
118
135
  }
@@ -206,10 +223,12 @@ export async function runArchitectureCli(args, io = { write: value => process.st
206
223
  }
207
224
  if (command === 'validate') {
208
225
  const issues = [];
226
+ if (element)
227
+ target(document, element);
209
228
  for (const view of document.perspectives) {
210
229
  for (const item of [view, ...view.nodes]) {
211
- const key = `${view.id}${item === view ? '' : `/${item.id}`}`;
212
- if (element && !key.startsWith(element))
230
+ const key = elementPath(view, item === view ? undefined : item);
231
+ if (element && key !== element && !key.startsWith(`${element}/`))
213
232
  continue;
214
233
  if (!item.description && !item.summary)
215
234
  issues.push({ element: key, message: 'Missing description' });
@@ -274,7 +293,13 @@ export async function runArchitectureCli(args, io = { write: value => process.st
274
293
  return 0;
275
294
  }
276
295
  if (command === 'refs') {
277
- json({ outgoing: selected.node?.references ?? [], incoming: document.perspectives.flatMap(view => view.nodes.filter(node => node.references?.some(ref => ref.perspective === selected.view.id && (!ref.node || ref.node === selected.node?.id))).map(node => ({ perspective: view.id, node: node.id }))), connections: selected.node ? selected.view.edges.filter(edge => edge.from === selected.node.id || edge.to === selected.node.id) : selected.view.edges });
296
+ const reference = (perspective, id) => {
297
+ const view = document.perspectives.find(view => view.id === perspective);
298
+ const node = id ? view.nodes.find(node => node.id === id) : undefined;
299
+ return { perspective, ...(id ? { node: id } : {}), element: elementPath(view, node), title: node?.title ?? view.title };
300
+ };
301
+ const connections = (selected.node ? selected.view.edges.filter(edge => edge.from === selected.node.id || edge.to === selected.node.id) : selected.view.edges).map(edge => ({ ...edge, fromElement: elementPath(selected.view, selected.view.nodes.find(node => node.id === edge.from)), toElement: elementPath(selected.view, selected.view.nodes.find(node => node.id === edge.to)) }));
302
+ json({ outgoing: (selected.node?.references ?? []).map(ref => reference(ref.perspective, ref.node)), incoming: document.perspectives.flatMap(view => view.nodes.filter(node => node.references?.some(ref => ref.perspective === selected.view.id && (!ref.node || ref.node === selected.node?.id))).map(node => reference(view.id, node.id))), connections });
278
303
  return 0;
279
304
  }
280
305
  if (command === 'diff') {
@@ -304,19 +304,19 @@ export function buildArchitecturePrompt(root, language, analysis = DEFAULT_ANALY
304
304
  'Source paths must be existing files relative to the project root, with no absolute paths, URLs, backslashes or dot/parent segments. Add a positive integer line when verified. Omit uncertain connections and explain uncertainties in summaries.',
305
305
  `Write titles, summaries and edge labels in ${language === 'zh' ? 'Chinese' : 'English'}. Set generatedAt to the actual current ISO timestamp. The sample paths are illustrative; use this project's real paths.`,
306
306
  'Read the selected output document if it already exists. Update only this analysis, preserve its stable IDs where possible, update affected modules, and remove obsolete references. Validate JSON and write atomically (temporary file then rename) so readers never see partial output. Summarize what was analyzed and any limitations after writing.',
307
- `Prefer saving via: td architecture save --project ${JSON.stringify(root)} --file ${JSON.stringify(output)} - (pass the complete JSON on stdin). This validates the document, archives the previous version, and records the update count and Git revision. If the CLI is unavailable, use the atomic file write above and disclose that history metadata was not recorded.`,
307
+ `Prefer invoking executable td with this argument array: ${JSON.stringify(['architecture', 'save', '--project', root, '--file', output, '-'])}. Pass the complete JSON on stdin. Pass arguments separately; JSON string quoting is not shell escaping. This validates the document, archives the previous version, and records the update count and Git revision. If the CLI is unavailable, use the atomic file write above and disclose that history metadata was not recorded.`,
308
308
  JSON.stringify(example, null, 2),
309
309
  ].join('\n\n');
310
310
  }
311
311
  /** Adapted scanner workflow from oh-my-mermaid, MIT; see THIRD_PARTY_NOTICES.md. */
312
312
  export function buildOmmScanPrompt(root, language) {
313
313
  return [
314
- language === 'zh' ? '分析当前项目并递归更新 .omm 架构文档。' : 'Recursively analyze this project and update its .omm architecture documents.',
315
- `Project root (literal path): ${JSON.stringify(root)}. Write document content in ${language === 'zh' ? 'Chinese' : 'English'}.`,
314
+ language.startsWith('zh') ? '分析当前项目并递归更新 .omm 架构文档。' : 'Recursively analyze this project and update its .omm architecture documents.',
315
+ `Project root (literal path): ${JSON.stringify(root)}. Write document content in language ${JSON.stringify(language)}.`,
316
316
  'Read project instructions, manifests, entry points and existing .omm documentation. Select relevant perspectives: overall-architecture, request-lifecycle, data-flow, dependency-map, external-integrations, state-transitions, route-page-map, command-surface, extension-points, pipeline, orchestration, storage.',
317
317
  'For each perspective, write a graph LR or graph TD diagram whose node IDs match child directory names (English kebab-case). Every edge must have a meaningful label. Node labels use name plus verified source path separated by \\n. Write description for EVERY node, inspect its actual source, and recursively create child diagrams wherever distinct internal components exist. Leaves still need descriptions. Do not stop at the top-level diagram.',
318
318
  'Each element supports description, diagram, context, constraint, concern, todo, note. Use Markdown for text fields. Record real constraints and concerns without inventing them. Existing @perspective references can link between perspectives. Do not rewrite unchanged elements. Remove obsolete references after confirming them. Never modify business source files or include secrets.',
319
- `Use the native CLI: td architecture write --project ${JSON.stringify(root)} --format omm <perspective/child/path> <field> - . Supply that field on stdin. Use read, tree, refs and diff to inspect existing documents. Finish with td architecture validate --project ${JSON.stringify(root)} --format omm.`,
319
+ `Invoke executable td with this argument array: ${JSON.stringify(['architecture', 'write', '--project', root, '--format', 'omm', '<perspective/child/path>', '<field>', '-'])}, replacing the two placeholders with the element path and field. Supply that field on stdin. Pass arguments separately; JSON string quoting is not shell escaping. Use read, tree, refs and diff to inspect existing documents. Finish by invoking td with argument array ${JSON.stringify(['architecture', 'validate', '--project', root, '--format', 'omm'])}.`,
320
320
  'Report the inspected sources, updated perspectives, recursion coverage and unresolved limitations. The Termdock architecture viewer reads .omm directly; no separate viewer server is required.',
321
321
  ].join('\n\n');
322
322
  }
@@ -2,6 +2,11 @@ import { ARCHITECTURE_FIELDS } from './document.js';
2
2
  /** Compare semantic document content, excluding timestamps and update counters. */
3
3
  export function diffArchitecture(before, after) {
4
4
  const changes = [];
5
+ if (before) {
6
+ const changed = ['summary', 'analysis', 'details', 'origin'].filter(key => JSON.stringify(before[key]) !== JSON.stringify(after[key]));
7
+ if (changed.length)
8
+ changes.push({ perspective: '', title: 'Project overview', kind: 'changed', fields: changed });
9
+ }
5
10
  const oldViews = new Map(before?.perspectives.map(view => [view.id, view]) ?? []);
6
11
  for (const view of after.perspectives) {
7
12
  const previous = oldViews.get(view.id);