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
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # minimal-agent
2
2
 
3
3
  > 一个**最小化但功能完整**的 AI 编程助手 —— Bun + React + TypeScript + Ink TUI 构建,
4
- > OpenAI 兼容、多 provider,16 个内置工具 + Skills + 插件 + Workflow DSL + 自动上下文压缩。
4
+ > OpenAI 兼容、多 provider,内置工具 + Skills + 插件 + Workflow DSL + 自动上下文压缩。
5
5
  > 为**学习与教学**而生:代码量克制、注释充分,把一个 agent「从输入到工具循环到落盘」讲透。
6
6
 
7
7
  `v0.5.1` · Runtime: **Bun**(主)/ Node ≥ 20 · License: **PolyForm Noncommercial 1.0.0**
@@ -22,12 +22,13 @@
22
22
 
23
23
  ## 特性
24
24
 
25
- - **16 个内置工具**:Read / Write / Edit / MultiEdit / Glob / Grep / WebSearch / WebFetch / WebBrowser / Download / GenerateImage / GenerateSpeech / Bash / AskUserQuestion(向用户提结构化选择题,动态工作流交互底座)/ Advisor(独立配置的第二个 LLM,关键节点取第二意见)/ Agent(并行子任务分身:explore 只读调研 / general 读写执行,可 git worktree 隔离)
25
+ - **内置工具系统**:文件与终端、网页检索、媒体生成、结果交付、长期记忆、结构化提问、顾问、Computer Use 和并行 Agent。
26
26
  - **OpenAI 兼容**:Message 形状对齐 Chat Completions,一套代码接 MiniMax / 火山 ARK / DeepSeek / OpenAI / Moonshot…
27
27
  - **Skills 系统**:放一个 `SKILL.md` 就能扩展能力,运行时实时扫描注入 prompt,改文件即生效
28
28
  - **插件系统**:`plugins/<id>/` drop-in,自带 `/workflow`(YAML 工作流引擎,支持 while 循环 + 验证门 + fresh_context)
29
29
  - **自动上下文压缩**:接近上限时把旧对话压成摘要,保留系统提示 + 摘要 + 最近几条
30
30
  - **多 session + 归档**:同一工作目录多个并行会话,`/new` 归档、`/restore` 恢复
31
+ - **Markdown 长期记忆**:全局人格与偏好、按工作目录隔离的项目记忆,可通过自然语言新增、更新、召回和删除
31
32
  - **可编程子进程**:`-p --output-format json` 输出一行结构化结局契约,方便被宿主程序 spawn 调度
32
33
  - **三种运行形态**:源码跑(dev)/ npm 全局安装 / **bun --compile 绿色单文件夹**(免安装,可装 U 盘)
33
34
 
@@ -143,10 +144,17 @@ minimal-agent -p --output-format json "做点事" # 一行结构化结
143
144
  | **WebSearch** | Tavily API | 需 `TAVILY_API_KEY` |
144
145
  | **WebFetch** | `fetch` + `turndown` | HTML → Markdown,LRU 缓存 |
145
146
  | **WebBrowser** | `playwright-core`(可选) | 缺依赖时自动降级 WebFetch |
147
+ | **Memory** | Markdown + YAML frontmatter | 全局人格、个人记忆、项目记忆及增删改查;旧 JSON 自动迁移 |
146
148
  | **Bash** | `child_process` | 黑名单 + 超时双保险 |
147
149
 
148
150
  工具失败**不抛异常**——把 error 写进结果喂回 LLM 让它自己重试。
149
151
 
152
+ ### 长期记忆
153
+
154
+ 本机主人会话可以直接说“记住……”“把之前的……改成……”“忘记……”,Agent 会在当前回合调用记忆工具。全局人格与个人记忆位于 `~/.minimal-agent/memory/global/`,项目记忆位于 `~/.minimal-agent/memory/workspaces/<workspaceId>/`;每条事实都是可读、可编辑的 Markdown 文件。记录带修订号、确认时间和内容版本,过期只进入复核队列,不会被自动删除。当前消息始终优先于旧记忆,密码、Token、验证码和私钥不会写入。
155
+
156
+ 历史用户消息和最终回答以清理后的 JSONL 存在 `~/.minimal-agent/episodes/`,独立于上下文压缩;检索默认仅限当前工作区。非交互模式默认不开放本机记忆;受信任宿主需显式传入 `--memory-access local-owner`。首次访问会把旧 JSON 和 v1 Markdown 幂等迁移到 v2 Markdown,并保留时间戳备份。
157
+
150
158
  ## Skills · 插件 · Workflow
151
159
 
152
160
  - **Skills**:每个 `skills/<name>/SKILL.md`(带 frontmatter)。运行时实时扫描注入 prompt,prompt 体按需懒加载。
