termdock 1.4.306 → 1.4.307

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 (345) hide show
  1. package/dist/client/assets/{App-BziVLy1b.js → App-cagV-flM.js} +7 -7
  2. package/dist/client/assets/App-cagV-flM.js.br +0 -0
  3. package/dist/client/assets/App-cagV-flM.js.gz +0 -0
  4. package/dist/client/assets/{ArchitecturePanel-CARNBEqQ.js → ArchitecturePanel-TdKPja7L.js} +1 -1
  5. package/dist/client/assets/ArchitecturePanel-TdKPja7L.js.br +0 -0
  6. package/dist/client/assets/ArchitecturePanel-TdKPja7L.js.gz +0 -0
  7. package/dist/client/assets/{ChangeWalkthroughPanel-00oa0z6w.js → ChangeWalkthroughPanel-DOj40Srm.js} +1 -1
  8. package/dist/client/assets/ChangeWalkthroughPanel-DOj40Srm.js.br +0 -0
  9. package/dist/client/assets/ChangeWalkthroughPanel-DOj40Srm.js.gz +0 -0
  10. package/dist/client/assets/{CollaborationMainWorkspace-DuEeKQKZ.js → CollaborationMainWorkspace-C5Tcos5l.js} +1 -1
  11. package/dist/client/assets/CollaborationMainWorkspace-C5Tcos5l.js.br +0 -0
  12. package/dist/client/assets/CollaborationMainWorkspace-C5Tcos5l.js.gz +0 -0
  13. package/dist/client/assets/CollaborationTaskContent-DQpH2HIj.js +2 -0
  14. package/dist/client/assets/{ComputerControlView-C9v1Ooc9.js → ComputerControlView-C2sOFyuA.js} +2 -2
  15. package/dist/client/assets/ComputerControlView-C2sOFyuA.js.br +0 -0
  16. package/dist/client/assets/ComputerControlView-C2sOFyuA.js.gz +0 -0
  17. package/dist/client/assets/{DagPlayground-DfUpMALj.js → DagPlayground-DFfVJW00.js} +1 -1
  18. package/dist/client/assets/DagPlayground-DFfVJW00.js.br +0 -0
  19. package/dist/client/assets/DagPlayground-DFfVJW00.js.gz +0 -0
  20. package/dist/client/assets/{DiffLab-Cf_URhQt.js → DiffLab-hoj8gwUi.js} +1 -1
  21. package/dist/client/assets/DiffLab-hoj8gwUi.js.br +0 -0
  22. package/dist/client/assets/DiffLab-hoj8gwUi.js.gz +0 -0
  23. package/dist/client/assets/{DiffReview-DjG9vCpH.js → DiffReview-Cn_PmN-9.js} +1 -1
  24. package/dist/client/assets/DiffReview-Cn_PmN-9.js.br +0 -0
  25. package/dist/client/assets/{DiffReview-DjG9vCpH.js.gz → DiffReview-Cn_PmN-9.js.gz} +0 -0
  26. package/dist/client/assets/{DiffReviewLab-BKOvHdJY.js → DiffReviewLab-DycgD40E.js} +1 -1
  27. package/dist/client/assets/DiffReviewLab-DycgD40E.js.br +0 -0
  28. package/dist/client/assets/DiffReviewLab-DycgD40E.js.gz +0 -0
  29. package/dist/client/assets/{DiffViewer-6n3tgsdc.js → DiffViewer-DRnuph7U.js} +1 -1
  30. package/dist/client/assets/DiffViewer-DRnuph7U.js.br +0 -0
  31. package/dist/client/assets/DiffViewer-DRnuph7U.js.gz +0 -0
  32. package/dist/client/assets/{ModelPreview-BNs2sRct.js → ModelPreview-Dvw-UtQQ.js} +1 -1
  33. package/dist/client/assets/ModelPreview-Dvw-UtQQ.js.br +0 -0
  34. package/dist/client/assets/ModelPreview-Dvw-UtQQ.js.gz +0 -0
  35. package/dist/client/assets/{RightSidebar-CcMSU1v8.js → RightSidebar-CnnU7Ffp.js} +3 -3
  36. package/dist/client/assets/RightSidebar-CnnU7Ffp.js.br +0 -0
  37. package/dist/client/assets/RightSidebar-CnnU7Ffp.js.gz +0 -0
  38. package/dist/client/assets/{abnfDiagram-VCTEODGH-DogjvRKp.js → abnfDiagram-VCTEODGH-BQVIT5gD.js} +1 -1
  39. package/dist/client/assets/abnfDiagram-VCTEODGH-BQVIT5gD.js.br +0 -0
  40. package/dist/client/assets/abnfDiagram-VCTEODGH-BQVIT5gD.js.gz +0 -0
  41. package/dist/client/assets/{app-D6vN8PW-.js → app-CXvK8WZg.js} +3 -3
  42. package/dist/client/assets/app-CXvK8WZg.js.br +0 -0
  43. package/dist/client/assets/app-CXvK8WZg.js.gz +0 -0
  44. package/dist/client/assets/{arc-Cqel4Ted.js → arc-DZG1NzUc.js} +1 -1
  45. package/dist/client/assets/arc-DZG1NzUc.js.br +0 -0
  46. package/dist/client/assets/arc-DZG1NzUc.js.gz +0 -0
  47. package/dist/client/assets/{architectureDiagram-5GKGNRK7-DgvPtgNb.js → architectureDiagram-5GKGNRK7-Bv15lJGE.js} +1 -1
  48. package/dist/client/assets/architectureDiagram-5GKGNRK7-Bv15lJGE.js.br +0 -0
  49. package/dist/client/assets/architectureDiagram-5GKGNRK7-Bv15lJGE.js.gz +0 -0
  50. package/dist/client/assets/{blockDiagram-I7D4REHJ-BxbWO4x4.js → blockDiagram-I7D4REHJ-DShw-lH7.js} +1 -1
  51. package/dist/client/assets/blockDiagram-I7D4REHJ-DShw-lH7.js.br +0 -0
  52. package/dist/client/assets/blockDiagram-I7D4REHJ-DShw-lH7.js.gz +0 -0
  53. package/dist/client/assets/{c4Diagram-7LVT6UL2-gsA37gjL.js → c4Diagram-7LVT6UL2-BN6SsyOM.js} +1 -1
  54. package/dist/client/assets/c4Diagram-7LVT6UL2-BN6SsyOM.js.br +0 -0
  55. package/dist/client/assets/c4Diagram-7LVT6UL2-BN6SsyOM.js.gz +0 -0
  56. package/dist/client/assets/channel-YDx-Ycsw.js +1 -0
  57. package/dist/client/assets/{chunk-2Q5K7J3B-ChC9yYOd.js → chunk-2Q5K7J3B-BkBkNjv0.js} +1 -1
  58. package/dist/client/assets/{chunk-5VM5RSS4-Bi4Hc8yL.js → chunk-5VM5RSS4-LrpNvv_o.js} +1 -1
  59. package/dist/client/assets/{chunk-F27PBJKO-DvVWvQEk.js → chunk-F27PBJKO-BcpMMU4P.js} +1 -1
  60. package/dist/client/assets/chunk-F27PBJKO-BcpMMU4P.js.br +0 -0
  61. package/dist/client/assets/chunk-F27PBJKO-BcpMMU4P.js.gz +0 -0
  62. package/dist/client/assets/{chunk-IMKFNOWR-BnwQLR5S.js → chunk-IMKFNOWR-cWvd5gJk.js} +1 -1
  63. package/dist/client/assets/chunk-IMKFNOWR-cWvd5gJk.js.br +0 -0
  64. package/dist/client/assets/chunk-IMKFNOWR-cWvd5gJk.js.gz +0 -0
  65. package/dist/client/assets/{chunk-JWPE2WC7-BkNnaDiR.js → chunk-JWPE2WC7-Bf4ORht5.js} +1 -1
  66. package/dist/client/assets/{chunk-POPQ4Y6H-BRzm6Uzi.js → chunk-POPQ4Y6H-M5MSHOUM.js} +1 -1
  67. package/dist/client/assets/{chunk-SVP7TREG-CDYm-dzk.js → chunk-SVP7TREG-Bj8gUFc2.js} +1 -1
  68. package/dist/client/assets/chunk-SVP7TREG-Bj8gUFc2.js.br +0 -0
  69. package/dist/client/assets/chunk-SVP7TREG-Bj8gUFc2.js.gz +0 -0
  70. package/dist/client/assets/{chunk-TICWLB2K-BKaW9Z9i.js → chunk-TICWLB2K-W1cGkC4s.js} +1 -1
  71. package/dist/client/assets/chunk-TICWLB2K-W1cGkC4s.js.br +0 -0
  72. package/dist/client/assets/chunk-TICWLB2K-W1cGkC4s.js.gz +0 -0
  73. package/dist/client/assets/{chunk-XXDRQBXY-DcHZ_FHb.js → chunk-XXDRQBXY-mXLNbLH8.js} +1 -1
  74. package/dist/client/assets/classDiagram-ZZMXUADV-qeb16N1g.js +1 -0
  75. package/dist/client/assets/classDiagram-v2-VYDZK3BY-qeb16N1g.js +1 -0
  76. package/dist/client/assets/{cose-bilkent-JH36ORCC-DCbbTNc6.js → cose-bilkent-JH36ORCC-CK0EaMQY.js} +1 -1
  77. package/dist/client/assets/cose-bilkent-JH36ORCC-CK0EaMQY.js.br +0 -0
  78. package/dist/client/assets/cose-bilkent-JH36ORCC-CK0EaMQY.js.gz +0 -0
  79. package/dist/client/assets/{cynefin-OW5HDTMX-i23hD0Z2.js → cynefin-OW5HDTMX-C-7tsMpt.js} +1 -1
  80. package/dist/client/assets/cynefin-OW5HDTMX-C-7tsMpt.js.br +0 -0
  81. package/dist/client/assets/cynefin-OW5HDTMX-C-7tsMpt.js.gz +0 -0
  82. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CbyLYcqc.js → cynefinDiagram-5FMLGOSQ-CijqM5Xa.js} +1 -1
  83. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CijqM5Xa.js.br +0 -0
  84. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CijqM5Xa.js.gz +0 -0
  85. package/dist/client/assets/{dagre-GXQ25YYZ-iJ4VKzZm.js → dagre-GXQ25YYZ-DCLINHGD.js} +1 -1
  86. package/dist/client/assets/dagre-GXQ25YYZ-DCLINHGD.js.br +0 -0
  87. package/dist/client/assets/dagre-GXQ25YYZ-DCLINHGD.js.gz +0 -0
  88. package/dist/client/assets/{diagram-S7CK7UJ4-BNVZcdsO.js → diagram-S7CK7UJ4-D-JvTWtL.js} +1 -1
  89. package/dist/client/assets/diagram-S7CK7UJ4-D-JvTWtL.js.br +0 -0
  90. package/dist/client/assets/diagram-S7CK7UJ4-D-JvTWtL.js.gz +0 -0
  91. package/dist/client/assets/{diagram-UQ7AKVKN-1ghTvPiu.js → diagram-UQ7AKVKN-BT01Oee8.js} +1 -1
  92. package/dist/client/assets/diagram-UQ7AKVKN-BT01Oee8.js.br +0 -0
  93. package/dist/client/assets/diagram-UQ7AKVKN-BT01Oee8.js.gz +0 -0
  94. package/dist/client/assets/{diagram-VSXAHHWV-Ce_0nMd3.js → diagram-VSXAHHWV-C_j4_Ldm.js} +1 -1
  95. package/dist/client/assets/diagram-VSXAHHWV-C_j4_Ldm.js.br +0 -0
  96. package/dist/client/assets/diagram-VSXAHHWV-C_j4_Ldm.js.gz +0 -0
  97. package/dist/client/assets/{diagram-VX7I27RA-CLHEkhUt.js → diagram-VX7I27RA-DY62ObO9.js} +1 -1
  98. package/dist/client/assets/diagram-VX7I27RA-DY62ObO9.js.br +0 -0
  99. package/dist/client/assets/diagram-VX7I27RA-DY62ObO9.js.gz +0 -0
  100. package/dist/client/assets/{diagram-Z3DM3KII-iyb5DkP6.js → diagram-Z3DM3KII-TnINooIy.js} +1 -1
  101. package/dist/client/assets/diagram-Z3DM3KII-TnINooIy.js.br +0 -0
  102. package/dist/client/assets/diagram-Z3DM3KII-TnINooIy.js.gz +0 -0
  103. package/dist/client/assets/{ebnfDiagram-PWID7BFC-Dxh2TzXm.js → ebnfDiagram-PWID7BFC-BahaUYTh.js} +1 -1
  104. package/dist/client/assets/ebnfDiagram-PWID7BFC-BahaUYTh.js.br +0 -0
  105. package/dist/client/assets/ebnfDiagram-PWID7BFC-BahaUYTh.js.gz +0 -0
  106. package/dist/client/assets/{erDiagram-RLTQ6QDP-Cr8IkdCC.js → erDiagram-RLTQ6QDP-DNiKhK5j.js} +1 -1
  107. package/dist/client/assets/erDiagram-RLTQ6QDP-DNiKhK5j.js.br +0 -0
  108. package/dist/client/assets/erDiagram-RLTQ6QDP-DNiKhK5j.js.gz +0 -0
  109. package/dist/client/assets/{flowDiagram-HODETNUW-B8ZF1bwr.js → flowDiagram-HODETNUW-x9c9CGXD.js} +1 -1
  110. package/dist/client/assets/flowDiagram-HODETNUW-x9c9CGXD.js.br +0 -0
  111. package/dist/client/assets/flowDiagram-HODETNUW-x9c9CGXD.js.gz +0 -0
  112. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-zhdL10eM.js → ganttDiagram-EL5Y4UJY-BofL5Lxs.js} +1 -1
  113. package/dist/client/assets/ganttDiagram-EL5Y4UJY-BofL5Lxs.js.br +0 -0
  114. package/dist/client/assets/ganttDiagram-EL5Y4UJY-BofL5Lxs.js.gz +0 -0
  115. package/dist/client/assets/{gestureArbiter-CXYHfU__.js → gestureArbiter-Cy5v_ZUL.js} +1 -1
  116. package/dist/client/assets/gestureArbiter-Cy5v_ZUL.js.br +0 -0
  117. package/dist/client/assets/gestureArbiter-Cy5v_ZUL.js.gz +0 -0
  118. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-BQf2fHBo.js → gitGraphDiagram-WWUBYQGX-CHYuiGg1.js} +1 -1
  119. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CHYuiGg1.js.br +0 -0
  120. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CHYuiGg1.js.gz +0 -0
  121. package/dist/client/assets/{infoDiagram-27XIBGKW-BT8xey7S.js → infoDiagram-27XIBGKW-mfFgE6OE.js} +1 -1
  122. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-DunPdwW9.js → ishikawaDiagram-5VMMS53U-CiCmFa95.js} +1 -1
  123. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CiCmFa95.js.br +0 -0
  124. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CiCmFa95.js.gz +0 -0
  125. package/dist/client/assets/{journeyDiagram-3NMN7TZE-B0y75iIg.js → journeyDiagram-3NMN7TZE-CVnBzo7n.js} +1 -1
  126. package/dist/client/assets/journeyDiagram-3NMN7TZE-CVnBzo7n.js.br +0 -0
  127. package/dist/client/assets/journeyDiagram-3NMN7TZE-CVnBzo7n.js.gz +0 -0
  128. package/dist/client/assets/{kanban-definition-UXKFOSKX-BfgA5WLo.js → kanban-definition-UXKFOSKX-3-zdGxI0.js} +1 -1
  129. package/dist/client/assets/kanban-definition-UXKFOSKX-3-zdGxI0.js.br +0 -0
  130. package/dist/client/assets/kanban-definition-UXKFOSKX-3-zdGxI0.js.gz +0 -0
  131. package/dist/client/assets/{layout-BvjABLff.js → layout-DnB4RHWA.js} +1 -1
  132. package/dist/client/assets/layout-DnB4RHWA.js.br +0 -0
  133. package/dist/client/assets/layout-DnB4RHWA.js.gz +0 -0
  134. package/dist/client/assets/{linear-DgeFRliF.js → linear-B_lli4BL.js} +1 -1
  135. package/dist/client/assets/linear-B_lli4BL.js.br +0 -0
  136. package/dist/client/assets/linear-B_lli4BL.js.gz +0 -0
  137. package/dist/client/assets/{mermaid.core-DM6Rlal9.js → mermaid.core-ClemZ-kc.js} +5 -5
  138. package/dist/client/assets/mermaid.core-ClemZ-kc.js.br +0 -0
  139. package/dist/client/assets/mermaid.core-ClemZ-kc.js.gz +0 -0
  140. package/dist/client/assets/{mindmap-definition-YA3MSWOX-DhEiABv6.js → mindmap-definition-YA3MSWOX-hXDufapN.js} +1 -1
  141. package/dist/client/assets/mindmap-definition-YA3MSWOX-hXDufapN.js.br +0 -0
  142. package/dist/client/assets/mindmap-definition-YA3MSWOX-hXDufapN.js.gz +0 -0
  143. package/dist/client/assets/{passwordBootstrap-Dxv0I4wM.js → passwordBootstrap-c-hmAGCQ.js} +1 -1
  144. package/dist/client/assets/passwordBootstrap-c-hmAGCQ.js.br +0 -0
  145. package/dist/client/assets/passwordBootstrap-c-hmAGCQ.js.gz +0 -0
  146. package/dist/client/assets/{pegDiagram-XKGWAZYB-LTlVaJfm.js → pegDiagram-XKGWAZYB-yb1lAfHR.js} +1 -1
  147. package/dist/client/assets/pegDiagram-XKGWAZYB-yb1lAfHR.js.br +0 -0
  148. package/dist/client/assets/pegDiagram-XKGWAZYB-yb1lAfHR.js.gz +0 -0
  149. package/dist/client/assets/{pieDiagram-E7YTZNPT-9bnryna3.js → pieDiagram-E7YTZNPT-lVC2DWY_.js} +1 -1
  150. package/dist/client/assets/pieDiagram-E7YTZNPT-lVC2DWY_.js.br +0 -0
  151. package/dist/client/assets/pieDiagram-E7YTZNPT-lVC2DWY_.js.gz +0 -0
  152. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-ZBmgIpsJ.js → quadrantDiagram-AXDQQJYC-CeqeNP5C.js} +1 -1
  153. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CeqeNP5C.js.br +0 -0
  154. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CeqeNP5C.js.gz +0 -0
  155. package/dist/client/assets/{railroadDiagram-O6MQD6OU-DTtXvKOu.js → railroadDiagram-O6MQD6OU-BMEBmjF2.js} +1 -1
  156. package/dist/client/assets/railroadDiagram-O6MQD6OU-BMEBmjF2.js.br +0 -0
  157. package/dist/client/assets/railroadDiagram-O6MQD6OU-BMEBmjF2.js.gz +0 -0
  158. package/dist/client/assets/{rdpSession-Ggo3N5s5.js → rdpSession-D77Fs4-L.js} +1 -1
  159. package/dist/client/assets/rdpSession-D77Fs4-L.js.br +0 -0
  160. package/dist/client/assets/{rdpSession-Ggo3N5s5.js.gz → rdpSession-D77Fs4-L.js.gz} +0 -0
  161. package/dist/client/assets/{referenceLongPress-Df8W2cyP.js → referenceLongPress-xNXQRqYn.js} +1 -1
  162. package/dist/client/assets/referenceLongPress-xNXQRqYn.js.br +0 -0
  163. package/dist/client/assets/referenceLongPress-xNXQRqYn.js.gz +0 -0
  164. package/dist/client/assets/{requirementDiagram-BXWQKSXE-BNia9zI0.js → requirementDiagram-BXWQKSXE-CRhmIdDq.js} +1 -1
  165. package/dist/client/assets/requirementDiagram-BXWQKSXE-CRhmIdDq.js.br +0 -0
  166. package/dist/client/assets/requirementDiagram-BXWQKSXE-CRhmIdDq.js.gz +0 -0
  167. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-uvg5npfK.js → sankeyDiagram-P5KCCOFB-CZZPxGRu.js} +1 -1
  168. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CZZPxGRu.js.br +0 -0
  169. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CZZPxGRu.js.gz +0 -0
  170. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-DpJNf2MD.js → sequenceDiagram-WJ2MYXX4-CvKYTCaL.js} +1 -1
  171. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CvKYTCaL.js.br +0 -0
  172. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CvKYTCaL.js.gz +0 -0
  173. package/dist/client/assets/{sizeCapture-INFHLROL-CkWB2AnF.js → sizeCapture-INFHLROL-DpMFgVd8.js} +1 -1
  174. package/dist/client/assets/sizeCapture-INFHLROL-DpMFgVd8.js.br +0 -0
  175. package/dist/client/assets/sizeCapture-INFHLROL-DpMFgVd8.js.gz +0 -0
  176. package/dist/client/assets/{sparkles-DOuEtn62.js → sparkles-BBYDWqCu.js} +1 -1
  177. package/dist/client/assets/{stateDiagram-D77RDMKH-CeMzMQq-.js → stateDiagram-D77RDMKH-BUCKWh69.js} +1 -1
  178. package/dist/client/assets/stateDiagram-D77RDMKH-BUCKWh69.js.br +0 -0
  179. package/dist/client/assets/stateDiagram-D77RDMKH-BUCKWh69.js.gz +0 -0
  180. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CrhJVriY.js +1 -0
  181. package/dist/client/assets/{swimlanes-42K2YHIH-Bo9GejWo.js → swimlanes-42K2YHIH-Du84aO1l.js} +1 -1
  182. package/dist/client/assets/swimlanes-42K2YHIH-Du84aO1l.js.br +0 -0
  183. package/dist/client/assets/swimlanes-42K2YHIH-Du84aO1l.js.gz +0 -0
  184. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-bsc39ya3.js +8 -0
  185. package/dist/client/assets/{timeline-definition-24CTP7MA-cvWXYEZ4.js → timeline-definition-24CTP7MA-94wGyYVM.js} +1 -1
  186. package/dist/client/assets/timeline-definition-24CTP7MA-94wGyYVM.js.br +0 -0
  187. package/dist/client/assets/timeline-definition-24CTP7MA-94wGyYVM.js.gz +0 -0
  188. package/dist/client/assets/{triangle-alert-DzV0gQXz.js → triangle-alert-BFCgLlxS.js} +1 -1
  189. package/dist/client/assets/{vennDiagram-4TSXK5OY-CzleWcmk.js → vennDiagram-4TSXK5OY-C74llwIj.js} +1 -1
  190. package/dist/client/assets/{vennDiagram-4TSXK5OY-CzleWcmk.js.br → vennDiagram-4TSXK5OY-C74llwIj.js.br} +0 -0
  191. package/dist/client/assets/vennDiagram-4TSXK5OY-C74llwIj.js.gz +0 -0
  192. package/dist/client/assets/{videoCompression-DCnzjEfU.js → videoCompression-b96RKMFE.js} +1 -1
  193. package/dist/client/assets/videoCompression-b96RKMFE.js.br +0 -0
  194. package/dist/client/assets/videoCompression-b96RKMFE.js.gz +0 -0
  195. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-Cir1iutR.js → wardleyDiagram-VM6X3IG4-DVdgFaBs.js} +1 -1
  196. package/dist/client/assets/wardleyDiagram-VM6X3IG4-DVdgFaBs.js.br +0 -0
  197. package/dist/client/assets/wardleyDiagram-VM6X3IG4-DVdgFaBs.js.gz +0 -0
  198. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-pNPcVJ1C.js → xychartDiagram-S5SC5T6Z-BmUxPbqk.js} +1 -1
  199. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmUxPbqk.js.br +0 -0
  200. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmUxPbqk.js.gz +0 -0
  201. package/dist/client/index.html +1 -1
  202. package/dist/client/index.html.br +0 -0
  203. package/dist/client/index.html.gz +0 -0
  204. package/dist/client/sw.js +1 -1
  205. package/dist/client/sw.js.br +0 -0
  206. package/dist/client/sw.js.gz +0 -0
  207. package/dist/server/agent/collaborationCli.js +6 -4
  208. package/dist/server/agent/collaborationRoutes.js +1 -0
  209. package/dist/server/agent/collaborationTaskCli.js +25 -7
  210. package/dist/server/agent/collaborationTaskPurpose.js +20 -0
  211. package/dist/server/agent/collaborationTaskRoutes.js +1 -1
  212. package/dist/server/agent/collaborationTaskService.js +13 -6
  213. package/dist/server/agent/collaborationTaskStore.js +35 -6
  214. package/dist/server/agent/integrationServer.js +7 -6
  215. package/dist/server/agent/integrationStore.js +1 -1
  216. package/docs/integrations.md +89 -2
  217. package/package.json +1 -1
  218. package/runtime-manifest.json +3 -3
  219. package/dist/client/assets/App-BziVLy1b.js.br +0 -0
  220. package/dist/client/assets/App-BziVLy1b.js.gz +0 -0
  221. package/dist/client/assets/ArchitecturePanel-CARNBEqQ.js.br +0 -0
  222. package/dist/client/assets/ArchitecturePanel-CARNBEqQ.js.gz +0 -0
  223. package/dist/client/assets/ChangeWalkthroughPanel-00oa0z6w.js.br +0 -0
  224. package/dist/client/assets/ChangeWalkthroughPanel-00oa0z6w.js.gz +0 -0
  225. package/dist/client/assets/CollaborationMainWorkspace-DuEeKQKZ.js.br +0 -0
  226. package/dist/client/assets/CollaborationMainWorkspace-DuEeKQKZ.js.gz +0 -0
  227. package/dist/client/assets/CollaborationTaskContent-B_mzpNuw.js +0 -2
  228. package/dist/client/assets/ComputerControlView-C9v1Ooc9.js.br +0 -0
  229. package/dist/client/assets/ComputerControlView-C9v1Ooc9.js.gz +0 -0
  230. package/dist/client/assets/DagPlayground-DfUpMALj.js.br +0 -0
  231. package/dist/client/assets/DagPlayground-DfUpMALj.js.gz +0 -0
  232. package/dist/client/assets/DiffLab-Cf_URhQt.js.br +0 -0
  233. package/dist/client/assets/DiffLab-Cf_URhQt.js.gz +0 -0
  234. package/dist/client/assets/DiffReview-DjG9vCpH.js.br +0 -0
  235. package/dist/client/assets/DiffReviewLab-BKOvHdJY.js.br +0 -0
  236. package/dist/client/assets/DiffReviewLab-BKOvHdJY.js.gz +0 -0
  237. package/dist/client/assets/DiffViewer-6n3tgsdc.js.br +0 -0
  238. package/dist/client/assets/DiffViewer-6n3tgsdc.js.gz +0 -0
  239. package/dist/client/assets/ModelPreview-BNs2sRct.js.br +0 -0
  240. package/dist/client/assets/ModelPreview-BNs2sRct.js.gz +0 -0
  241. package/dist/client/assets/RightSidebar-CcMSU1v8.js.br +0 -0
  242. package/dist/client/assets/RightSidebar-CcMSU1v8.js.gz +0 -0
  243. package/dist/client/assets/abnfDiagram-VCTEODGH-DogjvRKp.js.br +0 -0
  244. package/dist/client/assets/abnfDiagram-VCTEODGH-DogjvRKp.js.gz +0 -0
  245. package/dist/client/assets/app-D6vN8PW-.js.br +0 -0
  246. package/dist/client/assets/app-D6vN8PW-.js.gz +0 -0
  247. package/dist/client/assets/arc-Cqel4Ted.js.br +0 -0
  248. package/dist/client/assets/arc-Cqel4Ted.js.gz +0 -0
  249. package/dist/client/assets/architectureDiagram-5GKGNRK7-DgvPtgNb.js.br +0 -0
  250. package/dist/client/assets/architectureDiagram-5GKGNRK7-DgvPtgNb.js.gz +0 -0
  251. package/dist/client/assets/blockDiagram-I7D4REHJ-BxbWO4x4.js.br +0 -0
  252. package/dist/client/assets/blockDiagram-I7D4REHJ-BxbWO4x4.js.gz +0 -0
  253. package/dist/client/assets/c4Diagram-7LVT6UL2-gsA37gjL.js.br +0 -0
  254. package/dist/client/assets/c4Diagram-7LVT6UL2-gsA37gjL.js.gz +0 -0
  255. package/dist/client/assets/channel-CBc8-n7y.js +0 -1
  256. package/dist/client/assets/chunk-F27PBJKO-DvVWvQEk.js.br +0 -0
  257. package/dist/client/assets/chunk-F27PBJKO-DvVWvQEk.js.gz +0 -0
  258. package/dist/client/assets/chunk-IMKFNOWR-BnwQLR5S.js.br +0 -0
  259. package/dist/client/assets/chunk-IMKFNOWR-BnwQLR5S.js.gz +0 -0
  260. package/dist/client/assets/chunk-SVP7TREG-CDYm-dzk.js.br +0 -0
  261. package/dist/client/assets/chunk-SVP7TREG-CDYm-dzk.js.gz +0 -0
  262. package/dist/client/assets/chunk-TICWLB2K-BKaW9Z9i.js.br +0 -0
  263. package/dist/client/assets/chunk-TICWLB2K-BKaW9Z9i.js.gz +0 -0
  264. package/dist/client/assets/classDiagram-ZZMXUADV-CNFc2dOc.js +0 -1
  265. package/dist/client/assets/classDiagram-v2-VYDZK3BY-CNFc2dOc.js +0 -1
  266. package/dist/client/assets/cose-bilkent-JH36ORCC-DCbbTNc6.js.br +0 -0
  267. package/dist/client/assets/cose-bilkent-JH36ORCC-DCbbTNc6.js.gz +0 -0
  268. package/dist/client/assets/cynefin-OW5HDTMX-i23hD0Z2.js.br +0 -0
  269. package/dist/client/assets/cynefin-OW5HDTMX-i23hD0Z2.js.gz +0 -0
  270. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CbyLYcqc.js.br +0 -0
  271. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CbyLYcqc.js.gz +0 -0
  272. package/dist/client/assets/dagre-GXQ25YYZ-iJ4VKzZm.js.br +0 -0
  273. package/dist/client/assets/dagre-GXQ25YYZ-iJ4VKzZm.js.gz +0 -0
  274. package/dist/client/assets/diagram-S7CK7UJ4-BNVZcdsO.js.br +0 -0
  275. package/dist/client/assets/diagram-S7CK7UJ4-BNVZcdsO.js.gz +0 -0
  276. package/dist/client/assets/diagram-UQ7AKVKN-1ghTvPiu.js.br +0 -0
  277. package/dist/client/assets/diagram-UQ7AKVKN-1ghTvPiu.js.gz +0 -0
  278. package/dist/client/assets/diagram-VSXAHHWV-Ce_0nMd3.js.br +0 -0
  279. package/dist/client/assets/diagram-VSXAHHWV-Ce_0nMd3.js.gz +0 -0
  280. package/dist/client/assets/diagram-VX7I27RA-CLHEkhUt.js.br +0 -0
  281. package/dist/client/assets/diagram-VX7I27RA-CLHEkhUt.js.gz +0 -0
  282. package/dist/client/assets/diagram-Z3DM3KII-iyb5DkP6.js.br +0 -0
  283. package/dist/client/assets/diagram-Z3DM3KII-iyb5DkP6.js.gz +0 -0
  284. package/dist/client/assets/ebnfDiagram-PWID7BFC-Dxh2TzXm.js.br +0 -0
  285. package/dist/client/assets/ebnfDiagram-PWID7BFC-Dxh2TzXm.js.gz +0 -0
  286. package/dist/client/assets/erDiagram-RLTQ6QDP-Cr8IkdCC.js.br +0 -0
  287. package/dist/client/assets/erDiagram-RLTQ6QDP-Cr8IkdCC.js.gz +0 -0
  288. package/dist/client/assets/flowDiagram-HODETNUW-B8ZF1bwr.js.br +0 -0
  289. package/dist/client/assets/flowDiagram-HODETNUW-B8ZF1bwr.js.gz +0 -0
  290. package/dist/client/assets/ganttDiagram-EL5Y4UJY-zhdL10eM.js.br +0 -0
  291. package/dist/client/assets/ganttDiagram-EL5Y4UJY-zhdL10eM.js.gz +0 -0
  292. package/dist/client/assets/gestureArbiter-CXYHfU__.js.br +0 -0
  293. package/dist/client/assets/gestureArbiter-CXYHfU__.js.gz +0 -0
  294. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BQf2fHBo.js.br +0 -0
  295. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BQf2fHBo.js.gz +0 -0
  296. package/dist/client/assets/ishikawaDiagram-5VMMS53U-DunPdwW9.js.br +0 -0
  297. package/dist/client/assets/ishikawaDiagram-5VMMS53U-DunPdwW9.js.gz +0 -0
  298. package/dist/client/assets/journeyDiagram-3NMN7TZE-B0y75iIg.js.br +0 -0
  299. package/dist/client/assets/journeyDiagram-3NMN7TZE-B0y75iIg.js.gz +0 -0
  300. package/dist/client/assets/kanban-definition-UXKFOSKX-BfgA5WLo.js.br +0 -0
  301. package/dist/client/assets/kanban-definition-UXKFOSKX-BfgA5WLo.js.gz +0 -0
  302. package/dist/client/assets/layout-BvjABLff.js.br +0 -0
  303. package/dist/client/assets/layout-BvjABLff.js.gz +0 -0
  304. package/dist/client/assets/linear-DgeFRliF.js.br +0 -0
  305. package/dist/client/assets/linear-DgeFRliF.js.gz +0 -0
  306. package/dist/client/assets/mermaid.core-DM6Rlal9.js.br +0 -0
  307. package/dist/client/assets/mermaid.core-DM6Rlal9.js.gz +0 -0
  308. package/dist/client/assets/mindmap-definition-YA3MSWOX-DhEiABv6.js.br +0 -0
  309. package/dist/client/assets/mindmap-definition-YA3MSWOX-DhEiABv6.js.gz +0 -0
  310. package/dist/client/assets/passwordBootstrap-Dxv0I4wM.js.br +0 -0
  311. package/dist/client/assets/passwordBootstrap-Dxv0I4wM.js.gz +0 -0
  312. package/dist/client/assets/pegDiagram-XKGWAZYB-LTlVaJfm.js.br +0 -0
  313. package/dist/client/assets/pegDiagram-XKGWAZYB-LTlVaJfm.js.gz +0 -0
  314. package/dist/client/assets/pieDiagram-E7YTZNPT-9bnryna3.js.br +0 -0
  315. package/dist/client/assets/pieDiagram-E7YTZNPT-9bnryna3.js.gz +0 -0
  316. package/dist/client/assets/quadrantDiagram-AXDQQJYC-ZBmgIpsJ.js.br +0 -0
  317. package/dist/client/assets/quadrantDiagram-AXDQQJYC-ZBmgIpsJ.js.gz +0 -0
  318. package/dist/client/assets/railroadDiagram-O6MQD6OU-DTtXvKOu.js.br +0 -0
  319. package/dist/client/assets/railroadDiagram-O6MQD6OU-DTtXvKOu.js.gz +0 -0
  320. package/dist/client/assets/rdpSession-Ggo3N5s5.js.br +0 -0
  321. package/dist/client/assets/referenceLongPress-Df8W2cyP.js.br +0 -0
  322. package/dist/client/assets/referenceLongPress-Df8W2cyP.js.gz +0 -0
  323. package/dist/client/assets/requirementDiagram-BXWQKSXE-BNia9zI0.js.br +0 -0
  324. package/dist/client/assets/requirementDiagram-BXWQKSXE-BNia9zI0.js.gz +0 -0
  325. package/dist/client/assets/sankeyDiagram-P5KCCOFB-uvg5npfK.js.br +0 -0
  326. package/dist/client/assets/sankeyDiagram-P5KCCOFB-uvg5npfK.js.gz +0 -0
  327. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DpJNf2MD.js.br +0 -0
  328. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DpJNf2MD.js.gz +0 -0
  329. package/dist/client/assets/sizeCapture-INFHLROL-CkWB2AnF.js.br +0 -0
  330. package/dist/client/assets/sizeCapture-INFHLROL-CkWB2AnF.js.gz +0 -0
  331. package/dist/client/assets/stateDiagram-D77RDMKH-CeMzMQq-.js.br +0 -0
  332. package/dist/client/assets/stateDiagram-D77RDMKH-CeMzMQq-.js.gz +0 -0
  333. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CNYUpLxt.js +0 -1
  334. package/dist/client/assets/swimlanes-42K2YHIH-Bo9GejWo.js.br +0 -0
  335. package/dist/client/assets/swimlanes-42K2YHIH-Bo9GejWo.js.gz +0 -0
  336. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-EB7zBRFR.js +0 -8
  337. package/dist/client/assets/timeline-definition-24CTP7MA-cvWXYEZ4.js.br +0 -0
  338. package/dist/client/assets/timeline-definition-24CTP7MA-cvWXYEZ4.js.gz +0 -0
  339. package/dist/client/assets/vennDiagram-4TSXK5OY-CzleWcmk.js.gz +0 -0
  340. package/dist/client/assets/videoCompression-DCnzjEfU.js.br +0 -0
  341. package/dist/client/assets/videoCompression-DCnzjEfU.js.gz +0 -0
  342. package/dist/client/assets/wardleyDiagram-VM6X3IG4-Cir1iutR.js.br +0 -0
  343. package/dist/client/assets/wardleyDiagram-VM6X3IG4-Cir1iutR.js.gz +0 -0
  344. package/dist/client/assets/xychartDiagram-S5SC5T6Z-pNPcVJ1C.js.br +0 -0
  345. package/dist/client/assets/xychartDiagram-S5SC5T6Z-pNPcVJ1C.js.gz +0 -0
