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,219 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { constants } from 'node:fs';
3
+ import {
4
+ appendFile,
5
+ mkdir,
6
+ open,
7
+ readFile,
8
+ rename,
9
+ stat,
10
+ unlink,
11
+ writeFile,
12
+ } from 'node:fs/promises';
13
+ import { join } from 'node:path';
14
+
15
+ import { agentStateDir } from '../context/agentHome.js';
16
+ import { GoalRuntimeError } from './errors.js';
17
+ import type { Goal, GoalEvent, GoalScope } from './types.js';
18
+
19
+ function safeSegment(value: string): string {
20
+ const readable = value.replace(/[^a-zA-Z0-9._-]/g, '-').slice(0, 48) || 'default';
21
+ const hash = createHash('sha256').update(value).digest('hex').slice(0, 10);
22
+ return `${readable}-${hash}`;
23
+ }
24
+
25
+ export interface GoalStoreOptions {
26
+ stateRoot?: string;
27
+ lockTimeoutMs?: number;
28
+ }
29
+
30
+ export class GoalStore {
31
+ private readonly root: string;
32
+ private readonly lockTimeoutMs: number;
33
+
34
+ constructor(options: GoalStoreOptions = {}) {
35
+ this.root = options.stateRoot ?? join(agentStateDir(), 'goals');
36
+ this.lockTimeoutMs = options.lockTimeoutMs ?? 2_000;
37
+ }
38
+
39
+ directory(scope: GoalScope): string {
40
+ return join(
41
+ this.root,
42
+ safeSegment(scope.workspaceId),
43
+ safeSegment(scope.sessionId),
44
+ );
45
+ }
46
+
47
+ async read(scope: GoalScope): Promise<Goal | null> {
48
+ let snapshot: Goal | null = null;
49
+ try {
50
+ snapshot = JSON.parse(
51
+ await readFile(join(this.directory(scope), 'current.json'), 'utf8'),
52
+ ) as Goal;
53
+ } catch (error) {
54
+ if (
55
+ (error as NodeJS.ErrnoException).code !== 'ENOENT'
56
+ && !(error instanceof SyntaxError)
57
+ ) {
58
+ throw error;
59
+ }
60
+ }
61
+ const projected = this.project(scope, await this.readEvents(scope));
62
+ if (!projected) return snapshot;
63
+ return !snapshot || projected.revision > snapshot.revision ? projected : snapshot;
64
+ }
65
+
66
+ async readEvents(scope: GoalScope): Promise<GoalEvent[]> {
67
+ try {
68
+ const raw = await readFile(join(this.directory(scope), 'events.jsonl'), 'utf8');
69
+ const lines = raw.split('\n');
70
+ const events: GoalEvent[] = [];
71
+ for (const [index, line] of lines.entries()) {
72
+ if (!line.trim()) continue;
73
+ try {
74
+ const parsed = JSON.parse(line) as GoalEvent | GoalEvent[];
75
+ events.push(...(Array.isArray(parsed) ? parsed : [parsed]));
76
+ } catch (error) {
77
+ // appendFile 崩溃最多可能留下最后一条不完整记录。旧的完整投影仍
78
+ // 可用;中间损坏则必须响亮失败,不能悄悄跳过历史。
79
+ const isLastRecord = lines.slice(index + 1).every((item) => !item.trim());
80
+ if (!isLastRecord || raw.endsWith('\n')) throw error;
81
+ }
82
+ }
83
+ return events;
84
+ } catch (error) {
85
+ if ((error as NodeJS.ErrnoException).code === 'ENOENT') return [];
86
+ throw error;
87
+ }
88
+ }
89
+
90
+ private project(scope: GoalScope, events: GoalEvent[]): Goal | null {
91
+ let goal: Goal | null = null;
92
+ let lastRevision = 0;
93
+ for (const event of events) {
94
+ if (event.type === 'goal.created') {
95
+ goal = {
96
+ goalId: event.goalId,
97
+ scope,
98
+ source: event.source,
99
+ status: 'active',
100
+ revision: event.revision ?? 1,
101
+ contracts: [event.contract],
102
+ currentContractVersion: event.contract.version,
103
+ attempts: [],
104
+ createdBy: event.createdBy,
105
+ acceptorHumanIds: event.acceptorHumanIds,
106
+ createdAt: event.at,
107
+ updatedAt: event.at,
108
+ usage: { inputTokens: 0, outputTokens: 0, elapsedMs: 0 },
109
+ };
110
+ lastRevision = goal.revision;
111
+ continue;
112
+ }
113
+ if (!goal || event.goalId !== goal.goalId) continue;
114
+ const revision = event.revision ?? lastRevision + 1;
115
+ if (event.type === 'goal.contract_revised') {
116
+ goal.contracts = [
117
+ ...goal.contracts.filter((item) => item.version !== event.contract.version),
118
+ event.contract,
119
+ ];
120
+ goal.currentContractVersion = event.contract.version;
121
+ } else if (event.type === 'goal.status_changed') {
122
+ goal.status = event.to;
123
+ goal.statusReason = event.reason;
124
+ } else if (event.type === 'goal.attempt_started') {
125
+ const index = goal.attempts.findIndex((item) => item.attemptId === event.attempt.attemptId);
126
+ if (index >= 0) goal.attempts[index] = structuredClone(event.attempt);
127
+ else goal.attempts.push(structuredClone(event.attempt));
128
+ } else if (event.type === 'goal.attempt_finished') {
129
+ const attempt = goal.attempts.find((item) => item.attemptId === event.attemptId);
130
+ if (attempt) {
131
+ attempt.status = event.status;
132
+ attempt.finishedAt = event.at;
133
+ attempt.artifacts = event.artifacts;
134
+ attempt.evidence = event.evidence;
135
+ attempt.blocker = event.blocker;
136
+ }
137
+ } else if (event.type === 'goal.resources_recorded') {
138
+ goal.usage.inputTokens += event.usage.inputTokens ?? 0;
139
+ goal.usage.outputTokens += event.usage.outputTokens ?? 0;
140
+ goal.usage.elapsedMs += event.usage.elapsedMs ?? 0;
141
+ }
142
+ goal.revision = Math.max(goal.revision, revision);
143
+ goal.updatedAt = Math.max(goal.updatedAt, event.at);
144
+ lastRevision = Math.max(lastRevision, revision);
145
+ }
146
+ return goal;
147
+ }
148
+
149
+ async mutate<T>(scope: GoalScope, action: () => Promise<T>): Promise<T> {
150
+ const dir = this.directory(scope);
151
+ await mkdir(dir, { recursive: true });
152
+ const lockPath = join(dir, '.write.lock');
153
+ const deadline = Date.now() + this.lockTimeoutMs;
154
+ let handle: Awaited<ReturnType<typeof open>> | null = null;
155
+ while (handle === null) {
156
+ try {
157
+ handle = await open(lockPath, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY);
158
+ await handle.writeFile(`${process.pid}\n`, 'utf8');
159
+ } catch (error) {
160
+ if ((error as NodeJS.ErrnoException).code !== 'EEXIST') throw error;
161
+ if (await this.clearStaleLock(lockPath)) continue;
162
+ if (Date.now() >= deadline) {
163
+ throw new GoalRuntimeError(
164
+ 'GOAL_STORE_LOCKED',
165
+ '当前 Session 的 Goal 正由另一个进程更新,请稍后重试。',
166
+ );
167
+ }
168
+ await new Promise((resolve) => setTimeout(resolve, 25));
169
+ }
170
+ }
171
+ try {
172
+ return await action();
173
+ } finally {
174
+ await handle.close().catch(() => undefined);
175
+ await unlink(lockPath).catch(() => undefined);
176
+ }
177
+ }
178
+
179
+ private async clearStaleLock(lockPath: string): Promise<boolean> {
180
+ try {
181
+ const [raw, info] = await Promise.all([
182
+ readFile(lockPath, 'utf8'),
183
+ stat(lockPath),
184
+ ]);
185
+ const pid = Number.parseInt(raw.trim(), 10);
186
+ let alive = Number.isInteger(pid) && pid > 0;
187
+ if (alive) {
188
+ try {
189
+ process.kill(pid, 0);
190
+ } catch (error) {
191
+ alive = (error as NodeJS.ErrnoException).code !== 'ESRCH';
192
+ }
193
+ }
194
+ if (alive && Date.now() - info.mtimeMs < 30_000) return false;
195
+ await unlink(lockPath);
196
+ return true;
197
+ } catch (error) {
198
+ return (error as NodeJS.ErrnoException).code === 'ENOENT';
199
+ }
200
+ }
201
+
202
+ async commit(scope: GoalScope, goal: Goal, events: GoalEvent[]): Promise<void> {
203
+ const dir = this.directory(scope);
204
+ await mkdir(dir, { recursive: true });
205
+ if (events.length > 0) {
206
+ await appendFile(
207
+ join(dir, 'events.jsonl'),
208
+ // 同一次 revision 的所有事件是一条 JSONL 记录,避免崩溃后只重放
209
+ // 半次状态变更。readEvents 仍兼容旧版逐事件记录。
210
+ `${JSON.stringify(events)}\n`,
211
+ 'utf8',
212
+ );
213
+ }
214
+ const current = join(dir, 'current.json');
215
+ const temp = `${current}.${process.pid}.${goal.revision}.tmp`;
216
+ await writeFile(temp, `${JSON.stringify(goal, null, 2)}\n`, 'utf8');
217
+ await rename(temp, current);
218
+ }
219
+ }
@@ -0,0 +1,4 @@
1
+ export * from './errors.js';
2
+ export * from './goalRuntime.js';
3
+ export * from './goalStore.js';
4
+ export * from './types.js';
@@ -0,0 +1,4 @@
1
+ export * from './errors.js';
2
+ export * from './goalRuntime.js';
3
+ export * from './goalStore.js';
4
+ export * from './types.js';
@@ -0,0 +1,71 @@
1
+ /**
2
+ * ============================================================
3
+ * src/goal/statusMapping.ts —— 三套完成语义词汇的**唯一映射真值**
4
+ * ------------------------------------------------------------
5
+ * 「目标做成了没有」这件事在系统里有三套词,各自回答的问题**不同**:
6
+ *
7
+ * | 层 | 取值 | 回答的问题 | 谁写 |
8
+ * |---|---|---|---|
9
+ * | 工作流 `STATUS.json` | achieved / stalled / max_iterations / budget_limited | **这一次尝试**跑成什么样 | `workflows/goal/workflow.mjs` |
10
+ * | Attempt | verified / stopped / failed | 引擎经 bridge 回报的执行结局 | `runner.ts` |
11
+ * | Goal | active…accepted(8 态) | **生命周期事实源** | `GoalRuntime` |
12
+ *
13
+ * ⚠️ 三者会打架,而且是**看起来最像成功的时候**打架:
14
+ * 工作流写 `achieved`(硬门全过 + 独立审计通过),Goal 却只到
15
+ * `ready_for_acceptance`(**还没有人验收**)。宿主只读 STATUS.json 就会
16
+ * 把「机器自检通过」当成「事情办完了」——这正是 Agent 不许自己宣布完成的原因。
17
+ *
18
+ * ⚠️ **这份映射不能放 `src/web/protocol.ts`**:那个文件被
19
+ * `test/webProtocolTypeOnly.test.ts` 锁死「只准 import type/export type、
20
+ * 零运行时副作用」,而映射表是运行时值。放进去会同时打红三处守护测试
21
+ * (minimal-agent / minimal-desktop / minimal-server 各一份 protocolShared)。
22
+ * 这里经 package.json 的具名子路径 `minimal-agent/goal-status` 导出。
23
+ * ============================================================
24
+ */
25
+ /** 一次尝试的结局:工作流结局 → Attempt 状态。 */
26
+ export const OUTCOME_TO_ATTEMPT = {
27
+ achieved: 'verified',
28
+ // ⚠️ 三种未达成里,只有「卡死」与「轮数耗尽」算 failed;
29
+ // budget_limited 是**主动停在安全边界**,现场完好可续跑 —— 记 stopped 而不是 failed。
30
+ stalled: 'failed',
31
+ max_iterations: 'failed',
32
+ budget_limited: 'stopped',
33
+ };
34
+ /**
35
+ * 权威状态的人类可读说明。
36
+ *
37
+ * ⚠️ `achieved` 那条的措辞是刻意的:它**不是**「目标达成」。
38
+ * 机器能证明的只有「硬门全过 + 独立审计没挑出毛病」,剩下那步只能由人做。
39
+ */
40
+ export const GOAL_STATUS_TEXT = {
41
+ active: '进行中',
42
+ paused: '已暂停(用户主动)',
43
+ blocked: '受阻,需要人介入',
44
+ usage_limited: '服务端配额/授权不足 —— 加预算没用,要去解决授权或等周期重置',
45
+ budget_limited: '用户设定的 token 预算用尽 —— 加大预算后可从断点继续',
46
+ ready_for_acceptance: 'Agent 自检通过,**等待人类验收**(尚未完成)',
47
+ accepted: '已由人类验收,完成',
48
+ cancelled: '已取消',
49
+ };
50
+ /**
51
+ * 宿主该信哪个:**永远是 `Goal.status`**。
52
+ *
53
+ * 这个函数存在的意义是让「该读哪个」变成一次函数调用,而不是一句注释 ——
54
+ * 注释拦不住下一个人直接读 STATUS.json 的顶层 status。
55
+ */
56
+ export function authoritativeStatus(input) {
57
+ if (input.goalStatus) {
58
+ return {
59
+ status: input.goalStatus,
60
+ authority: 'goal-runtime',
61
+ // 只有 accepted 算真正完成。ready_for_acceptance 差着一次人类点头。
62
+ done: input.goalStatus === 'accepted',
63
+ };
64
+ }
65
+ // 没有 Goal Runtime(普通 /workflow 调用,没走 managedRuntime)时才退回工作流结局。
66
+ return {
67
+ status: input.workflowOutcome ?? 'unknown',
68
+ authority: 'workflow-attempt',
69
+ done: input.workflowOutcome === 'achieved',
70
+ };
71
+ }
@@ -0,0 +1,95 @@
1
+ /**
2
+ * ============================================================
3
+ * src/goal/statusMapping.ts —— 三套完成语义词汇的**唯一映射真值**
4
+ * ------------------------------------------------------------
5
+ * 「目标做成了没有」这件事在系统里有三套词,各自回答的问题**不同**:
6
+ *
7
+ * | 层 | 取值 | 回答的问题 | 谁写 |
8
+ * |---|---|---|---|
9
+ * | 工作流 `STATUS.json` | achieved / stalled / max_iterations / budget_limited | **这一次尝试**跑成什么样 | `workflows/goal/workflow.mjs` |
10
+ * | Attempt | verified / stopped / failed | 引擎经 bridge 回报的执行结局 | `runner.ts` |
11
+ * | Goal | active…accepted(8 态) | **生命周期事实源** | `GoalRuntime` |
12
+ *
13
+ * ⚠️ 三者会打架,而且是**看起来最像成功的时候**打架:
14
+ * 工作流写 `achieved`(硬门全过 + 独立审计通过),Goal 却只到
15
+ * `ready_for_acceptance`(**还没有人验收**)。宿主只读 STATUS.json 就会
16
+ * 把「机器自检通过」当成「事情办完了」——这正是 Agent 不许自己宣布完成的原因。
17
+ *
18
+ * ⚠️ **这份映射不能放 `src/web/protocol.ts`**:那个文件被
19
+ * `test/webProtocolTypeOnly.test.ts` 锁死「只准 import type/export type、
20
+ * 零运行时副作用」,而映射表是运行时值。放进去会同时打红三处守护测试
21
+ * (minimal-agent / minimal-desktop / minimal-server 各一份 protocolShared)。
22
+ * 这里经 package.json 的具名子路径 `minimal-agent/goal-status` 导出。
23
+ * ============================================================
24
+ */
25
+
26
+ import type { GoalAttemptStatus, GoalStatus } from './types.js';
27
+
28
+ /** 工作流 `STATUS.json` 顶层 `status` 的取值。 */
29
+ export type WorkflowOutcome =
30
+ | 'achieved'
31
+ | 'stalled'
32
+ | 'max_iterations'
33
+ | 'budget_limited';
34
+
35
+ /** 一次尝试的结局:工作流结局 → Attempt 状态。 */
36
+ export const OUTCOME_TO_ATTEMPT: Readonly<Record<WorkflowOutcome, GoalAttemptStatus>> = {
37
+ achieved: 'verified',
38
+ // ⚠️ 三种未达成里,只有「卡死」与「轮数耗尽」算 failed;
39
+ // budget_limited 是**主动停在安全边界**,现场完好可续跑 —— 记 stopped 而不是 failed。
40
+ stalled: 'failed',
41
+ max_iterations: 'failed',
42
+ budget_limited: 'stopped',
43
+ };
44
+
45
+ /**
46
+ * 权威状态的人类可读说明。
47
+ *
48
+ * ⚠️ `achieved` 那条的措辞是刻意的:它**不是**「目标达成」。
49
+ * 机器能证明的只有「硬门全过 + 独立审计没挑出毛病」,剩下那步只能由人做。
50
+ */
51
+ export const GOAL_STATUS_TEXT: Readonly<Record<GoalStatus, string>> = {
52
+ active: '进行中',
53
+ paused: '已暂停(用户主动)',
54
+ blocked: '受阻,需要人介入',
55
+ usage_limited: '服务端配额/授权不足 —— 加预算没用,要去解决授权或等周期重置',
56
+ budget_limited: '用户设定的 token 预算用尽 —— 加大预算后可从断点继续',
57
+ ready_for_acceptance: 'Agent 自检通过,**等待人类验收**(尚未完成)',
58
+ accepted: '已由人类验收,完成',
59
+ cancelled: '已取消',
60
+ };
61
+
62
+ /**
63
+ * 宿主该信哪个:**永远是 `Goal.status`**。
64
+ *
65
+ * 这个函数存在的意义是让「该读哪个」变成一次函数调用,而不是一句注释 ——
66
+ * 注释拦不住下一个人直接读 STATUS.json 的顶层 status。
67
+ */
68
+ export function authoritativeStatus(input: {
69
+ goalStatus?: GoalStatus | null;
70
+ workflowOutcome?: WorkflowOutcome | null;
71
+ }): { status: string; authority: 'goal-runtime' | 'workflow-attempt'; done: boolean } {
72
+ if (input.goalStatus) {
73
+ return {
74
+ status: input.goalStatus,
75
+ authority: 'goal-runtime',
76
+ // 只有 accepted 算真正完成。ready_for_acceptance 差着一次人类点头。
77
+ done: input.goalStatus === 'accepted',
78
+ };
79
+ }
80
+ // 没有 Goal Runtime(普通 /workflow 调用,没走 managedRuntime)时才退回工作流结局。
81
+ return {
82
+ status: input.workflowOutcome ?? 'unknown',
83
+ authority: 'workflow-attempt',
84
+ done: input.workflowOutcome === 'achieved',
85
+ };
86
+ }
87
+
88
+ /** 工作流 Attempt 报告文件的最小协议;不包含 Goal 生命周期状态。 */
89
+ export interface WorkflowAttemptStatusFile {
90
+ schemaVersion: 2;
91
+ status: WorkflowOutcome;
92
+ outcome: WorkflowOutcome;
93
+ attempt_outcome: WorkflowOutcome;
94
+ authority: 'workflow-attempt';
95
+ }
@@ -0,0 +1,7 @@
1
+ export const TERMINAL_GOAL_STATUSES = new Set([
2
+ 'accepted',
3
+ 'cancelled',
4
+ ]);
5
+ export function isGoalFinished(status) {
6
+ return TERMINAL_GOAL_STATUSES.has(status);
7
+ }
@@ -0,0 +1,179 @@
1
+ export type GoalStatus =
2
+ | 'active'
3
+ | 'paused'
4
+ | 'blocked'
5
+ | 'usage_limited'
6
+ | 'budget_limited'
7
+ | 'ready_for_acceptance'
8
+ | 'accepted'
9
+ | 'cancelled';
10
+
11
+ export type GoalAttemptStatus =
12
+ | 'running'
13
+ | 'stopped'
14
+ | 'failed'
15
+ | 'verified'
16
+ | 'superseded';
17
+
18
+ export interface GoalScope {
19
+ workspaceId: string;
20
+ sessionId: string;
21
+ }
22
+
23
+ export type GoalSource =
24
+ | { kind: 'standalone' }
25
+ | {
26
+ kind: 'group-task';
27
+ groupId: string;
28
+ taskId: string;
29
+ assigneeAgentId?: string;
30
+ parentTaskId?: string;
31
+ };
32
+
33
+ export interface GoalContractInput {
34
+ objective: string;
35
+ deliverables?: string[] | null;
36
+ acceptanceCriteria?: string[] | null;
37
+ scope?: string | null;
38
+ sourceRefs?: string[] | null;
39
+ confirmedBy?: string;
40
+ /** 见 GoalContract.tokenBudget。`null` / 缺省 = 不限。 */
41
+ tokenBudget?: number | null;
42
+ }
43
+
44
+ export interface GoalContract {
45
+ version: number;
46
+ objective: string;
47
+ deliverables: string[];
48
+ acceptanceCriteria: string[];
49
+ scope?: string;
50
+ sourceRefs: string[];
51
+ confirmedBy: string;
52
+ confirmedAt: number;
53
+ hash: string;
54
+ /**
55
+ * 本 Goal 允许消耗的 token 上限(input + output 之和)。`null` = 不限(默认)。
56
+ *
57
+ * 语义边界,改之前先读:
58
+ * - 它**只在开新一轮之前**被求值。进行中的 TAOR 循环即使超额也一路跑完到节点 ——
59
+ * 这是产品决策:宁可超一点预算,也不能把 agent 停在半成品状态。
60
+ * - 它挂在**版本化的契约**上,而 `Goal.usage` 挂在 Goal 上(累计、不分契约版本)。
61
+ * 改预算 = 新契约版本,**已消耗量不重置** → 「加预算继续跑」是自然操作。
62
+ * - 与 `usage_limited` 的分工:这个是**用户自己设的额度**用完了;
63
+ * `usage_limited` 是**服务端配额/授权**不给了。两者都可 resume,但恢复动作不同。
64
+ */
65
+ tokenBudget?: number | null;
66
+ }
67
+
68
+ export interface GoalAttempt {
69
+ attemptId: string;
70
+ contractVersion: number;
71
+ workflow: string;
72
+ status: GoalAttemptStatus;
73
+ startedAt: number;
74
+ finishedAt?: number;
75
+ artifacts: string[];
76
+ evidence: string[];
77
+ blocker?: string;
78
+ }
79
+
80
+ export interface GoalResourceUsage {
81
+ inputTokens: number;
82
+ outputTokens: number;
83
+ elapsedMs: number;
84
+ }
85
+
86
+ export interface Goal {
87
+ goalId: string;
88
+ scope: GoalScope;
89
+ source: GoalSource;
90
+ status: GoalStatus;
91
+ revision: number;
92
+ contracts: GoalContract[];
93
+ currentContractVersion: number;
94
+ attempts: GoalAttempt[];
95
+ createdBy: string;
96
+ acceptorHumanIds: string[];
97
+ createdAt: number;
98
+ updatedAt: number;
99
+ usage: GoalResourceUsage;
100
+ statusReason?: string;
101
+ }
102
+
103
+ export type GoalEvent =
104
+ | {
105
+ type: 'goal.created';
106
+ eventId: string;
107
+ at: number;
108
+ goalId: string;
109
+ contract: GoalContract;
110
+ source: GoalSource;
111
+ createdBy: string;
112
+ acceptorHumanIds: string[];
113
+ revision?: number;
114
+ }
115
+ | {
116
+ type: 'goal.contract_revised';
117
+ eventId: string;
118
+ at: number;
119
+ goalId: string;
120
+ contract: GoalContract;
121
+ revision?: number;
122
+ }
123
+ | {
124
+ type: 'goal.status_changed';
125
+ eventId: string;
126
+ at: number;
127
+ goalId: string;
128
+ from: GoalStatus;
129
+ to: GoalStatus;
130
+ reason?: string;
131
+ actorId?: string;
132
+ revision?: number;
133
+ }
134
+ | {
135
+ type: 'goal.attempt_started';
136
+ eventId: string;
137
+ at: number;
138
+ goalId: string;
139
+ attempt: GoalAttempt;
140
+ revision?: number;
141
+ }
142
+ | {
143
+ type: 'goal.attempt_finished';
144
+ eventId: string;
145
+ at: number;
146
+ goalId: string;
147
+ attemptId: string;
148
+ status: GoalAttemptStatus;
149
+ artifacts: string[];
150
+ evidence: string[];
151
+ blocker?: string;
152
+ revision?: number;
153
+ }
154
+ | {
155
+ type: 'goal.resources_recorded';
156
+ eventId: string;
157
+ at: number;
158
+ goalId: string;
159
+ usage: Partial<GoalResourceUsage>;
160
+ revision?: number;
161
+ };
162
+
163
+ export interface GoalExecutionContext {
164
+ goalId: string;
165
+ contractVersion: number;
166
+ attemptId: string;
167
+ groupId?: string;
168
+ taskId?: string;
169
+ contract: GoalContract;
170
+ }
171
+
172
+ export const TERMINAL_GOAL_STATUSES = new Set<GoalStatus>([
173
+ 'accepted',
174
+ 'cancelled',
175
+ ]);
176
+
177
+ export function isGoalFinished(status: GoalStatus): boolean {
178
+ return TERMINAL_GOAL_STATUSES.has(status);
179
+ }