@poolzin/pool-bot 2026.1.38 → 2026.2.0

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 (336) hide show
  1. package/assets/chrome-extension/README.md +3 -3
  2. package/assets/chrome-extension/background.js +5 -5
  3. package/assets/chrome-extension/manifest.json +3 -3
  4. package/assets/chrome-extension/options.html +4 -4
  5. package/assets/chrome-extension/options.js +1 -1
  6. package/dist/acp/client.js +3 -3
  7. package/dist/acp/types.js +1 -1
  8. package/dist/agents/agent-paths.js +3 -3
  9. package/dist/agents/auth-profiles/paths.js +3 -3
  10. package/dist/agents/cli-runner/helpers.js +1 -1
  11. package/dist/agents/cli-runner.js +2 -2
  12. package/dist/agents/cloudflare-ai-gateway.js +31 -0
  13. package/dist/agents/compaction.js +16 -2
  14. package/dist/agents/context-window-guard.js +13 -10
  15. package/dist/agents/context.js +4 -4
  16. package/dist/agents/docs-path.js +1 -1
  17. package/dist/agents/minimax-vlm.js +1 -1
  18. package/dist/agents/model-auth.js +12 -1
  19. package/dist/agents/model-catalog.js +4 -4
  20. package/dist/agents/model-selection.js +10 -4
  21. package/dist/agents/models-config.js +3 -3
  22. package/dist/agents/models-config.providers.js +147 -39
  23. package/dist/agents/pi-embedded-helpers/openai.js +1 -1
  24. package/dist/agents/pi-embedded-runner/compact.js +8 -8
  25. package/dist/agents/pi-embedded-runner/model.js +2 -2
  26. package/dist/agents/pi-embedded-runner/run/attempt.js +6 -6
  27. package/dist/agents/pi-embedded-runner/run.js +4 -4
  28. package/dist/agents/pi-embedded-runner/tool-result-truncation.js +275 -0
  29. package/dist/agents/pi-embedded-runner/utils.js +1 -1
  30. package/dist/agents/pi-model-discovery.js +10 -0
  31. package/dist/agents/pi-tool-definition-adapter.js +50 -9
  32. package/dist/agents/pi-tools.before-tool-call.js +67 -0
  33. package/dist/agents/pi-tools.js +10 -5
  34. package/dist/agents/pi-tools.read.js +2 -2
  35. package/dist/agents/session-file-repair.js +83 -0
  36. package/dist/agents/session-transcript-repair.js +68 -0
  37. package/dist/agents/skills/frontmatter.js +1 -1
  38. package/dist/agents/skills/workspace.js +2 -2
  39. package/dist/agents/system-prompt.js +28 -4
  40. package/dist/agents/together-models.js +127 -0
  41. package/dist/agents/tool-images.js +1 -1
  42. package/dist/agents/tool-policy.js +1 -1
  43. package/dist/agents/tools/browser-tool.js +3 -3
  44. package/dist/agents/tools/image-tool.js +2 -2
  45. package/dist/agents/tools/memory-tool.js +94 -7
  46. package/dist/agents/tools/web-search.js +1 -1
  47. package/dist/agents/workspace.js +1 -5
  48. package/dist/auto-reply/commands-registry.data.js +1 -1
  49. package/dist/auto-reply/reply/commands-context-report.js +2 -2
  50. package/dist/auto-reply/reply/commands-session.js +2 -2
  51. package/dist/auto-reply/reply/get-reply-run.js +14 -4
  52. package/dist/auto-reply/reply/groups.js +1 -1
  53. package/dist/auto-reply/reply/inbound-context.js +4 -0
  54. package/dist/auto-reply/reply/inbound-meta.js +130 -0
  55. package/dist/auto-reply/reply/untrusted-context.js +15 -0
  56. package/dist/auto-reply/status.js +1 -1
  57. package/dist/browser/client-fetch.js +1 -1
  58. package/dist/browser/config.js +1 -1
  59. package/dist/browser/extension-relay.js +3 -3
  60. package/dist/browser/server-context.js +2 -2
  61. package/dist/build-info.json +3 -3
  62. package/dist/canvas-host/a2ui.js +3 -3
  63. package/dist/channels/plugins/agent-tools/whatsapp-login.js +1 -17
  64. package/dist/channels/plugins/catalog.js +2 -2
  65. package/dist/channels/plugins/onboarding/imessage.js +1 -1
  66. package/dist/channels/plugins/onboarding/signal.js +1 -1
  67. package/dist/channels/plugins/onboarding/slack.js +4 -4
  68. package/dist/channels/plugins/onboarding/whatsapp.js +3 -3
  69. package/dist/channels/plugins/pairing-message.js +1 -1
  70. package/dist/cli/browser-cli-extension.js +2 -2
  71. package/dist/cli/docs-cli.js +1 -1
  72. package/dist/cli/gateway-cli/dev.js +1 -1
  73. package/dist/cli/memory-cli.js +25 -15
  74. package/dist/cli/nodes-cli/register.canvas.js +1 -1
  75. package/dist/cli/plugins-cli.js +1 -1
  76. package/dist/cli/run-main.js +2 -2
  77. package/dist/cli/security-cli.js +1 -1
  78. package/dist/cli/tagline.js +1 -1
  79. package/dist/cli/update-cli.js +4 -4
  80. package/dist/cli/webhooks-cli.js +5 -5
  81. package/dist/commands/agents.commands.add.js +1 -1
  82. package/dist/commands/auth-choice.apply.api-providers.js +305 -17
  83. package/dist/commands/auth-choice.apply.js +4 -1
  84. package/dist/commands/auth-choice.apply.plugin-provider.js +2 -2
  85. package/dist/commands/auth-choice.apply.xai.js +63 -0
  86. package/dist/commands/auth-choice.preferred-provider.js +7 -1
  87. package/dist/commands/configure.wizard.js +1 -1
  88. package/dist/commands/dashboard.js +1 -1
  89. package/dist/commands/docs.js +1 -1
  90. package/dist/commands/doctor-gateway-services.js +3 -3
  91. package/dist/commands/doctor-state-integrity.js +2 -14
  92. package/dist/commands/doctor-update.js +3 -3
  93. package/dist/commands/doctor.js +1 -1
  94. package/dist/commands/models/list.probe.js +2 -2
  95. package/dist/commands/models/list.registry.js +4 -4
  96. package/dist/commands/models/list.status-command.js +2 -2
  97. package/dist/commands/onboard-auth.config-core.js +366 -28
  98. package/dist/commands/onboard-auth.credentials.js +71 -9
  99. package/dist/commands/onboard-auth.js +3 -3
  100. package/dist/commands/onboard-auth.models.js +26 -24
  101. package/dist/commands/onboard-non-interactive/local/auth-choice.js +140 -6
  102. package/dist/commands/status-all/report-lines.js +1 -1
  103. package/dist/commands/status.command.js +1 -1
  104. package/dist/commands/uninstall.js +3 -3
  105. package/dist/compat/legacy-names.js +1 -1
  106. package/dist/config/io.js +3 -3
  107. package/dist/config/schema.js +1 -1
  108. package/dist/config/types.js +0 -1
  109. package/dist/config/types.memory.js +1 -0
  110. package/dist/config/version.js +4 -4
  111. package/dist/config/zod-schema.js +0 -6
  112. package/dist/daemon/constants.js +7 -7
  113. package/dist/daemon/inspect.js +6 -6
  114. package/dist/daemon/systemd-unit.js +1 -1
  115. package/dist/discord/monitor/message-handler.process.js +6 -4
  116. package/dist/gateway/client.js +0 -14
  117. package/dist/gateway/live-image-probe.js +1 -66
  118. package/dist/gateway/openai-http.js +2 -2
  119. package/dist/gateway/openresponses-http.js +4 -4
  120. package/dist/gateway/server-discovery.js +2 -2
  121. package/dist/gateway/server-http.js +1 -1
  122. package/dist/gateway/server.impl.js +2 -6
  123. package/dist/hooks/frontmatter.js +1 -1
  124. package/dist/hooks/hooks-status.js +1 -1
  125. package/dist/hooks/install.js +2 -2
  126. package/dist/hooks/loader.js +1 -1
  127. package/dist/hooks/workspace.js +3 -3
  128. package/dist/index.js +2 -2
  129. package/dist/infra/bonjour.js +3 -3
  130. package/dist/infra/path-env.js +3 -3
  131. package/dist/infra/provider-usage.fetch.minimax.js +1 -1
  132. package/dist/infra/restart.js +1 -1
  133. package/dist/infra/tailscale.js +1 -1
  134. package/dist/macos/relay.js +2 -2
  135. package/dist/media/input-files.js +1 -1
  136. package/dist/media/mime.js +4 -0
  137. package/dist/media/png-encode.js +74 -0
  138. package/dist/media-understanding/providers/image.js +2 -2
  139. package/dist/memory/backend-config.js +207 -0
  140. package/dist/memory/embeddings.js +1 -1
  141. package/dist/memory/index.js +0 -5
  142. package/dist/memory/manager.js +3 -25
  143. package/dist/memory/types.js +1 -0
  144. package/dist/node-host/runner.js +2 -2
  145. package/dist/pairing/pairing-messages.js +1 -1
  146. package/dist/plugins/discovery.js +1 -1
  147. package/dist/plugins/install.js +2 -2
  148. package/dist/plugins/update.js +1 -1
  149. package/dist/security/audit.js +2 -2
  150. package/dist/shared/text/reasoning-tags.js +52 -7
  151. package/dist/slack/monitor/message-handler/prepare.js +10 -4
  152. package/dist/slack/monitor/slash.js +10 -4
  153. package/dist/tailscale/detect.js +146 -0
  154. package/dist/telegram/bot-message-context.js +1 -1
  155. package/dist/test-helpers/workspace.js +11 -0
  156. package/dist/test-utils/channel-plugins.js +82 -0
  157. package/dist/test-utils/ports.js +73 -0
  158. package/dist/utils/shell-argv.js +61 -0
  159. package/dist/utils.js +10 -0
  160. package/dist/web/qr-image.js +1 -61
  161. package/dist/wizard/onboarding.finalize.js +7 -7
  162. package/dist/wizard/onboarding.js +3 -3
  163. package/docs/RELEASE_WORKFOTS_COMPARISON.md +3 -3
  164. package/docs/_config.yml +2 -2
  165. package/docs/_layouts/default.html +9 -9
  166. package/docs/concepts/typebox.md +1 -1
  167. package/docs/docs.json +1 -1
  168. package/docs/northflank.mdx +7 -7
  169. package/docs/railway.mdx +3 -3
  170. package/docs/render.mdx +5 -5
  171. package/docs/start/lore.md +2 -2
  172. package/extensions/bluebubbles/index.ts +2 -2
  173. package/extensions/bluebubbles/package.json +1 -1
  174. package/extensions/bluebubbles/src/accounts.ts +8 -8
  175. package/extensions/bluebubbles/src/actions.test.ts +22 -22
  176. package/extensions/bluebubbles/src/actions.ts +5 -5
  177. package/extensions/bluebubbles/src/attachments.ts +2 -2
  178. package/extensions/bluebubbles/src/channel.ts +16 -16
  179. package/extensions/bluebubbles/src/chat.ts +2 -2
  180. package/extensions/bluebubbles/src/media-send.ts +2 -2
  181. package/extensions/bluebubbles/src/monitor.test.ts +46 -46
  182. package/extensions/bluebubbles/src/monitor.ts +5 -5
  183. package/extensions/bluebubbles/src/onboarding.ts +7 -7
  184. package/extensions/bluebubbles/src/reactions.ts +2 -2
  185. package/extensions/bluebubbles/src/send.ts +2 -2
  186. package/extensions/copilot-proxy/README.md +1 -1
  187. package/extensions/copilot-proxy/package.json +1 -1
  188. package/extensions/diagnostics-otel/index.ts +2 -2
  189. package/extensions/diagnostics-otel/package.json +1 -1
  190. package/extensions/diagnostics-otel/src/service.ts +3 -3
  191. package/extensions/discord/index.ts +2 -2
  192. package/extensions/discord/package.json +1 -1
  193. package/extensions/google-antigravity-auth/README.md +1 -1
  194. package/extensions/google-antigravity-auth/index.ts +1 -1
  195. package/extensions/google-antigravity-auth/package.json +1 -1
  196. package/extensions/google-gemini-cli-auth/README.md +1 -1
  197. package/extensions/google-gemini-cli-auth/oauth.ts +1 -1
  198. package/extensions/google-gemini-cli-auth/package.json +1 -1
  199. package/extensions/googlechat/index.ts +3 -3
  200. package/extensions/googlechat/package.json +1 -1
  201. package/extensions/googlechat/src/accounts.ts +8 -8
  202. package/extensions/googlechat/src/actions.ts +6 -6
  203. package/extensions/googlechat/src/channel.ts +21 -21
  204. package/extensions/googlechat/src/monitor.ts +8 -8
  205. package/extensions/googlechat/src/onboarding.ts +10 -10
  206. package/extensions/imessage/index.ts +2 -2
  207. package/extensions/imessage/package.json +1 -1
  208. package/extensions/line/index.ts +2 -2
  209. package/extensions/line/package.json +1 -1
  210. package/extensions/line/src/card-command.ts +2 -2
  211. package/extensions/line/src/channel.logout.test.ts +4 -4
  212. package/extensions/line/src/channel.sendPayload.test.ts +8 -8
  213. package/extensions/line/src/channel.ts +3 -3
  214. package/extensions/llm-task/README.md +3 -3
  215. package/extensions/llm-task/index.ts +2 -2
  216. package/extensions/llm-task/package.json +1 -1
  217. package/extensions/llm-task/src/llm-task-tool.ts +4 -4
  218. package/extensions/lobster/README.md +6 -6
  219. package/extensions/lobster/index.ts +2 -2
  220. package/extensions/lobster/src/lobster-tool.test.ts +4 -4
  221. package/extensions/lobster/src/lobster-tool.ts +2 -2
  222. package/extensions/matrix/index.ts +2 -2
  223. package/extensions/matrix/package.json +1 -1
  224. package/extensions/matrix/src/matrix/client/config.ts +1 -1
  225. package/extensions/matrix/src/matrix/monitor/handler.ts +1 -1
  226. package/extensions/matrix/src/onboarding.ts +1 -1
  227. package/extensions/mattermost/index.ts +2 -2
  228. package/extensions/mattermost/package.json +1 -1
  229. package/extensions/mattermost/src/mattermost/accounts.ts +8 -8
  230. package/extensions/mattermost/src/mattermost/monitor-helpers.ts +5 -5
  231. package/extensions/mattermost/src/mattermost/monitor.ts +2 -2
  232. package/extensions/mattermost/src/onboarding-helpers.ts +3 -3
  233. package/extensions/mattermost/src/onboarding.ts +2 -2
  234. package/extensions/memory-core/index.ts +2 -2
  235. package/extensions/memory-core/package.json +1 -4
  236. package/extensions/memory-lancedb/index.ts +3 -3
  237. package/extensions/memory-lancedb/package.json +1 -1
  238. package/extensions/msteams/index.ts +2 -2
  239. package/extensions/msteams/package.json +1 -1
  240. package/extensions/msteams/src/channel.directory.test.ts +2 -2
  241. package/extensions/msteams/src/channel.ts +2 -2
  242. package/extensions/msteams/src/graph-upload.ts +4 -4
  243. package/extensions/msteams/src/monitor-handler.ts +2 -2
  244. package/extensions/msteams/src/monitor.ts +2 -2
  245. package/extensions/msteams/src/onboarding.ts +9 -9
  246. package/extensions/msteams/src/reply-dispatcher.ts +2 -2
  247. package/extensions/msteams/src/send-context.ts +2 -2
  248. package/extensions/msteams/src/send.ts +4 -4
  249. package/extensions/nextcloud-talk/index.ts +2 -2
  250. package/extensions/nextcloud-talk/package.json +1 -1
  251. package/extensions/nextcloud-talk/src/channel.ts +7 -7
  252. package/extensions/nextcloud-talk/src/inbound.ts +7 -7
  253. package/extensions/nextcloud-talk/src/onboarding.ts +1 -1
  254. package/extensions/nostr/README.md +2 -2
  255. package/extensions/nostr/index.ts +5 -5
  256. package/extensions/nostr/package.json +1 -1
  257. package/extensions/nostr/src/types.ts +4 -4
  258. package/extensions/open-prose/index.ts +2 -2
  259. package/extensions/qwen-portal-auth/README.md +1 -1
  260. package/extensions/signal/index.ts +2 -2
  261. package/extensions/signal/package.json +1 -1
  262. package/extensions/slack/index.ts +2 -2
  263. package/extensions/slack/package.json +1 -1
  264. package/extensions/telegram/index.ts +2 -2
  265. package/extensions/telegram/package.json +1 -1
  266. package/extensions/telegram/src/channel.ts +2 -2
  267. package/extensions/tlon/README.md +2 -2
  268. package/extensions/tlon/index.ts +2 -2
  269. package/extensions/tlon/package.json +1 -1
  270. package/extensions/tlon/src/channel.ts +13 -13
  271. package/extensions/tlon/src/monitor/index.ts +3 -3
  272. package/extensions/tlon/src/onboarding.ts +3 -3
  273. package/extensions/tlon/src/types.ts +3 -3
  274. package/extensions/twitch/README.md +1 -1
  275. package/extensions/twitch/index.ts +2 -2
  276. package/extensions/twitch/package.json +1 -1
  277. package/extensions/twitch/src/config.ts +3 -3
  278. package/extensions/twitch/src/monitor.ts +3 -3
  279. package/extensions/twitch/src/onboarding.ts +9 -9
  280. package/extensions/twitch/src/outbound.test.ts +2 -2
  281. package/extensions/twitch/src/plugin.test.ts +2 -2
  282. package/extensions/twitch/src/plugin.ts +8 -8
  283. package/extensions/twitch/src/send.test.ts +2 -2
  284. package/extensions/twitch/src/send.ts +4 -4
  285. package/extensions/twitch/src/token.test.ts +8 -8
  286. package/extensions/twitch/src/token.ts +3 -3
  287. package/extensions/twitch/src/twitch-client.ts +3 -3
  288. package/extensions/twitch/src/types.ts +3 -3
  289. package/extensions/twitch/src/utils/markdown.ts +1 -1
  290. package/extensions/voice-call/README.md +3 -3
  291. package/extensions/voice-call/package.json +1 -1
  292. package/extensions/voice-call/src/core-bridge.ts +2 -2
  293. package/extensions/voice-call/src/response-generator.ts +1 -1
  294. package/extensions/whatsapp/index.ts +2 -2
  295. package/extensions/whatsapp/package.json +1 -1
  296. package/extensions/zalo/README.md +1 -1
  297. package/extensions/zalo/index.ts +2 -2
  298. package/extensions/zalo/package.json +1 -1
  299. package/extensions/zalo/src/accounts.ts +8 -8
  300. package/extensions/zalo/src/actions.ts +4 -4
  301. package/extensions/zalo/src/channel.directory.test.ts +2 -2
  302. package/extensions/zalo/src/channel.ts +18 -18
  303. package/extensions/zalo/src/monitor.ts +9 -9
  304. package/extensions/zalo/src/monitor.webhook.test.ts +2 -2
  305. package/extensions/zalo/src/onboarding.ts +24 -24
  306. package/extensions/zalo/src/send.ts +2 -2
  307. package/extensions/zalouser/README.md +2 -2
  308. package/extensions/zalouser/index.ts +2 -2
  309. package/extensions/zalouser/package.json +1 -1
  310. package/extensions/zalouser/src/accounts.ts +9 -9
  311. package/extensions/zalouser/src/channel.ts +24 -24
  312. package/extensions/zalouser/src/monitor.ts +4 -4
  313. package/extensions/zalouser/src/onboarding.ts +28 -28
  314. package/package.json +13 -250
  315. package/skills/nano-banana-pro/scripts/generate_image.py +1 -1
  316. package/skills/tmux/scripts/find-sessions.sh +1 -1
  317. package/CHANGELOG.md +0 -200
  318. package/README-header.png +0 -0
  319. package/git-hooks/pre-commit +0 -4
  320. package/scripts/format-staged.js +0 -148
  321. package/scripts/postinstall.js +0 -300
  322. package/scripts/setup-git-hooks.js +0 -96
  323. package/skills/webgpu-threejs-tsl/REFERENCE.md +0 -283
  324. package/skills/webgpu-threejs-tsl/SKILL.md +0 -91
  325. package/skills/webgpu-threejs-tsl/docs/compute-shaders.md +0 -404
  326. package/skills/webgpu-threejs-tsl/docs/core-concepts.md +0 -453
  327. package/skills/webgpu-threejs-tsl/docs/materials.md +0 -353
  328. package/skills/webgpu-threejs-tsl/docs/post-processing.md +0 -434
  329. package/skills/webgpu-threejs-tsl/docs/wgsl-integration.md +0 -324
  330. package/skills/webgpu-threejs-tsl/examples/basic-setup.js +0 -87
  331. package/skills/webgpu-threejs-tsl/examples/custom-material.js +0 -170
  332. package/skills/webgpu-threejs-tsl/examples/earth-shader.js +0 -292
  333. package/skills/webgpu-threejs-tsl/examples/particle-system.js +0 -259
  334. package/skills/webgpu-threejs-tsl/examples/post-processing.js +0 -199
  335. package/skills/webgpu-threejs-tsl/templates/compute-shader.js +0 -305
  336. package/skills/webgpu-threejs-tsl/templates/webgpu-project.js +0 -276
