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,293 @@
1
+ ---
2
+ summary: "Discord bot support status, capabilities, and configuration"
3
+ read_when:
4
+ - Working on Discord surface features
5
+ ---
6
+ # Discord (Bot API)
7
+
8
+ Updated: 2025-12-07
9
+
10
+ Status: ready for DM and guild text channels via the official Discord bot gateway.
11
+
12
+ ## Goals
13
+ - Talk to Clawdbot via Discord DMs or guild channels.
14
+ - Share the same `main` session used by WhatsApp/Telegram/WebChat; guild channels stay isolated as `discord:group:<channelId>` (display names use `discord:<guildSlug>#<channelSlug>`).
15
+ - Group DMs are ignored by default; enable via `discord.dm.groupEnabled` and optionally restrict by `discord.dm.groupChannels`.
16
+ - Keep routing deterministic: replies always go back to the surface they arrived on.
17
+
18
+ ## How it works
19
+ 1. Create a Discord application → Bot, enable the intents you need (DMs + guild messages + message content), and grab the bot token.
20
+ 2. Invite the bot to your server with the permissions required to read/send messages where you want to use it.
21
+ 3. Configure Clawdbot with `DISCORD_BOT_TOKEN` (or `discord.token` in `~/.clawdbot/clawdbot.json`).
22
+ 4. Run the gateway; it auto-starts the Discord provider only when a `discord` config section exists **and** the token is set (unless `discord.enabled = false`).
23
+ - If you prefer env vars, still add `discord: { enabled: true }` to `~/.clawdbot/clawdbot.json` and set `DISCORD_BOT_TOKEN`.
24
+ 5. Direct chats: use `user:<id>` (or a `<@id>` mention) when delivering; all turns land in the shared `main` session.
25
+ 6. Guild channels: use `channel:<channelId>` for delivery. Mentions are required by default and can be set per guild or per channel.
26
+ 7. Optional DM control: set `discord.dm.enabled = false` to ignore all DMs, or `discord.dm.allowFrom` to allow specific users (ids or names). Use `discord.dm.groupEnabled` + `discord.dm.groupChannels` to allow group DMs.
27
+ 8. Optional guild rules: set `discord.guilds` keyed by guild id (preferred) or slug, with per-channel rules.
28
+ 9. Optional slash commands: enable `discord.slashCommand` to accept user-installed app commands (ephemeral replies). Slash invocations respect the same DM/guild allowlists.
29
+ 10. Optional guild context history: set `discord.historyLimit` (default 20) to include the last N guild messages as context when replying to a mention. Set `0` to disable.
30
+ 11. Reactions: the agent can trigger reactions via the `discord` tool (gated by `discord.actions.*`).
31
+ - The `discord` tool is only exposed when the current surface is Discord.
32
+ 12. Slash commands use isolated session keys (`${sessionPrefix}:${userId}`) rather than the shared `main` session.
33
+
34
+ Note: Discord does not provide a simple username → id lookup without extra guild context, so prefer ids or `<@id>` mentions for DM delivery targets.
35
+ Note: Slugs are lowercase with spaces replaced by `-`. Channel names are slugged without the leading `#`.
36
+ Note: Guild context `[from:]` lines include `author.tag` + `id` to make ping-ready replies easy.
37
+
38
+ ## How to create your own bot
39
+
40
+ This is the “Discord Developer Portal” setup for running Clawdbot in a server (guild) channel like `#help`.
41
+
42
+ ### 1) Create the Discord app + bot user
43
+ 1. Discord Developer Portal → **Applications** → **New Application**
44
+ 2. In your app:
45
+ - **Bot** → **Add Bot**
46
+ - Copy the **Bot Token** (this is what you put in `DISCORD_BOT_TOKEN`)
47
+
48
+ ### 2) Enable the gateway intents Clawdbot needs
49
+ Discord blocks “privileged intents” unless you explicitly enable them.
50
+
51
+ In **Bot** → **Privileged Gateway Intents**, enable:
52
+ - **Message Content Intent** (required to read message text in most guilds; without it you’ll see “Used disallowed intents” or the bot will connect but not react to messages)
53
+ - **Server Members Intent** (recommended; required for some member/user lookups and allowlist matching in guilds)
54
+
55
+ You usually do **not** need **Presence Intent**.
56
+
57
+ ### 3) Generate an invite URL (OAuth2 URL Generator)
58
+ In your app: **OAuth2** → **URL Generator**
59
+
60
+ **Scopes**
61
+ - ✅ `bot`
62
+ - ✅ `applications.commands` (only if you want slash commands; otherwise leave unchecked)
63
+
64
+ **Bot Permissions** (minimal baseline)
65
+ - ✅ View Channels
66
+ - ✅ Send Messages
67
+ - ✅ Read Message History
68
+ - ✅ Embed Links
69
+ - ✅ Attach Files
70
+ - ✅ Add Reactions (optional but recommended)
71
+ - ✅ Use External Emojis / Stickers (optional; only if you want them)
72
+
73
+ Avoid **Administrator** unless you’re debugging and fully trust the bot.
74
+
75
+ Copy the generated URL, open it, pick your server, and install the bot.
76
+
77
+ ### 4) Get the ids (guild/user/channel)
78
+ Discord uses numeric ids everywhere; Clawdbot config prefers ids.
79
+
80
+ 1. Discord (desktop/web) → **User Settings** → **Advanced** → enable **Developer Mode**
81
+ 2. Right-click:
82
+ - Server name → **Copy Server ID** (guild id)
83
+ - Channel (e.g. `#help`) → **Copy Channel ID**
84
+ - Your user → **Copy User ID**
85
+
86
+ ### 5) Configure Clawdbot
87
+
88
+ #### Token
89
+ Set the bot token via env var (recommended on servers):
90
+ - `DISCORD_BOT_TOKEN=...`
91
+
92
+ Or via config:
93
+
94
+ ```json5
95
+ {
96
+ discord: {
97
+ enabled: true,
98
+ token: "YOUR_BOT_TOKEN"
99
+ }
100
+ }
101
+ ```
102
+
103
+ #### Allowlist + channel routing
104
+ Example “single server, only allow me, only allow #help”:
105
+
106
+ ```json5
107
+ {
108
+ discord: {
109
+ enabled: true,
110
+ dm: { enabled: false },
111
+ guilds: {
112
+ "YOUR_GUILD_ID": {
113
+ users: ["YOUR_USER_ID"],
114
+ requireMention: true,
115
+ channels: {
116
+ help: { allow: true, requireMention: true }
117
+ }
118
+ }
119
+ }
120
+ }
121
+ }
122
+ ```
123
+
124
+ Notes:
125
+ - `requireMention: true` means the bot only replies when mentioned (recommended for shared channels).
126
+ - If `channels` is present, any channel not listed is denied by default.
127
+
128
+ ### 6) Verify it works
129
+ 1. Start the gateway.
130
+ 2. In your server channel, send: `@Krill hello` (or whatever your bot name is).
131
+ 3. If nothing happens: check **Troubleshooting** below.
132
+
133
+ ### Troubleshooting
134
+ - **“Used disallowed intents”**: enable **Message Content Intent** (and likely **Server Members Intent**) in the Developer Portal, then restart the gateway.
135
+ - **Bot connects but never replies in a guild channel**:
136
+ - Missing **Message Content Intent**, or
137
+ - The bot lacks channel permissions (View/Send/Read History), or
138
+ - Your config requires mentions and you didn’t mention it, or
139
+ - Your guild/channel allowlist denies the channel/user.
140
+ - **DMs don’t work**: `discord.dm.enabled` may be `false` or `discord.dm.allowFrom` doesn’t include you.
141
+
142
+ ## Capabilities & limits
143
+ - DMs and guild text channels (threads are treated as separate channels; voice not supported).
144
+ - Typing indicators sent best-effort; message chunking honors Discord’s 2k character limit.
145
+ - File uploads supported up to the configured `discord.mediaMaxMb` (default 8 MB).
146
+ - Mention-gated guild replies by default to avoid noisy bots.
147
+ - Reply context is injected when a message references another message (quoted content + ids).
148
+ - Native reply threading is **off by default**; enable with `discord.replyToMode` and reply tags.
149
+
150
+ ## Config
151
+
152
+ ```json5
153
+ {
154
+ discord: {
155
+ enabled: true,
156
+ token: "abc.123",
157
+ mediaMaxMb: 8,
158
+ actions: {
159
+ reactions: true,
160
+ stickers: true,
161
+ polls: true,
162
+ permissions: true,
163
+ messages: true,
164
+ threads: true,
165
+ pins: true,
166
+ search: true,
167
+ memberInfo: true,
168
+ roleInfo: true,
169
+ roles: false,
170
+ channelInfo: true,
171
+ voiceStatus: true,
172
+ events: true,
173
+ moderation: false
174
+ },
175
+ replyToMode: "off",
176
+ slashCommand: {
177
+ enabled: true,
178
+ name: "clawd",
179
+ sessionPrefix: "discord:slash",
180
+ ephemeral: true
181
+ },
182
+ dm: {
183
+ enabled: true,
184
+ allowFrom: ["123456789012345678", "steipete"],
185
+ groupEnabled: false,
186
+ groupChannels: ["clawd-dm"]
187
+ },
188
+ guilds: {
189
+ "*": { requireMention: true },
190
+ "123456789012345678": {
191
+ slug: "friends-of-clawd",
192
+ requireMention: false,
193
+ reactionNotifications: "own",
194
+ users: ["987654321098765432", "steipete"],
195
+ channels: {
196
+ general: { allow: true },
197
+ help: { allow: true, requireMention: true }
198
+ }
199
+ }
200
+ }
201
+ }
202
+ }
203
+ ```
204
+
205
+ - `dm.enabled`: set `false` to ignore all DMs (default `true`).
206
+ - `dm.allowFrom`: DM allowlist (user ids or names). Omit or set to `["*"]` to allow any DM sender.
207
+ - `dm.groupEnabled`: enable group DMs (default `false`).
208
+ - `dm.groupChannels`: optional allowlist for group DM channel ids or slugs.
209
+ - `guilds`: per-guild rules keyed by guild id (preferred) or slug.
210
+ - `guilds."*"`: default per-guild settings applied when no explicit entry exists.
211
+ - `guilds.<id>.slug`: optional friendly slug used for display names.
212
+ - `guilds.<id>.users`: optional per-guild user allowlist (ids or names).
213
+ - `guilds.<id>.channels`: channel rules (keys are channel slugs or ids).
214
+ - `guilds.<id>.requireMention`: per-guild mention requirement (overridable per channel).
215
+ - `guilds.<id>.reactionNotifications`: reaction system event mode (`off`, `own`, `all`, `allowlist`).
216
+ - `slashCommand`: optional config for user-installed slash commands (ephemeral responses).
217
+ - `mediaMaxMb`: clamp inbound media saved to disk.
218
+ - `historyLimit`: number of recent guild messages to include as context when replying to a mention (default 20, `0` disables).
219
+ - `actions`: per-action tool gates; omit to allow all (set `false` to disable).
220
+ - `reactions` (covers react + read reactions)
221
+ - `stickers`, `polls`, `permissions`, `messages`, `threads`, `pins`, `search`
222
+ - `memberInfo`, `roleInfo`, `channelInfo`, `voiceStatus`, `events`
223
+ - `roles` (role add/remove, default `false`)
224
+ - `moderation` (timeout/kick/ban, default `false`)
225
+
226
+ Reaction notifications use `guilds.<id>.reactionNotifications`:
227
+ - `off`: no reaction events.
228
+ - `own`: reactions on the bot's own messages (default).
229
+ - `all`: all reactions on all messages.
230
+ - `allowlist`: reactions from `guilds.<id>.users` on all messages (empty list disables).
231
+
232
+ ### Tool action defaults
233
+
234
+ | Action group | Default | Notes |
235
+ | --- | --- | --- |
236
+ | reactions | enabled | React + list reactions + emojiList |
237
+ | stickers | enabled | Send stickers |
238
+ | polls | enabled | Create polls |
239
+ | permissions | enabled | Channel permission snapshot |
240
+ | messages | enabled | Read/send/edit/delete |
241
+ | threads | enabled | Create/list/reply |
242
+ | pins | enabled | Pin/unpin/list |
243
+ | search | enabled | Message search (preview spec) |
244
+ | memberInfo | enabled | Member info |
245
+ | roleInfo | enabled | Role list |
246
+ | channelInfo | enabled | Channel info + list |
247
+ | voiceStatus | enabled | Voice state lookup |
248
+ | events | enabled | List/create scheduled events |
249
+ | roles | disabled | Role add/remove |
250
+ | moderation | disabled | Timeout/kick/ban |
251
+ - `replyToMode`: `off` (default), `first`, or `all`. Applies only when the model includes a reply tag.
252
+
253
+ ## Reply tags
254
+ To request a threaded reply, the model can include one tag in its output:
255
+ - `[[reply_to_current]]` — reply to the triggering Discord message.
256
+ - `[[reply_to:<id>]]` — reply to a specific message id from context/history.
257
+ Current message ids are appended to prompts as `[message_id: …]`; history entries already include ids.
258
+
259
+ Behavior is controlled by `discord.replyToMode`:
260
+ - `off`: ignore tags.
261
+ - `first`: only the first outbound chunk/attachment is a reply.
262
+ - `all`: every outbound chunk/attachment is a reply.
263
+
264
+ Allowlist matching notes:
265
+ - `allowFrom`/`users`/`groupChannels` accept ids, names, tags, or mentions like `<@id>`.
266
+ - Prefixes like `discord:`/`user:` (users) and `channel:` (group DMs) are supported.
267
+ - Use `*` to allow any sender/channel.
268
+ - When `guilds.<id>.channels` is present, channels not listed are denied by default.
269
+
270
+ Slash command notes:
271
+ - Register a chat input command in Discord with at least one string option (e.g., `prompt`).
272
+ - The first non-empty string option is treated as the prompt.
273
+ - Slash commands honor the same allowlists as DMs/guild messages (`discord.dm.allowFrom`, `discord.guilds`, per-channel rules).
274
+ - Clawdbot will auto-register `/clawd` (or the configured name) if it doesn't already exist.
275
+
276
+ ## Tool actions
277
+ The agent can call `discord` with actions like:
278
+ - `react` / `reactions` (add or list reactions)
279
+ - `sticker`, `poll`, `permissions`
280
+ - `readMessages`, `sendMessage`, `editMessage`, `deleteMessage`
281
+ - `threadCreate`, `threadList`, `threadReply`
282
+ - `pinMessage`, `unpinMessage`, `listPins`
283
+ - `searchMessages`, `memberInfo`, `roleInfo`, `roleAdd`, `roleRemove`, `emojiList`
284
+ - `channelInfo`, `channelList`, `voiceStatus`, `eventList`, `eventCreate`
285
+ - `timeout`, `kick`, `ban`
286
+
287
+ Discord message ids are surfaced in the injected context (`[discord message id: …]` and history lines) so the agent can target them.
288
+ Emoji can be unicode (e.g., `✅`) or custom emoji syntax like `<:party_blob:1234567890>`.
289
+
290
+ ## Safety & ops
291
+ - Treat the bot token like a password; prefer the `DISCORD_BOT_TOKEN` env var on supervised hosts or lock down the config file permissions.
292
+ - Only grant the bot permissions it needs (typically Read/Send Messages).
293
+ - If the bot is stuck or rate limited, restart the gateway (`clawdbot gateway --force`) after confirming no other processes own the Discord session.
@@ -0,0 +1,112 @@
1
+ ---
2
+ summary: "Node discovery and transports (Bonjour, Tailscale, SSH) for finding the gateway"
3
+ read_when:
4
+ - Implementing or changing Bonjour discovery/advertising
5
+ - Adjusting remote connection modes (direct vs SSH)
6
+ - Designing bridge + pairing for remote nodes
7
+ ---
8
+ # Discovery & transports
9
+
10
+ Clawdbot has two distinct problems that look similar on the surface:
11
+
12
+ 1) **Operator remote control**: the macOS menu bar app controlling a gateway running elsewhere.
13
+ 2) **Node pairing**: iOS/Android (and future nodes) finding a gateway and pairing securely.
14
+
15
+ The design goal is to keep all network discovery/advertising in the **Node Gateway** (`clawd` / `clawdbot gateway`) and keep clients (mac app, iOS) as consumers.
16
+
17
+ ## Terms
18
+
19
+ - **Gateway**: the single, long-running gateway process that owns state (sessions, pairing, node registry) and runs providers.
20
+ - **Gateway WS (loopback)**: the existing gateway WebSocket control endpoint on `127.0.0.1:18789`.
21
+ - **Bridge (direct transport)**: a LAN/tailnet-facing endpoint owned by the gateway that allows authenticated clients/nodes to call a scoped subset of gateway methods. The bridge exists so the gateway can remain loopback-only.
22
+ - **SSH transport (fallback)**: remote control by forwarding `127.0.0.1:18789` over SSH.
23
+
24
+ ## Why we keep both “direct” and SSH
25
+
26
+ - **Direct bridge** is the best UX on the same network and within a tailnet:
27
+ - auto-discovery on LAN via Bonjour
28
+ - pairing tokens + ACLs owned by the gateway
29
+ - no shell access required; protocol surface can stay tight and auditable
30
+ - **SSH** remains the universal fallback:
31
+ - works anywhere you have SSH access (even across unrelated networks)
32
+ - survives multicast/mDNS issues
33
+ - requires no new inbound ports besides SSH
34
+
35
+ ## Discovery inputs (how clients learn where the gateway is)
36
+
37
+ ### 1) Bonjour / mDNS (LAN only)
38
+
39
+ Bonjour is best-effort and does not cross networks. It is only used for “same LAN” convenience.
40
+
41
+ Target direction:
42
+ - The **gateway** advertises its bridge via Bonjour.
43
+ - Clients browse and show a “pick a gateway” list, then store the chosen endpoint.
44
+
45
+ Troubleshooting and beacon details: `docs/bonjour.md`.
46
+
47
+ #### Current implementation
48
+
49
+ - Service types:
50
+ - `_clawdbot-bridge._tcp` (bridge transport beacon)
51
+ - TXT keys (non-secret):
52
+ - `role=gateway`
53
+ - `lanHost=<hostname>.local`
54
+ - `sshPort=22` (or whatever is advertised)
55
+ - `gatewayPort=18789` (loopback WS port; informational)
56
+ - `bridgePort=18790` (when bridge is enabled)
57
+ - `canvasPort=18793` (default canvas host port; serves `/__clawdbot__/canvas/`)
58
+ - `cliPath=<path>` (optional; absolute path to a runnable `clawdbot` entrypoint or binary)
59
+ - `tailnetDns=<magicdns>` (optional hint; auto-detected when Tailscale is available)
60
+
61
+ Disable/override:
62
+ - `CLAWDBOT_DISABLE_BONJOUR=1` disables advertising.
63
+ - `CLAWDBOT_BRIDGE_ENABLED=0` disables the bridge listener.
64
+ - `bridge.bind` / `bridge.port` in `~/.clawdbot/clawdbot.json` control bridge bind/port (preferred).
65
+ - `CLAWDBOT_BRIDGE_HOST` / `CLAWDBOT_BRIDGE_PORT` still work as a back-compat override when `bridge.bind` / `bridge.port` are not set.
66
+ - `CLAWDBOT_SSH_PORT` overrides the SSH port advertised in the bridge beacon (defaults to 22).
67
+ - `CLAWDBOT_TAILNET_DNS` publishes a `tailnetDns` hint (MagicDNS) in the bridge beacon (auto-detected if unset).
68
+
69
+ ### 2) Tailnet (cross-network)
70
+
71
+ For London/Vienna style setups, Bonjour won’t help. The recommended “direct” target is:
72
+ - Tailscale MagicDNS name (preferred) or a stable tailnet IP.
73
+
74
+ If the gateway can detect it is running under Tailscale, it publishes `tailnetDns` as an optional hint for clients (including wide-area beacons).
75
+
76
+ ### 3) Manual / SSH target
77
+
78
+ When there is no direct route (or direct is disabled), clients can always connect via SSH by forwarding the loopback gateway port.
79
+
80
+ See `docs/remote.md`.
81
+
82
+ ## Transport selection (client policy)
83
+
84
+ Recommended client behavior:
85
+
86
+ 1) If a paired direct endpoint is configured and reachable, use it.
87
+ 2) Else, if Bonjour finds a gateway on LAN, offer a one-tap “Use this gateway” choice and save it as the direct endpoint.
88
+ 3) Else, if a tailnet DNS/IP is configured, try direct.
89
+ 4) Else, fall back to SSH.
90
+
91
+ ## Pairing + auth (direct transport)
92
+
93
+ The gateway is the source of truth for node/client admission.
94
+
95
+ - Pairing requests are created/approved/rejected in the gateway (see `docs/gateway/pairing.md`).
96
+ - The bridge enforces:
97
+ - auth (token / keypair)
98
+ - scopes/ACLs (bridge is not a raw proxy to every gateway method)
99
+ - rate limits
100
+
101
+ ## Where the code lives (target architecture)
102
+
103
+ - Node gateway:
104
+ - advertises discovery beacons (Bonjour)
105
+ - owns pairing storage + decisions
106
+ - runs the bridge listener (direct transport)
107
+ - macOS app:
108
+ - UI for picking a gateway, showing pairing prompts, and troubleshooting
109
+ - SSH tunneling only for the fallback path
110
+ - iOS node:
111
+ - browses Bonjour (LAN) as a convenience only
112
+ - uses direct transport + pairing to connect to the gateway
package/docs/docker.md ADDED
@@ -0,0 +1,251 @@
1
+ ---
2
+ summary: "Optional Docker-based setup and onboarding for Clawdbot"
3
+ read_when:
4
+ - You want a containerized gateway instead of local installs
5
+ - You are validating the Docker flow
6
+ ---
7
+
8
+ # Docker (optional)
9
+
10
+ Docker is **optional**. Use it only if you want a containerized gateway or to validate the Docker flow.
11
+
12
+ This guide covers:
13
+ - Containerized Gateway (full Clawdbot in Docker)
14
+ - Per-session Agent Sandbox (host gateway + Docker-isolated agent tools)
15
+
16
+ ## Requirements
17
+
18
+ - Docker Desktop (or Docker Engine) + Docker Compose v2
19
+ - Enough disk for images + logs
20
+
21
+ ## Containerized Gateway (Docker Compose)
22
+
23
+ ### Quick start (recommended)
24
+
25
+ From repo root:
26
+
27
+ ```bash
28
+ ./docker-setup.sh
29
+ ```
30
+
31
+ This script:
32
+ - builds the gateway image
33
+ - runs the onboarding wizard
34
+ - runs WhatsApp login
35
+ - starts the gateway via Docker Compose
36
+
37
+ It writes config/workspace on the host:
38
+ - `~/.clawdbot/`
39
+ - `~/clawd`
40
+
41
+ ### Manual flow (compose)
42
+
43
+ ```bash
44
+ docker build -t clawdbot:local -f Dockerfile .
45
+ docker compose run --rm clawdbot-cli onboard
46
+ docker compose run --rm clawdbot-cli login
47
+ docker compose up -d clawdbot-gateway
48
+ ```
49
+
50
+ ### Health check
51
+
52
+ ```bash
53
+ docker compose exec clawdbot-gateway node dist/index.js health --token "$CLAWDBOT_GATEWAY_TOKEN"
54
+ ```
55
+
56
+ ### E2E smoke test (Docker)
57
+
58
+ ```bash
59
+ scripts/e2e/onboard-docker.sh
60
+ ```
61
+
62
+ ### Notes
63
+
64
+ - Gateway bind defaults to `lan` for container use.
65
+ - The gateway container is the source of truth for sessions (`~/.clawdbot/sessions`).
66
+
67
+ ## Per-session Agent Sandbox (host gateway + Docker tools)
68
+
69
+ ### What it does
70
+
71
+ When `agent.sandbox` is enabled, **non-main sessions** run tools inside a Docker
72
+ container. The gateway stays on your host, but the tool execution is isolated:
73
+ - one container per session (hard wall)
74
+ - per-session workspace folder mounted at `/workspace`
75
+ - allow/deny tool policy (deny wins)
76
+
77
+ ### Default behavior
78
+
79
+ - Image: `clawdbot-sandbox:bookworm-slim`
80
+ - One container per session
81
+ - Workspace per session under `~/.clawdbot/sandboxes`
82
+ - Auto-prune: idle > 24h OR age > 7d
83
+ - Network: `none` by default (explicitly opt-in if you need egress)
84
+ - Default allow: `bash`, `process`, `read`, `write`, `edit`
85
+ - Default deny: `browser`, `canvas`, `nodes`, `cron`, `discord`, `gateway`
86
+
87
+ ### Enable sandboxing
88
+
89
+ ```json5
90
+ {
91
+ agent: {
92
+ sandbox: {
93
+ mode: "non-main", // off | non-main | all
94
+ perSession: true,
95
+ workspaceRoot: "~/.clawdbot/sandboxes",
96
+ docker: {
97
+ image: "clawdbot-sandbox:bookworm-slim",
98
+ workdir: "/workspace",
99
+ readOnlyRoot: true,
100
+ tmpfs: ["/tmp", "/var/tmp", "/run"],
101
+ network: "none",
102
+ user: "1000:1000",
103
+ capDrop: ["ALL"],
104
+ env: { LANG: "C.UTF-8" },
105
+ setupCommand: "apt-get update && apt-get install -y git curl jq",
106
+ pidsLimit: 256,
107
+ memory: "1g",
108
+ memorySwap: "2g",
109
+ cpus: 1,
110
+ ulimits: {
111
+ nofile: { soft: 1024, hard: 2048 },
112
+ nproc: 256
113
+ },
114
+ seccompProfile: "/path/to/seccomp.json",
115
+ apparmorProfile: "clawdbot-sandbox",
116
+ dns: ["1.1.1.1", "8.8.8.8"],
117
+ extraHosts: ["internal.service:10.0.0.5"]
118
+ },
119
+ tools: {
120
+ allow: ["bash", "process", "read", "write", "edit"],
121
+ deny: ["browser", "canvas", "nodes", "cron", "discord", "gateway"]
122
+ },
123
+ prune: {
124
+ idleHours: 24, // 0 disables idle pruning
125
+ maxAgeDays: 7 // 0 disables max-age pruning
126
+ }
127
+ }
128
+ }
129
+ }
130
+ ```
131
+
132
+ Hardening knobs live under `agent.sandbox.docker`:
133
+ `network`, `user`, `pidsLimit`, `memory`, `memorySwap`, `cpus`, `ulimits`,
134
+ `seccompProfile`, `apparmorProfile`, `dns`, `extraHosts`.
135
+
136
+ ### Build the default sandbox image
137
+
138
+ ```bash
139
+ scripts/sandbox-setup.sh
140
+ ```
141
+
142
+ This builds `clawdbot-sandbox:bookworm-slim` using `Dockerfile.sandbox`.
143
+
144
+ ### Sandbox common image (optional)
145
+ If you want a sandbox image with common build tooling (Node, Go, Rust, etc.), build the common image:
146
+
147
+ ```bash
148
+ scripts/sandbox-common-setup.sh
149
+ ```
150
+
151
+ This builds `clawdbot-sandbox-common:bookworm-slim`. To use it:
152
+
153
+ ```json5
154
+ {
155
+ agent: { sandbox: { docker: { image: "clawdbot-sandbox-common:bookworm-slim" } } }
156
+ }
157
+ ```
158
+
159
+ ### Sandbox browser image
160
+
161
+ To run the browser tool inside the sandbox, build the browser image:
162
+
163
+ ```bash
164
+ scripts/sandbox-browser-setup.sh
165
+ ```
166
+
167
+ This builds `clawdbot-sandbox-browser:bookworm-slim` using
168
+ `Dockerfile.sandbox-browser`. The container runs Chromium with CDP enabled and
169
+ an optional noVNC observer (headful via Xvfb).
170
+
171
+ Notes:
172
+ - Headful (Xvfb) reduces bot blocking vs headless.
173
+ - Headless can still be used by setting `agent.sandbox.browser.headless=true`.
174
+ - No full desktop environment (GNOME) is needed; Xvfb provides the display.
175
+
176
+ Use config:
177
+
178
+ ```json5
179
+ {
180
+ agent: {
181
+ sandbox: {
182
+ browser: { enabled: true }
183
+ }
184
+ }
185
+ }
186
+ ```
187
+
188
+ Custom browser image:
189
+
190
+ ```json5
191
+ {
192
+ agent: {
193
+ sandbox: { browser: { image: "my-clawdbot-browser" } }
194
+ }
195
+ }
196
+ ```
197
+
198
+ When enabled, the agent receives:
199
+ - a sandbox browser control URL (for the `browser` tool)
200
+ - a noVNC URL (if enabled and headless=false)
201
+
202
+ Remember: if you use an allowlist for tools, add `browser` (and remove it from
203
+ deny) or the tool remains blocked.
204
+ Prune rules (`agent.sandbox.prune`) apply to browser containers too.
205
+
206
+ ### Custom sandbox image
207
+
208
+ Build your own image and point config to it:
209
+
210
+ ```bash
211
+ docker build -t my-clawdbot-sbx -f Dockerfile.sandbox .
212
+ ```
213
+
214
+ ```json5
215
+ {
216
+ agent: {
217
+ sandbox: { docker: { image: "my-clawdbot-sbx" } }
218
+ }
219
+ }
220
+ ```
221
+
222
+ ### Tool policy (allow/deny)
223
+
224
+ - `deny` wins over `allow`.
225
+ - If `allow` is empty: all tools (except deny) are available.
226
+ - If `allow` is non-empty: only tools in `allow` are available (minus deny).
227
+
228
+ ### Pruning strategy
229
+
230
+ Two knobs:
231
+ - `prune.idleHours`: remove containers not used in X hours (0 = disable)
232
+ - `prune.maxAgeDays`: remove containers older than X days (0 = disable)
233
+
234
+ Example:
235
+ - Keep busy sessions but cap lifetime:
236
+ `idleHours: 24`, `maxAgeDays: 7`
237
+ - Never prune:
238
+ `idleHours: 0`, `maxAgeDays: 0`
239
+
240
+ ### Security notes
241
+
242
+ - Hard wall only applies to **tools** (bash/read/write/edit).
243
+ - Host-only tools like browser/camera/canvas are blocked by default.
244
+ - Allowing `browser` in sandbox **breaks isolation** (browser runs on host).
245
+
246
+ ## Troubleshooting
247
+
248
+ - Image missing: build with `scripts/sandbox-setup.sh` or set `agent.sandbox.docker.image`.
249
+ - Container not running: it will auto-create per session on demand.
250
+ - Permission errors in sandbox: set `docker.user` to a UID:GID that matches your
251
+ mounted workspace ownership (or chown the workspace folder).