dominds 1.21.1 → 1.22.1

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 (220) hide show
  1. package/dist/dialog-instance-registry.js +8 -6
  2. package/dist/dialog.d.ts +2 -2
  3. package/dist/dialog.js +3 -3
  4. package/dist/docs/diligence-push.md +32 -17
  5. package/dist/docs/diligence-push.zh.md +16 -11
  6. package/dist/docs/dominds-terminology.md +3 -3
  7. package/dist/docs/fbr.md +8 -8
  8. package/dist/docs/fbr.zh.md +7 -7
  9. package/dist/docs/llm-provider-isolation.md +2 -0
  10. package/dist/docs/llm-provider-isolation.zh.md +2 -0
  11. package/dist/docs/mcp-prompts-resources.md +120 -0
  12. package/dist/docs/mcp-support.md +2 -0
  13. package/dist/docs/team_mgmt-toolset.md +2 -2
  14. package/dist/docs/team_mgmt-toolset.zh.md +2 -2
  15. package/dist/docs/tool-availability-protocol.md +4 -1
  16. package/dist/docs/volcengine-coding-plan-openai-compatible.zh.md +387 -0
  17. package/dist/llm/api-quirks.d.ts +2 -2
  18. package/dist/llm/api-quirks.js +72 -8
  19. package/dist/llm/client.d.ts +1 -0
  20. package/dist/llm/defaults.yaml +23 -21
  21. package/dist/llm/gen/anthropic.d.ts +0 -6
  22. package/dist/llm/gen/anthropic.js +98 -503
  23. package/dist/llm/gen/codex.d.ts +4 -1
  24. package/dist/llm/gen/codex.js +28 -3
  25. package/dist/llm/gen/failure-classifier.js +2 -1
  26. package/dist/llm/gen/openai-compatible.d.ts +29 -5
  27. package/dist/llm/gen/openai-compatible.js +917 -196
  28. package/dist/llm/gen/openai.d.ts +2 -1
  29. package/dist/llm/gen/openai.js +24 -6
  30. package/dist/llm/gen.d.ts +5 -2
  31. package/dist/llm/kernel-driver/drive.js +199 -122
  32. package/dist/llm/kernel-driver/runtime.d.ts +1 -0
  33. package/dist/llm/kernel-driver/runtime.js +40 -14
  34. package/dist/llm/kernel-driver/tellask-special.js +12 -9
  35. package/dist/mcp/config.d.ts +21 -0
  36. package/dist/mcp/config.js +70 -0
  37. package/dist/mcp/resources.d.ts +69 -0
  38. package/dist/mcp/resources.js +447 -0
  39. package/dist/mcp/sdk-client.d.ts +36 -0
  40. package/dist/mcp/sdk-client.js +79 -0
  41. package/dist/mcp/supervisor.d.ts +2 -0
  42. package/dist/mcp/supervisor.js +38 -0
  43. package/dist/minds/load.js +22 -9
  44. package/dist/persistence.d.ts +2 -3
  45. package/dist/persistence.js +57 -77
  46. package/dist/problems.js +2 -1
  47. package/dist/server/api-routes.js +7 -1
  48. package/dist/server/snippets-routes.d.ts +2 -53
  49. package/dist/server/snippets-routes.js +79 -1
  50. package/dist/server/websocket-handler.js +42 -16
  51. package/dist/skills/load.d.ts +9 -1
  52. package/dist/skills/load.js +63 -9
  53. package/dist/team.d.ts +15 -1
  54. package/dist/team.js +78 -8
  55. package/dist/tool-availability.js +92 -15
  56. package/dist/tools/builtins.js +16 -0
  57. package/dist/tools/prompts/resources/en/errors.md +6 -0
  58. package/dist/tools/prompts/resources/en/index.md +10 -0
  59. package/dist/tools/prompts/resources/en/principles.md +6 -0
  60. package/dist/tools/prompts/resources/en/scenarios.md +22 -0
  61. package/dist/tools/prompts/resources/en/tools.md +10 -0
  62. package/dist/tools/prompts/resources/zh/errors.md +6 -0
  63. package/dist/tools/prompts/resources/zh/index.md +9 -0
  64. package/dist/tools/prompts/resources/zh/principles.md +6 -0
  65. package/dist/tools/prompts/resources/zh/scenarios.md +22 -0
  66. package/dist/tools/prompts/resources/zh/tools.md +10 -0
  67. package/dist/tools/resources.d.ts +3 -0
  68. package/dist/tools/resources.js +183 -0
  69. package/dist/tools/skills.d.ts +1 -0
  70. package/dist/tools/skills.js +81 -1
  71. package/dist/tools/team_mgmt-manual.js +6 -6
  72. package/dist/tools/team_mgmt.js +17 -5
  73. package/dist/tools/toolset-manual.d.ts +1 -0
  74. package/dist/tools/toolset-manual.js +4 -0
  75. package/package.json +3 -3
  76. package/webapp/dist/assets/{_basePickBy-Bykc_Ofa.js → _basePickBy-DUbW5G8a.js} +3 -3
  77. package/webapp/dist/assets/_basePickBy-DUbW5G8a.js.map +1 -0
  78. package/webapp/dist/assets/{_baseUniq-DLbrL6lI.js → _baseUniq-vou1IeXB.js} +2 -2
  79. package/webapp/dist/assets/_baseUniq-vou1IeXB.js.map +1 -0
  80. package/webapp/dist/assets/{arc-DNhbWbht.js → arc-D_O9oO0B.js} +2 -2
  81. package/webapp/dist/assets/arc-D_O9oO0B.js.map +1 -0
  82. package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-CzDiW-tr.js → architectureDiagram-2XIMDMQ5-B7k9SWSL.js} +26 -8
  83. package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-B7k9SWSL.js.map +1 -0
  84. package/webapp/dist/assets/{blockDiagram-VD42YOAC-RrxjTltH.js → blockDiagram-WCTKOSBZ-e3xTmffi.js} +187 -170
  85. package/webapp/dist/assets/blockDiagram-WCTKOSBZ-e3xTmffi.js.map +1 -0
  86. package/webapp/dist/assets/{c4Diagram-YG6GDRKO-lftE3Ba_.js → c4Diagram-IC4MRINW-DVvi-N2o.js} +4 -4
  87. package/webapp/dist/assets/c4Diagram-IC4MRINW-DVvi-N2o.js.map +1 -0
  88. package/webapp/dist/assets/{channel-DNkowTag.js → channel-CH387UD2.js} +2 -2
  89. package/webapp/dist/assets/channel-CH387UD2.js.map +1 -0
  90. package/webapp/dist/assets/{chunk-4BX2VUAB-Cq_3x_zL.js → chunk-4BX2VUAB-BOo0Xj3m.js} +2 -2
  91. package/webapp/dist/assets/chunk-4BX2VUAB-BOo0Xj3m.js.map +1 -0
  92. package/webapp/dist/assets/{chunk-55IACEB6-CUUCRvYF.js → chunk-55IACEB6-CI4uRAx_.js} +2 -2
  93. package/webapp/dist/assets/chunk-55IACEB6-CI4uRAx_.js.map +1 -0
  94. package/webapp/dist/assets/{chunk-FMBD7UC4-C8krVsNf.js → chunk-FMBD7UC4-C4N1ovxD.js} +2 -2
  95. package/webapp/dist/assets/chunk-FMBD7UC4-C4N1ovxD.js.map +1 -0
  96. package/webapp/dist/assets/{chunk-TZMSLE5B-DiuCcVSY.js → chunk-JSJVCQXG-5U4Hu7pC.js} +14 -6
  97. package/webapp/dist/assets/chunk-JSJVCQXG-5U4Hu7pC.js.map +1 -0
  98. package/webapp/dist/assets/{chunk-QN33PNHL-B2f0ZKyf.js → chunk-KX2RTZJC-BXPDNuct.js} +2 -2
  99. package/webapp/dist/assets/chunk-KX2RTZJC-BXPDNuct.js.map +1 -0
  100. package/webapp/dist/assets/{chunk-DI55MBZ5-BwtzRGRI.js → chunk-NQ4KR5QH-oVsExnnn.js} +9 -7
  101. package/webapp/dist/assets/chunk-NQ4KR5QH-oVsExnnn.js.map +1 -0
  102. package/webapp/dist/assets/{chunk-QZHKN3VN-DnMfaFpr.js → chunk-QZHKN3VN-C6FzEv2C.js} +2 -2
  103. package/webapp/dist/assets/chunk-QZHKN3VN-C6FzEv2C.js.map +1 -0
  104. package/webapp/dist/assets/{chunk-B4BG7PRW-DSxZvr3b.js → chunk-WL4C6EOR-Ir7e_B7t.js} +171 -121
  105. package/webapp/dist/assets/chunk-WL4C6EOR-Ir7e_B7t.js.map +1 -0
  106. package/webapp/dist/assets/{classDiagram-2ON5EDUG-Dx7rEITq.js → classDiagram-VBA2DB6C-CPYs_LAr.js} +7 -6
  107. package/webapp/dist/assets/classDiagram-VBA2DB6C-CPYs_LAr.js.map +1 -0
  108. package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-Dx7rEITq.js → classDiagram-v2-RAHNMMFH-CPYs_LAr.js} +7 -6
  109. package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-CPYs_LAr.js.map +1 -0
  110. package/webapp/dist/assets/{clone-E3g7pzJk.js → clone-CToca8rS.js} +2 -2
  111. package/webapp/dist/assets/clone-CToca8rS.js.map +1 -0
  112. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-Djn8s_be.js → cose-bilkent-S5V4N54A-DLNtqY7a.js} +2 -2
  113. package/webapp/dist/assets/cose-bilkent-S5V4N54A-DLNtqY7a.js.map +1 -0
  114. package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
  115. package/webapp/dist/assets/{dagre-6UL2VRFP-Bu5j2QjT.js → dagre-KLK3FWXG-Bkt-O9uW.js} +7 -7
  116. package/webapp/dist/assets/dagre-KLK3FWXG-Bkt-O9uW.js.map +1 -0
  117. package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
  118. package/webapp/dist/assets/{diagram-PSM6KHXK-BH1bxFLu.js → diagram-E7M64L7V-B4JR_u4V.js} +10 -10
  119. package/webapp/dist/assets/diagram-E7M64L7V-B4JR_u4V.js.map +1 -0
  120. package/webapp/dist/assets/{diagram-QEK2KX5R-BfnpXovp.js → diagram-IFDJBPK2-D9zRh8b7.js} +9 -8
  121. package/webapp/dist/assets/diagram-IFDJBPK2-D9zRh8b7.js.map +1 -0
  122. package/webapp/dist/assets/{diagram-S2PKOQOG-C6W_geXb.js → diagram-P4PSJMXO-CAaXVWnX.js} +8 -8
  123. package/webapp/dist/assets/diagram-P4PSJMXO-CAaXVWnX.js.map +1 -0
  124. package/webapp/dist/assets/{erDiagram-Q2GNP2WA-MMq-1uef.js → erDiagram-INFDFZHY-DDeoaSkJ.js} +96 -75
  125. package/webapp/dist/assets/erDiagram-INFDFZHY-DDeoaSkJ.js.map +1 -0
  126. package/webapp/dist/assets/{flowDiagram-NV44I4VS-DhabwrYX.js → flowDiagram-PKNHOUZH-DEYqzSEJ.js} +98 -81
  127. package/webapp/dist/assets/flowDiagram-PKNHOUZH-DEYqzSEJ.js.map +1 -0
  128. package/webapp/dist/assets/{ganttDiagram-JELNMOA3-DlYQJWeZ.js → ganttDiagram-A5KZAMGK-BuLOSh0d.js} +28 -3
  129. package/webapp/dist/assets/ganttDiagram-A5KZAMGK-BuLOSh0d.js.map +1 -0
  130. package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-CX6gTpVR.js → gitGraphDiagram-K3NZZRJ6-CBrwZvBf.js} +38 -46
  131. package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-CBrwZvBf.js.map +1 -0
  132. package/webapp/dist/assets/graph-fX6cvjwR.js +782 -0
  133. package/webapp/dist/assets/graph-fX6cvjwR.js.map +1 -0
  134. package/webapp/dist/assets/{index-n9DBNPjf.js → index-B3WzTLcD.js} +1194 -1099
  135. package/webapp/dist/assets/{index-n9DBNPjf.js.map → index-B3WzTLcD.js.map} +1 -1
  136. package/webapp/dist/assets/{index-BGdI3lWA.css → index-DZFkLLVz.css} +1 -1
  137. package/webapp/dist/assets/{infoDiagram-HS3SLOUP-Bd_c4ryh.js → infoDiagram-LFFYTUFH-Ci3XYvve.js} +7 -7
  138. package/webapp/dist/assets/infoDiagram-LFFYTUFH-Ci3XYvve.js.map +1 -0
  139. package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
  140. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-DOH5ua9R.js +966 -0
  141. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-DOH5ua9R.js.map +1 -0
  142. package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-CxhNxA57.js → journeyDiagram-4ABVD52K-DM_fiZlj.js} +5 -5
  143. package/webapp/dist/assets/journeyDiagram-4ABVD52K-DM_fiZlj.js.map +1 -0
  144. package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-DizD4_xO.js → kanban-definition-K7BYSVSG-CSh2hqc2.js} +5 -3
  145. package/webapp/dist/assets/kanban-definition-K7BYSVSG-CSh2hqc2.js.map +1 -0
  146. package/webapp/dist/assets/{layout-Et2JKDy4.js → layout-yZEK1LgL.js} +5 -5
  147. package/webapp/dist/assets/layout-yZEK1LgL.js.map +1 -0
  148. package/webapp/dist/assets/{linear-vv9IKfjA.js → linear-m76SmdtZ.js} +2 -2
  149. package/webapp/dist/assets/linear-m76SmdtZ.js.map +1 -0
  150. package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-BjZ2IG-q.js → mindmap-definition-YRQLILUH-NiwP-SLH.js} +7 -5
  151. package/webapp/dist/assets/mindmap-definition-YRQLILUH-NiwP-SLH.js.map +1 -0
  152. package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
  153. package/webapp/dist/assets/{pieDiagram-ADFJNKIX-Dsym3Tvc.js → pieDiagram-SKSYHLDU-CSCapDSD.js} +8 -8
  154. package/webapp/dist/assets/pieDiagram-SKSYHLDU-CSCapDSD.js.map +1 -0
  155. package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-BiDOgUeI.js → quadrantDiagram-337W2JSQ-CbDGQH91.js} +3 -3
  156. package/webapp/dist/assets/quadrantDiagram-337W2JSQ-CbDGQH91.js.map +1 -0
  157. package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-CwjS_Vo9.js → requirementDiagram-Z7DCOOCP-CeG2yodp.js} +16 -6
  158. package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-CeG2yodp.js.map +1 -0
  159. package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-BxoOhMxL.js → sankeyDiagram-WA2Y5GQK-B_l8tKqa.js} +2 -2
  160. package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-B_l8tKqa.js.map +1 -0
  161. package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-DvDiYf5j.js → sequenceDiagram-2WXFIKYE-Dc5gBIi5.js} +601 -201
  162. package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-Dc5gBIi5.js.map +1 -0
  163. package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-CS0eUnn1.js → stateDiagram-RAJIS63D-DMYeNS1r.js} +9 -9
  164. package/webapp/dist/assets/stateDiagram-RAJIS63D-DMYeNS1r.js.map +1 -0
  165. package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-CWLL1BTf.js → stateDiagram-v2-FVOUBMTO-MfUJuUEe.js} +5 -5
  166. package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-MfUJuUEe.js.map +1 -0
  167. package/webapp/dist/assets/{timeline-definition-IT6M3QCI-BsehS0iC.js → timeline-definition-YZTLITO2-Ci2CZEky.js} +3 -3
  168. package/webapp/dist/assets/timeline-definition-YZTLITO2-Ci2CZEky.js.map +1 -0
  169. package/webapp/dist/assets/{treemap-GDKQZRPO-D1_uwOCA.js → treemap-KZPCXAKY-CNgzp4sT.js} +37 -24
  170. package/webapp/dist/assets/treemap-KZPCXAKY-CNgzp4sT.js.map +1 -0
  171. package/webapp/dist/assets/vennDiagram-LZ73GAT5-BYxtNx2s.js +2487 -0
  172. package/webapp/dist/assets/vennDiagram-LZ73GAT5-BYxtNx2s.js.map +1 -0
  173. package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-B7O9E6vS.js → xychartDiagram-JWTSCODW-BUS3bn9p.js} +4 -4
  174. package/webapp/dist/assets/xychartDiagram-JWTSCODW-BUS3bn9p.js.map +1 -0
  175. package/webapp/dist/index.html +2 -2
  176. package/webapp/dist/assets/_basePickBy-Bykc_Ofa.js.map +0 -1
  177. package/webapp/dist/assets/_baseUniq-DLbrL6lI.js.map +0 -1
  178. package/webapp/dist/assets/arc-DNhbWbht.js.map +0 -1
  179. package/webapp/dist/assets/architectureDiagram-VXUJARFQ-CzDiW-tr.js.map +0 -1
  180. package/webapp/dist/assets/blockDiagram-VD42YOAC-RrxjTltH.js.map +0 -1
  181. package/webapp/dist/assets/c4Diagram-YG6GDRKO-lftE3Ba_.js.map +0 -1
  182. package/webapp/dist/assets/channel-DNkowTag.js.map +0 -1
  183. package/webapp/dist/assets/chunk-4BX2VUAB-Cq_3x_zL.js.map +0 -1
  184. package/webapp/dist/assets/chunk-55IACEB6-CUUCRvYF.js.map +0 -1
  185. package/webapp/dist/assets/chunk-B4BG7PRW-DSxZvr3b.js.map +0 -1
  186. package/webapp/dist/assets/chunk-DI55MBZ5-BwtzRGRI.js.map +0 -1
  187. package/webapp/dist/assets/chunk-FMBD7UC4-C8krVsNf.js.map +0 -1
  188. package/webapp/dist/assets/chunk-QN33PNHL-B2f0ZKyf.js.map +0 -1
  189. package/webapp/dist/assets/chunk-QZHKN3VN-DnMfaFpr.js.map +0 -1
  190. package/webapp/dist/assets/chunk-TZMSLE5B-DiuCcVSY.js.map +0 -1
  191. package/webapp/dist/assets/classDiagram-2ON5EDUG-Dx7rEITq.js.map +0 -1
  192. package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-Dx7rEITq.js.map +0 -1
  193. package/webapp/dist/assets/clone-E3g7pzJk.js.map +0 -1
  194. package/webapp/dist/assets/cose-bilkent-S5V4N54A-Djn8s_be.js.map +0 -1
  195. package/webapp/dist/assets/dagre-6UL2VRFP-Bu5j2QjT.js.map +0 -1
  196. package/webapp/dist/assets/diagram-PSM6KHXK-BH1bxFLu.js.map +0 -1
  197. package/webapp/dist/assets/diagram-QEK2KX5R-BfnpXovp.js.map +0 -1
  198. package/webapp/dist/assets/diagram-S2PKOQOG-C6W_geXb.js.map +0 -1
  199. package/webapp/dist/assets/erDiagram-Q2GNP2WA-MMq-1uef.js.map +0 -1
  200. package/webapp/dist/assets/flowDiagram-NV44I4VS-DhabwrYX.js.map +0 -1
  201. package/webapp/dist/assets/ganttDiagram-JELNMOA3-DlYQJWeZ.js.map +0 -1
  202. package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-CX6gTpVR.js.map +0 -1
  203. package/webapp/dist/assets/graph-CwsSRKMf.js +0 -425
  204. package/webapp/dist/assets/graph-CwsSRKMf.js.map +0 -1
  205. package/webapp/dist/assets/infoDiagram-HS3SLOUP-Bd_c4ryh.js.map +0 -1
  206. package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-CxhNxA57.js.map +0 -1
  207. package/webapp/dist/assets/kanban-definition-3W4ZIXB7-DizD4_xO.js.map +0 -1
  208. package/webapp/dist/assets/layout-Et2JKDy4.js.map +0 -1
  209. package/webapp/dist/assets/linear-vv9IKfjA.js.map +0 -1
  210. package/webapp/dist/assets/mindmap-definition-VGOIOE7T-BjZ2IG-q.js.map +0 -1
  211. package/webapp/dist/assets/pieDiagram-ADFJNKIX-Dsym3Tvc.js.map +0 -1
  212. package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-BiDOgUeI.js.map +0 -1
  213. package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-CwjS_Vo9.js.map +0 -1
  214. package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-BxoOhMxL.js.map +0 -1
  215. package/webapp/dist/assets/sequenceDiagram-WL72ISMW-DvDiYf5j.js.map +0 -1
  216. package/webapp/dist/assets/stateDiagram-FKZM4ZOC-CS0eUnn1.js.map +0 -1
  217. package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-CWLL1BTf.js.map +0 -1
  218. package/webapp/dist/assets/timeline-definition-IT6M3QCI-BsehS0iC.js.map +0 -1
  219. package/webapp/dist/assets/treemap-GDKQZRPO-D1_uwOCA.js.map +0 -1
  220. package/webapp/dist/assets/xychartDiagram-PRI3JC2R-B7O9E6vS.js.map +0 -1