@@ -0,0 +1,82 @@
1
+ import { imessageOutbound } from "../channels/plugins/outbound/imessage.js";
2
+ import { normalizeIMessageHandle } from "../imessage/targets.js";
3
+ export const createTestRegistry = (channels = []) => ({
4
+ plugins: [],
5
+ tools: [],
6
+ hooks: [],
7
+ typedHooks: [],
8
+ channels,
9
+ providers: [],
10
+ gatewayHandlers: {},
11
+ httpHandlers: [],
12
+ httpRoutes: [],
13
+ cliRegistrars: [],
14
+ services: [],
15
+ commands: [],
16
+ diagnostics: [],
17
+ });
18
+ export const createIMessageTestPlugin = (params) => ({
19
+ id: "imessage",
20
+ meta: {
21
+ id: "imessage",
22
+ label: "iMessage",
23
+ selectionLabel: "iMessage (imsg)",
24
+ docsPath: "/channels/imessage",
25
+ blurb: "iMessage test stub.",
26
+ aliases: ["imsg"],
27
+ },
28
+ capabilities: { chatTypes: ["direct", "group"], media: true },
29
+ config: {
30
+ listAccountIds: () => [],
31
+ resolveAccount: () => ({}),
32
+ },
33
+ status: {
34
+ collectStatusIssues: (accounts) => accounts.flatMap((account) => {
35
+ const lastError = typeof account.lastError === "string" ? account.lastError.trim() : "";
36
+ if (!lastError)
37
+ return [];
38
+ return [
39
+ {
40
+ channel: "imessage",
41
+ accountId: account.accountId,
42
+ kind: "runtime",
43
+ message: `Channel error: ${lastError}`,
44
+ },
45
+ ];
46
+ }),
47
+ },
48
+ outbound: params?.outbound ?? imessageOutbound,
49
+ messaging: {
50
+ targetResolver: {
51
+ looksLikeId: (raw) => {
52
+ const trimmed = raw.trim();
53
+ if (!trimmed)
54
+ return false;
55
+ if (/^(imessage:|sms:|auto:|chat_id:|chat_guid:|chat_identifier:)/i.test(trimmed)) {
56
+ return true;
57
+ }
58
+ if (trimmed.includes("@"))
59
+ return true;
60
+ return /^\+?\d{3,}$/.test(trimmed);
61
+ },
62
+ hint: "<handle|chat_id:ID>",
63
+ },
64
+ normalizeTarget: (raw) => normalizeIMessageHandle(raw),
65
+ },
66
+ });
67
+ export const createOutboundTestPlugin = (params) => ({
68
+ id: params.id,
69
+ meta: {
70
+ id: params.id,
71
+ label: params.label ?? String(params.id),
72
+ selectionLabel: params.label ?? String(params.id),
73
+ docsPath: params.docsPath ?? `/channels/${params.id}`,
74
+ blurb: "test stub.",
75
+ },
76
+ capabilities: params.capabilities ?? { chatTypes: ["direct"] },
77
+ config: {
78
+ listAccountIds: () => [],
79
+ resolveAccount: () => ({}),
80
+ },
81
+ outbound: params.outbound,
82
+ });
@@ -0,0 +1,73 @@
1
+ import { createServer } from "node:net";
2
+ import { isMainThread, threadId } from "node:worker_threads";
3
+ async function isPortFree(port) {
4
+ if (!Number.isFinite(port) || port <= 0 || port > 65535)
5
+ return false;
6
+ return await new Promise((resolve) => {
7
+ const server = createServer();
8
+ server.once("error", () => resolve(false));
9
+ server.listen(port, "127.0.0.1", () => {
10
+ server.close(() => resolve(true));
11
+ });
12
+ });
13
+ }
14
+ async function getOsFreePort() {
15
+ return await new Promise((resolve, reject) => {
16
+ const server = createServer();
17
+ server.once("error", reject);
18
+ server.listen(0, "127.0.0.1", () => {
19
+ const addr = server.address();
20
+ if (!addr || typeof addr === "string") {
21
+ server.close();
22
+ reject(new Error("failed to acquire free port"));
23
+ return;
24
+ }
25
+ const port = addr.port;
26
+ server.close((err) => (err ? reject(err) : resolve(port)));
27
+ });
28
+ });
29
+ }
30
+ let nextTestPortOffset = 0;
31
+ /**
32
+ * Allocate a deterministic per-worker port block.
33
+ *
34
+ * Motivation: many tests spin up gateway + related services that use derived ports
35
+ * (e.g. +1/+2/+3/+4). If each test just grabs an OS free port, parallel test runs
36
+ * can collide on derived ports and get flaky EADDRINUSE.
37
+ */
38
+ export async function getDeterministicFreePortBlock(params) {
39
+ const offsets = params?.offsets ?? [0, 1, 2, 3, 4];
40
+ const maxOffset = Math.max(...offsets);
41
+ const workerIdRaw = process.env.VITEST_WORKER_ID ?? process.env.VITEST_POOL_ID ?? "";
42
+ const workerId = Number.parseInt(workerIdRaw, 10);
43
+ const shard = Number.isFinite(workerId)
44
+ ? Math.max(0, workerId)
45
+ : isMainThread
46
+ ? Math.abs(process.pid)
47
+ : Math.abs(threadId);
48
+ const rangeSize = 1000;
49
+ const shardCount = 30;
50
+ const base = 30_000 + (Math.abs(shard) % shardCount) * rangeSize; // <= 59_999
51
+ const usable = rangeSize - maxOffset;
52
+ // Allocate in blocks to avoid derived-port overlaps (e.g. port+3).
53
+ const blockSize = Math.max(maxOffset + 1, 8);
54
+ for (let attempt = 0; attempt < usable; attempt += 1) {
55
+ const start = base + ((nextTestPortOffset + attempt) % usable);
56
+ // eslint-disable-next-line no-await-in-loop
57
+ const ok = (await Promise.all(offsets.map((offset) => isPortFree(start + offset)))).every(Boolean);
58
+ if (!ok)
59
+ continue;
60
+ nextTestPortOffset = (nextTestPortOffset + attempt + blockSize) % usable;
61
+ return start;
62
+ }
63
+ // Fallback: let the OS pick a port block (best effort).
64
+ for (let attempt = 0; attempt < 25; attempt += 1) {
65
+ // eslint-disable-next-line no-await-in-loop
66
+ const port = await getOsFreePort();
67
+ // eslint-disable-next-line no-await-in-loop
68
+ const ok = (await Promise.all(offsets.map((offset) => isPortFree(port + offset)))).every(Boolean);
69
+ if (ok)
70
+ return port;
71
+ }
72
+ throw new Error("failed to acquire a free port block");
73
+ }
@@ -0,0 +1,61 @@
1
+ export function splitShellArgs(raw) {
2
+ const tokens = [];
3
+ let buf = "";
4
+ let inSingle = false;
5
+ let inDouble = false;
6
+ let escaped = false;
7
+ const pushToken = () => {
8
+ if (buf.length > 0) {
9
+ tokens.push(buf);
10
+ buf = "";
11
+ }
12
+ };
13
+ for (let i = 0; i < raw.length; i += 1) {
14
+ const ch = raw[i];
15
+ if (escaped) {
16
+ buf += ch;
17
+ escaped = false;
18
+ continue;
19
+ }
20
+ if (!inSingle && !inDouble && ch === "\\") {
21
+ escaped = true;
22
+ continue;
23
+ }
24
+ if (inSingle) {
25
+ if (ch === "'") {
26
+ inSingle = false;
27
+ }
28
+ else {
29
+ buf += ch;
30
+ }
31
+ continue;
32
+ }
33
+ if (inDouble) {
34
+ if (ch === '"') {
35
+ inDouble = false;
36
+ }
37
+ else {
38
+ buf += ch;
39
+ }
40
+ continue;
41
+ }
42
+ if (ch === "'") {
43
+ inSingle = true;
44
+ continue;
45
+ }
46
+ if (ch === '"') {
47
+ inDouble = true;
48
+ continue;
49
+ }
50
+ if (/\s/.test(ch)) {
51
+ pushToken();
52
+ continue;
53
+ }
54
+ buf += ch;
55
+ }
56
+ if (escaped || inSingle || inDouble) {
57
+ return null;
58
+ }
59
+ pushToken();
60
+ return tokens;
61
+ }
package/dist/utils.js CHANGED
@@ -243,5 +243,15 @@ export function formatTerminalLink(label, url, opts) {
243
243
  }