@@ -1,6 +1,7 @@
1
1
  import { CollaborationError } from './collaborationProtocol.js';
2
2
  import { captureTaskCommit } from './collaborationTaskWorkspace.js';
3
3
  import { taskBundleChunk } from './collaborationTaskBundles.js';
4
+ import { taskExecution, taskPurpose, taskPurposeFilter } from './collaborationTaskPurpose.js';
4
5
  import { taskMemberKey } from './collaborationTaskTypes.js';
5
6
  /** One authority per task; replicas are records, never competing decision writers. */
6
7
  export class CollaborationTaskService {
@@ -56,12 +57,13 @@ export class CollaborationTaskService {
56
57
  const template = task.workflow?.reviewers.some(m => taskMemberKey(m) === taskMemberKey(member));
57
58
  return { member, sessionId, launchProfile: group.memberLaunchProfiles?.[sessionId], role: `${template ? '此目标的执行成员模板;' : ''}${group.roles?.[sessionId] ?? ''}` };
58
59
  });
59
- return { ...task, children, roster, launchProfiles: summary ? undefined : group?.launchProfiles, defaultLaunchProfileId: summary ? undefined : group?.defaultLaunchProfileId, memberSessions, replica: task.ownerServiceId !== this.self, summaryOnly: summary, outbox: (summary ? [] : this.tasks.pending(task.id))
60
+ return { ...task, purpose: taskPurpose(task.purpose), ...(task.purpose === 'automation' ? { execution: task.execution ?? taskExecution(task) } : {}), children, roster, launchProfiles: summary ? undefined : group?.launchProfiles, defaultLaunchProfileId: summary ? undefined : group?.defaultLaunchProfileId, memberSessions, replica: task.ownerServiceId !== this.self, summaryOnly: summary, outbox: (summary ? [] : this.tasks.pending(task.id))
60
61
  .map(({ id, attemptId, messageId, lastError }) => ({ id, attemptId, messageId, lastError })) };
61
62
  }
