dominds 1.19.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 (186) hide show
  1. package/dist/cli/team-definition-audit.d.ts +2 -1
  2. package/dist/cli/team-definition-audit.js +20 -8
  3. package/dist/cli/validate-team-def.js +3 -3
  4. package/dist/docs/mcp-support.md +11 -0
  5. package/dist/docs/mcp-support.zh.md +7 -0
  6. package/dist/docs/team_mgmt-toolset.md +5 -2
  7. package/dist/docs/team_mgmt-toolset.zh.md +4 -2
  8. package/dist/docs/tool-availability-protocol.md +4 -2
  9. package/dist/mcp/config.d.ts +1 -0
  10. package/dist/mcp/config.js +16 -0
  11. package/dist/mcp/supervisor.d.ts +7 -1
  12. package/dist/mcp/supervisor.js +298 -16
  13. package/dist/minds/load.js +5 -0
  14. package/dist/minds/system-prompt.d.ts +1 -0
  15. package/dist/minds/system-prompt.js +14 -6
  16. package/dist/tools/builtins.js +2 -0
  17. package/dist/tools/env.js +10 -58
  18. package/dist/tools/manual/render.js +4 -0
  19. package/dist/tools/mcp.d.ts +1 -0
  20. package/dist/tools/mcp.js +55 -5
  21. package/dist/tools/prompts/mcp_admin/en/errors.md +0 -14
  22. package/dist/tools/prompts/mcp_admin/en/index.md +5 -3
  23. package/dist/tools/prompts/mcp_admin/en/principles.md +11 -5
  24. package/dist/tools/prompts/mcp_admin/en/scenarios.md +19 -3
  25. package/dist/tools/prompts/mcp_admin/en/tools.md +85 -21
  26. package/dist/tools/prompts/mcp_admin/zh/errors.md +0 -14
  27. package/dist/tools/prompts/mcp_admin/zh/index.md +5 -3
  28. package/dist/tools/prompts/mcp_admin/zh/principles.md +11 -5
  29. package/dist/tools/prompts/mcp_admin/zh/scenarios.md +19 -3
  30. package/dist/tools/prompts/mcp_admin/zh/tools.md +85 -21
  31. package/dist/tools/prompts/os/en/errors.md +0 -28
  32. package/dist/tools/prompts/os/en/scenarios.md +1 -1
  33. package/dist/tools/prompts/os/en/tools.md +8 -17
  34. package/dist/tools/prompts/os/zh/errors.md +0 -28
  35. package/dist/tools/prompts/os/zh/scenarios.md +1 -1
  36. package/dist/tools/prompts/os/zh/tools.md +8 -17
  37. package/dist/tools/registry.d.ts +5 -0
  38. package/dist/tools/team_mgmt-mcp-manual.d.ts +2 -2
  39. package/dist/tools/team_mgmt-mcp-manual.js +57 -16
  40. package/dist/tools/team_mgmt.js +4 -4
  41. package/package.json +3 -3
  42. package/webapp/dist/assets/{_basePickBy-B7M9Q0Fa.js → _basePickBy-Dnh413xT.js} +3 -3
  43. package/webapp/dist/assets/_basePickBy-Dnh413xT.js.map +1 -0
  44. package/webapp/dist/assets/{_baseUniq-DAeYoL6j.js → _baseUniq-DWzYqpN_.js} +2 -2
  45. package/webapp/dist/assets/_baseUniq-DWzYqpN_.js.map +1 -0
  46. package/webapp/dist/assets/{arc-Bh4nDbNR.js → arc-vfBkNCOx.js} +2 -2
  47. package/webapp/dist/assets/arc-vfBkNCOx.js.map +1 -0
  48. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CxqmdsIm.js → architectureDiagram-VXUJARFQ-DiUEBXOa.js} +8 -26
  49. package/webapp/dist/assets/architectureDiagram-VXUJARFQ-DiUEBXOa.js.map +1 -0
  50. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-CxIWLtpt.js → blockDiagram-VD42YOAC-BqK1KM2m.js} +170 -187
  51. package/webapp/dist/assets/blockDiagram-VD42YOAC-BqK1KM2m.js.map +1 -0
  52. package/webapp/dist/assets/{c4Diagram-IC4MRINW-1qErOIgG.js → c4Diagram-YG6GDRKO-ClHNu1Uo.js} +4 -4
  53. package/webapp/dist/assets/c4Diagram-YG6GDRKO-ClHNu1Uo.js.map +1 -0
  54. package/webapp/dist/assets/{channel-DkgZHNUe.js → channel-BbWLVc8W.js} +2 -2
  55. package/webapp/dist/assets/channel-BbWLVc8W.js.map +1 -0
  56. package/webapp/dist/assets/{chunk-4BX2VUAB-BmdMbU9v.js → chunk-4BX2VUAB-CItdSmZH.js} +2 -2
  57. package/webapp/dist/assets/chunk-4BX2VUAB-CItdSmZH.js.map +1 -0
  58. package/webapp/dist/assets/{chunk-55IACEB6-D6LDTDBy.js → chunk-55IACEB6-DSCX9WCf.js} +2 -2
  59. package/webapp/dist/assets/chunk-55IACEB6-DSCX9WCf.js.map +1 -0
  60. package/webapp/dist/assets/{chunk-WL4C6EOR-B-Pk44be.js → chunk-B4BG7PRW-5CRXFeD9.js} +121 -171
  61. package/webapp/dist/assets/chunk-B4BG7PRW-5CRXFeD9.js.map +1 -0
  62. package/webapp/dist/assets/{chunk-NQ4KR5QH-wlvxalE3.js → chunk-DI55MBZ5-CRMf6XZu.js} +7 -9
  63. package/webapp/dist/assets/chunk-DI55MBZ5-CRMf6XZu.js.map +1 -0
  64. package/webapp/dist/assets/{chunk-FMBD7UC4-C-BdCe4C.js → chunk-FMBD7UC4-BJ1vT2se.js} +2 -2
  65. package/webapp/dist/assets/chunk-FMBD7UC4-BJ1vT2se.js.map +1 -0
  66. package/webapp/dist/assets/{chunk-KX2RTZJC-CA7sDJO5.js → chunk-QN33PNHL-CGyezTSD.js} +2 -2
  67. package/webapp/dist/assets/chunk-QN33PNHL-CGyezTSD.js.map +1 -0
  68. package/webapp/dist/assets/{chunk-QZHKN3VN-Bo1VMcph.js → chunk-QZHKN3VN-9xs15j8C.js} +2 -2
  69. package/webapp/dist/assets/chunk-QZHKN3VN-9xs15j8C.js.map +1 -0
  70. package/webapp/dist/assets/{chunk-JSJVCQXG-WA_BLIm9.js → chunk-TZMSLE5B-D2g6Tj7Z.js} +6 -14
  71. package/webapp/dist/assets/chunk-TZMSLE5B-D2g6Tj7Z.js.map +1 -0
  72. package/webapp/dist/assets/{classDiagram-VBA2DB6C-BqKuyb49.js → classDiagram-2ON5EDUG-BQFGGJNm.js} +6 -7
  73. package/webapp/dist/assets/classDiagram-2ON5EDUG-BQFGGJNm.js.map +1 -0
  74. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BqKuyb49.js → classDiagram-v2-WZHVMYZB-BQFGGJNm.js} +6 -7
  75. package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-BQFGGJNm.js.map +1 -0
  76. package/webapp/dist/assets/{clone-BX5z8WVZ.js → clone-DOfPd4cz.js} +2 -2
  77. package/webapp/dist/assets/clone-DOfPd4cz.js.map +1 -0
  78. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-B-s11SgN.js → cose-bilkent-S5V4N54A-BYN-vqm8.js} +2 -2
  79. package/webapp/dist/assets/cose-bilkent-S5V4N54A-BYN-vqm8.js.map +1 -0
  80. package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
  81. package/webapp/dist/assets/{dagre-KLK3FWXG-DmQFV2qK.js → dagre-6UL2VRFP-ClEaFABE.js} +7 -7
  82. package/webapp/dist/assets/dagre-6UL2VRFP-ClEaFABE.js.map +1 -0
  83. package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
  84. package/webapp/dist/assets/{diagram-E7M64L7V-QRaBfST8.js → diagram-PSM6KHXK-CM4hLE_0.js} +10 -10
  85. package/webapp/dist/assets/diagram-PSM6KHXK-CM4hLE_0.js.map +1 -0
  86. package/webapp/dist/assets/{diagram-IFDJBPK2-lrWn1Obo.js → diagram-QEK2KX5R-BZjGFX-2.js} +8 -9
  87. package/webapp/dist/assets/diagram-QEK2KX5R-BZjGFX-2.js.map +1 -0
  88. package/webapp/dist/assets/{diagram-P4PSJMXO-sTU7Hh-Y.js → diagram-S2PKOQOG-Bvw01OOG.js} +8 -8
  89. package/webapp/dist/assets/diagram-S2PKOQOG-Bvw01OOG.js.map +1 -0
  90. package/webapp/dist/assets/{erDiagram-INFDFZHY-Cx6jc9Wq.js → erDiagram-Q2GNP2WA-ctHu5zQL.js} +75 -96
  91. package/webapp/dist/assets/erDiagram-Q2GNP2WA-ctHu5zQL.js.map +1 -0
  92. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DfGI49Dz.js → flowDiagram-NV44I4VS-m7ofIhri.js} +81 -98
  93. package/webapp/dist/assets/flowDiagram-NV44I4VS-m7ofIhri.js.map +1 -0
  94. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-nrcHWWaM.js → ganttDiagram-JELNMOA3-D9wS5Veb.js} +3 -28
  95. package/webapp/dist/assets/ganttDiagram-JELNMOA3-D9wS5Veb.js.map +1 -0
  96. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js → gitGraphDiagram-V2S2FVAM-B86qqJx7.js} +46 -38
  97. package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-B86qqJx7.js.map +1 -0
  98. package/webapp/dist/assets/graph-u844GGQC.js +425 -0
  99. package/webapp/dist/assets/graph-u844GGQC.js.map +1 -0
  100. package/webapp/dist/assets/{index-DZFkLLVz.css → index-BGdI3lWA.css} +1 -1
  101. package/webapp/dist/assets/{index--fy89xGh.js → index-tinPEZoH.js} +1059 -1034
  102. package/webapp/dist/assets/{index--fy89xGh.js.map → index-tinPEZoH.js.map} +1 -1
  103. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-PIoZHr7s.js → infoDiagram-HS3SLOUP-DwRPUctP.js} +7 -7
  104. package/webapp/dist/assets/infoDiagram-HS3SLOUP-DwRPUctP.js.map +1 -0
  105. package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
  106. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-C2qidjQ5.js → journeyDiagram-XKPGCS4Q-B91ZO-ec.js} +5 -5
  107. package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-B91ZO-ec.js.map +1 -0
  108. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Du0TC8WS.js → kanban-definition-3W4ZIXB7-CoogrZ07.js} +3 -5
  109. package/webapp/dist/assets/kanban-definition-3W4ZIXB7-CoogrZ07.js.map +1 -0
  110. package/webapp/dist/assets/{layout-VmEo1OEB.js → layout-BrzQmqFJ.js} +5 -5
  111. package/webapp/dist/assets/layout-BrzQmqFJ.js.map +1 -0
  112. package/webapp/dist/assets/{linear-B662YHAc.js → linear-C6H7K9Zy.js} +2 -2
  113. package/webapp/dist/assets/linear-C6H7K9Zy.js.map +1 -0
  114. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-D7arZj95.js → mindmap-definition-VGOIOE7T-UDHZQkNZ.js} +5 -7
  115. package/webapp/dist/assets/mindmap-definition-VGOIOE7T-UDHZQkNZ.js.map +1 -0
  116. package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
  117. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DvjPP4PA.js → pieDiagram-ADFJNKIX-M81uyQ1J.js} +8 -8
  118. package/webapp/dist/assets/pieDiagram-ADFJNKIX-M81uyQ1J.js.map +1 -0
  119. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-B_JUGMj_.js → quadrantDiagram-AYHSOK5B-ClzIh9Gb.js} +3 -3
  120. package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-ClzIh9Gb.js.map +1 -0
  121. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DF0mpvE3.js → requirementDiagram-UZGBJVZJ-DLK3A-pn.js} +6 -16
  122. package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-DLK3A-pn.js.map +1 -0
  123. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-CoXlxv00.js → sankeyDiagram-TZEHDZUN-CYqju8I1.js} +2 -2
  124. package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-CYqju8I1.js.map +1 -0
  125. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DYqT5Pg7.js → sequenceDiagram-WL72ISMW-2guv6eOd.js} +201 -601
  126. package/webapp/dist/assets/sequenceDiagram-WL72ISMW-2guv6eOd.js.map +1 -0
  127. package/webapp/dist/assets/{stateDiagram-RAJIS63D-D9b1mN8-.js → stateDiagram-FKZM4ZOC-iujqSp0X.js} +9 -9
  128. package/webapp/dist/assets/stateDiagram-FKZM4ZOC-iujqSp0X.js.map +1 -0
  129. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DNzgudL_.js → stateDiagram-v2-4FDKWEC3-BxzY81ky.js} +5 -5
  130. package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-BxzY81ky.js.map +1 -0
  131. package/webapp/dist/assets/{timeline-definition-YZTLITO2-CkyKUY7A.js → timeline-definition-IT6M3QCI-DjCFSC8d.js} +3 -3
  132. package/webapp/dist/assets/timeline-definition-IT6M3QCI-DjCFSC8d.js.map +1 -0
  133. package/webapp/dist/assets/{treemap-KZPCXAKY-CZd09kF-.js → treemap-GDKQZRPO-iaBzDWCP.js} +24 -37
  134. package/webapp/dist/assets/treemap-GDKQZRPO-iaBzDWCP.js.map +1 -0
  135. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BRwRloPc.js → xychartDiagram-PRI3JC2R-R6Jl1c89.js} +4 -4
  136. package/webapp/dist/assets/xychartDiagram-PRI3JC2R-R6Jl1c89.js.map +1 -0
  137. package/webapp/dist/index.html +2 -2
  138. package/webapp/dist/assets/_basePickBy-B7M9Q0Fa.js.map +0 -1
  139. package/webapp/dist/assets/_baseUniq-DAeYoL6j.js.map +0 -1
  140. package/webapp/dist/assets/arc-Bh4nDbNR.js.map +0 -1
  141. package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-CxqmdsIm.js.map +0 -1
  142. package/webapp/dist/assets/blockDiagram-WCTKOSBZ-CxIWLtpt.js.map +0 -1
  143. package/webapp/dist/assets/c4Diagram-IC4MRINW-1qErOIgG.js.map +0 -1
  144. package/webapp/dist/assets/channel-DkgZHNUe.js.map +0 -1
  145. package/webapp/dist/assets/chunk-4BX2VUAB-BmdMbU9v.js.map +0 -1
  146. package/webapp/dist/assets/chunk-55IACEB6-D6LDTDBy.js.map +0 -1
  147. package/webapp/dist/assets/chunk-FMBD7UC4-C-BdCe4C.js.map +0 -1
  148. package/webapp/dist/assets/chunk-JSJVCQXG-WA_BLIm9.js.map +0 -1
  149. package/webapp/dist/assets/chunk-KX2RTZJC-CA7sDJO5.js.map +0 -1
  150. package/webapp/dist/assets/chunk-NQ4KR5QH-wlvxalE3.js.map +0 -1
  151. package/webapp/dist/assets/chunk-QZHKN3VN-Bo1VMcph.js.map +0 -1
  152. package/webapp/dist/assets/chunk-WL4C6EOR-B-Pk44be.js.map +0 -1
  153. package/webapp/dist/assets/classDiagram-VBA2DB6C-BqKuyb49.js.map +0 -1
  154. package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-BqKuyb49.js.map +0 -1
  155. package/webapp/dist/assets/clone-BX5z8WVZ.js.map +0 -1
  156. package/webapp/dist/assets/cose-bilkent-S5V4N54A-B-s11SgN.js.map +0 -1
  157. package/webapp/dist/assets/dagre-KLK3FWXG-DmQFV2qK.js.map +0 -1
  158. package/webapp/dist/assets/diagram-E7M64L7V-QRaBfST8.js.map +0 -1
  159. package/webapp/dist/assets/diagram-IFDJBPK2-lrWn1Obo.js.map +0 -1
  160. package/webapp/dist/assets/diagram-P4PSJMXO-sTU7Hh-Y.js.map +0 -1
  161. package/webapp/dist/assets/erDiagram-INFDFZHY-Cx6jc9Wq.js.map +0 -1
  162. package/webapp/dist/assets/flowDiagram-PKNHOUZH-DfGI49Dz.js.map +0 -1
  163. package/webapp/dist/assets/ganttDiagram-A5KZAMGK-nrcHWWaM.js.map +0 -1
  164. package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js.map +0 -1
  165. package/webapp/dist/assets/graph-R5G-y8tB.js +0 -782
  166. package/webapp/dist/assets/graph-R5G-y8tB.js.map +0 -1
  167. package/webapp/dist/assets/infoDiagram-LFFYTUFH-PIoZHr7s.js.map +0 -1
  168. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-oCM-LYk1.js +0 -966
  169. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-oCM-LYk1.js.map +0 -1
  170. package/webapp/dist/assets/journeyDiagram-4ABVD52K-C2qidjQ5.js.map +0 -1
  171. package/webapp/dist/assets/kanban-definition-K7BYSVSG-Du0TC8WS.js.map +0 -1
  172. package/webapp/dist/assets/layout-VmEo1OEB.js.map +0 -1
  173. package/webapp/dist/assets/linear-B662YHAc.js.map +0 -1
  174. package/webapp/dist/assets/mindmap-definition-YRQLILUH-D7arZj95.js.map +0 -1
  175. package/webapp/dist/assets/pieDiagram-SKSYHLDU-DvjPP4PA.js.map +0 -1
  176. package/webapp/dist/assets/quadrantDiagram-337W2JSQ-B_JUGMj_.js.map +0 -1
  177. package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-DF0mpvE3.js.map +0 -1
  178. package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-CoXlxv00.js.map +0 -1
  179. package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-DYqT5Pg7.js.map +0 -1
  180. package/webapp/dist/assets/stateDiagram-RAJIS63D-D9b1mN8-.js.map +0 -1
  181. package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-DNzgudL_.js.map +0 -1
  182. package/webapp/dist/assets/timeline-definition-YZTLITO2-CkyKUY7A.js.map +0 -1
  183. package/webapp/dist/assets/treemap-KZPCXAKY-CZd09kF-.js.map +0 -1
  184. package/webapp/dist/assets/vennDiagram-LZ73GAT5-BxVF5Olo.js +0 -2487
  185. package/webapp/dist/assets/vennDiagram-LZ73GAT5-BxVF5Olo.js.map +0 -1
  186. package/webapp/dist/assets/xychartDiagram-JWTSCODW-BRwRloPc.js.map +0 -1