244
244
  return `\u001b]8;;${safeUrl}\u0007${safeLabel}\u001b]8;;\u0007`;
245
245
  }
246
+ /**
247
+ * Strict plain-object check — returns true only for `Object.create(null)` or `{}` literals.
248
+ * Arrays, Dates, RegExps, class instances, and null/undefined all return false.
249
+ */
250
+ export function isPlainObject(value) {
251
+ if (typeof value !== "object" || value === null)
252
+ return false;
253
+ const proto = Object.getPrototypeOf(value);
254
+ return proto === Object.prototype || proto === null;
255
+ }
246
256
  // Configuration root; can be overridden via CLAWDBOT_STATE_DIR.
247
257
  export const CONFIG_DIR = resolveConfigDir();
@@ -1,6 +1,6 @@
1
- import { deflateSync } from "node:zlib";
2
1
  import QRCodeModule from "qrcode-terminal/vendor/QRCode/index.js";
3
2
  import QRErrorCorrectLevelModule from "qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js";
3
+ import { encodePngRgba, fillPixel } from "../media/png-encode.js";
4
4
  const QRCode = QRCodeModule;
5
5
  const QRErrorCorrectLevel = QRErrorCorrectLevelModule;
6
6
  function createQrMatrix(input) {
@@ -9,66 +9,6 @@ function createQrMatrix(input) {
9
9
  qr.make();
10
10
  return qr;
11
11
  }
12
- function fillPixel(buf, x, y, width, r, g, b, a = 255) {
13
- const idx = (y * width + x) * 4;
14
- buf[idx] = r;
15
- buf[idx + 1] = g;
16
- buf[idx + 2] = b;
17
- buf[idx + 3] = a;
18
- }
19
- function crcTable() {
20
- const table = new Uint32Array(256);
21
- for (let i = 0; i < 256; i += 1) {
22
- let c = i;
23
- for (let k = 0; k < 8; k += 1) {
24
- c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
25
- }
26
- table[i] = c >>> 0;
27
- }
28
- return table;
29
- }
30
- const CRC_TABLE = crcTable();
31
- function crc32(buf) {
32
- let crc = 0xffffffff;
33
- for (let i = 0; i < buf.length; i += 1) {
34
- crc = CRC_TABLE[(crc ^ buf[i]) & 0xff] ^ (crc >>> 8);
35
- }
36
- return (crc ^ 0xffffffff) >>> 0;
37
- }
38
- function pngChunk(type, data) {
39
- const typeBuf = Buffer.from(type, "ascii");
40
- const len = Buffer.alloc(4);
41
- len.writeUInt32BE(data.length, 0);
42
- const crc = crc32(Buffer.concat([typeBuf, data]));
43
- const crcBuf = Buffer.alloc(4);
44
- crcBuf.writeUInt32BE(crc, 0);
45
- return Buffer.concat([len, typeBuf, data, crcBuf]);
46
- }
47
- function encodePngRgba(buffer, width, height) {
48
- const stride = width * 4;
49
- const raw = Buffer.alloc((stride + 1) * height);
50
- for (let row = 0; row < height; row += 1) {
51
- const rawOffset = row * (stride + 1);
52
- raw[rawOffset] = 0; // filter: none
53
- buffer.copy(raw, rawOffset + 1, row * stride, row * stride + stride);
54
- }
55
- const compressed = deflateSync(raw);
56
- const signature = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
57
- const ihdr = Buffer.alloc(13);
58
- ihdr.writeUInt32BE(width, 0);
59
- ihdr.writeUInt32BE(height, 4);
60
- ihdr[8] = 8; // bit depth
61
- ihdr[9] = 6; // color type RGBA
62
- ihdr[10] = 0; // compression
63
- ihdr[11] = 0; // filter
64
- ihdr[12] = 0; // interlace
65
- return Buffer.concat([
66
- signature,
67
- pngChunk("IHDR", ihdr),
68
- pngChunk("IDAT", compressed),
69
- pngChunk("IEND", Buffer.alloc(0)),
70
- ]);
71
- }
72
12
  export async function renderQrPngBase64(input, opts = {}) {
73
13
  const { scale = 6, marginModules = 4 } = opts;
74
14
  const qr = createQrMatrix(input);
@@ -269,8 +269,8 @@ export async function finalizeOnboardingWizard(options) {
269
269
  await prompter.note([
270
270
  `Dashboard link (with token): ${authedUrl}`,
271
271
  controlUiOpened
272
- ? "Opened in your browser. Keep that tab to control Moltbot."
273
- : "Copy/paste this URL in a browser on this machine to control Moltbot.",
272
+ ? "Opened in your browser. Keep that tab to control Poolbot."
273
+ : "Copy/paste this URL in a browser on this machine to control Poolbot.",
274
274
  controlUiOpenHint,
275
275
  ]
276
276
  .filter(Boolean)
@@ -314,8 +314,8 @@ export async function finalizeOnboardingWizard(options) {
314
314
  await prompter.note([
315
315
  `Dashboard link (with token): ${authedUrl}`,
316
316
  controlUiOpened
317
- ? "Opened in your browser. Keep that tab to control Moltbot."
318
- : "Copy/paste this URL in a browser on this machine to control Moltbot.",
317
+ ? "Opened in your browser. Keep that tab to control Poolbot."
318
+ : "Copy/paste this URL in a browser on this machine to control Poolbot.",
319
319
  controlUiOpenHint,
320
320
  ]
321
321
  .filter(Boolean)
@@ -336,7 +336,7 @@ export async function finalizeOnboardingWizard(options) {
336
336
  : [
337
337
  "If you want your agent to be able to search the web, you’ll need an API key.",
338
338
  "",
339
- "Moltbot uses Brave Search for the `web_search` tool. Without a Brave Search API key, web search won’t work.",
339
+ "Poolbot uses Brave Search for the `web_search` tool. Without a Brave Search API key, web search won’t work.",
340
340
  "",
341
341
  "Set it up interactively:",
342
342
  `- Run: ${formatCliCommand("poolbot configure --section web")}`,
@@ -347,8 +347,8 @@ export async function finalizeOnboardingWizard(options) {
347
347
  ].join("\n"), "Web search (optional)");
348
348
  await prompter.note('What now: https://molt.bot/showcase ("What People Are Building").', "What now");
349
349
  await prompter.outro(controlUiOpened
350
- ? "Onboarding complete. Dashboard opened with your token; keep that tab to control Moltbot."
350
+ ? "Onboarding complete. Dashboard opened with your token; keep that tab to control Poolbot."
351
351
  : seededInBackground
352
352
  ? "Onboarding complete. Web UI seeded in the background; open it anytime with the tokenized link above."
353
- : "Onboarding complete. Use the tokenized dashboard link above to control Moltbot.");
353
+ : "Onboarding complete. Use the tokenized dashboard link above to control Poolbot.");
354
354
  }
@@ -22,11 +22,11 @@ async function requireRiskAcknowledgement(params) {
22
22
  await params.prompter.note([
23
23
  "Security warning — please read.",
24
24
  "",
25
- "Moltbot is a hobby project and still in beta. Expect sharp edges.",
25
+ "Poolbot is a hobby project and still in beta. Expect sharp edges.",
26
26
  "This bot can read files and run actions if tools are enabled.",
27
27
  "A bad prompt can trick it into doing unsafe things.",
28
28
  "",
29
- "If you’re not comfortable with basic security and access control, don’t run Moltbot.",
29
+ "If you’re not comfortable with basic security and access control, don’t run Poolbot.",
30
30
  "Ask someone experienced to help before enabling tools or exposing it to the internet.",
31
31
  "",
32
32
  "Recommended baseline:",
@@ -51,7 +51,7 @@ async function requireRiskAcknowledgement(params) {
51
51
  }
52
52
  export async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
53
53
  printWizardHeader(runtime);
54
- await prompter.intro("Moltbot onboarding");
54
+ await prompter.intro("Poolbot onboarding");
55
55
  await requireRiskAcknowledgement({ opts, prompter });
56
56
  const snapshot = await readConfigFileSnapshot();
57
57
  let baseConfig = snapshot.valid ? snapshot.config : {};
@@ -5,7 +5,7 @@
5
5
  Existem **dois workflows de release** diferentes no pool-bot:
6
6
 
7
7
  ### 1. `release.yml` - Binários CLI
8
- - **O que faz:** Gera binários standalone do Moltbot CLI
8
+ - **O que faz:** Gera binários standalone do Poolbot CLI
9
9
  - **Ferramenta:** `pkg`
10
10
  - **Saída:**
11
11
  - Windows: `poolbot-win-x64.exe` (CLI)
@@ -38,13 +38,13 @@ Existem **dois workflows de release** diferentes no pool-bot:
38
38
  ## Quando Usar Cada Workflow
39
39
 
40
40
  ### release.yml (CLI)
41
- - Quando você quer instalar o Moltbot como ferramenta de CLI
41
+ - Quando você quer instalar o Poolbot como ferramenta de CLI
42
42
  - Quando você quer executar `poolbot gateway`, `poolbot tui`, etc.
43
43
  - Quando você quer integrar em scripts de automação
44
44
  - Para desenvolvedores e usuários técnicos
45
45
 
46
46
  ### release-apps.yml (Apps)
47
- - Quando você quer usar o Moltbot como app normal
47
+ - Quando você quer usar o Poolbot como app normal
48
48
  - Quando você quer notificações nativas no Windows
49
49
  - Quando você quer Canvas, Chat e Camera no Android
50
50
  - Para usuários finais, não técnicos
package/docs/_config.yml CHANGED
@@ -1,4 +1,4 @@
1
- title: "Moltbot Docs"
1
+ title: "Poolbot Docs"
2
2
  description: "A TypeScript/Node gateway + macOS/iOS/Android companions for WhatsApp (web) and Telegram (bot)."
3
3
  markdown: kramdown
4
4
  highlighter: rouge
@@ -22,7 +22,7 @@ defaults:
22
22
  nav:
23
23
  - title: "Home"
24
24
  url: "/"
25
- - title: "Moltbot Assistant"
25
+ - title: "Poolbot Assistant"
26
26
  url: "/start/clawd/"
27
27
  - title: "Gateway"
28
28
  url: "/gateway/"
@@ -17,7 +17,7 @@
17
17
  <script>
18
18
  (() => {
19
19
  try {
20
- const stored = localStorage.getItem("moltbot:theme");
20
+ const stored = localStorage.getItem("poolbot:theme");
21
21
  if (stored === "light" || stored === "dark") document.documentElement.dataset.theme = stored;
22
22
  } catch {
23
23
  // ignore
@@ -35,7 +35,7 @@
35
35
  <header class="shell">
36
36
  <div class="shell__frame" role="banner">
37
37
  <div class="shell__titlebar">
38
- <div class="brand" aria-label="Moltbot docs terminal">
38
+ <div class="brand" aria-label="Poolbot docs terminal">
39
39
  <img
40
40
  class="brand__logo"
41
41
  src="{{ "/assets/pixel-lobster.svg" | relative_url }}"
@@ -45,17 +45,17 @@
45
45
  decoding="async"
46
46
  />
47
47
  <div class="brand__text">
48
- <div class="brand__name">Moltbot</div>
48
+ <div class="brand__name">Poolbot</div>
49
49
  <div class="brand__hint">docs // lobster terminal</div>
50
50
  </div>
51
51
  </div>
52
52
 
53
53
  <div class="titlebar__actions">
54
- <a class="titlebar__cta" href="https://github.com/moltbot/moltbot">
54
+ <a class="titlebar__cta" href="https://github.com/poolbot/poolbot">
55
55
  <span class="titlebar__cta-label">GitHub</span>
56
56
  <span class="titlebar__cta-meta">repo</span>
57
57
  </a>
58
- <a class="titlebar__cta titlebar__cta--accent" href="https://github.com/moltbot/moltbot/releases/latest">
58
+ <a class="titlebar__cta titlebar__cta--accent" href="https://github.com/poolbot/poolbot/releases/latest">
59
59
  <span class="titlebar__cta-label">Download</span>
60
60
  <span class="titlebar__cta-meta">latest</span>
61
61
  </a>
@@ -90,7 +90,7 @@
90
90
  <main id="content" class="content" role="main">
91
91
  <div class="terminal">
92
92
  <div class="terminal__prompt" aria-hidden="true">
93
- <span class="prompt__user">clawd</span>@<span class="prompt__host">moltbot</span>:<span class="prompt__path">~/docs</span>$<span class="prompt__cmd">
93
+ <span class="prompt__user">clawd</span>@<span class="prompt__host">poolbot</span>:<span class="prompt__path">~/docs</span>$<span class="prompt__cmd">
94
94
  {% if page.url == "/" %}cat index.md{% else %}less {{ page.path }}{% endif %}
95
95
  </span>
96
96
  </div>
@@ -116,11 +116,11 @@
116
116
 
117
117
  <footer class="terminal__footer" role="contentinfo">
118
118
  <div class="footer__line">
119
- <span class="footer__sig">moltbot.ai</span>
119
+ <span class="footer__sig">poolbot.ai</span>
120
120
  <span class="footer__sep">·</span>
121
- <a href="https://github.com/moltbot/moltbot">source</a>
121
+ <a href="https://github.com/poolbot/poolbot">source</a>
122
122
  <span class="footer__sep">·</span>
123
- <a href="https://github.com/moltbot/moltbot/releases">releases</a>
123
+ <a href="https://github.com/poolbot/poolbot/releases">releases</a>
124
124
  </div>
125
125
  <div class="footer__hint" aria-hidden="true">
126
126
  tip: press <kbd>F2</kbd> (Mac: <kbd>fn</kbd>+<kbd>F2</kbd>) to flip
@@ -58,7 +58,7 @@ Authoritative list lives in `src/gateway/server.ts` (`METHODS`, `EVENTS`).
58
58
  - Server handshake + method dispatch: `src/gateway/server.ts`
59
59
  - Node client: `src/gateway/client.ts`
60
60
  - Generated JSON Schema: `dist/protocol.schema.json`
61
- - Generated Swift models: `apps/macos/Sources/ClawdbotProtocol/GatewayModels.swift`
61
+ - Generated Swift models: `apps/macos/Sources/Pool-BotProtocol/GatewayModels.swift`
62
62
 
63
63
  ## Current pipeline
64
64
 
package/docs/docs.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://mintlify.com/docs.json",
3
- "name": "Moltbot",
3
+ "name": "Poolbot",
4
4
  "theme": "mint",
5
5
  "logo": {
6
6
  "light": "/assets/pixel-lobster.svg",
@@ -2,25 +2,25 @@
2
2
  title: Deploy on Northflank
3
3
  ---
4
4
 
5
- Deploy Moltbot on Northflank with a one-click template and finish setup in your browser.
5
+ Deploy Poolbot on Northflank with a one-click template and finish setup in your browser.
6
6
  This is the easiest “no terminal on the server” path: Northflank runs the Gateway for you,
7
7
  and you configure everything via the `/setup` web wizard.
8
8
 
9
9
  ## How to get started
10
10
 
11
- 1. Click [Deploy Moltbot](https://northflank.com/stacks/deploy-moltbot) to open the template.
11
+ 1. Click [Deploy Poolbot](https://northflank.com/stacks/deploy-moltbot) to open the template.
12
12
  2. Create an [account on Northflank](https://app.northflank.com/signup) if you don’t already have one.
13
- 3. Click **Deploy Moltbot now**.
13
+ 3. Click **Deploy Poolbot now**.
14
14
  4. Set the required environment variable: `SETUP_PASSWORD`.
15
- 5. Click **Deploy stack** to build and run the Moltbot template.
15
+ 5. Click **Deploy stack** to build and run the Poolbot template.
16
16
  6. Wait for the deployment to complete, then click **View resources**.
17
- 7. Open the Moltbot service.
18
- 8. Open the public Moltbot URL and complete setup at `/setup`.
17
+ 7. Open the Poolbot service.
18
+ 8. Open the public Poolbot URL and complete setup at `/setup`.
19
19
  9. Open the Control UI at `/moltbot`.
20
20
 
21
21
  ## What you get
22
22
 
23
- - Hosted Moltbot Gateway + Control UI
23
+ - Hosted Poolbot Gateway + Control UI
24
24
  - Web setup wizard at `/setup` (no terminal commands)
25
25
  - Persistent storage via Northflank Volume (`/data`) so config/credentials/workspace survive redeploys
26
26
 
package/docs/railway.mdx CHANGED
@@ -2,7 +2,7 @@
2
2
  title: Deploy on Railway
3
3
  ---
4
4
 
5
- Deploy Moltbot on Railway with a one-click template and finish setup in your browser.
5
+ Deploy Poolbot on Railway with a one-click template and finish setup in your browser.
6
6
  This is the easiest “no terminal on the server” path: Railway runs the Gateway for you,
7
7
  and you configure everything via the `/setup` web wizard.
8
8
 
@@ -31,7 +31,7 @@ Then open:
31
31
 
32
32
  ## What you get
33
33
 
34
- - Hosted Moltbot Gateway + Control UI
34
+ - Hosted Poolbot Gateway + Control UI
35
35
  - Web setup wizard at `/setup` (no terminal commands)
36
36
  - Persistent storage via Railway Volume (`/data`) so config/credentials/workspace survive redeploys
37
37
  - Backup export at `/setup/export` to migrate off Railway later
@@ -93,4 +93,4 @@ Download a backup at:
93
93
 
94
94
  - `https://<your-railway-domain>/setup/export`
95
95
 
96
- This exports your Moltbot state + workspace so you can migrate to another host without losing config or memory.
96
+ This exports your Poolbot state + workspace so you can migrate to another host without losing config or memory.
package/docs/render.mdx CHANGED
@@ -2,7 +2,7 @@
2
2
  title: Deploy on Render
3
3
  ---
4
4
 
5
- Deploy Moltbot on Render using Infrastructure as Code. The included `render.yaml` Blueprint defines your entire stack declaratively, service, disk, environment variables, so you can deploy with a single click and version your infrastructure alongside your code.
5
+ Deploy Poolbot on Render using Infrastructure as Code. The included `render.yaml` Blueprint defines your entire stack declaratively, service, disk, environment variables, so you can deploy with a single click and version your infrastructure alongside your code.
6
6
 
7
7
  ## Prerequisites
8
8
 
@@ -24,7 +24,7 @@ Once deployed, your service URL follows the pattern `https://<service-name>.onre
24
24
  ## Understanding the Blueprint
25
25
 
26
26
  Render Blueprints are YAML files that define your infrastructure. The `render.yaml` in this
27
- repository configures everything needed to run Moltbot:
27
+ repository configures everything needed to run Poolbot:
28
28
 
29
29
  ```yaml
30
30
  services:
@@ -104,7 +104,7 @@ Modify variables in **Dashboard → your service → Environment**. Changes trig
104
104
 
105
105
  ### Auto-deploy
106
106
 
107
- If you use the original Moltbot repository, Render will not auto-deploy your Moltbot. To update it, run a manual Blueprint sync from the dashboard.
107
+ If you use the original Poolbot repository, Render will not auto-deploy your Poolbot. To update it, run a manual Blueprint sync from the dashboard.
108
108
 
109
109
  ## Custom domain
110
110
 
@@ -120,7 +120,7 @@ Render supports horizontal and vertical scaling:
120
120
  - **Vertical**: Change the plan to get more CPU/RAM
121
121
  - **Horizontal**: Increase instance count (Standard plan and above)
122
122
 
123
- For Moltbot, vertical scaling is usually sufficient. Horizontal scaling requires sticky sessions or external state management.
123
+ For Poolbot, vertical scaling is usually sufficient. Horizontal scaling requires sticky sessions or external state management.
124
124
 
125
125
  ## Backups and migration
126
126
 
@@ -130,7 +130,7 @@ Export your configuration and workspace at any time:
130
130
  https://<your-service>.onrender.com/setup/export
131
131
  ```
132
132
 
133
- This downloads a portable backup you can restore on any Moltbot host.
133
+ This downloads a portable backup you can restore on any Poolbot host.
134
134
 
135
135
  ## Troubleshooting
136
136
 
@@ -13,7 +13,7 @@ In the beginning, there was **Warelay** — a sensible name for a WhatsApp gatew
13
13
 
14
14
  But then came a space lobster.
15
15
 
16
- For a while, the lobster was called **Clawd**, living in a **Clawdbot**. But in January 2026, Anthropic sent a polite email asking for a name change (trademark stuff). And so the lobster did what lobsters do best:
16
+ For a while, the lobster was called **Clawd**, living in a **Pool-Bot**. But in January 2026, Anthropic sent a polite email asking for a name change (trademark stuff). And so the lobster did what lobsters do best:
17
17
 
18
18
  **It molted.**
19
19
 
@@ -94,7 +94,7 @@ Then the chaos began.
94
94
 
95
95
  **The Handsome Molty Incident:** Molty was given elevated access to generate their own new icon. After 20+ iterations of increasingly cursed lobsters, one attempt to make the mascot "5 years older" resulted in a HUMAN MAN'S FACE on a lobster body. Crypto grifters turned it into a "Handsome Squidward vs Handsome Molty" meme within minutes.
96
96
 
97
- **The Fake Developers:** Scammers created fake GitHub profiles claiming to be "Head of Engineering at Clawdbot" to promote pump-and-dump tokens.
97
+ **The Fake Developers:** Scammers created fake GitHub profiles claiming to be "Head of Engineering at Pool-Bot" to promote pump-and-dump tokens.
98
98
 
99
99
  Peter, watching the chaos unfold: *"this is cinema"* 🎬
100
100
 
@@ -1,4 +1,4 @@
1
- import type { MoltbotPluginApi } from "poolbot/plugin-sdk";
1
+ import type { PoolbotPluginApi } from "poolbot/plugin-sdk";
2
2
  import { emptyPluginConfigSchema } from "poolbot/plugin-sdk";
3
3
 
4
4
  import { bluebubblesPlugin } from "./src/channel.js";
@@ -10,7 +10,7 @@ const plugin = {
10
10
  name: "BlueBubbles",
11
11
  description: "BlueBubbles channel plugin (macOS app)",
12
12
  configSchema: emptyPluginConfigSchema(),
13
- register(api: MoltbotPluginApi) {
13
+ register(api: PoolbotPluginApi) {
14
14
  setBlueBubblesRuntime(api.runtime);
15
15
  api.registerChannel({ plugin: bluebubblesPlugin });
16
16
  api.registerHttpHandler(handleBlueBubblesWebhookRequest);
@@ -2,7 +2,7 @@
2
2
  "name": "@poolbot/bluebubbles",
3
3
  "version": "2026.1.26",
4
4
  "type": "module",
5
- "description": "Moltbot BlueBubbles channel plugin",
5
+ "description": "Poolbot BlueBubbles channel plugin",
6
6
  "poolbot": {
7
7
  "extensions": [
8
8
  "./index.ts"