@@ -68,7 +68,7 @@ async function getOrRestoreMainDialog(rootId, status) {
68
68
  catch (_err) {
69
69
  diligencePushMax = diligence_1.DEFAULT_DILIGENCE_PUSH_MAX;
70
70
  }
71
- const defaultDisableDiligencePush = diligencePushMax <= 0;
71
+ const defaultDisableDiligencePush = false;
72
72
  const rootStore = new persistence_1.DiskFileDialogStore(mainDialogId);
73
73
  const mainDialog = new dialog_1.MainDialog(rootStore, rootMetadata.taskDocPath, mainDialogId, rootMetadata.agentId, {
74
74
  messages: rootState.messages,
@@ -85,10 +85,9 @@ async function getOrRestoreMainDialog(rootId, status) {
85
85
  ? latest.diligencePushRemainingBudget
86
86
  : undefined;
87
87
  const normalizedRemainingBudget = clampNonNegativeFiniteInt(persistedRemainingBudget, diligencePushMax > 0 ? diligencePushMax : 0);
88
- mainDialog.diligencePushRemainingBudget =
89
- diligencePushMax > 0
90
- ? Math.min(normalizedRemainingBudget, diligencePushMax)
91
- : normalizedRemainingBudget;
88
+ // `diligence-push-max` only seeds defaults. Persisted per-dialog budget is the runtime source of
89
+ // truth, including operator-added budget above (or despite) the current team default.
90
+ mainDialog.diligencePushRemainingBudget = normalizedRemainingBudget;
92
91
  mainDialog.setPersistenceStatus(status);
93
92
  dialog_global_registry_1.globalDialogRegistry.register(mainDialog);
94
93
  // Keep the in-memory main dialog fully hydrated regardless of persistence status
@@ -154,7 +153,10 @@ async function ensureDialogLoaded(mainDialog, targetId, status, visitedSelfIds =
154
153
  contextHealth: state.contextHealth,
155
154
  pendingCourseStartPrompt,
156
155
  });
157
- sideDialog.disableDiligencePush = latest?.disableDiligencePush ?? false;
156
+ sideDialog.disableDiligencePush =
157
+ latest && typeof latest.disableDiligencePush === 'boolean'
158
+ ? latest.disableDiligencePush
159
+ : false;
158
160
  if (sideDialog.sessionSlug) {
159
161
  mainDialog.registerSideDialog(sideDialog);
160
162
  }
package/dist/dialog.d.ts CHANGED
@@ -438,7 +438,7 @@ export declare abstract class Dialog {
438
438
  }): Promise<void>;
439
439
  persistAgentMessage(content: string, genseq: number, type: 'thinking_msg' | 'saying_msg', provider_data?: ProviderData, reasoning?: ReasoningPayload): Promise<void>;
440
440
  persistUiOnlyMarkdown(content: string, genseq: number): Promise<void>;
441
- persistFunctionCall(id: string, name: string, rawArgumentsText: string, genseq: number): Promise<void>;
441
+ persistFunctionCall(id: string, name: string, rawArgumentsText: string, genseq: number, rawId?: string): Promise<void>;
442
442
  persistTellaskCall(id: string, name: TellaskCallRecordName, rawArgumentsText: string, genseq: number, options?: {
443
443
  deliveryMode?: 'tellask_call_start' | 'func_call_requested';
444
444
  }): Promise<void>;
@@ -670,7 +670,7 @@ export declare abstract class DialogStore {
670
670
  /**
671
671
  * Persist a function call to storage
672
672
  */
673
- persistFunctionCall(_dialog: Dialog, _id: string, _name: string, _rawArgumentsText: string, _genseq: number): Promise<void>;
673
+ persistFunctionCall(_dialog: Dialog, _id: string, _name: string, _rawArgumentsText: string, _genseq: number, _rawId?: string): Promise<void>;
674
674
  persistTellaskCall(_dialog: Dialog, _id: string, _name: TellaskCallRecordName, _rawArgumentsText: string, _genseq: number, _options?: {
675
675
  deliveryMode?: 'tellask_call_start' | 'func_call_requested';
676
676
  }): Promise<void>;
package/dist/dialog.js CHANGED
@@ -1452,8 +1452,8 @@ class Dialog {
1452
1452
  async persistUiOnlyMarkdown(content, genseq) {
1453
1453
  return await this.dlgStore.persistUiOnlyMarkdown(this, content, genseq);
1454
1454
  }
1455
- async persistFunctionCall(id, name, rawArgumentsText, genseq) {
1456
- return await this.dlgStore.persistFunctionCall(this, id, name, rawArgumentsText, genseq);
1455
+ async persistFunctionCall(id, name, rawArgumentsText, genseq, rawId) {
1456
+ return await this.dlgStore.persistFunctionCall(this, id, name, rawArgumentsText, genseq, rawId);
1457
1457
  }
1458
1458
  async persistTellaskCall(id, name, rawArgumentsText, genseq, options) {
1459
1459
  return await this.dlgStore.persistTellaskCall(this, id, name, rawArgumentsText, genseq, options);
@@ -1895,7 +1895,7 @@ class DialogStore {
1895
1895
  /**
1896
1896
  * Persist a function call to storage
1897
1897
  */
1898
- async persistFunctionCall(_dialog, _id, _name, _rawArgumentsText, _genseq) { }
1898
+ async persistFunctionCall(_dialog, _id, _name, _rawArgumentsText, _genseq, _rawId) { }
1899
1899
  async persistTellaskCall(_dialog, _id, _name, _rawArgumentsText, _genseq, _options) { }
1900
1900
  /**
1901
1901
  * Start a new course in storage
@@ -10,10 +10,17 @@ is often not what operators want: they want the agent to keep pushing forward un
10
10
  - legitimately suspends for a human decision (Q4H), or
11
11
  - legitimately suspends waiting for Side Dialogs (tellask/backfill).
12
12
 
13
- This document specifies a runtime mechanism ("diligence-push") that, for **main dialogs only**,
14
- prevents the dialog from stopping: whenever the driver would otherwise stop, it auto-sends a short
15
- diligence prompt (rendered as a normal user bubble) and continues generation, except when the dialog
16
- is legitimately suspended (Q4H or pending Side Dialogs).
13
+ This document specifies two related runtime controls:
14
+
15
+ - **Auto-continue injection**: for **main dialogs only**, whenever the driver would otherwise stop,
16
+ runtime auto-sends a short diligence prompt (rendered as a normal user bubble) and continues
17
+ generation, except when the dialog is legitimately suspended (Q4H or pending Side Dialogs).
18
+ - **Required tool-use control**: for ordinary main and side dialog rounds, the Diligence Push
19
+ checkbox controls whether the provider request must end through a Dominds tool call. When checked,
20
+ the model is expected to call a tool such as `askHuman`, `tellask*`, `replyTellask*`, or another
21
+ runtime-provided function instead of stopping with a plain-text question/final answer. FBR middle
22
+ rounds are the intentional exception: they may run with no callable tools; FBR closure requires one
23
+ of the conclusion tools.
17
24
 
18
25
  ## Goals
19
26
 
@@ -25,7 +32,8 @@ is legitimately suspended (Q4H or pending Side Dialogs).
25
32
  ## Non-goals
26
33
 
27
34
  - Auto-completing / auto-marking a dialog as done.
28
- - Applying this behavior to Side Dialogs (Side Dialogs remain scoped and should report back to their tellasker).
35
+ - Auto-injecting Diligence Push prompts into Side Dialogs (Side Dialogs remain scoped and should
36
+ report back to their tellasker).
29
37
 
30
38
  ## Definitions
31
39
 
@@ -74,15 +82,20 @@ To avoid infinite loops, diligence-push has a per-dialog budget (per-member `dil
74
82
  how many auto-continued diligence prompts can be injected for a given dialog before the runtime stops
75
83
  issuing further automatic Diligence Pushes for that budget.
76
84
 
77
- - Default: **3**
78
- - If `< 1`, diligence-push is effectively disabled for that member
85
+ - Default: **99**
86
+ - If `< 1`, new dialogs start with no automatic Diligence Push budget
79
87
  - Configurable per-member via `diligence-push-max` in `.minds/team.yaml`
80
88
 
81
- ### Reset on Q4H
89
+ Important: `diligence-push-max` is only the default budget used when a dialog instance is created
90
+ or reset. Runtime decisions must use the concrete dialog's remaining budget
91
+ (`diligencePushRemainingBudget`), so a manually refilled dialog can keep auto-continuing even when
92
+ the team default is `0`.
82
93
 
83
- When a dialog becomes suspended due to a pending Q4H (Questions for Human), the diligence-push injection
84
- counter is reset. This ensures that after the human answers the Q4H and the dialog is resumed, the
85
- dialog gets a fresh diligence-push budget again.
94
+ ### Q4H suspension
95
+
96
+ When a dialog becomes suspended due to a pending Q4H (Questions for Human), Diligence Push stops
97
+ while that suspension is active. Q4H does not reapply the member default budget; the dialog keeps its
98
+ own remaining budget so operator adjustments survive the suspension boundary.
86
99
 
87
100
  ### Budget exhausted → stop auto-pushing for that budget
88
101
 
@@ -95,9 +108,8 @@ Diligence-push can be disabled per-rtws in either of these ways:
95
108
 
96
109
  - If the selected diligence file exists but its content is empty/whitespace, diligence-push is disabled (no injection).
97
110
 
98
- Diligence-push can be disabled per-member in either of these ways:
99
-
100
- - If `diligence-push-max < 1`, diligence-push is disabled for that member (no injection).
111
+ To stop auto-continue for a specific dialog, set that dialog's remaining budget to `0` or use the
112
+ per-dialog Diligence Push disable switch.
101
113
 
102
114
  ## Diligence prompt resolution
103
115
 
@@ -114,9 +126,10 @@ If the first existing file in the above order has empty/whitespace content, **di
114
126
  Note: YAML frontmatter in diligence files is **ignored** by the runtime. If present, it is treated as
115
127
  non-content metadata and stripped from the prompt body.
116
128
 
117
- ### Team member cap: `diligence-push-max`
129
+ ### Team member default budget: `diligence-push-max`
118
130
 
119
- Each team member can optionally cap diligence-push via `.minds/team.yaml`:
131
+ Each team member can optionally set the starting Diligence Push budget for new or reset dialogs via
132
+ `.minds/team.yaml`:
120
133
 
121
134
  ```yaml
122
135
  members:
@@ -127,7 +140,9 @@ members:
127
140
  Rules:
128
141
 
129
142
  - If missing, `diligence-push-max` defaults to **99** for that member.
130
- - If `diligence-push-max < 1`, diligence-push is disabled for that member (no injection), even if the diligence file exists.
143
+ - If `diligence-push-max < 1`, newly created dialogs start with remaining budget `0`.
144
+ - After creation or reset, runtime business logic follows the dialog's own remaining budget rather
145
+ than treating `diligence-push-max` as runtime authority.
131
146
  - Built-in shadow members `fuxi` and `pangu` default to `diligence-push-max: 0` unless explicitly overridden in team.yaml.
132
147
 
133
148
  ## UX notes
@@ -9,7 +9,10 @@ Dominds 主线对话旨在长期运行。主线对话"停止"(变为空闲)
9
9
  - 合法地暂停等待人类决策(Q4H),或
10
10
  - 合法地暂停等待支线对话(tellask/backfill)。
11
11
 
12
- 本文档指定了一个运行时机制("diligence-push"),仅针对**主线对话**,防止对话停止:每当驱动程序即将停止时,它会自动发送一个简短的鞭策语(渲染为正常的用户气泡)并继续生成,除非对话处于合法暂停状态(Q4H 或待处理的支线对话)。
12
+ 本文档指定两个相关但不同的运行时控制:
13
+
14
+ - **自动续推注入**:仅针对**主线对话**,当驱动程序即将停止时,运行时会自动发送一个简短的鞭策语(渲染为正常的用户气泡)并继续生成,除非对话处于合法暂停状态(Q4H 或待处理的支线对话)。
15
+ - **强制工具调用控制**:对于普通的主线/支线对话轮次,`鞭策` 勾选项控制本轮 provider 请求是否必须通过 Dominds 工具结束。勾选时,模型应通过 `askHuman`、`tellask*`、`replyTellask*` 或其他运行时函数完成这一轮,而不是用普通文本直接收尾。FBR 中间轮是刻意例外:它们可以处于无可调用工具状态;FBR 收口阶段则必须调用两个结论工具之一。
13
16
 
14
17
  ## 目标
15
18
 
@@ -21,7 +24,7 @@ Dominds 主线对话旨在长期运行。主线对话"停止"(变为空闲)
21
24
  ## 非目标
22
25
 
23
26
  - 自动完成/自动将对话标记为完成。
24
- - 将此行为应用于支线对话(支线对话保持范围,应向其诉请者报告)。
27
+ - 将自动鞭策语注入应用于支线对话(支线对话保持范围,应向其诉请者报告)。
25
28
 
26
29
  ## 定义
27
30
 
@@ -67,12 +70,15 @@ Dominds 主线对话旨在长期运行。主线对话"停止"(变为空闲)
67
70
  为避免无限循环,diligence-push 有一个按对话的预算(每个成员的 `diligence-push-max`),控制对于给定对话在当前预算内还能注入多少个自动继续的鞭策语;预算耗尽后,运行时会停止继续自动鞭策。
68
71
 
69
72
  - 默认值:**99**
70
- - 如果 `< 1`,则该成员的 diligence-push 有效禁用
73
+ - 如果 `< 1`,则新建对话从 0 个自动鞭策预算开始
71
74
  - 可通过 `.minds/team.yaml` 中的 `diligence-push-max` 按成员配置
72
75
 
73
- ### Q4H 时重置
76
+ 重要:`diligence-push-max` 只是在创建或重置对话实例时使用的默认预算。运行时业务判断必须以具体对话自己的剩余预算
77
+ (`diligencePushRemainingBudget`)为准;因此即使团队默认值是 `0`,手工补充过预算的对话也应继续自动鞭策。
78
+
79
+ ### Q4H 暂停
74
80
 
75
- 当对话因待处理的 Q4H(Questions for Human)而暂停时,diligence-push 注入计数器会被重置。这确保在人类回答 Q4H 并恢复对话后,对话会获得新的 diligence-push 预算。
81
+ 当对话因待处理的 Q4H(Questions for Human)而暂停时,鞭策会在该暂停期间停止。Q4H 不会重新套用成员默认预算;对话会保留自己的剩余预算,因此操作员调整过的预算能跨过暂停边界继续生效。
76
82
 
77
83
  ### 预算耗尽 → 停止继续自动鞭策当前预算
78
84
 
@@ -84,9 +90,7 @@ Dominds 主线对话旨在长期运行。主线对话"停止"(变为空闲)
84
90
 
85
91
  - 如果选中的鞭策语文件存在但其内容为空/仅空白,则禁用 diligence-push(不注入)。
86
92
 
87
- 可以通过以下任一方式按成员禁用 diligence-push:
88
-
89
- - 如果 `diligence-push-max < 1`,则该成员的 diligence-push 被禁用(不注入)。
93
+ 若要停止某个具体对话的自动续推,应将该对话的剩余预算设为 `0`,或使用该对话自己的鞭策禁用开关。
90
94
 
91
95
  ## 鞭策语解析
92
96
 
@@ -102,9 +106,9 @@ Dominds 主线对话旨在长期运行。主线对话"停止"(变为空闲)
102
106
 
103
107
  注意:鞭策语文件中的 YAML frontmatter 会被运行时忽略。如果存在,它被视为非内容元数据并从提示正文中剥离。
104
108
 
105
- ### 团队成员上限:`diligence-push-max`
109
+ ### 团队成员默认预算:`diligence-push-max`
106
110
 
107
- 每个团队成员可以选择通过 `.minds/team.yaml` 限制 diligence-push:
111
+ 每个团队成员可以选择通过 `.minds/team.yaml` 设置新建或重置对话的鞭策起始预算:
108
112
 
109
113
  ```yaml
110
114
  members:
@@ -115,7 +119,8 @@ members:
115
119
  规则:
116
120
 
117
121
  - 如果缺失,`diligence-push-max` 对于该成员默认为 **99**。
118
- - 如果 `diligence-push-max < 1`,则该成员的 diligence-push 被禁用(不注入),即使鞭策语文件存在。
122
+ - 如果 `diligence-push-max < 1`,则新建对话的剩余预算从 `0` 开始。
123
+ - 创建或重置之后,运行时业务逻辑以对话自己的剩余预算为准,而不是再次把 `diligence-push-max` 当作启停闸门。
119
124
  - 内置影子成员 `fuxi` 和 `pangu` 默认为 `diligence-push-max: 0`,除非在 team.yaml 中显式覆盖。
120
125
 
121
126
  ## UX 备注
@@ -425,11 +425,11 @@ Example / 示例(概念):
425
425
 
426
426
  ### Diligence Push(鞭策)
427
427
 
428
- - EN: A proactive continuation mechanism that nudges an agent forward when it's idle or blocked (a "Diligence Push"), using configurable prompts and budget limits. **Always use "Diligence Push"; never use "keep-going", "勤奋", "proactive-push", or "auto-continue".**
429
- - ZH: 一种主动继续机制,在智能体空闲或阻塞时通过可配置的提示词和预算上限进行"鞭策"。**统一使用"鞭策";禁止使用"保持运行"、"勤奋"、"自动继续"、"催促"等变体。**
428
+ - EN: A proactive continuation mechanism that nudges an agent forward when it's idle or blocked (a "Diligence Push"), using configurable prompts and per-dialog remaining budgets. **Always use "Diligence Push"; never use "keep-going", "勤奋", "proactive-push", or "auto-continue".**
429
+ - ZH: 一种主动继续机制,在智能体空闲或阻塞时通过可配置的提示词和每个对话自己的剩余预算进行"鞭策"。**统一使用"鞭策";禁止使用"保持运行"、"勤奋"、"自动继续"、"催促"等变体。**
430
430
 
431
431
  - EN: Related terms: "Diligence Push prompt" (prompt file), "Diligence Push-max" config, "Diligence Push injection" (prompt injection).
432
- - ZH: 相关术语:"鞭策提示词"(提示词文件)、"鞭策上限"(配置项)、"鞭策注入"(注入机制)。
432
+ - ZH: 相关术语:"鞭策提示词"(提示词文件)、"鞭策默认预算"(配置项)、"鞭策注入"(注入机制)。
433
433
 
434
434
  ### 用词原则:者 / 器 与 -or / -er
435
435
 
package/dist/docs/fbr.md CHANGED
@@ -14,12 +14,12 @@ The mechanism is the runtime-enforced contract applied to the spawned Side Dialo
14
14
 
15
15
  ## 2. Design principles and tradeoffs
16
16
 
17
- ### 2.1 Predictability first: FBR is tool-less until final closure
17
+ ### 2.1 Predictability first: FBR cannot use ordinary tools until final closure
18
18
 
19
19
  FBR is meant to be “reasoning over text”, not “an agent run that explores the environment”. To keep it safe and
20
20
  predictable, FBR Side Dialogs must be:
21
21
 
22
- - **tool-less by construction during divergence/convergence** (technically enforced; not “please don’t use tools”), and
22
+ - **isolated from ordinary tools during divergence/convergence** (no tellask / file / shell / browser / rtws access; provider requests may use `tool_choice: "none"` or equivalent), and
23
23
  - **closure-only in the final stage** (exactly two conclusion functions, no other tools), and
24
24
  - **body-first** (the tellask body is the authoritative task context).
25
25
 
@@ -75,12 +75,12 @@ When driving an FBR Side Dialog created by `freshBootsReasoning({ tellaskContent
75
75
  Intuition: “fresh boots” means “fresh relative to the tellasker-side thread”, not “ignores baseline system rules”. Runtime may
76
76
  still inject baseline policy/safety/formatting context, but the tellask body remains the authority.
77
77
 
78
- ### 4.2 Tool-less (prompt + technical enforcement)
78
+ ### 4.2 Tool isolation (prompt + technical enforcement)
79
79
 
80
80
  Tool-less FBR has two layers, both required:
81
81
 
82
82
  1. **Prompt contract**: the runtime must communicate the current phase constraints unambiguously.
83
- 2. **API/transport contract**: divergence/convergence must be technically tool-less; final closure may expose exactly two conclusion functions and nothing else.
83
+ 2. **API/transport contract**: divergence/convergence must expose no callable Dominds tools; final closure may expose exactly two conclusion functions and nothing else.
84
84
 
85
85
  #### 4.2.1 System prompt requirements (no tool instructions)
86
86
 
@@ -110,12 +110,12 @@ If a provider integration normally injects a tool prompt or schema, then for FBR
110
110
 
111
111
  Under no circumstances should the FBR Side Dialog see any tool definitions.
112
112
 
113
- #### 4.2.3 The LLM request MUST be “zero tools
113
+ #### 4.2.3 Divergence/convergence requests expose no callable tools
114
114
 
115
- For divergence/convergence, the LLM request for an FBR Side Dialog (`freshBootsReasoning`) MUST have **zero tools available**:
115
+ For divergence/convergence, the LLM request for an FBR Side Dialog (`freshBootsReasoning`) MUST have no callable Dominds tools available:
116
116
 
117
117
  - the request payload must not include tool/function definitions (effective tool list must be empty)
118
- - provider tool-calling / function-calling modes must not be enabled
118
+ - provider tool-calling / function-calling modes should use `none` or the closest provider-equivalent disabled mode
119
119
 
120
120
  In the final closure phase, runtime MAY expose exactly these two functions and no others:
121
121
 
@@ -217,7 +217,7 @@ members:
217
217
 
218
218
  ## 9. Acceptance checklist
219
219
 
220
- - `freshBootsReasoning({ tellaskContent: "..." })` triggers tool-less FBR; the LLM request is technically “zero tools”.
220
+ - `freshBootsReasoning({ tellaskContent: "..." })` triggers FBR; divergence/convergence expose no callable tools, and final closure requires one of the two conclusion tools.
221
221
  - The system prompt body contains no tool instructions; tool-related wording comes only from the separate fixed notice.
222
222
  - FBR Side Dialogs cannot issue teammate Tellasks (including `tellaskBack`).
223
223
  - `fbr-effort` defaults to `3`, accepts `0..100`, rejects invalid values, and fails loudly when disabled.
@@ -12,11 +12,11 @@
12
12
 
13
13
  ## 2. 设计原则与取舍(为什么这样做)
14
14
 
15
- ### 2.1 可预期优先:FBR 在最终收口前必须“无工具”
15
+ ### 2.1 可预期优先:FBR 在最终收口前不得使用普通工具
16
16
 
17
17
  FBR 的价值来自“把推理拉回文本”:让被诉请者只围绕诉请正文进行独立推理,而不是在工具、环境、副作用里游走。为此,FBR 支线对话必须满足:
18
18
 
19
- - **发散/收敛阶段技术上 0 工具**(不是“提示词里说别用工具”)
19
+ - **发散/收敛阶段与普通工具隔离**(不能 tellask、读文件、跑 shell、浏览、访问 rtws;provider 请求可使用 `tool_choice: "none"` 或等价禁用模式)
20
20
  - **最终收口阶段只开放两个结论函数**
21
21
  - **上下文以诉请正文为权威**(不是“默认继承诉请者一侧历史”)
22
22
 
@@ -76,7 +76,7 @@ FBR 的价值来自“把推理拉回文本”:让被诉请者只围绕诉请
76
76
  FBR 的阶段性约束必须同时满足两类要求:
77
77
 
78
78
  1. **提示词契约**:运行时必须把当前阶段的能力边界表达得明确无歧义。
79
- 2. **API/传输层契约**:发散/收敛阶段必须技术上“0 工具”;最终收口阶段只允许两个结论函数。
79
+ 2. **API/传输层契约**:发散/收敛阶段不得暴露任何可调用的 Dominds 工具;最终收口阶段只允许两个结论函数。
80
80
 
81
81
  #### 4.2.1 system prompt 的要求(不得包含工具说明)
82
82
 
@@ -106,12 +106,12 @@ FBR 支线对话的 system prompt 必须明确包含(措辞可不同,但语
106
106
 
107
107
  无论如何,FBR 支线对话都不应看到任何工具定义。
108
108
 
109
- #### 4.2.3 发散/收敛阶段的 LLM 请求必须是“0 工具”
109
+ #### 4.2.3 发散/收敛阶段的 LLM 请求不得暴露可调用工具
110
110
 
111
- 发起 `freshBootsReasoning` FBR 支线对话的 LLM 请求必须做到 **0 个可用工具**:
111
+ 发起 `freshBootsReasoning` FBR 支线对话的发散/收敛请求必须做到没有可调用的 Dominds 工具:
112
112
 
113
113
  - 请求 payload 中不得包含任何 tool/function 定义(有效工具列表必须为空)
114
- - 不得启用提供方支持的任何“工具调用模式 / 工具选择 / 函数调用”开关
114
+ - provider 工具调用/函数调用模式应使用 `none` 或最接近的禁用模式
115
115
 
116
116
  最终收口阶段,运行时只可开放以下两个函数:
117
117
 
@@ -212,7 +212,7 @@ members:
212
212
 
213
213
  ## 9. 验收清单(实现检查点)
214
214
 
215
- - `freshBootsReasoning({ tellaskContent: "..." })` 触发 FBR:支线对话必须无工具,并且在 API 层确认为“0 工具”请求。
215
+ - `freshBootsReasoning({ tellaskContent: "..." })` 触发 FBR:发散/收敛阶段不得暴露可调用工具;最终收口阶段必须调用两个结论工具之一。
216
216
  - system prompt 本体不含工具说明;工具相关文本只能来自独立、固定的“无工具提示”。
217
217
  - FBR 支线对话不得发起队友诉请(包括 `tellaskBack`)。
218
218
  - `fbr-effort` 默认 `3`,接受 `0..100`,禁用时明确报错拒绝。
@@ -12,6 +12,8 @@ This means:
12
12
  - `apiType: anthropic` owns official Anthropic Messages semantics, including object-shaped `model_params.anthropic.thinking`.
13
13
  - `apiType: anthropic-compatible` owns Anthropic-compatible gateway semantics, including boolean `model_params.anthropic-compatible.thinking` mapped to provider `enabled` / `disabled` request objects.
14
14
 
15
+ Some providers expose OpenAI-compatible or Anthropic-compatible endpoints while still requiring explicit provider quirks. Volcano Engine Ark Coding Plan now uses the OpenAI-compatible Chat Completions shape with its dedicated `/api/coding/v3` endpoint; the historical Anthropic-compatible Volcano tool-call quirks have been removed. See [`volcengine-coding-plan-openai-compatible.zh.md`](./volcengine-coding-plan-openai-compatible.zh.md) for the design record.
16
+
15
17
  Similar field names across wrappers do not imply compatibility. For example, `reasoning_effort`, `verbosity`, `parallel_tool_calls`, and web search controls may look similar but can still differ in accepted values, payload shape, lifecycle events, validation rules, and runtime meaning.
16
18
 
17
19
  ## Hard Rules
@@ -12,6 +12,8 @@ Dominds 把每个 LLM provider wrapper 视为独立的协议适配器,而不
12
12
  - `apiType: anthropic` 只负责 Anthropic 官方 Messages 语义,包括 object 形态的 `model_params.anthropic.thinking`。
13
13
  - `apiType: anthropic-compatible` 负责 Anthropic 兼容网关语义,包括 boolean 形态的 `model_params.anthropic-compatible.thinking`,并映射为 provider 请求里的 `enabled` / `disabled` object。
14
14
 
15
+ 某些 provider 虽然暴露 OpenAI-compatible 或 Anthropic-compatible endpoint,但仍可能需要明确的 provider quirk profile。火山方舟 Coding Plan 现在走 OpenAI-compatible Chat Completions 形态,并使用专属 `/api/coding/v3` endpoint;历史 Anthropic-compatible 火山工具调用 quirk 已取消。设计记录见 [`volcengine-coding-plan-openai-compatible.zh.md`](./volcengine-coding-plan-openai-compatible.zh.md)。
16
+
15
17
  不同 wrapper 下看起来同名的字段,不代表它们可以互相兼容。比如 `reasoning_effort`、`verbosity`、`parallel_tool_calls`、web search 相关开关,名字可能相似,但可接受值、请求载荷形状、流事件生命周期、校验规则和运行时含义都可能不同。
16
18
 
17
19
  ## 强约束
@@ -0,0 +1,120 @@
1
+ # MCP Prompts and Resources
2
+
3
+ This document defines how Dominds maps MCP prompts and resources into the runtime.
4
+ It extends the tool-focused MCP support described in [mcp-support.md](./mcp-support.md).
5
+
6
+ ## Design Position
7
+
8
+ MCP primitives have different control semantics:
9
+
10
+ - **Tools** are model-controlled actions. Dominds exposes them as function tools.
11
+ - **Prompts** are user-controlled templates. Dominds exposes them as read-only snippets.
12
+ - **Resources** are application-controlled context objects. Dominds exposes them through a
13
+ resource registry and explicit read tools.
14
+
15
+ Dominds should not flatten all MCP primitives into ordinary model tools. Doing so loses the
16
+ control boundary that makes MCP debuggable and safe.
17
+
18
+ ## Prompts -> Read-Only Snippets
19
+
20
+ MCP prompts are surfaced in the Snippets panel as read-only templates.
21
+
22
+ Expected behavior:
23
+
24
+ - `prompts/list` contributes dynamic snippet entries grouped by MCP server.
25
+ - `prompts/get` renders a selected prompt before insertion.
26
+ - Prompt arguments are collected by the UI before insertion when the prompt declares arguments.
27
+ - MCP prompt snippets cannot be edited or saved back through Dominds.
28
+ - Prompt IDs are Dominds-local stable IDs derived from server ID plus transformed MCP prompt name.
29
+
30
+ This keeps prompts user-selected while reusing the existing Dominds snippet workflow.
31
+
32
+ ## Resources -> Resource Registry
33
+
34
+ MCP resources and resource templates are surfaced through a Dominds resource registry.
35
+
36
+ Resource entries:
37
+
38
+ - Static resources come from `resources/list`.
39
+ - Resource templates come from `resources/templates/list`.
40
+ - Static resource IDs are derived from the resource URI after configured transforms.
41
+ - Template resource IDs are derived from the URI template after configured transforms.
42
+ - The original URI or URI template remains the source of truth used for MCP requests.
43
+
44
+ The resource registry is intentionally separate from Dominds files, docs, and memory. Those
45
+ domains keep their existing dedicated concepts. The resource registry is the generic MCP-shaped
46
+ context surface.
47
+
48
+ ## Resource Tools
49
+
50
+ Dominds provides explicit read-only tools:
51
+
52
+ - `list_resources`: list available resources and resource templates.
53
+ - `fetch_resource`: fetch a static resource or a rendered resource template.
54
+
55
+ Template fetching requires `arguments`. Passing arguments to a static resource is an error.
56
+ Missing template variables are errors. Oversized results and unsupported MIME types are errors,
57
+ not silent fallbacks.
58
+
59
+ ## Resource Skills
60
+
61
+ Markdown resources with valid Agent Skill frontmatter may be exposed as read-only virtual skills.
62
+
63
+ Rules:
64
+
65
+ - Resource skills are opt-in through `.minds/mcp.yaml`.
66
+ - Only textual markdown resources are eligible.
67
+ - The frontmatter must pass the same validation as local Dominds skills.
68
+ - Resource skills are read-only and keep MCP provenance.
69
+ - Invalid or duplicate resource skills are reported loudly through Problems/logs.
70
+
71
+ Dominds skills are loaded as an index in the system prompt. Skill bodies are read on demand with
72
+ `read_skill`, so resource skills do not inflate every generation by default.
73
+
74
+ ## Config Shape
75
+
76
+ Example:
77
+
78
+ ```yaml
79
+ version: 1
80
+ servers:
81
+ workstation:
82
+ transport: streamable_http
83
+ url: http://127.0.0.1:43178/mcp
84
+ headers:
85
+ Authorization: Bearer dw
86
+
87
+ prompts:
88
+ whitelist:
89
+ - 'workstation.*'
90
+ transform:
91
+ - prefix: 'workstation_'
92
+
93
+ resources:
94
+ whitelist:
95
+ - 'workstation-handbook://*'
96
+ - 'workstation-skill://*'
97
+ blacklist:
98
+ - '*secret*'
99
+ transform:
100
+ - prefix: 'workstation_'
101
+ mimeTypes:
102
+ - text/markdown
103
+ - text/plain
104
+ maxBytes: 50000
105
+ skills:
106
+ enabled: true
107
+ whitelist:
108
+ - 'workstation-skill://*'
109
+ transform:
110
+ - prefix: 'workstation_skill_'
111
+ ```
112
+
113
+ Filtering matches original MCP names/URIs/templates. Transforms only produce Dominds-local IDs.
114
+
115
+ ## Non-Goals
116
+
117
+ - No write-back to MCP prompts or resources.
118
+ - No automatic conversion of every markdown resource into a skill.
119
+ - No implicit prompt/resource access for servers filtered out by `.minds/mcp.yaml`.
120
+ - No compatibility fallback that silently calls MCP tools when resources or prompts fail.
@@ -15,6 +15,8 @@ MCP TypeScript SDK):
15
15
 
16
16
  - `.minds/mcp.yaml` loader with mandatory hot-reload.
17
17
  - MCP-derived tools/toolsets registered into the existing global tool(set) registry.
18
+ - MCP prompts and resources are mapped separately from tools; see
19
+ [mcp-prompts-resources.md](./mcp-prompts-resources.md).
18
20
  - Supported transports: `stdio` and `streamable_http` (SSE transport is not supported as a separate
19
21
  config option).
20
22
  - rtws Problems surfaced to the WebUI (Problems pill + panel) for MCP and LLM provider
@@ -326,8 +326,8 @@ used in `.minds/team.yaml` member configurations.
326
326
 
327
327
  - `openai`: uses the OpenAI **Responses API** (best for OpenAI official endpoints; requires a `/v1`-style `responses` endpoint)
328
328
  - `anthropic`: uses the official Anthropic **Messages API**. `model_params.anthropic.thinking` uses the official Anthropic object shape.
329
- - `anthropic-compatible`: uses Anthropic-compatible **Messages API** / coding-plan endpoints, e.g. Volcano Engine Coding Plan `.../api/coding`. `model_params.anthropic-compatible.thinking` uses the Dominds boolean switch: `true` sends `thinking.type=enabled`; `false` sends `thinking.type=disabled`.
330
- - `openai-compatible`: uses the OpenAI **Chat Completions API** (best for most “OpenAI-compatible” third-party/proxy endpoints; e.g. a manually configured Ark `.../api/v3` endpoint)
329
+ - `anthropic-compatible`: uses Anthropic-compatible **Messages API**. `model_params.anthropic-compatible.thinking` uses the Dominds boolean switch: `true` sends `thinking.type=enabled`; `false` sends `thinking.type=disabled`.
330
+ - `openai-compatible`: uses the OpenAI **Chat Completions API** (best for most “OpenAI-compatible” third-party/proxy endpoints; e.g. a manually configured Ark `.../api/v3` endpoint; Volcano Engine Ark Coding Plan must use its dedicated `.../api/coding/v3` endpoint)
331
331
  - **Vision support**: if the provider/model supports multimodal Chat Completions, Dominds will pass tool-output images (`func_result_msg.contentItems[].type=input_image`, e.g. from MCP tools) to the model as `image_url` inputs after reading the persisted artifact; unsupported mime types are downgraded to text.
332
332
 
333
333
  ```yaml
@@ -267,8 +267,8 @@
267
267
 
268
268
  - `openai`:使用 OpenAI **Responses API**(适用于 OpenAI 官方;需要 `/v1` 语义的 `responses` 端点)
269
269
  - `anthropic`:使用 Anthropic 官方 **Messages API**。`model_params.anthropic.thinking` 使用 Anthropic 官方 object 形态。
270
- - `anthropic-compatible`:使用 Anthropic 兼容的 **Messages API** / Coding Plan 端点(例如 Volcano Engine Coding Plan `.../api/coding`)。`model_params.anthropic-compatible.thinking` 使用 Dominds boolean 开关:`true` 发送 `thinking.type=enabled`,`false` 发送 `thinking.type=disabled`。
271
- - `openai-compatible`:使用 OpenAI **Chat Completions API**(适用于多数“OpenAI 兼容”第三方/代理;例如手动配置的 Ark `.../api/v3` 端点)
270
+ - `anthropic-compatible`:使用 Anthropic 兼容的 **Messages API**。`model_params.anthropic-compatible.thinking` 使用 Dominds boolean 开关:`true` 发送 `thinking.type=enabled`,`false` 发送 `thinking.type=disabled`。
271
+ - `openai-compatible`:使用 OpenAI **Chat Completions API**(适用于多数“OpenAI 兼容”第三方/代理;例如手动配置的 Ark `.../api/v3` 端点;火山方舟 Coding Plan 必须使用专属 `.../api/coding/v3` 端点)
272
272
  - **识图支持**:如果该 provider/model 支持 Chat Completions 的多模态输入,Dominds 会把工具输出里的图片(`func_result_msg.contentItems[].type=input_image`,来自 MCP 等工具)读取 artifact 后作为 `image_url` 形式喂给模型;不支持的 mimeType 会降级成文本提示。
273
273
 
274
274
  ```yaml
@@ -227,7 +227,10 @@ layer.
227
227
 
228
228
  - WebUI tools widget no longer caches authority snapshots per dialog.
229
229
  - The widget fetches a fresh `/api/tool-availability` snapshot and renders the composed visible
230
- toolsets/direct tools for the current context.
230
+ toolsets/standalone tools for the current context.
231
+ - Composition includes runtime-injected standalone tools such as `man` and `read_skill`, plus the
232
+ intrinsic `control` toolset with main-dialog vs side-dialog filtering, so the widget follows the
233
+ effective tools of a fresh drive/load rather than only static `.minds/team.yaml` bindings.
231
234
  - In-flight prompts are still not rewritten retroactively. A fresh drive/load uses the latest
232
235
  composed availability snapshot, which remains the intended contract.
233
236
  - App-controlled dynamic availability is still intentionally narrow in surface area: