dominds 0.1.0

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 (273) hide show
  1. package/LICENSE +157 -0
  2. package/README.md +250 -0
  3. package/README.zh.md +161 -0
  4. package/dist/access-control.js +253 -0
  5. package/dist/cli/create.js +263 -0
  6. package/dist/cli/read.js +84 -0
  7. package/dist/cli/tui.js +199 -0
  8. package/dist/cli/webui.js +169 -0
  9. package/dist/cli.js +227 -0
  10. package/dist/dialog-factory.js +53 -0
  11. package/dist/dialog-global-registry.js +68 -0
  12. package/dist/dialog-instance-registry.js +78 -0
  13. package/dist/dialog-run-state.js +198 -0
  14. package/dist/dialog.js +1024 -0
  15. package/dist/evt-registry.js +103 -0
  16. package/dist/index.js +8 -0
  17. package/dist/llm/client.js +69 -0
  18. package/dist/llm/defaults.yaml +386 -0
  19. package/dist/llm/driver.js +3214 -0
  20. package/dist/llm/gen/anthropic.js +611 -0
  21. package/dist/llm/gen/codex.js +375 -0
  22. package/dist/llm/gen/mock.js +326 -0
  23. package/dist/llm/gen/openai.js +470 -0
  24. package/dist/llm/gen/registry.js +26 -0
  25. package/dist/llm/gen.js +2 -0
  26. package/dist/llm/tools-projection.js +37 -0
  27. package/dist/log.js +228 -0
  28. package/dist/mcp/config.js +230 -0
  29. package/dist/mcp/sdk-client.js +129 -0
  30. package/dist/mcp/server-runtime.js +57 -0
  31. package/dist/mcp/stdio-client.js +280 -0
  32. package/dist/mcp/supervisor.js +979 -0
  33. package/dist/mcp/tool-names.js +109 -0
  34. package/dist/minds/builtin/cmdr/persona.md +3 -0
  35. package/dist/minds/builtin/dijiang/knowledge.md +287 -0
  36. package/dist/minds/builtin/dijiang/persona.md +7 -0
  37. package/dist/minds/builtin/fuxi/persona.en.md +59 -0
  38. package/dist/minds/builtin/fuxi/persona.zh.md +49 -0
  39. package/dist/minds/builtin/pangu/persona.en.md +78 -0
  40. package/dist/minds/builtin/pangu/persona.zh.md +71 -0
  41. package/dist/minds/load.js +617 -0
  42. package/dist/minds/minds-i18n.js +131 -0
  43. package/dist/minds/system-prompt.js +281 -0
  44. package/dist/persistence.js +3128 -0
  45. package/dist/problems.js +109 -0
  46. package/dist/server/api-routes.js +1031 -0
  47. package/dist/server/auth.js +180 -0
  48. package/dist/server/mime-types.js +32 -0
  49. package/dist/server/prompts-routes.js +543 -0
  50. package/dist/server/server-core.js +235 -0
  51. package/dist/server/setup-routes.js +697 -0
  52. package/dist/server/static-server.js +132 -0
  53. package/dist/server/websocket-handler.js +1011 -0
  54. package/dist/server.js +164 -0
  55. package/dist/shared/async-fifo-mutex.js +36 -0
  56. package/dist/shared/diligence.js +20 -0
  57. package/dist/shared/dotenv.js +144 -0
  58. package/dist/shared/evt.js +195 -0
  59. package/dist/shared/i18n/driver-messages.js +267 -0
  60. package/dist/shared/i18n/text.js +9 -0
  61. package/dist/shared/i18n/tool-result-messages.js +51 -0
  62. package/dist/shared/rtws-cli.js +73 -0
  63. package/dist/shared/runtime-language.js +47 -0
  64. package/dist/shared/team-mgmt-manual.js +116 -0
  65. package/dist/shared/types/context-health.js +2 -0
  66. package/dist/shared/types/dialog.js +11 -0
  67. package/dist/shared/types/i18n.js +2 -0
  68. package/dist/shared/types/index.js +26 -0
  69. package/dist/shared/types/language.js +40 -0
  70. package/dist/shared/types/problems.js +2 -0
  71. package/dist/shared/types/prompts.js +2 -0
  72. package/dist/shared/types/q4h.js +7 -0
  73. package/dist/shared/types/run-state.js +8 -0
  74. package/dist/shared/types/setup.js +2 -0
  75. package/dist/shared/types/storage.js +10 -0
  76. package/dist/shared/types/tellask.js +8 -0
  77. package/dist/shared/types/tools-registry.js +2 -0
  78. package/dist/shared/types/wire.js +12 -0
  79. package/dist/shared/utils/fmt.js +9 -0
  80. package/dist/shared/utils/html.js +20 -0
  81. package/dist/shared/utils/id.js +18 -0
  82. package/dist/shared/utils/inter-dialog-format.js +101 -0
  83. package/dist/shared/utils/time.js +13 -0
  84. package/dist/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  85. package/dist/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  86. package/dist/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  87. package/dist/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  88. package/dist/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  89. package/dist/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  90. package/dist/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  91. package/dist/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  92. package/dist/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  93. package/dist/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  94. package/dist/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  95. package/dist/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  96. package/dist/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  97. package/dist/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  98. package/dist/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  99. package/dist/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  100. package/dist/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  101. package/dist/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  102. package/dist/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  103. package/dist/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  104. package/dist/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  105. package/dist/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  106. package/dist/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  107. package/dist/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  108. package/dist/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  109. package/dist/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  110. package/dist/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  111. package/dist/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  112. package/dist/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  113. package/dist/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  114. package/dist/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  115. package/dist/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  116. package/dist/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  117. package/dist/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  118. package/dist/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  119. package/dist/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  120. package/dist/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  121. package/dist/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  122. package/dist/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  123. package/dist/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  124. package/dist/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  125. package/dist/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  126. package/dist/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  127. package/dist/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  128. package/dist/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  129. package/dist/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  130. package/dist/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  131. package/dist/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  132. package/dist/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  133. package/dist/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  134. package/dist/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  135. package/dist/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  136. package/dist/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  137. package/dist/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  138. package/dist/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  139. package/dist/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  140. package/dist/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  141. package/dist/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  142. package/dist/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  143. package/dist/static/assets/_baseUniq-Crfl3d5Y.js +661 -0
  144. package/dist/static/assets/_baseUniq-Crfl3d5Y.js.map +1 -0
  145. package/dist/static/assets/arc-CbA_x9GD.js +132 -0
  146. package/dist/static/assets/arc-CbA_x9GD.js.map +1 -0
  147. package/dist/static/assets/architectureDiagram-VXUJARFQ-lcFS8ZQJ.js +8685 -0
  148. package/dist/static/assets/architectureDiagram-VXUJARFQ-lcFS8ZQJ.js.map +1 -0
  149. package/dist/static/assets/blockDiagram-VD42YOAC-B3Q36qRc.js +3608 -0
  150. package/dist/static/assets/blockDiagram-VD42YOAC-B3Q36qRc.js.map +1 -0
  151. package/dist/static/assets/c4Diagram-YG6GDRKO-Mt-aq3VH.js +2482 -0
  152. package/dist/static/assets/c4Diagram-YG6GDRKO-Mt-aq3VH.js.map +1 -0
  153. package/dist/static/assets/channel-BVr1Yke-.js +8 -0
  154. package/dist/static/assets/channel-BVr1Yke-.js.map +1 -0
  155. package/dist/static/assets/chunk-4BX2VUAB-qCIn5Iic.js +17 -0
  156. package/dist/static/assets/chunk-4BX2VUAB-qCIn5Iic.js.map +1 -0
  157. package/dist/static/assets/chunk-55IACEB6-q172NeCV.js +14 -0
  158. package/dist/static/assets/chunk-55IACEB6-q172NeCV.js.map +1 -0
  159. package/dist/static/assets/chunk-B4BG7PRW-CMJmtYzq.js +1827 -0
  160. package/dist/static/assets/chunk-B4BG7PRW-CMJmtYzq.js.map +1 -0
  161. package/dist/static/assets/chunk-DI55MBZ5-DiuwwZPL.js +1916 -0
  162. package/dist/static/assets/chunk-DI55MBZ5-DiuwwZPL.js.map +1 -0
  163. package/dist/static/assets/chunk-FMBD7UC4-06sqZTTn.js +20 -0
  164. package/dist/static/assets/chunk-FMBD7UC4-06sqZTTn.js.map +1 -0
  165. package/dist/static/assets/chunk-QN33PNHL-CnpBNkpP.js +25 -0
  166. package/dist/static/assets/chunk-QN33PNHL-CnpBNkpP.js.map +1 -0
  167. package/dist/static/assets/chunk-QZHKN3VN-CNgjMR-e.js +18 -0
  168. package/dist/static/assets/chunk-QZHKN3VN-CNgjMR-e.js.map +1 -0
  169. package/dist/static/assets/chunk-TZMSLE5B-BxtzW6--.js +109 -0
  170. package/dist/static/assets/chunk-TZMSLE5B-BxtzW6--.js.map +1 -0
  171. package/dist/static/assets/classDiagram-2ON5EDUG-29huvmn-.js +23 -0
  172. package/dist/static/assets/classDiagram-2ON5EDUG-29huvmn-.js.map +1 -0
  173. package/dist/static/assets/classDiagram-v2-WZHVMYZB-29huvmn-.js +23 -0
  174. package/dist/static/assets/classDiagram-v2-WZHVMYZB-29huvmn-.js.map +1 -0
  175. package/dist/static/assets/clone-D2OgLSSn.js +9 -0
  176. package/dist/static/assets/clone-D2OgLSSn.js.map +1 -0
  177. package/dist/static/assets/cose-bilkent-S5V4N54A-BNegDCxl.js +4943 -0
  178. package/dist/static/assets/cose-bilkent-S5V4N54A-BNegDCxl.js.map +1 -0
  179. package/dist/static/assets/cytoscape.esm-Bm8DJGmZ.js +30240 -0
  180. package/dist/static/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -0
  181. package/dist/static/assets/dagre-6UL2VRFP-f1XrTRSn.js +695 -0
  182. package/dist/static/assets/dagre-6UL2VRFP-f1XrTRSn.js.map +1 -0
  183. package/dist/static/assets/defaultLocale-DVr69WTU.js +207 -0
  184. package/dist/static/assets/defaultLocale-DVr69WTU.js.map +1 -0
  185. package/dist/static/assets/diagram-PSM6KHXK-8w1WbeDi.js +849 -0
  186. package/dist/static/assets/diagram-PSM6KHXK-8w1WbeDi.js.map +1 -0
  187. package/dist/static/assets/diagram-QEK2KX5R-CF4wtMmR.js +303 -0
  188. package/dist/static/assets/diagram-QEK2KX5R-CF4wtMmR.js.map +1 -0
  189. package/dist/static/assets/diagram-S2PKOQOG-8p3Avgn2.js +213 -0
  190. package/dist/static/assets/diagram-S2PKOQOG-8p3Avgn2.js.map +1 -0
  191. package/dist/static/assets/erDiagram-Q2GNP2WA-BMKLxlM9.js +1159 -0
  192. package/dist/static/assets/erDiagram-Q2GNP2WA-BMKLxlM9.js.map +1 -0
  193. package/dist/static/assets/favicon-Cmg5RbCj.svg +8 -0
  194. package/dist/static/assets/flowDiagram-NV44I4VS-CgEuPNK2.js +2332 -0
  195. package/dist/static/assets/flowDiagram-NV44I4VS-CgEuPNK2.js.map +1 -0
  196. package/dist/static/assets/ganttDiagram-JELNMOA3-bJkDCf-9.js +3681 -0
  197. package/dist/static/assets/ganttDiagram-JELNMOA3-bJkDCf-9.js.map +1 -0
  198. package/dist/static/assets/gitGraphDiagram-NY62KEGX-4QE9kesp.js +1206 -0
  199. package/dist/static/assets/gitGraphDiagram-NY62KEGX-4QE9kesp.js.map +1 -0
  200. package/dist/static/assets/graph-CS0Pmm7c.js +597 -0
  201. package/dist/static/assets/graph-CS0Pmm7c.js.map +1 -0
  202. package/dist/static/assets/index-BS6HnGzC.js +112303 -0
  203. package/dist/static/assets/index-BS6HnGzC.js.map +1 -0
  204. package/dist/static/assets/index-DaIsSzC_.css +483 -0
  205. package/dist/static/assets/infoDiagram-WHAUD3N6-ypBcKfUs.js +34 -0
  206. package/dist/static/assets/infoDiagram-WHAUD3N6-ypBcKfUs.js.map +1 -0
  207. package/dist/static/assets/init-ZxktEp_H.js +17 -0
  208. package/dist/static/assets/init-ZxktEp_H.js.map +1 -0
  209. package/dist/static/assets/journeyDiagram-XKPGCS4Q-QnrxDowJ.js +1255 -0
  210. package/dist/static/assets/journeyDiagram-XKPGCS4Q-QnrxDowJ.js.map +1 -0
  211. package/dist/static/assets/kanban-definition-3W4ZIXB7-CfvEc4z5.js +1048 -0
  212. package/dist/static/assets/kanban-definition-3W4ZIXB7-CfvEc4z5.js.map +1 -0
  213. package/dist/static/assets/layout-8TGxpm23.js +2218 -0
  214. package/dist/static/assets/layout-8TGxpm23.js.map +1 -0
  215. package/dist/static/assets/linear-BATBPQQv.js +341 -0
  216. package/dist/static/assets/linear-BATBPQQv.js.map +1 -0
  217. package/dist/static/assets/min-B3oVH3AC.js +42 -0
  218. package/dist/static/assets/min-B3oVH3AC.js.map +1 -0
  219. package/dist/static/assets/mindmap-definition-VGOIOE7T-L7VLwwF8.js +1127 -0
  220. package/dist/static/assets/mindmap-definition-VGOIOE7T-L7VLwwF8.js.map +1 -0
  221. package/dist/static/assets/ordinal-CxptdPJm.js +77 -0
  222. package/dist/static/assets/ordinal-CxptdPJm.js.map +1 -0
  223. package/dist/static/assets/pieDiagram-ADFJNKIX-CFW3zIhM.js +241 -0
  224. package/dist/static/assets/pieDiagram-ADFJNKIX-CFW3zIhM.js.map +1 -0
  225. package/dist/static/assets/quadrantDiagram-AYHSOK5B-B7ssen3E.js +1338 -0
  226. package/dist/static/assets/quadrantDiagram-AYHSOK5B-B7ssen3E.js.map +1 -0
  227. package/dist/static/assets/requirementDiagram-UZGBJVZJ-D0v5BArv.js +1162 -0
  228. package/dist/static/assets/requirementDiagram-UZGBJVZJ-D0v5BArv.js.map +1 -0
  229. package/dist/static/assets/sankeyDiagram-TZEHDZUN-B7slncJe.js +1195 -0
  230. package/dist/static/assets/sankeyDiagram-TZEHDZUN-B7slncJe.js.map +1 -0
  231. package/dist/static/assets/sequenceDiagram-WL72ISMW-oXU2lRh_.js +3875 -0
  232. package/dist/static/assets/sequenceDiagram-WL72ISMW-oXU2lRh_.js.map +1 -0
  233. package/dist/static/assets/stateDiagram-FKZM4ZOC-CFYsEd0x.js +452 -0
  234. package/dist/static/assets/stateDiagram-FKZM4ZOC-CFYsEd0x.js.map +1 -0
  235. package/dist/static/assets/stateDiagram-v2-4FDKWEC3-C0UWaNA7.js +22 -0
  236. package/dist/static/assets/stateDiagram-v2-4FDKWEC3-C0UWaNA7.js.map +1 -0
  237. package/dist/static/assets/timeline-definition-IT6M3QCI-C3KODUrh.js +1223 -0
  238. package/dist/static/assets/timeline-definition-IT6M3QCI-C3KODUrh.js.map +1 -0
  239. package/dist/static/assets/treemap-KMMF4GRG-DAGDLhj2.js +18753 -0
  240. package/dist/static/assets/treemap-KMMF4GRG-DAGDLhj2.js.map +1 -0
  241. package/dist/static/assets/xychartDiagram-PRI3JC2R-C0J9iwTO.js +1888 -0
  242. package/dist/static/assets/xychartDiagram-PRI3JC2R-C0J9iwTO.js.map +1 -0
  243. package/dist/static/index.html +71 -0
  244. package/dist/static/testing/dom-observation-utils.js +425 -0
  245. package/dist/static/testing/e2e-test-helper.js +3119 -0
  246. package/dist/team.js +1160 -0
  247. package/dist/tellask.js +431 -0
  248. package/dist/tool.js +150 -0
  249. package/dist/tools/apply-patch.js +542 -0
  250. package/dist/tools/builtins.js +196 -0
  251. package/dist/tools/context-health.js +177 -0
  252. package/dist/tools/ctrl.js +478 -0
  253. package/dist/tools/diag.js +583 -0
  254. package/dist/tools/env.js +184 -0
  255. package/dist/tools/fs.js +818 -0
  256. package/dist/tools/mcp.js +138 -0
  257. package/dist/tools/mem.js +349 -0
  258. package/dist/tools/os.js +751 -0
  259. package/dist/tools/prompts/team_mgmt.en.md +70 -0
  260. package/dist/tools/prompts/team_mgmt.zh.md +70 -0
  261. package/dist/tools/prompts/ws_mod.en.md +86 -0
  262. package/dist/tools/prompts/ws_mod.zh.md +87 -0
  263. package/dist/tools/registry-snapshot.js +31 -0
  264. package/dist/tools/registry.js +121 -0
  265. package/dist/tools/ripgrep.js +678 -0
  266. package/dist/tools/team-mgmt.js +3300 -0
  267. package/dist/tools/txt.js +3178 -0
  268. package/dist/utils/id.js +72 -0
  269. package/dist/utils/task-doc.js +236 -0
  270. package/dist/utils/task-package.js +522 -0
  271. package/dist/utils/taskdoc-search.js +280 -0
  272. package/dist/utils/taskdoc.js +400 -0
  273. package/package.json +69 -0
