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,282 @@
1
+ import path from "node:path";
2
+ import { pathToFileURL } from "node:url";
3
+ import { CONFIG_PATH_CLAWDBOT, } from "../config/config.js";
4
+ const hookPresetMappings = {
5
+ gmail: [
6
+ {
7
+ id: "gmail",
8
+ match: { path: "gmail" },
9
+ action: "agent",
10
+ wakeMode: "now",
11
+ name: "Gmail",
12
+ sessionKey: "hook:gmail:{{messages[0].id}}",
13
+ messageTemplate: "New email from {{messages[0].from}}\nSubject: {{messages[0].subject}}\n{{messages[0].snippet}}\n{{messages[0].body}}",
14
+ },
15
+ ],
16
+ };
17
+ const transformCache = new Map();
18
+ export function resolveHookMappings(hooks) {
19
+ const presets = hooks?.presets ?? [];
20
+ const mappings = [];
21
+ if (hooks?.mappings)
22
+ mappings.push(...hooks.mappings);
23
+ for (const preset of presets) {
24
+ const presetMappings = hookPresetMappings[preset];
25
+ if (presetMappings)
26
+ mappings.push(...presetMappings);
27
+ }
28
+ if (mappings.length === 0)
29
+ return [];
30
+ const configDir = path.dirname(CONFIG_PATH_CLAWDBOT);
31
+ const transformsDir = hooks?.transformsDir
32
+ ? resolvePath(configDir, hooks.transformsDir)
33
+ : configDir;
34
+ return mappings.map((mapping, index) => normalizeHookMapping(mapping, index, transformsDir));
35
+ }
36
+ export async function applyHookMappings(mappings, ctx) {
37
+ if (mappings.length === 0)
38
+ return null;
39
+ for (const mapping of mappings) {
40
+ if (!mappingMatches(mapping, ctx))
41
+ continue;
42
+ const base = buildActionFromMapping(mapping, ctx);
43
+ if (!base.ok)
44
+ return base;
45
+ let override = null;
46
+ if (mapping.transform) {
47
+ const transform = await loadTransform(mapping.transform);
48
+ override = await transform(ctx);
49
+ if (override === null) {
50
+ return { ok: true, action: null, skipped: true };
51
+ }
52
+ }
53
+ if (!base.action)
54
+ return { ok: true, action: null, skipped: true };
55
+ const merged = mergeAction(base.action, override, mapping.action);
56
+ if (!merged.ok)
57
+ return merged;
58
+ return merged;
59
+ }
60
+ return null;
61
+ }
62
+ function normalizeHookMapping(mapping, index, transformsDir) {
63
+ const id = mapping.id?.trim() || `mapping-${index + 1}`;
64
+ const matchPath = normalizeMatchPath(mapping.match?.path);
65
+ const matchSource = mapping.match?.source?.trim();
66
+ const action = mapping.action ?? "agent";
67
+ const wakeMode = mapping.wakeMode ?? "now";
68
+ const transform = mapping.transform
69
+ ? {
70
+ modulePath: resolvePath(transformsDir, mapping.transform.module),
71
+ exportName: mapping.transform.export?.trim() || undefined,
72
+ }
73
+ : undefined;
74
+ return {
75
+ id,
76
+ matchPath,
77
+ matchSource,
78
+ action,
79
+ wakeMode,
80
+ name: mapping.name,
81
+ sessionKey: mapping.sessionKey,
82
+ messageTemplate: mapping.messageTemplate,
83
+ textTemplate: mapping.textTemplate,
84
+ deliver: mapping.deliver,
85
+ channel: mapping.channel,
86
+ to: mapping.to,
87
+ thinking: mapping.thinking,
88
+ timeoutSeconds: mapping.timeoutSeconds,
89
+ transform,
90
+ };
91
+ }
92
+ function mappingMatches(mapping, ctx) {
93
+ if (mapping.matchPath) {
94
+ if (mapping.matchPath !== normalizeMatchPath(ctx.path))
95
+ return false;
96
+ }
97
+ if (mapping.matchSource) {
98
+ const source = typeof ctx.payload.source === "string" ? ctx.payload.source : undefined;
99
+ if (!source || source !== mapping.matchSource)
100
+ return false;
101
+ }
102
+ return true;
103
+ }
104
+ function buildActionFromMapping(mapping, ctx) {
105
+ if (mapping.action === "wake") {
106
+ const text = renderTemplate(mapping.textTemplate ?? "", ctx);
107
+ return {
108
+ ok: true,
109
+ action: {
110
+ kind: "wake",
111
+ text,
112
+ mode: mapping.wakeMode ?? "now",
113
+ },
114
+ };
115
+ }
116
+ const message = renderTemplate(mapping.messageTemplate ?? "", ctx);
117
+ return {
118
+ ok: true,
119
+ action: {
120
+ kind: "agent",
121
+ message,
122
+ name: renderOptional(mapping.name, ctx),
123
+ wakeMode: mapping.wakeMode ?? "now",
124
+ sessionKey: renderOptional(mapping.sessionKey, ctx),
125
+ deliver: mapping.deliver,
126
+ channel: mapping.channel,
127
+ to: renderOptional(mapping.to, ctx),
128
+ thinking: renderOptional(mapping.thinking, ctx),
129
+ timeoutSeconds: mapping.timeoutSeconds,
130
+ },
131
+ };
132
+ }
133
+ function mergeAction(base, override, defaultAction) {
134
+ if (!override) {
135
+ return validateAction(base);
136
+ }
137
+ const kind = (override.kind ?? base.kind ?? defaultAction);
138
+ if (kind === "wake") {
139
+ const baseWake = base.kind === "wake" ? base : undefined;
140
+ const text = typeof override.text === "string"
141
+ ? override.text
142
+ : (baseWake?.text ?? "");
143
+ const mode = override.mode === "next-heartbeat"
144
+ ? "next-heartbeat"
145
+ : (baseWake?.mode ?? "now");
146
+ return validateAction({ kind: "wake", text, mode });
147
+ }
148
+ const baseAgent = base.kind === "agent" ? base : undefined;
149
+ const message = typeof override.message === "string"
150
+ ? override.message
151
+ : (baseAgent?.message ?? "");
152
+ const wakeMode = override.wakeMode === "next-heartbeat"
153
+ ? "next-heartbeat"
154
+ : (baseAgent?.wakeMode ?? "now");
155
+ return validateAction({
156
+ kind: "agent",
157
+ message,
158
+ wakeMode,
159
+ name: override.name ?? baseAgent?.name,
160
+ sessionKey: override.sessionKey ?? baseAgent?.sessionKey,
161
+ deliver: typeof override.deliver === "boolean"
162
+ ? override.deliver
163
+ : baseAgent?.deliver,
164
+ channel: override.channel ?? baseAgent?.channel,
165
+ to: override.to ?? baseAgent?.to,
166
+ thinking: override.thinking ?? baseAgent?.thinking,
167
+ timeoutSeconds: override.timeoutSeconds ?? baseAgent?.timeoutSeconds,
168
+ });
169
+ }
170
+ function validateAction(action) {
171
+ if (action.kind === "wake") {
172
+ if (!action.text?.trim()) {
173
+ return { ok: false, error: "hook mapping requires text" };
174
+ }
175
+ return { ok: true, action };
176
+ }
177
+ if (!action.message?.trim()) {
178
+ return { ok: false, error: "hook mapping requires message" };
179
+ }
180
+ return { ok: true, action };
181
+ }
182
+ async function loadTransform(transform) {
183
+ const cached = transformCache.get(transform.modulePath);
184
+ if (cached)
185
+ return cached;
186
+ const url = pathToFileURL(transform.modulePath).href;
187
+ const mod = (await import(url));
188
+ const fn = resolveTransformFn(mod, transform.exportName);
189
+ transformCache.set(transform.modulePath, fn);
190
+ return fn;
191
+ }
192
+ function resolveTransformFn(mod, exportName) {
193
+ const candidate = exportName
194
+ ? mod[exportName]
195
+ : (mod.default ?? mod.transform);
196
+ if (typeof candidate !== "function") {
197
+ throw new Error("hook transform module must export a function");
198
+ }
199
+ return candidate;
200
+ }
201
+ function resolvePath(baseDir, target) {
202
+ if (!target)
203
+ return baseDir;
204
+ if (path.isAbsolute(target))
205
+ return target;
206
+ return path.join(baseDir, target);
207
+ }
208
+ function normalizeMatchPath(raw) {
209
+ if (!raw)
210
+ return undefined;
211
+ const trimmed = raw.trim();
212
+ if (!trimmed)
213
+ return undefined;
214
+ return trimmed.replace(/^\/+/, "").replace(/\/+$/, "");
215
+ }
216
+ function renderOptional(value, ctx) {
217
+ if (!value)
218
+ return undefined;
219
+ const rendered = renderTemplate(value, ctx).trim();
220
+ return rendered ? rendered : undefined;
221
+ }
222
+ function renderTemplate(template, ctx) {
223
+ if (!template)
224
+ return "";
225
+ return template.replace(/\{\{\s*([^}]+)\s*\}\}/g, (_, expr) => {
226
+ const value = resolveTemplateExpr(expr.trim(), ctx);
227
+ if (value === undefined || value === null)
228
+ return "";
229
+ if (typeof value === "string")
230
+ return value;
231
+ if (typeof value === "number" || typeof value === "boolean")
232
+ return String(value);
233
+ return JSON.stringify(value);
234
+ });
235
+ }
236
+ function resolveTemplateExpr(expr, ctx) {
237
+ if (expr === "path")
238
+ return ctx.path;
239
+ if (expr === "now")
240
+ return new Date().toISOString();
241
+ if (expr.startsWith("headers.")) {
242
+ return getByPath(ctx.headers, expr.slice("headers.".length));
243
+ }
244
+ if (expr.startsWith("query.")) {
245
+ return getByPath(Object.fromEntries(ctx.url.searchParams.entries()), expr.slice("query.".length));
246
+ }
247
+ if (expr.startsWith("payload.")) {
248
+ return getByPath(ctx.payload, expr.slice("payload.".length));
249
+ }
250
+ return getByPath(ctx.payload, expr);
251
+ }
252
+ function getByPath(input, pathExpr) {
253
+ if (!pathExpr)
254
+ return undefined;
255
+ const parts = [];
256
+ const re = /([^.[\]]+)|(\[(\d+)\])/g;
257
+ let match = re.exec(pathExpr);
258
+ while (match) {
259
+ if (match[1]) {
260
+ parts.push(match[1]);
261
+ }
262
+ else if (match[3]) {
263
+ parts.push(Number(match[3]));
264
+ }
265
+ match = re.exec(pathExpr);
266
+ }
267
+ let current = input;
268
+ for (const part of parts) {
269
+ if (current === null || current === undefined)
270
+ return undefined;
271
+ if (typeof part === "number") {
272
+ if (!Array.isArray(current))
273
+ return undefined;
274
+ current = current[part];
275
+ continue;
276
+ }
277
+ if (typeof current !== "object")
278
+ return undefined;
279
+ current = current[part];
280
+ }
281
+ return current;
282
+ }
@@ -0,0 +1,168 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { resolveHookMappings, } from "./hooks-mapping.js";
3
+ const DEFAULT_HOOKS_PATH = "/hooks";
4
+ const DEFAULT_HOOKS_MAX_BODY_BYTES = 256 * 1024;
5
+ export function resolveHooksConfig(cfg) {
6
+ if (cfg.hooks?.enabled !== true)
7
+ return null;
8
+ const token = cfg.hooks?.token?.trim();
9
+ if (!token) {
10
+ throw new Error("hooks.enabled requires hooks.token");
11
+ }
12
+ const rawPath = cfg.hooks?.path?.trim() || DEFAULT_HOOKS_PATH;
13
+ const withSlash = rawPath.startsWith("/") ? rawPath : `/${rawPath}`;
14
+ const trimmed = withSlash.length > 1 ? withSlash.replace(/\/+$/, "") : withSlash;
15
+ if (trimmed === "/") {
16
+ throw new Error("hooks.path may not be '/'");
17
+ }
18
+ const maxBodyBytes = cfg.hooks?.maxBodyBytes && cfg.hooks.maxBodyBytes > 0
19
+ ? cfg.hooks.maxBodyBytes
20
+ : DEFAULT_HOOKS_MAX_BODY_BYTES;
21
+ const mappings = resolveHookMappings(cfg.hooks);
22
+ return {
23
+ basePath: trimmed,
24
+ token,
25
+ maxBodyBytes,
26
+ mappings,
27
+ };
28
+ }
29
+ export function extractHookToken(req, url) {
30
+ const auth = typeof req.headers.authorization === "string"
31
+ ? req.headers.authorization.trim()
32
+ : "";
33
+ if (auth.toLowerCase().startsWith("bearer ")) {
34
+ const token = auth.slice(7).trim();
35
+ if (token)
36
+ return token;
37
+ }
38
+ const headerToken = typeof req.headers["x-clawdbot-token"] === "string"
39
+ ? req.headers["x-clawdbot-token"].trim()
40
+ : "";
41
+ if (headerToken)
42
+ return headerToken;
43
+ const queryToken = url.searchParams.get("token");
44
+ if (queryToken)
45
+ return queryToken.trim();
46
+ return undefined;
47
+ }
48
+ export async function readJsonBody(req, maxBytes) {
49
+ return await new Promise((resolve) => {
50
+ let done = false;
51
+ let total = 0;
52
+ const chunks = [];
53
+ req.on("data", (chunk) => {
54
+ if (done)
55
+ return;
56
+ total += chunk.length;
57
+ if (total > maxBytes) {
58
+ done = true;
59
+ resolve({ ok: false, error: "payload too large" });
60
+ req.destroy();
61
+ return;
62
+ }
63
+ chunks.push(chunk);
64
+ });
65
+ req.on("end", () => {
66
+ if (done)
67
+ return;
68
+ done = true;
69
+ const raw = Buffer.concat(chunks).toString("utf-8").trim();
70
+ if (!raw) {
71
+ resolve({ ok: true, value: {} });
72
+ return;
73
+ }
74
+ try {
75
+ const parsed = JSON.parse(raw);
76
+ resolve({ ok: true, value: parsed });
77
+ }
78
+ catch (err) {
79
+ resolve({ ok: false, error: String(err) });
80
+ }
81
+ });
82
+ req.on("error", (err) => {
83
+ if (done)
84
+ return;
85
+ done = true;
86
+ resolve({ ok: false, error: String(err) });
87
+ });
88
+ });
89
+ }
90
+ export function normalizeHookHeaders(req) {
91
+ const headers = {};
92
+ for (const [key, value] of Object.entries(req.headers)) {
93
+ if (typeof value === "string") {
94
+ headers[key.toLowerCase()] = value;
95
+ }
96
+ else if (Array.isArray(value) && value.length > 0) {
97
+ headers[key.toLowerCase()] = value.join(", ");
98
+ }
99
+ }
100
+ return headers;
101
+ }
102
+ export function normalizeWakePayload(payload) {
103
+ const text = typeof payload.text === "string" ? payload.text.trim() : "";
104
+ if (!text)
105
+ return { ok: false, error: "text required" };
106
+ const mode = payload.mode === "next-heartbeat" ? "next-heartbeat" : "now";
107
+ return { ok: true, value: { text, mode } };
108
+ }
109
+ export function normalizeAgentPayload(payload, opts) {
110
+ const message = typeof payload.message === "string" ? payload.message.trim() : "";
111
+ if (!message)
112
+ return { ok: false, error: "message required" };
113
+ const nameRaw = payload.name;
114
+ const name = typeof nameRaw === "string" && nameRaw.trim() ? nameRaw.trim() : "Hook";
115
+ const wakeMode = payload.wakeMode === "next-heartbeat" ? "next-heartbeat" : "now";
116
+ const sessionKeyRaw = payload.sessionKey;
117
+ const idFactory = opts?.idFactory ?? randomUUID;
118
+ const sessionKey = typeof sessionKeyRaw === "string" && sessionKeyRaw.trim()
119
+ ? sessionKeyRaw.trim()
120
+ : `hook:${idFactory()}`;
121
+ const channelRaw = payload.channel;
122
+ const channel = channelRaw === "whatsapp" ||
123
+ channelRaw === "telegram" ||
124
+ channelRaw === "discord" ||
125
+ channelRaw === "slack" ||
126
+ channelRaw === "signal" ||
127
+ channelRaw === "imessage" ||
128
+ channelRaw === "last"
129
+ ? channelRaw
130
+ : channelRaw === "imsg"
131
+ ? "imessage"
132
+ : channelRaw === undefined
133
+ ? "last"
134
+ : null;
135
+ if (channel === null) {
136
+ return {
137
+ ok: false,
138
+ error: "channel must be last|whatsapp|telegram|discord|slack|signal|imessage",
139
+ };
140
+ }
141
+ const toRaw = payload.to;
142
+ const to = typeof toRaw === "string" && toRaw.trim() ? toRaw.trim() : undefined;
143
+ const deliver = payload.deliver === true;
144
+ const thinkingRaw = payload.thinking;
145
+ const thinking = typeof thinkingRaw === "string" && thinkingRaw.trim()
146
+ ? thinkingRaw.trim()
147
+ : undefined;
148
+ const timeoutRaw = payload.timeoutSeconds;
149
+ const timeoutSeconds = typeof timeoutRaw === "number" &&
150
+ Number.isFinite(timeoutRaw) &&
151
+ timeoutRaw > 0
152
+ ? Math.floor(timeoutRaw)
153
+ : undefined;
154
+ return {
155
+ ok: true,
156
+ value: {
157
+ message,
158
+ name,
159
+ wakeMode,
160
+ sessionKey,
161
+ deliver,
162
+ channel,
163
+ to,
164
+ thinking,
165
+ timeoutSeconds,
166
+ },
167
+ };
168
+ }
@@ -0,0 +1,29 @@
1
+ import { pickPrimaryTailnetIPv4 } from "../infra/tailnet.js";
2
+ export function isLoopbackAddress(ip) {
3
+ if (!ip)
4
+ return false;
5
+ if (ip === "127.0.0.1")
6
+ return true;
7
+ if (ip.startsWith("127."))
8
+ return true;
9
+ if (ip === "::1")
10
+ return true;
11
+ if (ip.startsWith("::ffff:127."))
12
+ return true;
13
+ return false;
14
+ }
15
+ export function resolveGatewayBindHost(bind) {
16
+ const mode = bind ?? "loopback";
17
+ if (mode === "loopback")
18
+ return "127.0.0.1";
19
+ if (mode === "lan")
20
+ return "0.0.0.0";
21
+ if (mode === "tailnet")
22
+ return pickPrimaryTailnetIPv4() ?? null;
23
+ if (mode === "auto")
24
+ return pickPrimaryTailnetIPv4() ?? "0.0.0.0";
25
+ return "127.0.0.1";
26
+ }
27
+ export function isLoopbackHost(host) {
28
+ return isLoopbackAddress(host);
29
+ }
@@ -0,0 +1,61 @@
1
+ import AjvPkg from "ajv";
2
+ import { AgentEventSchema, AgentParamsSchema, AgentWaitParamsSchema, ChatAbortParamsSchema, ChatEventSchema, ChatHistoryParamsSchema, ChatSendParamsSchema, ConfigGetParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, ConfigSetParamsSchema, ConnectParamsSchema, CronAddParamsSchema, CronJobSchema, CronListParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, CronStatusParamsSchema, CronUpdateParamsSchema, ErrorCodes, ErrorShapeSchema, EventFrameSchema, errorShape, GatewayFrameSchema, HelloOkSchema, ModelsListParamsSchema, NodeDescribeParamsSchema, NodeInvokeParamsSchema, NodeListParamsSchema, NodePairApproveParamsSchema, NodePairListParamsSchema, NodePairRejectParamsSchema, NodePairRequestParamsSchema, NodePairVerifyParamsSchema, NodeRenameParamsSchema, PROTOCOL_VERSION, PresenceEntrySchema, ProtocolSchemas, ProvidersStatusParamsSchema, RequestFrameSchema, ResponseFrameSchema, SendParamsSchema, SessionsCompactParamsSchema, SessionsDeleteParamsSchema, SessionsListParamsSchema, SessionsPatchParamsSchema, SessionsResetParamsSchema, ShutdownEventSchema, SkillsInstallParamsSchema, SkillsStatusParamsSchema, SkillsUpdateParamsSchema, SnapshotSchema, StateVersionSchema, TalkModeParamsSchema, TickEventSchema, WakeParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, WizardCancelParamsSchema, WizardNextParamsSchema, WizardNextResultSchema, WizardStartParamsSchema, WizardStartResultSchema, WizardStatusParamsSchema, WizardStatusResultSchema, WizardStepSchema, } from "./schema.js";
3
+ const ajv = new AjvPkg({
4
+ allErrors: true,
5
+ strict: false,
6
+ removeAdditional: false,
7
+ });
8
+ export const validateConnectParams = ajv.compile(ConnectParamsSchema);
9
+ export const validateRequestFrame = ajv.compile(RequestFrameSchema);
10
+ export const validateResponseFrame = ajv.compile(ResponseFrameSchema);
11
+ export const validateEventFrame = ajv.compile(EventFrameSchema);
12
+ export const validateSendParams = ajv.compile(SendParamsSchema);
13
+ export const validateAgentParams = ajv.compile(AgentParamsSchema);
14
+ export const validateAgentWaitParams = ajv.compile(AgentWaitParamsSchema);
15
+ export const validateWakeParams = ajv.compile(WakeParamsSchema);
16
+ export const validateNodePairRequestParams = ajv.compile(NodePairRequestParamsSchema);
17
+ export const validateNodePairListParams = ajv.compile(NodePairListParamsSchema);
18
+ export const validateNodePairApproveParams = ajv.compile(NodePairApproveParamsSchema);
19
+ export const validateNodePairRejectParams = ajv.compile(NodePairRejectParamsSchema);
20
+ export const validateNodePairVerifyParams = ajv.compile(NodePairVerifyParamsSchema);
21
+ export const validateNodeRenameParams = ajv.compile(NodeRenameParamsSchema);
22
+ export const validateNodeListParams = ajv.compile(NodeListParamsSchema);
23
+ export const validateNodeDescribeParams = ajv.compile(NodeDescribeParamsSchema);
24
+ export const validateNodeInvokeParams = ajv.compile(NodeInvokeParamsSchema);
25
+ export const validateSessionsListParams = ajv.compile(SessionsListParamsSchema);
26
+ export const validateSessionsPatchParams = ajv.compile(SessionsPatchParamsSchema);
27
+ export const validateSessionsResetParams = ajv.compile(SessionsResetParamsSchema);
28
+ export const validateSessionsDeleteParams = ajv.compile(SessionsDeleteParamsSchema);
29
+ export const validateSessionsCompactParams = ajv.compile(SessionsCompactParamsSchema);
30
+ export const validateConfigGetParams = ajv.compile(ConfigGetParamsSchema);
31
+ export const validateConfigSetParams = ajv.compile(ConfigSetParamsSchema);
32
+ export const validateConfigSchemaParams = ajv.compile(ConfigSchemaParamsSchema);
33
+ export const validateWizardStartParams = ajv.compile(WizardStartParamsSchema);
34
+ export const validateWizardNextParams = ajv.compile(WizardNextParamsSchema);
35
+ export const validateWizardCancelParams = ajv.compile(WizardCancelParamsSchema);
36
+ export const validateWizardStatusParams = ajv.compile(WizardStatusParamsSchema);
37
+ export const validateTalkModeParams = ajv.compile(TalkModeParamsSchema);
38
+ export const validateProvidersStatusParams = ajv.compile(ProvidersStatusParamsSchema);
39
+ export const validateModelsListParams = ajv.compile(ModelsListParamsSchema);
40
+ export const validateSkillsStatusParams = ajv.compile(SkillsStatusParamsSchema);
41
+ export const validateSkillsInstallParams = ajv.compile(SkillsInstallParamsSchema);
42
+ export const validateSkillsUpdateParams = ajv.compile(SkillsUpdateParamsSchema);
43
+ export const validateCronListParams = ajv.compile(CronListParamsSchema);
44
+ export const validateCronStatusParams = ajv.compile(CronStatusParamsSchema);
45
+ export const validateCronAddParams = ajv.compile(CronAddParamsSchema);
46
+ export const validateCronUpdateParams = ajv.compile(CronUpdateParamsSchema);
47
+ export const validateCronRemoveParams = ajv.compile(CronRemoveParamsSchema);
48
+ export const validateCronRunParams = ajv.compile(CronRunParamsSchema);
49
+ export const validateCronRunsParams = ajv.compile(CronRunsParamsSchema);
50
+ export const validateChatHistoryParams = ajv.compile(ChatHistoryParamsSchema);
51
+ export const validateChatSendParams = ajv.compile(ChatSendParamsSchema);
52
+ export const validateChatAbortParams = ajv.compile(ChatAbortParamsSchema);
53
+ export const validateChatEvent = ajv.compile(ChatEventSchema);
54
+ export const validateWebLoginStartParams = ajv.compile(WebLoginStartParamsSchema);
55
+ export const validateWebLoginWaitParams = ajv.compile(WebLoginWaitParamsSchema);
56
+ export function formatValidationErrors(errors) {
57
+ if (!errors)
58
+ return "unknown validation error";
59
+ return ajv.errorsText(errors, { separator: "; " });
60
+ }
61
+ export { ConnectParamsSchema, HelloOkSchema, RequestFrameSchema, ResponseFrameSchema, EventFrameSchema, GatewayFrameSchema, PresenceEntrySchema, SnapshotSchema, ErrorShapeSchema, StateVersionSchema, AgentEventSchema, ChatEventSchema, SendParamsSchema, AgentParamsSchema, WakeParamsSchema, NodePairRequestParamsSchema, NodePairListParamsSchema, NodePairApproveParamsSchema, NodePairRejectParamsSchema, NodePairVerifyParamsSchema, NodeListParamsSchema, NodeInvokeParamsSchema, SessionsListParamsSchema, SessionsPatchParamsSchema, SessionsResetParamsSchema, SessionsDeleteParamsSchema, SessionsCompactParamsSchema, ConfigGetParamsSchema, ConfigSetParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, WizardStartParamsSchema, WizardNextParamsSchema, WizardCancelParamsSchema, WizardStatusParamsSchema, WizardStepSchema, WizardNextResultSchema, WizardStartResultSchema, WizardStatusResultSchema, ProvidersStatusParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, ModelsListParamsSchema, SkillsStatusParamsSchema, SkillsInstallParamsSchema, SkillsUpdateParamsSchema, CronJobSchema, CronListParamsSchema, CronStatusParamsSchema, CronAddParamsSchema, CronUpdateParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, ChatHistoryParamsSchema, ChatSendParamsSchema, TickEventSchema, ShutdownEventSchema, ProtocolSchemas, PROTOCOL_VERSION, ErrorCodes, errorShape, };