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,49 @@
1
+ ---
2
+ summary: "Deprecated newline-delimited control channel API (pre-gateway)"
3
+ read_when:
4
+ - Maintaining legacy control channel support
5
+ ---
6
+ # Control channel API (newline-delimited JSON)
7
+
8
+ **Deprecated (historical):** superseded by the WebSocket Gateway protocol (`clawdbot gateway`, see `docs/architecture.md` and `docs/gateway.md`).
9
+ Current builds use a WebSocket server on `ws://127.0.0.1:18789` and do **not** expose this TCP control channel.
10
+
11
+ Legacy endpoint (if present in an older build): `127.0.0.1:18789` (TCP, localhost only), typically reached via SSH port forward in remote mode.
12
+
13
+ ## Frame format
14
+ Each line is a JSON object. Two shapes exist:
15
+ - **Request**: `{ "type": "request", "id": "<uuid>", "method": "health" | "status" | "last-heartbeat" | "set-heartbeats" | "ping", "params"?: { ... } }`
16
+ - **Response**: `{ "type": "response", "id": "<same id>", "ok": true, "payload"?: { ... } }` or `{ "type": "response", "id": "<same id>", "ok": false, "error": "message" }`
17
+ - **Event**: `{ "type": "event", "event": "heartbeat" | "gateway-status" | "log", "payload": { ... } }`
18
+
19
+ ## Methods
20
+ - `ping`: sanity check. Payload: `{ pong: true, ts }`.
21
+ - `health`: returns the gateway health snapshot (same shape as `clawdbot health --json`).
22
+ - `status`: shorter summary (linked/authAge/heartbeatSeconds, session counts).
23
+ - `last-heartbeat`: returns the most recent heartbeat event the gateway has seen.
24
+ - `set-heartbeats { enabled: boolean }`: toggle heartbeat scheduling.
25
+
26
+ ## Events
27
+ - `heartbeat` payload:
28
+ ```json
29
+ {
30
+ "ts": 1765224052664,
31
+ "status": "sent" | "ok-empty" | "ok-token" | "skipped" | "failed",
32
+ "to": "+15551234567",
33
+ "preview": "Heartbeat OK",
34
+ "hasMedia": false,
35
+ "durationMs": 1025,
36
+ "reason": "<error text>" // only on failed/skipped
37
+ }
38
+ ```
39
+ - `gateway-status` payload: `{ "state": "starting" | "running" | "restarting" | "failed" | "stopped", "pid"?: number, "reason"?: string }`
40
+ - `log` payload: arbitrary log line; optional, can be disabled.
41
+
42
+ ## Suggested client flow
43
+ 1) Connect (or reconnect) → send `ping`.
44
+ 2) Send `health` and `last-heartbeat` to populate UI.
45
+ 3) Listen for `event` frames; update UI in real time.
46
+ 4) For user toggles, send `set-heartbeats` and await response.
47
+
48
+ ## Backward compatibility
49
+ - If the control channel is unavailable: that’s expected on modern builds. Use the Gateway WS protocol instead.
@@ -0,0 +1,83 @@
1
+ ---
2
+ summary: "Browser-based control UI for the Gateway (chat, nodes, config)"
3
+ read_when:
4
+ - You want to operate the Gateway from a browser
5
+ - You want Tailnet access without SSH tunnels
6
+ ---
7
+ # Control UI (browser)
8
+
9
+ The Control UI is a small **Vite + Lit** single-page app served by the Gateway:
10
+
11
+ - default: `http://<host>:18789/`
12
+ - optional prefix: set `gateway.controlUi.basePath` (e.g. `/clawdbot`)
13
+
14
+ It speaks **directly to the Gateway WebSocket** on the same port.
15
+
16
+ Auth is supplied during the WebSocket handshake via:
17
+ - `connect.params.auth.token`
18
+ - `connect.params.auth.password`
19
+ The dashboard settings panel lets you store a token; passwords are not persisted.
20
+
21
+ ## What it can do (today)
22
+ - Chat with the model via Gateway WS (`chat.history`, `chat.send`, `chat.abort`)
23
+ - Stream tool calls + live tool output cards in Chat (agent events)
24
+ - Connections: WhatsApp/Telegram status + QR login + Telegram config (`providers.status`, `web.login.*`, `config.set`)
25
+ - Instances: presence list + refresh (`system-presence`)
26
+ - Sessions: list + per-session thinking/verbose overrides (`sessions.list`, `sessions.patch`)
27
+ - Cron jobs: list/add/run/enable/disable + run history (`cron.*`)
28
+ - Skills: status, enable/disable, install, API key updates (`skills.*`)
29
+ - Nodes: list + caps (`node.list`)
30
+ - Config: view/edit `~/.clawdbot/clawdbot.json` (`config.get`, `config.set`)
31
+ - Config schema + form rendering (`config.schema`); Raw JSON editor remains available
32
+ - Debug: status/health/models snapshots + event log + manual RPC calls (`status`, `health`, `models.list`)
33
+
34
+ ## Tailnet access (recommended)
35
+
36
+ ### Integrated Tailscale Serve (preferred)
37
+
38
+ Keep the Gateway on loopback and let Tailscale Serve proxy it with HTTPS:
39
+
40
+ ```bash
41
+ clawdbot gateway --tailscale serve
42
+ ```
43
+
44
+ Open:
45
+ - `https://<magicdns>/` (or your configured `gateway.controlUi.basePath`)
46
+
47
+ By default, the gateway trusts Tailscale identity headers in serve mode. You can still set
48
+ `CLAWDBOT_GATEWAY_TOKEN` or `gateway.auth` if you want a shared secret instead.
49
+
50
+ ### Bind to tailnet + token (legacy)
51
+
52
+ ```bash
53
+ clawdbot gateway --bind tailnet --token "$(openssl rand -hex 32)"
54
+ ```
55
+
56
+ Then open:
57
+ - `http://<tailscale-ip>:18789/` (or your configured `gateway.controlUi.basePath`)
58
+
59
+ Paste the token into the UI settings (sent as `connect.params.auth.token`).
60
+
61
+ ## Building the UI
62
+
63
+ The Gateway serves static files from `dist/control-ui`. Build them with:
64
+
65
+ ```bash
66
+ pnpm ui:install
67
+ pnpm ui:build
68
+ ```
69
+
70
+ Optional absolute base (when you want fixed asset URLs):
71
+
72
+ ```bash
73
+ CLAWDBOT_CONTROL_UI_BASE_PATH=/clawdbot/ pnpm ui:build
74
+ ```
75
+
76
+ For local development (separate dev server):
77
+
78
+ ```bash
79
+ pnpm ui:install
80
+ pnpm ui:dev
81
+ ```
82
+
83
+ Then point the UI at your Gateway WS URL (e.g. `ws://127.0.0.1:18789`).
package/docs/cron.md ADDED
@@ -0,0 +1,374 @@
1
+ ---
2
+ summary: "RFC: Cron jobs + wakeups for Clawd/Clawdbot (main vs isolated sessions)"
3
+ read_when:
4
+ - Designing scheduled jobs, alarms, or wakeups
5
+ - Adding Gateway methods or CLI commands for automation
6
+ - Adjusting heartbeat behavior or session routing
7
+ ---
8
+
9
+ # RFC: Cron jobs + wakeups for Clawd
10
+
11
+ Status: Draft
12
+ Last updated: 2025-12-13
13
+
14
+ ## Context
15
+
16
+ Clawdbot already has:
17
+ - A **gateway heartbeat runner** that runs the agent with `HEARTBEAT` and suppresses `HEARTBEAT_OK` (`src/infra/heartbeat-runner.ts`).
18
+ - A lightweight, in-memory **system event queue** (`enqueueSystemEvent`) that is injected into the next **main session** turn (`drainSystemEvents` in `src/auto-reply/reply.ts`).
19
+ - A WebSocket **Gateway** daemon that is intended to be always-on (`docs/gateway.md`).
20
+
21
+ This RFC adds a small “cron job system” so Clawd can schedule future work and reliably wake itself up:
22
+ - **Delayed**: run on the *next* normal heartbeat tick
23
+ - **Immediate**: run *now* (trigger a heartbeat immediately)
24
+ - **Isolated jobs**: optionally run in their own session that does not pollute the main session and can run concurrently (within configured limits).
25
+
26
+ ## Goals
27
+
28
+ - Provide a **persistent job store** and an **in-process scheduler** owned by the Gateway.
29
+ - Allow each job to target either:
30
+ - `sessionTarget: "main"`: inject as `System:` lines and rely on the main heartbeat (or trigger it immediately).
31
+ - `sessionTarget: "isolated"`: run an agent turn in a dedicated session key (job session), optionally delivering a message and/or posting a summary back to main.
32
+ - Expose a stable control surface:
33
+ - **Gateway methods** (`cron.*`, `wake`) for programmatic usage (mac app, CLI, agents).
34
+ - **CLI commands** (`clawdbot cron ...`) to add/remove/edit/list and to debug `run`.
35
+ - Produce clear, structured **logs** for job lifecycle and execution outcomes.
36
+
37
+ ## Non-goals (v1)
38
+
39
+ - Multi-host distributed scheduling.
40
+ - Exactly-once semantics across crashes (we aim for “at-least-once with idempotency hooks”).
41
+ - A full Unix-cron parser as the only schedule format (we can support it, but v1 should not require complex cron features to be useful).
42
+
43
+ ## Terminology
44
+
45
+ - **Wake**: a request to ensure the agent gets a turn soon (either right now or next heartbeat).
46
+ - **Main session**: the canonical session bucket (default key `"main"`) that receives `System:` events.
47
+ - **Isolated session**: a per-job session key (e.g. `cron:<jobId>`) with its own session id / session file.
48
+
49
+ ## User stories
50
+
51
+ - “Remind me in 20 minutes” → add a one-shot job that triggers an immediate heartbeat at T+20m.
52
+ - “Every weekday at 7:30, wake me up and start music” → recurring job, isolated session, deliver to WhatsApp.
53
+ - “Every hour, check battery; only interrupt me if < 20%” → isolated job that decides whether to deliver; may also post a brief status to main.
54
+ - “Next heartbeat, please check calendar” → delayed wake targeting main session.
55
+
56
+ ## Job model
57
+
58
+ ### Storage schema (v1)
59
+
60
+ Each job is a JSON object with stable keys (unknown keys ignored for forward compatibility):
61
+
62
+ - `id: string` (UUID)
63
+ - `name: string` (required)
64
+ - `description?: string` (optional)
65
+ - `enabled: boolean`
66
+ - `createdAtMs: number`
67
+ - `updatedAtMs: number`
68
+ - `schedule` (one of)
69
+ - `{"kind":"at","atMs":number}` (one-shot)
70
+ - `{"kind":"every","everyMs":number,"anchorMs"?:number}` (simple interval)
71
+ - `{"kind":"cron","expr":string,"tz"?:string}` (optional; see “Schedule parsing”)
72
+ - `sessionTarget: "main" | "isolated"`
73
+ - `wakeMode: "next-heartbeat" | "now"`
74
+ - For `sessionTarget:"isolated"`, `wakeMode:"now"` means “run immediately when due”.
75
+ - For `sessionTarget:"main"`, `wakeMode` controls whether we trigger the heartbeat immediately or just enqueue and wait.
76
+ - `payload` (one of)
77
+ - `{"kind":"systemEvent","text":string}` (enqueue as `System:`)
78
+ - `{"kind":"agentTurn","message":string,"deliver"?:boolean,"channel"?: "last"|"whatsapp"|"telegram"|"discord"|"signal"|"imessage","to"?:string,"timeoutSeconds"?:number}`
79
+ - `isolation` (optional; only meaningful for isolated jobs)
80
+ - `{"postToMainPrefix"?: string}`
81
+ - `runtime` (optional)
82
+ - `{"maxAttempts"?:number,"retryBackoffMs"?:number}` (best-effort retries; defaults off)
83
+ - `state` (runtime-maintained)
84
+ - `{"nextRunAtMs":number,"lastRunAtMs"?:number,"lastStatus"?: "ok"|"error"|"skipped","lastError"?:string,"lastDurationMs"?:number}`
85
+
86
+ ### Key behavior
87
+
88
+ - `sessionTarget:"main"` jobs always enqueue `payload.kind:"systemEvent"` (directly or derived from `agentTurn` results; see below).
89
+ - `sessionTarget:"isolated"` jobs create/use a stable session key: `cron:<jobId>`.
90
+
91
+ ## Storage location
92
+
93
+ Cron persists everything under `~/.clawdbot/cron/`:
94
+ - Job store: `~/.clawdbot/cron/jobs.json`
95
+ - Run history: `~/.clawdbot/cron/runs/<jobId>.jsonl`
96
+
97
+ You can override the job store path via `cron.store` in config.
98
+
99
+ The scheduler should never require additional configuration for the base directory (Clawdbot already treats `~/.clawdbot` as fixed).
100
+
101
+ ## Enabling
102
+
103
+ Cron execution is enabled by default inside the Gateway.
104
+
105
+ To disable it, set:
106
+
107
+ ```json5
108
+ {
109
+ cron: {
110
+ enabled: false,
111
+ // optional:
112
+ store: "~/.clawdbot/cron/jobs.json",
113
+ maxConcurrentRuns: 1
114
+ }
115
+ }
116
+ ```
117
+
118
+ You can also disable scheduling via the environment variable `CLAWDBOT_SKIP_CRON=1`.
119
+
120
+ ## Scheduler design
121
+
122
+ ### Ownership
123
+
124
+ The Gateway owns:
125
+ - the scheduler timer,
126
+ - job store reads/writes,
127
+ - job execution (enqueue system events and/or agent turns).
128
+
129
+ This keeps scheduling unified with the always-on process and prevents “two schedulers” when multiple CLIs run.
130
+
131
+ ### Timer strategy
132
+
133
+ - Maintain an in-memory heap/array of enabled jobs keyed by `state.nextRunAtMs`.
134
+ - Use a **single `setTimeout`** to wake at the earliest next run.
135
+ - On wake:
136
+ - compute all due jobs (now >= nextRunAtMs),
137
+ - mark them “in flight” (in memory),
138
+ - persist updated `state` (at least bump `nextRunAtMs` / `lastRunAtMs`) before starting execution to minimize duplicate runs on crash,
139
+ - execute jobs (with concurrency limits),
140
+ - persist final `lastStatus/lastError/lastDurationMs`,
141
+ - re-arm timer for the next earliest run.
142
+
143
+ ### Schedule parsing
144
+
145
+ V1 can ship with `at` + `every` without extra deps.
146
+
147
+ If we add `"kind":"cron"`:
148
+ - Use a well-maintained parser (we use `croner`) and support:
149
+ - 5-field cron (`min hour dom mon dow`) at minimum
150
+ - optional `tz`
151
+ - Store `nextRunAtMs` computed by the parser; re-compute after each run.
152
+
153
+ ## Execution semantics
154
+
155
+ ### Main session jobs
156
+
157
+ Main session jobs do not run the agent directly by default.
158
+
159
+ When due:
160
+ 1) `enqueueSystemEvent(job.payload.text)` (or a derived message)
161
+ 2) If `wakeMode:"now"`, trigger an immediate heartbeat run (see “Heartbeat wake hook”).
162
+ 3) Otherwise do nothing else (the next scheduled heartbeat will pick up the system event).
163
+
164
+ Why: This keeps the main session’s “proactive” behavior centralized in the heartbeat rules and avoids ad-hoc agent turns that might fight with inbound message processing.
165
+
166
+ ### Isolated session jobs
167
+
168
+ Isolated jobs run an agent turn in a dedicated session key, intended to be separate from main.
169
+
170
+ When due:
171
+ - Build a message body that includes schedule metadata, e.g.:
172
+ - `"[cron:<jobId>] <job.name>: <payload.message>"`
173
+ - Execute via the same agent runner path as other command-mode runs, but pinned to:
174
+ - `sessionKey = cron:<jobId>`
175
+ - `sessionId = store[sessionKey].sessionId` (create if missing)
176
+ - Optionally deliver output (`payload.deliver === true`) to the configured channel/to.
177
+ - Isolated jobs always enqueue a summary system event to the main session when they finish (derived from the last agent text output).
178
+ - Prefix defaults to `Cron`, and can be customized via `isolation.postToMainPrefix`.
179
+ - If `deliver` is omitted/false, nothing is sent to external providers; you still get the main-session summary and can inspect the full isolated transcript in `cron:<jobId>`.
180
+
181
+ ### “Run in parallel to main”
182
+
183
+ Clawdbot currently serializes command execution through a global in-process queue (`src/process/command-queue.ts`) to avoid collisions.
184
+
185
+ To support isolated cron jobs running “in parallel”, we should introduce **lanes** (keyed queues) plus a global concurrency cap:
186
+ - Lane `"main"`: inbound auto-replies + main heartbeat.
187
+ - Lane `"cron"` (or `cron:<jobId>`): isolated jobs.
188
+ - Configurable `cron.maxConcurrentRuns` (default 1 or 2).
189
+
190
+ This yields:
191
+ - isolated jobs can overlap with the main lane (up to cap),
192
+ - each lane still preserves ordering for its own work (optional),
193
+ - we retain safety knobs to prevent runaway resource contention.
194
+
195
+ ## Heartbeat wake hook (immediate vs next heartbeat)
196
+
197
+ We need a way for the Gateway (or the scheduler) to request an immediate heartbeat without duplicating heartbeat logic.
198
+
199
+ Design:
200
+ - `startHeartbeatRunner` owns the real heartbeat execution and installs a wake handler.
201
+ - Wake hook lives in `src/infra/heartbeat-wake.ts`:
202
+ - `setHeartbeatWakeHandler(fn | null)` installed by the heartbeat runner
203
+ - `requestHeartbeatNow({ reason, coalesceMs? })`
204
+ - If the handler is absent, the request is stored as “pending”; the next time the handler is installed, it runs once.
205
+ - Coalesce rapid calls and respect the “skip when queue busy” behavior (retry soon vs dropping).
206
+
207
+ ## Run history log (JSONL)
208
+
209
+ In addition to normal structured logs, the Gateway writes an append-only run history “ledger” (JSONL) whenever a job finishes. This is intended for quick debugging (“did the job run, when, and what happened?”).
210
+
211
+ Path rules:
212
+ - Run logs are stored per job next to the store: `.../runs/<jobId>.jsonl`.
213
+
214
+ Retention:
215
+ - Best-effort pruning when the file grows beyond ~2MB; keep the newest ~2000 lines.
216
+
217
+ Each log line includes (at minimum) job id, status/error, timing, and a `summary` string (systemEvent text for main jobs, and the last agent text output for isolated jobs).
218
+
219
+ ## Gateway API
220
+
221
+ New methods (names can be bikeshed; `cron.*` is suggested):
222
+
223
+ - `wake`
224
+ - params: `{ mode: "now" | "next-heartbeat", text: string }`
225
+ - effect: `enqueueSystemEvent(text)`, plus optional immediate heartbeat trigger
226
+
227
+ - `cron.list`
228
+ - params: optional `{ includeDisabled?: boolean }`
229
+ - returns: `{ jobs: CronJob[] }`
230
+
231
+ - `cron.add`
232
+ - params: job payload without `id/state` (server generates and returns created job)
233
+
234
+ - `cron.update`
235
+ - params: `{ id: string, patch: Partial<CronJobWritableFields> }`
236
+
237
+ - `cron.remove`
238
+ - params: `{ id: string }`
239
+
240
+ - `cron.run`
241
+ - params: `{ id: string, mode?: "due" | "force" }` (debugging; does not change schedule unless `force` requires it)
242
+
243
+ - `cron.runs`
244
+ - params: `{ id: string, limit?: number }`
245
+ - returns: `{ entries: CronRunLogEntry[] }`
246
+ - note: `id` is required (runs are stored per-job).
247
+
248
+ The Gateway should broadcast a `cron` event for UI/debug:
249
+ - event: `cron`
250
+ - payload: `{ jobId, action: "added"|"updated"|"removed"|"started"|"finished", status?, error?, nextRunAtMs? }`
251
+
252
+ ## CLI surface
253
+
254
+ Add a `cron` command group (all commands should also support `--json` where sensible):
255
+
256
+ - `clawdbot cron list [--json] [--all]`
257
+ - `clawdbot cron add ...`
258
+ - schedule flags:
259
+ - `--at <iso8601|ms|relative>` (one-shot)
260
+ - `--every <duration>` (e.g. `10m`, `1h`)
261
+ - `--cron "<expr>" [--tz "<tz>"]`
262
+ - target flags:
263
+ - `--session main|isolated`
264
+ - `--wake now|next-heartbeat`
265
+ - payload flags (choose one):
266
+ - `--system-event "<text>"`
267
+ - `--message "<agent message>" [--deliver] [--channel last|whatsapp|telegram|discord|signal|imessage] [--to <dest>]`
268
+
269
+ - `clawdbot cron edit <id> ...` (patch-by-flags, non-interactive)
270
+ - `clawdbot cron rm <id>`
271
+ - `clawdbot cron enable <id>` / `clawdbot cron disable <id>`
272
+ - `clawdbot cron run <id> [--force]` (debug)
273
+ - `clawdbot cron runs --id <id> [--limit <n>]` (run history)
274
+ - `clawdbot cron status` (scheduler enabled + next wake)
275
+
276
+ Additionally:
277
+ - `clawdbot wake --mode now|next-heartbeat --text "<text>"` as a thin wrapper around `wake` for agents to call.
278
+
279
+ ## Examples
280
+
281
+ ### Run once at a specific time
282
+
283
+ One-shot reminder that targets the main session and triggers a heartbeat immediately at the scheduled time:
284
+
285
+ ```bash
286
+ clawdbot cron add \
287
+ --at "2025-12-14T07:00:00-08:00" \
288
+ --session main \
289
+ --wake now \
290
+ --system-event "Alarm: wake up (meeting in 30 minutes)."
291
+ ```
292
+
293
+ ### Run daily (calendar-accurate)
294
+
295
+ Daily at 07:00 in a specific timezone (preferred over “every 24h” to avoid DST drift):
296
+
297
+ ```bash
298
+ clawdbot cron add \
299
+ --cron "0 7 * * *" \
300
+ --tz "America/Los_Angeles" \
301
+ --session isolated \
302
+ --wake now \
303
+ --message "Daily check: scan calendar + inbox; deliver only if urgent." \
304
+ --deliver \
305
+ --channel last
306
+ ```
307
+
308
+ ### Run weekly (every Wednesday)
309
+
310
+ Every Wednesday at 09:00:
311
+
312
+ ```bash
313
+ clawdbot cron add \
314
+ --cron "0 9 * * 3" \
315
+ --tz "America/Los_Angeles" \
316
+ --session isolated \
317
+ --wake now \
318
+ --message "Weekly: summarize status and remind me of goals." \
319
+ --deliver \
320
+ --channel last
321
+ ```
322
+
323
+ ### “Next heartbeat”
324
+
325
+ Enqueue a note for the main session but let the existing heartbeat cadence pick it up:
326
+
327
+ ```bash
328
+ clawdbot wake --mode next-heartbeat --text "Next heartbeat: check battery + upcoming meetings."
329
+ ```
330
+
331
+ ## Logging & observability
332
+
333
+ Logging requirements:
334
+ - Use `getChildLogger({ module: "cron", jobId, runId, name })` for every run.
335
+ - Log lifecycle:
336
+ - store load/save (debug; include job count)
337
+ - schedule recompute (debug; include nextRunAt)
338
+ - job start/end (info)
339
+ - job skipped (info; include reason)
340
+ - job error (warn; include error + stack where available)
341
+ - Emit a concise user-facing line to stdout when running in CLI mode (similar to heartbeat logs).
342
+
343
+ Suggested log events:
344
+ - `cron: scheduler started` (jobCount, nextWakeAt)
345
+ - `cron: job started` (jobId, scheduleKind, sessionTarget, wakeMode)
346
+ - `cron: job finished` (status, durationMs, nextRunAtMs)
347
+ - When `cron.enabled` is false, the Gateway logs `cron: disabled` and jobs will not run automatically (the CLI warns on `cron add`/`cron edit`).
348
+ - Use `clawdbot cron status` to confirm the scheduler is enabled and see the next wake time.
349
+
350
+ ## Safety & security
351
+
352
+ - Respect existing allowlists/routing rules: delivery defaults should not send to arbitrary destinations unless explicitly configured.
353
+ - Provide a global “kill switch”:
354
+ - `cron.enabled: boolean` (default `true`).
355
+ - `gateway method set-heartbeats` already exists; cron should have similar.
356
+ - Avoid persistence of sensitive payloads unless requested; job text may contain private content.
357
+
358
+ ## Testing plan (v1)
359
+
360
+ - Unit tests:
361
+ - schedule computation for `at` and `every`
362
+ - job store read/write + migration behavior
363
+ - lane concurrency: main vs cron overlap is bounded
364
+ - “wake now” coalescing and pending behavior when provider not ready
365
+ - Integration tests:
366
+ - start Gateway with `CLAWDBOT_SKIP_PROVIDERS=1`, add jobs, list/edit/remove
367
+ - simulate due jobs and assert `enqueueSystemEvent` called + cron events broadcast
368
+
369
+ ## Rollout plan
370
+
371
+ 1) Add the `wake` primitive + heartbeat wake hook (no persistent jobs yet).
372
+ 2) Add `cron.*` API and CLI wrappers with `at` + `every`.
373
+ 3) Add optional cron expression parsing (`kind:"cron"`) if needed.
374
+ 4) Add UI surfacing in WebChat/macOS app (optional).
@@ -0,0 +1,17 @@
1
+ ---
2
+ summary: "Gateway dashboard (Control UI) access and auth"
3
+ read_when:
4
+ - Changing dashboard authentication or exposure modes
5
+ ---
6
+ # Dashboard (Control UI)
7
+
8
+ The Gateway dashboard is the browser Control UI served at `/` by default
9
+ (override with `gateway.controlUi.basePath`).
10
+
11
+ Key references:
12
+ - `docs/control-ui.md` for usage and UI capabilities.
13
+ - `docs/tailscale.md` for Serve/Funnel automation.
14
+ - `docs/web.md` for bind modes and security notes.
15
+
16
+ Authentication is enforced at the WebSocket handshake via `connect.params.auth`
17
+ (token or password). See `gateway.auth` in `docs/configuration.md`.
@@ -0,0 +1,46 @@
1
+ ---
2
+ summary: "How Clawdbot vendors Apple device model identifiers for friendly names in the macOS app."
3
+ read_when:
4
+ - Updating device model identifier mappings or NOTICE/license files
5
+ - Changing how Instances UI displays device names
6
+ ---
7
+
8
+ # Device model database (friendly names)
9
+
10
+ The macOS companion app shows friendly Apple device model names in the **Instances** UI by mapping Apple model identifiers (e.g. `iPad16,6`, `Mac16,6`) to human-readable names.
11
+
12
+ The mapping is vendored as JSON under:
13
+
14
+ - `apps/macos/Sources/Clawdbot/Resources/DeviceModels/`
15
+
16
+ ## Data source
17
+
18
+ We currently vendor the mapping from the MIT-licensed repository:
19
+
20
+ - `kyle-seongwoo-jun/apple-device-identifiers`
21
+
22
+ To keep builds deterministic, the JSON files are pinned to specific upstream commits (recorded in `apps/macos/Sources/Clawdbot/Resources/DeviceModels/NOTICE.md`).
23
+
24
+ ## Updating the database
25
+
26
+ 1. Pick the upstream commits you want to pin to (one for iOS, one for macOS).
27
+ 2. Update the commit hashes in `apps/macos/Sources/Clawdbot/Resources/DeviceModels/NOTICE.md`.
28
+ 3. Re-download the JSON files, pinned to those commits:
29
+
30
+ ```bash
31
+ IOS_COMMIT="<commit sha for ios-device-identifiers.json>"
32
+ MAC_COMMIT="<commit sha for mac-device-identifiers.json>"
33
+
34
+ curl -fsSL "https://raw.githubusercontent.com/kyle-seongwoo-jun/apple-device-identifiers/${IOS_COMMIT}/ios-device-identifiers.json" \
35
+ -o apps/macos/Sources/Clawdbot/Resources/DeviceModels/ios-device-identifiers.json
36
+
37
+ curl -fsSL "https://raw.githubusercontent.com/kyle-seongwoo-jun/apple-device-identifiers/${MAC_COMMIT}/mac-device-identifiers.json" \
38
+ -o apps/macos/Sources/Clawdbot/Resources/DeviceModels/mac-device-identifiers.json
39
+ ```
40
+
41
+ 4. Ensure `apps/macos/Sources/Clawdbot/Resources/DeviceModels/LICENSE.apple-device-identifiers.txt` still matches upstream (replace it if the upstream license changes).
42
+ 5. Verify the macOS app builds cleanly (no warnings):
43
+
44
+ ```bash
45
+ swift build --package-path apps/macos
46
+ ```