minimal-agent 0.13.0 → 0.14.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 (470) hide show
  1. package/README.md +6 -5
  2. package/package.json +60 -4
  3. package/plugins/computer_use/.claude-plugin/plugin.json +1 -1
  4. package/plugins/cron-runner/src/commands.js +4 -4
  5. package/plugins/cron-runner/src/commands.ts +4 -4
  6. package/plugins/workflow-runner/.claude-plugin/plugin.json +2 -2
  7. package/plugins/workflow-runner/commands/workflow.md +57 -90
  8. package/plugins/workflow-runner/commands/workflows.md +4 -4
  9. package/plugins/workflow-runner/plugin.js +24 -13
  10. package/plugins/workflow-runner/plugin.ts +28 -13
  11. package/plugins/workflow-runner/src/discovery.js +160 -0
  12. package/plugins/workflow-runner/src/discovery.ts +194 -0
  13. package/plugins/workflow-runner/src/goalAnchor.js +53 -0
  14. package/plugins/workflow-runner/src/goalAnchor.ts +59 -0
  15. package/plugins/workflow-runner/src/index.js +197 -206
  16. package/plugins/workflow-runner/src/index.ts +248 -249
  17. package/plugins/workflow-runner/src/inputCoercion.js +40 -0
  18. package/plugins/workflow-runner/src/inputCoercion.ts +43 -0
  19. package/plugins/workflow-runner/src/journal.js +224 -0
  20. package/plugins/workflow-runner/src/journal.ts +274 -0
  21. package/plugins/workflow-runner/src/jsonSchema.js +132 -0
  22. package/plugins/workflow-runner/src/jsonSchema.ts +162 -0
  23. package/plugins/workflow-runner/src/moduleResolution.js +64 -0
  24. package/plugins/workflow-runner/src/moduleResolution.ts +71 -0
  25. package/plugins/workflow-runner/src/resourceInputs.js +220 -0
  26. package/plugins/workflow-runner/src/resourceInputs.ts +300 -0
  27. package/plugins/workflow-runner/src/runner.js +400 -489
  28. package/plugins/workflow-runner/src/runner.ts +488 -560
  29. package/plugins/workflow-runner/src/runtime/config.js +46 -0
  30. package/plugins/workflow-runner/src/runtime/config.ts +69 -0
  31. package/plugins/workflow-runner/src/runtime/context.js +1304 -0
  32. package/plugins/workflow-runner/src/runtime/context.ts +1786 -0
  33. package/plugins/workflow-runner/src/runtime/exec.js +34 -0
  34. package/plugins/workflow-runner/src/runtime/exec.ts +53 -0
  35. package/plugins/workflow-runner/src/runtime/flow.js +8 -0
  36. package/plugins/workflow-runner/src/runtime/flow.ts +12 -0
  37. package/plugins/workflow-runner/src/runtime/fs.js +27 -0
  38. package/plugins/workflow-runner/src/runtime/fs.ts +41 -0
  39. package/plugins/workflow-runner/src/runtime/model.js +6 -0
  40. package/plugins/workflow-runner/src/runtime/model.ts +8 -0
  41. package/plugins/workflow-runner/src/runtime/output.js +7 -0
  42. package/plugins/workflow-runner/src/runtime/output.ts +21 -0
  43. package/plugins/workflow-runner/src/runtime/scheduler.js +141 -0
  44. package/plugins/workflow-runner/src/runtime/scheduler.ts +166 -0
  45. package/plugins/workflow-runner/src/runtime/state.js +16 -0
  46. package/plugins/workflow-runner/src/runtime/state.ts +19 -0
  47. package/plugins/workflow-runner/src/runtime/tools.js +3 -0
  48. package/plugins/workflow-runner/src/runtime/tools.ts +6 -0
  49. package/plugins/workflow-runner/src/sandbox.js +141 -0
  50. package/plugins/workflow-runner/src/sandbox.ts +182 -0
  51. package/plugins/workflow-runner/src/scriptGuard.d.mts +38 -0
  52. package/plugins/workflow-runner/src/scriptGuard.mjs +449 -0
  53. package/plugins/workflow-runner/src/taskIdentity.js +151 -307
  54. package/plugins/workflow-runner/src/taskIdentity.ts +207 -355
  55. package/plugins/workflow-runner/src/toolRuntime.js +29 -8
  56. package/plugins/workflow-runner/src/toolRuntime.ts +36 -11
  57. package/plugins/workflow-runner/src/types.js +7 -211
  58. package/plugins/workflow-runner/src/types.ts +154 -623
  59. package/plugins/workflow-runner/src/util.js +47 -0
  60. package/plugins/workflow-runner/src/util.ts +51 -0
  61. package/plugins/workflow-runner/src/workflowContext.js +20 -0
  62. package/plugins/workflow-runner/src/workflowContext.ts +58 -0
  63. package/plugins/workflow-runner/src/workflowDependencies.js +36 -0
  64. package/plugins/workflow-runner/src/workflowDependencies.ts +59 -0
  65. package/plugins/workflow-runner/src/workflowFingerprint.js +118 -0
  66. package/plugins/workflow-runner/src/workflowFingerprint.ts +122 -0
  67. package/plugins/workflow-runner/src/workflowState.js +474 -802
  68. package/plugins/workflow-runner/src/workflowState.ts +575 -970
  69. package/plugins/workflow-runner/test/api.test.ts +223 -0
  70. package/plugins/workflow-runner/test/apiCapabilities.test.ts +614 -0
  71. package/plugins/workflow-runner/test/apiConcurrencyGate.test.ts +104 -0
  72. package/plugins/workflow-runner/test/apiEcho.test.ts +210 -0
  73. package/plugins/workflow-runner/test/apiReadText.test.ts +178 -0
  74. package/plugins/workflow-runner/test/apiResourceLedger.test.ts +184 -0
  75. package/plugins/workflow-runner/test/childWorkflow.test.ts +304 -0
  76. package/plugins/workflow-runner/test/discovery.test.ts +234 -0
  77. package/plugins/workflow-runner/test/goalAnchor.test.ts +106 -0
  78. package/plugins/workflow-runner/test/goalController.test.ts +317 -0
  79. package/plugins/workflow-runner/test/journalLanes.test.ts +198 -0
  80. package/plugins/workflow-runner/test/listResources.test.ts +106 -0
  81. package/plugins/workflow-runner/test/resourceInputs.test.ts +294 -0
  82. package/plugins/workflow-runner/test/sandbox.test.ts +126 -0
  83. package/plugins/workflow-runner/test/scheduler.test.ts +70 -0
  84. package/plugins/workflow-runner/test/scriptGuard.test.ts +276 -0
  85. package/plugins/workflow-runner/test/skillDocSync.test.ts +78 -0
  86. package/plugins/workflow-runner/test/taskIdentity.test.ts +288 -179
  87. package/plugins/workflow-runner/test/workflowFingerprint.test.ts +106 -0
  88. package/plugins/workflow-runner/test/workflowState.test.ts +429 -0
  89. package/skills/pptx/examples/assets/cover-bg.svg +23 -0
  90. package/skills/pptx/examples/assets/icon-spark.svg +5 -0
  91. package/skills/ui-design/SKILL.md +5 -2
  92. package/skills/ui-design/references/layout-composition.md +1 -1
  93. package/skills/workflow-creator/SKILL.md +344 -0
  94. package/skills/workflow-creator/assets/template/workflow.mjs +48 -0
  95. package/skills/workflow-creator/references/api.md +216 -0
  96. package/skills/workflow-creator/references/migration.md +103 -0
  97. package/skills/workflow-creator/references/patterns.md +779 -0
  98. package/skills/workflow-creator/scripts/list-resources.mjs +205 -0
  99. package/skills/workflow-creator/scripts/scaffold.mjs +148 -0
  100. package/skills/workflow-creator/scripts/validate.mjs +275 -0
  101. package/skills/workflow-creator/scripts/workflow-creator.test.mjs +82 -0
  102. package/src/advisor/advisorCoordinator.js +503 -0
  103. package/src/advisor/advisorCoordinator.ts +657 -0
  104. package/src/cli/configMenu.tsx +0 -1
  105. package/src/cli/print.js +27 -6
  106. package/src/cli/print.ts +48 -4
  107. package/src/cli/streamJson.js +5 -6
  108. package/src/cli/streamJson.ts +8 -4
  109. package/src/cli/wizards/advisorWizard.js +4 -2
  110. package/src/cli/wizards/advisorWizard.tsx +8 -2
  111. package/src/cli/wizards/contextAdvisorWizard.js +5 -4
  112. package/src/cli/wizards/contextAdvisorWizard.tsx +7 -6
  113. package/src/collaboration/taskFlow.js +115 -0
  114. package/src/collaboration/taskFlow.ts +169 -0
  115. package/src/config/configDefaults.js +41 -1
  116. package/src/config/configDefaults.ts +43 -1
  117. package/src/config/configDiagnostics.ts +2 -2
  118. package/src/config/configFile.js +40 -9
  119. package/src/config/configFile.ts +60 -11
  120. package/src/config/configService.js +419 -74
  121. package/src/config/configService.ts +703 -145
  122. package/src/config/numericLimits.js +22 -0
  123. package/src/config/numericLimits.ts +24 -0
  124. package/src/config.js +1 -0
  125. package/src/config.ts +3 -2
  126. package/src/context/budgetPlan.js +1 -1
  127. package/src/context/budgetPlan.ts +1 -1
  128. package/src/context/compact.js +7 -2
  129. package/src/context/compact.ts +9 -2
  130. package/src/context/microCompactLite.js +212 -13
  131. package/src/context/microCompactLite.ts +261 -12
  132. package/src/context/sessionRegistry.js +8 -1
  133. package/src/context/sessionRegistry.ts +18 -5
  134. package/src/context/toolResultArchive.js +72 -0
  135. package/src/context/toolResultArchive.ts +95 -0
  136. package/src/goal/errors.js +8 -0
  137. package/src/goal/errors.ts +18 -0
  138. package/src/goal/goalRuntime.js +344 -0
  139. package/src/goal/goalRuntime.ts +466 -0
  140. package/src/goal/goalStore.js +200 -0
  141. package/src/goal/goalStore.ts +219 -0
  142. package/src/goal/index.js +4 -0
  143. package/src/goal/index.ts +4 -0
  144. package/src/goal/statusMapping.js +71 -0
  145. package/src/goal/statusMapping.ts +95 -0
  146. package/src/goal/types.js +7 -0
  147. package/src/goal/types.ts +179 -0
  148. package/src/goal/workflowController.js +306 -0
  149. package/src/goal/workflowController.ts +360 -0
  150. package/src/harness/evidenceLedger.js +2 -0
  151. package/src/harness/evidenceLedger.ts +1 -0
  152. package/src/harness/stallGuard.js +9 -3
  153. package/src/harness/stallGuard.ts +7 -3
  154. package/src/images/imageResolver.js +161 -0
  155. package/src/images/imageResolver.ts +189 -0
  156. package/src/infra/verification.js +34 -5
  157. package/src/infra/verification.ts +39 -4
  158. package/src/llm/client.js +79 -21
  159. package/src/llm/client.ts +182 -35
  160. package/src/llm/gatewayClient.js +201 -0
  161. package/src/llm/gatewayClient.ts +299 -0
  162. package/src/llm/messageProvenance.js +46 -0
  163. package/src/llm/messageProvenance.ts +58 -0
  164. package/src/llm/modelProvider.js +1 -0
  165. package/src/llm/modelProvider.ts +22 -0
  166. package/src/llm/providers/anthropicFormat.js +108 -1
  167. package/src/llm/providers/anthropicFormat.ts +115 -4
  168. package/src/llm/providers/openaiFormat.js +9 -0
  169. package/src/llm/providers/openaiFormat.ts +12 -3
  170. package/src/loop.js +319 -54
  171. package/src/loop.ts +373 -57
  172. package/src/main.js +4 -1
  173. package/src/main.tsx +4 -1
  174. package/src/managedExecution/index.js +2 -0
  175. package/src/managedExecution/index.ts +2 -0
  176. package/src/managedExecution/registry.js +15 -0
  177. package/src/managedExecution/registry.ts +20 -0
  178. package/src/managedExecution/types.js +1 -0
  179. package/src/managedExecution/types.ts +86 -0
  180. package/src/modelRef.js +9 -0
  181. package/src/modelRef.ts +31 -0
  182. package/src/multimodal.js +14 -28
  183. package/src/multimodal.ts +17 -33
  184. package/src/net/lanDiscovery.js +65 -0
  185. package/src/net/lanDiscovery.ts +82 -0
  186. package/src/plugin-sdk.js +28 -3
  187. package/src/plugin-sdk.ts +39 -6
  188. package/src/plugins/pluginApi.ts +16 -1
  189. package/src/plugins/pluginLoader.js +4 -0
  190. package/src/plugins/pluginLoader.ts +6 -0
  191. package/src/plugins/pluginRunner.js +139 -7
  192. package/src/plugins/pluginRunner.ts +173 -9
  193. package/src/plugins/slashFallback.js +113 -0
  194. package/src/plugins/slashFallback.ts +137 -0
  195. package/src/prompts/policyRegistry.js +12 -32
  196. package/src/prompts/policyRegistry.ts +15 -32
  197. package/src/prompts/promptAssembly.js +103 -12
  198. package/src/prompts/promptAssembly.ts +114 -12
  199. package/src/prompts/skillList.js +21 -3
  200. package/src/prompts/skillList.ts +27 -2
  201. package/src/prompts/stableSystemPrompt.js +18 -0
  202. package/src/prompts/stableSystemPrompt.ts +33 -0
  203. package/src/runtime/agentRuntimeContext.js +8 -2
  204. package/src/runtime/agentRuntimeContext.ts +17 -4
  205. package/src/session/runAgentTurn.js +78 -12
  206. package/src/session/runAgentTurn.ts +105 -23
  207. package/src/session/runTurn.js +10 -9
  208. package/src/session/runTurn.ts +17 -8
  209. package/src/session/sessionState.ts +2 -0
  210. package/src/team/auth.js +186 -0
  211. package/src/team/auth.ts +298 -0
  212. package/src/team/cli.js +105 -0
  213. package/src/team/cli.ts +122 -0
  214. package/src/team/onlineToolContract.js +64 -0
  215. package/src/team/onlineToolContract.ts +109 -0
  216. package/src/team/toolPolicy.js +36 -0
  217. package/src/team/toolPolicy.ts +75 -0
  218. package/src/tools/advisor/advisor.js +90 -46
  219. package/src/tools/advisor/advisor.ts +100 -47
  220. package/src/tools/advisor/advisorDecision.js +71 -0
  221. package/src/tools/advisor/advisorDecision.ts +85 -0
  222. package/src/tools/agent/agent.js +18 -5
  223. package/src/tools/agent/agent.ts +21 -7
  224. package/src/tools/agent/agentControl.js +246 -0
  225. package/src/tools/agent/agentControl.ts +284 -0
  226. package/src/tools/agent/agentTaskService.js +40 -1
  227. package/src/tools/agent/agentTaskService.ts +44 -1
  228. package/src/tools/agent/agentTypes.js +14 -2
  229. package/src/tools/agent/agentTypes.ts +15 -2
  230. package/src/tools/applypatch/applyPatch.js +362 -0
  231. package/src/tools/applypatch/applyPatch.ts +428 -0
  232. package/src/tools/bash/bash.js +22 -15
  233. package/src/tools/bash/bash.ts +23 -17
  234. package/src/tools/capabilities.js +10 -5
  235. package/src/tools/capabilities.ts +10 -5
  236. package/src/tools/computeruse/computerIntent.js +32 -0
  237. package/src/tools/computeruse/computerIntent.ts +46 -0
  238. package/src/tools/computeruse/telemetryLog.js +12 -0
  239. package/src/tools/computeruse/telemetryLog.ts +16 -0
  240. package/src/tools/computeruse/vision/telemetry.js +1 -0
  241. package/src/tools/computeruse/vision/telemetry.ts +1 -0
  242. package/src/tools/effectiveToolSet.js +4 -0
  243. package/src/tools/effectiveToolSet.ts +4 -0
  244. package/src/tools/index.js +21 -2
  245. package/src/tools/index.ts +33 -2
  246. package/src/tools/presentresult/presentresult.js +6 -15
  247. package/src/tools/presentresult/presentresult.ts +6 -15
  248. package/src/tools/read/read.js +62 -9
  249. package/src/tools/read/read.ts +63 -9
  250. package/src/tools/shared/fileUtils.js +1 -2
  251. package/src/tools/shared/fileUtils.ts +1 -2
  252. package/src/tools/shared/toolOutputStore.js +23 -1
  253. package/src/tools/shared/toolOutputStore.ts +22 -1
  254. package/src/tools/skill/skill.js +9 -3
  255. package/src/tools/skill/skill.ts +8 -4
  256. package/src/tools/toolPromptGuides.js +117 -0
  257. package/src/tools/toolPromptGuides.ts +137 -0
  258. package/src/tools/webbrowser/agentBrowserPath.js +19 -9
  259. package/src/tools/webbrowser/agentBrowserPath.ts +70 -28
  260. package/src/tools/webbrowser/browser.js +27 -11
  261. package/src/tools/webbrowser/browser.ts +68 -24
  262. package/src/tools/webbrowser/browserAutomation.js +329 -0
  263. package/src/tools/webbrowser/browserAutomation.ts +467 -0
  264. package/src/tools/webbrowser/browserAxState.js +97 -0
  265. package/src/tools/webbrowser/browserAxState.ts +142 -0
  266. package/src/tools/webbrowser/browserBatch.js +1578 -0
  267. package/src/tools/webbrowser/browserBatch.ts +2382 -0
  268. package/src/tools/webbrowser/browserCdp.js +208 -0
  269. package/src/tools/webbrowser/browserCdp.ts +255 -0
  270. package/src/tools/webbrowser/browserConditions.js +24 -0
  271. package/src/tools/webbrowser/browserConditions.ts +45 -0
  272. package/src/tools/webbrowser/browserContent.js +281 -0
  273. package/src/tools/webbrowser/browserContent.ts +438 -0
  274. package/src/tools/webbrowser/browserControl.js +131 -34
  275. package/src/tools/webbrowser/browserControl.ts +210 -56
  276. package/src/tools/webbrowser/browserDaemon.js +22 -14
  277. package/src/tools/webbrowser/browserDaemon.ts +54 -21
  278. package/src/tools/webbrowser/browserFrames.js +47 -0
  279. package/src/tools/webbrowser/browserFrames.ts +54 -0
  280. package/src/tools/webbrowser/browserInteractionResolver.js +17 -0
  281. package/src/tools/webbrowser/browserInteractionResolver.ts +40 -0
  282. package/src/tools/webbrowser/browserLocator.js +140 -0
  283. package/src/tools/webbrowser/browserLocator.ts +194 -0
  284. package/src/tools/webbrowser/browserOutcome.js +10 -17
  285. package/src/tools/webbrowser/browserOutcome.ts +48 -31
  286. package/src/tools/webbrowser/browserRecovery.js +58 -0
  287. package/src/tools/webbrowser/browserRecovery.ts +83 -0
  288. package/src/tools/webbrowser/browserRunRegistry.js +35 -3
  289. package/src/tools/webbrowser/browserRunRegistry.ts +91 -15
  290. package/src/tools/webbrowser/browserService.js +28 -2
  291. package/src/tools/webbrowser/browserService.ts +49 -9
  292. package/src/tools/webbrowser/browserStream.js +132 -33
  293. package/src/tools/webbrowser/browserStream.ts +224 -50
  294. package/src/tools/webbrowser/browserTabs.js +48 -15
  295. package/src/tools/webbrowser/browserTabs.ts +178 -96
  296. package/src/tools/webbrowser/webbrowser.js +679 -144
  297. package/src/tools/webbrowser/webbrowser.ts +975 -236
  298. package/src/tools/webfetch/preapproved.js +0 -2
  299. package/src/tools/webfetch/preapproved.ts +0 -2
  300. package/src/tools/websearch/websearch.js +129 -8
  301. package/src/tools/websearch/websearch.ts +138 -6
  302. package/src/types.ts +440 -38
  303. package/src/ui/App.js +377 -58
  304. package/src/ui/App.tsx +576 -111
  305. package/src/ui/LiveArea.js +14 -8
  306. package/src/ui/LiveArea.tsx +14 -10
  307. package/src/ui/MessageList.js +63 -20
  308. package/src/ui/MessageList.tsx +101 -16
  309. package/src/ui/ModelPicker.js +7 -4
  310. package/src/ui/ModelPicker.tsx +55 -8
  311. package/src/ui/hooks/useChat.js +152 -163
  312. package/src/ui/hooks/useChat.ts +396 -334
  313. package/src/ui/loginCommand.js +56 -0
  314. package/src/ui/loginCommand.ts +63 -0
  315. package/src/ui/toolProgress.js +41 -0
  316. package/src/ui/toolProgress.ts +44 -0
  317. package/src/web/browserBridge.js +20 -2
  318. package/src/web/browserBridge.ts +20 -2
  319. package/src/web/protocol.ts +1897 -194
  320. package/workflows/adaptive-research/workflow.mjs +86 -0
  321. package/workflows/e2e-capabilities/workflow.mjs +102 -0
  322. package/workflows/e2e-llm/workflow.mjs +52 -0
  323. package/workflows/e2e-smoke/workflow.mjs +59 -0
  324. package/workflows/e2e-vision-schema/README.md +48 -0
  325. package/workflows/e2e-vision-schema/workflow.mjs +149 -0
  326. package/workflows/e2e-write-greet/workflow.mjs +37 -0
  327. package/workflows/file-census/README.md +14 -0
  328. package/workflows/file-census/scripts/.gitkeep +2 -0
  329. package/workflows/file-census/workflow.mjs +110 -0
  330. package/workflows/goal/README.md +166 -0
  331. package/workflows/goal/prompts/audit.md +57 -0
  332. package/workflows/goal/prompts/contract.md +56 -0
  333. package/workflows/goal/prompts/iterate.md +37 -0
  334. package/workflows/goal/workflow.mjs +501 -0
  335. package/workflows/illustrate/README.md +90 -0
  336. package/workflows/illustrate/assets/engines.json +20 -0
  337. package/workflows/illustrate/assets/extract-baidu.js +21 -0
  338. package/workflows/illustrate/assets/extract-bing.js +33 -0
  339. package/workflows/illustrate/assets/extract-google.js +31 -0
  340. package/workflows/illustrate/workflow.mjs +301 -0
  341. package/workflows/plan/workflow.mjs +389 -0
  342. package/workflows/question-crops/README.md +35 -0
  343. package/workflows/question-crops/prompts/inventory.md +23 -0
  344. package/workflows/question-crops/scripts/image-ops.mjs +305 -0
  345. package/workflows/question-crops/scripts/image-ops.test.mjs +95 -0
  346. package/workflows/question-crops/workflow.mjs +172 -0
  347. package/workflows/ralph-loop/workflow.mjs +162 -0
  348. package/workflows/research/README.md +74 -0
  349. package/workflows/research/prompts/s0-goal.md +43 -0
  350. package/workflows/research/prompts/s1-early-exit.md +22 -0
  351. package/workflows/research/prompts/s1-map.md +58 -0
  352. package/workflows/research/prompts/s2-options.md +53 -0
  353. package/workflows/research/prompts/s3-deep-dive.md +56 -0
  354. package/workflows/research/prompts/s4-verify.md +74 -0
  355. package/workflows/research/prompts/s5-synthesis.md +81 -0
  356. package/workflows/research/prompts/s5b-fill-gaps.md +32 -0
  357. package/workflows/research/prompts/s6-package.md +32 -0
  358. package/workflows/research/scripts/build-report.mjs +98 -0
  359. package/workflows/research/workflow.mjs +288 -0
  360. package/workflows/wechat-reading-shots/prompts/collect-params.md +16 -0
  361. package/workflows/wechat-reading-shots/prompts/evaluate.md +20 -0
  362. package/workflows/wechat-reading-shots/prompts/open-book.md +28 -0
  363. package/workflows/wechat-reading-shots/prompts/read-page.md +13 -0
  364. package/workflows/wechat-reading-shots/prompts/turn-batch.md +24 -0
  365. package/workflows/wechat-reading-shots/test/control-flow.test.ts +329 -0
  366. package/workflows/wechat-reading-shots/workflow.mjs +266 -0
  367. package/workflows/wrong-question-docx/README.md +55 -0
  368. package/workflows/wrong-question-docx/prompts/figure-qa.md +8 -0
  369. package/workflows/wrong-question-docx/prompts/transcribe.md +25 -0
  370. package/workflows/wrong-question-docx/scripts/workbook.mjs +857 -0
  371. package/workflows/wrong-question-docx/test/control-flow.test.ts +165 -0
  372. package/workflows/wrong-question-docx/test/workbook.test.mjs +303 -0
  373. package/workflows/wrong-question-docx/workflow.mjs +485 -0
  374. package/plugins/workflow-runner/src/agentCommon.js +0 -354
  375. package/plugins/workflow-runner/src/agentCommon.ts +0 -435
  376. package/plugins/workflow-runner/src/controlFlow/branch.js +0 -40
  377. package/plugins/workflow-runner/src/controlFlow/branch.ts +0 -46
  378. package/plugins/workflow-runner/src/controlFlow/loop.js +0 -211
  379. package/plugins/workflow-runner/src/controlFlow/loop.ts +0 -248
  380. package/plugins/workflow-runner/src/controlFlow/pause.js +0 -129
  381. package/plugins/workflow-runner/src/controlFlow/pause.ts +0 -141
  382. package/plugins/workflow-runner/src/controlFlow/signal.js +0 -21
  383. package/plugins/workflow-runner/src/controlFlow/signal.ts +0 -29
  384. package/plugins/workflow-runner/src/controlFlow/types.js +0 -18
  385. package/plugins/workflow-runner/src/controlFlow/types.ts +0 -63
  386. package/plugins/workflow-runner/src/dslManifest.js +0 -72
  387. package/plugins/workflow-runner/src/dslManifest.ts +0 -127
  388. package/plugins/workflow-runner/src/expressions.js +0 -639
  389. package/plugins/workflow-runner/src/expressions.ts +0 -640
  390. package/plugins/workflow-runner/src/loader.js +0 -573
  391. package/plugins/workflow-runner/src/loader.ts +0 -721
  392. package/plugins/workflow-runner/src/multimodal.js +0 -38
  393. package/plugins/workflow-runner/src/multimodal.ts +0 -64
  394. package/plugins/workflow-runner/src/recovery.js +0 -126
  395. package/plugins/workflow-runner/src/recovery.ts +0 -156
  396. package/plugins/workflow-runner/src/stepExecutors/agent.js +0 -173
  397. package/plugins/workflow-runner/src/stepExecutors/agent.ts +0 -234
  398. package/plugins/workflow-runner/src/stepExecutors/assert.js +0 -42
  399. package/plugins/workflow-runner/src/stepExecutors/assert.ts +0 -52
  400. package/plugins/workflow-runner/src/stepExecutors/echo.js +0 -31
  401. package/plugins/workflow-runner/src/stepExecutors/echo.ts +0 -38
  402. package/plugins/workflow-runner/src/stepExecutors/llm.js +0 -99
  403. package/plugins/workflow-runner/src/stepExecutors/llm.ts +0 -133
  404. package/plugins/workflow-runner/src/stepExecutors/set.js +0 -49
  405. package/plugins/workflow-runner/src/stepExecutors/set.ts +0 -56
  406. package/plugins/workflow-runner/src/stepExecutors/skill.js +0 -111
  407. package/plugins/workflow-runner/src/stepExecutors/skill.ts +0 -140
  408. package/plugins/workflow-runner/src/stepExecutors/tool.js +0 -227
  409. package/plugins/workflow-runner/src/stepExecutors/tool.ts +0 -274
  410. package/plugins/workflow-runner/src/stepExecutors/verify.js +0 -61
  411. package/plugins/workflow-runner/src/stepExecutors/verify.ts +0 -72
  412. package/plugins/workflow-runner/src/stepPipeline.js +0 -277
  413. package/plugins/workflow-runner/src/stepPipeline.ts +0 -366
  414. package/plugins/workflow-runner/test/agent.test.ts +0 -587
  415. package/plugins/workflow-runner/test/agentLlmError.test.ts +0 -373
  416. package/plugins/workflow-runner/test/bashBlacklist.sweep.test.ts +0 -65
  417. package/plugins/workflow-runner/test/captureMisbind.test.ts +0 -99
  418. package/plugins/workflow-runner/test/cli.e2e.test.ts +0 -167
  419. package/plugins/workflow-runner/test/context-files.test.ts +0 -320
  420. package/plugins/workflow-runner/test/e2e.test.ts +0 -370
  421. package/plugins/workflow-runner/test/e2eNewLayout.test.ts +0 -314
  422. package/plugins/workflow-runner/test/engineRobustness.test.ts +0 -234
  423. package/plugins/workflow-runner/test/expressions.test.ts +0 -439
  424. package/plugins/workflow-runner/test/foundation.test.ts +0 -126
  425. package/plugins/workflow-runner/test/graceful.test.ts +0 -139
  426. package/plugins/workflow-runner/test/greedyInputs.load.test.ts +0 -47
  427. package/plugins/workflow-runner/test/hostCapability.test.ts +0 -108
  428. package/plugins/workflow-runner/test/illustrate.load.test.ts +0 -183
  429. package/plugins/workflow-runner/test/jsonPayload.test.ts +0 -83
  430. package/plugins/workflow-runner/test/loader.test.ts +0 -617
  431. package/plugins/workflow-runner/test/maxTurnsRetryDelay.test.ts +0 -33
  432. package/plugins/workflow-runner/test/multimodal.test.ts +0 -342
  433. package/plugins/workflow-runner/test/output-schema.test.ts +0 -213
  434. package/plugins/workflow-runner/test/parseWorkflowArgs.test.ts +0 -106
  435. package/plugins/workflow-runner/test/pluginRunner.isolation.test.ts +0 -269
  436. package/plugins/workflow-runner/test/ppt.load.test.ts +0 -1220
  437. package/plugins/workflow-runner/test/ralphLoop.e2e.test.ts +0 -221
  438. package/plugins/workflow-runner/test/recovery.test.ts +0 -265
  439. package/plugins/workflow-runner/test/research.load.test.ts +0 -328
  440. package/plugins/workflow-runner/test/runner.test.ts +0 -911
  441. package/plugins/workflow-runner/test/runnerPreflight.test.ts +0 -436
  442. package/plugins/workflow-runner/test/skillTurnDone.test.ts +0 -71
  443. package/plugins/workflow-runner/test/stateLifecycle.test.ts +0 -198
  444. package/plugins/workflow-runner/test/stepPipeline.test.ts +0 -114
  445. package/plugins/workflow-runner/test/taskArbitration.test.ts +0 -354
  446. package/plugins/workflow-runner/test/taskLifecycle.test.ts +0 -324
  447. package/plugins/workflow-runner/test/toolArtifactOverwrite.test.ts +0 -221
  448. package/plugins/workflow-runner/test/toolCapabilityBoundary.test.ts +0 -29
  449. package/plugins/workflow-runner/test/toolRuntimeIntegration.test.ts +0 -168
  450. package/plugins/workflow-runner/test/webppt.load.test.ts +0 -250
  451. package/plugins/workflow-runner/test/word.load.test.ts +0 -208
  452. package/plugins/workflow-runner/test/workflows.smoke.test.ts +0 -76
  453. package/plugins/workflow-runner/test/yamlGuardConditions.test.ts +0 -207
  454. package/src/advisorState.js +0 -22
  455. package/src/cli/configWizard.js +0 -293
  456. package/src/tools/toolProgressBridge.js +0 -48
  457. package/workflows/adaptive-research.yaml +0 -50
  458. package/workflows/book-review-short.yaml +0 -125
  459. package/workflows/e2e-write-greet.yaml +0 -31
  460. package/workflows/illustrate.yaml +0 -227
  461. package/workflows/plan.yaml +0 -470
  462. package/workflows/ppt.yaml +0 -1670
  463. package/workflows/ralph-loop.yaml +0 -201
  464. package/workflows/research.yaml +0 -873
  465. package/workflows/schema.json +0 -176
  466. package/workflows/webppt.yaml +0 -496
  467. package/workflows/wechat-reading-shots.yaml +0 -315
  468. package/workflows/word.yaml +0 -720
  469. package/workflows/youtube-shorts.yaml +0 -202
  470. /package/workflows/{research.md → research/DESIGN.md} +0 -0
