dominds 1.18.2 → 1.19.3

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 (251) 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/cli/team-definition-audit.d.ts +2 -1
  11. package/dist/cli/team-definition-audit.js +20 -8
  12. package/dist/cli/validate-team-def.js +3 -3
  13. package/dist/dialog-display-state.d.ts +6 -6
  14. package/dist/dialog-display-state.js +46 -46
  15. package/dist/dialog-factory.d.ts +12 -12
  16. package/dist/dialog-factory.js +33 -30
  17. package/dist/dialog-fork.d.ts +2 -2
  18. package/dist/dialog-fork.js +140 -115
  19. package/dist/dialog-global-registry.d.ts +5 -5
  20. package/dist/dialog-global-registry.js +11 -11
  21. package/dist/dialog-instance-registry.d.ts +3 -3
  22. package/dist/dialog-instance-registry.js +52 -41
  23. package/dist/dialog.d.ts +100 -113
  24. package/dist/dialog.js +274 -229
  25. package/dist/docs/agent-priming.md +5 -5
  26. package/dist/docs/agent-priming.zh.md +5 -5
  27. package/dist/docs/app-constitution.md +1 -1
  28. package/dist/docs/app-constitution.zh.md +1 -1
  29. package/dist/docs/cli-usage.md +1 -1
  30. package/dist/docs/cli-usage.zh.md +1 -1
  31. package/dist/docs/design.md +14 -14
  32. package/dist/docs/design.zh.md +14 -14
  33. package/dist/docs/dialog-persistence.md +58 -58
  34. package/dist/docs/dialog-persistence.zh.md +61 -61
  35. package/dist/docs/dialog-system.md +363 -367
  36. package/dist/docs/dialog-system.zh.md +355 -357
  37. package/dist/docs/diligence-push.md +18 -18
  38. package/dist/docs/diligence-push.zh.md +17 -17
  39. package/dist/docs/dominds-agent-collaboration.zh.md +3 -3
  40. package/dist/docs/dominds-terminology.md +46 -47
  41. package/dist/docs/encapsulated-taskdoc.md +4 -4
  42. package/dist/docs/encapsulated-taskdoc.zh.md +3 -3
  43. package/dist/docs/fbr.md +30 -30
  44. package/dist/docs/fbr.zh.md +15 -15
  45. package/dist/docs/i18n.md +2 -2
  46. package/dist/docs/i18n.zh.md +2 -2
  47. package/dist/docs/mcp-support.md +16 -4
  48. package/dist/docs/mcp-support.zh.md +10 -2
  49. package/dist/docs/memory-system.md +4 -4
  50. package/dist/docs/memory-system.zh.md +1 -1
  51. package/dist/docs/mottos.md +1 -1
  52. package/dist/docs/mottos.zh.md +1 -1
  53. package/dist/docs/q4h.md +3 -3
  54. package/dist/docs/q4h.zh.md +1 -1
  55. package/dist/docs/roadmap.md +2 -2
  56. package/dist/docs/team_mgmt-toolset.md +16 -5
  57. package/dist/docs/team_mgmt-toolset.zh.md +13 -4
  58. package/dist/docs/tellask-collab.md +18 -18
  59. package/dist/docs/tellask-collab.zh.md +8 -8
  60. package/dist/docs/tellask-revive-context-refactor.zh.md +591 -0
  61. package/dist/docs/tool-availability-protocol.md +4 -2
  62. package/dist/evt-registry.d.ts +1 -2
  63. package/dist/evt-registry.js +2 -7
  64. package/dist/llm/gen/mock.js +9 -0
  65. package/dist/llm/kernel-driver/context.d.ts +1 -2
  66. package/dist/llm/kernel-driver/context.js +12 -26
  67. package/dist/llm/kernel-driver/drive.js +99 -75
  68. package/dist/llm/kernel-driver/engine.d.ts +2 -2
  69. package/dist/llm/kernel-driver/engine.js +10 -10
  70. package/dist/llm/kernel-driver/fbr.js +6 -6
  71. package/dist/llm/kernel-driver/flow.d.ts +1 -1
  72. package/dist/llm/kernel-driver/flow.js +129 -93
  73. package/dist/llm/kernel-driver/guardrails.js +4 -4
  74. package/dist/llm/kernel-driver/index.d.ts +1 -1
  75. package/dist/llm/kernel-driver/index.js +2 -2
  76. package/dist/llm/kernel-driver/loop.js +30 -30
  77. package/dist/llm/kernel-driver/reply-guidance.js +47 -52
  78. package/dist/llm/kernel-driver/restore.d.ts +3 -3
  79. package/dist/llm/kernel-driver/restore.js +23 -28
  80. package/dist/llm/kernel-driver/runtime.d.ts +1 -1
  81. package/dist/llm/kernel-driver/runtime.js +1 -1
  82. package/dist/llm/kernel-driver/sideDialog-txn.d.ts +8 -0
  83. package/dist/llm/kernel-driver/{subdialog-txn.js → sideDialog-txn.js} +13 -13
  84. package/dist/llm/kernel-driver/{subdialog.d.ts → sideDialog.d.ts} +13 -13
  85. package/dist/llm/kernel-driver/{subdialog.js → sideDialog.js} +203 -170
  86. package/dist/llm/kernel-driver/tellask-special.d.ts +7 -3
  87. package/dist/llm/kernel-driver/tellask-special.js +474 -497
  88. package/dist/llm/kernel-driver/types.d.ts +25 -9
  89. package/dist/mcp/config.d.ts +2 -0
  90. package/dist/mcp/config.js +23 -2
  91. package/dist/mcp/supervisor.d.ts +9 -1
  92. package/dist/mcp/supervisor.js +300 -17
  93. package/dist/minds/builtin/pangu/persona.en.md +4 -4
  94. package/dist/minds/load.js +11 -6
  95. package/dist/minds/system-prompt-parts.d.ts +1 -1
  96. package/dist/minds/system-prompt-parts.js +12 -12
  97. package/dist/minds/system-prompt.d.ts +2 -1
  98. package/dist/minds/system-prompt.js +70 -62
  99. package/dist/persistence-errors.d.ts +1 -1
  100. package/dist/persistence.d.ts +126 -121
  101. package/dist/persistence.js +1190 -786
  102. package/dist/priming.d.ts +3 -3
  103. package/dist/priming.js +62 -61
  104. package/dist/recovery/reply-special.js +5 -5
  105. package/dist/runtime/driver-messages.d.ts +3 -2
  106. package/dist/runtime/driver-messages.js +68 -57
  107. package/dist/runtime/inter-dialog-format.d.ts +12 -10
  108. package/dist/runtime/inter-dialog-format.js +80 -35
  109. package/dist/runtime/interjection-pause-stop.js +1 -1
  110. package/dist/runtime/reply-prompt-copy.d.ts +7 -3
  111. package/dist/runtime/reply-prompt-copy.js +39 -14
  112. package/dist/server/api-routes.js +87 -83
  113. package/dist/server/static-server.js +1 -1
  114. package/dist/server/websocket-handler.js +163 -153
  115. package/dist/tool-availability.js +1 -1
  116. package/dist/tools/app-reminders.js +17 -4
  117. package/dist/tools/builtins.js +2 -0
  118. package/dist/tools/ctrl.js +5 -5
  119. package/dist/tools/env.js +10 -58
  120. package/dist/tools/manual/render.js +4 -0
  121. package/dist/tools/mcp.d.ts +1 -0
  122. package/dist/tools/mcp.js +55 -5
  123. package/dist/tools/os.js +16 -16
  124. package/dist/tools/pending-tellask-reminder.js +20 -14
  125. package/dist/tools/prompts/control/en/index.md +1 -1
  126. package/dist/tools/prompts/control/en/principles.md +8 -8
  127. package/dist/tools/prompts/control/en/scenarios.md +7 -7
  128. package/dist/tools/prompts/control/en/tools.md +7 -7
  129. package/dist/tools/prompts/control/zh/principles.md +4 -4
  130. package/dist/tools/prompts/control/zh/scenarios.md +5 -5
  131. package/dist/tools/prompts/control/zh/tools.md +3 -3
  132. package/dist/tools/prompts/mcp_admin/en/errors.md +0 -14
  133. package/dist/tools/prompts/mcp_admin/en/index.md +5 -3
  134. package/dist/tools/prompts/mcp_admin/en/principles.md +11 -5
  135. package/dist/tools/prompts/mcp_admin/en/scenarios.md +19 -3
  136. package/dist/tools/prompts/mcp_admin/en/tools.md +85 -21
  137. package/dist/tools/prompts/mcp_admin/zh/errors.md +0 -14
  138. package/dist/tools/prompts/mcp_admin/zh/index.md +5 -3
  139. package/dist/tools/prompts/mcp_admin/zh/principles.md +11 -5
  140. package/dist/tools/prompts/mcp_admin/zh/scenarios.md +19 -3
  141. package/dist/tools/prompts/mcp_admin/zh/tools.md +85 -21
  142. package/dist/tools/prompts/os/en/errors.md +0 -28
  143. package/dist/tools/prompts/os/en/scenarios.md +1 -1
  144. package/dist/tools/prompts/os/en/tools.md +8 -17
  145. package/dist/tools/prompts/os/zh/errors.md +0 -28
  146. package/dist/tools/prompts/os/zh/scenarios.md +1 -1
  147. package/dist/tools/prompts/os/zh/tools.md +8 -17
  148. package/dist/tools/prompts/team_memory/en/scenarios.md +1 -1
  149. package/dist/tools/prompts/team_memory/zh/scenarios.md +1 -1
  150. package/dist/tools/registry.d.ts +5 -0
  151. package/dist/tools/team_mgmt-manual.js +2 -2
  152. package/dist/tools/team_mgmt-mcp-manual.d.ts +2 -2
  153. package/dist/tools/team_mgmt-mcp-manual.js +67 -16
  154. package/dist/tools/team_mgmt.js +8 -8
  155. package/dist/utils/taskdoc.js +12 -12
  156. package/package.json +3 -3
  157. package/webapp/dist/assets/{_basePickBy-BPJaiZdW.js → _basePickBy-Dnh413xT.js} +3 -3
  158. package/webapp/dist/assets/{_basePickBy-BPJaiZdW.js.map → _basePickBy-Dnh413xT.js.map} +1 -1
  159. package/webapp/dist/assets/{_baseUniq-BEetT15i.js → _baseUniq-DWzYqpN_.js} +2 -2
  160. package/webapp/dist/assets/{_baseUniq-BEetT15i.js.map → _baseUniq-DWzYqpN_.js.map} +1 -1
  161. package/webapp/dist/assets/{arc-Dm7Zf36f.js → arc-vfBkNCOx.js} +2 -2
  162. package/webapp/dist/assets/{arc-Dm7Zf36f.js.map → arc-vfBkNCOx.js.map} +1 -1
  163. package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-BpTPtkuo.js → architectureDiagram-VXUJARFQ-DiUEBXOa.js} +7 -7
  164. package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-BpTPtkuo.js.map → architectureDiagram-VXUJARFQ-DiUEBXOa.js.map} +1 -1
  165. package/webapp/dist/assets/{blockDiagram-VD42YOAC-C8fLN0iu.js → blockDiagram-VD42YOAC-BqK1KM2m.js} +7 -7
  166. package/webapp/dist/assets/{blockDiagram-VD42YOAC-C8fLN0iu.js.map → blockDiagram-VD42YOAC-BqK1KM2m.js.map} +1 -1
  167. package/webapp/dist/assets/{c4Diagram-YG6GDRKO-BpPr62CH.js → c4Diagram-YG6GDRKO-ClHNu1Uo.js} +3 -3
  168. package/webapp/dist/assets/{c4Diagram-YG6GDRKO-BpPr62CH.js.map → c4Diagram-YG6GDRKO-ClHNu1Uo.js.map} +1 -1
  169. package/webapp/dist/assets/{channel-EMYoPjW3.js → channel-BbWLVc8W.js} +2 -2
  170. package/webapp/dist/assets/{channel-EMYoPjW3.js.map → channel-BbWLVc8W.js.map} +1 -1
  171. package/webapp/dist/assets/{chunk-4BX2VUAB-CefNtjWG.js → chunk-4BX2VUAB-CItdSmZH.js} +2 -2
  172. package/webapp/dist/assets/{chunk-4BX2VUAB-CefNtjWG.js.map → chunk-4BX2VUAB-CItdSmZH.js.map} +1 -1
  173. package/webapp/dist/assets/{chunk-55IACEB6-C_X7T43V.js → chunk-55IACEB6-DSCX9WCf.js} +2 -2
  174. package/webapp/dist/assets/{chunk-55IACEB6-C_X7T43V.js.map → chunk-55IACEB6-DSCX9WCf.js.map} +1 -1
  175. package/webapp/dist/assets/{chunk-B4BG7PRW-BRe3_2oA.js → chunk-B4BG7PRW-5CRXFeD9.js} +5 -5
  176. package/webapp/dist/assets/{chunk-B4BG7PRW-BRe3_2oA.js.map → chunk-B4BG7PRW-5CRXFeD9.js.map} +1 -1
  177. package/webapp/dist/assets/{chunk-DI55MBZ5-CbvrsI_w.js → chunk-DI55MBZ5-CRMf6XZu.js} +4 -4
  178. package/webapp/dist/assets/{chunk-DI55MBZ5-CbvrsI_w.js.map → chunk-DI55MBZ5-CRMf6XZu.js.map} +1 -1
  179. package/webapp/dist/assets/{chunk-FMBD7UC4-ORmtkrtS.js → chunk-FMBD7UC4-BJ1vT2se.js} +2 -2
  180. package/webapp/dist/assets/{chunk-FMBD7UC4-ORmtkrtS.js.map → chunk-FMBD7UC4-BJ1vT2se.js.map} +1 -1
  181. package/webapp/dist/assets/{chunk-QN33PNHL-LTAOVhWu.js → chunk-QN33PNHL-CGyezTSD.js} +2 -2
  182. package/webapp/dist/assets/{chunk-QN33PNHL-LTAOVhWu.js.map → chunk-QN33PNHL-CGyezTSD.js.map} +1 -1
  183. package/webapp/dist/assets/{chunk-QZHKN3VN-ZoUM_4u5.js → chunk-QZHKN3VN-9xs15j8C.js} +2 -2
  184. package/webapp/dist/assets/{chunk-QZHKN3VN-ZoUM_4u5.js.map → chunk-QZHKN3VN-9xs15j8C.js.map} +1 -1
  185. package/webapp/dist/assets/{chunk-TZMSLE5B-Gao4qrq7.js → chunk-TZMSLE5B-D2g6Tj7Z.js} +2 -2
  186. package/webapp/dist/assets/{chunk-TZMSLE5B-Gao4qrq7.js.map → chunk-TZMSLE5B-D2g6Tj7Z.js.map} +1 -1
  187. package/webapp/dist/assets/{classDiagram-2ON5EDUG-uha1vIGN.js → classDiagram-2ON5EDUG-BQFGGJNm.js} +6 -6
  188. package/webapp/dist/assets/{classDiagram-2ON5EDUG-uha1vIGN.js.map → classDiagram-2ON5EDUG-BQFGGJNm.js.map} +1 -1
  189. package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-uha1vIGN.js → classDiagram-v2-WZHVMYZB-BQFGGJNm.js} +6 -6
  190. package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-uha1vIGN.js.map → classDiagram-v2-WZHVMYZB-BQFGGJNm.js.map} +1 -1
  191. package/webapp/dist/assets/{clone-_9Ayb1Gp.js → clone-DOfPd4cz.js} +2 -2
  192. package/webapp/dist/assets/{clone-_9Ayb1Gp.js.map → clone-DOfPd4cz.js.map} +1 -1
  193. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-C8wDw3NY.js → cose-bilkent-S5V4N54A-BYN-vqm8.js} +2 -2
  194. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-C8wDw3NY.js.map → cose-bilkent-S5V4N54A-BYN-vqm8.js.map} +1 -1
  195. package/webapp/dist/assets/{dagre-6UL2VRFP-BUSeNot0.js → dagre-6UL2VRFP-ClEaFABE.js} +7 -7
  196. package/webapp/dist/assets/{dagre-6UL2VRFP-BUSeNot0.js.map → dagre-6UL2VRFP-ClEaFABE.js.map} +1 -1
  197. package/webapp/dist/assets/{diagram-PSM6KHXK-CMZAksVC.js → diagram-PSM6KHXK-CM4hLE_0.js} +8 -8
  198. package/webapp/dist/assets/{diagram-PSM6KHXK-CMZAksVC.js.map → diagram-PSM6KHXK-CM4hLE_0.js.map} +1 -1
  199. package/webapp/dist/assets/{diagram-QEK2KX5R-BQKoRtwy.js → diagram-QEK2KX5R-BZjGFX-2.js} +7 -7
  200. package/webapp/dist/assets/{diagram-QEK2KX5R-BQKoRtwy.js.map → diagram-QEK2KX5R-BZjGFX-2.js.map} +1 -1
  201. package/webapp/dist/assets/{diagram-S2PKOQOG-DjMG97kd.js → diagram-S2PKOQOG-Bvw01OOG.js} +7 -7
  202. package/webapp/dist/assets/{diagram-S2PKOQOG-DjMG97kd.js.map → diagram-S2PKOQOG-Bvw01OOG.js.map} +1 -1
  203. package/webapp/dist/assets/{erDiagram-Q2GNP2WA-BujwA137.js → erDiagram-Q2GNP2WA-ctHu5zQL.js} +5 -5
  204. package/webapp/dist/assets/{erDiagram-Q2GNP2WA-BujwA137.js.map → erDiagram-Q2GNP2WA-ctHu5zQL.js.map} +1 -1
  205. package/webapp/dist/assets/{flowDiagram-NV44I4VS-DgwPjg4y.js → flowDiagram-NV44I4VS-m7ofIhri.js} +6 -6
  206. package/webapp/dist/assets/{flowDiagram-NV44I4VS-DgwPjg4y.js.map → flowDiagram-NV44I4VS-m7ofIhri.js.map} +1 -1
  207. package/webapp/dist/assets/{ganttDiagram-JELNMOA3-Db2ykf3E.js → ganttDiagram-JELNMOA3-D9wS5Veb.js} +3 -3
  208. package/webapp/dist/assets/{ganttDiagram-JELNMOA3-Db2ykf3E.js.map → ganttDiagram-JELNMOA3-D9wS5Veb.js.map} +1 -1
  209. package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-D_gSifkv.js → gitGraphDiagram-V2S2FVAM-B86qqJx7.js} +8 -8
  210. package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-D_gSifkv.js.map → gitGraphDiagram-V2S2FVAM-B86qqJx7.js.map} +1 -1
  211. package/webapp/dist/assets/{graph-BHjCU5xP.js → graph-u844GGQC.js} +3 -3
  212. package/webapp/dist/assets/{graph-BHjCU5xP.js.map → graph-u844GGQC.js.map} +1 -1
  213. package/webapp/dist/assets/{index-xvYYeHuy.css → index-BGdI3lWA.css} +17 -9
  214. package/webapp/dist/assets/{index-DLajsIDJ.js → index-tinPEZoH.js} +1211 -995
  215. package/webapp/dist/assets/index-tinPEZoH.js.map +1 -0
  216. package/webapp/dist/assets/{infoDiagram-HS3SLOUP-BDba5pKs.js → infoDiagram-HS3SLOUP-DwRPUctP.js} +6 -6
  217. package/webapp/dist/assets/{infoDiagram-HS3SLOUP-BDba5pKs.js.map → infoDiagram-HS3SLOUP-DwRPUctP.js.map} +1 -1
  218. package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-CmJAbmlm.js → journeyDiagram-XKPGCS4Q-B91ZO-ec.js} +5 -5
  219. package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-CmJAbmlm.js.map → journeyDiagram-XKPGCS4Q-B91ZO-ec.js.map} +1 -1
  220. package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-DxQeBTDk.js → kanban-definition-3W4ZIXB7-CoogrZ07.js} +3 -3
  221. package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-DxQeBTDk.js.map → kanban-definition-3W4ZIXB7-CoogrZ07.js.map} +1 -1
  222. package/webapp/dist/assets/{layout-DteV_yE8.js → layout-BrzQmqFJ.js} +5 -5
  223. package/webapp/dist/assets/{layout-DteV_yE8.js.map → layout-BrzQmqFJ.js.map} +1 -1
  224. package/webapp/dist/assets/{linear-zItbPrND.js → linear-C6H7K9Zy.js} +2 -2
  225. package/webapp/dist/assets/{linear-zItbPrND.js.map → linear-C6H7K9Zy.js.map} +1 -1
  226. package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-BJXI7UqO.js → mindmap-definition-VGOIOE7T-UDHZQkNZ.js} +4 -4
  227. package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-BJXI7UqO.js.map → mindmap-definition-VGOIOE7T-UDHZQkNZ.js.map} +1 -1
  228. package/webapp/dist/assets/{pieDiagram-ADFJNKIX-BpM-aH2p.js → pieDiagram-ADFJNKIX-M81uyQ1J.js} +8 -8
  229. package/webapp/dist/assets/{pieDiagram-ADFJNKIX-BpM-aH2p.js.map → pieDiagram-ADFJNKIX-M81uyQ1J.js.map} +1 -1
  230. package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-NXdIpA15.js → quadrantDiagram-AYHSOK5B-ClzIh9Gb.js} +3 -3
  231. package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-NXdIpA15.js.map → quadrantDiagram-AYHSOK5B-ClzIh9Gb.js.map} +1 -1
  232. package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-D1AICAA0.js → requirementDiagram-UZGBJVZJ-DLK3A-pn.js} +4 -4
  233. package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-D1AICAA0.js.map → requirementDiagram-UZGBJVZJ-DLK3A-pn.js.map} +1 -1
  234. package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-WiReDPfo.js → sankeyDiagram-TZEHDZUN-CYqju8I1.js} +2 -2
  235. package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-WiReDPfo.js.map → sankeyDiagram-TZEHDZUN-CYqju8I1.js.map} +1 -1
  236. package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-Cw76oP8t.js → sequenceDiagram-WL72ISMW-2guv6eOd.js} +4 -4
  237. package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-Cw76oP8t.js.map → sequenceDiagram-WL72ISMW-2guv6eOd.js.map} +1 -1
  238. package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-QjCeRczs.js → stateDiagram-FKZM4ZOC-iujqSp0X.js} +9 -9
  239. package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-QjCeRczs.js.map → stateDiagram-FKZM4ZOC-iujqSp0X.js.map} +1 -1
  240. package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-IClqxQ4s.js → stateDiagram-v2-4FDKWEC3-BxzY81ky.js} +5 -5
  241. package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-IClqxQ4s.js.map → stateDiagram-v2-4FDKWEC3-BxzY81ky.js.map} +1 -1
  242. package/webapp/dist/assets/{timeline-definition-IT6M3QCI-BfyfTY7m.js → timeline-definition-IT6M3QCI-DjCFSC8d.js} +3 -3
  243. package/webapp/dist/assets/{timeline-definition-IT6M3QCI-BfyfTY7m.js.map → timeline-definition-IT6M3QCI-DjCFSC8d.js.map} +1 -1
  244. package/webapp/dist/assets/{treemap-GDKQZRPO-C5MiL6--.js → treemap-GDKQZRPO-iaBzDWCP.js} +5 -5
  245. package/webapp/dist/assets/{treemap-GDKQZRPO-C5MiL6--.js.map → treemap-GDKQZRPO-iaBzDWCP.js.map} +1 -1
  246. package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-ybaJrSry.js → xychartDiagram-PRI3JC2R-R6Jl1c89.js} +3 -3
  247. package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-ybaJrSry.js.map → xychartDiagram-PRI3JC2R-R6Jl1c89.js.map} +1 -1
  248. package/webapp/dist/index.html +2 -2
  249. package/dist/docs/issues/global-dialog-event-broadcaster-missing.md +0 -128
  250. package/dist/llm/kernel-driver/subdialog-txn.d.ts +0 -8
  251. package/webapp/dist/assets/index-DLajsIDJ.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
  },
