tianshu-harness 3.23.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 (255) hide show
  1. package/LICENSE +189 -0
  2. package/README.en.md +1066 -0
  3. package/README.ja.md +1214 -0
  4. package/README.ko.md +1216 -0
  5. package/README.md +309 -0
  6. package/completions/rivet.bash +118 -0
  7. package/completions/rivet.fish +110 -0
  8. package/completions/rivet.ps1 +230 -0
  9. package/completions/rivet.zsh +187 -0
  10. package/dist/account-OAEKORZE.js +47 -0
  11. package/dist/account-login-V6FOLHJR.js +65 -0
  12. package/dist/account-status-KHNPPAFL.js +23 -0
  13. package/dist/agent/worker-process/child.js +407 -0
  14. package/dist/browser-cli-FLNY5ZHI.js +19 -0
  15. package/dist/browser-readiness-LWVGSBD5.js +12 -0
  16. package/dist/build-backends-5KXKR2S4.js +13 -0
  17. package/dist/build-options-66Y4ZE7C.js +9 -0
  18. package/dist/bundled-skills/brainstorming/SKILL.md +139 -0
  19. package/dist/bundled-skills/visual-acceptance/SKILL.md +64 -0
  20. package/dist/chain-7MAMFXZ3.js +10 -0
  21. package/dist/checkpoint-MND4DUIX.js +33 -0
  22. package/dist/chunk-2E6CK2RC.js +392 -0
  23. package/dist/chunk-2EBWGAXD.js +51 -0
  24. package/dist/chunk-2HDP7RMR.js +119 -0
  25. package/dist/chunk-2HKD2UFM.js +1000 -0
  26. package/dist/chunk-2VYRLULP.js +51 -0
  27. package/dist/chunk-2XN7PM4N.js +125 -0
  28. package/dist/chunk-35H7GVNR.js +66 -0
  29. package/dist/chunk-3C3R7JXY.js +77 -0
  30. package/dist/chunk-3VGD2FXB.js +118 -0
  31. package/dist/chunk-424AP7FM.js +534 -0
  32. package/dist/chunk-4J5TZGOE.js +3707 -0
  33. package/dist/chunk-4QJ3Y5JM.js +898 -0
  34. package/dist/chunk-4U2ET7ZY.js +1326 -0
  35. package/dist/chunk-4XPFLICE.js +876 -0
  36. package/dist/chunk-5B2OCU5P.js +31707 -0
  37. package/dist/chunk-5GGOGLSN.js +73 -0
  38. package/dist/chunk-5JRZPLI6.js +251 -0
  39. package/dist/chunk-5TQ3JYBU.js +397 -0
  40. package/dist/chunk-66JPZSGX.js +55 -0
  41. package/dist/chunk-6HSVXHCZ.js +764 -0
  42. package/dist/chunk-6S5FPUS7.js +21 -0
  43. package/dist/chunk-722LQO64.js +131 -0
  44. package/dist/chunk-73NJ7IT7.js +354 -0
  45. package/dist/chunk-7FW3I7WC.js +95 -0
  46. package/dist/chunk-7KUCBNLB.js +173 -0
  47. package/dist/chunk-7RDOV3DF.js +201 -0
  48. package/dist/chunk-A5MNH4ER.js +79 -0
  49. package/dist/chunk-ADIVZ2D5.js +15 -0
  50. package/dist/chunk-AE3P3F6W.js +366 -0
  51. package/dist/chunk-AERM3VGP.js +280 -0
  52. package/dist/chunk-AEWHC4WM.js +246 -0
  53. package/dist/chunk-AOVQ7VIF.js +169 -0
  54. package/dist/chunk-AOYHP3WI.js +12411 -0
  55. package/dist/chunk-B3YEBABJ.js +7160 -0
  56. package/dist/chunk-BCQXEZPJ.js +154 -0
  57. package/dist/chunk-BKTQAYO2.js +418 -0
  58. package/dist/chunk-BSECIPAQ.js +80 -0
  59. package/dist/chunk-BUIMGNDD.js +52 -0
  60. package/dist/chunk-BXHV3GSB.js +10320 -0
  61. package/dist/chunk-C6ZVZCPP.js +139 -0
  62. package/dist/chunk-CEZNQVWM.js +82 -0
  63. package/dist/chunk-CGFZGR7G.js +1492 -0
  64. package/dist/chunk-CGOADM2X.js +337 -0
  65. package/dist/chunk-CI4R6P2B.js +24 -0
  66. package/dist/chunk-D2TCGRSX.js +73 -0
  67. package/dist/chunk-D4PTYFOG.js +154 -0
  68. package/dist/chunk-D54ZWG4T.js +717 -0
  69. package/dist/chunk-DEBI37QB.js +145 -0
  70. package/dist/chunk-DWROHPXP.js +1051 -0
  71. package/dist/chunk-DZ6UOJ5D.js +92 -0
  72. package/dist/chunk-EBJTVRQN.js +81 -0
  73. package/dist/chunk-EGEI2RQA.js +1167 -0
  74. package/dist/chunk-EHHUASO5.js +1305 -0
  75. package/dist/chunk-EPKTIOED.js +41 -0
  76. package/dist/chunk-ER5JW2QZ.js +5681 -0
  77. package/dist/chunk-ETHFACAB.js +315 -0
  78. package/dist/chunk-EXUE5W2F.js +112 -0
  79. package/dist/chunk-EXXICUIW.js +73 -0
  80. package/dist/chunk-FFQSZJOO.js +169 -0
  81. package/dist/chunk-FHFKPGDO.js +85 -0
  82. package/dist/chunk-FW3QKMFX.js +158 -0
  83. package/dist/chunk-GD4ZNZ7W.js +30 -0
  84. package/dist/chunk-GHVMWF2I.js +581 -0
  85. package/dist/chunk-GMKAXSYQ.js +297 -0
  86. package/dist/chunk-HBVF6BWO.js +325 -0
  87. package/dist/chunk-HV4YGVMS.js +379 -0
  88. package/dist/chunk-ILBCKAV6.js +89 -0
  89. package/dist/chunk-J4U4AW46.js +440 -0
  90. package/dist/chunk-J6ESSM47.js +1791 -0
  91. package/dist/chunk-JBZHIC6T.js +2309 -0
  92. package/dist/chunk-JCFWOULR.js +245 -0
  93. package/dist/chunk-JRF5L6OD.js +131 -0
  94. package/dist/chunk-JSS75KCG.js +2014 -0
  95. package/dist/chunk-JSXWIWWJ.js +225 -0
  96. package/dist/chunk-JYV7I2QH.js +98 -0
  97. package/dist/chunk-KIOXTQQL.js +1596 -0
  98. package/dist/chunk-KWVTXT5B.js +89 -0
  99. package/dist/chunk-KX22RD6R.js +33 -0
  100. package/dist/chunk-LA6IPTGH.js +709 -0
  101. package/dist/chunk-LH5VCGLB.js +1796 -0
  102. package/dist/chunk-LQQ6XJ2Y.js +269 -0
  103. package/dist/chunk-MJQ55WZZ.js +65 -0
  104. package/dist/chunk-ML3UKMH3.js +40 -0
  105. package/dist/chunk-MOZPLHSU.js +5526 -0
  106. package/dist/chunk-NGEWJ4DF.js +89 -0
  107. package/dist/chunk-NH6VIOAR.js +211 -0
  108. package/dist/chunk-O5VZQKCB.js +26106 -0
  109. package/dist/chunk-OHSV42QB.js +748 -0
  110. package/dist/chunk-OO3TAHO5.js +4070 -0
  111. package/dist/chunk-OTNHSAGN.js +38282 -0
  112. package/dist/chunk-OUWAC7AQ.js +442 -0
  113. package/dist/chunk-OXMIV4WE.js +270 -0
  114. package/dist/chunk-P5KJURUR.js +229 -0
  115. package/dist/chunk-P6GJOVO6.js +307 -0
  116. package/dist/chunk-QARAGUXX.js +23 -0
  117. package/dist/chunk-R43HJCDX.js +2711 -0
  118. package/dist/chunk-RAXBAWRN.js +210 -0
  119. package/dist/chunk-RK3JHWPT.js +39 -0
  120. package/dist/chunk-RWA23GMM.js +24 -0
  121. package/dist/chunk-S4K4L6IM.js +179 -0
  122. package/dist/chunk-SAXK6LVF.js +124 -0
  123. package/dist/chunk-SEPGEJNK.js +1607 -0
  124. package/dist/chunk-SUJERP5I.js +285 -0
  125. package/dist/chunk-T3ED6BY2.js +913 -0
  126. package/dist/chunk-THKDVSEC.js +90 -0
  127. package/dist/chunk-TI4GSEL5.js +52 -0
  128. package/dist/chunk-TPI73L57.js +164 -0
  129. package/dist/chunk-TVHW77C7.js +338 -0
  130. package/dist/chunk-TWNHOSDT.js +1073 -0
  131. package/dist/chunk-UFMN76QD.js +347 -0
  132. package/dist/chunk-UHGLFRZE.js +205 -0
  133. package/dist/chunk-UTZYPKBF.js +15231 -0
  134. package/dist/chunk-UXNLELW6.js +25 -0
  135. package/dist/chunk-UXXS53EA.js +166 -0
  136. package/dist/chunk-V5DHFGI7.js +171 -0
  137. package/dist/chunk-V5YIPMHV.js +2353 -0
  138. package/dist/chunk-WMUWEO2C.js +754 -0
  139. package/dist/chunk-WOE3D7JM.js +945 -0
  140. package/dist/chunk-X2IK5LVR.js +2592 -0
  141. package/dist/chunk-XU2YXCDL.js +459 -0
  142. package/dist/chunk-YJG5HIX5.js +203 -0
  143. package/dist/chunk-Z3QE7TZM.js +72 -0
  144. package/dist/chunk-Z5Z3JHJY.js +64 -0
  145. package/dist/chunk-ZDIFBJFT.js +168 -0
  146. package/dist/chunk-ZGGCEXDC.js +176 -0
  147. package/dist/chunk-ZMZCZNKU.js +263 -0
  148. package/dist/chunk-ZNC5T65N.js +17 -0
  149. package/dist/chunk-ZO3I3A7O.js +308 -0
  150. package/dist/chunk-ZQKXBUB7.js +217 -0
  151. package/dist/chunk-ZTRINFM2.js +78 -0
  152. package/dist/chunk-ZU7JZCVP.js +193 -0
  153. package/dist/chunk-ZZAWNALS.js +350 -0
  154. package/dist/cli/entry.js +54 -0
  155. package/dist/connector-L5QQTR6Y.js +26 -0
  156. package/dist/context-62DC6EC3.js +31 -0
  157. package/dist/council-convene-NJWPNBDU.js +46 -0
  158. package/dist/create-agent-config-ODSQWNVC.js +55 -0
  159. package/dist/default-registry-2PU3BTAU.js +68 -0
  160. package/dist/deliver-task-KONV4C4M.js +57 -0
  161. package/dist/delivery-gate-v2-F2YVMVGK.js +27 -0
  162. package/dist/domain-knowledge-store-DDZ3F4J7.js +11 -0
  163. package/dist/fetch-core-ZPPYDSZH.js +14 -0
  164. package/dist/galaxy-K72BBDQN.js +91 -0
  165. package/dist/goal-criteria-SCALAU2D.js +141 -0
  166. package/dist/goal-persist-XWY2GDQX.js +19 -0
  167. package/dist/goal-tracker-FXMJ2GVK.js +11 -0
  168. package/dist/headless-LSB6I7PT.js +162 -0
  169. package/dist/headless-coordinator-VDPDMVUT.js +90 -0
  170. package/dist/inject-U55SMB6A.js +39 -0
  171. package/dist/login-flow-CD4ZGXOC.js +59 -0
  172. package/dist/logs-cli-SQVYFMMN.js +283 -0
  173. package/dist/loop-ULZYBDA3.js +76 -0
  174. package/dist/main.js +4064 -0
  175. package/dist/manager-ROZBCWPA.js +171 -0
  176. package/dist/manager-Z7XFFUOM.js +10670 -0
  177. package/dist/meridian-indexer-ZIW363L7.js +21 -0
  178. package/dist/native-resolver-PN34UIVV.js +13 -0
  179. package/dist/node_modules/better-sqlite3/lib/database.js +90 -0
  180. package/dist/node_modules/better-sqlite3/lib/index.js +3 -0
  181. package/dist/node_modules/better-sqlite3/lib/methods/aggregate.js +43 -0
  182. package/dist/node_modules/better-sqlite3/lib/methods/backup.js +67 -0
  183. package/dist/node_modules/better-sqlite3/lib/methods/function.js +31 -0
  184. package/dist/node_modules/better-sqlite3/lib/methods/inspect.js +7 -0
  185. package/dist/node_modules/better-sqlite3/lib/methods/pragma.js +12 -0
  186. package/dist/node_modules/better-sqlite3/lib/methods/serialize.js +16 -0
  187. package/dist/node_modules/better-sqlite3/lib/methods/table.js +189 -0
  188. package/dist/node_modules/better-sqlite3/lib/methods/transaction.js +78 -0
  189. package/dist/node_modules/better-sqlite3/lib/methods/wrappers.js +54 -0
  190. package/dist/node_modules/better-sqlite3/lib/sqlite-error.js +20 -0
  191. package/dist/node_modules/better-sqlite3/lib/util.js +12 -0
  192. package/dist/node_modules/better-sqlite3/package.json +59 -0
  193. package/dist/ownership-ledger-E3WIEKPL.js +9 -0
  194. package/dist/package.json +3 -0
  195. package/dist/path-grants-XRRXHXG7.js +40 -0
  196. package/dist/paths-LVV5IMQN.js +49 -0
  197. package/dist/plan-fact-anchors-LMVQZCW5.js +13 -0
  198. package/dist/plan-store-ODLTTPFB.js +17 -0
  199. package/dist/plan-templates-5FPFBOL6.js +109 -0
  200. package/dist/plugin-loader-ZZKX7ZE6.js +22 -0
  201. package/dist/prefix-budget-62OV5HQC.js +13 -0
  202. package/dist/project-trust-5WS5MOMU.js +31 -0
  203. package/dist/provider-cli-ALDQXIT7.js +37 -0
  204. package/dist/providers-XQYTAVPK.js +11 -0
  205. package/dist/proxy-resolver-V2Y6534D.js +15 -0
  206. package/dist/recovery-cli-KPGY6FY3.js +106 -0
  207. package/dist/review-discipline-MNSYCST5.js +55 -0
  208. package/dist/review-router-BVQZW3MX.js +18 -0
  209. package/dist/seed-capsules/seed-capsule-attack-methodology.md +62 -0
  210. package/dist/seed-capsules/seed-capsule-changgeng.md +31 -0
  211. package/dist/seed-capsules/seed-capsule-design-aesthetics.md +38 -0
  212. package/dist/seed-capsules/seed-capsule-diagnostic-ladder.md +54 -0
  213. package/dist/seed-capsules/seed-capsule-fu.md +39 -0
  214. package/dist/seed-capsules/seed-capsule-huagai.md +73 -0
  215. package/dist/seed-capsules/seed-capsule-kaiyang.md +65 -0
  216. package/dist/seed-capsules/seed-capsule-knowledge-work.md +40 -0
  217. package/dist/seed-capsules/seed-capsule-tanlang.md +47 -0
  218. package/dist/seed-capsules/seed-capsule-tianfu.md +23 -0
  219. package/dist/seed-capsules/seed-capsule-tianliang.md +63 -0
  220. package/dist/seed-capsules/seed-capsule-tianquan.md +32 -0
  221. package/dist/seed-capsules/seed-capsule-tianxuan-ccr.md +22 -0
  222. package/dist/seed-capsules/seed-capsule-tianxuan.md +64 -0
  223. package/dist/seed-capsules/seed-capsule-yaoguang.md +87 -0
  224. package/dist/serve-X2R2UTLF.js +170 -0
  225. package/dist/serve-agent-KHSU6RVV.js +965 -0
  226. package/dist/session-persist-HUUC772H.js +37 -0
  227. package/dist/session-registry-6XUD5C4Y.js +15 -0
  228. package/dist/skill-loader-CK3RMO47.js +48 -0
  229. package/dist/skills/cli-harness-sop.md +207 -0
  230. package/dist/spawn-git-4HFU65AH.js +29 -0
  231. package/dist/sse-EYUTBWUK.js +512 -0
  232. package/dist/starflow-NOFBMPFU.js +30 -0
  233. package/dist/streamableHttp-V67CNJMO.js +447 -0
  234. package/dist/task-contract-6XHBNJQK.js +32 -0
  235. package/dist/task-ledger-3K4TJIER.js +9 -0
  236. package/dist/team-orchestrate-S6NHZP7X.js +64 -0
  237. package/dist/title-extract-QX4XGCYN.js +50 -0
  238. package/dist/todo-QDXGRZZP.js +31 -0
  239. package/dist/todo-store-V3TTO5AH.js +12 -0
  240. package/dist/tool-preset-LU5BYEDZ.js +23 -0
  241. package/dist/tool-tiers-GD742YBN.js +23 -0
  242. package/dist/turndown.es-OI55K6C3.js +17373 -0
  243. package/dist/verification-attribution-EKG4CNUV.js +13 -0
  244. package/dist/volatile-git-MBTST7RA.js +15 -0
  245. package/dist/wave-checkpoint-XLIIHXQA.js +30 -0
  246. package/dist/web-cli-DUG4I35O.js +233 -0
  247. package/dist/web-search-3IK542AA.js +34 -0
  248. package/dist/workers/cpu-worker.js +45 -0
  249. package/dist/workflow-runner-HX7UBAYG.js +297 -0
  250. package/dist/worktree-baseline-O5NCU6M2.js +9 -0
  251. package/package.json +122 -0
  252. package/scripts/check-mobile-env.mjs +76 -0
  253. package/scripts/fetch-native-sqlite.js +392 -0
  254. package/scripts/prune-installed-wasms.js +45 -0
  255. package/scripts/tree-sitter-wasm-keep.js +40 -0