62
- list(groupId, actor) {
63
+ list(groupId, actor, purpose = 'all') {
63
64
  this.group(groupId, actor);
64
- return this.tasks.list([groupId], true).map(task => this.view(task, true));
65
+ const filter = taskPurposeFilter(purpose);
66
+ return this.tasks.list([groupId], true).filter(task => filter === 'all' || taskPurpose(task.purpose) === filter).map(task => this.view(task, true));
65
67
  }
66
68
  async get(taskId, actor) {
67
69
  const task = this.tasks.get(taskId);
@@ -71,8 +73,10 @@ export class CollaborationTaskService {
71
73
  return this.view(task);
72
74
  }
73
75
  async create(input, actor, origin) {
74
- this.group(input.groupId, actor);
76
+ const group = this.group(input.groupId, actor);
75
77
  this.validateMembers(input.groupId, input);
78
+ if (input.purpose === 'automation' && group.federated)
79
+ throw new CollaborationError('BACKGROUND_TASK_LOCAL_ONLY', '首版后台自动化记录使用本机协作组', 409);
76
80
  const dependencies = [...(input.dependsOn ?? []), ...(input.parentTaskId ? [input.parentTaskId] : [])];
77
81
  const authority = dependencies.length ? this.tasks.get(dependencies[0])?.ownerServiceId : this.self;
78
82
  if (!authority)
@@ -97,8 +101,10 @@ export class CollaborationTaskService {
97
101
  const task = this.tasks.get(taskId);
98
102
  if (!task)
99
103
  throw new CollaborationError('TASK_NOT_FOUND', '任务不存在', 404);
100
- this.group(task.groupId, actor);
104
+ const group = this.group(task.groupId, actor);
101
105
  this.validateMembers(task.groupId, input);
106
+ if (input.kind === 'configure' && input.purpose === 'automation' && group.federated)
107
+ throw new CollaborationError('BACKGROUND_TASK_LOCAL_ONLY', '首版后台自动化记录使用本机协作组', 409);
102
108
  if (origin && task.ownerServiceId !== this.self)
103
109
  throw new CollaborationError('INTEGRATION_LOCAL_ONLY', '首版集成任务须由本机服务保存', 409);
104
110
  if (task.ownerServiceId !== this.self) {
@@ -131,7 +137,8 @@ export class CollaborationTaskService {
131
137
  commit: child.artifacts.find(a => a.id === child.acceptedArtifactId)?.evidence?.commit })) } };
132
138
  }
