dominds 1.18.2 → 1.19.2

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 (277) hide show
  1. package/dist/access-control.js +6 -6
  2. package/dist/apps/runtime.d.ts +2 -2
  3. package/dist/apps/runtime.js +28 -28
  4. package/dist/apps-host/client.d.ts +1 -1
  5. package/dist/apps-host/host.js +7 -7
  6. package/dist/apps-host/ipc-types.d.ts +2 -2
  7. package/dist/apps-host/ipc-types.js +10 -10
  8. package/dist/cli/read.d.ts +0 -1
  9. package/dist/cli/read.js +1 -6
  10. package/dist/dialog-display-state.d.ts +6 -6
  11. package/dist/dialog-display-state.js +46 -46
  12. package/dist/dialog-factory.d.ts +12 -12
  13. package/dist/dialog-factory.js +33 -30
  14. package/dist/dialog-fork.d.ts +2 -2
  15. package/dist/dialog-fork.js +140 -115
  16. package/dist/dialog-global-registry.d.ts +5 -5
  17. package/dist/dialog-global-registry.js +11 -11
  18. package/dist/dialog-instance-registry.d.ts +3 -3
  19. package/dist/dialog-instance-registry.js +52 -41
  20. package/dist/dialog.d.ts +100 -113
  21. package/dist/dialog.js +274 -229
  22. package/dist/docs/agent-priming.md +5 -5
  23. package/dist/docs/agent-priming.zh.md +5 -5
  24. package/dist/docs/app-constitution.md +1 -1
  25. package/dist/docs/app-constitution.zh.md +1 -1
  26. package/dist/docs/cli-usage.md +1 -1
  27. package/dist/docs/cli-usage.zh.md +1 -1
  28. package/dist/docs/design.md +14 -14
  29. package/dist/docs/design.zh.md +14 -14
  30. package/dist/docs/dialog-persistence.md +58 -58
  31. package/dist/docs/dialog-persistence.zh.md +61 -61
  32. package/dist/docs/dialog-system.md +363 -367
  33. package/dist/docs/dialog-system.zh.md +355 -357
  34. package/dist/docs/diligence-push.md +18 -18
  35. package/dist/docs/diligence-push.zh.md +17 -17
  36. package/dist/docs/dominds-agent-collaboration.zh.md +3 -3
  37. package/dist/docs/dominds-terminology.md +46 -47
  38. package/dist/docs/encapsulated-taskdoc.md +4 -4
  39. package/dist/docs/encapsulated-taskdoc.zh.md +3 -3
  40. package/dist/docs/fbr.md +30 -30
  41. package/dist/docs/fbr.zh.md +15 -15
  42. package/dist/docs/i18n.md +2 -2
  43. package/dist/docs/i18n.zh.md +2 -2
  44. package/dist/docs/mcp-support.md +5 -4
  45. package/dist/docs/mcp-support.zh.md +3 -2
  46. package/dist/docs/memory-system.md +4 -4
  47. package/dist/docs/memory-system.zh.md +1 -1
  48. package/dist/docs/mottos.md +1 -1
  49. package/dist/docs/mottos.zh.md +1 -1
  50. package/dist/docs/q4h.md +3 -3
  51. package/dist/docs/q4h.zh.md +1 -1
  52. package/dist/docs/roadmap.md +2 -2
  53. package/dist/docs/team_mgmt-toolset.md +11 -3
  54. package/dist/docs/team_mgmt-toolset.zh.md +9 -2
  55. package/dist/docs/tellask-collab.md +18 -18
  56. package/dist/docs/tellask-collab.zh.md +8 -8
  57. package/dist/docs/tellask-revive-context-refactor.zh.md +591 -0
  58. package/dist/evt-registry.d.ts +1 -2
  59. package/dist/evt-registry.js +2 -7
  60. package/dist/llm/gen/mock.js +9 -0
  61. package/dist/llm/kernel-driver/context.d.ts +1 -2
  62. package/dist/llm/kernel-driver/context.js +12 -26
  63. package/dist/llm/kernel-driver/drive.js +99 -75
  64. package/dist/llm/kernel-driver/engine.d.ts +2 -2
  65. package/dist/llm/kernel-driver/engine.js +10 -10
  66. package/dist/llm/kernel-driver/fbr.js +6 -6
  67. package/dist/llm/kernel-driver/flow.d.ts +1 -1
  68. package/dist/llm/kernel-driver/flow.js +129 -93
  69. package/dist/llm/kernel-driver/guardrails.js +4 -4
  70. package/dist/llm/kernel-driver/index.d.ts +1 -1
  71. package/dist/llm/kernel-driver/index.js +2 -2
  72. package/dist/llm/kernel-driver/loop.js +30 -30
  73. package/dist/llm/kernel-driver/reply-guidance.js +47 -52
  74. package/dist/llm/kernel-driver/restore.d.ts +3 -3
  75. package/dist/llm/kernel-driver/restore.js +23 -28
  76. package/dist/llm/kernel-driver/runtime.d.ts +1 -1
  77. package/dist/llm/kernel-driver/runtime.js +1 -1
  78. package/dist/llm/kernel-driver/sideDialog-txn.d.ts +8 -0
  79. package/dist/llm/kernel-driver/{subdialog-txn.js → sideDialog-txn.js} +13 -13
  80. package/dist/llm/kernel-driver/{subdialog.d.ts → sideDialog.d.ts} +13 -13
  81. package/dist/llm/kernel-driver/{subdialog.js → sideDialog.js} +203 -170
  82. package/dist/llm/kernel-driver/tellask-special.d.ts +7 -3
  83. package/dist/llm/kernel-driver/tellask-special.js +474 -497
  84. package/dist/llm/kernel-driver/types.d.ts +25 -9
  85. package/dist/mcp/config.d.ts +1 -0
  86. package/dist/mcp/config.js +7 -2
  87. package/dist/mcp/supervisor.d.ts +2 -0
  88. package/dist/mcp/supervisor.js +2 -1
  89. package/dist/minds/builtin/pangu/persona.en.md +4 -4
  90. package/dist/minds/load.js +6 -6
  91. package/dist/minds/system-prompt-parts.d.ts +1 -1
  92. package/dist/minds/system-prompt-parts.js +12 -12
  93. package/dist/minds/system-prompt.d.ts +1 -1
  94. package/dist/minds/system-prompt.js +56 -56
  95. package/dist/persistence-errors.d.ts +1 -1
  96. package/dist/persistence.d.ts +126 -121
  97. package/dist/persistence.js +1190 -786
  98. package/dist/priming.d.ts +3 -3
  99. package/dist/priming.js +62 -61
  100. package/dist/recovery/reply-special.js +5 -5
  101. package/dist/runtime/driver-messages.d.ts +3 -2
  102. package/dist/runtime/driver-messages.js +68 -57
  103. package/dist/runtime/inter-dialog-format.d.ts +12 -10
  104. package/dist/runtime/inter-dialog-format.js +80 -35
  105. package/dist/runtime/interjection-pause-stop.js +1 -1
  106. package/dist/runtime/reply-prompt-copy.d.ts +7 -3
  107. package/dist/runtime/reply-prompt-copy.js +39 -14
  108. package/dist/server/api-routes.js +87 -83
  109. package/dist/server/static-server.js +1 -1
  110. package/dist/server/websocket-handler.js +163 -153
  111. package/dist/tool-availability.js +1 -1
  112. package/dist/tools/app-reminders.js +17 -4
  113. package/dist/tools/ctrl.js +5 -5
  114. package/dist/tools/os.js +16 -16
  115. package/dist/tools/pending-tellask-reminder.js +20 -14
  116. package/dist/tools/prompts/control/en/index.md +1 -1
  117. package/dist/tools/prompts/control/en/principles.md +8 -8
  118. package/dist/tools/prompts/control/en/scenarios.md +7 -7
  119. package/dist/tools/prompts/control/en/tools.md +7 -7
  120. package/dist/tools/prompts/control/zh/principles.md +4 -4
  121. package/dist/tools/prompts/control/zh/scenarios.md +5 -5
  122. package/dist/tools/prompts/control/zh/tools.md +3 -3
  123. package/dist/tools/prompts/team_memory/en/scenarios.md +1 -1
  124. package/dist/tools/prompts/team_memory/zh/scenarios.md +1 -1
  125. package/dist/tools/team_mgmt-manual.js +2 -2
  126. package/dist/tools/team_mgmt-mcp-manual.js +10 -0
  127. package/dist/tools/team_mgmt.js +4 -4
  128. package/dist/utils/taskdoc.js +12 -12
  129. package/package.json +3 -3
  130. package/webapp/dist/assets/{_basePickBy-BPJaiZdW.js → _basePickBy-B7M9Q0Fa.js} +3 -3
  131. package/webapp/dist/assets/_basePickBy-B7M9Q0Fa.js.map +1 -0
  132. package/webapp/dist/assets/{_baseUniq-BEetT15i.js → _baseUniq-DAeYoL6j.js} +2 -2
  133. package/webapp/dist/assets/_baseUniq-DAeYoL6j.js.map +1 -0
  134. package/webapp/dist/assets/{arc-Dm7Zf36f.js → arc-Bh4nDbNR.js} +2 -2
  135. package/webapp/dist/assets/arc-Bh4nDbNR.js.map +1 -0
  136. package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-BpTPtkuo.js → architectureDiagram-2XIMDMQ5-CxqmdsIm.js} +26 -8
  137. package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-CxqmdsIm.js.map +1 -0
  138. package/webapp/dist/assets/{blockDiagram-VD42YOAC-C8fLN0iu.js → blockDiagram-WCTKOSBZ-CxIWLtpt.js} +187 -170
  139. package/webapp/dist/assets/blockDiagram-WCTKOSBZ-CxIWLtpt.js.map +1 -0
  140. package/webapp/dist/assets/{c4Diagram-YG6GDRKO-BpPr62CH.js → c4Diagram-IC4MRINW-1qErOIgG.js} +4 -4
  141. package/webapp/dist/assets/c4Diagram-IC4MRINW-1qErOIgG.js.map +1 -0
  142. package/webapp/dist/assets/{channel-EMYoPjW3.js → channel-DkgZHNUe.js} +2 -2
  143. package/webapp/dist/assets/channel-DkgZHNUe.js.map +1 -0
  144. package/webapp/dist/assets/{chunk-4BX2VUAB-CefNtjWG.js → chunk-4BX2VUAB-BmdMbU9v.js} +2 -2
  145. package/webapp/dist/assets/chunk-4BX2VUAB-BmdMbU9v.js.map +1 -0
  146. package/webapp/dist/assets/{chunk-55IACEB6-C_X7T43V.js → chunk-55IACEB6-D6LDTDBy.js} +2 -2
  147. package/webapp/dist/assets/chunk-55IACEB6-D6LDTDBy.js.map +1 -0
  148. package/webapp/dist/assets/{chunk-FMBD7UC4-ORmtkrtS.js → chunk-FMBD7UC4-C-BdCe4C.js} +2 -2
  149. package/webapp/dist/assets/chunk-FMBD7UC4-C-BdCe4C.js.map +1 -0
  150. package/webapp/dist/assets/{chunk-TZMSLE5B-Gao4qrq7.js → chunk-JSJVCQXG-WA_BLIm9.js} +14 -6
  151. package/webapp/dist/assets/chunk-JSJVCQXG-WA_BLIm9.js.map +1 -0
  152. package/webapp/dist/assets/{chunk-QN33PNHL-LTAOVhWu.js → chunk-KX2RTZJC-CA7sDJO5.js} +2 -2
  153. package/webapp/dist/assets/chunk-KX2RTZJC-CA7sDJO5.js.map +1 -0
  154. package/webapp/dist/assets/{chunk-DI55MBZ5-CbvrsI_w.js → chunk-NQ4KR5QH-wlvxalE3.js} +9 -7
  155. package/webapp/dist/assets/chunk-NQ4KR5QH-wlvxalE3.js.map +1 -0
  156. package/webapp/dist/assets/{chunk-QZHKN3VN-ZoUM_4u5.js → chunk-QZHKN3VN-Bo1VMcph.js} +2 -2
  157. package/webapp/dist/assets/chunk-QZHKN3VN-Bo1VMcph.js.map +1 -0
  158. package/webapp/dist/assets/{chunk-B4BG7PRW-BRe3_2oA.js → chunk-WL4C6EOR-B-Pk44be.js} +171 -121
  159. package/webapp/dist/assets/chunk-WL4C6EOR-B-Pk44be.js.map +1 -0
  160. package/webapp/dist/assets/{classDiagram-2ON5EDUG-uha1vIGN.js → classDiagram-VBA2DB6C-BqKuyb49.js} +7 -6
  161. package/webapp/dist/assets/classDiagram-VBA2DB6C-BqKuyb49.js.map +1 -0
  162. package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-uha1vIGN.js → classDiagram-v2-RAHNMMFH-BqKuyb49.js} +7 -6
  163. package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-BqKuyb49.js.map +1 -0
  164. package/webapp/dist/assets/{clone-_9Ayb1Gp.js → clone-BX5z8WVZ.js} +2 -2
  165. package/webapp/dist/assets/clone-BX5z8WVZ.js.map +1 -0
  166. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-C8wDw3NY.js → cose-bilkent-S5V4N54A-B-s11SgN.js} +2 -2
  167. package/webapp/dist/assets/cose-bilkent-S5V4N54A-B-s11SgN.js.map +1 -0
  168. package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
  169. package/webapp/dist/assets/{dagre-6UL2VRFP-BUSeNot0.js → dagre-KLK3FWXG-DmQFV2qK.js} +7 -7
  170. package/webapp/dist/assets/dagre-KLK3FWXG-DmQFV2qK.js.map +1 -0
  171. package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
  172. package/webapp/dist/assets/{diagram-PSM6KHXK-CMZAksVC.js → diagram-E7M64L7V-QRaBfST8.js} +10 -10
  173. package/webapp/dist/assets/diagram-E7M64L7V-QRaBfST8.js.map +1 -0
  174. package/webapp/dist/assets/{diagram-QEK2KX5R-BQKoRtwy.js → diagram-IFDJBPK2-lrWn1Obo.js} +9 -8
  175. package/webapp/dist/assets/diagram-IFDJBPK2-lrWn1Obo.js.map +1 -0
  176. package/webapp/dist/assets/{diagram-S2PKOQOG-DjMG97kd.js → diagram-P4PSJMXO-sTU7Hh-Y.js} +8 -8
  177. package/webapp/dist/assets/diagram-P4PSJMXO-sTU7Hh-Y.js.map +1 -0
  178. package/webapp/dist/assets/{erDiagram-Q2GNP2WA-BujwA137.js → erDiagram-INFDFZHY-Cx6jc9Wq.js} +96 -75
  179. package/webapp/dist/assets/erDiagram-INFDFZHY-Cx6jc9Wq.js.map +1 -0
  180. package/webapp/dist/assets/{flowDiagram-NV44I4VS-DgwPjg4y.js → flowDiagram-PKNHOUZH-DfGI49Dz.js} +98 -81
  181. package/webapp/dist/assets/flowDiagram-PKNHOUZH-DfGI49Dz.js.map +1 -0
  182. package/webapp/dist/assets/{ganttDiagram-JELNMOA3-Db2ykf3E.js → ganttDiagram-A5KZAMGK-nrcHWWaM.js} +28 -3
  183. package/webapp/dist/assets/ganttDiagram-A5KZAMGK-nrcHWWaM.js.map +1 -0
  184. package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-D_gSifkv.js → gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js} +38 -46
  185. package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js.map +1 -0
  186. package/webapp/dist/assets/graph-R5G-y8tB.js +782 -0
  187. package/webapp/dist/assets/graph-R5G-y8tB.js.map +1 -0
  188. package/webapp/dist/assets/{index-DLajsIDJ.js → index--fy89xGh.js} +2214 -2023
  189. package/webapp/dist/assets/index--fy89xGh.js.map +1 -0
  190. package/webapp/dist/assets/{index-xvYYeHuy.css → index-DZFkLLVz.css} +18 -10
  191. package/webapp/dist/assets/{infoDiagram-HS3SLOUP-BDba5pKs.js → infoDiagram-LFFYTUFH-PIoZHr7s.js} +7 -7
  192. package/webapp/dist/assets/infoDiagram-LFFYTUFH-PIoZHr7s.js.map +1 -0
  193. package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
  194. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-oCM-LYk1.js +966 -0
  195. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-oCM-LYk1.js.map +1 -0
  196. package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-CmJAbmlm.js → journeyDiagram-4ABVD52K-C2qidjQ5.js} +5 -5
  197. package/webapp/dist/assets/journeyDiagram-4ABVD52K-C2qidjQ5.js.map +1 -0
  198. package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-DxQeBTDk.js → kanban-definition-K7BYSVSG-Du0TC8WS.js} +5 -3
  199. package/webapp/dist/assets/kanban-definition-K7BYSVSG-Du0TC8WS.js.map +1 -0
  200. package/webapp/dist/assets/{layout-DteV_yE8.js → layout-VmEo1OEB.js} +5 -5
  201. package/webapp/dist/assets/layout-VmEo1OEB.js.map +1 -0
  202. package/webapp/dist/assets/{linear-zItbPrND.js → linear-B662YHAc.js} +2 -2
  203. package/webapp/dist/assets/linear-B662YHAc.js.map +1 -0
  204. package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-BJXI7UqO.js → mindmap-definition-YRQLILUH-D7arZj95.js} +7 -5
  205. package/webapp/dist/assets/mindmap-definition-YRQLILUH-D7arZj95.js.map +1 -0
  206. package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
  207. package/webapp/dist/assets/{pieDiagram-ADFJNKIX-BpM-aH2p.js → pieDiagram-SKSYHLDU-DvjPP4PA.js} +8 -8
  208. package/webapp/dist/assets/pieDiagram-SKSYHLDU-DvjPP4PA.js.map +1 -0
  209. package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-NXdIpA15.js → quadrantDiagram-337W2JSQ-B_JUGMj_.js} +3 -3
  210. package/webapp/dist/assets/quadrantDiagram-337W2JSQ-B_JUGMj_.js.map +1 -0
  211. package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-D1AICAA0.js → requirementDiagram-Z7DCOOCP-DF0mpvE3.js} +16 -6
  212. package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-DF0mpvE3.js.map +1 -0
  213. package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-WiReDPfo.js → sankeyDiagram-WA2Y5GQK-CoXlxv00.js} +2 -2
  214. package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-CoXlxv00.js.map +1 -0
  215. package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-Cw76oP8t.js → sequenceDiagram-2WXFIKYE-DYqT5Pg7.js} +601 -201
  216. package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-DYqT5Pg7.js.map +1 -0
  217. package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-QjCeRczs.js → stateDiagram-RAJIS63D-D9b1mN8-.js} +9 -9
  218. package/webapp/dist/assets/stateDiagram-RAJIS63D-D9b1mN8-.js.map +1 -0
  219. package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-IClqxQ4s.js → stateDiagram-v2-FVOUBMTO-DNzgudL_.js} +5 -5
  220. package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-DNzgudL_.js.map +1 -0
  221. package/webapp/dist/assets/{timeline-definition-IT6M3QCI-BfyfTY7m.js → timeline-definition-YZTLITO2-CkyKUY7A.js} +3 -3
  222. package/webapp/dist/assets/timeline-definition-YZTLITO2-CkyKUY7A.js.map +1 -0
  223. package/webapp/dist/assets/{treemap-GDKQZRPO-C5MiL6--.js → treemap-KZPCXAKY-CZd09kF-.js} +37 -24
  224. package/webapp/dist/assets/treemap-KZPCXAKY-CZd09kF-.js.map +1 -0
  225. package/webapp/dist/assets/vennDiagram-LZ73GAT5-BxVF5Olo.js +2487 -0
  226. package/webapp/dist/assets/vennDiagram-LZ73GAT5-BxVF5Olo.js.map +1 -0
  227. package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-ybaJrSry.js → xychartDiagram-JWTSCODW-BRwRloPc.js} +4 -4
  228. package/webapp/dist/assets/xychartDiagram-JWTSCODW-BRwRloPc.js.map +1 -0
  229. package/webapp/dist/index.html +2 -2
  230. package/dist/docs/issues/global-dialog-event-broadcaster-missing.md +0 -128
  231. package/dist/llm/kernel-driver/subdialog-txn.d.ts +0 -8
  232. package/webapp/dist/assets/_basePickBy-BPJaiZdW.js.map +0 -1
  233. package/webapp/dist/assets/_baseUniq-BEetT15i.js.map +0 -1
  234. package/webapp/dist/assets/arc-Dm7Zf36f.js.map +0 -1
  235. package/webapp/dist/assets/architectureDiagram-VXUJARFQ-BpTPtkuo.js.map +0 -1
  236. package/webapp/dist/assets/blockDiagram-VD42YOAC-C8fLN0iu.js.map +0 -1
  237. package/webapp/dist/assets/c4Diagram-YG6GDRKO-BpPr62CH.js.map +0 -1
  238. package/webapp/dist/assets/channel-EMYoPjW3.js.map +0 -1
  239. package/webapp/dist/assets/chunk-4BX2VUAB-CefNtjWG.js.map +0 -1
  240. package/webapp/dist/assets/chunk-55IACEB6-C_X7T43V.js.map +0 -1
  241. package/webapp/dist/assets/chunk-B4BG7PRW-BRe3_2oA.js.map +0 -1
  242. package/webapp/dist/assets/chunk-DI55MBZ5-CbvrsI_w.js.map +0 -1
  243. package/webapp/dist/assets/chunk-FMBD7UC4-ORmtkrtS.js.map +0 -1
  244. package/webapp/dist/assets/chunk-QN33PNHL-LTAOVhWu.js.map +0 -1
  245. package/webapp/dist/assets/chunk-QZHKN3VN-ZoUM_4u5.js.map +0 -1
  246. package/webapp/dist/assets/chunk-TZMSLE5B-Gao4qrq7.js.map +0 -1
  247. package/webapp/dist/assets/classDiagram-2ON5EDUG-uha1vIGN.js.map +0 -1
  248. package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-uha1vIGN.js.map +0 -1
  249. package/webapp/dist/assets/clone-_9Ayb1Gp.js.map +0 -1
  250. package/webapp/dist/assets/cose-bilkent-S5V4N54A-C8wDw3NY.js.map +0 -1
  251. package/webapp/dist/assets/dagre-6UL2VRFP-BUSeNot0.js.map +0 -1
  252. package/webapp/dist/assets/diagram-PSM6KHXK-CMZAksVC.js.map +0 -1
  253. package/webapp/dist/assets/diagram-QEK2KX5R-BQKoRtwy.js.map +0 -1
  254. package/webapp/dist/assets/diagram-S2PKOQOG-DjMG97kd.js.map +0 -1
  255. package/webapp/dist/assets/erDiagram-Q2GNP2WA-BujwA137.js.map +0 -1
  256. package/webapp/dist/assets/flowDiagram-NV44I4VS-DgwPjg4y.js.map +0 -1
  257. package/webapp/dist/assets/ganttDiagram-JELNMOA3-Db2ykf3E.js.map +0 -1
  258. package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-D_gSifkv.js.map +0 -1
  259. package/webapp/dist/assets/graph-BHjCU5xP.js +0 -425
  260. package/webapp/dist/assets/graph-BHjCU5xP.js.map +0 -1
  261. package/webapp/dist/assets/index-DLajsIDJ.js.map +0 -1
  262. package/webapp/dist/assets/infoDiagram-HS3SLOUP-BDba5pKs.js.map +0 -1
  263. package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-CmJAbmlm.js.map +0 -1
  264. package/webapp/dist/assets/kanban-definition-3W4ZIXB7-DxQeBTDk.js.map +0 -1
  265. package/webapp/dist/assets/layout-DteV_yE8.js.map +0 -1
  266. package/webapp/dist/assets/linear-zItbPrND.js.map +0 -1
  267. package/webapp/dist/assets/mindmap-definition-VGOIOE7T-BJXI7UqO.js.map +0 -1
  268. package/webapp/dist/assets/pieDiagram-ADFJNKIX-BpM-aH2p.js.map +0 -1
  269. package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-NXdIpA15.js.map +0 -1
  270. package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-D1AICAA0.js.map +0 -1
  271. package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-WiReDPfo.js.map +0 -1
  272. package/webapp/dist/assets/sequenceDiagram-WL72ISMW-Cw76oP8t.js.map +0 -1
  273. package/webapp/dist/assets/stateDiagram-FKZM4ZOC-QjCeRczs.js.map +0 -1
  274. package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-IClqxQ4s.js.map +0 -1
  275. package/webapp/dist/assets/timeline-definition-IT6M3QCI-BfyfTY7m.js.map +0 -1
  276. package/webapp/dist/assets/treemap-GDKQZRPO-C5MiL6--.js.map +0 -1
  277. package/webapp/dist/assets/xychartDiagram-PRI3JC2R-ybaJrSry.js.map +0 -1
