dominds 1.13.2 → 1.15.2

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 (200) hide show
  1. package/dist/bootstrap/global-dialog-event-broadcaster.d.ts +18 -0
  2. package/dist/bootstrap/global-dialog-event-broadcaster.js +81 -0
  3. package/dist/dialog-fork.js +13 -12
  4. package/dist/dialog.d.ts +61 -50
  5. package/dist/dialog.js +284 -78
  6. package/dist/docs/dialog-system.md +12 -0
  7. package/dist/docs/dialog-system.zh.md +12 -0
  8. package/dist/docs/dominds-terminology.md +17 -0
  9. package/dist/docs/issues/global-dialog-event-broadcaster-missing.md +128 -0
  10. package/dist/docs/llm-provider-isolation.md +35 -0
  11. package/dist/docs/llm-provider-isolation.zh.md +35 -0
  12. package/dist/llm/client.d.ts +2 -1
  13. package/dist/llm/defaults.yaml +118 -4
  14. package/dist/llm/gen/anthropic.js +2 -4
  15. package/dist/llm/gen/codex.d.ts +11 -0
  16. package/dist/llm/gen/codex.js +41 -31
  17. package/dist/llm/gen/failure-classifier.js +17 -0
  18. package/dist/llm/gen/mock.js +45 -21
  19. package/dist/llm/gen/openai-compatible.d.ts +2 -0
  20. package/dist/llm/gen/openai-compatible.js +43 -38
  21. package/dist/llm/gen/openai.d.ts +3 -1
  22. package/dist/llm/gen/openai.js +888 -71
  23. package/dist/llm/gen/tool-call-context.d.ts +7 -2
  24. package/dist/llm/gen/tool-call-context.js +55 -13
  25. package/dist/llm/gen.d.ts +60 -3
  26. package/dist/llm/kernel-driver/context.js +1 -1
  27. package/dist/llm/kernel-driver/drive.js +374 -348
  28. package/dist/llm/kernel-driver/flow.js +3 -3
  29. package/dist/llm/kernel-driver/guardrails.d.ts +1 -1
  30. package/dist/llm/kernel-driver/guardrails.js +4 -4
  31. package/dist/llm/kernel-driver/runtime.js +11 -29
  32. package/dist/llm/kernel-driver/subdialog.js +56 -5
  33. package/dist/llm/kernel-driver/tellask-special.d.ts +38 -12
  34. package/dist/llm/kernel-driver/tellask-special.js +489 -180
  35. package/dist/llm/kernel-driver/types.d.ts +1 -1
  36. package/dist/persistence.d.ts +30 -62
  37. package/dist/persistence.js +978 -986
  38. package/dist/priming.js +398 -365
  39. package/dist/recovery/reply-special.js +3 -3
  40. package/dist/runtime/inter-dialog-format.d.ts +1 -1
  41. package/dist/runtime/inter-dialog-format.js +1 -1
  42. package/dist/runtime/reply-prompt-copy.js +4 -4
  43. package/dist/server/setup-routes.js +26 -5
  44. package/dist/server/snippets-routes.d.ts +1 -0
  45. package/dist/server/snippets-routes.js +20 -9
  46. package/dist/server/websocket-handler.js +58 -25
  47. package/dist/shared/utils/fbr.js +12 -8
  48. package/dist/shared/utils/inter-dialog-format.js +6 -4
  49. package/dist/team.d.ts +24 -13
  50. package/dist/team.js +123 -32
  51. package/dist/tool.d.ts +26 -0
  52. package/dist/tool.js +97 -0
  53. package/dist/tools/team_mgmt.js +18 -0
  54. package/package.json +2 -2
  55. package/webapp/dist/assets/{_basePickBy-CBOtd63g.js → _basePickBy-DsirmCgI.js} +3 -3
  56. package/webapp/dist/assets/_basePickBy-DsirmCgI.js.map +1 -0
  57. package/webapp/dist/assets/{_baseUniq-mfoKz4Wm.js → _baseUniq-tR6G8loB.js} +2 -2
  58. package/webapp/dist/assets/_baseUniq-tR6G8loB.js.map +1 -0
  59. package/webapp/dist/assets/{arc-Dq0WZLyu.js → arc-CzxpASkZ.js} +2 -2
  60. package/webapp/dist/assets/arc-CzxpASkZ.js.map +1 -0
  61. package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-CNmygmp3.js → architectureDiagram-2XIMDMQ5-BSH7H5oI.js} +26 -8
  62. package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-BSH7H5oI.js.map +1 -0
  63. package/webapp/dist/assets/{blockDiagram-VD42YOAC-DvE0lybt.js → blockDiagram-WCTKOSBZ-DpLIr7yO.js} +187 -170
  64. package/webapp/dist/assets/blockDiagram-WCTKOSBZ-DpLIr7yO.js.map +1 -0
  65. package/webapp/dist/assets/{c4Diagram-YG6GDRKO-CR7zJ2_u.js → c4Diagram-IC4MRINW-WuYKgWfY.js} +4 -4
  66. package/webapp/dist/assets/c4Diagram-IC4MRINW-WuYKgWfY.js.map +1 -0
  67. package/webapp/dist/assets/{channel-DrTrnYx4.js → channel-B-v9dqLN.js} +2 -2
  68. package/webapp/dist/assets/channel-B-v9dqLN.js.map +1 -0
  69. package/webapp/dist/assets/{chunk-4BX2VUAB-CVuJEIeN.js → chunk-4BX2VUAB-MtFUfKZy.js} +2 -2
  70. package/webapp/dist/assets/chunk-4BX2VUAB-MtFUfKZy.js.map +1 -0
  71. package/webapp/dist/assets/{chunk-55IACEB6-BxUoXApB.js → chunk-55IACEB6-rY9AJdzj.js} +2 -2
  72. package/webapp/dist/assets/chunk-55IACEB6-rY9AJdzj.js.map +1 -0
  73. package/webapp/dist/assets/{chunk-FMBD7UC4-TX-LVAaV.js → chunk-FMBD7UC4-B-RtOs7e.js} +2 -2
  74. package/webapp/dist/assets/chunk-FMBD7UC4-B-RtOs7e.js.map +1 -0
  75. package/webapp/dist/assets/{chunk-TZMSLE5B-Cw689yRl.js → chunk-JSJVCQXG-Da1d3uS4.js} +14 -6
  76. package/webapp/dist/assets/chunk-JSJVCQXG-Da1d3uS4.js.map +1 -0
  77. package/webapp/dist/assets/{chunk-QN33PNHL-D1uiKlOO.js → chunk-KX2RTZJC-DH9UrpuG.js} +2 -2
  78. package/webapp/dist/assets/chunk-KX2RTZJC-DH9UrpuG.js.map +1 -0
  79. package/webapp/dist/assets/{chunk-DI55MBZ5-SAhxUTqQ.js → chunk-NQ4KR5QH-CK365lrr.js} +9 -7
  80. package/webapp/dist/assets/chunk-NQ4KR5QH-CK365lrr.js.map +1 -0
  81. package/webapp/dist/assets/{chunk-QZHKN3VN-BxuV0Oba.js → chunk-QZHKN3VN-BCaWPGDm.js} +2 -2
  82. package/webapp/dist/assets/chunk-QZHKN3VN-BCaWPGDm.js.map +1 -0
  83. package/webapp/dist/assets/{chunk-B4BG7PRW-DpMa3-9L.js → chunk-WL4C6EOR-DDCnEwft.js} +171 -121
  84. package/webapp/dist/assets/chunk-WL4C6EOR-DDCnEwft.js.map +1 -0
  85. package/webapp/dist/assets/{classDiagram-2ON5EDUG-BTTGianr.js → classDiagram-VBA2DB6C-CvMBU4WA.js} +7 -6
  86. package/webapp/dist/assets/classDiagram-VBA2DB6C-CvMBU4WA.js.map +1 -0
  87. package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-BTTGianr.js → classDiagram-v2-RAHNMMFH-CvMBU4WA.js} +7 -6
  88. package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-CvMBU4WA.js.map +1 -0
  89. package/webapp/dist/assets/{clone-Dk8cAI3I.js → clone-r98jR0MC.js} +2 -2
  90. package/webapp/dist/assets/clone-r98jR0MC.js.map +1 -0
  91. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-BjJnzB2N.js → cose-bilkent-S5V4N54A-t6J60Ogk.js} +2 -2
  92. package/webapp/dist/assets/cose-bilkent-S5V4N54A-t6J60Ogk.js.map +1 -0
  93. package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
  94. package/webapp/dist/assets/{dagre-6UL2VRFP-VF-xGhAf.js → dagre-KLK3FWXG-BlqmY2DV.js} +7 -7
  95. package/webapp/dist/assets/dagre-KLK3FWXG-BlqmY2DV.js.map +1 -0
  96. package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
  97. package/webapp/dist/assets/{diagram-PSM6KHXK-Ba5U0oRY.js → diagram-E7M64L7V-FwCHeIUD.js} +10 -10
  98. package/webapp/dist/assets/diagram-E7M64L7V-FwCHeIUD.js.map +1 -0
  99. package/webapp/dist/assets/{diagram-QEK2KX5R-DoYCnEw_.js → diagram-IFDJBPK2-NhtmkuZG.js} +9 -8
  100. package/webapp/dist/assets/diagram-IFDJBPK2-NhtmkuZG.js.map +1 -0
  101. package/webapp/dist/assets/{diagram-S2PKOQOG-CkK4SRyE.js → diagram-P4PSJMXO-B9FcmokX.js} +8 -8
  102. package/webapp/dist/assets/diagram-P4PSJMXO-B9FcmokX.js.map +1 -0
  103. package/webapp/dist/assets/{erDiagram-Q2GNP2WA-DkI5eYww.js → erDiagram-INFDFZHY-DHKmWvtB.js} +96 -75
  104. package/webapp/dist/assets/erDiagram-INFDFZHY-DHKmWvtB.js.map +1 -0
  105. package/webapp/dist/assets/{flowDiagram-NV44I4VS-wOdPUQ7Y.js → flowDiagram-PKNHOUZH-C7Zi8I7T.js} +98 -81
  106. package/webapp/dist/assets/flowDiagram-PKNHOUZH-C7Zi8I7T.js.map +1 -0
  107. package/webapp/dist/assets/{ganttDiagram-JELNMOA3-BtRWgkUH.js → ganttDiagram-A5KZAMGK-Cv2T8tz_.js} +28 -3
  108. package/webapp/dist/assets/ganttDiagram-A5KZAMGK-Cv2T8tz_.js.map +1 -0
  109. package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-Bsz7u1vi.js → gitGraphDiagram-K3NZZRJ6-DztaipJU.js} +38 -46
  110. package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-DztaipJU.js.map +1 -0
  111. package/webapp/dist/assets/graph-C5yf62Vs.js +782 -0
  112. package/webapp/dist/assets/graph-C5yf62Vs.js.map +1 -0
  113. package/webapp/dist/assets/{index-xvYYeHuy.css → index-YaxF76or.css} +1 -1
  114. package/webapp/dist/assets/{index-rYmIohM_.js → index-hve5MWPs.js} +1603 -1415
  115. package/webapp/dist/assets/index-hve5MWPs.js.map +1 -0
  116. package/webapp/dist/assets/{infoDiagram-HS3SLOUP-BMaxCvH5.js → infoDiagram-LFFYTUFH-VgsbBPZP.js} +7 -7
  117. package/webapp/dist/assets/infoDiagram-LFFYTUFH-VgsbBPZP.js.map +1 -0
  118. package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
  119. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-C7j3YWdw.js +966 -0
  120. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-C7j3YWdw.js.map +1 -0
  121. package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-ejyerzmG.js → journeyDiagram-4ABVD52K-OO8sev-Y.js} +5 -5
  122. package/webapp/dist/assets/journeyDiagram-4ABVD52K-OO8sev-Y.js.map +1 -0
  123. package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-CYj35TEs.js → kanban-definition-K7BYSVSG-DiYCC1Ig.js} +5 -3
  124. package/webapp/dist/assets/kanban-definition-K7BYSVSG-DiYCC1Ig.js.map +1 -0
  125. package/webapp/dist/assets/{layout-7Ql4zmuL.js → layout-DdZSgGdu.js} +5 -5
  126. package/webapp/dist/assets/layout-DdZSgGdu.js.map +1 -0
  127. package/webapp/dist/assets/{linear-CVmgVPuZ.js → linear-7-aHtaFi.js} +2 -2
  128. package/webapp/dist/assets/linear-7-aHtaFi.js.map +1 -0
  129. package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-DOpxjGVo.js → mindmap-definition-YRQLILUH-IG3I-RdD.js} +7 -5
  130. package/webapp/dist/assets/mindmap-definition-YRQLILUH-IG3I-RdD.js.map +1 -0
  131. package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
  132. package/webapp/dist/assets/{pieDiagram-ADFJNKIX-CLQjpmAG.js → pieDiagram-SKSYHLDU-z68KJT5r.js} +8 -8
  133. package/webapp/dist/assets/pieDiagram-SKSYHLDU-z68KJT5r.js.map +1 -0
  134. package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-ClD_bz7z.js → quadrantDiagram-337W2JSQ-DaENWdO6.js} +3 -3
  135. package/webapp/dist/assets/quadrantDiagram-337W2JSQ-DaENWdO6.js.map +1 -0
  136. package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-DOpb-TWH.js → requirementDiagram-Z7DCOOCP-ROTFv4sa.js} +16 -6
  137. package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-ROTFv4sa.js.map +1 -0
  138. package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-D8Hsj3yx.js → sankeyDiagram-WA2Y5GQK-CK7qtpzw.js} +2 -2
  139. package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-CK7qtpzw.js.map +1 -0
  140. package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-CFMNjBER.js → sequenceDiagram-2WXFIKYE-R5lDySeI.js} +601 -201
  141. package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-R5lDySeI.js.map +1 -0
  142. package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-BQeDlw0P.js → stateDiagram-RAJIS63D-sr7msF5U.js} +9 -9
  143. package/webapp/dist/assets/stateDiagram-RAJIS63D-sr7msF5U.js.map +1 -0
  144. package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-DscX61Rs.js → stateDiagram-v2-FVOUBMTO-X663liwS.js} +5 -5
  145. package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-X663liwS.js.map +1 -0
  146. package/webapp/dist/assets/{timeline-definition-IT6M3QCI-BcXPSTiw.js → timeline-definition-YZTLITO2-Bw0TdG26.js} +3 -3
  147. package/webapp/dist/assets/timeline-definition-YZTLITO2-Bw0TdG26.js.map +1 -0
  148. package/webapp/dist/assets/{treemap-GDKQZRPO-BBr4UV0Z.js → treemap-KZPCXAKY-D_sjKwI7.js} +37 -24
  149. package/webapp/dist/assets/treemap-KZPCXAKY-D_sjKwI7.js.map +1 -0
  150. package/webapp/dist/assets/vennDiagram-LZ73GAT5-DhlHIHid.js +2487 -0
  151. package/webapp/dist/assets/vennDiagram-LZ73GAT5-DhlHIHid.js.map +1 -0
  152. package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-CS5RAtQE.js → xychartDiagram-JWTSCODW-C65ESjTc.js} +4 -4
  153. package/webapp/dist/assets/xychartDiagram-JWTSCODW-C65ESjTc.js.map +1 -0
  154. package/webapp/dist/index.html +2 -2
  155. package/webapp/dist/assets/_basePickBy-CBOtd63g.js.map +0 -1
  156. package/webapp/dist/assets/_baseUniq-mfoKz4Wm.js.map +0 -1
  157. package/webapp/dist/assets/arc-Dq0WZLyu.js.map +0 -1
  158. package/webapp/dist/assets/architectureDiagram-VXUJARFQ-CNmygmp3.js.map +0 -1
  159. package/webapp/dist/assets/blockDiagram-VD42YOAC-DvE0lybt.js.map +0 -1
  160. package/webapp/dist/assets/c4Diagram-YG6GDRKO-CR7zJ2_u.js.map +0 -1
  161. package/webapp/dist/assets/channel-DrTrnYx4.js.map +0 -1
  162. package/webapp/dist/assets/chunk-4BX2VUAB-CVuJEIeN.js.map +0 -1
  163. package/webapp/dist/assets/chunk-55IACEB6-BxUoXApB.js.map +0 -1
  164. package/webapp/dist/assets/chunk-B4BG7PRW-DpMa3-9L.js.map +0 -1
  165. package/webapp/dist/assets/chunk-DI55MBZ5-SAhxUTqQ.js.map +0 -1
  166. package/webapp/dist/assets/chunk-FMBD7UC4-TX-LVAaV.js.map +0 -1
  167. package/webapp/dist/assets/chunk-QN33PNHL-D1uiKlOO.js.map +0 -1
  168. package/webapp/dist/assets/chunk-QZHKN3VN-BxuV0Oba.js.map +0 -1
  169. package/webapp/dist/assets/chunk-TZMSLE5B-Cw689yRl.js.map +0 -1
  170. package/webapp/dist/assets/classDiagram-2ON5EDUG-BTTGianr.js.map +0 -1
  171. package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-BTTGianr.js.map +0 -1
  172. package/webapp/dist/assets/clone-Dk8cAI3I.js.map +0 -1
  173. package/webapp/dist/assets/cose-bilkent-S5V4N54A-BjJnzB2N.js.map +0 -1
  174. package/webapp/dist/assets/dagre-6UL2VRFP-VF-xGhAf.js.map +0 -1
  175. package/webapp/dist/assets/diagram-PSM6KHXK-Ba5U0oRY.js.map +0 -1
  176. package/webapp/dist/assets/diagram-QEK2KX5R-DoYCnEw_.js.map +0 -1
  177. package/webapp/dist/assets/diagram-S2PKOQOG-CkK4SRyE.js.map +0 -1
  178. package/webapp/dist/assets/erDiagram-Q2GNP2WA-DkI5eYww.js.map +0 -1
  179. package/webapp/dist/assets/flowDiagram-NV44I4VS-wOdPUQ7Y.js.map +0 -1
  180. package/webapp/dist/assets/ganttDiagram-JELNMOA3-BtRWgkUH.js.map +0 -1
  181. package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-Bsz7u1vi.js.map +0 -1
  182. package/webapp/dist/assets/graph-DAMkuTbn.js +0 -425
  183. package/webapp/dist/assets/graph-DAMkuTbn.js.map +0 -1
  184. package/webapp/dist/assets/index-rYmIohM_.js.map +0 -1
  185. package/webapp/dist/assets/infoDiagram-HS3SLOUP-BMaxCvH5.js.map +0 -1
  186. package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-ejyerzmG.js.map +0 -1
  187. package/webapp/dist/assets/kanban-definition-3W4ZIXB7-CYj35TEs.js.map +0 -1
  188. package/webapp/dist/assets/layout-7Ql4zmuL.js.map +0 -1
  189. package/webapp/dist/assets/linear-CVmgVPuZ.js.map +0 -1
  190. package/webapp/dist/assets/mindmap-definition-VGOIOE7T-DOpxjGVo.js.map +0 -1
  191. package/webapp/dist/assets/pieDiagram-ADFJNKIX-CLQjpmAG.js.map +0 -1
  192. package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-ClD_bz7z.js.map +0 -1
  193. package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-DOpb-TWH.js.map +0 -1
  194. package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-D8Hsj3yx.js.map +0 -1
  195. package/webapp/dist/assets/sequenceDiagram-WL72ISMW-CFMNjBER.js.map +0 -1
  196. package/webapp/dist/assets/stateDiagram-FKZM4ZOC-BQeDlw0P.js.map +0 -1
  197. package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-DscX61Rs.js.map +0 -1
  198. package/webapp/dist/assets/timeline-definition-IT6M3QCI-BcXPSTiw.js.map +0 -1
  199. package/webapp/dist/assets/treemap-GDKQZRPO-BBr4UV0Z.js.map +0 -1
  200. package/webapp/dist/assets/xychartDiagram-PRI3JC2R-CS5RAtQE.js.map +0 -1
