clawdbot 2026.1.4-1

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 (550) hide show
  1. package/CHANGELOG.md +120 -0
  2. package/LICENSE +21 -0
  3. package/README-header.png +0 -0
  4. package/README.md +297 -0
  5. package/dist/agents/agent-paths.js +17 -0
  6. package/dist/agents/bash-process-registry.js +126 -0
  7. package/dist/agents/bash-tools.js +837 -0
  8. package/dist/agents/clawdbot-tools.js +30 -0
  9. package/dist/agents/clawdis-tools.js +27 -0
  10. package/dist/agents/context.js +34 -0
  11. package/dist/agents/defaults.js +6 -0
  12. package/dist/agents/model-auth.js +112 -0
  13. package/dist/agents/model-catalog.js +55 -0
  14. package/dist/agents/model-fallback.js +191 -0
  15. package/dist/agents/model-scan.js +263 -0
  16. package/dist/agents/model-selection.js +116 -0
  17. package/dist/agents/models-config.js +49 -0
  18. package/dist/agents/pi-embedded-helpers.js +74 -0
  19. package/dist/agents/pi-embedded-runner.js +407 -0
  20. package/dist/agents/pi-embedded-subscribe.js +568 -0
  21. package/dist/agents/pi-embedded-utils.js +20 -0
  22. package/dist/agents/pi-embedded.js +1 -0
  23. package/dist/agents/pi-oauth.js +88 -0
  24. package/dist/agents/pi-tools.js +433 -0
  25. package/dist/agents/sandbox-paths.js +68 -0
  26. package/dist/agents/sandbox.js +644 -0
  27. package/dist/agents/shell-utils.js +53 -0
  28. package/dist/agents/skills-install.js +244 -0
  29. package/dist/agents/skills-status.js +157 -0
  30. package/dist/agents/skills.js +470 -0
  31. package/dist/agents/steerable-agent-loop.js +338 -0
  32. package/dist/agents/steerable-provider-transport.js +48 -0
  33. package/dist/agents/system-prompt.js +104 -0
  34. package/dist/agents/tool-display.js +162 -0
  35. package/dist/agents/tool-images.js +138 -0
  36. package/dist/agents/tools/browser-tool.js +339 -0
  37. package/dist/agents/tools/canvas-tool.js +193 -0
  38. package/dist/agents/tools/common.js +88 -0
  39. package/dist/agents/tools/cron-tool.js +124 -0
  40. package/dist/agents/tools/discord-actions-guild.js +186 -0
  41. package/dist/agents/tools/discord-actions-messaging.js +285 -0
  42. package/dist/agents/tools/discord-actions-moderation.js +70 -0
  43. package/dist/agents/tools/discord-actions.js +56 -0
  44. package/dist/agents/tools/discord-schema.js +199 -0
  45. package/dist/agents/tools/discord-tool.js +16 -0
  46. package/dist/agents/tools/gateway-tool.js +46 -0
  47. package/dist/agents/tools/gateway.js +27 -0
  48. package/dist/agents/tools/image-tool.js +132 -0
  49. package/dist/agents/tools/nodes-tool.js +413 -0
  50. package/dist/agents/tools/nodes-utils.js +92 -0
  51. package/dist/agents/tools/sessions-helpers.js +88 -0
  52. package/dist/agents/tools/sessions-history-tool.js +53 -0
  53. package/dist/agents/tools/sessions-list-tool.js +143 -0
  54. package/dist/agents/tools/sessions-send-helpers.js +100 -0
  55. package/dist/agents/tools/sessions-send-tool.js +347 -0
  56. package/dist/agents/tools/slack-actions.js +129 -0
  57. package/dist/agents/tools/slack-schema.js +59 -0
  58. package/dist/agents/tools/slack-tool.js +16 -0
  59. package/dist/agents/usage.js +39 -0
  60. package/dist/agents/workspace.js +241 -0
  61. package/dist/auto-reply/chunk.js +76 -0
  62. package/dist/auto-reply/envelope.js +38 -0
  63. package/dist/auto-reply/group-activation.js +20 -0
  64. package/dist/auto-reply/heartbeat.js +57 -0
  65. package/dist/auto-reply/model.js +14 -0
  66. package/dist/auto-reply/reply/abort.js +14 -0
  67. package/dist/auto-reply/reply/agent-runner.js +371 -0
  68. package/dist/auto-reply/reply/block-streaming.js +34 -0
  69. package/dist/auto-reply/reply/body.js +29 -0
  70. package/dist/auto-reply/reply/commands.js +207 -0
  71. package/dist/auto-reply/reply/directive-handling.js +361 -0
  72. package/dist/auto-reply/reply/directives.js +47 -0
  73. package/dist/auto-reply/reply/followup-runner.js +149 -0
  74. package/dist/auto-reply/reply/groups.js +91 -0
  75. package/dist/auto-reply/reply/mentions.js +38 -0
  76. package/dist/auto-reply/reply/model-selection.js +114 -0
  77. package/dist/auto-reply/reply/queue.js +399 -0
  78. package/dist/auto-reply/reply/reply-tags.js +26 -0
  79. package/dist/auto-reply/reply/session-updates.js +87 -0
  80. package/dist/auto-reply/reply/session.js +160 -0
  81. package/dist/auto-reply/reply/typing.js +75 -0
  82. package/dist/auto-reply/reply.js +535 -0
  83. package/dist/auto-reply/send-policy.js +28 -0
  84. package/dist/auto-reply/status.js +158 -0
  85. package/dist/auto-reply/templating.js +9 -0
  86. package/dist/auto-reply/thinking.js +49 -0
  87. package/dist/auto-reply/tokens.js +2 -0
  88. package/dist/auto-reply/tool-meta.js +74 -0
  89. package/dist/auto-reply/transcription.js +57 -0
  90. package/dist/auto-reply/types.js +1 -0
  91. package/dist/browser/bridge-server.js +37 -0
  92. package/dist/browser/cdp.js +382 -0
  93. package/dist/browser/chrome.js +432 -0
  94. package/dist/browser/client-actions-core.js +67 -0
  95. package/dist/browser/client-actions-observe.js +24 -0
  96. package/dist/browser/client-actions-types.js +1 -0
  97. package/dist/browser/client-actions.js +3 -0
  98. package/dist/browser/client-fetch.js +43 -0
  99. package/dist/browser/client.js +105 -0
  100. package/dist/browser/config.js +140 -0
  101. package/dist/browser/constants.js +4 -0
  102. package/dist/browser/profiles-service.js +122 -0
  103. package/dist/browser/profiles.js +85 -0
  104. package/dist/browser/pw-ai.js +2 -0
  105. package/dist/browser/pw-session.js +144 -0
  106. package/dist/browser/pw-tools-core.js +363 -0
  107. package/dist/browser/routes/agent.js +535 -0
  108. package/dist/browser/routes/basic.js +155 -0
  109. package/dist/browser/routes/index.js +8 -0
  110. package/dist/browser/routes/tabs.js +105 -0
  111. package/dist/browser/routes/utils.js +62 -0
  112. package/dist/browser/screenshot.js +40 -0
  113. package/dist/browser/server-context.js +377 -0
  114. package/dist/browser/server.js +81 -0
  115. package/dist/browser/target-id.js +18 -0
  116. package/dist/browser/trash.js +21 -0
  117. package/dist/canvas-host/a2ui/.bundle.hash +1 -0
  118. package/dist/canvas-host/a2ui/a2ui.bundle.js +17768 -0
  119. package/dist/canvas-host/a2ui/index.html +246 -0
  120. package/dist/canvas-host/a2ui.js +187 -0
  121. package/dist/canvas-host/server.js +382 -0
  122. package/dist/cli/browser-cli-actions-input.js +459 -0
  123. package/dist/cli/browser-cli-actions-observe.js +56 -0
  124. package/dist/cli/browser-cli-examples.js +31 -0
  125. package/dist/cli/browser-cli-inspect.js +97 -0
  126. package/dist/cli/browser-cli-manage.js +286 -0
  127. package/dist/cli/browser-cli-shared.js +1 -0
  128. package/dist/cli/browser-cli.js +26 -0
  129. package/dist/cli/canvas-cli.js +416 -0
  130. package/dist/cli/cron-cli.js +454 -0
  131. package/dist/cli/deps.js +17 -0
  132. package/dist/cli/dns-cli.js +180 -0
  133. package/dist/cli/gateway-cli.js +489 -0
  134. package/dist/cli/gateway-rpc.js +20 -0
  135. package/dist/cli/hooks-cli.js +135 -0
  136. package/dist/cli/models-cli.js +248 -0
  137. package/dist/cli/nodes-camera.js +57 -0
  138. package/dist/cli/nodes-canvas.js +26 -0
  139. package/dist/cli/nodes-cli.js +946 -0
  140. package/dist/cli/nodes-screen.js +37 -0
  141. package/dist/cli/parse-duration.js +20 -0
  142. package/dist/cli/ports.js +97 -0
  143. package/dist/cli/program.js +406 -0
  144. package/dist/cli/prompt.js +19 -0
  145. package/dist/cli/tui-cli.js +35 -0
  146. package/dist/cli/wait.js +8 -0
  147. package/dist/commands/agent.js +645 -0
  148. package/dist/commands/antigravity-oauth.js +327 -0
  149. package/dist/commands/configure.js +480 -0
  150. package/dist/commands/doctor.js +484 -0
  151. package/dist/commands/health.js +108 -0
  152. package/dist/commands/models/aliases.js +64 -0
  153. package/dist/commands/models/fallbacks.js +99 -0
  154. package/dist/commands/models/image-fallbacks.js +99 -0
  155. package/dist/commands/models/list.js +323 -0
  156. package/dist/commands/models/scan.js +266 -0
  157. package/dist/commands/models/set-image.js +23 -0
  158. package/dist/commands/models/set.js +23 -0
  159. package/dist/commands/models/shared.js +72 -0
  160. package/dist/commands/models.js +7 -0
  161. package/dist/commands/onboard-auth.js +70 -0
  162. package/dist/commands/onboard-helpers.js +295 -0
  163. package/dist/commands/onboard-interactive.js +17 -0
  164. package/dist/commands/onboard-non-interactive.js +202 -0
  165. package/dist/commands/onboard-providers.js +634 -0
  166. package/dist/commands/onboard-remote.js +120 -0
  167. package/dist/commands/onboard-skills.js +148 -0
  168. package/dist/commands/onboard-types.js +1 -0
  169. package/dist/commands/onboard.js +12 -0
  170. package/dist/commands/send.js +124 -0
  171. package/dist/commands/sessions.js +212 -0
  172. package/dist/commands/setup.js +58 -0
  173. package/dist/commands/signal-install.js +135 -0
  174. package/dist/commands/status.js +207 -0
  175. package/dist/commands/update.js +16 -0
  176. package/dist/config/config.js +6 -0
  177. package/dist/config/defaults.js +61 -0
  178. package/dist/config/io.js +147 -0
  179. package/dist/config/legacy-migrate.js +13 -0
  180. package/dist/config/legacy.js +159 -0
  181. package/dist/config/paths.js +71 -0
  182. package/dist/config/schema.js +150 -0
  183. package/dist/config/sessions.js +282 -0
  184. package/dist/config/talk.js +31 -0
  185. package/dist/config/types.js +1 -0
  186. package/dist/config/validation.js +29 -0
  187. package/dist/config/zod-schema.js +831 -0
  188. package/dist/control-ui/assets/index-BFID3yAA.css +1 -0
  189. package/dist/control-ui/assets/index-CE_axlTS.js +2235 -0
  190. package/dist/control-ui/assets/index-CE_axlTS.js.map +1 -0
  191. package/dist/control-ui/index.html +15 -0
  192. package/dist/cron/isolated-agent.js +499 -0
  193. package/dist/cron/run-log.js +72 -0
  194. package/dist/cron/schedule.js +24 -0
  195. package/dist/cron/service.js +471 -0
  196. package/dist/cron/store.js +43 -0
  197. package/dist/cron/types.js +1 -0
  198. package/dist/daemon/constants.js +10 -0
  199. package/dist/daemon/launchd.js +276 -0
  200. package/dist/daemon/legacy.js +63 -0
  201. package/dist/daemon/program-args.js +76 -0
  202. package/dist/daemon/schtasks.js +257 -0
  203. package/dist/daemon/service.js +60 -0
  204. package/dist/daemon/systemd.js +266 -0
  205. package/dist/discord/index.js +2 -0
  206. package/dist/discord/monitor.js +1188 -0
  207. package/dist/discord/probe.js +54 -0
  208. package/dist/discord/send.js +577 -0
  209. package/dist/discord/token.js +8 -0
  210. package/dist/gateway/auth.js +121 -0
  211. package/dist/gateway/call.js +94 -0
  212. package/dist/gateway/chat-attachments.js +41 -0
  213. package/dist/gateway/client.js +180 -0
  214. package/dist/gateway/config-reload.js +274 -0
  215. package/dist/gateway/control-ui.js +184 -0
  216. package/dist/gateway/hooks-mapping.js +282 -0
  217. package/dist/gateway/hooks.js +168 -0
  218. package/dist/gateway/net.js +29 -0
  219. package/dist/gateway/protocol/index.js +61 -0
  220. package/dist/gateway/protocol/schema.js +560 -0
  221. package/dist/gateway/server-bridge-subscriptions.js +93 -0
  222. package/dist/gateway/server-bridge.js +1013 -0
  223. package/dist/gateway/server-browser.js +12 -0
  224. package/dist/gateway/server-chat.js +159 -0
  225. package/dist/gateway/server-constants.js +8 -0
  226. package/dist/gateway/server-discovery.js +62 -0
  227. package/dist/gateway/server-http.js +165 -0
  228. package/dist/gateway/server-methods/agent-job.js +125 -0
  229. package/dist/gateway/server-methods/agent.js +250 -0
  230. package/dist/gateway/server-methods/chat.js +200 -0
  231. package/dist/gateway/server-methods/config.js +50 -0
  232. package/dist/gateway/server-methods/connect.js +6 -0
  233. package/dist/gateway/server-methods/cron.js +83 -0
  234. package/dist/gateway/server-methods/health.js +28 -0
  235. package/dist/gateway/server-methods/models.js +16 -0
  236. package/dist/gateway/server-methods/nodes.js +294 -0
  237. package/dist/gateway/server-methods/providers.js +217 -0
  238. package/dist/gateway/server-methods/send.js +166 -0
  239. package/dist/gateway/server-methods/sessions.js +305 -0
  240. package/dist/gateway/server-methods/skills.js +83 -0
  241. package/dist/gateway/server-methods/system.js +118 -0
  242. package/dist/gateway/server-methods/talk.js +22 -0
  243. package/dist/gateway/server-methods/types.js +1 -0
  244. package/dist/gateway/server-methods/voicewake.js +30 -0
  245. package/dist/gateway/server-methods/web.js +58 -0
  246. package/dist/gateway/server-methods/wizard.js +100 -0
  247. package/dist/gateway/server-methods.js +53 -0
  248. package/dist/gateway/server-providers.js +644 -0
  249. package/dist/gateway/server-shared.js +1 -0
  250. package/dist/gateway/server-utils.js +35 -0
  251. package/dist/gateway/server.js +1437 -0
  252. package/dist/gateway/session-utils.js +216 -0
  253. package/dist/gateway/ws-log.js +349 -0
  254. package/dist/gateway/ws-logging.js +8 -0
  255. package/dist/globals.js +41 -0
  256. package/dist/hooks/gmail-ops.js +236 -0
  257. package/dist/hooks/gmail-setup-utils.js +278 -0
  258. package/dist/hooks/gmail-watcher.js +175 -0
  259. package/dist/hooks/gmail.js +177 -0
  260. package/dist/imessage/client.js +165 -0
  261. package/dist/imessage/index.js +3 -0
  262. package/dist/imessage/monitor.js +272 -0
  263. package/dist/imessage/probe.js +26 -0
  264. package/dist/imessage/send.js +83 -0
  265. package/dist/imessage/targets.js +176 -0
  266. package/dist/index.js +50 -0
  267. package/dist/infra/agent-events.js +46 -0
  268. package/dist/infra/binaries.js +9 -0
  269. package/dist/infra/bonjour-discovery.js +163 -0
  270. package/dist/infra/bonjour.js +200 -0
  271. package/dist/infra/bridge/server.js +562 -0
  272. package/dist/infra/canvas-host-url.js +54 -0
  273. package/dist/infra/env.js +8 -0
  274. package/dist/infra/errors.js +28 -0
  275. package/dist/infra/gateway-lock.js +8 -0
  276. package/dist/infra/heartbeat-events.js +21 -0
  277. package/dist/infra/heartbeat-runner.js +453 -0
  278. package/dist/infra/heartbeat-wake.js +61 -0
  279. package/dist/infra/is-main.js +37 -0
  280. package/dist/infra/machine-name.js +40 -0
  281. package/dist/infra/node-pairing.js +211 -0
  282. package/dist/infra/pam.js +42 -0
  283. package/dist/infra/path-env.js +92 -0
  284. package/dist/infra/ports.js +87 -0
  285. package/dist/infra/provider-summary.js +80 -0
  286. package/dist/infra/restart.js +29 -0
  287. package/dist/infra/retry.js +16 -0
  288. package/dist/infra/runtime-guard.js +59 -0
  289. package/dist/infra/system-events.js +44 -0
  290. package/dist/infra/system-presence.js +216 -0
  291. package/dist/infra/tailnet.js +46 -0
  292. package/dist/infra/tailscale.js +149 -0
  293. package/dist/infra/voicewake.js +77 -0
  294. package/dist/infra/widearea-dns.js +123 -0
  295. package/dist/infra/ws.js +13 -0
  296. package/dist/logger.js +52 -0
  297. package/dist/logging.js +490 -0
  298. package/dist/macos/gateway-daemon.js +141 -0
  299. package/dist/macos/relay.js +46 -0
  300. package/dist/media/constants.js +33 -0
  301. package/dist/media/host.js +42 -0
  302. package/dist/media/image-ops.js +121 -0
  303. package/dist/media/mime.js +115 -0
  304. package/dist/media/parse.js +81 -0
  305. package/dist/media/server.js +64 -0
  306. package/dist/media/store.js +139 -0
  307. package/dist/process/command-queue.js +97 -0
  308. package/dist/process/exec.js +75 -0
  309. package/dist/protocol.schema.json +2918 -0
  310. package/dist/provider-web.js +8 -0
  311. package/dist/providers/web/index.js +2 -0
  312. package/dist/runtime.js +8 -0
  313. package/dist/sessions/send-policy.js +68 -0
  314. package/dist/signal/client.js +134 -0
  315. package/dist/signal/daemon.js +69 -0
  316. package/dist/signal/index.js +3 -0
  317. package/dist/signal/monitor.js +336 -0
  318. package/dist/signal/probe.js +46 -0
  319. package/dist/signal/send.js +91 -0
  320. package/dist/slack/actions.js +97 -0
  321. package/dist/slack/index.js +5 -0
  322. package/dist/slack/monitor.js +1029 -0
  323. package/dist/slack/probe.js +47 -0
  324. package/dist/slack/send.js +131 -0
  325. package/dist/slack/token.js +10 -0
  326. package/dist/telegram/bot.js +394 -0
  327. package/dist/telegram/download.js +34 -0
  328. package/dist/telegram/index.js +4 -0
  329. package/dist/telegram/monitor.js +47 -0
  330. package/dist/telegram/probe.js +63 -0
  331. package/dist/telegram/proxy.js +9 -0
  332. package/dist/telegram/send.js +138 -0
  333. package/dist/telegram/token.js +30 -0
  334. package/dist/telegram/webhook-set.js +12 -0
  335. package/dist/telegram/webhook.js +56 -0
  336. package/dist/tui/commands.js +74 -0
  337. package/dist/tui/components/assistant-message.js +16 -0
  338. package/dist/tui/components/chat-log.js +92 -0
  339. package/dist/tui/components/custom-editor.js +53 -0
  340. package/dist/tui/components/selectors.js +8 -0
  341. package/dist/tui/components/tool-execution.js +111 -0
  342. package/dist/tui/components/user-message.js +17 -0
  343. package/dist/tui/gateway-chat.js +140 -0
  344. package/dist/tui/layout.js +41 -0
  345. package/dist/tui/message-list.js +57 -0
  346. package/dist/tui/theme/theme.js +80 -0
  347. package/dist/tui/theme.js +25 -0
  348. package/dist/tui/tui.js +708 -0
  349. package/dist/utils.js +133 -0
  350. package/dist/version.js +18 -0
  351. package/dist/web/active-listener.js +7 -0
  352. package/dist/web/auto-reply.js +1203 -0
  353. package/dist/web/inbound.js +481 -0
  354. package/dist/web/login-qr.js +204 -0
  355. package/dist/web/login.js +59 -0
  356. package/dist/web/media.js +148 -0
  357. package/dist/web/outbound.js +67 -0
  358. package/dist/web/qr-image.js +97 -0
  359. package/dist/web/reconnect.js +60 -0
  360. package/dist/web/reply-heartbeat-wake.js +61 -0
  361. package/dist/web/session.js +346 -0
  362. package/dist/wizard/clack-prompter.js +56 -0
  363. package/dist/wizard/onboarding.js +452 -0
  364. package/dist/wizard/prompts.js +6 -0
  365. package/dist/wizard/session.js +203 -0
  366. package/docs/AGENTS.default.md +116 -0
  367. package/docs/CNAME +1 -0
  368. package/docs/RELEASING.md +64 -0
  369. package/docs/_config.yml +51 -0
  370. package/docs/_layouts/default.html +145 -0
  371. package/docs/agent-send.md +21 -0
  372. package/docs/agent.md +104 -0
  373. package/docs/android/connect.md +131 -0
  374. package/docs/architecture.md +89 -0
  375. package/docs/assets/markdown.css +130 -0
  376. package/docs/assets/pixel-lobster.svg +60 -0
  377. package/docs/assets/terminal.css +497 -0
  378. package/docs/assets/theme.js +55 -0
  379. package/docs/audio.md +50 -0
  380. package/docs/background-process.md +74 -0
  381. package/docs/bash.md +32 -0
  382. package/docs/bonjour.md +159 -0
  383. package/docs/browser.md +289 -0
  384. package/docs/camera.md +152 -0
  385. package/docs/clawd.md +199 -0
  386. package/docs/clawdbot-mac.md +104 -0
  387. package/docs/configuration.md +1177 -0
  388. package/docs/control-api.md +49 -0
  389. package/docs/control-ui.md +83 -0
  390. package/docs/cron.md +374 -0
  391. package/docs/dashboard.md +17 -0
  392. package/docs/device-models.md +46 -0
  393. package/docs/discord.md +293 -0
  394. package/docs/discovery.md +112 -0
  395. package/docs/docker.md +251 -0
  396. package/docs/docs.json +86 -0
  397. package/docs/doctor.md +47 -0
  398. package/docs/elevated.md +31 -0
  399. package/docs/faq.md +640 -0
  400. package/docs/gateway/pairing.md +109 -0
  401. package/docs/gateway-lock.md +28 -0
  402. package/docs/gateway.md +174 -0
  403. package/docs/gmail-pubsub.md +191 -0
  404. package/docs/grammy.md +27 -0
  405. package/docs/group-messages.md +71 -0
  406. package/docs/groups.md +78 -0
  407. package/docs/health.md +28 -0
  408. package/docs/heartbeat.md +64 -0
  409. package/docs/images.md +52 -0
  410. package/docs/imessage.md +63 -0
  411. package/docs/index.md +182 -0
  412. package/docs/ios/connect.md +177 -0
  413. package/docs/ios/spec.md +236 -0
  414. package/docs/location-command.md +95 -0
  415. package/docs/logging.md +99 -0
  416. package/docs/lore.md +131 -0
  417. package/docs/mac/bun.md +133 -0
  418. package/docs/mac/canvas.md +161 -0
  419. package/docs/mac/child-process.md +72 -0
  420. package/docs/mac/dev-setup.md +81 -0
  421. package/docs/mac/health.md +28 -0
  422. package/docs/mac/icon.md +26 -0
  423. package/docs/mac/logging.md +51 -0
  424. package/docs/mac/menu-bar.md +69 -0
  425. package/docs/mac/peekaboo.md +170 -0
  426. package/docs/mac/permissions.md +40 -0
  427. package/docs/mac/release.md +76 -0
  428. package/docs/mac/remote.md +57 -0
  429. package/docs/mac/signing.md +41 -0
  430. package/docs/mac/skills.md +27 -0
  431. package/docs/mac/voice-overlay.md +52 -0
  432. package/docs/mac/voicewake.md +56 -0
  433. package/docs/mac/webchat.md +27 -0
  434. package/docs/mac/xpc.md +40 -0
  435. package/docs/models.md +90 -0
  436. package/docs/nix.md +49 -0
  437. package/docs/nodes.md +157 -0
  438. package/docs/onboarding-config-protocol.md +29 -0
  439. package/docs/onboarding.md +185 -0
  440. package/docs/presence.md +133 -0
  441. package/docs/queue.md +78 -0
  442. package/docs/refactor/browser-control-simplification.md +58 -0
  443. package/docs/refactor/canvas-a2ui.md +93 -0
  444. package/docs/refactor/cli-unification.md +64 -0
  445. package/docs/refactor/gateway-client.md +31 -0
  446. package/docs/refactor/gateway.md +99 -0
  447. package/docs/refactor/new-arch.md +171 -0
  448. package/docs/refactor/tui.md +26 -0
  449. package/docs/refactor/web-gateway-troubleshooting.md +37 -0
  450. package/docs/refactor/webagent-session.md +46 -0
  451. package/docs/remote-gateway-readme.md +148 -0
  452. package/docs/remote.md +66 -0
  453. package/docs/research/memory.md +227 -0
  454. package/docs/rpc.md +35 -0
  455. package/docs/security.md +168 -0
  456. package/docs/session-tool.md +119 -0
  457. package/docs/session.md +84 -0
  458. package/docs/sessions.md +8 -0
  459. package/docs/setup.md +118 -0
  460. package/docs/signal.md +113 -0
  461. package/docs/skills-config.md +58 -0
  462. package/docs/skills.md +149 -0
  463. package/docs/slack.md +158 -0
  464. package/docs/surface.md +20 -0
  465. package/docs/tailscale.md +71 -0
  466. package/docs/talk.md +79 -0
  467. package/docs/telegram.md +90 -0
  468. package/docs/templates/AGENTS.md +126 -0
  469. package/docs/templates/BOOTSTRAP.md +53 -0
  470. package/docs/templates/IDENTITY.md +17 -0
  471. package/docs/templates/SOUL.md +41 -0
  472. package/docs/templates/TOOLS.md +41 -0
  473. package/docs/templates/USER.md +22 -0
  474. package/docs/test.md +35 -0
  475. package/docs/thinking.md +46 -0
  476. package/docs/tools.md +248 -0
  477. package/docs/troubleshooting.md +227 -0
  478. package/docs/tui.md +69 -0
  479. package/docs/typebox.md +42 -0
  480. package/docs/voicewake.md +61 -0
  481. package/docs/web.md +115 -0
  482. package/docs/webchat.md +34 -0
  483. package/docs/webhook.md +132 -0
  484. package/docs/whatsapp-clawd.jpg +0 -0
  485. package/docs/whatsapp.md +142 -0
  486. package/docs/wizard.md +158 -0
  487. package/package.json +186 -0
  488. package/skills/apple-notes/SKILL.md +50 -0
  489. package/skills/apple-reminders/SKILL.md +67 -0
  490. package/skills/bear-notes/SKILL.md +79 -0
  491. package/skills/bird/SKILL.md +25 -0
  492. package/skills/blogwatcher/SKILL.md +46 -0
  493. package/skills/blucli/SKILL.md +27 -0
  494. package/skills/brave-search/SKILL.md +30 -0
  495. package/skills/brave-search/scripts/content.mjs +53 -0
  496. package/skills/brave-search/scripts/search.mjs +79 -0
  497. package/skills/camsnap/SKILL.md +25 -0
  498. package/skills/clawdhub/SKILL.md +53 -0
  499. package/skills/coding-agent/SKILL.md +275 -0
  500. package/skills/discord/SKILL.md +369 -0
  501. package/skills/eightctl/SKILL.md +29 -0
  502. package/skills/food-order/SKILL.md +41 -0
  503. package/skills/gemini/SKILL.md +23 -0
  504. package/skills/gifgrep/SKILL.md +47 -0
  505. package/skills/github/SKILL.md +47 -0
  506. package/skills/gog/SKILL.md +36 -0
  507. package/skills/goplaces/SKILL.md +30 -0
  508. package/skills/imsg/SKILL.md +25 -0
  509. package/skills/local-places/SERVER_README.md +101 -0
  510. package/skills/local-places/SKILL.md +91 -0
  511. package/skills/local-places/pyproject.toml +27 -0
  512. package/skills/local-places/src/local_places/__init__.py +2 -0
  513. package/skills/local-places/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
  514. package/skills/local-places/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
  515. package/skills/local-places/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
  516. package/skills/local-places/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
  517. package/skills/local-places/src/local_places/google_places.py +314 -0
  518. package/skills/local-places/src/local_places/main.py +65 -0
  519. package/skills/local-places/src/local_places/schemas.py +107 -0
  520. package/skills/mcporter/SKILL.md +38 -0
  521. package/skills/nano-banana-pro/SKILL.md +29 -0
  522. package/skills/nano-banana-pro/scripts/generate_image.py +167 -0
  523. package/skills/nano-pdf/SKILL.md +20 -0
  524. package/skills/notion/SKILL.md +156 -0
  525. package/skills/obsidian/SKILL.md +55 -0
  526. package/skills/openai-image-gen/SKILL.md +31 -0
  527. package/skills/openai-image-gen/scripts/gen.py +173 -0
  528. package/skills/openai-whisper/SKILL.md +19 -0
  529. package/skills/openai-whisper-api/SKILL.md +43 -0
  530. package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
  531. package/skills/openhue/SKILL.md +30 -0
  532. package/skills/oracle/SKILL.md +105 -0
  533. package/skills/ordercli/SKILL.md +47 -0
  534. package/skills/peekaboo/SKILL.md +153 -0
  535. package/skills/qmd/SKILL.md +26 -0
  536. package/skills/sag/SKILL.md +62 -0
  537. package/skills/slack/SKILL.md +143 -0
  538. package/skills/songsee/SKILL.md +29 -0
  539. package/skills/sonoscli/SKILL.md +26 -0
  540. package/skills/spotify-player/SKILL.md +34 -0
  541. package/skills/summarize/SKILL.md +49 -0
  542. package/skills/things-mac/SKILL.md +61 -0
  543. package/skills/tmux/SKILL.md +121 -0
  544. package/skills/tmux/scripts/find-sessions.sh +112 -0
  545. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  546. package/skills/trello/SKILL.md +84 -0
  547. package/skills/video-frames/SKILL.md +29 -0
  548. package/skills/video-frames/scripts/frame.sh +81 -0
  549. package/skills/wacli/SKILL.md +42 -0
  550. package/skills/weather/SKILL.md +49 -0
