clawdbot 2026.1.4

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 (503) hide show
  1. package/CHANGELOG.md +115 -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/cron/isolated-agent.js +499 -0
  189. package/dist/cron/run-log.js +72 -0
  190. package/dist/cron/schedule.js +24 -0
  191. package/dist/cron/service.js +471 -0
  192. package/dist/cron/store.js +43 -0
  193. package/dist/cron/types.js +1 -0
  194. package/dist/discord/index.js +2 -0
  195. package/dist/discord/monitor.js +1188 -0
  196. package/dist/discord/probe.js +54 -0
  197. package/dist/discord/send.js +577 -0
  198. package/dist/discord/token.js +8 -0
  199. package/dist/gateway/auth.js +121 -0
  200. package/dist/gateway/call.js +94 -0
  201. package/dist/gateway/chat-attachments.js +41 -0
  202. package/dist/gateway/client.js +180 -0
  203. package/dist/gateway/config-reload.js +274 -0
  204. package/dist/gateway/control-ui.js +184 -0
  205. package/dist/gateway/hooks-mapping.js +282 -0
  206. package/dist/gateway/hooks.js +168 -0
  207. package/dist/gateway/net.js +29 -0
  208. package/dist/gateway/protocol/index.js +61 -0
  209. package/dist/gateway/protocol/schema.js +560 -0
  210. package/dist/gateway/server-bridge-subscriptions.js +93 -0
  211. package/dist/gateway/server-bridge.js +1013 -0
  212. package/dist/gateway/server-browser.js +12 -0
  213. package/dist/gateway/server-chat.js +159 -0
  214. package/dist/gateway/server-constants.js +8 -0
  215. package/dist/gateway/server-discovery.js +62 -0
  216. package/dist/gateway/server-http.js +165 -0
  217. package/dist/gateway/server-methods/agent-job.js +125 -0
  218. package/dist/gateway/server-methods/agent.js +250 -0
  219. package/dist/gateway/server-methods/chat.js +200 -0
  220. package/dist/gateway/server-methods/config.js +50 -0
  221. package/dist/gateway/server-methods/connect.js +6 -0
  222. package/dist/gateway/server-methods/cron.js +83 -0
  223. package/dist/gateway/server-methods/health.js +28 -0
  224. package/dist/gateway/server-methods/models.js +16 -0
  225. package/dist/gateway/server-methods/nodes.js +294 -0
  226. package/dist/gateway/server-methods/providers.js +217 -0
  227. package/dist/gateway/server-methods/send.js +166 -0
  228. package/dist/gateway/server-methods/sessions.js +305 -0
  229. package/dist/gateway/server-methods/skills.js +83 -0
  230. package/dist/gateway/server-methods/system.js +118 -0
  231. package/dist/gateway/server-methods/talk.js +22 -0
  232. package/dist/gateway/server-methods/types.js +1 -0
  233. package/dist/gateway/server-methods/voicewake.js +30 -0
  234. package/dist/gateway/server-methods/web.js +58 -0
  235. package/dist/gateway/server-methods/wizard.js +100 -0
  236. package/dist/gateway/server-methods.js +53 -0
  237. package/dist/gateway/server-providers.js +644 -0
  238. package/dist/gateway/server-shared.js +1 -0
  239. package/dist/gateway/server-utils.js +35 -0
  240. package/dist/gateway/server.js +1437 -0
  241. package/dist/gateway/session-utils.js +216 -0
  242. package/dist/gateway/ws-log.js +349 -0
  243. package/dist/gateway/ws-logging.js +8 -0
  244. package/dist/globals.js +41 -0
  245. package/dist/hooks/gmail-ops.js +236 -0
  246. package/dist/hooks/gmail-setup-utils.js +278 -0
  247. package/dist/hooks/gmail-watcher.js +175 -0
  248. package/dist/hooks/gmail.js +177 -0
  249. package/dist/index.js +50 -0
  250. package/dist/infra/agent-events.js +46 -0
  251. package/dist/infra/binaries.js +9 -0
  252. package/dist/infra/bonjour-discovery.js +163 -0
  253. package/dist/infra/bonjour.js +200 -0
  254. package/dist/infra/bridge/server.js +562 -0
  255. package/dist/infra/canvas-host-url.js +54 -0
  256. package/dist/infra/env.js +8 -0
  257. package/dist/infra/errors.js +28 -0
  258. package/dist/infra/gateway-lock.js +8 -0
  259. package/dist/infra/heartbeat-events.js +21 -0
  260. package/dist/infra/heartbeat-runner.js +453 -0
  261. package/dist/infra/heartbeat-wake.js +61 -0
  262. package/dist/infra/is-main.js +37 -0
  263. package/dist/infra/machine-name.js +40 -0
  264. package/dist/infra/node-pairing.js +211 -0
  265. package/dist/infra/pam.js +42 -0
  266. package/dist/infra/path-env.js +92 -0
  267. package/dist/infra/ports.js +87 -0
  268. package/dist/infra/provider-summary.js +80 -0
  269. package/dist/infra/restart.js +29 -0
  270. package/dist/infra/retry.js +16 -0
  271. package/dist/infra/runtime-guard.js +59 -0
  272. package/dist/infra/system-events.js +44 -0
  273. package/dist/infra/system-presence.js +216 -0
  274. package/dist/infra/tailnet.js +46 -0
  275. package/dist/infra/tailscale.js +149 -0
  276. package/dist/infra/voicewake.js +77 -0
  277. package/dist/infra/widearea-dns.js +123 -0
  278. package/dist/infra/ws.js +13 -0
  279. package/dist/logger.js +52 -0
  280. package/dist/logging.js +490 -0
  281. package/dist/macos/gateway-daemon.js +141 -0
  282. package/dist/macos/relay.js +46 -0
  283. package/dist/media/constants.js +33 -0
  284. package/dist/media/host.js +42 -0
  285. package/dist/media/image-ops.js +121 -0
  286. package/dist/media/mime.js +115 -0
  287. package/dist/media/parse.js +81 -0
  288. package/dist/media/server.js +64 -0
  289. package/dist/media/store.js +139 -0
  290. package/dist/process/command-queue.js +97 -0
  291. package/dist/process/exec.js +75 -0
  292. package/dist/protocol.schema.json +2918 -0
  293. package/dist/provider-web.js +8 -0
  294. package/dist/providers/web/index.js +2 -0
  295. package/dist/runtime.js +8 -0
  296. package/dist/telegram/bot.js +394 -0
  297. package/dist/telegram/download.js +34 -0
  298. package/dist/telegram/index.js +4 -0
  299. package/dist/telegram/monitor.js +47 -0
  300. package/dist/telegram/probe.js +63 -0
  301. package/dist/telegram/proxy.js +9 -0
  302. package/dist/telegram/send.js +138 -0
  303. package/dist/telegram/token.js +30 -0
  304. package/dist/telegram/webhook-set.js +12 -0
  305. package/dist/telegram/webhook.js +56 -0
  306. package/dist/utils.js +133 -0
  307. package/dist/version.js +18 -0
  308. package/dist/web/active-listener.js +7 -0
  309. package/dist/web/auto-reply.js +1203 -0
  310. package/dist/web/inbound.js +481 -0
  311. package/dist/web/login-qr.js +204 -0
  312. package/dist/web/login.js +59 -0
  313. package/dist/web/media.js +148 -0
  314. package/dist/web/outbound.js +67 -0
  315. package/dist/web/qr-image.js +97 -0
  316. package/dist/web/reconnect.js +60 -0
  317. package/dist/web/reply-heartbeat-wake.js +61 -0
  318. package/dist/web/session.js +346 -0
  319. package/docs/AGENTS.default.md +116 -0
  320. package/docs/CNAME +1 -0
  321. package/docs/RELEASING.md +64 -0
  322. package/docs/_config.yml +51 -0
  323. package/docs/_layouts/default.html +145 -0
  324. package/docs/agent-send.md +21 -0
  325. package/docs/agent.md +104 -0
  326. package/docs/android/connect.md +131 -0
  327. package/docs/architecture.md +89 -0
  328. package/docs/assets/markdown.css +130 -0
  329. package/docs/assets/pixel-lobster.svg +60 -0
  330. package/docs/assets/terminal.css +497 -0
  331. package/docs/assets/theme.js +55 -0
  332. package/docs/audio.md +50 -0
  333. package/docs/background-process.md +74 -0
  334. package/docs/bash.md +32 -0
  335. package/docs/bonjour.md +159 -0
  336. package/docs/browser.md +289 -0
  337. package/docs/camera.md +152 -0
  338. package/docs/clawd.md +199 -0
  339. package/docs/clawdbot-mac.md +104 -0
  340. package/docs/configuration.md +1177 -0
  341. package/docs/control-api.md +49 -0
  342. package/docs/control-ui.md +83 -0
  343. package/docs/cron.md +374 -0
  344. package/docs/dashboard.md +17 -0
  345. package/docs/device-models.md +46 -0
  346. package/docs/discord.md +293 -0
  347. package/docs/discovery.md +112 -0
  348. package/docs/docker.md +251 -0
  349. package/docs/docs.json +86 -0
  350. package/docs/doctor.md +47 -0
  351. package/docs/elevated.md +31 -0
  352. package/docs/faq.md +640 -0
  353. package/docs/gateway/pairing.md +109 -0
  354. package/docs/gateway-lock.md +28 -0
  355. package/docs/gateway.md +174 -0
  356. package/docs/gmail-pubsub.md +191 -0
  357. package/docs/grammy.md +27 -0
  358. package/docs/group-messages.md +71 -0
  359. package/docs/groups.md +78 -0
  360. package/docs/health.md +28 -0
  361. package/docs/heartbeat.md +64 -0
  362. package/docs/images.md +52 -0
  363. package/docs/imessage.md +63 -0
  364. package/docs/index.md +182 -0
  365. package/docs/ios/connect.md +177 -0
  366. package/docs/ios/spec.md +236 -0
  367. package/docs/location-command.md +95 -0
  368. package/docs/logging.md +99 -0
  369. package/docs/lore.md +131 -0
  370. package/docs/mac/bun.md +133 -0
  371. package/docs/mac/canvas.md +161 -0
  372. package/docs/mac/child-process.md +72 -0
  373. package/docs/mac/dev-setup.md +81 -0
  374. package/docs/mac/health.md +28 -0
  375. package/docs/mac/icon.md +26 -0
  376. package/docs/mac/logging.md +51 -0
  377. package/docs/mac/menu-bar.md +69 -0
  378. package/docs/mac/peekaboo.md +170 -0
  379. package/docs/mac/permissions.md +40 -0
  380. package/docs/mac/release.md +76 -0
  381. package/docs/mac/remote.md +57 -0
  382. package/docs/mac/signing.md +41 -0
  383. package/docs/mac/skills.md +27 -0
  384. package/docs/mac/voice-overlay.md +52 -0
  385. package/docs/mac/voicewake.md +56 -0
  386. package/docs/mac/webchat.md +27 -0
  387. package/docs/mac/xpc.md +40 -0
  388. package/docs/models.md +90 -0
  389. package/docs/nix.md +49 -0
  390. package/docs/nodes.md +157 -0
  391. package/docs/onboarding-config-protocol.md +29 -0
  392. package/docs/onboarding.md +185 -0
  393. package/docs/presence.md +133 -0
  394. package/docs/queue.md +78 -0
  395. package/docs/refactor/browser-control-simplification.md +58 -0
  396. package/docs/refactor/canvas-a2ui.md +93 -0
  397. package/docs/refactor/cli-unification.md +64 -0
  398. package/docs/refactor/gateway-client.md +31 -0
  399. package/docs/refactor/gateway.md +99 -0
  400. package/docs/refactor/new-arch.md +171 -0
  401. package/docs/refactor/tui.md +26 -0
  402. package/docs/refactor/web-gateway-troubleshooting.md +37 -0
  403. package/docs/refactor/webagent-session.md +46 -0
  404. package/docs/remote-gateway-readme.md +148 -0
  405. package/docs/remote.md +66 -0
  406. package/docs/research/memory.md +227 -0
  407. package/docs/rpc.md +35 -0
  408. package/docs/security.md +168 -0
  409. package/docs/session-tool.md +119 -0
  410. package/docs/session.md +84 -0
  411. package/docs/sessions.md +8 -0
  412. package/docs/setup.md +118 -0
  413. package/docs/signal.md +113 -0
  414. package/docs/skills-config.md +58 -0
  415. package/docs/skills.md +149 -0
  416. package/docs/slack.md +158 -0
  417. package/docs/surface.md +20 -0
  418. package/docs/tailscale.md +71 -0
  419. package/docs/talk.md +79 -0
  420. package/docs/telegram.md +90 -0
  421. package/docs/templates/AGENTS.md +126 -0
  422. package/docs/templates/BOOTSTRAP.md +53 -0
  423. package/docs/templates/IDENTITY.md +17 -0
  424. package/docs/templates/SOUL.md +41 -0
  425. package/docs/templates/TOOLS.md +41 -0
  426. package/docs/templates/USER.md +22 -0
  427. package/docs/test.md +35 -0
  428. package/docs/thinking.md +46 -0
  429. package/docs/tools.md +248 -0
  430. package/docs/troubleshooting.md +227 -0
  431. package/docs/tui.md +69 -0
  432. package/docs/typebox.md +42 -0
  433. package/docs/voicewake.md +61 -0
  434. package/docs/web.md +115 -0
  435. package/docs/webchat.md +34 -0
  436. package/docs/webhook.md +132 -0
  437. package/docs/whatsapp-clawd.jpg +0 -0
  438. package/docs/whatsapp.md +142 -0
  439. package/docs/wizard.md +158 -0
  440. package/package.json +178 -0
  441. package/skills/apple-notes/SKILL.md +50 -0
  442. package/skills/apple-reminders/SKILL.md +67 -0
  443. package/skills/bear-notes/SKILL.md +79 -0
  444. package/skills/bird/SKILL.md +25 -0
  445. package/skills/blogwatcher/SKILL.md +46 -0
  446. package/skills/blucli/SKILL.md +27 -0
  447. package/skills/brave-search/SKILL.md +30 -0
  448. package/skills/brave-search/scripts/content.mjs +53 -0
  449. package/skills/brave-search/scripts/search.mjs +79 -0
  450. package/skills/camsnap/SKILL.md +25 -0
  451. package/skills/clawdhub/SKILL.md +53 -0
  452. package/skills/coding-agent/SKILL.md +275 -0
  453. package/skills/discord/SKILL.md +369 -0
  454. package/skills/eightctl/SKILL.md +29 -0
  455. package/skills/food-order/SKILL.md +41 -0
  456. package/skills/gemini/SKILL.md +23 -0
  457. package/skills/gifgrep/SKILL.md +47 -0
  458. package/skills/github/SKILL.md +47 -0
  459. package/skills/gog/SKILL.md +36 -0
  460. package/skills/goplaces/SKILL.md +30 -0
  461. package/skills/imsg/SKILL.md +25 -0
  462. package/skills/local-places/SERVER_README.md +101 -0
  463. package/skills/local-places/SKILL.md +91 -0
  464. package/skills/local-places/pyproject.toml +27 -0
  465. package/skills/local-places/src/local_places/__init__.py +2 -0
  466. package/skills/local-places/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
  467. package/skills/local-places/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
  468. package/skills/local-places/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
  469. package/skills/local-places/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
  470. package/skills/local-places/src/local_places/google_places.py +314 -0
  471. package/skills/local-places/src/local_places/main.py +65 -0
  472. package/skills/local-places/src/local_places/schemas.py +107 -0
  473. package/skills/mcporter/SKILL.md +38 -0
  474. package/skills/nano-banana-pro/SKILL.md +29 -0
  475. package/skills/nano-banana-pro/scripts/generate_image.py +167 -0
  476. package/skills/nano-pdf/SKILL.md +20 -0
  477. package/skills/notion/SKILL.md +156 -0
  478. package/skills/obsidian/SKILL.md +55 -0
  479. package/skills/openai-image-gen/SKILL.md +31 -0
  480. package/skills/openai-image-gen/scripts/gen.py +173 -0
  481. package/skills/openai-whisper/SKILL.md +19 -0
  482. package/skills/openai-whisper-api/SKILL.md +43 -0
  483. package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
  484. package/skills/openhue/SKILL.md +30 -0
  485. package/skills/oracle/SKILL.md +105 -0
  486. package/skills/ordercli/SKILL.md +47 -0
  487. package/skills/peekaboo/SKILL.md +153 -0
  488. package/skills/qmd/SKILL.md +26 -0
  489. package/skills/sag/SKILL.md +62 -0
  490. package/skills/slack/SKILL.md +143 -0
  491. package/skills/songsee/SKILL.md +29 -0
  492. package/skills/sonoscli/SKILL.md +26 -0
  493. package/skills/spotify-player/SKILL.md +34 -0
  494. package/skills/summarize/SKILL.md +49 -0
  495. package/skills/things-mac/SKILL.md +61 -0
  496. package/skills/tmux/SKILL.md +121 -0
  497. package/skills/tmux/scripts/find-sessions.sh +112 -0
  498. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  499. package/skills/trello/SKILL.md +84 -0
  500. package/skills/video-frames/SKILL.md +29 -0
  501. package/skills/video-frames/scripts/frame.sh +81 -0
  502. package/skills/wacli/SKILL.md +42 -0
  503. package/skills/weather/SKILL.md +49 -0
