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
@@ -1,23 +1,39 @@
1
1
  import type { DialogDisplayState, DialogInterruptionReason } from '@longrun-ai/kernel/types/display-state';
2
- import type { DialogDiligencePrompt, DialogPrompt, DialogRunControlSpec, DialogRuntimeGuidePrompt, DialogRuntimePrompt, DialogRuntimeReplyPrompt, DialogRuntimeSubdialogPrompt, DialogUserPrompt } from '@longrun-ai/kernel/types/drive-intent';
2
+ import type { DialogDiligencePrompt, DialogPrompt, DialogRunControlSpec, DialogRuntimeGuidePrompt, DialogRuntimePrompt, DialogRuntimeReplyPrompt, DialogRuntimeSideDialogPrompt, DialogUserPrompt } from '@longrun-ai/kernel/types/drive-intent';
3
3
  import type { Dialog, DialogID } from '../../dialog';
4
4
  export type KernelDriverRunControl = DialogRunControlSpec;
5
- export type KernelDriverDriveSource = 'unspecified' | 'ws_user_message' | 'ws_user_answer' | 'ws_diligence_push' | 'ws_resume_dialog' | 'ws_resume_all' | 'kernel_driver_backend_loop' | 'kernel_driver_follow_up' | 'kernel_driver_subdialog_init' | 'kernel_driver_subdialog_resume' | 'kernel_driver_fbr_subdialog_round' | 'kernel_driver_type_a_supdialog_call' | 'kernel_driver_supply_response_parent_revive';
5
+ export type KernelDriverDriveSource = 'unspecified' | 'ws_user_message' | 'ws_user_answer' | 'ws_diligence_push' | 'ws_resume_dialog' | 'ws_resume_all' | 'kernel_driver_backend_loop' | 'kernel_driver_follow_up' | 'kernel_driver_sideDialog_init' | 'kernel_driver_sideDialog_resume' | 'kernel_driver_fbr_sideDialog_round' | 'kernel_driver_type_a_askerDialog_call' | 'kernel_driver_supply_response_parent_revive';
6
6
  export type KernelDriverDriveOptions = Readonly<{
7
7
  suppressDiligencePush?: boolean;
8
8
  allowResumeFromInterrupted?: boolean;
9
- noPromptSubdialogResumeEntitlement?: Readonly<{
9
+ noPromptSideDialogResumeEntitlement?: Readonly<{
10
10
  ownerDialogId: string;
11
- reason: 'resolved_pending_subdialog_reply' | 'reply_tellask_back_delivered';
12
- subdialogId?: string;
11
+ reason: 'reply_tellask_back_delivered';
12
+ sideDialogId?: string;
13
13
  callType?: 'A' | 'B' | 'C';
14
14
  callId?: string;
15
+ }> | Readonly<{
16
+ ownerDialogId: string;
17
+ reason: 'replaced_pending_sideDialog_reply';
18
+ sideDialogId?: string;
19
+ callType?: 'A' | 'B' | 'C';
20
+ callId?: string;
21
+ }> | Readonly<{
22
+ ownerDialogId: string;
23
+ reason: 'resolved_pending_sideDialog_reply';
24
+ sideDialogId?: string;
25
+ callType?: 'A' | 'B' | 'C';
26
+ callId?: string;
27
+ callSiteCourse: number;
28
+ callSiteGenseq: number;
29
+ resolvedCallIds?: readonly string[];
30
+ triggerCallId?: string;
15
31
  }>;
16
32
  runControl?: KernelDriverRunControl;
17
33
  source: KernelDriverDriveSource;
18
34
  reason: string;
19
35
  }>;
20
- export type KernelDriverSubdialogReplyTarget = {
36
+ export type KernelDriverSideDialogReplyTarget = {
21
37
  ownerDialogId: string;
22
38
  callType: 'A' | 'B' | 'C';
23
39
  callId: string;
@@ -29,7 +45,7 @@ export type KernelDriverUserPrompt = KernelDriverPromptWithRunControl<DialogUser
29
45
  export type KernelDriverDiligencePrompt = KernelDriverPromptWithRunControl<DialogDiligencePrompt>;
30
46
  export type KernelDriverRuntimeGuidePrompt = KernelDriverPromptWithRunControl<DialogRuntimeGuidePrompt>;
31
47
  export type KernelDriverRuntimeReplyPrompt = KernelDriverPromptWithRunControl<DialogRuntimeReplyPrompt>;
32
- export type KernelDriverRuntimeSubdialogPrompt = KernelDriverPromptWithRunControl<DialogRuntimeSubdialogPrompt>;
48
+ export type KernelDriverRuntimeSideDialogPrompt = KernelDriverPromptWithRunControl<DialogRuntimeSideDialogPrompt>;
33
49
  export type KernelDriverRuntimePrompt = KernelDriverPromptWithRunControl<DialogRuntimePrompt>;
34
50
  export type KernelDriverPrompt = KernelDriverPromptWithRunControl<DialogPrompt>;
35
51
  export type KernelDriverDriveCallOptions = Readonly<{
@@ -63,7 +79,7 @@ export type KernelDriverEmitSayingArgs = [dlg: Dialog, content: string];
63
79
  export type KernelDriverEmitSayingResult = Promise<void>;
64
80
  export type KernelDriverSupplyResponseArgs = [
65
81
  parentDialog: Dialog,
66
- subdialogId: DialogID,
82
+ sideDialogId: DialogID,
67
83
  responseText: string,
68
84
  callType: 'A' | 'B' | 'C',
69
85
  callId?: string,
@@ -86,7 +102,7 @@ export type KernelDriverCoreResult = {
86
102
  lastAssistantSayingContent: string | null;
87
103
  lastAssistantSayingGenseq: number | null;
88
104
  lastFunctionCallGenseq: number | null;
89
- lastAssistantReplyTarget?: KernelDriverSubdialogReplyTarget;
105
+ lastAssistantReplyTarget?: KernelDriverSideDialogReplyTarget;
90
106
  fbrConclusion?: {
91
107
  responseText: string;
92
108
  responseGenseq: number;
@@ -12,6 +12,7 @@ export type McpHeaderValue = {
12
12
  } | {
13
13
  kind: 'from_env';
14
14
  env: string;
15
+ prefix: string;
15
16
  };
16
17
  export type McpTransport = 'stdio' | 'streamable_http';
17
18
  type McpServerConfigBase = {
@@ -61,6 +62,7 @@ export type McpConfigLoadResult = {
61
62
  }>;
62
63
  serverIdsInYamlOrder: ReadonlyArray<string>;
63
64
  validServerIdsInYamlOrder: ReadonlyArray<string>;
65
+ disabledServerIdsInYamlOrder: ReadonlyArray<string>;
64
66
  rawText: string;
65
67
  } | {
66
68
  ok: false;
@@ -26,6 +26,7 @@ function parseMcpYaml(rawText) {
26
26
  invalidServers: res.invalidServers,
27
27
  serverIdsInYamlOrder: res.serverIdsInYamlOrder,
28
28
  validServerIdsInYamlOrder: res.validServerIdsInYamlOrder,
29
+ disabledServerIdsInYamlOrder: res.disabledServerIdsInYamlOrder,
29
30
  rawText,
30
31
  };
31
32
  }
@@ -45,9 +46,14 @@ function parseWorkspaceConfig(value) {
45
46
  const invalidServers = [];
46
47
  const serverIdsInYamlOrder = [];
47
48
  const validServerIdsInYamlOrder = [];
49
+ const disabledServerIdsInYamlOrder = [];
48
50
  for (const [serverId, serverRaw] of Object.entries(serversRecord)) {
49
51
  serverIdsInYamlOrder.push(serverId);
50
52
  try {
53
+ if (isDisabledServerConfig(serverId, serverRaw)) {
54
+ disabledServerIdsInYamlOrder.push(serverId);
55
+ continue;
56
+ }
51
57
  servers[serverId] = parseServerConfig(serverId, serverRaw);
52
58
  validServerIdsInYamlOrder.push(serverId);
53
59
  }
@@ -63,8 +69,18 @@ function parseWorkspaceConfig(value) {
63
69
  invalidServers,
64
70
  serverIdsInYamlOrder,
65
71
  validServerIdsInYamlOrder,
72
+ disabledServerIdsInYamlOrder,
66
73
  };
67
74
  }
75
+ function isDisabledServerConfig(serverId, value) {
76
+ const obj = asRecord(value, `servers.${serverId}`);
77
+ const enabled = obj.enabled;
78
+ if (enabled === undefined || enabled === true)
79
+ return false;
80
+ if (enabled === false)
81
+ return true;
82
+ throw new Error(`Invalid mcp.yaml: servers.${serverId}.enabled must be a boolean`);
83
+ }
68
84
  function parseServerConfig(serverId, value) {
69
85
  const obj = asRecord(value, `servers.${serverId}`);
70
86
  const truelyStatelessVal = obj['truely-stateless'];
@@ -168,9 +184,14 @@ function parseServerConfig(serverId, value) {
168
184
  const mapped = asRecord(v, `servers.${serverId}.headers.${k}`);
169
185
  const fromEnv = mapped.env;
170
186
  if (typeof fromEnv !== 'string' || !fromEnv.trim()) {
171
- throw new Error(`Invalid mcp.yaml: servers.${serverId}.headers.${k} must be a string or { env: 'NAME' }`);
187
+ throw new Error(`Invalid mcp.yaml: servers.${serverId}.headers.${k} must be a string, { env: 'NAME' }, or { prefix: 'Bearer ', env: 'NAME' }`);
188
+ }
189
+ const prefixVal = mapped.prefix;
190
+ if (prefixVal !== undefined && typeof prefixVal !== 'string') {
191
+ throw new Error(`Invalid mcp.yaml: servers.${serverId}.headers.${k}.prefix must be a string`);
172
192
  }
173
- headers[k] = { kind: 'from_env', env: fromEnv };
193
+ const prefix = prefixVal ?? '';
194
+ headers[k] = { kind: 'from_env', env: fromEnv, prefix };
174
195
  }
175
196
  const sessionIdVal = obj.sessionId;
176
197
  const sessionId = sessionIdVal === undefined
@@ -1,7 +1,8 @@
1
+ import type { McpStreamableHttpServerConfig } from './config';
1
2
  export type McpDeclaredServerRuntimeStatus = Readonly<{
2
3
  serverId: string;
3
4
  transport: 'stdio' | 'streamable_http' | 'invalid' | 'unknown';
4
- status: 'loaded' | 'temporarily_unavailable' | 'config_invalid';
5
+ status: 'loaded' | 'temporarily_unavailable' | 'config_invalid' | 'disabled';
5
6
  errorText?: string;
6
7
  }>;
7
8
  export declare function isMcpToolsetLeasedToDialog(serverId: string, dialogKey: string): boolean;
@@ -25,9 +26,16 @@ export declare function requestMcpServerRestart(serverId: string): Promise<{
25
26
  ok: false;
26
27
  errorText: string;
27
28
  }>;
29
+ export declare function requestMcpServerDisable(serverId: string): Promise<{
30
+ ok: true;
31
+ } | {
32
+ ok: false;
33
+ errorText: string;
34
+ }>;
28
35
  export declare function requestMcpConfigReload(reason?: string): Promise<{
29
36
  ok: true;
30
37
  } | {
31
38
  ok: false;
32
39
  errorText: string;
33
40
  }>;
41
+ export declare function buildHttpHeaders(cfg: McpStreamableHttpServerConfig, serverId: string): Record<string, string>;
@@ -40,11 +40,14 @@ exports.getMcpDeclaredServerRuntimeStatuses = getMcpDeclaredServerRuntimeStatuse
40
40
  exports.startMcpSupervisor = startMcpSupervisor;
41
41
  exports.stopMcpSupervisor = stopMcpSupervisor;
42
42
  exports.requestMcpServerRestart = requestMcpServerRestart;
43
+ exports.requestMcpServerDisable = requestMcpServerDisable;
43
44
  exports.requestMcpConfigReload = requestMcpConfigReload;
45
+ exports.buildHttpHeaders = buildHttpHeaders;
44
46
  const time_1 = require("@longrun-ai/kernel/utils/time");
45
47
  const fs = __importStar(require("fs"));
46
48
  const node_crypto_1 = require("node:crypto");
47
49
  const path = __importStar(require("path"));
50
+ const yaml_1 = __importStar(require("yaml"));
48
51
  const log_1 = require("../log");
49
52
  const persistence_1 = require("../persistence");
50
53
  const problems_1 = require("../problems");
@@ -150,6 +153,7 @@ class McpServerDispatch {
150
153
  for (const rt of this.leasesByDialogKey.values()) {
151
154
  rt.requestStop({ forceKillAfterMs: 3000 });
152
155
  }
156
+ this.leasesByDialogKey.clear();
153
157
  for (const [dialogKey, init] of this.leaseInitByDialogKey.entries()) {
154
158
  this.canceledLeaseDialogs.add(dialogKey);
155
159
  void init
@@ -158,6 +162,7 @@ class McpServerDispatch {
158
162
  // ignore
159
163
  });
160
164
  }
165
+ this.leaseInitByDialogKey.clear();
161
166
  }
162
167
  async callToolForDialog(dlg, mcpToolName, args) {
163
168
  const serverId = this.serverId;
@@ -322,6 +327,13 @@ function getMcpDeclaredServerRuntimeStatuses() {
322
327
  errorText: catalogEntry.configErrorText,
323
328
  };
324
329
  }
330
+ if (catalogEntry?.disabled) {
331
+ return {
332
+ serverId,
333
+ transport: catalogEntry.transport,
334
+ status: 'disabled',
335
+ };
336
+ }
325
337
  if (serverStateById.has(serverId)) {
326
338
  return {
327
339
  serverId,
@@ -434,6 +446,27 @@ function requestMcpServerRestart(serverId) {
434
446
  });
435
447
  });
436
448
  }
449
+ function requestMcpServerDisable(serverId) {
450
+ return new Promise((resolve) => {
451
+ reloadChain = reloadChain
452
+ .then(async () => {
453
+ try {
454
+ const res = await disableServerNow(serverId);
455
+ resolve(res);
456
+ }
457
+ catch (err) {
458
+ const errorText = err instanceof Error ? err.message : String(err);
459
+ log.warn(`MCP server disable failed`, err, { serverId });
460
+ resolve({ ok: false, errorText });
461
+ }
462
+ })
463
+ .catch((err) => {
464
+ const errorText = err instanceof Error ? err.message : String(err);
465
+ log.warn(`MCP server disable enqueue failed`, err, { serverId });
466
+ resolve({ ok: false, errorText });
467
+ });
468
+ });
469
+ }
437
470
  function requestMcpConfigReload(reason = 'manual') {
438
471
  const normalizedReason = reason.trim() === '' ? 'manual' : reason.trim();
439
472
  return new Promise((resolve) => {
@@ -553,7 +586,7 @@ async function reloadNow(reason) {
553
586
  const code = isRecord(err) && 'code' in err ? err.code : undefined;
554
587
  if (code === 'ENOENT') {
555
588
  // Deletion is treated as empty config.
556
- await applyWorkspaceConfig({ version: 1, servers: {} }, [], [], [], `missing file (${reason})`);
589
+ await applyWorkspaceConfig({ version: 1, servers: {} }, [], [], [], [], null, `missing file (${reason})`);
557
590
  clearWorkspaceConfigProblem();
558
591
  await reconcileMcpManualProblemsForRuntime([], null);
559
592
  return;
@@ -571,10 +604,19 @@ async function reloadNow(reason) {
571
604
  return;
572
605
  }
573
606
  clearWorkspaceConfigProblem();
574
- await applyWorkspaceConfig(parsed.config, parsed.invalidServers, parsed.serverIdsInYamlOrder, parsed.validServerIdsInYamlOrder, reason);
607
+ await applyWorkspaceConfig(parsed.config, parsed.invalidServers, parsed.serverIdsInYamlOrder, parsed.validServerIdsInYamlOrder, parsed.disabledServerIdsInYamlOrder, rawText, reason);
575
608
  await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder, rawText);
576
609
  }
577
610
  async function restartServerNow(serverId) {
611
+ let removedPlaceholder = false;
612
+ const notifyPlaceholderRemovalOnFailure = (trigger) => {
613
+ if (!removedPlaceholder)
614
+ return;
615
+ (0, tool_availability_updates_1.notifyToolAvailabilityRegistryMaybeChanged)({
616
+ reason: 'registry_changed',
617
+ trigger,
618
+ });
619
+ };
578
620
  let rawText;
579
621
  try {
580
622
  rawText = await fs.promises.readFile(MCP_YAML_PATH, 'utf8');
@@ -591,23 +633,51 @@ async function restartServerNow(serverId) {
591
633
  upsertWorkspaceConfigProblem(`Failed to read ${MCP_YAML_PATH}: ${String(err)}`);
592
634
  return { ok: false, errorText: `Failed to read ${MCP_YAML_PATH}: ${String(err)}` };
593
635
  }
594
- const parsed = (0, config_1.parseMcpYaml)(rawText);
636
+ let activeRawText = rawText;
637
+ let parsed = (0, config_1.parseMcpYaml)(activeRawText);
595
638
  if (!parsed.ok) {
596
639
  await reconcileMcpManualProblemsForRuntime([], null);
597
640
  upsertWorkspaceConfigProblem(parsed.errorText);
598
641
  return { ok: false, errorText: parsed.errorText };
599
642
  }
600
643
  clearWorkspaceConfigProblem();
644
+ const disabledServer = parsed.serverIdsInYamlOrder.includes(serverId) &&
645
+ parsed.invalidServers.every((s) => s.serverId !== serverId) &&
646
+ parsed.config.servers[serverId] === undefined;
647
+ if (disabledServer) {
648
+ const enableRes = setServerEnabledInMcpYaml(rawText, serverId, true);
649
+ if (!enableRes.ok) {
650
+ await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder, rawText);
651
+ return { ok: false, errorText: enableRes.errorText };
652
+ }
653
+ if (enableRes.changed) {
654
+ await fs.promises.writeFile(MCP_YAML_PATH, enableRes.rawText, 'utf8');
655
+ lastSeenMcpYamlSig = await readMcpYamlSig();
656
+ removedPlaceholder = unregisterMcpToolsetPlaceholder(serverId) || removedPlaceholder;
657
+ }
658
+ activeRawText = enableRes.rawText;
659
+ parsed = (0, config_1.parseMcpYaml)(activeRawText);
660
+ if (!parsed.ok) {
661
+ clearDeclaredServerRuntimeCatalog();
662
+ await reconcileMcpManualProblemsForRuntime([], null);
663
+ upsertWorkspaceConfigProblem(parsed.errorText);
664
+ notifyPlaceholderRemovalOnFailure(`mcp:restart:${serverId}:parse-failed`);
665
+ return { ok: false, errorText: parsed.errorText };
666
+ }
667
+ clearWorkspaceConfigProblem();
668
+ }
601
669
  const invalid = parsed.invalidServers.find((s) => s.serverId === serverId);
602
670
  if (invalid) {
603
- replaceDeclaredServerRuntimeCatalog(parsed.config, parsed.invalidServers, parsed.serverIdsInYamlOrder);
604
- await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder, rawText);
671
+ replaceDeclaredServerRuntimeCatalog(parsed.config, parsed.invalidServers, parsed.serverIdsInYamlOrder, parsed.disabledServerIdsInYamlOrder);
672
+ await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder, activeRawText);
605
673
  upsertMcpServerConfigInvalidProblem(serverId, invalid.errorText);
674
+ notifyPlaceholderRemovalOnFailure(`mcp:restart:${serverId}:config-invalid`);
606
675
  return { ok: false, errorText: invalid.errorText };
607
676
  }
608
677
  const serverCfg = parsed.config.servers[serverId];
609
678
  if (!serverCfg) {
610
- await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder, rawText);
679
+ await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder, activeRawText);
680
+ notifyPlaceholderRemovalOnFailure(`mcp:restart:${serverId}:not-configured`);
611
681
  return {
612
682
  ok: false,
613
683
  errorText: `MCP server '${serverId}' is not configured in ${MCP_YAML_PATH}`,
@@ -617,25 +687,28 @@ async function restartServerNow(serverId) {
617
687
  const fingerprint = fingerprintServerConfig(serverCfg);
618
688
  const existing = serverStateById.get(serverId);
619
689
  const runtimeLeaseChanged = existing !== undefined;
620
- replaceDeclaredServerRuntimeCatalog(parsed.config, parsed.invalidServers, parsed.serverIdsInYamlOrder);
690
+ replaceDeclaredServerRuntimeCatalog(parsed.config, parsed.invalidServers, parsed.serverIdsInYamlOrder, parsed.disabledServerIdsInYamlOrder);
691
+ if (!existing) {
692
+ removedPlaceholder = unregisterMcpToolsetPlaceholder(serverId) || removedPlaceholder;
693
+ }
621
694
  const res = await tryBuildServerState(serverCfg, desiredToolsetName, fingerprint);
622
695
  if (!res.ok) {
623
- await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder, rawText);
696
+ await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder, activeRawText);
624
697
  upsertDeclaredServerRuntimeError(serverId, res.errorText);
625
698
  upsertMcpServerRuntimeUnavailableProblem(serverId, res.errorText, res.detailTextI18n);
699
+ notifyPlaceholderRemovalOnFailure(`mcp:restart:${serverId}:runtime-unavailable`);
626
700
  return { ok: false, errorText: res.errorText };
627
701
  }
628
702
  clearDeclaredServerRuntimeError(serverId);
629
703
  (0, problems_1.removeProblemsByPrefix)(`${problemPrefixForServer(serverId)}server_error`);
630
704
  if (existing) {
631
- unregisterServer(existing);
632
- existing.dispatch.requestStop();
705
+ stopLoadedServer(serverId);
633
706
  }
634
707
  registerServer(res.state);
635
708
  serverStateById.set(serverId, res.state);
636
709
  (0, problems_1.reconcileProblemsByPrefix)(problemPrefixForServer(serverId), res.state.problems);
637
710
  reorderMcpToolsetsInRegistry(parsed.serverIdsInYamlOrder);
638
- await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder, rawText);
711
+ await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder, activeRawText);
639
712
  (0, tool_availability_updates_1.notifyToolAvailabilityRegistryMaybeChanged)({
640
713
  reason: 'registry_changed',
641
714
  trigger: `mcp:restart:${serverId}`,
@@ -645,6 +718,119 @@ async function restartServerNow(serverId) {
645
718
  }
646
719
  return { ok: true };
647
720
  }
721
+ async function disableServerNow(serverId) {
722
+ const stoppedExisting = stopLoadedServer(serverId);
723
+ let rawText;
724
+ try {
725
+ rawText = await fs.promises.readFile(MCP_YAML_PATH, 'utf8');
726
+ }
727
+ catch (err) {
728
+ const code = isRecord(err) && 'code' in err ? err.code : undefined;
729
+ if (stoppedExisting) {
730
+ (0, tool_availability_updates_1.notifyToolAvailabilityRegistryMaybeChanged)({
731
+ reason: 'registry_changed',
732
+ trigger: `mcp:disable:${serverId}:read-failed`,
733
+ });
734
+ (0, tool_availability_updates_1.notifyToolAvailabilityRuntimeLeaseChanged)(`mcp:disable:${serverId}:read-failed`);
735
+ }
736
+ if (code === 'ENOENT') {
737
+ return { ok: false, errorText: `Cannot disable '${serverId}': ${MCP_YAML_PATH} is missing` };
738
+ }
739
+ return { ok: false, errorText: `Failed to read ${MCP_YAML_PATH}: ${String(err)}` };
740
+ }
741
+ const disableRes = setServerEnabledInMcpYaml(rawText, serverId, false);
742
+ if (!disableRes.ok) {
743
+ if (stoppedExisting) {
744
+ (0, tool_availability_updates_1.notifyToolAvailabilityRegistryMaybeChanged)({
745
+ reason: 'registry_changed',
746
+ trigger: `mcp:disable:${serverId}:disable-failed`,
747
+ });
748
+ (0, tool_availability_updates_1.notifyToolAvailabilityRuntimeLeaseChanged)(`mcp:disable:${serverId}:disable-failed`);
749
+ }
750
+ return { ok: false, errorText: disableRes.errorText };
751
+ }
752
+ if (disableRes.changed) {
753
+ await fs.promises.writeFile(MCP_YAML_PATH, disableRes.rawText, 'utf8');
754
+ lastSeenMcpYamlSig = await readMcpYamlSig();
755
+ }
756
+ const parsed = (0, config_1.parseMcpYaml)(disableRes.rawText);
757
+ if (!parsed.ok) {
758
+ clearDeclaredServerRuntimeCatalog();
759
+ await reconcileMcpManualProblemsForRuntime([], null);
760
+ upsertWorkspaceConfigProblem(parsed.errorText);
761
+ if (stoppedExisting) {
762
+ (0, tool_availability_updates_1.notifyToolAvailabilityRegistryMaybeChanged)({
763
+ reason: 'registry_changed',
764
+ trigger: `mcp:disable:${serverId}:parse-failed`,
765
+ });
766
+ (0, tool_availability_updates_1.notifyToolAvailabilityRuntimeLeaseChanged)(`mcp:disable:${serverId}:parse-failed`);
767
+ }
768
+ return { ok: false, errorText: parsed.errorText };
769
+ }
770
+ clearWorkspaceConfigProblem();
771
+ await applyWorkspaceConfig(parsed.config, parsed.invalidServers, parsed.serverIdsInYamlOrder, parsed.validServerIdsInYamlOrder, parsed.disabledServerIdsInYamlOrder, disableRes.rawText, `mcp_disable:${serverId}`);
772
+ await reconcileMcpManualProblemsForRuntime(parsed.serverIdsInYamlOrder, disableRes.rawText);
773
+ if (stoppedExisting) {
774
+ (0, tool_availability_updates_1.notifyToolAvailabilityRuntimeLeaseChanged)(`mcp:disable:${serverId}`);
775
+ }
776
+ return { ok: true };
777
+ }
778
+ function setServerEnabledInMcpYaml(rawText, serverId, enabled) {
779
+ const doc = yaml_1.default.parseDocument(rawText, { prettyErrors: true });
780
+ if (doc.errors.length > 0) {
781
+ return { ok: false, errorText: doc.errors.map((e) => String(e)).join('\n') };
782
+ }
783
+ const parsed = doc.toJS();
784
+ if (!isRecord(parsed)) {
785
+ return { ok: false, errorText: `Invalid mcp.yaml: expected object at mcp.yaml root` };
786
+ }
787
+ if (parsed.version !== 1) {
788
+ return { ok: false, errorText: `Invalid mcp.yaml: expected version: 1` };
789
+ }
790
+ const servers = parsed.servers;
791
+ const server = isRecord(servers) ? servers[serverId] : undefined;
792
+ if (!isRecord(server)) {
793
+ return {
794
+ ok: false,
795
+ errorText: `MCP server '${serverId}' is not configured in ${MCP_YAML_PATH}`,
796
+ };
797
+ }
798
+ const currentEnabled = server.enabled;
799
+ if (currentEnabled !== undefined && typeof currentEnabled !== 'boolean') {
800
+ return {
801
+ ok: false,
802
+ errorText: `Invalid mcp.yaml: servers.${serverId}.enabled must be a boolean`,
803
+ };
804
+ }
805
+ if (currentEnabled === enabled) {
806
+ return { ok: true, rawText, changed: false };
807
+ }
808
+ const serverNode = doc.getIn(['servers', serverId], true);
809
+ if (!(0, yaml_1.isMap)(serverNode)) {
810
+ return {
811
+ ok: false,
812
+ errorText: `Invalid mcp.yaml: servers.${serverId} must be an object`,
813
+ };
814
+ }
815
+ const existingEnabledPair = serverNode.items.find((pair) => (0, yaml_1.isScalar)(pair.key) && pair.key.value === 'enabled');
816
+ if (existingEnabledPair) {
817
+ existingEnabledPair.value = doc.createNode(enabled);
818
+ }
819
+ else {
820
+ serverNode.items.unshift(doc.createPair('enabled', enabled));
821
+ }
822
+ return { ok: true, rawText: String(doc), changed: true };
823
+ }
824
+ function stopLoadedServer(serverId) {
825
+ const existing = serverStateById.get(serverId);
826
+ if (!existing)
827
+ return false;
828
+ unregisterServer(existing);
829
+ existing.dispatch.requestStop();
830
+ serverStateById.delete(serverId);
831
+ (0, problems_1.reconcileProblemsByPrefix)(problemPrefixForServer(serverId), []);
832
+ return true;
833
+ }
648
834
  async function reconcileMcpManualProblemsForRuntime(serverIdsInYamlOrder, rawText) {
649
835
  const manualInfo = rawText === null ? (0, manual_problems_1.emptyMcpToolsetManualByServer)() : (0, manual_problems_1.parseMcpManualByServer)(rawText);
650
836
  await (0, manual_problems_1.reconcileMcpToolsetManualProblems)({
@@ -710,13 +896,15 @@ function upsertMcpToolCallProblem(args) {
710
896
  const hintLines = workLanguage === 'zh'
711
897
  ? [
712
898
  '建议排查:',
713
- `- 先释放租约:mcp_release({"serverId":"${args.serverId}"})`,
899
+ `- 如果需要全局重建该 MCP server,直接调用 mcp_restart({"serverId":"${args.serverId}"});它成功后会清理旧 runtime 的全部 lease`,
900
+ `- 如果只想丢弃当前对话的连接,再调用 mcp_release({"serverId":"${args.serverId}"})`,
714
901
  `- 重新打开/关闭浏览器窗口,避免 Playwright persistent context 残留`,
715
902
  `- 查看 ${MCP_YAML_PATH} 是否已加载且配置正确(Problems 面板 / 后端日志)`,
716
903
  ]
717
904
  : [
718
905
  'Suggested checks:',
719
- `- Release the lease first: mcp_release({"serverId":"${args.serverId}"})`,
906
+ `- To rebuild this MCP server globally, call mcp_restart({"serverId":"${args.serverId}"}) directly; a successful restart clears all leases on the old runtime`,
907
+ `- To discard only this dialog's connection, call mcp_release({"serverId":"${args.serverId}"})`,
720
908
  `- Close/reopen browser windows to avoid leftover Playwright persistent contexts`,
721
909
  `- Verify ${MCP_YAML_PATH} is loaded and valid (Problems panel / backend logs)`,
722
910
  ];
@@ -745,12 +933,13 @@ function upsertMcpToolCallProblem(args) {
745
933
  function clearMcpToolCallProblem(serverId) {
746
934
  (0, problems_1.removeProblemsByPrefix)(`${MCP_TOOL_CALL_PROBLEM_PREFIX}${sanitizePathSegment(serverId)}`);
747
935
  }
748
- async function applyWorkspaceConfig(config, invalidServers, serverIdsInYamlOrder, validServerIdsInYamlOrder, reason) {
936
+ async function applyWorkspaceConfig(config, invalidServers, serverIdsInYamlOrder, validServerIdsInYamlOrder, disabledServerIdsInYamlOrder, rawText, reason) {
749
937
  log.info(`Applying MCP rtws config (${reason})`);
750
- replaceDeclaredServerRuntimeCatalog(config, invalidServers, serverIdsInYamlOrder);
938
+ replaceDeclaredServerRuntimeCatalog(config, invalidServers, serverIdsInYamlOrder, disabledServerIdsInYamlOrder);
751
939
  let runtimeLeaseChanged = false;
752
940
  const invalidIds = new Set(invalidServers.map((s) => s.serverId));
753
941
  const desiredIds = new Set([...Object.keys(config.servers), ...invalidIds]);
942
+ const declaredIds = new Set(serverIdsInYamlOrder);
754
943
  // Remove deleted servers first.
755
944
  for (const [serverId, state] of serverStateById.entries()) {
756
945
  if (desiredIds.has(serverId))
@@ -761,8 +950,18 @@ async function applyWorkspaceConfig(config, invalidServers, serverIdsInYamlOrder
761
950
  serverStateById.delete(serverId);
762
951
  (0, problems_1.reconcileProblemsByPrefix)(problemPrefixForServer(serverId), []);
763
952
  }
953
+ // Remove disabled/deleted MCP placeholders that are no longer declared.
954
+ for (const [toolsetName, owner] of Array.from(toolsetOwnerByName.entries())) {
955
+ if (owner.kind !== 'mcp')
956
+ continue;
957
+ if (declaredIds.has(owner.serverId))
958
+ continue;
959
+ (0, registry_1.unregisterToolset)(toolsetName);
960
+ toolsetOwnerByName.delete(toolsetName);
961
+ }
764
962
  // Surface invalid server config errors (while keeping last-known-good runtimes registered).
765
963
  for (const s of invalidServers) {
964
+ unregisterMcpToolsetPlaceholder(s.serverId);
766
965
  upsertMcpServerConfigInvalidProblem(s.serverId, s.errorText);
767
966
  }
768
967
  // Apply desired servers independently (deterministic order).
@@ -774,6 +973,9 @@ async function applyWorkspaceConfig(config, invalidServers, serverIdsInYamlOrder
774
973
  const fingerprint = fingerprintServerConfig(serverCfg);
775
974
  const existing = serverStateById.get(serverId);
776
975
  if (!existing || existing.configFingerprint !== fingerprint) {
976
+ if (!existing) {
977
+ unregisterMcpToolsetPlaceholder(serverId);
978
+ }
777
979
  const res = await tryBuildServerState(serverCfg, desiredToolsetName, fingerprint);
778
980
  if (!res.ok) {
779
981
  upsertDeclaredServerRuntimeError(serverId, res.errorText);
@@ -826,6 +1028,11 @@ async function applyWorkspaceConfig(config, invalidServers, serverIdsInYamlOrder
826
1028
  if (!changed)
827
1029
  break;
828
1030
  }
1031
+ const manualInfo = rawText === null ? (0, manual_problems_1.emptyMcpToolsetManualByServer)() : (0, manual_problems_1.parseMcpManualByServer)(rawText);
1032
+ for (const serverId of disabledServerIdsInYamlOrder) {
1033
+ (0, problems_1.reconcileProblemsByPrefix)(problemPrefixForServer(serverId), []);
1034
+ registerDisabledServerToolset(serverId, manualInfo);
1035
+ }
829
1036
  reorderMcpToolsetsInRegistry(serverIdsInYamlOrder);
830
1037
  (0, tool_availability_updates_1.notifyToolAvailabilityRegistryMaybeChanged)({
831
1038
  reason: 'registry_changed',
@@ -848,7 +1055,7 @@ function clearDeclaredServerRuntimeCatalog() {
848
1055
  declaredServerIdsInYamlOrder = [];
849
1056
  declaredServerRuntimeCatalogById.clear();
850
1057
  }
851
- function replaceDeclaredServerRuntimeCatalog(config, invalidServers, serverIdsInYamlOrder) {
1058
+ function replaceDeclaredServerRuntimeCatalog(config, invalidServers, serverIdsInYamlOrder, disabledServerIdsInYamlOrder) {
852
1059
  const previousRuntimeErrors = new Map();
853
1060
  for (const [serverId, entry] of declaredServerRuntimeCatalogById.entries()) {
854
1061
  if (typeof entry.runtimeErrorText === 'string' && entry.runtimeErrorText.trim() !== '') {
@@ -857,7 +1064,15 @@ function replaceDeclaredServerRuntimeCatalog(config, invalidServers, serverIdsIn
857
1064
  }
858
1065
  declaredServerIdsInYamlOrder = [...serverIdsInYamlOrder];
859
1066
  declaredServerRuntimeCatalogById.clear();
1067
+ const disabledIds = new Set(disabledServerIdsInYamlOrder);
860
1068
  for (const serverId of serverIdsInYamlOrder) {
1069
+ if (disabledIds.has(serverId)) {
1070
+ declaredServerRuntimeCatalogById.set(serverId, {
1071
+ transport: 'unknown',
1072
+ disabled: true,
1073
+ });
1074
+ continue;
1075
+ }
861
1076
  const cfg = config.servers[serverId];
862
1077
  if (!cfg)
863
1078
  continue;
@@ -944,6 +1159,74 @@ function registerServer(state) {
944
1159
  });
945
1160
  toolsetOwnerByName.set(state.toolsetName, { kind: 'mcp', serverId: state.serverId });
946
1161
  }
1162
+ function registerDisabledServerToolset(serverId, manualInfo) {
1163
+ const existingToolset = registry_1.toolsetsRegistry.get(serverId);
1164
+ const existingOwner = toolsetOwnerByName.get(serverId);
1165
+ if (existingToolset && (!existingOwner || existingOwner.serverId !== serverId)) {
1166
+ upsertMcpServerConfigInvalidProblem(serverId, `Toolset name collision: ${serverId}`);
1167
+ return;
1168
+ }
1169
+ (0, registry_1.registerToolset)(serverId, []);
1170
+ const manual = manualInfo.manualByServerId.get(serverId);
1171
+ const manualSpec = manual?.contentFile
1172
+ ? (0, spec_1.buildMcpManualSpec)(manual.contentFile)
1173
+ : {
1174
+ topics: ['index'],
1175
+ warnOnMissing: false,
1176
+ includeSchemaToolsSection: false,
1177
+ };
1178
+ const inlineManual = manual ? renderInlineMcpToolsetManual(manual) : '';
1179
+ const disabledNoticeEn = [
1180
+ `This MCP server is configured but disabled in \`.minds/mcp.yaml\` (\`enabled: false\`).`,
1181
+ `It intentionally exposes zero tools until an MCP administrator enables it with \`mcp_restart({"serverId":"${serverId}"})\`.`,
1182
+ inlineManual,
1183
+ ]
1184
+ .filter((part) => part.trim() !== '')
1185
+ .join('\n\n');
1186
+ const disabledNoticeZh = [
1187
+ `该 MCP server 已在 \`.minds/mcp.yaml\` 中配置,但当前为禁用状态(\`enabled: false\`)。`,
1188
+ `它会刻意暴露为 0 工具的 toolset;需要 MCP 排障/管理员用 \`mcp_restart({"serverId":"${serverId}"})\` 启用后才会加载工具。`,
1189
+ inlineManual,
1190
+ ]
1191
+ .filter((part) => part.trim() !== '')
1192
+ .join('\n\n');
1193
+ (0, registry_1.setToolsetMeta)(serverId, {
1194
+ source: 'mcp',
1195
+ descriptionI18n: {
1196
+ en: `MCP server: ${serverId} (disabled)`,
1197
+ zh: `MCP 服务器:${serverId}(已禁用)`,
1198
+ },
1199
+ manualNoticeI18n: {
1200
+ en: disabledNoticeEn,
1201
+ zh: disabledNoticeZh,
1202
+ },
1203
+ ...(manualSpec !== undefined ? { manualSpec } : {}),
1204
+ });
1205
+ toolsetOwnerByName.set(serverId, { kind: 'mcp', serverId });
1206
+ }
1207
+ function renderInlineMcpToolsetManual(manual) {
1208
+ const parts = [];
1209
+ if (manual.content) {
1210
+ parts.push(manual.content);
1211
+ }
1212
+ for (const section of manual.sections) {
1213
+ parts.push(`#### ${section.title}\n\n${section.content}`);
1214
+ }
1215
+ return parts.join('\n\n');
1216
+ }
1217
+ function unregisterMcpToolsetPlaceholder(serverId) {
1218
+ if (serverStateById.has(serverId))
1219
+ return false;
1220
+ const owner = toolsetOwnerByName.get(serverId);
1221
+ if (owner?.kind !== 'mcp' || owner.serverId !== serverId)
1222
+ return false;
1223
+ const tools = registry_1.toolsetsRegistry.get(serverId);
1224
+ if (tools && tools.length > 0)
1225
+ return false;
1226
+ (0, registry_1.unregisterToolset)(serverId);
1227
+ toolsetOwnerByName.delete(serverId);
1228
+ return true;
1229
+ }
947
1230
  function unregisterServer(state) {
948
1231
  // Unregister toolset first so Team.Member.listTools doesn't resolve stale tools.
949
1232
  if (toolsetOwnerByName.get(state.toolsetName)?.serverId === state.serverId) {
@@ -1417,7 +1700,7 @@ function buildHttpHeaders(cfg, serverId) {
1417
1700
  if (val === undefined) {
1418
1701
  throw new Error(`MCP server '${serverId}' missing required host env var '${v.env}' (for headers.${k})`);
1419
1702
  }
1420
- headers[k] = val;
1703
+ headers[k] = `${v.prefix}${val}`;
1421
1704
  break;
1422
1705
  }
1423
1706
  default: {