@@ -199,7 +207,7 @@ dev 下 Bun 透明回退到 `.ts` 兄弟,发布前 `tsc --build` 原地产出
199
207
  | `src/loop.ts` | `runQuery()` 主循环(AsyncGenerator)—— 系统的「心脏」 |
200
208
  | `src/llm/client.ts` | OpenAI 兼容流式客户端(text / tool_call / reasoning 三路) |
201
209
  | `src/types.ts` | 对齐 Chat Completions 的 Message / ToolCall / 事件类型 |
202
- | `src/tools/` | 11 个工具 + `executeTool()` 参数防线(JSON.parse → Zod → call) |
210
+ | `src/tools/` | 内置工具 + `executeTool()` 参数防线(JSON.parse → Zod → call) |
203
211
  | `src/context/compact.ts` | 自动上下文压缩 |
204
212
  | `src/prompts/` | system prompt 组装 + Skills 实时扫描注入 |
205
213
  | `src/plugins/` | 插件框架(discovery / 命令路由 / hook 引擎 / transcript) |
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "minimal-agent",
3
- "version": "0.10.0",
4
- "description": "最小化 Agent 系统 —— 10 工具 + 插件系统 + workflow DSL + 自动压缩 + OpenAI 兼容 + Ink TUI;NodeNext + tsc 原地编译,dev 用 Bun .ts、install 用 Node .js(学习/教学用)",
3
+ "version": "0.12.0",
4
+ "description": "Bun-first 的本地 Agent 内核,支持工具、插件、工作流、上下文压缩、长期记忆与 OpenAI 兼容接口;Tauri 桌面宿主和 Node.js npm 发布可复用同一内核",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": "Bill Wang <leiwang0359@gmail.com>",
7
7
  "repository": {
@@ -40,6 +40,41 @@
40
40
  "bun": "./src/config/configService.ts",
41
41
  "default": "./src/config/configService.js"
42
42
  },
43
+ "./config-limits": {
44
+ "types": "./src/config/numericLimits.ts",
45
+ "bun": "./src/config/numericLimits.ts",
46
+ "default": "./src/config/numericLimits.js"
47
+ },
48
+ "./config-management": {
49
+ "types": "./src/config/configManagement.ts",
50
+ "bun": "./src/config/configManagement.ts",
51
+ "default": "./src/config/configManagement.js"
52
+ },
53
+ "./config-diagnostics": {
54
+ "types": "./src/config/configDiagnostics.ts",
55
+ "bun": "./src/config/configDiagnostics.ts",
56
+ "default": "./src/config/configDiagnostics.js"
57
+ },
58
+ "./memory-service": {
59
+ "types": "./src/memory/memoryService.ts",
60
+ "bun": "./src/memory/memoryService.ts",
61
+ "default": "./src/memory/memoryService.js"
62
+ },
63
+ "./human-intervention": {
64
+ "types": "./src/humanIntervention.ts",
65
+ "bun": "./src/humanIntervention.ts",
66
+ "default": "./src/humanIntervention.js"
67
+ },
68
+ "./prompt-cache": {
69
+ "types": "./src/llm/promptCache.ts",
70
+ "bun": "./src/llm/promptCache.ts",
71
+ "default": "./src/llm/promptCache.js"
72
+ },
73
+ "./runtime-context": {
74
+ "types": "./src/runtime/agentRuntimeContext.ts",
75
+ "bun": "./src/runtime/agentRuntimeContext.ts",
76
+ "default": "./src/runtime/agentRuntimeContext.js"
77
+ },
43
78
  "./provider-presets": {
44
79
  "types": "./src/cli/wizards/providerPresets.ts",
45
80
  "bun": "./src/cli/wizards/providerPresets.ts",
@@ -58,41 +93,52 @@
58
93
  "node": ">=20"
59
94
  },
60
95
  "files": [
96
+ "src/**/*.ts",
97
+ "src/**/*.tsx",
61
98
  "src/**/*.js",
62
99
  "src/**/*.d.ts",
100
+ "plugins/**/*.ts",
63
101
  "plugins/**/*.js",
64
102
  "plugins/**/*.d.ts",
65
103
  "plugins/**/.claude-plugin/**",
66
104
  "plugins/**/commands/**",
67
105
  "plugins/**/hooks/**",
106
+ "plugins/**/app/**",
68
107
  "plugins/HOW-TO-WRITE-A-PLUGIN.md",
69
108
  "skills/**",
109
+ "!skills/**/__pycache__/**",
110
+ "!skills/**/*.pyc",
70
111
  "workflows/**",
71
112
  "vendor/ripgrep/**",
113
+ "vendor/computer-use/**",
72
114
  "README.md",
73
115
  "MINIMAL-TRACE.md",
74
116
  "LICENSE"
75
117
  ],
