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,48 @@
1
+ /**
2
+ * ============================================================
3
+ * src/bootstrap/workingDir.ts —— 工作目录管理
4
+ * ------------------------------------------------------------
5
+ * 启动时一次性捕获 process.cwd(),后续所有"操作目录"统一通过
6
+ * getWorkingDir() 读取,杜绝多处 process.cwd() 不一致的隐患。
7
+ *
8
+ * 设计选择:
9
+ * - 模块级 state:单进程单 cwd,不需要 AsyncLocalStorage
10
+ * - 锁定时机:main() 最开头,在加载 config / provider / history 之前
11
+ * - 环境变量覆盖 MINIMAL_AGENT_CWD:测试 / docker / 显式 cd 场景
12
+ * ============================================================
13
+ */
14
+
15
+ import { AsyncLocalStorage } from 'node:async_hooks';
16
+ import { resolve } from 'node:path';
17
+
18
+ let _workingDir: string | null = null;
19
+ const workingDirScope = new AsyncLocalStorage<string>();
20
+
21
+ /** 首次调用锁定 cwd(解析 MINIMAL_AGENT_CWD),重复调用幂等。 */
22
+ export function initWorkingDir(): string {
23
+ if (_workingDir !== null) return _workingDir;
24
+ const override = process.env.MINIMAL_AGENT_CWD;
25
+ _workingDir = resolve(override ?? process.cwd());
26
+ return _workingDir;
27
+ }
28
+
29
+ /** 读取已锁定的工作目录;尚未 init 时退到 lazy init(主要给测试)。 */
30
+ export function getWorkingDir(): string {
31
+ return workingDirScope.getStore() ?? _workingDir ?? initWorkingDir();
32
+ }
33
+
34
+ /** TUI idle-only workspace switch. Callers must reject switching during a turn. */
35
+ export function setWorkingDir(cwd: string): string {
36
+ _workingDir = resolve(cwd);
37
+ return _workingDir;
38
+ }
39
+
40
+ /** 在同一进程的某个异步调用链里临时覆盖工作目录(HTTP/Gateway 多工作区宿主用)。 */
41
+ export function withWorkingDir<T>(cwd: string, fn: () => T): T {
42
+ return workingDirScope.run(resolve(cwd), fn);
43
+ }
44
+
45
+ /** 仅供测试:重置 module-level state */
46
+ export function _resetWorkingDir(): void {
47
+ _workingDir = null;
48
+ }
package/src/cli/args.js CHANGED
@@ -13,7 +13,7 @@
13
13
  * ============================================================
14
14
  */
15
15
  /**
16
- * 从 args 里提取「带值标志」的值:找到 names 中任一标志,取其后**紧跟的下一个元素**当 value。
16
+ * 从 args 里提取「带值标志」的值,兼容 `--flag value` 与 `--flag=value`。
17
17
  *
18
18
  * - 命中多次:取**第一次**出现的值
19
19
  * - 标志在末尾(后面没有元素):返回 undefined(args[i+1] 天然是 undefined)
@@ -24,20 +24,40 @@
24
24
  * 用于 -p 模式提取 --output-format / --max-turns 的值。
25
25
  */