@@ -0,0 +1,945 @@
1
+ #!/usr/bin/env -S node --expose-gc --max-old-space-size=4096
2
+ import { createRequire as __rivetCreateRequire } from 'node:module'; const require = __rivetCreateRequire(import.meta.url);
3
+ import {
4
+ classifyProfile,
5
+ deriveStableWorkOrderId
6
+ } from "./chunk-B3YEBABJ.js";
7
+ import {
8
+ buildGalaxyBudgetInputs,
9
+ isReviewGalaxyDimension,
10
+ mapGalaxyDimensionToKind,
11
+ mapGalaxyDimensionToProfile,
12
+ mapGalaxyDimensionToTaskShape,
13
+ validateGalaxyDimensionContract
14
+ } from "./chunk-ZDIFBJFT.js";
15
+ import {
16
+ createActivityStreamer,
17
+ createDelegationActivityMapper,
18
+ terminalActivity
19
+ } from "./chunk-AERM3VGP.js";
20
+ import {
21
+ resolvePlanConstraints
22
+ } from "./chunk-UHGLFRZE.js";
23
+ import {
24
+ aggregationPolicyKinds,
25
+ aggregationPolicySchema
26
+ } from "./chunk-4QJ3Y5JM.js";
27
+ import {
28
+ starDomainRegistry
29
+ } from "./chunk-CGOADM2X.js";
30
+ import {
31
+ validatePathSafe
32
+ } from "./chunk-7RDOV3DF.js";
33
+ import {
34
+ delegationToolTimeoutMs,
35
+ profileCanEditFiles,
36
+ profileIsWriteCapable,
37
+ profileRegistry
38
+ } from "./chunk-6HSVXHCZ.js";
39
+ import {
40
+ external_exports
41
+ } from "./chunk-OO3TAHO5.js";
42
+ import {
43
+ init_esm_shims
44
+ } from "./chunk-5GGOGLSN.js";
45
+
46
+ // src/tools/galaxy.ts
47
+ init_esm_shims();
48
+
49
+ // src/agent/worker-result-digest.ts
50
+ init_esm_shims();
51
+ function digestHonesty(failureReason, evidenceStatus) {
52
+ switch (failureReason) {
53
+ case "max_turns":
54
+ return "\u9884\u7B97\u8017\u5C3D \xB7 \u6458\u8981\u53EF\u80FD\u4E0D\u5B8C\u6574";
55
+ case "stalled":
56
+ return "\u7A7A\u8DD1 \xB7 \u9884\u7B97\u8017\u5C3D\u5374\u51E0\u4E4E\u65E0\u5DE5\u5177\u8C03\u7528\uFF08\u7EAF\u63A8\u7406\u7A7A\u8F6C\uFF09";
57
+ case "json_parse":
58
+ return "\u7ED3\u679C\u89E3\u6790\u5931\u8D25 \xB7 \u5DF2\u4ECE\u788E\u7247\u6062\u590D";
59
+ case "worker_crash":
60
+ return "Worker \u5F02\u5E38\u7EC8\u6B62";
61
+ case "timeout":
62
+ return "Worker \u8D85\u65F6";
63
+ case "caller_aborted":
64
+ return "\u5DF2\u88AB\u53D6\u6D88";
65
+ case "worker_blocked":
66
+ return "Worker \u88AB\u963B\u65AD";
67
+ case "circuit_open":
68
+ return "\u7194\u65AD\u5F00\u542F \xB7 \u5DF2\u9000\u907F";
69
+ case "claim_conflict":
70
+ return "\u6587\u4EF6\u5F52\u5C5E\u51B2\u7A81 \xB7 \u5DF2\u964D\u7EA7";
71
+ case "schema_mismatch":
72
+ return "\u7ED3\u679C\u5F62\u72B6\u4E0D\u7B26 \xB7 \u5DF2\u964D\u7EA7";
73
+ case "policy_short_circuit":
74
+ return "\u7B56\u7565\u77ED\u8DEF";
75
+ case "unknown":
76
+ return "\u5931\u8D25\u539F\u56E0\u672A\u5F52\u7C7B";
77
+ default:
78
+ break;
79
+ }
80
+ if (evidenceStatus === "failed") return "\u9A8C\u6536\u8BC1\u636E\u9A8C\u8BC1\u5931\u8D25";
81
+ return null;
82
+ }
83
+ function formatWorkerResultDigest(r) {
84
+ const ok = r.status === "passed";
85
+ const glyph = ok ? "\u2713" : r.status === "blocked" ? "\u2297" : r.status === "escalated" ? "\u2191" : "\u2717";
86
+ const summary = r.summary.replace(/\s+/g, " ").trim();
87
+ const parts = [`${glyph} ${summary}`];
88
+ if (r.findingsCount > 0) parts.push(`${r.findingsCount} \u6761\u53D1\u73B0`);
89
+ if (r.changedFilesCount > 0) parts.push(`${r.changedFilesCount} \u4E2A\u6587\u4EF6`);
90
+ if (r.sourcesReviewedCount !== void 0 && r.sourcesReviewedCount > 0) parts.push(`${r.sourcesReviewedCount} \u4E2A\u6765\u6E90`);
91
+ const honesty = digestHonesty(r.failureReason, r.evidenceStatus);
92
+ if (honesty) parts.push(`\u26A0 ${honesty}`);
93
+ if (r.salvagedFindingsCount !== void 0 && r.salvagedFindingsCount > 0) {
94
+ parts.push(`\u26A0 ${r.salvagedFindingsCount} \u6761\u6253\u635E\u53D1\u73B0\u672A\u7ECF\u6838\u5B9E\uFF08\u5F15\u7528\u53EF\u80FD\u4E3A\u5E7B\u89C9\uFF09`);
95
+ }
96
+ return parts.join(" \xB7 ");
97
+ }
98
+
99
+ // src/tools/delegate-budget.ts
100
+ init_esm_shims();
101
+ var MIN_DELEGATE_MAX_TURNS = 2;
102
+ var MAX_DELEGATE_MAX_TURNS = 100;
103
+ var MIN_DELEGATE_TIMEOUT_MS = 3e4;
104
+ var MAX_DELEGATE_TIMEOUT_MS = 27e5;
105
+ var delegateMaxTurnsSchema = external_exports.number().int().min(MIN_DELEGATE_MAX_TURNS).max(MAX_DELEGATE_MAX_TURNS).optional();
106
+ var delegateTimeoutMsSchema = external_exports.number().int().min(MIN_DELEGATE_TIMEOUT_MS).max(MAX_DELEGATE_TIMEOUT_MS).optional();
107
+ var MAX_TURNS_TOOL_DESCRIPTION = `\u53EF\u9009\uFF0C\u672C\u6B21\u6D3E\u53D1\u7684\u8F6E\u6B21\u9884\u7B97\uFF08${MIN_DELEGATE_MAX_TURNS}-${MAX_DELEGATE_MAX_TURNS}\uFF09\u3002\u9ED8\u8BA4\u6309 profile \u8D70\uFF08\u53EA\u8BFB 24 / \u5199\u5DE5 48\uFF09\u3002\u67E5\u4E00\u4E2A\u5177\u4F53\u4F4D\u7F6E\u7ED9 6-10 \u5C31\u591F\uFF0C\u626B\u4E00\u904D\u6A21\u5757\u7ED9 40+\u3002\u9884\u7B97\u8017\u5C3D\u4F1A\u81EA\u52A8\u7EED\u8DD1\uFF0C\u4F46\u7EED\u8DD1\u8981\u91CD\u65B0\u76D8\u70B9\u4E0A\u4E0B\u6587\uFF0C\u4E00\u6B21\u7ED9\u591F\u66F4\u5212\u7B97\u3002`;
108
+ var TIMEOUT_MS_TOOL_DESCRIPTION = `\u53EF\u9009\uFF0C\u672C\u6B21\u6D3E\u53D1\u7684\u65F6\u95F4\u9884\u7B97\uFF08\u6BEB\u79D2\uFF0C${MIN_DELEGATE_TIMEOUT_MS}-${MAX_DELEGATE_TIMEOUT_MS}\uFF09\u3002\u9ED8\u8BA4\u6309 profile \u8D70\u3002\u5916\u5C42\u5DE5\u5177\u8D85\u65F6\u4F1A\u8DDF\u7740\u653E\u5BBD\uFF0C\u4E0D\u5FC5\u989D\u5916\u64CD\u5FC3\u3002`;
109
+ function toBudgetOverride(input) {
110
+ if (input.maxTurns === void 0 && input.timeoutMs === void 0) return void 0;
111
+ return {
112
+ ...input.maxTurns !== void 0 ? { maxTurns: input.maxTurns } : {},
113
+ ...input.timeoutMs !== void 0 ? { timeoutMs: input.timeoutMs } : {}
114
+ };
115
+ }
116
+
117
+ // src/tools/galaxy.ts
118
+ var profileStringSchema = external_exports.string().refine(
119
+ (val) => profileRegistry.getProfileNames().includes(val),
120
+ (val) => ({ message: `\u672A\u77E5 profile "${val}"\u3002\u53EF\u7528\uFF1A${profileRegistry.getProfileNames().join(", ")}` })
121
+ );
122
+ var authorityStringSchema = external_exports.string().refine(
123
+ (val) => val === "" || starDomainRegistry.get(val) !== void 0,
124
+ (val) => ({ message: `\u672A\u77E5\u661F\u57DF "${val}"\u3002\u53EF\u7528\uFF1A${starDomainRegistry.getDomainIds().join(", ")}` })
125
+ );
126
+ var parallelismSchema = external_exports.enum(["expert", "data"]);
127
+ var dimensionSchema = external_exports.object({
128
+ name: external_exports.string().min(1).describe("\u7EF4\u5EA6\u6807\u8BC6\uFF08\u5982 frontend / backend / review / test / docs\uFF09"),
129
+ objective: external_exports.string().min(1).describe("\u8BE5\u7EF4\u5EA6\u7684\u5177\u4F53\u6267\u884C\u76EE\u6807"),
130
+ constraints: external_exports.array(external_exports.string()).max(12).optional().describe(
131
+ "\u8BE5\u7EF4\u5EA6\u5FC5\u987B\u9075\u5B88\u7684\u4EFB\u52A1\u7EA7\u7EA6\u675F\uFF1A\u8BA1\u5212\u91CC\u7684\u53CD\u76EE\u6807\u3001\u5F85\u9A8C\u8BC1\u5047\u8BBE\u3001\u4E0D\u8BB8\u52A8\u7684\u4E1C\u897F\u3002**\u9010\u5B57\u6284\u5199\u539F\u6587\uFF0C\u4E0D\u8981\u8F6C\u8FF0**\u2014\u2014\u8F6C\u8FF0\u4F1A\u4E22\u6389\u7EA6\u675F\u7684\u5224\u636E\uFF08\u66FE\u628A\u300C\u52A0\u7248\u672C\u5B88\u536B\u53EA\u8DD1\u4E00\u6B21\u300D\u538B\u7F29\u6210\u300C\u5E42\u7B49\u300D\uFF0C\u6267\u884C\u65B9\u636E\u6B64\u5B9E\u73B0\u6210\u6BCF\u6B21\u5F00\u5E93\u90FD\u8DD1\uFF0C\u5220\u6389\u4E86\u771F\u5B9E\u6570\u636E\uFF09\u3002worker \u770B\u4E0D\u5230\u8BA1\u5212\u6587\u6863\uFF0C\u8FD9\u662F\u552F\u4E00\u7684\u9001\u8FBE\u901A\u9053\u3002"
132
+ ),
133
+ authority: authorityStringSchema.optional().describe("\u8BE5\u7EF4\u5EA6\u4F7F\u7528\u7684\u661F\u57DF\uFF08\u5355\u661F\u57DF\uFF0C\u4E0E authorities \u4E8C\u9009\u4E00\uFF09"),
134
+ authorities: external_exports.array(authorityStringSchema).min(2).max(5).optional().describe(
135
+ "\u8BE5\u7EF4\u5EA6\u4F7F\u7528\u7684\u591A\u4E2A\u661F\u57DF\uFF0C\u5206\u522B\u7ED9\u51FA\u72EC\u7ACB\u7684\u53EA\u8BFB\u89C6\u89D2\uFF1B\u5B83\u4EEC\u4E0D\u5171\u4EAB\u5B9E\u65F6\u4E0A\u4E0B\u6587\uFF0C\u4E5F\u4E0D\u80FD\u7528\u4E8E\u5E76\u884C\u5199\u5165\u3002\u4E0E authority \u4E8C\u9009\u4E00\u3002"
136
+ ),
137
+ parallelism: parallelismSchema.default("expert").describe(
138
+ "expert\uFF1A\u6309\u4E13\u957F\u6D3E\u53D1\u5355\u4E2A\u5206\u7247\uFF08\u9ED8\u8BA4\uFF09\uFF1Bdata\uFF1A\u628A\u540C\u4E00\u53EA\u8BFB\u4EFB\u52A1\u590D\u5236\u7ED9\u591A\u4E2A\u72EC\u7ACB\u526F\u672C\u3002"
139
+ ),
140
+ replicas: external_exports.number().int().min(2).max(5).optional().describe(
141
+ "\u4EC5 parallelism=data \u65F6\u5FC5\u586B\uFF0C\u8868\u793A\u72EC\u7ACB\u53EA\u8BFB\u526F\u672C\u6570\u91CF\uFF082\u20135\uFF09\u3002"
142
+ ),
143
+ profile: profileStringSchema.optional().describe("worker profile\u3002\u7701\u7565\u65F6\u6309\u7EF4\u5EA6\u540D\u63A8\u5BFC\uFF1Areview \u2192 reviewer\uFF0Cverify \u2192 verify_scout\uFF08\u53EA\u8BFB+run_tests\uFF09\uFF0Cplan \u2192 planner\uFF0Cdocs/research \u2192 doc_scout\uFF0C\u5176\u4F59\uFF08\u542B\u5B9E\u73B0\u7C7B\uFF09\u2192 patcher"),
144
+ tierFloor: external_exports.enum(["cheap", "balanced", "strong"]).optional().describe(
145
+ "\u6A21\u578B\u6863\u4F4D\u786C\u5730\u677F\uFF08\u7476\u5149\u95E8\uFF09\uFF1A\u58F0\u660E\u540E\u8DEF\u7531\u53EA\u62AC\u4E0D\u964D\u3002\u5BA1\u67E5/\u9A8C\u8BC1\u7EF4\u5EA6\u5EFA\u8BAE strong\uFF0C\u5B9E\u73B0\u7EF4\u5EA6\u6309\u9700\u3002"
146
+ ),
147
+ files: external_exports.array(external_exports.string()).optional(),
148
+ symbols: external_exports.array(external_exports.string()).optional(),
149
+ maxTurns: delegateMaxTurnsSchema,
150
+ timeoutMs: delegateTimeoutMsSchema,
151
+ modelOverride: external_exports.object({
152
+ provider: external_exports.string(),
153
+ model: external_exports.string()
154
+ }).optional().describe("\u4E3A\u8BE5\u7EF4\u5EA6\u6307\u5B9A\u4E13\u7528\u6A21\u578B\uFF08\u5982\u5BA1\u67E5\u7528\u5F3A\u6A21\u578B\u3001\u5B9E\u73B0\u7528\u5FEB\u6A21\u578B\uFF09")
155
+ }).refine(
156
+ (d) => d.authority !== void 0 && d.authority !== "" || d.authorities !== void 0 && d.authorities.length > 0,
157
+ { message: "\u6BCF\u4E2A\u7EF4\u5EA6\u5FC5\u987B\u6307\u5B9A authority \u6216 authorities\uFF08\u81F3\u5C11\u4E00\u4E2A\uFF09" }
158
+ );
159
+ var galaxyInputSchema = external_exports.object({
160
+ objective: external_exports.string().min(1).describe("\u96C6\u7FA4\u603B\u76EE\u6807\u2014\u2014\u8981\u89E3\u51B3\u7684\u5B8C\u6574\u4EFB\u52A1\u63CF\u8FF0"),
161
+ dimensions: external_exports.array(dimensionSchema).min(2).max(5).describe(
162
+ "\u81F3\u5C11 2 \u4E2A\u7EF4\u5EA6\uFF0C\u6700\u591A 5 \u4E2A\u3002\u6BCF\u4E2A\u7EF4\u5EA6\u7531\u6307\u5B9A\u661F\u57DF\u7684\u5206\u5B50 Agent \u72EC\u7ACB\u6267\u884C\u3002"
163
+ ),
164
+ autoReview: external_exports.boolean().default(true).describe(
165
+ "\u6267\u884C\u5B8C\u6210\u540E\u81EA\u52A8\u8FFD\u52A0\u5BA1\u67E5\u7EF4\u5EA6\uFF08\u7476\u5149\u5BA1\u67E5\u8005\uFF09\u3002\u9ED8\u8BA4\u5F00\u542F\u3002"
166
+ ),
167
+ confirm: external_exports.boolean().default(false).describe(
168
+ "\u7528\u6237\u5DF2\u786E\u8BA4\u96C6\u7FA4\u65B9\u6848\u3002\u9996\u6B21\u8C03\u7528\u4E0D\u5E26\u6B64\u53C2\u6570\u4EE5\u5C55\u793A\u65B9\u6848\u5E76\u8BF7\u6C42\u786E\u8BA4\u3002"
169
+ ),
170
+ policy: aggregationPolicySchema.optional().describe("\u805A\u5408\u7B56\u7565\u3002\u9ED8\u8BA4\uFF1Aall_required\u3002"),
171
+ /** D8 L2:计划文件路径——让维度 worker 自动继承计划的反目标与待验证假设。
172
+ * 解析不到就是空,不报错不拦截。 */
173
+ planPath: external_exports.string().optional().describe(
174
+ "\u53EF\u9009\uFF0C\u8BA1\u5212\u6587\u4EF6\u8DEF\u5F84\u3002\u7EF4\u5EA6 worker \u4F1A\u81EA\u52A8\u7EE7\u627F\u8BE5\u8BA1\u5212\u7684\u53CD\u76EE\u6807\u4E0E\u5F85\u9A8C\u8BC1\u5047\u8BBE\u3002"
175
+ )
176
+ });
177
+ function mapDimensionToKind(name) {
178
+ return mapGalaxyDimensionToKind(name);
179
+ }
180
+ function galaxyWorkerParentTurnId(toolUseId, dimensionIndex, authorityIndex, replicaIndex) {
181
+ const lastSegment = replicaIndex === void 0 ? `${authorityIndex}` : `${authorityIndex}r${replicaIndex}`;
182
+ return `batch:${toolUseId}-galaxy-${dimensionIndex}:${lastSegment}`;
183
+ }
184
+ function workerOrderId(parentTurnId) {
185
+ return deriveStableWorkOrderId(parentTurnId) ?? parentTurnId;
186
+ }
187
+ var GALAXY_GLYPH = "\u{1F30C}";
188
+ function normalizeTaskShape(name) {
189
+ return mapGalaxyDimensionToTaskShape(name);
190
+ }
191
+ function buildRoutingStats(store, dimensions) {
192
+ const out = [];
193
+ for (const d of dimensions) {
194
+ const taskShape = normalizeTaskShape(d.name);
195
+ const records = store.recallGalaxyRouting(taskShape);
196
+ if (records.length === 0) continue;
197
+ const byKey = /* @__PURE__ */ new Map();
198
+ for (const r of records) {
199
+ const key = `${r.authority}\0${r.model ?? ""}`;
200
+ const list = byKey.get(key);
201
+ if (list) list.push(r);
202
+ else byKey.set(key, [r]);
203
+ }
204
+ for (const [key, rs] of byKey) {
205
+ const [authority, model] = key.split("\0");
206
+ const passed = rs.filter((r) => r.status === "passed").length;
207
+ const totalCost = rs.reduce((acc, r) => acc + (r.costTokens ?? 0), 0);
208
+ out.push({
209
+ dimensionName: d.name,
210
+ taskShape,
211
+ authority,
212
+ model,
213
+ passed,
214
+ total: rs.length,
215
+ passRate: String(Math.round(passed / rs.length * 100)),
216
+ ...passed > 0 && totalCost > 0 ? { costPerPass: Math.round(totalCost / passed) } : {}
217
+ });
218
+ }
219
+ }
220
+ return out;
221
+ }
222
+ function dimensionIsWriteCapable(dim) {
223
+ return profileCanEditFiles(dim.profile ?? mapGalaxyDimensionToProfile(dim.name));
224
+ }
225
+ function analyzeWriteDimensionPlan(dimensions) {
226
+ const issues = [];
227
+ const fileOwner = /* @__PURE__ */ new Map();
228
+ for (let i = 0; i < dimensions.length; i++) {
229
+ const dim = dimensions[i];
230
+ if (!dimensionIsWriteCapable(dim)) continue;
231
+ for (const f of dim.files ?? []) {
232
+ if (!fileOwner.has(f)) fileOwner.set(f, i);
233
+ }
234
+ }
235
+ for (let i = 0; i < dimensions.length; i++) {
236
+ const dim = dimensions[i];
237
+ if (!dimensionIsWriteCapable(dim)) continue;
238
+ const owned = dim.files ?? [];
239
+ const overlaps = [];
240
+ let kept = 0;
241
+ for (const f of owned) {
242
+ const owner = fileOwner.get(f);
243
+ if (owner === void 0 || owner === i) {
244
+ kept++;
245
+ continue;
246
+ }
247
+ overlaps.push(f);
248
+ }
249
+ if (overlaps.length > 0) {
250
+ issues.push({ dimensionIndex: i, dimensionName: dim.name, files: overlaps, kind: "overlap" });
251
+ }
252
+ if (owned.length > 0 && kept === 0) {
253
+ issues.push({ dimensionIndex: i, dimensionName: dim.name, files: owned, kind: "emptied" });
254
+ }
255
+ }
256
+ return issues;
257
+ }
258
+ function formatPlanPrecheck(issues) {
259
+ if (issues.length === 0) {
260
+ return ["", "\u2500\u2500 \u9759\u6001\u9884\u68C0 \u2500\u2500", "\u2713 \u5199\u7EF4\u5EA6\u6587\u4EF6\u8303\u56F4\u65E0\u91CD\u53E0\u3001\u65E0\u8986\u76D6\u7F3A\u53E3\u3002"].join("\n");
261
+ }
262
+ const lines = ["", "\u2500\u2500 \u9759\u6001\u9884\u68C0\uFF08\u6267\u884C\u524D\u4FEE\u6B63\uFF0C\u907F\u514D\u6D3E\u53D1\u540E\u8FD4\u5DE5\uFF09\u2500\u2500"];
263
+ for (const issue of issues) {
264
+ if (issue.kind === "overlap") {
265
+ lines.push(`\u26A0 \u7EF4\u5EA6\u300C${issue.dimensionName}\u300D\u7684\u6587\u4EF6\u4E0E\u66F4\u65E9\u7684\u5199\u7EF4\u5EA6\u91CD\u53E0\uFF0C\u6267\u884C\u65F6\u5C06\u88AB\u5265\u79BB\uFF1A${issue.files.join(", ")}`);
266
+ } else if (isReviewGalaxyDimension(issue.dimensionName)) {
267
+ lines.push(`\u26A0 \u7EF4\u5EA6\u300C${issue.dimensionName}\u300D\u662F\u5BA1\u67E5\u65CF\uFF0C\u58F0\u660E\u7684\u6587\u4EF6\u5168\u90E8\u88AB\u5176\u4ED6\u5199\u7EF4\u5EA6\u8BA4\u9886\uFF0C\u6267\u884C\u65F6\u5C06\u964D\u7EA7\u4E3A\u53EA\u8BFB\u9A8C\u8BC1\u7EE7\u7EED\u6D3E\u53D1\uFF1A${issue.files.join(", ")}`);
268
+ } else {
269
+ lines.push(`\u26A0 \u7EF4\u5EA6\u300C${issue.dimensionName}\u300D\u58F0\u660E\u7684\u6587\u4EF6\u5168\u90E8\u88AB\u5176\u4ED6\u5199\u7EF4\u5EA6\u8BA4\u9886\uFF0C\u6D3E\u53D1\u65F6\u5C06\u88AB\u8DF3\u8FC7\uFF1A${issue.files.join(", ")}`);
270
+ }
271
+ }
272
+ lines.push("\u8BF7\u8C03\u6574\u7EF4\u5EA6\u5212\u5206\uFF1A\u5199\u7EF4\u5EA6\u6587\u4EF6\u8303\u56F4\u5FC5\u987B\u4E92\u4E0D\u91CD\u53E0\u3002");
273
+ return lines.join("\n");
274
+ }
275
+ function formatGalaxyProposal(objective, dimensions, autoReview, routingStats) {
276
+ const lines = [
277
+ `${GALAXY_GLYPH} \u661F\u6CB3\u96C6\u7FA4\u65B9\u6848`,
278
+ "",
279
+ `\u76EE\u6807\uFF1A${objective}`,
280
+ "",
281
+ `\u5206\u5B50 Agent \u7EC4\u6210\uFF08${dimensions.length} \u4E2A\u7EF4\u5EA6${autoReview && !dimensions.some((d) => isReviewGalaxyDimension(d.name)) ? " + 1 \u81EA\u52A8\u5BA1\u67E5" : ""}\uFF09\uFF1A`
282
+ ];
283
+ for (let i = 0; i < dimensions.length; i++) {
284
+ const d = dimensions[i];
285
+ const stars = d.authorities ?? (d.authority ? [d.authority] : []);
286
+ const starLabels = stars.map((s) => {
287
+ const star = starDomainRegistry.get(s);
288
+ return star ? `${star.name}` : s;
289
+ });
290
+ const parallelTag = d.parallelism === "data" ? ` DP \xD7 ${d.replicas ?? "?"}` : " EP";
291
+ const roomTag = stars.length > 1 ? ` \u25CC \u591A\u89C6\u89D2\uFF08${starLabels.join(" + ")}\uFF09` : ` \u2014 ${starLabels[0]}`;
292
+ lines.push(` ${i + 1}. ${d.name}${parallelTag}${roomTag}`);
293
+ lines.push(` ${d.objective}`);
294
+ }
295
+ if (autoReview && !dimensions.some((d) => isReviewGalaxyDimension(d.name))) {
296
+ const yaoguang = starDomainRegistry.get("yaoguang");
297
+ const label = yaoguang ? `\u7476\u5149\uFF08${yaoguang.motto.slice(0, 12)}\u2026\uFF09` : "\u7476\u5149";
298
+ lines.push(` ${dimensions.length + 1}. review \u2014 ${label}`);
299
+ lines.push(` \u5BA1\u67E5\u4EE5\u4E0A\u6240\u6709\u7EF4\u5EA6\u7684\u8F93\u51FA\uFF0C\u9A8C\u8BC1\u6B63\u786E\u6027\u3001\u5B8C\u6574\u6027\u548C\u5B89\u5168\u6027`);
300
+ }
301
+ if (routingStats && routingStats.length > 0) {
302
+ lines.push("", "\u5386\u53F2\u8DEF\u7531\uFF08\u540C\u4EFB\u52A1\u5F62\u72B6 \xB7 authority \xD7 \u6A21\u578B\uFF1A\u80DC\u7387 / \u6BCF\u901A\u8FC7\u6210\u672C\uFF09\uFF1A");
303
+ for (const r of routingStats) {
304
+ const cost = r.costPerPass !== void 0 ? ` \xB7 \u6BCF\u901A\u8FC7 ~${(r.costPerPass / 1e3).toFixed(1)}k tokens` : "";
305
+ lines.push(` ${r.authority} @ ${r.dimensionName}${r.model ? ` \xB7 ${r.model}` : " \xB7 \u9ED8\u8BA4"}: ${r.passed}/${r.total} \u901A\u8FC7\uFF08${r.passRate}%\uFF09${cost}`);
306
+ }
307
+ }
308
+ lines.push("");
309
+ lines.push("\u8C03\u7528 galaxy({..., confirm: true}) \u786E\u8BA4\u5E76\u6267\u884C\u3002");
310
+ return lines.join("\n");
311
+ }
312
+ function quorumOriginalPassed(risks) {
313
+ for (const r of risks) {
314
+ const m = /^quorum: group .* not reached — (\d+)\/\d+ passed/.exec(r);
315
+ if (m) return Number(m[1]);
316
+ }
317
+ return void 0;
318
+ }
319
+ function quorumPassedCount(group, resultsById) {
320
+ const replicaResults = group.workOrderIds.map((id) => resultsById.get(id)).filter((r) => r !== void 0);
321
+ let passed = replicaResults.filter((r) => r.status === "passed").length;
322
+ for (const r of replicaResults) {
323
+ const original = quorumOriginalPassed(r.risks);
324
+ if (original !== void 0) {
325
+ passed = original;
326
+ break;
327
+ }
328
+ }
329
+ return passed;
330
+ }
331
+ function checkDpQuorum(dataParallelGroups, resultsById) {
332
+ const failed = [];
333
+ for (const group of dataParallelGroups) {
334
+ if (quorumPassedCount(group, resultsById) < group.quorumK) failed.push(group.label);
335
+ }
336
+ return failed;
337
+ }
338
+ function formatGalaxyResult(run, targets, dataParallelGroups, strippedFiles = [], emptiedDims = [], downgradedReviewDims = []) {
339
+ const passed = run.results.filter((r) => r.status === "passed").length;
340
+ const total = run.results.length;
341
+ const lines = [
342
+ `${GALAXY_GLYPH} \u661F\u6CB3\u96C6\u7FA4\u6267\u884C\u62A5\u544A \xB7 ${passed}/${total} \u901A\u8FC7`,
343
+ ""
344
+ ];
345
+ const actualModelById = new Map((run.workerModels ?? []).map((w) => [w.workOrderId, w.model]));
346
+ const resultsById = new Map(run.results.map((result) => [result.workOrderId, result]));
347
+ const unmatched = [...run.results];
348
+ for (const target of targets) {
349
+ const r = resultsById.get(target.workOrderId) ?? unmatched.shift();
350
+ if (!r) continue;
351
+ const matchedIndex = unmatched.indexOf(r);
352
+ if (matchedIndex >= 0) unmatched.splice(matchedIndex, 1);
353
+ const digest = formatWorkerResultDigest({
354
+ status: r.status,
355
+ summary: r.summary,
356
+ findingsCount: r.findings?.length ?? 0,
357
+ changedFilesCount: r.changedFiles?.length ?? 0,
358
+ sourcesReviewedCount: r.sourcesReviewed,
359
+ failureReason: r.failureReason,
360
+ evidenceStatus: r.evidenceStatus,
361
+ salvagedFindingsCount: r.findings?.filter((f) => f.salvaged === true).length ?? 0
362
+ });
363
+ const actualModel = actualModelById.get(target.workOrderId) ?? r.model;
364
+ const fallbackNote = target.requestedModel && actualModel && actualModel !== target.requestedModel ? ` \u26A0 \u6A21\u578B\u56DE\u9000\uFF1A\u8BF7\u6C42 ${target.requestedModel} \u2192 \u5B9E\u9645 ${actualModel}` : "";
365
+ const wallNote = r.durationMs !== void 0 ? ` \xB7 ${(r.durationMs / 1e3).toFixed(1)}s` : "";
366
+ lines.push(` ${target.label}: ${digest}${fallbackNote}${wallNote}`);
367
+ if (r.changedFiles.length > 0) {
368
+ lines.push(` changed: ${r.changedFiles.slice(0, 5).join(", ")}`);
369
+ if (r.changedFiles.length > 5) lines.push(` \u2026 (+${r.changedFiles.length - 5} more)`);
370
+ }
371
+ lines.push("");
372
+ }
373
+ for (const r of unmatched) {
374
+ const digest = formatWorkerResultDigest({
375
+ status: r.status,
376
+ summary: r.summary,
377
+ findingsCount: r.findings?.length ?? 0,
378
+ changedFilesCount: r.changedFiles?.length ?? 0,
379
+ sourcesReviewedCount: r.sourcesReviewed,
380
+ failureReason: r.failureReason,
381
+ evidenceStatus: r.evidenceStatus,
382
+ salvagedFindingsCount: r.findings?.filter((f) => f.salvaged === true).length ?? 0
383
+ });
384
+ lines.push(` \u672A\u6620\u5C04 worker ${r.workOrderId}: ${digest}`);
385
+ lines.push("");
386
+ }
387
+ if (strippedFiles.length > 0) {
388
+ lines.push(" \u26A0 \u6587\u4EF6\u91CD\u53E0\u5DF2\u5265\u79BB\uFF08\u53EA\u4FDD\u7559\u9996\u4E2A\u53EF\u5199\u7EF4\u5EA6\u7684\u5F52\u5C5E\uFF0C\u8BF7\u6838\u67E5\u7EF4\u5EA6\u5212\u5206\uFF09\uFF1A");
389
+ for (const s of strippedFiles) {
390
+ lines.push(` ${s.label}: ${s.files.join(", ")}`);
391
+ }
392
+ lines.push("");
393
+ }
394
+ if (emptiedDims.length > 0) {
395
+ lines.push(` \u26A0 \u5199\u7EF4\u5EA6\u6587\u4EF6\u5168\u90E8\u88AB\u5176\u4ED6\u7EF4\u5EA6\u593A\u8D70\uFF0C\u5DF2\u8DF3\u8FC7\u6D3E\u53D1\uFF08\u8BF7\u6838\u67E5\u7EF4\u5EA6\u5212\u5206\uFF09\uFF1A${emptiedDims.join("\u3001")}`);
396
+ lines.push("");
397
+ }
398
+ if (downgradedReviewDims.length > 0) {
399
+ lines.push(` \u26A0 \u5BA1\u67E5\u65CF\u7EF4\u5EA6\u6587\u4EF6\u88AB\u593A\u7A7A\uFF0C\u5DF2\u964D\u7EA7\u4E3A\u53EA\u8BFB\u9A8C\u8BC1\u7EE7\u7EED\u6D3E\u53D1\uFF1A${downgradedReviewDims.join("\u3001")}`);
400
+ lines.push("");
401
+ }
402
+ for (const group of dataParallelGroups) {
403
+ const replicaResults = group.workOrderIds.map((id) => resultsById.get(id)).filter((result) => result !== void 0);
404
+ const passedReplicas = quorumPassedCount(group, resultsById);
405
+ const verdict = passedReplicas >= group.quorumK ? "reached" : "not reached";
406
+ lines.push(` DP ${group.label}: execution quorum ${verdict} (${passedReplicas}/${group.workOrderIds.length}, quorum ${group.quorumK})`);
407
+ const replicaReads = group.workOrderIds.map((id) => resultsById.get(id)?.usage?.cache_read_input_tokens);
408
+ if (replicaReads.some((v) => v !== void 0)) {
409
+ lines.push(` replica cacheRead: ${replicaReads.map((v) => v ?? "\u2014").join(" / ")}`);
410
+ }
411
+ }
412
+ const quorumFailed = checkDpQuorum(dataParallelGroups, resultsById);
413
+ if (quorumFailed.length > 0) {
414
+ lines.push(` \u26A0 DP quorum \u672A\u8FBE\u6210\uFF1A${quorumFailed.join("\u3001")} \u7EC4\u591A\u6570\u526F\u672C\u672A\u901A\u8FC7\uFF0C\u7ED3\u8BBA\u4E0D\u53EF\u91C7\u4FE1\u3002`);
415
+ lines.push("");
416
+ }
417
+ if (dataParallelGroups.length > 0) {
418
+ lines.push(" DP replicas are independent evidence sources; final semantic review remains required.");
419
+ lines.push("");
420
+ }
421
+ const usages = run.results.map((r) => r.usage);
422
+ const sumOf = (pick) => usages.reduce((acc, u) => acc + (u ? pick(u) ?? 0 : 0), 0);
423
+ const totalInput = sumOf((u) => u.input_tokens);
424
+ const totalCacheRead = sumOf((u) => u.cache_read_input_tokens);
425
+ if (totalInput > 0 || totalCacheRead > 0) {
426
+ const hitRate = totalInput > 0 ? (totalCacheRead / totalInput * 100).toFixed(1) : "0.0";
427
+ lines.push(` \u7F13\u5B58\u7528\u91CF: input \u03A3${totalInput} \xB7 cacheRead \u03A3${totalCacheRead} \xB7 \u547D\u4E2D\u7387 ${hitRate}%\uFF08${total} worker \u805A\u5408\uFF09`);
428
+ lines.push("");
429
+ }
430
+ const allPassed = passed === total;
431
+ const hasFindings = run.results.some((r) => r.findings.length > 0);
432
+ if (hasFindings && run.results.some((r) => r.verification?.status !== "passed")) {
433
+ lines.push("\u6838\u9A8C\u63D0\u9192\uFF1A\u4EE5\u4E0A\u53D1\u73B0\u6765\u81EA\u53EA\u8BFB\u626B\u63CF\u6216\u5B50\u4EE3\u7406\u6458\u8981\uFF0C\u5C5E\u300C\u5F85\u6838\u9A8C\u5047\u8BBE\u300D\u2014\u2014\u5F15\u7528\u5230\u5177\u4F53\u6587\u4EF6\u524D\uFF0C\u8BF7\u7528 read_file/grep \u72EC\u7ACB\u786E\u8BA4\u3002");
434
+ }
435
+ if (allPassed) {
436
+ lines.push("\u805A\u5408\u7ED3\u8BBA: \u6240\u6709\u7EF4\u5EA6\u901A\u8FC7\u3002");
437
+ } else {
438
+ const failed = total - passed;
439
+ lines.push(`\u805A\u5408\u7ED3\u8BBA: ${failed}/${total} \u4E2A\u7EF4\u5EA6\u672A\u901A\u8FC7\uFF0C\u8BF7\u68C0\u67E5\u4E0A\u8FF0\u6458\u8981\u5E76\u5728\u672C\u56DE\u5408\u5185\u4FEE\u590D\u540E\u518D\u4EA4\u4ED8\u3002`);
440
+ }
441
+ if (hasFindings && !allPassed) {
442
+ lines.push("\u5404\u7EF4\u5EA6\u53D1\u73B0\u7684\u95EE\u9898\u5DF2\u6807\u6CE8\u5728\u4E0A\u65B9\uFF0C\u4F18\u5148\u4FEE\u590D\u963B\u585E\u9879\u3002");
443
+ }
444
+ if (run.escalated) {
445
+ lines.push("\u26A0 \u5B50\u4EE3\u7406\u8FDE\u7EED\u5931\u8D25\u5DF2\u5347\u7EA7\uFF0C\u5EFA\u8BAE\u6539\u4E3A\u5185\u8054\u6267\u884C\u6216\u7F29\u5C0F\u8303\u56F4\u3002");
446
+ }
447
+ return lines.join("\n");
448
+ }
449
+ function formatGalaxyUi(run, dimensions) {
450
+ const passed = run.results.filter((r) => r.status === "passed").length;
451
+ const total = run.results.length;
452
+ return `${GALAXY_GLYPH} \u661F\u6CB3 \xB7 ${passed}/${total} \u901A\u8FC7`;
453
+ }
454
+ function createGalaxyTool(coordinator) {
455
+ return {
456
+ definition: {
457
+ name: "galaxy",
458
+ description: `\u542F\u52A8\u661F\u6CB3\u96C6\u7FA4\u2014\u2014\u5C06\u590D\u6742\u4EFB\u52A1\u62C6\u89E3\u4E3A 2-5 \u4E2A\u7EF4\u5EA6\uFF0C\u7531\u4E0D\u540C\u661F\u57DF\u7684\u5206\u5B50 Agent \u5E76\u884C\u6267\u884C\uFF0C\u7ED3\u679C\u6C47\u603B\u540E\u7EDF\u4E00\u5BA1\u67E5\u3002
459
+
460
+ ## \u4F55\u65F6\u4F7F\u7528
461
+ - \u4EFB\u52A1\u5929\u7136\u8DE8\u5C42\uFF08UI+\u903B\u8F91+\u6570\u636E / \u524D\u540E\u7AEF / \u5B9E\u73B0+\u6D4B\u8BD5\uFF09
462
+ - \u7528\u6237\u8981\u6C42\u5E76\u884C/\u591A\u7EF4\u5904\u7406\uFF08"\u661F\u6CB3""\u96C6\u7FA4""\u5E76\u884C\u5206\u6790""\u4ECE\u591A\u4E2A\u89D2\u5EA6"\uFF09
463
+ - \u590D\u6742\u5EA6\u9AD8\uFF0C\u5355\u4E00 worker \u9884\u7B97\u4E0D\u591F
464
+
465
+ ## \u8C03\u7528\u534F\u8BAE\uFF08\u4E24\u9636\u6BB5\uFF09
466
+ 1. \u9996\u6B21\u8C03\u7528 galaxy({objective, dimensions, confirm: false}) \u5C55\u793A\u65B9\u6848\uFF0C\u7B49\u5F85\u7528\u6237\u786E\u8BA4
467
+ 2. \u7528\u6237\u786E\u8BA4\u540E\u8C03\u7528 galaxy({objective, dimensions, confirm: true}) \u542F\u52A8\u6267\u884C
468
+
469
+ ## \u661F\u57DF\u9009\u62E9\uFF08dimensions[].authority \u6216 .authorities\uFF09
470
+ - \u524D\u7AEF/UI \u2192 \u6587\u66F2 \xB7 \u540E\u7AEF/\u903B\u8F91 \u2192 \u5929\u673A \xB7 \u67B6\u6784/\u89C4\u5212 \u2192 \u5929\u6743 \xB7 \u5B9E\u73B0/\u7F16\u7801 \u2192 \u5929\u6881
471
+ - \u5BA1\u67E5/\u9A8C\u8BC1 \u2192 \u7476\u5149 \xB7 \u63A2\u7D22/\u653B\u575A \u2192 \u7834\u519B \xB7 \u91CD\u6784/\u4F18\u5316 \u2192 \u5929\u5E9C \xB7 \u6570\u636E/\u5BF9\u8D26 \u2192 \u5F00\u9633 \xB7 \u6587\u6863/\u8C03\u7814 \u2192 \u5929\u7487
472
+
473
+ ## \u786C\u6027\u7EA6\u675F
474
+ - \u53EF\u5199\u7EF4\u5EA6\u5FC5\u987B\u62C6\u6210\u6587\u4EF6\u8303\u56F4\u4E0D\u91CD\u53E0\u7684\u5355 authority \u7EF4\u5EA6
475
+ - \u591A authority \u4EC5\u7528\u4E8E\u72EC\u7ACB\u53EA\u8BFB\u89C6\u89D2\uFF08\u4E0D\u5171\u4EAB\u5B9E\u65F6\u4E0A\u4E0B\u6587\uFF09\uFF1B\u5199\u4EFB\u52A1\u7981\u6B62\u591A authority
476
+ - parallelism=data \u53EA\u8BFB\u526F\u672C\uFF1BautoReview \u9ED8\u8BA4\u8FFD\u52A0\u7476\u5149\u5BA1\u67E5\uFF1Bpolicy \u9ED8\u8BA4 all_required`,
477
+ input_schema: {
478
+ type: "object",
479
+ properties: {
480
+ objective: { type: "string", description: "\u96C6\u7FA4\u603B\u76EE\u6807\u2014\u2014\u8981\u89E3\u51B3\u7684\u5B8C\u6574\u4EFB\u52A1\u63CF\u8FF0" },
481
+ dimensions: {
482
+ type: "array",
483
+ items: {
484
+ type: "object",
485
+ properties: {
486
+ name: { type: "string", description: "\u7EF4\u5EA6\u6807\u8BC6\uFF08\u5982 frontend / backend / review / test / docs\uFF09" },
487
+ objective: { type: "string", description: "\u8BE5\u7EF4\u5EA6\u7684\u5177\u4F53\u6267\u884C\u76EE\u6807" },
488
+ constraints: { type: "array", items: { type: "string" }, maxItems: 12, description: "\u8BE5\u7EF4\u5EA6\u5FC5\u987B\u9075\u5B88\u7684\u4EFB\u52A1\u7EA7\u7EA6\u675F\uFF1A\u8BA1\u5212\u91CC\u7684\u53CD\u76EE\u6807\u3001\u5F85\u9A8C\u8BC1\u5047\u8BBE\u3001\u4E0D\u8BB8\u52A8\u7684\u4E1C\u897F\u3002\u9010\u5B57\u6284\u5199\u539F\u6587\uFF0C\u4E0D\u8981\u8F6C\u8FF0\u2014\u2014worker \u770B\u4E0D\u5230\u8BA1\u5212\u6587\u6863\uFF0C\u8FD9\u662F\u552F\u4E00\u7684\u9001\u8FBE\u901A\u9053\u3002" },
489
+ authority: { type: "string", description: "\u8BE5\u7EF4\u5EA6\u4F7F\u7528\u7684\u661F\u57DF id\u3002\u5355\u661F\u57DF\u65F6\u4F7F\u7528\uFF0C\u4E0E authorities \u4E8C\u9009\u4E00\u3002" },
490
+ authorities: { type: "array", items: { type: "string" }, description: "\u8BE5\u7EF4\u5EA6\u4F7F\u7528\u591A\u4E2A\u661F\u57DF\u4F5C\u72EC\u7ACB\u53EA\u8BFB\u5206\u6790\uFF1B\u4E0D\u5171\u4EAB\u5B9E\u65F6\u4E0A\u4E0B\u6587\uFF0C\u4E5F\u4E0D\u80FD\u7528\u4E8E\u5E76\u884C\u5199\u5165\u3002\u4E0E authority \u4E8C\u9009\u4E00\u3002" },
491
+ parallelism: { type: "string", enum: ["expert", "data"], default: "expert", description: "expert \u4E3A\u6309\u4E13\u957F\u7684\u5355\u5206\u7247\u6D3E\u53D1\uFF1Bdata \u4E3A\u540C\u4E00\u53EA\u8BFB\u4EFB\u52A1\u7684\u72EC\u7ACB\u526F\u672C\u3002" },
492
+ replicas: { type: "integer", minimum: 2, maximum: 5, description: "\u4EC5 data \u6A21\u5F0F\uFF1A\u72EC\u7ACB\u526F\u672C\u6570\u3002" },
493
+ profile: { type: "string", enum: profileRegistry.getProfileNames(), description: "worker profile\u3002\u9ED8\u8BA4\u6309\u7EF4\u5EA6\u540D\u81EA\u52A8\u63A8\u5BFC\u3002" },
494
+ tierFloor: { type: "string", enum: ["cheap", "balanced", "strong"], description: "\u6A21\u578B\u6863\u4F4D\u786C\u5730\u677F\uFF1A\u58F0\u660E\u540E\u8DEF\u7531\u53EA\u62AC\u4E0D\u964D\u3002" },
495
+ files: { type: "array", items: { type: "string" }, description: "\u53EF\u9009\uFF0C\u805A\u7126\u7684\u6587\u4EF6\u8DEF\u5F84\u3002" },
496
+ symbols: { type: "array", items: { type: "string" }, description: "\u53EF\u9009\uFF0C\u805A\u7126\u7684\u7B26\u53F7\u3002" },
497
+ maxTurns: { type: "integer", description: MAX_TURNS_TOOL_DESCRIPTION },
498
+ timeoutMs: { type: "integer", description: TIMEOUT_MS_TOOL_DESCRIPTION },
499
+ modelOverride: { type: "object", properties: { provider: { type: "string" }, model: { type: "string" } }, description: "\u53EF\u9009\uFF0C\u4E3A\u8BE5\u7EF4\u5EA6\u6307\u5B9A\u4E13\u7528 provider/model\u3002\u5BA1\u67E5\u7528\u5F3A\u6A21\u578B\uFF0C\u5B9E\u73B0\u7528\u5FEB/\u4FBF\u5B9C\u6A21\u578B\u3002" }
500
+ },
501
+ required: ["name", "objective"]
502
+ },
503
+ minItems: 2,
504
+ maxItems: 5,
505
+ description: "\u81F3\u5C11 2 \u4E2A\u7EF4\u5EA6\uFF0C\u6700\u591A 5 \u4E2A\u3002\u6BCF\u4E2A\u7EF4\u5EA6\u7531\u6307\u5B9A\u661F\u57DF\u7684\u5206\u5B50 Agent \u72EC\u7ACB\u6267\u884C\u3002"
506
+ },
507
+ autoReview: { type: "boolean", default: true, description: "\u6267\u884C\u5B8C\u6210\u540E\u81EA\u52A8\u8FFD\u52A0\u5BA1\u67E5\u7EF4\u5EA6\uFF08\u7476\u5149\uFF09\u3002\u9ED8\u8BA4\u5F00\u542F\u3002" },
508
+ confirm: { type: "boolean", default: false, description: "\u7528\u6237\u5DF2\u786E\u8BA4\u96C6\u7FA4\u65B9\u6848\u3002\u9996\u6B21\u8C03\u7528\u4E0D\u5E26\u6B64\u53C2\u6570\u4EE5\u5C55\u793A\u65B9\u6848\u5E76\u8BF7\u6C42\u786E\u8BA4\u3002" },
509
+ policy: { type: "string", enum: [...aggregationPolicyKinds], description: "\u805A\u5408\u7B56\u7565\u3002\u9ED8\u8BA4\uFF1Aall_required\u3002" },
510
+ planPath: { type: "string", description: "\u53EF\u9009\uFF0C\u8BA1\u5212\u6587\u4EF6\u8DEF\u5F84\u3002\u7EF4\u5EA6 worker \u4F1A\u81EA\u52A8\u7EE7\u627F\u8BE5\u8BA1\u5212\u7684\u53CD\u76EE\u6807\u4E0E\u5F85\u9A8C\u8BC1\u5047\u8BBE\u3002" }
511
+ },
512
+ required: ["objective", "dimensions"]
513
+ }
514
+ },
515
+ async execute(params) {
516
+ const parsed = galaxyInputSchema.safeParse(params.input);
517
+ if (!parsed.success) {
518
+ return {
519
+ content: `\u661F\u6CB3\u53C2\u6570\u9519\u8BEF\uFF1A${parsed.error.message}`,
520
+ isError: true,
521
+ errorKind: "format_error"
522
+ };
523
+ }
524
+ const { objective, dimensions, autoReview, confirm, policy, planPath } = parsed.data;
525
+ const contractIssues = validateGalaxyDimensionContract(dimensions);
526
+ if (contractIssues.length > 0) {
527
+ return {
528
+ content: [
529
+ "Galaxy contract validation failed:",
530
+ ...contractIssues.map((issue) => `- dimension #${issue.dimensionIndex + 1}: ${issue.message}`)
531
+ ].join("\n"),
532
+ isError: true,
533
+ errorKind: "format_error"
534
+ };
535
+ }
536
+ const planConstraints = planPath ? resolvePlanConstraints(params.cwd, { planPath, objective }) : void 0;
537
+ const hasDataParallel = dimensions.some((dimension) => dimension.parallelism === "data");
538
+ const isQuorumPolicy = typeof policy === "object" && policy?.kind === "quorum";
539
+ if (hasDataParallel && policy && policy !== "all_required" && !isQuorumPolicy) {
540
+ return {
541
+ content: "\u661F\u6CB3\u5DF2\u62E6\u622A\uFF1ADP \u9700\u8981\u4FDD\u7559\u6BCF\u4E2A\u526F\u672C\u7684\u7ED3\u679C\u548C\u8BC1\u636E\uFF0C\u805A\u5408\u7B56\u7565\u4EC5\u652F\u6301 all_required\uFF08\u9ED8\u8BA4\uFF09\u6216 quorum\uFF08\u7EC4\u7EA7\u5224\u5B9A\uFF0C\u526F\u672C\u901A\u8FC7\u6570 \u2265 k \u624D\u91C7\u4FE1\u7EC4\u7ED3\u8BBA\uFF09\u3002\u8BED\u4E49\u5206\u6B67\u7531\u540E\u7EED\u5BA1\u67E5\u7EF4\u5EA6\u5904\u7406\u3002",
542
+ isError: true
543
+ };
544
+ }
545
+ const effectivePolicy = hasDataParallel ? isQuorumPolicy ? policy : { kind: "quorum", k: 1 } : policy ?? "all_required";
546
+ let runtime;
547
+ try {
548
+ runtime = coordinator.getRuntimeSnapshot?.();
549
+ } catch {
550
+ }
551
+ if (runtime?.shuttingDown) {
552
+ return {
553
+ content: "\u661F\u6CB3\u5DF2\u62E6\u622A\uFF1A\u534F\u8C03\u5668\u6B63\u5728\u5173\u95ED\u6216\u79FB\u4EA4\u4E2D\uFF0C\u6682\u4E0D\u63A5\u53D7\u65B0\u7684\u96C6\u7FA4\u6D3E\u53D1\uFF1B\u8BF7\u7B49\u5F85\u5F53\u524D\u4EFB\u52A1\u6536\u5C3E\u540E\u91CD\u8BD5\u3002",
554
+ isError: true,
555
+ errorKind: "runtime_gate"
556
+ };
557
+ }
558
+ for (let i = 0; i < dimensions.length; i++) {
559
+ const dimension = dimensions[i];
560
+ const files = dimension.files;
561
+ if (files && files.length > 0) {
562
+ const bad = files.filter((f) => !validatePathSafe(params.cwd, f).ok);
563
+ if (bad.length > 0) {
564
+ return {
565
+ content: `\u661F\u6CB3\u5DF2\u62E6\u622A\uFF1A\u7EF4\u5EA6\u300C${dimensions[i].name}\u300D\u5F15\u7528\u4E86\u9879\u76EE\u76EE\u5F55\u5916\u7684\u6587\u4EF6\uFF1A${bad.join(", ")}`,
566
+ isError: true
567
+ };
568
+ }
569
+ }
570
+ const stars = dimension.authorities ?? [];
571
+ const profile = dimension.profile ?? mapGalaxyDimensionToProfile(dimension.name);
572
+ if (dimension.parallelism === "data") {
573
+ if (!dimension.replicas) {
574
+ return { content: `\u661F\u6CB3\u5DF2\u62E6\u622A\uFF1ADP \u7EF4\u5EA6\u300C${dimension.name}\u300D\u5FC5\u987B\u6307\u5B9A replicas\uFF082\u20135\uFF09\u3002`, isError: true };
575
+ }
576
+ if (dimension.authorities?.length) {
577
+ return { content: `\u661F\u6CB3\u5DF2\u62E6\u622A\uFF1ADP \u7EF4\u5EA6\u300C${dimension.name}\u300D\u53EA\u80FD\u4F7F\u7528\u5355\u4E2A authority\uFF1B\u591A\u4E13\u5BB6\u610F\u89C1\u8BF7\u4F7F\u7528 expert \u6A21\u5F0F\u7684 authorities\u3002`, isError: true };
578
+ }
579
+ if (profileCanEditFiles(profile)) {
580
+ return { content: `\u661F\u6CB3\u5DF2\u62E6\u622A\uFF1ADP \u7EF4\u5EA6\u300C${dimension.name}\u300D\u4F7F\u7528\u4E86\u53EF\u7F16\u8F91\u6587\u4EF6\u7684 profile\u300C${profile}\u300D\u3002DP \u53EA\u5141\u8BB8\u72EC\u7ACB\u53EA\u8BFB/\u9A8C\u8BC1\u526F\u672C\uFF08\u9A8C\u8BC1\u526F\u672C\u53EF run_tests\uFF09\uFF0C\u5199\u5165\u8BF7\u62C6\u6210 EP \u5355\u4E13\u5BB6\u5206\u7247\u3002`, isError: true };
581
+ }
582
+ }
583
+ if (stars.length > 1 && classifyProfile(profile) === "hands") {
584
+ return {
585
+ content: `\u661F\u6CB3\u5DF2\u62E6\u622A\uFF1A\u7EF4\u5EA6\u300C${dimension.name}\u300D\u5305\u542B\u591A\u4E2A authority\uFF0C\u4F46\u5176 profile \u53EF\u5199\u3002\u591A authority \u53EA\u7528\u4E8E\u72EC\u7ACB\u53EA\u8BFB\u89C6\u89D2\uFF1B\u8BF7\u62C6\u6210\u6587\u4EF6\u8303\u56F4\u4E0D\u91CD\u53E0\u7684\u5355 authority \u6267\u884C\u7EF4\u5EA6\u3002`,
586
+ isError: true
587
+ };
588
+ }
589
+ }
590
+ if (!confirm) {
591
+ const routingStats = coordinator.domainKnowledgeStore ? buildRoutingStats(coordinator.domainKnowledgeStore, dimensions) : void 0;
592
+ const proposal = formatGalaxyProposal(objective, dimensions, autoReview, routingStats);
593
+ const precheck = formatPlanPrecheck(analyzeWriteDimensionPlan(dimensions));
594
+ return {
595
+ content: [
596
+ proposal,
597
+ precheck,
598
+ "",
599
+ "\u8BF7\u786E\u8BA4\u6B64\u661F\u6CB3\u65B9\u6848\u662F\u5426\u53EF\u884C\u3002\u786E\u8BA4\u540E\u8C03\u7528 galaxy({..., confirm: true}) \u542F\u52A8\u6267\u884C\u3002",
600
+ "\u5982\u9700\u8C03\u6574\u7EF4\u5EA6\u6216\u661F\u57DF\uFF0C\u8BF7\u8BF4\u660E\u4FEE\u6539\u5185\u5BB9\u3002"
601
+ ].join("\n"),
602
+ uiContent: `${GALAXY_GLYPH} \u661F\u6CB3\u65B9\u6848 \xB7 ${dimensions.length} \u7EF4\u5EA6`
603
+ };
604
+ }
605
+ const requests = [];
606
+ const dimensionIndexByParentTurnId = /* @__PURE__ */ new Map();
607
+ const replicaIndexByParentTurnId = /* @__PURE__ */ new Map();
608
+ const dataParallelGroups = /* @__PURE__ */ new Map();
609
+ const dpObligationByDim = /* @__PURE__ */ new Map();
610
+ const explicitReviewIndexes = new Set(
611
+ dimensions.flatMap((dimension, index) => isReviewGalaxyDimension(dimension.name) ? [index] : [])
612
+ );
613
+ for (let i = 0; i < dimensions.length; i++) {
614
+ const dim = dimensions[i];
615
+ const stars = dim.authorities ?? (dim.authority && dim.authority !== "" ? [dim.authority] : []);
616
+ const isDataParallel = dim.parallelism === "data";
617
+ const perspectiveGroupId = stars.length > 1 ? `galaxy:perspectives:${params.toolUseId}:${i}` : void 0;
618
+ const dataParallelGroupId = isDataParallel ? `galaxy:data:${params.toolUseId}:${i}` : void 0;
619
+ const replicaCount = isDataParallel ? dim.replicas : 1;
620
+ if (isDataParallel) {
621
+ const quorumK = Math.floor(dim.replicas / 2) + 1;
622
+ dataParallelGroups.set(i, { label: dim.name, workOrderIds: [], quorumK });
623
+ if (coordinator.obligationTracker) {
624
+ const obligationId = coordinator.obligationTracker.upsert({
625
+ family: "behavior",
626
+ claim: `\u661F\u6CB3 DP \u7EF4\u5EA6\u300C${dim.name}\u300D\u7684\u7ED3\u8BBA\u7ECF ${quorumK} \u4E2A\u72EC\u7ACB\u526F\u672C\u9A8C\u8BC1\uFF08quorum=${quorumK}/${dim.replicas}\uFF09`,
627
+ targets: dim.files ?? [],
628
+ risk: "high",
629
+ redundancy: { kind: "quorum", k: quorumK, groupId: dataParallelGroupId }
630
+ });
631
+ dpObligationByDim.set(i, obligationId);
632
+ }
633
+ }
634
+ for (let j = 0; j < stars.length; j++) {
635
+ const star = stars[j];
636
+ const profile = dim.profile ?? mapGalaxyDimensionToProfile(dim.name);
637
+ for (let replicaIndex = 0; replicaIndex < replicaCount; replicaIndex++) {
638
+ const parentTurnId = galaxyWorkerParentTurnId(params.toolUseId, i, j, isDataParallel ? replicaIndex : void 0);
639
+ dimensionIndexByParentTurnId.set(parentTurnId, i);
640
+ if (isDataParallel) replicaIndexByParentTurnId.set(parentTurnId, replicaIndex);
641
+ const workOrderId = workerOrderId(parentTurnId);
642
+ if (isDataParallel) dataParallelGroups.get(i).workOrderIds.push(workOrderId);
643
+ let modelOverride = dim.modelOverride;
644
+ if (isDataParallel && modelOverride === void 0 && replicaIndex > 0) {
645
+ const candidates = coordinator.getCandidateModels?.() ?? [];
646
+ if (candidates.length > 0) {
647
+ const candidate = candidates[(replicaIndex - 1) % candidates.length];
648
+ modelOverride = { provider: candidate.provider, model: candidate.model };
649
+ }
650
+ }
651
+ requests.push({
652
+ parentTurnId,
653
+ objective: isDataParallel ? `${dim.objective}
654
+
655
+ Data-parallel replica ${replicaIndex + 1}/${replicaCount}: independently inspect the same evidence. Do not modify files, do not assume other replicas' conclusions, and report concrete evidence, uncertainty, and recommended follow-up.` : stars.length > 1 ? `${dim.objective}
656
+
657
+ \u591A\u89C6\u89D2\u5206\u6790\uFF1A\u4F60\u4E0E\u5176\u4ED6\u661F\u57DF\u4E13\u5BB6\u72EC\u7ACB\u68C0\u67E5\u540C\u4E00\u95EE\u9898\uFF0C\u4F46\u4E0D\u5171\u4EAB\u5B9E\u65F6\u4E0A\u4E0B\u6587\u3002\u53EA\u505A\u8BC1\u636E\u9A71\u52A8\u7684\u5206\u6790\u4E0E\u5EFA\u8BAE\uFF0C\u4E0D\u4FEE\u6539\u6587\u4EF6\uFF1B\u660E\u786E\u5217\u51FA\u4F9D\u636E\u3001\u98CE\u9669\u548C\u5EFA\u8BAE\u3002\u5176\u4ED6\u89C6\u89D2\uFF1A${stars.filter((s) => s !== star).map((s) => {
658
+ const sd = starDomainRegistry.get(s);
659
+ return sd ? sd.name : s;
660
+ }).join("\u3001")}\u3002` : isReviewGalaxyDimension(dim.name) ? `${dim.objective}
661
+
662
+ \u53EA\u8BFB\u9A8C\u8BC1\uFF1A\u4E0D\u4FEE\u6539\u4EFB\u4F55\u6587\u4EF6\uFF1B\u53EF\u8FD0\u884C\u6D4B\u8BD5\u9A8C\u8BC1\u884C\u4E3A\uFF08run_tests\uFF09\uFF0C\u8F93\u51FA\u8BC1\u636E\u5305\uFF08\u547D\u4EE4\u3001exit code\u3001\u901A\u8FC7/\u5931\u8D25\u8BA1\u6570\u3001\u5931\u8D25\u9879\u539F\u6587\uFF09\u3002` : profileIsWriteCapable(profile) ? `${dim.objective}
663
+
664
+ \u5DE5\u4E1A\u7EA7\u4EA4\u4ED8\u8981\u6C42\uFF1A1. \u8BFB\u4EE3\u7801\u21922. \u5148\u5199\u5931\u8D25\u6D4B\u8BD5\u590D\u73B0\u95EE\u9898\uFF08RED\uFF09\u21923. \u4FEE\u6539\u4EE3\u7801\u4F7F\u6D4B\u8BD5\u901A\u8FC7\uFF08GREEN\uFF09\u21924. \u8FD0\u884C typecheck/lint\u21925. \u786E\u8BA4\u8DEF\u5F84\u901A\u8FBE\u3002\u4E0D\u6EE1\u8DB3\u4EFB\u4F55\u4E00\u6761\u4E0D\u7B97\u5B8C\u6210\u3002\u6CE8\u610F\uFF1A\u4E0D\u5148\u5199\u6D4B\u8BD5\u76F4\u63A5\u6539\u4EE3\u7801\u4F1A\u88AB evidence gate \u62E6\u622A\u3002` : `${dim.objective}
665
+
666
+ \u53EA\u8BFB\u5206\u6790\uFF1A\u4E0D\u4FEE\u6539\u4EFB\u4F55\u6587\u4EF6\uFF1B\u7ED9\u51FA\u8BC1\u636E\u9A71\u52A8\u7684\u7ED3\u8BBA\u3001\u4E0D\u786E\u5B9A\u9879\u548C\u5EFA\u8BAE\u3002`,
667
+ kind: mapDimensionToKind(dim.name),
668
+ profile,
669
+ authority: star,
670
+ // D8 L2:维度级约束在前,计划级在后(维度级更贴,优先占满 12 条预算)。
671
+ constraints: planConstraints && planConstraints.length > 0 ? [...dim.constraints ?? [], ...planConstraints] : dim.constraints,
672
+ scope: { files: dim.files, symbols: dim.symbols },
673
+ modelOverride,
674
+ tierFloor: dim.tierFloor,
675
+ groupId: dataParallelGroupId ?? perspectiveGroupId,
676
+ quorumK: isDataParallel ? Math.floor(dim.replicas / 2) + 1 : void 0,
677
+ ...dim.timeoutMs || dim.maxTurns ? { budget: toBudgetOverride({ timeoutMs: dim.timeoutMs, maxTurns: dim.maxTurns }) } : {}
678
+ });
679
+ }
680
+ }
681
+ }
682
+ if (requests.length === 0) {
683
+ return { content: "\u661F\u6CB3\u6267\u884C\u5931\u8D25\uFF1A\u6240\u6709\u7EF4\u5EA6\u5747\u672A\u6307\u5B9A\u6709\u6548\u661F\u57DF\u3002\u6BCF\u4E2A\u7EF4\u5EA6\u5FC5\u987B\u6307\u5B9A authority \u6216 authorities\u3002", isError: true };
684
+ }
685
+ const fileOwner = /* @__PURE__ */ new Map();
686
+ for (let i = 0; i < dimensions.length; i++) {
687
+ if (!dimensionIsWriteCapable(dimensions[i])) continue;
688
+ for (const f of dimensions[i].files ?? []) {
689
+ if (!fileOwner.has(f)) fileOwner.set(f, i);
690
+ }
691
+ }
692
+ const strippedByDim = /* @__PURE__ */ new Map();
693
+ for (const req of requests) {
694
+ const dimIdx = dimensionIndexByParentTurnId.get(req.parentTurnId);
695
+ if (dimIdx === void 0 || !dimensionIsWriteCapable(dimensions[dimIdx])) continue;
696
+ const owned = dimensions[dimIdx]?.files ?? [];
697
+ const deduped = [];
698
+ for (const f of owned) {
699
+ const owner = fileOwner.get(f);
700
+ if (owner === void 0 || owner === dimIdx) {
701
+ deduped.push(f);
702
+ continue;
703
+ }
704
+ if (!strippedByDim.has(dimIdx)) strippedByDim.set(dimIdx, []);
705
+ strippedByDim.get(dimIdx).push(f);
706
+ }
707
+ ;
708
+ req.scope = { ...req.scope, files: deduped };
709
+ }
710
+ const emptiedWriteDims = [];
711
+ const downgradedReviewDims = [];
712
+ for (let i = requests.length - 1; i >= 0; i--) {
713
+ const dimIdx = dimensionIndexByParentTurnId.get(requests[i].parentTurnId);
714
+ if (dimIdx === void 0 || !dimensionIsWriteCapable(dimensions[dimIdx])) continue;
715
+ const dim = dimensions[dimIdx];
716
+ const originalCount = dim.files?.length ?? 0;
717
+ const currentCount = requests[i].scope?.files?.length ?? 0;
718
+ if (originalCount === 0 || currentCount > 0) continue;
719
+ if (isReviewGalaxyDimension(dim.name)) {
720
+ ;
721
+ requests[i].scope = { ...requests[i].scope, files: [] };
722
+ requests[i].objective = `${requests[i].objective}
723
+
724
+ \u26A0 \u7EF4\u5EA6\u6587\u4EF6\u8303\u56F4\u5DF2\u88AB\u5176\u4ED6\u5199\u7EF4\u5EA6\u72EC\u5360\uFF0C\u964D\u7EA7\u4E3A\u53EA\u8BFB\u9A8C\u8BC1\uFF1A\u4E0D\u5F97\u4FEE\u6539\u4EFB\u4F55\u6587\u4EF6\uFF1B\u9A8C\u8BC1\u8303\u56F4\u4EE5\u4E0A\u6587 objective \u4E3A\u51C6\u3002`;
725
+ downgradedReviewDims.push(dim.name);
726
+ } else {
727
+ emptiedWriteDims.unshift(dim.name);
728
+ requests.splice(i, 1);
729
+ }
730
+ }
731
+ if (requests.length === 0) {
732
+ return { content: `\u661F\u6CB3\u6267\u884C\u5931\u8D25\uFF1A\u5168\u90E8\u53EF\u5199\u7EF4\u5EA6\u7684\u6587\u4EF6\u5747\u88AB\u5176\u4ED6\u7EF4\u5EA6\u593A\u8D70\uFF08${emptiedWriteDims.join("\u3001")}\uFF09\u3002\u8BF7\u91CD\u65B0\u5212\u5206\u4E0D\u91CD\u53E0\u7684\u7EF4\u5EA6\u6587\u4EF6\u8303\u56F4\u3002`, isError: true };
733
+ }
734
+ const executionWorkerIds = requests.filter((request) => !explicitReviewIndexes.has(dimensionIndexByParentTurnId.get(request.parentTurnId) ?? -1)).map((request) => workerOrderId(request.parentTurnId));
735
+ const explicitReviewRequests = requests.filter(
736
+ (request) => explicitReviewIndexes.has(dimensionIndexByParentTurnId.get(request.parentTurnId) ?? -1)
737
+ );
738
+ for (const request of explicitReviewRequests) {
739
+ request.dependencies = executionWorkerIds;
740
+ }
741
+ const hasExplicitReview = explicitReviewIndexes.size > 0;
742
+ if (autoReview && !hasExplicitReview) {
743
+ const autoReviewParentTurnId = `batch:${params.toolUseId}-galaxy:auto-review`;
744
+ requests.push({
745
+ parentTurnId: autoReviewParentTurnId,
746
+ objective: "\u5168\u5C40\u5BA1\u67E5\u2014\u2014\u661F\u6CB3\u96C6\u7FA4\u6240\u6709\u6267\u884C\u7EF4\u5EA6\u5DF2\u5B8C\u6210\u3002\u9010\u9879\u9A8C\u8BC1\uFF1A\u6B63\u786E\u6027\u3001\u5B8C\u6574\u6027\u3001\u5B89\u5168\u6027\u3001\u8FB9\u754C\u6761\u4EF6\u3002\u7279\u522B\u5173\u6CE8\u8DE8\u7EF4\u5EA6\u51B2\u7A81\uFF08\u5982\u524D\u540E\u7AEF\u63A5\u53E3\u4E0D\u4E00\u81F4\uFF09\u3002\u8F93\u51FA\u901A\u8FC7\u7684\u9879\u548C\u9700\u4FEE\u590D\u7684\u9879\u3002",
747
+ kind: "review",
748
+ profile: "reviewer",
749
+ authority: "yaoguang",
750
+ scope: { files: [] },
751
+ dependencies: executionWorkerIds
752
+ });
753
+ }
754
+ const plannedWorkerCount = requests.length;
755
+ const plannedDataWorkers = [...dataParallelGroups.values()].reduce((total, group) => total + group.workOrderIds.length, 0);
756
+ const plannedParallelism = {
757
+ expert: Math.max(0, plannedWorkerCount - plannedDataWorkers),
758
+ data: plannedDataWorkers
759
+ };
760
+ const textStreamer = params.onOutput ? createActivityStreamer(params.onOutput) : void 0;
761
+ const objectiveById = /* @__PURE__ */ new Map();
762
+ for (const req of requests) {
763
+ const dim = dimensions[dimensionIndexByParentTurnId.get(req.parentTurnId) ?? -1];
764
+ const stars = dim ? dim.authorities ?? (dim.authority ? [dim.authority] : []) : [];
765
+ const perspectiveNote = stars.length > 1 ? ` \u25CC ${dim.name}` : "";
766
+ const label = req.objective || perspectiveNote || "\u5BA1\u67E5";
767
+ objectiveById.set(req.parentTurnId, label);
768
+ objectiveById.set(workerOrderId(req.parentTurnId), label);
769
+ }
770
+ const activityMapper = params.onWorkerActivity ? createDelegationActivityMapper(params.toolUseId, params.onWorkerActivity, {
771
+ objectiveOf: (id) => objectiveById.get(id)
772
+ }) : void 0;
773
+ const streamActivity = textStreamer || activityMapper ? (ev) => {
774
+ textStreamer?.(ev);
775
+ activityMapper?.(ev);
776
+ } : void 0;
777
+ for (const req of requests) {
778
+ req.onActivity = streamActivity;
779
+ req.onNestedActivity = params.onWorkerActivity;
780
+ }
781
+ const emitTerminal = params.onWorkerActivity ? (r) => {
782
+ activityMapper?.finish(terminalActivity(r, params.toolUseId, objectiveById.get(r.workOrderId)));
783
+ } : void 0;
784
+ let progressReported = 0;
785
+ let run;
786
+ try {
787
+ run = await coordinator.delegateBatch(
788
+ requests,
789
+ effectivePolicy,
790
+ params.abortSignal,
791
+ (completed, total) => {
792
+ if (completed > progressReported) {
793
+ progressReported = completed;
794
+ params.onOutput?.(`\u23F3 galaxy progress: ${completed}/${total} workers done
795
+ `);
796
+ }
797
+ },
798
+ emitTerminal ?? void 0
799
+ );
800
+ } catch (err) {
801
+ activityMapper?.dispose();
802
+ const msg = err instanceof Error ? err.message : String(err);
803
+ return {
804
+ content: `\u661F\u6CB3\u6267\u884C\u5931\u8D25\uFF1A${msg}`,
805
+ isError: true
806
+ };
807
+ }
808
+ if (emitTerminal) {
809
+ for (const result of run.results) emitTerminal(result);
810
+ }
811
+ activityMapper?.dispose();
812
+ if (coordinator.domainKnowledgeStore) {
813
+ try {
814
+ const resultsById = new Map(run.results.map((r) => [r.workOrderId, r]));
815
+ const modelByWorkOrder = new Map((run.workerModels ?? []).map((w) => [w.workOrderId, w.model]));
816
+ const routingRecords = [];
817
+ for (const req of requests) {
818
+ const dimIndex = dimensionIndexByParentTurnId.get(req.parentTurnId);
819
+ const dim = dimIndex === void 0 ? void 0 : dimensions[dimIndex];
820
+ const result = resultsById.get(workerOrderId(req.parentTurnId));
821
+ if (!dim || !result) continue;
822
+ routingRecords.push({
823
+ dimensionName: dim.name,
824
+ authority: req.authority ?? "unknown",
825
+ taskShape: normalizeTaskShape(dim.name),
826
+ // escalated 视同 blocked:结论不可采信,不记作通过
827
+ status: result.status === "escalated" ? "blocked" : result.status,
828
+ model: modelByWorkOrder.get(workerOrderId(req.parentTurnId)) ?? req.modelOverride?.model,
829
+ // L3:token 成本入账——胜率之外的「每通过成本」维度
830
+ costTokens: result.usage ? (result.usage.input_tokens ?? 0) + (result.usage.output_tokens ?? 0) : void 0,
831
+ // 失败归因:有 failureReason = 基础设施死法(超时/轮次耗尽/崩溃),
832
+ // 与模型能力无关;语义失败(gate 拦的假验证、越界)不带此字段。
833
+ // 不记它的话,「谁常接难活、谁常撞门禁」会被当成「谁能力差」。
834
+ ...result.failureReason ? { failureReason: result.failureReason } : {},
835
+ // EP/DP 标记 + 对照组:DP 组内同任务不同模型可配对比较,
836
+ // EP 分片之间混任务难度不可比。缺此两项则 S4 的 A/B 沉淀无从识别。
837
+ ...dim.parallelism ? { parallelism: dim.parallelism } : {},
838
+ ...req.groupId ? { comparisonGroupId: req.groupId } : {}
839
+ });
840
+ }
841
+ if (routingRecords.length > 0) {
842
+ const store = coordinator.domainKnowledgeStore;
843
+ if (typeof store.recordGalaxyRoutingBatch === "function") {
844
+ store.recordGalaxyRoutingBatch(routingRecords);
845
+ } else {
846
+ for (const record of routingRecords) store.recordGalaxyRouting(record);
847
+ }
848
+ }
849
+ } catch {
850
+ }
851
+ }
852
+ if (coordinator.obligationTracker && dpObligationByDim.size > 0) {
853
+ try {
854
+ const resultsById = new Map(run.results.map((r) => [r.workOrderId, r]));
855
+ for (const [dimIndex, obligationId] of dpObligationByDim) {
856
+ const group = dataParallelGroups.get(dimIndex);
857
+ if (!group) continue;
858
+ for (const workOrderId of group.workOrderIds) {
859
+ const result = resultsById.get(workOrderId);
860
+ if (result?.evidenceStatus === "verified") {
861
+ coordinator.obligationTracker.satisfy(obligationId, workOrderId);
862
+ }
863
+ }
864
+ }
865
+ } catch {
866
+ }
867
+ }
868
+ const targets = requests.map((request) => {
869
+ const dimensionIndex = dimensionIndexByParentTurnId.get(request.parentTurnId);
870
+ if (dimensionIndex === void 0) return { workOrderId: workerOrderId(request.parentTurnId), label: "\u5168\u5C40\u5BA1\u67E5", requestedModel: request.modelOverride?.model };
871
+ const dimension = dimensions[dimensionIndex];
872
+ const stars = dimension.authorities ?? (dimension.authority ? [dimension.authority] : []);
873
+ const authorityIndex = stars.indexOf(request.authority ?? "");
874
+ const star = starDomainRegistry.get(request.authority ?? "");
875
+ const perspective = stars.length > 1 ? " \u25CC \u591A\u89C6\u89D2" : "";
876
+ const replicaIndex = replicaIndexByParentTurnId.get(request.parentTurnId);
877
+ const replica = replicaIndex === void 0 ? "" : ` DP replica ${replicaIndex + 1}/${dimension.replicas}`;
878
+ return {
879
+ workOrderId: workerOrderId(request.parentTurnId),
880
+ label: `${dimension.name}${perspective}${replica} ${star?.name ?? request.authority ?? authorityIndex}`,
881
+ requestedModel: request.modelOverride?.model
882
+ };
883
+ });
884
+ const resultByWorkOrderId = new Map(run.results.map((r) => [r.workOrderId, r]));
885
+ const galaxyPassed = run.results.filter((r) => r.status === "passed").length;
886
+ const galaxyTotal = run.results.length;
887
+ const failedDimensions = targets.filter((t) => resultByWorkOrderId.get(t.workOrderId)?.status !== "passed").map((t) => t.label);
888
+ return {
889
+ content: formatGalaxyResult(
890
+ run,
891
+ targets,
892
+ [...dataParallelGroups.values()],
893
+ [...strippedByDim.entries()].map(([idx, files]) => ({ label: dimensions[idx].name, files })),
894
+ emptiedWriteDims,
895
+ downgradedReviewDims
896
+ ),
897
+ // DP quorum 未达成 → isError,让主 agent 的工具管线感知到失败信号,
898
+ // 而非只靠报告文本判断(展示层→判定层的断层修复)。
899
+ isError: dataParallelGroups.size > 0 && checkDpQuorum(
900
+ [...dataParallelGroups.values()],
901
+ new Map(run.results.map((r) => [r.workOrderId, r]))
902
+ ).length > 0 || void 0,
903
+ uiContent: formatGalaxyUi(run, dimensions),
904
+ orchestration: {
905
+ kind: "galaxy",
906
+ runId: params.toolUseId,
907
+ planned: plannedWorkerCount,
908
+ dispatched: run.results.length,
909
+ skipped: emptiedWriteDims,
910
+ parallelism: plannedParallelism,
911
+ dimensions: { passed: galaxyPassed, total: galaxyTotal, failed: failedDimensions }
912
+ }
913
+ };
914
+ },
915
+ requiresApproval: () => false,
916
+ isConcurrencySafe: () => false,
917
+ isEnabled: () => true,
918
+ // 外层超时必须覆盖 worker pool 的波次 × profile 预算,否则工具层先杀
919
+ timeoutMs: (params) => {
920
+ const dims = params?.input?.dimensions ?? [];
921
+ const { profiles, tierFloors, requestedTimeoutMs } = buildGalaxyBudgetInputs(dims);
922
+ const autoReview = params?.input?.autoReview ?? true;
923
+ const hasExplicitReview = dims.some((d) => d.name !== void 0 && isReviewGalaxyDimension(d.name));
924
+ const execMs = delegationToolTimeoutMs(
925
+ params?.sessionTurnCount,
926
+ profiles,
927
+ { taskCount: profiles.length, requestedTimeoutMs, tierFloors }
928
+ );
929
+ if (!autoReview || hasExplicitReview) return execMs;
930
+ const reviewMs = delegationToolTimeoutMs(params?.sessionTurnCount, ["reviewer"], { taskCount: 1 });
931
+ return execMs + reviewMs;
932
+ }
933
+ };
934
+ }
935
+
936
+ export {
937
+ formatWorkerResultDigest,
938
+ delegateMaxTurnsSchema,
939
+ delegateTimeoutMsSchema,
940
+ MAX_TURNS_TOOL_DESCRIPTION,
941
+ TIMEOUT_MS_TOOL_DESCRIPTION,
942
+ toBudgetOverride,
943
+ analyzeWriteDimensionPlan,
944
+ createGalaxyTool
945
+ };