133
139
  const updated = this.tasks.apply(taskId, input, actor, origin);
134
- void this.flush();
140
+ if (input.kind !== 'configure')
141
+ void this.flush();
135
142
  return this.view(updated);
136
143
  }
137
144
  heads(groupIds) { return this.tasks.heads(groupIds, this.self); }
@@ -2,6 +2,7 @@ import { randomBytes, createHash } from 'node:crypto';
2
2
  import { readFileSync, writeFileSync, mkdirSync, renameSync } from 'node:fs';
3
3
  import { dirname } from 'node:path';
4
4
  import { collaborationResultPresentation } from './collaborationResultPresentation.js';
5
+ import { taskExecution, taskPurpose } from './collaborationTaskPurpose.js';
5
6
  import { CollaborationError } from './collaborationProtocol.js';
6
7
  import { taskMemberKey } from './collaborationTaskTypes.js';
7
8
  const id = () => randomBytes(16).toString('hex');
@@ -50,6 +51,9 @@ function validateSnapshot(task) {
50
51
  text(task.spec, '任务内容', 32_000, true);
51
52
  text(task.constraints, '约束');
52
53
  text(task.acceptance, '完成标准');
54
+ taskPurpose(task.purpose);
55
+ if (task.purpose === 'automation' && (task.workflow || task.parentTaskId || task.dependsOn.length || task.coordinator))
56
+ invalid();
53
57
  member({ serviceId: task.ownerServiceId, sessionId: 'validation' });
54
58
  if (task.coordinator !== null)
55
59
  member(task.coordinator);
@@ -83,6 +87,8 @@ function validateSnapshot(task) {
83
87
  invalid();
84
88
  if (event.deliveryId !== undefined && !validId(event.deliveryId))
85
89
  invalid();
90
+ if (event.purpose !== undefined)
91
+ taskPurpose(event.purpose);
86
92
  if (event.source !== undefined && !['system', 'user', 'integration'].includes(event.source))
87
93
  invalid();
88
94
  if (event.actor !== null)
@@ -183,7 +189,7 @@ export class CollaborationTaskStore {
183
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);
184
190
  const automationIssueSource = task.automationIssue ? current?.report && ['blocked', 'failed'].includes(current.report.status)
185
191
  && task.automationIssue === current.report.content.slice(0, 1000) ? 'member-report' : 'system' : undefined;
186
- return { ...task, automationIssueSource, spec: task.spec.slice(0, 512), constraints: '', acceptance: '',
192
+ return { ...task, ...(task.purpose === 'automation' ? { execution: taskExecution(task) } : {}), automationIssueSource, spec: task.spec.slice(0, 512), constraints: '', acceptance: '',
187
193
  deliveries: task.deliveries.filter(d => d.attemptId === task.activeAttemptId && d.error).slice(-1),
188
194
  attempts: current ? [{ ...current, report: current.report ? { ...current.report, summary: reportSummary, content: '', evidence: undefined } : undefined }] : [],
189
195
  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 })),
@@ -221,7 +227,7 @@ export class CollaborationTaskStore {
221
227
  task.attempts.push({ id: attemptId, assignee: member(assignee), createdAt: Date.now(), threadId });
222
228
  this.event(task, 'assigned', actor, content || '任务已分派');
223
229
  doc.outbox.push({ id: id(), taskId: task.id, attemptId, target: assignee, kind: 'task', threadId,
224
- 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.workspace ? `\n代码只能在独立目录 ${task.workspace.cwd} 修改。分支 ${task.workspace.branch}。交付前提交代码,结果说明提交、变更、验证与限制。不能修改原仓库、合并到用户分支或发布。` : ''}${task.workflow?.workType === 'read-only' ? '\n这是只读查询或分析任务:在本机会话中采集并交付报告,不修改代码或系统,不创建提交、构建、部署或终止进程。结果需说明采样时间、证据和限制。' : ''}${task.workflow?.kind === 'step' ? '\n完成报告会自动请求独立评审;评审要求修改时继续完成,重新提交 complete。只按用户授权运行测试。' : ''}` });
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。只按用户授权运行测试。' : ''}` });
225
231
  }