@@ -0,0 +1,459 @@
1
+ import { resolveBrowserControlUrl } from "../browser/client.js";
2
+ import { browserAct, browserArmDialog, browserArmFileChooser, browserNavigate, } from "../browser/client-actions.js";
3
+ import { danger } from "../globals.js";
4
+ import { defaultRuntime } from "../runtime.js";
5
+ async function readFile(path) {
6
+ const fs = await import("node:fs/promises");
7
+ return await fs.readFile(path, "utf8");
8
+ }
9
+ async function readFields(opts) {
10
+ const payload = opts.fieldsFile
11
+ ? await readFile(opts.fieldsFile)
12
+ : (opts.fields ?? "");
13
+ if (!payload.trim())
14
+ throw new Error("fields are required");
15
+ const parsed = JSON.parse(payload);
16
+ if (!Array.isArray(parsed))
17
+ throw new Error("fields must be an array");
18
+ return parsed.map((entry, index) => {
19
+ if (!entry || typeof entry !== "object") {
20
+ throw new Error(`fields[${index}] must be an object`);
21
+ }
22
+ const rec = entry;
23
+ const ref = typeof rec.ref === "string" ? rec.ref.trim() : "";
24
+ const type = typeof rec.type === "string" ? rec.type.trim() : "";
25
+ if (!ref || !type) {
26
+ throw new Error(`fields[${index}] must include ref and type`);
27
+ }
28
+ if (typeof rec.value === "string" ||
29
+ typeof rec.value === "number" ||
30
+ typeof rec.value === "boolean") {
31
+ return { ref, type, value: rec.value };
32
+ }
33
+ if (rec.value === undefined || rec.value === null) {
34
+ return { ref, type };
35
+ }
36
+ throw new Error(`fields[${index}].value must be string, number, boolean, or null`);
37
+ });
38
+ }
39
+ export function registerBrowserActionInputCommands(browser, parentOpts) {
40
+ browser
41
+ .command("navigate")
42
+ .description("Navigate the current tab to a URL")
43
+ .argument("<url>", "URL to navigate to")
44
+ .option("--target-id <id>", "CDP target id (or unique prefix)")
45
+ .action(async (url, opts, cmd) => {
46
+ const parent = parentOpts(cmd);
47
+ const baseUrl = resolveBrowserControlUrl(parent?.url);
48
+ const profile = parent?.profile;
49
+ try {
50
+ const result = await browserNavigate(baseUrl, {
51
+ url,
52
+ targetId: opts.targetId?.trim() || undefined,
53
+ profile,
54
+ });
55
+ if (parent?.json) {
56
+ defaultRuntime.log(JSON.stringify(result, null, 2));
57
+ return;
58
+ }
59
+ defaultRuntime.log(`navigated to ${result.url ?? url}`);
60
+ }
61
+ catch (err) {
62
+ defaultRuntime.error(danger(String(err)));
63
+ defaultRuntime.exit(1);
64
+ }
65
+ });
66
+ browser
67
+ .command("resize")
68
+ .description("Resize the viewport")
69
+ .argument("<width>", "Viewport width", (v) => Number(v))
70
+ .argument("<height>", "Viewport height", (v) => Number(v))
71
+ .option("--target-id <id>", "CDP target id (or unique prefix)")
72
+ .action(async (width, height, opts, cmd) => {
73
+ const parent = parentOpts(cmd);
74
+ const baseUrl = resolveBrowserControlUrl(parent?.url);
75
+ const profile = parent?.profile;
76
+ if (!Number.isFinite(width) || !Number.isFinite(height)) {
77
+ defaultRuntime.error(danger("width and height must be numbers"));
78
+ defaultRuntime.exit(1);
79
+ return;
80
+ }
81
+ try {
82
+ const result = await browserAct(baseUrl, {
83
+ kind: "resize",
84
+ width,
85
+ height,
86
+ targetId: opts.targetId?.trim() || undefined,
87
+ }, { profile });
88
+ if (parent?.json) {
89
+ defaultRuntime.log(JSON.stringify(result, null, 2));
90
+ return;
91
+ }
92
+ defaultRuntime.log(`resized to ${width}x${height}`);
93
+ }
94
+ catch (err) {
95
+ defaultRuntime.error(danger(String(err)));
96
+ defaultRuntime.exit(1);
97
+ }
98
+ });
99
+ browser
100
+ .command("click")
101
+ .description("Click an element by ref from snapshot")
102
+ .argument("<ref>", "Ref id from ai snapshot")
103
+ .option("--target-id <id>", "CDP target id (or unique prefix)")
104
+ .option("--double", "Double click", false)
105
+ .option("--button <left|right|middle>", "Mouse button to use")
106
+ .option("--modifiers <list>", "Comma-separated modifiers (Shift,Alt,Meta)")
107
+ .action(async (ref, opts, cmd) => {
108
+ const parent = parentOpts(cmd);
109
+ const baseUrl = resolveBrowserControlUrl(parent?.url);
110
+ const profile = parent?.profile;
111
+ const refValue = typeof ref === "string" ? ref.trim() : "";
112
+ if (!refValue) {
113
+ defaultRuntime.error(danger("ref is required"));
114
+ defaultRuntime.exit(1);
115
+ return;
116
+ }
117
+ const modifiers = opts.modifiers
118
+ ? String(opts.modifiers)
119
+ .split(",")
120
+ .map((v) => v.trim())
121
+ .filter(Boolean)
122
+ : undefined;
123
+ try {
124
+ const result = await browserAct(baseUrl, {
125
+ kind: "click",
126
+ ref: refValue,
127
+ targetId: opts.targetId?.trim() || undefined,
128
+ doubleClick: Boolean(opts.double),
129
+ button: opts.button?.trim() || undefined,
130
+ modifiers,
131
+ }, { profile });
132
+ if (parent?.json) {
133
+ defaultRuntime.log(JSON.stringify(result, null, 2));
134
+ return;
135
+ }
136
+ const suffix = result.url ? ` on ${result.url}` : "";
137
+ defaultRuntime.log(`clicked ref ${refValue}${suffix}`);
138
+ }
139
+ catch (err) {
140
+ defaultRuntime.error(danger(String(err)));
141
+ defaultRuntime.exit(1);
142
+ }
143
+ });
144
+ browser
145
+ .command("type")
146
+ .description("Type into an element by ref from snapshot")
147
+ .argument("<ref>", "Ref id from ai snapshot")
148
+ .argument("<text>", "Text to type")
149
+ .option("--submit", "Press Enter after typing", false)
150
+ .option("--slowly", "Type slowly (human-like)", false)
151
+ .option("--target-id <id>", "CDP target id (or unique prefix)")
152
+ .action(async (ref, text, opts, cmd) => {
153
+ const parent = parentOpts(cmd);
154
+ const baseUrl = resolveBrowserControlUrl(parent?.url);
155
+ const profile = parent?.profile;
156
+ const refValue = typeof ref === "string" ? ref.trim() : "";
157
+ if (!refValue) {
158
+ defaultRuntime.error(danger("ref is required"));
159
+ defaultRuntime.exit(1);
160
+ return;
161
+ }
162
+ try {
163
+ const result = await browserAct(baseUrl, {
164
+ kind: "type",
165
+ ref: refValue,
166
+ text,
167
+ submit: Boolean(opts.submit),
168
+ slowly: Boolean(opts.slowly),
169
+ targetId: opts.targetId?.trim() || undefined,
170
+ }, { profile });
171
+ if (parent?.json) {
172
+ defaultRuntime.log(JSON.stringify(result, null, 2));
173
+ return;
174
+ }
175
+ defaultRuntime.log(`typed into ref ${refValue}`);
176
+ }
177
+ catch (err) {
178
+ defaultRuntime.error(danger(String(err)));
179
+ defaultRuntime.exit(1);
180
+ }
181
+ });
182
+ browser
183
+ .command("press")
184
+ .description("Press a key")
185
+ .argument("<key>", "Key to press (e.g. Enter)")
186
+ .option("--target-id <id>", "CDP target id (or unique prefix)")
187
+ .action(async (key, opts, cmd) => {
188
+ const parent = parentOpts(cmd);
189
+ const baseUrl = resolveBrowserControlUrl(parent?.url);
190
+ const profile = parent?.profile;
191
+ try {
192
+ const result = await browserAct(baseUrl, {
193
+ kind: "press",
194
+ key,
195
+ targetId: opts.targetId?.trim() || undefined,
196
+ }, { profile });
197
+ if (parent?.json) {
198
+ defaultRuntime.log(JSON.stringify(result, null, 2));
199
+ return;
200
+ }
201
+ defaultRuntime.log(`pressed ${key}`);
202
+ }
203
+ catch (err) {
204
+ defaultRuntime.error(danger(String(err)));
205
+ defaultRuntime.exit(1);
206
+ }
207
+ });
208
+ browser
209
+ .command("hover")
210
+ .description("Hover an element by ai ref")
211
+ .argument("<ref>", "Ref id from ai snapshot")
212
+ .option("--target-id <id>", "CDP target id (or unique prefix)")
213
+ .action(async (ref, opts, cmd) => {
214
+ const parent = parentOpts(cmd);
215
+ const baseUrl = resolveBrowserControlUrl(parent?.url);
216
+ const profile = parent?.profile;
217
+ try {
218
+ const result = await browserAct(baseUrl, {
219
+ kind: "hover",
220
+ ref,
221
+ targetId: opts.targetId?.trim() || undefined,
222
+ }, { profile });
223
+ if (parent?.json) {
224
+ defaultRuntime.log(JSON.stringify(result, null, 2));
225
+ return;
226
+ }
227
+ defaultRuntime.log(`hovered ref ${ref}`);
228
+ }
229
+ catch (err) {
230
+ defaultRuntime.error(danger(String(err)));
231
+ defaultRuntime.exit(1);
232
+ }
233
+ });
234
+ browser
235
+ .command("drag")
236
+ .description("Drag from one ref to another")
237
+ .argument("<startRef>", "Start ref id")
238
+ .argument("<endRef>", "End ref id")
239
+ .option("--target-id <id>", "CDP target id (or unique prefix)")
240
+ .action(async (startRef, endRef, opts, cmd) => {
241
+ const parent = parentOpts(cmd);
242
+ const baseUrl = resolveBrowserControlUrl(parent?.url);
243
+ const profile = parent?.profile;
244
+ try {
245
+ const result = await browserAct(baseUrl, {
246
+ kind: "drag",
247
+ startRef,
248
+ endRef,
249
+ targetId: opts.targetId?.trim() || undefined,
250
+ }, { profile });
251
+ if (parent?.json) {
252
+ defaultRuntime.log(JSON.stringify(result, null, 2));
253
+ return;
254
+ }
255
+ defaultRuntime.log(`dragged ${startRef} → ${endRef}`);
256
+ }
257
+ catch (err) {
258
+ defaultRuntime.error(danger(String(err)));
259
+ defaultRuntime.exit(1);
260
+ }
261
+ });
262
+ browser
263
+ .command("select")
264
+ .description("Select option(s) in a select element")
265
+ .argument("<ref>", "Ref id from ai snapshot")
266
+ .argument("<values...>", "Option values to select")
267
+ .option("--target-id <id>", "CDP target id (or unique prefix)")
268
+ .action(async (ref, values, opts, cmd) => {
269
+ const parent = parentOpts(cmd);
270
+ const baseUrl = resolveBrowserControlUrl(parent?.url);
271
+ const profile = parent?.profile;
272
+ try {
273
+ const result = await browserAct(baseUrl, {
274
+ kind: "select",
275
+ ref,
276
+ values,
277
+ targetId: opts.targetId?.trim() || undefined,
278
+ }, { profile });
279
+ if (parent?.json) {
280
+ defaultRuntime.log(JSON.stringify(result, null, 2));
281
+ return;
282
+ }
283
+ defaultRuntime.log(`selected ${values.join(", ")}`);
284
+ }
285
+ catch (err) {
286
+ defaultRuntime.error(danger(String(err)));
287
+ defaultRuntime.exit(1);
288
+ }
289
+ });
290
+ browser
291
+ .command("upload")
292
+ .description("Arm file upload for the next file chooser")
293
+ .argument("<paths...>", "File paths to upload")
294
+ .option("--ref <ref>", "Ref id from ai snapshot to click after arming")
295
+ .option("--input-ref <ref>", "Ref id for <input type=file> to set directly")
296
+ .option("--element <selector>", "CSS selector for <input type=file>")
297
+ .option("--target-id <id>", "CDP target id (or unique prefix)")
298
+ .option("--timeout-ms <ms>", "How long to wait for the next file chooser (default: 120000)", (v) => Number(v))
299
+ .action(async (paths, opts, cmd) => {
300
+ const parent = parentOpts(cmd);
301
+ const baseUrl = resolveBrowserControlUrl(parent?.url);
302
+ const profile = parent?.profile;
303
+ try {
304
+ const result = await browserArmFileChooser(baseUrl, {
305
+ paths,
306
+ ref: opts.ref?.trim() || undefined,
307
+ inputRef: opts.inputRef?.trim() || undefined,
308
+ element: opts.element?.trim() || undefined,
309
+ targetId: opts.targetId?.trim() || undefined,
310
+ timeoutMs: Number.isFinite(opts.timeoutMs)
311
+ ? opts.timeoutMs
312
+ : undefined,
313
+ profile,
314
+ });
315
+ if (parent?.json) {
316
+ defaultRuntime.log(JSON.stringify(result, null, 2));
317
+ return;
318
+ }
319
+ defaultRuntime.log(`upload armed for ${paths.length} file(s)`);
320
+ }
321
+ catch (err) {
322
+ defaultRuntime.error(danger(String(err)));
323
+ defaultRuntime.exit(1);
324
+ }
325
+ });
326
+ browser
327
+ .command("fill")
328
+ .description("Fill a form with JSON field descriptors")
329
+ .option("--fields <json>", "JSON array of field objects")
330
+ .option("--fields-file <path>", "Read JSON array from a file")
331
+ .option("--target-id <id>", "CDP target id (or unique prefix)")
332
+ .action(async (opts, cmd) => {
333
+ const parent = parentOpts(cmd);
334
+ const baseUrl = resolveBrowserControlUrl(parent?.url);
335
+ const profile = parent?.profile;
336
+ try {
337
+ const fields = await readFields({
338
+ fields: opts.fields,
339
+ fieldsFile: opts.fieldsFile,
340
+ });
341
+ const result = await browserAct(baseUrl, {
342
+ kind: "fill",
343
+ fields,
344
+ targetId: opts.targetId?.trim() || undefined,
345
+ }, { profile });
346
+ if (parent?.json) {
347
+ defaultRuntime.log(JSON.stringify(result, null, 2));
348
+ return;
349
+ }
350
+ defaultRuntime.log(`filled ${fields.length} field(s)`);
351
+ }
352
+ catch (err) {
353
+ defaultRuntime.error(danger(String(err)));
354
+ defaultRuntime.exit(1);
355
+ }
356
+ });
357
+ browser
358
+ .command("dialog")
359
+ .description("Arm the next modal dialog (alert/confirm/prompt)")
360
+ .option("--accept", "Accept the dialog", false)
361
+ .option("--dismiss", "Dismiss the dialog", false)
362
+ .option("--prompt <text>", "Prompt response text")
363
+ .option("--target-id <id>", "CDP target id (or unique prefix)")
364
+ .option("--timeout-ms <ms>", "How long to wait for the next dialog (default: 120000)", (v) => Number(v))
365
+ .action(async (opts, cmd) => {
366
+ const parent = parentOpts(cmd);
367
+ const baseUrl = resolveBrowserControlUrl(parent?.url);
368
+ const profile = parent?.profile;
369
+ const accept = opts.accept ? true : opts.dismiss ? false : undefined;
370
+ if (accept === undefined) {
371
+ defaultRuntime.error(danger("Specify --accept or --dismiss"));
372
+ defaultRuntime.exit(1);
373
+ return;
374
+ }
375
+ try {
376
+ const result = await browserArmDialog(baseUrl, {
377
+ accept,
378
+ promptText: opts.prompt?.trim() || undefined,
379
+ targetId: opts.targetId?.trim() || undefined,
380
+ timeoutMs: Number.isFinite(opts.timeoutMs)
381
+ ? opts.timeoutMs
382
+ : undefined,
383
+ profile,
384
+ });
385
+ if (parent?.json) {
386
+ defaultRuntime.log(JSON.stringify(result, null, 2));
387
+ return;
388
+ }
389
+ defaultRuntime.log("dialog armed");
390
+ }
391
+ catch (err) {
392
+ defaultRuntime.error(danger(String(err)));
393
+ defaultRuntime.exit(1);
394
+ }
395
+ });
396
+ browser
397
+ .command("wait")
398
+ .description("Wait for time or text conditions")
399
+ .option("--time <ms>", "Wait for N milliseconds", (v) => Number(v))
400
+ .option("--text <value>", "Wait for text to appear")
401
+ .option("--text-gone <value>", "Wait for text to disappear")
402
+ .option("--target-id <id>", "CDP target id (or unique prefix)")
403
+ .action(async (opts, cmd) => {
404
+ const parent = parentOpts(cmd);
405
+ const baseUrl = resolveBrowserControlUrl(parent?.url);
406
+ const profile = parent?.profile;
407
+ try {
408
+ const result = await browserAct(baseUrl, {
409
+ kind: "wait",
410
+ timeMs: Number.isFinite(opts.time) ? opts.time : undefined,
411
+ text: opts.text?.trim() || undefined,
412
+ textGone: opts.textGone?.trim() || undefined,
413
+ targetId: opts.targetId?.trim() || undefined,
414
+ }, { profile });
415
+ if (parent?.json) {
416
+ defaultRuntime.log(JSON.stringify(result, null, 2));
417
+ return;
418
+ }
419
+ defaultRuntime.log("wait complete");
420
+ }
421
+ catch (err) {
422
+ defaultRuntime.error(danger(String(err)));
423
+ defaultRuntime.exit(1);
424
+ }
425
+ });
426
+ browser
427
+ .command("evaluate")
428
+ .description("Evaluate a function against the page or a ref")
429
+ .option("--fn <code>", "Function source, e.g. (el) => el.textContent")
430
+ .option("--ref <id>", "ARIA ref from ai snapshot")
431
+ .option("--target-id <id>", "CDP target id (or unique prefix)")
432
+ .action(async (opts, cmd) => {
433
+ const parent = parentOpts(cmd);
434
+ const baseUrl = resolveBrowserControlUrl(parent?.url);
435
+ const profile = parent?.profile;
436
+ if (!opts.fn) {
437
+ defaultRuntime.error(danger("Missing --fn"));
438
+ defaultRuntime.exit(1);
439
+ return;
440
+ }
441
+ try {
442
+ const result = await browserAct(baseUrl, {
443
+ kind: "evaluate",
444
+ fn: opts.fn,
445
+ ref: opts.ref?.trim() || undefined,
446
+ targetId: opts.targetId?.trim() || undefined,
447
+ }, { profile });
448
+ if (parent?.json) {
449
+ defaultRuntime.log(JSON.stringify(result, null, 2));
450
+ return;
451
+ }
452
+ defaultRuntime.log(JSON.stringify(result.result ?? null, null, 2));
453
+ }
454
+ catch (err) {
455
+ defaultRuntime.error(danger(String(err)));
456
+ defaultRuntime.exit(1);
457
+ }
458
+ });
459
+ }
@@ -0,0 +1,56 @@
1
+ import { resolveBrowserControlUrl } from "../browser/client.js";
2
+ import { browserConsoleMessages, browserPdfSave, } from "../browser/client-actions.js";
3
+ import { danger } from "../globals.js";
4
+ import { defaultRuntime } from "../runtime.js";
5
+ export function registerBrowserActionObserveCommands(browser, parentOpts) {
6
+ browser
7
+ .command("console")
8
+ .description("Get recent console messages")
9
+ .option("--level <level>", "Filter by level (error, warn, info)")
10
+ .option("--target-id <id>", "CDP target id (or unique prefix)")
11
+ .action(async (opts, cmd) => {
12
+ const parent = parentOpts(cmd);
13
+ const baseUrl = resolveBrowserControlUrl(parent?.url);
14
+ const profile = parent?.profile;
15
+ try {
16
+ const result = await browserConsoleMessages(baseUrl, {
17
+ level: opts.level?.trim() || undefined,
18
+ targetId: opts.targetId?.trim() || undefined,
19
+ profile,
20
+ });
21
+ if (parent?.json) {
22
+ defaultRuntime.log(JSON.stringify(result, null, 2));
23
+ return;
24
+ }
25
+ defaultRuntime.log(JSON.stringify(result.messages, null, 2));
26
+ }
27
+ catch (err) {
28
+ defaultRuntime.error(danger(String(err)));
29
+ defaultRuntime.exit(1);
30
+ }
31
+ });
32
+ browser
33
+ .command("pdf")
34
+ .description("Save page as PDF")
35
+ .option("--target-id <id>", "CDP target id (or unique prefix)")
36
+ .action(async (opts, cmd) => {
37
+ const parent = parentOpts(cmd);
38
+ const baseUrl = resolveBrowserControlUrl(parent?.url);
39
+ const profile = parent?.profile;
40
+ try {
41
+ const result = await browserPdfSave(baseUrl, {
42
+ targetId: opts.targetId?.trim() || undefined,
43
+ profile,
44
+ });
45
+ if (parent?.json) {
46
+ defaultRuntime.log(JSON.stringify(result, null, 2));
47
+ return;
48
+ }
49
+ defaultRuntime.log(`PDF: ${result.path}`);
50
+ }
51
+ catch (err) {
52
+ defaultRuntime.error(danger(String(err)));
53
+ defaultRuntime.exit(1);
54
+ }
55
+ });
56
+ }
@@ -0,0 +1,31 @@
1
+ export const browserCoreExamples = [
2
+ "clawdbot browser status",
3
+ "clawdbot browser start",
4
+ "clawdbot browser stop",
5
+ "clawdbot browser tabs",
6
+ "clawdbot browser open https://example.com",
7
+ "clawdbot browser focus abcd1234",
8
+ "clawdbot browser close abcd1234",
9
+ "clawdbot browser screenshot",
10
+ "clawdbot browser screenshot --full-page",
11
+ "clawdbot browser screenshot --ref 12",
12
+ "clawdbot browser snapshot",
13
+ "clawdbot browser snapshot --format aria --limit 200",
14
+ ];
15
+ export const browserActionExamples = [
16
+ "clawdbot browser navigate https://example.com",
17
+ "clawdbot browser resize 1280 720",
18
+ "clawdbot browser click 12 --double",
19
+ 'clawdbot browser type 23 "hello" --submit',
20
+ "clawdbot browser press Enter",
21
+ "clawdbot browser hover 44",
22
+ "clawdbot browser drag 10 11",
23
+ "clawdbot browser select 9 OptionA OptionB",
24
+ "clawdbot browser upload /tmp/file.pdf",
25
+ 'clawdbot browser fill --fields \'[{"ref":"1","value":"Ada"}]\'',
26
+ "clawdbot browser dialog --accept",
27
+ 'clawdbot browser wait --text "Done"',
28
+ "clawdbot browser evaluate --fn '(el) => el.textContent' --ref 7",
29
+ "clawdbot browser console --level error",
30
+ "clawdbot browser pdf",
31
+ ];
@@ -0,0 +1,97 @@
1
+ import { browserSnapshot, resolveBrowserControlUrl, } from "../browser/client.js";
2
+ import { browserScreenshotAction } from "../browser/client-actions.js";
3
+ import { danger } from "../globals.js";
4
+ import { defaultRuntime } from "../runtime.js";
5
+ export function registerBrowserInspectCommands(browser, parentOpts) {
6
+ browser
7
+ .command("screenshot")
8
+ .description("Capture a screenshot (MEDIA:<path>)")
9
+ .argument("[targetId]", "CDP target id (or unique prefix)")
10
+ .option("--full-page", "Capture full scrollable page", false)
11
+ .option("--ref <ref>", "ARIA ref from ai snapshot")
12
+ .option("--element <selector>", "CSS selector for element screenshot")
13
+ .option("--type <png|jpeg>", "Output type (default: png)", "png")
14
+ .action(async (targetId, opts, cmd) => {
15
+ const parent = parentOpts(cmd);
16
+ const baseUrl = resolveBrowserControlUrl(parent?.url);
17
+ const profile = parent?.profile;
18
+ try {
19
+ const result = await browserScreenshotAction(baseUrl, {
20
+ targetId: targetId?.trim() || undefined,
21
+ fullPage: Boolean(opts.fullPage),
22
+ ref: opts.ref?.trim() || undefined,
23
+ element: opts.element?.trim() || undefined,
24
+ type: opts.type === "jpeg" ? "jpeg" : "png",
25
+ profile,
26
+ });
27
+ if (parent?.json) {
28
+ defaultRuntime.log(JSON.stringify(result, null, 2));
29
+ return;
30
+ }
31
+ defaultRuntime.log(`MEDIA:${result.path}`);
32
+ }
33
+ catch (err) {
34
+ defaultRuntime.error(danger(String(err)));
35
+ defaultRuntime.exit(1);
36
+ }
37
+ });
38
+ browser
39
+ .command("snapshot")
40
+ .description("Capture a snapshot (default: ai; aria is the accessibility tree)")
41
+ .option("--format <aria|ai>", "Snapshot format (default: ai)", "ai")
42
+ .option("--target-id <id>", "CDP target id (or unique prefix)")
43
+ .option("--limit <n>", "Max nodes (default: 500/800)", (v) => Number(v))
44
+ .option("--out <path>", "Write snapshot to a file")
45
+ .action(async (opts, cmd) => {
46
+ const parent = parentOpts(cmd);
47
+ const baseUrl = resolveBrowserControlUrl(parent?.url);
48
+ const profile = parent?.profile;
49
+ const format = opts.format === "aria" ? "aria" : "ai";
50
+ try {
51
+ const result = await browserSnapshot(baseUrl, {
52
+ format,
53
+ targetId: opts.targetId?.trim() || undefined,
54
+ limit: Number.isFinite(opts.limit) ? opts.limit : undefined,
55
+ profile,
56
+ });
57
+ if (opts.out) {
58
+ const fs = await import("node:fs/promises");
59
+ if (result.format === "ai") {
60
+ await fs.writeFile(opts.out, result.snapshot, "utf8");
61
+ }
62
+ else {
63
+ const payload = JSON.stringify(result, null, 2);
64
+ await fs.writeFile(opts.out, payload, "utf8");
65
+ }
66
+ if (parent?.json) {
67
+ defaultRuntime.log(JSON.stringify({ ok: true, out: opts.out }, null, 2));
68
+ }
69
+ else {
70
+ defaultRuntime.log(opts.out);
71
+ }
72
+ return;
73
+ }
74
+ if (parent?.json) {
75
+ defaultRuntime.log(JSON.stringify(result, null, 2));
76
+ return;
77
+ }
78
+ if (result.format === "ai") {
79
+ defaultRuntime.log(result.snapshot);
80
+ return;
81
+ }
82
+ const nodes = "nodes" in result ? result.nodes : [];
83
+ defaultRuntime.log(nodes
84
+ .map((n) => {
85
+ const indent = " ".repeat(Math.min(20, n.depth));
86
+ const name = n.name ? ` "${n.name}"` : "";
87
+ const value = n.value ? ` = "${n.value}"` : "";
88
+ return `${indent}- ${n.role}${name}${value}`;
89
+ })
90
+ .join("\n"));
91
+ }
92
+ catch (err) {
93
+ defaultRuntime.error(danger(String(err)));
94
+ defaultRuntime.exit(1);
95
+ }
96
+ });
97
+ }