@phuetz/code-buddy 1.1.0 → 1.3.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 (381) hide show
  1. package/README.md +211 -163
  2. package/dist/agent/autonomous/agentic-coding-contract.d.ts +12 -12
  3. package/dist/agent/base-agent.d.ts +4 -0
  4. package/dist/agent/base-agent.js +6 -0
  5. package/dist/agent/codebuddy-agent.d.ts +1 -1
  6. package/dist/agent/codebuddy-agent.js +69 -14
  7. package/dist/agent/execution/agent-executor.js +122 -12
  8. package/dist/agent/execution/tool-dependency-graph.js +7 -0
  9. package/dist/agent/execution/tool-hooks.d.ts +6 -0
  10. package/dist/agent/execution/tool-hooks.js +13 -5
  11. package/dist/agent/execution/tool-selection-strategy.d.ts +11 -2
  12. package/dist/agent/execution/tool-selection-strategy.js +67 -10
  13. package/dist/agent/extended-thinking.d.ts +8 -0
  14. package/dist/agent/extended-thinking.js +27 -0
  15. package/dist/agent/facades/infrastructure-facade.d.ts +9 -2
  16. package/dist/agent/facades/infrastructure-facade.js +15 -6
  17. package/dist/agent/hermes-browser-backends.js +151 -11
  18. package/dist/agent/hermes-claw-migrate.d.ts +59 -0
  19. package/dist/agent/hermes-claw-migrate.js +427 -26
  20. package/dist/agent/hermes-parity-manifest.js +78 -71
  21. package/dist/agent/hermes-runtime-lifecycle.d.ts +67 -0
  22. package/dist/agent/hermes-runtime-lifecycle.js +468 -0
  23. package/dist/agent/middleware/index.d.ts +1 -0
  24. package/dist/agent/middleware/index.js +1 -0
  25. package/dist/agent/middleware/visual-validation-middleware.d.ts +17 -0
  26. package/dist/agent/middleware/visual-validation-middleware.js +67 -0
  27. package/dist/agent/model-benchmark.d.ts +77 -0
  28. package/dist/agent/model-benchmark.js +309 -0
  29. package/dist/agent/model-tier.d.ts +14 -0
  30. package/dist/agent/model-tier.js +71 -0
  31. package/dist/agent/multi-agent/agents/orchestrator-agent.js +17 -6
  32. package/dist/agent/multi-agent/multi-agent-system.js +3 -1
  33. package/dist/agent/multi-agent/session-fleet-bridge.d.ts +2 -0
  34. package/dist/agent/multi-agent/session-fleet-bridge.js +9 -1
  35. package/dist/agent/multi-agent/session-tools.js +22 -5
  36. package/dist/agent/reasoning/mcts.js +20 -6
  37. package/dist/agent/self-improvement/authored-artifact-gate.d.ts +18 -0
  38. package/dist/agent/self-improvement/authored-artifact-gate.js +42 -0
  39. package/dist/agent/self-improvement/authored-tool-runtime.d.ts +27 -0
  40. package/dist/agent/self-improvement/authored-tool-runtime.js +57 -0
  41. package/dist/agent/self-improvement/authored-tool-store.d.ts +24 -0
  42. package/dist/agent/self-improvement/authored-tool-store.js +57 -0
  43. package/dist/agent/self-improvement/llm-tool-proposer.d.ts +41 -0
  44. package/dist/agent/self-improvement/llm-tool-proposer.js +136 -0
  45. package/dist/agent/self-improvement/sandbox-scorer.d.ts +17 -0
  46. package/dist/agent/self-improvement/sandbox-scorer.js +43 -0
  47. package/dist/agent/self-improvement/self-knowledge.d.ts +8 -0
  48. package/dist/agent/self-improvement/self-knowledge.js +24 -0
  49. package/dist/agent/self-improvement/skill-benchmark.d.ts +9 -0
  50. package/dist/agent/self-improvement/skill-benchmark.js +22 -0
  51. package/dist/agent/self-improvement/skill-consolidator.d.ts +71 -0
  52. package/dist/agent/self-improvement/skill-consolidator.js +137 -0
  53. package/dist/agent/self-improvement/skill-engine.d.ts +42 -0
  54. package/dist/agent/self-improvement/skill-engine.js +87 -0
  55. package/dist/agent/self-improvement/skill-gate.d.ts +19 -0
  56. package/dist/agent/self-improvement/skill-gate.js +62 -0
  57. package/dist/agent/self-improvement/skill-mutator.d.ts +74 -0
  58. package/dist/agent/self-improvement/skill-mutator.js +223 -0
  59. package/dist/agent/self-improvement/skill-proposer.d.ts +40 -0
  60. package/dist/agent/self-improvement/skill-proposer.js +82 -0
  61. package/dist/agent/self-improvement/skill-types.d.ts +41 -0
  62. package/dist/agent/self-improvement/skill-types.js +13 -0
  63. package/dist/agent/self-improvement/tool-benchmark.d.ts +10 -0
  64. package/dist/agent/self-improvement/tool-benchmark.js +37 -0
  65. package/dist/agent/self-improvement/tool-engine.d.ts +54 -0
  66. package/dist/agent/self-improvement/tool-engine.js +101 -0
  67. package/dist/agent/self-improvement/tool-gate.d.ts +20 -0
  68. package/dist/agent/self-improvement/tool-gate.js +78 -0
  69. package/dist/agent/self-improvement/tool-proposer.d.ts +31 -0
  70. package/dist/agent/self-improvement/tool-proposer.js +34 -0
  71. package/dist/agent/self-improvement/tool-skill-mutator.d.ts +40 -0
  72. package/dist/agent/self-improvement/tool-skill-mutator.js +79 -0
  73. package/dist/agent/self-improvement/tool-types.d.ts +48 -0
  74. package/dist/agent/self-improvement/tool-types.js +9 -0
  75. package/dist/agent/self-improvement/types.d.ts +3 -1
  76. package/dist/agent/session-end-flush.d.ts +6 -1
  77. package/dist/agent/session-end-flush.js +20 -4
  78. package/dist/agent/streaming/streaming-handler.d.ts +7 -0
  79. package/dist/agent/streaming/streaming-handler.js +8 -1
  80. package/dist/agent/tool-executor.js +1 -0
  81. package/dist/agent/tool-handler.d.ts +5 -0
  82. package/dist/agent/tool-handler.js +133 -4
  83. package/dist/browser-automation/browser-operator-executor.js +15 -0
  84. package/dist/browser-automation/browser-use-runner.d.ts +96 -0
  85. package/dist/browser-automation/browser-use-runner.js +492 -0
  86. package/dist/browser-automation/camofox-runner.d.ts +107 -0
  87. package/dist/browser-automation/camofox-runner.js +287 -0
  88. package/dist/channels/dingtalk/index.js +3 -0
  89. package/dist/channels/discord/client.d.ts +9 -0
  90. package/dist/channels/discord/client.js +12 -0
  91. package/dist/channels/feishu/index.d.ts +167 -1
  92. package/dist/channels/feishu/index.js +432 -7
  93. package/dist/channels/gateway-lifecycle.d.ts +132 -0
  94. package/dist/channels/gateway-lifecycle.js +219 -0
  95. package/dist/channels/google-chat/index.d.ts +5 -1
  96. package/dist/channels/google-chat/index.js +5 -1
  97. package/dist/channels/imessage/index.d.ts +14 -0
  98. package/dist/channels/imessage/index.js +64 -17
  99. package/dist/channels/index.d.ts +4 -0
  100. package/dist/channels/index.js +4 -0
  101. package/dist/channels/irc/index.d.ts +73 -3
  102. package/dist/channels/irc/index.js +446 -11
  103. package/dist/channels/line/index.js +3 -0
  104. package/dist/channels/mattermost/index.d.ts +51 -4
  105. package/dist/channels/mattermost/index.js +303 -20
  106. package/dist/channels/nextcloud-talk/index.d.ts +89 -8
  107. package/dist/channels/nextcloud-talk/index.js +367 -16
  108. package/dist/channels/nostr/index.d.ts +121 -1
  109. package/dist/channels/nostr/index.js +396 -8
  110. package/dist/channels/ntfy/index.js +3 -0
  111. package/dist/channels/qq/index.js +3 -0
  112. package/dist/channels/slash-parity.d.ts +117 -0
  113. package/dist/channels/slash-parity.js +185 -0
  114. package/dist/channels/synology-chat/index.js +3 -0
  115. package/dist/channels/teams/index.d.ts +3 -0
  116. package/dist/channels/teams/index.js +3 -0
  117. package/dist/channels/telegram/client.d.ts +9 -0
  118. package/dist/channels/telegram/client.js +12 -0
  119. package/dist/channels/twilio-voice/index.js +3 -0
  120. package/dist/channels/webchat/index.d.ts +7 -1
  121. package/dist/channels/webchat/index.js +7 -1
  122. package/dist/channels/wecom/index.js +3 -0
  123. package/dist/channels/weixin/index.js +3 -0
  124. package/dist/channels/zalo/index.js +3 -0
  125. package/dist/cli/config-loader.js +1 -1
  126. package/dist/codebuddy/client.d.ts +30 -1
  127. package/dist/codebuddy/client.js +167 -20
  128. package/dist/codebuddy/providers/provider-chatgpt-responses.d.ts +5 -0
  129. package/dist/codebuddy/providers/provider-chatgpt-responses.js +7 -1
  130. package/dist/codebuddy/providers/provider-gemini-native.js +1 -1
  131. package/dist/codebuddy/providers/provider-openai-compat.d.ts +5 -0
  132. package/dist/codebuddy/providers/provider-openai-compat.js +82 -2
  133. package/dist/codebuddy/tool-definitions/computer-control-tools.js +32 -2
  134. package/dist/codebuddy/tool-definitions/core-tools.js +3 -3
  135. package/dist/codebuddy/tool-definitions/index.d.ts +2 -1
  136. package/dist/codebuddy/tool-definitions/index.js +2 -1
  137. package/dist/codebuddy/tool-definitions/multimodal-tools.d.ts +1 -0
  138. package/dist/codebuddy/tool-definitions/multimodal-tools.js +44 -1
  139. package/dist/codebuddy/tool-definitions/windows-tools.d.ts +2 -0
  140. package/dist/codebuddy/tool-definitions/windows-tools.js +34 -0
  141. package/dist/codebuddy/tools.d.ts +8 -1
  142. package/dist/codebuddy/tools.js +67 -24
  143. package/dist/commands/cli/hermes-commands.js +108 -0
  144. package/dist/commands/cli/improve-command.js +123 -0
  145. package/dist/commands/cli/native-engine-commands.js +102 -3
  146. package/dist/commands/cli/utility-commands.js +45 -0
  147. package/dist/commands/enhanced-command-handler.js +2 -2
  148. package/dist/commands/goal-cli.d.ts +30 -0
  149. package/dist/commands/goal-cli.js +210 -27
  150. package/dist/commands/handlers/goal-handler.d.ts +9 -2
  151. package/dist/commands/handlers/goal-handler.js +36 -9
  152. package/dist/commands/handlers/infra-handlers.js +36 -0
  153. package/dist/commands/handlers/memory-handlers.js +96 -1
  154. package/dist/commands/handlers/missing-handlers.d.ts +1 -1
  155. package/dist/commands/handlers/missing-handlers.js +26 -3
  156. package/dist/commands/headless-slash.d.ts +2 -0
  157. package/dist/commands/headless-slash.js +12 -0
  158. package/dist/commands/llm-provider-resolution.d.ts +5 -3
  159. package/dist/commands/llm-provider-resolution.js +87 -33
  160. package/dist/commands/ollama.d.ts +25 -0
  161. package/dist/commands/ollama.js +100 -0
  162. package/dist/commands/provider.d.ts +5 -0
  163. package/dist/commands/provider.js +106 -55
  164. package/dist/commands/skills-cli/index.js +123 -0
  165. package/dist/commands/slash/builtin-commands.js +1 -1
  166. package/dist/commands/spec-next.js +2 -1
  167. package/dist/commands/spec-plan.js +5 -16
  168. package/dist/commands/tunnel.d.ts +2 -0
  169. package/dist/commands/tunnel.js +48 -0
  170. package/dist/companion/percepts.js +11 -1
  171. package/dist/config/config-resolver.d.ts +2 -1
  172. package/dist/config/config-resolver.js +54 -41
  173. package/dist/config/constants.d.ts +28 -0
  174. package/dist/config/constants.js +7 -0
  175. package/dist/config/env-schema.js +756 -0
  176. package/dist/config/model-tools.js +4 -4
  177. package/dist/config/toml-config.d.ts +16 -0
  178. package/dist/config/toml-config.js +3 -0
  179. package/dist/context/bootstrap-loader.js +6 -23
  180. package/dist/context/context-manager-v2.js +1 -0
  181. package/dist/context/import-directive-parser.d.ts +4 -0
  182. package/dist/context/import-directive-parser.js +51 -6
  183. package/dist/context/instruction-excludes.d.ts +30 -1
  184. package/dist/context/instruction-excludes.js +71 -1
  185. package/dist/context/jit-context.d.ts +8 -10
  186. package/dist/context/jit-context.js +28 -106
  187. package/dist/context/project-context.d.ts +90 -0
  188. package/dist/context/project-context.js +295 -0
  189. package/dist/daemon/autonomous-daemon.d.ts +1 -1
  190. package/dist/daemon/autonomous-daemon.js +3 -3
  191. package/dist/daemon/autonomous-loop.d.ts +31 -1
  192. package/dist/daemon/autonomous-loop.js +91 -4
  193. package/dist/daemon/colab-goal.js +9 -1
  194. package/dist/daemon/cron-agent-bridge.d.ts +12 -3
  195. package/dist/daemon/cron-agent-bridge.js +25 -9
  196. package/dist/desktop/codebuddy-engine-adapter.d.ts +32 -0
  197. package/dist/desktop/codebuddy-engine-adapter.js +257 -80
  198. package/dist/desktop/engine-adapter.d.ts +14 -0
  199. package/dist/desktop-automation/automation-manager.js +16 -0
  200. package/dist/desktop-automation/omniparser-runner.d.ts +63 -0
  201. package/dist/desktop-automation/omniparser-runner.js +115 -0
  202. package/dist/desktop-automation/smart-snapshot.d.ts +11 -0
  203. package/dist/desktop-automation/smart-snapshot.js +72 -5
  204. package/dist/doctor/index.js +40 -23
  205. package/dist/events/types.d.ts +11 -0
  206. package/dist/fleet/colab-store.js +14 -2
  207. package/dist/fleet/peer-session-bridge.js +50 -12
  208. package/dist/fleet/peer-tool-bridge.js +14 -0
  209. package/dist/goals/goal-decomposer.d.ts +27 -0
  210. package/dist/goals/goal-decomposer.js +293 -0
  211. package/dist/goals/goal-judge-client.d.ts +15 -0
  212. package/dist/goals/goal-judge-client.js +45 -0
  213. package/dist/goals/goal-judge.d.ts +2 -0
  214. package/dist/goals/goal-judge.js +35 -6
  215. package/dist/goals/goal-loop.d.ts +14 -0
  216. package/dist/goals/goal-loop.js +47 -2
  217. package/dist/goals/goal-manager.d.ts +6 -0
  218. package/dist/goals/goal-manager.js +67 -14
  219. package/dist/goals/goal-state.d.ts +13 -0
  220. package/dist/goals/goal-state.js +83 -13
  221. package/dist/goals/goal-store.d.ts +3 -0
  222. package/dist/goals/goal-store.js +31 -15
  223. package/dist/harness/contract.d.ts +28 -28
  224. package/dist/hooks/user-hooks.js +17 -3
  225. package/dist/identity/identity-manager.js +3 -2
  226. package/dist/index.js +481 -26
  227. package/dist/input/text-to-speech.d.ts +2 -6
  228. package/dist/input/text-to-speech.js +2 -27
  229. package/dist/integrations/screenpipe/screenpipe-client.d.ts +10 -0
  230. package/dist/integrations/screenpipe/screenpipe-client.js +12 -2
  231. package/dist/integrations/tailscale.d.ts +13 -0
  232. package/dist/integrations/tailscale.js +87 -34
  233. package/dist/knowledge/workspace-indexer.js +53 -9
  234. package/dist/mcp/client.js +1 -0
  235. package/dist/mcp/mcp-desktop-tools.d.ts +23 -0
  236. package/dist/mcp/mcp-desktop-tools.js +158 -0
  237. package/dist/mcp/mcp-resources.js +2 -3
  238. package/dist/mcp/mcp-server.js +2 -0
  239. package/dist/memory/enhanced-memory.d.ts +10 -0
  240. package/dist/memory/enhanced-memory.js +33 -2
  241. package/dist/memory/index.d.ts +3 -1
  242. package/dist/memory/index.js +4 -1
  243. package/dist/memory/memory-auto-proposer.d.ts +23 -0
  244. package/dist/memory/memory-auto-proposer.js +308 -0
  245. package/dist/memory/memory-candidate-queue.d.ts +92 -0
  246. package/dist/memory/memory-candidate-queue.js +261 -0
  247. package/dist/memory/persistent-memory.d.ts +45 -2
  248. package/dist/memory/persistent-memory.js +236 -40
  249. package/dist/ml/bayesian-qualifier.d.ts +1 -1
  250. package/dist/ml/bayesian-qualifier.js +35 -2
  251. package/dist/openclaw/gateway-bridge.js +5 -0
  252. package/dist/plugins/marketplace.d.ts +1 -0
  253. package/dist/plugins/marketplace.js +7 -0
  254. package/dist/prompts/execution-discipline.d.ts +14 -0
  255. package/dist/prompts/execution-discipline.js +29 -0
  256. package/dist/prompts/variation-injector.js +9 -2
  257. package/dist/protocols/acp/acp-agentic-runner.d.ts +7 -6
  258. package/dist/protocols/acp/acp-agentic-runner.js +115 -18
  259. package/dist/protocols/acp/acp-session-store.d.ts +23 -0
  260. package/dist/protocols/acp/acp-session-store.js +77 -0
  261. package/dist/protocols/acp/acp-stdio-server.d.ts +7 -0
  262. package/dist/protocols/acp/acp-stdio-server.js +71 -16
  263. package/dist/providers/active-llm-registry.d.ts +37 -0
  264. package/dist/providers/active-llm-registry.js +186 -0
  265. package/dist/providers/auxiliary-provider.d.ts +25 -0
  266. package/dist/providers/auxiliary-provider.js +192 -0
  267. package/dist/providers/codex-oauth.d.ts +1 -1
  268. package/dist/providers/codex-oauth.js +27 -4
  269. package/dist/providers/index.d.ts +3 -0
  270. package/dist/providers/index.js +4 -0
  271. package/dist/providers/provider-catalog.d.ts +70 -0
  272. package/dist/providers/provider-catalog.js +738 -0
  273. package/dist/providers/provider-fallback.d.ts +35 -0
  274. package/dist/providers/provider-fallback.js +171 -0
  275. package/dist/providers/xai-oauth.d.ts +128 -0
  276. package/dist/providers/xai-oauth.js +735 -0
  277. package/dist/scheduler/cron-scheduler.d.ts +15 -3
  278. package/dist/scheduler/cron-scheduler.js +53 -7
  279. package/dist/scheduler/script-runner.d.ts +2 -0
  280. package/dist/scheduler/script-runner.js +19 -4
  281. package/dist/scheduler/watchdog-handlers.js +7 -20
  282. package/dist/search/usearch-index.js +7 -2
  283. package/dist/security/tool-policy/tool-groups.js +2 -0
  284. package/dist/sensory/dreaming.d.ts +45 -0
  285. package/dist/sensory/dreaming.js +114 -0
  286. package/dist/sensory/heartbeat-scheduler.d.ts +38 -0
  287. package/dist/sensory/heartbeat-scheduler.js +72 -0
  288. package/dist/sensory/reactions.d.ts +24 -0
  289. package/dist/sensory/reactions.js +31 -0
  290. package/dist/sensory/screen-reaction.d.ts +23 -0
  291. package/dist/sensory/screen-reaction.js +59 -0
  292. package/dist/sensory/sensory-bridge.d.ts +23 -0
  293. package/dist/sensory/sensory-bridge.js +85 -0
  294. package/dist/sensory/sensory-memory.d.ts +20 -0
  295. package/dist/sensory/sensory-memory.js +39 -0
  296. package/dist/sensory/speech-reaction.d.ts +21 -0
  297. package/dist/sensory/speech-reaction.js +83 -0
  298. package/dist/sensory/vision-reaction.d.ts +31 -0
  299. package/dist/sensory/vision-reaction.js +74 -0
  300. package/dist/server/index.js +106 -2
  301. package/dist/server/routes/mobile.d.ts +12 -4
  302. package/dist/server/routes/mobile.js +116 -1
  303. package/dist/server/tls-config.d.ts +35 -0
  304. package/dist/server/tls-config.js +142 -0
  305. package/dist/server/tunnel-manager.d.ts +20 -0
  306. package/dist/server/tunnel-manager.js +58 -0
  307. package/dist/server/websocket/fleet-bridge.js +5 -0
  308. package/dist/services/prompt-builder.d.ts +11 -0
  309. package/dist/services/prompt-builder.js +124 -17
  310. package/dist/shared/engine-types.d.ts +15 -1
  311. package/dist/sidecar/sidecar-bridge.d.ts +1 -0
  312. package/dist/sidecar/sidecar-bridge.js +21 -10
  313. package/dist/skills/parser.js +3 -0
  314. package/dist/skills/skill-importer.d.ts +58 -0
  315. package/dist/skills/skill-importer.js +261 -0
  316. package/dist/skills/skill-sources.d.ts +20 -0
  317. package/dist/skills/skill-sources.js +102 -0
  318. package/dist/skills/types.d.ts +6 -0
  319. package/dist/spec/spec-store.js +8 -1
  320. package/dist/talk-mode/providers/audioreader-tts.d.ts +1 -1
  321. package/dist/talk-mode/providers/audioreader-tts.js +8 -8
  322. package/dist/templates/project-scaffolding.js +3 -2
  323. package/dist/themes/theme-schema.d.ts +10 -10
  324. package/dist/tools/application-profiles.js +38 -0
  325. package/dist/tools/bash/bash-tool.d.ts +1 -0
  326. package/dist/tools/bash/bash-tool.js +16 -2
  327. package/dist/tools/bash/command-validator.js +3 -0
  328. package/dist/tools/bash/rtk-rewrite.d.ts +16 -0
  329. package/dist/tools/bash/rtk-rewrite.js +100 -0
  330. package/dist/tools/bash/streaming-executor.js +14 -1
  331. package/dist/tools/computer-control-tool.d.ts +16 -1
  332. package/dist/tools/computer-control-tool.js +317 -5
  333. package/dist/tools/document-generator.d.ts +14 -0
  334. package/dist/tools/document-generator.js +79 -0
  335. package/dist/tools/execute-code-rpc-invoker.d.ts +26 -2
  336. package/dist/tools/execute-code-rpc-invoker.js +46 -5
  337. package/dist/tools/metadata.js +28 -0
  338. package/dist/tools/office-macro-tool.d.ts +10 -0
  339. package/dist/tools/office-macro-tool.js +93 -0
  340. package/dist/tools/register-tool-handler.d.ts +25 -0
  341. package/dist/tools/register-tool-handler.js +100 -0
  342. package/dist/tools/registry/index.d.ts +2 -1
  343. package/dist/tools/registry/index.js +2 -1
  344. package/dist/tools/registry/memory-tools.d.ts +20 -0
  345. package/dist/tools/registry/memory-tools.js +225 -3
  346. package/dist/tools/registry/multimodal-tools.js +2 -2
  347. package/dist/tools/registry/vision-tools.d.ts +33 -0
  348. package/dist/tools/registry/vision-tools.js +308 -6
  349. package/dist/tools/registry/windows-tools.d.ts +2 -0
  350. package/dist/tools/registry/windows-tools.js +47 -0
  351. package/dist/tools/registry.d.ts +6 -0
  352. package/dist/tools/registry.js +8 -0
  353. package/dist/tools/route-peer-tool.js +14 -0
  354. package/dist/tools/screenshot-tool.js +14 -2
  355. package/dist/tools/text-to-speech-tool.d.ts +1 -1
  356. package/dist/tools/text-to-speech-tool.js +2 -12
  357. package/dist/tools/tool-selector.js +3 -59
  358. package/dist/utils/config-validation/schema.d.ts +40 -7
  359. package/dist/utils/config-validation/schema.js +130 -1
  360. package/dist/utils/cost-tracker.js +21 -1
  361. package/dist/utils/disk-guard.d.ts +180 -0
  362. package/dist/utils/disk-guard.js +404 -0
  363. package/dist/utils/init-project.d.ts +7 -0
  364. package/dist/utils/init-project.js +37 -0
  365. package/dist/utils/interactive-setup.js +35 -2
  366. package/dist/utils/model-utils.js +11 -2
  367. package/dist/utils/output-sanitizer.js +11 -0
  368. package/dist/utils/provider-detector.d.ts +8 -7
  369. package/dist/utils/provider-detector.js +19 -77
  370. package/dist/utils/settings-manager.d.ts +19 -0
  371. package/dist/utils/token-display.d.ts +3 -3
  372. package/dist/utils/token-display.js +22 -4
  373. package/dist/wizard/onboarding.d.ts +39 -0
  374. package/dist/wizard/onboarding.js +433 -21
  375. package/dist/wizard/provider-onboarding.d.ts +8 -23
  376. package/dist/wizard/provider-onboarding.js +39 -158
  377. package/package.json +4 -2
  378. package/dist/plugins/provider-onboarding.d.ts +0 -23
  379. package/dist/plugins/provider-onboarding.js +0 -116
  380. package/dist/utils/kokoro-tts.d.ts +0 -8
  381. package/dist/utils/kokoro-tts.js +0 -67
