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
package/docs/health.md ADDED
@@ -0,0 +1,28 @@
1
+ ---
2
+ summary: "Health check steps for Baileys/WhatsApp connectivity"
3
+ read_when:
4
+ - Diagnosing web provider health
5
+ ---
6
+ # Health Checks (CLI)
7
+
8
+ Short guide to verify the WhatsApp Web / Baileys stack without guessing.
9
+
10
+ ## Quick checks
11
+ - `clawdbot status` — local summary: whether creds exist, auth age, session store path + recent sessions.
12
+ - `clawdbot status --deep` — also probes the running Gateway (WhatsApp connect + Telegram + Discord APIs).
13
+ - `clawdbot health --json` — asks the running Gateway for a full health snapshot (WS-only; no direct Baileys socket).
14
+ - Send `/status` in WhatsApp/WebChat to get a status reply without invoking the agent.
15
+ - Logs: tail `/tmp/clawdbot/clawdbot-*.log` and filter for `web-heartbeat`, `web-reconnect`, `web-auto-reply`, `web-inbound`.
16
+
17
+ ## Deep diagnostics
18
+ - Creds on disk: `ls -l ~/.clawdbot/credentials/creds.json` (mtime should be recent).
19
+ - Session store: `ls -l ~/.clawdbot/sessions/sessions.json` (legacy: `~/.clawdbot/sessions.json`; path can be overridden in config). Count and recent recipients are surfaced via `status`.
20
+ - Relink flow: `clawdbot logout && clawdbot login --verbose` when status codes 409–515 or `loggedOut` appear in logs. (Note: the QR login flow auto-restarts once for status 515 after pairing.)
21
+
22
+ ## When something fails
23
+ - `logged out` or status 409–515 → relink with `clawdbot logout` then `clawdbot login`.
24
+ - Gateway unreachable → start it: `clawdbot gateway --port 18789` (use `--force` if the port is busy).
25
+ - No inbound messages → confirm linked phone is online and the sender is allowed (`whatsapp.allowFrom`); for group chats, ensure mention rules match (`routing.groupChat.mentionPatterns` and `whatsapp.groups`).
26
+
27
+ ## Dedicated "health" command
28
+ `clawdbot health --json` asks the running Gateway for its health snapshot (no direct Baileys socket from the CLI). It reports linked creds, auth age, Baileys connect result/status code, session-store summary, and a probe duration. It exits non-zero if the Gateway is unreachable or the probe fails/timeouts. Use `--timeout <ms>` to override the 10s default.
@@ -0,0 +1,64 @@
1
+ ---
2
+ summary: "Plan for heartbeat polling messages and notification rules"
3
+ read_when:
4
+ - Adjusting heartbeat cadence or messaging
5
+ ---
6
+ # Heartbeat (Gateway)
7
+
8
+ Heartbeat runs periodic agent turns in the **main session** so the model can
9
+ surface anything that needs attention without spamming the user.
10
+
11
+ ## Prompt contract
12
+ - Heartbeat body defaults to `HEARTBEAT` (configurable via `agent.heartbeat.prompt`).
13
+ - If nothing needs attention, the model should reply **exactly** `HEARTBEAT_OK`.
14
+ - During heartbeat runs, Clawdbot treats `HEARTBEAT_OK` as an ack when it appears at
15
+ the **start or end** of the reply. Clawdbot strips the token and discards the
16
+ reply if the remaining content is **≤ 30 characters**.
17
+ - If `HEARTBEAT_OK` is in the **middle** of a reply, it is not treated specially.
18
+ - For alerts, do **not** include `HEARTBEAT_OK`; return only the alert text.
19
+
20
+ ### Stray `HEARTBEAT_OK` outside heartbeats
21
+ If the model accidentally includes `HEARTBEAT_OK` at the start or end of a
22
+ normal (non-heartbeat) reply, Clawdbot strips the token and logs a verbose
23
+ message. If the reply is only `HEARTBEAT_OK`, it is dropped.
24
+
25
+ ## Config
26
+
27
+ ```json5
28
+ {
29
+ agent: {
30
+ heartbeat: {
31
+ every: "30m", // duration string: ms|s|m|h (0m disables)
32
+ model: "anthropic/claude-opus-4-5",
33
+ target: "last", // last | whatsapp | telegram | none
34
+ to: "+15551234567", // optional override for whatsapp/telegram
35
+ prompt: "HEARTBEAT" // optional override
36
+ }
37
+ }
38
+ }
39
+ ```
40
+
41
+ ### Fields
42
+ - `every`: heartbeat interval (duration string; default unit minutes). Omit or set
43
+ to `0m` to disable.
44
+ - `model`: optional model override for heartbeat runs (`provider/model`).
45
+ - `target`: where heartbeat output is delivered.
46
+ - `last` (default): send to the last used external channel.
47
+ - `whatsapp` / `telegram`: force the channel (optionally set `to`).
48
+ - `none`: do not deliver externally; output stays in the session (WebChat-visible).
49
+ - `to`: optional recipient override (E.164 for WhatsApp, chat id for Telegram).
50
+ - `prompt`: optional override for the heartbeat body (default: `HEARTBEAT`).
51
+
52
+ ## Behavior
53
+ - Runs in the main session (`main`, or `global` when scope is global).
54
+ - Uses the main lane queue; if requests are in flight, the wake is retried.
55
+ - Empty output or `HEARTBEAT_OK` is treated as “ok” and does **not** keep the
56
+ session alive (`updatedAt` is restored).
57
+ - If `target` resolves to no external destination (no last route or `none`), the
58
+ heartbeat still runs but no outbound message is sent.
59
+
60
+ ## Wake hook
61
+ - The gateway exposes a heartbeat wake hook so cron/jobs/webhooks can request an
62
+ immediate run (`requestHeartbeatNow`).
63
+ - `wake` endpoints should enqueue system events and optionally trigger a wake; the
64
+ heartbeat runner picks those up on the next tick or immediately.
package/docs/images.md ADDED
@@ -0,0 +1,52 @@
1
+ ---
2
+ summary: "Image and media handling rules for send, gateway, and agent replies"
3
+ read_when:
4
+ - Modifying media pipeline or attachments
5
+ ---
6
+ <!-- {% raw %} -->
7
+ # Image & Media Support — 2025-12-05
8
+
9
+ CLAWDBOT is now **web-only** (Baileys). This document captures the current media handling rules for send, gateway, and agent replies.
10
+
11
+ ## Goals
12
+ - Send media with optional captions via `clawdbot send --media`.
13
+ - Allow auto-replies from the web inbox to include media alongside text.
14
+ - Keep per-type limits sane and predictable.
15
+
16
+ ## CLI Surface
17
+ - `clawdbot send --media <path-or-url> [--message <caption>]`
18
+ - `--media` optional; caption can be empty for media-only sends.
19
+ - `--dry-run` prints the resolved payload; `--json` emits `{ provider, to, messageId, mediaUrl, caption }`.
20
+
21
+ ## Web Provider Behavior
22
+ - Input: local file path **or** HTTP(S) URL.
23
+ - Flow: load into a Buffer, detect media kind, and build the correct payload:
24
+ - **Images:** resize & recompress to JPEG (max side 2048px) targeting `agent.mediaMaxMb` (default 5 MB), capped at 6 MB.
25
+ - **Audio/Voice/Video:** pass-through up to 16 MB; audio is sent as a voice note (`ptt: true`).
26
+ - **Documents:** anything else, up to 100 MB, with filename preserved when available.
27
+ - WhatsApp GIF-style playback: send an MP4 with `gifPlayback: true` (CLI: `--gif-playback`) so mobile clients loop inline.
28
+ - MIME detection prefers magic bytes, then headers, then file extension.
29
+ - Caption comes from `--message` or `reply.text`; empty caption is allowed.
30
+ - Logging: non-verbose shows `↩️`/`✅`; verbose includes size and source path/URL.
31
+
32
+ ## Auto-Reply Pipeline
33
+ - `getReplyFromConfig` returns `{ text?, mediaUrl?, mediaUrls? }`.
34
+ - When media is present, the web sender resolves local paths or URLs using the same pipeline as `clawdbot send`.
35
+ - Multiple media entries are sent sequentially if provided.
36
+
37
+ ## Inbound Media to Commands (Pi)
38
+ - When inbound web messages include media, CLAWDBOT downloads to a temp file and exposes templating variables:
39
+ - `{{MediaUrl}}` pseudo-URL for the inbound media.
40
+ - `{{MediaPath}}` local temp path written before running the command.
41
+ - Audio transcription (if configured) runs before templating and can replace `Body` with the transcript.
42
+
43
+ ## Limits & Errors
44
+ - Images: ~6 MB cap after recompression.
45
+ - Audio/voice/video: 16 MB cap; documents: 100 MB cap.
46
+ - Oversize or unreadable media → clear error in logs and the reply is skipped.
47
+
48
+ ## Notes for Tests
49
+ - Cover send + reply flows for image/audio/document cases.
50
+ - Validate recompression for images (size bound) and voice-note flag for audio.
51
+ - Ensure multi-media replies fan out as sequential sends.
52
+ <!-- {% endraw %} -->
@@ -0,0 +1,63 @@
1
+ ---
2
+ summary: "iMessage support via imsg (JSON-RPC over stdio), setup, and chat_id routing"
3
+ read_when:
4
+ - Setting up iMessage support
5
+ - Debugging iMessage send/receive
6
+ ---
7
+ # iMessage (imsg)
8
+
9
+ Status: external CLI integration. No daemon.
10
+
11
+ ## Model
12
+ - Clawdbot spawns `imsg rpc` as a child process.
13
+ - JSON-RPC runs over stdin/stdout (one JSON object per line).
14
+ - Gateway owns the process; no TCP port needed.
15
+
16
+ ## Requirements
17
+ - macOS with Messages signed in.
18
+ - Full Disk Access for Clawdbot + the `imsg` binary (Messages DB access).
19
+ - Automation permission for Messages when sending.
20
+
21
+ ## Config
22
+
23
+ ```json5
24
+ {
25
+ imessage: {
26
+ enabled: true,
27
+ cliPath: "imsg",
28
+ dbPath: "~/Library/Messages/chat.db",
29
+ allowFrom: ["+15555550123", "user@example.com", "chat_id:123"],
30
+ includeAttachments: false,
31
+ mediaMaxMb: 16,
32
+ service: "auto",
33
+ region: "US"
34
+ }
35
+ }
36
+ ```
37
+
38
+ Notes:
39
+ - `allowFrom` accepts handles (phone/email) or `chat_id:<id>` entries.
40
+ - `service` defaults to `auto` (use `imessage` or `sms` to pin).
41
+ - `region` is only used for SMS targeting.
42
+
43
+ ## Addressing / targets
44
+
45
+ Prefer `chat_id` for stable routing:
46
+ - `chat_id:123` (preferred)
47
+ - `chat_guid:...` (fallback)
48
+ - `chat_identifier:...` (fallback)
49
+ - direct handles: `imessage:+1555` / `sms:+1555` / `user@example.com`
50
+
51
+ List chats:
52
+ ```
53
+ imsg chats --limit 20
54
+ ```
55
+
56
+ ## Group chat behavior
57
+ - Group messages set `ChatType=group`, `GroupSubject`, and `GroupMembers`.
58
+ - Group activation respects `imessage.groups."*".requireMention` and `routing.groupChat.mentionPatterns`.
59
+ - Replies go back to the same `chat_id` (group or direct).
60
+
61
+ ## Troubleshooting
62
+ - `clawdbot gateway call providers.status --params '{"probe":true}'`
63
+ - Verify `imsg` is on PATH and has access to Messages DB.
package/docs/index.md ADDED
@@ -0,0 +1,182 @@
1
+ ---
2
+ summary: "Top-level overview of Clawdbot, features, and purpose"
3
+ read_when:
4
+ - Introducing Clawdbot to newcomers
5
+ ---
6
+ <!-- {% raw %} -->
7
+ # CLAWDBOT 🦞
8
+
9
+ > *"EXFOLIATE! EXFOLIATE!"* — A space lobster, probably
10
+
11
+ <p align="center">
12
+ <img src="whatsapp-clawd.jpg" alt="CLAWDBOT" width="420">
13
+ </p>
14
+
15
+ <p align="center">
16
+ <strong>WhatsApp + Telegram + Discord + iMessage gateway for AI agents (Pi).</strong><br>
17
+ Send a message, get an agent response — from your pocket.
18
+ </p>
19
+
20
+ <p align="center">
21
+ <a href="https://github.com/clawdbot/clawdbot">GitHub</a> ·
22
+ <a href="https://github.com/clawdbot/clawdbot/releases">Releases</a> ·
23
+ <a href="./clawd.md">Clawd setup</a>
24
+ </p>
25
+
26
+ CLAWDBOT bridges WhatsApp (via WhatsApp Web / Baileys), Telegram (Bot API / grammY), Discord (Bot API / discord.js), and iMessage (imsg CLI) to coding agents like [Pi](https://github.com/badlogic/pi-mono).
27
+ It’s built for [Clawd](https://clawd.me), a space lobster who needed a TARDIS.
28
+
29
+ ## How it works
30
+
31
+ ```
32
+ WhatsApp / Telegram / Discord
33
+
34
+
35
+ ┌──────────────────────────┐
36
+ │ Gateway │ ws://127.0.0.1:18789 (loopback-only)
37
+ │ (single source) │ tcp://0.0.0.0:18790 (Bridge)
38
+ │ │ http://<gateway-host>:18793/__clawdbot__/canvas/ (Canvas host)
39
+ └───────────┬───────────────┘
40
+
41
+ ├─ Pi agent (RPC)
42
+ ├─ CLI (clawdbot …)
43
+ ├─ Chat UI (SwiftUI)
44
+ ├─ macOS app (Clawdbot.app)
45
+ └─ iOS node via Bridge + pairing
46
+ ```
47
+
48
+ Most operations flow through the **Gateway** (`clawdbot gateway`), a single long-running process that owns provider connections and the WebSocket control plane.
49
+
50
+ ## Network model
51
+
52
+ - **One Gateway per host**: it is the only process allowed to own the WhatsApp Web session.
53
+ - **Loopback-first**: Gateway WS defaults to `ws://127.0.0.1:18789`.
54
+ - For Tailnet access, run `clawdbot gateway --bind tailnet --token ...` (token is required for non-loopback binds).
55
+ - **Bridge for nodes**: optional LAN/tailnet-facing bridge on `tcp://0.0.0.0:18790` for paired nodes (Bonjour-discoverable).
56
+ - **Canvas host**: HTTP file server on `canvasHost.port` (default `18793`), serving `/__clawdbot__/canvas/` for node WebViews; see `docs/configuration.md` (`canvasHost`).
57
+ - **Remote use**: SSH tunnel or tailnet/VPN; see `docs/remote.md` and `docs/discovery.md`.
58
+
59
+ ## Features (high level)
60
+
61
+ - 📱 **WhatsApp Integration** — Uses Baileys for WhatsApp Web protocol
62
+ - ✈️ **Telegram Bot** — DMs + groups via grammY
63
+ - 🎮 **Discord Bot** — DMs + guild channels via discord.js
64
+ - 💬 **iMessage** — Local imsg CLI integration (macOS)
65
+ - 🤖 **Agent bridge** — Pi (RPC mode) with tool streaming
66
+ - 💬 **Sessions** — Direct chats collapse into shared `main` (default); groups are isolated
67
+ - 👥 **Group Chat Support** — Mention-based by default; owner can toggle `/activation always|mention`
68
+ - 📎 **Media Support** — Send and receive images, audio, documents
69
+ - 🎤 **Voice notes** — Optional transcription hook
70
+ - 🖥️ **WebChat + macOS app** — Local UI + menu bar companion for ops and voice wake
71
+ - 📱 **iOS node** — Pairs as a node and exposes a Canvas surface
72
+
73
+ Note: legacy Claude/Codex/Gemini/Opencode paths have been removed; Pi is the only coding-agent path.
74
+
75
+ ## Quick start
76
+
77
+ Runtime requirement: **Node ≥ 22**.
78
+
79
+ ```bash
80
+ # From source (recommended while the npm package is still settling)
81
+ pnpm install
82
+ pnpm build
83
+ pnpm link --global
84
+
85
+ # Pair WhatsApp Web (shows QR)
86
+ clawdbot login
87
+
88
+ # Run the Gateway (leave running)
89
+ clawdbot gateway --port 18789
90
+ ```
91
+
92
+ Multi-instance quickstart (optional):
93
+
94
+ ```bash
95
+ CLAWDBOT_CONFIG_PATH=~/.clawdbot/a.json \
96
+ CLAWDBOT_STATE_DIR=~/.clawdbot-a \
97
+ clawdbot gateway --port 19001
98
+ ```
99
+
100
+ Send a test message (requires a running Gateway):
101
+
102
+ ```bash
103
+ clawdbot send --to +15555550123 --message "Hello from CLAWDBOT"
104
+ ```
105
+
106
+ ## Configuration (optional)
107
+
108
+ Config lives at `~/.clawdbot/clawdbot.json`.
109
+
110
+ - If you **do nothing**, CLAWDBOT uses the bundled Pi binary in RPC mode with per-sender sessions.
111
+ - If you want to lock it down, start with `whatsapp.allowFrom` and (for groups) mention rules.
112
+
113
+ Example:
114
+
115
+ ```json5
116
+ {
117
+ whatsapp: {
118
+ allowFrom: ["+15555550123"],
119
+ groups: { "*": { requireMention: true } }
120
+ },
121
+ routing: { groupChat: { mentionPatterns: ["@clawd"] } }
122
+ }
123
+ ```
124
+
125
+ ## Docs
126
+
127
+ - Start here:
128
+ - [FAQ](./faq.md) ← *common questions answered*
129
+ - [Configuration](./configuration.md)
130
+ - [Nix mode](./nix.md)
131
+ - [Clawd personal assistant setup](./clawd.md)
132
+ - [Skills](./skills.md)
133
+ - [Skills config](./skills-config.md)
134
+ - [Workspace templates](./templates/AGENTS.md)
135
+ - [RPC adapters](./rpc.md)
136
+ - [Gateway runbook](./gateway.md)
137
+ - [Nodes (iOS/Android)](./nodes.md)
138
+ - [Web surfaces (Control UI)](./web.md)
139
+ - [Discovery + transports](./discovery.md)
140
+ - [Remote access](./remote.md)
141
+ - Providers and UX:
142
+ - [WebChat](./webchat.md)
143
+ - [Control UI (browser)](./control-ui.md)
144
+ - [Telegram](./telegram.md)
145
+ - [Discord](./discord.md)
146
+ - [iMessage](./imessage.md)
147
+ - [Groups](./groups.md)
148
+ - [WhatsApp group messages](./group-messages.md)
149
+ - [Media: images](./images.md)
150
+ - [Media: audio](./audio.md)
151
+ - Ops and safety:
152
+ - [Sessions](./session.md)
153
+ - [Cron + wakeups](./cron.md)
154
+ - [Security](./security.md)
155
+ - [Troubleshooting](./troubleshooting.md)
156
+
157
+ ## The name
158
+
159
+ **CLAWDBOT = CLAW + TARDIS** — because every space lobster needs a time-and-space machine.
160
+
161
+ ---
162
+
163
+ *"We're all just playing with our own prompts."* — an AI, probably high on tokens
164
+ <!-- {% endraw %} -->
165
+
166
+ ## Credits
167
+
168
+ - **Peter Steinberger** ([@steipete](https://twitter.com/steipete)) — Creator, lobster whisperer
169
+ - **Mario Zechner** ([@badlogicc](https://twitter.com/badlogicgames)) — Pi creator, security pen-tester
170
+ - **Clawd** — The space lobster who demanded a better name
171
+
172
+ ## Core Contributors
173
+
174
+ - **Maxim Vovshin** (@Hyaxia, 36747317+Hyaxia@users.noreply.github.com) — Blogwatcher skill
175
+
176
+ ## License
177
+
178
+ MIT — Free as a lobster in the ocean 🦞
179
+
180
+ ---
181
+
182
+ *"We're all just playing with our own prompts."* — An AI, probably high on tokens
@@ -0,0 +1,177 @@
1
+ ---
2
+ summary: "Runbook: connect/pair the iOS node to a Clawdbot Gateway and drive its Canvas"
3
+ read_when:
4
+ - Pairing or reconnecting the iOS node
5
+ - Debugging iOS bridge discovery or auth
6
+ - Sending screen/canvas commands to iOS
7
+ ---
8
+
9
+ # iOS Node Connection Runbook
10
+
11
+ This is the practical “how do I connect the iOS node” guide:
12
+
13
+ **iOS app** ⇄ (Bonjour + TCP bridge) ⇄ **Gateway bridge** ⇄ (loopback WS) ⇄ **Gateway**
14
+
15
+ The Gateway WebSocket stays loopback-only (`ws://127.0.0.1:18789`). The iOS node talks to the LAN-facing **bridge** (default `tcp://0.0.0.0:18790`) and uses Gateway-owned pairing.
16
+
17
+ ## Prerequisites
18
+
19
+ - You can run the Gateway on the “master” machine.
20
+ - iOS node app can reach the gateway bridge:
21
+ - Same LAN with Bonjour/mDNS, **or**
22
+ - Same Tailscale tailnet using Wide-Area Bonjour / unicast DNS-SD (see below), **or**
23
+ - Manual bridge host/port (fallback)
24
+ - You can run the CLI (`clawdbot`) on the gateway machine (or via SSH).
25
+
26
+ ## 1) Start the Gateway (with bridge enabled)
27
+
28
+ Bridge is enabled by default (disable via `CLAWDBOT_BRIDGE_ENABLED=0`).
29
+
30
+ ```bash
31
+ pnpm clawdbot gateway --port 18789 --verbose
32
+ ```
33
+
34
+ Confirm in logs you see something like:
35
+ - `bridge listening on tcp://0.0.0.0:18790 (node)`
36
+
37
+ For tailnet-only setups (recommended for Vienna ⇄ London), bind the bridge to the gateway machine’s Tailscale IP instead:
38
+
39
+ - Set `bridge.bind: "tailnet"` in `~/.clawdbot/clawdbot.json` on the gateway host.
40
+ - Restart the Gateway / macOS menubar app.
41
+
42
+ ## 2) Verify Bonjour discovery (optional but recommended)
43
+
44
+ From the gateway machine:
45
+
46
+ ```bash
47
+ dns-sd -B _clawdbot-bridge._tcp local.
48
+ ```
49
+
50
+ You should see your gateway advertising `_clawdbot-bridge._tcp`.
51
+
52
+ If browse works, but the iOS node can’t connect, try resolving one instance:
53
+
54
+ ```bash
55
+ dns-sd -L "<instance name>" _clawdbot-bridge._tcp local.
56
+ ```
57
+
58
+ More debugging notes: `docs/bonjour.md`.
59
+
60
+ ### Tailnet (Vienna ⇄ London) discovery via unicast DNS-SD
61
+
62
+ If the iOS node and the gateway are on different networks but connected via Tailscale, multicast mDNS won’t cross the boundary. Use Wide-Area Bonjour / unicast DNS-SD instead:
63
+
64
+ 1) Set up a DNS-SD zone (example `clawdbot.internal.`) on the gateway host and publish `_clawdbot-bridge._tcp` records.
65
+ 2) Configure Tailscale split DNS for `clawdbot.internal` pointing at that DNS server.
66
+
67
+ Details and example CoreDNS config: `docs/bonjour.md`.
68
+
69
+ ## 3) Connect from the iOS node app
70
+
71
+ In the iOS node app:
72
+ - Pick the discovered bridge (or hit refresh).
73
+ - If not paired yet, it will initiate pairing automatically.
74
+ - After the first successful pairing, it will auto-reconnect **strictly to the last discovered gateway** on launch (including after reinstall), as long as the iOS Keychain entry is still present.
75
+
76
+ ### Connection indicator (always visible)
77
+
78
+ The Settings tab icon shows a small status dot:
79
+ - **Green**: connected to the bridge
80
+ - **Yellow**: connecting (subtle pulse)
81
+ - **Red**: not connected / error
82
+
83
+ ## 4) Approve pairing (CLI)
84
+
85
+ On the gateway machine:
86
+
87
+ ```bash
88
+ clawdbot nodes pending
89
+ ```
90
+
91
+ Approve the request:
92
+
93
+ ```bash
94
+ clawdbot nodes approve <requestId>
95
+ ```
96
+
97
+ After approval, the iOS node receives/stores the token and reconnects authenticated.
98
+
99
+ Pairing details: `docs/gateway/pairing.md`.
100
+
101
+ ## 5) Verify the node is connected
102
+
103
+ - In the macOS app: **Instances** tab should show something like `iOS Node (...)` with a green “Active” presence dot shortly after connect.
104
+ - Via nodes status (paired + connected):
105
+ ```bash
106
+ clawdbot nodes status
107
+ ```
108
+ - Via Gateway (paired + connected):
109
+ ```bash
110
+ clawdbot gateway call node.list --params "{}"
111
+ ```
112
+ - Via Gateway presence (legacy-ish, still useful):
113
+ ```bash
114
+ clawdbot gateway call system-presence --params "{}"
115
+ ```
116
+ Look for the node `instanceId` (often a UUID).
117
+
118
+ ## 6) Drive the iOS Canvas (draw / snapshot)
119
+
120
+ The iOS node runs a WKWebView “Canvas” scaffold which exposes:
121
+ - `window.__clawdbot.canvas`
122
+ - `window.__clawdbot.ctx` (2D context)
123
+ - `window.__clawdbot.setStatus(title, subtitle)`
124
+
125
+ ### Gateway Canvas Host (recommended for web content)
126
+
127
+ If you want the node to show real HTML/CSS/JS that the agent can edit on disk, point it at the Gateway canvas host.
128
+
129
+ Note: nodes always use the standalone canvas host on `canvasHost.port` (default `18793`), bound to the bridge interface.
130
+
131
+ 1) Create `~/clawd/canvas/index.html` on the gateway host.
132
+
133
+ 2) Navigate the node to it (LAN):
134
+
135
+ ```bash
136
+ clawdbot nodes invoke --node "iOS Node" --command canvas.navigate --params '{"url":"http://<gateway-hostname>.local:18793/__clawdbot__/canvas/"}'
137
+ ```
138
+
139
+ Notes:
140
+ - The server injects a live-reload client into HTML and reloads on file changes.
141
+ - A2UI is hosted on the same canvas host at `http://<gateway-host>:18793/__clawdbot__/a2ui/`.
142
+ - Tailnet (optional): if both devices are on Tailscale, use a MagicDNS name or tailnet IP instead of `.local`, e.g. `http://<gateway-magicdns>:18793/__clawdbot__/canvas/`.
143
+ - iOS may require App Transport Security allowances to load plain `http://` URLs; if it fails to load, prefer HTTPS or adjust the iOS app’s ATS config.
144
+
145
+ ### Draw with `canvas.eval`
146
+
147
+ ```bash
148
+ clawdbot nodes invoke --node "iOS Node" --command canvas.eval --params "$(cat <<'JSON'
149
+ {"javaScript":"(() => { const {ctx,setStatus} = window.__clawdbot; setStatus('Drawing','…'); ctx.clearRect(0,0,innerWidth,innerHeight); ctx.lineWidth=6; ctx.strokeStyle='#ff2d55'; ctx.beginPath(); ctx.moveTo(40,40); ctx.lineTo(innerWidth-40, innerHeight-40); ctx.stroke(); setStatus(null,null); return 'ok'; })()"}
150
+ JSON
151
+ )"
152
+ ```
153
+
154
+ ### Snapshot with `canvas.snapshot`
155
+
156
+ ```bash
157
+ clawdbot nodes invoke --node 192.168.0.88 --command canvas.snapshot --params '{"maxWidth":900}'
158
+ ```
159
+
160
+ The response includes `{ format, base64 }` image data (default `format="jpeg"`; pass `{"format":"png"}` when you specifically need lossless PNG).
161
+
162
+ ## Common gotchas
163
+
164
+ - **iOS in background:** all `canvas.*` commands fail fast with `NODE_BACKGROUND_UNAVAILABLE` (bring the iOS node app to foreground).
165
+ - **Return to default scaffold:** `canvas.navigate` with `{"url":""}` or `{"url":"/"}` returns to the built-in scaffold page.
166
+ - **mDNS blocked:** some networks block multicast; use a different LAN or plan a tailnet-capable bridge (see `docs/discovery.md`).
167
+ - **Wrong node selector:** `--node` can be the node id (UUID), display name (e.g. `iOS Node`), IP, or an unambiguous prefix. If it’s ambiguous, the CLI will tell you.
168
+ - **Stale pairing / Keychain cleared:** if the pairing token is missing (or iOS Keychain was wiped), the node must pair again; approve a new pending request.
169
+ - **App reinstall but no reconnect:** the node restores `instanceId` + last bridge preference from Keychain; if it still comes up “unpaired”, verify Keychain persistence on your device/simulator and re-pair once.
170
+
171
+ ## Related docs
172
+
173
+ - `docs/ios/spec.md` (design + architecture)
174
+ - `docs/gateway.md` (gateway runbook)
175
+ - `docs/gateway/pairing.md` (approval + storage)
176
+ - `docs/bonjour.md` (discovery debugging)
177
+ - `docs/discovery.md` (LAN vs tailnet vs SSH)