@@ -0,0 +1,169 @@
1
+ /**
2
+ * 旧项目任务板状态机(兼容层)。
3
+ *
4
+ * KakadeAI 新群协作主流程使用 CollaborationEvent,并在一次目标确认后直接运行;
5
+ * 本文件只负责已有 `conversation/workspace` 数据和旧插件的状态/动作兼容。
6
+ *
7
+ * ⚠️ 这张表原先内联在 `minimal-server/src/core/collaboration/projects.ts` 里
8
+ * (`WORK_ITEM_TRANSITIONS`),只有服务端看得到。前端要预测"按钮该不该亮"就得再抄一份,
9
+ * 两份必然漂移,漂移的后果是「界面能点、点了被拒」——最糟的一类交互。
10
+ * 所以兼容代码仍共享这一份,避免旧前后端漂移。
11
+ *
12
+ * 相对原表只加了一个状态 `proposed`(方案待审)。「待验收」沿用既有的 `review`
13
+ * (UI 里本来就叫"评审"),不造同义状态。
14
+ *
15
+ * 与 projects.ts 里其余守卫的分工:
16
+ * 这里管「状态怎么流转」和「谁有资格推动」;
17
+ * projects.ts 继续管数据完整性类守卫(验收条件必填、执行者不能评审自己、
18
+ * 进入执行要有仓库/分支/文件范围、完成前要有已接受的交接单)。两者互补,不重叠。
19
+ */
20
+
21
+ /** 任务卡状态。与 protocol.ts 的 `WorkItemStatus` 同一套值。 */
22
+ export type TaskStatus =
23
+ | 'backlog' // 待规划:还没指派
24
+ | 'ready' // 已派单:等被指派者提方案(执行者是人时可直接开工)
25
+ | 'proposed' // 方案待审:**人拍板点 #2**
26
+ | 'in_progress' // 执行中
27
+ | 'review' // 待验收:**人拍板点 #3**
28
+ | 'blocked' // 阻塞
29
+ | 'done'; // 完成(终态)
30
+
31
+ /**
32
+ * 合法流转表。**服务端与前端共用这一份。**
33
+ *
34
+ * `ready → in_progress` 是新旧迁移的默认直连。`submitPlan/approvePlan` 仅在旧任务
35
+ * 显式选择方案评审时使用,服务端不得再把它强制成所有 Agent 任务的第二次人工确认。
36
+ */
37
+ export const TASK_TRANSITIONS: Record<TaskStatus, TaskStatus[]> = {
38
+ backlog: ['ready'],
39
+ ready: ['backlog', 'proposed', 'in_progress', 'blocked'],
40
+ proposed: ['ready', 'in_progress', 'blocked'],
41
+ in_progress: ['review', 'blocked'],
42
+ blocked: ['in_progress', 'backlog'],
43
+ review: ['in_progress', 'done', 'blocked'],
44
+ done: [],
45
+ };
46
+
47
+ export type TaskAction =
48
+ | 'assign' // 人:派单
49
+ | 'submitPlan' // agent:提方案
50
+ | 'approvePlan' // 兼容旧任务:显式方案评审(新主流程不要求)
51
+ | 'rejectPlan' // 人:打回方案(须带理由)
52
+ | 'submitHandoff' // agent:交交接单 + 自检
53
+ | 'accept' // 人:验收通过
54
+ | 'rework' // 人:返工(须带理由)
55
+ | 'block'
56
+ | 'unblock';
57
+
58
+ export interface TaskActor {
59
+ /** 群成员 id:'user:<id>' 或 'agent-session:<id>'。 */
60
+ memberId: string;
61
+ kind: 'human' | 'agent';
62
+ }
63
+
64
+ /** 判定所需的任务卡最小切片(不依赖完整 WorkItem,便于服务端与 UI 共用)。 */
65
+ export interface TaskFlowState {
66
+ status: TaskStatus;
67
+ /** 被指派干活的成员。 */
68
+ ownerMemberId: string;
69
+ /** 指定评审人;为空表示任意人类成员都可拍板(小团队默认不设卡点)。 */
70
+ reviewerIds: string[];
71
+ createdBy: string;
72
+ }
73
+
74
+ export interface TaskDecision {
75
+ allowed: boolean;
76
+ reason?: string;
77
+ }
78
+
79
+ const TRANSITION: Record<TaskAction, TaskStatus> = {
80
+ assign: 'ready',
81
+ submitPlan: 'proposed',
82
+ approvePlan: 'in_progress',
83
+ rejectPlan: 'ready', // 打回回到已派单:同一张卡、同一个执行者重提方案
84
+ submitHandoff: 'review',
85
+ accept: 'done',
86
+ rework: 'in_progress',
87
+ block: 'blocked',
88
+ unblock: 'in_progress',
89
+ };
90
+
91
+ const ALLOWED_FROM: Record<TaskAction, TaskStatus[]> = {
92
+ assign: ['backlog'],
93
+ submitPlan: ['ready'],
94
+ approvePlan: ['proposed'],
95
+ rejectPlan: ['proposed'],
96
+ submitHandoff: ['in_progress'],
97
+ accept: ['review'],
98
+ rework: ['review'],
99
+ block: ['ready', 'proposed', 'in_progress', 'review'],
100
+ unblock: ['blocked'],
101
+ };
102
+
103
+ const AGENT_ACTIONS: TaskAction[] = ['submitPlan', 'submitHandoff'];
104
+ /** 旧任务板中由人触发的动作;新主流程只保留目标确认和最终验收。 */
105
+ const HUMAN_ACTIONS: TaskAction[] = ['assign', 'approvePlan', 'rejectPlan', 'accept', 'rework', 'block', 'unblock'];
106
+ /** 打回和返工不写原因,对面无从改起。 */
107
+ const REASON_REQUIRED: TaskAction[] = ['rejectPlan', 'rework'];
108
+
109
+ export function isAgentMember(memberId: string): boolean {
110
+ return memberId.startsWith('agent:') || memberId.startsWith('agent-session:');
111
+ }
112
+
113
+ export function nextStatus(action: TaskAction): TaskStatus {
114
+ return TRANSITION[action];
115
+ }
116
+
117
+ /** 纯粹的流转合法性(不看是谁)。projects.ts 用它替换原先内联的表。 */
118
+ export function canTransition(from: TaskStatus, to: TaskStatus): boolean {
119
+ return from === to || TASK_TRANSITIONS[from].includes(to);
120
+ }
121
+
122
+ export function canAct(
123
+ task: TaskFlowState,
124
+ action: TaskAction,
125
+ actor: TaskActor,
126
+ input: { reason?: string } = {},
127
+ ): TaskDecision {
128
+ if (task.status === 'done') return { allowed: false, reason: '任务已完成,不能再改动' };
129
+
130
+ if (!ALLOWED_FROM[action].includes(task.status)) {
131
+ if (action === 'approvePlan') return { allowed: false, reason: '还没有待审的方案' };
132
+ if (action === 'accept' || action === 'rework') return { allowed: false, reason: '任务还没有进入待验收' };
133
+ if (action === 'submitHandoff') return { allowed: false, reason: '进入执行后才能交付' };
134
+ return { allowed: false, reason: '当前状态不允许该操作' };
135
+ }
136
+
137
+ if (AGENT_ACTIONS.includes(action)) {
138
+ if (actor.kind !== 'agent') return { allowed: false, reason: '该动作由被指派的 agent 提交' };
139
+ if (actor.memberId !== task.ownerMemberId) return { allowed: false, reason: '只有被指派的 agent 能提交' };
140
+ return { allowed: true };
141
+ }
142
+
143
+ if (HUMAN_ACTIONS.includes(action)) {
144
+ // agent 永远不能替人拍板,否则"人只对方案/结果负责"就是空话。
145
+ if (actor.kind !== 'human') return { allowed: false, reason: '只有人类成员能拍板' };
146
+ const isVerdict = action === 'approvePlan' || action === 'rejectPlan' || action === 'accept' || action === 'rework';
147
+ if (isVerdict && task.reviewerIds.length > 0 && !task.reviewerIds.includes(actor.memberId)) {
148
+ return { allowed: false, reason: '这张卡指定了评审人,只有评审人能拍板' };
149
+ }
150
+ if (REASON_REQUIRED.includes(action) && !input.reason?.trim()) {
151
+ return { allowed: false, reason: '请填写原因,对方才知道要改什么' };
152
+ }
153
+ return { allowed: true };
154
+ }
155
+
156
+ return { allowed: false, reason: '未知操作' };
157
+ }
158
+
159
+ /** @deprecated 新主流程在一次目标确认后直接执行;仅保留导出避免旧插件崩溃。 */
160
+ export function requiresPlanApproval(_ownerMemberId: string, _from: TaskStatus, _to: TaskStatus): boolean {
161
+ return false;
162
+ }
163
+
164
+ /** 给 UI:当前这个人/agent 在这张卡上能做哪些动作(决定按钮亮不亮)。 */
165
+ export function taskActionsFor(task: TaskFlowState, actor: TaskActor): TaskAction[] {
166
+ const all = Object.keys(TRANSITION) as TaskAction[];
167
+ // 带理由的动作按"已填理由"预判:按钮要先亮出来,用户才有地方填理由。
168
+ return all.filter((action) => canAct(task, action, actor, { reason: '预检' }).allowed);
169
+ }
@@ -2,13 +2,26 @@
2
2
  * 浏览器与 Node/Bun 都可安全加载的纯配置默认值。