package/dist/team.js CHANGED
@@ -158,6 +158,14 @@ exports.Team = Team;
158
158
  /member '(.+?)' has shell tools \((.+?)\) but shell_specialists is empty; set shell_specialists to include '(.+?)' or remove shell tools from that member\./g,
159
159
  "成员 '$1' 配置了 shell 工具($2),但 shell_specialists 为空;请把 '$3' 加入 shell_specialists,或删掉这个成员的 shell 工具。",
160
160
  ],
161
+ [
162
+ /member '(.+?)' has shell tools \((.+?)\) but there are no other shell specialists configured; set shell_specialists to include '(.+?)' or remove shell tools from that member\./g,
163
+ "成员 '$1' 配置了 shell 工具($2),但团队里没有其他 shell 专员;请把 '$3' 加入 shell_specialists,或删掉这个成员的 shell 工具。",
164
+ ],
165
+ [
166
+ /member '(.+?)' has shell tools \((.+?)\) but is not listed in shell_specialists; other shell specialists are already configured \((.+?)\)\./g,
167
+ "成员 '$1' 配置了 shell 工具($2),但没有列在 shell_specialists 里;团队里已经配置了其他 shell 专员($3)。",
168
+ ],
161
169
  [
162
170
  /shell_specialists includes '(.+?)', but no such member exists in team\.members\./g,
163
171
  "shell_specialists 里写了 '$1',但 team.members 中没有这个成员。",
@@ -233,11 +241,16 @@ exports.Team = Team;
233
241
  /non-shell-specialist member has shell tools\./g,
234
242
  '有成员不是 shell 专员,却配置了 shell 工具。',
235
243
  ],