76
118
  "scripts": {
77
- "start": "bun run src/main.tsx",
78
- "dev": "bun --watch src/main.tsx",
119
+ "start": "bun run clean && bun run src/main.tsx",
120
+ "dev": "bun run clean && bun --watch src/main.tsx",
79
121
  "build": "tsc --build",
80
122
  "clean": "bun scripts/clean-build.ts",
81
123
  "check:build-artifacts": "bun scripts/check-build-artifacts.ts",
82
- "test": "bun test",
124
+ "test": "bun run clean && bun test",
83
125
  "typecheck": "tsc --noEmit -p tsconfig.typecheck.json",
84
126
  "verify-all": "bun scripts/verify-all.ts",
127
+ "eval:harness": "bun scripts/eval-harness.ts",
85
128
  "compile:green": "bun scripts/build-green.ts",
86
129
  "compile:green:host": "bun scripts/build-green.ts --host",
87
130
  "doc:gen": "node doc/scripts/gen-pptx.mjs",
88
131
  "prepublishOnly": "bun run clean && bun run build"
89
132
  },
90
133
  "dependencies": {
134
+ "diff": "^8.0.2",
91
135
  "fast-glob": "^3.3.2",
92
136
  "ink": "^5.0.1",
93
137
  "marked": "^18.0.6",
138
+ "pdfjs-dist": "4.10.38",
94
139
  "react": "^18.3.1",
95
140
  "turndown": "^7.2.4",
141
+ "vscode-jsonrpc": "^8.2.1",
96
142
  "yaml": "^2.9.0",
97
143
  "zod": "^3.23.8",
98
144
  "zod-to-json-schema": "^3.25.2"
@@ -104,6 +150,7 @@
104
150
  "typescript": "^5.5.0"
105
151
  },
