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,88 @@
1
+ import fs from "node:fs/promises";
2
+ import { detectMime } from "../../media/mime.js";
3
+ import { sanitizeToolResultImages } from "../tool-images.js";
4
+ export function readStringParam(params, key, options = {}) {
5
+ const { required = false, trim = true, label = key } = options;
6
+ const raw = params[key];
7
+ if (typeof raw !== "string") {
8
+ if (required)
9
+ throw new Error(`${label} required`);
10
+ return undefined;
11
+ }
12
+ const value = trim ? raw.trim() : raw;
13
+ if (!value) {
14
+ if (required)
15
+ throw new Error(`${label} required`);
16
+ return undefined;
17
+ }
18
+ return value;
19
+ }
20
+ export function readStringArrayParam(params, key, options = {}) {
21
+ const { required = false, label = key } = options;
22
+ const raw = params[key];
23
+ if (Array.isArray(raw)) {
24
+ const values = raw
25
+ .filter((entry) => typeof entry === "string")
26
+ .map((entry) => entry.trim())
27
+ .filter(Boolean);
28
+ if (values.length === 0) {
29
+ if (required)
30
+ throw new Error(`${label} required`);
31
+ return undefined;
32
+ }
33
+ return values;
34
+ }
35
+ if (typeof raw === "string") {
36
+ const value = raw.trim();
37
+ if (!value) {
38
+ if (required)
39
+ throw new Error(`${label} required`);
40
+ return undefined;
41
+ }
42
+ return [value];
43
+ }
44
+ if (required)
45
+ throw new Error(`${label} required`);
46
+ return undefined;
47
+ }
48
+ export function jsonResult(payload) {
49
+ return {
50
+ content: [
51
+ {
52
+ type: "text",
53
+ text: JSON.stringify(payload, null, 2),
54
+ },
55
+ ],
56
+ details: payload,
57
+ };
58
+ }
59
+ export async function imageResult(params) {
60
+ const content = [
61
+ {
62
+ type: "text",
63
+ text: params.extraText ?? `MEDIA:${params.path}`,
64
+ },
65
+ {
66
+ type: "image",
67
+ data: params.base64,
68
+ mimeType: params.mimeType,
69
+ },
70
+ ];
71
+ const result = {
72
+ content,
73
+ details: { path: params.path, ...params.details },
74
+ };
75
+ return await sanitizeToolResultImages(result, params.label);
76
+ }
77
+ export async function imageResultFromFile(params) {
78
+ const buf = await fs.readFile(params.path);
79
+ const mimeType = (await detectMime({ buffer: buf.slice(0, 256) })) ?? "image/png";
80
+ return await imageResult({
81
+ label: params.label,
82
+ path: params.path,
83
+ base64: buf.toString("base64"),
84
+ mimeType,
85
+ extraText: params.extraText,
86
+ details: params.details,
87
+ });
88
+ }
@@ -0,0 +1,124 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { jsonResult, readStringParam } from "./common.js";
3
+ import { callGatewayTool } from "./gateway.js";
4
+ const CronToolSchema = Type.Union([
5
+ Type.Object({
6
+ action: Type.Literal("status"),
7
+ gatewayUrl: Type.Optional(Type.String()),
8
+ gatewayToken: Type.Optional(Type.String()),
9
+ timeoutMs: Type.Optional(Type.Number()),
10
+ }),
11
+ Type.Object({
12
+ action: Type.Literal("list"),
13
+ gatewayUrl: Type.Optional(Type.String()),
14
+ gatewayToken: Type.Optional(Type.String()),
15
+ timeoutMs: Type.Optional(Type.Number()),
16
+ includeDisabled: Type.Optional(Type.Boolean()),
17
+ }),
18
+ Type.Object({
19
+ action: Type.Literal("add"),
20
+ gatewayUrl: Type.Optional(Type.String()),
21
+ gatewayToken: Type.Optional(Type.String()),
22
+ timeoutMs: Type.Optional(Type.Number()),
23
+ job: Type.Object({}, { additionalProperties: true }),
24
+ }),
25
+ Type.Object({
26
+ action: Type.Literal("update"),
27
+ gatewayUrl: Type.Optional(Type.String()),
28
+ gatewayToken: Type.Optional(Type.String()),
29
+ timeoutMs: Type.Optional(Type.Number()),
30
+ jobId: Type.String(),
31
+ patch: Type.Object({}, { additionalProperties: true }),
32
+ }),
33
+ Type.Object({
34
+ action: Type.Literal("remove"),
35
+ gatewayUrl: Type.Optional(Type.String()),
36
+ gatewayToken: Type.Optional(Type.String()),
37
+ timeoutMs: Type.Optional(Type.Number()),
38
+ jobId: Type.String(),
39
+ }),
40
+ Type.Object({
41
+ action: Type.Literal("run"),
42
+ gatewayUrl: Type.Optional(Type.String()),
43
+ gatewayToken: Type.Optional(Type.String()),
44
+ timeoutMs: Type.Optional(Type.Number()),
45
+ jobId: Type.String(),
46
+ }),
47
+ Type.Object({
48
+ action: Type.Literal("runs"),
49
+ gatewayUrl: Type.Optional(Type.String()),
50
+ gatewayToken: Type.Optional(Type.String()),
51
+ timeoutMs: Type.Optional(Type.Number()),
52
+ jobId: Type.String(),
53
+ }),
54
+ Type.Object({
55
+ action: Type.Literal("wake"),
56
+ gatewayUrl: Type.Optional(Type.String()),
57
+ gatewayToken: Type.Optional(Type.String()),
58
+ timeoutMs: Type.Optional(Type.Number()),
59
+ text: Type.String(),
60
+ mode: Type.Optional(Type.Union([Type.Literal("now"), Type.Literal("next-heartbeat")])),
61
+ }),
62
+ ]);
63
+ export function createCronTool() {
64
+ return {
65
+ label: "Cron",
66
+ name: "cron",
67
+ description: "Manage Gateway cron jobs (status/list/add/update/remove/run/runs) and send wake events.",
68
+ parameters: CronToolSchema,
69
+ execute: async (_toolCallId, args) => {
70
+ const params = args;
71
+ const action = readStringParam(params, "action", { required: true });
72
+ const gatewayOpts = {
73
+ gatewayUrl: readStringParam(params, "gatewayUrl", { trim: false }),
74
+ gatewayToken: readStringParam(params, "gatewayToken", { trim: false }),
75
+ timeoutMs: typeof params.timeoutMs === "number" ? params.timeoutMs : undefined,
76
+ };
77
+ switch (action) {
78
+ case "status":
79
+ return jsonResult(await callGatewayTool("cron.status", gatewayOpts, {}));
80
+ case "list":
81
+ return jsonResult(await callGatewayTool("cron.list", gatewayOpts, {
82
+ includeDisabled: Boolean(params.includeDisabled),
83
+ }));
84
+ case "add": {
85
+ if (!params.job || typeof params.job !== "object") {
86
+ throw new Error("job required");
87
+ }
88
+ return jsonResult(await callGatewayTool("cron.add", gatewayOpts, params.job));
89
+ }
90
+ case "update": {
91
+ const id = readStringParam(params, "jobId", { required: true });
92
+ if (!params.patch || typeof params.patch !== "object") {
93
+ throw new Error("patch required");
94
+ }
95
+ return jsonResult(await callGatewayTool("cron.update", gatewayOpts, {
96
+ id,
97
+ patch: params.patch,
98
+ }));
99
+ }
100
+ case "remove": {
101
+ const id = readStringParam(params, "jobId", { required: true });
102
+ return jsonResult(await callGatewayTool("cron.remove", gatewayOpts, { id }));
103
+ }
104
+ case "run": {
105
+ const id = readStringParam(params, "jobId", { required: true });
106
+ return jsonResult(await callGatewayTool("cron.run", gatewayOpts, { id }));
107
+ }
108
+ case "runs": {
109
+ const id = readStringParam(params, "jobId", { required: true });
110
+ return jsonResult(await callGatewayTool("cron.runs", gatewayOpts, { id }));
111
+ }
112
+ case "wake": {
113
+ const text = readStringParam(params, "text", { required: true });
114
+ const mode = params.mode === "now" || params.mode === "next-heartbeat"
115
+ ? params.mode
116
+ : "next-heartbeat";
117
+ return jsonResult(await callGatewayTool("wake", gatewayOpts, { mode, text }, { expectFinal: false }));
118
+ }
119
+ default:
120
+ throw new Error(`Unknown action: ${action}`);
121
+ }
122
+ },
123
+ };
124
+ }
@@ -0,0 +1,186 @@
1
+ import { addRoleDiscord, createScheduledEventDiscord, fetchChannelInfoDiscord, fetchMemberInfoDiscord, fetchRoleInfoDiscord, fetchVoiceStatusDiscord, listGuildChannelsDiscord, listGuildEmojisDiscord, listScheduledEventsDiscord, removeRoleDiscord, uploadEmojiDiscord, uploadStickerDiscord, } from "../../discord/send.js";
2
+ import { jsonResult, readStringArrayParam, readStringParam } from "./common.js";
3
+ export async function handleDiscordGuildAction(action, params, isActionEnabled) {
4
+ switch (action) {
5
+ case "memberInfo": {
6
+ if (!isActionEnabled("memberInfo")) {
7
+ throw new Error("Discord member info is disabled.");
8
+ }
9
+ const guildId = readStringParam(params, "guildId", {
10
+ required: true,
11
+ });
12
+ const userId = readStringParam(params, "userId", {
13
+ required: true,
14
+ });
15
+ const member = await fetchMemberInfoDiscord(guildId, userId);
16
+ return jsonResult({ ok: true, member });
17
+ }
18
+ case "roleInfo": {
19
+ if (!isActionEnabled("roleInfo")) {
20
+ throw new Error("Discord role info is disabled.");
21
+ }
22
+ const guildId = readStringParam(params, "guildId", {
23
+ required: true,
24
+ });
25
+ const roles = await fetchRoleInfoDiscord(guildId);
26
+ return jsonResult({ ok: true, roles });
27
+ }
28
+ case "emojiList": {
29
+ if (!isActionEnabled("reactions")) {
30
+ throw new Error("Discord reactions are disabled.");
31
+ }
32
+ const guildId = readStringParam(params, "guildId", {
33
+ required: true,
34
+ });
35
+ const emojis = await listGuildEmojisDiscord(guildId);
36
+ return jsonResult({ ok: true, emojis });
37
+ }
38
+ case "emojiUpload": {
39
+ if (!isActionEnabled("emojiUploads")) {
40
+ throw new Error("Discord emoji uploads are disabled.");
41
+ }
42
+ const guildId = readStringParam(params, "guildId", {
43
+ required: true,
44
+ });
45
+ const name = readStringParam(params, "name", { required: true });
46
+ const mediaUrl = readStringParam(params, "mediaUrl", {
47
+ required: true,
48
+ });
49
+ const roleIds = readStringArrayParam(params, "roleIds");
50
+ const emoji = await uploadEmojiDiscord({
51
+ guildId,
52
+ name,
53
+ mediaUrl,
54
+ roleIds: roleIds?.length ? roleIds : undefined,
55
+ });
56
+ return jsonResult({ ok: true, emoji });
57
+ }
58
+ case "stickerUpload": {
59
+ if (!isActionEnabled("stickerUploads")) {
60
+ throw new Error("Discord sticker uploads are disabled.");
61
+ }
62
+ const guildId = readStringParam(params, "guildId", {
63
+ required: true,
64
+ });
65
+ const name = readStringParam(params, "name", { required: true });
66
+ const description = readStringParam(params, "description", {
67
+ required: true,
68
+ });
69
+ const tags = readStringParam(params, "tags", { required: true });
70
+ const mediaUrl = readStringParam(params, "mediaUrl", {
71
+ required: true,
72
+ });
73
+ const sticker = await uploadStickerDiscord({
74
+ guildId,
75
+ name,
76
+ description,
77
+ tags,
78
+ mediaUrl,
79
+ });
80
+ return jsonResult({ ok: true, sticker });
81
+ }
82
+ case "roleAdd": {
83
+ if (!isActionEnabled("roles", false)) {
84
+ throw new Error("Discord role changes are disabled.");
85
+ }
86
+ const guildId = readStringParam(params, "guildId", {
87
+ required: true,
88
+ });
89
+ const userId = readStringParam(params, "userId", {
90
+ required: true,
91
+ });
92
+ const roleId = readStringParam(params, "roleId", { required: true });
93
+ await addRoleDiscord({ guildId, userId, roleId });
94
+ return jsonResult({ ok: true });
95
+ }
96
+ case "roleRemove": {
97
+ if (!isActionEnabled("roles", false)) {
98
+ throw new Error("Discord role changes are disabled.");
99
+ }
100
+ const guildId = readStringParam(params, "guildId", {
101
+ required: true,
102
+ });
103
+ const userId = readStringParam(params, "userId", {
104
+ required: true,
105
+ });
106
+ const roleId = readStringParam(params, "roleId", { required: true });
107
+ await removeRoleDiscord({ guildId, userId, roleId });
108
+ return jsonResult({ ok: true });
109
+ }
110
+ case "channelInfo": {
111
+ if (!isActionEnabled("channelInfo")) {
112
+ throw new Error("Discord channel info is disabled.");
113
+ }
114
+ const channelId = readStringParam(params, "channelId", {
115
+ required: true,
116
+ });
117
+ const channel = await fetchChannelInfoDiscord(channelId);
118
+ return jsonResult({ ok: true, channel });
119
+ }
120
+ case "channelList": {
121
+ if (!isActionEnabled("channelInfo")) {
122
+ throw new Error("Discord channel info is disabled.");
123
+ }
124
+ const guildId = readStringParam(params, "guildId", {
125
+ required: true,
126
+ });
127
+ const channels = await listGuildChannelsDiscord(guildId);
128
+ return jsonResult({ ok: true, channels });
129
+ }
130
+ case "voiceStatus": {
131
+ if (!isActionEnabled("voiceStatus")) {
132
+ throw new Error("Discord voice status is disabled.");
133
+ }
134
+ const guildId = readStringParam(params, "guildId", {
135
+ required: true,
136
+ });
137
+ const userId = readStringParam(params, "userId", {
138
+ required: true,
139
+ });
140
+ const voice = await fetchVoiceStatusDiscord(guildId, userId);
141
+ return jsonResult({ ok: true, voice });
142
+ }
143
+ case "eventList": {
144
+ if (!isActionEnabled("events")) {
145
+ throw new Error("Discord events are disabled.");
146
+ }
147
+ const guildId = readStringParam(params, "guildId", {
148
+ required: true,
149
+ });
150
+ const events = await listScheduledEventsDiscord(guildId);
151
+ return jsonResult({ ok: true, events });
152
+ }
153
+ case "eventCreate": {
154
+ if (!isActionEnabled("events")) {
155
+ throw new Error("Discord events are disabled.");
156
+ }
157
+ const guildId = readStringParam(params, "guildId", {
158
+ required: true,
159
+ });
160
+ const name = readStringParam(params, "name", { required: true });
161
+ const startTime = readStringParam(params, "startTime", {
162
+ required: true,
163
+ });
164
+ const endTime = readStringParam(params, "endTime");
165
+ const description = readStringParam(params, "description");
166
+ const channelId = readStringParam(params, "channelId");
167
+ const location = readStringParam(params, "location");
168
+ const entityTypeRaw = readStringParam(params, "entityType");
169
+ const entityType = entityTypeRaw === "stage" ? 1 : entityTypeRaw === "external" ? 3 : 2;
170
+ const payload = {
171
+ name,
172
+ description,
173
+ scheduled_start_time: startTime,
174
+ scheduled_end_time: endTime,
175
+ entity_type: entityType,
176
+ channel_id: channelId,
177
+ entity_metadata: entityType === 3 && location ? { location } : undefined,
178
+ privacy_level: 2,
179
+ };
180
+ const event = await createScheduledEventDiscord(guildId, payload);
181
+ return jsonResult({ ok: true, event });
182
+ }
183
+ default:
184
+ throw new Error(`Unknown action: ${action}`);
185
+ }
186
+ }
@@ -0,0 +1,285 @@
1
+ import { createThreadDiscord, deleteMessageDiscord, editMessageDiscord, fetchChannelPermissionsDiscord, fetchReactionsDiscord, listPinsDiscord, listThreadsDiscord, pinMessageDiscord, reactMessageDiscord, readMessagesDiscord, searchMessagesDiscord, sendMessageDiscord, sendPollDiscord, sendStickerDiscord, unpinMessageDiscord, } from "../../discord/send.js";
2
+ import { jsonResult, readStringArrayParam, readStringParam } from "./common.js";
3
+ export async function handleDiscordMessagingAction(action, params, isActionEnabled) {
4
+ switch (action) {
5
+ case "react": {
6
+ if (!isActionEnabled("reactions")) {
7
+ throw new Error("Discord reactions are disabled.");
8
+ }
9
+ const channelId = readStringParam(params, "channelId", {
10
+ required: true,
11
+ });
12
+ const messageId = readStringParam(params, "messageId", {
13
+ required: true,
14
+ });
15
+ const emoji = readStringParam(params, "emoji", { required: true });
16
+ await reactMessageDiscord(channelId, messageId, emoji);
17
+ return jsonResult({ ok: true });
18
+ }
19
+ case "reactions": {
20
+ if (!isActionEnabled("reactions")) {
21
+ throw new Error("Discord reactions are disabled.");
22
+ }
23
+ const channelId = readStringParam(params, "channelId", {
24
+ required: true,
25
+ });
26
+ const messageId = readStringParam(params, "messageId", {
27
+ required: true,
28
+ });
29
+ const limitRaw = params.limit;
30
+ const limit = typeof limitRaw === "number" && Number.isFinite(limitRaw)
31
+ ? limitRaw
32
+ : undefined;
33
+ const reactions = await fetchReactionsDiscord(channelId, messageId, {
34
+ limit,
35
+ });
36
+ return jsonResult({ ok: true, reactions });
37
+ }
38
+ case "sticker": {
39
+ if (!isActionEnabled("stickers")) {
40
+ throw new Error("Discord stickers are disabled.");
41
+ }
42
+ const to = readStringParam(params, "to", { required: true });
43
+ const content = readStringParam(params, "content");
44
+ const stickerIds = readStringArrayParam(params, "stickerIds", {
45
+ required: true,
46
+ label: "stickerIds",
47
+ });
48
+ await sendStickerDiscord(to, stickerIds, { content });
49
+ return jsonResult({ ok: true });
50
+ }
51
+ case "poll": {
52
+ if (!isActionEnabled("polls")) {
53
+ throw new Error("Discord polls are disabled.");
54
+ }
55
+ const to = readStringParam(params, "to", { required: true });
56
+ const content = readStringParam(params, "content");
57
+ const question = readStringParam(params, "question", {
58
+ required: true,
59
+ });
60
+ const answers = readStringArrayParam(params, "answers", {
61
+ required: true,
62
+ label: "answers",
63
+ });
64
+ const allowMultiselectRaw = params.allowMultiselect;
65
+ const allowMultiselect = typeof allowMultiselectRaw === "boolean"
66
+ ? allowMultiselectRaw
67
+ : undefined;
68
+ const durationRaw = params.durationHours;
69
+ const durationHours = typeof durationRaw === "number" && Number.isFinite(durationRaw)
70
+ ? durationRaw
71
+ : undefined;
72
+ await sendPollDiscord(to, { question, answers, allowMultiselect, durationHours }, { content });
73
+ return jsonResult({ ok: true });
74
+ }
75
+ case "permissions": {
76
+ if (!isActionEnabled("permissions")) {
77
+ throw new Error("Discord permissions are disabled.");
78
+ }
79
+ const channelId = readStringParam(params, "channelId", {
80
+ required: true,
81
+ });
82
+ const permissions = await fetchChannelPermissionsDiscord(channelId);
83
+ return jsonResult({ ok: true, permissions });
84
+ }
85
+ case "readMessages": {
86
+ if (!isActionEnabled("messages")) {
87
+ throw new Error("Discord message reads are disabled.");
88
+ }
89
+ const channelId = readStringParam(params, "channelId", {
90
+ required: true,
91
+ });
92
+ const messages = await readMessagesDiscord(channelId, {
93
+ limit: typeof params.limit === "number" && Number.isFinite(params.limit)
94
+ ? params.limit
95
+ : undefined,
96
+ before: readStringParam(params, "before"),
97
+ after: readStringParam(params, "after"),
98
+ around: readStringParam(params, "around"),
99
+ });
100
+ return jsonResult({ ok: true, messages });
101
+ }
102
+ case "sendMessage": {
103
+ if (!isActionEnabled("messages")) {
104
+ throw new Error("Discord message sends are disabled.");
105
+ }
106
+ const to = readStringParam(params, "to", { required: true });
107
+ const content = readStringParam(params, "content", {
108
+ required: true,
109
+ });
110
+ const mediaUrl = readStringParam(params, "mediaUrl");
111
+ const replyTo = readStringParam(params, "replyTo");
112
+ const result = await sendMessageDiscord(to, content, {
113
+ mediaUrl,
114
+ replyTo,
115
+ });
116
+ return jsonResult({ ok: true, result });
117
+ }
118
+ case "editMessage": {
119
+ if (!isActionEnabled("messages")) {
120
+ throw new Error("Discord message edits are disabled.");
121
+ }
122
+ const channelId = readStringParam(params, "channelId", {
123
+ required: true,
124
+ });
125
+ const messageId = readStringParam(params, "messageId", {
126
+ required: true,
127
+ });
128
+ const content = readStringParam(params, "content", {
129
+ required: true,
130
+ });
131
+ const message = await editMessageDiscord(channelId, messageId, {
132
+ content,
133
+ });
134
+ return jsonResult({ ok: true, message });
135
+ }
136
+ case "deleteMessage": {
137
+ if (!isActionEnabled("messages")) {
138
+ throw new Error("Discord message deletes are disabled.");
139
+ }
140
+ const channelId = readStringParam(params, "channelId", {
141
+ required: true,
142
+ });
143
+ const messageId = readStringParam(params, "messageId", {
144
+ required: true,
145
+ });
146
+ await deleteMessageDiscord(channelId, messageId);
147
+ return jsonResult({ ok: true });
148
+ }
149
+ case "threadCreate": {
150
+ if (!isActionEnabled("threads")) {
151
+ throw new Error("Discord threads are disabled.");
152
+ }
153
+ const channelId = readStringParam(params, "channelId", {
154
+ required: true,
155
+ });
156
+ const name = readStringParam(params, "name", { required: true });
157
+ const messageId = readStringParam(params, "messageId");
158
+ const autoArchiveMinutesRaw = params.autoArchiveMinutes;
159
+ const autoArchiveMinutes = typeof autoArchiveMinutesRaw === "number" &&
160
+ Number.isFinite(autoArchiveMinutesRaw)
161
+ ? autoArchiveMinutesRaw
162
+ : undefined;
163
+ const thread = await createThreadDiscord(channelId, {
164
+ name,
165
+ messageId,
166
+ autoArchiveMinutes,
167
+ });
168
+ return jsonResult({ ok: true, thread });
169
+ }
170
+ case "threadList": {
171
+ if (!isActionEnabled("threads")) {
172
+ throw new Error("Discord threads are disabled.");
173
+ }
174
+ const guildId = readStringParam(params, "guildId", {
175
+ required: true,
176
+ });
177
+ const channelId = readStringParam(params, "channelId");
178
+ const includeArchived = typeof params.includeArchived === "boolean"
179
+ ? params.includeArchived
180
+ : undefined;
181
+ const before = readStringParam(params, "before");
182
+ const limit = typeof params.limit === "number" && Number.isFinite(params.limit)
183
+ ? params.limit
184
+ : undefined;
185
+ const threads = await listThreadsDiscord({
186
+ guildId,
187
+ channelId,
188
+ includeArchived,
189
+ before,
190
+ limit,
191
+ });
192
+ return jsonResult({ ok: true, threads });
193
+ }
194
+ case "threadReply": {
195
+ if (!isActionEnabled("threads")) {
196
+ throw new Error("Discord threads are disabled.");
197
+ }
198
+ const channelId = readStringParam(params, "channelId", {
199
+ required: true,
200
+ });
201
+ const content = readStringParam(params, "content", {
202
+ required: true,
203
+ });
204
+ const mediaUrl = readStringParam(params, "mediaUrl");
205
+ const replyTo = readStringParam(params, "replyTo");
206
+ const result = await sendMessageDiscord(`channel:${channelId}`, content, {
207
+ mediaUrl,
208
+ replyTo,
209
+ });
210
+ return jsonResult({ ok: true, result });
211
+ }
212
+ case "pinMessage": {
213
+ if (!isActionEnabled("pins")) {
214
+ throw new Error("Discord pins are disabled.");
215
+ }
216
+ const channelId = readStringParam(params, "channelId", {
217
+ required: true,
218
+ });
219
+ const messageId = readStringParam(params, "messageId", {
220
+ required: true,
221
+ });
222
+ await pinMessageDiscord(channelId, messageId);
223
+ return jsonResult({ ok: true });
224
+ }
225
+ case "unpinMessage": {
226
+ if (!isActionEnabled("pins")) {
227
+ throw new Error("Discord pins are disabled.");
228
+ }
229
+ const channelId = readStringParam(params, "channelId", {
230
+ required: true,
231
+ });
232
+ const messageId = readStringParam(params, "messageId", {
233
+ required: true,
234
+ });
235
+ await unpinMessageDiscord(channelId, messageId);
236
+ return jsonResult({ ok: true });
237
+ }
238
+ case "listPins": {
239
+ if (!isActionEnabled("pins")) {
240
+ throw new Error("Discord pins are disabled.");
241
+ }
242
+ const channelId = readStringParam(params, "channelId", {
243
+ required: true,
244
+ });
245
+ const pins = await listPinsDiscord(channelId);
246
+ return jsonResult({ ok: true, pins });
247
+ }
248
+ case "searchMessages": {
249
+ if (!isActionEnabled("search")) {
250
+ throw new Error("Discord search is disabled.");
251
+ }
252
+ const guildId = readStringParam(params, "guildId", {
253
+ required: true,
254
+ });
255
+ const content = readStringParam(params, "content", {
256
+ required: true,
257
+ });
258
+ const channelId = readStringParam(params, "channelId");
259
+ const channelIds = readStringArrayParam(params, "channelIds");
260
+ const authorId = readStringParam(params, "authorId");
261
+ const authorIds = readStringArrayParam(params, "authorIds");
262
+ const limit = typeof params.limit === "number" && Number.isFinite(params.limit)
263
+ ? params.limit
264
+ : undefined;
265
+ const channelIdList = [
266
+ ...(channelIds ?? []),
267
+ ...(channelId ? [channelId] : []),
268
+ ];
269
+ const authorIdList = [
270
+ ...(authorIds ?? []),
271
+ ...(authorId ? [authorId] : []),
272
+ ];
273
+ const results = await searchMessagesDiscord({
274
+ guildId,
275
+ content,
276
+ channelIds: channelIdList.length ? channelIdList : undefined,
277
+ authorIds: authorIdList.length ? authorIdList : undefined,
278
+ limit,
279
+ });
280
+ return jsonResult({ ok: true, results });
281
+ }
282
+ default:
283
+ throw new Error(`Unknown action: ${action}`);
284
+ }
285
+ }