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
@@ -116,7 +116,7 @@ async function buildAppDynamicLayer(params) {
116
116
  taskDocPath: params.taskDocPath,
117
117
  agentId: params.agentId,
118
118
  dialogId: params.dialog?.selfId,
119
- rootDialogId: params.dialog?.rootId,
119
+ mainDialogId: params.dialog?.rootId,
120
120
  sessionSlug: params.dialog?.sessionSlug,
121
121
  });
122
122
  if (result.status === 'not_applicable') {
@@ -5,6 +5,7 @@ exports.ensureAppReminderOwnersRegistered = ensureAppReminderOwnersRegistered;
5
5
  exports.unregisterAppReminderOwnersForApps = unregisterAppReminderOwnersForApps;
6
6
  exports.applyAppReminderRequests = applyAppReminderRequests;
7
7
  const evt_registry_1 = require("../evt-registry");
8
+ const log_1 = require("../log");
8
9
  const driver_messages_1 = require("../runtime/driver-messages");
9
10
  const work_language_1 = require("../runtime/work-language");
10
11
  const shared_reminders_1 = require("../shared-reminders");
@@ -159,8 +160,8 @@ function findOwnedReminderEntries(dlg, descriptor, owner) {
159
160
  function fallbackRenderedReminder(reminder) {
160
161
  const language = (0, work_language_1.getWorkLanguage)();
161
162
  return {
162
- type: 'transient_guide_msg',
163
- role: 'assistant',
163
+ type: 'environment_msg',
164
+ role: 'user',
164
165
  content: (0, driver_messages_1.formatReminderItemGuide)(language, reminder.id, reminder.content, {
165
166
  meta: reminder.meta,
166
167
  scope: reminder.scope,
@@ -212,7 +213,13 @@ function createAppReminderOwner(params) {
212
213
  : reminder.meta,
213
214
  };
214
215
  }
215
- catch {
216
+ catch (error) {
217
+ log_1.log.warn('App reminder update failed; keeping existing reminder state', error, {
218
+ appId: descriptor.appId,
219
+ ownerRef: descriptor.ownerRef,
220
+ dialogId: dlg.id.selfId,
221
+ reminderId: reminder.id,
222
+ });
216
223
  return { treatment: 'keep' };
217
224
  }
218
225
  },
@@ -229,7 +236,13 @@ function createAppReminderOwner(params) {
229
236
  workLanguage: (0, work_language_1.getWorkLanguage)(),
230
237
  });
231
238
  }
232
- catch {
239
+ catch (error) {
240
+ log_1.log.warn('App reminder render failed; using generic reminder rendering', error, {
241
+ appId: descriptor.appId,
242
+ ownerRef: descriptor.ownerRef,
243
+ dialogId: dlg.id.selfId,
244
+ reminderId: reminder.id,
245
+ });
233
246
  return fallbackRenderedReminder(reminder);
234
247
  }
235
248
  },
@@ -634,9 +634,9 @@ exports.clearMindTool = {
634
634
  exports.changeMindTool = {
635
635
  type: 'func',
636
636
  name: 'change_mind',
637
- description: 'Replace one shared Taskdoc section in the mainline dialog.',
637
+ description: 'Replace one shared Taskdoc section in the Main Dialog.',
638
638
  descriptionI18n: {
639
- en: 'Replace one shared Taskdoc section in the mainline dialog.',
639
+ en: 'Replace one shared Taskdoc section in the Main Dialog.',
640
640
  zh: '在主线对话中替换一段共享差遣牒章节。',
641
641
  },
642
642
  parameters: {
@@ -659,13 +659,13 @@ exports.changeMindTool = {
659
659
  async call(dlg, caller, args) {
660
660
  const language = (0, work_language_1.getWorkLanguage)();
661
661
  const t = getCtrlMessages(language);
662
- if (dlg.supdialog !== undefined) {
663
- const maintainerId = dlg instanceof dialog_1.SubDialog ? dlg.rootDialog.agentId : dlg.agentId;
662
+ if (dlg.askerDialog !== undefined) {
663
+ const maintainerId = dlg instanceof dialog_1.SideDialog ? dlg.mainDialog.agentId : dlg.agentId;
664
664
  if (language === 'zh') {
665
665
  return (0, tool_1.toolFailure)(`错误:\`change_mind\` 仅允许在主线对话中使用(支线对话中不可用)。\n` +
666
666
  `请诉请差遣牒维护人 @${maintainerId} 在其对话中执行 \`change_mind\`,并提供你已合并好的“分段全文替换稿”(禁止覆盖/抹掉他人条目)。`);
667
667
  }
668
- return (0, tool_1.toolFailure)(`Error: \`change_mind\` is only available in the mainline dialog (not in sideline dialogs).\n` +
668
+ return (0, tool_1.toolFailure)(`Error: \`change_mind\` is only available in the Main Dialog (not in Side Dialogs).\n` +
669
669
  `Ask the Taskdoc maintainer @${maintainerId} to run \`change_mind\` and provide a fully merged full-section replacement draft (do not overwrite/delete other contributors).`);
670
670
  }
671
671
  const selectorValue = args['selector'];
package/dist/tools/os.js CHANGED
@@ -403,7 +403,7 @@ function stripDaemonLifecyclePhaseSummary(content) {
403
403
  function getOsToolMessages(language) {
404
404
  if (language === 'zh') {
405
405
  return {
406
- daemonStarted: (pid, timeoutSeconds, command) => `🟢 ${command} 已转入后台持续运行(PID: ${pid})\n该进程在 ${timeoutSeconds} 秒内未完成,现已作为守护进程继续执行。你将看到同一张生命周期状态卡持续刷新:系统维护 / 实时真源 / 不可删除。\n\n需要时可使用 stop_daemon({"pid": ${pid}}) 终止该进程。`,
406
+ daemonStarted: (pid, timeoutSeconds, command) => `🟢 ${command} 已转入后台持续运行(PID: ${pid})\n该进程在 ${timeoutSeconds} 秒内未完成,现已作为守护进程继续执行。你将看到同一条生命周期提醒持续刷新:系统维护 / 实时真源 / 不可删除。\n\n需要时可使用 stop_daemon({"pid": ${pid}}) 终止该进程。`,
407
407
  commandCompleted: (exitCode, scrollNotice) => `✅ 命令已完成(退出码:${exitCode ?? 'unknown'})${scrollNotice}\n\n`,
408
408
  scrolledLinesNotice: (lines) => `\n⚠️ 执行期间有 ${lines} 行已滚出可视范围`,
409
409
  stdoutLabel: '📤 stdout:',
@@ -418,7 +418,7 @@ function getOsToolMessages(language) {
418
418
  };
419
419
  }
420
420
  return {
421
- daemonStarted: (pid, timeoutSeconds, command) => `🟢 ${command} is now running in the background (PID: ${pid})\nThe process did not finish within ${timeoutSeconds} seconds and has transitioned into a daemon. You will see the same lifecycle card keep updating: system-maintained / live source of truth / not deletable.\n\nUse stop_daemon({"pid": ${pid}}) to terminate it when needed.`,
421
+ daemonStarted: (pid, timeoutSeconds, command) => `🟢 ${command} is now running in the background (PID: ${pid})\nThe process did not finish within ${timeoutSeconds} seconds and has transitioned into a daemon. You will see the same lifecycle reminder keep updating: system-maintained / live source of truth / not deletable.\n\nUse stop_daemon({"pid": ${pid}}) to terminate it when needed.`,
422
422
  commandCompleted: (exitCode, scrollNotice) => `✅ Command completed (exit code: ${exitCode ?? 'unknown'})${scrollNotice}\n\n`,
423
423
  scrolledLinesNotice: (lines) => `\n⚠️ ${lines} lines scrolled out of view during execution`,
424
424
  stdoutLabel: '📤 stdout:',
@@ -1171,12 +1171,12 @@ exports.shellCmdReminderOwner = {
1171
1171
  type: 'environment_msg',
1172
1172
  role: 'user',
1173
1173
  content: language === 'zh'
1174
- ? `${prefix} 后台进程生命周期状态卡 [${reminder.id}]
1175
- 这是系统维护的后台进程状态快照。把它当成环境信号,不是你自己写的工作便签。若它没有实质改变你的判断/计划/风险,则禁止做任何用户可见回应(禁止写“静默吸收”“已收到”等占位语句);只有它实际影响后续动作时,才在下一条有实质内容的回复中体现相关事实。该提醒在进程运行期间会自动更新;进程结束后会保留终态,等待你确认后手动删除。
1174
+ ? `${prefix} 后台进程生命周期提醒 [${reminder.id}]
1175
+ 当前运行环境中有一条系统维护的后台进程状态提醒。请把它当成环境信号,不要当成你自己写的工作便签。若它没有实质改变你的判断/计划/风险,则禁止做任何用户可见回应(禁止写“静默吸收”“已收到”等占位语句);只有它实际影响后续动作时,才在下一条有实质内容的回复中体现相关事实。该提醒在进程运行期间会自动更新;进程结束后会保留终态,等待你确认后手动删除。
1176
1176
  ---
1177
1177
  ${reminder.content}`
1178
- : `${prefix} Background process lifecycle card [${reminder.id}]
1179
- This is a system-maintained background process snapshot. Treat it as an environment signal, not a self-authored work note. If it does not materially change your judgment/plan/risk, make no user-visible reply at all (do not send filler like silently noted or received); only reflect it inside the next substantive reply when it actually affects the next action. This reminder auto-updates while the process is running; after exit it keeps the terminal state until you delete it manually.
1178
+ : `${prefix} Background process lifecycle reminder [${reminder.id}]
1179
+ The current runtime environment has a system-maintained background-process state reminder. Treat it as an environment signal, not as your self-authored work note. If it does not materially change your judgment/plan/risk, make no user-visible reply at all (do not send filler like "silently noted" or "received"); only reflect it inside the next substantive reply when it actually affects the next action. This reminder auto-updates while the process is running; after exit it keeps the terminal state until you delete it manually.
1180
1180
  ---
1181
1181
  ${reminder.content}`,
1182
1182
  };
@@ -1193,12 +1193,12 @@ ${reminder.content}`,
1193
1193
  type: 'environment_msg',
1194
1194
  role: 'user',
1195
1195
  content: language === 'zh'
1196
- ? `${prefix} 守护进程生命周期状态卡 [${reminder.id}] - ${exitedSummary}|PID ${pid}
1197
- 该后台进程已退出。若需要再核对最后 stdout/stderr,可先按需调用 get_daemon_output({ "pid": ${pid} });若该调用已不可用,则以下是最后一次已知快照。确认已知悉后,请手动删除这条提醒。
1196
+ ? `${prefix} 守护进程生命周期提醒 [${reminder.id}] - ${exitedSummary}|PID ${pid}
1197
+ 当前运行环境中 daemon 已退出。若需要再核对最后 stdout/stderr,可先按需调用 get_daemon_output({ "pid": ${pid} });若该调用已不可用,则以下是最后一次已知快照。确认已知悉后,请手动删除这条提醒。
1198
1198
  ---
1199
1199
  ${reminder.content}`
1200
- : `${prefix} Daemon lifecycle card [${reminder.id}] - ${exitedSummary} | PID ${pid}
1201
- This daemon has exited. If you still need to inspect the final stdout/stderr, first call get_daemon_output({ "pid": ${pid} }) if it is still available; otherwise use the last known snapshot below. After you have acknowledged the exit, delete this reminder manually.
1200
+ : `${prefix} Daemon lifecycle reminder [${reminder.id}] - ${exitedSummary} | PID ${pid}
1201
+ The current runtime environment shows that this daemon has exited. If you still need to inspect the final stdout/stderr, first call get_daemon_output({ "pid": ${pid} }) if it is still available; otherwise use the last known snapshot below. After you have acknowledged the exit, delete this reminder manually.
1202
1202
  ---
1203
1203
  ${reminder.content}`,
1204
1204
  };
@@ -1208,9 +1208,9 @@ ${reminder.content}`,
1208
1208
  role: 'user',
1209
1209
  content: language === 'zh'
1210
1210
  ? `${prefix} 进程生命周期提醒 [${reminder.id}] - 后台进程已结束(PID ${pid})
1211
- 该后台进程的生命周期已经结束,当前不再运行。`
1211
+ 当前运行环境中该后台进程的生命周期已经结束,当前不再运行。`
1212
1212
  : `${prefix} Process lifecycle reminder [${reminder.id}] - daemon terminated (PID ${pid})
1213
- This daemon process has finished its lifecycle and is no longer running.`,
1213
+ The current runtime environment shows that this daemon process has finished its lifecycle and is no longer running.`,
1214
1214
  };
1215
1215
  }
1216
1216
  if (resolved.kind === 'error') {
@@ -1233,13 +1233,13 @@ This daemon process has finished its lifecycle and is no longer running.`,
1233
1233
  type: 'environment_msg',
1234
1234
  role: 'user',
1235
1235
  content: language === 'zh'
1236
- ? `🔄 ${prefix} 守护进程生命周期状态卡 [${reminder.id}] - ${runningSummary}|PID ${pid},已运行 ${uptimeStr}
1237
- 这是系统维护的状态快照,不是新的用户诉求,也不是默认需要单独汇报的事项。若下面的信息没有实质改变你的判断、计划、风险,且不需要调用守护进程相关工具,则禁止做任何用户可见回应;若它有实质影响,只在下一条有实质内容的回复中体现,禁止单独发送“静默吸收”“已收到”等占位语句。
1236
+ ? `🔄 ${prefix} 守护进程生命周期提醒 [${reminder.id}] - ${runningSummary}|PID ${pid},已运行 ${uptimeStr}
1237
+ 当前运行环境中 daemon 仍在运行。这是系统维护的状态提醒,不是默认需要单独汇报的事项。若下面的信息没有实质改变你的判断、计划、风险,且不需要调用守护进程相关工具,则禁止做任何用户可见回应;若它有实质影响,只在下一条有实质内容的回复中体现,禁止单独发送“静默吸收”“已收到”等占位语句。
1238
1238
 
1239
1239
  **状态快照:**
1240
1240
  ${statusInfo}`
1241
- : `🔄 ${prefix} Daemon lifecycle card [${reminder.id}] - ${runningSummary} | PID ${pid}, uptime: ${uptimeStr}
1242
- This is a system-maintained snapshot, not a new user request and not something that normally deserves a standalone mention. If the information below does not materially change your judgment, plan, risk, or require a daemon-management action, make no user-visible reply at all; if it does matter, reflect it only inside the next substantive reply instead of sending filler like silently noted or received”.
1241
+ : `🔄 ${prefix} Daemon lifecycle reminder [${reminder.id}] - ${runningSummary} | PID ${pid}, uptime: ${uptimeStr}
1242
+ The current runtime environment shows that this daemon is still running. This is a system-maintained state reminder and not something that normally deserves a standalone mention. If the information below does not materially change your judgment, plan, risk, or require a daemon-management action, make no user-visible reply at all; if it does matter, reflect it only inside the next substantive reply instead of sending filler like "silently noted" or "received".
1243
1243
 
1244
1244
  **State snapshot:**
1245
1245
  ${statusInfo}`,
@@ -37,12 +37,12 @@ function isPendingTellaskReminderMeta(value) {
37
37
  function getPendingTellaskUpdateAltInstruction(language) {
38
38
  return language === 'zh'
39
39
  ? '不要手改这条系统提醒。若要改变某一路诉请,只有长线诉请(`tellask` + `sessionSlug`)才能更新那一路诉请的“任务安排”:复用同一 `sessionSlug` 再发 `tellask`,让对应主理人按最新安排自行最终回复并自然结束。一次性诉请(`tellaskSessionless`)没有这个通道;新开一个 `tellaskSessionless` 只会再创建新的瞬态支线,不能要求旧主理人停止。其余情况等待系统按真实诉请状态自动刷新。'
40
- : 'Do not hand-edit this system reminder. If you need to change one tellask, only a sessioned tellask (`tellask` + `sessionSlug`) can be updated in place: send another `tellask` with the same `sessionSlug` so the responder can finish naturally under the latest assignment. A one-shot tellask (`tellaskSessionless`) has no such channel; another `tellaskSessionless` only creates a new transient sideline and cannot tell the earlier owner to stop. Otherwise wait for system refresh from real tellask state.';
40
+ : 'Do not hand-edit this system reminder. If you need to change one tellask, only a sessioned tellask (`tellask` + `sessionSlug`) can be updated in place: send another `tellask` with the same `sessionSlug` so the tellaskee can finish naturally under the latest assignment. A one-shot tellask (`tellaskSessionless`) has no such channel; another `tellaskSessionless` only creates a new transient Side Dialog and cannot tell the earlier owner to stop. Otherwise wait for system refresh from real tellask state.';
41
41
  }
42
42
  function getPendingTellaskDeleteAltInstruction(language) {
43
43
  return language === 'zh'
44
44
  ? '这条系统提醒不可删除。若要改变某一路诉请,只有长线诉请(`tellask` + `sessionSlug`)才能更新那一路诉请的“任务安排”:复用同一 `sessionSlug` 再发 `tellask`,让对应主理人按最新安排自行最终回复并自然结束。一次性诉请(`tellaskSessionless`)没有这个通道;新开一个 `tellaskSessionless` 只会再创建新的瞬态支线,不能要求旧主理人停止。其余情况等待系统按真实诉请状态自动刷新。'
45
- : 'This system reminder is not deletable. If you need to change one tellask, only a sessioned tellask (`tellask` + `sessionSlug`) can be updated in place: send another `tellask` with the same `sessionSlug` so the responder can finish naturally under the latest assignment. A one-shot tellask (`tellaskSessionless`) has no such channel; another `tellaskSessionless` only creates a new transient sideline and cannot tell the earlier owner to stop. Otherwise wait for system refresh from real tellask state.';
45
+ : 'This system reminder is not deletable. If you need to change one tellask, only a sessioned tellask (`tellask` + `sessionSlug`) can be updated in place: send another `tellask` with the same `sessionSlug` so the tellaskee can finish naturally under the latest assignment. A one-shot tellask (`tellaskSessionless`) has no such channel; another `tellaskSessionless` only creates a new transient Side Dialog and cannot tell the earlier owner to stop. Otherwise wait for system refresh from real tellask state.';
46
46
  }
47
47
  function callKindLabel(language, view) {
48
48
  if (view.callType === 'A') {
@@ -52,9 +52,7 @@ function callKindLabel(language, view) {
52
52
  }
53
53
  function pendingTargetLabel(language, view) {
54
54
  if (view.callType === 'A') {
55
- return language === 'zh'
56
- ? `上游诉请者 @${view.targetAgentId}`
57
- : `upstream requester @${view.targetAgentId}`;
55
+ return language === 'zh' ? `诉请者 @${view.targetAgentId}` : `tellasker @${view.targetAgentId}`;
58
56
  }
59
57
  switch (view.callName) {
60
58
  case 'freshBootsReasoning':
@@ -76,7 +74,14 @@ function summarizeTellask(view) {
76
74
  }
77
75
  function makePendingSignature(pending) {
78
76
  return pending
79
- .map((p) => [p.subdialogId, p.targetAgentId, p.callType, p.sessionSlug ?? '', summarizeTellask(p)].join('|'))
77
+ .map((p) => [
78
+ p.sideDialogId,
79
+ p.targetAgentId,
80
+ p.callType,
81
+ p.callId,
82
+ p.sessionSlug ?? '',
83
+ summarizeTellask(p),
84
+ ].join('|'))
80
85
  .sort()
81
86
  .join('||');
82
87
  }
@@ -117,7 +122,7 @@ function buildReminderContent(language, pending) {
117
122
  }
118
123
  const summary = language === 'zh'
119
124
  ? '以下诉请仍在执行中;除这些条目外,当前没有其它仍在执行中的诉请。该提醒项只是系统状态窗,不是控制面:自动维护、不可手改,且在非 0 路进行中时不可删除。只有长线诉请(`tellask` + `sessionSlug`)才能更新“任务安排”;一次性诉请(`tellaskSessionless`)没有这个通道。新开一个 `tellaskSessionless` 只会再创建新的瞬态支线,不会影响旧支线继续执行,更不能要求旧主理人停止。若某一路长线诉请的要求变化,才可复用同一 `sessionSlug` 再发 `tellask`,让对应主理人按最新安排自行最终回复并自然结束。误删会被拒绝,并返回同样的引导文案。'
120
- : 'Only the Tellasks listed below are still in flight; besides them, no other Tellasks are currently executing. This reminder is only a system status window, not a control surface: auto-maintained, not hand-editable, and non-deletable while any tellask is still active. Only a sessioned tellask (`tellask` + `sessionSlug`) has an assignment-update channel; a one-shot tellask (`tellaskSessionless`) does not. Opening another `tellaskSessionless` only creates another transient sideline; it does not affect the earlier one and cannot tell the earlier owner to stop. If a sessioned tellask needs to change, reuse the same `sessionSlug` in another `tellask` so the responder can finish naturally under the latest assignment. Mistaken deletion will be rejected with the same guidance.';
125
+ : 'Only the Tellasks listed below are still in flight; besides them, no other Tellasks are currently executing. This reminder is only a system status window, not a control surface: auto-maintained, not hand-editable, and non-deletable while any tellask is still active. Only a sessioned tellask (`tellask` + `sessionSlug`) has an assignment-update channel; a one-shot tellask (`tellaskSessionless`) does not. Opening another `tellaskSessionless` only creates another transient Side Dialog; it does not affect the earlier one and cannot tell the earlier owner to stop. If a sessioned tellask needs to change, reuse the same `sessionSlug` in another `tellask` so the tellaskee can finish naturally under the latest assignment. Mistaken deletion will be rejected with the same guidance.';
121
126
  const lines = pending.map((p, idx) => {
122
127
  const base = language === 'zh'
123
128
  ? `${idx + 1}. ${pendingTargetLabel(language, p)} | ${callKindLabel(language, p)} | ${summarizeTellask(p)}`
@@ -148,17 +153,18 @@ function assertSingleOwnedReminder(dlg) {
148
153
  return indices[0] ?? null;
149
154
  throw new Error(`pendingTellask reminder invariant violated: expected <=1 owner reminder, got ${indices.length} (dialog=${dlg.id.valueOf()})`);
150
155
  }
151
- async function loadPendingSubdialogView(dlg) {
152
- const pending = await persistence_1.DialogPersistence.loadPendingSubdialogs(dlg.id, dlg.status);
156
+ async function loadPendingSideDialogView(dlg) {
157
+ const pending = await persistence_1.DialogPersistence.loadPendingSideDialogs(dlg.id, dlg.status);
153
158
  return await Promise.all(pending.map(async (p) => {
154
- const subdialogId = new dialog_1.DialogID(p.subdialogId, dlg.id.rootId);
155
- const latest = await persistence_1.DialogPersistence.loadDialogLatest(subdialogId, dlg.status);
159
+ const sideDialogId = new dialog_1.DialogID(p.sideDialogId, dlg.id.rootId);
160
+ const latest = await persistence_1.DialogPersistence.loadDialogLatest(sideDialogId, dlg.status);
156
161
  return {
157
- subdialogId: p.subdialogId,
162
+ sideDialogId: p.sideDialogId,
158
163
  latestActivityAt: latest?.lastModified ?? p.createdAt,
159
164
  mentionList: p.mentionList,
160
165
  tellaskContent: p.tellaskContent,
161
166
  targetAgentId: p.targetAgentId,
167
+ callId: p.callId,
162
168
  callType: p.callType,
163
169
  callName: p.callName,
164
170
  sessionSlug: p.sessionSlug,
@@ -172,7 +178,7 @@ async function withDialogLockIfNeeded(dlg, fn) {
172
178
  return await dlg.withLock(fn);
173
179
  }
174
180
  async function syncPendingTellaskReminderState(dlg) {
175
- const pending = await loadPendingSubdialogView(dlg);
181
+ const pending = await loadPendingSideDialogView(dlg);
176
182
  return await withDialogLockIfNeeded(dlg, async () => {
177
183
  const reminderIndex = assertSingleOwnedReminder(dlg);
178
184
  const language = (0, work_language_1.getWorkLanguage)();
@@ -210,7 +216,7 @@ exports.pendingTellaskReminderOwner = {
210
216
  if (reminder.owner !== exports.pendingTellaskReminderOwner) {
211
217
  return { treatment: 'keep' };
212
218
  }
213
- const pending = await loadPendingSubdialogView(dlg);
219
+ const pending = await loadPendingSideDialogView(dlg);
214
220
  const language = (0, work_language_1.getWorkLanguage)();
215
221
  const updatedContent = buildReminderContent(language, pending);
216
222
  const currentMeta = isPendingTellaskReminderMeta(reminder.meta) ? reminder.meta : undefined;
@@ -29,7 +29,7 @@ control is Dominds' **dialog control toolset** for managing dialog state, remind
29
29
  - **Reminder management**: Two reminder scopes. Default to dialog-local working set; use `personal` only for responsibility-linked notes that you should keep seeing in all later dialogs you lead
30
30
  - **Taskdoc operations**: Update task contracts (goals/constraints/progress); within Taskdoc, `progress` is the team-shared, quasi-real-time, scannable task bulletin board
31
31
  - **Context maintenance**: Reduce cognitive load without losing key resume state
32
- - **Reply routing**: Separate `tellaskBack`, `replyTellask*`, and plain text by responsibility in sideline / ask-back flows
32
+ - **Reply routing**: Separate `tellaskBack`, `replyTellask*`, and plain text by responsibility in Side Dialog / ask-back flows
33
33
 
34
34
  ## Quick Navigation
35
35
 
@@ -46,7 +46,7 @@ Default to `dialog`. Use `personal` only when you should keep seeing that note i
46
46
  | Feature | dialog reminder | personal reminder | personal memory |
47
47
  |---------|-----------------|-------------------|-----------------|
48
48
  | Persistence | Current dialog only | Across all later dialogs you lead | Long-term / file-backed |
49
- | Visibility | Current dialog | Current responder agent | Current agent |
49
+ | Visibility | Current dialog | Current Dialog Responder | Current agent |
50
50
  | Best for | Current next step, blocker, volatile clue | Responsibility-linked operating cue | Stable facts / reusable knowledge |
51
51
 
52
52
  ### 1.1 Scope Choice Rule
@@ -92,21 +92,21 @@ Taskdoc is a **task contract** and the task's **team-shared source of current tr
92
92
 
93
93
  ### Decision Rules
94
94
 
95
- - If the current sideline is unfinished, first judge whether team SOP / role ownership already identifies the responsible owner; if yes and the issue is execution work, directly use `tellask` / `tellaskSessionless` for that owner
96
- - Call `tellaskBack({ tellaskContent })` only when upstream must clarify the request, decide a tradeoff, confirm acceptance criteria, provide missing input, or current SOP cannot determine ownership
95
+ - If the current Side Dialog is unfinished, first judge whether team SOP / role ownership already identifies the responsible owner; if yes and the issue is execution work, directly use `tellask` / `tellaskSessionless` for that owner
96
+ - Call `tellaskBack({ tellaskContent })` only when the tellasker must clarify the request, decide a tradeoff, confirm acceptance criteria, provide missing input, or current SOP cannot determine ownership
97
97
  - If a human must personally perform login / GUI / captcha / high-risk authorization: call `askHuman({ tellaskContent })`
98
- - If the current sideline is complete and the assignment header says `replyTellask`: call `replyTellask({ replyContent })`
99
- - If the current sideline is complete and the assignment header says `replyTellaskSessionless`: call `replyTellaskSessionless({ replyContent })`
100
- - If you are answering an upstream `tellaskBack` follow-up and runtime exposes `replyTellaskBack`: call `replyTellaskBack({ replyContent })`
98
+ - If the current Side Dialog is complete and the assignment header says `replyTellask`: call `replyTellask({ replyContent })`
99
+ - If the current Side Dialog is complete and the assignment header says `replyTellaskSessionless`: call `replyTellaskSessionless({ replyContent })`
100
+ - If you are answering a tellasker `tellaskBack` follow-up and runtime exposes `replyTellaskBack`: call `replyTellaskBack({ replyContent })`
101
101
  - Plain text is not the normal completion channel for inter-dialog delivery; if you emit plain text instead of the reply tool, runtime may temporarily inject a `role=user` reminder telling you to use the correct reply function
102
102
 
103
103
  ### Low-Burden Rule
104
104
 
105
- - Focus on doing the current task correctly first; use `reply*` only when final upstream delivery is actually ready
105
+ - Focus on doing the current task correctly first; use `reply*` only when final tellasker delivery is actually ready
106
106
  - Do not memorize reply variants by yourself; follow the current assignment header and the function currently exposed by runtime
107
107
  - `reply*` tool descriptions are intentionally minimal and spec-like; use this manual's principles / scenarios for situational guidance
108
108
  - If runtime exposes only one `reply*`, that is the only correct completion path for the current state
109
- - `tellaskBack` is the fallback when ownership cannot be determined from existing SOP, or when upstream must answer; it is not the default first move for every blocked state
109
+ - `tellaskBack` is valid only when ownership cannot be determined from existing SOP, or when the tellasker must answer; it is not the default first move for every blocked state
110
110
 
111
111
  ## Best Practices
112
112
 
@@ -51,11 +51,11 @@ delete_reminder({
51
51
  - If the information should synchronize the whole team's current effective state, put it in Taskdoc `progress` instead
52
52
  - If the note is durable knowledge rather than an active working-set cue, move it to `personal_memory` instead
53
53
 
54
- ## Scenario 2: Sideline is complete, and the assignment header requires replyTellask
54
+ ## Scenario 2: Side Dialog is complete, and the assignment header requires replyTellask
55
55
 
56
56
  ### Scenario Description
57
57
 
58
- The current sideline is finished, and the assignment header explicitly says "when complete, call `replyTellask`".
58
+ The current Side Dialog is finished, and the assignment header explicitly says "when complete, call `replyTellask`".
59
59
 
60
60
  ### Example
61
61
 
@@ -72,11 +72,11 @@ replyTellask({
72
72
  - Put the final deliverable body directly in `replyContent`
73
73
  - If the header says `replyTellaskSessionless`, use the same shape with that exact function name
74
74
 
75
- ## Scenario 3: Work is not finished yet, and an upstream clarification is required
75
+ ## Scenario 3: Work is not finished yet, and tellasker clarification is required
76
76
 
77
77
  ### Scenario Description
78
78
 
79
- The sideline is still blocked or incomplete, so you need to ask upstream for missing information.
79
+ The Side Dialog is still blocked or incomplete, so you need to ask the tellasker for missing information.
80
80
 
81
81
  ### Example
82
82
 
@@ -89,15 +89,15 @@ tellaskBack({
89
89
 
90
90
  ### Key Points
91
91
 
92
- - This example uses `tellaskBack` because upstream input is specifically required
92
+ - This example uses `tellaskBack` because tellasker input is specifically required
93
93
  - If team SOP / role ownership already identifies the responsible executor, directly use `tellask` / `tellaskSessionless` for that owner instead of mapping every unfinished state to `tellaskBack`
94
94
  - Do not use `replyTellask*` for intermediate clarifications
95
95
 
96
- ## Scenario 4: Upstream answered the ask-back, so use replyTellaskBack to close
96
+ ## Scenario 4: Tellasker answered the ask-back, so use replyTellaskBack to close
97
97
 
98
98
  ### Scenario Description
99
99
 
100
- You previously sent a `tellaskBack`, upstream has now replied, and runtime exposes `replyTellaskBack`.
100
+ You previously sent a `tellaskBack`, the tellasker has now replied, and runtime exposes `replyTellaskBack`.
101
101
 
102
102
  ### Example
103
103
 
@@ -23,16 +23,16 @@
23
23
 
24
24
  The **tool descriptions themselves** for these functions intentionally stay minimal and spec-like. This section carries the smallest practical lookup for when they appear and how to choose among them.
25
25
 
26
- | Function | Minimal parameter contract | When runtime exposes it | Effect |
27
- | ------------------------- | ---------------------------- | --------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- |
28
- | `replyTellask` | `{ replyContent: string }` | Current sideline comes from a sessioned `tellask` and is ready for final delivery | Delivers the final result for the current tellask session |
29
- | `replyTellaskSessionless` | `{ replyContent: string }` | Current sideline comes from a one-shot `tellaskSessionless` and is ready for final delivery | Delivers the final result for the current one-shot tellask |
30
- | `replyTellaskBack` | `{ replyContent: string }` | Current dialog holds an unresolved `tellaskBack` reply directive | Delivers the final answer to the upstream ask-back |
31
- | `tellaskBack` | `{ tellaskContent: string }` | Current sideline must ask upstream back, and existing team SOP cannot directly assign another owner | Sends a follow-up request upstream; not final delivery |
26
+ | Function | Minimal parameter contract | When runtime exposes it | Effect |
27
+ | ------------------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
28
+ | `replyTellask` | `{ replyContent: string }` | Current Side Dialog comes from a sessioned `tellask` and is ready for final delivery | Delivers the final result for the current tellask session |
29
+ | `replyTellaskSessionless` | `{ replyContent: string }` | Current Side Dialog comes from a one-shot `tellaskSessionless` and is ready for final delivery | Delivers the final result for the current one-shot tellask |
30
+ | `replyTellaskBack` | `{ replyContent: string }` | Current dialog holds an unresolved `tellaskBack` reply directive | Delivers the final answer to the tellasker ask-back |
31
+ | `tellaskBack` | `{ tellaskContent: string }` | Current Side Dialog must ask the tellasker back, and existing team SOP cannot directly assign another owner | Sends a follow-up request to the tellasker; not final delivery |
32
32
 
33
33
  ### Minimal Usage Rules
34
34
 
35
- - Focus on doing the current task correctly first; only move into `reply*` closure when final upstream delivery is actually ready
35
+ - Focus on doing the current task correctly first; only move into `reply*` closure when final tellasker delivery is actually ready
36
36
  - Call whichever `reply*` runtime currently exposes; do not switch to another reply variant by yourself
37
37
  - If the assignment header explicitly names a reply function, follow that exact name
38
38
  - Put only the final deliverable body in `replyContent`; do not wrap it in meta-explanations like "I am now calling replyTellask"
@@ -93,20 +93,20 @@
93
93
  ### 决策规则
94
94
 
95
95
  - 当前支线未完成时,先判断团队规程 / SOP / 职责卡能否明确负责人;若能明确且属于执行性处理,直接 `tellask` / `tellaskSessionless` 对应负责人
96
- - 只有当必须向上游补需求、澄清目标、裁决取舍、确认验收口径、提供缺失输入,或现有规程无法明确判责时:调用 `tellaskBack({ tellaskContent })`
96
+ - 只有当必须向诉请者补需求、澄清目标、裁决取舍、确认验收口径、提供缺失输入,或现有规程无法明确判责时:调用 `tellaskBack({ tellaskContent })`
97
97
  - 需要人类亲自登录 / GUI / 验证码 / 高风险授权时:调用 `askHuman({ tellaskContent })`
98
98
  - 当前支线已经完成,且当前 assignment 明确要求 `replyTellask`:调用 `replyTellask({ replyContent })`
99
99
  - 当前支线已经完成,且当前 assignment 明确要求 `replyTellaskSessionless`:调用 `replyTellaskSessionless({ replyContent })`
100
- - 当前是在回复一条上游发来的 `tellaskBack` 续诉请,且 runtime 暴露了 `replyTellaskBack`:调用 `replyTellaskBack({ replyContent })`
100
+ - 当前是在回复一条诉请者发来的 `tellaskBack` 续诉请,且 runtime 暴露了 `replyTellaskBack`:调用 `replyTellaskBack({ replyContent })`
101
101
  - 普通文本不是跨对话完成交付通道;如果你直接输出正文而没调 reply 工具,runtime 可能临时插入一条 `role=user` 的提醒要求你改用正确的 reply 函数
102
102
 
103
103
  ### 心智负担最小化规则
104
104
 
105
- - 先专注把当前任务做对;`reply*` 只在最终对上游交付时用于收口
105
+ - 先专注把当前任务做对;`reply*` 只在最终对诉请者交付时用于收口
106
106
  - 不要靠记忆硬选 reply 变体;以当前 assignment 头部和 runtime 当前暴露的函数名为准
107
107
  - `reply*` 函数自身说明文案故意保持极简,只承载最小规格;情景判断看本手册的 principles / scenarios
108
108
  - 若 runtime 只暴露一个 `reply*`,那就是当前应调用的唯一完成路径
109
- - `tellaskBack` 是“无法按现有规程明确判责,或必须回问上游”的兜底动作,不是所有阻塞的默认第一动作
109
+ - `tellaskBack` 只在“无法按现有规程明确判责,或必须回问诉请者”时成立,不是所有阻塞的默认第一动作
110
110
 
111
111
  ## 最佳实践
112
112
 
@@ -71,11 +71,11 @@ replyTellask({
71
71
  - `replyContent` 直接放最终交付正文
72
72
  - 若 assignment 头部写的是 `replyTellaskSessionless`,则同结构替换函数名
73
73
 
74
- ## 场景 3:当前未完成,需要回问上游
74
+ ## 场景 3:当前未完成,需要回问诉请者
75
75
 
76
76
  ### 场景描述
77
77
 
78
- 当前支线仍未完成,因此需要向上游补问缺失信息。
78
+ 当前支线仍未完成,因此需要向诉请者补问缺失信息。
79
79
 
80
80
  ### 示例
81
81
 
@@ -84,12 +84,12 @@ tellaskBack({
84
84
  tellaskContent: '还缺少生产环境端口与部署入口信息。请补充这两项后我再继续给出最终方案。',
85
85
  });
86
86
 
87
- // 等上游补充后,runtime 会在当前对话里继续推进
87
+ // 等诉请者补充后,runtime 会在当前对话里继续推进
88
88
  ```
89
89
 
90
90
  ### 关键点
91
91
 
92
- - 这里只是“必须向上游补输入”的例子,所以用 `tellaskBack`
92
+ - 这里只是“必须向诉请者补输入”的例子,所以用 `tellaskBack`
93
93
  - 若团队规程 / SOP / 职责卡已经能明确执行负责人,应直接 `tellask` / `tellaskSessionless` 对应负责人,而不是机械因为“未完成态”就用 `tellaskBack`
94
94
  - `tellaskBack` 只负责把问题问回去,不负责最终交付
95
95
 
@@ -97,7 +97,7 @@ tellaskBack({
97
97
 
98
98
  ### 场景描述
99
99
 
100
- 你之前发过 `tellaskBack`,上游现在补回了所需信息,runtime 暴露了 `replyTellaskBack`。
100
+ 你之前发过 `tellaskBack`,诉请者现在补回了所需信息,runtime 暴露了 `replyTellaskBack`。
101
101
 
102
102
  ### 示例
103
103
 
@@ -27,12 +27,12 @@
27
27
  | ------------------------- | ---------------------------- | -------------------------------------------------------------------- | ----------------------------------- |
28
28
  | `replyTellask` | `{ replyContent: string }` | 当前支线承接的是 sessioned `tellask`,且已进入可交付完成态 | 把最终结果回复给当前 `tellask` 会话 |
29
29
  | `replyTellaskSessionless` | `{ replyContent: string }` | 当前支线承接的是 one-shot `tellaskSessionless`,且已进入可交付完成态 | 把最终结果回复给当前一次性诉请 |
30
- | `replyTellaskBack` | `{ replyContent: string }` | 当前对话持有一条未完成的 `tellaskBack` 回复指令 | 把对上一条回问的最终答复送回上游 |
31
- | `tellaskBack` | `{ tellaskContent: string }` | 当前支线必须回问上游,且现有团队规程无法直接判责到其他负责人 | 向上游发起续诉请,不算最终交付 |
30
+ | `replyTellaskBack` | `{ replyContent: string }` | 当前对话持有一条未完成的 `tellaskBack` 回复指令 | 把对上一条回问的最终答复送回诉请者 |
31
+ | `tellaskBack` | `{ tellaskContent: string }` | 当前支线必须回问诉请者,且现有团队规程无法直接判责到其他负责人 | 向诉请者发起续诉请,不算最终交付 |
32
32
 
33
33
  ### 最小使用规则
34
34
 
35
- - 先专注把当前任务做对;只有真到最终对上游交付时,才进入 `reply*` 收口
35
+ - 先专注把当前任务做对;只有真到最终对诉请者交付时,才进入 `reply*` 收口
36
36
  - 看见哪一个 `reply*` 被 runtime 暴露,就调用哪一个;不要自行改选别的 reply 变体
37
37
  - assignment 头部若已点名 reply 函数名,以那个名字为准
38
38
  - `replyContent` 只放最终交付正文,不要再包一层“我现在调用了 replyXXX”
@@ -103,7 +103,7 @@ Maintain shared terminology and standard wording across the team.
103
103
  add_team_memory({
104
104
  path: 'team/glossary/dialog-terms',
105
105
  content:
106
- '## Dialog Terms\n\n- In user-facing copy, prefer: Mainline dialog / Sideline dialog\n- In implementation context, main dialog / subdialog / supdialog are acceptable\n- Do not surface implementation terms directly into user-facing copy',
106
+ '## Dialog Terms\n\n- In user-facing copy, prefer: Main Dialog / Side Dialog\n- In implementation context, main dialog / sideDialog / askerDialog are acceptable\n- Do not surface implementation terms directly into user-facing copy',
107
107
  });
108
108
  ```
109
109
 
@@ -103,7 +103,7 @@ add_team_memory({
103
103
  add_team_memory({
104
104
  path: 'team/glossary/dialog-terms',
105
105
  content:
106
- '## 对话术语\n\n- 用户面向文案优先使用:主线对话 / 支线对话\n- 实现上下文可使用:main dialog / subdialog / supdialog\n- 不要把实现术语直接裸露到用户可见 copy',
106
+ '## 对话术语\n\n- 用户面向文案优先使用:主线对话 / 支线对话\n- 实现上下文可使用:main dialog / sideDialog / askerDialog\n- 不要把实现术语直接裸露到用户可见 copy',
107
107
  });
108
108
  ```
109
109
 
@@ -114,7 +114,7 @@ async function renderTeamMgmtGuideContent(language, topicsRaw = []) {
114
114
  '`model_param_options` 可选:用于记录该 provider 支持的 `.minds/team.yaml model_params` 选项(文档用途)。',
115
115
  '`apiQuirks` 可选:写在 `providers.<providerKey>.apiQuirks`,类型是 `string|string[]`。它是 provider 级 transport / 网关兼容开关,用来描述“这个供应商/网关的 API 有非标准行为”,不是 `.minds/team.yaml` 的成员参数,也不是 `model_params`。',
116
116
  '使用原则:只有在你确认某个上游网关确实偏离了标准协议,而且 Dominds 已为这个偏差实现了命名 quirk 时才配置;不要把它当作随意调参入口。当前实现里,未知 quirk 值通常不会报错,但也不会带来任何效果。',
117
- '当前已知示例:OpenAI Responses 包装层支持 `apiQuirks: xcode.best`(或数组里包含它)。它一方面会把供应商额外发出的 `keepalive` 流事件识别为 heartbeat,而不是当作异常事件处理;另一方面也会对该网关特有的失败模式做 provider-specific failure handling,包括“同一对话上下文连续返回 empty response”时先做少量临时重试;如果在同一未变化上下文里连续达到阈值,就判定这是 provider 侧 same-context deadlock,而不是普通基础设施抖动:此时继续沿用同一上下文自动重试大概率仍然不会有真实进展,必须引入新的信息或新的指令(例如补充上下文、改写问题、换一个切入方式,或在确实需要人类判断时调用 askHuman)。这类 provider/API retry 状态在同一次 driver 自动续跑链里会继续沿用,不因中途换 course 而自动清零;若当前对话启用了鞭策,driver 也会优先判断是否能按鞭策逻辑直接续跑一次,而不是先落入 stopped,并且一旦 driver 接受这次自动恢复资格,就会立刻记作已消费;这里的恢复语义是“deadlock break”而不是普通空转鞭策,所以即使当前轮次已经登记了在途诉请/支线对话,也不会仅因 pending subdialog 就否决这一次恢复;以及把网关返回的 HTML 版 502 Bad Gateway 错误页和 `500 auth_unavailable: no auth available` 这类基础设施失败归类为 conservative 策略重试。最小示例:\n```yaml\nproviders:\n my_gateway:\n apiType: openai\n baseUrl: https://example.invalid/v1\n apiKeyEnvVar: MY_GATEWAY_API_KEY\n apiQuirks: xcode.best\n models:\n my_model: { name: "upstream-model-id" }\n```',
117
+ '当前已知示例:OpenAI Responses 包装层支持 `apiQuirks: xcode.best`(或数组里包含它)。它一方面会把供应商额外发出的 `keepalive` 流事件识别为 heartbeat,而不是当作异常事件处理;另一方面也会对该网关特有的失败模式做 provider-specific failure handling,包括“同一对话上下文连续返回 empty response”时先做少量临时重试;如果在同一未变化上下文里连续达到阈值,就判定这是 provider 侧 same-context deadlock,而不是普通基础设施抖动:此时继续沿用同一上下文自动重试大概率仍然不会有真实进展,必须引入新的信息或新的指令(例如补充上下文、改写问题、换一个切入方式,或在确实需要人类判断时调用 askHuman)。这类 provider/API retry 状态在同一次 driver 自动续跑链里会继续沿用,不因中途换 course 而自动清零;若当前对话启用了鞭策,driver 也会优先判断是否能按鞭策逻辑直接续跑一次,而不是先落入 stopped,并且一旦 driver 接受这次自动恢复资格,就会立刻记作已消费;这里的恢复语义是“deadlock break”而不是普通空转鞭策,所以即使当前轮次已经登记了在途诉请/支线对话,也不会仅因 pending sideDialog 就否决这一次恢复;以及把网关返回的 HTML 版 502 Bad Gateway 错误页和 `500 auth_unavailable: no auth available` 这类基础设施失败归类为 conservative 策略重试。最小示例:\n```yaml\nproviders:\n my_gateway:\n apiType: openai\n baseUrl: https://example.invalid/v1\n apiKeyEnvVar: MY_GATEWAY_API_KEY\n apiQuirks: xcode.best\n models:\n my_model: { name: "upstream-model-id" }\n```',
118
118
  '边界提醒:`apiQuirks` 只影响实现里显式消费它的 provider/generator。就当前实现看,至少 OpenAI Responses 路径会读取它;不要假设所有 `apiType` 都支持或需要它。若配置后行为仍异常,应继续检查上游网关文档、抓流事件类型,并结合 `team_mgmt_check_provider(...)` / 运行日志排查。',
119
119
  ])
120
120
  : fmtHeader('.minds/llm.yaml') +
@@ -128,7 +128,7 @@ async function renderTeamMgmtGuideContent(language, topicsRaw = []) {
128
128
  'Optional: `model_param_options` documents `.minds/team.yaml model_params` knobs (documentation only).',
129
129
  '`apiQuirks` is optional under `providers.<providerKey>.apiQuirks`, with type `string|string[]`. It is a provider-level transport / gateway compatibility switch for non-standard upstream API behavior. It is not a `.minds/team.yaml` member field and not part of `model_params`.',
130
130
  'Use it only when you have confirmed that an upstream gateway deviates from the expected protocol and Dominds has an explicitly named quirk for that deviation. Do not treat it as a generic tuning field. In the current implementation, unknown quirk values are usually ignored rather than rejected, so a typo may silently do nothing.',
131
- 'Known current example: the OpenAI Responses wrapper supports `apiQuirks: xcode.best` (or an array containing it). It not only treats vendor-emitted `keepalive` stream events as heartbeat events instead of unexpected protocol noise, but also applies provider-specific failure handling for gateway-specific failures, including repeated empty responses in the same unchanged dialog context (a few temporary retries first; once the unchanged-context streak reaches the threshold, Dominds treats it as a provider-side same-context deadlock rather than ordinary infrastructure flakiness, which means repeating the same automatic retry path is no longer expected to make real progress and fresh information or fresh instructions are required, such as adding context, reframing the ask, changing the angle, or calling askHuman when human judgment is genuinely needed; this provider/API retry state intentionally continues across course changes within the same driver auto-continue chain; if Diligence Push is enabled for the dialog, the driver will first see whether it can continue once through that path before falling into stopped, and that recovery budget is considered consumed as soon as the driver accepts that path; this is a deadlock-break recovery rather than the ordinary idle-time Diligence Push, so a pending subdialog alone does not veto that one recovery injection) and gateway-returned HTML 502 Bad Gateway pages plus `500 auth_unavailable: no auth available` infrastructure failures classified into conservative retry. Minimal example:\n```yaml\nproviders:\n my_gateway:\n apiType: openai\n baseUrl: https://example.invalid/v1\n apiKeyEnvVar: MY_GATEWAY_API_KEY\n apiQuirks: xcode.best\n models:\n my_model: { name: "upstream-model-id" }\n```',
131
+ 'Known current example: the OpenAI Responses wrapper supports `apiQuirks: xcode.best` (or an array containing it). It not only treats vendor-emitted `keepalive` stream events as heartbeat events instead of unexpected protocol noise, but also applies provider-specific failure handling for gateway-specific failures, including repeated empty responses in the same unchanged dialog context (a few temporary retries first; once the unchanged-context streak reaches the threshold, Dominds treats it as a provider-side same-context deadlock rather than ordinary infrastructure flakiness, which means repeating the same automatic retry path is no longer expected to make real progress and fresh information or fresh instructions are required, such as adding context, reframing the ask, changing the angle, or calling askHuman when human judgment is genuinely needed; this provider/API retry state intentionally continues across course changes within the same driver auto-continue chain; if Diligence Push is enabled for the dialog, the driver will first see whether it can continue once through that path before falling into stopped, and that recovery budget is considered consumed as soon as the driver accepts that path; this is a deadlock-break recovery rather than the ordinary idle-time Diligence Push, so a pending sideDialog alone does not veto that one recovery injection) and gateway-returned HTML 502 Bad Gateway pages plus `500 auth_unavailable: no auth available` infrastructure failures classified into conservative retry. Minimal example:\n```yaml\nproviders:\n my_gateway:\n apiType: openai\n baseUrl: https://example.invalid/v1\n apiKeyEnvVar: MY_GATEWAY_API_KEY\n apiQuirks: xcode.best\n models:\n my_model: { name: "upstream-model-id" }\n```',
132
132
  'Boundary reminder: `apiQuirks` only affects providers/generators that explicitly read it in code. In the current implementation, at least the OpenAI Responses path consumes it; do not assume every `apiType` supports or needs it. If behavior is still wrong after setting it, continue with upstream gateway docs, raw stream event inspection, and `team_mgmt_check_provider(...)` / runtime logs.',
133
133
  ]);
134
134
  }
@@ -484,6 +484,7 @@ async function renderMcpManual(language) {
484
484
  '支持热重载:编辑 `.minds/mcp.yaml` 后通常无需重启 Dominds;必要时用 `mcp_restart`。',
485
485
  '默认按“每个对话租用一个 MCP 运行时实例”运行(更安全):某个对话首次使用该 server 时,可能为它启动/持有一个运行时实例(HTTP 连接或 stdio 进程),并添加 sticky reminder。确认当前对话不再需要该运行时实例后,用 `mcp_release` 释放。租约只表达运行时资源归属,不决定该 server 的全局工具注册/可见性;如确实是无状态服务器,可配置 `truely-stateless: true` 允许跨对话共享。',
486
486
  'stdio 配置格式:`command` 必须是字符串(可执行命令),参数放在 `args`(string[],可省略,默认空数组)。`cwd` 可选(字符串):用于固定相对路径解析目录。',
487
+ 'HTTP headers 支持三种值:字面量字符串、`{ env: NAME }`、`{ prefix: "Bearer ", env: NAME }`;认证 token 建议从环境变量读取,不要写死在 YAML。',
487
488
  '用 `tools.whitelist/blacklist` 控制暴露的工具,用 `transform` 做命名变换。',
488
489
  '常见坑:stdio transport 需要可执行命令路径正确,且受成员权限(目录 + 扩展名:`*_dirs/no_*_dirs/*_file_ext_names/no_*_file_ext_names`)约束;HTTP transport 需要服务可达(url/端口/网络)。',
489
490
  '高频坑(stdio 路径):若未设置 `cwd`,相对路径按 Dominds 进程工作目录(通常 rtws 根目录)解析;建议显式配置 `cwd` 或直接使用绝对路径。`cwd` 必须存在且是目录。',
@@ -545,6 +546,10 @@ async function renderMcpManual(language) {
545
546
  ' truely-stateless: false',
546
547
  ' transport: streamable_http',
547
548
  ' url: http://127.0.0.1:3000/mcp',
549
+ ' # headers:',
550
+ ' # Authorization:',
551
+ ' # prefix: "Bearer "',
552
+ ' # env: MCP_AUTH_TOKEN',
548
553
  ' tools: { whitelist: [], blacklist: [] }',
549
554
  ' transform: []',
550
555
  ' manual:',
@@ -563,6 +568,7 @@ async function renderMcpManual(language) {
563
568
  'Hot reload: edits usually apply without restarting Dominds; use `mcp_restart` when needed.',
564
569
  "Default is per-dialog MCP runtime leasing (safer): a dialog's first use may start/hold one runtime instance for that server (an HTTP connection or stdio process), and first use adds a sticky reminder. Call `mcp_release` when you're sure the current dialog no longer needs that runtime instance. This lease is about runtime resource ownership only; tool registration/visibility still follows the latest global server instance. If the server is truly stateless, set `truely-stateless: true` to allow cross-dialog sharing.",
565
570
  'Stdio shape: `command` must be a string executable; parameters go in `args` (string[], optional, defaults to empty). Optional `cwd` (string) fixes the working directory used for relative paths.',
571
+ 'HTTP headers support three value forms: literal strings, `{ env: NAME }`, and `{ prefix: "Bearer ", env: NAME }`; keep auth tokens in env instead of hardcoding them in YAML.',
566
572
  'Use `tools.whitelist/blacklist` for exposure control and `transform` for naming transforms.',
567
573
  'Common pitfalls: stdio transport needs a correct executable/command path, and is subject to member permissions (directory + extension: `*_dirs/no_*_dirs/*_file_ext_names/no_*_file_ext_names`); HTTP transport requires the server URL to be reachable.',
568
574
  'High-frequency pitfall (stdio paths): if `cwd` is omitted, relative paths are resolved from Dominds process cwd (usually rtws root). Prefer setting `cwd` explicitly or use absolute paths. `cwd` must exist and be a directory.',
@@ -624,6 +630,10 @@ async function renderMcpManual(language) {
624
630
  ' truely-stateless: false',
625
631
  ' transport: streamable_http',
626
632
  ' url: http://127.0.0.1:3000/mcp',
633
+ ' # headers:',
634
+ ' # Authorization:',
635
+ ' # prefix: "Bearer "',
636
+ ' # env: MCP_AUTH_TOKEN',
627
637
  ' tools: { whitelist: [], blacklist: [] }',
628
638
  ' transform: []',
629
639
  ' manual:',