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,91 @@
1
+ /**
2
+ * ============================================================
3
+ * plugins/computer_use/src/commands.ts —— /computeruse 子命令分发
4
+ * ------------------------------------------------------------
5
+ * 全部确定性执行,不经过 LLM。命令是给**人**用的诊断与知识管理入口;
6
+ * 真正操作桌面是模型调 `ComputerUse` 工具的事。
7
+ *
8
+ * 这条分界线是本插件的设计前提:说明书的**强制消费点在工具层**,因为模型
9
+ * 在任意一轮直接调工具,根本不会经过这里(非 `/` 输入直通 runQuery)。
10
+ * 把强制逻辑写进命令 = 只在用户敲斜杠时才生效的安全机制。
11
+ * ============================================================
12
+ */
13
+ import { readFile } from 'node:fs/promises';
14
+ import { join } from 'node:path';
15
+ import { computerUseDiagnostics, readComputerUseTelemetryReport, readRecentComputerUseAudit, } from '../../../src/plugin-sdk.js';
16
+ import { runCapture } from './capture.js';
17
+ import { runVerify } from './verify.js';
18
+ import { runDoctor, runObserve, runStatus } from './daemon.js';
19
+ import { runApp, runApps } from './manuals.js';
20
+ export async function handleComputerUseCommand(args, signal) {
21
+ const parts = args.trim().split(/\s+/).filter(Boolean);
22
+ const sub = (parts[0] ?? '').toLowerCase();
23
+ const rest = parts.slice(1).join(' ');
24
+ switch (sub) {
25
+ case '':
26
+ return runStatus(signal);
27
+ case 'doctor':
28
+ return runDoctor(signal);
29
+ case 'apps':
30
+ return runApps(signal);
31
+ case 'app':
32
+ return runApp(rest);
33
+ case 'observe':
34
+ return runObserve(signal);
35
+ case 'verify':
36
+ return runVerify(rest, signal);
37
+ case 'capture':
38
+ return runCapture(rest, signal);
39
+ case 'report':
40
+ return readComputerUseTelemetryReport();
41
+ case 'audit':
42
+ return renderAudit(rest);
43
+ default:
44
+ return [
45
+ `未知子命令:${sub}`,
46
+ '',
47
+ '可用:(空)· doctor · apps · app <name> · capture [name] [--write] · verify <app> · observe · report · audit [n]',
48
+ ].join('\n');
49
+ }
50
+ }
51
+ /**
52
+ * 两份记录**并排显示,不合并**:
53
+ * - `audit.jsonl` 由守护进程拥有与写入(动作级流水)
54
+ * - `authorizations.jsonl` 由 TS 侧写(不可逆动作的人工批准结局)
55
+ * 合并会让人以为它们出自同一条链路、有同一套保证。它们没有。
56
+ */
57
+ async function renderAudit(arg) {
58
+ const parsed = Number.parseInt(arg, 10);
59
+ const limit = Number.isFinite(parsed) && parsed > 0 ? parsed : 10;
60
+ const entries = await readRecentComputerUseAudit(limit).catch((error) => {
61
+ return [`读取审计失败:${error instanceof Error ? error.message : String(error)}`];
62
+ });
63
+ return [
64
+ `# Computer Use 审计(最近 ${limit} 条)`,
65
+ '',
66
+ '## 守护进程动作流水(audit.jsonl)',
67
+ ...(entries.length > 0 ? entries.map((line) => `- ${line}`) : ['(还没有记录)']),
68
+ '',
69
+ '## 不可逆动作授权(authorizations.jsonl,TS 侧)',
70
+ ...(await readAuthorizations(limit)),
71
+ ].join('\n');
72
+ }
73
+ async function readAuthorizations(limit) {
74
+ const path = join(computerUseDiagnostics.stateDir(), 'authorizations.jsonl');
75
+ const raw = await readFile(path, 'utf8').catch(() => '');
76
+ const lines = raw.split(/\r?\n/).filter(Boolean).slice(-limit);
77
+ if (lines.length === 0)
78
+ return ['(还没有记录)'];
79
+ return lines.map((line) => {
80
+ try {
81
+ const record = JSON.parse(line);
82
+ const time = typeof record.t === 'number'
83
+ ? new Date(record.t).toLocaleString()
84
+ : '未知时间';
85
+ return `- ${time} · ${record.decision} · ${record.appId} · ${record.actionClass} · ${record.surface}`;
86
+ }
87
+ catch {
88
+ return '- 无法解析的授权记录';
89
+ }
90
+ });
91
+ }
@@ -0,0 +1,103 @@
1
+ /**
2
+ * ============================================================
3
+ * plugins/computer_use/src/commands.ts —— /computeruse 子命令分发
4
+ * ------------------------------------------------------------
5
+ * 全部确定性执行,不经过 LLM。命令是给**人**用的诊断与知识管理入口;
6
+ * 真正操作桌面是模型调 `ComputerUse` 工具的事。
7
+ *
8
+ * 这条分界线是本插件的设计前提:说明书的**强制消费点在工具层**,因为模型
9
+ * 在任意一轮直接调工具,根本不会经过这里(非 `/` 输入直通 runQuery)。
10
+ * 把强制逻辑写进命令 = 只在用户敲斜杠时才生效的安全机制。
11
+ * ============================================================
12
+ */
13
+
14
+ import { readFile } from 'node:fs/promises';
15
+ import { join } from 'node:path';
16
+
17
+ import {
18
+ computerUseDiagnostics,
19
+ readComputerUseTelemetryReport,
20
+ readRecentComputerUseAudit,
21
+ } from '../../../src/plugin-sdk.js';
22
+
23
+ import { runCapture } from './capture.js';
24
+ import { runVerify } from './verify.js';
25
+ import { runDoctor, runObserve, runStatus } from './daemon.js';
26
+ import { runApp, runApps } from './manuals.js';
27
+
28
+ export async function handleComputerUseCommand(
29
+ args: string,
30
+ signal?: AbortSignal,
31
+ ): Promise<string> {
32
+ const parts = args.trim().split(/\s+/).filter(Boolean);
33
+ const sub = (parts[0] ?? '').toLowerCase();
34
+ const rest = parts.slice(1).join(' ');
35
+
36
+ switch (sub) {
37
+ case '':
38
+ return runStatus(signal);
39
+ case 'doctor':
40
+ return runDoctor(signal);
41
+ case 'apps':
42
+ return runApps(signal);
43
+ case 'app':
44
+ return runApp(rest);
45
+ case 'observe':
46
+ return runObserve(signal);
47
+ case 'verify':
48
+ return runVerify(rest, signal);
49
+ case 'capture':
50
+ return runCapture(rest, signal);
51
+ case 'report':
52
+ return readComputerUseTelemetryReport();
53
+ case 'audit':
54
+ return renderAudit(rest);
55
+ default:
56
+ return [
57
+ `未知子命令:${sub}`,
58
+ '',
59
+ '可用:(空)· doctor · apps · app <name> · capture [name] [--write] · verify <app> · observe · report · audit [n]',
60
+ ].join('\n');
61
+ }
62
+ }
63
+
64
+ /**
65
+ * 两份记录**并排显示,不合并**:
66
+ * - `audit.jsonl` 由守护进程拥有与写入(动作级流水)
67
+ * - `authorizations.jsonl` 由 TS 侧写(不可逆动作的人工批准结局)
68
+ * 合并会让人以为它们出自同一条链路、有同一套保证。它们没有。
69
+ */
70
+ async function renderAudit(arg: string): Promise<string> {
71
+ const parsed = Number.parseInt(arg, 10);
72
+ const limit = Number.isFinite(parsed) && parsed > 0 ? parsed : 10;
73
+ const entries = await readRecentComputerUseAudit(limit).catch((error: unknown) => {
74
+ return [`读取审计失败:${error instanceof Error ? error.message : String(error)}`];
75
+ });
76
+ return [
77
+ `# Computer Use 审计(最近 ${limit} 条)`,
78
+ '',
79
+ '## 守护进程动作流水(audit.jsonl)',
80
+ ...(entries.length > 0 ? entries.map((line) => `- ${line}`) : ['(还没有记录)']),
81
+ '',
82
+ '## 不可逆动作授权(authorizations.jsonl,TS 侧)',
83
+ ...(await readAuthorizations(limit)),
84
+ ].join('\n');
85
+ }
86
+
87
+ async function readAuthorizations(limit: number): Promise<string[]> {
88
+ const path = join(computerUseDiagnostics.stateDir(), 'authorizations.jsonl');
89
+ const raw = await readFile(path, 'utf8').catch(() => '');
90
+ const lines = raw.split(/\r?\n/).filter(Boolean).slice(-limit);
91
+ if (lines.length === 0) return ['(还没有记录)'];
92
+ return lines.map((line) => {
93
+ try {
94
+ const record = JSON.parse(line) as Record<string, unknown>;
95
+ const time = typeof record.t === 'number'
96
+ ? new Date(record.t).toLocaleString()
97
+ : '未知时间';
98
+ return `- ${time} · ${record.decision} · ${record.appId} · ${record.actionClass} · ${record.surface}`;
99
+ } catch {
100
+ return '- 无法解析的授权记录';
101
+ }
102
+ });
103
+ }
@@ -0,0 +1,134 @@
1
+ /**
2
+ * ============================================================
3
+ * plugins/computer_use/src/daemon.ts —— 与守护进程打交道的确定性命令
4
+ * ------------------------------------------------------------
5
+ * 全部经内核的 `computerUseDiagnostics` 只读门面。插件**拿不到**动作派发能力
6
+ * ——不是靠这里自觉不调用,而是门面根本没有那个方法(见 diagnostics.ts 头注)。
7
+ * ============================================================
8
+ */
9
+ import { computerUseDiagnostics, describeCapabilities, } from '../../../src/plugin-sdk.js';
10
+ /** 平台不支持时统一的一段话。分开写是因为它不是「出错」,是「本来就没有」。 */
11
+ function unsupportedNote() {
12
+ return [
13
+ `⚠️ 当前平台是 ${process.platform},Computer Use 只支持 macOS。`,
14
+ 'Windows 侧只有协议桩,没有 UI Automation 驱动 —— 不是「装一下就能用」。',
15
+ ].join('\n');
16
+ }
17
+ function describeError(response) {
18
+ return `❌ ${response.error?.code ?? 'failed'}: ${response.error?.message ?? '未知错误'}`
19
+ + (response.error?.hint ? `\n ${response.error.hint}` : '');
20
+ }
21
+ export async function runStatus(signal) {
22
+ const lines = ['# Computer Use 状态', ''];
23
+ if (!computerUseDiagnostics.platformSupported()) {
24
+ lines.push(unsupportedNote());
25
+ return lines.join('\n');
26
+ }
27
+ const helper = computerUseDiagnostics.helperPath();
28
+ lines.push(`守护进程二进制:${helper ?? '未找到(vendor/computer-use 缺失)'}`);
29
+ lines.push(`状态目录:${computerUseDiagnostics.stateDir()}`);
30
+ lines.push(`说明书写入目录:${computerUseDiagnostics.manualDir()}`);
31
+ if (!helper) {
32
+ lines.push('', '没有 helper 就没有一切。请确认 `vendor/computer-use/<平台>/cu-helperd` 存在。');
33
+ return lines.join('\n');
34
+ }
35
+ const hello = await computerUseDiagnostics.status(signal);
36
+ if (!hello.ok) {
37
+ lines.push('', describeError(hello));
38
+ return lines.join('\n');
39
+ }
40
+ const data = (hello.data ?? {});
41
+ lines.push(`服务版本:${data.serviceVersion ?? '未知'} · ${data.platform ?? '?'} / ${data.implementation ?? '?'}`, '', renderCapabilities(data.capabilities ?? []));
42
+ return lines.join('\n');
43
+ }
44
+ /**
45
+ * 能力清单按三态分组呈现。映射来自内核的 `capabilityLabels.ts`,与 Desktop
46
+ * 面板**共用同一份** —— 两边各自解析字符串前缀是上一版的漂移来源。
47
+ */
48
+ function renderCapabilities(ids) {
49
+ if (ids.length === 0)
50
+ return '## 能力\n\n驱动没有报告任何能力。';
51
+ const labels = describeCapabilities(ids);
52
+ const group = (state) => labels.filter((label) => label.state === state)
53
+ .map((label) => `- ${label.label}${label.reason ? ` —— ${label.reason}` : ''}`);
54
+ const supported = group('supported');
55
+ const disabled = group('deliberately-disabled');
56
+ const missing = group('not-implemented');
57
+ return [
58
+ '## 能力',
59
+ '',
60
+ '### 已支持',
61
+ ...(supported.length > 0 ? supported : ['- (无)']),
62
+ ...(disabled.length > 0 ? ['', '### 有意禁用(不是缺口,是决定)', ...disabled] : []),
63
+ ...(missing.length > 0 ? ['', '### 尚未实现', ...missing] : []),
64
+ ].join('\n');
65
+ }
66
+ const PERMISSION_LABEL = {
67
+ screenCapture: '屏幕录制',
68
+ accessibility: '辅助功能',
69
+ inputControl: '输入控制',
70
+ ocr: 'OCR',
71
+ };
72
+ /**
73
+ * 权限体检。每一项都给出**能照着做的**下一步,而不是只报一个状态词 ——
74
+ * 「denied」对用户来说不是信息,「去哪个开关里把它打开」才是。
75
+ */
76
+ export async function runDoctor(signal) {
77
+ if (!computerUseDiagnostics.platformSupported())
78
+ return unsupportedNote();
79
+ const response = await computerUseDiagnostics.permissions(signal);
80
+ if (!response.ok) {
81
+ return ['# Computer Use 权限体检', '', describeError(response)].join('\n');
82
+ }
83
+ const snapshot = (response.data ?? {});
84
+ const lines = ['# Computer Use 权限体检', ''];
85
+ let blocked = 0;
86
+ for (const [key, label] of Object.entries(PERMISSION_LABEL)) {
87
+ const state = snapshot[key] ?? 'unknown';
88
+ const ok = state === 'granted';
89
+ if (!ok && key !== 'ocr')
90
+ blocked += 1;
91
+ lines.push(`${ok ? '✅' : state === 'unsupported' ? '➖' : '❌'} ${label}:${state}`);
92
+ if (!ok && key === 'screenCapture') {
93
+ lines.push(' 系统设置 → 隐私与安全性 → 屏幕录制,勾选本应用后**需要重启应用**。');
94
+ }
95
+ if (!ok && key === 'accessibility') {
96
+ lines.push(' 系统设置 → 隐私与安全性 → 辅助功能。没有它就拿不到控件树,只能看像素。');
97
+ }
98
+ if (!ok && key === 'inputControl') {
99
+ lines.push(' 输入控制随辅助功能一起授予;仍为 denied 时把本应用从列表里删掉再重新添加。');
100
+ }
101
+ if (key === 'ocr' && state !== 'granted') {
102
+ lines.push(' OCR 是**有意不实现**的(见 SPEC),这里不是故障。');
103
+ }
104
+ }
105
+ lines.push('', blocked === 0
106
+ ? '权限齐全。'
107
+ : `有 ${blocked} 项关键权限未就绪,Computer Use 会退化或直接失败。`);
108
+ return lines.join('\n');
109
+ }
110
+ /** 跑一次观测并把结果**给人看**(不进模型上下文,所以不组装图)。 */
111
+ export async function runObserve(signal) {
112
+ if (!computerUseDiagnostics.platformSupported())
113
+ return unsupportedNote();
114
+ const response = await computerUseDiagnostics.observe(signal);
115
+ if (!response.ok || !response.state) {
116
+ return ['# 一次观测', '', describeError(response)].join('\n');
117
+ }
118
+ const state = response.state;
119
+ const lines = [
120
+ '# 一次观测',
121
+ '',
122
+ `前台应用:${state.activeApp?.name ?? '未知'}(${state.activeApp?.id ?? '无标识'})`,
123
+ `显示器:${state.displays.length} 台 · 窗口:${state.windows.length} 个`,
124
+ `无障碍树:${state.accessibility ? (state.accessibility.truncated ? '不完整(权限不足或元素过多)' : '可用') : '无'}`,
125
+ `revision ${state.revision} · epoch ${state.epoch} · backend ${state.backend}`,
126
+ ];
127
+ if (state.windows.length > 0) {
128
+ lines.push('', '## 窗口');
129
+ for (const window of state.windows.slice(0, 10)) {
130
+ lines.push(`- ${window.title ?? '(无标题)'} — ${window.appId}`);
131
+ }
132
+ }
133
+ return lines.join('\n');
134
+ }
@@ -0,0 +1,161 @@
1
+ /**
2
+ * ============================================================
3
+ * plugins/computer_use/src/daemon.ts —— 与守护进程打交道的确定性命令
4
+ * ------------------------------------------------------------
5
+ * 全部经内核的 `computerUseDiagnostics` 只读门面。插件**拿不到**动作派发能力
6
+ * ——不是靠这里自觉不调用,而是门面根本没有那个方法(见 diagnostics.ts 头注)。
7
+ * ============================================================
8
+ */
9
+
10
+ import {
11
+ computerUseDiagnostics,
12
+ describeCapabilities,
13
+ type ComputerUseResponse,
14
+ } from '../../../src/plugin-sdk.js';
15
+
16
+ /** 平台不支持时统一的一段话。分开写是因为它不是「出错」,是「本来就没有」。 */
17
+ function unsupportedNote(): string {
18
+ return [
19
+ `⚠️ 当前平台是 ${process.platform},Computer Use 只支持 macOS。`,
20
+ 'Windows 侧只有协议桩,没有 UI Automation 驱动 —— 不是「装一下就能用」。',
21
+ ].join('\n');
22
+ }
23
+
24
+ function describeError(response: ComputerUseResponse): string {
25
+ return `❌ ${response.error?.code ?? 'failed'}: ${response.error?.message ?? '未知错误'}`
26
+ + (response.error?.hint ? `\n ${response.error.hint}` : '');
27
+ }
28
+
29
+ export async function runStatus(signal?: AbortSignal): Promise<string> {
30
+ const lines = ['# Computer Use 状态', ''];
31
+ if (!computerUseDiagnostics.platformSupported()) {
32
+ lines.push(unsupportedNote());
33
+ return lines.join('\n');
34
+ }
35
+
36
+ const helper = computerUseDiagnostics.helperPath();
37
+ lines.push(`守护进程二进制:${helper ?? '未找到(vendor/computer-use 缺失)'}`);
38
+ lines.push(`状态目录:${computerUseDiagnostics.stateDir()}`);
39
+ lines.push(`说明书写入目录:${computerUseDiagnostics.manualDir()}`);
40
+
41
+ if (!helper) {
42
+ lines.push('', '没有 helper 就没有一切。请确认 `vendor/computer-use/<平台>/cu-helperd` 存在。');
43
+ return lines.join('\n');
44
+ }
45
+
46
+ const hello = await computerUseDiagnostics.status(signal);
47
+ if (!hello.ok) {
48
+ lines.push('', describeError(hello));
49
+ return lines.join('\n');
50
+ }
51
+ const data = (hello.data ?? {}) as {
52
+ serviceVersion?: string;
53
+ platform?: string;
54
+ implementation?: string;
55
+ capabilities?: string[];
56
+ };
57
+ lines.push(
58
+ `服务版本:${data.serviceVersion ?? '未知'} · ${data.platform ?? '?'} / ${data.implementation ?? '?'}`,
59
+ '',
60
+ renderCapabilities(data.capabilities ?? []),
61
+ );
62
+ return lines.join('\n');
63
+ }
64
+
65
+ /**
66
+ * 能力清单按三态分组呈现。映射来自内核的 `capabilityLabels.ts`,与 Desktop
67
+ * 面板**共用同一份** —— 两边各自解析字符串前缀是上一版的漂移来源。
68
+ */
69
+ function renderCapabilities(ids: string[]): string {
70
+ if (ids.length === 0) return '## 能力\n\n驱动没有报告任何能力。';
71
+ const labels = describeCapabilities(ids);
72
+ const group = (state: string): string[] =>
73
+ labels.filter((label) => label.state === state)
74
+ .map((label) => `- ${label.label}${label.reason ? ` —— ${label.reason}` : ''}`);
75
+
76
+ const supported = group('supported');
77
+ const disabled = group('deliberately-disabled');
78
+ const missing = group('not-implemented');
79
+
80
+ return [
81
+ '## 能力',
82
+ '',
83
+ '### 已支持',
84
+ ...(supported.length > 0 ? supported : ['- (无)']),
85
+ ...(disabled.length > 0 ? ['', '### 有意禁用(不是缺口,是决定)', ...disabled] : []),
86
+ ...(missing.length > 0 ? ['', '### 尚未实现', ...missing] : []),
87
+ ].join('\n');
88
+ }
89
+
90
+ const PERMISSION_LABEL: Record<string, string> = {
91
+ screenCapture: '屏幕录制',
92
+ accessibility: '辅助功能',
93
+ inputControl: '输入控制',
94
+ ocr: 'OCR',
95
+ };
96
+
97
+ /**
98
+ * 权限体检。每一项都给出**能照着做的**下一步,而不是只报一个状态词 ——
99
+ * 「denied」对用户来说不是信息,「去哪个开关里把它打开」才是。
100
+ */
101
+ export async function runDoctor(signal?: AbortSignal): Promise<string> {
102
+ if (!computerUseDiagnostics.platformSupported()) return unsupportedNote();
103
+
104
+ const response = await computerUseDiagnostics.permissions(signal);
105
+ if (!response.ok) {
106
+ return ['# Computer Use 权限体检', '', describeError(response)].join('\n');
107
+ }
108
+ const snapshot = (response.data ?? {}) as Record<string, string>;
109
+ const lines = ['# Computer Use 权限体检', ''];
110
+ let blocked = 0;
111
+
112
+ for (const [key, label] of Object.entries(PERMISSION_LABEL)) {
113
+ const state = snapshot[key] ?? 'unknown';
114
+ const ok = state === 'granted';
115
+ if (!ok && key !== 'ocr') blocked += 1;
116
+ lines.push(`${ok ? '✅' : state === 'unsupported' ? '➖' : '❌'} ${label}:${state}`);
117
+ if (!ok && key === 'screenCapture') {
118
+ lines.push(' 系统设置 → 隐私与安全性 → 屏幕录制,勾选本应用后**需要重启应用**。');
119
+ }
120
+ if (!ok && key === 'accessibility') {
121
+ lines.push(' 系统设置 → 隐私与安全性 → 辅助功能。没有它就拿不到控件树,只能看像素。');
122
+ }
123
+ if (!ok && key === 'inputControl') {
124
+ lines.push(' 输入控制随辅助功能一起授予;仍为 denied 时把本应用从列表里删掉再重新添加。');
125
+ }
126
+ if (key === 'ocr' && state !== 'granted') {
127
+ lines.push(' OCR 是**有意不实现**的(见 SPEC),这里不是故障。');
128
+ }
129
+ }
130
+
131
+ lines.push('', blocked === 0
132
+ ? '权限齐全。'
133
+ : `有 ${blocked} 项关键权限未就绪,Computer Use 会退化或直接失败。`);
134
+ return lines.join('\n');
135
+ }
136
+
137
+ /** 跑一次观测并把结果**给人看**(不进模型上下文,所以不组装图)。 */
138
+ export async function runObserve(signal?: AbortSignal): Promise<string> {
139
+ if (!computerUseDiagnostics.platformSupported()) return unsupportedNote();
140
+
141
+ const response = await computerUseDiagnostics.observe(signal);
142
+ if (!response.ok || !response.state) {
143
+ return ['# 一次观测', '', describeError(response)].join('\n');
144
+ }
145
+ const state = response.state;
146
+ const lines = [
147
+ '# 一次观测',
148
+ '',
149
+ `前台应用:${state.activeApp?.name ?? '未知'}(${state.activeApp?.id ?? '无标识'})`,
150
+ `显示器:${state.displays.length} 台 · 窗口:${state.windows.length} 个`,
151
+ `无障碍树:${state.accessibility ? (state.accessibility.truncated ? '不完整(权限不足或元素过多)' : '可用') : '无'}`,
152
+ `revision ${state.revision} · epoch ${state.epoch} · backend ${state.backend}`,
153
+ ];
154
+ if (state.windows.length > 0) {
155
+ lines.push('', '## 窗口');
156
+ for (const window of state.windows.slice(0, 10)) {
157
+ lines.push(`- ${window.title ?? '(无标题)'} — ${window.appId}`);
158
+ }
159
+ }
160
+ return lines.join('\n');
161
+ }
@@ -0,0 +1,135 @@
1
+ /**
2
+ * ============================================================
3
+ * plugins/computer_use/src/manuals.ts —— 应用说明书的清单与详情
4
+ * ------------------------------------------------------------
5
+ * 说明书文件住在本插件的 `app/`,但**解析与匹配**用内核的
6
+ * `vision/appGuide.ts` —— 内核工具在每次观测时也用同一份逻辑,两边必须
7
+ * 是同一套判断,否则 `/computeruse apps` 说"命中了"而模型那边没命中。
8
+ * ============================================================
9
+ */
10
+ import { computerUseDiagnostics, describeMatch, EMPTY_MANUAL, loadAllAppManuals, matchGuide, validateManual, } from '../../../src/plugin-sdk.js';
11
+ /** 全部说明书 + 冲突报告。与内核工具用**同一个**加载器,不另写一份。 */
12
+ export async function loadAllManuals() {
13
+ return loadAllAppManuals();
14
+ }
15
+ /** 当前前台应用身份。拿不到就返回 undefined —— 不猜。 */
16
+ async function foregroundIdentity(signal) {
17
+ if (!computerUseDiagnostics.platformSupported())
18
+ return undefined;
19
+ const response = await computerUseDiagnostics.observe(signal).catch(() => null);
20
+ if (!response?.ok || !response.state?.activeApp)
21
+ return undefined;
22
+ return { id: response.state.activeApp.id, name: response.state.activeApp.name };
23
+ }
24
+ export async function runApps(signal) {
25
+ const { guides, conflicts, rejected } = await loadAllManuals();
26
+ const lines = ['# 应用说明书', ''];
27
+ if (guides.length === 0 && rejected.length === 0) {
28
+ lines.push('(一份都没有。工作区说明书放 `app-manuals/<app>.md`;', '插件提供的要在 plugin.json 里声明 `"appManuals": "app"`。)');
29
+ return lines.join('\n');
30
+ }
31
+ for (const guide of guides) {
32
+ const identifiers = [...guide.bundleIds, ...guide.processNames, ...guide.displayNames];
33
+ lines.push(`- **${guide.name}** — 匹配标识 ${identifiers.length} 个 · 不可逆声明 ${guide.irreversible.length} 条`);
34
+ }
35
+ // 被隔离的说明书必须可见,而且要说得出错在哪 —— 它们的失败方式全是静默的:
36
+ // match 写错就永远匹配不上、precondition 写错就永远不生效。不报出来,用户
37
+ // 会以为自己没写过这份说明书。
38
+ if (rejected.length > 0) {
39
+ lines.push('', '## ⛔ 已隔离(写错了,不会进入模型上下文)');
40
+ for (const item of rejected) {
41
+ lines.push(`- **${item.guide.name}** — ${item.guide.path}`);
42
+ for (const message of item.errors)
43
+ lines.push(` - ${message}`);
44
+ }
45
+ }
46
+ // 冲突必须可见:靠目录顺序决定「哪份知识生效」而没人知道,是最难查的那类问题。
47
+ if (conflicts.length > 0) {
48
+ lines.push('', '## ⚠️ 冲突');
49
+ for (const conflict of conflicts) {
50
+ lines.push(conflict.kind === 'same-name'
51
+ ? `- 同名说明书 \`${conflict.key}\`:生效 ${conflict.winner},被遮蔽 ${conflict.shadowed}`
52
+ : `- 标识 \`${conflict.key}\` 被两份说明书同时认领:生效 ${conflict.winner},被遮蔽 ${conflict.shadowed}`);
53
+ }
54
+ }
55
+ const identity = await foregroundIdentity(signal);
56
+ lines.push('', '## 当前前台应用');
57
+ if (!identity) {
58
+ lines.push('拿不到前台应用(平台不支持、权限未授予或守护进程不可用)。');
59
+ }
60
+ else {
61
+ lines.push(`${identity.name ?? '未知'}(${identity.id ?? '无标识'})`, '');
62
+ lines.push(describeMatch(matchGuide(guides, identity), guides, identity));
63
+ }
64
+ return lines.join('\n');
65
+ }
66
+ export async function runApp(name) {
67
+ const trimmed = name.trim();
68
+ if (!trimmed)
69
+ return '用法:`/computeruse app <name>`(名字见 `/computeruse apps`)';
70
+ const { guides, rejected } = await loadAllManuals();
71
+ // 被隔离的那些也要能查 —— 用户最需要看详情的恰恰是写坏的那一份。
72
+ const blocked = rejected.find((item) => item.guide.name === trimmed);
73
+ const guide = guides.find((candidate) => candidate.name === trimmed) ?? blocked?.guide;
74
+ if (!guide) {
75
+ return [
76
+ `没有名为「${trimmed}」的说明书。`,
77
+ `已有:${guides.map((g) => g.name).join('、') || '(无)'}`,
78
+ ].join('\n');
79
+ }
80
+ const checkable = guide.irreversible.filter((entry) => entry.startsWith('key:') || entry.startsWith('region:'));
81
+ const manual = guide.manual ?? EMPTY_MANUAL;
82
+ const issues = validateManual({
83
+ manual,
84
+ irreversible: guide.irreversible,
85
+ identifiers: guide.bundleIds.length + guide.processNames.length + guide.displayNames.length,
86
+ });
87
+ const unverified = [
88
+ ...manual.layout.filter((r) => !r.verified).map((r) => `分区 ${r.id}`),
89
+ ...manual.controls.filter((c) => !c.verified).map((c) => `控件 ${c.id}`),
90
+ ...manual.flows.filter((f) => !f.verified).map((f) => `流程 ${f.id}`),
91
+ ];
92
+ return [
93
+ `# 说明书 ${guide.name}`,
94
+ '',
95
+ // 隔离状态放最前面:其它信息都建立在「它到底生不生效」之上。
96
+ ...(blocked
97
+ ? ['⛔ **已隔离**:这份说明书写错了,不会进入模型上下文。修完下面的 ❌ 才会生效。', '']
98
+ : []),
99
+ `文件:${guide.path}`,
100
+ `schema v${manual.schemaVersion}`,
101
+ `bundleId:${guide.bundleIds.join('、') || '(无)'}`,
102
+ `进程名:${guide.processNames.join('、') || '(无)'}`,
103
+ `显示名:${guide.displayNames.join('、') || '(无)'}`,
104
+ '',
105
+ '## 不可逆声明',
106
+ ...(guide.irreversible.length > 0
107
+ ? guide.irreversible.map((entry) => `- ${entry}`)
108
+ : ['(无)']),
109
+ '',
110
+ checkable.length > 0
111
+ ? `其中 ${checkable.length} 条是**引擎可独立验证**的(key/region)。`
112
+ : '⚠️ 全部是 `intent:` 形式 —— 只能靠模型自报,模型漏报就拦不住。'
113
+ + '等实机验证出稳定的按键或区域,改成 key:/region: 才是真拦截。',
114
+ '',
115
+ '## 结构化内容',
116
+ `分区 ${manual.layout.length} · 控件 ${manual.controls.length} · 流程 ${manual.flows.length}`,
117
+ ...manual.flows.map((flow) => {
118
+ const guarded = flow.steps.filter((s) => s.precondition).length;
119
+ return `- ${flow.id}:${flow.steps.length} 步`
120
+ + (guarded > 0 ? `,其中 ${guarded} 步有机器可检查的前置条件` : ',无前置条件');
121
+ }),
122
+ '',
123
+ '## 校验',
124
+ ...(issues.length > 0
125
+ ? issues.map((issue) => `${issue.level === 'error' ? '❌' : '⚠️'} ${issue.message}`)
126
+ : ['✅ 无问题']),
127
+ '',
128
+ '## 未验证条目',
129
+ // 未验证不是缺陷,是**状态**。说清楚才能知道哪些还得实机跑一遍;
130
+ // 不说,就等于把猜测当事实用。
131
+ unverified.length > 0
132
+ ? `${unverified.length} 项:${unverified.join('、')}`
133
+ : '(无 —— 所有结构化条目都已标记 verified)',
134
+ ].join('\n');
135
+ }