3
3
  * 不得在此模块引入 node:*、文件系统或运行时路径逻辑。
4
4
  */
5
+ /**
6
+ * 子任务默认值。
7
+ *
8
+ * **为什么 explore(200) 比 general(100) 还宽**(这不是漂移,是刻意的,但此前没写下来):
9
+ * explore 的工具面被 `agentTypes.ts::EXPLORE_ALLOWED_TOOLS` 硬裁成严格只读,
10
+ * 跑再多轮也**毁不掉任何东西**,代价只有 token;general 能写工作区,失控的代价是
11
+ * 真实损坏,所以反而要收紧。「安全的那个给宽、危险的那个给窄」——
12
+ * 这与 `resolveAgentType` 未知类型一律回落 explore 是同一条安全默认原则。
13
+ *
14
+ * ⚠️ `agentTypes.ts` 的 `EXPLORE_DEF/GENERAL_DEF.maxTurns` 从这里取值,**不要在那边
15
+ * 再写一份字面量**:那两个数曾经各存一份(都是 200/100),改一处漏一处就会出现
16
+ * 「有 subagentConfig 时 200、没有时 50」这种只在缺省路径上显形的分裂。
17
+ */
5
18
  export const DEFAULT_SUBAGENTS_CONFIG = {
6
19
  enabled: true,
7
20
  maxCallsPerTurn: 6,
8
21
  maxConcurrent: 3,
9
22
  defaultWriteIsolation: 'none',
10
23
  timeoutMs: 1_800_000,
11
- exploreMaxTurns: 50,
24
+ exploreMaxTurns: 200,
12
25
  generalMaxTurns: 100,
13
26
  };
