clawdbot 2026.1.4-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (550) hide show
  1. package/CHANGELOG.md +120 -0
  2. package/LICENSE +21 -0
  3. package/README-header.png +0 -0
  4. package/README.md +297 -0
  5. package/dist/agents/agent-paths.js +17 -0
  6. package/dist/agents/bash-process-registry.js +126 -0
  7. package/dist/agents/bash-tools.js +837 -0
  8. package/dist/agents/clawdbot-tools.js +30 -0
  9. package/dist/agents/clawdis-tools.js +27 -0
  10. package/dist/agents/context.js +34 -0
  11. package/dist/agents/defaults.js +6 -0
  12. package/dist/agents/model-auth.js +112 -0
  13. package/dist/agents/model-catalog.js +55 -0
  14. package/dist/agents/model-fallback.js +191 -0
  15. package/dist/agents/model-scan.js +263 -0
  16. package/dist/agents/model-selection.js +116 -0
  17. package/dist/agents/models-config.js +49 -0
  18. package/dist/agents/pi-embedded-helpers.js +74 -0
  19. package/dist/agents/pi-embedded-runner.js +407 -0
  20. package/dist/agents/pi-embedded-subscribe.js +568 -0
  21. package/dist/agents/pi-embedded-utils.js +20 -0
  22. package/dist/agents/pi-embedded.js +1 -0
  23. package/dist/agents/pi-oauth.js +88 -0
  24. package/dist/agents/pi-tools.js +433 -0
  25. package/dist/agents/sandbox-paths.js +68 -0
  26. package/dist/agents/sandbox.js +644 -0
  27. package/dist/agents/shell-utils.js +53 -0
  28. package/dist/agents/skills-install.js +244 -0
  29. package/dist/agents/skills-status.js +157 -0
  30. package/dist/agents/skills.js +470 -0
  31. package/dist/agents/steerable-agent-loop.js +338 -0
  32. package/dist/agents/steerable-provider-transport.js +48 -0
  33. package/dist/agents/system-prompt.js +104 -0
  34. package/dist/agents/tool-display.js +162 -0
  35. package/dist/agents/tool-images.js +138 -0
  36. package/dist/agents/tools/browser-tool.js +339 -0
  37. package/dist/agents/tools/canvas-tool.js +193 -0
  38. package/dist/agents/tools/common.js +88 -0
  39. package/dist/agents/tools/cron-tool.js +124 -0
  40. package/dist/agents/tools/discord-actions-guild.js +186 -0
  41. package/dist/agents/tools/discord-actions-messaging.js +285 -0
  42. package/dist/agents/tools/discord-actions-moderation.js +70 -0
  43. package/dist/agents/tools/discord-actions.js +56 -0
  44. package/dist/agents/tools/discord-schema.js +199 -0
  45. package/dist/agents/tools/discord-tool.js +16 -0
  46. package/dist/agents/tools/gateway-tool.js +46 -0
  47. package/dist/agents/tools/gateway.js +27 -0
  48. package/dist/agents/tools/image-tool.js +132 -0
  49. package/dist/agents/tools/nodes-tool.js +413 -0
  50. package/dist/agents/tools/nodes-utils.js +92 -0
  51. package/dist/agents/tools/sessions-helpers.js +88 -0
  52. package/dist/agents/tools/sessions-history-tool.js +53 -0
  53. package/dist/agents/tools/sessions-list-tool.js +143 -0
  54. package/dist/agents/tools/sessions-send-helpers.js +100 -0
  55. package/dist/agents/tools/sessions-send-tool.js +347 -0
  56. package/dist/agents/tools/slack-actions.js +129 -0
  57. package/dist/agents/tools/slack-schema.js +59 -0
  58. package/dist/agents/tools/slack-tool.js +16 -0
  59. package/dist/agents/usage.js +39 -0
  60. package/dist/agents/workspace.js +241 -0
  61. package/dist/auto-reply/chunk.js +76 -0
  62. package/dist/auto-reply/envelope.js +38 -0
  63. package/dist/auto-reply/group-activation.js +20 -0
  64. package/dist/auto-reply/heartbeat.js +57 -0
  65. package/dist/auto-reply/model.js +14 -0
  66. package/dist/auto-reply/reply/abort.js +14 -0
  67. package/dist/auto-reply/reply/agent-runner.js +371 -0
  68. package/dist/auto-reply/reply/block-streaming.js +34 -0
  69. package/dist/auto-reply/reply/body.js +29 -0
  70. package/dist/auto-reply/reply/commands.js +207 -0
  71. package/dist/auto-reply/reply/directive-handling.js +361 -0
  72. package/dist/auto-reply/reply/directives.js +47 -0
  73. package/dist/auto-reply/reply/followup-runner.js +149 -0
  74. package/dist/auto-reply/reply/groups.js +91 -0
  75. package/dist/auto-reply/reply/mentions.js +38 -0
  76. package/dist/auto-reply/reply/model-selection.js +114 -0
  77. package/dist/auto-reply/reply/queue.js +399 -0
  78. package/dist/auto-reply/reply/reply-tags.js +26 -0
  79. package/dist/auto-reply/reply/session-updates.js +87 -0
  80. package/dist/auto-reply/reply/session.js +160 -0
  81. package/dist/auto-reply/reply/typing.js +75 -0
  82. package/dist/auto-reply/reply.js +535 -0
  83. package/dist/auto-reply/send-policy.js +28 -0
  84. package/dist/auto-reply/status.js +158 -0
  85. package/dist/auto-reply/templating.js +9 -0
  86. package/dist/auto-reply/thinking.js +49 -0
  87. package/dist/auto-reply/tokens.js +2 -0
  88. package/dist/auto-reply/tool-meta.js +74 -0
  89. package/dist/auto-reply/transcription.js +57 -0
  90. package/dist/auto-reply/types.js +1 -0
  91. package/dist/browser/bridge-server.js +37 -0
  92. package/dist/browser/cdp.js +382 -0
  93. package/dist/browser/chrome.js +432 -0
  94. package/dist/browser/client-actions-core.js +67 -0
  95. package/dist/browser/client-actions-observe.js +24 -0
  96. package/dist/browser/client-actions-types.js +1 -0
  97. package/dist/browser/client-actions.js +3 -0
  98. package/dist/browser/client-fetch.js +43 -0
  99. package/dist/browser/client.js +105 -0
  100. package/dist/browser/config.js +140 -0
  101. package/dist/browser/constants.js +4 -0
  102. package/dist/browser/profiles-service.js +122 -0
  103. package/dist/browser/profiles.js +85 -0
  104. package/dist/browser/pw-ai.js +2 -0
  105. package/dist/browser/pw-session.js +144 -0
  106. package/dist/browser/pw-tools-core.js +363 -0
  107. package/dist/browser/routes/agent.js +535 -0
  108. package/dist/browser/routes/basic.js +155 -0
  109. package/dist/browser/routes/index.js +8 -0
  110. package/dist/browser/routes/tabs.js +105 -0
  111. package/dist/browser/routes/utils.js +62 -0
  112. package/dist/browser/screenshot.js +40 -0
  113. package/dist/browser/server-context.js +377 -0
  114. package/dist/browser/server.js +81 -0
  115. package/dist/browser/target-id.js +18 -0
  116. package/dist/browser/trash.js +21 -0
  117. package/dist/canvas-host/a2ui/.bundle.hash +1 -0
  118. package/dist/canvas-host/a2ui/a2ui.bundle.js +17768 -0
  119. package/dist/canvas-host/a2ui/index.html +246 -0
  120. package/dist/canvas-host/a2ui.js +187 -0
  121. package/dist/canvas-host/server.js +382 -0
  122. package/dist/cli/browser-cli-actions-input.js +459 -0
  123. package/dist/cli/browser-cli-actions-observe.js +56 -0
  124. package/dist/cli/browser-cli-examples.js +31 -0
  125. package/dist/cli/browser-cli-inspect.js +97 -0
  126. package/dist/cli/browser-cli-manage.js +286 -0
  127. package/dist/cli/browser-cli-shared.js +1 -0
  128. package/dist/cli/browser-cli.js +26 -0
  129. package/dist/cli/canvas-cli.js +416 -0
  130. package/dist/cli/cron-cli.js +454 -0
  131. package/dist/cli/deps.js +17 -0
  132. package/dist/cli/dns-cli.js +180 -0
  133. package/dist/cli/gateway-cli.js +489 -0
  134. package/dist/cli/gateway-rpc.js +20 -0
  135. package/dist/cli/hooks-cli.js +135 -0
  136. package/dist/cli/models-cli.js +248 -0
  137. package/dist/cli/nodes-camera.js +57 -0
  138. package/dist/cli/nodes-canvas.js +26 -0
  139. package/dist/cli/nodes-cli.js +946 -0
  140. package/dist/cli/nodes-screen.js +37 -0
  141. package/dist/cli/parse-duration.js +20 -0
  142. package/dist/cli/ports.js +97 -0
  143. package/dist/cli/program.js +406 -0
  144. package/dist/cli/prompt.js +19 -0
  145. package/dist/cli/tui-cli.js +35 -0
  146. package/dist/cli/wait.js +8 -0
  147. package/dist/commands/agent.js +645 -0
  148. package/dist/commands/antigravity-oauth.js +327 -0
  149. package/dist/commands/configure.js +480 -0
  150. package/dist/commands/doctor.js +484 -0
  151. package/dist/commands/health.js +108 -0
  152. package/dist/commands/models/aliases.js +64 -0
  153. package/dist/commands/models/fallbacks.js +99 -0
  154. package/dist/commands/models/image-fallbacks.js +99 -0
  155. package/dist/commands/models/list.js +323 -0
  156. package/dist/commands/models/scan.js +266 -0
  157. package/dist/commands/models/set-image.js +23 -0
  158. package/dist/commands/models/set.js +23 -0
  159. package/dist/commands/models/shared.js +72 -0
  160. package/dist/commands/models.js +7 -0
  161. package/dist/commands/onboard-auth.js +70 -0
  162. package/dist/commands/onboard-helpers.js +295 -0
  163. package/dist/commands/onboard-interactive.js +17 -0
  164. package/dist/commands/onboard-non-interactive.js +202 -0
  165. package/dist/commands/onboard-providers.js +634 -0
  166. package/dist/commands/onboard-remote.js +120 -0
  167. package/dist/commands/onboard-skills.js +148 -0
  168. package/dist/commands/onboard-types.js +1 -0
  169. package/dist/commands/onboard.js +12 -0
  170. package/dist/commands/send.js +124 -0
  171. package/dist/commands/sessions.js +212 -0
  172. package/dist/commands/setup.js +58 -0
  173. package/dist/commands/signal-install.js +135 -0
  174. package/dist/commands/status.js +207 -0
  175. package/dist/commands/update.js +16 -0
  176. package/dist/config/config.js +6 -0
  177. package/dist/config/defaults.js +61 -0
  178. package/dist/config/io.js +147 -0
  179. package/dist/config/legacy-migrate.js +13 -0
  180. package/dist/config/legacy.js +159 -0
  181. package/dist/config/paths.js +71 -0
  182. package/dist/config/schema.js +150 -0
  183. package/dist/config/sessions.js +282 -0
  184. package/dist/config/talk.js +31 -0
  185. package/dist/config/types.js +1 -0
  186. package/dist/config/validation.js +29 -0
  187. package/dist/config/zod-schema.js +831 -0
  188. package/dist/control-ui/assets/index-BFID3yAA.css +1 -0
  189. package/dist/control-ui/assets/index-CE_axlTS.js +2235 -0
  190. package/dist/control-ui/assets/index-CE_axlTS.js.map +1 -0
  191. package/dist/control-ui/index.html +15 -0
  192. package/dist/cron/isolated-agent.js +499 -0
  193. package/dist/cron/run-log.js +72 -0
  194. package/dist/cron/schedule.js +24 -0
  195. package/dist/cron/service.js +471 -0
  196. package/dist/cron/store.js +43 -0
  197. package/dist/cron/types.js +1 -0
  198. package/dist/daemon/constants.js +10 -0
  199. package/dist/daemon/launchd.js +276 -0
  200. package/dist/daemon/legacy.js +63 -0
  201. package/dist/daemon/program-args.js +76 -0
  202. package/dist/daemon/schtasks.js +257 -0
  203. package/dist/daemon/service.js +60 -0
  204. package/dist/daemon/systemd.js +266 -0
  205. package/dist/discord/index.js +2 -0
  206. package/dist/discord/monitor.js +1188 -0
  207. package/dist/discord/probe.js +54 -0
  208. package/dist/discord/send.js +577 -0
  209. package/dist/discord/token.js +8 -0
  210. package/dist/gateway/auth.js +121 -0
  211. package/dist/gateway/call.js +94 -0
  212. package/dist/gateway/chat-attachments.js +41 -0
  213. package/dist/gateway/client.js +180 -0
  214. package/dist/gateway/config-reload.js +274 -0
  215. package/dist/gateway/control-ui.js +184 -0
  216. package/dist/gateway/hooks-mapping.js +282 -0
  217. package/dist/gateway/hooks.js +168 -0
  218. package/dist/gateway/net.js +29 -0
  219. package/dist/gateway/protocol/index.js +61 -0
  220. package/dist/gateway/protocol/schema.js +560 -0
  221. package/dist/gateway/server-bridge-subscriptions.js +93 -0
  222. package/dist/gateway/server-bridge.js +1013 -0
  223. package/dist/gateway/server-browser.js +12 -0
  224. package/dist/gateway/server-chat.js +159 -0
  225. package/dist/gateway/server-constants.js +8 -0
  226. package/dist/gateway/server-discovery.js +62 -0
  227. package/dist/gateway/server-http.js +165 -0
  228. package/dist/gateway/server-methods/agent-job.js +125 -0
  229. package/dist/gateway/server-methods/agent.js +250 -0
  230. package/dist/gateway/server-methods/chat.js +200 -0
  231. package/dist/gateway/server-methods/config.js +50 -0
  232. package/dist/gateway/server-methods/connect.js +6 -0
  233. package/dist/gateway/server-methods/cron.js +83 -0
  234. package/dist/gateway/server-methods/health.js +28 -0
  235. package/dist/gateway/server-methods/models.js +16 -0
  236. package/dist/gateway/server-methods/nodes.js +294 -0
  237. package/dist/gateway/server-methods/providers.js +217 -0
  238. package/dist/gateway/server-methods/send.js +166 -0
  239. package/dist/gateway/server-methods/sessions.js +305 -0
  240. package/dist/gateway/server-methods/skills.js +83 -0
  241. package/dist/gateway/server-methods/system.js +118 -0
  242. package/dist/gateway/server-methods/talk.js +22 -0
  243. package/dist/gateway/server-methods/types.js +1 -0
  244. package/dist/gateway/server-methods/voicewake.js +30 -0
  245. package/dist/gateway/server-methods/web.js +58 -0
  246. package/dist/gateway/server-methods/wizard.js +100 -0
  247. package/dist/gateway/server-methods.js +53 -0
  248. package/dist/gateway/server-providers.js +644 -0
  249. package/dist/gateway/server-shared.js +1 -0
  250. package/dist/gateway/server-utils.js +35 -0
  251. package/dist/gateway/server.js +1437 -0
  252. package/dist/gateway/session-utils.js +216 -0
  253. package/dist/gateway/ws-log.js +349 -0
  254. package/dist/gateway/ws-logging.js +8 -0
  255. package/dist/globals.js +41 -0
  256. package/dist/hooks/gmail-ops.js +236 -0
  257. package/dist/hooks/gmail-setup-utils.js +278 -0
  258. package/dist/hooks/gmail-watcher.js +175 -0
  259. package/dist/hooks/gmail.js +177 -0
  260. package/dist/imessage/client.js +165 -0
  261. package/dist/imessage/index.js +3 -0
  262. package/dist/imessage/monitor.js +272 -0
  263. package/dist/imessage/probe.js +26 -0
  264. package/dist/imessage/send.js +83 -0
  265. package/dist/imessage/targets.js +176 -0
  266. package/dist/index.js +50 -0
  267. package/dist/infra/agent-events.js +46 -0
  268. package/dist/infra/binaries.js +9 -0
  269. package/dist/infra/bonjour-discovery.js +163 -0
  270. package/dist/infra/bonjour.js +200 -0
  271. package/dist/infra/bridge/server.js +562 -0
  272. package/dist/infra/canvas-host-url.js +54 -0
  273. package/dist/infra/env.js +8 -0
  274. package/dist/infra/errors.js +28 -0
  275. package/dist/infra/gateway-lock.js +8 -0
  276. package/dist/infra/heartbeat-events.js +21 -0
  277. package/dist/infra/heartbeat-runner.js +453 -0
  278. package/dist/infra/heartbeat-wake.js +61 -0
  279. package/dist/infra/is-main.js +37 -0
  280. package/dist/infra/machine-name.js +40 -0
  281. package/dist/infra/node-pairing.js +211 -0
  282. package/dist/infra/pam.js +42 -0
  283. package/dist/infra/path-env.js +92 -0
  284. package/dist/infra/ports.js +87 -0
  285. package/dist/infra/provider-summary.js +80 -0
  286. package/dist/infra/restart.js +29 -0
  287. package/dist/infra/retry.js +16 -0
  288. package/dist/infra/runtime-guard.js +59 -0
  289. package/dist/infra/system-events.js +44 -0
  290. package/dist/infra/system-presence.js +216 -0
  291. package/dist/infra/tailnet.js +46 -0
  292. package/dist/infra/tailscale.js +149 -0
  293. package/dist/infra/voicewake.js +77 -0
  294. package/dist/infra/widearea-dns.js +123 -0
  295. package/dist/infra/ws.js +13 -0
  296. package/dist/logger.js +52 -0
  297. package/dist/logging.js +490 -0
  298. package/dist/macos/gateway-daemon.js +141 -0
  299. package/dist/macos/relay.js +46 -0
  300. package/dist/media/constants.js +33 -0
  301. package/dist/media/host.js +42 -0
  302. package/dist/media/image-ops.js +121 -0
  303. package/dist/media/mime.js +115 -0
  304. package/dist/media/parse.js +81 -0
  305. package/dist/media/server.js +64 -0
  306. package/dist/media/store.js +139 -0
  307. package/dist/process/command-queue.js +97 -0
  308. package/dist/process/exec.js +75 -0
  309. package/dist/protocol.schema.json +2918 -0
  310. package/dist/provider-web.js +8 -0
  311. package/dist/providers/web/index.js +2 -0
  312. package/dist/runtime.js +8 -0
  313. package/dist/sessions/send-policy.js +68 -0
  314. package/dist/signal/client.js +134 -0
  315. package/dist/signal/daemon.js +69 -0
  316. package/dist/signal/index.js +3 -0
  317. package/dist/signal/monitor.js +336 -0
  318. package/dist/signal/probe.js +46 -0
  319. package/dist/signal/send.js +91 -0
  320. package/dist/slack/actions.js +97 -0
  321. package/dist/slack/index.js +5 -0
  322. package/dist/slack/monitor.js +1029 -0
  323. package/dist/slack/probe.js +47 -0
  324. package/dist/slack/send.js +131 -0
  325. package/dist/slack/token.js +10 -0
  326. package/dist/telegram/bot.js +394 -0
  327. package/dist/telegram/download.js +34 -0
  328. package/dist/telegram/index.js +4 -0
  329. package/dist/telegram/monitor.js +47 -0
  330. package/dist/telegram/probe.js +63 -0
  331. package/dist/telegram/proxy.js +9 -0
  332. package/dist/telegram/send.js +138 -0
  333. package/dist/telegram/token.js +30 -0
  334. package/dist/telegram/webhook-set.js +12 -0
  335. package/dist/telegram/webhook.js +56 -0
  336. package/dist/tui/commands.js +74 -0
  337. package/dist/tui/components/assistant-message.js +16 -0
  338. package/dist/tui/components/chat-log.js +92 -0
  339. package/dist/tui/components/custom-editor.js +53 -0
  340. package/dist/tui/components/selectors.js +8 -0
  341. package/dist/tui/components/tool-execution.js +111 -0
  342. package/dist/tui/components/user-message.js +17 -0
  343. package/dist/tui/gateway-chat.js +140 -0
  344. package/dist/tui/layout.js +41 -0
  345. package/dist/tui/message-list.js +57 -0
  346. package/dist/tui/theme/theme.js +80 -0
  347. package/dist/tui/theme.js +25 -0
  348. package/dist/tui/tui.js +708 -0
  349. package/dist/utils.js +133 -0
  350. package/dist/version.js +18 -0
  351. package/dist/web/active-listener.js +7 -0
  352. package/dist/web/auto-reply.js +1203 -0
  353. package/dist/web/inbound.js +481 -0
  354. package/dist/web/login-qr.js +204 -0
  355. package/dist/web/login.js +59 -0
  356. package/dist/web/media.js +148 -0
  357. package/dist/web/outbound.js +67 -0
  358. package/dist/web/qr-image.js +97 -0
  359. package/dist/web/reconnect.js +60 -0
  360. package/dist/web/reply-heartbeat-wake.js +61 -0
  361. package/dist/web/session.js +346 -0
  362. package/dist/wizard/clack-prompter.js +56 -0
  363. package/dist/wizard/onboarding.js +452 -0
  364. package/dist/wizard/prompts.js +6 -0
  365. package/dist/wizard/session.js +203 -0
  366. package/docs/AGENTS.default.md +116 -0
  367. package/docs/CNAME +1 -0
  368. package/docs/RELEASING.md +64 -0
  369. package/docs/_config.yml +51 -0
  370. package/docs/_layouts/default.html +145 -0
  371. package/docs/agent-send.md +21 -0
  372. package/docs/agent.md +104 -0
  373. package/docs/android/connect.md +131 -0
  374. package/docs/architecture.md +89 -0
  375. package/docs/assets/markdown.css +130 -0
  376. package/docs/assets/pixel-lobster.svg +60 -0
  377. package/docs/assets/terminal.css +497 -0
  378. package/docs/assets/theme.js +55 -0
  379. package/docs/audio.md +50 -0
  380. package/docs/background-process.md +74 -0
  381. package/docs/bash.md +32 -0
  382. package/docs/bonjour.md +159 -0
  383. package/docs/browser.md +289 -0
  384. package/docs/camera.md +152 -0
  385. package/docs/clawd.md +199 -0
  386. package/docs/clawdbot-mac.md +104 -0
  387. package/docs/configuration.md +1177 -0
  388. package/docs/control-api.md +49 -0
  389. package/docs/control-ui.md +83 -0
  390. package/docs/cron.md +374 -0
  391. package/docs/dashboard.md +17 -0
  392. package/docs/device-models.md +46 -0
  393. package/docs/discord.md +293 -0
  394. package/docs/discovery.md +112 -0
  395. package/docs/docker.md +251 -0
  396. package/docs/docs.json +86 -0
  397. package/docs/doctor.md +47 -0
  398. package/docs/elevated.md +31 -0
  399. package/docs/faq.md +640 -0
  400. package/docs/gateway/pairing.md +109 -0
  401. package/docs/gateway-lock.md +28 -0
  402. package/docs/gateway.md +174 -0
  403. package/docs/gmail-pubsub.md +191 -0
  404. package/docs/grammy.md +27 -0
  405. package/docs/group-messages.md +71 -0
  406. package/docs/groups.md +78 -0
  407. package/docs/health.md +28 -0
  408. package/docs/heartbeat.md +64 -0
  409. package/docs/images.md +52 -0
  410. package/docs/imessage.md +63 -0
  411. package/docs/index.md +182 -0
  412. package/docs/ios/connect.md +177 -0
  413. package/docs/ios/spec.md +236 -0
  414. package/docs/location-command.md +95 -0
  415. package/docs/logging.md +99 -0
  416. package/docs/lore.md +131 -0
  417. package/docs/mac/bun.md +133 -0
  418. package/docs/mac/canvas.md +161 -0
  419. package/docs/mac/child-process.md +72 -0
  420. package/docs/mac/dev-setup.md +81 -0
  421. package/docs/mac/health.md +28 -0
  422. package/docs/mac/icon.md +26 -0
  423. package/docs/mac/logging.md +51 -0
  424. package/docs/mac/menu-bar.md +69 -0
  425. package/docs/mac/peekaboo.md +170 -0
  426. package/docs/mac/permissions.md +40 -0
  427. package/docs/mac/release.md +76 -0
  428. package/docs/mac/remote.md +57 -0
  429. package/docs/mac/signing.md +41 -0
  430. package/docs/mac/skills.md +27 -0
  431. package/docs/mac/voice-overlay.md +52 -0
  432. package/docs/mac/voicewake.md +56 -0
  433. package/docs/mac/webchat.md +27 -0
  434. package/docs/mac/xpc.md +40 -0
  435. package/docs/models.md +90 -0
  436. package/docs/nix.md +49 -0
  437. package/docs/nodes.md +157 -0
  438. package/docs/onboarding-config-protocol.md +29 -0
  439. package/docs/onboarding.md +185 -0
  440. package/docs/presence.md +133 -0
  441. package/docs/queue.md +78 -0
  442. package/docs/refactor/browser-control-simplification.md +58 -0
  443. package/docs/refactor/canvas-a2ui.md +93 -0
  444. package/docs/refactor/cli-unification.md +64 -0
  445. package/docs/refactor/gateway-client.md +31 -0
  446. package/docs/refactor/gateway.md +99 -0
  447. package/docs/refactor/new-arch.md +171 -0
  448. package/docs/refactor/tui.md +26 -0
  449. package/docs/refactor/web-gateway-troubleshooting.md +37 -0
  450. package/docs/refactor/webagent-session.md +46 -0
  451. package/docs/remote-gateway-readme.md +148 -0
  452. package/docs/remote.md +66 -0
  453. package/docs/research/memory.md +227 -0
  454. package/docs/rpc.md +35 -0
  455. package/docs/security.md +168 -0
  456. package/docs/session-tool.md +119 -0
  457. package/docs/session.md +84 -0
  458. package/docs/sessions.md +8 -0
  459. package/docs/setup.md +118 -0
  460. package/docs/signal.md +113 -0
  461. package/docs/skills-config.md +58 -0
  462. package/docs/skills.md +149 -0
  463. package/docs/slack.md +158 -0
  464. package/docs/surface.md +20 -0
  465. package/docs/tailscale.md +71 -0
  466. package/docs/talk.md +79 -0
  467. package/docs/telegram.md +90 -0
  468. package/docs/templates/AGENTS.md +126 -0
  469. package/docs/templates/BOOTSTRAP.md +53 -0
  470. package/docs/templates/IDENTITY.md +17 -0
  471. package/docs/templates/SOUL.md +41 -0
  472. package/docs/templates/TOOLS.md +41 -0
  473. package/docs/templates/USER.md +22 -0
  474. package/docs/test.md +35 -0
  475. package/docs/thinking.md +46 -0
  476. package/docs/tools.md +248 -0
  477. package/docs/troubleshooting.md +227 -0
  478. package/docs/tui.md +69 -0
  479. package/docs/typebox.md +42 -0
  480. package/docs/voicewake.md +61 -0
  481. package/docs/web.md +115 -0
  482. package/docs/webchat.md +34 -0
  483. package/docs/webhook.md +132 -0
  484. package/docs/whatsapp-clawd.jpg +0 -0
  485. package/docs/whatsapp.md +142 -0
  486. package/docs/wizard.md +158 -0
  487. package/package.json +186 -0
  488. package/skills/apple-notes/SKILL.md +50 -0
  489. package/skills/apple-reminders/SKILL.md +67 -0
  490. package/skills/bear-notes/SKILL.md +79 -0
  491. package/skills/bird/SKILL.md +25 -0
  492. package/skills/blogwatcher/SKILL.md +46 -0
  493. package/skills/blucli/SKILL.md +27 -0
  494. package/skills/brave-search/SKILL.md +30 -0
  495. package/skills/brave-search/scripts/content.mjs +53 -0
  496. package/skills/brave-search/scripts/search.mjs +79 -0
  497. package/skills/camsnap/SKILL.md +25 -0
  498. package/skills/clawdhub/SKILL.md +53 -0
  499. package/skills/coding-agent/SKILL.md +275 -0
  500. package/skills/discord/SKILL.md +369 -0
  501. package/skills/eightctl/SKILL.md +29 -0
  502. package/skills/food-order/SKILL.md +41 -0
  503. package/skills/gemini/SKILL.md +23 -0
  504. package/skills/gifgrep/SKILL.md +47 -0
  505. package/skills/github/SKILL.md +47 -0
  506. package/skills/gog/SKILL.md +36 -0
  507. package/skills/goplaces/SKILL.md +30 -0
  508. package/skills/imsg/SKILL.md +25 -0
  509. package/skills/local-places/SERVER_README.md +101 -0
  510. package/skills/local-places/SKILL.md +91 -0
  511. package/skills/local-places/pyproject.toml +27 -0
  512. package/skills/local-places/src/local_places/__init__.py +2 -0
  513. package/skills/local-places/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
  514. package/skills/local-places/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
  515. package/skills/local-places/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
  516. package/skills/local-places/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
  517. package/skills/local-places/src/local_places/google_places.py +314 -0
  518. package/skills/local-places/src/local_places/main.py +65 -0
  519. package/skills/local-places/src/local_places/schemas.py +107 -0
  520. package/skills/mcporter/SKILL.md +38 -0
  521. package/skills/nano-banana-pro/SKILL.md +29 -0
  522. package/skills/nano-banana-pro/scripts/generate_image.py +167 -0
  523. package/skills/nano-pdf/SKILL.md +20 -0
  524. package/skills/notion/SKILL.md +156 -0
  525. package/skills/obsidian/SKILL.md +55 -0
  526. package/skills/openai-image-gen/SKILL.md +31 -0
  527. package/skills/openai-image-gen/scripts/gen.py +173 -0
  528. package/skills/openai-whisper/SKILL.md +19 -0
  529. package/skills/openai-whisper-api/SKILL.md +43 -0
  530. package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
  531. package/skills/openhue/SKILL.md +30 -0
  532. package/skills/oracle/SKILL.md +105 -0
  533. package/skills/ordercli/SKILL.md +47 -0
  534. package/skills/peekaboo/SKILL.md +153 -0
  535. package/skills/qmd/SKILL.md +26 -0
  536. package/skills/sag/SKILL.md +62 -0
  537. package/skills/slack/SKILL.md +143 -0
  538. package/skills/songsee/SKILL.md +29 -0
  539. package/skills/sonoscli/SKILL.md +26 -0
  540. package/skills/spotify-player/SKILL.md +34 -0
  541. package/skills/summarize/SKILL.md +49 -0
  542. package/skills/things-mac/SKILL.md +61 -0
  543. package/skills/tmux/SKILL.md +121 -0
  544. package/skills/tmux/scripts/find-sessions.sh +112 -0
  545. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  546. package/skills/trello/SKILL.md +84 -0
  547. package/skills/video-frames/SKILL.md +29 -0
  548. package/skills/video-frames/scripts/frame.sh +81 -0
  549. package/skills/wacli/SKILL.md +42 -0
  550. package/skills/weather/SKILL.md +49 -0
