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/CHANGELOG.md ADDED
@@ -0,0 +1,120 @@
1
+ # Changelog
2
+
3
+ **Why this looks different:** the project was renamed from **Clawdis → Clawdbot**. To make the transition clear, releases now use **date-based versions** (`YYYY.M.D`) and the changelog is **compressed** into milestone summaries. Full detail still lives in git history and the docs.
4
+
5
+ ## Unreleased
6
+
7
+ ### Highlights
8
+ - Models: add image-specific model config (`agent.imageModel` + fallbacks) and scan support.
9
+ - Agent tools: new `image` tool routed to the image model (when configured).
10
+
11
+ ### Fixes
12
+ - Android: tapping the foreground service notification brings the app to the front. (#179) — thanks @Syhids
13
+ - Cron tool passes `id` to the gateway for update/remove/run/runs (keeps `jobId` input). (#180) — thanks @adamgall
14
+ - macOS: treat location permission as always-only to avoid iOS-only enums. (#165) — thanks @Nachx639
15
+
16
+ ## 2026.1.4-1
17
+
18
+ ### Fixes
19
+ - npm package: include missing `dist/*` runtime modules (fixes `npx clawdbot@latest`).
20
+
21
+
22
+ ## 2026.1.4
23
+
24
+ ### Highlights
25
+ - Rename completion: all CLIs, paths, bundle IDs, env vars, and docs standardized on **Clawdbot**.
26
+ - Agent-to-agent relay: `sessions_send` ping‑pong with `REPLY_SKIP` plus announce step with `ANNOUNCE_SKIP`.
27
+ - Gateway quality-of-life: config hot reload, port config support, and Control UI base paths.
28
+ - Sandbox additions: per-session Docker sandbox with hardened limits + optional sandboxed Chromium.
29
+ - New node capability: `location.get` across macOS/iOS/Android (CLI + tools).
30
+ - Models CLI: scan OpenRouter free models (tools/images), manage aliases/fallbacks, and show last-used model in status.
31
+
32
+ ### Breaking
33
+ - Tool names drop the `clawdbot_` prefix (`browser`, `canvas`, `nodes`, `cron`, `gateway`).
34
+ - Bash tool removes node-pty `stdinMode: "pty"` support (use tmux for real TTYs).
35
+ - Primary session key is fixed to `main` (or `global` for global scope).
36
+
37
+ ### Fixes
38
+ - Doctor migrates legacy Clawdis config/service installs and normalizes sandbox Docker names.
39
+ - Doctor checks sandbox image availability and offers to build or fall back to legacy images.
40
+ - Presence beacons keep node lists fresh; Instances view stays accurate.
41
+ - Block streaming/chunking reliability (Telegram/Discord ordering, fewer duplicates).
42
+ - WhatsApp GIF playback for MP4-based GIFs.
43
+ - Onboarding + Control UI basePath handling fixes and UI polish.
44
+ - Clearer tool summaries, reduced log noise, and safer watchdog/queue behavior.
45
+ - Canvas host watcher resilience; build and packaging edge cases cleaned up.
46
+
47
+ ### Docs
48
+ - Sandbox setup, hot reload, port config, and session announce step coverage.
49
+ - Skills and onboarding clarifications + additional examples.
50
+
51
+ ## 2026.1.3 (beta 5)
52
+
53
+ ### Breaking
54
+ - Skills config moved under `skills.*` (new `skills.entries`, `skills.allowBundled`).
55
+ - Group session keys now `surface:group:<id>` / `surface:channel:<id>`; legacy `group:*` removed.
56
+ - Discord config refactor; `discord.allowFrom` + `discord.requireMention` removed.
57
+ - Discord/Telegram require `enabled: true` in config when using env tokens.
58
+ - Routing `allowFrom`/mention settings moved to per-surface group settings.
59
+
60
+ ### Highlights
61
+ - Talk Mode (continuous voice) with ElevenLabs TTS on macOS/iOS/Android.
62
+ - Discord: expanded tool actions, richer routing, and threaded reply tags.
63
+ - Auto-reply queue modes + session model overrides; TUI upgrades.
64
+ - Nix mode (declarative config) and Docker setup flow.
65
+ - Onboarding wizard + configure/doctor/update flows.
66
+ - Signal + iMessage providers; new skills (Trello, Things, Notes/Reminders, tmux coding).
67
+ - Browser tooling upgrades (remote CDP, no-sandbox, profiles).
68
+
69
+ ### Fixes
70
+ - macOS codesign/TCC hardening and menu/UI stability improvements.
71
+ - Streaming/typing fixes; per-provider chunk limit tuning.
72
+ - Remote gateway auth + token handling tightened.
73
+ - Camera capture reliability and media sizing fixes.
74
+
75
+ ## 2025.12.27 (betas 3–4)
76
+
77
+ ### Highlights
78
+ - First-class tools replace `clawdbot-*` skills (browser, canvas, nodes, cron).
79
+ - Per-session model selection and custom model providers.
80
+ - Group activation commands; Discord provider for DMs/guilds.
81
+ - Gateway webhooks + Gmail Pub/Sub hooks.
82
+ - Command queue modes + `agent.maxConcurrent` cap.
83
+ - Background bash tasks with `process` tool; gateway in-process restart.
84
+
85
+ ### Fixes
86
+ - Packaging fixes, heartbeat cleanup, WhatsApp reconnect reliability.
87
+ - macOS menu/Chat UI polish and presence reporting fixes.
88
+
89
+ ## 2025.12.21 (beta 2)
90
+
91
+ ### Highlights
92
+ - Bundled gateway packaging + DMG distribution pipeline.
93
+ - Skills platform (bundled/managed/workspace) with install gating + UI.
94
+ - Onboarding polish and agent UX improvements.
95
+ - Canvas host served from Gateway; browser control simplification.
96
+
97
+ ## 2025.12.19 (beta 1)
98
+
99
+ ### Highlights
100
+ - First Clawdbot release: Gateway WS control plane + optional Bridge.
101
+ - macOS menu bar companion app with Voice Wake + WebChat.
102
+ - iOS node pairing with Canvas surface.
103
+ - WhatsApp groups, thinking/verbose directives, health/status tooling.
104
+
105
+ ### Breaking
106
+ - Switched to Pi-only agent runtime; legacy providers removed.
107
+ - Gateway became the single source of truth (no ad-hoc direct sends).
108
+
109
+ ## 2025.12.05–2025.12.03 (pre-Clawdbot)
110
+
111
+ ### Highlights
112
+ - Pi-only agent path and web-only gateway workflow.
113
+ - Thinking/verbose directives, group chat support, and heartbeat controls.
114
+ - `clawdbot agent` CLI added; session tables and health reporting.
115
+
116
+ ## 2025.11.28–2025.11.25 (early web-only)
117
+
118
+ - Heartbeat CLI + interval handling.
119
+ - Media MIME sniffing, size caps, and timeout fallbacks.
120
+ - Web provider reconnects and early stability fixes.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Peter Steinberger
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
Binary file
package/README.md ADDED
@@ -0,0 +1,297 @@
1
+ # 🦞 CLAWDBOT — Personal AI Assistant
2
+
3
+ <p align="center">
4
+ <img src="https://raw.githubusercontent.com/clawdbot/clawdbot/main/docs/whatsapp-clawd.jpg" alt="CLAWDBOT" width="400">
5
+ </p>
6
+
7
+ <p align="center">
8
+ <strong>EXFOLIATE! EXFOLIATE!</strong>
9
+ </p>
10
+
11
+ <p align="center">
12
+ <a href="https://github.com/clawdbot/clawdbot/actions/workflows/ci.yml?branch=main"><img src="https://img.shields.io/github/actions/workflow/status/clawdbot/clawdbot/ci.yml?branch=main&style=for-the-badge" alt="CI status"></a>
13
+ <a href="https://github.com/clawdbot/clawdbot/releases"><img src="https://img.shields.io/github/v/release/clawdbot/clawdbot?include_prereleases&style=for-the-badge" alt="GitHub release"></a>
14
+ <a href="https://discord.gg/clawd"><img src="https://img.shields.io/discord/1456350064065904867?label=Discord&logo=discord&logoColor=white&color=5865F2&style=for-the-badge" alt="Discord"></a>
15
+ <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg?style=for-the-badge" alt="MIT License"></a>
16
+ </p>
17
+
18
+ **Clawdbot** is a *personal AI assistant* you run on your own devices.
19
+ It answers you on the surfaces you already use (WhatsApp, Telegram, Discord, iMessage, WebChat), can speak and listen on macOS/iOS, and can render a live Canvas you control. The Gateway is just the control plane — the product is the assistant.
20
+
21
+ If you want a personal, single-user assistant that feels local, fast, and always-on, this is it.
22
+
23
+ Website: https://clawd.me · Docs: [`docs/index.md`](docs/index.md) · FAQ: [`docs/faq.md`](docs/faq.md) · Wizard: [`docs/wizard.md`](docs/wizard.md) · Docker (optional): [`docs/docker.md`](docs/docker.md) · Discord: https://discord.gg/clawd
24
+
25
+ Preferred setup: run the onboarding wizard (`clawdbot onboard`). It walks through gateway, workspace, providers, and skills. The CLI wizard is the recommended path and works on **macOS, Windows, and Linux**.
26
+
27
+ Using Claude Pro/Max subscription? See `docs/onboarding.md` for the Anthropic OAuth setup.
28
+
29
+ ## Highlights
30
+
31
+ - **Local-first Gateway** — single control plane for sessions, providers, tools, and events.
32
+ - **Multi-surface inbox** — WhatsApp, Telegram, Discord, iMessage, WebChat, macOS, iOS/Android.
33
+ - **Voice Wake + Talk Mode** — always-on speech for macOS/iOS/Android with ElevenLabs.
34
+ - **Live Canvas** — agent-driven visual workspace with A2UI.
35
+ - **First-class tools** — browser, canvas, nodes, cron, sessions, and Discord actions.
36
+ - **Companion apps** — macOS menu bar app + iOS/Android nodes.
37
+ - **Onboarding + skills** — wizard-driven setup with bundled/managed/workspace skills.
38
+
39
+ ## Everything we built so far
40
+
41
+ ### Core platform
42
+ - Gateway WS control plane with sessions, presence, config, cron, webhooks, control UI, and Canvas host.
43
+ - CLI surface: gateway, agent, send, wizard, doctor/update, and TUI.
44
+ - Pi agent runtime in RPC mode with tool streaming and block streaming.
45
+ - Session model: `main` for direct chats, group isolation, activation modes, queue modes, reply-back.
46
+ - Media pipeline: images/audio/video, transcription hooks, size caps, temp file lifecycle.
47
+
48
+ ### Surfaces + providers
49
+ - WhatsApp (Baileys), Telegram (grammY), Discord (discord.js), Signal (signal-cli), iMessage (imsg), WebChat.
50
+ - Group mention gating, reply tags, per-surface chunking and routing.
51
+
52
+ ### Apps + nodes
53
+ - macOS app: menu bar control plane, Voice Wake/PTT, Talk Mode overlay, WebChat, Debug tools, SSH remote gateway control.
54
+ - iOS node: Canvas, Voice Wake, Talk Mode, camera, screen recording, Bonjour pairing.
55
+ - Android node: Canvas, Talk Mode, camera, screen recording, optional SMS.
56
+ - macOS node mode: system.run/notify + canvas/camera exposure.
57
+
58
+ ### Tools + automation
59
+ - Browser control: dedicated clawd Chrome/Chromium, snapshots, actions, uploads, profiles.
60
+ - Canvas: A2UI push/reset, eval, snapshot.
61
+ - Nodes: camera snap/clip, screen record, location.get, notifications.
62
+ - Cron + wakeups; webhooks; Gmail Pub/Sub triggers.
63
+ - Skills platform: bundled, managed, and workspace skills with install gating + UI.
64
+
65
+ ### Ops + packaging
66
+ - Control UI + WebChat served directly from the Gateway.
67
+ - Tailscale Serve/Funnel or SSH tunnels with token/password auth.
68
+ - Nix mode for declarative config; Docker-based installs.
69
+ - Health, doctor migrations, structured logging, release tooling.
70
+
71
+ ## Changes since 2026.1.4 (2026-01-04)
72
+
73
+ ### Highlights
74
+ - Project rename completed: CLIs, paths, bundle IDs, env vars, and docs unified on Clawdbot.
75
+ - Agent-to-agent relay: `sessions_send` ping‑pong with `REPLY_SKIP` plus announce step with `ANNOUNCE_SKIP`.
76
+ - Gateway config hot reload, configurable port, and Control UI base-path support.
77
+ - Sandbox options: per-session Docker sandbox with hardened limits + optional sandboxed Chromium.
78
+ - New node capability: `location.get` across macOS/iOS/Android (CLI + tools).
79
+
80
+ ### Fixes
81
+ - Presence beacons keep node lists fresh; Instances view stays accurate.
82
+ - Block streaming + chunking reliability (Telegram/Discord ordering, fewer duplicates).
83
+ - WhatsApp GIF playback for MP4-based GIFs.
84
+ - Onboarding/Control UI basePath handling fixes + UI polish.
85
+ - Cleaner logging + clearer tool summaries.
86
+
87
+ ### Breaking
88
+ - Tool names drop the `clawdbot_` prefix (`browser`, `canvas`, `nodes`, `cron`, `gateway`).
89
+ - Bash tool removed `stdinMode: "pty"` support (use tmux for real TTYs).
90
+ - Primary session key is fixed to `main` (or `global` for global scope).
91
+
92
+ ## Project rename + changelog format
93
+
94
+ Clawdis → Clawdbot. The rename touched every surface, path, and bundle ID. To make that transition explicit, releases now use **date-based versions** (`YYYY.M.D`), and the changelog is compressed into milestone summaries instead of long semver trains. Full detail still lives in git history and the docs.
95
+
96
+ ## How it works (short)
97
+
98
+ ```
99
+ Your surfaces
100
+
101
+
102
+ ┌───────────────────────────────┐
103
+ │ Gateway │ ws://127.0.0.1:18789
104
+ │ (control plane) │ tcp://0.0.0.0:18790 (optional Bridge)
105
+ └──────────────┬────────────────┘
106
+
107
+ ├─ Pi agent (RPC)
108
+ ├─ CLI (clawdbot …)
109
+ ├─ WebChat (browser)
110
+ ├─ macOS app (Clawdbot.app)
111
+ └─ iOS node (Canvas + voice)
112
+ ```
113
+
114
+ ## Quick start (from source)
115
+
116
+ Runtime: **Node ≥22** + **pnpm**.
117
+
118
+ ```bash
119
+ pnpm install
120
+ pnpm build
121
+ pnpm ui:build
122
+
123
+ # Recommended: run the onboarding wizard
124
+ pnpm clawdbot onboard
125
+
126
+ # Link WhatsApp (stores creds in ~/.clawdbot/credentials)
127
+ pnpm clawdbot login
128
+
129
+ # Start the gateway
130
+ pnpm clawdbot gateway --port 18789 --verbose
131
+
132
+ # Dev loop (auto-reload on TS changes)
133
+ pnpm gateway:watch
134
+
135
+ # Send a message
136
+ pnpm clawdbot send --to +1234567890 --message "Hello from Clawdbot"
137
+
138
+ # Talk to the assistant (optionally deliver back to WhatsApp/Telegram/Discord)
139
+ pnpm clawdbot agent --message "Ship checklist" --thinking high
140
+ ```
141
+
142
+ If you run from source, prefer `pnpm clawdbot …` (not global `clawdbot`).
143
+
144
+ ## Chat commands
145
+
146
+ Send these in WhatsApp/Telegram/WebChat (group commands are owner-only):
147
+
148
+ - `/status` — health + session info (group shows activation mode)
149
+ - `/new` or `/reset` — reset the session
150
+ - `/think <level>` — off|minimal|low|medium|high
151
+ - `/verbose on|off`
152
+ - `/restart` — restart the gateway (owner-only in groups)
153
+ - `/activation mention|always` — group activation toggle (groups only)
154
+
155
+ ## Architecture
156
+
157
+ ### TypeScript Gateway (src/gateway/server.ts)
158
+ - **Single HTTP+WS server** on `ws://127.0.0.1:18789` (bind policy: loopback/lan/tailnet/auto). The first frame must be `connect`; AJV validates frames against TypeBox schemas (`src/gateway/protocol`).
159
+ - **Single source of truth** for sessions, providers, cron, voice wake, and presence. Methods cover `send`, `agent`, `chat.*`, `sessions.*`, `config.*`, `cron.*`, `voicewake.*`, `node.*`, `system-*`, `wake`.
160
+ - **Events + snapshot**: handshake returns a snapshot (presence/health) and declares event types; runtime events include `agent`, `chat`, `presence`, `tick`, `health`, `heartbeat`, `cron`, `node.pair.*`, `voicewake.changed`, `shutdown`.
161
+ - **Idempotency & safety**: `send`/`agent`/`chat.send` require idempotency keys with a TTL cache (5 min, cap 1000) to avoid double‑sends on reconnects; payload sizes are capped per connection.
162
+ - **Bridge for nodes**: optional TCP bridge (`src/infra/bridge/server.ts`) is newline‑delimited JSON frames (`hello`, pairing, RPC, `invoke`); node connect/disconnect is surfaced into presence.
163
+ - **Control UI + Canvas Host**: HTTP serves Control UI assets (default `/`, optional base path) and can host a live‑reload Canvas host for nodes (`src/canvas-host/server.ts`), injecting the A2UI postMessage bridge.
164
+
165
+ ### iOS app (apps/ios)
166
+ - **Discovery + pairing**: Bonjour discovery via `BridgeDiscoveryModel` (NWBrowser). `BridgeConnectionController` auto‑connects using Keychain token or allows manual host/port.
167
+ - **Node runtime**: `BridgeSession` (actor) maintains the `NWConnection`, hello handshake, ping/pong, RPC requests, and `invoke` callbacks.
168
+ - **Capabilities + commands**: advertises `canvas`, `screen`, `camera`, `voiceWake` (settings‑driven) and executes `canvas.*`, `canvas.a2ui.*`, `camera.*`, `screen.record` (`NodeAppModel.handleInvoke`).
169
+ - **Canvas**: `WKWebView` with bundled Canvas scaffold + A2UI, JS eval, snapshot capture, and `clawdbot://` deep‑link interception (`ScreenController`).
170
+ - **Voice + deep links**: voice wake sends `voice.transcript` events; `clawdbot://agent` links emit `agent.request`. Voice wake triggers sync via `voicewake.get` + `voicewake.changed`.
171
+
172
+ ## Companion apps
173
+
174
+ The **macOS app is critical**: it runs the menu‑bar control plane, owns local permissions (TCC), hosts Voice Wake, exposes WebChat/debug tools, and coordinates local/remote gateway mode. Most “assistant” UX lives here.
175
+
176
+ ### macOS (Clawdbot.app)
177
+
178
+ - Menu bar control for the Gateway and health.
179
+ - Voice Wake + push-to-talk overlay.
180
+ - WebChat + debug tools.
181
+ - Remote gateway control over SSH.
182
+
183
+ Build/run: `./scripts/restart-mac.sh` (packages + launches).
184
+
185
+ ### iOS node (internal)
186
+
187
+ - Pairs as a node via the Bridge.
188
+ - Voice trigger forwarding + Canvas surface.
189
+ - Controlled via `clawdbot nodes …`.
190
+
191
+ Runbook: `docs/ios/connect.md`.
192
+
193
+ ### Android node (internal)
194
+
195
+ - Pairs via the same Bridge + pairing flow as iOS.
196
+ - Exposes Canvas, Camera, and Screen capture commands.
197
+ - Runbook: `docs/android/connect.md`.
198
+
199
+ ## Agent workspace + skills
200
+
201
+ - Workspace root: `~/clawd` (configurable via `agent.workspace`).
202
+ - Injected prompt files: `AGENTS.md`, `SOUL.md`, `TOOLS.md`.
203
+ - Skills: `~/clawd/skills/<skill>/SKILL.md`.
204
+
205
+ ## Configuration
206
+
207
+ Minimal `~/.clawdbot/clawdbot.json`:
208
+
209
+ ```json5
210
+ {
211
+ whatsapp: {
212
+ allowFrom: ["+1234567890"]
213
+ }
214
+ }
215
+ ```
216
+
217
+ ### WhatsApp
218
+
219
+ - Link the device: `pnpm clawdbot login` (stores creds in `~/.clawdbot/credentials`).
220
+ - Allowlist who can talk to the assistant via `whatsapp.allowFrom`.
221
+
222
+ ### Telegram
223
+
224
+ - Set `TELEGRAM_BOT_TOKEN` or `telegram.botToken` (env wins).
225
+ - Optional: set `telegram.groups` (with `telegram.groups."*".requireMention`), `telegram.allowFrom`, or `telegram.webhookUrl` as needed.
226
+
227
+ ```json5
228
+ {
229
+ telegram: {
230
+ botToken: "123456:ABCDEF"
231
+ }
232
+ }
233
+ ```
234
+
235
+ ### Discord
236
+
237
+ - Set `DISCORD_BOT_TOKEN` or `discord.token` (env wins).
238
+ - Optional: set `discord.slashCommand`, `discord.dm.allowFrom`, `discord.guilds`, or `discord.mediaMaxMb` as needed.
239
+
240
+ ```json5
241
+ {
242
+ discord: {
243
+ token: "1234abcd"
244
+ }
245
+ }
246
+ ```
247
+
248
+ Browser control (optional):
249
+
250
+ ```json5
251
+ {
252
+ browser: {
253
+ enabled: true,
254
+ controlUrl: "http://127.0.0.1:18791",
255
+ color: "#FF4500"
256
+ }
257
+ }
258
+ ```
259
+
260
+ ## Docs
261
+
262
+ - [`docs/index.md`](docs/index.md) (overview)
263
+ - [`docs/configuration.md`](docs/configuration.md)
264
+ - [`docs/group-messages.md`](docs/group-messages.md)
265
+ - [`docs/gateway.md`](docs/gateway.md)
266
+ - [`docs/web.md`](docs/web.md)
267
+ - [`docs/discovery.md`](docs/discovery.md)
268
+ - [`docs/agent.md`](docs/agent.md)
269
+ - [`docs/discord.md`](docs/discord.md)
270
+ - [`docs/wizard.md`](docs/wizard.md)
271
+ - Webhooks + external triggers: [`docs/webhook.md`](docs/webhook.md)
272
+ - Gmail hooks (email → wake): [`docs/gmail-pubsub.md`](docs/gmail-pubsub.md)
273
+
274
+ ## Email hooks (Gmail)
275
+
276
+ ```bash
277
+ clawdbot hooks gmail setup --account you@gmail.com
278
+ clawdbot hooks gmail run
279
+ ```
280
+ - [`docs/security.md`](docs/security.md)
281
+ - [`docs/troubleshooting.md`](docs/troubleshooting.md)
282
+ - [`docs/ios/connect.md`](docs/ios/connect.md)
283
+ - [`docs/clawdbot-mac.md`](docs/clawdbot-mac.md)
284
+
285
+ ## Contributing
286
+
287
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines, maintainers, and how to submit PRs.
288
+
289
+ AI/vibe-coded PRs welcome! 🤖
290
+
291
+ ## Clawd
292
+
293
+ Clawdbot was built for **Clawd**, a space lobster AI assistant.
294
+
295
+ - https://clawd.me
296
+ - https://soul.md
297
+ - https://steipete.me
@@ -0,0 +1,17 @@
1
+ import path from "node:path";
2
+ import { CONFIG_DIR, resolveUserPath } from "../utils.js";
3
+ const DEFAULT_AGENT_DIR = path.join(CONFIG_DIR, "agent");
4
+ export function resolveClawdbotAgentDir() {
5
+ const override = process.env.CLAWDBOT_AGENT_DIR?.trim() ||
6
+ process.env.PI_CODING_AGENT_DIR?.trim() ||
7
+ DEFAULT_AGENT_DIR;
8
+ return resolveUserPath(override);
9
+ }
10
+ export function ensureClawdbotAgentEnv() {
11
+ const dir = resolveClawdbotAgentDir();
12
+ if (!process.env.CLAWDBOT_AGENT_DIR)
13
+ process.env.CLAWDBOT_AGENT_DIR = dir;
14
+ if (!process.env.PI_CODING_AGENT_DIR)
15
+ process.env.PI_CODING_AGENT_DIR = dir;
16
+ return dir;
17
+ }
@@ -0,0 +1,126 @@
1
+ const DEFAULT_JOB_TTL_MS = 30 * 60 * 1000; // 30 minutes
2
+ const MIN_JOB_TTL_MS = 60 * 1000; // 1 minute
3
+ const MAX_JOB_TTL_MS = 3 * 60 * 60 * 1000; // 3 hours
4
+ function clampTtl(value) {
5
+ if (!value || Number.isNaN(value))
6
+ return DEFAULT_JOB_TTL_MS;
7
+ return Math.min(Math.max(value, MIN_JOB_TTL_MS), MAX_JOB_TTL_MS);
8
+ }
9
+ let jobTtlMs = clampTtl(Number.parseInt(process.env.PI_BASH_JOB_TTL_MS ?? "", 10));
10
+ const runningSessions = new Map();
11
+ const finishedSessions = new Map();
12
+ let sweeper = null;
13
+ export function addSession(session) {
14
+ runningSessions.set(session.id, session);
15
+ startSweeper();
16
+ }
17
+ export function getSession(id) {
18
+ return runningSessions.get(id);
19
+ }
20
+ export function getFinishedSession(id) {
21
+ return finishedSessions.get(id);
22
+ }
23
+ export function deleteSession(id) {
24
+ runningSessions.delete(id);
25
+ finishedSessions.delete(id);
26
+ }
27
+ export function appendOutput(session, stream, chunk) {
28
+ session.pendingStdout ??= [];
29
+ session.pendingStderr ??= [];
30
+ const buffer = stream === "stdout" ? session.pendingStdout : session.pendingStderr;
31
+ buffer.push(chunk);
32
+ session.totalOutputChars += chunk.length;
33
+ const aggregated = trimWithCap(session.aggregated + chunk, session.maxOutputChars);
34
+ session.truncated =
35
+ session.truncated ||
36
+ aggregated.length < session.aggregated.length + chunk.length;
37
+ session.aggregated = aggregated;
38
+ session.tail = tail(session.aggregated, 2000);
39
+ }
40
+ export function drainSession(session) {
41
+ const stdout = session.pendingStdout.join("");
42
+ const stderr = session.pendingStderr.join("");
43
+ session.pendingStdout = [];
44
+ session.pendingStderr = [];
45
+ return { stdout, stderr };
46
+ }
47
+ export function markExited(session, exitCode, exitSignal, status) {
48
+ session.exited = true;
49
+ session.exitCode = exitCode;
50
+ session.exitSignal = exitSignal;
51
+ session.tail = tail(session.aggregated, 2000);
52
+ moveToFinished(session, status);
53
+ }
54
+ export function markBackgrounded(session) {
55
+ session.backgrounded = true;
56
+ }
57
+ function moveToFinished(session, status) {
58
+ runningSessions.delete(session.id);
59
+ if (!session.backgrounded)
60
+ return;
61
+ finishedSessions.set(session.id, {
62
+ id: session.id,
63
+ command: session.command,
64
+ startedAt: session.startedAt,
65
+ endedAt: Date.now(),
66
+ cwd: session.cwd,
67
+ status,
68
+ exitCode: session.exitCode,
69
+ exitSignal: session.exitSignal,
70
+ aggregated: session.aggregated,
71
+ tail: session.tail,
72
+ truncated: session.truncated,
73
+ totalOutputChars: session.totalOutputChars,
74
+ });
75
+ }
76
+ export function tail(text, max = 2000) {
77
+ if (text.length <= max)
78
+ return text;
79
+ return text.slice(text.length - max);
80
+ }
81
+ export function trimWithCap(text, max) {
82
+ if (text.length <= max)
83
+ return text;
84
+ return text.slice(text.length - max);
85
+ }
86
+ export function listRunningSessions() {
87
+ return Array.from(runningSessions.values()).filter((s) => s.backgrounded);
88
+ }
89
+ export function listFinishedSessions() {
90
+ return Array.from(finishedSessions.values());
91
+ }
92
+ export function clearFinished() {
93
+ finishedSessions.clear();
94
+ }
95
+ export function resetProcessRegistryForTests() {
96
+ runningSessions.clear();
97
+ finishedSessions.clear();
98
+ stopSweeper();
99
+ }
100
+ export function setJobTtlMs(value) {
101
+ if (value === undefined || Number.isNaN(value))
102
+ return;
103
+ jobTtlMs = clampTtl(value);
104
+ stopSweeper();
105
+ startSweeper();
106
+ }
107
+ function pruneFinishedSessions() {
108
+ const cutoff = Date.now() - jobTtlMs;
109
+ for (const [id, session] of finishedSessions.entries()) {
110
+ if (session.endedAt < cutoff) {
111
+ finishedSessions.delete(id);
112
+ }
113
+ }
114
+ }
115
+ function startSweeper() {
116
+ if (sweeper)
117
+ return;
118
+ sweeper = setInterval(pruneFinishedSessions, Math.max(30_000, jobTtlMs / 6));
119
+ sweeper.unref?.();
120
+ }
121
+ function stopSweeper() {
122
+ if (!sweeper)
123
+ return;
124
+ clearInterval(sweeper);
125
+ sweeper = null;
126
+ }