minimal-agent 0.10.0 → 0.12.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 (573) hide show
  1. package/README.md +11 -3
  2. package/package.json +52 -5
  3. package/plugins/computer_use/.claude-plugin/plugin.json +6 -0
  4. package/plugins/computer_use/README.md +94 -0
  5. package/plugins/computer_use/app/_template.md +142 -0
  6. package/plugins/computer_use/app/chrome.md +165 -0
  7. package/plugins/computer_use/app/finder.md +76 -0
  8. package/plugins/computer_use/app/macos-system-settings.md +81 -0
  9. package/plugins/computer_use/app/microsoft-excel.md +80 -0
  10. package/plugins/computer_use/app/microsoft-powerpoint.md +80 -0
  11. package/plugins/computer_use/app/microsoft-word.md +79 -0
  12. package/plugins/computer_use/app/wechat.md +413 -0
  13. package/plugins/computer_use/app/weread.md +319 -0
  14. package/plugins/computer_use/commands/computeruse.md +25 -0
  15. package/plugins/computer_use/commands/cu.md +9 -0
  16. package/plugins/computer_use/plugin.js +26 -0
  17. package/plugins/computer_use/plugin.ts +30 -0
  18. package/plugins/computer_use/src/capture.js +90 -0
  19. package/plugins/computer_use/src/capture.ts +104 -0
  20. package/plugins/computer_use/src/commands.js +91 -0
  21. package/plugins/computer_use/src/commands.ts +103 -0
  22. package/plugins/computer_use/src/daemon.js +134 -0
  23. package/plugins/computer_use/src/daemon.ts +161 -0
  24. package/plugins/computer_use/src/manuals.js +135 -0
  25. package/plugins/computer_use/src/manuals.ts +159 -0
  26. package/plugins/computer_use/src/verify.js +168 -0
  27. package/plugins/computer_use/src/verify.ts +219 -0
  28. package/plugins/computer_use/test/commands.test.ts +73 -0
  29. package/plugins/cron-runner/plugin.ts +38 -0
  30. package/plugins/cron-runner/src/commands.ts +373 -0
  31. package/plugins/cron-runner/src/cronTime.ts +155 -0
  32. package/plugins/cron-runner/src/lock.ts +79 -0
  33. package/plugins/cron-runner/src/runs.ts +99 -0
  34. package/plugins/cron-runner/src/scheduleEngine.ts +76 -0
  35. package/plugins/cron-runner/src/scheduler.ts +376 -0
  36. package/plugins/cron-runner/src/schema.ts +139 -0
  37. package/plugins/cron-runner/src/service.ts +193 -0
  38. package/plugins/cron-runner/src/store.ts +333 -0
  39. package/plugins/cron-runner/src/types.ts +141 -0
  40. package/plugins/cron-runner/test/cronTime.test.ts +41 -0
  41. package/plugins/cron-runner/test/plugin-integration.test.ts +47 -0
  42. package/plugins/cron-runner/test/scheduleEngine.test.ts +41 -0
  43. package/plugins/cron-runner/test/service.test.ts +76 -0
  44. package/plugins/cron-runner/test/store-and-scheduler.test.ts +501 -0
  45. package/plugins/workflow-runner/plugin.js +56 -2
  46. package/plugins/workflow-runner/plugin.ts +113 -0
  47. package/plugins/workflow-runner/src/agentCommon.js +43 -4
  48. package/plugins/workflow-runner/src/agentCommon.ts +435 -0
  49. package/plugins/workflow-runner/src/controlFlow/branch.js +40 -0
  50. package/plugins/workflow-runner/src/controlFlow/branch.ts +46 -0
  51. package/plugins/workflow-runner/src/controlFlow/loop.js +211 -0
  52. package/plugins/workflow-runner/src/controlFlow/loop.ts +248 -0
  53. package/plugins/workflow-runner/src/controlFlow/pause.js +129 -0
  54. package/plugins/workflow-runner/src/controlFlow/pause.ts +141 -0
  55. package/plugins/workflow-runner/src/controlFlow/signal.js +21 -0
  56. package/plugins/workflow-runner/src/controlFlow/signal.ts +29 -0
  57. package/plugins/workflow-runner/src/controlFlow/types.js +18 -0
  58. package/plugins/workflow-runner/src/controlFlow/types.ts +63 -0
  59. package/plugins/workflow-runner/src/dslManifest.ts +127 -0
  60. package/plugins/workflow-runner/src/expressions.ts +622 -0
  61. package/plugins/workflow-runner/src/index.js +13 -4
  62. package/plugins/workflow-runner/src/index.ts +338 -0
  63. package/plugins/workflow-runner/src/jsonPayload.ts +84 -0
  64. package/plugins/workflow-runner/src/loader.js +23 -0
  65. package/plugins/workflow-runner/src/loader.ts +721 -0
  66. package/plugins/workflow-runner/src/multimodal.js +2 -1
  67. package/plugins/workflow-runner/src/multimodal.ts +64 -0
  68. package/plugins/workflow-runner/src/recovery.ts +149 -0
  69. package/plugins/workflow-runner/src/runner.js +75 -659
  70. package/plugins/workflow-runner/src/runner.ts +604 -0
  71. package/plugins/workflow-runner/src/stepExecutors/agent.ts +234 -0
  72. package/plugins/workflow-runner/src/stepExecutors/assert.ts +50 -0
  73. package/plugins/workflow-runner/src/stepExecutors/echo.js +31 -0
  74. package/plugins/workflow-runner/src/stepExecutors/echo.ts +38 -0
  75. package/plugins/workflow-runner/src/stepExecutors/llm.ts +133 -0
  76. package/plugins/workflow-runner/src/stepExecutors/set.js +49 -0
  77. package/plugins/workflow-runner/src/stepExecutors/set.ts +56 -0
  78. package/plugins/workflow-runner/src/stepExecutors/skill.js +5 -6
  79. package/plugins/workflow-runner/src/stepExecutors/skill.ts +140 -0
  80. package/plugins/workflow-runner/src/stepExecutors/tool.js +80 -8
  81. package/plugins/workflow-runner/src/stepExecutors/tool.ts +256 -0
  82. package/plugins/workflow-runner/src/stepExecutors/verify.ts +68 -0
  83. package/plugins/workflow-runner/src/stepPipeline.js +277 -0
  84. package/plugins/workflow-runner/src/stepPipeline.ts +366 -0
  85. package/plugins/workflow-runner/src/taskIdentity.ts +405 -0
  86. package/plugins/workflow-runner/src/toolRuntime.js +48 -0
  87. package/plugins/workflow-runner/src/toolRuntime.ts +64 -0
  88. package/plugins/workflow-runner/src/types.js +37 -1
  89. package/plugins/workflow-runner/src/types.ts +602 -0
  90. package/plugins/workflow-runner/src/workflowState.ts +733 -0
  91. package/plugins/workflow-runner/test/agent.test.ts +587 -0
  92. package/plugins/workflow-runner/test/agentLlmError.test.ts +373 -0
  93. package/plugins/workflow-runner/test/bashBlacklist.sweep.test.ts +65 -0
  94. package/plugins/workflow-runner/test/captureMisbind.test.ts +99 -0
  95. package/plugins/workflow-runner/test/cli.e2e.test.ts +147 -0
  96. package/plugins/workflow-runner/test/context-files.test.ts +320 -0
  97. package/plugins/workflow-runner/test/e2e.test.ts +370 -0
  98. package/plugins/workflow-runner/test/engineRobustness.test.ts +226 -0
  99. package/plugins/workflow-runner/test/expressions.test.ts +397 -0
  100. package/plugins/workflow-runner/test/foundation.test.ts +126 -0
  101. package/plugins/workflow-runner/test/graceful.test.ts +139 -0
  102. package/plugins/workflow-runner/test/greedyInputs.load.test.ts +47 -0
  103. package/plugins/workflow-runner/test/hostCapability.test.ts +108 -0
  104. package/plugins/workflow-runner/test/illustrate.load.test.ts +183 -0
  105. package/plugins/workflow-runner/test/jsonPayload.test.ts +83 -0
  106. package/plugins/workflow-runner/test/loader.test.ts +617 -0
  107. package/plugins/workflow-runner/test/maxTurnsRetryDelay.test.ts +33 -0
  108. package/plugins/workflow-runner/test/multimodal.test.ts +342 -0
  109. package/plugins/workflow-runner/test/output-schema.test.ts +213 -0
  110. package/plugins/workflow-runner/test/parseWorkflowArgs.test.ts +87 -0
  111. package/plugins/workflow-runner/test/pluginRunner.isolation.test.ts +269 -0
  112. package/plugins/workflow-runner/test/ppt.load.test.ts +1220 -0
  113. package/plugins/workflow-runner/test/ralphLoop.e2e.test.ts +220 -0
  114. package/plugins/workflow-runner/test/recovery.test.ts +265 -0
  115. package/plugins/workflow-runner/test/runner.test.ts +911 -0
  116. package/plugins/workflow-runner/test/runnerPreflight.test.ts +379 -0
  117. package/plugins/workflow-runner/test/skillTurnDone.test.ts +71 -0
  118. package/plugins/workflow-runner/test/stateLifecycle.test.ts +150 -0
  119. package/plugins/workflow-runner/test/stepPipeline.test.ts +114 -0
  120. package/plugins/workflow-runner/test/taskArbitration.test.ts +338 -0
  121. package/plugins/workflow-runner/test/taskIdentity.test.ts +237 -0
  122. package/plugins/workflow-runner/test/taskLifecycle.test.ts +270 -0
  123. package/plugins/workflow-runner/test/toolArtifactOverwrite.test.ts +221 -0
  124. package/plugins/workflow-runner/test/toolCapabilityBoundary.test.ts +29 -0
  125. package/plugins/workflow-runner/test/toolRuntimeIntegration.test.ts +168 -0
  126. package/plugins/workflow-runner/test/webppt.load.test.ts +250 -0
  127. package/plugins/workflow-runner/test/word.load.test.ts +208 -0
  128. package/plugins/workflow-runner/test/workflows.smoke.test.ts +76 -0
  129. package/plugins/workflow-runner/test/yamlGuardConditions.test.ts +207 -0
  130. package/skills/browser-automation/SKILL.md +9 -19
  131. package/skills/web-crawler/SKILL.md +9 -11
  132. package/src/askBridge.ts +249 -0
  133. package/src/bootstrap/cwdArg.js +10 -3
  134. package/src/bootstrap/cwdArg.ts +31 -0
  135. package/src/bootstrap/workingDir.ts +48 -0
  136. package/src/cli/args.js +70 -7
  137. package/src/cli/args.ts +146 -0
  138. package/src/cli/computerUse.js +185 -0
  139. package/src/cli/computerUse.ts +221 -0
  140. package/src/cli/configMenu.js +274 -202
  141. package/src/cli/configMenu.tsx +521 -0
  142. package/src/cli/memoryAccess.js +45 -0
  143. package/src/cli/memoryAccess.ts +53 -0
  144. package/src/cli/print.js +119 -5
  145. package/src/cli/print.ts +597 -0
  146. package/src/cli/quickModelSetup.js +60 -0
  147. package/src/cli/quickModelSetup.tsx +96 -0
  148. package/src/cli/streamJson.js +80 -4
  149. package/src/cli/streamJson.ts +433 -0
  150. package/src/cli/wizards/advisorWizard.js +1 -0
  151. package/src/cli/wizards/advisorWizard.tsx +195 -0
  152. package/src/cli/wizards/agentRuntimeWizard.js +84 -0
  153. package/src/cli/wizards/agentRuntimeWizard.tsx +134 -0
  154. package/src/cli/wizards/browserWizard.js +55 -0
  155. package/src/cli/wizards/browserWizard.tsx +77 -0
  156. package/src/cli/wizards/contextAdvisorWizard.js +84 -0
  157. package/src/cli/wizards/contextAdvisorWizard.tsx +124 -0
  158. package/src/cli/wizards/fieldForm.js +7 -4
  159. package/src/cli/wizards/fieldForm.tsx +250 -0
  160. package/src/cli/wizards/imageWizard.js +4 -5
  161. package/src/cli/wizards/imageWizard.tsx +96 -0
  162. package/src/cli/wizards/openRouterWizard.tsx +48 -0
  163. package/src/cli/wizards/providerPresets.js +1 -8
  164. package/src/cli/wizards/providerPresets.ts +106 -0
  165. package/src/cli/wizards/providerWizard.js +152 -205
  166. package/src/cli/wizards/providerWizard.tsx +266 -0
  167. package/src/cli/wizards/searchWizard.tsx +47 -0
  168. package/src/cli/wizards/ttsWizard.js +4 -3
  169. package/src/cli/wizards/ttsWizard.tsx +61 -0
  170. package/src/config/configDefaults.js +25 -0
  171. package/src/config/configDefaults.ts +33 -0
  172. package/src/config/configDiagnostics.js +117 -0
  173. package/src/config/configDiagnostics.ts +166 -0
  174. package/src/config/configFile.js +52 -32
  175. package/src/config/configFile.ts +633 -0
  176. package/src/config/configManagement.js +126 -0
  177. package/src/config/configManagement.ts +159 -0
  178. package/src/config/configService.js +66 -11
  179. package/src/config/configService.ts +554 -0
  180. package/src/config/numericLimits.js +61 -0
  181. package/src/config/numericLimits.ts +80 -0
  182. package/src/config.ts +109 -0
  183. package/src/context/agentHome.ts +11 -0
  184. package/src/context/archive.ts +144 -0
  185. package/src/context/budgetPlan.js +54 -0
  186. package/src/context/budgetPlan.ts +88 -0
  187. package/src/context/compact.js +179 -106
  188. package/src/context/compact.ts +584 -0
  189. package/src/context/contextBundle.js +119 -0
  190. package/src/context/contextBundle.ts +176 -0
  191. package/src/context/contextLock.ts +84 -0
  192. package/src/context/microCompactLite.ts +218 -0
  193. package/src/context/persistContext.ts +177 -0
  194. package/src/context/reactiveCompact.js +19 -4
  195. package/src/context/reactiveCompact.ts +240 -0
  196. package/src/context/recentDirs.ts +42 -0
  197. package/src/context/sessionPath.ts +206 -0
  198. package/src/context/sessionRegistry.js +8 -2
  199. package/src/context/sessionRegistry.ts +414 -0
  200. package/src/context/snipCompact.ts +163 -0
  201. package/src/context/tokenCounter.ts +106 -0
  202. package/src/context/workspaceIndex.js +2 -2
  203. package/src/context/workspaceIndex.ts +751 -0
  204. package/src/entry.compiled.tsx +20 -0
  205. package/src/harness/claimValidation.js +9 -0
  206. package/src/harness/claimValidation.ts +22 -0
  207. package/src/harness/evidenceLedger.js +92 -0
  208. package/src/harness/evidenceLedger.ts +96 -0
  209. package/src/harness/stallGuard.js +60 -0
  210. package/src/harness/stallGuard.ts +81 -0
  211. package/src/humanIntervention.js +129 -0
  212. package/src/humanIntervention.ts +216 -0
  213. package/src/infra/verification.ts +295 -0
  214. package/src/irreversible/rules.js +216 -0
  215. package/src/irreversible/rules.ts +261 -0
  216. package/src/llm/client.js +40 -3
  217. package/src/llm/client.ts +621 -0
  218. package/src/llm/promptCache.js +27 -0
  219. package/src/llm/promptCache.ts +41 -0
  220. package/src/llm/providers/anthropicFormat.js +41 -5
  221. package/src/llm/providers/anthropicFormat.ts +290 -0
  222. package/src/llm/providers/openaiFormat.js +186 -8
  223. package/src/llm/providers/openaiFormat.ts +428 -0
  224. package/src/loop.js +614 -63
  225. package/src/loop.ts +1454 -0
  226. package/src/main.js +67 -10
  227. package/src/main.tsx +344 -0
  228. package/src/memory/codec.js +204 -0
  229. package/src/memory/codec.ts +249 -0
  230. package/src/memory/constants.js +34 -0
  231. package/src/memory/constants.ts +50 -0
  232. package/src/memory/episodicMemory.js +684 -0
  233. package/src/memory/episodicMemory.ts +815 -0
  234. package/src/memory/fileStore.js +148 -0
  235. package/src/memory/fileStore.ts +184 -0
  236. package/src/memory/memoryService.js +570 -0
  237. package/src/memory/memoryService.ts +859 -0
  238. package/src/memory/migration.js +128 -0
  239. package/src/memory/migration.ts +160 -0
  240. package/src/memory/repository.js +789 -0
  241. package/src/memory/repository.ts +893 -0
  242. package/src/memory/retrieval.js +108 -0
  243. package/src/memory/retrieval.ts +145 -0
  244. package/src/memory/searchIndex.js +107 -0
  245. package/src/memory/searchIndex.ts +153 -0
  246. package/src/memory/topicView.js +82 -0
  247. package/src/memory/topicView.ts +95 -0
  248. package/src/memory/turnJournal.js +95 -0
  249. package/src/memory/turnJournal.ts +120 -0
  250. package/src/memory/types.js +2 -0
  251. package/src/memory/types.ts +186 -0
  252. package/src/messageQueue.ts +123 -0
  253. package/src/multimodal.js +128 -46
  254. package/src/multimodal.ts +349 -0
  255. package/src/plugin-sdk.js +21 -1
  256. package/src/plugin-sdk.ts +134 -0
  257. package/src/plugins/builtinPluginIds.js +47 -0
  258. package/src/plugins/builtinPluginIds.ts +51 -0
  259. package/src/plugins/builtinRegistry.ts +43 -0
  260. package/src/plugins/commandRouter.js +40 -26
  261. package/src/plugins/commandRouter.ts +261 -0
  262. package/src/plugins/hookEngine.ts +341 -0
  263. package/src/plugins/pluginApi.ts +133 -0
  264. package/src/plugins/pluginLifecycle.ts +34 -0
  265. package/src/plugins/pluginLoader.ts +147 -0
  266. package/src/plugins/pluginManifest.js +127 -0
  267. package/src/plugins/pluginManifest.ts +152 -0
  268. package/src/plugins/pluginRunner.js +47 -2
  269. package/src/plugins/pluginRunner.ts +207 -0
  270. package/src/plugins/transcript.ts +208 -0
  271. package/src/prompts/lint.js +169 -0
  272. package/src/prompts/lint.ts +220 -0
  273. package/src/prompts/pluginList.js +32 -16
  274. package/src/prompts/pluginList.ts +86 -0
  275. package/src/prompts/policyRegistry.js +318 -0
  276. package/src/prompts/policyRegistry.ts +358 -0
  277. package/src/prompts/projectInstructions.js +24 -0
  278. package/src/prompts/projectInstructions.ts +81 -0
  279. package/src/prompts/promptAssembly.js +311 -202
  280. package/src/prompts/promptAssembly.ts +510 -0
  281. package/src/prompts/skillList.js +106 -45
  282. package/src/prompts/skillList.ts +198 -0
  283. package/src/prompts/system.js +31 -6
  284. package/src/prompts/system.ts +81 -0
  285. package/src/runtime/agentRuntimeContext.js +53 -0
  286. package/src/runtime/agentRuntimeContext.ts +112 -0
  287. package/src/session/runAgentTurn.js +71 -12
  288. package/src/session/runAgentTurn.ts +181 -0
  289. package/src/session/runTurn.js +29 -0
  290. package/src/session/runTurn.ts +160 -0
  291. package/src/session/runtimeStore.js +149 -0
  292. package/src/session/runtimeStore.ts +197 -0
  293. package/src/session/sessionState.js +79 -3
  294. package/src/session/sessionState.ts +134 -0
  295. package/src/toolGate.ts +50 -0
  296. package/src/tools/advisor/advisor.js +76 -15
  297. package/src/tools/advisor/advisor.ts +512 -0
  298. package/src/tools/agent/agent.js +245 -29
  299. package/src/tools/agent/agent.ts +837 -0
  300. package/src/tools/agent/agentTaskService.js +60 -0
  301. package/src/tools/agent/agentTaskService.ts +113 -0
  302. package/src/tools/agent/agentTypes.js +20 -8
  303. package/src/tools/agent/agentTypes.ts +94 -0
  304. package/src/tools/agent/coordinator.ts +111 -0
  305. package/src/tools/agent/worktree.ts +296 -0
  306. package/src/tools/ask/ask.js +17 -0
  307. package/src/tools/ask/ask.ts +122 -0
  308. package/src/tools/bash/attachImage.js +223 -0
  309. package/src/tools/bash/attachImage.ts +281 -0
  310. package/src/tools/bash/bash.js +132 -14
  311. package/src/tools/bash/bash.ts +642 -0
  312. package/src/tools/bash/semantics.ts +103 -0
  313. package/src/tools/bash/warnings.js +17 -11
  314. package/src/tools/bash/warnings.ts +117 -0
  315. package/src/tools/capabilities.js +42 -0
  316. package/src/tools/capabilities.ts +69 -0
  317. package/src/tools/computeruse/accessibilityPermission.js +261 -0
  318. package/src/tools/computeruse/accessibilityPermission.ts +294 -0
  319. package/src/tools/computeruse/axSearch.js +96 -0
  320. package/src/tools/computeruse/axSearch.ts +120 -0
  321. package/src/tools/computeruse/axSnap.js +272 -0
  322. package/src/tools/computeruse/axSnap.ts +349 -0
  323. package/src/tools/computeruse/capabilityLabels.js +95 -0
  324. package/src/tools/computeruse/capabilityLabels.ts +115 -0
  325. package/src/tools/computeruse/computerUseService.js +2235 -0
  326. package/src/tools/computeruse/computerUseService.ts +2686 -0
  327. package/src/tools/computeruse/computeruse.js +2742 -0
  328. package/src/tools/computeruse/computeruse.ts +3265 -0
  329. package/src/tools/computeruse/diagnosticTrace.js +154 -0
  330. package/src/tools/computeruse/diagnosticTrace.ts +195 -0
  331. package/src/tools/computeruse/diagnostics.js +369 -0
  332. package/src/tools/computeruse/diagnostics.ts +453 -0
  333. package/src/tools/computeruse/grants.js +53 -0
  334. package/src/tools/computeruse/grants.ts +70 -0
  335. package/src/tools/computeruse/humanBoundary.js +159 -0
  336. package/src/tools/computeruse/humanBoundary.ts +199 -0
  337. package/src/tools/computeruse/intervention.js +77 -0
  338. package/src/tools/computeruse/intervention.ts +110 -0
  339. package/src/tools/computeruse/manualSchema.js +709 -0
  340. package/src/tools/computeruse/manualSchema.ts +916 -0
  341. package/src/tools/computeruse/observationImages.js +705 -0
  342. package/src/tools/computeruse/observationImages.ts +889 -0
  343. package/src/tools/computeruse/protocol.js +60 -0
  344. package/src/tools/computeruse/protocol.ts +515 -0
  345. package/src/tools/computeruse/telemetryLog.js +57 -0
  346. package/src/tools/computeruse/telemetryLog.ts +67 -0
  347. package/src/tools/computeruse/vision/appGuide.js +325 -0
  348. package/src/tools/computeruse/vision/appGuide.ts +482 -0
  349. package/src/tools/computeruse/vision/focus.js +291 -0
  350. package/src/tools/computeruse/vision/focus.ts +382 -0
  351. package/src/tools/computeruse/vision/frames.js +248 -0
  352. package/src/tools/computeruse/vision/frames.ts +329 -0
  353. package/src/tools/computeruse/vision/geometry.js +131 -0
  354. package/src/tools/computeruse/vision/geometry.ts +163 -0
  355. package/src/tools/computeruse/vision/imaging.js +201 -0
  356. package/src/tools/computeruse/vision/imaging.ts +281 -0
  357. package/src/tools/computeruse/vision/png.js +274 -0
  358. package/src/tools/computeruse/vision/png.ts +317 -0
  359. package/src/tools/computeruse/vision/raster.js +320 -0
  360. package/src/tools/computeruse/vision/raster.ts +408 -0
  361. package/src/tools/computeruse/vision/settle.js +131 -0
  362. package/src/tools/computeruse/vision/settle.ts +220 -0
  363. package/src/tools/computeruse/vision/telemetry.js +196 -0
  364. package/src/tools/computeruse/vision/telemetry.ts +241 -0
  365. package/src/tools/computeruse/visionOcr.js +115 -0
  366. package/src/tools/computeruse/visionOcr.ts +128 -0
  367. package/src/tools/computeruse/waitFor.js +237 -0
  368. package/src/tools/computeruse/waitFor.ts +291 -0
  369. package/src/tools/download/download.js +10 -6
  370. package/src/tools/download/download.ts +187 -0
  371. package/src/tools/edit/edit.js +30 -18
  372. package/src/tools/edit/edit.ts +349 -0
  373. package/src/tools/edit/multi-edit.js +25 -14
  374. package/src/tools/edit/multi-edit.ts +223 -0
  375. package/src/tools/effectiveToolSet.js +73 -0
  376. package/src/tools/effectiveToolSet.ts +91 -0
  377. package/src/tools/genimage/genimage.ts +257 -0
  378. package/src/tools/genspeech/genspeech.ts +83 -0
  379. package/src/tools/glob/glob.js +176 -29
  380. package/src/tools/glob/glob.ts +283 -0
  381. package/src/tools/grep/grep.js +61 -19
  382. package/src/tools/grep/grep.ts +239 -0
  383. package/src/tools/grep/rgPath.ts +206 -0
  384. package/src/tools/index.js +99 -5
  385. package/src/tools/index.ts +293 -0
  386. package/src/tools/lsp/config.js +113 -0
  387. package/src/tools/lsp/config.ts +113 -0
  388. package/src/tools/lsp/lsp.js +256 -0
  389. package/src/tools/lsp/lsp.ts +274 -0
  390. package/src/tools/lsp/service.js +303 -0
  391. package/src/tools/lsp/service.ts +296 -0
  392. package/src/tools/memory/memory.js +520 -0
  393. package/src/tools/memory/memory.ts +625 -0
  394. package/src/tools/memory/policy.js +53 -0
  395. package/src/tools/memory/policy.ts +72 -0
  396. package/src/tools/notebook/notebookEdit.js +114 -0
  397. package/src/tools/notebook/notebookEdit.ts +126 -0
  398. package/src/tools/powershell/powershell.js +210 -0
  399. package/src/tools/powershell/powershell.ts +239 -0
  400. package/src/tools/presentresult/presentresult.js +145 -0
  401. package/src/tools/presentresult/presentresult.ts +156 -0
  402. package/src/tools/read/read.js +371 -163
  403. package/src/tools/read/read.ts +558 -0
  404. package/src/tools/shared/diffSummary.js +44 -0
  405. package/src/tools/shared/diffSummary.ts +63 -0
  406. package/src/tools/shared/fileActivity.js +51 -0
  407. package/src/tools/shared/fileActivity.ts +66 -0
  408. package/src/tools/shared/fileMutationBus.js +13 -0
  409. package/src/tools/shared/fileMutationBus.ts +14 -0
  410. package/src/tools/shared/fileState.js +73 -65
  411. package/src/tools/shared/fileState.ts +145 -0
  412. package/src/tools/shared/fileUtils.js +81 -4
  413. package/src/tools/shared/fileUtils.ts +504 -0
  414. package/src/tools/shared/killTree.ts +50 -0
  415. package/src/tools/shared/permanentDeleteGuard.js +26 -0
  416. package/src/tools/shared/permanentDeleteGuard.ts +34 -0
  417. package/src/tools/shared/schemas.ts +20 -0
  418. package/src/tools/shared/toolOutputStore.js +97 -0
  419. package/src/tools/shared/toolOutputStore.ts +110 -0
  420. package/src/tools/skill/skill.js +86 -0
  421. package/src/tools/skill/skill.ts +94 -0
  422. package/src/tools/snip/snip.js +67 -0
  423. package/src/tools/snip/snip.ts +80 -0
  424. package/src/tools/tasks/backgroundTaskService.js +275 -0
  425. package/src/tools/tasks/backgroundTaskService.ts +369 -0
  426. package/src/tools/tasks/processEvidence.js +24 -0
  427. package/src/tools/tasks/processEvidence.ts +34 -0
  428. package/src/tools/tasks/taskManagement.js +163 -0
  429. package/src/tools/tasks/taskManagement.ts +180 -0
  430. package/src/tools/tasks/taskOutput.js +113 -0
  431. package/src/tools/tasks/taskOutput.ts +145 -0
  432. package/src/tools/tasks/taskStop.js +74 -0
  433. package/src/tools/tasks/taskStop.ts +99 -0
  434. package/src/tools/tasks/taskStore.js +46 -0
  435. package/src/tools/tasks/taskStore.ts +77 -0
  436. package/src/tools/terminal/terminalCapture.js +167 -0
  437. package/src/tools/terminal/terminalCapture.ts +179 -0
  438. package/src/tools/trash/trash.js +233 -0
  439. package/src/tools/trash/trash.ts +283 -0
  440. package/src/tools/types.js +1 -1
  441. package/src/tools/types.ts +24 -0
  442. package/src/tools/webbrowser/agentBrowserPath.ts +286 -0
  443. package/src/tools/webbrowser/browser.js +214 -11
  444. package/src/tools/webbrowser/browser.ts +293 -0
  445. package/src/tools/webbrowser/browserControl.js +153 -48
  446. package/src/tools/webbrowser/browserControl.ts +262 -0
  447. package/src/tools/webbrowser/browserDaemon.js +147 -39
  448. package/src/tools/webbrowser/browserDaemon.ts +270 -0
  449. package/src/tools/webbrowser/browserOutcome.js +273 -0
  450. package/src/tools/webbrowser/browserOutcome.ts +306 -0
  451. package/src/tools/webbrowser/browserRunRegistry.js +150 -0
  452. package/src/tools/webbrowser/browserRunRegistry.ts +179 -0
  453. package/src/tools/webbrowser/browserService.js +20 -6
  454. package/src/tools/webbrowser/browserService.ts +56 -0
  455. package/src/tools/webbrowser/browserStream.js +30 -1
  456. package/src/tools/webbrowser/browserStream.ts +216 -0
  457. package/src/tools/webbrowser/browserTabs.js +143 -0
  458. package/src/tools/webbrowser/browserTabs.ts +210 -0
  459. package/src/tools/webbrowser/webbrowser.js +831 -150
  460. package/src/tools/webbrowser/webbrowser.ts +1537 -0
  461. package/src/tools/webfetch/preapproved.ts +274 -0
  462. package/src/tools/webfetch/webfetch.js +24 -23
  463. package/src/tools/webfetch/webfetch.ts +383 -0
  464. package/src/tools/websearch/websearch.js +12 -11
  465. package/src/tools/websearch/websearch.ts +292 -0
  466. package/src/tools/worktree/sessionWorktree.js +128 -0
  467. package/src/tools/worktree/sessionWorktree.ts +158 -0
  468. package/src/tools/write/write.js +27 -44
  469. package/src/tools/write/write.ts +136 -0
  470. package/src/types.ts +960 -0
  471. package/src/ui/App.js +216 -12
  472. package/src/ui/App.tsx +879 -0
  473. package/src/ui/AskQuestion.tsx +300 -0
  474. package/src/ui/InputBox.js +77 -1
  475. package/src/ui/InputBox.tsx +567 -0
  476. package/src/ui/LiveArea.tsx +344 -0
  477. package/src/ui/MessageList.js +27 -6
  478. package/src/ui/MessageList.tsx +559 -0
  479. package/src/ui/ModelPicker.tsx +107 -0
  480. package/src/ui/QueuedMessagesBanner.tsx +51 -0
  481. package/src/ui/Root.js +6 -8
  482. package/src/ui/Root.tsx +100 -0
  483. package/src/ui/SessionPicker.tsx +169 -0
  484. package/src/ui/StatusLine.js +22 -1
  485. package/src/ui/StatusLine.tsx +145 -0
  486. package/src/ui/WorkspacePicker.tsx +84 -0
  487. package/src/ui/advisorCommand.js +54 -0
  488. package/src/ui/advisorCommand.ts +63 -0
  489. package/src/ui/computerCommand.js +19 -0
  490. package/src/ui/computerCommand.ts +35 -0
  491. package/src/ui/figures.ts +45 -0
  492. package/src/ui/hooks/askSlot.ts +112 -0
  493. package/src/ui/hooks/useChat.js +271 -7
  494. package/src/ui/hooks/useChat.ts +1578 -0
  495. package/src/ui/hooks/useInputHistory.ts +235 -0
  496. package/src/ui/hooks/usePasteHandler.ts +220 -0
  497. package/src/ui/hooks/useTerminalSize.ts +41 -0
  498. package/src/ui/hooks/useTextBuffer.ts +108 -0
  499. package/src/ui/hooks/useTokenUsage.ts +44 -0
  500. package/src/ui/liveViewport.ts +189 -0
  501. package/src/ui/markdown.ts +230 -0
  502. package/src/ui/textBuffer.ts +239 -0
  503. package/src/ui/theme.ts +35 -0
  504. package/src/utils/clipboardImage.js +358 -0
  505. package/src/utils/clipboardImage.ts +420 -0
  506. package/src/utils/debugLog.ts +50 -0
  507. package/src/utils/greenRoot.ts +35 -0
  508. package/src/utils/packageRoot.ts +40 -0
  509. package/src/utils/pathContains.js +28 -0
  510. package/src/utils/pathContains.ts +31 -0
  511. package/src/utils/resourcePaths.ts +71 -0
  512. package/src/utils/stripThink.ts +49 -0
  513. package/src/utils/zodToJson.ts +73 -0
  514. package/src/web/browserBridge.js +365 -66
  515. package/src/web/browserBridge.ts +672 -0
  516. package/src/web/protocol.ts +1804 -0
  517. package/vendor/computer-use/arm64-darwin/cu-helperd +0 -0
  518. package/workflows/ppt.yaml +13 -2
  519. package/workflows/wechat-reading-shots.yaml +315 -0
  520. package/workflows/word.yaml +11 -1
  521. package/skills/docx/scripts/office/helpers/__pycache__/__init__.cpython-314.pyc +0 -0
  522. package/skills/docx/scripts/office/helpers/__pycache__/merge_runs.cpython-314.pyc +0 -0
  523. package/skills/docx/scripts/office/helpers/__pycache__/simplify_redlines.cpython-314.pyc +0 -0
  524. package/skills/docx/scripts/office/validators/__pycache__/__init__.cpython-314.pyc +0 -0
  525. package/skills/docx/scripts/office/validators/__pycache__/base.cpython-314.pyc +0 -0
  526. package/skills/docx/scripts/office/validators/__pycache__/docx.cpython-314.pyc +0 -0
  527. package/skills/docx/scripts/office/validators/__pycache__/pptx.cpython-314.pyc +0 -0
  528. package/skills/docx/scripts/office/validators/__pycache__/redlining.cpython-314.pyc +0 -0
  529. package/skills/image-stats/scripts/__pycache__/image_stats.cpython-314.pyc +0 -0
  530. package/skills/image-stats/scripts/__pycache__/image_stats_test.cpython-314.pyc +0 -0
  531. package/skills/ui-design/scripts/__pycache__/assemble_material.cpython-314.pyc +0 -0
  532. package/skills/ui-design/scripts/__pycache__/assemble_material_test.cpython-314.pyc +0 -0
  533. package/skills/ui-design/scripts/__pycache__/chart_sanity_check.cpython-314.pyc +0 -0
  534. package/skills/ui-design/scripts/__pycache__/check_language_policy.cpython-314.pyc +0 -0
  535. package/skills/ui-design/scripts/__pycache__/check_ui_artifact.cpython-314.pyc +0 -0
  536. package/skills/ui-design/scripts/__pycache__/check_ui_artifact_pptx_test.cpython-314.pyc +0 -0
  537. package/skills/ui-design/scripts/__pycache__/deck_pages_check.cpython-314.pyc +0 -0
  538. package/skills/ui-design/scripts/__pycache__/deck_pages_check_test.cpython-314.pyc +0 -0
  539. package/skills/ui-design/scripts/__pycache__/deck_visual_style_check.cpython-314.pyc +0 -0
  540. package/skills/ui-design/scripts/__pycache__/deck_visual_style_check_test.cpython-314.pyc +0 -0
  541. package/skills/ui-design/scripts/__pycache__/design_budget_check.cpython-314.pyc +0 -0
  542. package/skills/ui-design/scripts/__pycache__/design_budget_check_test.cpython-314.pyc +0 -0
  543. package/skills/ui-design/scripts/__pycache__/design_repair_hints.cpython-314.pyc +0 -0
  544. package/skills/ui-design/scripts/__pycache__/design_repair_hints_test.cpython-314.pyc +0 -0
  545. package/skills/ui-design/scripts/__pycache__/design_style_check.cpython-314.pyc +0 -0
  546. package/skills/ui-design/scripts/__pycache__/design_style_check_test.cpython-314.pyc +0 -0
  547. package/skills/ui-design/scripts/__pycache__/draft_coverage_check.cpython-314.pyc +0 -0
  548. package/skills/ui-design/scripts/__pycache__/extract_source_assets.cpython-314.pyc +0 -0
  549. package/skills/ui-design/scripts/__pycache__/extract_source_assets_test.cpython-314.pyc +0 -0
  550. package/skills/ui-design/scripts/__pycache__/generated_image_review_collect.cpython-314.pyc +0 -0
  551. package/skills/ui-design/scripts/__pycache__/generated_image_review_collect_test.cpython-314.pyc +0 -0
  552. package/skills/ui-design/scripts/__pycache__/image_plan_lint.cpython-314.pyc +0 -0
  553. package/skills/ui-design/scripts/__pycache__/image_plan_lint_test.cpython-314.pyc +0 -0
  554. package/skills/ui-design/scripts/__pycache__/image_prompt_rewrite.cpython-314.pyc +0 -0
  555. package/skills/ui-design/scripts/__pycache__/image_prompt_rewrite_test.cpython-314.pyc +0 -0
  556. package/skills/ui-design/scripts/__pycache__/layout_balance.cpython-314.pyc +0 -0
  557. package/skills/ui-design/scripts/__pycache__/layout_balance_test.cpython-314.pyc +0 -0
  558. package/skills/ui-design/scripts/__pycache__/normalize_design_json.cpython-314.pyc +0 -0
  559. package/skills/ui-design/scripts/__pycache__/normalize_design_json_test.cpython-314.pyc +0 -0
  560. package/skills/ui-design/scripts/__pycache__/plan_source_layout.cpython-314.pyc +0 -0
  561. package/skills/ui-design/scripts/__pycache__/plan_source_layout_test.cpython-314.pyc +0 -0
  562. package/skills/ui-design/scripts/__pycache__/resolve_source_hint.cpython-314.pyc +0 -0
  563. package/skills/ui-design/scripts/__pycache__/resolve_source_hint_test.cpython-314.pyc +0 -0
  564. package/skills/ui-design/scripts/__pycache__/resolve_source_input.cpython-314.pyc +0 -0
  565. package/skills/ui-design/scripts/__pycache__/resolve_source_input_test.cpython-314.pyc +0 -0
  566. package/skills/ui-design/scripts/__pycache__/scaffold_ui_artifact.cpython-314.pyc +0 -0
  567. package/skills/ui-design/scripts/__pycache__/source_usage_check.cpython-314.pyc +0 -0
  568. package/skills/ui-design/scripts/__pycache__/source_usage_check_test.cpython-314.pyc +0 -0
  569. package/skills/ui-design/scripts/__pycache__/text_readability_pixel.cpython-314.pyc +0 -0
  570. package/skills/ui-design/scripts/__pycache__/visual_quality_gate.cpython-314.pyc +0 -0
  571. package/skills/ui-design/scripts/__pycache__/visual_quality_gate_test.cpython-314.pyc +0 -0
  572. /package/skills/ai-image/scripts/{generate_test.mjs → generate.selftest.mjs} +0 -0
  573. /package/skills/ai-image/scripts/{generate_from_plan_test.mjs → generate_from_plan.selftest.mjs} +0 -0