@@ -8,10 +8,11 @@ export type McpDeclaredToolsets = Readonly<{
8
8
  kind: 'loaded';
9
9
  declaredServerIds: ReadonlySet<string>;
10
10
  invalidServerIds: ReadonlySet<string>;
11
+ disabledServerIds: ReadonlySet<string>;
11
12
  }>;
12
13
  export type ToolsetAuditItem = Readonly<{
13
14
  toolsetName: string;
14
- status: 'registered' | 'mcp_declared_unloaded' | 'mcp_declared_invalid' | 'missing';
15
+ status: 'registered' | 'mcp_declared_unloaded' | 'mcp_declared_invalid' | 'mcp_declared_disabled' | 'missing';
15
16
  }>;
16
17
  export type ToolsetAuditReport = Readonly<{
17
18
  mcp: McpDeclaredToolsets;
@@ -45,6 +45,7 @@ async function readMcpDeclaredToolsets() {
45
45
  kind: 'loaded',
46
46
  declaredServerIds: new Set(parsed.serverIdsInYamlOrder),
47
47
  invalidServerIds: new Set(parsed.invalidServers.map((s) => s.serverId)),
48
+ disabledServerIds: new Set(parsed.disabledServerIdsInYamlOrder),
48
49
  };
49
50
  }