26
26
  export function extractFlagValue(args, names) {
27
- for (let i = 0; i < args.length; i++) {
28
- if (names.includes(args[i])) {
29
- return args[i + 1]; // 末尾标志时 args[i+1] 为 undefined,符合语义
27
+ const normalized = normalizeArgs(args); // `--flag=value` → 空格式,见 normalizeArgs
28
+ for (let i = 0; i < normalized.length; i++) {
29
+ const arg = normalized[i];
30
+ if (names.includes(arg)) {
31
+ return normalized[i + 1]; // 末尾标志时 [i+1] 为 undefined,符合语义
32
+ }
33
+ // 两道防线是互补的、不是重复:normalizeArgs 只展开 VALUE_FLAGS 里的**已知**名字
34
+ // (它面向全局 argv,不能替未知标志猜语义);而调用方可以传任意别名
35
+ // (测试里的 `['--output-format','--fmt']` 就是),那些名字 normalizeArgs 认不出,
36
+ // 由这里按传入的 name 再兜一次 `=` 形式。
37
+ for (const name of names) {
38
+ if (arg.startsWith(`${name}=`))
39
+ return arg.slice(name.length + 1);
30
40
  }
31
41
  }
32
42
  return undefined;
33
43
  }
34
44
  /** 提取可重复带值标志,例如 `--image a.png --image b.png`。 */
35
45
  export function extractFlagValues(args, names) {
46
+ const normalized = normalizeArgs(args);
36
47
  const values = [];
37
- for (let i = 0; i < args.length; i++) {
38
- if (names.includes(args[i]) && args[i + 1] !== undefined) {
39
- values.push(args[i + 1]);
48
+ for (let i = 0; i < normalized.length; i++) {
49
+ const arg = normalized[i];
50
+ if (names.includes(arg) && normalized[i + 1] !== undefined) {
51
+ values.push(normalized[i + 1]);
40
52
  i++;
53
+ continue;
54
+ }
55
+ // 同 extractFlagValue:调用方传入的别名不在 VALUE_FLAGS 里时的兜底。
56
+ for (const name of names) {
57
+ if (arg.startsWith(`${name}=`)) {
58
+ values.push(arg.slice(name.length + 1));
59
+ break;
60
+ }
41
61
  }
42
62
  }
43
63
  return values;
@@ -73,4 +93,47 @@ export const VALUE_FLAGS = new Set([
73
93
  '--image',
74
94
  '--image-detail',
75
95
  '--image-max-long-side-pixel',
96
+ '--memory-access',
97
+ '--computer-use',
98
+ '--computer-use-trace',
76
99
  ]);
100
+ /**
101
+ * 把 GNU 风格的 `--flag=value` 展开成 `['--flag', 'value']`,让下游全部按空格式解析。
102
+ *
103
+ * **为什么必须有这一步**:本文件的 `extractFlagValue`、`print.ts::extractPromptArgs`、
104
+ * `bootstrap/cwdArg.ts::extractCwdArg` 都按**精确名字**匹配标志,`=` 形式因此谁都认不出来,
105
+ * 而且失败是**静默**的——回落默认值,同时那串 token 还被当成 prompt 文本喂给模型:
106
+ *
107
+ * `--cwd=/tmp/job-123` → 工作目录没切,产物全写在当前目录
108
+ * `--session=foo` → 读写落到 `default` 会话(会话串错)
109
+ * `--output-format=json` → 回落 text,宿主 JSON.parse 直接炸
110
+ *
111
+ * 修在解析层而不是逐个标志各自兜底:`memoryAccess.ts` 曾单独认过一次 `=`,那种补丁
112
+ * 只保住被打补丁的那一个标志,其余照旧静默失败。
113
+ *
114
+ * **保守边界(有意为之)**:
115
+ * - 只展开 `VALUE_FLAGS` 里**已知**的名字。未知的 `--foo=bar` 原样保留——它极可能是
116
+ * prompt 正文(`-p "把 --foo=bar 解释一下"`),盲目展开会把用户的话拆碎。
117
+ * - 只认 `--` 长标志。GNU 惯例里 `=` 属于长选项;短选项写法是 `-d val` 或 `-dval`,
118
+ * `-d=x` 在多数 CLI 里意思是「值是 `=x`」,不该替用户猜。
119
+ * - 按**第一个** `=` 切分(`slice` 而非 `split`):值本身可以再含 `=`,
120
+ * Windows 路径与 base64 padding 都会出现,`--cwd=D:\a=b` 必须得到 `D:\a=b`。
121
+ *
122
+ * 幂等:展开后的 `--flag` 不含 `=`、value 不以 `--` 开头,再跑一次原样返回。
123
+ * 因此可以在最外层入口调一次、又在各消费函数内部防御性再调一次。
124
+ */
125
+ export function normalizeArgs(args) {
126
+ const result = [];
127
+ for (const arg of args) {
128
+ const eq = arg.indexOf('=');
129
+ if (eq > 0 && arg.startsWith('--')) {
130
+ const name = arg.slice(0, eq);
131
+ if (VALUE_FLAGS.has(name)) {
132
+ result.push(name, arg.slice(eq + 1));
133
+ continue;
134
+ }
135
+ }
136
+ result.push(arg);
137
+ }
138
+ return result;
139
+ }
@@ -0,0 +1,146 @@
1
+ /**
2
+ * ============================================================
3
+ * src/cli/args.ts —— CLI 参数解析纯函数
4
+ * ------------------------------------------------------------
5
+ * 零依赖、零副作用的命令行参数提取工具,供 main.tsx 的 -p 分支使用。
6
+ *
7
+ * 为什么单独成文件(而非塞进 main.tsx):
8
+ * main.tsx 顶层有 `main().catch(...)` 自调用,一旦被 import 就会启动整个
9
+ * 应用。把纯函数抽出来,单测可零副作用地 import 断言。main.tsx re-export
10
+ * 同名符号,对外仍是「main.tsx 提供 extractFlagValue」的语义。
11
+ *
12
+ * 不引 commander:手撸即可,逻辑足够简单且教学清晰。
13
+ * ============================================================
14
+ */
15
+
16
+ /**
17
+ * 从 args 里提取「带值标志」的值,兼容 `--flag value` 与 `--flag=value`。
18
+ *
19
+ * - 命中多次:取**第一次**出现的值
20
+ * - 标志在末尾(后面没有元素):返回 undefined(args[i+1] 天然是 undefined)
21
+ * - 没命中任何 name:返回 undefined
22
+ *
23
+ * 例:extractFlagValue(['-p','--output-format','json','x'], ['--output-format']) === 'json'
24
+ *
25
+ * 用于 -p 模式提取 --output-format / --max-turns 的值。
26
+ */
27
+ export function extractFlagValue(
28
+ args: string[],
29
+ names: string[],
30
+ ): string | undefined {
31
+ const normalized = normalizeArgs(args); // `--flag=value` → 空格式,见 normalizeArgs
32
+ for (let i = 0; i < normalized.length; i++) {
33
+ const arg = normalized[i]!;
34
+ if (names.includes(arg)) {
35
+ return normalized[i + 1]; // 末尾标志时 [i+1] 为 undefined,符合语义
36
+ }
37
+ // 两道防线是互补的、不是重复:normalizeArgs 只展开 VALUE_FLAGS 里的**已知**名字
38
+ // (它面向全局 argv,不能替未知标志猜语义);而调用方可以传任意别名
39
+ // (测试里的 `['--output-format','--fmt']` 就是),那些名字 normalizeArgs 认不出,
40
+ // 由这里按传入的 name 再兜一次 `=` 形式。
41
+ for (const name of names) {
42
+ if (arg.startsWith(`${name}=`)) return arg.slice(name.length + 1);
43
+ }
44
+ }
45
+ return undefined;
46
+ }
47
+
48
+ /** 提取可重复带值标志,例如 `--image a.png --image b.png`。 */
49
+ export function extractFlagValues(args: string[], names: string[]): string[] {
50
+ const normalized = normalizeArgs(args);
51
+ const values: string[] = [];
52
+ for (let i = 0; i < normalized.length; i++) {
53
+ const arg = normalized[i]!;
54
+ if (names.includes(arg) && normalized[i + 1] !== undefined) {
55
+ values.push(normalized[i + 1]!);
56
+ i++;
57
+ continue;
58
+ }
59
+ // 同 extractFlagValue:调用方传入的别名不在 VALUE_FLAGS 里时的兜底。
60
+ for (const name of names) {
61
+ if (arg.startsWith(`${name}=`)) {
62
+ values.push(arg.slice(name.length + 1));
63
+ break;
64
+ }
65
+ }
66
+ }
67
+ return values;
68
+ }
69
+
70
+ /**
71
+ * CLI 布尔标志(出现即生效、不带值)。集中定义一份,供 print.ts 的 extractPromptArgs
72
+ * 共用 —— 避免 flag 列表在多处各维护一份、新增 flag 时漏改导致「flag 值被当 prompt 污染」。
73
+ */
74
+ export const BOOLEAN_FLAGS: ReadonlySet<string> = new Set([
75
+ '-p',
76
+ '--print',
77
+ '--verbose',
78
+ '-v',
79
+ '-h',
80
+ '--help',
81
+ '-V',
82
+ '--version',
83
+ '--clear',
84
+ '--compact',
85
+ '--workspace-doctor',
86
+ ]);
87
+
88
+ /**
89
+ * CLI 带值标志(标志本身 + 紧跟的下一个元素都不是位置参数)。
90
+ * 新增带值标志务必加到这里,否则它的值会被 extractPromptArgs 当成 prompt 文本。
91
+ */
92
+ export const VALUE_FLAGS: ReadonlySet<string> = new Set([
93
+ '-d',
94
+ '--cwd',
95
+ '-s',
96
+ '--session',
97
+ '--output-format',
98
+ '--max-turns',
99
+ '--image',
100
+ '--image-detail',
101
+ '--image-max-long-side-pixel',
102
+ '--memory-access',
103
+ '--computer-use',
104
+ '--computer-use-trace',
105
+ ]);
106
+
107
+ /**
108
+ * 把 GNU 风格的 `--flag=value` 展开成 `['--flag', 'value']`,让下游全部按空格式解析。
109
+ *
110
+ * **为什么必须有这一步**:本文件的 `extractFlagValue`、`print.ts::extractPromptArgs`、
111
+ * `bootstrap/cwdArg.ts::extractCwdArg` 都按**精确名字**匹配标志,`=` 形式因此谁都认不出来,
112
+ * 而且失败是**静默**的——回落默认值,同时那串 token 还被当成 prompt 文本喂给模型:
113
+ *
114
+ * `--cwd=/tmp/job-123` → 工作目录没切,产物全写在当前目录
115
+ * `--session=foo` → 读写落到 `default` 会话(会话串错)
116
+ * `--output-format=json` → 回落 text,宿主 JSON.parse 直接炸
117
+ *
118
+ * 修在解析层而不是逐个标志各自兜底:`memoryAccess.ts` 曾单独认过一次 `=`,那种补丁
119
+ * 只保住被打补丁的那一个标志,其余照旧静默失败。
120
+ *
121
+ * **保守边界(有意为之)**:
122
+ * - 只展开 `VALUE_FLAGS` 里**已知**的名字。未知的 `--foo=bar` 原样保留——它极可能是
123
+ * prompt 正文(`-p "把 --foo=bar 解释一下"`),盲目展开会把用户的话拆碎。
124
+ * - 只认 `--` 长标志。GNU 惯例里 `=` 属于长选项;短选项写法是 `-d val` 或 `-dval`,
125
+ * `-d=x` 在多数 CLI 里意思是「值是 `=x`」,不该替用户猜。
126
+ * - 按**第一个** `=` 切分(`slice` 而非 `split`):值本身可以再含 `=`,
127
+ * Windows 路径与 base64 padding 都会出现,`--cwd=D:\a=b` 必须得到 `D:\a=b`。
128
+ *
129
+ * 幂等:展开后的 `--flag` 不含 `=`、value 不以 `--` 开头,再跑一次原样返回。
130
+ * 因此可以在最外层入口调一次、又在各消费函数内部防御性再调一次。
131
+ */
132
+ export function normalizeArgs(args: string[]): string[] {
133
+ const result: string[] = [];
134
+ for (const arg of args) {
135
+ const eq = arg.indexOf('=');
136
+ if (eq > 0 && arg.startsWith('--')) {
137
+ const name = arg.slice(0, eq);
138
+ if (VALUE_FLAGS.has(name)) {
139
+ result.push(name, arg.slice(eq + 1));
140
+ continue;
141
+ }
142
+ }
143
+ result.push(arg);
144
+ }
145
+ return result;
146
+ }
@@ -0,0 +1,185 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { readdir, readFile } from 'node:fs/promises';
3
+ import { homedir } from 'node:os';
4
+ import { join, resolve } from 'node:path';
5
+ import { inferComputerUseCapabilities } from '../tools/computeruse/grants.js';
6
+ import { anonymousOwnerId } from '../tools/computeruse/computerUseService.js';
7
+ import { extractFlagValue } from './args.js';
8
+ export function resolveComputerUseMode(args) {
9
+ const raw = extractFlagValue(args, ['--computer-use']);
10
+ if (raw === undefined)
11
+ return 'disabled';
12
+ if (raw === 'observe' || raw === 'interactive')
13
+ return raw;
14
+ throw new Error('--computer-use 只接受 observe 或 interactive');
15
+ }
16
+ export function resolveComputerUseTraceDir(args) {
17
+ const raw = extractFlagValue(args, ['--computer-use-trace']);
18
+ if (raw === undefined)
19
+ return undefined;
20
+ if (!raw.trim())
21
+ throw new Error('--computer-use-trace 需要一个目录路径');
22
+ return resolve(raw);
23
+ }
24
+ function capabilitiesForMode(mode, userInput) {
25
+ if (mode === 'observe')
26
+ return ['observe'];
27
+ // interactive 只开放基础交互。剪贴板、文件投放和最终提交仍必须由
28
+ // 当前用户输入明确表达,不能因为一个 CLI 标志获得持续扩权。
29
+ return inferComputerUseCapabilities(userInput);
30
+ }
31
+ export function createCliComputerRun(input) {
32
+ return {
33
+ ownerId: anonymousOwnerId(),
34
+ conversationKey: input.conversationKey,
35
+ runId: randomUUID(),
36
+ surface: input.surface,
37
+ allowedApps: [],
38
+ grantId: randomUUID(),
39
+ capabilities: capabilitiesForMode(input.mode, input.userInput),
40
+ ...(input.allowedFileRoots
41
+ ? { allowedFileRoots: input.allowedFileRoots.map((root) => resolve(root)) }
42
+ : {}),
43
+ supervised: input.supervised,
44
+ // 原话只进确认弹窗的说明文字,不参与授权判定(见 ComputerUseRunContext.userInput)。
45
+ userInput: input.userInput,
46
+ ...(input.diagnosticTraceDir
47
+ ? { diagnosticTraceDir: resolve(input.diagnosticTraceDir) }
48
+ : {}),
49
+ };
50
+ }
51
+ /**
52
+ * TUI and interactive CLI do not have the Desktop Runtime's coordinator, but
53
+ * they must still enforce the same host-owned run identity and capability
54
+ * boundary before a model reaches the native helper. The tool repeats these
55
+ * checks as defence in depth; this gate is the host policy boundary.
56
+ */
57
+ export function createComputerUseHostGate(context, fallback) {
58
+ return async (request, signal) => {
59
+ if (request.name !== 'ComputerUse') {
60
+ return fallback ? fallback(request, signal) : { allow: true };
61
+ }
62
+ const scope = request.runContext;
63
+ if (!scope
64
+ || scope.ownerId !== context.ownerId
65
+ || scope.conversationKey !== context.conversationKey
66
+ || scope.runId !== context.runId) {
67
+ return { allow: false, reason: 'Computer Use 运行身份与当前本机会话不匹配。' };
68
+ }
69
+ const capability = request.action?.capability;
70
+ // ★ `submit` 是唯一不在这里终局判定的能力,**故意放行到工具层**。
71
+ //
72
+ // 它对应「不可逆动作」,而真正的审批需要「这一步要提交什么、目标应用是
73
+ // 哪个、应用指南怎么说」这些只有工具层才拿得到的上下文 —— gate 这里连
74
+ // 前台应用是谁都不知道,问不出一个人能一眼判断的问题。
75
+ //
76
+ // 更要紧的是:没有任何路径会预先授予 submit(`grants.ts` 有意不再从用户
77
+ // 措辞里猜它)。所以 gate 在这里拒死等于让人工审批**永远不可达**,
78
+ // 「发消息/提交表单/关窗」会被永久拒绝,哪怕用户就在旁边点头。这曾是
79
+ // 真实存在的死路。
80
+ //
81
+ // 放行 submit ≠ 放行一切:工具侧 `authorizeIrreversibleAction` 是这条路径
82
+ // 的终局关卡,且它在 `supervised !== true` 时无条件拒绝 —— 非交互宿主的
83
+ // 边界由那一层守住,不依赖这里。批准写的是限定到 (应用, 动作类别) 的
84
+ // grant(`ComputerUseIrreversibleGrant`),不是一张本回合通用的 submit 通行证。
85
+ if (capability !== 'submit'
86
+ && (!capability || !context.capabilities.includes(capability))) {
87
+ // ⚠️ 拒绝也要指路。实测:`type` 直接输入中文失败后,模型自己想到用
88
+ // 剪贴板绕,去调 `clipboard_write`,只收到一句「未获得授权」——
89
+ // 它不知道 `type` **内部已经有**剪贴板兜底(写入、粘贴、还原原内容),
90
+ // 根本不需要这个能力,于是白卡一轮。
91
+ return {
92
+ allow: false,
93
+ reason: `当前回合未获得 Computer Use ${capability ?? 'unknown'} 授权。`
94
+ + (capability === 'clipboard-write'
95
+ ? ' 如果你只是想输入一段文字(含中文/emoji),不需要这个能力:直接用 `type`。'
96
+ + '系统装着输入法时合成按键到不了控件,`type` 会自己整串走剪贴板粘贴'
97
+ + '并还原你原来的剪贴板内容 —— 这是它内部的确定性选路,不额外要授权。'
98
+ : ''),
99
+ };
100
+ }
101
+ const targetApp = request.action?.targetApp;
102
+ if (targetApp && context.allowedApps.length > 0 && !context.allowedApps.includes(targetApp)) {
103
+ return { allow: false, reason: '目标应用不在当前回合的 Computer Use 授权范围内。' };
104
+ }
105
+ return { allow: true };
106
+ };
107
+ }
108
+ function computerUseStateDir() {
109
+ if (process.env.KAKADEAI_CU_HOME)
110
+ return resolve(process.env.KAKADEAI_CU_HOME);
111
+ if (process.platform === 'darwin') {
112
+ return join(homedir(), 'Library', 'Application Support', 'KakadeAI', 'computer-use');
113
+ }
114
+ if (process.platform === 'win32') {
115
+ return join(process.env.LOCALAPPDATA ?? homedir(), 'KakadeAI', 'computer-use');
116
+ }
117
+ return join(process.env.XDG_STATE_HOME ?? join(homedir(), '.local', 'state'), 'kakadeai', 'computer-use');
118
+ }
119
+ /**
120
+ * 收集所有审计文件:共享根目录下的历史文件 + 每个宿主桶里的当前文件。
121
+ *
122
+ * 守护进程的状态按宿主身份分桶之后(见 `computerUseHostStateDir`),审计也跟着分散到
123
+ * `hosts/<tag>/audit.jsonl`。读取方必须跨桶汇总,否则「分桶」这个内部实现细节会直接
124
+ * 表现为「审计记录突然全没了」。根目录那份是分桶之前的历史数据,一并读入不丢。
125
+ */
126
+ async function auditFiles() {
127
+ const root = computerUseStateDir();
128
+ const files = [join(root, 'audit.jsonl')];
129
+ try {
130
+ const hosts = await readdir(join(root, 'hosts'), { withFileTypes: true });
131
+ for (const entry of hosts) {
132
+ if (entry.isDirectory())
133
+ files.push(join(root, 'hosts', entry.name, 'audit.jsonl'));
134
+ }
135
+ }
136
+ catch {
137
+ // 还没有任何宿主桶:只读根目录那份。
138
+ }
139
+ return files;
140
+ }
141
+ export async function readRecentComputerUseAudit(limit = 10) {
142
+ const safeLimit = Math.max(1, Math.min(100, Math.floor(limit)));
143
+ try {
144
+ const chunks = await Promise.all((await auditFiles()).map((file) => readFile(file, 'utf8').catch(() => '')));
145
+ // 跨桶汇总要按时间排序,否则「最近 N 条」会变成「桶 A 的全部 + 桶 B 的全部」。
146
+ // 无时间戳的行排到最前(宁可先被截掉,也不让它挤掉真正最近的记录)。
147
+ const ordered = chunks
148
+ .flatMap((content) => content.split(/\r?\n/))
149
+ .filter(Boolean)
150
+ .map((line) => {
151
+ let at = 0;
152
+ try {
153
+ const ts = JSON.parse(line).timestampMs;
154
+ if (typeof ts === 'number')
155
+ at = ts;
156
+ }
157
+ catch { /* 解析不了的行保留,下面会显示成「无法解析的审计记录」 */ }
158
+ return { line, at };
159
+ })
160
+ .sort((a, b) => a.at - b.at);
161
+ return ordered
162
+ .slice(-safeLimit)
163
+ .map(({ line }) => {
164
+ try {
165
+ const record = JSON.parse(line);
166
+ const timestamp = typeof record.timestampMs === 'number'
167
+ ? new Date(record.timestampMs).toLocaleString()
168
+ : '未知时间';
169
+ const operation = typeof record.operation === 'string' ? record.operation : 'unknown';
170
+ const outcome = typeof record.outcome === 'string' ? record.outcome : 'unknown';
171
+ const target = typeof record.targetApp === 'string' ? ` · ${record.targetApp}` : '';
172
+ const error = typeof record.errorCode === 'string' ? ` · ${record.errorCode}` : '';
173
+ return `${timestamp} · ${operation}${target} · ${outcome}${error}`;
174
+ }
175
+ catch {
176
+ return '无法解析的审计记录';
177
+ }
178
+ });
179
+ }
180
+ catch (error) {
181
+ if (error.code === 'ENOENT')
182
+ return [];
183
+ throw error;
184
+ }
185
+ }