@phuetz/code-buddy 1.1.0 → 1.2.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 (291) hide show
  1. package/README.md +160 -165
  2. package/dist/agent/autonomous/agentic-coding-contract.d.ts +6 -6
  3. package/dist/agent/codebuddy-agent.d.ts +1 -1
  4. package/dist/agent/codebuddy-agent.js +69 -14
  5. package/dist/agent/execution/agent-executor.js +122 -12
  6. package/dist/agent/execution/tool-dependency-graph.js +7 -0
  7. package/dist/agent/execution/tool-hooks.d.ts +6 -0
  8. package/dist/agent/execution/tool-hooks.js +13 -5
  9. package/dist/agent/execution/tool-selection-strategy.d.ts +11 -2
  10. package/dist/agent/execution/tool-selection-strategy.js +67 -10
  11. package/dist/agent/extended-thinking.d.ts +8 -0
  12. package/dist/agent/extended-thinking.js +27 -0
  13. package/dist/agent/hermes-browser-backends.js +151 -11
  14. package/dist/agent/hermes-claw-migrate.d.ts +59 -0
  15. package/dist/agent/hermes-claw-migrate.js +427 -26
  16. package/dist/agent/hermes-parity-manifest.js +78 -71
  17. package/dist/agent/hermes-runtime-lifecycle.d.ts +67 -0
  18. package/dist/agent/hermes-runtime-lifecycle.js +468 -0
  19. package/dist/agent/middleware/index.d.ts +1 -0
  20. package/dist/agent/middleware/index.js +1 -0
  21. package/dist/agent/middleware/visual-validation-middleware.d.ts +17 -0
  22. package/dist/agent/middleware/visual-validation-middleware.js +67 -0
  23. package/dist/agent/model-benchmark.d.ts +77 -0
  24. package/dist/agent/model-benchmark.js +309 -0
  25. package/dist/agent/model-tier.d.ts +14 -0
  26. package/dist/agent/model-tier.js +71 -0
  27. package/dist/agent/multi-agent/agents/orchestrator-agent.js +17 -6
  28. package/dist/agent/multi-agent/multi-agent-system.js +3 -1
  29. package/dist/agent/multi-agent/session-fleet-bridge.d.ts +2 -0
  30. package/dist/agent/multi-agent/session-fleet-bridge.js +9 -1
  31. package/dist/agent/multi-agent/session-tools.js +22 -5
  32. package/dist/agent/reasoning/mcts.js +20 -6
  33. package/dist/agent/session-end-flush.d.ts +6 -1
  34. package/dist/agent/session-end-flush.js +20 -4
  35. package/dist/agent/streaming/streaming-handler.d.ts +7 -0
  36. package/dist/agent/streaming/streaming-handler.js +8 -1
  37. package/dist/agent/tool-executor.js +1 -0
  38. package/dist/agent/tool-handler.d.ts +5 -0
  39. package/dist/agent/tool-handler.js +130 -4
  40. package/dist/browser-automation/browser-operator-executor.js +15 -0
  41. package/dist/browser-automation/browser-use-runner.d.ts +96 -0
  42. package/dist/browser-automation/browser-use-runner.js +492 -0
  43. package/dist/browser-automation/camofox-runner.d.ts +107 -0
  44. package/dist/browser-automation/camofox-runner.js +287 -0
  45. package/dist/channels/dingtalk/index.js +3 -0
  46. package/dist/channels/discord/client.d.ts +9 -0
  47. package/dist/channels/discord/client.js +12 -0
  48. package/dist/channels/feishu/index.d.ts +167 -1
  49. package/dist/channels/feishu/index.js +432 -7
  50. package/dist/channels/gateway-lifecycle.d.ts +132 -0
  51. package/dist/channels/gateway-lifecycle.js +219 -0
  52. package/dist/channels/google-chat/index.d.ts +5 -1
  53. package/dist/channels/google-chat/index.js +5 -1
  54. package/dist/channels/imessage/index.d.ts +14 -0
  55. package/dist/channels/imessage/index.js +64 -17
  56. package/dist/channels/index.d.ts +4 -0
  57. package/dist/channels/index.js +4 -0
  58. package/dist/channels/irc/index.d.ts +73 -3
  59. package/dist/channels/irc/index.js +446 -11
  60. package/dist/channels/line/index.js +3 -0
  61. package/dist/channels/mattermost/index.d.ts +51 -4
  62. package/dist/channels/mattermost/index.js +303 -20
  63. package/dist/channels/nextcloud-talk/index.d.ts +89 -8
  64. package/dist/channels/nextcloud-talk/index.js +367 -16
  65. package/dist/channels/nostr/index.d.ts +121 -1
  66. package/dist/channels/nostr/index.js +396 -8
  67. package/dist/channels/ntfy/index.js +3 -0
  68. package/dist/channels/qq/index.js +3 -0
  69. package/dist/channels/slash-parity.d.ts +117 -0
  70. package/dist/channels/slash-parity.js +185 -0
  71. package/dist/channels/synology-chat/index.js +3 -0
  72. package/dist/channels/teams/index.d.ts +3 -0
  73. package/dist/channels/teams/index.js +3 -0
  74. package/dist/channels/telegram/client.d.ts +9 -0
  75. package/dist/channels/telegram/client.js +12 -0
  76. package/dist/channels/twilio-voice/index.js +3 -0
  77. package/dist/channels/webchat/index.d.ts +7 -1
  78. package/dist/channels/webchat/index.js +7 -1
  79. package/dist/channels/wecom/index.js +3 -0
  80. package/dist/channels/weixin/index.js +3 -0
  81. package/dist/channels/zalo/index.js +3 -0
  82. package/dist/cli/config-loader.js +1 -1
  83. package/dist/codebuddy/client.d.ts +30 -1
  84. package/dist/codebuddy/client.js +167 -20
  85. package/dist/codebuddy/providers/provider-chatgpt-responses.d.ts +5 -0
  86. package/dist/codebuddy/providers/provider-chatgpt-responses.js +1 -0
  87. package/dist/codebuddy/providers/provider-gemini-native.js +1 -1
  88. package/dist/codebuddy/providers/provider-openai-compat.d.ts +5 -0
  89. package/dist/codebuddy/providers/provider-openai-compat.js +82 -2
  90. package/dist/codebuddy/tool-definitions/computer-control-tools.js +32 -2
  91. package/dist/codebuddy/tool-definitions/core-tools.js +3 -3
  92. package/dist/codebuddy/tool-definitions/index.d.ts +2 -1
  93. package/dist/codebuddy/tool-definitions/index.js +2 -1
  94. package/dist/codebuddy/tool-definitions/multimodal-tools.d.ts +1 -0
  95. package/dist/codebuddy/tool-definitions/multimodal-tools.js +44 -1
  96. package/dist/codebuddy/tool-definitions/windows-tools.d.ts +2 -0
  97. package/dist/codebuddy/tool-definitions/windows-tools.js +34 -0
  98. package/dist/codebuddy/tools.d.ts +1 -1
  99. package/dist/codebuddy/tools.js +27 -24
  100. package/dist/commands/cli/hermes-commands.js +108 -0
  101. package/dist/commands/cli/native-engine-commands.js +102 -3
  102. package/dist/commands/cli/utility-commands.js +45 -0
  103. package/dist/commands/enhanced-command-handler.js +1 -1
  104. package/dist/commands/goal-cli.d.ts +30 -0
  105. package/dist/commands/goal-cli.js +210 -27
  106. package/dist/commands/handlers/goal-handler.d.ts +9 -2
  107. package/dist/commands/handlers/goal-handler.js +36 -9
  108. package/dist/commands/handlers/infra-handlers.js +36 -0
  109. package/dist/commands/handlers/memory-handlers.js +96 -1
  110. package/dist/commands/headless-slash.d.ts +2 -0
  111. package/dist/commands/headless-slash.js +12 -0
  112. package/dist/commands/llm-provider-resolution.d.ts +5 -3
  113. package/dist/commands/llm-provider-resolution.js +87 -33
  114. package/dist/commands/ollama.d.ts +25 -0
  115. package/dist/commands/ollama.js +100 -0
  116. package/dist/commands/provider.d.ts +5 -0
  117. package/dist/commands/provider.js +106 -55
  118. package/dist/commands/spec-next.js +2 -1
  119. package/dist/commands/spec-plan.js +5 -16
  120. package/dist/commands/tunnel.d.ts +2 -0
  121. package/dist/commands/tunnel.js +48 -0
  122. package/dist/config/config-resolver.d.ts +2 -1
  123. package/dist/config/config-resolver.js +54 -41
  124. package/dist/config/constants.d.ts +28 -0
  125. package/dist/config/constants.js +7 -0
  126. package/dist/config/env-schema.js +756 -0
  127. package/dist/config/model-tools.js +4 -4
  128. package/dist/config/toml-config.d.ts +16 -0
  129. package/dist/config/toml-config.js +3 -0
  130. package/dist/context/context-manager-v2.js +1 -0
  131. package/dist/daemon/autonomous-daemon.d.ts +1 -1
  132. package/dist/daemon/autonomous-daemon.js +3 -3
  133. package/dist/daemon/autonomous-loop.js +11 -2
  134. package/dist/daemon/colab-goal.js +9 -1
  135. package/dist/daemon/cron-agent-bridge.d.ts +12 -3
  136. package/dist/daemon/cron-agent-bridge.js +25 -9
  137. package/dist/desktop/codebuddy-engine-adapter.d.ts +32 -0
  138. package/dist/desktop/codebuddy-engine-adapter.js +257 -80
  139. package/dist/desktop/engine-adapter.d.ts +14 -0
  140. package/dist/desktop-automation/automation-manager.js +16 -0
  141. package/dist/desktop-automation/omniparser-runner.d.ts +63 -0
  142. package/dist/desktop-automation/omniparser-runner.js +115 -0
  143. package/dist/desktop-automation/smart-snapshot.d.ts +11 -0
  144. package/dist/desktop-automation/smart-snapshot.js +72 -5
  145. package/dist/doctor/index.js +40 -23
  146. package/dist/events/types.d.ts +11 -0
  147. package/dist/fleet/colab-store.js +14 -2
  148. package/dist/fleet/peer-session-bridge.js +50 -12
  149. package/dist/fleet/peer-tool-bridge.js +14 -0
  150. package/dist/goals/goal-decomposer.d.ts +27 -0
  151. package/dist/goals/goal-decomposer.js +293 -0
  152. package/dist/goals/goal-judge-client.d.ts +15 -0
  153. package/dist/goals/goal-judge-client.js +45 -0
  154. package/dist/goals/goal-judge.d.ts +2 -0
  155. package/dist/goals/goal-judge.js +35 -6
  156. package/dist/goals/goal-loop.d.ts +14 -0
  157. package/dist/goals/goal-loop.js +47 -2
  158. package/dist/goals/goal-manager.d.ts +6 -0
  159. package/dist/goals/goal-manager.js +67 -14
  160. package/dist/goals/goal-state.d.ts +13 -0
  161. package/dist/goals/goal-state.js +83 -13
  162. package/dist/goals/goal-store.d.ts +3 -0
  163. package/dist/goals/goal-store.js +31 -15
  164. package/dist/hooks/user-hooks.js +17 -3
  165. package/dist/index.js +464 -25
  166. package/dist/input/text-to-speech.d.ts +2 -6
  167. package/dist/input/text-to-speech.js +2 -27
  168. package/dist/integrations/screenpipe/screenpipe-client.d.ts +10 -0
  169. package/dist/integrations/screenpipe/screenpipe-client.js +12 -2
  170. package/dist/integrations/tailscale.d.ts +13 -0
  171. package/dist/integrations/tailscale.js +87 -34
  172. package/dist/knowledge/workspace-indexer.js +53 -9
  173. package/dist/mcp/client.js +1 -0
  174. package/dist/mcp/mcp-desktop-tools.d.ts +23 -0
  175. package/dist/mcp/mcp-desktop-tools.js +158 -0
  176. package/dist/mcp/mcp-server.js +2 -0
  177. package/dist/memory/enhanced-memory.d.ts +10 -0
  178. package/dist/memory/enhanced-memory.js +33 -2
  179. package/dist/memory/index.d.ts +3 -1
  180. package/dist/memory/index.js +4 -1
  181. package/dist/memory/memory-auto-proposer.d.ts +23 -0
  182. package/dist/memory/memory-auto-proposer.js +308 -0
  183. package/dist/memory/memory-candidate-queue.d.ts +92 -0
  184. package/dist/memory/memory-candidate-queue.js +261 -0
  185. package/dist/memory/persistent-memory.d.ts +45 -2
  186. package/dist/memory/persistent-memory.js +236 -40
  187. package/dist/ml/bayesian-qualifier.d.ts +1 -1
  188. package/dist/ml/bayesian-qualifier.js +35 -2
  189. package/dist/openclaw/gateway-bridge.js +5 -0
  190. package/dist/plugins/marketplace.d.ts +1 -0
  191. package/dist/plugins/marketplace.js +7 -0
  192. package/dist/prompts/execution-discipline.d.ts +14 -0
  193. package/dist/prompts/execution-discipline.js +29 -0
  194. package/dist/prompts/variation-injector.js +9 -2
  195. package/dist/protocols/acp/acp-agentic-runner.d.ts +7 -6
  196. package/dist/protocols/acp/acp-agentic-runner.js +115 -18
  197. package/dist/protocols/acp/acp-session-store.d.ts +23 -0
  198. package/dist/protocols/acp/acp-session-store.js +77 -0
  199. package/dist/protocols/acp/acp-stdio-server.d.ts +7 -0
  200. package/dist/protocols/acp/acp-stdio-server.js +71 -16
  201. package/dist/providers/active-llm-registry.d.ts +37 -0
  202. package/dist/providers/active-llm-registry.js +186 -0
  203. package/dist/providers/auxiliary-provider.d.ts +25 -0
  204. package/dist/providers/auxiliary-provider.js +192 -0
  205. package/dist/providers/codex-oauth.d.ts +1 -1
  206. package/dist/providers/codex-oauth.js +27 -4
  207. package/dist/providers/index.d.ts +3 -0
  208. package/dist/providers/index.js +4 -0
  209. package/dist/providers/provider-catalog.d.ts +70 -0
  210. package/dist/providers/provider-catalog.js +738 -0
  211. package/dist/providers/provider-fallback.d.ts +35 -0
  212. package/dist/providers/provider-fallback.js +171 -0
  213. package/dist/providers/xai-oauth.d.ts +128 -0
  214. package/dist/providers/xai-oauth.js +735 -0
  215. package/dist/scheduler/cron-scheduler.d.ts +15 -3
  216. package/dist/scheduler/cron-scheduler.js +53 -7
  217. package/dist/scheduler/script-runner.d.ts +2 -0
  218. package/dist/scheduler/script-runner.js +19 -4
  219. package/dist/scheduler/watchdog-handlers.js +7 -20
  220. package/dist/search/usearch-index.js +7 -2
  221. package/dist/security/tool-policy/tool-groups.js +2 -0
  222. package/dist/server/index.js +17 -2
  223. package/dist/server/routes/mobile.d.ts +12 -4
  224. package/dist/server/routes/mobile.js +116 -1
  225. package/dist/server/tls-config.d.ts +35 -0
  226. package/dist/server/tls-config.js +142 -0
  227. package/dist/server/tunnel-manager.d.ts +20 -0
  228. package/dist/server/tunnel-manager.js +58 -0
  229. package/dist/server/websocket/fleet-bridge.js +5 -0
  230. package/dist/services/prompt-builder.d.ts +1 -0
  231. package/dist/services/prompt-builder.js +49 -8
  232. package/dist/shared/engine-types.d.ts +15 -1
  233. package/dist/sidecar/sidecar-bridge.d.ts +1 -0
  234. package/dist/sidecar/sidecar-bridge.js +21 -10
  235. package/dist/spec/spec-store.js +8 -1
  236. package/dist/talk-mode/providers/audioreader-tts.d.ts +1 -1
  237. package/dist/talk-mode/providers/audioreader-tts.js +8 -8
  238. package/dist/templates/project-scaffolding.js +3 -2
  239. package/dist/themes/theme-schema.d.ts +10 -10
  240. package/dist/tools/application-profiles.js +38 -0
  241. package/dist/tools/bash/bash-tool.d.ts +1 -0
  242. package/dist/tools/bash/bash-tool.js +16 -2
  243. package/dist/tools/bash/command-validator.js +3 -0
  244. package/dist/tools/bash/rtk-rewrite.d.ts +16 -0
  245. package/dist/tools/bash/rtk-rewrite.js +100 -0
  246. package/dist/tools/bash/streaming-executor.js +14 -1
  247. package/dist/tools/computer-control-tool.d.ts +16 -1
  248. package/dist/tools/computer-control-tool.js +317 -5
  249. package/dist/tools/document-generator.d.ts +14 -0
  250. package/dist/tools/document-generator.js +79 -0
  251. package/dist/tools/execute-code-rpc-invoker.d.ts +26 -2
  252. package/dist/tools/execute-code-rpc-invoker.js +46 -5
  253. package/dist/tools/metadata.js +28 -0
  254. package/dist/tools/office-macro-tool.d.ts +10 -0
  255. package/dist/tools/office-macro-tool.js +93 -0
  256. package/dist/tools/registry/index.d.ts +2 -1
  257. package/dist/tools/registry/index.js +2 -1
  258. package/dist/tools/registry/memory-tools.d.ts +20 -0
  259. package/dist/tools/registry/memory-tools.js +225 -3
  260. package/dist/tools/registry/multimodal-tools.js +2 -2
  261. package/dist/tools/registry/vision-tools.d.ts +33 -0
  262. package/dist/tools/registry/vision-tools.js +308 -6
  263. package/dist/tools/registry/windows-tools.d.ts +2 -0
  264. package/dist/tools/registry/windows-tools.js +47 -0
  265. package/dist/tools/route-peer-tool.js +14 -0
  266. package/dist/tools/screenshot-tool.js +14 -2
  267. package/dist/tools/text-to-speech-tool.d.ts +1 -1
  268. package/dist/tools/text-to-speech-tool.js +2 -12
  269. package/dist/tools/tool-selector.js +3 -59
  270. package/dist/utils/config-validation/schema.d.ts +40 -7
  271. package/dist/utils/config-validation/schema.js +130 -1
  272. package/dist/utils/cost-tracker.js +21 -1
  273. package/dist/utils/disk-guard.d.ts +180 -0
  274. package/dist/utils/disk-guard.js +404 -0
  275. package/dist/utils/interactive-setup.js +35 -2
  276. package/dist/utils/model-utils.js +11 -2
  277. package/dist/utils/output-sanitizer.js +11 -0
  278. package/dist/utils/provider-detector.d.ts +8 -7
  279. package/dist/utils/provider-detector.js +19 -77
  280. package/dist/utils/settings-manager.d.ts +7 -0
  281. package/dist/utils/token-display.d.ts +3 -3
  282. package/dist/utils/token-display.js +22 -4
  283. package/dist/wizard/onboarding.d.ts +39 -0
  284. package/dist/wizard/onboarding.js +433 -21
  285. package/dist/wizard/provider-onboarding.d.ts +8 -23
  286. package/dist/wizard/provider-onboarding.js +39 -158
  287. package/package.json +4 -2
  288. package/dist/plugins/provider-onboarding.d.ts +0 -23
  289. package/dist/plugins/provider-onboarding.js +0 -116
  290. package/dist/utils/kokoro-tts.d.ts +0 -8
  291. package/dist/utils/kokoro-tts.js +0 -67
@@ -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.
@@ -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
  /**