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
@@ -0,0 +1,60 @@
1
+ export const COMPUTER_USE_PROTOCOL_VERSION = 1;
2
+ /**
3
+ * Actions that are both wired and implemented by the currently shipped native
4
+ * baseline. Keep this list conservative: exposing an action to the model is a
5
+ * product promise, not a placeholder for a future platform driver.
6
+ *
7
+ * Keep host-only control transitions (takeover/resume) and planned primitives
8
+ * out of the model schema until their native protocol exists. They remain in
9
+ * ComputerUseAction so callers receive an explicit `unsupported` response
10
+ * instead of being translated into a different, dangerous action.
11
+ */
12
+ export const COMPUTER_USE_TOOL_ACTIONS = [
13
+ 'status', 'permissions', 'observe', 'replay',
14
+ 'click', 'double_click', 'right_click', 'middle_click', 'hover',
15
+ 'pointer_down', 'pointer_move', 'pointer_up', 'drag', 'scroll',
16
+ 'type', 'key', 'hotkey',
17
+ // ⚠️ 这里曾经还有 `press` / `release` / `call_user` 三个 —— 它们出现在给模型的
18
+ // 动作枚举和工具描述里,但 `nativeAction()` 没有对应 case、`waitFor` 也不接管,
19
+ // 模型一调就掉进 default 抛 `尚未映射到原生动作协议`;守护进程的 `capabilities()`
20
+ // 也**从来没有**宣传过它们。也就是说这是 TS 单方面多报。
21
+ // · press/release(按住/松开某个键):`hotkey` 已覆盖组合键;真要按住修饰键跨动作,
22
+ // 得先解决「run 中途中断时那个键永远卡在按下状态」,那是另一件事,不是补个 case。
23
+ // · call_user:与 `AskUserQuestion` 工具重复,后者是已验证的通道。
24
+ // 三个都从模型可见面移除,`computerUseActionDispatch.test.ts` 锁住「列表里每个动作
25
+ // 都必须真的能被分派」。要加回来,先实现,再进这个列表。
26
+ // 闭环:动作后用像素判「界面稳了没」,比再看一张图便宜两个数量级。
27
+ 'settle',
28
+ // 旁路通道:能不走像素就不走。
29
+ 'clipboard_write', 'grab_region_to_clipboard', 'file_drop',
30
+ // 窗口控制:像素上根本表达不了「激活一个没在前台的应用」。
31
+ 'activate_app', 'window',
32
+ // 语义等待:在此之前模型只能 observe→看→observe 地轮询,每轮烧一张图
33
+ // (约 1100 token)。这三个改用元数据观测轮询,一轮几乎不花 token。
34
+ // 实现是纯 TS 编排(waitFor.ts),不经守护进程动作通道。
35
+ 'wait_for_element', 'wait_for_text', 'wait_for_window',
36
+ 'wait',
37
+ 'stop', 'emergency_stop',
38
+ ];
39
+ export function requiredCapability(action, intent = 'normal') {
40
+ if (['status', 'permissions', 'list_apps', 'observe', 'replay', 'settle', 'wait_stable', 'wait_for_element', 'wait_for_text', 'wait_for_window'].includes(action))
41
+ return 'observe';
42
+ // 意图优先于动作种类:一次 click 与一次 key 都可能是「发送」。
43
+ if (intent === 'submit' && isMutatingComputerUseAction(action))
44
+ return 'submit';
45
+ // clipboard_read 不在模型可见动作里 —— 见 ComputerUseAction 的说明。
46
+ if (action === 'clipboard_read')
47
+ return 'clipboard-read';
48
+ if (['clipboard_write', 'grab_region_to_clipboard'].includes(action))
49
+ return 'clipboard-write';
50
+ if (action === 'file_drop')
51
+ return 'file-drop';
52
+ if (action === 'type' || action === 'key' || action === 'hotkey' || action === 'select_text')
53
+ return 'type';
54
+ return 'interact';
55
+ }
56
+ export function isMutatingComputerUseAction(action) {
57
+ return !['status', 'permissions', 'list_apps', 'observe', 'replay', 'settle', 'wait_stable', 'wait_for_element', 'wait_for_text', 'wait_for_window', 'wait'].includes(action);
58
+ }
59
+ const _computerStateContractOk = true;
60
+ void _computerStateContractOk;
@@ -0,0 +1,515 @@
1
+ export const COMPUTER_USE_PROTOCOL_VERSION = 1;
2
+
3
+ export type ComputerUseSurface = 'desktop' | 'tui' | 'cli' | 'workflow' | 'subagent';
4
+ export type ComputerUseCapability =
5
+ | 'observe'
6
+ | 'interact'
7
+ | 'type'
8
+ | 'clipboard-read'
9
+ | 'clipboard-write'
10
+ | 'file-drop'
11
+ | 'submit';
12
+
13
+ export interface ComputerUseRunContext {
14
+ ownerId: string;
15
+ conversationKey: string;
16
+ runId: string;
17
+ surface: ComputerUseSurface;
18
+ allowedApps: string[];
19
+ grantId?: string;
20
+ capabilities: ComputerUseCapability[];
21
+ allowedFileRoots?: string[];
22
+ supervised?: boolean;
23
+ /**
24
+ * 本回合已获人工批准的不可逆动作授权(见 ComputerUseIrreversibleGrant)。
25
+ *
26
+ * 由工具层在用户批准后就地 push。`run` 对象与两处 host gate 闭包持的是同一个
27
+ * 引用,所以一次赋值同时对工具和 gate 生效,不必两边各记一份状态。
28
+ */
29
+ irreversibleGrants?: ComputerUseIrreversibleGrant[];
30
+ /**
31
+ * 本回合用户的原话。**只用于把上下文摆给人看**,不参与任何授权判定。
32
+ *
33
+ * 唯一消费点是不可逆动作的确认弹窗:用户这一轮压根没提要做不可逆的事、
34
+ * 模型却要提交时,弹窗会额外提醒一句。判定权仍完全在用户手上——从措辞
35
+ * 推断授权是被明确否决过的做法(见 `grants.ts` 头注)。
36
+ */
37
+ userInput?: string;
38
+ /**
39
+ * Explicit, local-only diagnostic capture root. The native wire adapter strips
40
+ * this field; it is consumed by the TypeScript tool host to persist a
41
+ * chronological, privacy-aware trace for one CLI run.
42
+ */
43
+ diagnosticTraceDir?: string;
44
+ }
45
+
46
+ /**
47
+ * 一次人工批准的不可逆动作授权。**范围限定到「应用 + 动作类别」**。
48
+ *
49
+ * 早先的实现是批准后往 `capabilities` 里 push `'submit'`,于是「批准给张三发
50
+ * 这条消息」顺带放开了本回合内**任何**不可逆动作 —— 同一回合里再关个没保存的
51
+ * 窗口、再删点什么,都不会再问一句。用户点头的是一件事,拿到的是一类权力。
52
+ *
53
+ * 现在批准写的是这个结构:`appId` 是当时的前台应用,`actionClass` 是命中的
54
+ * 不可逆条目类别(`intent:submit` / `window:close` / `key:Enter` / `region:…`)。
55
+ * 批准发消息不再顺带批准关窗口,而同一 (应用, 类别) 的后续动作仍不重复打扰 ——
56
+ * 「尽量少问」和「批的是哪件事」这两件事可以同时成立。
57
+ *
58
+ * 生命周期跟着 `ComputerUseRunContext` 走:宿主每回合新建一个 run 对象
59
+ * (TUI `useChat.ts`、Desktop `localServer.ts`),所以「本回合有效」是天然边界。
60
+ */
61
+ export interface ComputerUseIrreversibleGrant {
62
+ /** 批准时的前台应用标识;拿不到前台时为 `'*'`(仍受 supervised 那层约束)。 */
63
+ appId: string;
64
+ /** 命中的不可逆条目类别,如 `intent:submit`。 */
65
+ actionClass: string;
66
+ grantedAtMs: number;
67
+ }
68
+
69
+ export interface ComputerUseGrant {
70
+ id: string;
71
+ context: Omit<ComputerUseRunContext, 'grantId' | 'capabilities'>;
72
+ capabilities: ComputerUseCapability[];
73
+ expiresAt: number;
74
+ }
75
+
76
+ export interface ComputerUseRect {
77
+ x: number;
78
+ y: number;
79
+ width: number;
80
+ height: number;
81
+ }
82
+
83
+ export interface ComputerUseDisplay {
84
+ id: string;
85
+ name?: string;
86
+ logicalBounds: ComputerUseRect;
87
+ /**
88
+ * 扣掉菜单栏与 Dock 之后**真正能放窗口、能点到**的矩形(与 logicalBounds 同坐标系)。
89
+ *
90
+ * 拿不到就是 undefined —— 说不出准确数字时保持沉默,好过给一个编的。
91
+ * ⚠️ 与 logicalBounds 的差别不是边角:本机 1920×1080 上菜单栏 30pt、Dock 94pt,
92
+ * 可用区只有 1920×956,**中心比屏幕中心高 32pt**。
93
+ */
94
+ visibleBounds?: ComputerUseRect;
95
+ physicalWidth: number;
96
+ physicalHeight: number;
97
+ scaleFactor: number;
98
+ primary: boolean;
99
+ }
100
+
101
+ export interface ComputerUseApp {
102
+ id: string;
103
+ name: string;
104
+ pid?: number;
105
+ }
106
+
107
+ export interface ComputerUseWindow {
108
+ id: string;
109
+ appId: string;
110
+ title?: string;
111
+ bounds: ComputerUseRect;
112
+ minimized?: boolean;
113
+ }
114
+
115
+ export interface AccessibilityNode {
116
+ elementId: string;
117
+ role: string;
118
+ /**
119
+ * Platform subrole (macOS `AXSubrole`). Several toolkits report a generic
120
+ * role and only mark secure entry here, so this is load-bearing for the
121
+ * human-handoff boundary rather than decoration.
122
+ */
123
+ subrole?: string;
124
+ name?: string;
125
+ value?: string;
126
+ /** True for password/secure-entry controls. The value must be omitted. */
127
+ protected?: boolean;
128
+ bounds?: ComputerUseRect;
129
+ enabled?: boolean;
130
+ focused?: boolean;
131
+ actions?: string[];
132
+ children?: AccessibilityNode[];
133
+ }
134
+
135
+ export interface ComputerUseImageReference {
136
+ path: string;
137
+ mime: 'image/png' | 'image/jpeg' | 'image/webp';
138
+ width: number;
139
+ height: number;
140
+ byteLength?: number;
141
+ sha256?: string;
142
+ displayId?: string;
143
+ revision?: string;
144
+ expiresAt: number;
145
+ }
146
+
147
+ export interface ComputerUseVerification {
148
+ status: 'passed' | 'inconclusive' | 'failed';
149
+ reason: string;
150
+ beforeRevision?: string;
151
+ afterRevision?: string;
152
+ changed?: boolean;
153
+ }
154
+
155
+ export interface ComputerUseActionMarker {
156
+ action: ComputerUseAction;
157
+ displayId?: string;
158
+ x?: number;
159
+ y?: number;
160
+ beforeRevision?: string;
161
+ afterRevision?: string;
162
+ }
163
+
164
+ // `OcrBlock` 与 `ComputerState.ocrBlocks` 已删除:本系统按 SPEC §8 不做本地 OCR
165
+ // (文字识别由 VLM 直接完成),该字段自诞生起从未被任何 transport 填充过。
166
+ // 留着一个恒空的协议字段,只会让人以为"换个 transport 就能有"。
167
+
168
+ export interface ComputerState {
169
+ revision: string;
170
+ epoch: number;
171
+ displays: ComputerUseDisplay[];
172
+ activeApp?: ComputerUseApp;
173
+ windows: ComputerUseWindow[];
174
+ accessibility?: {
175
+ appId: string;
176
+ windowId?: string;
177
+ root: AccessibilityNode;
178
+ truncated?: boolean;
179
+ };
180
+ screenshot?: ComputerUseImageReference;
181
+ changedRegions: ComputerUseRect[];
182
+ /**
183
+ * 低频彩色帧序列,**按时间正序**(最早在前,最后一帧 = 当前状态)。
184
+ * 只有请求了多帧才非空;空数组表示只有上面那张 screenshot。
185
+ */
186
+ sequence?: ComputerUseSequenceFrame[];
187
+ backend: 'native' | 'degraded' | 'mock';
188
+ }
189
+
190
+ /** 原生侧低频环形缓冲里的一帧:裸 RGB,由宿主负责编码成 PNG。 */
191
+ export interface ComputerUseSequenceFrame {
192
+ capturedAtMs: number;
193
+ width: number;
194
+ height: number;
195
+ /** 行主序 RGB,每像素 3 字节,base64。 */
196
+ rgbBase64: string;
197
+ }
198
+
199
+ export type ComputerUseAction =
200
+ | 'status'
201
+ | 'permissions'
202
+ | 'list_apps'
203
+ | 'observe'
204
+ | 'replay'
205
+ | 'click'
206
+ | 'double_click'
207
+ | 'right_click'
208
+ | 'middle_click'
209
+ | 'hover'
210
+ | 'pointer_down'
211
+ | 'pointer_move'
212
+ | 'pointer_up'
213
+ | 'drag'
214
+ | 'scroll'
215
+ | 'type'
216
+ | 'key'
217
+ | 'hotkey'
218
+ | 'press'
219
+ | 'release'
220
+ | 'call_user'
221
+ /**
222
+ * ⚠️ **保留但未实现**(`select_text` / `secondary_action` / `wait_stable`)。
223
+ *
224
+ * 留在类型里的唯一理由:让调用方收到明确的 `unsupported`,而不是被翻译成
225
+ * 另一个(可能危险的)动作 —— 「选中文本」被降级成「点一下再拖」是会真的
226
+ * 改坏文档的。
227
+ *
228
+ * **移除条件**:到 2026 年底仍无实现且无人请求,就把它们连同这段注释一起删。
229
+ * 保留一个永远不会实现的占位,等于让每个读代码的人重新判断一次「这是没做完
230
+ * 还是不打算做」。
231
+ */
232
+ | 'select_text'
233
+ | 'secondary_action'
234
+ /**
235
+ * ⚠️ **产品策略禁用,不是未实现。**
236
+ *
237
+ * 跨应用搬运内容只需 Cmd+C / Cmd+V,agent 根本不需要**看到**内容;
238
+ * 而需要看到的场景恰好是密码管理器把凭据放上去的那个场景。
239
+ * 它留在类型里是为了让调用方收到明确的 `unsupported` 而不是被翻译成
240
+ * 别的动作。要放开必须重新论证,不是删一行。
241
+ */
242
+ | 'clipboard_read'
243
+ | 'clipboard_write'
244
+ /**
245
+ * 走剪贴板把文本粘进焦点控件,**并把用户原来的剪贴板内容还原回去**。
246
+ *
247
+ * 不是 `clipboard_write` + `hotkey` 的语法糖,两点区别都是实质的:
248
+ * ① 还原必须先**读**剪贴板,而剪贴板读是被产品策略禁掉的(那里正是密码管理器
249
+ * 放凭据的地方)。禁的是**模型看见**,不是守护进程碰——所以存/还原整个收在
250
+ * 守护进程内部,旧内容不过线路、不进模型、不进审计。
251
+ * ② 两步版本中间有一段「剪贴板已被覆盖、但还没粘贴」的窗口,这期间中断就等于
252
+ * 把用户的剪贴板白白吃掉。
253
+ *
254
+ * 只对**模型显式要求**的 `clipboard_write` 保持不还原——那是有意要留在剪贴板上的。
255
+ */
256
+ | 'grab_region_to_clipboard'
257
+ | 'activate_app'
258
+ | 'window'
259
+ | 'file_drop'
260
+ | 'settle'
261
+ | 'wait_stable'
262
+ | 'wait_for_element'
263
+ | 'wait_for_text'
264
+ | 'wait_for_window'
265
+ | 'wait'
266
+ | 'takeover'
267
+ | 'resume'
268
+ | 'stop'
269
+ | 'emergency_stop';
270
+
271
+ /**
272
+ * Actions that are both wired and implemented by the currently shipped native
273
+ * baseline. Keep this list conservative: exposing an action to the model is a
274
+ * product promise, not a placeholder for a future platform driver.
275
+ *
276
+ * Keep host-only control transitions (takeover/resume) and planned primitives
277
+ * out of the model schema until their native protocol exists. They remain in
278
+ * ComputerUseAction so callers receive an explicit `unsupported` response
279
+ * instead of being translated into a different, dangerous action.
280
+ */
281
+ export const COMPUTER_USE_TOOL_ACTIONS = [
282
+ 'status', 'permissions', 'observe', 'replay',
283
+ 'click', 'double_click', 'right_click', 'middle_click', 'hover',
284
+ 'pointer_down', 'pointer_move', 'pointer_up', 'drag', 'scroll',
285
+ 'type', 'key', 'hotkey',
286
+ // ⚠️ 这里曾经还有 `press` / `release` / `call_user` 三个 —— 它们出现在给模型的
287
+ // 动作枚举和工具描述里,但 `nativeAction()` 没有对应 case、`waitFor` 也不接管,
288
+ // 模型一调就掉进 default 抛 `尚未映射到原生动作协议`;守护进程的 `capabilities()`
289
+ // 也**从来没有**宣传过它们。也就是说这是 TS 单方面多报。
290
+ // · press/release(按住/松开某个键):`hotkey` 已覆盖组合键;真要按住修饰键跨动作,
291
+ // 得先解决「run 中途中断时那个键永远卡在按下状态」,那是另一件事,不是补个 case。
292
+ // · call_user:与 `AskUserQuestion` 工具重复,后者是已验证的通道。
293
+ // 三个都从模型可见面移除,`computerUseActionDispatch.test.ts` 锁住「列表里每个动作
294
+ // 都必须真的能被分派」。要加回来,先实现,再进这个列表。
295
+ // 闭环:动作后用像素判「界面稳了没」,比再看一张图便宜两个数量级。
296
+ 'settle',
297
+ // 旁路通道:能不走像素就不走。
298
+ 'clipboard_write', 'grab_region_to_clipboard', 'file_drop',
299
+ // 窗口控制:像素上根本表达不了「激活一个没在前台的应用」。
300
+ 'activate_app', 'window',
301
+ // 语义等待:在此之前模型只能 observe→看→observe 地轮询,每轮烧一张图
302
+ // (约 1100 token)。这三个改用元数据观测轮询,一轮几乎不花 token。
303
+ // 实现是纯 TS 编排(waitFor.ts),不经守护进程动作通道。
304
+ 'wait_for_element', 'wait_for_text', 'wait_for_window',
305
+ 'wait',
306
+ 'stop', 'emergency_stop',
307
+ ] as const satisfies readonly ComputerUseAction[];
308
+
309
+ export type ComputerUseToolAction = (typeof COMPUTER_USE_TOOL_ACTIONS)[number];
310
+
311
+ export interface ComputerUseRequest {
312
+ protocolVersion: number;
313
+ requestId: string;
314
+ context: ComputerUseRunContext;
315
+ action: ComputerUseAction;
316
+ appId?: string;
317
+ windowId?: string;
318
+ displayId?: string;
319
+ elementId?: string;
320
+ expectedRevision?: string;
321
+ expectedEpoch?: number;
322
+ x?: number;
323
+ y?: number;
324
+ /** ★ UI-TARS bbox 支持:框选右下角坐标(0-1000),系统自动取中心点点击 */
325
+ x2?: number;
326
+ y2?: number;
327
+ toX?: number;
328
+ toY?: number;
329
+ dx?: number;
330
+ dy?: number;
331
+ button?: 'left' | 'right' | 'middle';
332
+ clickCount?: number;
333
+ text?: string;
334
+ key?: string;
335
+ /** 修饰键,如 ['command', 'shift'],用于 hotkey 动作 */
336
+ modifiers?: string[];
337
+ secondaryAction?: string;
338
+ direction?: 'up' | 'down' | 'left' | 'right';
339
+ pages?: number;
340
+ filePaths?: string[];
341
+ rect?: ComputerUseRect;
342
+ timeoutMs?: number;
343
+ quietMs?: number;
344
+ /** Internal host instruction: keep the native input lease through settle and post-observe. */
345
+ _verifiedAction?: {
346
+ quietMs: number;
347
+ timeoutMs: number;
348
+ region?: ComputerUseRect;
349
+ };
350
+ /** observe 时要附带多少帧连续画面。0/1 = 只给当前截图。 */
351
+ frames?: number;
352
+ /**
353
+ * 让守护进程在动作落地后顺手测一次界面变化率(填回 `changeRatio`)。
354
+ *
355
+ * **模型不设这个字段**(工具 schema 里没有它)。它由
356
+ * `computerUseService::shouldProbeChange` 按「输入类动作 + 上次观测的 AX 树
357
+ * 不可用」自动置上 —— 这是一条安全兜底的输入,不是模型可以调的旋钮。
358
+ */
359
+ probeChange?: boolean;
360
+ /**
361
+ * 变化率探测的 ROI,**逻辑点**(不是 0–1000 相对坐标)。
362
+ *
363
+ * 取自上一次观测的焦点控件矩形。它和 `rect` 不同:`rect` 是模型给的相对
364
+ * 坐标、要经换算;这个是从 AX 拿到的、本来就是逻辑点,**不能**再走一次
365
+ * 相对坐标映射,否则会被二次换算成一块完全不相干的区域。
366
+ */
367
+ probeRegion?: ComputerUseRect;
368
+ /** window 动作要做什么。缺省 focus。 */
369
+ windowOperation?: ComputerUseWindowOperation;
370
+ /**
371
+ * window `center` 用:true = 无条件摆到可用区正中。
372
+ *
373
+ * 缺省(false)只在窗口被裁切或被 Dock/菜单栏压住时才动它 —— 已经摆好的布局
374
+ * 不折腾,给「同屏多应用」留空间。
375
+ */
376
+ force?: boolean;
377
+ /** file_drop 用哪条路径把文件送进去。缺省 paste。 */
378
+ dropMethod?: ComputerUseDropMethod;
379
+ /** call_user 动作的消息内容 */
380
+ message?: string;
381
+ }
382
+
383
+ export type ComputerUseWindowOperation =
384
+ | 'focus'
385
+ | 'minimize'
386
+ | 'restore'
387
+ | 'close'
388
+ | 'move_resize'
389
+ | 'center';
390
+
391
+ /**
392
+ * 文件投放的机制。
393
+ *
394
+ * **两种都不是真拖拽** —— macOS 的拖拽必须由**源应用**发起
395
+ * `NSDraggingSession`,第三方进程合成不出 AppKit 认账的那一套。名字保留
396
+ * `file_drop` 是为了协议稳定,但调用方必须知道实际发生的是什么。
397
+ *
398
+ * paste 把文件引用放进剪贴板再 Cmd+V。覆盖面最广(访达/微信/邮件)
399
+ * open_panel 驱动**已经打开的**文件面板:Cmd+Shift+G → 输入路径 → 确认。
400
+ * 对有明确「附件/导入」按钮的应用更稳,但它打不开那个面板
401
+ */
402
+ export type ComputerUseDropMethod = 'paste' | 'open_panel';
403
+
404
+ export type ComputerUseErrorCode =
405
+ | 'unavailable'
406
+ | 'unsupported'
407
+ | 'permission_denied'
408
+ | 'permission_required'
409
+ | 'invalid_request'
410
+ | 'invalid_coordinates'
411
+ | 'capture_transient'
412
+ | 'invalid_image'
413
+ | 'verification_failed'
414
+ | 'protocol_mismatch'
415
+ | 'stale_state'
416
+ | 'target_not_found'
417
+ | 'target_out_of_scope'
418
+ | 'grant_required'
419
+ | 'lease_conflict'
420
+ | 'human_input_detected'
421
+ | 'cancelled'
422
+ | 'timeout'
423
+ | 'app_unresponsive'
424
+ | 'human_intervention_required'
425
+ | 'internal';
426
+
427
+ export interface ComputerUseResponse {
428
+ protocolVersion: number;
429
+ requestId: string;
430
+ ok: boolean;
431
+ state?: ComputerState;
432
+ content?: string;
433
+ images?: ComputerUseImageReference[];
434
+ data?: unknown;
435
+ postState?: ComputerState;
436
+ beforeState?: ComputerState;
437
+ verification?: ComputerUseVerification;
438
+ actionMarker?: ComputerUseActionMarker;
439
+ settle?: {
440
+ settled: boolean;
441
+ stableMs: number;
442
+ observedEpoch: number;
443
+ reason?: string;
444
+ };
445
+ error?: {
446
+ code: ComputerUseErrorCode;
447
+ message: string;
448
+ hint?: string;
449
+ retryable?: boolean;
450
+ details?: Record<string, unknown>;
451
+ };
452
+ /**
453
+ * 本次观测相对**上一次观测**的焦点变化语义(仅 observe 类请求会带)。
454
+ *
455
+ * `other-process` 是这里最要紧的一个值:前台窗口归 OS 管、应用拦不住,
456
+ * 所以「别的进程/用户把前台抢走了」是**唯一不会被自绘应用堵掉的信号**。
457
+ * 用户自己切了窗口、或弹了个系统对话框,agent 若继续按旧坐标点下去,
458
+ * 就是在别人的窗口上闭眼操作 —— 这类失败最危险且完全可检出。
459
+ */
460
+ focusChange?: import('./vision/focus.js').FocusChange;
461
+ /** 本次观测派生出的焦点快照(level 如实反映实际拿到哪一层)。 */
462
+ focus?: import('./vision/focus.js').FocusSnapshot;
463
+ }
464
+
465
+ export interface ComputerUseInputStatus {
466
+ context: Pick<ComputerUseRunContext, 'ownerId' | 'conversationKey' | 'runId'>;
467
+ detected: boolean;
468
+ inputType?: 'pointer' | 'keyboard' | 'scroll';
469
+ detectedAtMs?: number;
470
+ }
471
+
472
+ /**
473
+ * 动作意图。模型**自报**,与 WebBrowser 的 `intent` 同构。
474
+ *
475
+ * `submit` 声明「这一步会造成外部可见的、不可撤销的后果」——发消息、下单、
476
+ * 永久删除。它把所需能力从 interact/type 提升到 `submit`,从而触发额外的
477
+ * 人工确认。自报当然可能漏报,所以它不是唯一防线:`apps/<app>.md` 的
478
+ * `irreversible:` 声明能在模型没自报时独立命中(见 vision/appGuide.ts)。
479
+ */
480
+ export type ComputerUseIntent = 'normal' | 'submit';
481
+
482
+ export function requiredCapability(
483
+ action: ComputerUseAction,
484
+ intent: ComputerUseIntent = 'normal',
485
+ ): ComputerUseCapability {
486
+ if (['status', 'permissions', 'list_apps', 'observe', 'replay', 'settle', 'wait_stable', 'wait_for_element', 'wait_for_text', 'wait_for_window'].includes(action)) return 'observe';
487
+ // 意图优先于动作种类:一次 click 与一次 key 都可能是「发送」。
488
+ if (intent === 'submit' && isMutatingComputerUseAction(action)) return 'submit';
489
+ // clipboard_read 不在模型可见动作里 —— 见 ComputerUseAction 的说明。
490
+ if (action === 'clipboard_read') return 'clipboard-read';
491
+ if (['clipboard_write', 'grab_region_to_clipboard'].includes(action)) return 'clipboard-write';
492
+ if (action === 'file_drop') return 'file-drop';
493
+ if (action === 'type' || action === 'key' || action === 'hotkey' || action === 'select_text') return 'type';
494
+ return 'interact';
495
+ }
496
+
497
+ export function isMutatingComputerUseAction(action: ComputerUseAction): boolean {
498
+ return !['status', 'permissions', 'list_apps', 'observe', 'replay', 'settle', 'wait_stable', 'wait_for_element', 'wait_for_text', 'wait_for_window', 'wait'].includes(action);
499
+ }
500
+
501
+ /**
502
+ * 编译期契约断言:本工具的 `ComputerState` 必须满足线路协议承诺的
503
+ * `ComputerObservation` 结构子集。
504
+ *
505
+ * 方向是**工具依赖协议**:协议(`src/web/protocol.ts`)是 desktop / server 共享的
506
+ * 类型真值,它不该反过来 import 某个工具的内部模块。这行断言就是两者之间的接缝 ——
507
+ * 谁改窄了这几个字段(比如把 `screenshot.path` 改成可选、把 `windows` 删掉),
508
+ * 编译立刻红,而不是等到 desktop 面板运行时才发现读不到东西。
509
+ *
510
+ * 纯类型断言,不产生任何运行时代码。
511
+ */
512
+ type _ComputerStateSatisfiesWireContract =
513
+ ComputerState extends import('../../web/protocol.js').ComputerObservation ? true : never;
514
+ const _computerStateContractOk: _ComputerStateSatisfiesWireContract = true;
515
+ void _computerStateContractOk;
@@ -0,0 +1,57 @@
1
+ /**
2
+ * ============================================================
3
+ * telemetryLog.ts —— Computer Use 遥测的落地点
4
+ * ------------------------------------------------------------
5
+ * `vision/telemetry.ts` 是**纯逻辑**(白名单过滤、连续失败计数、汇总);
6
+ * 本模块是它与真实文件系统之间那一层:决定写哪个文件、失败怎么办、
7
+ * 以及从多少条记录里做判断。
8
+ *
9
+ * 为什么要分两层:纯逻辑那层要能在单测里对着内存数组跑,不该知道
10
+ * `~/Library/Application Support` 存在;而路径与容量策略是部署问题,
11
+ * 不该混进算法里。
12
+ *
13
+ * ★ 遥测的职责是**观测**:验证两个假设(见 vision/telemetry.ts 头注)。
14
+ * 它**不承担运行时安全职责** —— 连续失败熔断曾经建在这个文件上,那是
15
+ * 个错误:全机唯一的日志没有会话隔离(A 的失败熔断 B)、读改写有竞态、
16
+ * 而且计数不分动作(一次成功 observe 就清零,于是「失败→观察→失败」
17
+ * 这个最常见的打转模式可以无限绕过熔断)。熔断现在住在
18
+ * `ComputerUseService`,按运行 + 动作指纹分桶,同步无 IO。
19
+ *
20
+ * 隐私:写盘前必经 `sanitizeRecord` 白名单,只留命令名、耗时、枚举值、
21
+ * 比例。屏幕内容、窗口标题、输入文本一律进不来 —— 那是白名单的实现保证,
22
+ * 不是调用方的自觉。
23
+ * ============================================================
24
+ */
25
+ import { join } from 'node:path';
26
+ import { computerUseStateDir } from './computerUseService.js';
27
+ import { CONSECUTIVE_FAILURE_LIMIT, readRecords, record, renderReport, summarize, } from './vision/telemetry.js';
28
+ function logPath() {
29
+ return join(computerUseStateDir(), 'telemetry.jsonl');
30
+ }
31
+ /**
32
+ * 记一条调用元数据。
33
+ *
34
+ * **永不抛异常、永不阻断主流程**:遥测是观测手段,不是功能。日志写不进去
35
+ * (磁盘满、目录只读)时宁可少一条记录,也不能让一次正常的桌面操作失败。
36
+ */
37
+ export async function recordComputerUseCall(raw) {
38
+ try {
39
+ await record(logPath(), raw);
40
+ }
41
+ catch {
42
+ /* 观测失败不影响功能 */
43
+ }
44
+ }
45
+ export { CONSECUTIVE_FAILURE_LIMIT };
46
+ /**
47
+ * 人类可读的遥测汇总,给 CLI/诊断用。
48
+ *
49
+ * 这是 SPEC §9 声称的「验证两个假设」真正的出口 —— 在此之前遥测模块整个
50
+ * 没有生产调用方,汇总函数写了却没人能看到结果。
51
+ */
52
+ export async function readComputerUseTelemetryReport() {
53
+ const records = await readRecords(logPath()).catch(() => []);
54
+ if (records.length === 0)
55
+ return '还没有 Computer Use 遥测记录。';
56
+ return renderReport(summarize(records));
57
+ }