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,167 @@
1
+ #!/usr/bin/env python3
2
+ # /// script
3
+ # requires-python = ">=3.10"
4
+ # dependencies = [
5
+ # "google-genai>=1.0.0",
6
+ # "pillow>=10.0.0",
7
+ # ]
8
+ # ///
9
+ """
10
+ Generate images using Google's Nano Banana Pro (Gemini 3 Pro Image) API.
11
+
12
+ Usage:
13
+ uv run generate_image.py --prompt "your image description" --filename "output.png" [--resolution 1K|2K|4K] [--api-key KEY]
14
+ """
15
+
16
+ import argparse
17
+ import os
18
+ import sys
19
+ from pathlib import Path
20
+
21
+
22
+ def get_api_key(provided_key: str | None) -> str | None:
23
+ """Get API key from argument first, then environment."""
24
+ if provided_key:
25
+ return provided_key
26
+ return os.environ.get("GEMINI_API_KEY")
27
+
28
+
29
+ def main():
30
+ parser = argparse.ArgumentParser(
31
+ description="Generate images using Nano Banana Pro (Gemini 3 Pro Image)"
32
+ )
33
+ parser.add_argument(
34
+ "--prompt", "-p",
35
+ required=True,
36
+ help="Image description/prompt"
37
+ )
38
+ parser.add_argument(
39
+ "--filename", "-f",
40
+ required=True,
41
+ help="Output filename (e.g., sunset-mountains.png)"
42
+ )
43
+ parser.add_argument(
44
+ "--input-image", "-i",
45
+ help="Optional input image path for editing/modification"
46
+ )
47
+ parser.add_argument(
48
+ "--resolution", "-r",
49
+ choices=["1K", "2K", "4K"],
50
+ default="1K",
51
+ help="Output resolution: 1K (default), 2K, or 4K"
52
+ )
53
+ parser.add_argument(
54
+ "--api-key", "-k",
55
+ help="Gemini API key (overrides GEMINI_API_KEY env var)"
56
+ )
57
+
58
+ args = parser.parse_args()
59
+
60
+ # Get API key
61
+ api_key = get_api_key(args.api_key)
62
+ if not api_key:
63
+ print("Error: No API key provided.", file=sys.stderr)
64
+ print("Please either:", file=sys.stderr)
65
+ print(" 1. Provide --api-key argument", file=sys.stderr)
66
+ print(" 2. Set GEMINI_API_KEY environment variable", file=sys.stderr)
67
+ sys.exit(1)
68
+
69
+ # Import here after checking API key to avoid slow import on error
70
+ from google import genai
71
+ from google.genai import types
72
+ from PIL import Image as PILImage
73
+
74
+ # Initialise client
75
+ client = genai.Client(api_key=api_key)
76
+
77
+ # Set up output path
78
+ output_path = Path(args.filename)
79
+ output_path.parent.mkdir(parents=True, exist_ok=True)
80
+
81
+ # Load input image if provided
82
+ input_image = None
83
+ output_resolution = args.resolution
84
+ if args.input_image:
85
+ try:
86
+ input_image = PILImage.open(args.input_image)
87
+ print(f"Loaded input image: {args.input_image}")
88
+
89
+ # Auto-detect resolution if not explicitly set by user
90
+ if args.resolution == "1K": # Default value
91
+ # Map input image size to resolution
92
+ width, height = input_image.size
93
+ max_dim = max(width, height)
94
+ if max_dim >= 3000:
95
+ output_resolution = "4K"
96
+ elif max_dim >= 1500:
97
+ output_resolution = "2K"
98
+ else:
99
+ output_resolution = "1K"
100
+ print(f"Auto-detected resolution: {output_resolution} (from input {width}x{height})")
101
+ except Exception as e:
102
+ print(f"Error loading input image: {e}", file=sys.stderr)
103
+ sys.exit(1)
104
+
105
+ # Build contents (image first if editing, prompt only if generating)
106
+ if input_image:
107
+ contents = [input_image, args.prompt]
108
+ print(f"Editing image with resolution {output_resolution}...")
109
+ else:
110
+ contents = args.prompt
111
+ print(f"Generating image with resolution {output_resolution}...")
112
+
113
+ try:
114
+ response = client.models.generate_content(
115
+ model="gemini-3-pro-image-preview",
116
+ contents=contents,
117
+ config=types.GenerateContentConfig(
118
+ response_modalities=["TEXT", "IMAGE"],
119
+ image_config=types.ImageConfig(
120
+ image_size=output_resolution
121
+ )
122
+ )
123
+ )
124
+
125
+ # Process response and convert to PNG
126
+ image_saved = False
127
+ for part in response.parts:
128
+ if part.text is not None:
129
+ print(f"Model response: {part.text}")
130
+ elif part.inline_data is not None:
131
+ # Convert inline data to PIL Image and save as PNG
132
+ from io import BytesIO
133
+
134
+ # inline_data.data is already bytes, not base64
135
+ image_data = part.inline_data.data
136
+ if isinstance(image_data, str):
137
+ # If it's a string, it might be base64
138
+ import base64
139
+ image_data = base64.b64decode(image_data)
140
+
141
+ image = PILImage.open(BytesIO(image_data))
142
+
143
+ # Ensure RGB mode for PNG (convert RGBA to RGB with white background if needed)
144
+ if image.mode == 'RGBA':
145
+ rgb_image = PILImage.new('RGB', image.size, (255, 255, 255))
146
+ rgb_image.paste(image, mask=image.split()[3])
147
+ rgb_image.save(str(output_path), 'PNG')
148
+ elif image.mode == 'RGB':
149
+ image.save(str(output_path), 'PNG')
150
+ else:
151
+ image.convert('RGB').save(str(output_path), 'PNG')
152
+ image_saved = True
153
+
154
+ if image_saved:
155
+ full_path = output_path.resolve()
156
+ print(f"\nImage saved: {full_path}")
157
+ else:
158
+ print("Error: No image was generated in the response.", file=sys.stderr)
159
+ sys.exit(1)
160
+
161
+ except Exception as e:
162
+ print(f"Error generating image: {e}", file=sys.stderr)
163
+ sys.exit(1)
164
+
165
+
166
+ if __name__ == "__main__":
167
+ main()
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: nano-pdf
3
+ description: Edit PDFs with natural-language instructions using the nano-pdf CLI.
4
+ homepage: https://pypi.org/project/nano-pdf/
5
+ metadata: {"clawdbot":{"emoji":"📄","requires":{"bins":["nano-pdf"]},"install":[{"id":"uv","kind":"uv","package":"nano-pdf","bins":["nano-pdf"],"label":"Install nano-pdf (uv)"}]}}
6
+ ---
7
+
8
+ # nano-pdf
9
+
10
+ Use `nano-pdf` to apply edits to a specific page in a PDF using a natural-language instruction.
11
+
12
+ ## Quick start
13
+
14
+ ```bash
15
+ nano-pdf edit deck.pdf 1 "Change the title to 'Q3 Results' and fix the typo in the subtitle"
16
+ ```
17
+
18
+ Notes:
19
+ - Page numbers are 0-based or 1-based depending on the tool’s version/config; if the result looks off by one, retry with the other.
20
+ - Always sanity-check the output PDF before sending it out.
@@ -0,0 +1,156 @@
1
+ ---
2
+ name: notion
3
+ description: Notion API for creating and managing pages, databases, and blocks.
4
+ homepage: https://developers.notion.com
5
+ metadata: {"clawdbot":{"emoji":"📝"}}
6
+ ---
7
+
8
+ # notion
9
+
10
+ Use the Notion API to create/read/update pages, data sources (databases), and blocks.
11
+
12
+ ## Setup
13
+
14
+ 1. Create an integration at https://notion.so/my-integrations
15
+ 2. Copy the API key (starts with `ntn_` or `secret_`)
16
+ 3. Store it:
17
+ ```bash
18
+ mkdir -p ~/.config/notion
19
+ echo "ntn_your_key_here" > ~/.config/notion/api_key
20
+ ```
21
+ 4. Share target pages/databases with your integration (click "..." → "Connect to" → your integration name)
22
+
23
+ ## API Basics
24
+
25
+ All requests need:
26
+ ```bash
27
+ NOTION_KEY=$(cat ~/.config/notion/api_key)
28
+ curl -X GET "https://api.notion.com/v1/..." \
29
+ -H "Authorization: Bearer $NOTION_KEY" \
30
+ -H "Notion-Version: 2025-09-03" \
31
+ -H "Content-Type: application/json"
32
+ ```
33
+
34
+ > **Note:** The `Notion-Version` header is required. This skill uses `2025-09-03` (latest). In this version, databases are called "data sources" in the API.
35
+
36
+ ## Common Operations
37
+
38
+ **Search for pages and data sources:**
39
+ ```bash
40
+ curl -X POST "https://api.notion.com/v1/search" \
41
+ -H "Authorization: Bearer $NOTION_KEY" \
42
+ -H "Notion-Version: 2025-09-03" \
43
+ -H "Content-Type: application/json" \
44
+ -d '{"query": "page title"}'
45
+ ```
46
+
47
+ **Get page:**
48
+ ```bash
49
+ curl "https://api.notion.com/v1/pages/{page_id}" \
50
+ -H "Authorization: Bearer $NOTION_KEY" \
51
+ -H "Notion-Version: 2025-09-03"
52
+ ```
53
+
54
+ **Get page content (blocks):**
55
+ ```bash
56
+ curl "https://api.notion.com/v1/blocks/{page_id}/children" \
57
+ -H "Authorization: Bearer $NOTION_KEY" \
58
+ -H "Notion-Version: 2025-09-03"
59
+ ```
60
+
61
+ **Create page in a data source:**
62
+ ```bash
63
+ curl -X POST "https://api.notion.com/v1/pages" \
64
+ -H "Authorization: Bearer $NOTION_KEY" \
65
+ -H "Notion-Version: 2025-09-03" \
66
+ -H "Content-Type: application/json" \
67
+ -d '{
68
+ "parent": {"database_id": "xxx"},
69
+ "properties": {
70
+ "Name": {"title": [{"text": {"content": "New Item"}}]},
71
+ "Status": {"select": {"name": "Todo"}}
72
+ }
73
+ }'
74
+ ```
75
+
76
+ **Query a data source (database):**
77
+ ```bash
78
+ curl -X POST "https://api.notion.com/v1/data_sources/{data_source_id}/query" \
79
+ -H "Authorization: Bearer $NOTION_KEY" \
80
+ -H "Notion-Version: 2025-09-03" \
81
+ -H "Content-Type: application/json" \
82
+ -d '{
83
+ "filter": {"property": "Status", "select": {"equals": "Active"}},
84
+ "sorts": [{"property": "Date", "direction": "descending"}]
85
+ }'
86
+ ```
87
+
88
+ **Create a data source (database):**
89
+ ```bash
90
+ curl -X POST "https://api.notion.com/v1/data_sources" \
91
+ -H "Authorization: Bearer $NOTION_KEY" \
92
+ -H "Notion-Version: 2025-09-03" \
93
+ -H "Content-Type: application/json" \
94
+ -d '{
95
+ "parent": {"page_id": "xxx"},
96
+ "title": [{"text": {"content": "My Database"}}],
97
+ "properties": {
98
+ "Name": {"title": {}},
99
+ "Status": {"select": {"options": [{"name": "Todo"}, {"name": "Done"}]}},
100
+ "Date": {"date": {}}
101
+ }
102
+ }'
103
+ ```
104
+
105
+ **Update page properties:**
106
+ ```bash
107
+ curl -X PATCH "https://api.notion.com/v1/pages/{page_id}" \
108
+ -H "Authorization: Bearer $NOTION_KEY" \
109
+ -H "Notion-Version: 2025-09-03" \
110
+ -H "Content-Type: application/json" \
111
+ -d '{"properties": {"Status": {"select": {"name": "Done"}}}}'
112
+ ```
113
+
114
+ **Add blocks to page:**
115
+ ```bash
116
+ curl -X PATCH "https://api.notion.com/v1/blocks/{page_id}/children" \
117
+ -H "Authorization: Bearer $NOTION_KEY" \
118
+ -H "Notion-Version: 2025-09-03" \
119
+ -H "Content-Type: application/json" \
120
+ -d '{
121
+ "children": [
122
+ {"object": "block", "type": "paragraph", "paragraph": {"rich_text": [{"text": {"content": "Hello"}}]}}
123
+ ]
124
+ }'
125
+ ```
126
+
127
+ ## Property Types
128
+
129
+ Common property formats for database items:
130
+ - **Title:** `{"title": [{"text": {"content": "..."}}]}`
131
+ - **Rich text:** `{"rich_text": [{"text": {"content": "..."}}]}`
132
+ - **Select:** `{"select": {"name": "Option"}}`
133
+ - **Multi-select:** `{"multi_select": [{"name": "A"}, {"name": "B"}]}`
134
+ - **Date:** `{"date": {"start": "2024-01-15", "end": "2024-01-16"}}`
135
+ - **Checkbox:** `{"checkbox": true}`
136
+ - **Number:** `{"number": 42}`
137
+ - **URL:** `{"url": "https://..."}`
138
+ - **Email:** `{"email": "a@b.com"}`
139
+ - **Relation:** `{"relation": [{"id": "page_id"}]}`
140
+
141
+ ## Key Differences in 2025-09-03
142
+
143
+ - **Databases → Data Sources:** Use `/data_sources/` endpoints for queries and retrieval
144
+ - **Two IDs:** Each database now has both a `database_id` and a `data_source_id`
145
+ - Use `database_id` when creating pages (`parent: {"database_id": "..."}`)
146
+ - Use `data_source_id` when querying (`POST /v1/data_sources/{id}/query`)
147
+ - **Search results:** Databases return as `"object": "data_source"` with their `data_source_id`
148
+ - **Parent in responses:** Pages show `parent.data_source_id` alongside `parent.database_id`
149
+ - **Finding the data_source_id:** Search for the database, or call `GET /v1/data_sources/{data_source_id}`
150
+
151
+ ## Notes
152
+
153
+ - Page/database IDs are UUIDs (with or without dashes)
154
+ - The API cannot set database view filters — that's UI-only
155
+ - Rate limit: ~3 requests/second average
156
+ - Use `is_inline: true` when creating data sources to embed them in pages
@@ -0,0 +1,55 @@
1
+ ---
2
+ name: obsidian
3
+ description: Work with Obsidian vaults (plain Markdown notes) and automate via obsidian-cli.
4
+ homepage: https://help.obsidian.md
5
+ metadata: {"clawdbot":{"emoji":"💎","requires":{"bins":["obsidian-cli"]},"install":[{"id":"brew","kind":"brew","formula":"yakitrak/yakitrak/obsidian-cli","bins":["obsidian-cli"],"label":"Install obsidian-cli (brew)"}]}}
6
+ ---
7
+
8
+ # Obsidian
9
+
10
+ Obsidian vault = a normal folder on disk.
11
+
12
+ Vault structure (typical)
13
+ - Notes: `*.md` (plain text Markdown; edit with any editor)
14
+ - Config: `.obsidian/` (workspace + plugin settings; usually don’t touch from scripts)
15
+ - Canvases: `*.canvas` (JSON)
16
+ - Attachments: whatever folder you chose in Obsidian settings (images/PDFs/etc.)
17
+
18
+ ## Find the active vault(s)
19
+
20
+ Obsidian desktop tracks vaults here (source of truth):
21
+ - `~/Library/Application Support/obsidian/obsidian.json`
22
+
23
+ `obsidian-cli` resolves vaults from that file; vault name is typically the **folder name** (path suffix).
24
+
25
+ Fast “what vault is active / where are the notes?”
26
+ - If you’ve already set a default: `obsidian-cli print-default --path-only`
27
+ - Otherwise, read `~/Library/Application Support/obsidian/obsidian.json` and use the vault entry with `"open": true`.
28
+
29
+ Notes
30
+ - Multiple vaults common (iCloud vs `~/Documents`, work/personal, etc.). Don’t guess; read config.
31
+ - Avoid writing hardcoded vault paths into scripts; prefer reading the config or using `print-default`.
32
+
33
+ ## obsidian-cli quick start
34
+
35
+ Pick a default vault (once):
36
+ - `obsidian-cli set-default "<vault-folder-name>"`
37
+ - `obsidian-cli print-default` / `obsidian-cli print-default --path-only`
38
+
39
+ Search
40
+ - `obsidian-cli search "query"` (note names)
41
+ - `obsidian-cli search-content "query"` (inside notes; shows snippets + lines)
42
+
43
+ Create
44
+ - `obsidian-cli create "Folder/New note" --content "..." --open`
45
+ - Requires Obsidian URI handler (`obsidian://…`) working (Obsidian installed).
46
+ - Avoid creating notes under “hidden” dot-folders (e.g. `.something/...`) via URI; Obsidian may refuse.
47
+
48
+ Move/rename (safe refactor)
49
+ - `obsidian-cli move "old/path/note" "new/path/note"`
50
+ - Updates `[[wikilinks]]` and common Markdown links across the vault (this is the main win vs `mv`).
51
+
52
+ Delete
53
+ - `obsidian-cli delete "path/note"`
54
+
55
+ Prefer direct edits when appropriate: open the `.md` file and change it; Obsidian will pick it up.
@@ -0,0 +1,31 @@
1
+ ---
2
+ name: openai-image-gen
3
+ description: Batch-generate images via OpenAI Images API. Random prompt sampler + `index.html` gallery.
4
+ homepage: https://platform.openai.com/docs/api-reference/images
5
+ metadata: {"clawdbot":{"emoji":"🖼️","requires":{"bins":["python3"],"env":["OPENAI_API_KEY"]},"primaryEnv":"OPENAI_API_KEY","install":[{"id":"python-brew","kind":"brew","formula":"python","bins":["python3"],"label":"Install Python (brew)"}]}}
6
+ ---
7
+
8
+ # OpenAI Image Gen
9
+
10
+ Generate a handful of “random but structured” prompts and render them via the OpenAI Images API.
11
+
12
+ ## Run
13
+
14
+ ```bash
15
+ python3 {baseDir}/scripts/gen.py
16
+ open ~/Projects/tmp/openai-image-gen-*/index.html # if ~/Projects/tmp exists; else ./tmp/...
17
+ ```
18
+
19
+ Useful flags:
20
+
21
+ ```bash
22
+ python3 {baseDir}/scripts/gen.py --count 16 --model gpt-image-1
23
+ python3 {baseDir}/scripts/gen.py --prompt "ultra-detailed studio photo of a lobster astronaut" --count 4
24
+ python3 {baseDir}/scripts/gen.py --size 1536x1024 --quality high --out-dir ./out/images
25
+ ```
26
+
27
+ ## Output
28
+
29
+ - `*.png` images
30
+ - `prompts.json` (prompt → file mapping)
31
+ - `index.html` (thumbnail gallery)
@@ -0,0 +1,173 @@
1
+ #!/usr/bin/env python3
2
+ import argparse
3
+ import base64
4
+ import datetime as dt
5
+ import json
6
+ import os
7
+ import random
8
+ import re
9
+ import sys
10
+ import urllib.error
11
+ import urllib.request
12
+ from pathlib import Path
13
+
14
+
15
+ def slugify(text: str) -> str:
16
+ text = text.lower().strip()
17
+ text = re.sub(r"[^a-z0-9]+", "-", text)
18
+ text = re.sub(r"-{2,}", "-", text).strip("-")
19
+ return text or "image"
20
+
21
+
22
+ def default_out_dir() -> Path:
23
+ now = dt.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
24
+ preferred = Path.home() / "Projects" / "tmp"
25
+ base = preferred if preferred.is_dir() else Path("./tmp")
26
+ base.mkdir(parents=True, exist_ok=True)
27
+ return base / f"openai-image-gen-{now}"
28
+
29
+
30
+ def pick_prompts(count: int) -> list[str]:
31
+ subjects = [
32
+ "a lobster astronaut",
33
+ "a brutalist lighthouse",
34
+ "a cozy reading nook",
35
+ "a cyberpunk noodle shop",
36
+ "a Vienna street at dusk",
37
+ "a minimalist product photo",
38
+ "a surreal underwater library",
39
+ ]
40
+ styles = [
41
+ "ultra-detailed studio photo",
42
+ "35mm film still",
43
+ "isometric illustration",
44
+ "editorial photography",
45
+ "soft watercolor",
46
+ "architectural render",
47
+ "high-contrast monochrome",
48
+ ]
49
+ lighting = [
50
+ "golden hour",
51
+ "overcast soft light",
52
+ "neon lighting",
53
+ "dramatic rim light",
54
+ "candlelight",
55
+ "foggy atmosphere",
56
+ ]
57
+ prompts: list[str] = []
58
+ for _ in range(count):
59
+ prompts.append(
60
+ f"{random.choice(styles)} of {random.choice(subjects)}, {random.choice(lighting)}"
61
+ )
62
+ return prompts
63
+
64
+
65
+ def request_images(
66
+ api_key: str,
67
+ prompt: str,
68
+ model: str,
69
+ size: str,
70
+ quality: str,
71
+ ) -> dict:
72
+ url = "https://api.openai.com/v1/images/generations"
73
+ body = json.dumps(
74
+ {
75
+ "model": model,
76
+ "prompt": prompt,
77
+ "size": size,
78
+ "quality": quality,
79
+ "n": 1,
80
+ "response_format": "b64_json",
81
+ }
82
+ ).encode("utf-8")
83
+ req = urllib.request.Request(
84
+ url,
85
+ method="POST",
86
+ headers={
87
+ "Authorization": f"Bearer {api_key}",
88
+ "Content-Type": "application/json",
89
+ },
90
+ data=body,
91
+ )
92
+ try:
93
+ with urllib.request.urlopen(req, timeout=300) as resp:
94
+ return json.loads(resp.read().decode("utf-8"))
95
+ except urllib.error.HTTPError as e:
96
+ payload = e.read().decode("utf-8", errors="replace")
97
+ raise RuntimeError(f"OpenAI Images API failed ({e.code}): {payload}") from e
98
+
99
+
100
+ def write_gallery(out_dir: Path, items: list[dict]) -> None:
101
+ thumbs = "\n".join(
102
+ [
103
+ f"""
104
+ <figure>
105
+ <a href="{it["file"]}"><img src="{it["file"]}" loading="lazy" /></a>
106
+ <figcaption>{it["prompt"]}</figcaption>
107
+ </figure>
108
+ """.strip()
109
+ for it in items
110
+ ]
111
+ )
112
+ html = f"""<!doctype html>
113
+ <meta charset="utf-8" />
114
+ <title>openai-image-gen</title>
115
+ <style>
116
+ :root {{ color-scheme: dark; }}
117
+ body {{ margin: 24px; font: 14px/1.4 ui-sans-serif, system-ui; background: #0b0f14; color: #e8edf2; }}
118
+ h1 {{ font-size: 18px; margin: 0 0 16px; }}
119
+ .grid {{ display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 16px; }}
120
+ figure {{ margin: 0; padding: 12px; border: 1px solid #1e2a36; border-radius: 14px; background: #0f1620; }}
121
+ img {{ width: 100%; height: auto; border-radius: 10px; display: block; }}
122
+ figcaption {{ margin-top: 10px; color: #b7c2cc; }}
123
+ code {{ color: #9cd1ff; }}
124
+ </style>
125
+ <h1>openai-image-gen</h1>
126
+ <p>Output: <code>{out_dir.as_posix()}</code></p>
127
+ <div class="grid">
128
+ {thumbs}
129
+ </div>
130
+ """
131
+ (out_dir / "index.html").write_text(html, encoding="utf-8")
132
+
133
+
134
+ def main() -> int:
135
+ ap = argparse.ArgumentParser(description="Generate images via OpenAI Images API.")
136
+ ap.add_argument("--prompt", help="Single prompt. If omitted, random prompts are generated.")
137
+ ap.add_argument("--count", type=int, default=8, help="How many images to generate.")
138
+ ap.add_argument("--model", default="gpt-image-1", help="Image model id.")
139
+ ap.add_argument("--size", default="1024x1024", help="Image size (e.g. 1024x1024, 1536x1024).")
140
+ ap.add_argument("--quality", default="high", help="Image quality (varies by model).")
141
+ ap.add_argument("--out-dir", default="", help="Output directory (default: ./tmp/openai-image-gen-<ts>).")
142
+ args = ap.parse_args()
143
+
144
+ api_key = (os.environ.get("OPENAI_API_KEY") or "").strip()
145
+ if not api_key:
146
+ print("Missing OPENAI_API_KEY", file=sys.stderr)
147
+ return 2
148
+
149
+ out_dir = Path(args.out_dir).expanduser() if args.out_dir else default_out_dir()
150
+ out_dir.mkdir(parents=True, exist_ok=True)
151
+
152
+ prompts = [args.prompt] * args.count if args.prompt else pick_prompts(args.count)
153
+
154
+ items: list[dict] = []
155
+ for idx, prompt in enumerate(prompts, start=1):
156
+ print(f"[{idx}/{len(prompts)}] {prompt}")
157
+ res = request_images(api_key, prompt, args.model, args.size, args.quality)
158
+ b64 = res.get("data", [{}])[0].get("b64_json")
159
+ if not b64:
160
+ raise RuntimeError(f"Unexpected response: {json.dumps(res)[:400]}")
161
+ png = base64.b64decode(b64)
162
+ filename = f"{idx:03d}-{slugify(prompt)[:40]}.png"
163
+ (out_dir / filename).write_bytes(png)
164
+ items.append({"prompt": prompt, "file": filename})
165
+
166
+ (out_dir / "prompts.json").write_text(json.dumps(items, indent=2), encoding="utf-8")
167
+ write_gallery(out_dir, items)
168
+ print(f"\nWrote: {(out_dir / 'index.html').as_posix()}")
169
+ return 0
170
+
171
+
172
+ if __name__ == "__main__":
173
+ raise SystemExit(main())
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: openai-whisper
3
+ description: Local speech-to-text with the Whisper CLI (no API key).
4
+ homepage: https://openai.com/research/whisper
5
+ metadata: {"clawdbot":{"emoji":"🎙️","requires":{"bins":["whisper"]},"install":[{"id":"brew","kind":"brew","formula":"openai-whisper","bins":["whisper"],"label":"Install OpenAI Whisper (brew)"}]}}
6
+ ---
7
+
8
+ # Whisper (CLI)
9
+
10
+ Use `whisper` to transcribe audio locally.
11
+
12
+ Quick start
13
+ - `whisper /path/audio.mp3 --model medium --output_format txt --output_dir .`
14
+ - `whisper /path/audio.m4a --task translate --output_format srt`
15
+
16
+ Notes
17
+ - Models download to `~/.cache/whisper` on first run.
18
+ - `--model` defaults to `turbo` on this install.
19
+ - Use smaller models for speed, larger for accuracy.
@@ -0,0 +1,43 @@
1
+ ---
2
+ name: openai-whisper-api
3
+ description: Transcribe audio via OpenAI Audio Transcriptions API (Whisper).
4
+ homepage: https://platform.openai.com/docs/guides/speech-to-text
5
+ metadata: {"clawdbot":{"emoji":"☁️","requires":{"bins":["curl"],"env":["OPENAI_API_KEY"]},"primaryEnv":"OPENAI_API_KEY"}}
6
+ ---
7
+
8
+ # OpenAI Whisper API (curl)
9
+
10
+ Transcribe an audio file via OpenAI’s `/v1/audio/transcriptions` endpoint.
11
+
12
+ ## Quick start
13
+
14
+ ```bash
15
+ {baseDir}/scripts/transcribe.sh /path/to/audio.m4a
16
+ ```
17
+
18
+ Defaults:
19
+ - Model: `whisper-1`
20
+ - Output: `<input>.txt`
21
+
22
+ ## Useful flags
23
+
24
+ ```bash
25
+ {baseDir}/scripts/transcribe.sh /path/to/audio.ogg --model whisper-1 --out /tmp/transcript.txt
26
+ {baseDir}/scripts/transcribe.sh /path/to/audio.m4a --language en
27
+ {baseDir}/scripts/transcribe.sh /path/to/audio.m4a --prompt "Speaker names: Peter, Daniel"
28
+ {baseDir}/scripts/transcribe.sh /path/to/audio.m4a --json --out /tmp/transcript.json
29
+ ```
30
+
31
+ ## API key
32
+
33
+ Set `OPENAI_API_KEY`, or configure it in `~/.clawdbot/clawdbot.json`:
34
+
35
+ ```json5
36
+ {
37
+ skills: {
38
+ "openai-whisper-api": {
39
+ apiKey: "OPENAI_KEY_HERE"
40
+ }
41
+ }
42
+ }
43
+ ```