minimal-agent 0.12.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 (472) hide show
  1. package/README.md +6 -5
  2. package/package.json +62 -5
  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 +204 -185
  16. package/plugins/workflow-runner/src/index.ts +249 -224
  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 +404 -467
  28. package/plugins/workflow-runner/src/runner.ts +491 -535
  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 +172 -152
  54. package/plugins/workflow-runner/src/taskIdentity.ts +233 -200
  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 -105
  58. package/plugins/workflow-runner/src/types.ts +155 -520
  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 +542 -469
  68. package/plugins/workflow-runner/src/workflowState.ts +639 -589
  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/skill-creator/scripts/run_eval.py +3 -2
  92. package/skills/ui-design/SKILL.md +5 -2
  93. package/skills/ui-design/references/layout-composition.md +1 -1
  94. package/skills/workflow-creator/SKILL.md +344 -0
  95. package/skills/workflow-creator/assets/template/workflow.mjs +48 -0
  96. package/skills/workflow-creator/references/api.md +216 -0
  97. package/skills/workflow-creator/references/migration.md +103 -0
  98. package/skills/workflow-creator/references/patterns.md +779 -0
  99. package/skills/workflow-creator/scripts/list-resources.mjs +205 -0
  100. package/skills/workflow-creator/scripts/scaffold.mjs +148 -0
  101. package/skills/workflow-creator/scripts/validate.mjs +275 -0
  102. package/skills/workflow-creator/scripts/workflow-creator.test.mjs +82 -0
  103. package/src/advisor/advisorCoordinator.js +503 -0
  104. package/src/advisor/advisorCoordinator.ts +657 -0
  105. package/src/cli/configMenu.tsx +0 -1
  106. package/src/cli/print.js +44 -6
  107. package/src/cli/print.ts +73 -4
  108. package/src/cli/streamJson.js +5 -6
  109. package/src/cli/streamJson.ts +8 -4
  110. package/src/cli/wizards/advisorWizard.js +4 -2
  111. package/src/cli/wizards/advisorWizard.tsx +8 -2
  112. package/src/cli/wizards/contextAdvisorWizard.js +5 -4
  113. package/src/cli/wizards/contextAdvisorWizard.tsx +7 -6
  114. package/src/collaboration/taskFlow.js +115 -0
  115. package/src/collaboration/taskFlow.ts +169 -0
  116. package/src/config/configDefaults.js +41 -1
  117. package/src/config/configDefaults.ts +43 -1
  118. package/src/config/configDiagnostics.ts +2 -2
  119. package/src/config/configFile.js +40 -9
  120. package/src/config/configFile.ts +60 -11
  121. package/src/config/configService.js +443 -74
  122. package/src/config/configService.ts +723 -142
  123. package/src/config/numericLimits.js +22 -0
  124. package/src/config/numericLimits.ts +24 -0
  125. package/src/config.js +1 -0
  126. package/src/config.ts +3 -2
  127. package/src/context/budgetPlan.js +1 -1
  128. package/src/context/budgetPlan.ts +1 -1
  129. package/src/context/compact.js +7 -2
  130. package/src/context/compact.ts +9 -2
  131. package/src/context/microCompactLite.js +212 -13
  132. package/src/context/microCompactLite.ts +261 -12
  133. package/src/context/sessionRegistry.js +8 -1
  134. package/src/context/sessionRegistry.ts +18 -5
  135. package/src/context/toolResultArchive.js +72 -0
  136. package/src/context/toolResultArchive.ts +95 -0
  137. package/src/goal/errors.js +8 -0
  138. package/src/goal/errors.ts +18 -0
  139. package/src/goal/goalRuntime.js +344 -0
  140. package/src/goal/goalRuntime.ts +466 -0
  141. package/src/goal/goalStore.js +200 -0
  142. package/src/goal/goalStore.ts +219 -0
  143. package/src/goal/index.js +4 -0
  144. package/src/goal/index.ts +4 -0
  145. package/src/goal/statusMapping.js +71 -0
  146. package/src/goal/statusMapping.ts +95 -0
  147. package/src/goal/types.js +7 -0
  148. package/src/goal/types.ts +179 -0
  149. package/src/goal/workflowController.js +306 -0
  150. package/src/goal/workflowController.ts +360 -0
  151. package/src/harness/evidenceLedger.js +2 -0
  152. package/src/harness/evidenceLedger.ts +1 -0
  153. package/src/harness/stallGuard.js +9 -3
  154. package/src/harness/stallGuard.ts +7 -3
  155. package/src/images/imageResolver.js +161 -0
  156. package/src/images/imageResolver.ts +189 -0
  157. package/src/infra/verification.js +56 -20
  158. package/src/infra/verification.ts +87 -20
  159. package/src/llm/client.js +79 -21
  160. package/src/llm/client.ts +182 -35
  161. package/src/llm/gatewayClient.js +201 -0
  162. package/src/llm/gatewayClient.ts +299 -0
  163. package/src/llm/messageProvenance.js +46 -0
  164. package/src/llm/messageProvenance.ts +58 -0
  165. package/src/llm/modelProvider.js +1 -0
  166. package/src/llm/modelProvider.ts +22 -0
  167. package/src/llm/providers/anthropicFormat.js +108 -1
  168. package/src/llm/providers/anthropicFormat.ts +115 -4
  169. package/src/llm/providers/openaiFormat.js +9 -0
  170. package/src/llm/providers/openaiFormat.ts +12 -3
  171. package/src/loop.js +319 -54
  172. package/src/loop.ts +373 -57
  173. package/src/main.js +4 -1
  174. package/src/main.tsx +4 -1
  175. package/src/managedExecution/index.js +2 -0
  176. package/src/managedExecution/index.ts +2 -0
  177. package/src/managedExecution/registry.js +15 -0
  178. package/src/managedExecution/registry.ts +20 -0
  179. package/src/managedExecution/types.js +1 -0
  180. package/src/managedExecution/types.ts +86 -0
  181. package/src/modelRef.js +9 -0
  182. package/src/modelRef.ts +31 -0
  183. package/src/multimodal.js +14 -28
  184. package/src/multimodal.ts +17 -33
  185. package/src/net/lanDiscovery.js +65 -0
  186. package/src/net/lanDiscovery.ts +82 -0
  187. package/src/plugin-sdk.js +28 -3
  188. package/src/plugin-sdk.ts +39 -6
  189. package/src/plugins/pluginApi.ts +16 -1
  190. package/src/plugins/pluginLoader.js +4 -0
  191. package/src/plugins/pluginLoader.ts +6 -0
  192. package/src/plugins/pluginRunner.js +152 -9
  193. package/src/plugins/pluginRunner.ts +186 -8
  194. package/src/plugins/slashFallback.js +113 -0
  195. package/src/plugins/slashFallback.ts +137 -0
  196. package/src/prompts/policyRegistry.js +15 -8
  197. package/src/prompts/policyRegistry.ts +18 -8
  198. package/src/prompts/promptAssembly.js +103 -12
  199. package/src/prompts/promptAssembly.ts +114 -12
  200. package/src/prompts/skillList.js +21 -3
  201. package/src/prompts/skillList.ts +27 -2
  202. package/src/prompts/stableSystemPrompt.js +18 -0
  203. package/src/prompts/stableSystemPrompt.ts +33 -0
  204. package/src/runtime/agentRuntimeContext.js +8 -2
  205. package/src/runtime/agentRuntimeContext.ts +17 -4
  206. package/src/session/runAgentTurn.js +78 -12
  207. package/src/session/runAgentTurn.ts +105 -23
  208. package/src/session/runTurn.js +10 -9
  209. package/src/session/runTurn.ts +17 -8
  210. package/src/session/sessionState.ts +2 -0
  211. package/src/team/auth.js +186 -0
  212. package/src/team/auth.ts +298 -0
  213. package/src/team/cli.js +105 -0
  214. package/src/team/cli.ts +122 -0
  215. package/src/team/onlineToolContract.js +64 -0
  216. package/src/team/onlineToolContract.ts +109 -0
  217. package/src/team/toolPolicy.js +36 -0
  218. package/src/team/toolPolicy.ts +75 -0
  219. package/src/tools/advisor/advisor.js +148 -37
  220. package/src/tools/advisor/advisor.ts +161 -38
  221. package/src/tools/advisor/advisorDecision.js +71 -0
  222. package/src/tools/advisor/advisorDecision.ts +85 -0
  223. package/src/tools/agent/agent.js +18 -5
  224. package/src/tools/agent/agent.ts +21 -7
  225. package/src/tools/agent/agentControl.js +246 -0
  226. package/src/tools/agent/agentControl.ts +284 -0
  227. package/src/tools/agent/agentTaskService.js +40 -1
  228. package/src/tools/agent/agentTaskService.ts +44 -1
  229. package/src/tools/agent/agentTypes.js +14 -2
  230. package/src/tools/agent/agentTypes.ts +15 -2
  231. package/src/tools/applypatch/applyPatch.js +362 -0
  232. package/src/tools/applypatch/applyPatch.ts +428 -0
  233. package/src/tools/bash/bash.js +70 -18
  234. package/src/tools/bash/bash.ts +75 -20
  235. package/src/tools/capabilities.js +10 -5
  236. package/src/tools/capabilities.ts +10 -5
  237. package/src/tools/computeruse/computerIntent.js +32 -0
  238. package/src/tools/computeruse/computerIntent.ts +46 -0
  239. package/src/tools/computeruse/telemetryLog.js +12 -0
  240. package/src/tools/computeruse/telemetryLog.ts +16 -0
  241. package/src/tools/computeruse/vision/telemetry.js +1 -0
  242. package/src/tools/computeruse/vision/telemetry.ts +1 -0
  243. package/src/tools/effectiveToolSet.js +4 -0
  244. package/src/tools/effectiveToolSet.ts +4 -0
  245. package/src/tools/index.js +21 -2
  246. package/src/tools/index.ts +33 -2
  247. package/src/tools/powershell/powershell.js +18 -1
  248. package/src/tools/powershell/powershell.ts +18 -2
  249. package/src/tools/presentresult/presentresult.js +6 -15
  250. package/src/tools/presentresult/presentresult.ts +6 -15
  251. package/src/tools/read/read.js +69 -11
  252. package/src/tools/read/read.ts +70 -11
  253. package/src/tools/shared/fileUtils.js +1 -2
  254. package/src/tools/shared/fileUtils.ts +1 -2
  255. package/src/tools/shared/permanentDeleteGuard.js +34 -3
  256. package/src/tools/shared/permanentDeleteGuard.ts +43 -6
  257. package/src/tools/shared/toolOutputStore.js +23 -1
  258. package/src/tools/shared/toolOutputStore.ts +22 -1
  259. package/src/tools/skill/skill.js +9 -3
  260. package/src/tools/skill/skill.ts +8 -4
  261. package/src/tools/toolPromptGuides.js +117 -0
  262. package/src/tools/toolPromptGuides.ts +137 -0
  263. package/src/tools/webbrowser/agentBrowserPath.js +19 -9
  264. package/src/tools/webbrowser/agentBrowserPath.ts +70 -28
  265. package/src/tools/webbrowser/browser.js +27 -11
  266. package/src/tools/webbrowser/browser.ts +68 -24
  267. package/src/tools/webbrowser/browserAutomation.js +329 -0
  268. package/src/tools/webbrowser/browserAutomation.ts +467 -0
  269. package/src/tools/webbrowser/browserAxState.js +97 -0
  270. package/src/tools/webbrowser/browserAxState.ts +142 -0
  271. package/src/tools/webbrowser/browserBatch.js +1578 -0
  272. package/src/tools/webbrowser/browserBatch.ts +2382 -0
  273. package/src/tools/webbrowser/browserCdp.js +208 -0
  274. package/src/tools/webbrowser/browserCdp.ts +255 -0
  275. package/src/tools/webbrowser/browserConditions.js +24 -0
  276. package/src/tools/webbrowser/browserConditions.ts +45 -0
  277. package/src/tools/webbrowser/browserContent.js +281 -0
  278. package/src/tools/webbrowser/browserContent.ts +438 -0
  279. package/src/tools/webbrowser/browserControl.js +131 -30
  280. package/src/tools/webbrowser/browserControl.ts +210 -50
  281. package/src/tools/webbrowser/browserDaemon.js +22 -14
  282. package/src/tools/webbrowser/browserDaemon.ts +54 -21
  283. package/src/tools/webbrowser/browserFrames.js +47 -0
  284. package/src/tools/webbrowser/browserFrames.ts +54 -0
  285. package/src/tools/webbrowser/browserInteractionResolver.js +17 -0
  286. package/src/tools/webbrowser/browserInteractionResolver.ts +40 -0
  287. package/src/tools/webbrowser/browserLocator.js +140 -0
  288. package/src/tools/webbrowser/browserLocator.ts +194 -0
  289. package/src/tools/webbrowser/browserOutcome.js +10 -17
  290. package/src/tools/webbrowser/browserOutcome.ts +48 -31
  291. package/src/tools/webbrowser/browserRecovery.js +58 -0
  292. package/src/tools/webbrowser/browserRecovery.ts +83 -0
  293. package/src/tools/webbrowser/browserRunRegistry.js +35 -3
  294. package/src/tools/webbrowser/browserRunRegistry.ts +91 -15
  295. package/src/tools/webbrowser/browserService.js +28 -2
  296. package/src/tools/webbrowser/browserService.ts +49 -9
  297. package/src/tools/webbrowser/browserStream.js +132 -33
  298. package/src/tools/webbrowser/browserStream.ts +224 -50
  299. package/src/tools/webbrowser/browserTabs.js +48 -15
  300. package/src/tools/webbrowser/browserTabs.ts +178 -96
  301. package/src/tools/webbrowser/webbrowser.js +683 -144
  302. package/src/tools/webbrowser/webbrowser.ts +979 -236
  303. package/src/tools/webfetch/preapproved.js +0 -2
  304. package/src/tools/webfetch/preapproved.ts +0 -2
  305. package/src/tools/websearch/websearch.js +129 -8
  306. package/src/tools/websearch/websearch.ts +138 -6
  307. package/src/types.ts +450 -42
  308. package/src/ui/App.js +377 -58
  309. package/src/ui/App.tsx +576 -111
  310. package/src/ui/LiveArea.js +14 -8
  311. package/src/ui/LiveArea.tsx +14 -10
  312. package/src/ui/MessageList.js +63 -20
  313. package/src/ui/MessageList.tsx +101 -16
  314. package/src/ui/ModelPicker.js +7 -4
  315. package/src/ui/ModelPicker.tsx +55 -8
  316. package/src/ui/hooks/useChat.js +152 -163
  317. package/src/ui/hooks/useChat.ts +396 -334
  318. package/src/ui/loginCommand.js +56 -0
  319. package/src/ui/loginCommand.ts +63 -0
  320. package/src/ui/toolProgress.js +41 -0
  321. package/src/ui/toolProgress.ts +44 -0
  322. package/src/web/browserBridge.js +20 -2
  323. package/src/web/browserBridge.ts +20 -2
  324. package/src/web/protocol.ts +1897 -194
  325. package/workflows/adaptive-research/workflow.mjs +86 -0
  326. package/workflows/e2e-capabilities/workflow.mjs +102 -0
  327. package/workflows/e2e-llm/workflow.mjs +52 -0
  328. package/workflows/e2e-smoke/workflow.mjs +59 -0
  329. package/workflows/e2e-vision-schema/README.md +48 -0
  330. package/workflows/e2e-vision-schema/workflow.mjs +149 -0
  331. package/workflows/e2e-write-greet/workflow.mjs +37 -0
  332. package/workflows/file-census/README.md +14 -0
  333. package/workflows/file-census/scripts/.gitkeep +2 -0
  334. package/workflows/file-census/workflow.mjs +110 -0
  335. package/workflows/goal/README.md +166 -0
  336. package/workflows/goal/prompts/audit.md +57 -0
  337. package/workflows/goal/prompts/contract.md +56 -0
  338. package/workflows/goal/prompts/iterate.md +37 -0
  339. package/workflows/goal/workflow.mjs +501 -0
  340. package/workflows/illustrate/README.md +90 -0
  341. package/workflows/illustrate/assets/engines.json +20 -0
  342. package/workflows/illustrate/assets/extract-baidu.js +21 -0
  343. package/workflows/illustrate/assets/extract-bing.js +33 -0
  344. package/workflows/illustrate/assets/extract-google.js +31 -0
  345. package/workflows/illustrate/workflow.mjs +301 -0
  346. package/workflows/plan/workflow.mjs +389 -0
  347. package/workflows/question-crops/README.md +35 -0
  348. package/workflows/question-crops/prompts/inventory.md +23 -0
  349. package/workflows/question-crops/scripts/image-ops.mjs +305 -0
  350. package/workflows/question-crops/scripts/image-ops.test.mjs +95 -0
  351. package/workflows/question-crops/workflow.mjs +172 -0
  352. package/workflows/ralph-loop/workflow.mjs +162 -0
  353. package/workflows/research/DESIGN.md +449 -0
  354. package/workflows/research/README.md +74 -0
  355. package/workflows/research/prompts/s0-goal.md +43 -0
  356. package/workflows/research/prompts/s1-early-exit.md +22 -0
  357. package/workflows/research/prompts/s1-map.md +58 -0
  358. package/workflows/research/prompts/s2-options.md +53 -0
  359. package/workflows/research/prompts/s3-deep-dive.md +56 -0
  360. package/workflows/research/prompts/s4-verify.md +74 -0
  361. package/workflows/research/prompts/s5-synthesis.md +81 -0
  362. package/workflows/research/prompts/s5b-fill-gaps.md +32 -0
  363. package/workflows/research/prompts/s6-package.md +32 -0
  364. package/workflows/research/scripts/build-report.mjs +98 -0
  365. package/workflows/research/workflow.mjs +288 -0
  366. package/workflows/wechat-reading-shots/prompts/collect-params.md +16 -0
  367. package/workflows/wechat-reading-shots/prompts/evaluate.md +20 -0
  368. package/workflows/wechat-reading-shots/prompts/open-book.md +28 -0
  369. package/workflows/wechat-reading-shots/prompts/read-page.md +13 -0
  370. package/workflows/wechat-reading-shots/prompts/turn-batch.md +24 -0
  371. package/workflows/wechat-reading-shots/test/control-flow.test.ts +329 -0
  372. package/workflows/wechat-reading-shots/workflow.mjs +266 -0
  373. package/workflows/wrong-question-docx/README.md +55 -0
  374. package/workflows/wrong-question-docx/prompts/figure-qa.md +8 -0
  375. package/workflows/wrong-question-docx/prompts/transcribe.md +25 -0
  376. package/workflows/wrong-question-docx/scripts/workbook.mjs +857 -0
  377. package/workflows/wrong-question-docx/test/control-flow.test.ts +165 -0
  378. package/workflows/wrong-question-docx/test/workbook.test.mjs +303 -0
  379. package/workflows/wrong-question-docx/workflow.mjs +485 -0
  380. package/plugins/workflow-runner/src/agentCommon.js +0 -354
  381. package/plugins/workflow-runner/src/agentCommon.ts +0 -435
  382. package/plugins/workflow-runner/src/controlFlow/branch.js +0 -40
  383. package/plugins/workflow-runner/src/controlFlow/branch.ts +0 -46
  384. package/plugins/workflow-runner/src/controlFlow/loop.js +0 -211
  385. package/plugins/workflow-runner/src/controlFlow/loop.ts +0 -248
  386. package/plugins/workflow-runner/src/controlFlow/pause.js +0 -129
  387. package/plugins/workflow-runner/src/controlFlow/pause.ts +0 -141
  388. package/plugins/workflow-runner/src/controlFlow/signal.js +0 -21
  389. package/plugins/workflow-runner/src/controlFlow/signal.ts +0 -29
  390. package/plugins/workflow-runner/src/controlFlow/types.js +0 -18
  391. package/plugins/workflow-runner/src/controlFlow/types.ts +0 -63
  392. package/plugins/workflow-runner/src/dslManifest.js +0 -72
  393. package/plugins/workflow-runner/src/dslManifest.ts +0 -127
  394. package/plugins/workflow-runner/src/expressions.js +0 -618
  395. package/plugins/workflow-runner/src/expressions.ts +0 -622
  396. package/plugins/workflow-runner/src/loader.js +0 -573
  397. package/plugins/workflow-runner/src/loader.ts +0 -721
  398. package/plugins/workflow-runner/src/multimodal.js +0 -38
  399. package/plugins/workflow-runner/src/multimodal.ts +0 -64
  400. package/plugins/workflow-runner/src/recovery.js +0 -119
  401. package/plugins/workflow-runner/src/recovery.ts +0 -149
  402. package/plugins/workflow-runner/src/stepExecutors/agent.js +0 -173
  403. package/plugins/workflow-runner/src/stepExecutors/agent.ts +0 -234
  404. package/plugins/workflow-runner/src/stepExecutors/assert.js +0 -41
  405. package/plugins/workflow-runner/src/stepExecutors/assert.ts +0 -50
  406. package/plugins/workflow-runner/src/stepExecutors/echo.js +0 -31
  407. package/plugins/workflow-runner/src/stepExecutors/echo.ts +0 -38
  408. package/plugins/workflow-runner/src/stepExecutors/llm.js +0 -99
  409. package/plugins/workflow-runner/src/stepExecutors/llm.ts +0 -133
  410. package/plugins/workflow-runner/src/stepExecutors/set.js +0 -49
  411. package/plugins/workflow-runner/src/stepExecutors/set.ts +0 -56
  412. package/plugins/workflow-runner/src/stepExecutors/skill.js +0 -111
  413. package/plugins/workflow-runner/src/stepExecutors/skill.ts +0 -140
  414. package/plugins/workflow-runner/src/stepExecutors/tool.js +0 -208
  415. package/plugins/workflow-runner/src/stepExecutors/tool.ts +0 -256
  416. package/plugins/workflow-runner/src/stepExecutors/verify.js +0 -58
  417. package/plugins/workflow-runner/src/stepExecutors/verify.ts +0 -68
  418. package/plugins/workflow-runner/src/stepPipeline.js +0 -277
  419. package/plugins/workflow-runner/src/stepPipeline.ts +0 -366
  420. package/plugins/workflow-runner/test/agent.test.ts +0 -587
  421. package/plugins/workflow-runner/test/agentLlmError.test.ts +0 -373
  422. package/plugins/workflow-runner/test/bashBlacklist.sweep.test.ts +0 -65
  423. package/plugins/workflow-runner/test/captureMisbind.test.ts +0 -99
  424. package/plugins/workflow-runner/test/cli.e2e.test.ts +0 -147
  425. package/plugins/workflow-runner/test/context-files.test.ts +0 -320
  426. package/plugins/workflow-runner/test/e2e.test.ts +0 -370
  427. package/plugins/workflow-runner/test/engineRobustness.test.ts +0 -226
  428. package/plugins/workflow-runner/test/expressions.test.ts +0 -397
  429. package/plugins/workflow-runner/test/foundation.test.ts +0 -126
  430. package/plugins/workflow-runner/test/graceful.test.ts +0 -139
  431. package/plugins/workflow-runner/test/greedyInputs.load.test.ts +0 -47
  432. package/plugins/workflow-runner/test/hostCapability.test.ts +0 -108
  433. package/plugins/workflow-runner/test/illustrate.load.test.ts +0 -183
  434. package/plugins/workflow-runner/test/jsonPayload.test.ts +0 -83
  435. package/plugins/workflow-runner/test/loader.test.ts +0 -617
  436. package/plugins/workflow-runner/test/maxTurnsRetryDelay.test.ts +0 -33
  437. package/plugins/workflow-runner/test/multimodal.test.ts +0 -342
  438. package/plugins/workflow-runner/test/output-schema.test.ts +0 -213
  439. package/plugins/workflow-runner/test/parseWorkflowArgs.test.ts +0 -87
  440. package/plugins/workflow-runner/test/pluginRunner.isolation.test.ts +0 -269
  441. package/plugins/workflow-runner/test/ppt.load.test.ts +0 -1220
  442. package/plugins/workflow-runner/test/ralphLoop.e2e.test.ts +0 -220
  443. package/plugins/workflow-runner/test/recovery.test.ts +0 -265
  444. package/plugins/workflow-runner/test/runner.test.ts +0 -911
  445. package/plugins/workflow-runner/test/runnerPreflight.test.ts +0 -379
  446. package/plugins/workflow-runner/test/skillTurnDone.test.ts +0 -71
  447. package/plugins/workflow-runner/test/stateLifecycle.test.ts +0 -150
  448. package/plugins/workflow-runner/test/stepPipeline.test.ts +0 -114
  449. package/plugins/workflow-runner/test/taskArbitration.test.ts +0 -338
  450. package/plugins/workflow-runner/test/taskLifecycle.test.ts +0 -270
  451. package/plugins/workflow-runner/test/toolArtifactOverwrite.test.ts +0 -221
  452. package/plugins/workflow-runner/test/toolCapabilityBoundary.test.ts +0 -29
  453. package/plugins/workflow-runner/test/toolRuntimeIntegration.test.ts +0 -168
  454. package/plugins/workflow-runner/test/webppt.load.test.ts +0 -250
  455. package/plugins/workflow-runner/test/word.load.test.ts +0 -208
  456. package/plugins/workflow-runner/test/workflows.smoke.test.ts +0 -76
  457. package/plugins/workflow-runner/test/yamlGuardConditions.test.ts +0 -207
  458. package/src/advisorState.js +0 -22
  459. package/src/cli/configWizard.js +0 -293
  460. package/src/tools/toolProgressBridge.js +0 -48
  461. package/workflows/adaptive-research.yaml +0 -50
  462. package/workflows/book-review-short.yaml +0 -125
  463. package/workflows/e2e-write-greet.yaml +0 -31
  464. package/workflows/illustrate.yaml +0 -227
  465. package/workflows/plan.yaml +0 -470
  466. package/workflows/ppt.yaml +0 -1670
  467. package/workflows/ralph-loop.yaml +0 -199
  468. package/workflows/schema.json +0 -176
  469. package/workflows/webppt.yaml +0 -496
  470. package/workflows/wechat-reading-shots.yaml +0 -315
  471. package/workflows/word.yaml +0 -720
  472. package/workflows/youtube-shorts.yaml +0 -202
@@ -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
+ }