226
232
  goalInstructions(task) {
227
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} 创建对应执行成员,再把子任务分派给它。已有成员及其代码执行会话保留创建时的启动方案,不因默认方案变更而更换模型。`;
@@ -248,6 +254,9 @@ export class CollaborationTaskStore {
248
254
  content: `你被指定为任务「${task.title}」的协调者。\n目标:${task.spec}\n约束:${task.constraints || '未补充'}\n验收标准:${task.acceptance || '由用户决定'}\n任务 ID:${task.id}\n用 td collab task get ${task.id} --text 查看原始记录;用 task list --group ${task.groupId} 查看工作组。需要拆分时用 task create --group ${task.groupId} --parent ${task.id} --title '子任务标题' --content '任务内容'。分派前查询 revision,再用 task assign --revision;把必要的人类决策交给 task ask,不推断成员忙闲,不停止其他成员终端。` });
249
255
  }
250
256
  create(owner, input, actor, origin) {
257
+ const purpose = taskPurpose(input.purpose);
258
+ if (purpose === 'automation' && (input.managed || input.parentTaskId || input.dependsOn?.length || input.coordinator || input.reviewers?.length || input.integration))
259
+ throw new CollaborationError('AUTOMATION_STANDALONE_REQUIRED', '后台自动化记录不加入人工目标、依赖或评审流程');
251
260
  const title = text(input.title, '标题', 640, true), spec = text(input.spec, '任务内容', 32_000, true);
252
261
  const constraints = text(input.constraints, '约束'), acceptance = text(input.acceptance, '完成标准');
253
262
  if (input.dependsOn !== undefined && (!Array.isArray(input.dependsOn) || input.dependsOn.length > 32 || input.dependsOn.some(v => typeof v !== 'string')))
@@ -276,6 +285,8 @@ export class CollaborationTaskStore {
276
285
  for (const dependency of [...dependsOn, ...(input.parentTaskId ? [input.parentTaskId] : [])]) {
277
286
  if (!doc.tasks.some(t => t.id === dependency && t.groupId === input.groupId))
278
287
  throw new CollaborationError('TASK_DEPENDENCY_NOT_FOUND', '父任务或依赖任务不在当前协作组', 404);
288
+ if (doc.tasks.find(t => t.id === dependency)?.purpose === 'automation')
289
+ throw new CollaborationError('AUTOMATION_STANDALONE_REQUIRED', '后台自动化记录不能作为人工任务父级或验收依赖');
279
290
  }
280
291
  const now = Date.now();
281
292
  const parent = doc.tasks.find(t => t.id === input.parentTaskId);
@@ -307,11 +318,11 @@ export class CollaborationTaskStore {
307
318
  if (!required.length || required.some(t => !dependsOn.includes(t.id)))
308
319
  throw new CollaborationError('INTEGRATION_DEPENDENCIES_REQUIRED', '集成任务必须依赖目标下全部实施子任务');
309
320
  }
310
- const task = { id: id(), ownerServiceId: owner, groupId: input.groupId, title, spec, constraints, acceptance,
321
+ const task = { id: id(), ownerServiceId: owner, groupId: input.groupId, title, spec, constraints, acceptance, purpose,
311
322
  coordinator: parent?.workflow ? parent.coordinator : input.coordinator !== undefined ? input.coordinator : input.parentTaskId ? doc.tasks.find(t => t.id === input.parentTaskId)?.coordinator ?? actor : null,
312
323
  parentTaskId: input.parentTaskId ?? null, dependsOn, createdAt: now, updatedAt: now, revision: 1,
313
324
  ...(origin ? { origin: structuredClone(origin) } : {}), status: 'open', activeAttemptId: null, attempts: [], decisions: [], artifacts: [], events: [], deliveries: [], ...(workflow ? { workflow } : {}) };
314
- this.event(task, 'created', actor, spec);
325
+ this.event(task, 'created', actor, spec).purpose = purpose;
315
326
  if (parent?.constraints)
316
327
  task.constraints = text([parent.constraints, constraints].filter(Boolean).join('\n'), '继承约束');
317
328
  if (workflow?.kind === 'goal') {
@@ -335,6 +346,12 @@ export class CollaborationTaskStore {
335
346
  }, origin);
336
347
  }
337
348
  apply(taskId, input, actor, origin) {
349
+ if (input.purpose !== undefined && input.kind !== 'configure')
350
+ throw new CollaborationError('INVALID_TASK_PURPOSE', 'purpose can only be changed through configure');
351
+ if (input.kind === 'configure' && input.purpose === undefined)
352
+ throw new CollaborationError('INVALID_TASK_PURPOSE', 'configure requires purpose');
353
+ if (input.kind === 'configure')
354
+ taskPurpose(input.purpose);
338
355
  const content = text(input.content, '内容');
339
356
  const summary = text(input.summary, '结果摘要', 2400);
340
357
  if (summary && (input.kind !== 'report' || input.status !== 'complete'))
@@ -353,6 +370,8 @@ export class CollaborationTaskStore {
353
370
  if (origin && ['accept', 'approve-plan', 'report', 'ask', 'submit-plan', 'review', 'respond'].includes(input.kind))
354
371
  throw new CollaborationError('INTEGRATION_OPERATION_DENIED', '此操作需要用户或原执行成员身份', 403);
355
372
  const coordination = actor === null || sameMember(actor, task.coordinator);
373
+ if (input.kind === 'configure' && actor !== null)
374
+ throw new CollaborationError('USER_DECISION_REQUIRED', '用途配置需要用户管理身份或授权的集成身份', 403);
356
375
  if (['assign', 'coordinator', 'close', 'reopen', 'revise', 'request-review', 'coordinate', 'pause', 'resume', 'retry'].includes(input.kind) && !coordination)
357
376
  throw new CollaborationError('TASK_PERMISSION_DENIED', '此操作需要用户或当前协调者', 403);
358
377
  if (['answer', 'accept', 'approve-plan'].includes(input.kind) && actor !== null)
@@ -360,7 +379,7 @@ export class CollaborationTaskStore {
360
379
  if (!['report', 'ask', 'submit-plan', 'review', 'comment', 'respond', 'answer'].includes(input.kind) && input.expectedRevision !== task.revision)
361
380
  throw new CollaborationError('TASK_CHANGED', '任务已更新,请查看最新记录后重试', 409);
362
381
  const userFollowup = actor === null && input.kind === 'revise' && !!content;
363
- if (task.status !== 'open' && !['reopen', 'report'].includes(input.kind) && !(task.status === 'accepted' && (userFollowup || ['comment', 'respond'].includes(input.kind))))
382
+ if (task.status !== 'open' && !['configure', 'reopen', 'report'].includes(input.kind) && !(task.status === 'accepted' && (userFollowup || ['comment', 'respond'].includes(input.kind))))
364
383
  throw new CollaborationError('TASK_ARCHIVED', '任务已归档;需要继续时请重新打开', 409);
365
384
  if (task.workflow && task.status !== 'open' && input.kind !== 'reopen' && !(task.status === 'accepted' && (userFollowup || ['comment', 'respond'].includes(input.kind))))
366
385
  throw new CollaborationError('TASK_ARCHIVED', '自动协作的已完成版本不能追加执行报告,请先重新打开', 409);
@@ -390,7 +409,15 @@ export class CollaborationTaskStore {
390
409
  throw new CollaborationError('ATTEMPT_SUPERSEDED', '这轮分派已被替换,不能再请求用户决定', 409);
391
410
  if (task.workflow && ['report', 'ask', 'submit-plan'].includes(input.kind) && attempt?.id !== task.activeAttemptId)
392
411
  throw new CollaborationError('ATTEMPT_SUPERSEDED', '自动协作只能推进当前分派', 409);
393
- if (input.kind === 'assign') {
412
+ if (input.kind === 'configure') {
413
+ const purpose = taskPurpose(input.purpose);
414
+ if (purpose === 'automation' && (task.workflow || task.parentTaskId || task.dependsOn.length || task.coordinator
415
+ || doc.tasks.some(t => t.parentTaskId === task.id || t.workflow?.rootTaskId === task.id || t.dependsOn.includes(task.id))))
416
+ throw new CollaborationError('AUTOMATION_STANDALONE_REQUIRED', '只能把独立记录改为后台自动化用途');
417
+ task.purpose = purpose;
418
+ this.event(task, 'configured', actor, content || `任务用途已配置为 ${purpose}`).purpose = purpose;
419
+ }
420
+ else if (input.kind === 'assign') {
394
421
  if (task.workflow?.kind === 'goal' && !sameMember(input.assignee ?? null, task.coordinator))
395
422
  throw new CollaborationError('GOAL_COORDINATOR_REQUIRED', '目标由协调者负责,请在子任务中分派实施');
396
423
  if (task.dependsOn.some(dep => doc.tasks.find(t => t.id === dep)?.status !== 'accepted'))
@@ -407,6 +434,8 @@ export class CollaborationTaskStore {
407
434
  this.notifyCoordinator(doc, task);
408
435
  }
409
436
  else if (input.kind === 'coordinator') {
437
+ if (task.purpose === 'automation' && input.coordinator)
438
+ throw new CollaborationError('AUTOMATION_STANDALONE_REQUIRED', '后台自动化记录不加入人工协调流程');
410
439
  if (task.workflow && !input.coordinator)
411
440
  throw new CollaborationError('GOAL_COORDINATOR_REQUIRED', '自动协作需要协调者');
412
441
  const previousCoordinator = task.coordinator;
@@ -6,7 +6,7 @@ import { homedir } from 'node:os';
6
6
  import { timingSafeEqual } from 'node:crypto';
7
7
  import { CollaborationError } from './collaborationProtocol.js';
8
8
  import { terminalMessage } from './collaborationStore.js';
9
- import { IntegrationStore, INTEGRATION_PROTOCOL, integrationError } from './integrationStore.js';
9
+ import { IntegrationStore, INTEGRATION_PROTOCOL, INTEGRATION_OPERATIONS, integrationError } from './integrationStore.js';
10
10
  import { IntegrationSessions, publicIntegrationSession } from './integrationSessions.js';
11
11
  import { getTermdockVersion } from '../utils/version.js';
12
12
  export function integrationSocketPath(port) { return path.join(homedir(), '.termdock', `integration-${port}.sock`); }
@@ -73,7 +73,7 @@ export class IntegrationRuntime {
73
73
  integrationError('INVALID_INTEGRATION_POLICY', 'Policy identity must match the requested identity'); this.group(req.body?.groupId); this.store.update(req.body); return { ok: true, id: req.params.id }; }));
74
74
  app.post('/admin/principals/:id/revoke', run(req => { admin(req); this.store.revoke(req.params.id); return { ok: true }; }));
75
75
  app.get('/capabilities', run(req => { const p = principal(req); return { ...this.capabilities(), principal: { id: p.id, group_id: p.groupId, permissions: p.permissions, launch_profiles: p.launchProfiles.map(profile => ({ id: profile.id, agent_slug: profile.agentSlug, cwd_roots: profile.cwdRoots, startup_input_condition: !!profile.startupInput })) } }; }));
76
- app.get('/tasks', run(req => { const p = principal(req); this.authorize(p, 'task.read', req.query.group); return { tasks: options.tasks.list(p.groupId, null) }; }));
76
+ app.get('/tasks', run(req => { const p = principal(req); this.authorize(p, 'task.read', req.query.group); return { tasks: options.tasks.list(p.groupId, null, req.query.purpose) }; }));
77
77
  app.get('/tasks/:id', run(async (req) => { const p = principal(req); this.taskPermission(p, req.params.id, 'task.read'); return { task: await options.tasks.get(req.params.id, null) }; }));
78
78
  app.post('/tasks', run(async (req) => {
79
79
  const p = principal(req), raw = req.body?.input ?? {};
@@ -81,7 +81,7 @@ export class IntegrationRuntime {
81
81
  if (raw.managed || raw.parentTaskId || raw.dependsOn?.length || raw.coordinatorSessionId || raw.reviewerSessionIds?.length || raw.integration)
82
82
  integrationError('INTEGRATION_OPERATION_DENIED', 'Integration creates ordinary standalone tasks only', 403);
83
83
  const input = { idempotencyKey: raw.idempotencyKey, groupId: p.groupId, title: raw.title, spec: raw.spec,
84
- constraints: raw.constraints, acceptance: raw.acceptance, assignee: raw.assigneeSessionId ? options.peers.taskMember(String(raw.assigneeSessionId)) : undefined };
84
+ purpose: raw.purpose, constraints: raw.constraints, acceptance: raw.acceptance, assignee: raw.assigneeSessionId ? options.peers.taskMember(String(raw.assigneeSessionId)) : undefined };
85
85
  if (input.assignee)
86
86
  this.authorize(p, 'task.assign');
87
87
  const task = await options.tasks.create(input, null, this.origin(p, req.body?.origin));
@@ -90,13 +90,13 @@ export class IntegrationRuntime {
90
90
  }));
91
91
  app.post('/tasks/:id', run(async (req) => {
92
92
  const p = principal(req), raw = req.body?.input ?? {};
93
- const permissions = { assign: 'task.assign', comment: 'task.comment', revise: 'task.revise', answer: 'task.answer' };
93
+ const permissions = { configure: 'task.configure', assign: 'task.assign', comment: 'task.comment', revise: 'task.revise', answer: 'task.answer' };
94
94
  const permission = permissions[raw.kind];
95
95
  if (!permission)
96
96
  integrationError('INTEGRATION_OPERATION_DENIED', 'Operation requires a user or terminal member', 403);
97
97
  this.taskPermission(p, req.params.id, permission);
98
98
  const input = { kind: raw.kind, idempotencyKey: raw.idempotencyKey, content: raw.content,
99
- expectedRevision: raw.expectedRevision, decisionId: raw.decisionId,
99
+ purpose: raw.purpose, expectedRevision: raw.expectedRevision, decisionId: raw.decisionId,
100
100
  assignee: raw.assigneeSessionId ? options.peers.taskMember(String(raw.assigneeSessionId)) : undefined };
101
101
  const task = await options.tasks.apply(req.params.id, input, null, this.origin(p, req.body?.origin));
102
102
  this.sync();
@@ -148,7 +148,8 @@ export class IntegrationRuntime {
148
148
  integration_policy_update: true,
149
149
  session_restore_diagnostics: true,
150
150
  native_identity_linux_flock_owner: process.platform === 'linux',
151
- permissions: ['task.read', 'task.create', 'task.assign', 'task.comment', 'task.revise', 'task.answer', 'events.read', 'session.create', 'session.read', 'session.restore'] };
151
+ background_task_records: true, task_purpose_configuration: true, explicit_execution_state: true,
152
+ permissions: INTEGRATION_OPERATIONS };
152
153
  }
153
154
  error(error) {
154
155
  return { type: 'error', ok: false, code: error instanceof CollaborationError ? error.code : 'INTEGRATION_INTERNAL_ERROR',
@@ -3,7 +3,7 @@ import path from 'node:path';
3
3
  import { createHash, randomBytes, randomUUID, timingSafeEqual } from 'node:crypto';
4
4
  import { CollaborationError } from './collaborationProtocol.js';
5
5
  export const INTEGRATION_PROTOCOL = 1;
6
- export const INTEGRATION_OPERATIONS = ['task.read', 'task.create', 'task.assign', 'task.comment', 'task.revise', 'task.answer', 'events.read', 'session.create', 'session.read', 'session.restore'];
6
+ export const INTEGRATION_OPERATIONS = ['task.read', 'task.create', 'task.configure', 'task.assign', 'task.comment', 'task.revise', 'task.answer', 'events.read', 'session.create', 'session.read', 'session.restore'];
7
7
  export function integrationError(code, message, status = 400) { throw new CollaborationError(code, message, status); }
8
8
  export function atomicJson(file, value) {
9
9
  fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });
@@ -7,7 +7,8 @@
7
7
  **实际运行服务至少 1.4.303**。没有 PTY 附着的已登记 tmux 的重复保护修复要求
8
8
  **实际运行服务至少 1.4.304**。管理员恢复诊断要求 **CLI / 实际服务均至少 1.4.305**;
9
9
  直接 exec 为 pane PID 的原生 argv 核验及可选 Linux 持锁身份要求 **实际服务至少 1.4.306**;
10
- 建议 CLI 与服务同步安装 1.4.306(既有接入命令的 CLI 最低仍为 1.4.301,诊断 CLI 最低为 1.4.305)。
10
+ 后台执行记录与用途迁移要求 **CLI / 实际服务均至少 1.4.307**;
11
+ 建议 CLI 与服务同步安装 1.4.307(既有接入命令的 CLI 最低仍为 1.4.301,诊断 CLI 最低为 1.4.305)。
11
12
  现有 `--session`、消息投递、任务报告与自动协作入口继续兼容;旧的
12
13
  `task create --integration` 仍表示代码集成子任务,新身份使用 `--principal`。
13
14
 
@@ -140,12 +141,97 @@ td collab --principal report-bridge capabilities
140
141
  `principal.launch_profiles` 中目标 profile 的 `startup_input_condition=true`。
141
142
  这些布尔值由实际服务回读;服务能力支持不等于身份已配置条件。
142
143
 
144
+ ## 后台自动化执行记录(1.4.307)
145
+
146
+ `td automation` 是已有定时投递入口:`list/create/show/run/pause/resume/delete`。
147
+ 它的 run `success` 只表示投递,记录不包含结果版本或关联咨询,最多保留 100 条;
148
+ 它不是本节的后台执行记录。外部定时器继续由接入方管理。
149
+
150
+ 后台工作复用可靠的 task/attempt/artifact/event 存储,显式使用
151
+ `purpose=automation`。旧记录缺少 purpose 时按 `interactive` 处理,新建也默认 interactive。
152
+ 这是使用方式与记录契约,不是安全隔离或简单 CSS 隐藏:
153
+
154
+ - automation 是本机协作组内的独立记录;不加入人工目标、父子任务、依赖验收、协调者或自动评审。
155
+ - 继续通过原 session 投递、精确恢复,用原 attempt report、comment/respond 和持久事件关联。
156
+ - `complete` 是执行成员的明确结果交付,无需逐期 accepted。它不等于业务机械校验通过或外部发布成功。
157
+ 业务按 artifact_id 保存机械校验和外部 outbox;本版 `external_validation=false`。
158
+ - 用户任务生命周期 `status=open|accepted|closed` 保持既有含义;后台是否执行交付,读下面的 `execution`,
159
+ 不等待 `status=accepted`。不自动生成 accepted;principal 仍不能验收。已有用户验收历史保留。
160
+ - 人工工作台列表 API 默认只列 interactive,看板与“需要你”同样排除 automation,
161
+ 包括 complete、blocked、failed、预期测试超时和真实提问。业务负责在飞书分诊/提问,
162
+ 可使用 task ask/answer 持久关联。异常、问题原文、投递状态和失败重试并未删除或改成成功。
163
+ - Agent CLI 与 principal 的 task list 默认保留全部授权组记录;可用 `--purpose automation|interactive|all` 筛选。
164
+ task get 不受用途过滤,原始正文与历史仍可回读。用途不代替组权限。
165
+
166
+ 先核验实际服务 capabilities:
167
+ `background_task_records=true`、`task_purpose_configuration=true`、`explicit_execution_state=true`。
168
+ 普通 collab 能力位在 `task_workflow` 内,principal 的在响应顶层。CLI 与实际服务均至少 1.4.307,协议仍是 1。
169
+ CLI 对带 purpose 的操作和 configure 会先探测能力,缺失返回
170
+ `BACKGROUND_TASK_RECORDS_UNSUPPORTED`,不会向旧服务提交变更或降级创建普通任务。
171
+
172
+ 新建后台执行记录(使用既有私有凭据文件注入):
173
+
174
+ ```sh
175
+ td collab --principal report-bridge task create --group <本机组ID> \
176
+ --purpose automation --title '本期报告' --content '完整执行要求' \
177
+ --assignee <原TD-session-id> --idempotency-key <本次创建键>
178
+ td collab --principal report-bridge task list --purpose automation
179
+ td collab --principal report-bridge task get <task-id>
180
+ ```
181
+
182
+ automation 的完整与摘要响应均提供 `execution`:
183
+
184
+ ```json
185
+ {
186
+ "status": "complete",
187
+ "attemptId": "原执行尝试ID",
188
+ "reportEventId": "原report事件ID",
189
+ "artifactId": "本版本结果ID",
190
+ "reportedAt": 1791636000000
191
+ }
192
+ ```
193
+
194
+ `execution.status` 为 `unassigned`、`awaiting_report` 或明确成员报告的
195
+ `ack/working/blocked/complete/failed`。它只根据当前 attempt 的有序原始 report/revise 事件生成:
196
+ 尚未报告及最新 revise 之后等待新报告时,reportEventId/artifactId/reportedAt 为 null;
197
+ 只有当前明确 complete 的 artifactId 非 null。comment/respond 不改变 execution、结果或 attempt;
198
+ revise 使旧一轮 execution 失效,再次 complete 产生新 artifact。历史 attempt 的报告不会覆盖当前执行事实。
199
+ 投递成功、终端快照、事件 ACK、其他会话忙闲均不能推导 execution 状态。
200
+ `reportedAt` 是原 report 事件时间,execution 为回读投影,不写回或伪造原报告。
201
+
202
+ 已有普通任务原地迁移,不重跑:管理员先在原策略的 permissions 中**追加** `task.configure`,
203
+ 保留 id/groupId/其他权限/profile/启动条件,用 `td integration update --file <原策略.json>` 更新。
204
+ 该操作保留凭据;仍需核对 principal.permissions,不能把服务支持的 permissions 当实际授权。
205
+ 然后读取原记录的最新 revision:
206
+
207
+ ```sh
208
+ td collab --principal report-bridge task get <原task-id>
209
+ td collab --principal report-bridge task configure <原task-id> \
210
+ --purpose automation --revision <刚回读的revision> \
211
+ --idempotency-key <此记录的用途迁移键>
212
+ ```
213
+
214
+ configure 在同一持久事务中更新 purpose、revision 并记录 `task.configured`(payload.event.purpose)。
215
+ 创建事件也保留创建时 purpose。新配置事件沿用既有持久推送/重连/ACK 契约。
216
+ 用途迁移保留原 task/group/attempt/session 关联、投递、artifact、原始事件和已验收/关闭历史,
217
+ 不建立新 attempt/session,不投递正文、不恢复终端、不自动 accepted。
218
+ 旧创建请求的同一幂等键仍绑定原请求体;不要把它改为带新 purpose 的 create,否则会正确报幂等冲突。
219
+ 迁移后保持原业务键与 TD ID,只有未来新记录才使用 purpose=automation 的新创建请求。
220
+ 测试记录也可配置为 automation,测试与正式业务组的分离仍由接入方完成,不自动替别人迁移任务。
221
+
222
+ configure 需要本机管理员(既有受权任务 API)或授权组内持有 `task.configure` 的 principal;
223
+ 终端成员不能配置。拒绝无 grant、跨组、过期 revision;同一幂等请求返回原事件且不重复追加。
224
+ `TASK_CHANGED` 时重新读取并核对,不盲覆写。用途非法返回 `INVALID_TASK_PURPOSE`;
225
+ 非独立记录返回 `AUTOMATION_STANDALONE_REQUIRED`,跨服务组返回 `BACKGROUND_TASK_LOCAL_ONLY`。
226
+ 已关闭的记录只迁移用途仍保持关闭,不由 configure 隐式恢复咨询或执行。
227
+
143
228
  ## 任务与权限
144
229
 
145
230
  | 操作 | 外部身份 | 会话成员 / 用户规则 |
146
231
  | --- | --- | --- |
147
232
  | list/get | `task.read`,只读授权组 | 保留现有组权限 |
148
- | create | `task.create`,普通独立任务 | 指定负责人另需 `task.assign`,必须在组内 |
233
+ | create | `task.create`,独立任务或后台执行记录 | 指定负责人另需 `task.assign`,必须在组内 |
234
+ | configure | `task.configure` | 显式配置用途,必须带 revision 与幂等键;会话成员不能配置 |
149
235
  | assign | `task.assign` | 必须带当前 revision;新建 attempt,不隐式恢复会话 |
150
236
  | comment | `task.comment` | open/accepted 可咨询,保留原结果、验收和 attempt |
151
237
  | revise | `task.revise` | 带 revision,重开并使旧结果失去验收资格,沿用当前 attempt |
@@ -208,6 +294,7 @@ task 事件 `event_id` 与任务内事件 ID 一致,`respond.reply_to_event_id
208
294
  | kind | payload |