@@ -17,6 +17,7 @@
17
17
  */
18
18
  import { getAllCodeBuddyTools, getRelevantTools, classifyQuery, getSkillAugmentedTools, } from '../../codebuddy/tools.js';
19
19
  import { getToolSelector, recordToolRequest, formatToolSelectionMetrics, } from '../../tools/tool-selector.js';
20
+ import { filterToolsForModel, getModelToolConfig, } from '../../config/model-tools.js';
20
21
  import { getPromptCacheManager } from '../../optimization/prompt-cache.js';
21
22
  import { logger } from '../../utils/logger.js';
22
23
  import { getSkillsHub } from '../../skills/hub.js';
@@ -27,10 +28,10 @@ const DEFAULT_CONFIG = {
27
28
  useRAG: true,
28
29
  maxTools: 15,
29
30
  minScore: 0.5,
30
- // `remember` is force-included so the LLM can always auto-persist non-obvious
31
- // facts to .codebuddy/CODEBUDDY_MEMORY.md, even on tasks where the RAG selector
32
- // wouldn't otherwise surface the memory tools (e.g. a pure code-edit query).
33
- // Paired with the auto-memory directive in `prompt-builder.ts`.
31
+ // `remember` and `memory_propose` are force-included so the LLM can always
32
+ // either persist explicit durable facts or queue inferred/ambiguous facts for
33
+ // review, even on tasks where the RAG selector wouldn't otherwise surface the
34
+ // memory tools. Paired with the auto-memory directive in `prompt-builder.ts`.
34
35
  //
35
36
  // `lessons_add`, `lessons_propose`, and `lessons_search` are force-included for
36
37
  // the same reason (Manus AI-inspired self-improvement loop) — paired with the
@@ -38,7 +39,7 @@ const DEFAULT_CONFIG = {
38
39
  // "agent proposes, human approves" path, so the model must always see it (a
39
40
  // RAG-gated propose tool would rarely surface). `lessons_list` stays out
40
41
  // (admin-style, not needed per-turn). Wakes the dormant feature in lessons-tracker.ts.
41
- alwaysInclude: ['view_file', 'bash', 'search', 'str_replace_editor', 'web_search', 'remember', 'lessons_add', 'lessons_propose', 'lessons_search'],
42
+ alwaysInclude: ['view_file', 'bash', 'search', 'str_replace_editor', 'web_search', 'remember', 'memory_propose', 'lessons_add', 'lessons_propose', 'lessons_search'],
42
43
  useAdaptiveThreshold: true,
43
44
  enableCaching: true,
44
45
  cacheTTLMs: 5 * 60 * 1000, // 5 minutes
@@ -68,6 +69,7 @@ export class ToolSelectionStrategy {
68
69
  config;
69
70
  cachedTools = null;
70
71
  cachedToolNames = [];
72
+ cacheModelName = null;
71
73
  lastQuery = '';
72
74
  lastSelection = null;
73
75
  cacheTimestamp = 0;
@@ -92,9 +94,10 @@ export class ToolSelectionStrategy {
92
94
  */
93
95
  async selectToolsForQuery(query, options = {}) {
94
96
  const effectiveConfig = { ...this.config, ...options };
97
+ const modelName = ToolSelectionStrategy.normalizeModelName(effectiveConfig.modelName);
95
98
  this.lastQuery = query;
96
99
  // Check if we should use cached tools
97
- if (effectiveConfig.enableCaching && this.isCacheValid()) {
100
+ if (effectiveConfig.enableCaching && this.isCacheValid(modelName)) {
98
101
  logger.debug('Using cached tools for query', { query: query.slice(0, 50) });
99
102
  return {
100
103
  tools: this.cachedTools,
@@ -142,6 +145,15 @@ export class ToolSelectionStrategy {
142
145
  toolCount: tools.length,
143
146
  });
144
147
  }
148
+ tools = this.applyModelFacingSchemaFilter(tools, modelName);
149
+ this.cachedToolNames = tools.map(t => t.function.name);
150
+ if (selection) {
151
+ selection = {
152
+ ...selection,
153
+ selectedTools: tools,
154
+ };
155
+ this.lastSelection = selection;
156
+ }
145
157
  // Cache tools for prompt optimization
146
158
  const promptCacheManager = getPromptCacheManager();
147
159
  promptCacheManager.cacheTools(tools);
@@ -169,14 +181,16 @@ export class ToolSelectionStrategy {
169
181
  *
170
182
  * @param tools - Tools to cache
171
183
  */
172
- cacheTools(tools) {
184
+ cacheTools(tools, modelName) {
173
185
  if (!this.config.enableCaching)
174
186
  return;
175
187
  this.cachedTools = tools;
176
188
  this.cachedToolNames = tools.map(t => t.function.name);
189
+ this.cacheModelName = ToolSelectionStrategy.normalizeModelName(modelName);
177
190
  this.cacheTimestamp = Date.now();
178
191
  logger.debug('Tools cached for multi-round consistency', {
179
192
  toolCount: tools.length,
193
+ modelName: this.cacheModelName,
180
194
  });
181
195
  }
182
196
  /**
@@ -184,10 +198,10 @@ export class ToolSelectionStrategy {
184
198
  *
185
199
  * @returns Cached tools or null if cache is invalid/empty
186
200
  */
187
- getCachedTools() {
201
+ getCachedTools(modelName) {
188
202
  if (!this.config.enableCaching)
189
203
  return null;
190
- if (!this.isCacheValid())
204
+ if (!this.isCacheValid(modelName))
191
205
  return null;
192
206
  return this.cachedTools;
193
207
  }
@@ -243,6 +257,7 @@ export class ToolSelectionStrategy {
243
257
  clearCache() {
244
258
  this.cachedTools = null;
245
259
  this.cachedToolNames = [];
260
+ this.cacheModelName = null;
246
261
  this.cacheTimestamp = 0;
247
262
  this.activeSkill = null;
248
263
  logger.debug('Tool selection cache cleared');
@@ -250,15 +265,57 @@ export class ToolSelectionStrategy {
250
265
  /**
251
266
  * Check if the cache is still valid
252
267
  */
253
- isCacheValid() {
268
+ isCacheValid(modelName) {
254
269
  if (!this.cachedTools || this.cachedTools.length === 0)
255
270
  return false;
256
271
  if (this.cacheTimestamp === 0)
257
272
  return false;
273
+ if (modelName !== undefined) {
274
+ const normalizedModelName = ToolSelectionStrategy.normalizeModelName(modelName);
275
+ if (this.cacheModelName !== normalizedModelName)
276
+ return false;
277
+ }
258
278
  const now = Date.now();
259
279
  const age = now - this.cacheTimestamp;
260
280
  return age < this.config.cacheTTLMs;
261
281
  }
282
+ static normalizeModelName(modelName) {
283
+ const normalized = modelName?.trim();
284
+ return normalized ? normalized : null;
285
+ }
286
+ applyModelFacingSchemaFilter(tools, modelName) {
287
+ if (!modelName || tools.length === 0) {
288
+ return tools;
289
+ }
290
+ try {
291
+ const modelConfig = getModelToolConfig(modelName);
292
+ if (modelConfig.supportsToolCalls === false && process.env.GROK_FORCE_TOOLS !== 'true') {
293
+ logger.debug('Model-facing tool schemas suppressed for chat-only model', {
294
+ modelName,
295
+ removed: tools.map(t => t.function.name),
296
+ });
297
+ return [];
298
+ }
299
+ const allowedNames = new Set(filterToolsForModel(tools.map(tool => tool.function.name), modelConfig));
300
+ const filtered = tools.filter(tool => allowedNames.has(tool.function.name));
301
+ if (filtered.length !== tools.length) {
302
+ logger.debug('Model-facing tool schemas filtered by model capabilities', {
303
+ modelName,
304
+ removed: tools
305
+ .map(tool => tool.function.name)
306
+ .filter(name => !allowedNames.has(name)),
307
+ });
308
+ }
309
+ return filtered;
310
+ }
311
+ catch (error) {
312
+ logger.debug('Model-facing tool schema filter skipped', {
313
+ modelName,
314
+ error: error instanceof Error ? error.message : String(error),
315
+ });
316
+ return tools;
317
+ }
318
+ }
262
319
  /**
263
320
  * Record a tool request for metrics tracking
264
321
  *
@@ -48,6 +48,14 @@ export declare class ExtendedThinkingManager {
48
48
  * Set whether extended thinking is always enabled
49
49
  */
50
50
  setAlwaysEnabled(value: boolean): void;
51
+ /**
52
+ * Apply a UI/settings thinking level — `off | minimal | low | medium | high | xhigh`.
53
+ * `off` (or any unknown level) disables thinking; any other level enables it with a
54
+ * scaled token budget. This is the runtime entry point for hot-swapping the level from
55
+ * the Cowork ReasoningLevelPicker; the OpenAI-compat / Grok / Ollama providers read
56
+ * {@link getThinkingConfig} fresh per request, so the change takes effect next turn.
57
+ */
58
+ applyThinkingLevel(level: string): void;
51
59
  /**
52
60
  * Get the thinking configuration to merge into API request parameters.
53
61
  * Returns an object with a `thinking` key when enabled, or an empty object when disabled.
@@ -67,6 +67,33 @@ export class ExtendedThinkingManager {
67
67
  this.alwaysEnabled = value;
68
68
  logger.info(`Extended thinking always-enabled: ${value}`);
69
69
  }
70
+ /**
71
+ * Apply a UI/settings thinking level — `off | minimal | low | medium | high | xhigh`.
72
+ * `off` (or any unknown level) disables thinking; any other level enables it with a
73
+ * scaled token budget. This is the runtime entry point for hot-swapping the level from
74
+ * the Cowork ReasoningLevelPicker; the OpenAI-compat / Grok / Ollama providers read
75
+ * {@link getThinkingConfig} fresh per request, so the change takes effect next turn.
76
+ */
77
+ applyThinkingLevel(level) {
78
+ const budgets = {
79
+ minimal: 1024,
80
+ low: 2048,
81
+ medium: 4096,
82
+ high: 8192,
83
+ xhigh: 16384,
84
+ };
85
+ const budget = budgets[level];
86
+ if (budget === undefined) {
87
+ this.enabled = false;
88
+ this.alwaysEnabled = false;
89
+ logger.info(`Extended thinking disabled (level=${level})`);
90
+ return;
91
+ }
92
+ this.maxThinkingTokens = budget;
93
+ this.enabled = false; // the configured level drives state via alwaysEnabled
94
+ this.alwaysEnabled = true;
95
+ logger.info(`Extended thinking level=${level} (budget: ${budget} tokens)`);
96
+ }
70
97
  /**
71
98
  * Get the thinking configuration to merge into API request parameters.
72
99
  * Returns an object with a `thinking` key when enabled, or an empty object when disabled.
@@ -77,11 +77,18 @@ export declare class InfrastructureFacade {
77
77
  * Get the MCP client instance (for advanced operations)
78
78
  */
79
79
  getMCPClient(): MCPClient;
80
+ /** Resolves once initializeMCP() has finished connecting servers (or failed
81
+ * softly). Callers that need MCP tools available — notably headless one-shot
82
+ * runs — can await getMCPReady() instead of racing the fire-and-forget init. */
83
+ private mcpReady;
80
84
  /**
81
- * Initialize MCP servers asynchronously
82
- * This is a fire-and-forget operation
85
+ * Initialize MCP servers asynchronously. Kicks off in the background (the
86
+ * constructor path stays non-blocking), but the readiness promise is captured
87
+ * so a one-shot/headless caller can await getMCPReady() before its first turn.
83
88
  */
84
89
  initializeMCP(): void;
90
+ /** Promise that resolves when MCP server initialization has settled. */
91
+ getMCPReady(): Promise<void>;
85
92
  /**
86
93
  * Get the ICM bridge instance for memory operations
87
94
  */
@@ -67,12 +67,17 @@ export class InfrastructureFacade {
67
67
  getMCPClient() {
68
68
  return this.mcpClient;
69
69
  }
70
+ /** Resolves once initializeMCP() has finished connecting servers (or failed
71
+ * softly). Callers that need MCP tools available — notably headless one-shot
72
+ * runs — can await getMCPReady() instead of racing the fire-and-forget init. */
73
+ mcpReady = Promise.resolve();
70
74
  /**
71
- * Initialize MCP servers asynchronously
72
- * This is a fire-and-forget operation
75
+ * Initialize MCP servers asynchronously. Kicks off in the background (the
76
+ * constructor path stays non-blocking), but the readiness promise is captured
77
+ * so a one-shot/headless caller can await getMCPReady() before its first turn.
73
78
  */
74
79
  initializeMCP() {
75
- (async () => {
80
+ this.mcpReady = (async () => {
76
81
  try {
77
82
  const config = loadMCPConfig();
78
83
  if (config.servers.length > 0) {
@@ -87,9 +92,13 @@ export class InfrastructureFacade {
87
92
  catch (error) {
88
93
  logger.warn('MCP initialization failed', { error: getErrorMessage(error) });
89
94
  }
90
- })().catch((error) => {
91
- logger.warn('Uncaught error in MCP initialization', { error: getErrorMessage(error) });
92
- });
95
+ })();
96
+ // Never let this become an unhandled rejection for callers that don't await.
97
+ void this.mcpReady.catch(() => { });
98
+ }
99
+ /** Promise that resolves when MCP server initialization has settled. */
100
+ getMCPReady() {
101
+ return this.mcpReady;
93
102
  }
94
103
  /**
95
104
  * Get the ICM bridge instance for memory operations
@@ -10,6 +10,8 @@ import { spawnSync } from 'child_process';
10
10
  import { mkdir, mkdtemp, stat } from 'fs/promises';
11
11
  import { tmpdir } from 'os';
12
12
  import { isAbsolute, join, resolve } from 'path';
13
+ import { executeBrowserUseAction } from '../browser-automation/browser-use-runner.js';
14
+ import { closeCamofox, launchCamofox } from '../browser-automation/camofox-runner.js';
13
15
  const require = createRequire(import.meta.url);
14
16
  function presentEnvKeys(env, keys) {
15
17
  return keys.filter((key) => Boolean(env[key]?.trim()));
@@ -143,15 +145,17 @@ function browserUseBackend(env) {
143
145
  label: 'Browser Use gateway',
144
146
  officialSurface: 'Browser Use managed browser mode',
145
147
  status: configured ? 'configured' : 'missing',
146
- installed: false,
148
+ installed: true,
147
149
  configured,
148
- runnable: false,
150
+ runnable: configured,
149
151
  command: null,
150
152
  version: null,
151
153
  credentialSources,
152
- smokeCommand: null,
153
- notes: ['Tracked for Hermes parity; Code Buddy does not yet expose a first-class Browser Use runtime runner.'],
154
- remediation: ['Use local Playwright today, or wire the Nous Tool Gateway before claiming Browser Use backend parity.'],
154
+ smokeCommand: configured ? 'buddy hermes browser-smoke browser-use --json' : null,
155
+ notes: ['Browser Use runner routes actions through the Browser Use API or Nous Tool Gateway (src/browser-automation/browser-use-runner.ts).'],
156
+ remediation: configured
157
+ ? []
158
+ : ['Set BROWSER_USE_API_KEY or CODEBUDDY_NOUS_TOOL_GATEWAY_URL to enable the Browser Use backend.'],
155
159
  };
156
160
  }
157
161
  function firecrawlBackend(env) {
@@ -184,13 +188,13 @@ function camofoxBackend(env) {
184
188
  status: installed ? 'available' : 'missing',
185
189
  installed,
186
190
  configured: installed,
187
- runnable: false,
191
+ runnable: installed,
188
192
  command: installed ? (camofox.ok ? 'camofox' : 'camoufox') : null,
189
193
  version: installed ? firstLine(camoufox.output) : null,
190
194
  credentialSources: [],
191
- smokeCommand: null,
192
- notes: ['Detected only as an optional upstream-compatible backend; no Code Buddy runner is wired yet.'],
193
- remediation: installed ? ['Wire a first-class runner before claiming Camofox parity.'] : ['Install Camofox/Camoufox only if this backend is required.'],
195
+ smokeCommand: installed ? 'buddy hermes browser-smoke camofox --json' : null,
196
+ notes: ['Camofox runner launches the anti-detect Firefox Playwright server and connects via firefox.connect() (src/browser-automation/camofox-runner.ts).'],
197
+ remediation: installed ? [] : ['Install Camofox/Camoufox only if this backend is required.'],
194
198
  };
195
199
  }
196
200
  function recordingBackend() {
@@ -271,13 +275,13 @@ function browserRouteGateReason(backend) {
271
275
  return 'Browserbase is configured but excluded from auto browser routing; use the explicit smoke runner for managed sessions.';
272
276
  }
273
277
  if (backend.id === 'browser-use' && backend.configured) {
274
- return 'Browser Use is configured but excluded from auto browser routing until the Nous Tool Gateway runner is wired.';
278
+ return null; // Browser Use runner is wired eligible for auto-routing.
275
279
  }
276
280
  if (backend.id === 'firecrawl' && backend.configured) {
277
281
  return 'Firecrawl is configured but excluded from auto browser routing because it is an extraction backend, not an interactive browser session.';
278
282
  }
279
283
  if (backend.id === 'camofox' && backend.installed) {
280
- return 'Camofox/Camoufox is installed but excluded from auto browser routing until a first-class runner exists.';
284
+ return null; // Camofox runner is wired eligible for auto-routing.
281
285
  }
282
286
  return null;
283
287
  }
@@ -538,6 +542,136 @@ async function runBrowserbaseSmoke(now, env) {
538
542
  }
539
543
  }
540
544
  }
545
+ async function runBrowserUseSmoke(now, env) {
546
+ const started = now();
547
+ const startedAtMs = Date.now();
548
+ const apiKey = env.BROWSER_USE_API_KEY?.trim();
549
+ const gatewayUrl = env.CODEBUDDY_NOUS_TOOL_GATEWAY_URL?.trim();
550
+ if (!apiKey && !gatewayUrl) {
551
+ return {
552
+ backendId: 'browser-use',
553
+ command: null,
554
+ durationMs: Math.max(0, Date.now() - startedAtMs),
555
+ finishedAt: now().toISOString(),
556
+ label: 'Browser Use gateway',
557
+ ok: false,
558
+ output: 'BROWSER_USE_API_KEY or CODEBUDDY_NOUS_TOOL_GATEWAY_URL is required for browser-use smoke.',
559
+ startedAt: started.toISOString(),
560
+ status: 'not-runnable',
561
+ stdout: '',
562
+ stderr: 'BROWSER_USE_API_KEY or CODEBUDDY_NOUS_TOOL_GATEWAY_URL is required for browser-use smoke.',
563
+ };
564
+ }
565
+ const result = await executeBrowserUseAction('Open the page and report the title or main heading.', 'https://example.com', {
566
+ apiKey,
567
+ gatewayUrl,
568
+ timeout: 60_000,
569
+ });
570
+ const output = result.content ?? (result.screenshot ? 'Browser Use returned screenshot data.' : '');
571
+ return {
572
+ backendId: 'browser-use',
573
+ command: null,
574
+ durationMs: Math.max(0, Date.now() - startedAtMs),
575
+ finishedAt: now().toISOString(),
576
+ label: 'Browser Use gateway',
577
+ ok: result.ok,
578
+ output: result.ok ? output : result.error ?? 'Browser Use smoke failed.',
579
+ startedAt: started.toISOString(),
580
+ status: result.ok ? 'passed' : 'failed',
581
+ stdout: result.ok ? output : '',
582
+ stderr: result.ok ? '' : result.error ?? 'Browser Use smoke failed.',
583
+ };
584
+ }
585
+ async function runCamofoxSmoke(now, env) {
586
+ const started = now();
587
+ const startedAtMs = Date.now();
588
+ const binaryPath = env.CODEBUDDY_CAMOFOX_BINARY?.trim() || undefined;
589
+ const pythonPath = env.CODEBUDDY_CAMOFOX_PYTHON?.trim() || undefined;
590
+ // Camoufox is Firefox: launch its Playwright server and connect via
591
+ // firefox.connect() — NOT chromium.connectOverCDP(). The launch step returns
592
+ // a Playwright-server wsEndpoint; the connect below proves the repo's pinned
593
+ // Playwright can actually drive it (this is where the version-lock, if any,
594
+ // surfaces honestly rather than being faked as success on the endpoint alone).
595
+ const result = await launchCamofox({
596
+ binaryPath,
597
+ pythonPath,
598
+ headless: true,
599
+ timeout: 30_000,
600
+ });
601
+ if (!result.ok) {
602
+ const message = result.error ?? 'Camofox smoke failed.';
603
+ return {
604
+ backendId: 'camofox',
605
+ command: binaryPath ?? pythonPath ?? null,
606
+ durationMs: Math.max(0, Date.now() - startedAtMs),
607
+ finishedAt: now().toISOString(),
608
+ label: 'Camofox / Camoufox',
609
+ ok: false,
610
+ output: message,
611
+ startedAt: started.toISOString(),
612
+ status: /not (found|importable)|No module named/i.test(message) ? 'not-runnable' : 'failed',
613
+ stdout: '',
614
+ stderr: message,
615
+ };
616
+ }
617
+ const wsEndpoint = result.wsEndpoint;
618
+ let browser = null;
619
+ let context = null;
620
+ try {
621
+ const playwright = await import('playwright');
622
+ browser = await playwright.firefox.connect(wsEndpoint);
623
+ context = await browser.newContext();
624
+ const page = await context.newPage();
625
+ await page.goto('data:text/html,<title>OK-HERMES-CAMOFOX</title><h1>OK-HERMES-CAMOFOX</h1>', {
626
+ waitUntil: 'domcontentloaded',
627
+ });
628
+ const title = await page.title();
629
+ const heading = await page.locator('h1').textContent();
630
+ const ok = title === 'OK-HERMES-CAMOFOX' && heading === 'OK-HERMES-CAMOFOX';
631
+ const output = `title=${title}; heading=${heading ?? ''}; pid=${result.pid ?? 'unknown'}`;
632
+ return {
633
+ backendId: 'camofox',
634
+ command: binaryPath ?? pythonPath ?? null,
635
+ durationMs: Math.max(0, Date.now() - startedAtMs),
636
+ finishedAt: now().toISOString(),
637
+ label: 'Camofox / Camoufox',
638
+ ok,
639
+ output,
640
+ startedAt: started.toISOString(),
641
+ status: ok ? 'passed' : 'failed',
642
+ stdout: ok ? output : '',
643
+ stderr: ok ? '' : 'Unexpected Camofox page content.',
644
+ // Never expose the host:port wsEndpoint in the result.
645
+ session: { url: 'camoufox-firefox-server' },
646
+ };
647
+ }
648
+ catch (error) {
649
+ // A Playwright version-guard mismatch (server driver vs repo client) lands
650
+ // here. Report it honestly as a failure with the connect error message —
651
+ // do not fall back to a fake success.
652
+ const message = errorMessage(error);
653
+ return {
654
+ backendId: 'camofox',
655
+ command: binaryPath ?? pythonPath ?? null,
656
+ durationMs: Math.max(0, Date.now() - startedAtMs),
657
+ finishedAt: now().toISOString(),
658
+ label: 'Camofox / Camoufox',
659
+ ok: false,
660
+ output: message,
661
+ startedAt: started.toISOString(),
662
+ status: 'failed',
663
+ stdout: '',
664
+ stderr: message,
665
+ };
666
+ }
667
+ finally {
668
+ await context?.close().catch(() => undefined);
669
+ await browser?.close().catch(() => undefined);
670
+ if (result.pid) {
671
+ await closeCamofox(result.pid).catch(() => undefined);
672
+ }
673
+ }
674
+ }
541
675
  async function runLocalPlaywrightSmoke(now, options = {}) {
542
676
  const started = now();
543
677
  const startedAtMs = Date.now();
@@ -700,6 +834,12 @@ export async function runHermesBrowserBackendSmoke(options) {
700
834
  if (backend.id === 'browserbase') {
701
835
  return runBrowserbaseSmoke(now, env);
702
836
  }
837
+ if (backend.id === 'browser-use') {
838
+ return runBrowserUseSmoke(now, env);
839
+ }
840
+ if (backend.id === 'camofox') {
841
+ return runCamofoxSmoke(now, env);
842
+ }
703
843
  if (!backend.runnable) {
704
844
  return blockedSmokeResult(backend.id, 'not-runnable', `${backend.label} is not runnable on this host.`, {
705
845
  backend,
@@ -100,6 +100,65 @@ export interface ClawAgentBehaviorSettings {
100
100
  * are mapped; everything else stays archived for manual review.
101
101
  */
102
102
  export declare function mapClawAgentBehavior(cfg: Record<string, unknown>): ClawAgentBehaviorSettings;
103
+ /**
104
+ * Cron job entry as translated from an OpenClaw `cronJobs` array element into
105
+ * the shape consumed by CronScheduler.addJob().
106
+ */
107
+ export interface ClawCronJobEntry {
108
+ name: string;
109
+ schedule: string;
110
+ task: string;
111
+ }
112
+ /**
113
+ * Map OpenClaw cron config to a list of CronJob-compatible entries.
114
+ *
115
+ * OpenClaw stores cron jobs as an array of `{ schedule, task, label? }` objects
116
+ * or — in 2026.6.x — under `scheduler.jobs`. Only entries with both a valid
117
+ * 5-field cron expression and a non-empty task string are mapped. Everything
118
+ * else is silently dropped (will remain in the archived raw slice if one
119
+ * exists).
120
+ */
121
+ export declare function mapClawCronJobs(cfg: Record<string, unknown>): ClawCronJobEntry[];
122
+ /**
123
+ * Map OpenClaw command allowlist into a flat string array of allowed command
124
+ * basenames / patterns, consumable by Code Buddy's command validator.
125
+ *
126
+ * OpenClaw stores these as a flat string array under `commandAllowlist`,
127
+ * `allowlist`, or `allowedCommands`. Items that look like credentials or paths
128
+ * outside of simple command names are filtered out.
129
+ */
130
+ export declare function mapClawCommandAllowlist(cfg: Record<string, unknown>): string[];
131
+ /**
132
+ * Map OpenClaw memory backend config to a Code Buddy memory provider name.
133
+ *
134
+ * Only well-known provider names are accepted; unknown strings are left
135
+ * unmapped (will stay in the archive). Credentials (API keys, URLs) in the
136
+ * memory backend config are never imported.
137
+ */
138
+ export declare function mapClawMemoryBackend(cfg: Record<string, unknown>): string | undefined;
139
+ /**
140
+ * Map OpenClaw exec timeout to a numeric millisecond value for Code Buddy's
141
+ * `execTimeout` setting.
142
+ *
143
+ * OpenClaw stores this as seconds (integer) or milliseconds (large integer).
144
+ * Values ≤ 0 are ignored. Values that look like seconds (≤ 3600) are
145
+ * multiplied by 1000. Clamped to a maximum of 3600000 ms (1 hour).
146
+ */
147
+ export declare function mapClawExecTimeout(cfg: Record<string, unknown>): number | undefined;
148
+ /**
149
+ * Vision config fields that Code Buddy consumes.
150
+ */
151
+ export interface ClawVisionSettings {
152
+ visionEnabled?: boolean;
153
+ visionModel?: string;
154
+ }
155
+ /**
156
+ * Map OpenClaw vision settings to Code Buddy's vision config keys.
157
+ *
158
+ * Only the `enabled` boolean and `model` string are imported. Provider
159
+ * credentials, endpoint URLs, and other complex fields are left archived.
160
+ */
161
+ export declare function mapClawVisionSettings(cfg: Record<string, unknown>): ClawVisionSettings;
103
162
  /** Build the migration plan (read-only; no writes). */
104
163
  export declare function buildClawMigrationPlan(opts?: ClawMigrationOptions): ClawMigrationEntry[];
105
164
  /**