package/docs/nodes.md ADDED
@@ -0,0 +1,157 @@
1
+ ---
2
+ summary: "Nodes: pairing, capabilities, permissions, and CLI helpers for canvas/camera/screen/system"
3
+ read_when:
4
+ - Pairing iOS/Android nodes to a gateway
5
+ - Using node canvas/camera for agent context
6
+ - Adding new node commands or CLI helpers
7
+ ---
8
+
9
+ # Nodes
10
+
11
+ A **node** is a companion device (iOS/Android today) that connects to the Gateway over the **Bridge** and exposes a command surface (e.g. `canvas.*`, `camera.*`, `system.*`) via `node.invoke`.
12
+
13
+ macOS can also run in **node mode**: the menubar app connects to the Gateway’s bridge and exposes its local canvas/camera commands as a node (so `clawdbot nodes …` works against this Mac).
14
+
15
+ ## Pairing + status
16
+
17
+ Pairing is gateway-owned and approval-based. See `docs/gateway/pairing.md` for the full flow.
18
+
19
+ Quick CLI:
20
+
21
+ ```bash
22
+ clawdbot nodes pending
23
+ clawdbot nodes approve <requestId>
24
+ clawdbot nodes reject <requestId>
25
+ clawdbot nodes status
26
+ clawdbot nodes describe --node <idOrNameOrIp>
27
+ clawdbot nodes rename --node <idOrNameOrIp> --name "Kitchen iPad"
28
+ ```
29
+
30
+ Notes:
31
+ - `nodes rename` stores a display name override in the gateway pairing store.
32
+
33
+ ## Invoking commands
34
+
35
+ Low-level (raw RPC):
36
+
37
+ ```bash
38
+ clawdbot nodes invoke --node <idOrNameOrIp> --command canvas.eval --params '{"javaScript":"location.href"}'
39
+ ```
40
+
41
+ Higher-level helpers exist for the common “give the agent a MEDIA attachment” workflows.
42
+
43
+ ## Screenshots (canvas snapshots)
44
+
45
+ If the node is showing the Canvas (WebView), `canvas.snapshot` returns `{ format, base64 }`.
46
+
47
+ CLI helper (writes to a temp file and prints `MEDIA:<path>`):
48
+
49
+ ```bash
50
+ clawdbot nodes canvas snapshot --node <idOrNameOrIp> --format png
51
+ clawdbot nodes canvas snapshot --node <idOrNameOrIp> --format jpg --max-width 1200 --quality 0.9
52
+ ```
53
+
54
+ Simple shortcut (auto-picks a single connected node if possible):
55
+
56
+ ```bash
57
+ clawdbot canvas snapshot --format png
58
+ clawdbot canvas snapshot --format jpg --max-width 1200 --quality 0.9
59
+ ```
60
+
61
+ ## Photos + videos (node camera)
62
+
63
+ Photos (`jpg`):
64
+
65
+ ```bash
66
+ clawdbot nodes camera snap --node <idOrNameOrIp> # default: both facings (2 MEDIA lines)
67
+ clawdbot nodes camera snap --node <idOrNameOrIp> --facing front
68
+ ```
69
+
70
+ Video clips (`mp4`):
71
+
72
+ ```bash
73
+ clawdbot nodes camera clip --node <idOrNameOrIp> --duration 10s
74
+ clawdbot nodes camera clip --node <idOrNameOrIp> --duration 3000 --no-audio
75
+ ```
76
+
77
+ Notes:
78
+ - The node must be **foregrounded** for `canvas.*` and `camera.*` (background calls return `NODE_BACKGROUND_UNAVAILABLE`).
79
+ - Clip duration is clamped (currently `<= 60s`) to avoid oversized base64 payloads.
80
+ - Android will prompt for `CAMERA`/`RECORD_AUDIO` permissions when possible; denied permissions fail with `*_PERMISSION_REQUIRED`.
81
+
82
+ ## Screen recordings (nodes)
83
+
84
+ Nodes expose `screen.record` (mp4). Example:
85
+
86
+ ```bash
87
+ clawdbot nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10
88
+ clawdbot nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10 --no-audio
89
+ ```
90
+
91
+ Notes:
92
+ - `screen.record` requires the node app to be foregrounded.
93
+ - Android will show the system screen-capture prompt before recording.
94
+ - Screen recordings are clamped to `<= 60s`.
95
+ - `--no-audio` disables microphone capture (supported on iOS/Android; macOS uses system capture audio).
96
+
97
+ ## Location (nodes)
98
+
99
+ Nodes expose `location.get` when Location is enabled in settings.
100
+
101
+ CLI helper:
102
+
103
+ ```bash
104
+ clawdbot nodes location get --node <idOrNameOrIp>
105
+ clawdbot nodes location get --node <idOrNameOrIp> --accuracy precise --max-age 15000 --location-timeout 10000
106
+ ```
107
+
108
+ Notes:
109
+ - Location is **off by default**.
110
+ - “Always” requires system permission; background fetch is best-effort.
111
+ - The response includes lat/lon, accuracy (meters), and timestamp.
112
+
113
+ ## SMS (Android nodes)
114
+
115
+ Android nodes can expose `sms.send` when the user grants **SMS** permission and the device supports telephony.
116
+
117
+ Low-level invoke:
118
+
119
+ ```bash
120
+ clawdbot nodes invoke --node <idOrNameOrIp> --command sms.send --params '{"to":"+15555550123","message":"Hello from Clawdbot"}'
121
+ ```
122
+
123
+ Notes:
124
+ - The permission prompt must be accepted on the Android device before the capability is advertised.
125
+ - Wi-Fi-only devices without telephony will not advertise `sms.send`.
126
+
127
+ ## System commands (mac node)
128
+
129
+ The macOS node exposes `system.run` and `system.notify`.
130
+
131
+ Examples:
132
+
133
+ ```bash
134
+ clawdbot nodes run --node <idOrNameOrIp> -- echo "Hello from mac node"
135
+ clawdbot nodes notify --node <idOrNameOrIp> --title "Ping" --body "Gateway ready"
136
+ ```
137
+
138
+ Notes:
139
+ - `system.run` returns stdout/stderr/exit code in the payload.
140
+ - `system.notify` respects notification permission state on the macOS app.
141
+
142
+ ## Permissions map
143
+
144
+ Nodes may include a `permissions` map in `node.list` / `node.describe`, keyed by permission name (e.g. `screenRecording`, `accessibility`) with boolean values (`true` = granted).
145
+
146
+ ## Mac node mode
147
+
148
+ - The macOS menubar app connects to the Gateway bridge as a node (so `clawdbot nodes …` works against this Mac).
149
+ - In remote mode, the app opens an SSH tunnel for the bridge port and connects to `localhost`.
150
+
151
+ ## Where to look in code
152
+
153
+ - CLI wiring: `src/cli/nodes-cli.ts`
154
+ - Canvas snapshot decoding/temp paths: `src/cli/nodes-canvas.ts`
155
+ - Duration parsing for CLI: `src/cli/parse-duration.ts`
156
+ - iOS node commands: `apps/ios/Sources/Model/NodeAppModel.swift`
157
+ - Android node commands: `apps/android/app/src/main/java/com/clawdbot/android/node/*`
@@ -0,0 +1,29 @@
1
+ # Onboarding + Config Protocol
2
+
3
+ Purpose: shared onboarding + config surfaces across CLI, macOS app, and Web UI.
4
+
5
+ ## Components
6
+ - Wizard engine: `src/wizard` (session + prompts + onboarding state).
7
+ - CLI: `src/commands/onboard-*.ts` uses the wizard with the CLI prompter.
8
+ - Gateway RPC: wizard + config schema endpoints serve UI clients.
9
+ - macOS: SwiftUI onboarding uses the wizard step model.
10
+ - Web UI: config form renders from JSON Schema + hints.
11
+
12
+ ## Gateway RPC
13
+ - `wizard.start` params: `{ mode?: "local"|"remote", workspace?: string }`
14
+ - `wizard.next` params: `{ sessionId, answer?: { stepId, value? } }`
15
+ - `wizard.cancel` params: `{ sessionId }`
16
+ - `wizard.status` params: `{ sessionId }`
17
+ - `config.schema` params: `{}`
18
+
19
+ Responses (shape)
20
+ - Wizard: `{ sessionId, done, step?, status?, error? }`
21
+ - Config schema: `{ schema, uiHints, version, generatedAt }`
22
+
23
+ ## UI Hints
24
+ - `uiHints` keyed by path; optional metadata (label/help/group/order/advanced/sensitive/placeholder).
25
+ - Sensitive fields render as password inputs; no redaction layer.
26
+ - Unsupported schema nodes fall back to the raw JSON editor.
27
+
28
+ ## Notes
29
+ - This doc is the single place to track protocol refactors for onboarding/config.
@@ -0,0 +1,185 @@
1
+ ---
2
+ summary: "Planned first-run onboarding flow for Clawdbot (local vs remote, Anthropic OAuth, workspace bootstrap ritual)"
3
+ read_when:
4
+ - Designing the macOS onboarding assistant
5
+ - Implementing Anthropic auth or identity setup
6
+ ---
7
+ <!-- {% raw %} -->
8
+ # Onboarding (macOS app)
9
+
10
+ This doc describes the intended **first-run onboarding** for Clawdbot. The goal is a good “day 0” experience: pick where the Gateway runs, bind Claude (Anthropic) auth for the embedded agent runtime, and then let the **agent bootstrap itself** via a first-run ritual in the workspace.
11
+
12
+ ## Page order (high level)
13
+
14
+ 1) **Local vs Remote**
15
+ 2) **(Local only)** Connect Claude (Anthropic OAuth) — optional, but recommended
16
+ 3) **Connect Gmail (optional)** — run `clawdbot hooks gmail setup` to configure Pub/Sub hooks
17
+ 4) **Onboarding chat** — dedicated session where the agent introduces itself and guides setup
18
+
19
+ ## 1) Local vs Remote
20
+
21
+ First question: where does the **Gateway** run?
22
+
23
+ - **Local (this Mac):** onboarding can run the Anthropic OAuth flow and write the Clawdbot token store locally.
24
+ - **Remote (over SSH/tailnet):** onboarding must not run OAuth locally, because credentials must exist on the **gateway host**.
25
+
26
+ Gateway auth tip:
27
+ - If you only use Clawdbot on this Mac (loopback gateway), keep auth **Off**.
28
+ - Use **Token** for multi-machine access or non-loopback binds.
29
+
30
+ Implementation note (2025-12-19): in local mode, the macOS app bundles the Gateway and enables it via a per-user launchd LaunchAgent (no global npm install/Node requirement for the user).
31
+
32
+ ## 2) Local-only: Connect Claude (Anthropic OAuth)
33
+
34
+ This is the “bind Clawdbot to Anthropic” step. It is explicitly the **Anthropic (Claude Pro/Max) OAuth flow**, not a generic “login”.
35
+
36
+ ### Recommended: OAuth
37
+
38
+ The macOS app should:
39
+ - Start the Anthropic OAuth (PKCE) flow in the user’s browser.
40
+ - Ask the user to paste the `code#state` value.
41
+ - Exchange it for tokens and write credentials to:
42
+ - `~/.clawdbot/credentials/oauth.json` (file mode `0600`, directory mode `0700`)
43
+
44
+ Why this location matters: it’s the Clawdbot-owned OAuth store.
45
+ On first run, Clawdbot can import existing OAuth tokens from legacy p/Claude locations if present.
46
+
47
+ ### Alternative: API key (instructions only)
48
+
49
+ Offer an “API key” option, but for now it is **instructions only**:
50
+ - Get an Anthropic API key.
51
+ - Provide it to Clawdbot via your preferred mechanism (env/config).
52
+
53
+ Note: environment variables are often confusing when the Gateway is launched by a GUI app (launchd environment != your shell).
54
+
55
+ ### Model safety rule
56
+
57
+ Clawdbot should **always pass** `--model` when invoking the embedded agent (don’t rely on defaults).
58
+
59
+ Example (CLI):
60
+
61
+ ```bash
62
+ clawdbot agent --mode rpc --model anthropic/claude-opus-4-5 "<message>"
63
+ ```
64
+
65
+ If the user skips auth, onboarding should be clear: the agent likely won’t respond until auth is configured.
66
+
67
+ ## 4) Onboarding chat (dedicated session)
68
+
69
+ The onboarding flow now embeds the SwiftUI chat view directly. It uses a **special session key**
70
+ (`onboarding`) so the “newborn agent” ritual stays separate from the main chat.
71
+
72
+ This onboarding chat is where the agent:
73
+ - does the BOOTSTRAP.md identity ritual (one question at a time)
74
+ - visits **soul.md** with the user and writes `SOUL.md` (values, tone, boundaries)
75
+ - asks how the user wants to talk (web-only / WhatsApp / Telegram)
76
+ - guides linking steps (including showing a QR inline for WhatsApp via the `whatsapp_login` tool)
77
+
78
+ If the workspace bootstrap is already complete (BOOTSTRAP.md removed), the onboarding chat step is skipped.
79
+
80
+ ## 2.5) Optional: Connect Gmail
81
+
82
+ The macOS onboarding includes an optional Gmail step. It runs:
83
+
84
+ ```bash
85
+ clawdbot hooks gmail setup --account you@gmail.com
86
+ ```
87
+
88
+ This writes the full `hooks.gmail` config, installs `gcloud` / `gog` / `tailscale`
89
+ via Homebrew if needed, and configures the Pub/Sub push endpoint. After setup,
90
+ restart the gateway so the internal Gmail watcher starts.
91
+
92
+ Once setup is complete, the user can switch to the normal chat (`main`) via the menu bar panel.
93
+
94
+ ## 5) Agent bootstrap ritual (outside onboarding)
95
+
96
+ We no longer collect identity in the onboarding wizard. Instead, the **first agent run** performs a playful bootstrap ritual using files in the workspace:
97
+
98
+ - Workspace is created implicitly (default `~/.clawdbot/workspace`) when local is selected,
99
+ but only if the folder is empty or already contains `AGENTS.md`.
100
+ - Files are seeded: `AGENTS.md`, `BOOTSTRAP.md`, `IDENTITY.md`, `USER.md`.
101
+ - `BOOTSTRAP.md` tells the agent to keep it conversational:
102
+ - open with a cute hello
103
+ - ask **one question at a time** (no multi-question bombardment)
104
+ - offer a small set of suggestions where helpful (name, creature, emoji)
105
+ - wait for the user’s reply before asking the next question
106
+ - The agent writes results to:
107
+ - `IDENTITY.md` (agent name, vibe/creature, emoji)
108
+ - `USER.md` (who the user is + how they want to be addressed)
109
+ - `SOUL.md` (identity, tone, boundaries — crafted from the soul.md prompt)
110
+ - `~/.clawdbot/clawdbot.json` (structured identity defaults)
111
+ - After the ritual, the agent **deletes `BOOTSTRAP.md`** so it only runs once.
112
+
113
+ Identity data still feeds the same defaults as before:
114
+
115
+ - outbound prefix emoji (`messages.responsePrefix`)
116
+ - group mention patterns / wake words
117
+ - default session intro (“You are Samantha…”)
118
+ - macOS UI labels
119
+
120
+ ## 6) Workspace notes (no explicit onboarding step)
121
+
122
+ The workspace is created automatically as part of agent bootstrap (no dedicated onboarding screen).
123
+
124
+ Recommendation: treat the workspace as the agent’s “memory” and make it a git repo (ideally private) so identity + memories are backed up:
125
+
126
+ ```bash
127
+ cd ~/.clawdbot/workspace
128
+ git init
129
+ git add AGENTS.md
130
+ git commit -m "Add agent workspace"
131
+ ```
132
+
133
+ Daily memory lives under `memory/` in the workspace:
134
+ - one file per day: `memory/YYYY-MM-DD.md`
135
+ - read today + yesterday on session start
136
+ - keep it short (durable facts, preferences, decisions; avoid secrets)
137
+
138
+ ## Remote mode note (why OAuth is hidden)
139
+
140
+ If the Gateway runs on another machine, the Anthropic OAuth credentials must be created/stored on that host (where the agent runtime runs).
141
+
142
+ For now, remote onboarding should:
143
+ - explain why OAuth isn't shown
144
+ - point the user at the credential location (`~/.clawdbot/credentials/oauth.json`) and the workspace location on the gateway host
145
+ - mention that the **bootstrap ritual happens on the gateway host** (same BOOTSTRAP/IDENTITY/USER files)
146
+
147
+ ### Manual credential setup
148
+
149
+ On the gateway host, create `~/.clawdbot/credentials/oauth.json` with this exact format:
150
+
151
+ ```json
152
+ {
153
+ "anthropic": {
154
+ "access": "sk-ant-oat01-...",
155
+ "refresh": "sk-ant-ort01-...",
156
+ "expires": 1767304352803
157
+ }
158
+ }
159
+ ```
160
+
161
+ Set permissions: `chmod 600 ~/.clawdbot/credentials/oauth.json`
162
+
163
+ **Note:** Clawdbot can auto-import from legacy pi-coding-agent paths (`~/.pi/agent/oauth.json`, etc.) but this does NOT work with Claude Code credentials — different file and format.
164
+
165
+ ### Using Claude Code credentials
166
+
167
+ If Claude Code is installed on the gateway host, convert its credentials:
168
+
169
+ ```bash
170
+ cat ~/.claude/.credentials.json | jq '{
171
+ anthropic: {
172
+ access: .claudeAiOauth.accessToken,
173
+ refresh: .claudeAiOauth.refreshToken,
174
+ expires: .claudeAiOauth.expiresAt
175
+ }
176
+ }' > ~/.clawdbot/credentials/oauth.json
177
+ chmod 600 ~/.clawdbot/credentials/oauth.json
178
+ ```
179
+
180
+ | Claude Code field | Clawdbot field |
181
+ |-------------------|---------------|
182
+ | `accessToken` | `access` |
183
+ | `refreshToken` | `refresh` |
184
+ | `expiresAt` | `expires` |
185
+ <!-- {% endraw %} -->
@@ -0,0 +1,133 @@
1
+ ---
2
+ summary: "How Clawdbot presence entries are produced, merged, and displayed"
3
+ read_when:
4
+ - Debugging the Instances tab
5
+ - Investigating duplicate or stale instance rows
6
+ - Changing gateway WS connect or system-event beacons
7
+ ---
8
+ # Presence
9
+
10
+ Clawdbot “presence” is a lightweight, best-effort view of:
11
+ - The **Gateway** itself (one per host), and
12
+ - The **clients connected to the Gateway** (mac app, WebChat, CLI, etc.).
13
+
14
+ Presence is used primarily to render the mac app’s **Instances** tab and to provide quick operator visibility.
15
+
16
+ ## The data model
17
+
18
+ Presence entries are structured objects with (some) fields:
19
+ - `instanceId` (optional but strongly recommended): stable client identity used for dedupe
20
+ - `host`: a human-readable name (often the machine name)
21
+ - `ip`: best-effort IP address (may be missing or stale)
22
+ - `version`: client version string
23
+ - `deviceFamily` (optional): hardware family like `iPad`, `iPhone`, `Mac`
24
+ - `modelIdentifier` (optional): hardware model identifier like `iPad16,6` or `Mac16,6`
25
+ - `mode`: e.g. `gateway`, `app`, `webchat`, `cli`
26
+ - `lastInputSeconds` (optional): “seconds since last user input” for that client machine
27
+ - `reason`: a short marker like `self`, `connect`, `node-connected`, `node-disconnected`, `periodic`, `instances-refresh`
28
+ - `text`: legacy/debug summary string (kept for backwards compatibility and UI display)
29
+ - `ts`: last update timestamp (ms since epoch)
30
+
31
+ ## Producers (where presence comes from)
32
+
33
+ Presence entries are produced by multiple sources and then **merged**.
34
+
35
+ ### 1) Gateway self entry
36
+
37
+ The Gateway seeds a “self” entry at startup so UIs always show at least the current gateway host.
38
+
39
+ Implementation: `src/infra/system-presence.ts` (`initSelfPresence()`).
40
+
41
+ ### 2) WebSocket connect (connection-derived presence)
42
+
43
+ Every WS client must begin with a `connect` request. On successful handshake, the Gateway upserts a presence entry for that connection.
44
+
45
+ This is meant to answer: “Which clients are currently connected?”
46
+
47
+ Implementation: `src/gateway/server.ts` (connect handling uses `connect.params.client.instanceId` when provided; otherwise falls back to `connId`).
48
+
49
+ #### Why one-off CLI commands do not show up
50
+
51
+ The CLI connects to the Gateway to execute one-off commands (health/status/send/agent/etc.). These are not “nodes” and would spam the Instances list, so the Gateway does not create presence entries for clients with `client.mode === "cli"`.
52
+
53
+ ### 3) `system-event` beacons (client-reported presence)
54
+
55
+ Clients can publish richer periodic beacons via the `system-event` method. The mac app uses this to report:
56
+ - a human-friendly host name
57
+ - its best-known IP address
58
+ - `lastInputSeconds`
59
+
60
+ Implementation:
61
+ - Gateway: `src/gateway/server.ts` handles method `system-event` by calling `updateSystemPresence(...)`.
62
+ - mac app beaconing: `apps/macos/Sources/Clawdbot/PresenceReporter.swift`.
63
+
64
+ ### 4) Node bridge beacons (gateway-owned presence)
65
+
66
+ When a node bridge connection authenticates, the Gateway emits a presence entry
67
+ for that node and starts periodic refresh beacons so it does not expire.
68
+
69
+ - Connect/disconnect markers: `node-connected`, `node-disconnected`
70
+ - Periodic heartbeat: every 3 minutes (`reason: periodic`)
71
+
72
+ Implementation: `src/gateway/server.ts` (node bridge handlers + timer beacons).
73
+
74
+ ## Merge + dedupe rules (why `instanceId` matters)
75
+
76
+ All producers write into a single in-memory presence map.
77
+
78
+ Key points:
79
+ - Entries are **keyed** by a “presence key”. If two producers use the same key, they update the same entry.
80
+ - The best key is a stable, opaque `instanceId` that does not change across restarts.
81
+ - Keys are treated case-insensitively.
82
+
83
+ Implementation: `src/infra/system-presence.ts` (`normalizePresenceKey()`).
84
+
85
+ ### mac app identity (stable UUID)
86
+
87
+ The mac app uses a persisted UUID as `instanceId` so:
88
+ - restarts/reconnects do not create duplicates
89
+ - renaming the Mac does not create a new “instance”
90
+ - debug/release builds can share the same identity
91
+
92
+ Implementation: `apps/macos/Sources/Clawdbot/InstanceIdentity.swift`.
93
+
94
+ `displayName` (machine name) is used for UI, while `instanceId` is used for dedupe.
95
+
96
+ ## TTL and bounded size (why stale rows disappear)
97
+
98
+ Presence entries are not permanent:
99
+ - TTL: entries older than 5 minutes are pruned
100
+ - Max: map is capped at 200 entries (LRU by `ts`)
101
+
102
+ Implementation: `src/infra/system-presence.ts` (`TTL_MS`, `MAX_ENTRIES`, pruning in `listSystemPresence()`).
103
+
104
+ ## Remote/tunnel caveat (loopback IPs)
105
+
106
+ When a client connects over an SSH tunnel / local port forward, the Gateway may see the remote address as loopback (`127.0.0.1`).
107
+
108
+ To avoid degrading an otherwise-correct client beacon IP, the Gateway avoids writing loopback remote addresses into presence entries.
109
+
110
+ Implementation: `src/gateway/server.ts` (`isLoopbackAddress()`).
111
+
112
+ ## Consumers (who reads presence)
113
+
114
+ ### macOS Instances tab
115
+
116
+ The mac app’s Instances tab renders the result of `system-presence`.
117
+
118
+ Implementation:
119
+ - View: `apps/macos/Sources/Clawdbot/InstancesSettings.swift`
120
+ - Store: `apps/macos/Sources/Clawdbot/InstancesStore.swift`
121
+
122
+ The Instances rows show a small presence indicator (Active/Idle/Stale) based on
123
+ the last beacon age. The label is derived from the entry timestamp (`ts`).
124
+
125
+ The store refreshes periodically and also applies `presence` WS events.
126
+
127
+ ## Debugging tips
128
+
129
+ - To see the raw list, call `system-presence` against the gateway.
130
+ - If you see duplicates:
131
+ - confirm clients send a stable `instanceId` in the handshake (`connect.params.client.instanceId`)
132
+ - confirm beaconing uses the same `instanceId`
133
+ - check whether the connection-derived entry is missing `instanceId` (then it will be keyed by `connId` and duplicates are expected on reconnect)
package/docs/queue.md ADDED
@@ -0,0 +1,78 @@
1
+ ---
2
+ summary: "Command queue design that serializes auto-reply command execution"
3
+ read_when:
4
+ - Changing auto-reply execution or concurrency
5
+ ---
6
+ # Command Queue (2026-01-03)
7
+
8
+ We now serialize command-based auto-replies (WhatsApp Web listener) through a tiny in-process queue to prevent multiple commands from running at once, while allowing safe parallelism across sessions.
9
+
10
+ ## Why
11
+ - Some auto-reply commands are expensive (LLM calls) and can collide when multiple inbound messages arrive close together.
12
+ - Serializing avoids competing for terminal/stdin, keeps logs readable, and reduces the chance of rate limits from upstream tools.
13
+
14
+ ## How it works
15
+ - `src/process/command-queue.ts` holds a lane-aware FIFO queue and drains each lane synchronously.
16
+ - `runEmbeddedPiAgent` enqueues by **session key** (lane `session:<key>`) to guarantee only one active run per session.
17
+ - Each session run is then queued into a **global lane** (`main` by default) so overall parallelism is capped by `agent.maxConcurrent`.
18
+ - When verbose logging is enabled, queued commands emit a short notice if they waited more than ~2s before starting.
19
+ - Typing indicators (`onReplyStart`) still fire immediately on enqueue so user experience is unchanged while we wait our turn.
20
+
21
+ ## Queue modes (per surface)
22
+ Inbound messages can steer the current run, wait for a followup turn, or do both:
23
+ - `steer`: inject immediately into the current run (cancels pending tool calls after the next tool boundary). If not streaming, falls back to followup.
24
+ - `followup`: enqueue for the next agent turn after the current run ends.
25
+ - `collect`: coalesce all queued messages into a **single** followup turn (default).
26
+ - `steer-backlog` (aka `steer+backlog`): steer now **and** preserve the message for a followup turn.
27
+ - `interrupt` (legacy): abort the active run for that session, then run the newest message.
28
+ - `queue` (legacy alias): same as `steer`.
29
+
30
+ Steer-backlog means you can get a followup response after the steered run, so
31
+ streaming surfaces can look like duplicates. Prefer `collect`/`steer` if you want
32
+ one response per inbound message.
33
+ Inline fix: `/queue collect` (per-session) or set `routing.queue.bySurface.discord: "collect"`.
34
+
35
+ Defaults (when unset in config):
36
+ - All surfaces → `collect`
37
+
38
+ Configure globally or per surface via `routing.queue`:
39
+
40
+ ```json5
41
+ {
42
+ routing: {
43
+ queue: {
44
+ mode: "collect",
45
+ debounceMs: 1000,
46
+ cap: 20,
47
+ drop: "summarize",
48
+ bySurface: { discord: "collect" }
49
+ }
50
+ }
51
+ }
52
+ ```
53
+
54
+ ## Queue options
55
+ Options apply to `followup`, `collect`, and `steer-backlog` (and to `steer` when it falls back to followup):
56
+ - `debounceMs`: wait for quiet before starting a followup turn (prevents “continue, continue”).
57
+ - `cap`: max queued messages per session.
58
+ - `drop`: overflow policy (`old`, `new`, `summarize`).
59
+
60
+ Summarize keeps a short bullet list of dropped messages and injects it as a synthetic followup prompt.
61
+ Defaults: `debounceMs: 1000`, `cap: 20`, `drop: summarize`.
62
+
63
+ ## Per-session overrides
64
+ - `/queue <mode>` as a standalone command stores the mode for the current session.
65
+ - `/queue <mode>` embedded in a message applies **once** (no persistence).
66
+ - Options can be combined: `/queue collect debounce:2s cap:25 drop:summarize`
67
+ - `/queue default` or `/queue reset` clears the session override.
68
+
69
+ ## Scope and guarantees
70
+ - Applies only to config-driven command replies; plain text replies are unaffected.
71
+ - Default lane (`main`) is process-wide for inbound + main heartbeats; set `agent.maxConcurrent` to allow multiple sessions in parallel.
72
+ - Additional lanes may exist (e.g. `cron`) so background jobs can run in parallel without blocking inbound replies.
73
+ - Per-session lanes guarantee that only one agent run touches a given session at a time.
74
+ - No external dependencies or background worker threads; pure TypeScript + promises.
75
+
76
+ ## Troubleshooting
77
+ - If commands seem stuck, enable verbose logs and look for “queued for …ms” lines to confirm the queue is draining.
78
+ - `enqueueCommand` exposes a lightweight `getQueueSize()` helper if you need to surface queue depth in future diagnostics.
@@ -0,0 +1,58 @@
1
+ ---
2
+ summary: "Refactor: simplify browser control API + implementation"
3
+ read_when:
4
+ - Refactoring browser control routes, client, or CLI
5
+ - Auditing agent-facing browser tool surface
6
+ date: 2025-12-20
7
+ ---
8
+
9
+ # Refactor: Browser control simplification
10
+
11
+ Goal: make the browser-control surface **small, stable, and agent-oriented**, and remove “implementation-shaped” APIs (Playwright/CDP specifics, one-off endpoints, and debugging helpers).
12
+
13
+ ## Why
14
+
15
+ - The previous API accreted many narrow endpoints (`/click`, `/type`, `/press`, …) plus debug utilities.
16
+ - Some actions are inherently racy when modeled as “do X *when* the event is already visible” (file chooser, dialogs).
17
+ - We want a single, coherent contract that keeps “how it’s implemented” private.
18
+
19
+ ## Target contract (vNext)
20
+
21
+ **Basics**
22
+ - `GET /` status
23
+ - `POST /start`, `POST /stop`
24
+ - `GET /tabs`, `POST /tabs/open`, `POST /tabs/focus`, `DELETE /tabs/:targetId`
25
+
26
+ **Agent actions**
27
+ - `POST /navigate` `{ url, targetId? }`
28
+ - `POST /act` `{ kind, targetId?, ... }` where `kind` is one of:
29
+ - `click`, `type`, `press`, `hover`, `drag`, `select`, `fill`, `wait`, `resize`, `close`, `evaluate`
30
+ - `POST /screenshot` `{ targetId?, fullPage?, ref?, element?, type? }`
31
+ - `GET /snapshot` `?format=ai|aria&targetId?&limit?`
32
+ - `GET /console` `?level?&targetId?`
33
+ - `POST /pdf` `{ targetId? }`
34
+
35
+ **Hooks (pre-setup / arming)**
36
+ - `POST /hooks/file-chooser` `{ targetId?, paths, timeoutMs? }`
37
+ - `POST /hooks/dialog` `{ targetId?, accept, promptText?, timeoutMs? }`
38
+
39
+ Semantics:
40
+ - Hook endpoints **arm** the next matching event within `timeoutMs` (default 2 minutes, clamped to max 2 minutes).
41
+ - Last arm wins per page (new arm replaces previous).
42
+
43
+ ## Work checklist
44
+
45
+ - [x] Replace action endpoints with `POST /act`
46
+ - [x] Remove legacy endpoints (`/click`, `/type`, `/wait`, …) and any CLI wrappers that no longer make sense
47
+ - [x] Remove `/back` and any history-specific routes
48
+ - [x] Convert `upload` + `dialog` to hook/arming endpoints
49
+ - [x] Unify screenshots behind `POST /screenshot` (no GET variant)
50
+ - [x] Trim inspect/debug endpoints (`/query`, `/dom`) unless explicitly needed
51
+ - [x] Update docs/browser.md to describe contract without implementation details
52
+ - [x] Update tests (server + client) to cover vNext contract
53
+
54
+ ## Notes / decisions
55
+
56
+ - Keep Playwright as an internal implementation detail for now.
57
+ - Prefer ref-based interactions (`aria-ref`) over coordinate-based ones.
58
+ - Keep the code split “routes vs. engine” small and obvious; avoid scattering logic across too many files.