clawdbot 2026.1.4-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (550) hide show
  1. package/CHANGELOG.md +120 -0
  2. package/LICENSE +21 -0
  3. package/README-header.png +0 -0
  4. package/README.md +297 -0
  5. package/dist/agents/agent-paths.js +17 -0
  6. package/dist/agents/bash-process-registry.js +126 -0
  7. package/dist/agents/bash-tools.js +837 -0
  8. package/dist/agents/clawdbot-tools.js +30 -0
  9. package/dist/agents/clawdis-tools.js +27 -0
  10. package/dist/agents/context.js +34 -0
  11. package/dist/agents/defaults.js +6 -0
  12. package/dist/agents/model-auth.js +112 -0
  13. package/dist/agents/model-catalog.js +55 -0
  14. package/dist/agents/model-fallback.js +191 -0
  15. package/dist/agents/model-scan.js +263 -0
  16. package/dist/agents/model-selection.js +116 -0
  17. package/dist/agents/models-config.js +49 -0
  18. package/dist/agents/pi-embedded-helpers.js +74 -0
  19. package/dist/agents/pi-embedded-runner.js +407 -0
  20. package/dist/agents/pi-embedded-subscribe.js +568 -0
  21. package/dist/agents/pi-embedded-utils.js +20 -0
  22. package/dist/agents/pi-embedded.js +1 -0
  23. package/dist/agents/pi-oauth.js +88 -0
  24. package/dist/agents/pi-tools.js +433 -0
  25. package/dist/agents/sandbox-paths.js +68 -0
  26. package/dist/agents/sandbox.js +644 -0
  27. package/dist/agents/shell-utils.js +53 -0
  28. package/dist/agents/skills-install.js +244 -0
  29. package/dist/agents/skills-status.js +157 -0
  30. package/dist/agents/skills.js +470 -0
  31. package/dist/agents/steerable-agent-loop.js +338 -0
  32. package/dist/agents/steerable-provider-transport.js +48 -0
  33. package/dist/agents/system-prompt.js +104 -0
  34. package/dist/agents/tool-display.js +162 -0
  35. package/dist/agents/tool-images.js +138 -0
  36. package/dist/agents/tools/browser-tool.js +339 -0
  37. package/dist/agents/tools/canvas-tool.js +193 -0
  38. package/dist/agents/tools/common.js +88 -0
  39. package/dist/agents/tools/cron-tool.js +124 -0
  40. package/dist/agents/tools/discord-actions-guild.js +186 -0
  41. package/dist/agents/tools/discord-actions-messaging.js +285 -0
  42. package/dist/agents/tools/discord-actions-moderation.js +70 -0
  43. package/dist/agents/tools/discord-actions.js +56 -0
  44. package/dist/agents/tools/discord-schema.js +199 -0
  45. package/dist/agents/tools/discord-tool.js +16 -0
  46. package/dist/agents/tools/gateway-tool.js +46 -0
  47. package/dist/agents/tools/gateway.js +27 -0
  48. package/dist/agents/tools/image-tool.js +132 -0
  49. package/dist/agents/tools/nodes-tool.js +413 -0
  50. package/dist/agents/tools/nodes-utils.js +92 -0
  51. package/dist/agents/tools/sessions-helpers.js +88 -0
  52. package/dist/agents/tools/sessions-history-tool.js +53 -0
  53. package/dist/agents/tools/sessions-list-tool.js +143 -0
  54. package/dist/agents/tools/sessions-send-helpers.js +100 -0
  55. package/dist/agents/tools/sessions-send-tool.js +347 -0
  56. package/dist/agents/tools/slack-actions.js +129 -0
  57. package/dist/agents/tools/slack-schema.js +59 -0
  58. package/dist/agents/tools/slack-tool.js +16 -0
  59. package/dist/agents/usage.js +39 -0
  60. package/dist/agents/workspace.js +241 -0
  61. package/dist/auto-reply/chunk.js +76 -0
  62. package/dist/auto-reply/envelope.js +38 -0
  63. package/dist/auto-reply/group-activation.js +20 -0
  64. package/dist/auto-reply/heartbeat.js +57 -0
  65. package/dist/auto-reply/model.js +14 -0
  66. package/dist/auto-reply/reply/abort.js +14 -0
  67. package/dist/auto-reply/reply/agent-runner.js +371 -0
  68. package/dist/auto-reply/reply/block-streaming.js +34 -0
  69. package/dist/auto-reply/reply/body.js +29 -0
  70. package/dist/auto-reply/reply/commands.js +207 -0
  71. package/dist/auto-reply/reply/directive-handling.js +361 -0
  72. package/dist/auto-reply/reply/directives.js +47 -0
  73. package/dist/auto-reply/reply/followup-runner.js +149 -0
  74. package/dist/auto-reply/reply/groups.js +91 -0
  75. package/dist/auto-reply/reply/mentions.js +38 -0
  76. package/dist/auto-reply/reply/model-selection.js +114 -0
  77. package/dist/auto-reply/reply/queue.js +399 -0
  78. package/dist/auto-reply/reply/reply-tags.js +26 -0
  79. package/dist/auto-reply/reply/session-updates.js +87 -0
  80. package/dist/auto-reply/reply/session.js +160 -0
  81. package/dist/auto-reply/reply/typing.js +75 -0
  82. package/dist/auto-reply/reply.js +535 -0
  83. package/dist/auto-reply/send-policy.js +28 -0
  84. package/dist/auto-reply/status.js +158 -0
  85. package/dist/auto-reply/templating.js +9 -0
  86. package/dist/auto-reply/thinking.js +49 -0
  87. package/dist/auto-reply/tokens.js +2 -0
  88. package/dist/auto-reply/tool-meta.js +74 -0
  89. package/dist/auto-reply/transcription.js +57 -0
  90. package/dist/auto-reply/types.js +1 -0
  91. package/dist/browser/bridge-server.js +37 -0
  92. package/dist/browser/cdp.js +382 -0
  93. package/dist/browser/chrome.js +432 -0
  94. package/dist/browser/client-actions-core.js +67 -0
  95. package/dist/browser/client-actions-observe.js +24 -0
  96. package/dist/browser/client-actions-types.js +1 -0
  97. package/dist/browser/client-actions.js +3 -0
  98. package/dist/browser/client-fetch.js +43 -0
  99. package/dist/browser/client.js +105 -0
  100. package/dist/browser/config.js +140 -0
  101. package/dist/browser/constants.js +4 -0
  102. package/dist/browser/profiles-service.js +122 -0
  103. package/dist/browser/profiles.js +85 -0
  104. package/dist/browser/pw-ai.js +2 -0
  105. package/dist/browser/pw-session.js +144 -0
  106. package/dist/browser/pw-tools-core.js +363 -0
  107. package/dist/browser/routes/agent.js +535 -0
  108. package/dist/browser/routes/basic.js +155 -0
  109. package/dist/browser/routes/index.js +8 -0
  110. package/dist/browser/routes/tabs.js +105 -0
  111. package/dist/browser/routes/utils.js +62 -0
  112. package/dist/browser/screenshot.js +40 -0
  113. package/dist/browser/server-context.js +377 -0
  114. package/dist/browser/server.js +81 -0
  115. package/dist/browser/target-id.js +18 -0
  116. package/dist/browser/trash.js +21 -0
  117. package/dist/canvas-host/a2ui/.bundle.hash +1 -0
  118. package/dist/canvas-host/a2ui/a2ui.bundle.js +17768 -0
  119. package/dist/canvas-host/a2ui/index.html +246 -0
  120. package/dist/canvas-host/a2ui.js +187 -0
  121. package/dist/canvas-host/server.js +382 -0
  122. package/dist/cli/browser-cli-actions-input.js +459 -0
  123. package/dist/cli/browser-cli-actions-observe.js +56 -0
  124. package/dist/cli/browser-cli-examples.js +31 -0
  125. package/dist/cli/browser-cli-inspect.js +97 -0
  126. package/dist/cli/browser-cli-manage.js +286 -0
  127. package/dist/cli/browser-cli-shared.js +1 -0
  128. package/dist/cli/browser-cli.js +26 -0
  129. package/dist/cli/canvas-cli.js +416 -0
  130. package/dist/cli/cron-cli.js +454 -0
  131. package/dist/cli/deps.js +17 -0
  132. package/dist/cli/dns-cli.js +180 -0
  133. package/dist/cli/gateway-cli.js +489 -0
  134. package/dist/cli/gateway-rpc.js +20 -0
  135. package/dist/cli/hooks-cli.js +135 -0
  136. package/dist/cli/models-cli.js +248 -0
  137. package/dist/cli/nodes-camera.js +57 -0
  138. package/dist/cli/nodes-canvas.js +26 -0
  139. package/dist/cli/nodes-cli.js +946 -0
  140. package/dist/cli/nodes-screen.js +37 -0
  141. package/dist/cli/parse-duration.js +20 -0
  142. package/dist/cli/ports.js +97 -0
  143. package/dist/cli/program.js +406 -0
  144. package/dist/cli/prompt.js +19 -0
  145. package/dist/cli/tui-cli.js +35 -0
  146. package/dist/cli/wait.js +8 -0
  147. package/dist/commands/agent.js +645 -0
  148. package/dist/commands/antigravity-oauth.js +327 -0
  149. package/dist/commands/configure.js +480 -0
  150. package/dist/commands/doctor.js +484 -0
  151. package/dist/commands/health.js +108 -0
  152. package/dist/commands/models/aliases.js +64 -0
  153. package/dist/commands/models/fallbacks.js +99 -0
  154. package/dist/commands/models/image-fallbacks.js +99 -0
  155. package/dist/commands/models/list.js +323 -0
  156. package/dist/commands/models/scan.js +266 -0
  157. package/dist/commands/models/set-image.js +23 -0
  158. package/dist/commands/models/set.js +23 -0
  159. package/dist/commands/models/shared.js +72 -0
  160. package/dist/commands/models.js +7 -0
  161. package/dist/commands/onboard-auth.js +70 -0
  162. package/dist/commands/onboard-helpers.js +295 -0
  163. package/dist/commands/onboard-interactive.js +17 -0
  164. package/dist/commands/onboard-non-interactive.js +202 -0
  165. package/dist/commands/onboard-providers.js +634 -0
  166. package/dist/commands/onboard-remote.js +120 -0
  167. package/dist/commands/onboard-skills.js +148 -0
  168. package/dist/commands/onboard-types.js +1 -0
  169. package/dist/commands/onboard.js +12 -0
  170. package/dist/commands/send.js +124 -0
  171. package/dist/commands/sessions.js +212 -0
  172. package/dist/commands/setup.js +58 -0
  173. package/dist/commands/signal-install.js +135 -0
  174. package/dist/commands/status.js +207 -0
  175. package/dist/commands/update.js +16 -0
  176. package/dist/config/config.js +6 -0
  177. package/dist/config/defaults.js +61 -0
  178. package/dist/config/io.js +147 -0
  179. package/dist/config/legacy-migrate.js +13 -0
  180. package/dist/config/legacy.js +159 -0
  181. package/dist/config/paths.js +71 -0
  182. package/dist/config/schema.js +150 -0
  183. package/dist/config/sessions.js +282 -0
  184. package/dist/config/talk.js +31 -0
  185. package/dist/config/types.js +1 -0
  186. package/dist/config/validation.js +29 -0
  187. package/dist/config/zod-schema.js +831 -0
  188. package/dist/control-ui/assets/index-BFID3yAA.css +1 -0
  189. package/dist/control-ui/assets/index-CE_axlTS.js +2235 -0
  190. package/dist/control-ui/assets/index-CE_axlTS.js.map +1 -0
  191. package/dist/control-ui/index.html +15 -0
  192. package/dist/cron/isolated-agent.js +499 -0
  193. package/dist/cron/run-log.js +72 -0
  194. package/dist/cron/schedule.js +24 -0
  195. package/dist/cron/service.js +471 -0
  196. package/dist/cron/store.js +43 -0
  197. package/dist/cron/types.js +1 -0
  198. package/dist/daemon/constants.js +10 -0
  199. package/dist/daemon/launchd.js +276 -0
  200. package/dist/daemon/legacy.js +63 -0
  201. package/dist/daemon/program-args.js +76 -0
  202. package/dist/daemon/schtasks.js +257 -0
  203. package/dist/daemon/service.js +60 -0
  204. package/dist/daemon/systemd.js +266 -0
  205. package/dist/discord/index.js +2 -0
  206. package/dist/discord/monitor.js +1188 -0
  207. package/dist/discord/probe.js +54 -0
  208. package/dist/discord/send.js +577 -0
  209. package/dist/discord/token.js +8 -0
  210. package/dist/gateway/auth.js +121 -0
  211. package/dist/gateway/call.js +94 -0
  212. package/dist/gateway/chat-attachments.js +41 -0
  213. package/dist/gateway/client.js +180 -0
  214. package/dist/gateway/config-reload.js +274 -0
  215. package/dist/gateway/control-ui.js +184 -0
  216. package/dist/gateway/hooks-mapping.js +282 -0
  217. package/dist/gateway/hooks.js +168 -0
  218. package/dist/gateway/net.js +29 -0
  219. package/dist/gateway/protocol/index.js +61 -0
  220. package/dist/gateway/protocol/schema.js +560 -0
  221. package/dist/gateway/server-bridge-subscriptions.js +93 -0
  222. package/dist/gateway/server-bridge.js +1013 -0
  223. package/dist/gateway/server-browser.js +12 -0
  224. package/dist/gateway/server-chat.js +159 -0
  225. package/dist/gateway/server-constants.js +8 -0
  226. package/dist/gateway/server-discovery.js +62 -0
  227. package/dist/gateway/server-http.js +165 -0
  228. package/dist/gateway/server-methods/agent-job.js +125 -0
  229. package/dist/gateway/server-methods/agent.js +250 -0
  230. package/dist/gateway/server-methods/chat.js +200 -0
  231. package/dist/gateway/server-methods/config.js +50 -0
  232. package/dist/gateway/server-methods/connect.js +6 -0
  233. package/dist/gateway/server-methods/cron.js +83 -0
  234. package/dist/gateway/server-methods/health.js +28 -0
  235. package/dist/gateway/server-methods/models.js +16 -0
  236. package/dist/gateway/server-methods/nodes.js +294 -0
  237. package/dist/gateway/server-methods/providers.js +217 -0
  238. package/dist/gateway/server-methods/send.js +166 -0
  239. package/dist/gateway/server-methods/sessions.js +305 -0
  240. package/dist/gateway/server-methods/skills.js +83 -0
  241. package/dist/gateway/server-methods/system.js +118 -0
  242. package/dist/gateway/server-methods/talk.js +22 -0
  243. package/dist/gateway/server-methods/types.js +1 -0
  244. package/dist/gateway/server-methods/voicewake.js +30 -0
  245. package/dist/gateway/server-methods/web.js +58 -0
  246. package/dist/gateway/server-methods/wizard.js +100 -0
  247. package/dist/gateway/server-methods.js +53 -0
  248. package/dist/gateway/server-providers.js +644 -0
  249. package/dist/gateway/server-shared.js +1 -0
  250. package/dist/gateway/server-utils.js +35 -0
  251. package/dist/gateway/server.js +1437 -0
  252. package/dist/gateway/session-utils.js +216 -0
  253. package/dist/gateway/ws-log.js +349 -0
  254. package/dist/gateway/ws-logging.js +8 -0
  255. package/dist/globals.js +41 -0
  256. package/dist/hooks/gmail-ops.js +236 -0
  257. package/dist/hooks/gmail-setup-utils.js +278 -0
  258. package/dist/hooks/gmail-watcher.js +175 -0
  259. package/dist/hooks/gmail.js +177 -0
  260. package/dist/imessage/client.js +165 -0
  261. package/dist/imessage/index.js +3 -0
  262. package/dist/imessage/monitor.js +272 -0
  263. package/dist/imessage/probe.js +26 -0
  264. package/dist/imessage/send.js +83 -0
  265. package/dist/imessage/targets.js +176 -0
  266. package/dist/index.js +50 -0
  267. package/dist/infra/agent-events.js +46 -0
  268. package/dist/infra/binaries.js +9 -0
  269. package/dist/infra/bonjour-discovery.js +163 -0
  270. package/dist/infra/bonjour.js +200 -0
  271. package/dist/infra/bridge/server.js +562 -0
  272. package/dist/infra/canvas-host-url.js +54 -0
  273. package/dist/infra/env.js +8 -0
  274. package/dist/infra/errors.js +28 -0
  275. package/dist/infra/gateway-lock.js +8 -0
  276. package/dist/infra/heartbeat-events.js +21 -0
  277. package/dist/infra/heartbeat-runner.js +453 -0
  278. package/dist/infra/heartbeat-wake.js +61 -0
  279. package/dist/infra/is-main.js +37 -0
  280. package/dist/infra/machine-name.js +40 -0
  281. package/dist/infra/node-pairing.js +211 -0
  282. package/dist/infra/pam.js +42 -0
  283. package/dist/infra/path-env.js +92 -0
  284. package/dist/infra/ports.js +87 -0
  285. package/dist/infra/provider-summary.js +80 -0
  286. package/dist/infra/restart.js +29 -0
  287. package/dist/infra/retry.js +16 -0
  288. package/dist/infra/runtime-guard.js +59 -0
  289. package/dist/infra/system-events.js +44 -0
  290. package/dist/infra/system-presence.js +216 -0
  291. package/dist/infra/tailnet.js +46 -0
  292. package/dist/infra/tailscale.js +149 -0
  293. package/dist/infra/voicewake.js +77 -0
  294. package/dist/infra/widearea-dns.js +123 -0
  295. package/dist/infra/ws.js +13 -0
  296. package/dist/logger.js +52 -0
  297. package/dist/logging.js +490 -0
  298. package/dist/macos/gateway-daemon.js +141 -0
  299. package/dist/macos/relay.js +46 -0
  300. package/dist/media/constants.js +33 -0
  301. package/dist/media/host.js +42 -0
  302. package/dist/media/image-ops.js +121 -0
  303. package/dist/media/mime.js +115 -0
  304. package/dist/media/parse.js +81 -0
  305. package/dist/media/server.js +64 -0
  306. package/dist/media/store.js +139 -0
  307. package/dist/process/command-queue.js +97 -0
  308. package/dist/process/exec.js +75 -0
  309. package/dist/protocol.schema.json +2918 -0
  310. package/dist/provider-web.js +8 -0
  311. package/dist/providers/web/index.js +2 -0
  312. package/dist/runtime.js +8 -0
  313. package/dist/sessions/send-policy.js +68 -0
  314. package/dist/signal/client.js +134 -0
  315. package/dist/signal/daemon.js +69 -0
  316. package/dist/signal/index.js +3 -0
  317. package/dist/signal/monitor.js +336 -0
  318. package/dist/signal/probe.js +46 -0
  319. package/dist/signal/send.js +91 -0
  320. package/dist/slack/actions.js +97 -0
  321. package/dist/slack/index.js +5 -0
  322. package/dist/slack/monitor.js +1029 -0
  323. package/dist/slack/probe.js +47 -0
  324. package/dist/slack/send.js +131 -0
  325. package/dist/slack/token.js +10 -0
  326. package/dist/telegram/bot.js +394 -0
  327. package/dist/telegram/download.js +34 -0
  328. package/dist/telegram/index.js +4 -0
  329. package/dist/telegram/monitor.js +47 -0
  330. package/dist/telegram/probe.js +63 -0
  331. package/dist/telegram/proxy.js +9 -0
  332. package/dist/telegram/send.js +138 -0
  333. package/dist/telegram/token.js +30 -0
  334. package/dist/telegram/webhook-set.js +12 -0
  335. package/dist/telegram/webhook.js +56 -0
  336. package/dist/tui/commands.js +74 -0
  337. package/dist/tui/components/assistant-message.js +16 -0
  338. package/dist/tui/components/chat-log.js +92 -0
  339. package/dist/tui/components/custom-editor.js +53 -0
  340. package/dist/tui/components/selectors.js +8 -0
  341. package/dist/tui/components/tool-execution.js +111 -0
  342. package/dist/tui/components/user-message.js +17 -0
  343. package/dist/tui/gateway-chat.js +140 -0
  344. package/dist/tui/layout.js +41 -0
  345. package/dist/tui/message-list.js +57 -0
  346. package/dist/tui/theme/theme.js +80 -0
  347. package/dist/tui/theme.js +25 -0
  348. package/dist/tui/tui.js +708 -0
  349. package/dist/utils.js +133 -0
  350. package/dist/version.js +18 -0
  351. package/dist/web/active-listener.js +7 -0
  352. package/dist/web/auto-reply.js +1203 -0
  353. package/dist/web/inbound.js +481 -0
  354. package/dist/web/login-qr.js +204 -0
  355. package/dist/web/login.js +59 -0
  356. package/dist/web/media.js +148 -0
  357. package/dist/web/outbound.js +67 -0
  358. package/dist/web/qr-image.js +97 -0
  359. package/dist/web/reconnect.js +60 -0
  360. package/dist/web/reply-heartbeat-wake.js +61 -0
  361. package/dist/web/session.js +346 -0
  362. package/dist/wizard/clack-prompter.js +56 -0
  363. package/dist/wizard/onboarding.js +452 -0
  364. package/dist/wizard/prompts.js +6 -0
  365. package/dist/wizard/session.js +203 -0
  366. package/docs/AGENTS.default.md +116 -0
  367. package/docs/CNAME +1 -0
  368. package/docs/RELEASING.md +64 -0
  369. package/docs/_config.yml +51 -0
  370. package/docs/_layouts/default.html +145 -0
  371. package/docs/agent-send.md +21 -0
  372. package/docs/agent.md +104 -0
  373. package/docs/android/connect.md +131 -0
  374. package/docs/architecture.md +89 -0
  375. package/docs/assets/markdown.css +130 -0
  376. package/docs/assets/pixel-lobster.svg +60 -0
  377. package/docs/assets/terminal.css +497 -0
  378. package/docs/assets/theme.js +55 -0
  379. package/docs/audio.md +50 -0
  380. package/docs/background-process.md +74 -0
  381. package/docs/bash.md +32 -0
  382. package/docs/bonjour.md +159 -0
  383. package/docs/browser.md +289 -0
  384. package/docs/camera.md +152 -0
  385. package/docs/clawd.md +199 -0
  386. package/docs/clawdbot-mac.md +104 -0
  387. package/docs/configuration.md +1177 -0
  388. package/docs/control-api.md +49 -0
  389. package/docs/control-ui.md +83 -0
  390. package/docs/cron.md +374 -0
  391. package/docs/dashboard.md +17 -0
  392. package/docs/device-models.md +46 -0
  393. package/docs/discord.md +293 -0
  394. package/docs/discovery.md +112 -0
  395. package/docs/docker.md +251 -0
  396. package/docs/docs.json +86 -0
  397. package/docs/doctor.md +47 -0
  398. package/docs/elevated.md +31 -0
  399. package/docs/faq.md +640 -0
  400. package/docs/gateway/pairing.md +109 -0
  401. package/docs/gateway-lock.md +28 -0
  402. package/docs/gateway.md +174 -0
  403. package/docs/gmail-pubsub.md +191 -0
  404. package/docs/grammy.md +27 -0
  405. package/docs/group-messages.md +71 -0
  406. package/docs/groups.md +78 -0
  407. package/docs/health.md +28 -0
  408. package/docs/heartbeat.md +64 -0
  409. package/docs/images.md +52 -0
  410. package/docs/imessage.md +63 -0
  411. package/docs/index.md +182 -0
  412. package/docs/ios/connect.md +177 -0
  413. package/docs/ios/spec.md +236 -0
  414. package/docs/location-command.md +95 -0
  415. package/docs/logging.md +99 -0
  416. package/docs/lore.md +131 -0
  417. package/docs/mac/bun.md +133 -0
  418. package/docs/mac/canvas.md +161 -0
  419. package/docs/mac/child-process.md +72 -0
  420. package/docs/mac/dev-setup.md +81 -0
  421. package/docs/mac/health.md +28 -0
  422. package/docs/mac/icon.md +26 -0
  423. package/docs/mac/logging.md +51 -0
  424. package/docs/mac/menu-bar.md +69 -0
  425. package/docs/mac/peekaboo.md +170 -0
  426. package/docs/mac/permissions.md +40 -0
  427. package/docs/mac/release.md +76 -0
  428. package/docs/mac/remote.md +57 -0
  429. package/docs/mac/signing.md +41 -0
  430. package/docs/mac/skills.md +27 -0
  431. package/docs/mac/voice-overlay.md +52 -0
  432. package/docs/mac/voicewake.md +56 -0
  433. package/docs/mac/webchat.md +27 -0
  434. package/docs/mac/xpc.md +40 -0
  435. package/docs/models.md +90 -0
  436. package/docs/nix.md +49 -0
  437. package/docs/nodes.md +157 -0
  438. package/docs/onboarding-config-protocol.md +29 -0
  439. package/docs/onboarding.md +185 -0
  440. package/docs/presence.md +133 -0
  441. package/docs/queue.md +78 -0
  442. package/docs/refactor/browser-control-simplification.md +58 -0
  443. package/docs/refactor/canvas-a2ui.md +93 -0
  444. package/docs/refactor/cli-unification.md +64 -0
  445. package/docs/refactor/gateway-client.md +31 -0
  446. package/docs/refactor/gateway.md +99 -0
  447. package/docs/refactor/new-arch.md +171 -0
  448. package/docs/refactor/tui.md +26 -0
  449. package/docs/refactor/web-gateway-troubleshooting.md +37 -0
  450. package/docs/refactor/webagent-session.md +46 -0
  451. package/docs/remote-gateway-readme.md +148 -0
  452. package/docs/remote.md +66 -0
  453. package/docs/research/memory.md +227 -0
  454. package/docs/rpc.md +35 -0
  455. package/docs/security.md +168 -0
  456. package/docs/session-tool.md +119 -0
  457. package/docs/session.md +84 -0
  458. package/docs/sessions.md +8 -0
  459. package/docs/setup.md +118 -0
  460. package/docs/signal.md +113 -0
  461. package/docs/skills-config.md +58 -0
  462. package/docs/skills.md +149 -0
  463. package/docs/slack.md +158 -0
  464. package/docs/surface.md +20 -0
  465. package/docs/tailscale.md +71 -0
  466. package/docs/talk.md +79 -0
  467. package/docs/telegram.md +90 -0
  468. package/docs/templates/AGENTS.md +126 -0
  469. package/docs/templates/BOOTSTRAP.md +53 -0
  470. package/docs/templates/IDENTITY.md +17 -0
  471. package/docs/templates/SOUL.md +41 -0
  472. package/docs/templates/TOOLS.md +41 -0
  473. package/docs/templates/USER.md +22 -0
  474. package/docs/test.md +35 -0
  475. package/docs/thinking.md +46 -0
  476. package/docs/tools.md +248 -0
  477. package/docs/troubleshooting.md +227 -0
  478. package/docs/tui.md +69 -0
  479. package/docs/typebox.md +42 -0
  480. package/docs/voicewake.md +61 -0
  481. package/docs/web.md +115 -0
  482. package/docs/webchat.md +34 -0
  483. package/docs/webhook.md +132 -0
  484. package/docs/whatsapp-clawd.jpg +0 -0
  485. package/docs/whatsapp.md +142 -0
  486. package/docs/wizard.md +158 -0
  487. package/package.json +186 -0
  488. package/skills/apple-notes/SKILL.md +50 -0
  489. package/skills/apple-reminders/SKILL.md +67 -0
  490. package/skills/bear-notes/SKILL.md +79 -0
  491. package/skills/bird/SKILL.md +25 -0
  492. package/skills/blogwatcher/SKILL.md +46 -0
  493. package/skills/blucli/SKILL.md +27 -0
  494. package/skills/brave-search/SKILL.md +30 -0
  495. package/skills/brave-search/scripts/content.mjs +53 -0
  496. package/skills/brave-search/scripts/search.mjs +79 -0
  497. package/skills/camsnap/SKILL.md +25 -0
  498. package/skills/clawdhub/SKILL.md +53 -0
  499. package/skills/coding-agent/SKILL.md +275 -0
  500. package/skills/discord/SKILL.md +369 -0
  501. package/skills/eightctl/SKILL.md +29 -0
  502. package/skills/food-order/SKILL.md +41 -0
  503. package/skills/gemini/SKILL.md +23 -0
  504. package/skills/gifgrep/SKILL.md +47 -0
  505. package/skills/github/SKILL.md +47 -0
  506. package/skills/gog/SKILL.md +36 -0
  507. package/skills/goplaces/SKILL.md +30 -0
  508. package/skills/imsg/SKILL.md +25 -0
  509. package/skills/local-places/SERVER_README.md +101 -0
  510. package/skills/local-places/SKILL.md +91 -0
  511. package/skills/local-places/pyproject.toml +27 -0
  512. package/skills/local-places/src/local_places/__init__.py +2 -0
  513. package/skills/local-places/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
  514. package/skills/local-places/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
  515. package/skills/local-places/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
  516. package/skills/local-places/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
  517. package/skills/local-places/src/local_places/google_places.py +314 -0
  518. package/skills/local-places/src/local_places/main.py +65 -0
  519. package/skills/local-places/src/local_places/schemas.py +107 -0
  520. package/skills/mcporter/SKILL.md +38 -0
  521. package/skills/nano-banana-pro/SKILL.md +29 -0
  522. package/skills/nano-banana-pro/scripts/generate_image.py +167 -0
  523. package/skills/nano-pdf/SKILL.md +20 -0
  524. package/skills/notion/SKILL.md +156 -0
  525. package/skills/obsidian/SKILL.md +55 -0
  526. package/skills/openai-image-gen/SKILL.md +31 -0
  527. package/skills/openai-image-gen/scripts/gen.py +173 -0
  528. package/skills/openai-whisper/SKILL.md +19 -0
  529. package/skills/openai-whisper-api/SKILL.md +43 -0
  530. package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
  531. package/skills/openhue/SKILL.md +30 -0
  532. package/skills/oracle/SKILL.md +105 -0
  533. package/skills/ordercli/SKILL.md +47 -0
  534. package/skills/peekaboo/SKILL.md +153 -0
  535. package/skills/qmd/SKILL.md +26 -0
  536. package/skills/sag/SKILL.md +62 -0
  537. package/skills/slack/SKILL.md +143 -0
  538. package/skills/songsee/SKILL.md +29 -0
  539. package/skills/sonoscli/SKILL.md +26 -0
  540. package/skills/spotify-player/SKILL.md +34 -0
  541. package/skills/summarize/SKILL.md +49 -0
  542. package/skills/things-mac/SKILL.md +61 -0
  543. package/skills/tmux/SKILL.md +121 -0
  544. package/skills/tmux/scripts/find-sessions.sh +112 -0
  545. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  546. package/skills/trello/SKILL.md +84 -0
  547. package/skills/video-frames/SKILL.md +29 -0
  548. package/skills/video-frames/scripts/frame.sh +81 -0
  549. package/skills/wacli/SKILL.md +42 -0
  550. package/skills/weather/SKILL.md +49 -0