@@ -0,0 +1,138 @@
1
+ // @ts-nocheck
2
+ import { Bot, InputFile } from "grammy";
3
+ import { formatErrorMessage } from "../infra/errors.js";
4
+ import { mediaKindFromMime } from "../media/constants.js";
5
+ import { loadWebMedia } from "../web/media.js";
6
+ const PARSE_ERR_RE = /can't parse entities|parse entities|find end of the entity/i;
7
+ function resolveToken(explicit) {
8
+ const token = explicit ?? process.env.TELEGRAM_BOT_TOKEN;
9
+ if (!token) {
10
+ throw new Error("TELEGRAM_BOT_TOKEN is required for Telegram sends (Bot API)");
11
+ }
12
+ return token.trim();
13
+ }
14
+ function normalizeChatId(to) {
15
+ const trimmed = to.trim();
16
+ if (!trimmed)
17
+ throw new Error("Recipient is required for Telegram sends");
18
+ // Common internal prefixes that sometimes leak into outbound sends.
19
+ // - ctx.To uses `telegram:<id>`
20
+ // - group sessions often use `telegram:group:<id>`
21
+ let normalized = trimmed.replace(/^(telegram|tg|group):/i, "").trim();
22
+ // Accept t.me links for public chats/channels.
23
+ // (Invite links like `t.me/+...` are not resolvable via Bot API.)
24
+ const m = /^https?:\/\/t\.me\/([A-Za-z0-9_]+)$/i.exec(normalized) ??
25
+ /^t\.me\/([A-Za-z0-9_]+)$/i.exec(normalized);
26
+ if (m?.[1])
27
+ normalized = `@${m[1]}`;
28
+ if (!normalized)
29
+ throw new Error("Recipient is required for Telegram sends");
30
+ if (normalized.startsWith("@"))
31
+ return normalized;
32
+ if (/^-?\d+$/.test(normalized))
33
+ return normalized;
34
+ // If the user passed a username without `@`, assume they meant a public chat/channel.
35
+ if (/^[A-Za-z0-9_]{5,}$/i.test(normalized))
36
+ return `@${normalized}`;
37
+ return normalized;
38
+ }
39
+ export async function sendMessageTelegram(to, text, opts = {}) {
40
+ const token = resolveToken(opts.token);
41
+ const chatId = normalizeChatId(to);
42
+ const bot = opts.api ? null : new Bot(token);
43
+ const api = opts.api ?? bot?.api;
44
+ const mediaUrl = opts.mediaUrl?.trim();
45
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
46
+ const sendWithRetry = async (fn, label) => {
47
+ let lastErr;
48
+ for (let attempt = 1; attempt <= 3; attempt++) {
49
+ try {
50
+ return await fn();
51
+ }
52
+ catch (err) {
53
+ lastErr = err;
54
+ const errText = formatErrorMessage(err);
55
+ const terminal = attempt === 3 ||
56
+ !/429|timeout|connect|reset|closed|unavailable|temporarily/i.test(errText);
57
+ if (terminal)
58
+ break;
59
+ const backoff = 400 * attempt;
60
+ if (opts.verbose) {
61
+ console.warn(`telegram send retry ${attempt}/2 for ${label} in ${backoff}ms: ${errText}`);
62
+ }
63
+ await sleep(backoff);
64
+ }
65
+ }
66
+ throw lastErr ?? new Error(`Telegram send failed (${label})`);
67
+ };
68
+ const wrapChatNotFound = (err) => {
69
+ if (!/400: Bad Request: chat not found/i.test(formatErrorMessage(err)))
70
+ return err;
71
+ return new Error([
72
+ `Telegram send failed: chat not found (chat_id=${chatId}).`,
73
+ "Likely: bot not started in DM, bot removed from group/channel, group migrated (new -100… id), or wrong bot token.",
74
+ `Input was: ${JSON.stringify(to)}.`,
75
+ ].join(" "));
76
+ };
77
+ if (mediaUrl) {
78
+ const media = await loadWebMedia(mediaUrl, opts.maxBytes);
79
+ const kind = mediaKindFromMime(media.contentType ?? undefined);
80
+ const file = new InputFile(media.buffer, media.fileName ?? inferFilename(kind) ?? "file");
81
+ const caption = text?.trim() || undefined;
82
+ let result;
83
+ if (kind === "image") {
84
+ result = await sendWithRetry(() => api.sendPhoto(chatId, file, { caption }), "photo").catch((err) => {
85
+ throw wrapChatNotFound(err);
86
+ });
87
+ }
88
+ else if (kind === "video") {
89
+ result = await sendWithRetry(() => api.sendVideo(chatId, file, { caption }), "video").catch((err) => {
90
+ throw wrapChatNotFound(err);
91
+ });
92
+ }
93
+ else if (kind === "audio") {
94
+ result = await sendWithRetry(() => api.sendAudio(chatId, file, { caption }), "audio").catch((err) => {
95
+ throw wrapChatNotFound(err);
96
+ });
97
+ }
98
+ else {
99
+ result = await sendWithRetry(() => api.sendDocument(chatId, file, { caption }), "document").catch((err) => {
100
+ throw wrapChatNotFound(err);
101
+ });
102
+ }
103
+ const messageId = String(result?.message_id ?? "unknown");
104
+ return { messageId, chatId: String(result?.chat?.id ?? chatId) };
105
+ }
106
+ if (!text || !text.trim()) {
107
+ throw new Error("Message must be non-empty for Telegram sends");
108
+ }
109
+ const res = await sendWithRetry(() => api.sendMessage(chatId, text, { parse_mode: "Markdown" }), "message").catch(async (err) => {
110
+ // Telegram rejects malformed Markdown (e.g., unbalanced '_' or '*').
111
+ // When that happens, fall back to plain text so the message still delivers.
112
+ const errText = formatErrorMessage(err);
113
+ if (PARSE_ERR_RE.test(errText)) {
114
+ if (opts.verbose) {
115
+ console.warn(`telegram markdown parse failed, retrying as plain text: ${errText}`);
116
+ }
117
+ return await sendWithRetry(() => api.sendMessage(chatId, text), "message-plain").catch((err2) => {
118
+ throw wrapChatNotFound(err2);
119
+ });
120
+ }
121
+ throw wrapChatNotFound(err);
122
+ });
123
+ const messageId = String(res?.message_id ?? "unknown");
124
+ return { messageId, chatId: String(res?.chat?.id ?? chatId) };
125
+ }
126
+ function inferFilename(kind) {
127
+ switch (kind) {
128
+ case "image":
129
+ return "image.jpg";
130
+ case "video":
131
+ return "video.mp4";
132
+ case "audio":
133
+ return "audio.ogg";
134
+ default:
135
+ return "file.bin";
136
+ }
137
+ }
138
+ // @ts-nocheck
@@ -0,0 +1,30 @@
1
+ import fs from "node:fs";
2
+ export function resolveTelegramToken(cfg, opts = {}) {
3
+ const envToken = (opts.envToken ?? process.env.TELEGRAM_BOT_TOKEN)?.trim();
4
+ if (envToken) {
5
+ return { token: envToken, source: "env" };
6
+ }
7
+ const tokenFile = cfg?.telegram?.tokenFile?.trim();
8
+ if (tokenFile) {
9
+ if (!fs.existsSync(tokenFile)) {
10
+ opts.logMissingFile?.(`telegram.tokenFile not found: ${tokenFile}`);
11
+ return { token: "", source: "none" };
12
+ }
13
+ try {
14
+ const token = fs.readFileSync(tokenFile, "utf-8").trim();
15
+ if (token) {
16
+ return { token, source: "tokenFile" };
17
+ }
18
+ }
19
+ catch (err) {
20
+ opts.logMissingFile?.(`telegram.tokenFile read failed: ${String(err)}`);
21
+ return { token: "", source: "none" };
22
+ }
23
+ return { token: "", source: "none" };
24
+ }
25
+ const configToken = cfg?.telegram?.botToken?.trim();
26
+ if (configToken) {
27
+ return { token: configToken, source: "config" };
28
+ }
29
+ return { token: "", source: "none" };
30
+ }
@@ -0,0 +1,12 @@
1
+ import { Bot } from "grammy";
2
+ export async function setTelegramWebhook(opts) {
3
+ const bot = new Bot(opts.token);
4
+ await bot.api.setWebhook(opts.url, {
5
+ secret_token: opts.secret,
6
+ drop_pending_updates: opts.dropPendingUpdates ?? false,
7
+ });
8
+ }
9
+ export async function deleteTelegramWebhook(opts) {
10
+ const bot = new Bot(opts.token);
11
+ await bot.api.deleteWebhook();
12
+ }
@@ -0,0 +1,56 @@
1
+ import { createServer } from "node:http";
2
+ import { webhookCallback } from "grammy";
3
+ import { formatErrorMessage } from "../infra/errors.js";
4
+ import { defaultRuntime } from "../runtime.js";
5
+ import { createTelegramBot } from "./bot.js";
6
+ export async function startTelegramWebhook(opts) {
7
+ const path = opts.path ?? "/telegram-webhook";
8
+ const healthPath = opts.healthPath ?? "/healthz";
9
+ const port = opts.port ?? 8787;
10
+ const host = opts.host ?? "0.0.0.0";
11
+ const runtime = opts.runtime ?? defaultRuntime;
12
+ const bot = createTelegramBot({
13
+ token: opts.token,
14
+ runtime,
15
+ proxyFetch: opts.fetch,
16
+ });
17
+ const handler = webhookCallback(bot, "http", {
18
+ secretToken: opts.secret,
19
+ });
20
+ const server = createServer((req, res) => {
21
+ if (req.url === healthPath) {
22
+ res.writeHead(200);
23
+ res.end("ok");
24
+ return;
25
+ }
26
+ if (req.url !== path || req.method !== "POST") {
27
+ res.writeHead(404);
28
+ res.end();
29
+ return;
30
+ }
31
+ const handled = handler(req, res);
32
+ if (handled && typeof handled.catch === "function") {
33
+ void handled.catch((err) => {
34
+ runtime.log?.(`webhook handler failed: ${formatErrorMessage(err)}`);
35
+ if (!res.headersSent)
36
+ res.writeHead(500);
37
+ res.end();
38
+ });
39
+ }
40
+ });
41
+ const publicUrl = opts.publicUrl ??
42
+ `http://${host === "0.0.0.0" ? "localhost" : host}:${port}${path}`;
43
+ await bot.api.setWebhook(publicUrl, {
44
+ secret_token: opts.secret,
45
+ });
46
+ await new Promise((resolve) => server.listen(port, host, resolve));
47
+ runtime.log?.(`webhook listening on ${publicUrl}`);
48
+ const shutdown = () => {
49
+ server.close();
50
+ void bot.stop();
51
+ };
52
+ if (opts.abortSignal) {
53
+ opts.abortSignal.addEventListener("abort", shutdown, { once: true });
54
+ }
55
+ return { server, bot, stop: shutdown };
56
+ }
package/dist/utils.js ADDED
@@ -0,0 +1,133 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { logVerbose, shouldLogVerbose } from "./globals.js";
5
+ export async function ensureDir(dir) {
6
+ await fs.promises.mkdir(dir, { recursive: true });
7
+ }
8
+ export function assertProvider(input) {
9
+ if (input !== "web") {
10
+ throw new Error("Provider must be 'web'");
11
+ }
12
+ }
13
+ export function normalizePath(p) {
14
+ if (!p.startsWith("/"))
15
+ return `/${p}`;
16
+ return p;
17
+ }
18
+ export function withWhatsAppPrefix(number) {
19
+ return number.startsWith("whatsapp:") ? number : `whatsapp:${number}`;
20
+ }
21
+ export function normalizeE164(number) {
22
+ const withoutPrefix = number.replace(/^whatsapp:/, "").trim();
23
+ const digits = withoutPrefix.replace(/[^\d+]/g, "");
24
+ if (digits.startsWith("+"))
25
+ return `+${digits.slice(1)}`;
26
+ return `+${digits}`;
27
+ }
28
+ /**
29
+ * "Self-chat mode" heuristic (single phone): the gateway is logged in as the owner's own WhatsApp account,
30
+ * and `whatsapp.allowFrom` includes that same number. Used to avoid side-effects that make no sense when the
31
+ * "bot" and the human are the same WhatsApp identity (e.g. auto read receipts, @mention JID triggers).
32
+ */
33
+ export function isSelfChatMode(selfE164, allowFrom) {
34
+ if (!selfE164)
35
+ return false;
36
+ if (!Array.isArray(allowFrom) || allowFrom.length === 0)
37
+ return false;
38
+ const normalizedSelf = normalizeE164(selfE164);
39
+ return allowFrom.some((n) => {
40
+ if (n === "*")
41
+ return false;
42
+ try {
43
+ return normalizeE164(String(n)) === normalizedSelf;
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ });
49
+ }
50
+ export function toWhatsappJid(number) {
51
+ const withoutPrefix = number.replace(/^whatsapp:/, "").trim();
52
+ if (withoutPrefix.includes("@"))
53
+ return withoutPrefix;
54
+ const e164 = normalizeE164(withoutPrefix);
55
+ const digits = e164.replace(/\D/g, "");
56
+ return `${digits}@s.whatsapp.net`;
57
+ }
58
+ export function jidToE164(jid) {
59
+ // Convert a WhatsApp JID (with optional device suffix, e.g. 1234:1@s.whatsapp.net) back to +1234.
60
+ const match = jid.match(/^(\d+)(?::\d+)?@s\.whatsapp\.net$/);
61
+ if (match) {
62
+ const digits = match[1];
63
+ return `+${digits}`;
64
+ }
65
+ // Support @lid format (WhatsApp Linked ID) - look up reverse mapping
66
+ const lidMatch = jid.match(/^(\d+)(?::\d+)?@lid$/);
67
+ if (lidMatch) {
68
+ const lid = lidMatch[1];
69
+ try {
70
+ const mappingPath = `${CONFIG_DIR}/credentials/lid-mapping-${lid}_reverse.json`;
71
+ const data = fs.readFileSync(mappingPath, "utf8");
72
+ const phone = JSON.parse(data);
73
+ if (phone)
74
+ return `+${phone}`;
75
+ }
76
+ catch {
77
+ if (shouldLogVerbose()) {
78
+ logVerbose(`LID mapping not found for ${lid}; skipping inbound message`);
79
+ }
80
+ // Mapping not found, fall through
81
+ }
82
+ }
83
+ return null;
84
+ }
85
+ export function sleep(ms) {
86
+ return new Promise((resolve) => setTimeout(resolve, ms));
87
+ }
88
+ export function resolveUserPath(input) {
89
+ const trimmed = input.trim();
90
+ if (!trimmed)
91
+ return trimmed;
92
+ if (trimmed.startsWith("~")) {
93
+ return path.resolve(trimmed.replace("~", os.homedir()));
94
+ }
95
+ return path.resolve(trimmed);
96
+ }
97
+ export function resolveHomeDir() {
98
+ const envHome = process.env.HOME?.trim();
99
+ if (envHome)
100
+ return envHome;
101
+ const envProfile = process.env.USERPROFILE?.trim();
102
+ if (envProfile)
103
+ return envProfile;
104
+ try {
105
+ const home = os.homedir();
106
+ return home?.trim() ? home : undefined;
107
+ }
108
+ catch {
109
+ return undefined;
110
+ }
111
+ }
112
+ export function shortenHomePath(input) {
113
+ if (!input)
114
+ return input;
115
+ const home = resolveHomeDir();
116
+ if (!home)
117
+ return input;
118
+ if (input === home)
119
+ return "~";
120
+ if (input.startsWith(`${home}/`))
121
+ return `~${input.slice(home.length)}`;
122
+ return input;
123
+ }
124
+ export function shortenHomeInString(input) {
125
+ if (!input)
126
+ return input;
127
+ const home = resolveHomeDir();
128
+ if (!home)
129
+ return input;
130
+ return input.split(home).join("~");
131
+ }
132
+ // Fixed configuration root; legacy ~/.clawdbot is no longer used.
133
+ export const CONFIG_DIR = path.join(os.homedir(), ".clawdbot");
@@ -0,0 +1,18 @@
1
+ import { createRequire } from "node:module";
2
+ function readVersionFromPackageJson() {
3
+ try {
4
+ const require = createRequire(import.meta.url);
5
+ const pkg = require("../package.json");
6
+ return pkg.version ?? null;
7
+ }
8
+ catch {
9
+ return null;
10
+ }
11
+ }
12
+ // Single source of truth for the current clawdbot version.
13
+ // - Embedded/bundled builds: injected define or env var.
14
+ // - Dev/npm builds: package.json.
15
+ export const VERSION = (typeof __CLAWDBOT_VERSION__ === "string" && __CLAWDBOT_VERSION__) ||
16
+ process.env.CLAWDBOT_BUNDLED_VERSION ||
17
+ readVersionFromPackageJson() ||
18
+ "0.0.0";
@@ -0,0 +1,7 @@
1
+ let currentListener = null;
2
+ export function setActiveWebListener(listener) {
3
+ currentListener = listener;
4
+ }
5
+ export function getActiveWebListener() {
6
+ return currentListener;
7
+ }