@@ -21,17 +21,28 @@ import { forceCompact } from '../../context/compact.js';
21
21
  import { clearContext, loadContext, saveContext, } from '../../context/persistContext.js';
22
22
  import { resetReactiveCompactState } from '../../context/reactiveCompact.js';
23
23
  import { acquireContextLock } from '../../context/contextLock.js';
24
+ import { workspaceIndexService } from '../../context/workspaceIndex.js';
24
25
  import { getActiveSession, setActiveSession, updateSessionMetadata, } from '../../context/sessionRegistry.js';
25
26
  import { resolveSessionFile, sessionFileFor, } from '../../context/sessionPath.js';
26
- import { buildFullSystemPrompt } from '../../prompts/system.js';
27
+ import { buildBaseSystemPrompt, buildTransientPromptBundle } from '../../prompts/system.js';
28
+ import { createPromptCacheContext } from '../../llm/promptCache.js';
29
+ import { createAgentRuntimeContext, filterToolsForRuntime, memoryContextFromRuntime, } from '../../runtime/agentRuntimeContext.js';
30
+ import { startTurnJournal } from '../../memory/turnJournal.js';
27
31
  import { ALL_TOOLS, getToolByName } from '../../tools/index.js';
28
32
  import { createInputQueue } from '../../messageQueue.js';