@@ -0,0 +1,161 @@
1
+ ---
2
+ summary: "Agent-controlled Canvas panel embedded via WKWebView + custom URL scheme"
3
+ read_when:
4
+ - Implementing the macOS Canvas panel
5
+ - Adding agent controls for visual workspace
6
+ - Debugging WKWebView canvas loads
7
+ ---
8
+
9
+ # Canvas (macOS app)
10
+
11
+ Status: draft spec · Date: 2025-12-12
12
+
13
+ Note: for iOS/Android nodes that should render agent-edited HTML/CSS/JS over the network, prefer the Gateway `canvasHost` (serves `~/clawd/canvas` over LAN/tailnet with live reload). A2UI is also **hosted by the Gateway** over HTTP. This doc focuses on the macOS in-app canvas panel. See `docs/configuration.md`.
14
+
15
+ Clawdbot can embed an agent-controlled “visual workspace” panel (“Canvas”) inside the macOS app using `WKWebView`, served via a **custom URL scheme** (no loopback HTTP port required).
16
+
17
+ This is designed for:
18
+ - Agent-written HTML/CSS/JS on disk (per-session directory).
19
+ - A real browser engine for layout, rendering, and basic interactivity.
20
+ - Agent-driven visibility (show/hide), navigation, DOM/JS queries, and snapshots.
21
+ - Minimal chrome: borderless panel; bezel/chrome appears only on hover.
22
+
23
+ ## Why a custom scheme (vs. loopback HTTP)
24
+
25
+ Using `WKURLSchemeHandler` keeps Canvas entirely in-process:
26
+ - No port conflicts and no extra local server lifecycle.
27
+ - Easier to sandbox: only serve files we explicitly map.
28
+ - Works offline and can use an ephemeral data store (no persistent cookies/cache).
29
+
30
+ If a Canvas page truly needs “real web” semantics (CORS, fetch to loopback endpoints, service workers), consider the loopback-server variant instead (out of scope for this doc).
31
+
32
+ ## URL ↔ directory mapping
33
+
34
+ The Canvas scheme is:
35
+ - `clawdbot-canvas://<session>/<path>`
36
+
37
+ Routing model:
38
+ - `clawdbot-canvas://main/` → `<canvasRoot>/main/index.html` (or `index.htm`)
39
+ - `clawdbot-canvas://main/yolo` → `<canvasRoot>/main/yolo/index.html` (or `index.htm`)
40
+ - `clawdbot-canvas://main/assets/app.css` → `<canvasRoot>/main/assets/app.css`
41
+
42
+ Directory listings are not served.
43
+
44
+ When `/` has no `index.html` yet, the handler serves a **built-in scaffold page** (bundled with the macOS app).
45
+ This is a visual placeholder only (no A2UI renderer).
46
+
47
+ ### Suggested on-disk location
48
+
49
+ Store Canvas state under the app support directory:
50
+ - `~/Library/Application Support/Clawdbot/canvas/<session>/…`
51
+
52
+ This keeps it alongside other app-owned state and avoids mixing with `~/.clawdbot/` gateway config.
53
+
54
+ ## Panel behavior (agent-controlled)
55
+
56
+ Canvas is presented as a borderless `NSPanel` (similar to the existing WebChat panel):
57
+ - Can be shown/hidden at any time by the agent.
58
+ - Supports an “anchored” presentation (near the menu bar icon or another anchor rect).
59
+ - Uses a rounded container; shadow stays on, but **chrome/bezel only appears on hover**.
60
+ - Default position is the **top-right corner** of the current screen’s visible frame (unless the user moved/resized it previously).
61
+ - The panel is **user-resizable** (edge resize + hover resize handle) and the last frame is persisted per session.
62
+
63
+ ### Hover-only chrome
64
+
65
+ Implementation notes:
66
+ - Keep the window borderless at all times (don’t toggle `styleMask`).
67
+ - Add an overlay view inside the content container for chrome (stroke + subtle gradient/material).
68
+ - Use an `NSTrackingArea` to fade the chrome in/out on `mouseEntered/mouseExited`.
69
+ - Optionally show close/drag affordances only while hovered.
70
+
71
+ ## Agent API surface (current)
72
+
73
+ Canvas is exposed via the Gateway **node bridge**, so the agent can:
74
+ - Show/hide the panel.
75
+ - Navigate to a path (relative to the session root).
76
+ - Evaluate JavaScript and optionally return results.
77
+ - Query/modify DOM (helpers mirroring “dom query/all/attr/click/type/wait” patterns).
78
+ - Capture a snapshot image of the current canvas view.
79
+ - Optionally set panel placement (screen `x/y` + `width/height`) when showing/navigating.
80
+
81
+ This should be modeled after `WebChatManager`/`WebChatSwiftUIWindowController` but targeting `clawdbot-canvas://…` URLs.
82
+
83
+ Related:
84
+ - For “invoke the agent again from UI” flows, prefer the macOS deep link scheme (`clawdbot://agent?...`) so *any* UI surface (Canvas, WebChat, native views) can trigger a new agent run. See `docs/clawdbot-mac.md`.
85
+
86
+ ## Agent commands (current)
87
+
88
+ Use the main `clawdbot` CLI; it invokes canvas commands via `node.invoke`.
89
+
90
+ - `clawdbot canvas present [--node <id>] [--target <...>] [--x/--y/--width/--height]`
91
+ - Local targets map into the session directory via the custom scheme (directory targets resolve `index.html|index.htm`).
92
+ - If `/` has no index file, Canvas shows the built-in scaffold page and returns `status: "welcome"`.
93
+ - `clawdbot canvas hide [--node <id>]`
94
+ - `clawdbot canvas eval --js <code> [--node <id>]`
95
+ - `clawdbot canvas snapshot [--node <id>]`
96
+
97
+ ### Canvas A2UI
98
+
99
+ Canvas A2UI is hosted by the **Gateway canvas host** at:
100
+
101
+ ```
102
+ http://<gateway-host>:18793/__clawdbot__/a2ui/
103
+ ```
104
+
105
+ The macOS app simply renders that page in the Canvas panel. The agent can drive it with JSONL **server→client protocol messages** (one JSON object per line):
106
+
107
+ - `clawdbot canvas a2ui push --jsonl <path> [--node <id>]`
108
+ - `clawdbot canvas a2ui reset [--node <id>]`
109
+
110
+ `push` expects a JSONL file where **each line is a single JSON object** (parsed and forwarded to the in-page A2UI renderer).
111
+
112
+ Minimal example (v0.8):
113
+
114
+ ```bash
115
+ cat > /tmp/a2ui-v0.8.jsonl <<'EOF'
116
+ {"surfaceUpdate":{"surfaceId":"main","components":[{"id":"root","component":{"Column":{"children":{"explicitList":["title","content"]}}}},{"id":"title","component":{"Text":{"text":{"literalString":"Canvas (A2UI v0.8)"},"usageHint":"h1"}}},{"id":"content","component":{"Text":{"text":{"literalString":"If you can read this, `canvas a2ui push` works."},"usageHint":"body"}}}]}}
117
+ {"beginRendering":{"surfaceId":"main","root":"root"}}
118
+ EOF
119
+
120
+ clawdbot canvas a2ui push --jsonl /tmp/a2ui-v0.8.jsonl --node <id>
121
+ ```
122
+
123
+ Notes:
124
+ - This does **not** support the A2UI v0.9 examples using `createSurface`.
125
+ - A2UI **fails** if the Gateway canvas host is unreachable (no local fallback).
126
+ - `canvas a2ui push` validates JSONL (line numbers on errors) and rejects v0.9 payloads.
127
+ - Quick smoke: `clawdbot canvas a2ui push --text "Hello from A2UI"` renders a minimal v0.8 view.
128
+
129
+ ## Triggering agent runs from Canvas (deep links)
130
+
131
+ Canvas can trigger new agent runs via the macOS app deep-link scheme:
132
+ - `clawdbot://agent?...`
133
+
134
+ This is intentionally separate from `clawdbot-canvas://…` (which is only for serving local Canvas files into the `WKWebView`).
135
+
136
+ Suggested patterns:
137
+ - HTML: render links/buttons that navigate to `clawdbot://agent?message=...`.
138
+ - JS: set `window.location.href = 'clawdbot://agent?...'` for “run this now” actions.
139
+
140
+ Implementation note (important):
141
+ - In `WKWebView`, intercept `clawdbot://…` navigations in `WKNavigationDelegate` and forward them to the app, e.g. by calling `DeepLinkHandler.shared.handle(url:)` and returning `.cancel` for the navigation.
142
+
143
+ Safety:
144
+ - Deep links (`clawdbot://agent?...`) are always enabled.
145
+ - Without a `key` query param, the app will prompt for confirmation before invoking the agent.
146
+ - With a valid `key`, the run is unattended (no prompt). For Canvas-originated actions, the app injects an internal key automatically.
147
+
148
+ ## Security / guardrails
149
+
150
+ Recommended defaults:
151
+ - `WKWebsiteDataStore.nonPersistent()` for Canvas (ephemeral).
152
+ - Navigation policy: allow only `clawdbot-canvas://…` (and optionally `about:blank`); open `http/https` externally.
153
+ - Scheme handler must prevent directory traversal: resolved file paths must stay under `<canvasRoot>/<session>/`.
154
+ - Disable or tightly scope any JS bridge; prefer query-string/bootstrap config over `window.webkit.messageHandlers` for sensitive data.
155
+
156
+ ## Debugging
157
+
158
+ Suggested debugging hooks:
159
+ - Enable Web Inspector for Canvas builds (same approach as WebChat).
160
+ - Log scheme requests + resolution decisions to OSLog (subsystem `com.clawdbot`, category `Canvas`).
161
+ - Provide a “copy canvas dir” action in debug settings to quickly reveal the session directory in Finder.
@@ -0,0 +1,72 @@
1
+ ---
2
+ summary: "Running the gateway as a child process of the macOS app and why"
3
+ read_when:
4
+ - Integrating the mac app with the gateway lifecycle
5
+ ---
6
+ # Clawdbot gateway as a child process of the macOS app
7
+
8
+ Date: 2025-12-06 · Status: draft · Owner: steipete
9
+
10
+ Note (2025-12-19): the current implementation prefers a **launchd LaunchAgent** that runs the **bundled bun-compiled gateway**. This doc remains as an alternative mode for tighter coupling to the UI.
11
+
12
+ ## Goal
13
+ Run the Node-based Clawdbot/clawdbot gateway as a direct child of the LSUIElement app (instead of a launchd agent) while keeping all TCC-sensitive work inside the Swift app/broker layer and wiring the existing “Clawdbot Active” toggle to start/stop the child.
14
+
15
+ ## When to prefer the child-process mode
16
+ - You want gateway lifetime strictly coupled to the menu-bar app (dies when the app quits) and controlled by the “Clawdbot Active” toggle without touching launchd.
17
+ - You’re okay giving up login persistence/auto-restart that launchd provides, or you’ll add your own backoff loop.
18
+ - You want simpler log capture and supervision inside the app (no external plist or user-visible LaunchAgent).
19
+
20
+ ## Tradeoffs vs. launchd
21
+ - **Pros:** tighter coupling to UI state; simpler surface (no plist install/bootout); easier to stream stdout/stderr; fewer moving parts for beta users.
22
+ - **Cons:** no built-in KeepAlive/login auto-start; app crash kills gateway; you must build your own restart/backoff; Activity Monitor will show both processes under the app; still need correct TCC handling (see below).
23
+ - **TCC:** behaviorally, child processes often inherit the parent app’s “responsible process” for TCC, but this is *not a contract*. Continue to route all protected actions through the Swift app/broker so prompts stay tied to the signed app bundle.
24
+
25
+ ## TCC guardrails (must keep)
26
+ - Screen Recording, Accessibility, mic, and speech prompts must originate from the signed Swift app/broker. The Node child should never call these APIs directly; route through the app’s node commands (via Gateway `node.invoke`) for:
27
+ - `system.notify`
28
+ - `system.run` (including `needsScreenRecording`)
29
+ - `screen.record` / `camera.*`
30
+ - PeekabooBridge UI automation (`peekaboo …`)
31
+ - Usage strings (`NSMicrophoneUsageDescription`, `NSSpeechRecognitionUsageDescription`, etc.) stay in the app target’s Info.plist; a bare Node binary has none and would fail.
32
+ - If you ever embed Node that *must* touch TCC, wrap that call in a tiny signed helper target inside the app bundle and have Node exec that helper instead of calling the API directly.
33
+
34
+ ## Process manager design (Swift Subprocess)
35
+ - Add a small `GatewayProcessManager` (Swift) that owns:
36
+ - `execution: Execution?` from `Swift Subprocess` to track the child.
37
+ - `start(config)` called when “Clawdbot Active” flips ON:
38
+ - binary: host Node running the bundled gateway under `Clawdbot.app/Contents/Resources/Gateway/`
39
+ - args: current clawdbot entrypoint and flags
40
+ - cwd/env: point to `~/.clawdbot` as today; inject the expanded PATH so Homebrew Node resolves under launchd
41
+ - output: stream stdout/stderr to `/tmp/clawdbot-gateway.log` (cap buffer via Subprocess OutputLimits)
42
+ - restart: optional linear/backoff restart if exit was non-zero and Active is still true
43
+ - `stop()` called when Active flips OFF or app terminates: cancel the execution and `waitUntilExit`.
44
+ - Wire SwiftUI toggle:
45
+ - ON: `GatewayProcessManager.start(...)`
46
+ - OFF: `GatewayProcessManager.stop()` (no launchctl calls in this mode)
47
+ - Keep the existing `LaunchdManager` around so we can switch back if needed; the toggle can choose between launchd or child mode with a flag if we want both.
48
+
49
+ ## Packaging and signing
50
+ - Bundle the gateway payload (dist + production node_modules) under `Contents/Resources/Gateway/`; rely on host Node ≥22 instead of embedding a runtime.
51
+ - Codesign native addons and dylibs inside the bundle; no nested runtime binary to sign now.
52
+ - Host runtime should not call TCC APIs directly; keep privileged work inside the app/broker.
53
+
54
+ ## Logging and observability
55
+ - Stream child stdout/stderr to `/tmp/clawdbot-gateway.log`; surface the last N lines in the Debug tab.
56
+ - Emit a user notification (via existing NotificationManager) on crash/exit while Active is true.
57
+ - Add a lightweight heartbeat from Node → app (e.g., ping over stdout) so the app can show status in the menu.
58
+
59
+ ## Failure/edge cases
60
+ - App crash/quit kills the gateway. Decide if that is acceptable for the deployment tier; otherwise, stick with launchd for production and keep child-process for dev/experiments.
61
+ - If the gateway exits repeatedly, back off (e.g., 1s/2s/5s/10s) and give up after N attempts with a menu warning.
62
+ - Respect the existing pause semantics: when paused, the broker should return `ok=false, "clawdbot paused"`; the gateway should avoid calling privileged routes while paused.
63
+
64
+ ## Open questions / follow-ups
65
+ - Do we need dual-mode (launchd for prod, child for dev)? If yes, gate via a setting or build flag.
66
+ - Embedding a runtime is off the table for now; we rely on host Node for size/simplicity. Revisit only if host PATH drift becomes painful.
67
+ - Do we want a tiny signed helper for rare TCC actions that cannot be brokered via the Swift app/broker?
68
+
69
+ ## Decision snapshot (current recommendation)
70
+ - Keep all TCC surfaces in the Swift app/broker (node commands + PeekabooBridgeHost).
71
+ - Implement `GatewayProcessManager` with Swift Subprocess to start/stop the gateway on the “Clawdbot Active” toggle.
72
+ - Maintain the launchd path as a fallback for uptime/login persistence until child-mode proves stable.
@@ -0,0 +1,81 @@
1
+ ---
2
+ summary: "Setup guide for developers working on the Clawdbot macOS app"
3
+ read_when:
4
+ - Setting up the macOS development environment
5
+ ---
6
+ # macOS Developer Setup
7
+
8
+ This guide covers the necessary steps to build and run the Clawdbot macOS application from source.
9
+
10
+ ## Prerequisites
11
+
12
+ Before building the app, ensure you have the following installed:
13
+
14
+ 1. **Xcode 26.2+**: Required for Swift development.
15
+ 2. **Node.js & pnpm**: Required for the gateway and CLI components.
16
+ 3. **Bun**: Required to package the embedded gateway relay.
17
+ ```bash
18
+ curl -fsSL https://bun.sh/install | bash
19
+ ```
20
+
21
+ ## 1. Initialize Submodules
22
+
23
+ Clawdbot depends on several submodules (like `Peekaboo`). You must initialize these recursively:
24
+
25
+ ```bash
26
+ git submodule update --init --recursive
27
+ ```
28
+
29
+ ## 2. Install Dependencies
30
+
31
+ Install the project-wide dependencies:
32
+
33
+ ```bash
34
+ pnpm install
35
+ ```
36
+
37
+ ## 3. Build and Package the App
38
+
39
+ To build the macOS app and package it into `dist/Clawdbot.app`, run:
40
+
41
+ ```bash
42
+ ./scripts/package-mac-app.sh
43
+ ```
44
+
45
+ If you don't have an Apple Developer ID certificate, the script will automatically use **ad-hoc signing** (`-`).
46
+
47
+ > **Note**: Ad-hoc signed apps may trigger security prompts. If the app crashes immediately with "Abort trap 6", see the [Troubleshooting](#troubleshooting) section.
48
+
49
+ ## 4. Install the CLI Helper
50
+
51
+ The macOS app requires a symlink named `clawdbot` in `/usr/local/bin` or `/opt/homebrew/bin` to manage background tasks.
52
+
53
+ **To install it:**
54
+ 1. Open the Clawdbot app.
55
+ 2. Go to the **General** settings tab.
56
+ 3. Click **"Install CLI helper"** (requires administrator privileges).
57
+
58
+ Alternatively, you can manually link it from your Admin account:
59
+ ```bash
60
+ sudo ln -sf "/Users/$(whoami)/clawdbot/dist/Clawdbot.app/Contents/Resources/Relay/clawdbot" /usr/local/bin/clawdbot
61
+ ```
62
+
63
+ ## Troubleshooting
64
+
65
+ ### App Crashes on Permission Grant
66
+ If the app crashes when you try to allow **Speech Recognition** or **Microphone** access, it may be due to a corrupted TCC cache or signature mismatch.
67
+
68
+ **Fix:**
69
+ 1. Reset the TCC permissions:
70
+ ```bash
71
+ tccutil reset All com.clawdbot.mac.debug
72
+ ```
73
+ 2. If that fails, change the `BUNDLE_ID` temporarily in `scripts/package-mac-app.sh` to force a "clean slate" from macOS.
74
+
75
+ ### Gateway "Starting..." indefinitely
76
+ If the gateway status stays on "Starting...", check if a zombie process is holding the port:
77
+
78
+ ```bash
79
+ lsof -nP -i :18789
80
+ ```
81
+ Kill any existing `node` or `clawdbot` processes listening on that port and restart the app.
@@ -0,0 +1,28 @@
1
+ ---
2
+ summary: "How the macOS app reports gateway/Baileys health states"
3
+ read_when:
4
+ - Debugging mac app health indicators
5
+ ---
6
+ # Health Checks on macOS
7
+
8
+ How to see whether the WhatsApp Web/Baileys bridge is healthy from the menu bar app.
9
+
10
+ ## Menu bar
11
+ - Status dot now reflects Baileys health:
12
+ - Green: linked + socket opened recently.
13
+ - Orange: connecting/retrying.
14
+ - Red: logged out or probe failed.
15
+ - Secondary line reads "Web: linked · auth 12m · socket ok" or shows the failure reason.
16
+ - "Run Health Check" menu item triggers an on-demand probe.
17
+
18
+ ## Settings
19
+ - General tab gains a Health card showing: linked auth age, session-store path/count, last check time, last error/status code, and buttons for Run Health Check / Reveal Logs.
20
+ - Uses a cached snapshot so the UI loads instantly and falls back gracefully when offline.
21
+ - **Connections tab** surfaces provider status + controls for WhatsApp/Telegram (login QR, logout, probe, last disconnect/error).
22
+
23
+ ## How the probe works
24
+ - App runs `clawdbot health --json` via `ShellExecutor` every ~60s and on demand. The probe loads creds, attempts a short Baileys connect, and reports status without sending messages.
25
+ - Cache the last good snapshot and the last error separately to avoid flicker; show the timestamp of each.
26
+
27
+ ## When in doubt
28
+ - You can still use the CLI flow in `docs/health.md` (`clawdbot status`, `clawdbot status --deep`, `clawdbot health --json`) and tail `/tmp/clawdbot/clawdbot-*.log` for `web-heartbeat` / `web-reconnect`.
@@ -0,0 +1,26 @@
1
+ ---
2
+ summary: "Menu bar icon states and animations for Clawdbot on macOS"
3
+ read_when:
4
+ - Changing menu bar icon behavior
5
+ ---
6
+ # Menu Bar Icon States
7
+
8
+ Author: steipete · Updated: 2025-12-06 · Scope: macOS app (`apps/macos`)
9
+
10
+ - **Idle:** Normal icon animation (blink, occasional wiggle).
11
+ - **Paused:** Status item uses `appearsDisabled`; no motion.
12
+ - **Voice trigger (big ears):** Voice wake detector calls `AppState.triggerVoiceEars(ttl: nil)` when the wake word is heard, keeping `earBoostActive=true` while the utterance is captured. Ears scale up (1.9x), get circular ear holes for readability, then drop via `stopVoiceEars()` after 1s of silence. Only fired from the in-app voice pipeline.
13
+ - **Working (agent running):** `AppState.isWorking=true` drives a “tail/leg scurry” micro-motion: faster leg wiggle and slight offset while work is in-flight. Currently toggled around WebChat agent runs; add the same toggle around other long tasks when you wire them.
14
+
15
+ Wiring points
16
+ - Voice wake: runtime/tester call `AppState.triggerVoiceEars(ttl: nil)` on trigger and `stopVoiceEars()` after 1s of silence to match the capture window.
17
+ - Agent activity: set `AppStateStore.shared.setWorking(true/false)` around work spans (already done in WebChat agent call). Keep spans short and reset in `defer` blocks to avoid stuck animations.
18
+
19
+ Shapes & sizes
20
+ - Base icon drawn in `CritterIconRenderer.makeIcon(blink:legWiggle:earWiggle:earScale:earHoles:)`.
21
+ - Ear scale defaults to `1.0`; voice boost sets `earScale=1.9` and toggles `earHoles=true` without changing overall frame (18×18 pt template image rendered into a 36×36 px Retina backing store).
22
+ - Scurry uses leg wiggle up to ~1.0 with a small horizontal jiggle; it’s additive to any existing idle wiggle.
23
+
24
+ Behavioral notes
25
+ - No external CLI/broker toggle for ears/working; keep it internal to the app’s own signals to avoid accidental flapping.
26
+ - Keep TTLs short (<10s) so the icon returns to baseline quickly if a job hangs.
@@ -0,0 +1,51 @@
1
+ ---
2
+ summary: "Clawdbot logging: rolling diagnostics file log + unified log privacy flags"
3
+ read_when:
4
+ - Capturing macOS logs or investigating private data logging
5
+ - Debugging voice wake/session lifecycle issues
6
+ ---
7
+ # Logging (macOS)
8
+
9
+ ## Rolling diagnostics file log (Debug pane)
10
+ Clawdbot routes macOS app logs through swift-log (unified logging by default) and can write a local, rotating file log to disk when you need a durable capture.
11
+
12
+ - Verbosity: **Debug pane → Logs → App logging → Verbosity**
13
+ - Enable: **Debug pane → Logs → App logging → “Write rolling diagnostics log (JSONL)”**
14
+ - Location: `~/Library/Logs/Clawdbot/diagnostics.jsonl` (rotates automatically; old files are suffixed with `.1`, `.2`, …)
15
+ - Clear: **Debug pane → Logs → App logging → “Clear”**
16
+
17
+ Notes:
18
+ - This is **off by default**. Enable only while actively debugging.
19
+ - Treat the file as sensitive; don’t share it without review.
20
+
21
+ ## Unified logging private data on macOS
22
+
23
+ Unified logging redacts most payloads unless a subsystem opts into `privacy -off`. Per Peter's write-up on macOS [logging privacy shenanigans](https://steipete.me/posts/2025/logging-privacy-shenanigans) (2025) this is controlled by a plist in `/Library/Preferences/Logging/Subsystems/` keyed by the subsystem name. Only new log entries pick up the flag, so enable it before reproducing an issue.
24
+
25
+ ## Enable for Clawdbot (`com.clawdbot`)
26
+ - Write the plist to a temp file first, then install it atomically as root:
27
+
28
+ ```bash
29
+ cat <<'EOF' >/tmp/com.clawdbot.plist
30
+ <?xml version="1.0" encoding="UTF-8"?>
31
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
32
+ <plist version="1.0">
33
+ <dict>
34
+ <key>DEFAULT-OPTIONS</key>
35
+ <dict>
36
+ <key>Enable-Private-Data</key>
37
+ <true/>
38
+ </dict>
39
+ </dict>
40
+ </plist>
41
+ EOF
42
+ sudo install -m 644 -o root -g wheel /tmp/com.clawdbot.plist /Library/Preferences/Logging/Subsystems/com.clawdbot.plist
43
+ ```
44
+
45
+ - No reboot is required; logd notices the file quickly, but only new log lines will include private payloads.
46
+ - View the richer output with the existing helper, e.g. `./scripts/clawlog.sh --category WebChat --last 5m`.
47
+
48
+ ## Disable after debugging
49
+ - Remove the override: `sudo rm /Library/Preferences/Logging/Subsystems/com.clawdbot.plist`.
50
+ - Optionally run `sudo log config --reload` to force logd to drop the override immediately.
51
+ - Remember this surface can include phone numbers and message bodies; keep the plist in place only while you actively need the extra detail.
@@ -0,0 +1,69 @@
1
+ ---
2
+ summary: "Menu bar status logic and what is surfaced to users"
3
+ read_when:
4
+ - Tweaking mac menu UI or status logic
5
+ ---
6
+ # Menu Bar Status Logic
7
+
8
+ ## What is shown
9
+ - We surface the current agent work state in the menu bar icon and in the first status row of the menu.
10
+ - Health status is hidden while work is active; it returns when all sessions are idle.
11
+ - The “Nodes” block in the menu lists **devices** only (gateway bridge nodes via `node.list`), not client/presence entries.
12
+
13
+ ## State model
14
+ - Sessions: events arrive with `runId` (per-run) plus `sessionKey` in the payload. The “main” session is the key `main`; if absent, we fall back to the most recently updated session.
15
+ - Priority: main always wins. If main is active, its state is shown immediately. If main is idle, the most recently active non‑main session is shown. We do not flip‑flop mid‑activity; we only switch when the current session goes idle or main becomes active.
16
+ - Activity kinds:
17
+ - `job`: high‑level command execution (`state: started|streaming|done|error`).
18
+ - `tool`: `phase: start|result` with `toolName` and `meta/args`.
19
+
20
+ ## IconState enum (Swift)
21
+ - `idle`
22
+ - `workingMain(ActivityKind)`
23
+ - `workingOther(ActivityKind)`
24
+ - `overridden(ActivityKind)` (debug override)
25
+
26
+ ### ActivityKind → glyph
27
+ - `bash` → 💻
28
+ - `read` → 📄
29
+ - `write` → ✍️
30
+ - `edit` → 📝
31
+ - `attach` → 📎
32
+ - default → 🛠️
33
+
34
+ ### Visual mapping
35
+ - `idle`: normal critter.
36
+ - `workingMain`: badge with glyph, full tint, leg “working” animation.
37
+ - `workingOther`: badge with glyph, muted tint, no scurry.
38
+ - `overridden`: uses the chosen glyph/tint regardless of activity.
39
+
40
+ ## Status row text (menu)
41
+ - While work is active: `<Session role> · <activity label>`
42
+ - Examples: `Main · bash: pnpm test`, `Other · read: apps/macos/Sources/Clawdbot/AppState.swift`.
43
+ - When idle: falls back to the health summary.
44
+
45
+ ## Event ingestion
46
+ - Source: control‑channel `agent` events (`ControlChannel.handleAgentEvent`).
47
+ - Parsed fields:
48
+ - `stream: "job"` with `data.state` for start/stop.
49
+ - `stream: "tool"` with `data.phase`, `name`, optional `meta`/`args`.
50
+ - Labels:
51
+ - `bash`: first line of `args.command`.
52
+ - `read`/`write`: shortened path.
53
+ - `edit`: path plus inferred change kind from `meta`/diff counts.
54
+ - fallback: tool name.
55
+
56
+ ## Debug override
57
+ - Settings ▸ Debug ▸ “Icon override” picker:
58
+ - `System (auto)` (default)
59
+ - `Working: main` (per tool kind)
60
+ - `Working: other` (per tool kind)
61
+ - `Idle`
62
+ - Stored via `@AppStorage("iconOverride")`; mapped to `IconState.overridden`.
63
+
64
+ ## Testing checklist
65
+ - Trigger main session job: verify icon switches immediately and status row shows main label.
66
+ - Trigger non‑main session job while main idle: icon/status shows non‑main; stays stable until it finishes.
67
+ - Start main while other active: icon flips to main instantly.
68
+ - Rapid tool bursts: ensure badge does not flicker (TTL grace on tool results).
69
+ - Health row reappears once all sessions idle.
@@ -0,0 +1,170 @@
1
+ ---
2
+ summary: "Plan for integrating Peekaboo automation into Clawdbot via PeekabooBridge (socket-based TCC broker)"
3
+ read_when:
4
+ - Hosting PeekabooBridge in Clawdbot.app
5
+ - Integrating Peekaboo as a submodule
6
+ - Changing PeekabooBridge protocol/paths
7
+ ---
8
+ # Peekaboo Bridge in Clawdbot (macOS UI automation broker)
9
+
10
+ ## TL;DR
11
+ - **Peekaboo removed its XPC helper** and now exposes privileged automation via a **UNIX domain socket bridge** (`PeekabooBridge` / `PeekabooBridgeHost`, socket name `bridge.sock`).
12
+ - Clawdbot integrates by **optionally hosting the same bridge** inside **Clawdbot.app** (user-toggleable). The primary client is the **`peekaboo` CLI** (installed via npm); Clawdbot does not need its own `ui …` CLI surface.
13
+ - For **visualizations**, we keep them in **Peekaboo.app** (best UX); Clawdbot stays a thin broker host. No visualizer toggle in Clawdbot.
14
+
15
+ Non-goals:
16
+ - No auto-launching Peekaboo.app.
17
+ - No onboarding deep links from the automation endpoint (Clawdbot onboarding already handles permissions).
18
+ - No AI provider/agent runtime dependencies in Clawdbot (avoid pulling Tachikoma/MCP into the Clawdbot app/CLI).
19
+
20
+ ## Big refactor (Dec 2025): XPC → Bridge
21
+ Peekaboo’s privileged execution moved from “CLI → XPC helper” to “CLI → socket bridge host”. For Clawdbot this is a win:
22
+ - It matches the existing “local socket + codesign checks” approach.
23
+ - It lets us piggyback on **either** Peekaboo.app’s permissions **or** Clawdbot.app’s permissions (whichever is running).
24
+ - It avoids “two apps with two TCC bubbles” unless needed.
25
+
26
+ Reference (Peekaboo submodule): `docs/bridge-host.md`.
27
+
28
+ ## Architecture
29
+ ### Processes
30
+ - **Bridge hosts** (provide TCC-backed automation):
31
+ - **Peekaboo.app** (preferred; also provides visualizations + controls)
32
+ - **Claude.app** (secondary; lets `peekaboo` reuse Claude Desktop’s granted permissions)
33
+ - **Clawdbot.app** (secondary; “thin host” only)
34
+ - **Bridge clients** (trigger single actions):
35
+ - `peekaboo …` (preferred; humans + agents)
36
+ - Optional: Clawdbot/Node shells out to `peekaboo` when it needs UI automation/capture
37
+
38
+ ### Host discovery (client-side)
39
+ Order is deliberate:
40
+ 1. Peekaboo.app host (full UX)
41
+ 2. Claude.app host (piggyback on Claude Desktop permissions)
42
+ 3. Clawdbot.app host (piggyback on Clawdbot permissions)
43
+
44
+ Socket paths (convention; exact paths must match Peekaboo):
45
+ - Peekaboo: `~/Library/Application Support/Peekaboo/bridge.sock`
46
+ - Claude: `~/Library/Application Support/Claude/bridge.sock`
47
+ - Clawdbot: `~/Library/Application Support/clawdbot/bridge.sock`
48
+
49
+ No auto-launch: if a host isn’t reachable, the command fails with a clear error (start Peekaboo.app, Claude.app, or Clawdbot.app).
50
+
51
+ Override (debugging): set `PEEKABOO_BRIDGE_SOCKET=/path/to/bridge.sock`.
52
+
53
+ ### Protocol shape
54
+ - **Single request per connection**: connect → write one JSON request → half-close → read one JSON response → close.
55
+ - **Timeout**: 10 seconds end-to-end per action (client enforced; host should also enforce per-operation).
56
+ - **Errors**: human-readable string by default; structured envelope in `--json`.
57
+
58
+ ## Dependency strategy (submodule)
59
+ Integrate Peekaboo via git submodule (nested submodules are OK).
60
+
61
+ Path in Clawdbot repo:
62
+ - `./Peekaboo` (Swabble-style; keep stable so SwiftPM path deps don’t churn).
63
+
64
+ What Clawdbot should use:
65
+ - **Client side**: `PeekabooBridge` (socket client + protocol models).
66
+ - **Host side (Clawdbot.app)**: `PeekabooBridgeHost` + the minimal Peekaboo services needed to implement operations.
67
+
68
+ What Clawdbot should *not* embed:
69
+ - **Visualizer UI**: keep it in Peekaboo.app for now (toggle + controls live there).
70
+ - **XPC**: don’t reintroduce helper targets; use the bridge.
71
+
72
+ ## IPC / CLI surface
73
+ ### No `clawdbot ui …`
74
+ We avoid a parallel “Clawdbot UI automation CLI”. Instead:
75
+ - `peekaboo` is the user/agent-facing CLI surface for automation and capture.
76
+ - Clawdbot.app can host PeekabooBridge as a **thin TCC broker** so Peekaboo can piggyback on Clawdbot permissions when Peekaboo.app isn’t running.
77
+
78
+ ### Diagnostics
79
+ Use Peekaboo’s built-in diagnostics to see which host would be used:
80
+ - `peekaboo bridge status`
81
+ - `peekaboo bridge status --verbose`
82
+ - `peekaboo bridge status --json`
83
+
84
+ ### Output format
85
+ Peekaboo commands default to human text output. Add `--json` for a structured envelope.
86
+
87
+ ### Timeouts
88
+ Default timeout for UI actions: **10 seconds** end-to-end (client enforced; host should also enforce per-operation).
89
+
90
+ ## Coordinate model (multi-display)
91
+ Requirement: coordinates are **per screen**, not global.
92
+
93
+ Standardize for the CLI (agent-friendly): **top-left origin per screen**.
94
+
95
+ Proposed request shape:
96
+ - Requests accept `screenIndex` + `{x, y}` in that screen’s local coordinate space.
97
+ - Clawdbot.app converts to global CG coordinates using `NSScreen.screens[screenIndex].frame.origin`.
98
+ - Responses should echo both:
99
+ - The resolved `screenIndex`
100
+ - The local `{x, y}` and bounds
101
+ - Optionally the global `{x, y}` for debugging
102
+
103
+ Ordering: use `NSScreen.screens` ordering consistently (documented in the CLI help + JSON schema).
104
+
105
+ ## Targeting (per app/window)
106
+ Expose window/app targeting in the UI surface (align with Peekaboo targeting):
107
+ - frontmost
108
+ - by app name / bundle id
109
+ - by window title substring
110
+ - by (app, index)
111
+
112
+ Peekaboo CLI targeting (agent-friendly):
113
+ - `--bundle-id <id>` for app targeting
114
+ - `--window-index <n>` (0-based) for disambiguating within an app when capturing
115
+
116
+ All “see/click/type/scroll/wait” requests should accept a target (default: frontmost).
117
+
118
+ ## “See” + click packs (Playwright-style)
119
+ Behavior stays aligned with Peekaboo:
120
+ - `peekaboo see` returns element IDs (e.g. `B1`, `T3`) with bounds/labels.
121
+ - Follow-up actions reference those IDs without re-scanning.
122
+
123
+ `peekaboo see` should:
124
+ - capture (optionally targeted) window/screen
125
+ - return a screenshot **file path** (default: temp directory)
126
+ - return a list of elements (text or JSON)
127
+
128
+ Snapshot lifecycle requirement:
129
+ - Host apps are long-lived, so snapshot state should be **in-memory by default**.
130
+ - Snapshot scoping: “implicit snapshot” is **per target bundle id** (reuse last snapshot for that app when snapshot id is omitted).
131
+
132
+ Practical flow (agent-friendly):
133
+ - `peekaboo list apps` / `peekaboo list windows` provide bundle-id context for targeting.
134
+ - `peekaboo see --bundle-id X` updates the implicit snapshot for `X`.
135
+ - `peekaboo click --bundle-id X --on B1` reuses the most recent snapshot for `X` when `--snapshot-id` is omitted.
136
+
137
+ ## Visualizer integration
138
+ Keep visualizations in **Peekaboo.app** for now.
139
+ - Clawdbot hosts the bridge, but does not render overlays.
140
+ - Any “visualizer enabled/disabled” setting is controlled in Peekaboo.app.
141
+
142
+ ## Screenshots (legacy → Peekaboo takeover)
143
+ Clawdbot should not grow a separate screenshot CLI surface.
144
+
145
+ Migration plan:
146
+ - Use `peekaboo capture …` / `peekaboo see …` (returns a file path, default temp directory).
147
+ - Once Clawdbot’ legacy screenshot plumbing is replaced, remove it cleanly (no aliases).
148
+
149
+ ## Permissions behavior
150
+ If required permissions are missing:
151
+ - return `ok=false` with a short human error message (e.g., “Accessibility permission missing”)
152
+ - do not try to open System Settings from the automation endpoint
153
+
154
+ ## Security (socket auth)
155
+ Both hosts must enforce:
156
+ - filesystem perms on the socket path (owner read/write only)
157
+ - server-side caller validation:
158
+ - require the caller’s code signature TeamID to be `Y5PE65HELJ`
159
+ - optional bundle-id allowlist for tighter scoping
160
+
161
+ Debug-only escape hatch (development convenience):
162
+ - “allow same-UID callers” means: *skip codesign checks for clients running under the same Unix user*.
163
+ - This must be **opt-in**, **DEBUG-only**, and guarded by an env var (Peekaboo uses `PEEKABOO_ALLOW_UNSIGNED_SOCKET_CLIENTS=1`).
164
+
165
+ ## Next integration steps (after this doc)
166
+ 1. Add Peekaboo as a git submodule (nested submodules OK).
167
+ 2. Host `PeekabooBridgeHost` inside Clawdbot.app behind a single setting (“Enable Peekaboo Bridge”, default on).
168
+ 3. Ensure Clawdbot hosts the bridge at `~/Library/Application Support/clawdbot/bridge.sock` and speaks the PeekabooBridge JSON protocol.
169
+ 4. Validate with `peekaboo bridge status --verbose` that Peekaboo can select Clawdbot as the fallback host (no auto-launch).
170
+ 5. Keep all protocol decisions aligned with Peekaboo (coordinate system, element IDs, snapshot scoping, error envelopes).