209
295
  | --- | --- |
210
296
  | `task.created/assigned/scheduled/coordinator` | `{event}`:原事件、actor、content、attemptId、sequence、createdAt、origin 等 |
297
+ | `task.configured` | `{event}`:`purpose=interactive|automation`,原配置操作者、时间及 source/origin;没有终端投递 |
211
298
  | `task.report` | `{event}`:另含明确 reportStatus(ack/working/blocked/complete/failed)、evidence;新 complete 含 artifactId |
212
299
  | `task.comment/respond/revise` | `{event}`:咨询含 target/deliveryId,答复含 replyToEventId |
213
300
  | `task.question/answer` | `{event}`;decision 的完整状态从 task get 回读 |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.4.306",
3
+ "version": "1.4.307",
4
4
  "description": "A complete web-based terminal application with modern UI",
5
5
  "type": "module",
6
6
  "main": ".desktop-dist/main.js",
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "packageName": "termdock",
4
- "version": "1.4.306",
4
+ "version": "1.4.307",
5
5
  "runtimeProtocolVersion": 1,
6
6
  "minimumDesktopVersion": "1.4.46",
7
7
  "nodeMajor": 22,
8
8
  "dependencyHash": "sha256-E9GDa4nrCXADRXdyPKufusZt6IcCr4m2mGdx5h34KMQ=",