50
51
  function buildToolsetAuditReport(params) {
@@ -58,20 +59,28 @@ function buildToolsetAuditReport(params) {
58
59
  const explicitToolsets = listExplicitToolsets(member);
59
60
  const items = [];
60
61
  for (const toolsetName of explicitToolsets) {
61
- if (registeredToolsets.has(toolsetName)) {
62
- items.push({ toolsetName, status: 'registered' });
63
- continue;
64
- }
65
62
  if (params.mcp.kind === 'loaded' && params.mcp.declaredServerIds.has(toolsetName)) {
66
63
  if (params.mcp.invalidServerIds.has(toolsetName)) {
67
64
  items.push({ toolsetName, status: 'mcp_declared_invalid' });
68
65
  warnings.push(`@${member.id}: toolset '${toolsetName}' is declared in mcp.yaml but server config is invalid.`);
69
66
  }
67
+ else if (params.mcp.disabledServerIds.has(toolsetName)) {
68
+ items.push({ toolsetName, status: 'mcp_declared_disabled' });
69
+ }
70
70
  else {
71
- items.push({ toolsetName, status: 'mcp_declared_unloaded' });
71
+ if (registeredToolsets.has(toolsetName)) {
72
+ items.push({ toolsetName, status: 'registered' });
73
+ }
74
+ else {
75
+ items.push({ toolsetName, status: 'mcp_declared_unloaded' });
76
+ }
72
77
  }
73
78
  continue;
74
79
  }
80
+ if (registeredToolsets.has(toolsetName)) {
81
+ items.push({ toolsetName, status: 'registered' });
82
+ continue;
83
+ }
75
84
  items.push({ toolsetName, status: 'missing' });
76
85
  warnings.push(`@${member.id}: toolset '${toolsetName}' is neither registered nor declared in mcp.yaml.`);
77
86
  }
@@ -91,6 +100,7 @@ function countByStatus(report) {
91
100
  registered: 0,
92
101
  mcp_declared_unloaded: 0,
93
102
  mcp_declared_invalid: 0,
103
+ mcp_declared_disabled: 0,
94
104
  missing: 0,
95
105
  };
96
106
  for (const memberReport of report.byMember) {
@@ -107,6 +117,8 @@ function statusLabel(status) {
107
117
  return 'DEFERRED';
108
118
  if (status === 'mcp_declared_invalid')
109
119
  return 'INVALID';
120
+ if (status === 'mcp_declared_disabled')
121
+ return 'DISABLED';
110
122
  return 'MISS';
111
123
  }
112
124
  function hasHardToolsetAuditFailures(report) {
@@ -125,12 +137,12 @@ function printToolsetAudit(report, options) {
125
137
  process.stdout.write('- MCP config: invalid (`.minds/mcp.yaml` parse/read failed)\n');
126
138
  }
127
139
  else {
128
- process.stdout.write(`- MCP config: loaded (declared servers: ${report.mcp.declaredServerIds.size}, invalid server configs: ${report.mcp.invalidServerIds.size})\n`);
140
+ process.stdout.write(`- MCP config: loaded (declared servers: ${report.mcp.declaredServerIds.size}, invalid server configs: ${report.mcp.invalidServerIds.size}, disabled servers: ${report.mcp.disabledServerIds.size})\n`);
129
141
  }
130
- process.stdout.write(`- Summary: ${counts.registered} OK, ${counts.mcp_declared_unloaded} DEFERRED, ${counts.mcp_declared_invalid} INVALID, ${counts.missing} MISS\n`);
142
+ process.stdout.write(`- Summary: ${counts.registered} OK, ${counts.mcp_declared_unloaded} DEFERRED, ${counts.mcp_declared_disabled} DISABLED, ${counts.mcp_declared_invalid} INVALID, ${counts.missing} MISS\n`);
131
143
  if (options?.includeTransientLegend !== false) {
132
144
  process.stdout.write('- Status notes: `DEFERRED` means the toolset is declared via `.minds/mcp.yaml` but is not currently loaded into the registry. This is often temporary (for example MCP server down/unreachable); if the MCP service recovers, rerun validation and it may clear without editing `team.yaml`.\n');
133
- process.stdout.write('- Status notes: `INVALID` means the MCP server declaration itself is invalid and needs a config fix. `MISS` means the toolset is neither registered nor declared in `.minds/mcp.yaml`.\n');
145
+ process.stdout.write('- Status notes: `DISABLED` means the MCP server has `enabled: false`; it remains declared but intentionally exposes zero tools until `mcp_restart` enables it. `INVALID` means the MCP server declaration itself is invalid and needs a config fix. `MISS` means the toolset is neither registered nor declared in `.minds/mcp.yaml`.\n');
134
146
  }
135
147
  if (report.byMember.length === 0) {
136
148
  process.stdout.write('- Members: none\n');
@@ -8,10 +8,10 @@ function printUsage() {
8
8
  console.log('Usage: dominds validate_team_def [<member-id>]');
9
9
  console.log('');
10
10
  console.log('Validate explicit toolset declarations in `.minds/team.yaml` against the current toolset registry and `.minds/mcp.yaml` declarations.');
11
- console.log('MCP-declared but currently unloaded toolsets are reported as `DEFERRED` because they are often transient runtime availability issues rather than permanent team-definition errors.');
11
+ console.log('MCP-declared but currently unloaded toolsets are reported as `DEFERRED`; disabled MCP toolsets are reported as `DISABLED` when `enabled: false` is set in `.minds/mcp.yaml`.');
12
12
  console.log('');
13
13
  console.log('Exit codes:');
14
- console.log(' 0 No hard definition errors (`OK` / `DEFERRED` only)');
14
+ console.log(' 0 No hard definition errors (`OK` / `DEFERRED` / `DISABLED` only)');
15
15
  console.log(' 2 Hard definition errors found (`INVALID` / `MISS`)');
16
16
  console.log('');
17
17
  console.log('Examples:');
@@ -70,7 +70,7 @@ async function main() {
70
70
  mcp: await (0, team_definition_audit_1.readMcpDeclaredToolsets)(),
71
71
  });
72
72
  process.stdout.write('# Team Definition Validation\n');
73
- process.stdout.write('This command checks explicit toolset references in `.minds/team.yaml`. `DEFERRED` usually means the toolset is declared through MCP but is not currently loaded; if the MCP service recovers, rerun this command before editing `team.yaml`.\n');
73
+ process.stdout.write('This command checks explicit toolset references in `.minds/team.yaml`. `DEFERRED` usually means the toolset is declared through MCP but is not currently loaded; `DISABLED` means the server is intentionally `enabled: false` and exposes zero tools until `mcp_restart` enables it.\n');
74
74
  (0, team_definition_audit_1.printToolsetAudit)(report, { heading: '## Definition Audit' });
75
75
  if ((0, team_definition_audit_1.hasHardToolsetAuditFailures)(report)) {
76
76
  process.exit(2);
@@ -98,6 +98,12 @@ Releasing:
98
98
 
99
99
  - Agents should call `mcp_release({"serverId":"<serverId>"})` (from `mcp_admin`) to release the
100
100
  leased runtime instance for the current dialog.
101
+ - `mcp_restart({"serverId":"<serverId>"})` enables a disabled server (`enabled: true`) before
102
+ starting it. After a successful restart, Dominds replaces the global runtime and clears all dialog
103
+ leases on the old runtime.
104
+ - `mcp_disable({"serverId":"<serverId>"})` disables a server (`enabled: false`) and stops any loaded
105
+ runtime/leases. Disabled servers remain visible as zero-tool MCP toolsets, and their configured
106
+ manual remains readable with an explicit disabled notice.
101
107
 
102
108
  ### Shared behavior (`truely-stateless: true`)
103
109
 
@@ -397,6 +403,11 @@ This is a Dominds-oriented schema. It is intentionally small and should be easy
397
403
  version: 1
398
404
  servers:
399
405
  <serverId>:
406
+ # Optional operational switch. `mcp_disable` writes this to false; `mcp_restart`
407
+ # writes it back to true before starting the server.
408
+ # Disabled servers start no runtime and expose a zero-tool toolset/manual marked disabled.
409
+ enabled: true
410
+
400
411
  # Concurrency model (IMPORTANT)
401
412
  # - Default false: per-dialog client leasing (safer for stateful servers)
402
413
  # - True: shared client across dialogs (only for servers that are truly stateless)
@@ -75,6 +75,8 @@ Dominds 的行为:
75
75
  释放:
76
76
 
77
77
  - 智能体应调用 `mcp_release({"serverId":"<serverId>"})`(来自 `mcp_admin`)来释放当前对话持有的租赁运行时实例。
78
+ - `mcp_restart({"serverId":"<serverId>"})` 会先启用被禁用的 server(`enabled: true`),再启动它。成功重启后,Dominds 会替换全局 runtime,并清理旧 runtime 上的全部对话 lease。
79
+ - `mcp_disable({"serverId":"<serverId>"})` 会禁用 server(`enabled: false`),并停止已加载 runtime/lease。禁用 server 仍作为 0 工具 MCP toolset 可见,已配置手册也会带明确 disabled 提示继续可读。
78
80
 
79
81
  ### 共享行为(`truely-stateless: true`)
80
82
 
@@ -322,6 +324,11 @@ headers:
322
324
  version: 1
323
325
  servers:
324
326
  <serverId>:
327
+ # 可选运维开关。`mcp_disable` 会把它写成 false;`mcp_restart`
328
+ # 会在启动前写回 true。
329
+ # disabled server 不启动 runtime,并暴露为带 disabled 标记的 0 工具 toolset/手册。
330
+ enabled: true
331
+
325
332
  # 并发模型(重要)
326
333
  # - 默认 false:每对话客户端租赁(对有状态服务器更安全)
327
334
  # - True:跨对话共享客户端(仅适用于真正无状态的服务器)
@@ -384,7 +384,9 @@ Notes:
384
384
 
385
385
  - MCP tool names are global across all toolsets (built-in + MCP). Collisions cause tools to be
386
386
  skipped and should surface via Problems + logs.
387
- - `mcp_admin` is a built-in toolset that contains `mcp_restart` (best-effort per-server restart).
387
+ - `mcp_admin` is a built-in toolset for MCP operations: `mcp_restart` enables/restarts a server,
388
+ `mcp_disable` disables a server while keeping its zero-tool toolset/manual visible, and
389
+ `mcp_release` releases the current dialog lease.
388
390
  - Optional manual information can live in `.minds/mcp.yaml` at `servers.<serverId>.manual`:
389
391
  - `contentFile`: the topic-file directory prefix for the formal runtime manual; the final `man({ "toolsetId": "<serverId>" })` content shown to the LLM is loaded from here
390
392
  - `content` / `sections`: inline team-management guidance shown in the `team_mgmt` MCP chapter (`sections` supports `[{ title, content }]` or `{ "<title>": "<content>" }`)
@@ -635,4 +637,5 @@ This avoids needing to grant full rtws access to configure the team.
635
637
  - Confirm the teammate is granted the relevant `<serverId>` toolset in `.minds/team.yaml`.
636
638
  - **MCP server keeps failing to (re)load**:
637
639
  - Check Problems details (missing env var, invalid tool name, collisions, connection errors).
638
- - After fixing config, use `mcp_restart` (from `mcp_admin`) for a best-effort per-server restart.
640
+ - After fixing config, use `mcp_restart` (from `mcp_admin`) to enable/restart the server. Use
641
+ `mcp_disable` to disable it while keeping the configured manual visible as a zero-tool toolset.
@@ -321,7 +321,8 @@ members:
321
321
  注意:
322
322
 
323
323
  - MCP 工具名称在所有工具集(内置 + MCP)中是全局的。冲突导致工具被跳过,应通过问题 + 日志暴露
324
- - `mcp_admin` 是一个内置工具集,包含 `mcp_restart`(每个服务器最佳努力重启)
324
+ - `mcp_admin` MCP 运维内置工具集:`mcp_restart` 启用/重启 server,`mcp_disable` 禁用
325
+ server 并保留 0 工具 toolset/手册可见性,`mcp_release` 释放当前对话 lease
325
326
  - 可选手册:可在 `.minds/mcp.yaml` 的 `servers.<serverId>.manual` 提供手册相关信息:
326
327
  - `contentFile`:正式 runtime 手册的 topic 文件目录前缀;`man({ "toolsetId": "<serverId>" })` 最终给 LLM 看的正文从这里加载
327
328
  - `content` / `sections`:补充给 `team_mgmt` MCP 章节看的 inline 团队管理说明(`sections` 支持 `[{ title, content }]` 或 `{ "<title>": "<content>" }`)
@@ -540,4 +541,5 @@ members:
540
541
  - 确认队友在 `.minds/team.yaml` 中被授予了相关的 `<serverId>` 工具集
541
542
  - **MCP 服务器持续 (re)load 失败**:
542
543
  - 检查问题详细信息(缺少 env 变量、无效的工具名称、冲突、连接错误)
543
- - 修复配置后,使用 `mcp_admin` 中的 `mcp_restart` 进行每个服务器的最佳努力重启
544
+ - 修复配置后,使用 `mcp_admin` 中的 `mcp_restart` 启用/重启 server。若需禁用,使用
545
+ `mcp_disable`,它会保留 0 工具 toolset 和已配置手册可见性
@@ -79,7 +79,8 @@ Non-goals:
79
79
  Update triggers:
80
80
 
81
81
  - `.minds/mcp.yaml` reload
82
- - `mcp_restart`
82
+ - `mcp_restart` (also writes `enabled: true` when a configured MCP server is disabled)
83
+ - `mcp_disable` (writes `enabled: false`; the server remains visible as a zero-tool toolset/manual)
83
84
  - MCP collision-resolution re-registration
84
85
 
85
86
  ### 2. Runtime Lease Protocol
@@ -105,7 +106,8 @@ Update triggers:
105
106
 
106
107
  - first MCP tool call acquires a lease
107
108
  - `mcp_release`
108
- - restart/stop tears leases down
109
+ - successful `mcp_restart` tears old-runtime leases down
110
+ - `mcp_disable` tears loaded runtime leases down
109
111
 
110
112
  ### 3. Member Tool-Binding Protocol
111
113
 
@@ -62,6 +62,7 @@ export type McpConfigLoadResult = {
62
62
  }>;
63
63
  serverIdsInYamlOrder: ReadonlyArray<string>;
64
64
  validServerIdsInYamlOrder: ReadonlyArray<string>;
65
+ disabledServerIdsInYamlOrder: ReadonlyArray<string>;
65
66
  rawText: string;
66
67
  } | {
67
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'];
@@ -2,7 +2,7 @@ import type { McpStreamableHttpServerConfig } from './config';
2
2
  export type McpDeclaredServerRuntimeStatus = Readonly<{
3
3
  serverId: string;
4
4
  transport: 'stdio' | 'streamable_http' | 'invalid' | 'unknown';
5
- status: 'loaded' | 'temporarily_unavailable' | 'config_invalid';
5
+ status: 'loaded' | 'temporarily_unavailable' | 'config_invalid' | 'disabled';
6
6
  errorText?: string;
7
7
  }>;
8
8
  export declare function isMcpToolsetLeasedToDialog(serverId: string, dialogKey: string): boolean;
@@ -26,6 +26,12 @@ export declare function requestMcpServerRestart(serverId: string): Promise<{
26
26
  ok: false;
27
27
  errorText: string;
28
28
  }>;
29
+ export declare function requestMcpServerDisable(serverId: string): Promise<{
30
+ ok: true;
31
+ } | {
32
+ ok: false;
33
+ errorText: string;
34
+ }>;
29
35
  export declare function requestMcpConfigReload(reason?: string): Promise<{
30
36
  ok: true;
31
37
  } | {