package/dist/team.js ADDED
@@ -0,0 +1,1160 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Team = void 0;
7
+ /**
8
+ * Module: team
9
+ *
10
+ * Team configuration and member modeling:
11
+ * - `Team` aggregating members and defaults
12
+ * - YAML load/conversion helpers
13
+ * - `Team.Member` with tool resolution and access fields
14
+ */
15
+ const promises_1 = __importDefault(require("fs/promises"));
16
+ const yaml_1 = __importDefault(require("yaml"));
17
+ const client_1 = require("./llm/client");
18
+ const log_1 = require("./log");
19
+ const problems_1 = require("./problems");
20
+ const time_1 = require("./shared/utils/time");
21
+ const registry_1 = require("./tools/registry");
22
+ class Team {
23
+ constructor(params) {
24
+ this.memberDefaults =
25
+ params.memberDefaults ||
26
+ new Team.Member({
27
+ id: 'defaulter',
28
+ name: 'Defaulter',
29
+ });
30
+ this.defaultResponder = params.defaultResponder;
31
+ this.shellSpecialists = params.shellSpecialists ?? [];
32
+ this.members = params.members || {};
33
+ }
34
+ getDefaultResponder() {
35
+ const explicit = this.getMember(this.defaultResponder);
36
+ if (explicit)
37
+ return explicit;
38
+ // Fallback: pick the first visible member, else Fuxi, else any member.
39
+ const all = Object.values(this.members);
40
+ const visible = all.find((m) => m.hidden !== true);
41
+ if (visible)
42
+ return visible;
43
+ const fuxi = this.getMember('fuxi');
44
+ if (fuxi)
45
+ return fuxi;
46
+ return all.length > 0 ? all[0] : undefined;
47
+ }
48
+ getMember(id) {
49
+ if (!id)
50
+ return undefined;
51
+ return this.members[id];
52
+ }
53
+ }
54
+ exports.Team = Team;
55
+ (function (Team) {
56
+ const TEAM_YAML_PATH = '.minds/team.yaml';
57
+ const TEAM_YAML_PROBLEM_PREFIX = 'team/team_yaml_error/';
58
+ /**
59
+ * Team.Member
60
+ *
61
+ * Represents an agent/member with model/provider and tool configuration.
62
+ * Also supports resolving toolsets into concrete tool lists.
63
+ */
64
+ class Member {
65
+ constructor(params) {
66
+ this.id = params.id;
67
+ this.name = params.name;
68
+ // Only assign provided fields; omit undefined so prototype fallback can apply
69
+ if (params.provider !== undefined)
70
+ this.provider = params.provider;
71
+ if (params.model !== undefined)
72
+ this.model = params.model;
73
+ // Only assign provided fields; omit undefined so prototype fallback can apply
74
+ if (params.gofor !== undefined)
75
+ this.gofor = params.gofor;
76
+ if (params.toolsets !== undefined)
77
+ this.toolsets = params.toolsets;
78
+ if (params.tools !== undefined)
79
+ this.tools = params.tools;
80
+ if (params.model_params !== undefined)
81
+ this.model_params = params.model_params;
82
+ if (params.diligence_push_max !== undefined)
83
+ this.diligence_push_max = params.diligence_push_max;
84
+ if (params.read_dirs !== undefined)
85
+ this.read_dirs = params.read_dirs;
86
+ if (params.write_dirs !== undefined)
87
+ this.write_dirs = params.write_dirs;
88
+ if (params.no_read_dirs !== undefined)
89
+ this.no_read_dirs = params.no_read_dirs;
90
+ if (params.no_write_dirs !== undefined)
91
+ this.no_write_dirs = params.no_write_dirs;
92
+ if (params.icon !== undefined)
93
+ this.icon = params.icon;
94
+ if (params.streaming !== undefined)
95
+ this.streaming = params.streaming;
96
+ if (params.hidden !== undefined)
97
+ this.hidden = params.hidden;
98
+ // TypeScript class-field initialization may define optional fields as own-properties with
99
+ // `undefined`, which breaks prototype-chain defaults. Clean them up.
100
+ const self = this;
101
+ const unsettableKeys = [
102
+ 'provider',
103
+ 'model',
104
+ 'gofor',
105
+ 'toolsets',
106
+ 'tools',
107
+ 'model_params',
108
+ 'diligence_push_max',
109
+ 'read_dirs',
110
+ 'write_dirs',
111
+ 'no_read_dirs',
112
+ 'no_write_dirs',
113
+ 'icon',
114
+ 'streaming',
115
+ 'hidden',
116
+ ];
117
+ for (const key of unsettableKeys) {
118
+ if (Object.prototype.hasOwnProperty.call(self, key) && self[key] === undefined) {
119
+ delete self[key];
120
+ }
121
+ }
122
+ }
123
+ setName(name) {
124
+ this.name = name;
125
+ }
126
+ setProvider(provider) {
127
+ if (provider === undefined) {
128
+ delete this.provider;
129
+ return;
130
+ }
131
+ this.provider = provider;
132
+ }
133
+ setModel(model) {
134
+ if (model === undefined) {
135
+ delete this.model;
136
+ return;
137
+ }
138
+ this.model = model;
139
+ }
140
+ setGofor(gofor) {
141
+ if (gofor === undefined) {
142
+ delete this.gofor;
143
+ return;
144
+ }
145
+ this.gofor = gofor;
146
+ }
147
+ setToolsets(toolsets) {
148
+ if (toolsets === undefined) {
149
+ delete this.toolsets;
150
+ return;
151
+ }
152
+ this.toolsets = toolsets;
153
+ }
154
+ setTools(tools) {
155
+ if (tools === undefined) {
156
+ delete this.tools;
157
+ return;
158
+ }
159
+ this.tools = tools;
160
+ }
161
+ setModelParams(modelParams) {
162
+ if (modelParams === undefined) {
163
+ delete this.model_params;
164
+ return;
165
+ }
166
+ this.model_params = modelParams;
167
+ }
168
+ setDiligencePushMax(max) {
169
+ if (max === undefined) {
170
+ delete this.diligence_push_max;
171
+ return;
172
+ }
173
+ this.diligence_push_max = max;
174
+ }
175
+ setReadDirs(readDirs) {
176
+ if (readDirs === undefined) {
177
+ delete this.read_dirs;
178
+ return;
179
+ }
180
+ this.read_dirs = readDirs;
181
+ }
182
+ setWriteDirs(writeDirs) {
183
+ if (writeDirs === undefined) {
184
+ delete this.write_dirs;
185
+ return;
186
+ }
187
+ this.write_dirs = writeDirs;
188
+ }
189
+ setNoReadDirs(noReadDirs) {
190
+ if (noReadDirs === undefined) {
191
+ delete this.no_read_dirs;
192
+ return;
193
+ }
194
+ this.no_read_dirs = noReadDirs;
195
+ }
196
+ setNoWriteDirs(noWriteDirs) {
197
+ if (noWriteDirs === undefined) {
198
+ delete this.no_write_dirs;
199
+ return;
200
+ }
201
+ this.no_write_dirs = noWriteDirs;
202
+ }
203
+ setIcon(icon) {
204
+ if (icon === undefined) {
205
+ delete this.icon;
206
+ return;
207
+ }
208
+ this.icon = icon;
209
+ }
210
+ setStreaming(streaming) {
211
+ if (streaming === undefined) {
212
+ delete this.streaming;
213
+ return;
214
+ }
215
+ this.streaming = streaming;
216
+ }
217
+ setHidden(hidden) {
218
+ if (hidden === undefined) {
219
+ delete this.hidden;
220
+ return;
221
+ }
222
+ this.hidden = hidden;
223
+ }
224
+ /**
225
+ * Returns a flat list of Tool objects by resolving toolsets and merging with individual tools.
226
+ * Honors declaration order of toolsets and tools. Logs warnings for duplicate tool names
227
+ * that resolve to different Tool objects. Returns no duplicate tools per name.
228
+ */
229
+ listResolvedToolsetNames() {
230
+ if (!this.toolsets)
231
+ return [];
232
+ const excludedToolsets = new Set();
233
+ for (const entry of this.toolsets) {
234
+ if (entry.startsWith('!') && entry.length > 1) {
235
+ excludedToolsets.add(entry.slice(1));
236
+ }
237
+ }
238
+ const resolved = [];
239
+ const seen = new Set();
240
+ for (const toolsetName of this.toolsets) {
241
+ if (toolsetName.startsWith('!'))
242
+ continue;
243
+ const toolsetNames = toolsetName === '*'
244
+ ? Object.keys((0, registry_1.listToolsets)()).filter((n) => !excludedToolsets.has(n))
245
+ : excludedToolsets.has(toolsetName)
246
+ ? []
247
+ : [toolsetName];
248
+ for (const resolvedToolsetName of toolsetNames) {
249
+ if (seen.has(resolvedToolsetName))
250
+ continue;
251
+ const tools = (0, registry_1.getToolset)(resolvedToolsetName);
252
+ if (!tools) {
253
+ log_1.log.warn(`Toolset '${resolvedToolsetName}' not found in registry for member '${this.id}'`);
254
+ continue;
255
+ }
256
+ resolved.push(resolvedToolsetName);
257
+ seen.add(resolvedToolsetName);
258
+ }
259
+ }
260
+ return resolved;
261
+ }
262
+ listTools() {
263
+ const toolMap = new Map();
264
+ const seenNames = new Set();
265
+ // Process toolsets (in declaration order)
266
+ for (const toolsetName of this.listResolvedToolsetNames()) {
267
+ const tools = (0, registry_1.getToolset)(toolsetName);
268
+ if (!tools)
269
+ continue;
270
+ for (const tool of tools) {
271
+ if (seenNames.has(tool.name)) {
272
+ const existingTool = toolMap.get(tool.name);
273
+ if (existingTool && existingTool !== tool) {
274
+ log_1.log.warn(`Tool name '${tool.name}' resolves to different Tool objects for member '${this.id}'. Using first occurrence.`);
275
+ }
276
+ continue; // Skip duplicate
277
+ }
278
+ toolMap.set(tool.name, tool);
279
+ seenNames.add(tool.name);
280
+ }
281
+ }
282
+ // Process individual tools (in declaration order)
283
+ if (this.tools) {
284
+ for (const toolName of this.tools) {
285
+ const tool = (0, registry_1.getTool)(toolName);
286
+ if (!tool) {
287
+ log_1.log.warn(`Tool '${toolName}' not found in registry for member '${this.id}'`);
288
+ continue;
289
+ }
290
+ if (seenNames.has(toolName)) {
291
+ const existingTool = toolMap.get(toolName);
292
+ if (existingTool && existingTool !== tool) {
293
+ log_1.log.warn(`Tool name '${toolName}' resolves to different Tool objects for member '${this.id}'. Using first occurrence.`);
294
+ }
295
+ continue; // Skip duplicate
296
+ }
297
+ toolMap.set(toolName, tool);
298
+ seenNames.add(toolName);
299
+ }
300
+ }
301
+ return Array.from(toolMap.values());
302
+ }
303
+ }
304
+ Team.Member = Member;
305
+ // Team config support: load .minds/team.yaml
306
+ async function load() {
307
+ const md = new Team.Member({
308
+ id: 'defaulter',
309
+ name: 'Defaulter',
310
+ });
311
+ const fuxi = new Team.Member({
312
+ id: 'fuxi',
313
+ name: '伏羲(Fuxi)',
314
+ icon: '☯️',
315
+ hidden: true,
316
+ toolsets: ['team-mgmt'],
317
+ diligence_push_max: 0,
318
+ });
319
+ Object.setPrototypeOf(fuxi, md);
320
+ // Use `*` to include toolsets registered later (e.g., hot-reloaded MCP toolsets),
321
+ // and exclude the team-management toolset.
322
+ const pangu = new Team.Member({
323
+ id: 'pangu',
324
+ name: '盘古(Pangu)',
325
+ icon: '⛰️',
326
+ hidden: true,
327
+ toolsets: ['*', '!team-mgmt'],
328
+ no_read_dirs: ['.minds/**'],
329
+ no_write_dirs: ['.minds/**'],
330
+ diligence_push_max: 0,
331
+ });
332
+ Object.setPrototypeOf(pangu, md);
333
+ const issuesById = new Map();
334
+ const addIssue = (id, message, errorText) => {
335
+ issuesById.set(id, { message, errorText });
336
+ };
337
+ const finalizeProblems = () => {
338
+ const now = (0, time_1.formatUnifiedTimestamp)(new Date());
339
+ const desired = [];
340
+ for (const [id, issue] of issuesById.entries()) {
341
+ desired.push({
342
+ kind: 'team_workspace_config_error',
343
+ source: 'team',
344
+ id: TEAM_YAML_PROBLEM_PREFIX + id,
345
+ severity: 'error',
346
+ timestamp: now,
347
+ message: issue.message,
348
+ detail: { filePath: TEAM_YAML_PATH, errorText: issue.errorText },
349
+ });
350
+ }
351
+ (0, problems_1.reconcileProblemsByPrefix)(TEAM_YAML_PROBLEM_PREFIX, desired);
352
+ };
353
+ const SHELL_TOOL_NAMES = ['shell_cmd', 'stop_daemon', 'get_daemon_output'];
354
+ function isShellToolName(name) {
355
+ return SHELL_TOOL_NAMES.includes(name);
356
+ }
357
+ function listShellTools(member) {
358
+ const out = [];
359
+ for (const t of member.listTools()) {
360
+ if (t.type !== 'func')
361
+ continue;
362
+ if (!isShellToolName(t.name))
363
+ continue;
364
+ if (out.includes(t.name))
365
+ continue;
366
+ out.push(t.name);
367
+ }
368
+ return out;
369
+ }
370
+ function enforceShellSpecialistsPolicy(team) {
371
+ // Hidden members are system-managed (or otherwise not user-facing). Their tool access is
372
+ // governed by runtime policy rather than `.minds/team.yaml` validation, so we skip them.
373
+ const isExemptHiddenMember = (member) => member.hidden === true;
374
+ const specialists = team.shellSpecialists;
375
+ if (specialists.length === 0) {
376
+ for (const member of Object.values(team.members)) {
377
+ if (isExemptHiddenMember(member))
378
+ continue;
379
+ const shellTools = listShellTools(member);
380
+ if (shellTools.length === 0)
381
+ continue;
382
+ addIssue(`shell_specialists/forbidden_member/${sanitizeProblemIdSegment(member.id)}`, 'Invalid .minds/team.yaml: shell tools are present but shell_specialists is empty/null.', `member '${member.id}' has shell tools (${shellTools.join(', ')}) but shell_specialists is empty; set shell_specialists to include '${member.id}' or remove shell tools from that member.`);
383
+ }
384
+ return;
385
+ }
386
+ const specialistSet = new Set(specialists);
387
+ for (const id of specialists) {
388
+ const member = team.getMember(id);
389
+ if (!member) {
390
+ addIssue(`shell_specialists/unknown_member/${sanitizeProblemIdSegment(id)}`, 'Invalid .minds/team.yaml: shell_specialists contains an unknown member id.', `shell_specialists includes '${id}', but no such member exists in team.members.`);
391
+ continue;
392
+ }
393
+ if (isExemptHiddenMember(member))
394
+ continue;
395
+ const shellTools = listShellTools(member);
396
+ if (shellTools.length === 0) {
397
+ addIssue(`shell_specialists/missing_shell_tools/${sanitizeProblemIdSegment(id)}`, 'Invalid .minds/team.yaml: shell specialist has no shell tools.', `shell_specialists includes '${id}', but member '${id}' has no shell tools. Grant toolset 'os' (or tools ${SHELL_TOOL_NAMES.join(', ')}) to '${id}'.`);
398
+ }
399
+ }
400
+ for (const member of Object.values(team.members)) {
401
+ if (isExemptHiddenMember(member))
402
+ continue;
403
+ if (specialistSet.has(member.id))
404
+ continue;
405
+ const shellTools = listShellTools(member);
406
+ if (shellTools.length === 0)
407
+ continue;
408
+ addIssue(`shell_specialists/non_specialist_has_shell_tools/${sanitizeProblemIdSegment(member.id)}`, 'Invalid .minds/team.yaml: non-shell-specialist member has shell tools.', `member '${member.id}' has shell tools (${shellTools.join(', ')}) but is not listed in shell_specialists.`);
409
+ }
410
+ }
411
+ const buildBootstrapTeam = async () => {
412
+ try {
413
+ await applyBootstrapMemberDefaults(md);
414
+ }
415
+ catch (err) {
416
+ log_1.log.warn(`Failed to apply bootstrap member defaults: ${err instanceof Error ? err.message : String(err)}`);
417
+ }
418
+ return new Team({
419
+ memberDefaults: md,
420
+ defaultResponder: 'fuxi',
421
+ shellSpecialists: [],
422
+ members: { fuxi, pangu },
423
+ });
424
+ };
425
+ try {
426
+ await promises_1.default.access(TEAM_YAML_PATH);
427
+ }
428
+ catch {
429
+ // When rtws doesn't have a team definition, construct a minimal team with
430
+ // shadow/hidden members for bootstrap.
431
+ const team = await buildBootstrapTeam();
432
+ finalizeProblems();
433
+ return team;
434
+ }
435
+ let team;
436
+ try {
437
+ const raw = await promises_1.default.readFile(TEAM_YAML_PATH, 'utf-8');
438
+ let parsed;
439
+ try {
440
+ parsed = yaml_1.default.parse(raw);
441
+ }
442
+ catch (err) {
443
+ addIssue('parse', 'Failed to parse .minds/team.yaml.', err instanceof Error ? err.message : String(err));
444
+ team = await buildBootstrapTeam();
445
+ finalizeProblems();
446
+ return team;
447
+ }
448
+ const parsedTeam = parseTeamYamlObject(parsed, md, { fuxi, pangu });
449
+ for (const issue of parsedTeam.issues) {
450
+ addIssue(issue.id, issue.message, issue.errorText);
451
+ }
452
+ team = parsedTeam.team;
453
+ }
454
+ catch (err) {
455
+ addIssue('read', 'Failed to load .minds/team.yaml.', err instanceof Error ? err.message : String(err));
456
+ team = await buildBootstrapTeam();
457
+ finalizeProblems();
458
+ return team;
459
+ }
460
+ // Always include fuxi + pangu as shadow members, even if team.yaml exists.
461
+ enforceShadowMemberDefaults(fuxi, pangu);
462
+ team.members['fuxi'] = fuxi;
463
+ team.members['pangu'] = pangu;
464
+ const configuredDefaultResponder = team.defaultResponder;
465
+ // Normalize default responder (even if team.yaml omitted it).
466
+ const def = team.getDefaultResponder();
467
+ team.defaultResponder = def ? def.id : 'fuxi';
468
+ // Shell specialists policy is fail-open at runtime but must surface errors to Problems panel.
469
+ enforceShellSpecialistsPolicy(team);
470
+ // If member_defaults provider/model are missing after parsing, try to recover from llm.yaml.
471
+ try {
472
+ await applyBootstrapMemberDefaults(md);
473
+ }
474
+ catch (err) {
475
+ // Fail open: Team must remain usable even if llm.yaml cannot be loaded.
476
+ log_1.log.warn(`Failed to recover missing member_defaults provider/model from llm config: ${err instanceof Error ? err.message : String(err)}`);
477
+ }
478
+ if (!md.provider) {
479
+ addIssue('member_defaults/provider', 'Invalid .minds/team.yaml: missing member_defaults.provider.', 'member_defaults.provider is required (or must be recoverable from .minds/llm.yaml).');
480
+ }
481
+ if (!md.model) {
482
+ addIssue('member_defaults/model', 'Invalid .minds/team.yaml: missing member_defaults.model.', 'member_defaults.model is required (or must be recoverable from .minds/llm.yaml).');
483
+ }
484
+ if (configuredDefaultResponder && !team.getMember(configuredDefaultResponder)) {
485
+ addIssue('default_responder/unknown', 'Invalid .minds/team.yaml: default_responder does not match any member.', `default_responder '${configuredDefaultResponder}' does not exist in team members.`);
486
+ }
487
+ finalizeProblems();
488
+ return team;
489
+ }
490
+ Team.load = load;
491
+ async function applyBootstrapMemberDefaults(md) {
492
+ if (md.provider && md.model)
493
+ return;
494
+ const llmCfg = await client_1.LlmConfig.load();
495
+ const providerEntries = Object.entries(llmCfg.providers);
496
+ const tryPickProvider = (key) => {
497
+ if (!md.provider)
498
+ md.setProvider(key);
499
+ const providerKey = md.provider;
500
+ if (!providerKey)
501
+ return;
502
+ const modelKeys = Object.keys(llmCfg.providers[providerKey]?.models ?? {});
503
+ if (!md.model && modelKeys.length > 0)
504
+ md.setModel(modelKeys[0]);
505
+ };
506
+ // Prefer a provider with an available API key env var.
507
+ for (const [key, providerConfig] of providerEntries) {
508
+ if (process.env[providerConfig.apiKeyEnvVar]) {
509
+ tryPickProvider(key);
510
+ break;
511
+ }
512
+ }
513
+ // Fall back to the first configured provider.
514
+ if (!md.provider && providerEntries.length > 0) {
515
+ tryPickProvider(providerEntries[0][0]);
516
+ }
517
+ // If provider is set but model is missing, try to pick a model for that provider.
518
+ if (md.provider && !md.model) {
519
+ tryPickProvider(md.provider);
520
+ }
521
+ }
522
+ function enforceShadowMemberDefaults(fuxi, pangu) {
523
+ // fuxi: always hidden + always has team-mgmt available
524
+ fuxi.setHidden(true);
525
+ const fuxiToolsets = fuxi.toolsets ? [...fuxi.toolsets] : [];
526
+ const withoutExclude = fuxiToolsets.filter((t) => t !== '!team-mgmt');
527
+ if (!withoutExclude.includes('team-mgmt'))
528
+ withoutExclude.unshift('team-mgmt');
529
+ fuxi.setToolsets(withoutExclude);
530
+ // pangu: always hidden + never has team-mgmt + never reads/writes .minds/**
531
+ pangu.setHidden(true);
532
+ const panguToolsets = pangu.toolsets ? [...pangu.toolsets] : [];
533
+ const withoutMgmt = panguToolsets.filter((t) => t !== 'team-mgmt');
534
+ if (!withoutMgmt.includes('!team-mgmt'))
535
+ withoutMgmt.push('!team-mgmt');
536
+ if (!withoutMgmt.includes('*'))
537
+ withoutMgmt.unshift('*');
538
+ pangu.setToolsets(withoutMgmt);
539
+ const mindsScope = '.minds/**';
540
+ const panguNoRead = pangu.no_read_dirs ? [...pangu.no_read_dirs] : [];
541
+ if (!panguNoRead.includes(mindsScope))
542
+ panguNoRead.push(mindsScope);
543
+ pangu.setNoReadDirs(panguNoRead);
544
+ const panguNoWrite = pangu.no_write_dirs ? [...pangu.no_write_dirs] : [];
545
+ if (!panguNoWrite.includes(mindsScope))
546
+ panguNoWrite.push(mindsScope);
547
+ pangu.setNoWriteDirs(panguNoWrite);
548
+ }
549
+ function hasOwnKey(obj, key) {
550
+ return Object.prototype.hasOwnProperty.call(obj, key);
551
+ }
552
+ function requireDefined(value, at) {
553
+ if (value === undefined) {
554
+ throw new Error(`Invalid ${at}: value required (got ${describeValueType(value)})`);
555
+ }
556
+ return value;
557
+ }
558
+ function isRecordValue(value) {
559
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
560
+ }
561
+ Team.TEAM_YAML_ROOT_KEYS = [
562
+ 'member_defaults',
563
+ 'default_responder',
564
+ 'shell_specialists',
565
+ 'members',
566
+ ];
567
+ Team.TEAM_YAML_MEMBER_KEYS = [
568
+ 'name',
569
+ 'provider',
570
+ 'model',
571
+ 'gofor',
572
+ 'toolsets',
573
+ 'tools',
574
+ 'model_params',
575
+ 'diligence-push-max',
576
+ 'diligence_push_max',
577
+ 'read_dirs',
578
+ 'write_dirs',
579
+ 'no_read_dirs',
580
+ 'no_write_dirs',
581
+ 'icon',
582
+ 'streaming',
583
+ 'hidden',
584
+ ];
585
+ Team.TEAM_YAML_MODEL_PARAMS_ROOT_KEYS = [
586
+ 'max_tokens',
587
+ 'codex',
588
+ 'openai',
589
+ 'anthropic',
590
+ ];
591
+ Team.TEAM_YAML_MODEL_PARAMS_OPENAI_KEYS = [
592
+ 'temperature',
593
+ 'max_tokens',
594
+ 'top_p',
595
+ 'frequency_penalty',
596
+ 'presence_penalty',
597
+ 'seed',
598
+ 'logprobs',
599
+ 'top_logprobs',
600
+ 'stop',
601
+ 'logit_bias',
602
+ 'user',
603
+ 'reasoning_effort',
604
+ 'verbosity',
605
+ 'parallel_tool_calls',
606
+ ];
607
+ Team.TEAM_YAML_MODEL_PARAMS_CODEX_KEYS = Team.TEAM_YAML_MODEL_PARAMS_OPENAI_KEYS;
608
+ Team.TEAM_YAML_MODEL_PARAMS_ANTHROPIC_KEYS = [
609
+ 'temperature',
610
+ 'max_tokens',
611
+ 'top_p',
612
+ 'top_k',
613
+ 'stop_sequences',
614
+ 'reasoning_split',
615
+ ];
616
+ function listUnknownKeys(obj, allowedKeys) {
617
+ const allowed = new Set(allowedKeys);
618
+ const unknown = [];
619
+ for (const k of Object.keys(obj)) {
620
+ if (!allowed.has(k))
621
+ unknown.push(k);
622
+ }
623
+ unknown.sort((a, b) => a.localeCompare(b));
624
+ return unknown;
625
+ }
626
+ function buildUnknownFieldErrorText(at, unknownKeys, hints) {
627
+ const lines = [];
628
+ for (const k of unknownKeys) {
629
+ const hint = hints[k];
630
+ lines.push(hint ? `- ${at}.${k}: unknown field. ${hint}` : `- ${at}.${k}: unknown field.`);
631
+ }
632
+ return lines.join('\n');
633
+ }
634
+ function validateCommonModelParamMisplacements(pushIssue, idPrefix, atPrefix, memberObj) {
635
+ const hintsAtMember = {
636
+ reasoning_effort: `Did you mean \`${atPrefix}.model_params.codex.reasoning_effort\` (preferred for provider: codex) or \`${atPrefix}.model_params.openai.reasoning_effort\`? (not supported at ${atPrefix} root)`,
637
+ verbosity: `Did you mean \`${atPrefix}.model_params.codex.verbosity\` (preferred for provider: codex) or \`${atPrefix}.model_params.openai.verbosity\`? (not supported at ${atPrefix} root)`,
638
+ parallel_tool_calls: `Did you mean \`${atPrefix}.model_params.codex.parallel_tool_calls\` (preferred for provider: codex) or \`${atPrefix}.model_params.openai.parallel_tool_calls\`? (not supported at ${atPrefix} root)`,
639
+ };
640
+ const unknownAtMember = listUnknownKeys(memberObj, Team.TEAM_YAML_MEMBER_KEYS);
641
+ if (unknownAtMember.length > 0) {
642
+ pushIssue(`${idPrefix}/unknown_fields`, `Invalid .minds/team.yaml: ${atPrefix} contains unknown fields.`, buildUnknownFieldErrorText(atPrefix, unknownAtMember, hintsAtMember));
643
+ }
644
+ if (!Object.prototype.hasOwnProperty.call(memberObj, 'model_params'))
645
+ return;
646
+ const rawModelParams = memberObj.model_params;
647
+ if (rawModelParams === undefined)
648
+ return;
649
+ if (!isRecordValue(rawModelParams)) {
650
+ // Type errors are handled by parseMemberOverrides; keep this check focused on schema/placement.
651
+ return;
652
+ }
653
+ const modelParamsAt = `${atPrefix}.model_params`;
654
+ const hintsAtModelParams = {
655
+ reasoning_effort: `Did you mean \`${modelParamsAt}.codex.reasoning_effort\` (preferred for provider: codex) or \`${modelParamsAt}.openai.reasoning_effort\`?`,
656
+ verbosity: `Did you mean \`${modelParamsAt}.codex.verbosity\` (preferred for provider: codex) or \`${modelParamsAt}.openai.verbosity\`?`,
657
+ parallel_tool_calls: `Did you mean \`${modelParamsAt}.codex.parallel_tool_calls\` (preferred for provider: codex) or \`${modelParamsAt}.openai.parallel_tool_calls\`?`,
658
+ temperature: `Did you mean \`${modelParamsAt}.codex.temperature\` / \`${modelParamsAt}.openai.temperature\` (or \`${modelParamsAt}.anthropic.temperature\`)?`,
659
+ top_p: `Did you mean \`${modelParamsAt}.codex.top_p\` / \`${modelParamsAt}.openai.top_p\` (or \`${modelParamsAt}.anthropic.top_p\`)?`,
660
+ max_tokens: `Did you mean \`${modelParamsAt}.max_tokens\` (top-level), or \`${modelParamsAt}.codex.max_tokens\` / \`${modelParamsAt}.openai.max_tokens\` / \`${modelParamsAt}.anthropic.max_tokens\`?`,
661
+ };
662
+ const unknownAtModelParams = listUnknownKeys(rawModelParams, Team.TEAM_YAML_MODEL_PARAMS_ROOT_KEYS);
663
+ if (unknownAtModelParams.length > 0) {
664
+ pushIssue(`${idPrefix}/model_params/unknown_fields`, `Invalid .minds/team.yaml: ${modelParamsAt} contains unknown fields.`, buildUnknownFieldErrorText(modelParamsAt, unknownAtModelParams, hintsAtModelParams));
665
+ }
666
+ const rawCodex = rawModelParams.codex;
667
+ if (rawCodex !== undefined && isRecordValue(rawCodex)) {
668
+ const unknownAtCodex = listUnknownKeys(rawCodex, Team.TEAM_YAML_MODEL_PARAMS_CODEX_KEYS);
669
+ if (unknownAtCodex.length > 0) {
670
+ pushIssue(`${idPrefix}/model_params/codex/unknown_fields`, `Invalid .minds/team.yaml: ${modelParamsAt}.codex contains unknown fields.`, buildUnknownFieldErrorText(`${modelParamsAt}.codex`, unknownAtCodex, {}));
671
+ }
672
+ }
673
+ const rawOpenai = rawModelParams.openai;
674
+ if (rawOpenai !== undefined && isRecordValue(rawOpenai)) {
675
+ const unknownAtOpenai = listUnknownKeys(rawOpenai, Team.TEAM_YAML_MODEL_PARAMS_OPENAI_KEYS);
676
+ if (unknownAtOpenai.length > 0) {
677
+ pushIssue(`${idPrefix}/model_params/openai/unknown_fields`, `Invalid .minds/team.yaml: ${modelParamsAt}.openai contains unknown fields.`, buildUnknownFieldErrorText(`${modelParamsAt}.openai`, unknownAtOpenai, {}));
678
+ }
679
+ }
680
+ const rawAnthropic = rawModelParams.anthropic;
681
+ if (rawAnthropic !== undefined && isRecordValue(rawAnthropic)) {
682
+ const unknownAtAnthropic = listUnknownKeys(rawAnthropic, Team.TEAM_YAML_MODEL_PARAMS_ANTHROPIC_KEYS);
683
+ if (unknownAtAnthropic.length > 0) {
684
+ pushIssue(`${idPrefix}/model_params/anthropic/unknown_fields`, `Invalid .minds/team.yaml: ${modelParamsAt}.anthropic contains unknown fields.`, buildUnknownFieldErrorText(`${modelParamsAt}.anthropic`, unknownAtAnthropic, {}));
685
+ }
686
+ }
687
+ }
688
+ function sanitizeProblemIdSegment(segment) {
689
+ return segment.replace(/[^a-zA-Z0-9_-]/g, '_');
690
+ }
691
+ function asErrorText(err) {
692
+ return err instanceof Error ? err.message : String(err);
693
+ }
694
+ function parseMemberOverrides(rv, at) {
695
+ const overrides = {};
696
+ const errors = [];
697
+ if (hasOwnKey(rv, 'name')) {
698
+ try {
699
+ overrides.name = requireDefined(asOptionalString(rv['name'], `${at}.name`), `${at}.name`);
700
+ }
701
+ catch (err) {
702
+ errors.push(asErrorText(err));
703
+ }
704
+ }
705
+ if (hasOwnKey(rv, 'provider')) {
706
+ try {
707
+ overrides.provider = requireDefined(asOptionalString(rv['provider'], `${at}.provider`), `${at}.provider`);
708
+ }
709
+ catch (err) {
710
+ errors.push(asErrorText(err));
711
+ }
712
+ }
713
+ if (hasOwnKey(rv, 'model')) {
714
+ try {
715
+ overrides.model = requireDefined(asOptionalString(rv['model'], `${at}.model`), `${at}.model`);
716
+ }
717
+ catch (err) {
718
+ errors.push(asErrorText(err));
719
+ }
720
+ }
721
+ if (hasOwnKey(rv, 'gofor')) {
722
+ try {
723
+ overrides.gofor = requireDefined(asOptionalGofor(rv['gofor'], `${at}.gofor`), `${at}.gofor`);
724
+ }
725
+ catch (err) {
726
+ errors.push(asErrorText(err));
727
+ }
728
+ }
729
+ if (hasOwnKey(rv, 'toolsets')) {
730
+ try {
731
+ overrides.toolsets = requireDefined(asOptionalStringArray(rv['toolsets'], `${at}.toolsets`), `${at}.toolsets`);
732
+ }
733
+ catch (err) {
734
+ errors.push(asErrorText(err));
735
+ }
736
+ }
737
+ if (hasOwnKey(rv, 'tools')) {
738
+ try {
739
+ overrides.tools = requireDefined(asOptionalStringArray(rv['tools'], `${at}.tools`), `${at}.tools`);
740
+ }
741
+ catch (err) {
742
+ errors.push(asErrorText(err));
743
+ }
744
+ }
745
+ if (hasOwnKey(rv, 'model_params')) {
746
+ try {
747
+ overrides.model_params = requireDefined(asOptionalModelParams(rv['model_params'], `${at}.model_params`), `${at}.model_params`);
748
+ }
749
+ catch (err) {
750
+ errors.push(asErrorText(err));
751
+ }
752
+ }
753
+ const hasDiligencePushMaxDash = hasOwnKey(rv, 'diligence-push-max');
754
+ const hasDiligencePushMaxUnderscore = hasOwnKey(rv, 'diligence_push_max');
755
+ if (hasDiligencePushMaxDash && hasDiligencePushMaxUnderscore) {
756
+ errors.push(`Invalid ${at}: both diligence-push-max and diligence_push_max are set; please use only diligence-push-max.`);
757
+ }
758
+ else if (hasDiligencePushMaxDash) {
759
+ try {
760
+ overrides.diligence_push_max = requireDefined(asOptionalNumber(rv['diligence-push-max'], `${at}.diligence-push-max`), `${at}.diligence-push-max`);
761
+ }
762
+ catch (err) {
763
+ errors.push(asErrorText(err));
764
+ }
765
+ }
766
+ else if (hasDiligencePushMaxUnderscore) {
767
+ try {
768
+ overrides.diligence_push_max = requireDefined(asOptionalNumber(rv['diligence_push_max'], `${at}.diligence_push_max`), `${at}.diligence_push_max`);
769
+ }
770
+ catch (err) {
771
+ errors.push(asErrorText(err));
772
+ }
773
+ }
774
+ if (hasOwnKey(rv, 'read_dirs')) {
775
+ try {
776
+ overrides.read_dirs = requireDefined(asOptionalStringArray(rv['read_dirs'], `${at}.read_dirs`), `${at}.read_dirs`);
777
+ }
778
+ catch (err) {
779
+ errors.push(asErrorText(err));
780
+ }
781
+ }
782
+ if (hasOwnKey(rv, 'write_dirs')) {
783
+ try {
784
+ overrides.write_dirs = requireDefined(asOptionalStringArray(rv['write_dirs'], `${at}.write_dirs`), `${at}.write_dirs`);
785
+ }
786
+ catch (err) {
787
+ errors.push(asErrorText(err));
788
+ }
789
+ }
790
+ if (hasOwnKey(rv, 'no_read_dirs')) {
791
+ try {
792
+ overrides.no_read_dirs = requireDefined(asOptionalStringArray(rv['no_read_dirs'], `${at}.no_read_dirs`), `${at}.no_read_dirs`);
793
+ }
794
+ catch (err) {
795
+ errors.push(asErrorText(err));
796
+ }
797
+ }
798
+ if (hasOwnKey(rv, 'no_write_dirs')) {
799
+ try {
800
+ overrides.no_write_dirs = requireDefined(asOptionalStringArray(rv['no_write_dirs'], `${at}.no_write_dirs`), `${at}.no_write_dirs`);
801
+ }
802
+ catch (err) {
803
+ errors.push(asErrorText(err));
804
+ }
805
+ }
806
+ if (hasOwnKey(rv, 'icon')) {
807
+ try {
808
+ overrides.icon = requireDefined(asOptionalString(rv['icon'], `${at}.icon`), `${at}.icon`);
809
+ }
810
+ catch (err) {
811
+ errors.push(asErrorText(err));
812
+ }
813
+ }
814
+ if (hasOwnKey(rv, 'streaming')) {
815
+ try {
816
+ overrides.streaming = requireDefined(asOptionalBoolean(rv['streaming'], `${at}.streaming`), `${at}.streaming`);
817
+ }
818
+ catch (err) {
819
+ errors.push(asErrorText(err));
820
+ }
821
+ }
822
+ if (hasOwnKey(rv, 'hidden')) {
823
+ try {
824
+ overrides.hidden = requireDefined(asOptionalBoolean(rv['hidden'], `${at}.hidden`), `${at}.hidden`);
825
+ }
826
+ catch (err) {
827
+ errors.push(asErrorText(err));
828
+ }
829
+ }
830
+ if (errors.length > 0)
831
+ return { kind: 'error', errorTexts: errors };
832
+ return { kind: 'ok', overrides };
833
+ }
834
+ function applyOverrides(member, overrides) {
835
+ if (overrides.name !== undefined)
836
+ member.setName(overrides.name);
837
+ if (overrides.provider !== undefined)
838
+ member.setProvider(overrides.provider);
839
+ if (overrides.model !== undefined)
840
+ member.setModel(overrides.model);
841
+ if (overrides.gofor !== undefined)
842
+ member.setGofor(overrides.gofor);
843
+ if (overrides.toolsets !== undefined)
844
+ member.setToolsets(overrides.toolsets);
845
+ if (overrides.tools !== undefined)
846
+ member.setTools(overrides.tools);
847
+ if (overrides.model_params !== undefined)
848
+ member.setModelParams(overrides.model_params);
849
+ if (overrides.diligence_push_max !== undefined)
850
+ member.setDiligencePushMax(overrides.diligence_push_max);
851
+ if (overrides.read_dirs !== undefined)
852
+ member.setReadDirs(overrides.read_dirs);
853
+ if (overrides.write_dirs !== undefined)
854
+ member.setWriteDirs(overrides.write_dirs);
855
+ if (overrides.no_read_dirs !== undefined)
856
+ member.setNoReadDirs(overrides.no_read_dirs);
857
+ if (overrides.no_write_dirs !== undefined)
858
+ member.setNoWriteDirs(overrides.no_write_dirs);
859
+ if (overrides.icon !== undefined)
860
+ member.setIcon(overrides.icon);
861
+ if (overrides.streaming !== undefined)
862
+ member.setStreaming(overrides.streaming);
863
+ if (overrides.hidden !== undefined)
864
+ member.setHidden(overrides.hidden);
865
+ }
866
+ function parseTeamYamlObject(obj, md, shadow) {
867
+ const issues = [];
868
+ const pushIssue = (id, message, errorText) => {
869
+ issues.push({ id, message, errorText });
870
+ };
871
+ const teamObj = (() => {
872
+ if (isRecordValue(obj))
873
+ return obj;
874
+ pushIssue('root', 'Invalid .minds/team.yaml: expected an object at root.', `Invalid team config: expected an object (got ${describeValueType(obj)})`);
875
+ return {};
876
+ })();
877
+ const unknownRootKeys = listUnknownKeys(teamObj, Team.TEAM_YAML_ROOT_KEYS);
878
+ if (unknownRootKeys.length > 0) {
879
+ pushIssue('root/unknown_fields', 'Invalid .minds/team.yaml: unknown top-level fields.', buildUnknownFieldErrorText('root', unknownRootKeys, {}));
880
+ }
881
+ // member_defaults
882
+ const rawMemberDefaults = teamObj.member_defaults;
883
+ if (rawMemberDefaults !== undefined) {
884
+ if (!isRecordValue(rawMemberDefaults)) {
885
+ pushIssue('member_defaults', 'Invalid .minds/team.yaml: member_defaults must be an object.', `Invalid member_defaults: expected an object (got ${describeValueType(rawMemberDefaults)})`);
886
+ }
887
+ else {
888
+ validateCommonModelParamMisplacements(pushIssue, 'member_defaults', 'member_defaults', rawMemberDefaults);
889
+ const parsedMd = parseMemberOverrides(rawMemberDefaults, 'member_defaults');
890
+ if (parsedMd.kind === 'ok') {
891
+ applyOverrides(md, parsedMd.overrides);
892
+ }
893
+ else {
894
+ pushIssue('member_defaults', 'Invalid .minds/team.yaml: member_defaults has invalid fields.', parsedMd.errorTexts.join('\n'));
895
+ }
896
+ }
897
+ }
898
+ // default_responder
899
+ let defResp;
900
+ if (teamObj.default_responder !== undefined) {
901
+ try {
902
+ defResp = asOptionalString(teamObj.default_responder, 'default_responder');
903
+ }
904
+ catch (err) {
905
+ pushIssue('default_responder/type', 'Invalid .minds/team.yaml: default_responder must be a string.', asErrorText(err));
906
+ }
907
+ }
908
+ // shell_specialists
909
+ let shellSpecialists = [];
910
+ if (teamObj.shell_specialists !== undefined) {
911
+ const v = teamObj.shell_specialists;
912
+ if (v === null) {
913
+ shellSpecialists = [];
914
+ }
915
+ else {
916
+ try {
917
+ const parsed = requireDefined(asOptionalStringOrStringArray(v, 'shell_specialists'), 'shell_specialists');
918
+ // Normalize: drop empties and de-dupe while preserving order.
919
+ const seen = new Set();
920
+ shellSpecialists = [];
921
+ for (const id of parsed) {
922
+ const trimmed = id.trim();
923
+ if (trimmed === '')
924
+ continue;
925
+ if (seen.has(trimmed))
926
+ continue;
927
+ seen.add(trimmed);
928
+ shellSpecialists.push(trimmed);
929
+ }
930
+ }
931
+ catch (err) {
932
+ pushIssue('shell_specialists/type', 'Invalid .minds/team.yaml: shell_specialists must be string|string[] or null.', asErrorText(err));
933
+ }
934
+ }
935
+ }
936
+ const membersRec = {};
937
+ const rawMembers = teamObj.members;
938
+ const membersObj = (() => {
939
+ if (rawMembers === undefined)
940
+ return {};
941
+ if (isRecordValue(rawMembers))
942
+ return rawMembers;
943
+ pushIssue('members', 'Invalid .minds/team.yaml: members must be an object.', `Invalid members: expected an object (got ${describeValueType(rawMembers)})`);
944
+ return {};
945
+ })();
946
+ for (const [id, raw] of Object.entries(membersObj)) {
947
+ const memberAt = `members.${id}`;
948
+ const idSeg = sanitizeProblemIdSegment(id);
949
+ if (!isRecordValue(raw)) {
950
+ pushIssue(`members/${idSeg}`, `Invalid .minds/team.yaml: ${memberAt} must be an object.`, `Invalid ${memberAt}: expected an object (got ${describeValueType(raw)})`);
951
+ continue;
952
+ }
953
+ validateCommonModelParamMisplacements(pushIssue, `members/${idSeg}`, memberAt, raw);
954
+ const parsedMember = parseMemberOverrides(raw, memberAt);
955
+ if (parsedMember.kind === 'error') {
956
+ pushIssue(`members/${idSeg}`, `Invalid .minds/team.yaml: ${memberAt} has invalid fields.`, parsedMember.errorTexts.join('\n'));
957
+ if (id === 'fuxi' || id === 'pangu') {
958
+ // Shadow members are always present; ignore overrides on invalid config.
959
+ const shadowMember = id === 'fuxi' ? shadow.fuxi : shadow.pangu;
960
+ Object.setPrototypeOf(shadowMember, md);
961
+ membersRec[id] = shadowMember;
962
+ }
963
+ continue;
964
+ }
965
+ if (id === 'fuxi' || id === 'pangu') {
966
+ const shadowMember = id === 'fuxi' ? shadow.fuxi : shadow.pangu;
967
+ applyOverrides(shadowMember, parsedMember.overrides);
968
+ Object.setPrototypeOf(shadowMember, md);
969
+ membersRec[id] = shadowMember;
970
+ continue;
971
+ }
972
+ const m = new Team.Member({ id, name: id });
973
+ applyOverrides(m, parsedMember.overrides);
974
+ Object.setPrototypeOf(m, md);
975
+ membersRec[id] = m;
976
+ }
977
+ return {
978
+ team: new Team({
979
+ memberDefaults: md,
980
+ defaultResponder: defResp,
981
+ shellSpecialists,
982
+ members: membersRec,
983
+ }),
984
+ issues,
985
+ };
986
+ }
987
+ function asRecord(value, at) {
988
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
989
+ throw new Error(`Invalid ${at}: expected an object (got ${describeValueType(value)})`);
990
+ }
991
+ return value;
992
+ }
993
+ function asString(value, at) {
994
+ if (typeof value !== 'string') {
995
+ throw new Error(`Invalid ${at}: expected a string (got ${describeValueType(value)})`);
996
+ }
997
+ return value;
998
+ }
999
+ function asOptionalString(value, at) {
1000
+ if (value === undefined)
1001
+ return undefined;
1002
+ if (typeof value !== 'string') {
1003
+ throw new Error(`Invalid ${at}: expected a string (got ${describeValueType(value)})`);
1004
+ }
1005
+ return value;
1006
+ }
1007
+ function asOptionalBoolean(value, at) {
1008
+ if (value === undefined)
1009
+ return undefined;
1010
+ if (typeof value !== 'boolean') {
1011
+ throw new Error(`Invalid ${at}: expected a boolean (got ${describeValueType(value)})`);
1012
+ }
1013
+ return value;
1014
+ }
1015
+ function asOptionalNumber(value, at) {
1016
+ if (value === undefined)
1017
+ return undefined;
1018
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
1019
+ throw new Error(`Invalid ${at}: expected a number (got ${describeValueType(value)})`);
1020
+ }
1021
+ return value;
1022
+ }
1023
+ function asOptionalStringArray(value, at) {
1024
+ if (value === undefined)
1025
+ return undefined;
1026
+ if (!Array.isArray(value) || !value.every((v) => typeof v === 'string')) {
1027
+ throw new Error(`Invalid ${at}: expected string[] (got ${describeValueType(value)})`);
1028
+ }
1029
+ return value;
1030
+ }
1031
+ function describeValueType(value) {
1032
+ if (value === undefined)
1033
+ return 'undefined';
1034
+ if (value === null)
1035
+ return 'null';
1036
+ if (Array.isArray(value)) {
1037
+ if (value.length === 0)
1038
+ return 'unknown[]';
1039
+ const elementTypes = new Set();
1040
+ for (const v of value) {
1041
+ if (v === undefined)
1042
+ elementTypes.add('undefined');
1043
+ else if (v === null)
1044
+ elementTypes.add('null');
1045
+ else if (Array.isArray(v))
1046
+ elementTypes.add('unknown[]');
1047
+ else
1048
+ elementTypes.add(typeof v);
1049
+ }
1050
+ const t = Array.from(elementTypes).sort();
1051
+ if (t.length === 1)
1052
+ return `${t[0]}[]`;
1053
+ return `(${t.join('|')})[]`;
1054
+ }
1055
+ return typeof value;
1056
+ }
1057
+ function asOptionalStringOrStringArray(value, at) {
1058
+ if (value === undefined)
1059
+ return undefined;
1060
+ if (typeof value === 'string')
1061
+ return [value];
1062
+ if (Array.isArray(value) && value.every((v) => typeof v === 'string')) {
1063
+ return value;
1064
+ }
1065
+ throw new Error(`Invalid ${at}: expected string|string[] (got ${describeValueType(value)})`);
1066
+ }
1067
+ function asOptionalGofor(value, at) {
1068
+ if (value === undefined)
1069
+ return undefined;
1070
+ if (typeof value === 'string')
1071
+ return [value];
1072
+ if (Array.isArray(value) && value.every((v) => typeof v === 'string'))
1073
+ return value;
1074
+ if (isRecordValue(value)) {
1075
+ const obj = value;
1076
+ for (const [k, v] of Object.entries(obj)) {
1077
+ if (typeof v !== 'string') {
1078
+ throw new Error(`Invalid ${at}.${k}: expected string (got ${describeValueType(v)})`);
1079
+ }
1080
+ }
1081
+ return obj;
1082
+ }
1083
+ throw new Error(`Invalid ${at}: expected string|string[]|Record<string,string> (got ${describeValueType(value)})`);
1084
+ }
1085
+ function asOptionalStop(value, at) {
1086
+ if (value === undefined)
1087
+ return undefined;
1088
+ if (typeof value === 'string')
1089
+ return value;
1090
+ if (Array.isArray(value) && value.every((v) => typeof v === 'string'))
1091
+ return value;
1092
+ throw new Error(`Invalid ${at}: expected string|string[] (got ${describeValueType(value)})`);
1093
+ }
1094
+ function asOptionalLogitBias(value, at) {
1095
+ if (value === undefined)
1096
+ return undefined;
1097
+ const obj = asRecord(value, at);
1098
+ for (const [k, v] of Object.entries(obj)) {
1099
+ if (typeof v !== 'number') {
1100
+ throw new Error(`Invalid ${at}.${k}: expected a number (got ${describeValueType(v)})`);
1101
+ }
1102
+ }
1103
+ return obj;
1104
+ }
1105
+ function asOptionalModelParams(value, at) {
1106
+ if (value === undefined)
1107
+ return undefined;
1108
+ const obj = asRecord(value, at);
1109
+ const validateOpenAiStyleParams = (params, at2) => {
1110
+ asOptionalNumber(params.temperature, `${at2}.temperature`);
1111
+ asOptionalNumber(params.max_tokens, `${at2}.max_tokens`);
1112
+ asOptionalNumber(params.top_p, `${at2}.top_p`);
1113
+ asOptionalNumber(params.frequency_penalty, `${at2}.frequency_penalty`);
1114
+ asOptionalNumber(params.presence_penalty, `${at2}.presence_penalty`);
1115
+ asOptionalNumber(params.seed, `${at2}.seed`);
1116
+ asOptionalBoolean(params.logprobs, `${at2}.logprobs`);
1117
+ asOptionalNumber(params.top_logprobs, `${at2}.top_logprobs`);
1118
+ asOptionalStop(params.stop, `${at2}.stop`);
1119
+ asOptionalLogitBias(params.logit_bias, `${at2}.logit_bias`);
1120
+ asOptionalString(params.user, `${at2}.user`);
1121
+ asOptionalBoolean(params.parallel_tool_calls, `${at2}.parallel_tool_calls`);
1122
+ const reasoningEffort = params.reasoning_effort;
1123
+ if (reasoningEffort !== undefined &&
1124
+ reasoningEffort !== 'none' &&
1125
+ reasoningEffort !== 'minimal' &&
1126
+ reasoningEffort !== 'low' &&
1127
+ reasoningEffort !== 'medium' &&
1128
+ reasoningEffort !== 'high' &&
1129
+ reasoningEffort !== 'xhigh') {
1130
+ throw new Error(`Invalid ${at2}.reasoning_effort: expected none|minimal|low|medium|high|xhigh (got ${describeValueType(reasoningEffort)})`);
1131
+ }
1132
+ const verbosity = params.verbosity;
1133
+ if (verbosity !== undefined &&
1134
+ verbosity !== 'low' &&
1135
+ verbosity !== 'medium' &&
1136
+ verbosity !== 'high') {
1137
+ throw new Error(`Invalid ${at2}.verbosity: expected low|medium|high (got ${describeValueType(verbosity)})`);
1138
+ }
1139
+ };
1140
+ const codex = obj.codex === undefined ? undefined : asRecord(obj.codex, `${at}.codex`);
1141
+ const openai = obj.openai === undefined ? undefined : asRecord(obj.openai, `${at}.openai`);
1142
+ const anthropic = obj.anthropic === undefined ? undefined : asRecord(obj.anthropic, `${at}.anthropic`);
1143
+ if (codex) {
1144
+ validateOpenAiStyleParams(codex, `${at}.codex`);
1145
+ }
1146
+ if (openai) {
1147
+ validateOpenAiStyleParams(openai, `${at}.openai`);
1148
+ }
1149
+ if (anthropic) {
1150
+ asOptionalNumber(anthropic.temperature, `${at}.anthropic.temperature`);
1151
+ asOptionalNumber(anthropic.max_tokens, `${at}.anthropic.max_tokens`);
1152
+ asOptionalNumber(anthropic.top_p, `${at}.anthropic.top_p`);
1153
+ asOptionalNumber(anthropic.top_k, `${at}.anthropic.top_k`);
1154
+ asOptionalStringArray(anthropic.stop_sequences, `${at}.anthropic.stop_sequences`);
1155
+ asOptionalBoolean(anthropic.reasoning_split, `${at}.anthropic.reasoning_split`);
1156
+ }
1157
+ asOptionalNumber(obj.max_tokens, `${at}.max_tokens`);
1158
+ return obj;
1159
+ }
1160
+ })(Team || (exports.Team = Team = {}));