14
27
  export const DEFAULT_BROWSER_CONFIG = {
@@ -23,3 +36,30 @@ export const DEFAULT_COMPUTER_USE_CONFIG = {
23
36
  maxImagePixels: 1_600_000,
24
37
  observationFrames: 1,
25
38
  };
39
+ /**
40
+ * Advisor 默认值——5 处散落魔术数字的「唯一真值」。
41
+ * 任何 advisor 默认值变更只能改这里,否则就是 numericLimits.ts 注释预言的
42
+ *「用户改不回值」事故类型(同 DEFAULT_SUBAGENTS_CONFIG / DEFAULT_BROWSER_CONFIG 范式)。
43
+ *
44
+ * inputTokenBudget:256K 是 2026-08 的新默认值,从 128K 提到 256K 的理由:
45
+ * 1. note 上限放宽到 100K 字符(≈100K token)后,128K 预算几乎被 note 吃光,
46
+ * 历史只能塞几十 K——首句级评审失效。
47
+ * 2. 主模型普遍升级到 1M 上下文,顾问模型同档位;256K 仍远小于 1M,预算充裕。
48
+ * 3. fitAdvisorBudget 会自动按「顾问模型 contextWindow - maxTokens - 4096」二次收窄,
49
+ * 小窗口模型不会被撑爆。
50
+ *
51
+ * timeoutMs:120s 是 2026-08 的新默认值,从 180s 压到 120s 的理由:
52
+ * 180s 在快模型上等太久(用户实际配置中已主动压到 90s 撞墙过),
53
+ * 60s 在重思考模型上 P95 不够;120s 是 openai / Claude / DeepSeek 系列 P95 的折中。
54
+ * 重思考专家(DeepSeek-R1、o1/o3 类)用户可上调到 300-600s。
55
+ */
56
+ export const DEFAULT_ADVISOR_CONFIG = {
57
+ // 顾问会增加额外模型调用和延迟;必须由用户显式开启。
58
+ enabled: false,
59
+ mode: 'auto',
60
+ modelId: null,
61
+ contextPolicy: 'full-relevant',
62
+ shareSensitive: false,
63
+ inputTokenBudget: 256_000,
64
+ timeoutMs: 120_000,
65
+ };
@@ -1,4 +1,5 @@
1
1
  import type {
2
+ AdvisorConfig,
2
3
  BrowserConfig,
3
4
  ComputerUseConfig,
4
5
  SubagentsConfig,
@@ -8,13 +9,26 @@ import type {
8
9
  * 浏览器与 Node/Bun 都可安全加载的纯配置默认值。
9
10
  * 不得在此模块引入 node:*、文件系统或运行时路径逻辑。
10
11
  */
12
+ /**
13
+ * 子任务默认值。
14
+ *
15
+ * **为什么 explore(200) 比 general(100) 还宽**(这不是漂移,是刻意的,但此前没写下来):
16
+ * explore 的工具面被 `agentTypes.ts::EXPLORE_ALLOWED_TOOLS` 硬裁成严格只读,
17
+ * 跑再多轮也**毁不掉任何东西**,代价只有 token;general 能写工作区,失控的代价是
18
+ * 真实损坏,所以反而要收紧。「安全的那个给宽、危险的那个给窄」——
19
+ * 这与 `resolveAgentType` 未知类型一律回落 explore 是同一条安全默认原则。
20
+ *
21
+ * ⚠️ `agentTypes.ts` 的 `EXPLORE_DEF/GENERAL_DEF.maxTurns` 从这里取值,**不要在那边
22
+ * 再写一份字面量**:那两个数曾经各存一份(都是 200/100),改一处漏一处就会出现
23
+ * 「有 subagentConfig 时 200、没有时 50」这种只在缺省路径上显形的分裂。
24
+ */
11
25
  export const DEFAULT_SUBAGENTS_CONFIG: SubagentsConfig = {
12
26
  enabled: true,
13
27
  maxCallsPerTurn: 6,
14
28
  maxConcurrent: 3,
15
29
  defaultWriteIsolation: 'none',
16
30
  timeoutMs: 1_800_000,
17
- exploreMaxTurns: 50,
31
+ exploreMaxTurns: 200,
18
32
  generalMaxTurns: 100,
19
33
  };
20
34
 
@@ -31,3 +45,31 @@ export const DEFAULT_COMPUTER_USE_CONFIG: ComputerUseConfig = {
31
45
  maxImagePixels: 1_600_000,
32
46
  observationFrames: 1,
33
47
  };
48
+
49
+ /**
50
+ * Advisor 默认值——5 处散落魔术数字的「唯一真值」。
51
+ * 任何 advisor 默认值变更只能改这里,否则就是 numericLimits.ts 注释预言的
52
+ *「用户改不回值」事故类型(同 DEFAULT_SUBAGENTS_CONFIG / DEFAULT_BROWSER_CONFIG 范式)。
53
+ *
54
+ * inputTokenBudget:256K 是 2026-08 的新默认值,从 128K 提到 256K 的理由:
55
+ * 1. note 上限放宽到 100K 字符(≈100K token)后,128K 预算几乎被 note 吃光,
56
+ * 历史只能塞几十 K——首句级评审失效。
57
+ * 2. 主模型普遍升级到 1M 上下文,顾问模型同档位;256K 仍远小于 1M,预算充裕。
58
+ * 3. fitAdvisorBudget 会自动按「顾问模型 contextWindow - maxTokens - 4096」二次收窄,
59
+ * 小窗口模型不会被撑爆。
60
+ *
61
+ * timeoutMs:120s 是 2026-08 的新默认值,从 180s 压到 120s 的理由:
62
+ * 180s 在快模型上等太久(用户实际配置中已主动压到 90s 撞墙过),
63
+ * 60s 在重思考模型上 P95 不够;120s 是 openai / Claude / DeepSeek 系列 P95 的折中。
64
+ * 重思考专家(DeepSeek-R1、o1/o3 类)用户可上调到 300-600s。
65
+ */
66
+ export const DEFAULT_ADVISOR_CONFIG: AdvisorConfig = {
67
+ // 顾问会增加额外模型调用和延迟;必须由用户显式开启。
68
+ enabled: false,
69
+ mode: 'auto',
70
+ modelId: null,
71
+ contextPolicy: 'full-relevant',
72
+ shareSensitive: false,
73
+ inputTokenBudget: 256_000,
74
+ timeoutMs: 120_000,
75
+ };
@@ -1,4 +1,4 @@
1
- import type { Provider } from '../types.js';
1
+ import type { LocalProvider } from '../types.js';
2
2
  import type { ModelConfig } from './configFile.js';
3
3
  import { type ConfigService, configService } from './configService.js';
4
4
 
@@ -27,7 +27,7 @@ function providerFromModel(
27
27
  | 'supportsVision'
28
28
  | 'promptCache'
29
29
  >,
30
- ): Provider {
30
+ ): LocalProvider {
31
31
  return {
32
32
  name: model.displayName ?? model.model,
33
33
  apiFormat: model.apiFormat,
@@ -2,11 +2,11 @@ import { randomUUID } from 'node:crypto';
2
2
  import { chmod, copyFile, mkdir, readFile, rename, rm, stat, unlink, writeFile } from 'node:fs/promises';
3
3
  import { homedir } from 'node:os';
4
4
  import { dirname, join } from 'node:path';
5
- import { execSiblingDir } from '../utils/greenRoot.js';
6
5
  import { normalizePromptCacheMode } from '../llm/promptCache.js';
6
+ import { execSiblingDir } from '../utils/greenRoot.js';
7
+ import { DEFAULT_ADVISOR_CONFIG, DEFAULT_BROWSER_CONFIG, DEFAULT_COMPUTER_USE_CONFIG, DEFAULT_SUBAGENTS_CONFIG, } from './configDefaults.js';
7
8
  import { CONFIG_LIMITS, normalizeLimited } from './numericLimits.js';
8
- import { DEFAULT_BROWSER_CONFIG, DEFAULT_COMPUTER_USE_CONFIG, DEFAULT_SUBAGENTS_CONFIG, } from './configDefaults.js';
9
- export { DEFAULT_BROWSER_CONFIG, DEFAULT_COMPUTER_USE_CONFIG, DEFAULT_SUBAGENTS_CONFIG, } from './configDefaults.js';
9
+ export { DEFAULT_ADVISOR_CONFIG, DEFAULT_BROWSER_CONFIG, DEFAULT_COMPUTER_USE_CONFIG, DEFAULT_SUBAGENTS_CONFIG, } from './configDefaults.js';
10
10
  const DEFAULT_CONTEXT_WINDOW = 128_000;
11
11
  const LOCK_STALE_MS = 120_000;
12
12
  const LOCK_WAIT_MS = 15_000;
@@ -72,6 +72,9 @@ function parseModel(value) {
72
72
  contextWindow: positiveNumber(raw.contextWindow) ?? DEFAULT_CONTEXT_WINDOW,
73
73
  ...(positiveNumber(raw.maxTokens) !== undefined ? { maxTokens: positiveNumber(raw.maxTokens) } : {}),
74
74
  supportsVision: raw.supportsVision !== false,
75
+ ...(typeof raw.supportsJsonSchema === 'boolean'
76
+ ? { supportsJsonSchema: raw.supportsJsonSchema }
77
+ : {}),
75
78
  promptCache: {
76
79
  mode: normalizePromptCacheMode(raw.promptCache?.mode
77
80
  ?? defaultPromptCacheMode(baseURL)),
@@ -81,6 +84,19 @@ function parseModel(value) {
81
84
  updatedAt: positiveNumber(raw.updatedAt) ?? now,
82
85
  };
83
86
  }
87
+ function parseWorkflowModels(value) {
88
+ if (!value || typeof value !== 'object' || Array.isArray(value))
89
+ return undefined;
90
+ const roles = {};
91
+ for (const [role, candidate] of Object.entries(value)) {
92
+ if (!/^[a-z][a-z0-9_-]{0,63}$/i.test(role))
93
+ continue;
94
+ const modelId = nonEmpty(candidate);
95
+ if (modelId)
96
+ roles[role] = modelId;
97
+ }
98
+ return Object.keys(roles).length > 0 ? roles : undefined;
99
+ }
84
100
  function parseModels(value) {
85
101
  if (!Array.isArray(value))
86
102
  return [];
@@ -130,13 +146,14 @@ function parseAdvisor(value) {
130
146
  return undefined;
131
147
  const raw = value;
132
148
  return {
133
- enabled: raw.enabled !== false,
149
+ // 默认关闭;旧配置显式 enabled:true 仍保持用户选择。
150
+ enabled: raw.enabled === true,
134
151
  mode: raw.mode === 'manual' ? 'manual' : 'auto',
135
152
  modelId: nonEmpty(raw.modelId) ?? null,
136
153
  contextPolicy: 'full-relevant',
137
154
  shareSensitive: raw.shareSensitive === true,
138
- inputTokenBudget: normalizeLimited(raw.inputTokenBudget, CONFIG_LIMITS.advisorInputTokenBudget, 128_000),
139
- timeoutMs: normalizeLimited(raw.timeoutMs, CONFIG_LIMITS.advisorTimeoutMs, 180_000),
155
+ inputTokenBudget: normalizeLimited(raw.inputTokenBudget, CONFIG_LIMITS.advisorInputTokenBudget, DEFAULT_ADVISOR_CONFIG.inputTokenBudget),
156
+ timeoutMs: normalizeLimited(raw.timeoutMs, CONFIG_LIMITS.advisorTimeoutMs, DEFAULT_ADVISOR_CONFIG.timeoutMs),
140
157
  };
141
158
  }
142
159
  function parseSubagents(value) {
@@ -147,7 +164,7 @@ function parseSubagents(value) {
147
164
  maxConcurrent: normalizeLimited(raw.maxConcurrent, CONFIG_LIMITS.subagentMaxConcurrent, 3),
148
165
  defaultWriteIsolation: raw.defaultWriteIsolation === 'worktree' ? 'worktree' : 'none',
149
166
  timeoutMs: normalizeLimited(raw.timeoutMs, CONFIG_LIMITS.subagentTimeoutMs, 1_800_000),
150
- exploreMaxTurns: normalizeLimited(raw.exploreMaxTurns, CONFIG_LIMITS.subagentExploreMaxTurns, 50),
167
+ exploreMaxTurns: normalizeLimited(raw.exploreMaxTurns, CONFIG_LIMITS.subagentExploreMaxTurns, 200),
151
168
  generalMaxTurns: normalizeLimited(raw.generalMaxTurns, CONFIG_LIMITS.subagentGeneralMaxTurns, 100),
152
169
  };
153
170
  }
@@ -177,13 +194,16 @@ function parseCurrent(data) {
177
194
  if (data.version !== 4)
178
195
  return null;
179
196
  const advisor = parseAdvisor(data.advisor);
197
+ const workflowModels = parseWorkflowModels(data.workflowModels);
180
198
  const compactRatio = parseCompactRatio(data.compactRatio);
181
199
  return {
182
200
  version: 4,
183
201
  models: parseModels(data.models),
184
202
  baseModelId: nonEmpty(data.baseModelId) ?? null,
203
+ teamServerUrl: nonEmpty(data.teamServerUrl) ?? null,
185
204
  ...(compactRatio !== undefined ? { compactRatio } : {}),
186
205
  ...(advisor ? { advisor } : {}),
206
+ ...(workflowModels ? { workflowModels } : {}),
187
207
  subagents: parseSubagents(data.subagents),
188
208
  browser: parseBrowser(data.browser),
189
209
  computerUse: parseComputerUse(data.computerUse),
@@ -227,8 +247,8 @@ function parseLegacyAdvisorConfig(value) {
227
247
  provider,
228
248
  supportsVision: raw.supportsVision === true,
229
249
  shareSensitive: raw.shareSensitive === true,
230
- inputTokenBudget: normalizeLimited(raw.inputTokenBudget, CONFIG_LIMITS.advisorInputTokenBudget, 128_000),
231
- timeoutMs: normalizeLimited(raw.timeoutMs, CONFIG_LIMITS.advisorTimeoutMs, 180_000),
250
+ inputTokenBudget: normalizeLimited(raw.inputTokenBudget, CONFIG_LIMITS.advisorInputTokenBudget, DEFAULT_ADVISOR_CONFIG.inputTokenBudget),
251
+ timeoutMs: normalizeLimited(raw.timeoutMs, CONFIG_LIMITS.advisorTimeoutMs, DEFAULT_ADVISOR_CONFIG.timeoutMs),
232
252
  };
233
253
  }
234
254
  /**
@@ -294,6 +314,7 @@ function buildV4FromLegacy(legacyProvider, legacyAdvisor, subagents, tools, save
294
314
  version: 4,
295
315
  models,
296
316
  baseModelId: baseModel.id,
317
+ teamServerUrl: null,
297
318
  ...(legacyProvider.compactRatio !== undefined ? { compactRatio: legacyProvider.compactRatio } : {}),
298
319
  ...(advisor ? { advisor } : {}),
299
320
  subagents,
@@ -449,8 +470,10 @@ export async function saveMinimalAgentConfig(config) {
449
470
  version: 4,
450
471
  models: config.models,
451
472
  baseModelId: config.baseModelId,
473
+ teamServerUrl: config.teamServerUrl ?? null,
452
474
  ...(config.compactRatio !== undefined ? { compactRatio: config.compactRatio } : {}),
453
475
  advisor: config.advisor,
476
+ workflowModels: config.workflowModels,
454
477
  subagents: config.subagents ?? DEFAULT_SUBAGENTS_CONFIG,
455
478
  browser: config.browser ?? DEFAULT_BROWSER_CONFIG,
456
479
  computerUse: config.computerUse ?? DEFAULT_COMPUTER_USE_CONFIG,
@@ -472,8 +495,16 @@ export async function updateMinimalAgentConfig(mutate) {
472
495
  version: 4,
473
496
  models: value.models,
474
497
  baseModelId: value.baseModelId,
498
+ // 沿用现有值而不是重置为 null——大多数配置写入根本不碰这个字段(如加/删模型、
499
+ // 改 advisor),不该每次都把用户配置的默认服务器地址悄悄抹掉。同一条纪律见
500
+ // subagents/browser/computerUse。
501
+ // ⚠️ 必须用 `!== undefined` 而不是 `??`:清空地址走的是显式 `teamServerUrl: null`,
502
+ // `??` 会把这个合法的 null 也当成"没提供"处理,退回旧值——清空操作因此悄悄失效。
503
+ // 这正是仓库自己反复强调的 `undefined ≠ 0`(这里是 `undefined ≠ null`)纪律。
504
+ teamServerUrl: value.teamServerUrl !== undefined ? value.teamServerUrl : (current?.teamServerUrl ?? null),
475
505
  ...(value.compactRatio !== undefined ? { compactRatio: value.compactRatio } : {}),
476
506
  advisor: value.advisor,
507
+ workflowModels: value.workflowModels ?? current?.workflowModels,
477
508
  subagents: value.subagents ?? current?.subagents ?? DEFAULT_SUBAGENTS_CONFIG,
478
509
  browser: value.browser ?? current?.browser ?? DEFAULT_BROWSER_CONFIG,
479
510
  computerUse: value.computerUse ?? current?.computerUse ?? DEFAULT_COMPUTER_USE_CONFIG,
@@ -3,17 +3,19 @@ import { chmod, copyFile, mkdir, readFile, rename, rm, stat, unlink, writeFile }
3
3
  import { homedir } from 'node:os';
4
4
  import { dirname, join } from 'node:path';
5
5
 
6
- import { execSiblingDir } from '../utils/greenRoot.js';
7
- import type { PromptCacheConfig } from '../types.js';
8
6
  import { normalizePromptCacheMode } from '../llm/promptCache.js';
9
- import { CONFIG_LIMITS, normalizeLimited } from './numericLimits.js';
7
+ import type { PromptCacheConfig } from '../types.js';
8
+ import { execSiblingDir } from '../utils/greenRoot.js';
10
9
  import {
10
+ DEFAULT_ADVISOR_CONFIG,
11
11
  DEFAULT_BROWSER_CONFIG,
12
12
  DEFAULT_COMPUTER_USE_CONFIG,
13
13
  DEFAULT_SUBAGENTS_CONFIG,
14
14
  } from './configDefaults.js';
15
+ import { CONFIG_LIMITS, normalizeLimited } from './numericLimits.js';
15
16
 
16
17
  export {
18
+ DEFAULT_ADVISOR_CONFIG,
17
19
  DEFAULT_BROWSER_CONFIG,
18
20
  DEFAULT_COMPUTER_USE_CONFIG,
19
21
  DEFAULT_SUBAGENTS_CONFIG,
@@ -34,12 +36,17 @@ export interface ModelConfig {
34
36
  contextWindow: number;
35
37
  maxTokens?: number;
36
38
  supportsVision?: boolean;
39
+ /** Provider can reliably honor an OpenAI-compatible JSON Schema response. */
40
+ supportsJsonSchema?: boolean;
37
41
  promptCache?: PromptCacheConfig;
38
42
  enabled: boolean;
39
43
  createdAt: number;
40
44
  updatedAt: number;
41
45
  }
42
46
 
47
+ /** Portable workflow capability role -> machine-local model id. */
48
+ export type WorkflowModelRoles = Record<string, string>;
49
+
43
50
  export interface AdvisorConfig {
44
51
  enabled: boolean;
45
52
  mode: 'auto' | 'manual';
@@ -95,8 +102,16 @@ export interface MinimalAgentConfig {
95
102
  models: ModelConfig[];
96
103
  /** 当前被标记为基座(主循环)的模型 id;null = 尚未选定。 */
97
104
  baseModelId: string | null;
105
+ /**
106
+ * 团队在线模型服务器的默认地址;null = 未配置,登录命令使用发行版/环境配置解析。
107
+ * 与 minimal-desktop 的 `desktop.json::socialServerUrl` 是各自独立的持久化(两套
108
+ * 登录实现互不经过),但共享同一个环境变量名 `KAKADEAI_SOCIAL_SERVER_URL`
109
+ * 作为跨项目的运维覆盖点——见 configService.ts::resolveTeamServerUrl()。
110
+ */
111
+ teamServerUrl: string | null;
98
112
  compactRatio?: number;
99
113
  advisor?: AdvisorConfig;
114
+ workflowModels?: WorkflowModelRoles;
100
115
  subagents: SubagentsConfig;
101
116
  browser?: BrowserConfig;
102
117
  computerUse?: ComputerUseConfig;
@@ -185,6 +200,9 @@ function parseModel(value: unknown): ModelConfig | null {
185
200
  contextWindow: positiveNumber(raw.contextWindow) ?? DEFAULT_CONTEXT_WINDOW,
186
201
  ...(positiveNumber(raw.maxTokens) !== undefined ? { maxTokens: positiveNumber(raw.maxTokens) } : {}),
187
202
  supportsVision: raw.supportsVision !== false,
203
+ ...(typeof raw.supportsJsonSchema === 'boolean'
204
+ ? { supportsJsonSchema: raw.supportsJsonSchema }
205
+ : {}),
188
206
  promptCache: {
189
207
  mode: normalizePromptCacheMode(
190
208
  (raw.promptCache as Record<string, unknown> | undefined)?.mode
@@ -197,6 +215,20 @@ function parseModel(value: unknown): ModelConfig | null {
197
215
  };
198
216
  }
199
217
 
218
+ function parseWorkflowModels(value: unknown): WorkflowModelRoles | undefined {
219
+ if (!value || typeof value !== 'object' || Array.isArray(value))
220
+ return undefined;
221
+ const roles: WorkflowModelRoles = {};
222
+ for (const [role, candidate] of Object.entries(
223
+ value as Record<string, unknown>,
224
+ )) {
225
+ if (!/^[a-z][a-z0-9_-]{0,63}$/i.test(role)) continue;
226
+ const modelId = nonEmpty(candidate);
227
+ if (modelId) roles[role] = modelId;
228
+ }
229
+ return Object.keys(roles).length > 0 ? roles : undefined;
230
+ }
231
+
200
232
  function parseModels(value: unknown): ModelConfig[] {
201
233
  if (!Array.isArray(value)) return [];
202
234
  const out: ModelConfig[] = [];
@@ -241,13 +273,14 @@ function parseAdvisor(value: unknown): AdvisorConfig | undefined {
241
273
  if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;
242
274
  const raw = value as Record<string, unknown>;
243
275
  return {
244
- enabled: raw.enabled !== false,
276
+ // 默认关闭;旧配置显式 enabled:true 仍保持用户选择。
277
+ enabled: raw.enabled === true,
245
278
  mode: raw.mode === 'manual' ? 'manual' : 'auto',
246
279
  modelId: nonEmpty(raw.modelId) ?? null,
247
280
  contextPolicy: 'full-relevant',
248
281
  shareSensitive: raw.shareSensitive === true,
249
- inputTokenBudget: normalizeLimited(raw.inputTokenBudget, CONFIG_LIMITS.advisorInputTokenBudget, 128_000),
250
- timeoutMs: normalizeLimited(raw.timeoutMs, CONFIG_LIMITS.advisorTimeoutMs, 180_000),
282
+ inputTokenBudget: normalizeLimited(raw.inputTokenBudget, CONFIG_LIMITS.advisorInputTokenBudget, DEFAULT_ADVISOR_CONFIG.inputTokenBudget),
283
+ timeoutMs: normalizeLimited(raw.timeoutMs, CONFIG_LIMITS.advisorTimeoutMs, DEFAULT_ADVISOR_CONFIG.timeoutMs),
251
284
  };
252
285
  }
253
286
 
@@ -259,7 +292,7 @@ function parseSubagents(value: unknown): SubagentsConfig {
259
292
  maxConcurrent: normalizeLimited(raw.maxConcurrent, CONFIG_LIMITS.subagentMaxConcurrent, 3),
260
293
  defaultWriteIsolation: raw.defaultWriteIsolation === 'worktree' ? 'worktree' : 'none',
261
294
  timeoutMs: normalizeLimited(raw.timeoutMs, CONFIG_LIMITS.subagentTimeoutMs, 1_800_000),
262
- exploreMaxTurns: normalizeLimited(raw.exploreMaxTurns, CONFIG_LIMITS.subagentExploreMaxTurns, 50),
295
+ exploreMaxTurns: normalizeLimited(raw.exploreMaxTurns, CONFIG_LIMITS.subagentExploreMaxTurns, 200),
263
296
  generalMaxTurns: normalizeLimited(raw.generalMaxTurns, CONFIG_LIMITS.subagentGeneralMaxTurns, 100),
264
297
  };
265
298
  }
@@ -291,13 +324,16 @@ function parseComputerUse(value: unknown): ComputerUseConfig {
291
324
  function parseCurrent(data: Record<string, unknown>): MinimalAgentConfig | null {
292
325
  if (data.version !== 4) return null;
293
326
  const advisor = parseAdvisor(data.advisor);
327
+ const workflowModels = parseWorkflowModels(data.workflowModels);
294
328
  const compactRatio = parseCompactRatio(data.compactRatio);
295
329
  return {
296
330
  version: 4,
297
331
  models: parseModels(data.models),
298
332
  baseModelId: nonEmpty(data.baseModelId) ?? null,
333
+ teamServerUrl: nonEmpty(data.teamServerUrl) ?? null,
299
334
  ...(compactRatio !== undefined ? { compactRatio } : {}),
300
335
  ...(advisor ? { advisor } : {}),
336
+ ...(workflowModels ? { workflowModels } : {}),
301
337
  subagents: parseSubagents(data.subagents),
302
338
  browser: parseBrowser(data.browser),
303
339
  computerUse: parseComputerUse(data.computerUse),
@@ -362,8 +398,8 @@ function parseLegacyAdvisorConfig(value: unknown): LegacyAdvisorConfig | undefin
362
398
  provider,
363
399
  supportsVision: raw.supportsVision === true,
364
400
  shareSensitive: raw.shareSensitive === true,
365
- inputTokenBudget: normalizeLimited(raw.inputTokenBudget, CONFIG_LIMITS.advisorInputTokenBudget, 128_000),
366
- timeoutMs: normalizeLimited(raw.timeoutMs, CONFIG_LIMITS.advisorTimeoutMs, 180_000),
401
+ inputTokenBudget: normalizeLimited(raw.inputTokenBudget, CONFIG_LIMITS.advisorInputTokenBudget, DEFAULT_ADVISOR_CONFIG.inputTokenBudget),
402
+ timeoutMs: normalizeLimited(raw.timeoutMs, CONFIG_LIMITS.advisorTimeoutMs, DEFAULT_ADVISOR_CONFIG.timeoutMs),
367
403
  };
368
404
  }
369
405
 
@@ -434,6 +470,7 @@ function buildV4FromLegacy(
434
470
  version: 4,
435
471
  models,
436
472
  baseModelId: baseModel.id,
473
+ teamServerUrl: null,
437
474
  ...(legacyProvider.compactRatio !== undefined ? { compactRatio: legacyProvider.compactRatio } : {}),
438
475
  ...(advisor ? { advisor } : {}),
439
476
  subagents,
@@ -584,14 +621,17 @@ export async function readMinimalAgentConfig(options: { migrate?: boolean } = {}
584
621
  }
585
622
 
586
623
  export async function saveMinimalAgentConfig(
587
- config: Omit<MinimalAgentConfig, 'version' | 'savedAt' | 'subagents'> & { subagents?: SubagentsConfig },
624
+ config: Omit<MinimalAgentConfig, 'version' | 'savedAt' | 'subagents' | 'teamServerUrl'>
625
+ & { subagents?: SubagentsConfig; teamServerUrl?: string | null },
588
626
  ): Promise<MinimalAgentConfig> {
589
627
  const next: MinimalAgentConfig = {
590
628
  version: 4,
591
629
  models: config.models,
592
630
  baseModelId: config.baseModelId,
631
+ teamServerUrl: config.teamServerUrl ?? null,
593
632
  ...(config.compactRatio !== undefined ? { compactRatio: config.compactRatio } : {}),
594
633
  advisor: config.advisor,
634
+ workflowModels: config.workflowModels,
595
635
  subagents: config.subagents ?? DEFAULT_SUBAGENTS_CONFIG,
596
636
  browser: config.browser ?? DEFAULT_BROWSER_CONFIG,
597
637
  computerUse: config.computerUse ?? DEFAULT_COMPUTER_USE_CONFIG,
@@ -605,7 +645,8 @@ export async function saveMinimalAgentConfig(
605
645
 
606
646
  /** Cross-process read-modify-write. The mutator never sees a partially written file. */
607
647
  export async function updateMinimalAgentConfig(
608
- mutate: (current: MinimalAgentConfig | null) => Omit<MinimalAgentConfig, 'version' | 'savedAt'>,
648
+ mutate: (current: MinimalAgentConfig | null) => Omit<MinimalAgentConfig, 'version' | 'savedAt' | 'teamServerUrl'>
649
+ & { teamServerUrl?: string | null },
609
650
  ): Promise<MinimalAgentConfig> {
610
651
  const file = getConfigFilePath();
611
652
  const release = await acquireConfigLock(file);
@@ -616,8 +657,16 @@ export async function updateMinimalAgentConfig(
616
657
  version: 4,
617
658
  models: value.models,
618
659
  baseModelId: value.baseModelId,
660
+ // 沿用现有值而不是重置为 null——大多数配置写入根本不碰这个字段(如加/删模型、
661
+ // 改 advisor),不该每次都把用户配置的默认服务器地址悄悄抹掉。同一条纪律见
662
+ // subagents/browser/computerUse。
663
+ // ⚠️ 必须用 `!== undefined` 而不是 `??`:清空地址走的是显式 `teamServerUrl: null`,
664
+ // `??` 会把这个合法的 null 也当成"没提供"处理,退回旧值——清空操作因此悄悄失效。
665
+ // 这正是仓库自己反复强调的 `undefined ≠ 0`(这里是 `undefined ≠ null`)纪律。
666
+ teamServerUrl: value.teamServerUrl !== undefined ? value.teamServerUrl : (current?.teamServerUrl ?? null),
619
667
  ...(value.compactRatio !== undefined ? { compactRatio: value.compactRatio } : {}),
620
668
  advisor: value.advisor,
669
+ workflowModels: value.workflowModels ?? current?.workflowModels,
621
670
  subagents: value.subagents ?? current?.subagents ?? DEFAULT_SUBAGENTS_CONFIG,
622
671
  browser: value.browser ?? current?.browser ?? DEFAULT_BROWSER_CONFIG,
623
672
  computerUse: value.computerUse ?? current?.computerUse ?? DEFAULT_COMPUTER_USE_CONFIG,