29
33
  import { createAskCoordinator, setAskHandler, } from '../../askBridge.js';
30
34
  import { createAskSlot } from './askSlot.js';
31
35
  import { figures } from '../figures.js';
32
36
  import { clearFileState } from '../../tools/shared/fileState.js';
37
+ import { getOrCreateSessionState, sessionStateKey } from '../../session/sessionState.js';
38
+ import { hydrateSessionWorktree } from '../../tools/worktree/sessionWorktree.js';
39
+ import { runAdvisor } from '../../tools/advisor/advisor.js';
33
40
  import { runWithPlugins } from '../../plugins/pluginRunner.js';
34
41
  import { dlog } from '../../utils/debugLog.js';
42
+ import { createCliComputerRun, createComputerUseHostGate } from '../../cli/computerUse.js';
43
+ import { computerUseService, } from '../../tools/computeruse/computerUseService.js';
44
+ import { HumanInterventionCoordinator, } from '../../humanIntervention.js';
45
+ import { createComputerInterventionAdapter } from '../../tools/computeruse/intervention.js';
35
46
  /**
36
47
  * reasoningPreview 环形 buffer 容量(字符)。
37
48
  * LiveArea 现在多行显示思维链尾部(最近 N 行),需要喂饱足够文本;
@@ -144,6 +155,19 @@ export function useChat(args) {
144
155
  * 路径)时该值仍是 null,StatusLine 降级回 useTokenUsage 估算。
145
156
  */