106
152
  "optionalDependencies": {
153
+ "@napi-rs/canvas": "^0.1.100",
107
154
  "playwright-core": "^1.40.0",
108
155
  "pngjs": "^7.0.0",
109
156
  "pptxgenjs": "^4.0.1"
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "computer-use",
3
+ "version": "0.1.0",
4
+ "description": "桌面操作的应用说明书与诊断命令面。说明书住在 app/,由内核 ComputerUse 工具强制注入;本插件提供 /computeruse 与 /cu 的确定性命令(状态、体检、说明书、采集、遥测、审计、观测)。",
5
+ "appManuals": "app"
6
+ }
@@ -0,0 +1,94 @@
1
+ # computer-use 插件
2
+
3
+ 两件事:**应用说明书**(`app/`)和 **`/computeruse` 诊断命令面**。
4
+
5
+ 桌面操作本身不在这里 —— 那是内核 `ComputerUse` 工具的活。
6
+
7
+ ## 为什么强制点不在插件里
8
+
9
+ 模型是在任意一轮对话里直接调 `ComputerUse` 工具的,而 `plugin.ts` 的
10
+ `runCommand` 只在用户**显式敲斜杠命令**时才会被调用(非 `/` 输入直通
11
+ `runQuery`,这是框架的 V1 红线且有测试守着)。
12
+
13
+ 所以说明书的消费点必须在工具层:引擎在每次观测时**直接把说明书写进回执**,
14
+ 并在不可逆动作前校验说明书声明的前置条件。把强制逻辑写进 plugin.ts,会得到
15
+ 一个看着像插件、实际只在用户敲命令时才生效的安全机制。
16
+
17
+ 这也是这个插件与「skill 版本」的真正差别 —— 不是换了个目录,而是知识从
18
+ 「模型可参考可不参考」变成了「引擎必注入 + 部分条目机器可强制」。
19
+
20
+ ## 说明书从哪儿来
21
+
22
+ 两类 Provider,**按优先级从高到低**(`vision/appGuide.ts::appManualProviders`):
23
+
24
+ 1. **工作区** `<cwd>/app-manuals/<app>.md` —— 用户自己的,可写,`capture --write`
25
+ 的落点。不需要任何 manifest。
26
+ 2. **插件声明** —— plugin.json 里 `"appManuals": "app"` 的**显式 opt-in**。
27
+
28
+ 第 2 类此前是纯目录约定(任何插件目录下有 `app` 子目录就自动生效),等于
29
+ 「任意目录自动影响可信内核」。现在必须显式声明,路径还要经
30
+ `src/plugins/pluginManifest.ts` 收敛(拒绝绝对路径、`..`、软链逃逸)。
31
+
32
+ 覆盖是**逐文件**的:放一份同名 `wechat.md` 只覆盖那一份,不会屏蔽同一来源的
33
+ 其余说明书。
34
+
35
+ **为什么工作区目录叫 `app-manuals/` 而不是 `.minimal-agent/…`**:
36
+ `.minimal-agent` / `.minimal-agent-*` 是框架保留前缀,`/new` 会把 cwd 下所有
37
+ 这类目录**递归删掉**(`persistContext.ts::clearContext`)。捕获的说明书是长期
38
+ 知识,不是会话状态。
39
+
40
+ ⚠️ 插件的 `app/` 是**数据不是代码**:打不进 exe、也不会被 tsc 编译带走,必须由
41
+ 构建脚本显式拷贝。三条分发路径都要带上它(`package.json::files`、
42
+ `scripts/build-green.ts`、`minimal-desktop/scripts/build-sidecar.ts`),
43
+ 漏一条的后果是「每个应用都报未找到说明书」,且没有任何构建期错误。
44
+
45
+ ## 说明书格式
46
+
47
+ 一个文件两层,抄 `_template.md` 起步:
48
+
49
+ - **frontmatter(机器层)** —— 引擎读它做匹配、不可逆判定、前置条件校验:
50
+ `match` / `irreversible` / `layout` / `controls` / `flows` / `verification`
51
+ - **正文(散文层)** —— 给模型看的事实:界面布局、控件语义、坑与恢复出口、
52
+ `## 实测记录`
53
+
54
+ **每个结构化条目自带 `verified`。** 未实机验证就写 `false` —— 引擎注入时会如实
55
+ 标注。丢掉这个限定词等于把猜测说成事实,而说明书里多数内容目前正是从面向人的
56
+ 文档转写来的、没跑过。
57
+
58
+ `flows[].steps[].precondition` 只允许引擎能独立验证的五个谓词:
59
+
60
+ ```
61
+ foreground_app_is <id或名字片段> window_title_contains <文本>
62
+ focused_role_is <AXRole> ax_available
63
+ element_exists <AXRole[:名字片段]>
64
+ ```
65
+
66
+ 写不成这几种形状的约束请放进 `pitfalls` 当散文。把不可验证的东西写成
67
+ `precondition:` 会得到一个永远通过的检查——那比没有检查更糟,因为它看起来
68
+ 像有保护。`/computeruse app <name>` 会把写错的形状报出来。
69
+
70
+ ## 命令
71
+
72
+ 全部确定性执行,不烧 LLM:
73
+
74
+ | 命令 | 作用 |
75
+ |---|---|
76
+ | `/computeruse` | 总览:平台、守护进程、权限、能力三态分组 |
77
+ | `/computeruse doctor` | 权限体检 + 逐项修复指引 |
78
+ | `/computeruse apps` | 说明书清单、冲突、当前前台应用命中哪一份 |
79
+ | `/computeruse app <name>` | 某份说明书的摘要与 schema 校验报告 |
80
+ | `/computeruse capture [name] [--write]` | 观测当前前台应用生成草稿;默认只打印 |
81
+ | `/computeruse verify <app>` | 半自动实机验收:逐步提示、每步记录实际观测、全过才翻 `verified` |
82
+ | `/computeruse observe` | 跑一次观测,结果给人看 |
83
+ | `/computeruse report` | 遥测汇总 |
84
+ | `/computeruse audit [n]` | 守护进程动作流水 + 不可逆授权记录(两份并排,不合并) |
85
+
86
+ `/cu` 是等价别名。
87
+
88
+ ### capture 采到的是什么
89
+
90
+ **只有应用身份是实测的**。控件候选来自采集当时的 AX 树、未经验证;
91
+ 界面分区与典型流程**留空**——一次观测看不出它们,编出来的比空着更糟;
92
+ 不可逆动作清单也留空,因为屏幕上看不出「哪个动作收不回来」,那是产品语义,
93
+ 必须由人补。草稿里**不含任何 rect**:窗口能拉伸、能全屏、能换显示器,
94
+ 一次观测的坐标写进 schema 就是一批看着像已验证、下一次就失准的数据。
@@ -0,0 +1,142 @@
1
+ ---
2
+ schemaVersion: 2
3
+ guideVersion: 1
4
+ status: draft
5
+ platforms: [macOS, Windows]
6
+ match:
7
+ bundleId: []
8
+ processName: []
9
+ displayName: []
10
+ irreversible:
11
+ - intent:replace-with-a-stable-intent
12
+
13
+ # ---- 以下三段是 schema v2 的结构化部分,引擎会直接注入给模型 ----
14
+
15
+ # 界面分区。相对坐标 [x, y, width, height],0–1000,只表达"大致在哪一块",
16
+ # 不用于点击 —— 点击一律靠 elementId 或当次观测。
17
+ # ── 可选:这个应用专属的「该叫人来」信号 ──
18
+ # 引擎自己认识跨应用通用的边界(密码框、验证码、二维码登录、权限弹窗…),靠扫无障碍
19
+ # 树里的文字就能判。只有当**这个应用的边界通用规则认不出来**时才需要写这一段。
20
+ #
21
+ # 典型场景:某个登录窗压根不出现「登录」「扫码」这类字样,只能靠几个控件**同时出现**
22
+ # 来认。allOf 里每条正则都要在 AX 的 `role name` 文本里命中才算成立。
23
+ #
24
+ # ⚠️ 别只写一个关键词:单信号极易误判(比如「二维码」单独出现,可能只是聊天里
25
+ # 别人发的一张图)。引擎会对单信号声明报 warn。
26
+ # ⚠️ reason 只能取:password / otp / captcha / qr_login / login /
27
+ # permission / security_warning / blocked / manual —— 写别的会在加载期报 error。
28
+ #
29
+ # humanBoundary:
30
+ # - reason: qr_login
31
+ # summary: 需要你扫码完成登录
32
+ # allOf:
33
+ # - 二维码
34
+ # - 仅传输文件
35
+
36
+ layout: []
37
+ # - id: sidebar
38
+ # rect: [0, 60, 220, 940]
39
+ # desc: 会话列表
40
+ # verified: false
41
+
42
+ # 关键控件。优先写 AX 锚点(换分辨率/换版本都成立),坐标只作兜底。
43
+ controls: []
44
+ # - id: search_box
45
+ # ax: { role: AXTextField, name: [搜索, Search] }
46
+ # desc: 顶部搜索框
47
+ # verified: false
48
+
49
+ # 典型流程。steps[].precondition 只能用引擎可独立验证的谓词:
50
+ # foreground_app_is <id或名字片段> window_title_contains <文本>
51
+ # focused_role_is <AXRole> ax_available
52
+ # element_exists <AXRole[:名字片段]>
53
+ # 写不成这几种形状的约束请写进 pitfalls 当散文 —— 把不可验证的东西写成
54
+ # precondition 会得到一个永远通过的检查,那比没有检查更糟。
55
+ flows: {}
56
+ # send_message:
57
+ # goal: 给指定联系人发一条文字消息
58
+ # verified: false
59
+ # steps:
60
+ # - do: 用搜索框定位联系人,回车打开会话
61
+ # - do: 确认聊天标题与目标联系人一致
62
+ # precondition: window_title_contains 联系人名
63
+ # - do: 发送
64
+ # irreversible: true
65
+ # pitfalls:
66
+ # - 群名与联系人可能重名,只看标题会发错对象
67
+
68
+ verification:
69
+ environment: 未验证
70
+ verifiedAt: never
71
+ verifiedItems: []
72
+ unverifiedItems: [identity, layout, controls, flows]
73
+ ---
74
+
75
+ # <应用名> App Guide
76
+
77
+ > 复制为小写、稳定的文件名后填写。frontmatter 是**机器层**(引擎读它做匹配、
78
+ > 不可逆判定、前置条件校验),正文是**散文层**(给模型看的事实)。
79
+ >
80
+ > 只记录可复核的应用事实。通用执行策略、权限规则和临时事故不写入说明书。
81
+ > **每个结构化条目都带 `verified`**,未实机验证就写 `false` —— 引擎注入时会
82
+ > 如实标注,丢掉这个限定词等于把猜测说成事实。
83
+
84
+ ## 稳定身份
85
+
86
+ ### macOS
87
+
88
+ - Bundle ID:
89
+ - 进程名:
90
+ - 常见显示名:
91
+
92
+ ### Windows
93
+
94
+ - 可执行文件名:
95
+ - 进程名:
96
+ - 常见显示名:
97
+
98
+ ## AX / UIA 可发现线索
99
+
100
+ - **macOS AX 候选线索**:
101
+ - **Windows UIA 候选线索**:
102
+ - **焦点通道可用层级**:未实机验证。验证后记录平台、应用版本和实际层级。
103
+ - 候选线索仅用于缩小观测范围;必须由当前 Accessibility 快照确认后才能操作。
104
+
105
+ ## 常见自绘区
106
+
107
+ - (仅写 Accessibility 可能不完整、需要视觉兜底的区域;未验证时明确标注。)
108
+
109
+ ## 风险动作与不可逆动作
110
+
111
+ - Frontmatter 只使用稳定的 `intent:<name>`,不使用像素区域。
112
+ - 写明会产生外部发送、覆盖、删除、发布、付款或安全设置变化的动作。
113
+ - 快捷键会受用户偏好影响时,不把快捷键声明为不可逆触发器。
114
+
115
+ ## 弹窗与恢复
116
+
117
+ | 弹窗或状态 | 可观察线索 | 安全恢复出口 |
118
+ |---|---|---|
119
+ | | | |
120
+
121
+ ## 可替代 API
122
+
123
+ - (列出比桌面操作更稳定的官方 API、文件接口或系统通道;没有则写“无已验证替代 API”。)
124
+
125
+ ## 已验证范围
126
+
127
+ - **验证环境**:未验证。
128
+ - **已验证**:无。
129
+ - **仍需验证**:身份、AX/UIA 结构、自绘区、风险动作、弹窗和恢复路径。
130
+ - 验证完成后更新 `guideVersion`、`verification` 与对应条目的 `verified: true`;
131
+ 不要扩大到未测试版本。
132
+
133
+ ## 实测记录
134
+
135
+ > **这一节是 agent 的自我完善区。** 说明书与实况不符时(写着的控件找不到、
136
+ > precondition 反复失败、流程步骤对不上),把**观察到的事实**追加到这里,
137
+ > 一条一行,带日期与应用版本。
138
+ >
139
+ > 只写观察到的,不写推测。确认稳定之后再由人把它提升进 frontmatter 的
140
+ > 结构化条目并标 `verified: true` —— 单次观察不能直接升级为永久事实。
141
+
142
+ - (暂无)
@@ -0,0 +1,165 @@
1
+ ---
2
+ schemaVersion: 2
3
+ guideVersion: 1
4
+ status: draft
5
+ platforms: [macOS, Windows]
6
+ match:
7
+ bundleId: [com.google.Chrome, com.google.Chrome.beta, com.google.Chrome.canary]
8
+ processName: [Google Chrome, chrome.exe]
9
+ displayName: [Google Chrome, Chrome, 谷歌浏览器]
10
+ irreversible:
11
+ - intent:submit-web-form
12
+ - intent:clear-browsing-data
13
+ - intent:remove-profile
14
+ - intent:install-extension
15
+ - intent:change-security-setting
16
+
17
+ layout:
18
+ - id: tab_strip
19
+ desc: 顶部标签栏,最右是新建标签按钮
20
+ verified: false
21
+ - id: toolbar
22
+ desc: 地址栏一行;左侧前进/后退/刷新,右侧扩展、个人资料、三点菜单
23
+ verified: false
24
+ - id: bookmarks_bar
25
+ desc: 书签栏,可被用户隐藏 —— 不能假定它存在
26
+ verified: false
27
+ - id: page_viewport
28
+ desc: 网页内容区。**这一块不要用 ComputerUse 操作**,见下
29
+ verified: false
30
+ - id: download_shelf
31
+ desc: 下载提示。新版 Chrome 是工具栏上的下载气泡,不是底部横条
32
+ verified: false
33
+
34
+ controls: []
35
+
36
+ flows:
37
+ hand_off_to_webbrowser:
38
+ goal: 判断这件事该不该用 ComputerUse 做
39
+ verified: false
40
+ steps:
41
+ - do: 如果目标是网页里的内容(读文字、点按钮、填表单、抓数据)—— 停,改用 WebBrowser 工具
42
+ - do: 只有目标是浏览器外壳本身(切标签、管窗口、处理系统弹窗)才继续用 ComputerUse
43
+ pitfalls:
44
+ - WebBrowser 有 DOM 和 CDP,能按选择器精确定位;看屏幕点像素在网页上是纯粹的降级
45
+ - 网页布局随滚动、懒加载、响应式断点变化,上一次观测的坐标下一秒就可能失效
46
+ - 两个工具各自持有独立的浏览器会话,不要指望在一个里登录、另一个里用
47
+
48
+ switch_tab:
49
+ goal: 在已打开的标签之间切换
50
+ verified: false
51
+ steps:
52
+ - do: 确认 Chrome 在前台
53
+ precondition: foreground_app_is com.google.Chrome
54
+ - do: observe 读出标签栏上各标签的标题与位置
55
+ - do: 点击目标标签后重新 observe,用窗口标题确认切过去了
56
+ pitfalls:
57
+ - 标签多到装不下时会被压缩成只剩图标,标题读不出来
58
+ - 窗口标题跟随当前标签变化,是确认"现在在哪个标签"的最可靠信号
59
+
60
+ handle_system_dialog:
61
+ goal: 处理 Chrome 弹出的系统级对话框(文件选择、权限请求、打印)
62
+ verified: false
63
+ steps:
64
+ - do: observe 确认弹出的确实是系统对话框而不是网页里画的假框
65
+ precondition: ax_available
66
+ - do: 文件选择框用 file_drop 的 open_panel 方式送路径
67
+ - do: 权限请求(摄像头、麦克风、位置、通知)一律交还用户,不代为同意
68
+ pitfalls:
69
+ - 网页可以画出以假乱真的"系统对话框";真的那个有无障碍信息,假的没有
70
+ - 权限授予是账号级别的持久变更,不属于可以替用户点的那一类
71
+
72
+ verification:
73
+ environment: 未验证
74
+ verifiedAt: never
75
+ verifiedItems: []
76
+ unverifiedItems: [identity, layout, controls, flows]
77
+ ---
78
+
79
+ # Google Chrome App Guide
80
+
81
+ ## 这份说明书最重要的一句话
82
+
83
+ **网页里的事交给 `WebBrowser` 工具,不要用 ComputerUse。**
84
+
85
+ ComputerUse 在浏览器上是**降级**手段:它只能看像素、按坐标点。而
86
+ `WebBrowser` 走 CDP,拿得到 DOM、能按选择器定位、能读到看不见的属性、
87
+ 能等待网络空闲。在网页这个场景里,后者不是"另一个选项",是正确答案。
88
+
89
+ ComputerUse 在 Chrome 上只剩下 WebBrowser 够不着的那部分:
90
+
91
+ | 该用 ComputerUse | 该用 WebBrowser |
92
+ |---|---|
93
+ | 切换标签、关窗口、调整窗口大小 | 点页面上的按钮、填表单、读正文 |
94
+ | 处理系统文件选择框 / 打印对话框 | 等待页面加载、抓结构化数据 |
95
+ | 应对 Chrome 自身的更新提示、崩溃恢复条 | 任何需要"这个元素在哪"的事 |
96
+ | 用户已经开着的、有登录态的那个 Chrome | 自动化任务自己开的浏览器 |
97
+
98
+ 最后一行是最常见的真实理由:用户手头这个 Chrome 有他的登录态和插件,
99
+ 而 WebBrowser 起的是独立 profile。这时用 ComputerUse 是合理的,但要清楚
100
+ 自己在用一件更钝的工具,每一步都得 observe 核实。
101
+
102
+ ## 稳定身份
103
+
104
+ ### macOS
105
+
106
+ - Bundle ID:`com.google.Chrome`(beta/canary 各有自己的 id)
107
+ - 进程名:`Google Chrome`
108
+ - 常见显示名:`Google Chrome`、`Chrome`、`谷歌浏览器`
109
+
110
+ ### Windows
111
+
112
+ - 可执行文件名:`chrome.exe`
113
+ - Windows 身份尚未实机验证。
114
+
115
+ ## AX / UIA 可发现线索
116
+
117
+ - **浏览器外壳**(标签栏、地址栏、菜单)通常有无障碍信息,可以用 elementId 定位。
118
+ - **网页内容区**的无障碍树取决于页面本身,且与 DOM 不是一回事 —— 想按结构
119
+ 操作页面就该用 WebBrowser,不要试图从 AX 里还原 DOM。
120
+ - **焦点通道可用层级**:未实机验证。
121
+
122
+ ## 常见自绘区
123
+
124
+ - 网页内容区(由页面决定,什么都可能)
125
+ - PDF 内置查看器、DevTools 面板、部分扩展弹窗
126
+
127
+ ## 风险动作与不可逆动作
128
+
129
+ - 在网页里提交表单、下单、发帖 —— 后果在浏览器之外,收不回来。
130
+ - 清除浏览数据、删除个人资料:会连带登录态、Cookie、历史一起没。
131
+ - 安装扩展、改隐私与安全设置:持久变更,且扩展拿到的权限可能很大。
132
+ - 授予网页权限(摄像头、麦克风、位置、通知):交还用户,不代为点击。
133
+
134
+ ## 弹窗与恢复
135
+
136
+ | 弹窗或状态 | 可观察线索 | 安全恢复出口 |
137
+ |---|---|---|
138
+ | 系统文件选择框 | 独立窗口,有完整无障碍信息 | 用 file_drop 的 open_panel 送路径 |
139
+ | 网页画的假对话框 | 停留在页面内、无无障碍信息 | 当成普通页面元素,改用 WebBrowser 处理 |
140
+ | 权限请求气泡 | 地址栏下方的浮层 | 交还用户,不代为同意 |
141
+ | "Chrome 未正确关闭"恢复条 | 页面顶部黄条 | 报告给用户,不要自作主张恢复全部标签 |
142
+ | 更新后需重启提示 | 三点菜单变色、提示条 | 不代为重启 —— 会丢用户没保存的页面状态 |
143
+
144
+ ## 可替代 API
145
+
146
+ - **首选 `WebBrowser` 工具**(`agent-browser` + CDP),覆盖绝大多数网页任务。
147
+ - 只取内容不交互时 `WebFetch` 更省:直接拿 HTML→Markdown,不启动浏览器。
148
+ - 下载文件用 `Download` 工具,不要驱动浏览器点下载按钮。
149
+
150
+ ## 实测记录
151
+
152
+ > **这一节是 agent 的自我完善区。** 说明书与实况不符时,把**观察到的事实**
153
+ > 追加到这里,一条一行,带日期与 Chrome 版本。
154
+ >
155
+ > 只写观察到的,不写推测。确认稳定后由人提升进 frontmatter 并标
156
+ > `verified: true`。
157
+
158
+ - (暂无)
159
+
160
+ ## 已验证范围
161
+
162
+ - **验证环境**:未验证。
163
+ - **已验证**:无。
164
+ - **仍需验证**:全部 —— 身份、布局、流程都来自公开文档转写,没有实机跑过。
165
+ - 与 WebBrowser 的职责边界是**设计决定**,不需要实机验证;其余都需要。
@@ -0,0 +1,76 @@
1
+ ---
2
+ schemaVersion: 2
3
+ guideVersion: 1
4
+ status: identity-verified
5
+ platforms: [macOS]
6
+ match:
7
+ bundleId: [com.apple.finder]
8
+ processName: [Finder]
9
+ displayName: [Finder, 访达]
10
+ irreversible:
11
+ - intent:delete-item
12
+ - intent:empty-trash
13
+ - intent:replace-item
14
+ - intent:eject-volume
15
+ verifiedRange:
16
+ macOS: Finder 26.4 identity only
17
+ windows: not-applicable
18
+ lastVerifiedAt: 2026-07-29
19
+ verification:
20
+ environment: macOS 26.4 / Finder 26.4
21
+ verifiedAt: 2026-07-29
22
+ verifiedItems: [identity]
23
+ unverifiedItems: [layout, controls, flows]
24
+ ---
25
+
26
+ # Finder App Guide
27
+
28
+ ## 稳定身份
29
+
30
+ ### macOS
31
+
32
+ - Bundle ID:`com.apple.finder`
33
+ - 进程名:`Finder`
34
+ - 常见显示名:`Finder`、`访达`
35
+
36
+ ### Windows
37
+
38
+ - 不适用;Windows 文件管理器应建立独立指南,不能与 Finder 共用身份或交互事实。
39
+
40
+ ## AX / UIA 可发现线索
41
+
42
+ - **macOS AX 候选线索**:窗口标题通常对应当前位置;工具栏、侧边栏、文件浏览区、路径栏和表格/图标视图应分别从当前 AX 快照确认。
43
+ - **焦点通道可用层级**:未实机验证。
44
+ - 文件名、选择状态和当前目录必须以本次 AX 快照或文件系统结果为准,不能从旧截图推断。
45
+
46
+ ## 常见自绘区
47
+
48
+ - 图标视图中的缩略图、Quick Look、图库视图和云端同步徽标可能需要视觉兜底;当前版本尚未实机验证这些区域的 AX 完整度。
49
+
50
+ ## 风险动作与不可逆动作
51
+
52
+ - 移到废纸篓、立即删除、清倒废纸篓。
53
+ - 覆盖同名文件、合并文件夹。
54
+ - 弹出外接磁盘或网络卷。
55
+ - 修改文件名或移动文件可能使其他会话保存的路径失效。
56
+
57
+ ## 弹窗与恢复
58
+
59
+ | 弹窗或状态 | 可观察线索 | 安全恢复出口 |
60
+ |---|---|---|
61
+ | 同名项目冲突 | 系统 Sheet 中出现停止、替换、保留两者等选项 | 未获得覆盖意图时取消,重新观测目标目录 |
62
+ | 文件被占用或权限不足 | 系统错误 Sheet 或认证提示 | 停止重试,保留原文件并报告 |
63
+ | iCloud 项目尚未下载 | 云端状态或下载进度仍存在 | 通过文件存在且大小稳定确认,不依赖缩略图 |
64
+ | 外接卷离线 | 侧边栏卷消失或文件系统路径不可访问 | 保留路径引用,等待重新挂载,不改绑其他同名卷 |
65
+
66
+ ## 可替代 API
67
+
68
+ - 列举、搜索、复制、移动、重命名和校验文件优先使用受控文件工具。
69
+ - 打开文件或在 Finder 中定位可使用宿主提供的系统文件接口。
70
+ - Quick Look 仅用于预览,不作为文件存在、上传完成或写入成功的权威证据。
71
+
72
+ ## 已验证范围
73
+
74
+ - **验证环境**:macOS 26.5.2,Finder 26.4。
75
+ - **已验证**:Bundle ID、进程名和应用包版本元数据。
76
+ - **仍需验证**:AX 层级、各视图模式、自绘区、冲突 Sheet、外接卷与 iCloud 恢复流程。