@@ -11,10 +11,10 @@
11
11
  3. [三类队友诉请分类](#三类队友诉请分类)
12
12
  4. [核心机制](#核心机制)
13
13
  5. [Q4H:向人请示](#q4h向人请示)
14
- 6. [对话层级与子对话](#对话层级与子对话)
14
+ 6. [对话关系与支线对话](#对话关系与支线对话)
15
15
  7. [思维清晰工具](#思维清晰工具)
16
16
  8. [提醒管理](#提醒管理)
17
- 9. [子对话注册表](#子对话注册表)
17
+ 9. [支线对话注册表](#支线对话注册表)
18
18
  10. [技术架构](#技术架构)
19
19
  11. [对话管理](#对话管理)
20
20
  12. [内存管理](#内存管理)
@@ -27,54 +27,54 @@
27
27
  ## 术语
28
28
 
29
29
  本章定义本文档中使用的面向实现的术语。
30
- 关于双语/面向用户的命名约定(主线对话/支线对话;诉请者对话/被诉请者对话),请参阅 [`dominds-terminology.md`](./dominds-terminology.md)。
30
+ 关于双语/面向用户的命名约定(主线对话/支线对话;诉请者/被诉请者),请参阅 [`dominds-terminology.md`](./dominds-terminology.md)。
31
31
  关于差遣牒任务包结构和封装规则,请参阅 [`encapsulated-taskdoc.zh.md`](./encapsulated-taskdoc.zh.md)。
32
32
 
33
- ### 上位对话
33
+ ### askerDialog(诉请者)
34
34
 
35
- **上位对话**是层级对话关系中的上位对话。它编排和管理子对话,提供上下文、目标和指导,同时接收来自子对话的结果、问题和升级。上位对话维护整体任务上下文,并决定何时不再需要子对话。
35
+ **askerDialog(诉请者)**是在实现语境中当前拥有某个支线 assignment 或 reply obligation 的对话。它可以是主线对话,也可以是另一个支线对话;这是诉请/回复关系,不天然表示层级上位。
36
36
 
37
- 注意:**上位对话**是层级结构里的父对话,并不等同于**诉请者对话**(本次诉请的发起者)。TYPE A(`tellaskBack`)时,诉请者对话就是直接上位对话;TYPE B/C 时,诉请者对话可能是不同的对话。
37
+ 注意:**askerDialog** 不是结构诉请者的同义词。TYPE A(`tellaskBack`)时,诉请者就是直接 askerDialog;TYPE B/C 时,诉请者可能是不同的对话。
38
38
 
39
- 上位对话可以在子对话执行期间接收来自子对话的**回问诉请**。当子对话需要指导或额外上下文时,它可以用 `tellaskBack({ tellaskContent: "..." })` 回问,并将响应反馈到子对话上下文。
39
+ askerDialog 可以在执行期间接收来自当前需向它回复的支线对话的**回问诉请**。当支线对话需要指导或额外上下文时,它可以用 `tellaskBack({ tellaskContent: "..." })` 回问,并将响应反馈到支线对话上下文。
40
40
 
41
- ### 子对话
41
+ ### SideDialog(支线对话)
42
42
 
43
- **子对话** 是由上位对话生成的专门对话,用于处理特定子任务。子对话使用新的上下文操作,专注于定向目标,同时保持与上位对话的通信链接。
43
+ **sideDialog(支线对话)** 是由 askerDialog 生成的专门对话,用于处理特定支线任务。支线对话使用新的上下文操作,专注于定向目标,同时保持与 askerDialog 的通信链接。
44
44
 
45
- **回问诉请**:子对话可以在任务执行期间向**诉请者对话**回问澄清。TYPE A 中诉请者对话就是直接上位对话。此机制允许子对话在保持自身上下文和进度的同时提问并接收指导。
45
+ **回问诉请**:支线对话可以在任务执行期间向**诉请者**回问澄清。TYPE A 中诉请者就是直接 askerDialog。此机制允许支线对话在保持自身上下文和进度的同时提问并接收指导。
46
46
 
47
- ### 诉请者对话 / 被诉请者对话(调用角色)
47
+ ### 诉请者 / 被诉请者(调用角色)
48
48
 
49
- **诉请者对话**是发起本次诉请的对话(caller),**被诉请者对话**是处理本次诉请的对话(当前对话)。这是**调用角色**,不是层级关系:
49
+ **诉请者**是发起本次诉请的一侧,**被诉请者**是处理本次诉请的一侧(当前对话)。这是 **Tellask 角色**,不是层级关系:
50
50
 
51
- - TYPE A(`tellaskBack`)时,诉请者对话是直接上位对话。
52
- - TYPE B/C 时,诉请者对话可能是主线对话,也可能是其他支线对话。
53
- - 回贴会路由到 `assignmentFromSup` 中记录的**当前诉请者对话**。
51
+ - TYPE A(`tellaskBack`)时,诉请者是直接 askerDialog。
52
+ - TYPE B/C 时,诉请者可能是主线对话,也可能是其他支线对话。
53
+ - 回贴会路由到 `assignmentFromAsker` 中记录的**当前诉请者**。
54
54
 
55
- ### 主对话
55
+ ### 主线对话
56
56
 
57
- **主对话** (也称为 **根对话**) 是对话层级中的顶级对话,没有上位对话关系。它作为任务执行的主要入口点,可以生成多级子对话。这些术语在系统中可互换使用。
57
+ **主线对话**是没有 askerDialog 关系的顶层对话。它作为任务执行的主要入口点,可以生成多级支线对话。
58
58
 
59
59
  ### 向人请示(Q4H)
60
60
 
61
- **Q4H** 是由对话(主对话或子对话)提出的待处理问题,需要人工输入才能继续。Q4H 被索引在对话的 `q4h.yaml` 文件中(一个索引,不是真理之源),并由 `clear_mind` 操作清除。实际的问题内容存储在对话的对话消息中,其中记录了 `askHuman({ tellaskContent: "..." })` 诉请。
61
+ **Q4H** 是由对话(主线对话或支线对话)提出的待处理问题,需要人工输入才能继续。Q4H 被索引在对话的 `q4h.yaml` 文件中(一个索引,不是真理之源),并由 `clear_mind` 操作清除。实际的问题内容存储在对话的对话消息中,其中记录了 `askHuman({ tellaskContent: "..." })` 诉请。
62
62
 
63
- ### 子对话索引 (subdlg.yaml)
63
+ ### 支线对话索引 (subdlg.yaml)
64
64
 
65
- **subdlg.yaml** 文件索引上位对话正在等待的待处理子对话。与 `q4h.yaml` 类似,它是一个索引文件,不是真理之源:
65
+ **subdlg.yaml** 文件索引诉请者正在等待的待处理支线对话。与 `q4h.yaml` 类似,它是一个索引文件,不是真理之源:
66
66
 
67
- - 索引跟踪父对话正在等待哪些子对话 ID
68
- - 实际的子对话状态从磁盘 (done/ 目录) 验证
67
+ - 索引跟踪诉请者正在等待哪些支线对话 ID
68
+ - 实际的支线对话状态从磁盘 (done/ 目录) 验证
69
69
  - 用于后端协程的崩溃恢复和自动重启
70
70
 
71
- ### 子对话注册表
71
+ ### 支线对话注册表
72
72
 
73
- **子对话注册表** 是根对话作用域的 Map,维护对已注册子对话的持久引用。注册表使用 `agentId!sessionSlug` 作为其键格式。当根完成时,它随根移动到 `done/`,并在根加载时通过扫描 done/ 子对话 YAML 重建。若某个支线对话被宣布卡死,其对应的 TYPE B 注册表条目会被移除,以便后续可用同一 `agentId!sessionSlug` 创建全新的支线对话。
73
+ **支线对话注册表** 是主线对话作用域的 Map,维护对已注册支线对话的持久引用。注册表使用 `agentId!sessionSlug` 作为其键格式。当主线完成时,它随主线移动到 `done/`,并在主线加载时通过扫描 done/ 支线对话 YAML 重建。若某个支线对话被宣布卡死,其对应的 TYPE B 注册表条目会被移除,以便后续可用同一 `agentId!sessionSlug` 创建全新的支线对话。
74
74
 
75
75
  ### 队友诉请
76
76
 
77
- **队友诉请** 是 Dominds 特定的语法,触发与另一个作为子对话的智能体的通信。队友诉请有三种不同模式,具有不同语义(见第 3 节)。
77
+ **队友诉请** 是 Dominds 特定的语法,触发与另一个作为支线对话的智能体的通信。队友诉请有三种不同模式,具有不同语义(见第 3 节)。
78
78
 
79
79
  **诉请块结构**(另见 [`dominds-terminology.md`](./dominds-terminology.md)):
80
80
 
@@ -90,18 +90,18 @@
90
90
 
91
91
  对话驱动是一个**唯一的后端算法**。前端/客户端从不驱动对话。所有对话状态转换、恢复逻辑和生成循环都在后端协程中完全执行。前端只订阅发布频道 (PubChan) 以进行实时 UI 更新。
92
92
 
93
- ### 注册表层级
93
+ ### 注册表结构
94
94
 
95
95
  系统维护三个级别的注册表用于对话管理:
96
96
 
97
97
  **全局注册表(服务器作用域)**
98
- `rootId → RootDialog` 对象的服务器范围映射。这是所有活动根对话的单一真理之源。后端协程扫描此注册表以找到需要驱动的对话。
98
+ `rootId → MainDialog` 对象的服务器范围映射。这是所有活动主线对话的单一真理之源。后端协程扫描此注册表以找到需要驱动的对话。
99
99
 
100
- **本地注册表(每个根对话)**
101
- 每个根的 `selfId → Dialog` 对象映射。此注册表包含根对话本身以及所有已加载的子对话,支持在层级内对任何对话进行 O(1) 查找。
100
+ **本地注册表(每个主线对话)**
101
+ 每个主线的 `selfId → Dialog` 对象映射。此注册表包含主线对话本身以及所有已加载的支线对话,支持在同一对话树内对任何对话进行 O(1) 查找。
102
102
 
103
- **子对话注册表(每个根对话)**
104
- 每个根的 `agentId!sessionSlug → Subdialog` 对象映射。此注册表跟踪用于在多次交互中恢复的 TYPE B 已注册子对话。TYPE C 瞬态子对话永远不会被注册。
103
+ **支线对话注册表(每个主线对话)**
104
+ 每个主线的 `agentId!sessionSlug → SideDialog` 对象映射。此注册表跟踪用于在多次交互中恢复的 TYPE B 已注册支线对话。TYPE C 瞬态支线对话永远不会被注册。
105
105
 
106
106
  ### 每对话互斥锁
107
107
 
@@ -111,14 +111,14 @@
111
111
 
112
112
  后端协程使用以下模式驱动对话:
113
113
 
114
- 1. 扫描全局注册表以识别需要驱动的根对话
115
- 2. 对于每个候选者,检查恢复条件(Q4H 已回答,子对话完成已接收)
114
+ 1. 扫描全局注册表以识别需要驱动的主线对话
115
+ 2. 对于每个候选者,检查恢复条件(Q4H 已回答,支线对话完成已接收)
116
116
  3. 在驱动之前获取对话的互斥锁
117
117
  4. 执行生成循环直到挂起点或完成
118
118
  5. 释放互斥锁
119
119
  6. 将所有状态变更持久化到存储
120
120
 
121
- 驱动循环持续进行,直到对话挂起(等待 Q4H 或子对话)或完成。当条件变化时(用户回答 Q4H,子对话完成),后端通过存储检查检测这些变化并自动恢复驱动。
121
+ 驱动循环持续进行,直到对话挂起(等待 Q4H 或支线对话)或完成。当条件变化时(用户回答 Q4H,支线对话完成),后端通过存储检查检测这些变化并自动恢复驱动。
122
122
 
123
123
  ### 前端集成
124
124
 
@@ -133,7 +133,7 @@
133
133
 
134
134
  ### 全局对话事件广播器
135
135
 
136
- 有一类对话事件属于 rtws 全局状态,而不是某个对话自己的局部流,包括 `new_q4h_asked`、`q4h_answered`、`subdialog_created_evt`、`dlg_touched_evt`。
136
+ 有一类对话事件属于 rtws 全局状态,而不是某个对话自己的局部流,包括 `new_q4h_asked`、`q4h_answered`、`sideDialog_created_evt`、`dlg_touched_evt`。
137
137
 
138
138
  这些事件要求 runtime 在任何对话驱动逻辑开始前,就先完成**全局对话事件广播器**的 bootstrap。它是必要基础设施,不是可选优化:
139
139
 
@@ -148,8 +148,8 @@
148
148
  对话状态在关键点持久化到存储:
149
149
 
150
150
  - 每次消息生成后
151
- - 挂起时(Q4H 提出,子对话创建)
152
- - 恢复时(Q4H 已回答,子对话完成)
151
+ - 挂起时(Q4H 提出,支线对话创建)
152
+ - 恢复时(Q4H 已回答,支线对话完成)
153
153
  - 完成时
154
154
 
155
155
  这确保了崩溃恢复,并使后端能够从任何持久化状态恢复,而不依赖于前端状态。
@@ -176,7 +176,7 @@
176
176
  - **情况 1:当前对话没有回复义务**
177
177
  这时若也没有其他 blocker,就应直接继续 drive;若已回到普通待用户输入态,则 `resume_dialog` 不应再被视为可继续。
178
178
  - **情况 2:当前对话仍有回复义务,但处于 suspend 状态**
179
- 常见于仍在等待 Q4H / pending subdialogs。此时 `Continue` 应退出插话 paused projection,并恢复成真实的 `blocked`。
179
+ 常见于仍在等待 Q4H / pending sideDialogs。此时 `Continue` 应退出插话 paused projection,并恢复成真实的 `blocked`。
180
180
  - **情况 3:当前对话仍有回复义务,但已不再 suspend,具备继续推进条件**
181
181
  例如 blocker 已消失,或存在允许继续的 queued prompt。此时 `Continue` 不应先落一个中间 `blocked/idle` 占位态,而应直接继续 drive。
182
182
 
@@ -211,38 +211,36 @@
211
211
 
212
212
  ```mermaid
213
213
  flowchart TD
214
- M["LLM 发出 tellaskSessionless(...)"] --> Q{"这是子对话回问其直接上位对话(TYPE A 的诉请者对话)吗?"}
214
+ M["LLM 发出 tellaskSessionless(...)"] --> Q{"这是支线对话回问其直接 askerDialog(TYPE A 的诉请者)吗?"}
215
215
  Q -- 是 --> A["TYPE A:回问诉请<br/>主要:tellaskBack(...)(无 sessionSlug)"]
216
216
  Q -- 否 --> T{是否存在 sessionSlug?}
217
- T -- 是 --> B["TYPE B:已注册子对话诉请<br/>(长线诉请)<br/>tellask(..., sessionSlug=...)"]
218
- T -- 否 --> C["TYPE C:瞬态子对话诉请<br/>(一次性诉请)<br/>tellaskSessionless(...)"]
217
+ T -- 是 --> B["TYPE B:已注册支线对话诉请<br/>(长线诉请)<br/>tellask(..., sessionSlug=...)"]
218
+ T -- 否 --> C["TYPE C:瞬态支线对话诉请<br/>(一次性诉请)<br/>tellaskSessionless(...)"]
219
219
  ```
220
220
 
221
221
  ### TYPE A:回问诉请
222
222
 
223
223
  **主要语法**:`tellaskBack({ tellaskContent: "..." })`(无 `sessionSlug`)— `tellaskBack({ tellaskContent: "..." }) sessionSlug ...` 是**语法错误**
224
224
 
225
- **可容忍的回退**:`tellaskBack({ tellaskContent: "..." })`(无 `sessionSlug`)
226
-
227
225
  **行为**:
228
226
 
229
- 1. 当前子对话**挂起**
230
- 2. 驱动程序切换到驱动**诉请者对话**(TYPE A 中为直接上位对话;使用 `subdialog.supdialog` 引用)
231
- 3. 诉请者对话的响应流回子对话
232
- 4. 子对话**恢复**,诉请者对话的响应在上下文中
227
+ 1. 当前支线对话**挂起**
228
+ 2. 驱动程序切换到驱动**诉请者**(TYPE A 中为直接 askerDialog;使用 `sideDialog.askerDialog` 引用)
229
+ 3. 诉请者的响应流回支线对话
230
+ 4. 支线对话**恢复**,诉请者的响应在上下文中
233
231
 
234
232
  **关键特征**:
235
233
 
236
- - 使用 `subdialog.supdialog` 引用(无注册表查找)
237
- - 无需注册 — 上位对话关系是固有的
238
- - 上位对话始终是层级中的直接父级(TYPE A 的诉请者对话)
234
+ - 使用 `sideDialog.askerDialog` 引用(无注册表查找)
235
+ - 无需注册 — 诉请者关系是固有的
236
+ - TYPE A 始终指向直接 askerDialog(本次诉请的诉请者)
239
237
  - `tellaskBack({ tellaskContent: "..." })` 是**规范**的 TYPE A 语法:它始终路由到“诉请者”(发起本次诉请的对话),避免自行猜测。
240
238
 
241
239
  **支线交付规则(规范)**:
242
240
 
243
- - 只有当所有目标完成时,支线对话才可直接正常回复诉请者对话。
241
+ - 只有当所有目标完成时,支线对话才可直接正常回复诉请者。
244
242
  - 若目标尚未完成,不要默认直接 `tellaskBack`;应先按团队规程 / SOP / 职责卡判断能否明确负责人,若能明确且属于执行性处理,直接 `tellask` / `tellaskSessionless` 对应负责人。
245
- - 只有当必须由上游诉请者补充需求、澄清目标、做业务裁决、确认验收口径、提供缺失输入,或现有规程无法明确判责时,才使用 `tellaskBack({ tellaskContent: "..." })` 回问诉请者对话再继续。
243
+ - 只有当必须由诉请者补充需求、澄清目标、做业务裁决、确认验收口径、提供缺失输入,或现有规程无法明确判责时,才使用 `tellaskBack({ tellaskContent: "..." })` 回问诉请者再继续。
246
244
  - **FBR 例外**:FBR 支线对话禁止一切 tellask(包括 `tellaskBack` / `tellask` / `tellaskSessionless` / `askHuman`),只能列出缺口与阻塞原因并直接回复。
247
245
 
248
246
  **跨对话传递与标记(强制)**:
@@ -263,13 +261,13 @@ flowchart TD
263
261
 
264
262
  **协议澄清**:
265
263
 
266
- - 需要回问上游时必须真实调用 `tellaskBack({ tellaskContent: "..." })`;但在此之前应先判断是否已有团队规程可直接判责到其他负责人。不得发送普通文本中间汇报。
264
+ - 需要回问诉请者时必须真实调用 `tellaskBack({ tellaskContent: "..." })`;但在此之前应先判断是否已有团队规程可直接判责到其他负责人。不得发送普通文本中间汇报。
267
265
 
268
266
  **示例**:
269
267
 
270
268
  ```
271
269
  当前对话:sub-001(agentId: "backend-dev")
272
- 父上位对话:"orchestrator"(agentId)
270
+ 诉请者:"orchestrator"(agentId)
273
271
 
274
272
  LLM 发出:tellaskSessionless({ targetAgentId: "orchestrator", tellaskContent: "..." }) 我应该如何处理数据库迁移?
275
273
 
@@ -280,7 +278,7 @@ LLM 发出:tellaskSessionless({ targetAgentId: "orchestrator", tellaskContent:
280
278
  - sub-001 恢复,Orchestrator 的响应在上下文中
281
279
  ```
282
280
 
283
- ### TYPE B:已注册子对话诉请(长线诉请)
281
+ ### TYPE B:已注册支线对话诉请(长线诉请)
284
282
 
285
283
  **语法**:`tellask({ targetAgentId: "<anyAgentId>", sessionSlug: "<tellaskSession>", tellaskContent: "..." })`(注意 `sessionSlug` 前的空格)
286
284
 
@@ -296,50 +294,50 @@ LLM 发出:tellaskSessionless({ targetAgentId: "orchestrator", tellaskContent:
296
294
 
297
295
  **行为**:
298
296
 
299
- 1. 检查注册表中是否存在键为 `agentId!sessionSlug` 的现有子对话
300
- 2. **如果存在**:恢复已注册的子对话
301
- 3. **如果不存在**:创建新的子对话并使用键 `agentId!sessionSlug` 注册它
302
- 4. 父对话在子对话运行时**挂起**
303
- 5. 子对话的响应流回父级
304
- 6. 父级**恢复**,子对话的响应在上下文中
297
+ 1. 检查注册表中是否存在键为 `agentId!sessionSlug` 的现有支线对话
298
+ 2. **如果存在**:恢复已注册的支线对话
299
+ 3. **如果不存在**:创建新的支线对话并使用键 `agentId!sessionSlug` 注册它
300
+ 4. 诉请者在支线对话运行时**挂起**
301
+ 5. 支线对话的响应流回诉请者
302
+ 6. 诉请者**恢复**,支线对话的响应在上下文中
305
303
 
306
- **当前调用者跟踪(对复用很重要):**
304
+ **当前诉请者跟踪(对复用很重要):**
307
305
 
308
- 当已注册的子对话再次收到诉请(相同的 `agentId!sessionSlug`)时,调用者可能是**不同的对话**(根对话或其他支线对话)。在每次 TYPE B 诉请时,子对话的元数据都会更新为:
306
+ 当已注册的支线对话再次收到诉请(相同的 `agentId!sessionSlug`)时,诉请者可能是**不同的对话**(主线对话或其他支线对话)。在每次 TYPE B 诉请时,支线对话的元数据都会更新为:
309
307
 
310
- - **当前调用者对话 ID**(这样响应就会路由回*最新*的调用者)
308
+ - **当前诉请者 ID**(这样响应就会路由回*最新*的诉请者)
311
309
  - **诉请信息**(标题/正文、来源角色、来源成员、callId)
312
310
 
313
- 这使得 TYPE B 子对话可以在多个诉请站点复用,而不会丢失正确的响应路由。
311
+ 这使得 TYPE B 支线对话可以在多个诉请站点复用,而不会丢失正确的响应路由。
314
312
 
315
313
  **恢复时的诉请上下文**:
316
314
 
317
- - 在每次 TYPE B 诉请(新的或恢复的)时,父级提供的 `mentionList`/`tellaskContent`
318
- 在驱动子对话之前作为新用户消息追加到子对话中。
319
- 这确保子对话在每次诉请时都能收到最新的请求上下文。
315
+ - 在每次 TYPE B 诉请(新的或恢复的)时,诉请者提供的 `mentionList`/`tellaskContent`
316
+ 在驱动支线对话之前作为新用户消息追加到支线对话中。
317
+ 这确保支线对话在每次诉请时都能收到最新的请求上下文。
320
318
  - 系统注入的恢复提示仅用于上下文,**不会被解析**为队友诉请或工具调用。
321
319
 
322
320
  **关键特征**:
323
321
 
324
322
  - 每次诉请都会执行注册表查找
325
- - 支持**恢复**先前的子对话
326
- - 已注册的子对话在正常流程中会保留;若支线被宣布卡死,其条目会从注册表移除
327
- - 注册表是根对话作用域的(子对话无法访问)
323
+ - 支持**恢复**先前的支线对话
324
+ - 已注册的支线对话在正常流程中会保留;若支线被宣布卡死,其条目会从注册表移除
325
+ - 注册表是主线对话作用域的(支线对话无法访问)
328
326
 
329
327
  **示例**:
330
328
 
331
329
  ```
332
- 根对话:orchestrator
330
+ 主线对话:orchestrator
333
331
  注册表:{}(空)
334
332
 
335
333
  LLM 发出:tellask({ targetAgentId: "researcher", sessionSlug: "market-analysis", tellaskContent: "..." })
336
334
 
337
335
  结果(第一次调用):
338
336
  - 注册表查找:不存在 "researcher!market-analysis"
339
- - 创建新的子对话 "researcher!market-analysis"
340
- - 在根的注册表中注册它
337
+ - 创建新的支线对话 "researcher!market-analysis"
338
+ - 在主线的注册表中注册它
341
339
  - orchestrator 挂起
342
- - 驱动 researcher 子对话
340
+ - 驱动 researcher 支线对话
343
341
  - 响应流回 orchestrator
344
342
  - orchestrator 恢复
345
343
 
@@ -347,41 +345,41 @@ LLM 再次发出:tellask({ targetAgentId: "researcher", sessionSlug: "market-a
347
345
 
348
346
  结果(第二次调用):
349
347
  - 注册表查找:"researcher!market-analysis" 存在
350
- - 恢复现有的子对话
348
+ - 恢复现有的支线对话
351
349
  - orchestrator 挂起
352
- - 从离开的地方继续驱动现有的 researcher 子对话
350
+ - 从离开的地方继续驱动现有的 researcher 支线对话
353
351
  - 响应流回 orchestrator
354
352
  - orchestrator 恢复
355
353
  ```
356
354
 
357
- ### TYPE C:瞬态子对话诉请(一次性诉请)
355
+ ### TYPE C:瞬态支线对话诉请(一次性诉请)
358
356
 
359
- **语法**:`tellaskSessionless({ targetAgentId: "<nonSupdialogAgentId>", tellaskContent: "..." })`(无 `sessionSlug`)
357
+ **语法**:`tellaskSessionless({ targetAgentId: "<nonAskerDialogAgentId>", tellaskContent: "..." })`(无 `sessionSlug`)
360
358
 
361
359
  **扪心自问 (FBR) 自调用语法(默认;最常见)**:`freshBootsReasoning({ tellaskContent: "..." })`
362
360
 
363
- - `freshBootsReasoning({ tellaskContent: "..." })` 指向当前对话的 agentId,并创建一条路由到同一 agentId 的**新的临时子对话**。
361
+ - `freshBootsReasoning({ tellaskContent: "..." })` 指向当前对话的 agentId,并创建一条路由到同一 agentId 的**新的临时支线对话**。
364
362
  - 由 `freshBootsReasoning({ tellaskContent: "..." })` 创建的支线对话属于 FBR,并以更严格的“无工具”策略驱动;详见 [`fbr.zh.md`](./fbr.zh.md)。
365
363
  - 对于大多数扪心自问 会话使用此方式:隔离单个子问题,产生答案,然后返回。
366
364
 
367
365
  **行为**:
368
366
 
369
367
  1. 当前对话**挂起**
370
- 2. 使用指定的 agentId 创建**新的子对话**
371
- 3. 驱动新的子对话:
372
- - 一般 TYPE C 子对话是“完整能力”的(可上位调用、队友诉请、按配置使用工具)。
368
+ 2. 使用指定的 agentId 创建**新的支线对话**
369
+ 3. 驱动新的支线对话:
370
+ - 一般 TYPE C 支线对话是“完整能力”的(可回问诉请者、队友诉请、按配置使用工具)。
373
371
  - `freshBootsReasoning({ tellaskContent: "..." })` 属于 FBR 特例:无工具、禁止任何诉请(见 `fbr.zh.md`)。
374
- 4. 子对话的响应流回父级
375
- 5. 父级**恢复**,子对话的响应在上下文中
372
+ 4. 支线对话的响应流回诉请者
373
+ 5. 诉请者**恢复**,支线对话的响应在上下文中
376
374
 
377
375
  **关键特征**:
378
376
 
379
- - **无注册表查找** - 总是创建新的子对话
377
+ - **无注册表查找** - 总是创建新的支线对话
380
378
  - **不注册** - 在各次诉请之间不持久化
381
379
  - **无任务安排更新通道** - 发出后不能像 TYPE B 那样就地更新同一路诉请要求
382
- - 再次发起 `tellaskSessionless` 只会创建**另一条新的瞬态子对话**,不会更新、更不会要求先前那条 TYPE C 支线停止
380
+ - 再次发起 `tellaskSessionless` 只会创建**另一条新的瞬态支线对话**,不会更新、更不会要求先前那条 TYPE C 支线停止
383
381
  - 若你后续可能需要改要求、纠偏或提前收口,应该从一开始就选择带 `sessionSlug` 的 TYPE B `tellask`
384
- - 子对话本身一般是“完整能力”的;但 `freshBootsReasoning({ tellaskContent: "..." })` FBR 是特例:无工具且禁止任何诉请(见 `fbr.zh.md`)。
382
+ - 支线对话本身一般是“完整能力”的;但 `freshBootsReasoning({ tellaskContent: "..." })` FBR 是特例:无工具且禁止任何诉请(见 `fbr.zh.md`)。
385
383
  - 与 TYPE B 的唯一区别:无注册表查找/恢复能力
386
384
  - 用于一次性的、独立的任务
387
385
 
@@ -394,8 +392,8 @@ LLM 发出:@code-reviewer 请审查这个 PR
394
392
 
395
393
  结果:
396
394
  - orchestrator 挂起
397
- - 使用 agentId "code-reviewer" 创建新的子对话
398
- - 驱动 code-reviewer 子对话(它可以进行自己的诉请、工具等)
395
+ - 使用 agentId "code-reviewer" 创建新的支线对话
396
+ - 驱动 code-reviewer 支线对话(它可以进行自己的诉请、工具等)
399
397
  - code-reviewer 完成并返回审查结果
400
398
  - orchestrator 恢复,审查结果在上下文中
401
399
 
@@ -403,23 +401,23 @@ LLM 再次发出:@code-reviewer 审查这个其他 PR
403
401
 
404
402
  结果:
405
403
  - orchestrator 挂起
406
- - 创建另一个新的子对话(与之前的不同!)
407
- - 驱动新的 code-reviewer 子对话
404
+ - 创建另一个新的支线对话(与之前的不同!)
405
+ - 驱动新的 code-reviewer 支线对话
408
406
  - orchestrator 恢复,新的审查结果在上下文中
409
407
  ```
410
408
 
411
409
  ### 对比总结
412
410
 
413
- | 方面 | TYPE A:回问诉请 | TYPE B:已注册子对话诉请(长线诉请) | TYPE C:瞬态子对话诉请(一次性诉请) |
414
- | --------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
415
- | **语法** | `tellaskBack({ tellaskContent: "..." })` | `tellask({ targetAgentId: "<anyAgentId>", sessionSlug: "<id>", tellaskContent: "..." })` | `tellaskSessionless({ targetAgentId: "<nonSupdialogAgentId>", tellaskContent: "..." })` |
416
- | **sessionSlug** | 不允许 | 必须 | 不允许 |
417
- | **注册表查找** | 否(使用 `subdialog.supdialog`) | 是(`agentId!sessionSlug`) | 否(永不注册) |
418
- | **恢复** | 否(上位对话不是子对话) | 是(查找找到现有的) | 否(总是新的) |
419
- | **注册** | 不适用 | 创建并注册 | 永不注册 |
420
- | **父级行为** | 子对话挂起 | 父级挂起 | 父级挂起 |
421
- | **子对话能力** | 完整(上位调用、队友、工具) | 完整(上位调用、队友、工具) | 完整(上位调用、队友、工具) |
422
- | **用例** | 从父级澄清 | 恢复持久子任务 | 一次性独立任务 |
411
+ | 方面 | TYPE A:回问诉请 | TYPE B:已注册支线对话诉请(长线诉请) | TYPE C:瞬态支线对话诉请(一次性诉请) |
412
+ | ---------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
413
+ | **语法** | `tellaskBack({ tellaskContent: "..." })` | `tellask({ targetAgentId: "<anyAgentId>", sessionSlug: "<id>", tellaskContent: "..." })` | `tellaskSessionless({ targetAgentId: "<nonAskerDialogAgentId>", tellaskContent: "..." })` |
414
+ | **sessionSlug** | 不允许 | 必须 | 不允许 |
415
+ | **注册表查找** | 否(使用 `sideDialog.askerDialog`) | 是(`agentId!sessionSlug`) | 否(永不注册) |
416
+ | **恢复** | 否(诉请者不是支线对话) | 是(查找找到现有的) | 否(总是新的) |
417
+ | **注册** | 不适用 | 创建并注册 | 永不注册 |
418
+ | **诉请者行为** | 支线对话挂起 | 诉请者挂起 | 诉请者挂起 |
419
+ | **支线对话能力** | 完整(回问诉请者、队友、工具) | 完整(回问诉请者、队友、工具) | 完整(回问诉请者、队友、工具) |
420
+ | **用例** | 从诉请者澄清 | 恢复持久支线任务 | 一次性独立任务 |
423
421
 
424
422
  ---
425
423
 
@@ -429,7 +427,7 @@ Dominds 对话系统建立在四个相互关联的核心机制之上,这些机
429
427
 
430
428
  ```mermaid
431
429
  flowchart TD
432
- H[对话层级<br/>(root子对话)] <--> S[子对话供应<br/>(响应、待处理列表、注册表)]
430
+ H[对话关系<br/>(main支线对话)] <--> S[支线对话供应<br/>(响应、待处理列表、注册表)]
433
431
  H --> Q["Q4H(askHuman(...))<br/>(q4h.yaml 索引)"]
434
432
  S --> Q
435
433
 
@@ -439,27 +437,27 @@ flowchart TD
439
437
 
440
438
  清晰度[clear_mind] -->|清除| Q
441
439
  清晰度 -->|保留| R[提醒]
442
- 清晰度 -->|保留| Reg[注册表(仅根)]
440
+ 清晰度 -->|保留| Reg[注册表(仅主线)]
443
441
  ```
444
442
 
445
443
  ### 关键设计原则
446
444
 
447
445
  1. **Q4H 索引在 `q4h.yaml` 中**:Q4H 问题被索引在 `q4h.yaml` 中(作为索引,不是真理之源),并由思维清晰操作清除。实际的问题内容在对话的对话消息中,其中记录了 `askHuman({ tellaskContent: "..." })` 诉请。它们不会在 `clear_mind` 中存活。
448
446
 
449
- 2. **层级 Q4H**:层级中的任何对话都可以自行提出 Q4H(根对话或子对话)。问题被索引在提出问题的对话中,而不是向上传递。
447
+ 2. **对话作用域 Q4H**:对话树中的任何对话都可以自行提出 Q4H(主线对话或支线对话)。问题被索引在提出问题的对话中,而不是转交给诉请者。
450
448
 
451
- 3. **子对话 Q4H 自主性**:子对话可以直接提出 Q4H 问题,而不是作为父级的智能体。用户导航到子对话的对话中以内联回答。
449
+ 3. **支线对话 Q4H 自主性**:支线对话可以直接提出 Q4H 问题,而不是作为诉请者的智能体。用户导航到支线对话的对话中以内联回答。
452
450
 
453
451
  4. **UI 将 Q4H 呈现为队友诉请**:UI 类似于其他队友诉请处理 Q4H,具有导航链接到对话中的诉请站点。用户使用与常规消息相同的输入文本区域内联回答。
454
452
 
455
- 5. **子对话响应供应**:子对话通过持久化将响应写入*当前诉请者*的上下文(不是回调)。对于 TYPE B,每次诉请都会用最新的诉请者 + tellaskInfo 更新子对话的 `assignmentFromSup`,因此响应被路由到最近的诉请者(根或子对话)。这支持分离操作、复用和崩溃恢复。
453
+ 5. **支线对话响应供应**:支线对话通过持久化将响应写入*当前诉请者*的上下文(不是回调)。对于 TYPE B,每次诉请都会用最新的诉请者 + tellaskInfo 更新支线对话的 `assignmentFromAsker`,因此响应被路由到最近的诉请者(主线或支线对话)。这支持分离操作、复用和崩溃恢复。
456
454
 
457
- 6. **子对话注册表**:已注册的子对话(TYPE B 长线诉请)在根对话作用域的注册表中跟踪。注册表在 `clear_mind` 操作中持续存在,并在根加载时重建。
455
+ 6. **支线对话注册表**:已注册的支线对话(TYPE B 长线诉请)在主线对话作用域的注册表中跟踪。注册表在 `clear_mind` 操作中持续存在,并在主线加载时重建。
458
456
 
459
457
  7. **状态保留契约**:
460
458
  - `clear_mind`:清除消息,清除 Q4H 索引,保留提醒,保留注册表
461
- - 子对话完成:向当前诉请者对话写入响应,从待处理列表中删除(注册表不变)
462
- - 子对话宣布卡死:将 runState 标记为 dead,并移除对应 TYPE B 注册表条目;同一 slug 可作为全新支线重新发起
459
+ - 支线对话完成:向当前诉请者写入响应,从待处理列表中删除(注册表不变)
460
+ - 支线对话宣布卡死:将 runState 标记为 dead,并移除对应 TYPE B 注册表条目;同一 slug 可作为全新支线重新发起
463
461
  - Q4H 回答:从索引中清除已回答的问题,继续对话
464
462
 
465
463
  ---
@@ -468,7 +466,7 @@ flowchart TD
468
466
 
469
467
  ### 概述
470
468
 
471
- Q4H(向人类提问)是对话可以暂停执行并请求人工输入的机制。它是一个核心的、完整的机制,与子对话、提醒和思维清晰工具无缝协作。
469
+ Q4H(向人类提问)是对话可以暂停执行并请求人工输入的机制。它是一个核心的、完整的机制,与支线对话、提醒和思维清晰工具无缝协作。
472
470
 
473
471
  ### Q4H 数据结构
474
472
 
@@ -495,7 +493,7 @@ interface HumanQuestion {
495
493
 
496
494
  ```mermaid
497
495
  sequenceDiagram
498
- participant D as 对话(根或子对话)
496
+ participant D as 对话(主线或支线对话)
499
497
  participant P as 持久化(q4h.yaml)
500
498
  participant UI as 前端 UI
501
499
  participant WS as WebSocket 处理器
@@ -513,7 +511,7 @@ sequenceDiagram
513
511
 
514
512
  ### 对话何时提出 Q4H?
515
513
 
516
- 当 `askHuman({ tellaskContent: "..." })` tellask 函数被任何对话(根或子对话)自行调用时,会提出 Q4H:
514
+ 当 `askHuman({ tellaskContent: "..." })` tellask 函数被任何对话(主线或支线对话)自行调用时,会提出 Q4H:
517
515
 
518
516
  ```typescript
519
517
  // 来自 main/llm/kernel-driver/tellask-special.ts
@@ -627,34 +625,34 @@ interface DriveDialogByUserAnswerRequest {
627
625
  | 后端操作 | 只需驱动对话 | 先清除 q4h.yaml → 驱动对话 |
628
626
  | 继续类型 | N/A | `'answer'` |
629
627
 
630
- ### 子对话 Q4H 处理
628
+ ### 支线对话 Q4H 处理
631
629
 
632
630
  **关键原则**:
633
631
 
634
- 1. Q4H 被索引在提出问题的对话中,而不是向上传递给上位对话
635
- 2. 子对话自行提出 Q4H(不是作为父级的智能体)
636
- 3. 用户导航到子对话的对话中以内联回答
632
+ 1. Q4H 被索引在提出问题的对话中,而不是转交给诉请者
633
+ 2. 支线对话自行提出 Q4H(不是作为诉请者的智能体)
634
+ 3. 用户导航到支线对话的对话中以内联回答
637
635
  4. `q4h.yaml` 文件是索引,不是真理之源
638
636
 
639
637
  ```mermaid
640
638
  sequenceDiagram
641
- participant Sup as 上位对话
642
- participant Sub as 子对话
639
+ participant Asker as 诉请者
640
+ participant Side as 支线对话
643
641
  participant UI as 前端 UI
644
642
  participant WS as WebSocket 处理器
645
643
  participant Driver as driveDialogStream
646
644
 
647
- Sup->>Sub: 创建子对话(TYPE B 或 C)
648
- Note over Sup: 上位对话因待处理子对话而阻塞
645
+ Asker->>Side: 创建支线对话(TYPE B 或 C)
646
+ Note over Asker: 诉请者因待处理支线对话而阻塞
649
647
 
650
- Sub->>WS: 发出 askHuman({ tellaskContent: "..." }) 问题
648
+ Side->>WS: 发出 askHuman({ tellaskContent: "..." }) 问题
651
649
  WS-->>UI: questions_count_update
652
- Note over Sub: 子对话在回答之前无法继续
650
+ Note over Side: 支线对话在回答之前无法继续
653
651
 
654
- UI->>WS: drive_dialog_by_user_answer(dialog=subdialogId, questionId, content)
655
- WS->>Driver: driveDialogStream(subdialog, human answer)
656
- Driver-->>Sub: 子对话恢复
657
- Sub-->>Sup: 响应供应(清除待处理子对话)
652
+ UI->>WS: drive_dialog_by_user_answer(dialog=sideDialogId, questionId, content)
653
+ WS->>Driver: driveDialogStream(sideDialog, human answer)
654
+ Driver-->>Side: 支线对话恢复
655
+ Side-->>Asker: 响应供应(清除待处理支线对话)
658
656
  ```
659
657
 
660
658
  ### Q4H 与思维清晰操作
@@ -669,20 +667,20 @@ flowchart LR
669
667
 
670
668
  ---
671
669
 
672
- ## 对话层级与子对话
670
+ ## 对话关系与支线对话
673
671
 
674
- ### 层级概述
672
+ ### 对话树概述
675
673
 
676
674
  ```mermaid
677
675
  flowchart TD
678
- Root[根对话] --> S1[子对话 sub-001]
679
- Root --> S2[子对话 sub-002]
680
- Root --> S3[子对话 sub-003]
676
+ Main[主线对话] --> S1[支线对话 sub-001]
677
+ Main --> S2[支线对话 sub-002]
678
+ Main --> S3[支线对话 sub-003]
681
679
 
682
- S1 --> N1[嵌套子对话 sub-001-001]
680
+ S1 --> N1[嵌套支线对话 sub-001-001]
683
681
 
684
- Root -.-> Reg["registry.yaml<br/>(根作用域,仅 TYPE B)"]
685
- Root -.-> QRoot[q4h.yaml (根)]
682
+ Main -.-> Reg["registry.yaml<br/>(主线作用域,仅 TYPE B)"]
683
+ Main -.-> QRoot[q4h.yaml (根)]
686
684
  S1 -.-> QS1[q4h.yaml (sub-001)]
687
685
  N1 -.-> QN1[q4h.yaml (sub-001-001)]
688
686
  ```
@@ -694,55 +692,55 @@ flowchart TD
694
692
  - `.dialogs/run/<root-id>/reminders.json`
695
693
  - `.dialogs/run/<root-id>/q4h.yaml`
696
694
  - `.dialogs/run/<root-id>/course-001.jsonl`(第 1 程对话,还可以有编号递增的后续多程)
697
- - `.dialogs/run/<root-id>/subdialogs/<sub-id>/dialog.yaml`
698
- - `.dialogs/run/<root-id>/subdialogs/<sub-id>/q4h.yaml`
699
- - `.dialogs/run/<root-id>/registry.yaml`(仅根;TYPE B 注册表)
695
+ - `.dialogs/run/<root-id>/sideDialogs/<sub-id>/dialog.yaml`
696
+ - `.dialogs/run/<root-id>/sideDialogs/<sub-id>/q4h.yaml`
697
+ - `.dialogs/run/<root-id>/registry.yaml`(仅主线;TYPE B 注册表)
700
698
 
701
- ### 子对话响应供应机制
699
+ ### 支线对话响应供应机制
702
700
 
703
- **核心原则**:子对话通过持久化向**当前诉请者对话**的上下文供应响应,而不是通过回调(TYPE A 时诉请者对话为直接上位对话)。
701
+ **核心原则**:支线对话通过持久化向**当前诉请者**的上下文供应响应,而不是通过回调(TYPE A 时诉请者为直接 askerDialog)。
704
702
 
705
703
  ```mermaid
706
704
  sequenceDiagram
707
- participant Sup as 诉请者对话
705
+ participant Asker as 诉请者
708
706
  participant Driver as 后端驱动程序
709
- participant Sub as 子对话
707
+ participant Side as 支线对话
710
708
  participant Store as 持久化
711
709
 
712
- Sup->>Driver: 创建子对话(添加到待处理列表)
713
- Driver->>Sub: 驱动子对话(分离执行)
714
- Sub-->>Store: 持久化最终响应
715
- Driver-->>Sup: 供应响应 + 清除待处理子对话
716
- opt 诉请者对话是根且现在已解除阻塞
717
- Driver-->>Sup: 设置 needsDrive=true(自动重启)
710
+ Asker->>Driver: 创建支线对话(添加到待处理列表)
711
+ Driver->>Side: 驱动支线对话(分离执行)
712
+ Side-->>Store: 持久化最终响应
713
+ Driver-->>Asker: 供应响应 + 清除待处理支线对话
714
+ opt 诉请者是主线且现在已解除阻塞
715
+ Driver-->>Asker: 设置 needsDrive=true(自动重启)
718
716
  end
719
717
  ```
720
718
 
721
- ### 子对话 Q4H 和上位对话恢复
719
+ ### 支线对话 Q4H 和诉请者恢复
722
720
 
723
- 当子对话提出 Q4H 并等待人工输入时,上位对话的自动重启逻辑必须处理这种情况:
721
+ 当支线对话提出 Q4H 并等待人工输入时,诉请者的自动重启逻辑必须处理这种情况:
724
722
 
725
723
  ```typescript
726
- // 上位对话检查子对话完成状态
727
- async function checkSubdialogRevival(supdialog: Dialog): Promise<void> {
728
- const pending = await loadPendingSubdialogs(supdialog.id);
724
+ // 诉请者检查支线对话完成状态
725
+ async function checkSideDialogRevival(askerDialog: Dialog): Promise<void> {
726
+ const pending = await loadPendingSideDialogs(askerDialog.id);
729
727
 
730
728
  for (const p of pending) {
731
- // 检查子对话是否有未解决的 Q4H
732
- const subdialogQ4H = await DialogPersistence.loadQuestions4HumanState(p.subdialogId);
729
+ // 检查支线对话是否有未解决的 Q4H
730
+ const sideDialogQ4H = await DialogPersistence.loadQuestions4HumanState(p.sideDialogId);
733
731
 
734
- if (subdialogQ4H.length > 0) {
735
- // 子对话正在等待人工输入
732
+ if (sideDialogQ4H.length > 0) {
733
+ // 支线对话正在等待人工输入
736
734
  // 不要自动重启 - 等待人工回答 Q4H
737
- log.debug(`子对话 ${p.subdialogId} 有 ${subdialogQ4H.length} 个 Q4H,跳过自动重启`);
735
+ log.debug(`支线对话 ${p.sideDialogId} 有 ${sideDialogQ4H.length} 个 Q4H,跳过自动重启`);
738
736
  continue;
739
737
  }
740
738
 
741
- // 子对话没有 Q4H,检查是否完成
742
- const isDone = await isSubdialogCompleted(p.subdialogId);
739
+ // 支线对话没有 Q4H,检查是否完成
740
+ const isDone = await isSideDialogCompleted(p.sideDialogId);
743
741
  if (isDone) {
744
742
  // 合并响应并自动重启
745
- await incorporateSubdialogResponse(supdialog, p.subdialogId);
743
+ await incorporateSideDialogResponse(askerDialog, p.sideDialogId);
746
744
  }
747
745
  }
748
746
  }
@@ -779,8 +777,8 @@ async function checkSubdialogRevival(supdialog: Dialog): Promise<void> {
779
777
  - 清除当前对话中的所有聊天消息
780
778
  - 保留所有提醒
781
779
  - **清除所有 Q4H 问题**(关键!)
782
- - 保留子对话注册表(仅限根对话)
783
- - 对上位对话没有影响
780
+ - 保留支线对话注册表(仅限主线对话)
781
+ - 对诉请者没有影响
784
782
  - 将注意力重定向到差遣牒
785
783
  - 系统生成的“开启新一程对话”提示已排队,作为新一程的首个 role=user 消息
786
784
  - 开启新一程对话
@@ -788,7 +786,7 @@ async function checkSubdialogRevival(supdialog: Dialog): Promise<void> {
788
786
  **实现说明**:
789
787
 
790
788
  - 操作仅作用于当前对话
791
- - 子对话不受父级 `clear_mind` 的影响
789
+ - 支线对话不受诉请者 `clear_mind` 的影响
792
790
  - 差遣牒保持不变且可访问
793
791
  - 提醒在清晰操作中提供连续性
794
792
 
@@ -814,12 +812,12 @@ async function checkSubdialogRevival(supdialog: Dialog): Promise<void> {
814
812
  - 更新的文件立即对引用它的所有对话可用
815
813
  - **不开启新一程对话。** 如需开启新一程对话,请单独使用 `clear_mind`。
816
814
  - 本身不清除消息、提醒、Q4H 或注册表
817
- - 影响引用相同差遣牒的所有参与智能体(主对话和子对话)
815
+ - 影响引用相同差遣牒的所有参与智能体(主线对话和支线对话)
818
816
  - 关键决策/当前状态/下一步写回 `progress`;硬约束写回 `constraints`(不要只留在对话/提醒项里)。
819
817
 
820
818
  **实现说明**:
821
819
 
822
- - `change_mind` 仅在根对话中可用(不在子对话中);子对话必须通过回问诉请(`tellaskBack({ tellaskContent: "..." })`)询问诉请者以更新共享差遣牒。
820
+ - `change_mind` 仅在主线对话中可用(不在支线对话中);支线对话必须通过回问诉请(`tellaskBack({ tellaskContent: "..." })`)询问诉请者以更新共享差遣牒。
823
821
  - 对于 `*.tsk/` 差遣牒任务包,差遣牒是封装的:通用文件工具不得读取/写入/列出/删除 `*.tsk/` 下的任何内容。请参阅 [`encapsulated-taskdoc.zh.md`](./encapsulated-taskdoc.zh.md)。
824
822
 
825
823
  ---
@@ -848,22 +846,22 @@ async function checkSubdialogRevival(supdialog: Dialog): Promise<void> {
848
846
 
849
847
  ---
850
848
 
851
- ## 子对话注册表
849
+ ## 支线对话注册表
852
850
 
853
851
  ### 概述
854
852
 
855
- **子对话注册表** 是根对话作用域的数据结构,维护通过 TYPE B(已注册子对话诉请 / 长线诉请)创建的已注册子对话的持久引用。
853
+ **支线对话注册表** 是主线对话作用域的数据结构,维护通过 TYPE B(已注册支线对话诉请 / 长线诉请)创建的已注册支线对话的持久引用。
856
854
 
857
855
  ### 关键特征
858
856
 
859
- | 方面 | 描述 |
860
- | ------------ | ------------------------------------------ |
861
- | **作用域** | 仅限根对话(子对话无法访问) |
862
- | **键格式** | `agentId!sessionSlug`(单级 Map) |
863
- | **存储** | 根对话目录中的 `registry.yaml` |
864
- | **生命周期** | 正常流程保留;被宣布卡死的子对话条目会移除 |
865
- | **持久化** | 根完成时随根移动到 `done/` |
866
- | **恢复** | 在根加载时通过扫描 done/ 子对话 YAML 重建 |
857
+ | 方面 | 描述 |
858
+ | ------------ | --------------------------------------------- |
859
+ | **作用域** | 仅限主线对话(支线对话无法访问) |
860
+ | **键格式** | `agentId!sessionSlug`(单级 Map) |
861
+ | **存储** | 主线对话目录中的 `registry.yaml` |
862
+ | **生命周期** | 正常流程保留;被宣布卡死的支线对话条目会移除 |
863
+ | **持久化** | 根完成时随主线移动到 `done/` |
864
+ | **恢复** | 在主线加载时通过扫描 done/ 支线对话 YAML 重建 |
867
865
 
868
866
  ### 注册表操作
869
867
 
@@ -871,7 +869,7 @@ async function checkSubdialogRevival(supdialog: Dialog): Promise<void> {
871
869
 
872
870
  ```yaml
873
871
  researcher!market-analysis:
874
- subdialogId: uuid-123
872
+ sideDialogId: uuid-123
875
873
  agentId: researcher
876
874
  tellaskSession: market-analysis
877
875
  createdAt: 2025-12-27T10:00:00Z
@@ -882,51 +880,51 @@ researcher!market-analysis:
882
880
  flowchart TD
883
881
  Tellask["TYPE B 长线诉请: tellask(..., sessionSlug=...)"] --> Key[计算键:agentId!sessionSlug]
884
882
  Key --> Lookup{注册表命中?}
885
- Lookup -- 是 --> Resume[恢复 + 驱动现有子对话]
886
- Lookup -- 否 --> Create[创建 + 注册 + 驱动新的子对话]
887
- Resume --> Supply[向调用者供应响应]
883
+ Lookup -- 是 --> Resume[恢复 + 驱动现有支线对话]
884
+ Lookup -- 否 --> Create[创建 + 注册 + 驱动新的支线对话]
885
+ Resume --> Supply[向诉请者供应响应]
888
886
  Create --> Supply
889
887
  ```
890
888
 
891
889
  **前一轮仍在等待时又收到更新诉请(规范)**:
892
890
 
893
- - 对同一个已注册支线(同一 `agentId!sessionSlug`),运行时只维护一个“当前等待中的 caller round”。
891
+ - 对同一个已注册支线(同一 `agentId!sessionSlug`),运行时只维护一个“当前等待中的诉请者轮次”。
894
892
  - 如果新的 TYPE B 诉请在上一轮回复前到达,运行时会立刻用一条系统生成的失败回贴结束上一轮等待;文案必须从业务事实描述,不使用协议/实现术语。
895
893
  - 被诉请侧不会被强行打断。运行时会在它下一次收到的提示里说明“工作要求已更新”,明确要求不要单独回复“收到/好的”,并直接附上最新完整诉请。
896
894
  - 这条更新后的 assignment 提示要按顺序排进“下一条待处理提示”队列,在安全的 turn 边界送达;不能仅仅因为队列里已经有另一条正常提示,就拒绝这次更新写入。
897
- - 如果子对话在最新 assignment 提示真正落到本地之前先产出了回复,这条回复不得作为新一轮的结果回贴给 caller。
895
+ - 如果支线对话在最新 assignment 提示真正落到本地之前先产出了回复,这条回复不得作为新一轮的结果回贴给诉请者。
898
896
 
899
- ### 类设计:RootDialog vs SubDialog
897
+ ### 类设计:MainDialog vs SideDialog
900
898
 
901
- **关键设计原则**:子对话注册表仅由 `RootDialog` 管理,**子对话实例无法访问**。
899
+ **关键设计原则**:支线对话注册表仅由 `MainDialog` 管理,**支线对话实例无法访问**。
902
900
 
903
901
  **职责**:
904
902
 
905
- - `RootDialog`
906
- - 拥有 TYPE B 子对话注册表(`registry.yaml`)
907
- - 创建/注册/查找已注册的子对话(`agentId!sessionSlug`)
908
- - `SubDialog`
909
- - 有一个 `supdialog` 引用(直接父级)并将其用于 TYPE A(`tellaskBack({ tellaskContent: "..." })`)
910
- - 无法访问或更改根注册表(按设计)
903
+ - `MainDialog`
904
+ - 拥有 TYPE B 支线对话注册表(`registry.yaml`)
905
+ - 创建/注册/查找已注册的支线对话(`agentId!sessionSlug`)
906
+ - `SideDialog`
907
+ - 有一个 `askerDialog` 引用(直接诉请者)并将其用于 TYPE A(`tellaskBack({ tellaskContent: "..." })`)
908
+ - 无法访问或更改主线注册表(按设计)
911
909
 
912
910
  **互斥锁语义**:
913
911
 
914
- - `locked: true` → 子对话当前正在被驱动(持有互斥锁)
915
- - `locked: false` → 条目存在但子对话未锁定(可以恢复)
912
+ - `locked: true` → 支线对话当前正在被驱动(持有互斥锁)
913
+ - `locked: false` → 条目存在但支线对话未锁定(可以恢复)
916
914
  - 注册表不跟踪:'active' | 'completed' | 'suspended' 生命周期状态
917
915
 
918
- **设计原则**:注册表跟踪"锁定"(正在被驱动)与"未锁定"(可以恢复)状态。它不跟踪对话生命周期状态(active/completed/suspended)。这些是 Dialog 的关注点,不是 Registry 的关注点。已注册的子对话可能未锁定(当前未被驱动)但仍然作为已完成或已暂停的对话存在。
916
+ **设计原则**:注册表跟踪"锁定"(正在被驱动)与"未锁定"(可以恢复)状态。它不跟踪对话生命周期状态(active/completed/suspended)。这些是 Dialog 的关注点,不是 Registry 的关注点。已注册的支线对话可能未锁定(当前未被驱动)但仍然作为已完成或已暂停的对话存在。
919
917
 
920
918
  ### 注册表持久化
921
919
 
922
- **文件位置**:`<root-dialog-path>/registry.yaml`
920
+ **文件位置**:`<main-dialog-path>/registry.yaml`
923
921
 
924
922
  **格式**:
925
923
 
926
924
  ```typescript
927
- interface SubdialogRegistry {
925
+ interface SideDialogRegistry {
928
926
  [key: string]: {
929
- subdialogId: string; // 子对话的 UUID
927
+ sideDialogId: string; // 支线对话的 UUID
930
928
  agentId: string; // 智能体标识符
931
929
  tellaskSession: string; // 诉请会话键
932
930
  createdAt: string; // ISO 时间戳
@@ -941,8 +939,8 @@ interface SubdialogRegistry {
941
939
  1. **注册时**:新条目添加到注册表,文件保存
942
940
  2. **恢复时**:`lastAccessed` 更新,文件保存
943
941
  3. **Clear Mind 时**:注册表保留(不被清除)
944
- 4. **根完成时**:注册表随根移动到 `done/`
945
- 5. **根加载时**:注册表从 done/ 子对话 YAML 重建
942
+ 4. **根完成时**:注册表随主线移动到 `done/`
943
+ 5. **主线加载时**:注册表从 done/ 支线对话 YAML 重建
946
944
 
947
945
  ---
948
946
 
@@ -954,17 +952,17 @@ interface SubdialogRegistry {
954
952
 
955
953
  **关键组件**:
956
954
 
957
- - **层级支持**:用于子对话管理的父子关系
955
+ - **层级支持**:用于支线对话管理的诉请/响应关系
958
956
  - **内存管理**:持久化提醒和临时聊天消息
959
957
  - **清理头脑操作**:`startNewCourse(newCoursePrompt)` 方法(清除消息,清除 Q4H,开启新一程对话,并为下一次驱动排队开启提示)
960
- - **子对话管理**:专门子任务的创建和协调
958
+ - **支线对话管理**:专门支线任务的创建和协调
961
959
  - **Q4H 管理**:用于问题跟踪的 `updateQuestions4Human()` 方法
962
960
  - **内存访问**:与差遣牒和团队/智能体内存的集成
963
- - **注册表管理**(仅限 RootDialog):子对话的注册和查找
961
+ - **注册表管理**(仅限 MainDialog):支线对话的注册和查找
964
962
 
965
- ### 主对话解析
963
+ ### 主线对话解析
966
964
 
967
- 对于需要与主对话(根对话)通信的子对话,请参阅 `dominds/main/dialog.ts` 中的实现,该实现提供了遍历对话层级的方法。
965
+ 对于需要与主线对话通信的支线对话,请参阅 `dominds/main/dialog.ts` 中的实现,该实现提供了遍历对话关系的方法。
968
966
 
969
967
  ### 持久化层
970
968
 
@@ -974,7 +972,7 @@ interface SubdialogRegistry {
974
972
  - **Q4H 存储**:每个对话的 `q4h.yaml`(被 clear_mind 清除)
975
973
  - **提醒存储**:每个对话的 `reminders.json`
976
974
  - **事件持久化**:按程分文件的 JSONL 事件流
977
- - **注册表存储**:每个根对话的 `registry.yaml`
975
+ - **注册表存储**:每个主线对话的 `registry.yaml`
978
976
 
979
977
  **Q4H 持久化方法**:
980
978
 
@@ -997,13 +995,13 @@ static async clearQuestions4HumanState(
997
995
  **注册表持久化方法**:
998
996
 
999
997
  ```typescript
1000
- // 在 RootDialog(dialog.ts)中
998
+ // 在 MainDialog(dialog.ts)中
1001
999
  interface RegistryMethods {
1002
- loadRegistry(): Promise<SubdialogRegistry>;
1003
- saveRegistry(registry: SubdialogRegistry): Promise<void>;
1004
- registerSubdialog(key: string, metadata: SubdialogMetadata): void;
1005
- lookupSubdialog(key: string): SubdialogMetadata | undefined;
1006
- getRegistry(): SubdialogRegistry;
1000
+ loadRegistry(): Promise<SideDialogRegistry>;
1001
+ saveRegistry(registry: SideDialogRegistry): Promise<void>;
1002
+ registerSideDialog(key: string, metadata: SideDialogMetadata): void;
1003
+ lookupSideDialog(key: string): SideDialogMetadata | undefined;
1004
+ getRegistry(): SideDialogRegistry;
1007
1005
  }
1008
1006
  ```
1009
1007
 
@@ -1011,65 +1009,65 @@ interface RegistryMethods {
1011
1009
 
1012
1010
  ## 对话管理
1013
1011
 
1014
- ### 层级管理
1012
+ ### 对话树管理
1015
1013
 
1016
- **创建**:当智能体需要委派专门任务或复杂问题需要分解时,会创建子对话。
1014
+ **创建**:当智能体需要委派专门任务或复杂问题需要分解时,会创建支线对话。
1017
1015
 
1018
- **上下文继承**:新的子对话自动接收:
1016
+ **上下文继承**:新的支线对话自动接收:
1019
1017
 
1020
1018
  - 对相同 rtws(运行时工作区)差遣牒的引用(推荐:`tasks/feature-auth.tsk/`);`dlg.taskDocPath` 在对话创建时固定,永不重新分配
1021
- - 诉请者对话的诉请上下文(mentionList + tellaskContent)解释其目的
1019
+ - 诉请者的诉请上下文(mentionList + tellaskContent)解释其目的
1022
1020
  - 访问共享团队内存
1023
1021
  - 访问其智能体的个人内存
1024
1022
 
1025
- **存储**:所有子对话都平铺存储在主对话(根对话)的 `subdialogs/` 目录下,无论嵌套深度如何。
1023
+ **存储**:所有支线对话都平铺存储在主线对话的 `sideDialogs/` 目录下,无论嵌套深度如何。
1026
1024
 
1027
- **导航**:每个子对话都保持对其父级的引用,向上遍历到主对话。
1025
+ **导航**:每个支线对话都保持对其诉请者的引用,可沿对话树回到主线对话。
1028
1026
 
1029
- **注册表**:已注册的子对话(TYPE B 长线诉请)在根对话的注册表中跟踪,并在重启后持久化;若子对话被宣布卡死,其条目会被裁剪,不再参与后续同 slug 复用。
1027
+ **注册表**:已注册的支线对话(TYPE B 长线诉请)在主线对话的注册表中跟踪,并在重启后持久化;若支线对话被宣布卡死,其条目会被裁剪,不再参与后续同 slug 复用。
1030
1028
 
1031
- ### Root dialog fork(根对话分叉)
1029
+ ### Main dialog fork(主线对话分叉)
1032
1030
 
1033
- 运行中的一个完整 root dialog tree 可以在某个 root generation 起点处被 fork 成新的 root dialog。该能力用于“保留此前上下文,但从某个历史分叉点重新走后续主线/支线”。
1031
+ 运行中的一个完整 main dialog tree 可以在某个 root generation 起点处被 fork 成新的 main dialog。该能力用于“保留此前上下文,但从某个历史分叉点重新走后续主线/支线”。
1034
1032
 
1035
1033
  **入口**:
1036
1034
 
1037
- - UI 仅对 root dialog(`selfId === rootId`)的 generation bubble 显示 `Fork 对话`
1035
+ - UI 仅对 main dialog(`selfId === rootId`)的 generation bubble 显示 `Fork 对话`
1038
1036
  - 后端 API:`POST /api/dialogs/:rootId/fork`
1039
1037
  - 请求体:`{ course, genseq, status? }`
1040
1038
 
1041
1039
  **语义(强制)**:
1042
1040
 
1043
- - 选中的 generation bubble **不会**被复制到 fork 后的新 root;fork 切点语义是“从该 generation 开始前分叉”
1044
- - 复制范围不是单个对话,而是**整棵 root dialog tree**
1045
- - 子对话是否纳入 fork,取决于它是否已经在切点之前被根对话显式记录为已创建
1046
- - 子对话 transcript 的保留边界由 root generation anchor 决定,而不是子对话自身的本地 `genseq`
1041
+ - 选中的 generation bubble **不会**被复制到 fork 后的新主线;fork 切点语义是“从该 generation 开始前分叉”
1042
+ - 复制范围不是单个对话,而是**整棵 main dialog tree**
1043
+ - 支线对话是否纳入 fork,取决于它是否已经在切点之前被主线对话显式记录为已创建
1044
+ - 支线对话 transcript 的保留边界由 root generation anchor 决定,而不是支线对话自身的本地 `genseq`
1047
1045
 
1048
1046
  **fork 后动作**(由后端返回给 UI):
1049
1047
 
1050
1048
  - `draft_user_text`:若目标 generation 是一条用户输入,则把该文本回填到新对话输入框中,等待用户决定是否发送
1051
- - `restore_pending`:若切点之前存在待处理 Q4H 或待处理子对话,则恢复这些阻塞态,让新 root 继续处于阻塞状态
1052
- - `auto_continue`:若切点之前没有待处理阻塞,则新 root 以 `interrupted(system_stop: fork_dialog_continue)` 初始化,UI 随后立即发送 `resume_dialog`
1049
+ - `restore_pending`:若切点之前存在待处理 Q4H 或待处理支线对话,则恢复这些阻塞态,让新主线继续处于阻塞状态
1050
+ - `auto_continue`:若切点之前没有待处理阻塞,则新主线以 `interrupted(system_stop: fork_dialog_continue)` 初始化,UI 随后立即发送 `resume_dialog`
1053
1051
 
1054
1052
  **一致性要求**:
1055
1053
 
1056
1054
  - fork 必须保留同一差遣牒引用
1057
- - fork 后的 root/subdialog 都落到 `running/`,并拥有新的 rootId
1058
- - 前端不得对 sideline dialog 暴露该入口;当前实现仅支持 fork root dialog
1055
+ - fork 后的 main/sideDialog 都落到 `running/`,并拥有新的 rootId
1056
+ - 前端不得对 Side Dialog 暴露该入口;当前实现仅支持 fork main dialog
1059
1057
 
1060
1058
  ### 支线对话起始角色提示(强制)
1061
1059
 
1062
1060
  每当支线对话进入新一程时,运行时必须在 assignment prompt 前插入角色头:
1063
1061
 
1064
- - ZH:`你是当前被诉请者对话(tellaskee dialog)的主理人;诉请者对话(tellasker dialog)为 @xxx(当前发起本次诉请)。`
1065
- - EN:`You are the responder (tellaskee dialog) for this dialog; the tellasker dialog is @xxx (the current caller).`
1062
+ - ZH:`你是当前对话的对话主理人;诉请者为 @xxx(当前发起本次诉请)。`
1063
+ - EN:`You are the Dialog Responder for this dialog; the tellasker is @xxx (current tellasker).`
1066
1064
 
1067
1065
  **FBR 特例**(示例):
1068
1066
 
1069
- - ZH:`这是一次 FBR 支线对话;诉请者对话为 @xxx(可能与当前对话同一 agent)。`
1070
- - EN:`This is an FBR sideline dialog; the tellasker dialog is @xxx (may be the same agent).`
1067
+ - ZH:`这是一次 FBR 支线对话;诉请者为 @xxx(可能与当前对话同一 agent)。`
1068
+ - EN:`This is an FBR Side Dialog; the tellasker is @xxx (may be the same agent).`
1071
1069
 
1072
- **插入点**:优先通过 `formatAssignmentFromSupdialog()` 单点注入(覆盖 `dialog.ts` / `tellask-bridge`)。现在不再保留单独的前端 twin;权威格式化实现位于 [`main/runtime/inter-dialog-format.ts`](../main/runtime/inter-dialog-format.ts)。
1070
+ **插入点**:优先通过 `formatAssignmentFromAskerDialog()` 单点注入(覆盖 `dialog.ts` / `tellask-bridge`)。现在不再保留单独的前端 twin;权威格式化实现位于 [`main/runtime/inter-dialog-format.ts`](../main/runtime/inter-dialog-format.ts)。
1073
1071
 
1074
1072
  ### 生命周期管理
1075
1073
 
@@ -1079,28 +1077,28 @@ interface RegistryMethods {
1079
1077
 
1080
1078
  - 任务成功完成
1081
1079
  - 智能体明确标记它们完成
1082
- - 上位对话确定子任务不再需要
1083
- - 所有待处理的子对话都完成且所有 Q4H 已回答
1080
+ - 诉请者确定支线任务不再需要
1081
+ - 所有待处理的支线对话都完成且所有 Q4H 已回答
1084
1082
 
1085
- **完成时的注册表**:当根对话完成时,其注册表随它移动到 `done/` 目录,并保留以供潜在恢复。
1083
+ **完成时的注册表**:当主线对话完成时,其注册表随它移动到 `done/` 目录,并保留以供潜在恢复。
1086
1084
 
1087
1085
  **清理**:完成的对话可以根据保留策略进行归档或清理。
1088
1086
 
1089
1087
  ### 通信模式
1090
1088
 
1091
- **向上通信**:子对话向诉请者对话通信结果、问题和升级。
1089
+ **面向诉请者的通信**:支线对话向诉请者通信结果、问题和升级。
1092
1090
 
1093
- - **澄清请求(TYPE A / 回问诉请)**:子对话在处理其子任务时可能向诉请者对话发起诉请以请求澄清。TYPE A 中诉请者对话为直接上位对话。诉请者对话提供指导,子对话在新上下文中继续。
1094
- - **子任务响应**:当子对话产生最终的 "saying" 内容块(没有待处理的 Q4H)时,该消息被视为对**当前调用者**的响应,记录在 `assignmentFromSup` 中(根或另一个子对话)。这使响应与最新的诉请站点保持一致。
1095
- - **Q4H 升级**:如果子对话有 Q4H,它会暂停。用户可以通过 UI 回答,这只会触发子对话的继续。
1096
- - **已注册的子对话(TYPE B / 长线诉请)**:父级可以恢复先前创建的已注册子对话,实现持续的任务继续。
1097
- - **瞬态子对话(TYPE C / 一次性诉请)**:父级可以生成一次性子对话用于不需要持久化的独立任务。
1091
+ - **澄清请求(TYPE A / 回问诉请)**:支线对话在处理其支线任务时可能向诉请者发起诉请以请求澄清。TYPE A 中诉请者为直接 askerDialog。诉请者提供指导,支线对话在新上下文中继续。
1092
+ - **支线任务响应**:当支线对话产生最终的 "saying" 内容块(没有待处理的 Q4H)时,该消息被视为对 `assignmentFromAsker` 中记录的**当前诉请者**的响应(主线对话或另一个支线对话)。这使响应与最新的诉请站点保持一致。
1093
+ - **Q4H 升级**:如果支线对话有 Q4H,它会暂停。用户可以通过 UI 回答,这只会触发支线对话的继续。
1094
+ - **已注册的支线对话(TYPE B / 长线诉请)**:诉请者可以恢复先前创建的已注册支线对话,实现持续的任务继续。
1095
+ - **瞬态支线对话(TYPE C / 一次性诉请)**:诉请者可以生成一次性支线对话用于不需要持久化的独立任务。
1098
1096
 
1099
- **向下通信**:上位对话向子对话提供上下文、目标和指导。
1097
+ **面向支线的通信**:诉请者向支线对话提供上下文、目标和指导。
1100
1098
 
1101
- **横向通信**:兄弟子对话通过共享上位对话进行协调。
1099
+ **横向通信**:兄弟支线对话通过共享诉请者进行协调。
1102
1100
 
1103
- **广播通信**:主对话(根对话)可以通过差遣牒引用将更改(如 rtws 差遣牒文件更新)传达给所有对话。
1101
+ **广播通信**:主线对话可以通过差遣牒引用将更改(如 rtws 差遣牒文件更新)传达给所有对话。
1104
1102
 
1105
1103
  ---
1106
1104
 
@@ -1114,9 +1112,9 @@ interface RegistryMethods {
1114
1112
 
1115
1113
  **Q4H 问题**:需要人工输入的临时问题,被思维清晰操作**清除**。
1116
1114
 
1117
- **父级调用上下文**:解释为什么创建子对话的不可变上下文。
1115
+ **诉请者上下文**:解释为什么创建支线对话的不可变上下文。
1118
1116
 
1119
- **子对话注册表**:根对话作用域的已注册子对话持久映射(在清晰操作中存活)。
1117
+ **支线对话注册表**:主线对话作用域的已注册支线对话持久映射(在清晰操作中存活)。
1120
1118
 
1121
1119
  ### rtws 持久化内存
1122
1120
 
@@ -1132,7 +1130,7 @@ interface RegistryMethods {
1132
1130
 
1133
1131
  **Q4H 持久化**:Q4H 问题在创建时持久化,在回答时或调用 clear_mind 时原子地清除。
1134
1132
 
1135
- **注册表持久化**:注册表在每次修改后持久化,并在根对话加载时恢复。
1133
+ **注册表持久化**:注册表在每次修改后持久化,并在主线对话加载时恢复。
1136
1134
 
1137
1135
  ---
1138
1136
 
@@ -1146,15 +1144,15 @@ interface RegistryMethods {
1146
1144
  - `<dialog-root>/latest.yaml` — 当前对话过程跟踪和状态
1147
1145
  - `<dialog-root>/reminders.json` — 持久化提醒存储
1148
1146
  - `<dialog-root>/q4h.yaml` — Q4H 索引(被清晰工具清除)
1149
- - `<dialog-root>/registry.yaml` — 子对话注册表(仅限根对话)
1147
+ - `<dialog-root>/registry.yaml` — 支线对话注册表(仅限主线对话)
1150
1148
  - `<dialog-root>/course-001.jsonl`(第 1 程对话,还可以有编号递增的后续多程)— 流式消息文件
1151
- - `<dialog-root>/subdialogs/<subdialog-id>/dialog.yaml`
1152
- - `<dialog-root>/subdialogs/<subdialog-id>/q4h.yaml` — 每个子对话的 Q4H 索引(被清晰清除)
1149
+ - `<dialog-root>/sideDialogs/<sideDialog-id>/dialog.yaml`
1150
+ - `<dialog-root>/sideDialogs/<sideDialog-id>/q4h.yaml` — 每个支线对话的 Q4H 索引(被清晰清除)
1153
1151
 
1154
1152
  **差遣牒存储**:差遣牒是对话通过路径引用的 rtws 产物。差遣牒必须是封装的 `*.tsk/` 任务包。
1155
1153
 
1156
1154
  **内存存储**:团队和智能体内存存储在 rtws 内的专用文件中。
1157
- **注册表存储**:子对话注册表(`registry.yaml`)存储在根对话目录中,并在根完成时移动到 `done/`。
1155
+ **注册表存储**:支线对话注册表(`registry.yaml`)存储在主线对话目录中,并在根完成时移动到 `done/`。
1158
1156
 
1159
1157
  ### 流式生成子流顺序契约(Thinking / Saying)
1160
1158
 
@@ -1173,8 +1171,8 @@ Dominds 内部持久化的消息粒度较细(thinking/saying/tool call/tool re
1173
1171
  - **理想目标**:Provider 协议能够原生支持 `role='environment'`(或等价机制)来承载运行时注入的环境/系统信息(例如 reminders、transient guide 等),从而避免把“环境信息”伪装成用户发言。
1174
1172
  - **当前现实**:大多数 Provider 不支持 `role='environment'`。因此 Dominds 在投影到 Provider 请求 payload 时,必须把内部消息类型压平到 Provider 可接受的角色集合中。
1175
1173
  - 运行时/系统提示(`environment_msg`)投影为 `role='user'` 的文本块。
1176
- - 智能体自写的短指导/自我提醒(`transient_guide_msg`)投影为 `role='assistant'` 的文本块。
1177
- - reminders 不再一刀切:系统托管的状态型提醒(如运行时状态信号)应落在 `user` 侧并带明确系统提示头标;智能体自维护的工作提醒项则保留在 `assistant` 侧,以第一人称工作便签的语义出现。
1174
+ - 智能体自写的短指导(`transient_guide_msg`)投影为 `role='assistant'` 的文本块。
1175
+ - 默认提醒项上下文包装属于运行时/系统提示:Dominds 内置和 fallback 包装落在 `role=user` 侧,带明确系统提示头标(例如 `【系统提示】`),并使用对 LLM 说话的第二人称口吻。自定义 reminder owner 仍按自身契约决定输出 role。无论 owner 具体选择什么 role,外围 reminder 块都应被理解为 environment 风格运行时上下文,而不是新的用户指令,也不是 assistant 自己刚发出的聊天轮次。提醒项投影应插入在真实对话消息之前,并使用成对的提醒块 header/footer;footer 必须把“并非用户指令”的说明限定在该 header/footer 之间的内容,避免误伤对话历史里的真实用户指令。
1178
1176
 
1179
1177
  另外,一些 Provider(尤其是 Anthropic-compatible endpoint)对 **role 交替** 与 **tool_use/tool_result 的边界** 有更严格的结构校验。Dominds 的投影层需要把内部细粒度条目组装为更“turn 化”的 Provider 消息序列(turn assembly),而不是把内部条目逐条 1:1 发送。
1180
1178
 
@@ -1184,19 +1182,19 @@ Dominds 内部持久化的消息粒度较细(thinking/saying/tool call/tool re
1184
1182
 
1185
1183
  **工具调用**:思维清晰工具通过 CLI 命令或智能体操作调用。
1186
1184
 
1187
- **状态监控**:对话状态、待处理子对话、Q4H 计数和已注册的子对话可以通过 CLI 工具检查。
1185
+ **状态监控**:对话状态、待处理支线对话、Q4H 计数和已注册的支线对话可以通过 CLI 工具检查。
1188
1186
 
1189
1187
  ### 智能体集成
1190
1188
 
1191
- **自主操作**:智能体可以独立创建子对话(TYPE B 和 C)、管理提醒、提出 Q4H 并触发清晰操作。
1189
+ **自主操作**:智能体可以独立创建支线对话(TYPE B 和 C)、管理提醒、提出 Q4H 并触发清晰操作。
1192
1190
 
1193
- **上下文感知**:智能体可以完全访问其对话上下文、内存、层级位置、来自子对话的待处理 Q4H,以及(对于根对话)子对话注册表。
1191
+ **上下文感知**:智能体可以完全访问其对话上下文、内存、对话关系位置、来自支线对话的待处理 Q4H,以及(对于主线对话)支线对话注册表。
1194
1192
 
1195
1193
  **队友诉请能力**:智能体可以调用所有三种类型的队友诉请:
1196
1194
 
1197
- - TYPE A / 回问诉请:向上位对话发起诉请以请求澄清
1198
- - TYPE B / 长线诉请:诉请或恢复已注册的子对话
1199
- - TYPE C / 一次性诉请:生成瞬态子对话
1195
+ - TYPE A / 回问诉请:向诉请者发起诉请以请求澄清
1196
+ - TYPE B / 长线诉请:诉请或恢复已注册的支线对话
1197
+ - TYPE C / 一次性诉请:生成瞬态支线对话
1200
1198
 
1201
1199
  **工具访问**:所有思维清晰工具、Q4H 能力和队友诉请工具都可用于智能体进行自主认知管理。
1202
1200
 
@@ -1207,7 +1205,7 @@ Dominds 的运行时**不**持久化单一的类似枚举的 "awaiting …" 状
1207
1205
 
1208
1206
  - 持久化状态(API/索引):`running | completed | archived`
1209
1207
  - 持久化 `latest.yaml`:`status`、`needsDrive`、`generating`
1210
- - 派生的门控:`hasPendingQ4H()` 和 `hasPendingSubdialogs()`
1208
+ - 派生的门控:`hasPendingQ4H()` 和 `hasPendingSideDialogs()`
1211
1209
 
1212
1210
  **持久化状态生命周期**:
1213
1211
 
@@ -1219,13 +1217,13 @@ stateDiagram-v2
1219
1217
  completed --> archived: 归档
1220
1218
  ```
1221
1219
 
1222
- **根驱动程序门控(概念性)**:
1220
+ **主线驱动程序门控(概念性)**:
1223
1221
 
1224
1222
  ```mermaid
1225
1223
  flowchart TD
1226
- A[status=running] --> B{可以驱动?\\n(没有待处理的 Q4H\\n且没有待处理的子对话)}
1227
- B -- 否 --> S[已暂停\\n(等待 Q4H 和/或子对话)]
1228
- S -->|Q4H 回答\\n或子对话响应供应| C{需要驱动?}
1224
+ A[status=running] --> B{可以驱动?\\n(没有待处理的 Q4H\\n且没有待处理的支线对话)}
1225
+ B -- 否 --> S[已暂停\\n(等待 Q4H 和/或支线对话)]
1226
+ S -->|Q4H 回答\\n或支线对话响应供应| C{需要驱动?}
1229
1227
  B -- 是 --> C{需要驱动?}
1230
1228
  C -- 否 --> I[空闲\\n(等待触发器)]
1231
1229
  C -- 是 --> D[驱动循环\\n(流式传输时 generating=true)]
@@ -1242,58 +1240,58 @@ flowchart TD
1242
1240
 
1243
1241
  ```mermaid
1244
1242
  sequenceDiagram
1245
- participant Sub as 子对话
1243
+ participant Side as 支线对话
1246
1244
  participant Driver as 后端驱动程序
1247
- participant Sup as 上位对话(直接父级)
1245
+ participant Asker as 诉请者(直接诉请者)
1248
1246
 
1249
- Sub->>Driver: 发出 `tellaskBack({ tellaskContent: "..." })` + 问题
1250
- Driver->>Sup: 驱动上位对话以回答
1251
- Sup-->>Driver: 响应文本
1252
- Driver-->>Sub: 恢复子对话,响应在上下文中
1247
+ Side->>Driver: 发出 `tellaskBack({ tellaskContent: "..." })` + 问题
1248
+ Driver->>Asker: 驱动诉请者以回答
1249
+ Asker-->>Driver: 响应文本
1250
+ Driver-->>Side: 恢复支线对话,响应在上下文中
1253
1251
  ```
1254
1252
 
1255
- #### TYPE B:已注册子对话诉请(长线诉请)(`tellask({ targetAgentId: "agentId", sessionSlug: "tellaskSession", tellaskContent: "..." })`)
1253
+ #### TYPE B:已注册支线对话诉请(长线诉请)(`tellask({ targetAgentId: "agentId", sessionSlug: "tellaskSession", tellaskContent: "..." })`)
1256
1254
 
1257
1255
  ```mermaid
1258
1256
  sequenceDiagram
1259
- participant Caller as 调用者对话
1257
+ participant Tellasker as 诉请者
1260
1258
  participant Driver as 后端驱动程序
1261
- participant Reg as 根子对话注册表
1262
- participant Sub as 已注册的子对话
1259
+ participant Reg as 主线支线对话注册表
1260
+ participant Side as 已注册的支线对话
1263
1261
 
1264
- Caller->>Driver: 发出 `tellask({ targetAgentId: "agentId", sessionSlug: "tellaskSession", tellaskContent: "..." })`
1262
+ Tellasker->>Driver: 发出 `tellask({ targetAgentId: "agentId", sessionSlug: "tellaskSession", tellaskContent: "..." })`
1265
1263
  Driver->>Reg: 查找 `agentId!sessionSlug`
1266
1264
  alt 注册表命中
1267
- Reg-->>Driver: 现有子对话 selfId
1265
+ Reg-->>Driver: 现有支线对话 selfId
1268
1266
  opt 前一轮仍在等待
1269
- Driver-->>Caller: 用系统生成的业务化文案结束前一轮等待
1270
- Driver->>Sub: 排入“要求已更新”通知 + 最新完整诉请
1267
+ Driver-->>Tellasker: 用系统生成的业务化文案结束前一轮等待
1268
+ Driver->>Side: 排入“要求已更新”通知 + 最新完整诉请
1271
1269
  end
1272
- Driver->>Sub: 恢复 + 驱动
1270
+ Driver->>Side: 恢复 + 驱动
1273
1271
  else 注册表未命中
1274
1272
  Reg-->>Driver: 无
1275
- Driver->>Sub: 创建 + 注册 + 驱动
1273
+ Driver->>Side: 创建 + 注册 + 驱动
1276
1274
  end
1277
- Sub-->>Driver: 最终响应
1278
- Driver-->>Caller: 供应响应 + 清除待处理子对话
1279
- opt 调用者是根且现在已解除阻塞
1280
- Driver-->>Caller: 设置 needsDrive=true(自动重启调度)
1275
+ Side-->>Driver: 最终响应
1276
+ Driver-->>Tellasker: 供应响应 + 清除待处理支线对话
1277
+ opt 诉请者是主线且现在已解除阻塞
1278
+ Driver-->>Tellasker: 设置 needsDrive=true(自动重启调度)
1281
1279
  end
1282
1280
  ```
1283
1281
 
1284
- #### TYPE C:瞬态子对话诉请(一次性诉请)(`tellaskSessionless({ targetAgentId: "agentId", tellaskContent: "..." })`,或 `freshBootsReasoning({ tellaskContent: "..." })`)
1282
+ #### TYPE C:瞬态支线对话诉请(一次性诉请)(`tellaskSessionless({ targetAgentId: "agentId", tellaskContent: "..." })`,或 `freshBootsReasoning({ tellaskContent: "..." })`)
1285
1283
 
1286
1284
  ```mermaid
1287
1285
  sequenceDiagram
1288
- participant Caller as 调用者对话
1286
+ participant Tellasker as 诉请者
1289
1287
  participant Driver as 后端驱动程序
1290
- participant Sub as 瞬态子对话
1288
+ participant Side as 瞬态支线对话
1291
1289
 
1292
- Caller->>Driver: 发出 tellaskSessionless(...)
1293
- Driver->>Sub: 创建(不注册)
1294
- Driver->>Sub: 驱动
1295
- Sub-->>Driver: 最终响应
1296
- Driver-->>Caller: 供应响应(无注册表更新)
1290
+ Tellasker->>Driver: 发出 tellaskSessionless(...)
1291
+ Driver->>Side: 创建(不注册)
1292
+ Driver->>Side: 驱动
1293
+ Side-->>Driver: 最终响应
1294
+ Driver-->>Tellasker: 供应响应(无注册表更新)
1297
1295
  ```
1298
1296
 
1299
1297
  ### Q4H 生命周期状态
@@ -1312,31 +1310,31 @@ flowchart TD
1312
1310
 
1313
1311
  `q4h.yaml` 被视为索引;真理之源"提出的问题"内容存在于对话的消息流中,由 `callSiteRef` 引用。
1314
1312
 
1315
- ### 子对话 + Q4H 交互
1313
+ ### 支线对话 + Q4H 交互
1316
1314
 
1317
1315
  ```mermaid
1318
1316
  sequenceDiagram
1319
- participant Sup as 上位对话
1320
- participant Sub as 子对话
1317
+ participant Asker as 诉请者
1318
+ participant Side as 支线对话
1321
1319
  participant UI as 前端 UI
1322
1320
  participant WS as WebSocket 处理器
1323
1321
  participant Driver as driveDialogStream
1324
1322
 
1325
- Sup->>Sub: 创建子对话(TYPE B 或 C)
1326
- Note over Sup,Sub: 上位对话因待处理子对话而阻塞
1327
- Sub->>WS: 发出 askHuman({ tellaskContent: "..." }) 问题(Q4H)
1323
+ Asker->>Side: 创建支线对话(TYPE B 或 C)
1324
+ Note over Asker,Side: 诉请者因待处理支线对话而阻塞
1325
+ Side->>WS: 发出 askHuman({ tellaskContent: "..." }) 问题(Q4H)
1328
1326
  WS-->>UI: questions_count_update(全局)
1329
1327
 
1330
- Note over Sub: 子对话在回答之前无法继续
1328
+ Note over Side: 支线对话在回答之前无法继续
1331
1329
 
1332
- UI->>WS: drive_dialog_by_user_answer (dialogId=subdialogId, questionId, content)
1333
- WS->>Sub: 清除 q4h.yaml 条目
1334
- WS->>Driver: driveDialogStream(subdialog, user answer)
1335
- Driver-->>Sub: 子对话恢复并继续
1336
- Sub-->>Sup: 子对话响应供应给调用者(清除待处理子对话)
1330
+ UI->>WS: drive_dialog_by_user_answer (dialogId=sideDialogId, questionId, content)
1331
+ WS->>Side: 清除 q4h.yaml 条目
1332
+ WS->>Driver: driveDialogStream(sideDialog, user answer)
1333
+ Driver-->>Side: 支线对话恢复并继续
1334
+ Side-->>Asker: 支线对话响应供应给诉请者(清除待处理支线对话)
1337
1335
 
1338
- opt 上位对话是根且现在已解除阻塞
1339
- Sup-->>Sup: 设置 needsDrive=true(自动重启)
1336
+ opt 诉请者是主线且现在已解除阻塞
1337
+ Asker-->>Asker: 设置 needsDrive=true(自动重启)
1340
1338
  end
1341
1339
  ```
1342
1340
 
@@ -1344,19 +1342,19 @@ sequenceDiagram
1344
1342
 
1345
1343
  ## 完整流程参考
1346
1344
 
1347
- ### 1. 主对话提出 Q4H
1345
+ ### 1. 主线对话提出 Q4H
1348
1346
 
1349
1347
  ```mermaid
1350
1348
  sequenceDiagram
1351
1349
  participant User as 用户/智能体
1352
- participant Main as 主对话
1350
+ participant Main as 主线对话
1353
1351
  participant Store as 持久化(q4h.yaml)
1354
1352
  participant UI as 前端
1355
1353
 
1356
1354
  User->>Main: askHuman({ tellaskContent: "..." }) 问题
1357
1355
  Main->>Store: recordQuestionForHuman()
1358
1356
  Main-->>UI: questions_count_update
1359
- Main-->>Main: 暂停根驱动循环
1357
+ Main-->>Main: 暂停主线驱动循环
1360
1358
 
1361
1359
  User->>UI: 选择 Q4H
1362
1360
  User->>Main: 提交答案
@@ -1365,64 +1363,64 @@ sequenceDiagram
1365
1363
  Main-->>Main: driveDialogStream(answer)
1366
1364
  ```
1367
1365
 
1368
- ### 2. 子对话提出 Q4H,用户通过根回答
1366
+ ### 2. 支线对话提出 Q4H,用户通过主线回答
1369
1367
 
1370
1368
  ```mermaid
1371
1369
  sequenceDiagram
1372
1370
  participant User as 用户
1373
- participant Sup as 上位对话(根)
1374
- participant Sub as 子对话
1375
- participant Store as 持久化(sub/q4h.yaml, sub/response.yaml)
1371
+ participant Asker as AskerDialog(主线)
1372
+ participant Side as SideDialog
1373
+ participant Store as 持久化(side/q4h.yaml, side/response.yaml)
1376
1374
  participant UI as 前端
1377
1375
 
1378
- Sup->>Sub: createSubDialog()
1379
- Sub->>Store: recordQuestionForHuman()
1376
+ Asker->>Side: createSideDialog()
1377
+ Side->>Store: recordQuestionForHuman()
1380
1378
  ```
1381
1379
 
1382
- ### 2. 子对话发起 Q4H,用户通过根对话回答
1380
+ ### 2. 支线对话发起 Q4H,用户通过主线对话回答
1383
1381
 
1384
1382
  ```mermaid
1385
1383
  sequenceDiagram
1386
1384
  participant User as 用户
1387
- participant Sup as 父对话(根)
1388
- participant Sub as 子对话
1389
- participant Store as 持久化(sub/q4h.yaml, sub/response.yaml)
1385
+ participant Asker as AskerDialog(主线)
1386
+ participant Side as SideDialog
1387
+ participant Store as 持久化(side/q4h.yaml, side/response.yaml)
1390
1388
  participant UI as 前端
1391
1389
 
1392
- Sup->>Sub: createSubDialog()
1393
- Sub->>Store: recordQuestionForHuman()
1394
- Sub-->>UI: questions_count_update(子对话)
1395
- Sup-->>Sup: suspended(等待 Q4H/子对话)
1396
-
1397
- User->>UI: 选择子对话 Q4H
1398
- User->>Sup: drive_dialog_by_user_answer(targetSubdialogId)
1399
- Sup->>Sub: handleDriveDialogByUserAnswer(...)
1400
- Sub->>Store: loadQuestions4HumanState()
1401
- Sub->>Store: clearQuestions4HumanState()
1402
- Sub-->>Sub: driveDialogStream(answer)
1403
- Sub->>Store: write response.yaml
1404
- Sub-->>Sup: supply response(恢复根对话)
1390
+ Asker->>Side: createSideDialog()
1391
+ Side->>Store: recordQuestionForHuman()
1392
+ Side-->>UI: questions_count_update(支线对话)
1393
+ Asker-->>Asker: suspended(等待 Q4H/支线对话)
1394
+
1395
+ User->>UI: 选择支线对话 Q4H
1396
+ User->>Asker: drive_dialog_by_user_answer(targetSideDialogId)
1397
+ Asker->>Side: handleDriveDialogByUserAnswer(...)
1398
+ Side->>Store: loadQuestions4HumanState()
1399
+ Side->>Store: clearQuestions4HumanState()
1400
+ Side-->>Side: driveDialogStream(answer)
1401
+ Side->>Store: write response.yaml
1402
+ Side-->>Asker: supply response(恢复主线对话)
1405
1403
  ```
1406
1404
 
1407
- ### 3. 已注册子对话诉请(TYPE B / 长线诉请)
1405
+ ### 3. 已注册支线对话诉请(TYPE B / 长线诉请)
1408
1406
 
1409
1407
  ```mermaid
1410
1408
  sequenceDiagram
1411
- participant Root as 根对话
1409
+ participant Main as 主线对话
1412
1410
  participant Store as 持久化(registry.yaml + dialogs/)
1413
- participant Sub as 子对话(@researcher sessionSlug market)
1411
+ participant Side as 支线对话(@researcher sessionSlug market)
1414
1412
 
1415
- Root->>Store: lookup registry key "researcher!market"
1413
+ Main->>Store: lookup registry key "researcher!market"
1416
1414
  alt not found
1417
- Root->>Store: create subdialog + save registry.yaml
1418
- Root->>Sub: drive(根暂停)
1415
+ Main->>Store: create sideDialog + save registry.yaml
1416
+ Main->>Side: drive(主线暂停)
1419
1417
  else found
1420
- Root->>Store: load subdialog + update lastAccessed
1421
- Root->>Sub: drive(根暂停)
1418
+ Main->>Store: load sideDialog + update lastAccessed
1419
+ Main->>Side: drive(主线暂停)
1422
1420
  end
1423
1421
 
1424
- Sub->>Store: write response.yaml
1425
- Sub-->>Root: supply response(根恢复)
1422
+ Side->>Store: write response.yaml
1423
+ Side-->>Main: supply response(主线恢复)
1426
1424
  ```
1427
1425
 
1428
1426
  ### 4. 清晰度操作保留注册表
@@ -1442,9 +1440,9 @@ sequenceDiagram
1442
1440
 
1443
1441
  ### 可扩展性
1444
1442
 
1445
- **扁平存储**:子对话扁平存储防止深层目录嵌套问题。
1443
+ **扁平存储**:支线对话扁平存储防止深层目录嵌套问题。
1446
1444
 
1447
- **注册表效率**:已注册子对话的单级 Map 查找为 O(1)。
1445
+ **注册表效率**:已注册支线对话的单级 Map 查找为 O(1)。
1448
1446
 
1449
1447
  **内存效率**:共享内存在对话之间减少重复。
1450
1448
 
@@ -1462,7 +1460,7 @@ sequenceDiagram
1462
1460
 
1463
1461
  **性能指标**:系统跟踪对话创建、完成、注册表大小、资源使用和 Q4H 计数。
1464
1462
 
1465
- **健康检查**:定期验证对话层次结构完整性、Q4H 持久化、注册表一致性和内存。
1463
+ **健康检查**:定期验证对话树完整性、Q4H 持久化、注册表一致性和内存。
1466
1464
 
1467
1465
  **调试支持**:全面的日志记录和检查工具,用于排查队友诉请、注册表操作和 Q4H 流程。
1468
1466
 
@@ -1470,17 +1468,17 @@ sequenceDiagram
1470
1468
 
1471
1469
  ## 总结
1472
1470
 
1473
- Dominds 对话系统为层次化、人在回路的 AI 协作提供了一个强大的框架:
1471
+ Dominds 对话系统为树状协作、人在回路的 AI 协作提供了一个强大的框架:
1474
1472
 
1475
1473
  ### 四个核心机制
1476
1474
 
1477
- | 机制 | 目的 | 存活于清晰度 | 清除方式 |
1478
- | ---------------- | ---------------- | ------------ | ----------------------------------------- |
1479
- | **对话层次结构** | 父子任务委托 | N/A | N/A |
1480
- | **Q4H** | 人机交互请求 | 否 | clear_mind |
1481
- | **心智清晰度** | 上下文重置工具 | N/A | N/A |
1482
- | **提醒项** | 持久化工作内存 | 是 | N/A |
1483
- | **子对话注册表** | 已注册子对话跟踪 | 是 | `declare_subdialog_dead` 时裁剪 dead 条目 |
1475
+ | 机制 | 目的 | 存活于清晰度 | 清除方式 |
1476
+ | ------------------ | ------------------- | ------------ | ------------------------------------------ |
1477
+ | **对话树** | 诉请者/支线任务委托 | N/A | N/A |
1478
+ | **Q4H** | 人机交互请求 | 否 | clear_mind |
1479
+ | **心智清晰度** | 上下文重置工具 | N/A | N/A |
1480
+ | **提醒项** | 持久化工作内存 | 是 | N/A |
1481
+ | **支线对话注册表** | 已注册支线对话跟踪 | 是 | `declare_sideDialog_dead` 时裁剪 dead 条目 |
1484
1482
 
1485
1483
  ### 三种队友诉请类型
1486
1484
 
@@ -1492,12 +1490,12 @@ Dominds 对话系统为层次化、人在回路的 AI 协作提供了一个强
1492
1490
 
1493
1491
  ### 类职责
1494
1492
 
1495
- - **根对话**:管理注册表,可以发起所有三种队友诉请类型
1496
- - **子对话**:拥有父对话引用,可以直接发起 TYPE A 和 TYPE C;TYPE B 通过根注册表路由,并在每次诉请时更新调用者上下文
1493
+ - **主线对话**:管理注册表,可以发起所有三种队友诉请类型
1494
+ - **支线对话**:拥有诉请者引用,可以直接发起 TYPE A 和 TYPE C;TYPE B 通过主线注册表路由,并在每次诉请时更新诉请者上下文
1497
1495
 
1498
1496
  ### 持久化保证
1499
1497
 
1500
1498
  - **Q4H**:持久化,由清晰度操作清除
1501
1499
  - **提醒项**:持久化,在清晰度操作中存活
1502
1500
  - **注册表**:持久化,在清晰度操作中存活,完成时移至 done/;dead 条目会在宣布卡死时被裁剪
1503
- - **子对话**:已注册的子对话在注册表中持久化;临时子对话不会被注册
1501
+ - **支线对话**:已注册的支线对话在注册表中持久化;临时支线对话不会被注册