9
- "serverBundleHash": "sha256-X8EpOnbvlZo/rtZ5QLd5zVKFUOFeDkxeqJmY0hUBQnE=",
10
- "clientBundleHash": "sha256-HOoNMOYhnph9XwUhSYE5W2CdI9Vb4g0c64ubW49LnXE=",
9
+ "serverBundleHash": "sha256-SmxpQ63ErP59HLeERjJ0euDs74G6un227eMPe9/sAEI=",
10
+ "clientBundleHash": "sha256-dfDbp6qzSoUEczQc0mFdVx2jNb+7Oabm+ZvcTpBThnw=",
11
11
  "entrypoint": "dist/server/cli.js",
12
12
  "clientEntrypoint": "dist/client/index.html"
13
13
  }
@@ -1,2 +0,0 @@
1
- import{bv as r}from"./app-D6vN8PW-.js";import{b as m}from"./dnd-BCFAPC0L.js";import{b as n}from"./RightSidebar-CcMSU1v8.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./App-BziVLy1b.js";import"./gestureArbiter-CXYHfU__.js";import"./triangle-alert-DzV0gQXz.js";import"./referenceLongPress-Df8W2cyP.js";import"./DiffReview-DjG9vCpH.js";import"./sparkles-DOuEtn62.js";import"./DiffViewer-6n3tgsdc.js";import"./ChangeWalkthroughPanel-00oa0z6w.js";function v({content:o}){const e=m.useMemo(()=>n(o.split(`
2
- `),null,null),[o]);return r.jsx("div",{className:"min-w-0 space-y-3 break-words text-sm leading-6 text-foreground [&_h1]:text-lg [&_h2]:text-base [&_h3]:text-sm [&_pre]:max-w-full [&_table]:text-xs",children:e.map((t,i)=>r.jsx("div",{className:"min-w-0",children:typeof t.content=="function"?t.content(null):t.content},i))})}export{v as default};
@@ -1 +0,0 @@
1
- import{c as a,C as n}from"./mermaid.core-DM6Rlal9.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
@@ -1 +0,0 @@
1
- import{s as a,a as s,c as t,C as e}from"./chunk-TICWLB2K-BKaW9Z9i.js";import{d as i}from"./mermaid.core-DM6Rlal9.js";import"./chunk-5VM5RSS4-Bi4Hc8yL.js";import"./chunk-XXDRQBXY-DcHZ_FHb.js";import"./chunk-POPQ4Y6H-BRzm6Uzi.js";import"./chunk-F27PBJKO-DvVWvQEk.js";import"./purify.es-4eNOHKSq.js";import"./app-D6vN8PW-.js";import"./react-XDCjal2T.js";import"./dnd-BCFAPC0L.js";import"./terminal-C7X98Amf.js";var g={parser:t,get db(){return new e},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{g as diagram};
@@ -1 +0,0 @@
1
- import{s as a,a as s,c as t,C as e}from"./chunk-TICWLB2K-BKaW9Z9i.js";import{d as i}from"./mermaid.core-DM6Rlal9.js";import"./chunk-5VM5RSS4-Bi4Hc8yL.js";import"./chunk-XXDRQBXY-DcHZ_FHb.js";import"./chunk-POPQ4Y6H-BRzm6Uzi.js";import"./chunk-F27PBJKO-DvVWvQEk.js";import"./purify.es-4eNOHKSq.js";import"./app-D6vN8PW-.js";import"./react-XDCjal2T.js";import"./dnd-BCFAPC0L.js";import"./terminal-C7X98Amf.js";var g={parser:t,get db(){return new e},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{g as diagram};