244
+ [
245
+ /non-shell-specialist member has shell tools while other shell specialists exist\./g,
246
+ '有成员不是 shell 专员,但在已有其他 shell 专员时也配置了 shell 工具。',
247
+ ],
236
248
  [/shell specialist has no shell tools\./g, '有 shell 专员成员却没有配置 shell 工具。'],
237
249
  [
238
- /shell tools are present but shell_specialists is empty\/null\./g,
239
- '已经配置了 shell 工具,但 shell_specialists 为空或 null。',
250
+ /shell tools are present but no shell specialists are configured\./g,
251
+ '已经配置了 shell 工具,但没有配置任何 shell 专员。',
240
252
  ],
253
+ [/Warning in \.minds\/team\.yaml:/g, '.minds/team.yaml 警告:'],
241
254
  [/missing member_defaults\.provider\./g, '缺少 member_defaults.provider。'],
242
255
  [/missing member_defaults\.model\./g, '缺少 member_defaults.model。'],
243
256
  [/default_responder does not match any member\./g, 'default_responder 没有指向任何成员。'],
@@ -680,7 +693,7 @@ exports.Team = Team;
680
693
  // member_defaults.fbr_model_params / members.<id>.fbr_model_params.
681
694
  fbr_model_params: {
682
695
  codex: { web_search: 'disabled' },
683
- openai: { web_search: 'disabled' },
696
+ openai: { web_search_tool: false },
684
697
  },
685
698
  });
686
699
  const fuxi = new Team.Member({
@@ -761,7 +774,7 @@ exports.Team = Team;
761
774
  const shellTools = listShellTools(member);
762
775
  if (shellTools.length === 0)
763
776
  continue;
764
- 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.`);
777
+ addIssue(`shell_specialists/forbidden_member/${sanitizeProblemIdSegment(member.id)}`, 'Invalid .minds/team.yaml: shell tools are present but no shell specialists are configured.', `member '${member.id}' has shell tools (${shellTools.join(', ')}) but there are no other shell specialists configured; set shell_specialists to include '${member.id}' or remove shell tools from that member.`);
765
778
  }
766
779
  return;
767
780
  }
@@ -787,7 +800,7 @@ exports.Team = Team;
787
800
  const shellTools = listShellTools(member);
788
801
  if (shellTools.length === 0)
789
802
  continue;
790
- 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.`);
803
+ addWarning(`shell_specialists/non_specialist_has_shell_tools/${sanitizeProblemIdSegment(member.id)}`, 'Warning in .minds/team.yaml: non-shell-specialist member has shell tools while other shell specialists exist.', `member '${member.id}' has shell tools (${shellTools.join(', ')}) but is not listed in shell_specialists; other shell specialists are already configured (${specialists.join(', ')}).`);
791
804
  }
792
805
  }
793
806
  async function validateMemberToolsetBindings(team, md) {
@@ -1246,14 +1259,25 @@ exports.Team = Team;
1246
1259
  'max_tokens',
1247
1260
  'service_tier',
1248
1261
  'top_p',
1249
- 'frequency_penalty',
1250
- 'presence_penalty',
1251
- 'seed',
1252
- 'logprobs',
1253
- 'top_logprobs',
1254
- 'stop',
1255
- 'logit_bias',
1256
- 'user',
1262
+ 'reasoning_effort',
1263
+ 'reasoning_summary',
1264
+ 'verbosity',
1265
+ 'parallel_tool_calls',
1266
+ 'safety_identifier',
1267
+ 'text_format',
1268
+ 'text_format_json_schema_name',
1269
+ 'text_format_json_schema',
1270
+ 'text_format_json_schema_strict',
1271
+ 'web_search_tool',
1272
+ 'web_search_context_size',
1273
+ 'web_search_allowed_domains',
1274
+ 'web_search_include_sources',
1275
+ ];
1276
+ Team.TEAM_YAML_MODEL_PARAMS_CODEX_KEYS = [
1277
+ 'temperature',
1278
+ 'max_tokens',
1279
+ 'service_tier',
1280
+ 'top_p',
1257
1281
  'reasoning_effort',
1258
1282
  'reasoning_summary',
1259
1283
  'verbosity',
@@ -1261,7 +1285,6 @@ exports.Team = Team;
1261
1285
  'web_search',
1262
1286
  'json_response',
1263
1287
  ];
1264
- Team.TEAM_YAML_MODEL_PARAMS_CODEX_KEYS = Team.TEAM_YAML_MODEL_PARAMS_OPENAI_KEYS;
1265
1288
  Team.TEAM_YAML_MODEL_PARAMS_ANTHROPIC_KEYS = [
1266
1289
  'temperature',
1267
1290
  'max_tokens',
@@ -1295,8 +1318,10 @@ exports.Team = Team;
1295
1318
  reasoning_summary: `Did you mean \`${atPrefix}.model_params.codex.reasoning_summary\` (preferred for provider: codex) or \`${atPrefix}.model_params.openai.reasoning_summary\`? (not supported at ${atPrefix} root)`,
1296
1319
  verbosity: `Did you mean \`${atPrefix}.model_params.codex.verbosity\` (preferred for provider: codex) or \`${atPrefix}.model_params.openai.verbosity\`? (not supported at ${atPrefix} root)`,
1297
1320
  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)`,
1298
- web_search: `Did you mean \`${atPrefix}.model_params.codex.web_search\` (preferred for provider: codex) or \`${atPrefix}.model_params.openai.web_search\`? (not supported at ${atPrefix} root)`,
1299
- json_response: `Did you mean \`${atPrefix}.model_params.json_response\` (provider-agnostic), or provider-specific \`${atPrefix}.model_params.codex.json_response\` / \`${atPrefix}.model_params.openai.json_response\` / \`${atPrefix}.model_params.anthropic.json_response\`?`,
1321
+ web_search: `Did you mean \`${atPrefix}.model_params.codex.web_search\`? (not supported at ${atPrefix} root)`,
1322
+ web_search_tool: `Did you mean \`${atPrefix}.model_params.openai.web_search_tool\`? (not supported at ${atPrefix} root)`,
1323
+ json_response: `Did you mean \`${atPrefix}.model_params.json_response\` (provider-agnostic), or provider-specific \`${atPrefix}.model_params.codex.json_response\` / \`${atPrefix}.model_params.anthropic.json_response\`?`,
1324
+ text_format: `Did you mean \`${atPrefix}.model_params.openai.text_format\`? (not supported at ${atPrefix} root)`,
1300
1325
  };
1301
1326
  const unknownAtMember = listUnknownKeys(memberObj, Team.TEAM_YAML_MEMBER_KEYS);
1302
1327
  if (unknownAtMember.length > 0) {
@@ -1318,7 +1343,8 @@ exports.Team = Team;
1318
1343
  reasoning_summary: `Did you mean \`${modelParamsAt}.codex.reasoning_summary\` (preferred for provider: codex) or \`${modelParamsAt}.openai.reasoning_summary\`?`,
1319
1344
  verbosity: `Did you mean \`${modelParamsAt}.codex.verbosity\` (preferred for provider: codex) or \`${modelParamsAt}.openai.verbosity\`?`,
1320
1345
  parallel_tool_calls: `Did you mean \`${modelParamsAt}.codex.parallel_tool_calls\` (preferred for provider: codex) or \`${modelParamsAt}.openai.parallel_tool_calls\`?`,
1321
- web_search: `Did you mean \`${modelParamsAt}.codex.web_search\` (preferred for provider: codex) or \`${modelParamsAt}.openai.web_search\`?`,
1346
+ web_search: `Did you mean \`${modelParamsAt}.codex.web_search\`?`,
1347
+ web_search_tool: `Did you mean \`${modelParamsAt}.openai.web_search_tool\`?`,
1322
1348
  service_tier: `Did you mean \`${modelParamsAt}.codex.service_tier\` (preferred for provider: codex) or \`${modelParamsAt}.openai.service_tier\`?`,
1323
1349
  temperature: `Did you mean \`${modelParamsAt}.codex.temperature\` / \`${modelParamsAt}.openai.temperature\` (or \`${modelParamsAt}.anthropic.temperature\`)?`,
1324
1350
  top_p: `Did you mean \`${modelParamsAt}.codex.top_p\` / \`${modelParamsAt}.openai.top_p\` (or \`${modelParamsAt}.anthropic.top_p\`)?`,
@@ -2107,18 +2133,10 @@ exports.Team = Team;
2107
2133
  if (value === undefined)
2108
2134
  return undefined;
2109
2135
  const obj = asRecord(value, at);
2110
- const validateOpenAiStyleParams = (params, at2) => {
2136
+ const validateCodexParams = (params, at2) => {
2111
2137
  asOptionalNumber(params.temperature, `${at2}.temperature`);
2112
2138
  asOptionalNumber(params.max_tokens, `${at2}.max_tokens`);
2113
2139
  asOptionalNumber(params.top_p, `${at2}.top_p`);
2114
- asOptionalNumber(params.frequency_penalty, `${at2}.frequency_penalty`);
2115
- asOptionalNumber(params.presence_penalty, `${at2}.presence_penalty`);
2116
- asOptionalNumber(params.seed, `${at2}.seed`);
2117
- asOptionalBoolean(params.logprobs, `${at2}.logprobs`);
2118
- asOptionalNumber(params.top_logprobs, `${at2}.top_logprobs`);
2119
- asOptionalStop(params.stop, `${at2}.stop`);
2120
- asOptionalLogitBias(params.logit_bias, `${at2}.logit_bias`);
2121
- asOptionalString(params.user, `${at2}.user`);
2122
2140
  asOptionalBoolean(params.parallel_tool_calls, `${at2}.parallel_tool_calls`);
2123
2141
  asOptionalBoolean(params.json_response, `${at2}.json_response`);
2124
2142
  const serviceTier = params.service_tier;
@@ -2163,16 +2181,89 @@ exports.Team = Team;
2163
2181
  throw new Error(`Invalid ${at2}.web_search: expected disabled|cached|live (got ${describeValueType(webSearch)})`);
2164
2182
  }
2165
2183
  };
2184
+ const validateOpenAiParams = (params, at2) => {
2185
+ asOptionalNumber(params.temperature, `${at2}.temperature`);
2186
+ asOptionalNumber(params.max_tokens, `${at2}.max_tokens`);
2187
+ asOptionalNumber(params.top_p, `${at2}.top_p`);
2188
+ asOptionalBoolean(params.parallel_tool_calls, `${at2}.parallel_tool_calls`);
2189
+ asOptionalString(params.safety_identifier, `${at2}.safety_identifier`);
2190
+ asOptionalString(params.text_format_json_schema_name, `${at2}.text_format_json_schema_name`);
2191
+ asOptionalString(params.text_format_json_schema, `${at2}.text_format_json_schema`);
2192
+ asOptionalBoolean(params.text_format_json_schema_strict, `${at2}.text_format_json_schema_strict`);
2193
+ asOptionalBoolean(params.web_search_tool, `${at2}.web_search_tool`);
2194
+ asOptionalStringArray(params.web_search_allowed_domains, `${at2}.web_search_allowed_domains`);
2195
+ asOptionalBoolean(params.web_search_include_sources, `${at2}.web_search_include_sources`);
2196
+ const serviceTier = params.service_tier;
2197
+ if (serviceTier !== undefined &&
2198
+ serviceTier !== 'auto' &&
2199
+ serviceTier !== 'default' &&
2200
+ serviceTier !== 'flex' &&
2201
+ serviceTier !== 'scale' &&
2202
+ serviceTier !== 'priority') {
2203
+ throw new Error(`Invalid ${at2}.service_tier: expected auto|default|flex|scale|priority (got ${describeValueType(serviceTier)})`);
2204
+ }
2205
+ const reasoningEffort = params.reasoning_effort;
2206
+ if (reasoningEffort !== undefined &&
2207
+ reasoningEffort !== 'none' &&
2208
+ reasoningEffort !== 'minimal' &&
2209
+ reasoningEffort !== 'low' &&
2210
+ reasoningEffort !== 'medium' &&
2211
+ reasoningEffort !== 'high' &&
2212
+ reasoningEffort !== 'xhigh') {
2213
+ throw new Error(`Invalid ${at2}.reasoning_effort: expected none|minimal|low|medium|high|xhigh (got ${describeValueType(reasoningEffort)})`);
2214
+ }
2215
+ const reasoningSummary = params.reasoning_summary;
2216
+ if (reasoningSummary !== undefined &&
2217
+ reasoningSummary !== 'auto' &&
2218
+ reasoningSummary !== 'concise' &&
2219
+ reasoningSummary !== 'detailed' &&
2220
+ reasoningSummary !== 'none') {
2221
+ throw new Error(`Invalid ${at2}.reasoning_summary: expected auto|concise|detailed|none (got ${describeValueType(reasoningSummary)})`);
2222
+ }
2223
+ const verbosity = params.verbosity;
2224
+ if (verbosity !== undefined &&
2225
+ verbosity !== 'low' &&
2226
+ verbosity !== 'medium' &&
2227
+ verbosity !== 'high') {
2228
+ throw new Error(`Invalid ${at2}.verbosity: expected low|medium|high (got ${describeValueType(verbosity)})`);
2229
+ }
2230
+ const textFormat = params.text_format;
2231
+ if (textFormat !== undefined &&
2232
+ textFormat !== 'text' &&
2233
+ textFormat !== 'json_object' &&
2234
+ textFormat !== 'json_schema') {
2235
+ throw new Error(`Invalid ${at2}.text_format: expected text|json_object|json_schema (got ${describeValueType(textFormat)})`);
2236
+ }
2237
+ const webSearchContextSize = params.web_search_context_size;
2238
+ if (webSearchContextSize !== undefined &&
2239
+ webSearchContextSize !== 'low' &&
2240
+ webSearchContextSize !== 'medium' &&
2241
+ webSearchContextSize !== 'high') {
2242
+ throw new Error(`Invalid ${at2}.web_search_context_size: expected low|medium|high (got ${describeValueType(webSearchContextSize)})`);
2243
+ }
2244
+ const hasJsonSchemaDetails = params.text_format_json_schema_name !== undefined ||
2245
+ params.text_format_json_schema !== undefined ||
2246
+ params.text_format_json_schema_strict !== undefined;
2247
+ if (textFormat === 'json_schema') {
2248
+ if (params.text_format_json_schema_name === undefined) {
2249
+ throw new Error(`Invalid ${at2}: ${at2}.text_format=json_schema requires ${at2}.text_format_json_schema_name.`);
2250
+ }
2251
+ if (params.text_format_json_schema === undefined) {
2252
+ throw new Error(`Invalid ${at2}: ${at2}.text_format=json_schema requires ${at2}.text_format_json_schema.`);
2253
+ }
2254
+ }
2255
+ else if (hasJsonSchemaDetails) {
2256
+ throw new Error(`Invalid ${at2}: text_format_json_schema_* fields require ${at2}.text_format=json_schema.`);
2257
+ }
2258
+ };
2166
2259
  const codex = obj.codex === undefined ? undefined : asRecord(obj.codex, `${at}.codex`);
2167
2260
  const openai = obj.openai === undefined ? undefined : asRecord(obj.openai, `${at}.openai`);
2168
2261
  const anthropic = obj.anthropic === undefined ? undefined : asRecord(obj.anthropic, `${at}.anthropic`);
2169
2262
  const general = obj.general === undefined ? undefined : asRecord(obj.general, `${at}.general`);
2170
- if (codex) {
2171
- validateOpenAiStyleParams(codex, `${at}.codex`);
2172
- }
2173
- if (openai) {
2174
- validateOpenAiStyleParams(openai, `${at}.openai`);
2175
- }
2263
+ if (codex)
2264
+ validateCodexParams(codex, `${at}.codex`);
2265
+ if (openai)
2266
+ validateOpenAiParams(openai, `${at}.openai`);
2176
2267
  if (anthropic) {
2177
2268
  asOptionalNumber(anthropic.temperature, `${at}.anthropic.temperature`);
2178
2269
  asOptionalNumber(anthropic.max_tokens, `${at}.anthropic.max_tokens`);
package/dist/tool.d.ts CHANGED
@@ -29,6 +29,17 @@ export interface FuncTool {
29
29
  }
30
30
  export type Tool = FuncTool;
31
31
  export type ToolCallOutput = KernelToolCallOutput;
32
+ type PreparedRawToolArguments = Readonly<{
33
+ ok: true;
34
+ raw: ToolArguments;
35
+ contextArguments: string;
36
+ persistedArguments: ToolArguments;
37
+ }> | Readonly<{
38
+ ok: false;
39
+ error: string;
40
+ contextArguments: string;
41
+ persistedArguments: ToolArguments;
42
+ }>;
32
43
  export interface ReminderOptions {
33
44
  readonly echoback?: boolean;
34
45
  readonly scope?: ReminderScope;
@@ -74,3 +85,18 @@ export declare function validateArgs(schema: JsonSchema, args: unknown): {
74
85
  ok: false;
75
86
  error: string;
76
87
  };
88
+ export declare function formatToolArgumentsForContext(arguments_: ToolArguments): string;
89
+ export declare function prepareRawToolArguments(argumentsStr: string): PreparedRawToolArguments;
90
+ export type FuncToolInvocationResolution = Readonly<{
91
+ ok: true;
92
+ args: ToolArguments;
93
+ contextArguments: string;
94
+ persistedArguments: ToolArguments;
95
+ }> | Readonly<{
96
+ ok: false;
97
+ error: string;
98
+ contextArguments: string;
99
+ persistedArguments: ToolArguments;
100
+ }>;
101
+ export declare function resolveFuncToolInvocationArguments(tool: FuncTool, argumentsStr: string): FuncToolInvocationResolution;
102
+ export {};
package/dist/tool.js CHANGED
@@ -10,7 +10,15 @@ exports.compareReminderDisplayOrder = compareReminderDisplayOrder;
10
10
  exports.getReminderOwnerName = getReminderOwnerName;
11
11
  exports.reminderOwnedBy = reminderOwnedBy;
12
12
  exports.validateArgs = validateArgs;
13
+ exports.formatToolArgumentsForContext = formatToolArgumentsForContext;
14
+ exports.prepareRawToolArguments = prepareRawToolArguments;
15
+ exports.resolveFuncToolInvocationArguments = resolveFuncToolInvocationArguments;
13
16
  const id_1 = require("@longrun-ai/kernel/utils/id");
17
+ const FUNC_TOOL_ARG_ALIASES = {
18
+ readonly_shell: {
19
+ timeout: 'timeout_ms',
20
+ },
21
+ };
14
22
  function reminderEchoBackEnabled(reminder) {
15
23
  return reminder.echoback !== false;
16
24
  }
@@ -116,6 +124,95 @@ function validateArgs(schema, args) {
116
124
  }
117
125
  return { ok: true };
118
126
  }
127
+ function isPlainObject(value) {
128
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
129
+ }
130
+ function normalizeFuncToolArguments(toolName, args) {
131
+ const aliases = FUNC_TOOL_ARG_ALIASES[toolName];
132
+ if (!aliases)
133
+ return args;
134
+ let normalized;
135
+ for (const [aliasKey, canonicalKey] of Object.entries(aliases)) {
136
+ if (!(aliasKey in args))
137
+ continue;
138
+ if (!normalized)
139
+ normalized = { ...args };
140
+ if (!(canonicalKey in normalized)) {
141
+ normalized[canonicalKey] = normalized[aliasKey];
142
+ }
143
+ delete normalized[aliasKey];
144
+ }
145
+ return (normalized ?? args);
146
+ }
147
+ function formatToolArgumentsForContext(arguments_) {
148
+ return JSON.stringify(arguments_ ?? {});
149
+ }
150
+ function prepareRawToolArguments(argumentsStr) {
151
+ if (argumentsStr.trim() === '') {
152
+ return {
153
+ ok: true,
154
+ raw: {},
155
+ contextArguments: '{}',
156
+ persistedArguments: {},
157
+ };
158
+ }
159
+ let parsed;
160
+ try {
161
+ parsed = JSON.parse(argumentsStr);
162
+ }
163
+ catch (err) {
164
+ return {
165
+ ok: false,
166
+ error: `Arguments must be valid JSON: ${err instanceof Error ? err.message : String(err)}`,
167
+ contextArguments: '{}',
168
+ persistedArguments: {},
169
+ };
170
+ }
171
+ if (!isPlainObject(parsed)) {
172
+ return {
173
+ ok: false,
174
+ error: 'Arguments must be an object',
175
+ contextArguments: '{}',
176
+ persistedArguments: {},
177
+ };
178
+ }
179
+ return {
180
+ ok: true,
181
+ raw: parsed,
182
+ contextArguments: argumentsStr,
183
+ persistedArguments: parsed,
184
+ };
185
+ }
186
+ function resolveFuncToolInvocationArguments(tool, argumentsStr) {
187
+ const prepared = prepareRawToolArguments(argumentsStr);
188
+ if (!prepared.ok) {
189
+ return prepared;
190
+ }
191
+ const normalizedArgs = normalizeFuncToolArguments(tool.name, prepared.raw);
192
+ if (tool.argsValidation === 'passthrough') {
193
+ return {
194
+ ok: true,
195
+ args: normalizedArgs,
196
+ contextArguments: formatToolArgumentsForContext(normalizedArgs),
197
+ persistedArguments: normalizedArgs,
198
+ };
199
+ }
200
+ const validation = validateArgs(tool.parameters, normalizedArgs);
201
+ if (!validation.ok) {
202
+ return {
203
+ ok: false,
204
+ error: validation.error,
205
+ contextArguments: formatToolArgumentsForContext(normalizedArgs),
206
+ persistedArguments: normalizedArgs,
207
+ };
208
+ }
209
+ return {
210
+ ok: true,
211
+ args: normalizedArgs,
212
+ contextArguments: formatToolArgumentsForContext(normalizedArgs),
213
+ persistedArguments: normalizedArgs,
214
+ };
215
+ }
119
216
  function isJsonPrimitiveValue(value) {
120
217
  return (typeof value === 'string' ||
121
218
  typeof value === 'number' ||
@@ -3097,6 +3097,8 @@ function renderTeamManual(language) {
3097
3097
  '团队机制默认范式是“长期 agent”(long-lived teammates):`members` 列表表示稳定存在、可随时被诉请的队友,并非“按需子角色/临时 sub-role”。这是产品机制,而非部署/运行偏好。\n如需切换当前由谁执行/扮演,用 CLI/TUI 的 `-m/--member <id>` 显式选择。\n`members.<id>.gofor` 是给其他队友/人类看的“正向诉请路由卡”(建议 5 行内):写什么时候应该找这个队友、适合把什么问题交给 TA、以及可以期待什么帮助/产出。\n`members.<id>.nogo` 是可选的“反向路由卡”:写哪些事项不要找这个队友、应改找哪类队友/路径。两者都只服务外部路由;不要把该成员自己的执行守则、工作模式、验收标准或完整职责文档堆在这里;这些应写入 `.minds/team/<id>/*` 或 `.minds/team/domains/*.md`。它们都支持三种形态:string(单句)、YAML list(普通 bullet)、YAML object(带标签的结构化摘要,object key 完全 freeform,value 必须是 string)。\n示例(gofor / nogo):\n```yaml\nmembers:\n qa_guard:\n name: QA Guard\n gofor:\n - 适合在发布前需要回归把关时找 TA\n - 适合让 TA 梳理高风险改动与手工核验点\n - 可以期待 TA 返回回归结论、风险清单与建议动作\n nogo:\n - 不要找 TA 做主实现或新功能开发\n - 若是产品文案/信息架构问题,应改找对应实现或设计角色\n```\n示例(gofor, object;按 YAML key 顺序渲染,key freeform):\n```yaml\nmembers:\n coordinator:\n name: 协调者\n gofor:\n When: 当你需要协调跨成员推进、拆分任务或收口结果时\n Ask: 让 TA 负责诉请路由、任务拆分与结果集成\n Returns: 可期待计划主线、委派方案与验收结论\n nogo:\n Avoid: 不要把具体实现、测试细节或文档落地直接塞给 TA\n RouteTo: 这些应改找对应专职队友\n Note: 若要写该成员自己的执行守则,请改写进 persona/knowledge/lessons\n```\n如果你把这类结构化内容写成 `- When: ...` / `- Ask: ...` 或 `- Avoid: ...` / `- RouteTo: ...` 的 YAML list,也仍然允许;但 `team_mgmt_validate_team_cfg({})` 会给 warning,建议改用 object,因为可读性更好。',
3098
3098
  '如何为不同角色指定默认模型:用 `member_defaults.provider/model` 设全局默认;对特定成员在 `members.<id>.provider/model` 里覆盖即可。例如:默认用 `gpt-5.2`,代码编写域成员用 `gpt-5.2-codex`。',
3099
3099
  '模型参数(例如 `reasoning_effort` / `verbosity` / `temperature`)应写在 `member_defaults.model_params.codex.*` 或 `members.<id>.model_params.codex.*` 下(对内置 `codex` provider)。不要把这些参数直接写在 `member_defaults`/`members.<id>` 根上。',
3100
+ 'Codex provider 专属能力:若成员使用 `provider: codex`,可在 `.minds/team/<id>/persona.*.md` 中单独写一行 `@codex-system-prompt`,显式引入该成员当前模型对应的 stock Codex 内置系统提示;若要固定某个模板版本,可写成 `@codex-system-prompt:<model>`。本地角色边界、交付要求、团队规则继续写在这行后面即可。',
3101
+ '若团队需要一个行为接近 stock Codex 的显在队友,可新增如 `members.codex` 这样的成员,保持 `provider: codex`,默认授予 `ws_read` / `ws_mod` / `codex_style_tools`(除非人类明确要求其他组合),并在该成员 persona 文件开头先写 `@codex-system-prompt`,再补 Dominds 团队自己的约束。',
3100
3102
  '重要:Codex provider(`apiType=codex`)仅支持流式输出。若成员解析后的 provider 是 Codex,则 `members.<id>.streaming: false` 属于配置错误,会在校验/运行时作为严重问题上报并中止请求。',
3101
3103
  '`shell_specialists`:可选,列出允许拥有 shell 工具的成员 id(string|string[]|null)。toolset `os` 当前包含 `shell_cmd` / `stop_daemon` / `get_daemon_output`。如某成员获得了 shell 工具,则该成员必须出现在 `shell_specialists`;否则会在 Problems 面板提示。这个问题不会让整个 Team.load() 崩掉,但相关成员可能缺少 shell 能力,仍应修复。',
3102
3104
  '风格提醒:保持 `team.yaml` 的可读性。推荐用空行分隔段落/成员块,避免连续多行空行;每次修改后运行 `team_mgmt_validate_team_cfg({})` 以便在 Problems 面板看到错误与风格提醒。',
@@ -3167,6 +3169,8 @@ function renderTeamManual(language) {
3167
3169
  'The team mechanism default is long-lived agents (long-lived teammates): `members` is a stable roster of callable teammates, not “on-demand sub-roles”. This is a product mechanism, not a deployment preference.\nTo pick who acts, use `-m/--member <id>` in CLI/TUI.\n`members.<id>.gofor` is a positive routing card for other teammates/humans (≤ 5 lines): write when someone should ask this teammate, what kinds of asks fit, and what help/output to expect.\n`members.<id>.nogo` is an optional negative routing card: write what should not be routed to this teammate and what kind of teammate/path should take it instead. Both fields are external routing metadata; do not dump the member’s own operating rules, work mode, acceptance bar, or full role spec here. Those belong in `.minds/team/<id>/*` or `.minds/team/domains/*.md`.\nBoth fields support three shapes: string (single sentence), YAML list (plain bullets), and YAML object (structured labeled summary; object keys are fully freeform and values must be strings).\nExample (`gofor` / `nogo`):\n```yaml\nmembers:\n qa_guard:\n name: QA Guard\n gofor:\n - Go to this teammate for pre-release regression gating\n - Ask this teammate to map high-risk changes and manual checks\n - Expect a regression verdict, risk list, and recommended next actions\n nogo:\n - Do not route net-new feature implementation here\n - For product copy or information architecture, ask the relevant implementer/designer instead\n```\nExample (object form; rendered in YAML key order, freeform keys):\n```yaml\nmembers:\n coordinator:\n name: Coordinator\n gofor:\n When: when you need cross-member coordination, task breakdown, or result convergence\n Ask: route requests, split work, and integrate outcomes\n Returns: an execution plan, delegation decisions, and acceptance conclusions\n nogo:\n Avoid: do not route concrete implementation, test-authoring, or doc-writing directly here\n RouteTo: send those asks to the relevant specialist teammate instead\n Note: put the member’s own operating rules in persona/knowledge/lessons instead\n```\nIf you write the same structured content as a YAML list like `- When: ...` / `- Ask: ...` or `- Avoid: ...` / `- RouteTo: ...`, it is still accepted, but `team_mgmt_validate_team_cfg({})` will warn and suggest YAML object form for readability.',
3168
3170
  'Per-role default models: set global defaults via `member_defaults.provider/model`, then override `members.<id>.provider/model` per member (e.g. use `gpt-5.2` by default, and `gpt-5.2-codex` for code-writing members).',
3169
3171
  'Model params (e.g. `reasoning_effort` / `verbosity` / `temperature`) must be nested under `member_defaults.model_params.codex.*` or `members.<id>.model_params.codex.*` (for the built-in `codex` provider). Do not put them directly under `member_defaults`/`members.<id>` root.',
3172
+ 'Codex-provider-specific capability: if a teammate uses `provider: codex`, you may place a standalone `@codex-system-prompt` line inside `.minds/team/<id>/persona.*.md` to splice in the stock Codex built-in system prompt for that member’s current model. Use `@codex-system-prompt:<model>` to pin a specific bundled prompt variant. Keep local role boundaries, delivery rules, and team guidance below that line.',
3173
+ 'If you want a visible teammate that behaves close to stock Codex, a practical pattern is to add a member such as `members.codex`, keep `provider: codex`, grant the normal coding toolsets (`ws_read` / `ws_mod` / `codex_style_tools` unless the human explicitly asks otherwise), and start that teammate persona file with `@codex-system-prompt` before your Dominds-specific addenda.',
3170
3174
  'Style reminder: keep `team.yaml` readable. Prefer single blank lines between sections/member blocks; avoid long runs of blank lines. Run `team_mgmt_validate_team_cfg({})` after edits to surface errors and style warnings in the Problems panel.',
3171
3175
  windowsHost
3172
3176
  ? 'Default policy (override only when requested):\n1) When adding a member, set `diligence-push-max` to `3` unless the user explicitly asks otherwise.\n2) When switching a member’s LLM `provider/model`, keep `ws_read` / `ws_mod` as the baseline; on Windows, do not configure `codex_style_tools`. If runtime probing is needed, grant `os` only to a small specialist set.'
@@ -3431,6 +3435,7 @@ function renderMindsManual(language) {
3431
3435
  'knowledge.*.md:领域知识(可维护)。',
3432
3436
  'lessons.*.md:经验教训(可维护)。',
3433
3437
  '写法约束:`persona/knowledge/lessons` 文件里不要再写重复的总标题。系统提示模板会自动添加:`## 角色设定` / `## 知识` / `## 经验`(英文模板对应 `## Persona` / `## Knowledge` / `## Lessons`)。',
3438
+ 'Codex provider 专属能力:若该成员使用 `provider: codex`,可在 `persona.*.md` 中单独写一行 `@codex-system-prompt`,把 stock Codex 内置系统提示拼接进当前 persona;需要固定某个模板版本时写 `@codex-system-prompt:<model>`。建议把这行放在文件最前面,再继续写本团队自己的角色边界与交付要求。',
3434
3439
  '语言文件命名:优先按工作语言提供 `persona.zh.md` / `persona.en.md` 等;是否回退到 `persona.md`/其他语言版本,以当前实现为准。',
3435
3440
  ]) +
3436
3441
  fmtCodeBlock('text', [
@@ -3442,6 +3447,8 @@ function renderMindsManual(language) {
3442
3447
  ' lessons.zh.md',
3443
3448
  ]) +
3444
3449
  fmtCodeBlock('markdown', [
3450
+ '@codex-system-prompt',
3451
+ '',
3445
3452
  '### 核心身份',
3446
3453
  '- 专业程序员,负责按规格完成代码开发。',
3447
3454
  '### 工作边界',
@@ -3464,6 +3471,7 @@ function renderMindsManual(language) {
3464
3471
  'knowledge.*.md: domain knowledge (maintainable).',
3465
3472
  'lessons.*.md: lessons learned (maintainable).',
3466
3473
  'Authoring rule: do not add top-level titles that duplicate the system prompt wrapper. The system prompt already adds: `## Persona` / `## Knowledge` / `## Lessons` (zh template: `## 角色设定` / `## 知识` / `## 经验`).',
3474
+ 'Codex-provider-specific capability: if this member uses `provider: codex`, you may place a standalone `@codex-system-prompt` line inside `persona.*.md` to splice the stock Codex built-in system prompt into the current persona. Use `@codex-system-prompt:<model>` to pin a specific bundled prompt variant. Put that line near the top, then continue with your team-specific role boundaries and delivery rules.',
3467
3475
  'Language variants: prefer working-language files like `persona.en.md` / `persona.zh.md`; whether it falls back to `persona.md` or other languages follows current implementation.',
3468
3476
  ]) +
3469
3477
  fmtCodeBlock('text', [
@@ -3475,6 +3483,8 @@ function renderMindsManual(language) {
3475
3483
  ' lessons.en.md',
3476
3484
  ]) +
3477
3485
  fmtCodeBlock('markdown', [
3486
+ '@codex-system-prompt',
3487
+ '',
3478
3488
  '### Core Identity',
3479
3489
  '- Professional programmer responsible for implementing approved development specs.',
3480
3490
  '### Work Boundaries',
@@ -5318,6 +5328,10 @@ async function renderTeamMgmtGuideContent(language, topicsRaw = []) {
5318
5328
  '不要在文件里存 API key,使用环境变量(apiKeyEnvVar)。',
5319
5329
  'member_defaults.provider/model 需要引用这里的 key。',
5320
5330
  '`model_param_options` 可选:用于记录该 provider 支持的 `.minds/team.yaml model_params` 选项(文档用途)。',
5331
+ '`apiQuirks` 可选:写在 `providers.<providerKey>.apiQuirks`,类型是 `string|string[]`。它是 provider 级 transport / 网关兼容开关,用来描述“这个供应商/网关的 API 有非标准行为”,不是 `.minds/team.yaml` 的成员参数,也不是 `model_params`。',
5332
+ '使用原则:只有在你确认某个上游网关确实偏离了标准协议,而且 Dominds 已为这个偏差实现了命名 quirk 时才配置;不要把它当作随意调参入口。当前实现里,未知 quirk 值通常不会报错,但也不会带来任何效果。',
5333
+ '当前已知示例:OpenAI Responses 包装层支持 `apiQuirks: xcode.best`(或数组里包含它),用于把供应商额外发出的 `keepalive` 流事件识别为 heartbeat,而不是当作异常事件处理。最小示例:\n```yaml\nproviders:\n my_gateway:\n apiType: openai\n baseUrl: https://example.invalid/v1\n apiKeyEnvVar: MY_GATEWAY_API_KEY\n apiQuirks: xcode.best\n models:\n my_model: { name: \"upstream-model-id\" }\n```',
5334
+ '边界提醒:`apiQuirks` 只影响实现里显式消费它的 provider/generator。就当前实现看,至少 OpenAI Responses 路径会读取它;不要假设所有 `apiType` 都支持或需要它。若配置后行为仍异常,应继续检查上游网关文档、抓流事件类型,并结合 `team_mgmt_check_provider(...)` / 运行日志排查。',
5321
5335
  ])
5322
5336
  : fmtHeader('.minds/llm.yaml') +
5323
5337
  fmtList([
@@ -5328,6 +5342,10 @@ async function renderTeamMgmtGuideContent(language, topicsRaw = []) {
5328
5342
  'Do not store API keys in the file; use env vars via apiKeyEnvVar.',
5329
5343
  'member_defaults.provider/model must reference these keys.',
5330
5344
  'Optional: `model_param_options` documents `.minds/team.yaml model_params` knobs (documentation only).',
5345
+ '`apiQuirks` is optional under `providers.<providerKey>.apiQuirks`, with type `string|string[]`. It is a provider-level transport / gateway compatibility switch for non-standard upstream API behavior. It is not a `.minds/team.yaml` member field and not part of `model_params`.',
5346
+ 'Use it only when you have confirmed that an upstream gateway deviates from the expected protocol and Dominds has an explicitly named quirk for that deviation. Do not treat it as a generic tuning field. In the current implementation, unknown quirk values are usually ignored rather than rejected, so a typo may silently do nothing.',
5347
+ 'Known current example: the OpenAI Responses wrapper supports `apiQuirks: xcode.best` (or an array containing it) to treat vendor-emitted `keepalive` stream events as heartbeat events instead of unexpected protocol noise. Minimal example:\n```yaml\nproviders:\n my_gateway:\n apiType: openai\n baseUrl: https://example.invalid/v1\n apiKeyEnvVar: MY_GATEWAY_API_KEY\n apiQuirks: xcode.best\n models:\n my_model: { name: \"upstream-model-id\" }\n```',
5348
+ 'Boundary reminder: `apiQuirks` only affects providers/generators that explicitly read it in code. In the current implementation, at least the OpenAI Responses path consumes it; do not assume every `apiType` supports or needs it. If behavior is still wrong after setting it, continue with upstream gateway docs, raw stream event inspection, and `team_mgmt_check_provider(...)` / runtime logs.',
5331
5349
  ]);
5332
5350
  }
5333
5351
  if (want('mcp')) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dominds",
3
- "version": "1.13.2",
3
+ "version": "1.15.2",
4
4
  "description": "Dominds CLI and aggregation shell for the LongRun AI kernel/runtime packages.",
5
5
  "type": "commonjs",
6
6
  "publishConfig": {
@@ -54,7 +54,7 @@
54
54
  "zod": "^4.3.6",
55
55
  "@longrun-ai/kernel": "1.8.6",
56
56
  "@longrun-ai/shell": "1.8.6",
57
- "@longrun-ai/codex-auth": "0.11.0"
57
+ "@longrun-ai/codex-auth": "0.12.0"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@types/node": "^25.3.5",
@@ -1,5 +1,5 @@
1
- import { e as isSymbol, c as baseFlatten, g as baseIteratee, k as keys, h as baseFindIndex, j as baseEach, l as arrayMap, m as hasPath, n as castPath, t as toKey, o as baseGet } from "./_baseUniq-mfoKz4Wm.js";
2
- import { aR as isObject, aA as baseRest, aS as isIterateeCall, aT as keysIn, aU as eq, aV as isArrayLike, aW as isArray, aX as identity, aY as isIndex, aZ as assignValue } from "./index-rYmIohM_.js";
1
+ import { e as isSymbol, c as baseFlatten, g as baseIteratee, k as keys, h as baseFindIndex, j as baseEach, l as arrayMap, m as hasPath, n as castPath, t as toKey, o as baseGet } from "./_baseUniq-tR6G8loB.js";
2
+ import { aU as isObject, aC as baseRest, aV as isIterateeCall, aW as keysIn, aX as eq, aY as isArrayLike, aZ as isArray, a_ as identity, a$ as isIndex, b0 as assignValue } from "./index-hve5MWPs.js";
3
3
  var reWhitespace = /\s/;
4
4
  function trimmedEndIndex(string) {
5
5
  var index = string.length;
@@ -193,4 +193,4 @@ export {
193
193
  map as m,
194
194
  toFinite as t
195
195
  };
196
- //# sourceMappingURL=_basePickBy-CBOtd63g.js.map
196
+ //# sourceMappingURL=_basePickBy-DsirmCgI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_basePickBy-DsirmCgI.js","sources":["../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_trimmedEndIndex.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseTrim.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/toNumber.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/toFinite.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/toInteger.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/flatten.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/defaults.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/last.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_createFind.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/findIndex.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/find.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseMap.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/map.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseHas.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/has.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseLt.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseExtremum.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/min.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseSet.js","../../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_basePickBy.js"],"sourcesContent":["/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nexport default trimmedEndIndex;\n","import trimmedEndIndex from './_trimmedEndIndex.js';\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nexport default baseTrim;\n","import baseTrim from './_baseTrim.js';\nimport isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n","import toNumber from './toNumber.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nexport default toFinite;\n","import toFinite from './toFinite.js';\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nexport default toInteger;\n","import baseFlatten from './_baseFlatten.js';\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n}\n\nexport default flatten;\n","import baseRest from './_baseRest.js';\nimport eq from './eq.js';\nimport isIterateeCall from './_isIterateeCall.js';\nimport keysIn from './keysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n});\n\nexport default defaults;\n","/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\nexport default last;\n","import baseIteratee from './_baseIteratee.js';\nimport isArrayLike from './isArrayLike.js';\nimport keys from './keys.js';\n\n/**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\nfunction createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = baseIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n}\n\nexport default createFind;\n","import baseFindIndex from './_baseFindIndex.js';\nimport baseIteratee from './_baseIteratee.js';\nimport toInteger from './toInteger.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\nfunction findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, baseIteratee(predicate, 3), index);\n}\n\nexport default findIndex;\n","import createFind from './_createFind.js';\nimport findIndex from './findIndex.js';\n\n/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\nexport default find;\n","import baseEach from './_baseEach.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\nexport default baseMap;\n","import arrayMap from './_arrayMap.js';\nimport baseIteratee from './_baseIteratee.js';\nimport baseMap from './_baseMap.js';\nimport isArray from './isArray.js';\n\n/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, baseIteratee(iteratee, 3));\n}\n\nexport default map;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n}\n\nexport default baseHas;\n","import baseHas from './_baseHas.js';\nimport hasPath from './_hasPath.js';\n\n/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\nfunction has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n}\n\nexport default has;\n","/**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\nfunction baseLt(value, other) {\n return value < other;\n}\n\nexport default baseLt;\n","import isSymbol from './isSymbol.js';\n\n/**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\nfunction baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n}\n\nexport default baseExtremum;\n","import baseExtremum from './_baseExtremum.js';\nimport baseLt from './_baseLt.js';\nimport identity from './identity.js';\n\n/**\n * Computes the minimum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */\nfunction min(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseLt)\n : undefined;\n}\n\nexport default min;\n","import assignValue from './_assignValue.js';\nimport castPath from './_castPath.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return object;\n }\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n}\n\nexport default baseSet;\n","import baseGet from './_baseGet.js';\nimport baseSet from './_baseSet.js';\nimport castPath from './_castPath.js';\n\n/**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n}\n\nexport default basePickBy;\n"],"names":["objectProto","hasOwnProperty","collection"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]}
@@ -1,4 +1,4 @@
1
- import { be as isObjectLike, bf as baseGetTag, aW as isArray, bg as Symbol$1, aV as isArrayLike, bh as arrayLikeKeys, bi as baseKeys, bj as memoize, bk as isArguments, bl as copyObject, aT as keysIn, bm as getPrototype, bn as cloneArrayBuffer, bo as cloneTypedArray, bp as getTag, bc as baseUnary, bq as nodeUtil, aR as isObject, br as copyArray, bs as isBuffer, bt as cloneBuffer, bu as initCloneObject, bv as Stack, aZ as assignValue, bw as MapCache, aU as eq, bx as Uint8Array, by as isTypedArray, bz as isLength, aY as isIndex, aX as identity, ba as baseFor, bA as Set } from "./index-rYmIohM_.js";
1
+ import { bh as isObjectLike, bi as baseGetTag, aZ as isArray, bj as Symbol$1, aY as isArrayLike, bk as arrayLikeKeys, bl as baseKeys, bm as memoize, bn as isArguments, bo as copyObject, aW as keysIn, bp as getPrototype, bq as cloneArrayBuffer, br as cloneTypedArray, bs as getTag, bf as baseUnary, bt as nodeUtil, aU as isObject, bu as copyArray, bv as isBuffer, bw as cloneBuffer, bx as initCloneObject, by as Stack, b0 as assignValue, bz as MapCache, aX as eq, bA as Uint8Array, bB as isTypedArray, bC as isLength, a$ as isIndex, a_ as identity, bd as baseFor, bD as Set } from "./index-hve5MWPs.js";
2
2
  var symbolTag$3 = "[object Symbol]";
3
3
  function isSymbol(value) {
4
4
  return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag$3;
@@ -833,4 +833,4 @@ export {
833
833
  baseIndexOf as y,
834
834
  getAllKeysIn as z
835
835
  };
836
- //# sourceMappingURL=_baseUniq-mfoKz4Wm.js.map
836
+ //# sourceMappingURL=_baseUniq-tR6G8loB.js.map