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,103 @@
1
+ /**
2
+ * ============================================================
3
+ * src/tools/bash/semantics.ts —— 命令退出码语义解释
4
+ * ------------------------------------------------------------
5
+ * 许多命令用 exit code 传递"信息"而不是"成功/失败"。
6
+ * 最典型的是 grep:没匹配返回 1,但这不算错误。
7
+ *
8
+ * 这里对一小撮"退出码语义特殊"的命令做白名单化处理,
9
+ * 让 Bash 工具能正确地把它们的"信息性退出码"识别成非错误,
10
+ * 避免模型看到 ok=false 后无意义重试。
11
+ *
12
+ * 纯函数模块,无 I/O,便于单测。
13
+ * ============================================================
14
+ */
15
+
16
+ export type CommandSemanticResult = { isError: boolean; message?: string };
17
+
18
+ export type CommandSemanticFn = (
19
+ exitCode: number,
20
+ stdout: string,
21
+ stderr: string,
22
+ ) => CommandSemanticResult;
23
+
24
+ const DEFAULT_SEMANTIC: CommandSemanticFn = (exitCode) => ({
25
+ isError: exitCode !== 0,
26
+ message: exitCode !== 0 ? `Command failed with exit code ${exitCode}` : undefined,
27
+ });
28
+
29
+ export const COMMAND_SEMANTICS: Map<string, CommandSemanticFn> = new Map([
30
+ // grep: 0=找到匹配, 1=无匹配(非错误), 2+=真错误
31
+ ['grep', (exitCode) => ({
32
+ isError: exitCode >= 2,
33
+ message: exitCode === 1 ? 'No matches found' : undefined,
34
+ })],
35
+ // ripgrep 与 grep 同义
36
+ ['rg', (exitCode) => ({
37
+ isError: exitCode >= 2,
38
+ message: exitCode === 1 ? 'No matches found' : undefined,
39
+ })],
40
+ // find: 1=部分目录不可达(仍有结果,非致命), 2+=错误
41
+ ['find', (exitCode) => ({
42
+ isError: exitCode >= 2,
43
+ message: exitCode === 1 ? 'Some directories were inaccessible' : undefined,
44
+ })],
45
+ // diff: 0=相同, 1=有差异(非错误), 2+=错误
46
+ ['diff', (exitCode) => ({
47
+ isError: exitCode >= 2,
48
+ message: exitCode === 1 ? 'Files differ' : undefined,
49
+ })],
50
+ // test: 0=真, 1=假(非错误), 2+=错误
51
+ ['test', (exitCode) => ({
52
+ isError: exitCode >= 2,
53
+ message: exitCode === 1 ? 'Condition is false' : undefined,
54
+ })],
55
+ // [ 是 test 的别名
56
+ ['[', (exitCode) => ({
57
+ isError: exitCode >= 2,
58
+ message: exitCode === 1 ? 'Condition is false' : undefined,
59
+ })],
60
+ ]);
61
+
62
+ /**
63
+ * 从复合命令串里启发式抽出"最终决定 exit code 的那个命令"。
64
+ *
65
+ * 规则(够用即可,不追求严谨 shell 解析):
66
+ * 1. 去掉前缀 `bash -c "..."` / `sh -c '...'`
67
+ * 2. 按 ` | `、`&&`、`||`、`;` 分段,取最后一段(决定退出码的是最后一个命令)
68
+ * 3. 去掉前置 `env VAR=val` / `VAR=val` 形态的环境变量赋值
69
+ * 4. 取第一个 token 作为命令名
70
+ *
71
+ * 不依赖 shell-quote,避免引新依赖。
72
+ */
73
+ function extractPrimaryCommand(command: string): string {
74
+ let cmd = command.trim();
75
+
76
+ // 剥 bash -c "..." / sh -c '...' 外壳
77
+ const wrapMatch = cmd.match(/^(?:bash|sh|zsh|dash)\s+-c\s+(['"])(.+)\1\s*$/s);
78
+ if (wrapMatch) cmd = wrapMatch[2]!.trim();
79
+
80
+ // 按 shell 控制操作符切,取最后一段
81
+ const segments = cmd.split(/\s*(?:\|\||&&|;|\|)\s*/).filter((s) => s.length > 0);
82
+ let last = segments[segments.length - 1] ?? cmd;
83
+ last = last.trim();
84
+
85
+ // 去掉前置环境变量赋值:`FOO=bar BAZ=qux cmd ...` 或 `env FOO=bar cmd ...`
86
+ const tokens = last.split(/\s+/);
87
+ let i = 0;
88
+ if (tokens[i] === 'env') i++;
89
+ while (i < tokens.length && /^[A-Za-z_][A-Za-z0-9_]*=/.test(tokens[i]!)) i++;
90
+
91
+ return tokens[i] ?? '';
92
+ }
93
+
94
+ export function interpretCommandResult(
95
+ command: string,
96
+ exitCode: number,
97
+ stdout: string,
98
+ stderr: string,
99
+ ): CommandSemanticResult {
100
+ const base = extractPrimaryCommand(command);
101
+ const fn = COMMAND_SEMANTICS.get(base) ?? DEFAULT_SEMANTIC;
102
+ return fn(exitCode, stdout, stderr);
103
+ }
@@ -4,11 +4,19 @@
4
4
  * ------------------------------------------------------------
5
5
  * 对应 kakadeai 主仓库 tools/BashTool/destructiveCommandWarning.ts。
6
6
  *
7
- * 与 bash.ts 里的"黑名单"区别(不要混淆):
8
- * - 黑名单:灾难性命令(rm -rf /、mkfs、shutdown...),命中直接拒绝执行
9
- * - 告警扫描:"看起来有点危险但合法"的命令(git reset --hard、git push -f、
10
- * kubectl delete...),命中后只输出警告字符串、**不阻塞执行**,
11
- * 让模型/用户看到苗头但保留行动自由。
7
+ * 三层分工(同一条模式只住一处,别在两处各写一遍):
8
+ * 1. `bash.ts::FORBIDDEN_PATTERNS` —— 灾难且无正当用途(rm -rf /、mkfs、
9
+ * shutdown…):命中**直接拒绝**。
10
+ * 2. `src/irreversible/rules.ts::classifyCommand` —— 不可逆但有正当用途
11
+ * (git push --force、DROP DATABASE、reflog expire…):命中**停下来问人**,
12
+ * 无人可问则拒绝。
13
+ * 3. 本模块 —— 危险但**可回滚**(git reset --hard 有 reflog、clean -f 只动
14
+ * 未跟踪文件、stash drop 是本地):只输出警告字符串、**不阻塞执行**。
15
+ *
16
+ * ⚠️ 曾经 `git push --force` 与 `DROP/TRUNCATE` 也在本表里(仅警告)。
17
+ * 它们已升级到第 2 层,并从这里删除 —— 留着就成了两处维护、迟早漂移。
18
+ * `--force-with-lease` 仍留在这里:远端有未见提交时它会**拒绝执行**,
19
+ * 正是防经典事故的安全形式,拦它只会逼人改用更危险的 `--force`。
12
20
  *
13
21
  * 纯函数模块。
14
22
  * ============================================================
@@ -20,8 +28,9 @@ const DESTRUCTIVE_PATTERNS = [
20
28
  warning: 'Note: may discard uncommitted changes',
21
29
  },
22
30
  {
23
- pattern: /\bgit\s+push\b[^;&|\n]*[ \t](--force|--force-with-lease|-f)\b/,
24
- warning: 'Note: may overwrite remote history',
31
+ // 只留 --force-with-lease;裸 --force / -f 已升级为「问人」,见文件头注
32
+ pattern: /\bgit\s+push\b[^;&|\n]*[ \t]--force-with-lease\b/,
33
+ warning: 'Note: may overwrite remote history (lease-checked)',
25
34
  },
26
35
  {
27
36
  pattern: /\bgit\s+clean\b(?![^;&|\n]*(?:-[a-zA-Z]*n|--dry-run))[^;&|\n]*-[a-zA-Z]*f/,
@@ -66,10 +75,7 @@ const DESTRUCTIVE_PATTERNS = [
66
75
  warning: 'Note: may force-remove files',
67
76
  },
68
77
  // 数据库
69
- {
70
- pattern: /\b(DROP|TRUNCATE)\s+(TABLE|DATABASE|SCHEMA)\b/i,
71
- warning: 'Note: may drop or truncate database objects',
72
- },
78
+ // DROP / TRUNCATE 已升级为「问人」(src/irreversible/rules.ts),此处不再重复。
73
79
  {
74
80
  pattern: /\bDELETE\s+FROM\s+\w+[ \t]*(;|"|'|\n|$)/i,
75
81
  warning: 'Note: may delete all rows from a database table',
@@ -0,0 +1,117 @@
1
+ /**
2
+ * ============================================================
3
+ * src/tools/bash/warnings.ts —— 破坏性命令告警扫描
4
+ * ------------------------------------------------------------
5
+ * 对应 kakadeai 主仓库 tools/BashTool/destructiveCommandWarning.ts。
6
+ *
7
+ * 三层分工(同一条模式只住一处,别在两处各写一遍):
8
+ * 1. `bash.ts::FORBIDDEN_PATTERNS` —— 灾难且无正当用途(rm -rf /、mkfs、
9
+ * shutdown…):命中**直接拒绝**。
10
+ * 2. `src/irreversible/rules.ts::classifyCommand` —— 不可逆但有正当用途
11
+ * (git push --force、DROP DATABASE、reflog expire…):命中**停下来问人**,
12
+ * 无人可问则拒绝。
13
+ * 3. 本模块 —— 危险但**可回滚**(git reset --hard 有 reflog、clean -f 只动
14
+ * 未跟踪文件、stash drop 是本地):只输出警告字符串、**不阻塞执行**。
15
+ *
16
+ * ⚠️ 曾经 `git push --force` 与 `DROP/TRUNCATE` 也在本表里(仅警告)。
17
+ * 它们已升级到第 2 层,并从这里删除 —— 留着就成了两处维护、迟早漂移。
18
+ * `--force-with-lease` 仍留在这里:远端有未见提交时它会**拒绝执行**,
19
+ * 正是防经典事故的安全形式,拦它只会逼人改用更危险的 `--force`。
20
+ *
21
+ * 纯函数模块。
22
+ * ============================================================
23
+ */
24
+
25
+ type DestructivePattern = {
26
+ pattern: RegExp;
27
+ warning: string;
28
+ };
29
+
30
+ const DESTRUCTIVE_PATTERNS: DestructivePattern[] = [
31
+ // Git —— 数据丢失 / 难回退
32
+ {
33
+ pattern: /\bgit\s+reset\s+--hard\b/,
34
+ warning: 'Note: may discard uncommitted changes',
35
+ },
36
+ {
37
+ // 只留 --force-with-lease;裸 --force / -f 已升级为「问人」,见文件头注
38
+ pattern: /\bgit\s+push\b[^;&|\n]*[ \t]--force-with-lease\b/,
39
+ warning: 'Note: may overwrite remote history (lease-checked)',
40
+ },
41
+ {
42
+ pattern:
43
+ /\bgit\s+clean\b(?![^;&|\n]*(?:-[a-zA-Z]*n|--dry-run))[^;&|\n]*-[a-zA-Z]*f/,
44
+ warning: 'Note: may permanently delete untracked files',
45
+ },
46
+ {
47
+ pattern: /\bgit\s+checkout\s+(--\s+)?\.[ \t]*($|[;&|\n])/,
48
+ warning: 'Note: may discard all working tree changes',
49
+ },
50
+ {
51
+ pattern: /\bgit\s+restore\s+(--\s+)?\.[ \t]*($|[;&|\n])/,
52
+ warning: 'Note: may discard all working tree changes',
53
+ },
54
+ {
55
+ pattern: /\bgit\s+stash[ \t]+(drop|clear)\b/,
56
+ warning: 'Note: may permanently remove stashed changes',
57
+ },
58
+ {
59
+ pattern:
60
+ /\bgit\s+branch\s+(-D[ \t]|--delete\s+--force|--force\s+--delete)\b/,
61
+ warning: 'Note: may force-delete a branch',
62
+ },
63
+
64
+ // Git —— 安全绕过
65
+ {
66
+ pattern: /\bgit\s+(commit|push|merge)\b[^;&|\n]*--no-verify\b/,
67
+ warning: 'Note: may skip safety hooks',
68
+ },
69
+ {
70
+ pattern: /\bgit\s+commit\b[^;&|\n]*--amend\b/,
71
+ warning: 'Note: may rewrite the last commit',
72
+ },
73
+
74
+ // 文件删除(rm -rf / 之类的致命形式由 bash.ts 黑名单处理;这里只做"未到致命"的提醒)
75
+ {
76
+ pattern:
77
+ /(^|[;&|\n]\s*)rm\s+-[a-zA-Z]*[rR][a-zA-Z]*f|(^|[;&|\n]\s*)rm\s+-[a-zA-Z]*f[a-zA-Z]*[rR]/,
78
+ warning: 'Note: may recursively force-remove files',
79
+ },
80
+ {
81
+ pattern: /(^|[;&|\n]\s*)rm\s+-[a-zA-Z]*[rR]/,
82
+ warning: 'Note: may recursively remove files',
83
+ },
84
+ {
85
+ pattern: /(^|[;&|\n]\s*)rm\s+-[a-zA-Z]*f/,
86
+ warning: 'Note: may force-remove files',
87
+ },
88
+
89
+ // 数据库
90
+ // DROP / TRUNCATE 已升级为「问人」(src/irreversible/rules.ts),此处不再重复。
91
+ {
92
+ pattern: /\bDELETE\s+FROM\s+\w+[ \t]*(;|"|'|\n|$)/i,
93
+ warning: 'Note: may delete all rows from a database table',
94
+ },
95
+
96
+ // 基础设施
97
+ {
98
+ pattern: /\bkubectl\s+delete\b/,
99
+ warning: 'Note: may delete Kubernetes resources',
100
+ },
101
+ {
102
+ pattern: /\bterraform\s+destroy\b/,
103
+ warning: 'Note: may destroy Terraform infrastructure',
104
+ },
105
+ ];
106
+
107
+ /**
108
+ * 扫描命令是否命中已知破坏性模式。
109
+ * 命中返回人类可读的告警字符串;未命中返回 null。
110
+ * **仅警告,不阻塞**。
111
+ */
112
+ export function scanDestructiveCommand(command: string): string | null {
113
+ for (const { pattern, warning } of DESTRUCTIVE_PATTERNS) {
114
+ if (pattern.test(command)) return warning;
115
+ }
116
+ return null;
117
+ }
@@ -0,0 +1,42 @@
1
+ const TOOL_CAPABILITIES = Object.freeze({
2
+ Read: 'files.read', Glob: 'files.read', Grep: 'files.read',
3
+ Snip: 'files.read',
4
+ Edit: 'files.write', MultiEdit: 'files.write', Write: 'files.write',
5
+ Bash: 'shell',
6
+ PowerShell: 'shell', TaskOutput: 'background.process', TaskStop: 'background.process',
7
+ Trash: 'files.trash',
8
+ TaskCreate: 'task.management', TaskGet: 'task.management', TaskUpdate: 'task.management', TaskList: 'task.management',
9
+ Skill: 'skill.invoke', EnterWorktree: 'worktree.session', ExitWorktree: 'worktree.session',
10
+ TerminalCapture: 'terminal.capture',
11
+ LSP: 'code.intelligence', NotebookEdit: 'files.write',
12
+ WebSearch: 'web.search', WebFetch: 'web.fetch', WebBrowser: 'web.browser',
13
+ Download: 'network.download',
14
+ ComputerUse: 'computer.use', AskUserQuestion: 'ask', Advisor: 'advisor', Agent: 'subagent',
15
+ PresentResult: 'delivery', GenerateImage: 'media', GenerateSpeech: 'media',
16
+ RecallMemory: 'memory', RememberMemory: 'memory', UpdateMemory: 'memory',
17
+ ListMemories: 'memory', ForgetMemory: 'memory', SetPersona: 'memory',
18
+ ClearPersona: 'memory', ConfirmMemory: 'memory', ReviewMemories: 'memory',
19
+ SearchConversations: 'memory',
20
+ });
21
+ const CORE_TOOLS = new Set([
22
+ 'Read', 'Glob', 'Grep', 'Edit', 'MultiEdit', 'Write', 'NotebookEdit', 'Bash',
23
+ ]);
24
+ const AUXILIARY_TOOLS = new Set(['Advisor', 'Agent']);
25
+ export function budgetClassForToolName(name) {
26
+ if (CORE_TOOLS.has(name))
27
+ return 'core';
28
+ if (AUXILIARY_TOOLS.has(name))
29
+ return 'auxiliary';
30
+ return 'task';
31
+ }
32
+ export function capabilityForToolName(name) {
33
+ return TOOL_CAPABILITIES[name];
34
+ }
35
+ export function isMemoryToolName(name) {
36
+ return capabilityForToolName(name) === 'memory';
37
+ }
38
+ export function assertCapabilityRegistry(toolNames) {
39
+ const missing = toolNames.filter((name) => !capabilityForToolName(name));
40
+ if (missing.length > 0)
41
+ throw new Error(`工具缺少 capability 声明:${missing.join(', ')}`);
42
+ }
@@ -0,0 +1,69 @@
1
+ export type CapabilityId =
2
+ | 'files.read'
3
+ | 'files.write'
4
+ | 'shell'
5
+ | 'web.search'
6
+ | 'web.fetch'
7
+ | 'web.browser'
8
+ | 'network.download'
9
+ | 'computer.use'
10
+ | 'ask'
11
+ | 'advisor'
12
+ | 'subagent'
13
+ | 'delivery'
14
+ | 'media'
15
+ | 'memory'
16
+ | 'code.intelligence'
17
+ | 'background.process'
18
+ | 'files.trash'
19
+ | 'task.management'
20
+ | 'skill.invoke'
21
+ | 'worktree.session'
22
+ | 'terminal.capture';
23
+
24
+ export type ToolBudgetClass = 'core' | 'task' | 'auxiliary';
25
+
26
+ const TOOL_CAPABILITIES: Readonly<Record<string, CapabilityId>> = Object.freeze({
27
+ Read: 'files.read', Glob: 'files.read', Grep: 'files.read',
28
+ Snip: 'files.read',
29
+ Edit: 'files.write', MultiEdit: 'files.write', Write: 'files.write',
30
+ Bash: 'shell',
31
+ PowerShell: 'shell', TaskOutput: 'background.process', TaskStop: 'background.process',
32
+ Trash: 'files.trash',
33
+ TaskCreate: 'task.management', TaskGet: 'task.management', TaskUpdate: 'task.management', TaskList: 'task.management',
34
+ Skill: 'skill.invoke', EnterWorktree: 'worktree.session', ExitWorktree: 'worktree.session',
35
+ TerminalCapture: 'terminal.capture',
36
+ LSP: 'code.intelligence', NotebookEdit: 'files.write',
37
+ WebSearch: 'web.search', WebFetch: 'web.fetch', WebBrowser: 'web.browser',
38
+ Download: 'network.download',
39
+ ComputerUse: 'computer.use', AskUserQuestion: 'ask', Advisor: 'advisor', Agent: 'subagent',
40
+ PresentResult: 'delivery', GenerateImage: 'media', GenerateSpeech: 'media',
41
+ RecallMemory: 'memory', RememberMemory: 'memory', UpdateMemory: 'memory',
42
+ ListMemories: 'memory', ForgetMemory: 'memory', SetPersona: 'memory',
43
+ ClearPersona: 'memory', ConfirmMemory: 'memory', ReviewMemories: 'memory',
44
+ SearchConversations: 'memory',
45
+ });
46
+
47
+ const CORE_TOOLS = new Set([
48
+ 'Read', 'Glob', 'Grep', 'Edit', 'MultiEdit', 'Write', 'NotebookEdit', 'Bash',
49
+ ]);
50
+ const AUXILIARY_TOOLS = new Set(['Advisor', 'Agent']);
51
+
52
+ export function budgetClassForToolName(name: string): ToolBudgetClass {
53
+ if (CORE_TOOLS.has(name)) return 'core';
54
+ if (AUXILIARY_TOOLS.has(name)) return 'auxiliary';
55
+ return 'task';
56
+ }
57
+
58
+ export function capabilityForToolName(name: string): CapabilityId | undefined {
59
+ return TOOL_CAPABILITIES[name];
60
+ }
61
+
62
+ export function isMemoryToolName(name: string): boolean {
63
+ return capabilityForToolName(name) === 'memory';
64
+ }
65
+
66
+ export function assertCapabilityRegistry(toolNames: readonly string[]): void {
67
+ const missing = toolNames.filter((name) => !capabilityForToolName(name));
68
+ if (missing.length > 0) throw new Error(`工具缺少 capability 声明:${missing.join(', ')}`);
69
+ }
@@ -0,0 +1,261 @@
1
+ import { execSync } from 'node:child_process';
2
+ /**
3
+ * macOS 权限引导工具。
4
+ *
5
+ * 设计参考:UI-TARS-desktop/apps/ui-tars/src/main/utils/systemPermissions.ts
6
+ *
7
+ * 核心原则:
8
+ * 1. 实际调用系统 API(CGEventPost / CGDisplayCreateImage)的是 cu-helperd 守护进程,
9
+ * 因此 macOS TCC 权限数据库中记录的是 cu-helperd 二进制的权限状态。
10
+ * 2. 系统原生权限弹窗(AXIsProcessTrustedWithOptions / CGRequestScreenCaptureAccess)
11
+ * 由 cu-helperd 在首次需要时自动触发,但这种弹窗有局限性:
12
+ * - 只在权限状态为 "not determined" 时弹出一次
13
+ * - 用户如果点了"拒绝",之后不会再弹,必须手动去系统设置
14
+ * - 从后台进程触发弹窗有时会被其他窗口遮挡
15
+ * 3. 因此本模块的核心策略是:**主动探测 + 自动打开设置 + 明确文字引导**,
16
+ * 参考 UI-TARS 的 openSystemPreferences() 做法,不管什么状态,只要权限缺失
17
+ * 就直接打开系统设置页面,让用户一目了然该勾选什么。
18
+ */
19
+ /**
20
+ * 打开 macOS 系统设置 → 隐私与安全性 → 辅助功能 页面。
21
+ */
22
+ export function openAccessibilitySettings() {
23
+ if (process.platform !== 'darwin')
24
+ return;
25
+ try {
26
+ execSync('open "x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility"', { stdio: 'ignore', timeout: 5000 });
27
+ }
28
+ catch {
29
+ // fallback:如果系统设置URL scheme失效,尝试直接打开系统设置应用
30
+ try {
31
+ execSync('open "x-apple.systempreferences:"', { stdio: 'ignore', timeout: 5000 });
32
+ }
33
+ catch { }
34
+ }
35
+ }
36
+ /**
37
+ * 打开 macOS 系统设置 → 隐私与安全性 → 屏幕录制 页面。
38
+ */
39
+ export function openScreenCaptureSettings() {
40
+ if (process.platform !== 'darwin')
41
+ return;
42
+ try {
43
+ execSync('open "x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture"', { stdio: 'ignore', timeout: 5000 });
44
+ }
45
+ catch {
46
+ try {
47
+ execSync('open "x-apple.systempreferences:"', { stdio: 'ignore', timeout: 5000 });
48
+ }
49
+ catch { }
50
+ }
51
+ }
52
+ /**
53
+ * 检测当前是否运行在一个 .app bundle 内部(即 Tauri/Electron 打包后的生产环境)。
54
+ */
55
+ export function isRunningInAppBundle() {
56
+ if (process.platform !== 'darwin')
57
+ return false;
58
+ return process.execPath.includes('.app/Contents/MacOS/');
59
+ }
60
+ /**
61
+ * 获取权限引导信息中应该告诉用户查找哪个应用名。
62
+ *
63
+ * **只有两种情况**,因为实际调用系统 API 的进程只有两种:
64
+ * · 打包进 .app 时,TCC 记的是宿主 App → 让用户找 "KakadeAI"
65
+ * · 其余(CLI / dev)由 cu-helperd 守护进程调用 → 让用户找 "cu-helperd"
66
+ *
67
+ * 这里曾有第三种「终端应用名(Terminal/iTerm/Warp…)」分支,服务于已移除的
68
+ * nut-js transport —— 它在主进程内直接调 CGEvent,于是 TCC 记的是终端。
69
+ * nut-js 移除后那条分支恒为误导(会让用户去给终端授权,而真正需要授权的是
70
+ * cu-helperd),所以一并删除。
71
+ */
72
+ export function getPermissionTargetName() {
73
+ return isRunningInAppBundle() ? 'KakadeAI' : 'cu-helperd';
74
+ }
75
+ /**
76
+ * 解析 cu-helperd 返回的 permissions 响应,生成标准化的检查结果。
77
+ * 支持多种响应格式:
78
+ * - 原生 wire 格式:{ response: { Ok: { accessibility, screenCapture } } }
79
+ * - 高层 service 格式:{ ok: true, data: { accessibility, screenCapture } }
80
+ * - 纯数据格式:{ accessibility, screenCapture }
81
+ */
82
+ const PERMISSION_STATES = new Set(['granted', 'denied', 'not_determined']);
83
+ /**
84
+ * ⚠️ **「查不到」绝不能当成「没授权」。**
85
+ *
86
+ * 这里以前从任意形状的响应里挖 `accessibility` / `screenCapture`,挖不到就默认
87
+ * `not_determined`,于是**错误信封被当成了权限答案**:守护进程返回
88
+ * `{response:{Err:{code:'authentication_failed'}}}`,两个字段自然都不存在,函数愉快地
89
+ * 报告「两个权限都缺失」,调用方打印一整屏「请去系统设置授权」。
90
+ *
91
+ * 而它确实一直在返回这个错误 —— `probePermissions` 把 32 字节的二进制配对令牌按
92
+ * utf8 读,HMAC 必然对不上。也就是说这个自检**从未成功过一次**,却始终显得像是在工作。
93
+ * 真实代价:用户被反复引去检查根本没问题的系统设置,而真正的故障在完全不同的地方;
94
+ * 排查中先后错怪了 cdhash、用户的授权配置和另一处改动。
95
+ *
96
+ * 修法不是把那次读改对就完了 —— 那只堵住一个诱因。判据本身必须能表达「我不知道」。
97
+ */
98
+ export function parsePermissionResponse(permResp) {
99
+ const unknown = () => ({
100
+ accessibility: 'not_determined',
101
+ screenCapture: 'not_determined',
102
+ // 查询失败时**不**声称有权限缺失:那会把用户引向系统设置,而问题不在那儿。
103
+ hasMissingPermissions: false,
104
+ missingPermissions: [],
105
+ queryFailed: true,
106
+ });
107
+ // 明确的错误信封:直接判定为「查询失败」,不去它身上找权限字段。
108
+ if (permResp?.response?.Err || permResp?.ok === false)
109
+ return unknown();
110
+ let perms = permResp;
111
+ if (permResp?.response?.Ok) {
112
+ perms = permResp.response.Ok; // 原生 wire 格式
113
+ }
114
+ else if (permResp?.ok && permResp?.data) {
115
+ perms = permResp.data; // 高层 service 格式(diagnostics/request 返回)
116
+ }
117
+ // 两个字段**都**认不出来 = 这根本不是一份权限响应,而不是「两个权限都没授权」。
118
+ const knownAccessibility = PERMISSION_STATES.has(perms?.accessibility);
119
+ const knownScreenCapture = PERMISSION_STATES.has(perms?.screenCapture);
120
+ if (!knownAccessibility && !knownScreenCapture)
121
+ return unknown();
122
+ const accessibility = knownAccessibility
123
+ ? perms.accessibility
124
+ : 'not_determined';
125
+ const screenCapture = knownScreenCapture
126
+ ? perms.screenCapture
127
+ : 'not_determined';
128
+ const missingPermissions = [];
129
+ if (accessibility !== 'granted')
130
+ missingPermissions.push('accessibility');
131
+ if (screenCapture !== 'granted')
132
+ missingPermissions.push('screenCapture');
133
+ return {
134
+ accessibility,
135
+ screenCapture,
136
+ hasMissingPermissions: missingPermissions.length > 0,
137
+ missingPermissions,
138
+ queryFailed: false,
139
+ };
140
+ }
141
+ /**
142
+ * 打印醒目的权限缺失提示,并自动打开系统设置。
143
+ * 参考 UI-TARS 的 wrapWithWarning + openSystemPreferences 模式。
144
+ *
145
+ * 引导文案遵循三层结构:
146
+ * 1. 为什么需要这些权限(让用户理解价值,减少抵触)
147
+ * 2. 具体要做什么(分步骤、目标明确)
148
+ * 3. 遇到问题怎么办(找不到应用、已勾选仍不行等常见坑)
149
+ */
150
+ export function showPermissionGuidance(result) {
151
+ if (process.platform !== 'darwin')
152
+ return;
153
+ if (!result.hasMissingPermissions)
154
+ return;
155
+ const targetName = getPermissionTargetName();
156
+ const lines = [];
157
+ const inAppBundle = isRunningInAppBundle();
158
+ lines.push('');
159
+ lines.push('╔════════════════════════════════════════════════════════════════╗');
160
+ lines.push('║ ⚠️ 需要授予 macOS 系统权限才能使用「电脑操控」功能 ║');
161
+ lines.push('╚════════════════════════════════════════════════════════════════╝');
162
+ lines.push('');
163
+ // 第 1 层:需要什么权限、为什么需要
164
+ lines.push('—— 需要授予的权限 ——');
165
+ lines.push('');
166
+ if (result.missingPermissions.includes('accessibility')) {
167
+ lines.push(' 🖱️ 辅助功能(Accessibility)');
168
+ lines.push(' 用途:控制鼠标移动/点击、模拟键盘输入、拖拽操作');
169
+ lines.push(' 没有它:AI 无法操作你的鼠标和键盘');
170
+ lines.push('');
171
+ }
172
+ if (result.missingPermissions.includes('screenCapture')) {
173
+ lines.push(' 📷 屏幕录制(Screen Recording)');
174
+ lines.push(' 用途:读取屏幕画面,让 AI "看到" 你当前的界面');
175
+ lines.push(' 没有它:AI 看不到屏幕,无法判断该点哪里、该做什么');
176
+ lines.push('');
177
+ }
178
+ lines.push('👉 已为你自动打开「系统设置 → 隐私与安全性」对应页面');
179
+ lines.push('');
180
+ // 第 2 层:具体操作步骤
181
+ lines.push('—— 授权步骤(只需 4 步,约 30 秒)——');
182
+ lines.push('');
183
+ const permLabels = [];
184
+ if (result.missingPermissions.includes('accessibility'))
185
+ permLabels.push('辅助功能');
186
+ if (result.missingPermissions.includes('screenCapture'))
187
+ permLabels.push('屏幕录制');
188
+ lines.push(` 1. 在系统设置中,依次点击「隐私与安全性」→「${permLabels[0]}」`);
189
+ if (permLabels.length > 1) {
190
+ lines.push(` (两个权限都需要授权,授权完一个再切换到另一个)`);
191
+ }
192
+ lines.push(' 2. 点击左下角 🔒 锁形图标,输入开机密码解锁');
193
+ lines.push(` 3. 在右侧应用列表中找到「${targetName}」,打开它的开关`);
194
+ if (!inAppBundle) {
195
+ lines.push(' ⓘ 这里要授权的是 cu-helperd(守护进程),不是你的终端 ——');
196
+ lines.push(' 真正调用系统 API 的是它,所以 macOS 记录的也是它的权限。');
197
+ }
198
+ lines.push(' 4. 完成后回到这里,继续让 AI 操作即可');
199
+ lines.push('');
200
+ // 第 3 层:常见问题 / 排错
201
+ lines.push('—— 常见问题 ——');
202
+ lines.push('');
203
+ lines.push(' Q: 列表里找不到「' + targetName + '」怎么办?');
204
+ lines.push(' A: 点击列表下方的 ➕ 按钮,手动添加' + targetName);
205
+ if (!inAppBundle) {
206
+ lines.push(' (cu-helperd 随包位于 vendor/computer-use/<arch>-<plat>/ 目录下;');
207
+ lines.push(' 源码构建时在 computer-use-native/target/release/)');
208
+ lines.push(' 也可以先让 AI 执行一次操作,cu-helperd 会主动弹出系统授权请求。');
209
+ }
210
+ lines.push('');
211
+ lines.push(' Q: 已经勾选了,但还是提示权限不足?');
212
+ lines.push(' A: 把开关先关掉再重新打开一次,macOS 有时需要重新确认。');
213
+ lines.push(' 如果仍然不行,重启应用后再试。');
214
+ lines.push('');
215
+ lines.push(' Q: 这些权限安全吗?会不会泄露隐私?');
216
+ lines.push(' A: 权限只在本地使用,屏幕画面和操作都不会上传到任何服务器。');
217
+ lines.push(' AI 模型只接收截图用于分析操作,不做存储。');
218
+ lines.push('');
219
+ // 输出到 stderr,确保在 TUI/CLI 中都能看到
220
+ for (const line of lines) {
221
+ process.stderr.write(line + '\n');
222
+ }
223
+ // 自动打开对应的设置页面(优先屏幕录制,因为最直观)
224
+ if (result.missingPermissions.includes('screenCapture')) {
225
+ try {
226
+ openScreenCaptureSettings();
227
+ }
228
+ catch {
229
+ process.stderr.write(' ⚠️ 未能自动打开系统设置,请手动打开:系统设置 → 隐私与安全性 → 屏幕录制\n');
230
+ }
231
+ }
232
+ if (result.missingPermissions.includes('accessibility')) {
233
+ try {
234
+ openAccessibilitySettings();
235
+ }
236
+ catch {
237
+ process.stderr.write(' ⚠️ 未能自动打开系统设置,请手动打开:系统设置 → 隐私与安全性 → 辅助功能\n');
238
+ }
239
+ }
240
+ }
241
+ /**
242
+ * 一次性完成权限检查:解析响应、打印引导、打开设置。
243
+ * 返回 true 表示权限齐全可以继续,false 表示需要用户授权。
244
+ */
245
+ export function ensureMacPermissions(permResp) {
246
+ if (process.platform !== 'darwin')
247
+ return true;
248
+ const result = parsePermissionResponse(permResp);
249
+ if (result.queryFailed) {
250
+ // 查询本身失败:说一句,然后**闭嘴**。既不打印权限引导(问题不在用户的设置里),
251
+ // 也不阻断(真正的动作走的是另一条通道,它自己会如实报错)。
252
+ process.stderr.write('[computer-use] 权限自检未能取得结果(守护进程没有返回可识别的权限响应)。'
253
+ + '这是自检本身的问题,不代表权限缺失;实际操作若受阻会单独报错。\n');
254
+ return true;
255
+ }
256
+ if (result.hasMissingPermissions) {
257
+ showPermissionGuidance(result);
258
+ return false;
259
+ }
260
+ return true;
261
+ }