146
157
  const [contextUsage, setContextUsage] = useState(null);
158
+ const [computerUseMode, setComputerUseMode] = useState('disabled');
159
+ const promptToolSignatureRef = useRef('');
160
+ const activeComputerRunRef = useRef(null);
161
+ const [computerInterventions] = useState(() => new HumanInterventionCoordinator());
162
+ const [pendingComputerIntervention, setPendingComputerIntervention] = useState(null);
163
+ useEffect(() => computerInterventions.subscribe((event) => {
164
+ if (event.type === 'started') {
165
+ setPendingComputerIntervention(event.intervention);
166
+ }
167
+ else {
168
+ setPendingComputerIntervention((current) => current?.id === event.resolution.intervention.id ? null : current);
169
+ }
170
+ }), [computerInterventions]);
147
171
  /**
148
172
  * 工具并行执行:以 callId 为 key 保存所有运行中工具。
149
173
  * 用 Map 是为了 O(1) 增删;对外 memo 物化成稳定数组(Map 迭代顺序 = 插入顺序,
@@ -279,6 +303,69 @@ export function useChat(args) {
279
303
  cancelled = true;
280
304
  };
281
305
  }, []);
306
+ /**
307
+ * 最新 submit 的 latest-ref。runManualAdvisor 定义在 submit 之前(它不能依赖
308
+ * submit 的闭包),但结束时要把排队输入交回去执行 —— 用 ref 打破定义顺序,
309
+ * 而不是把两者的定义顺序倒过来(那会让 submit 依赖 runManualAdvisor,更绕)。
310
+ */
311
+ const submitRef = useRef(null);
312
+ /**
313
+ * `/advisor ask` 的执行体:让手动咨询和工具咨询共用同一套过程显示。
314
+ *
315
+ * 此前 App.tsx 里是裸 `await runAdvisor(...)` —— 顾问最长跑 180 秒,这期间 TUI
316
+ * 一个字都不动,也按不停。工具路径早就修过同款问题(advisor.ts 的 reportProgress
317
+ * 节流发布,源于 2026-07「2m05s 无变化被误判死机」的真实反馈),手动路径却没跟上:
318
+ * 同一个功能两条路径,用户**主动发起**的那条体验反而更差。
319
+ *
320
+ * 复用既有的 runningTools + progressStage(不新增 UI 概念):塞一个运行中条目给
321
+ * LiveArea,进度行由 runAdvisor 的 reportProgress 驱动;挂 abortRef 让 ESC/Ctrl+C
322
+ * 真能掐断,而不是干等到超时。
323
+ */
324
+ const runManualAdvisor = useCallback(async (note) => {
325
+ if (isLoading) {
326
+ return { ok: false, error: '当前有任务在执行;等它结束或按 ESC 中断后再咨询顾问。' };
327
+ }
328
+ const callId = 'manual-advisor';
329
+ const ac = new AbortController();
330
+ abortRef.current = ac;
331
+ setIsLoading(true);
332
+ setProgressStage('tool_executing');
333
+ setRunningToolsMap(new Map([[callId, {
334
+ toolName: 'Advisor',
335
+ argsPreview: note ?? '',
336
+ status: 'running',
337
+ argsFriendly: '正在咨询顾问模型',
338
+ }]]));
339
+ try {
340
+ return await runAdvisor(note ? { note } : {}, ac.signal, {
341
+ history: historyRef.current,
342
+ advisorCalls: { used: 0, max: 1 },
343
+ advisorInvocation: 'manual',
344
+ reportProgress: (message) => {
345
+ // advisor.ts 侧已有 200ms 节流,这里直接落状态即可。
346
+ setRunningToolsMap((prev) => {
347
+ const current = prev.get(callId);
348
+ if (!current)
349
+ return prev;
350
+ return new Map(prev).set(callId, { ...current, progress: message });
351
+ });
352
+ },
353
+ });
354
+ }
355
+ finally {
356
+ setIsLoading(false);
357
+ setProgressStage('idle');
358
+ setRunningToolsMap(new Map());
359
+ abortRef.current = null;
360
+ // ⚠️ 必须消费排队输入。设了 isLoading 之后,用户在咨询期间敲的内容会被
361
+ // submit 送进 inputQueue,而队列此前**只在 submit 自己的 finally 里**出队
362
+ // (见下方 consumeQueued)—— 手动咨询不走那条路径,排队的话就会静静躺着,
363
+ // 用户看到「排队 1 条」却永远不执行,直到下次提交才错序跑掉。
364
+ const queued = inputQueue.dequeue();
365
+ if (queued)
366
+ queueMicrotask(() => { void submitRef.current?.(queued.value); });
367
+ }
368
+ }, [isLoading, inputQueue]);
282
369
  const submit = useCallback(async (input) => {
283
370
  const trimmed = input.trim();
284
371
  if (trimmed.length === 0)
@@ -309,6 +396,8 @@ export function useChat(args) {
309
396
  const ac = new AbortController();
310
397
  abortRef.current = ac;
311
398
  let releaseContextLock = null;
399
+ let turnJournal = null;
400
+ let turnJournalStart = 0;
312
401
  dlog('ui', 'turn START', { input: trimmed.slice(0, 80) });
313
402
  // 长时间运行时(如工作流 agent 步骤)的定时 token 刷新:
314
403
  // runQuery 的 text/reasoning 事件不触发 bump,导致 StatusLine token 数
@@ -330,12 +419,103 @@ export function useChat(args) {
330
419
  historyRef.current.length = 0;
331
420
  historyRef.current.push(...latest, ...ephemeral);
332
421
  }
422
+ const workspace = await workspaceIndexService.findByPath(getWorkingDir()).catch(() => null);
423
+ const computerRun = computerUseMode !== 'disabled'
424
+ ? createCliComputerRun({
425
+ mode: computerUseMode,
426
+ surface: 'tui',
427
+ conversationKey: `workspace:${workspace?.id ?? getWorkingDir()}:session:${activeSessionIdRef.current}`,
428
+ userInput: trimmed,
429
+ allowedFileRoots: [getWorkingDir()],
430
+ supervised: true,
431
+ })
432
+ : undefined;
433
+ activeComputerRunRef.current = computerRun ?? null;
434
+ const computerIntervention = computerRun
435
+ ? createComputerInterventionAdapter({
436
+ coordinator: computerInterventions,
437
+ context: computerRun,
438
+ observe: async (signal) => {
439
+ // Resume is a canonical boundary: it invalidates every old
440
+ // coordinate/AX reference and clears the native takeover
441
+ // cancellation for this run only.
442
+ const response = await computerUseService.request(computerRun, { action: 'observe' }, signal);
443
+ return response.ok ? response.state : undefined;
444
+ },
445
+ })
446
+ : undefined;
447
+ const toolGate = computerRun ? createComputerUseHostGate(computerRun) : undefined;
448
+ const turnSessionState = getOrCreateSessionState(sessionStateKey({
449
+ surface: 'tui', workspaceId: workspace?.id,
450
+ cwd: workspace?.id ? undefined : getWorkingDir(),
451
+ sessionId: activeSessionIdRef.current,
452
+ }));
453
+ await hydrateSessionWorktree({
454
+ sessionState: turnSessionState, workspaceId: workspace?.id,
455
+ sessionId: activeSessionIdRef.current, cwd: getWorkingDir(),
456
+ });
457
+ const effectiveCwd = turnSessionState.activeWorktree?.path ?? getWorkingDir();
458
+ const runtimeContext = createAgentRuntimeContext({
459
+ surface: 'tui',
460
+ profile: 'main',
461
+ cwd: effectiveCwd,
462
+ workspaceId: workspace?.id,
463
+ sessionId: activeSessionIdRef.current,
464
+ owner: 'local-owner',
465
+ memoryAccess: 'read-write',
466
+ interactiveAsk: true,
467
+ computer: computerRun,
468
+ computerIntervention,
469
+ toolGate,
470
+ });
471
+ const turnTools = filterToolsForRuntime(ALL_TOOLS, runtimeContext);
472
+ const toolSignature = `${effectiveCwd}\0${turnTools.map((tool) => tool.name).join(',')}`;
473
+ if (promptToolSignatureRef.current !== toolSignature) {
474
+ const stablePrompt = await buildBaseSystemPrompt(effectiveCwd, turnTools);
475
+ const rest = historyRef.current[0]?.role === 'system'
476
+ ? historyRef.current.slice(1)
477
+ : [...historyRef.current];
478
+ historyRef.current.length = 0;
479
+ historyRef.current.push({ role: 'system', content: stablePrompt }, ...rest);
480
+ promptToolSignatureRef.current = toolSignature;
481
+ }
482
+ // 每回合只刷新易变层;稳定层仅在实际能力目录变化时重建。
483
+ const turnTransient = await buildTransientPromptBundle({
484
+ cwd: effectiveCwd,
485
+ tools: turnTools,
486
+ runtime: {
487
+ surface: 'tui',
488
+ cwd: effectiveCwd,
489
+ currentUserInput: trimmed,
490
+ workspaceId: workspace?.id,
491
+ sessionId: activeSessionIdRef.current,
492
+ interactiveAsk: true,
493
+ supervisedBrowser: false,
494
+ memoryAccess: 'read-write',
495
+ },
496
+ }).catch(() => undefined);
497
+ // 会话原文记账(与 session/runTurn.ts 共用同一份实现)。
498
+ // TUI 不经过 runTurn,此前整条路径都不入库,SearchConversations 对 TUI 用户静默失效。
499
+ turnJournalStart = historyRef.current.length;
500
+ turnJournal = await startTurnJournal({
501
+ memoryContext: memoryContextFromRuntime(runtimeContext),
502
+ userInput: trimmed,
503
+ }).catch(() => null);
333
504
  for await (const ev of runWithPlugins(trimmed, {
334
505
  provider: providerRef.current,
335
506
  history: historyRef.current,
336
507
  signal: ac.signal,
508
+ runtimeContext,
509
+ allowedTools: turnTools.map((tool) => tool.name),
510
+ sessionState: turnSessionState,
337
511
  parseInlineImages: true,
512
+ ...(turnTransient ? { transientBundle: turnTransient } : {}),
513
+ promptCache: createPromptCacheContext(`workspace:${workspace?.id ?? getWorkingDir()}:session:${activeSessionIdRef.current}`),
338
514
  hasQueuedInput: () => inputQueue.size() > 0,
515
+ memoryContext: memoryContextFromRuntime(runtimeContext),
516
+ ...(computerRun ? { computerRun } : {}),
517
+ ...(computerIntervention ? { computerIntervention } : {}),
518
+ ...(toolGate ? { toolGate } : {}),
339
519
  onToolStart: (name, id) => {
340
520
  const tool = getToolByName(name);
341
521
  runningToolsRef.current.set(id, {
@@ -390,7 +570,14 @@ export function useChat(args) {
390
570
  resetTurnState();
391
571
  setPluginProgress(null);
392
572
  abortRef.current = null;
573
+ if (activeComputerRunRef.current) {
574
+ computerInterventions.abort(activeComputerRunRef.current);
575
+ }
576
+ activeComputerRunRef.current = null;
393
577
  runningToolsRef.current.clear();
578
+ // 记账失败不影响落盘与解锁(它是附加能力,不是功能)。
579
+ await turnJournal?.finish(historyRef.current, turnJournalStart).catch(() => undefined);
580
+ turnJournal = null;
394
581
  // v2 multi-session:持久化到当前 active session 文件。
395
582
  try {
396
583
  await saveContext(historyRef.current, sessionFileFor(getWorkingDir(), activeSessionIdRef.current));
@@ -418,12 +605,63 @@ export function useChat(args) {
418
605
  toolBumpFlush,
419
606
  resetTurnState,
420
607
  inputQueue,
608
+ computerUseMode,
609
+ computerInterventions,
421
610
  ]);
611
+ // latest-ref 赋值:runManualAdvisor 的 finally 靠它把排队输入交回 submit。
612
+ // 渲染体内直接赋值是 latest-ref 的常规写法;用 useEffect 会晚一帧,而咨询
613
+ // 结束时机与渲染无关,晚一帧就可能取到上一轮的闭包。
614
+ submitRef.current = submit;
422
615
  const abort = useCallback(() => {
423
616
  inputQueue.clear();
424
617
  runningToolsRef.current.clear();
618
+ if (activeComputerRunRef.current) {
619
+ computerInterventions.abort(activeComputerRunRef.current);
620
+ }
425
621
  abortRef.current?.abort();
426
- }, [inputQueue]);
622
+ }, [computerInterventions, inputQueue]);
623
+ const stopComputerUse = useCallback(async () => {
624
+ setComputerUseMode('disabled');
625
+ const context = activeComputerRunRef.current;
626
+ if (!context)
627
+ return '已撤销后续回合授权;当前没有正在运行的 Computer Use。';
628
+ computerInterventions.abort(context);
629
+ const response = await computerUseService.request(context, { action: 'stop' });
630
+ return response.ok
631
+ ? '已停止当前回合的 Computer Use,并撤销后续回合授权。'
632
+ : `已撤销后续回合授权;原生停止失败:${response.error?.message ?? '未知错误'}`;
633
+ }, [computerInterventions]);
634
+ const resumeComputerUse = useCallback(async () => {
635
+ const pending = pendingComputerIntervention;
636
+ if (!pending)
637
+ return '当前没有等待人工处理的 Computer Use。';
638
+ const resumed = computerInterventions.resume({
639
+ id: pending.id,
640
+ resumeToken: pending.resumeToken,
641
+ ownerId: pending.ownerId,
642
+ conversationKey: pending.conversationKey,
643
+ runId: pending.runId,
644
+ });
645
+ return resumed
646
+ ? '已恢复原 Computer Use 运行,将先重新观察目标应用再继续。'
647
+ : '人工介入请求已失效,请重新观察目标应用。';
648
+ }, [computerInterventions, pendingComputerIntervention]);
649
+ const cancelComputerUse = useCallback(async () => {
650
+ const pending = pendingComputerIntervention;
651
+ if (!pending)
652
+ return stopComputerUse();
653
+ const cancelled = computerInterventions.cancel({
654
+ id: pending.id,
655
+ resumeToken: pending.resumeToken,
656
+ ownerId: pending.ownerId,
657
+ conversationKey: pending.conversationKey,
658
+ runId: pending.runId,
659
+ });
660
+ setComputerUseMode('disabled');
661
+ return cancelled
662
+ ? '已取消当前人工介入并停止该 Computer Use 任务。'
663
+ : '人工介入请求已失效。';
664
+ }, [computerInterventions, pendingComputerIntervention, stopComputerUse]);
427
665
  const setProvider = useCallback((next) => {
428
666
  providerRef.current = next;
429
667
  }, []);
@@ -458,9 +696,10 @@ export function useChat(args) {
458
696
  return;
459
697
  // 生成全新的 system prompt(实时扫 skills + 拼项目指令),
460
698
  // 与启动时 main.tsx buildInitialHistory 行为完全一致
461
- const newSystemPrompt = await buildFullSystemPrompt(getWorkingDir(), ALL_TOOLS);
699
+ const newSystemPrompt = await buildBaseSystemPrompt(getWorkingDir(), ALL_TOOLS);
462
700
  historyRef.current.length = 0;
463
701
  historyRef.current.push({ role: 'system', content: newSystemPrompt });
702
+ promptToolSignatureRef.current = '';
464
703
  // 允许新 session 再次触发反应式压缩自救
465
704
  resetReactiveCompactState();
466
705
  cancelAllThrottles();
@@ -474,7 +713,13 @@ export function useChat(args) {
474
713
  // 清空磁盘上的持久化文件(防止下次启动又加载损坏数据)
475
714
  await clearContext();
476
715
  // 清空 pre-read guard 状态表(防止跨 session 的 Read 记录污染新会话)
477
- clearFileState();
716
+ const workspace = await workspaceIndexService.findByPath(getWorkingDir()).catch(() => null);
717
+ clearFileState(getOrCreateSessionState(sessionStateKey({
718
+ surface: 'tui',
719
+ workspaceId: workspace?.id,
720
+ cwd: workspace?.id ? undefined : getWorkingDir(),
721
+ sessionId: activeSessionIdRef.current,
722
+ })).fileReads);
478
723
  // 刚清空,不需要再保存一次"空历史"
479
724
  }, [bump, isLoading, cancelAllThrottles, resetTurnState]);
480
725
  /**
@@ -494,7 +739,9 @@ export function useChat(args) {
494
739
  cancelAllThrottles();
495
740
  let success = false;
496
741
  try {
497
- const r = await forceCompact(historyRef.current, args.provider);
742
+ const cwd = getWorkingDir();
743
+ const workspace = await workspaceIndexService.findByPath(cwd).catch(() => null);
744
+ const r = await forceCompact(historyRef.current, args.provider, undefined, undefined, createPromptCacheContext(`workspace:${workspace?.id ?? cwd}:session:${activeSessionIdRef.current}`));
498
745
  historyRef.current.length = 0;
499
746
  historyRef.current.push(...r.messages);
500
747
  // 压缩后 MessageList 要 remount,丢掉旧 <Static> 缓存
@@ -619,7 +866,7 @@ export function useChat(args) {
619
866
  }
620
867
  let systemPrompt;
621
868
  try {
622
- systemPrompt = await buildFullSystemPrompt(targetCwd, ALL_TOOLS);
869
+ systemPrompt = await buildBaseSystemPrompt(targetCwd, ALL_TOOLS);
623
870
  }
624
871
  catch (error) {
625
872
  setError(`无法打开工作区:${error instanceof Error ? error.message : String(error)}`);
@@ -646,10 +893,17 @@ export function useChat(args) {
646
893
  setActiveSessionId(targetSessionId);
647
894
  historyRef.current.length = 0;
648
895
  historyRef.current.push({ role: 'system', content: systemPrompt });
896
+ promptToolSignatureRef.current = '';
649
897
  if (loaded?.length) {
650
898
  historyRef.current.push(...(loaded[0]?.role === 'system' ? loaded.slice(1) : loaded));
651
899
  }
652
- clearFileState();
900
+ const targetWorkspace = await workspaceIndexService.findByPath(targetCwd).catch(() => null);
901
+ clearFileState(getOrCreateSessionState(sessionStateKey({
902
+ surface: 'tui',
903
+ workspaceId: targetWorkspace?.id,
904
+ cwd: targetWorkspace?.id ? undefined : targetCwd,
905
+ sessionId: targetSessionId,
906
+ })).fileReads);
653
907
  resetReactiveCompactState();
654
908
  cancelAllThrottles();
655
909
  setContextUsage(null);
@@ -679,6 +933,12 @@ export function useChat(args) {
679
933
  reasoningPreview,
680
934
  runningTools,
681
935
  contextUsage,
936
+ computerUseMode,
937
+ setComputerUseMode,
938
+ stopComputerUse,
939
+ pendingComputerIntervention,
940
+ resumeComputerUse,
941
+ cancelComputerUse,
682
942
  activeSessionId,
683
943
  queuedCount,
684
944
  queuedItems,
@@ -686,6 +946,7 @@ export function useChat(args) {
686
946
  abort,
687
947
  clearHistory,
688
948
  compactNow,
949
+ runManualAdvisor,
689
950
  switchSession,
690
951
  switchWorkspace,
691
952
  ephemeralLine,
@@ -866,6 +1127,9 @@ export function handleEvent(ev, setters) {
866
1127
  setters.setCompactGeneration((g) => g + 1);
867
1128
  setters.bump();
868
1129
  break;
1130
+ case 'harness_diagnostics':
1131
+ // Diagnostics are intentionally local-safe and currently consumed by CLI/stream hosts.
1132
+ break;
869
1133
  case 'turn_done':
870
1134
  setters.bump();
871
1135
  break;