@@ -81,6 +81,7 @@ function manualSpecFor(toolsetId) {
81
81
  // MCP tools (local testing/ops)
82
82
  (0, registry_1.registerTool)(mcp_1.mcpRestartTool);
83
83
  (0, registry_1.registerTool)(mcp_1.mcpReleaseTool);
84
+ (0, registry_1.registerTool)(mcp_1.mcpDisableTool);
84
85
  // Memory tools
85
86
  (0, registry_1.registerTool)(mem_1.addPersonalMemoryTool);
86
87
  (0, registry_1.registerTool)(mem_1.dropPersonalMemoryTool);
@@ -169,6 +170,7 @@ for (const tool of team_mgmt_1.teamMgmtTools) {
169
170
  (0, registry_1.registerToolset)('mcp_admin', [
170
171
  mcp_1.mcpRestartTool,
171
172
  mcp_1.mcpReleaseTool,
173
+ mcp_1.mcpDisableTool,
172
174
  env_1.envGetTool,
173
175
  env_1.envSetTool,
174
176
  env_1.envUnsetTool,
@@ -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/env.js CHANGED
@@ -13,47 +13,20 @@ const log_1 = require("../log");
13
13
  const tool_1 = require("../tool");
14
14
  const log = (0, log_1.createLogger)('tools/env');
15
15
  const ENV_KEY_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;
16
- const DEFAULT_ALLOWED_PREFIXES = ['MCP_', 'UX_', 'DOMINDS_TEST_'];
17
- const DEFAULT_ALLOWED_EXACT = ['DOMINDS_LOG_LEVEL'];
18
- function isAllowedEnvKey(key) {
19
- if (!ENV_KEY_RE.test(key))
20
- return false;
21
- if (DEFAULT_ALLOWED_EXACT.includes(key))
22
- return true;
23
- for (const p of DEFAULT_ALLOWED_PREFIXES) {
24
- if (key.startsWith(p))
25
- return true;
26
- }
27
- return false;
28
- }
29
- function isSensitiveKeyName(key) {
30
- const upper = key.toUpperCase();
31
- return (upper.includes('KEY') ||
32
- upper.includes('TOKEN') ||
33
- upper.includes('SECRET') ||
34
- upper.includes('PASSWORD'));
35
- }
36
- function redactValue(value) {
37
- if (value.length <= 4)
38
- return '<redacted>';
39
- return `<redacted len=${value.length} prefix=${JSON.stringify(value.slice(0, 2))} suffix=${JSON.stringify(value.slice(-2))}>`;
40
- }
41
16
  function parseEnvGetArgs(args) {
42
17
  const key = args.key;
43
18
  if (typeof key !== 'string' || !key.trim()) {
44
19
  throw new Error(`env_get.key must be a non-empty string`);
45
20
  }
46
- const revealVal = args.reveal;
47
- if (revealVal !== undefined && typeof revealVal !== 'boolean') {
48
- throw new Error(`env_get.reveal must be a boolean if provided`);
49
- }
50
- return { key, reveal: revealVal };
21
+ assertValidEnvKey('env_get', key);
22
+ return { key };
51
23
  }
52
24
  function parseEnvSetArgs(args) {
53
25
  const key = args.key;
54
26
  if (typeof key !== 'string' || !key.trim()) {
55
27
  throw new Error(`env_set.key must be a non-empty string`);
56
28
  }
29
+ assertValidEnvKey('env_set', key);
57
30
  const value = args.value;
58
31
  if (typeof value !== 'string') {
59
32
  throw new Error(`env_set.value must be a string`);
@@ -65,16 +38,13 @@ function parseEnvUnsetArgs(args) {
65
38
  if (typeof key !== 'string' || !key.trim()) {
66
39
  throw new Error(`env_unset.key must be a non-empty string`);
67
40
  }
41
+ assertValidEnvKey('env_unset', key);
68
42
  return { key };
69
43
  }
70
44
  const envGetSchema = {
71
45
  type: 'object',
72
46
  properties: {
73
47
  key: { type: 'string', description: 'Environment variable name to read' },
74
- reveal: {
75
- type: 'boolean',
76
- description: 'When true, returns the raw value. For keys that look like secrets, default is redacted unless reveal=true.',
77
- },
78
48
  },
79
49
  required: ['key'],
80
50
  additionalProperties: false,
@@ -96,12 +66,9 @@ const envUnsetSchema = {
96
66
  required: ['key'],
97
67
  additionalProperties: false,
98
68
  };
99
- function assertAllowedKey(key) {
100
- if (!isAllowedEnvKey(key)) {
101
- throw new Error(`env key '${key}' is not allowed. Allowed: ${[
102
- ...DEFAULT_ALLOWED_EXACT,
103
- ...DEFAULT_ALLOWED_PREFIXES.map((p) => `${p}*`),
104
- ].join(', ')}`);
69
+ function assertValidEnvKey(toolName, key) {
70
+ if (!ENV_KEY_RE.test(key)) {
71
+ throw new Error(`${toolName}.key must be a valid environment variable name matching ${ENV_KEY_RE.source}`);
105
72
  }
106
73
  }
107
74
  exports.envGetTool = {
@@ -116,7 +83,6 @@ exports.envGetTool = {
116
83
  argsValidation: 'dominds',
117
84
  call: async (_dlg, caller, args) => {
118
85
  const parsed = parseEnvGetArgs(args);
119
- assertAllowedKey(parsed.key);
120
86
  const raw = process.env[parsed.key];
121
87
  const value = raw === undefined ? undefined : String(raw);
122
88
  log.debug('env_get', undefined, {
@@ -126,10 +92,6 @@ exports.envGetTool = {
126
92
  });
127
93
  if (value === undefined)
128
94
  return (0, tool_1.toolSuccess)('(unset)');
129
- if (parsed.reveal === true)
130
- return (0, tool_1.toolSuccess)(value);
131
- if (isSensitiveKeyName(parsed.key))
132
- return (0, tool_1.toolSuccess)(redactValue(value));
133
95
  return (0, tool_1.toolSuccess)(value);
134
96
  },
135
97
  };
@@ -145,7 +107,6 @@ exports.envSetTool = {
145
107
  argsValidation: 'dominds',
146
108
  call: async (_dlg, caller, args) => {
147
109
  const parsed = parseEnvSetArgs(args);
148
- assertAllowedKey(parsed.key);
149
110
  const prev = process.env[parsed.key];
150
111
  process.env[parsed.key] = parsed.value;
151
112
  log.warn('env_set', undefined, {
@@ -154,12 +115,8 @@ exports.envSetTool = {
154
115
  prevSet: prev !== undefined,
155
116
  nextLen: parsed.value.length,
156
117
  });
157
- const prevStr = prev === undefined
158
- ? '(unset)'
159
- : isSensitiveKeyName(parsed.key)
160
- ? redactValue(String(prev))
161
- : String(prev);
162
- const nextStr = isSensitiveKeyName(parsed.key) ? redactValue(parsed.value) : parsed.value;
118
+ const prevStr = prev === undefined ? '(unset)' : String(prev);
119
+ const nextStr = parsed.value;
163
120
  return (0, tool_1.toolSuccess)(`ok: ${parsed.key}\nprev: ${prevStr}\nnext: ${nextStr}`);
164
121
  },
165
122
  };
@@ -175,7 +132,6 @@ exports.envUnsetTool = {
175
132
  argsValidation: 'dominds',
176
133
  call: async (_dlg, caller, args) => {
177
134
  const parsed = parseEnvUnsetArgs(args);
178
- assertAllowedKey(parsed.key);
179
135
  const prev = process.env[parsed.key];
180
136
  delete process.env[parsed.key];
181
137
  log.warn('env_unset', undefined, {
@@ -183,11 +139,7 @@ exports.envUnsetTool = {
183
139
  key: parsed.key,
184
140
  prevSet: prev !== undefined,
185
141
  });
186
- const prevStr = prev === undefined
187
- ? '(unset)'
188
- : isSensitiveKeyName(parsed.key)
189
- ? redactValue(String(prev))
190
- : String(prev);
142
+ const prevStr = prev === undefined ? '(unset)' : String(prev);
191
143
  return (0, tool_1.toolSuccess)(`ok: ${parsed.key}\nprev: ${prevStr}\nnext: (unset)`);
192
144
  },
193
145
  };
@@ -84,6 +84,10 @@ function renderToolsetManual(input) {
84
84
  }
85
85
  }
86
86
  const sections = [];
87
+ const notice = meta.manualNoticeI18n?.[input.language]?.trim();
88
+ if (notice) {
89
+ sections.push(notice);
90
+ }
87
91
  if (missingTopics.length > 0) {
88
92
  sections.push(renderMissingTopicsWarning(input.language, input.toolsetId, missingTopics));
89
93
  }
@@ -6,4 +6,5 @@
6
6
  import type { FuncTool, ReminderOwner } from '../tool';
7
7
  export declare const mcpRestartTool: FuncTool;
8
8
  export declare const mcpReleaseTool: FuncTool;
9
+ export declare const mcpDisableTool: FuncTool;
9
10
  export declare const mcpLeaseReminderOwner: ReminderOwner;
package/dist/tools/mcp.js CHANGED
@@ -5,7 +5,7 @@
5
5
  * Local MCP supervisor control tools for testing and operations.
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.mcpLeaseReminderOwner = exports.mcpReleaseTool = exports.mcpRestartTool = void 0;
8
+ exports.mcpLeaseReminderOwner = exports.mcpDisableTool = exports.mcpReleaseTool = exports.mcpRestartTool = void 0;
9
9
  const log_1 = require("../log");
10
10
  const supervisor_1 = require("../mcp/supervisor");
11
11
  const driver_messages_1 = require("../runtime/driver-messages");
@@ -27,6 +27,13 @@ function parseMcpReleaseArgs(args) {
27
27
  }
28
28
  return { serverId };
29
29
  }
30
+ function parseMcpDisableArgs(args) {
31
+ const serverId = args.serverId;
32
+ if (typeof serverId !== 'string' || !serverId.trim()) {
33
+ throw new Error(`mcp_disable.serverId must be a non-empty string`);
34
+ }
35
+ return { serverId };
36
+ }
30
37
  function isMcpLeaseReminderMeta(value) {
31
38
  if (!isRecord(value) || Array.isArray(value))
32
39
  return false;
@@ -39,7 +46,7 @@ const mcpRestartSchema = {
39
46
  properties: {
40
47
  serverId: {
41
48
  type: 'string',
42
- description: "MCP server id from `.minds/mcp.yaml` (e.g., 'sdk_stdio'). Restarts this server only.",
49
+ description: "MCP server id from `.minds/mcp.yaml` (e.g., 'sdk_stdio'). Enables the server if needed, then restarts this server only.",
43
50
  },
44
51
  },
45
52
  required: ['serverId'],
@@ -56,13 +63,24 @@ const mcpReleaseSchema = {
56
63
  required: ['serverId'],
57
64
  additionalProperties: false,
58
65
  };
66
+ const mcpDisableSchema = {
67
+ type: 'object',
68
+ properties: {
69
+ serverId: {
70
+ type: 'string',
71
+ description: "MCP server id from `.minds/mcp.yaml` (e.g., 'playwright'). Stops any loaded runtime/leases and writes servers.<id>.enabled=false.",
72
+ },
73
+ },
74
+ required: ['serverId'],
75
+ additionalProperties: false,
76
+ };
59
77
  exports.mcpRestartTool = {
60
78
  type: 'func',
61
79
  name: 'mcp_restart',
62
- description: 'Restart a configured MCP server using the current `.minds/mcp.yaml` config (best-effort).',
80
+ description: 'Enable a configured MCP server if needed, then restart it using the current `.minds/mcp.yaml` config.',
63
81
  descriptionI18n: {
64
- en: 'Restart a configured MCP server using the current `.minds/mcp.yaml` config (best-effort).',
65
- zh: '使用当前的 `.minds/mcp.yaml` 配置重启指定的 MCP 服务器(尽力而为)。',
82
+ en: 'Enable a configured MCP server if needed, then restart it using the current `.minds/mcp.yaml` config.',
83
+ zh: '按需启用指定 MCP 服务器,然后使用当前 `.minds/mcp.yaml` 配置重启它。',
66
84
  },
67
85
  parameters: mcpRestartSchema,
68
86
  argsValidation: 'dominds',
@@ -126,6 +144,38 @@ exports.mcpReleaseTool = {
126
144
  return (0, tool_1.toolSuccess)(`ok: released ${parsed.serverId} for dialog ${dialogKey}`);
127
145
  },
128
146
  };
147
+ exports.mcpDisableTool = {
148
+ type: 'func',
149
+ name: 'mcp_disable',
150
+ description: 'Disable a configured MCP server, clear its loaded runtime/leases, and persist enabled=false in `.minds/mcp.yaml`.',
151
+ descriptionI18n: {
152
+ en: 'Disable a configured MCP server, clear its loaded runtime/leases, and persist enabled=false in `.minds/mcp.yaml`.',
153
+ zh: '禁用指定 MCP 服务器,清理其已加载运行时/租约,并在 `.minds/mcp.yaml` 中持久写入 enabled=false。',
154
+ },
155
+ parameters: mcpDisableSchema,
156
+ argsValidation: 'dominds',
157
+ call: async (_dlg, caller, args) => {
158
+ const parsed = parseMcpDisableArgs(args);
159
+ const res = await (0, supervisor_1.requestMcpServerDisable)(parsed.serverId);
160
+ if (res.ok) {
161
+ log.info('mcp_disable', undefined, {
162
+ caller: caller.id,
163
+ serverId: parsed.serverId,
164
+ ok: true,
165
+ });
166
+ }
167
+ else {
168
+ log.warn('mcp_disable failed', undefined, {
169
+ caller: caller.id,
170
+ serverId: parsed.serverId,
171
+ ok: false,
172
+ errorText: res.errorText,
173
+ });
174
+ return (0, tool_1.toolFailure)(`error: ${res.errorText}`);
175
+ }
176
+ return (0, tool_1.toolSuccess)(`ok: disabled ${parsed.serverId} and set enabled=false`);
177
+ },
178
+ };
129
179
  exports.mcpLeaseReminderOwner = {
130
180
  name: 'mcpLease',
131
181
  async updateReminder(dlg, reminder) {
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