@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.
- package/assets/chrome-extension/README.md +3 -3
- package/assets/chrome-extension/background.js +5 -5
- package/assets/chrome-extension/manifest.json +3 -3
- package/assets/chrome-extension/options.html +4 -4
- package/assets/chrome-extension/options.js +1 -1
- package/dist/acp/client.js +3 -3
- package/dist/acp/types.js +1 -1
- package/dist/agents/agent-paths.js +3 -3
- package/dist/agents/auth-profiles/paths.js +3 -3
- package/dist/agents/cli-runner/helpers.js +1 -1
- package/dist/agents/cli-runner.js +2 -2
- package/dist/agents/cloudflare-ai-gateway.js +31 -0
- package/dist/agents/compaction.js +16 -2
- package/dist/agents/context-window-guard.js +13 -10
- package/dist/agents/context.js +4 -4
- package/dist/agents/docs-path.js +1 -1
- package/dist/agents/minimax-vlm.js +1 -1
- package/dist/agents/model-auth.js +12 -1
- package/dist/agents/model-catalog.js +4 -4
- package/dist/agents/model-selection.js +10 -4
- package/dist/agents/models-config.js +3 -3
- package/dist/agents/models-config.providers.js +147 -39
- package/dist/agents/pi-embedded-helpers/openai.js +1 -1
- package/dist/agents/pi-embedded-runner/compact.js +8 -8
- package/dist/agents/pi-embedded-runner/model.js +2 -2
- package/dist/agents/pi-embedded-runner/run/attempt.js +6 -6
- package/dist/agents/pi-embedded-runner/run.js +4 -4
- package/dist/agents/pi-embedded-runner/tool-result-truncation.js +275 -0
- package/dist/agents/pi-embedded-runner/utils.js +1 -1
- package/dist/agents/pi-model-discovery.js +10 -0
- package/dist/agents/pi-tool-definition-adapter.js +50 -9
- package/dist/agents/pi-tools.before-tool-call.js +67 -0
- package/dist/agents/pi-tools.js +10 -5
- package/dist/agents/pi-tools.read.js +2 -2
- package/dist/agents/session-file-repair.js +83 -0
- package/dist/agents/session-transcript-repair.js +68 -0
- package/dist/agents/skills/frontmatter.js +1 -1
- package/dist/agents/skills/workspace.js +2 -2
- package/dist/agents/system-prompt.js +28 -4
- package/dist/agents/together-models.js +127 -0
- package/dist/agents/tool-images.js +1 -1
- package/dist/agents/tool-policy.js +1 -1
- package/dist/agents/tools/browser-tool.js +3 -3
- package/dist/agents/tools/image-tool.js +2 -2
- package/dist/agents/tools/memory-tool.js +94 -7
- package/dist/agents/tools/web-search.js +1 -1
- package/dist/agents/workspace.js +1 -5
- package/dist/auto-reply/commands-registry.data.js +1 -1
- package/dist/auto-reply/reply/commands-context-report.js +2 -2
- package/dist/auto-reply/reply/commands-session.js +2 -2
- package/dist/auto-reply/reply/get-reply-run.js +14 -4
- package/dist/auto-reply/reply/groups.js +1 -1
- package/dist/auto-reply/reply/inbound-context.js +4 -0
- package/dist/auto-reply/reply/inbound-meta.js +130 -0
- package/dist/auto-reply/reply/untrusted-context.js +15 -0
- package/dist/auto-reply/status.js +1 -1
- package/dist/browser/client-fetch.js +1 -1
- package/dist/browser/config.js +1 -1
- package/dist/browser/extension-relay.js +3 -3
- package/dist/browser/server-context.js +2 -2
- package/dist/build-info.json +3 -3
- package/dist/canvas-host/a2ui.js +3 -3
- package/dist/channels/plugins/agent-tools/whatsapp-login.js +1 -17
- package/dist/channels/plugins/catalog.js +2 -2
- package/dist/channels/plugins/onboarding/imessage.js +1 -1
- package/dist/channels/plugins/onboarding/signal.js +1 -1
- package/dist/channels/plugins/onboarding/slack.js +4 -4
- package/dist/channels/plugins/onboarding/whatsapp.js +3 -3
- package/dist/channels/plugins/pairing-message.js +1 -1
- package/dist/cli/browser-cli-extension.js +2 -2
- package/dist/cli/docs-cli.js +1 -1
- package/dist/cli/gateway-cli/dev.js +1 -1
- package/dist/cli/memory-cli.js +25 -15
- package/dist/cli/nodes-cli/register.canvas.js +1 -1
- package/dist/cli/plugins-cli.js +1 -1
- package/dist/cli/run-main.js +2 -2
- package/dist/cli/security-cli.js +1 -1
- package/dist/cli/tagline.js +1 -1
- package/dist/cli/update-cli.js +4 -4
- package/dist/cli/webhooks-cli.js +5 -5
- package/dist/commands/agents.commands.add.js +1 -1
- package/dist/commands/auth-choice.apply.api-providers.js +305 -17
- package/dist/commands/auth-choice.apply.js +4 -1
- package/dist/commands/auth-choice.apply.plugin-provider.js +2 -2
- package/dist/commands/auth-choice.apply.xai.js +63 -0
- package/dist/commands/auth-choice.preferred-provider.js +7 -1
- package/dist/commands/configure.wizard.js +1 -1
- package/dist/commands/dashboard.js +1 -1
- package/dist/commands/docs.js +1 -1
- package/dist/commands/doctor-gateway-services.js +3 -3
- package/dist/commands/doctor-state-integrity.js +2 -14
- package/dist/commands/doctor-update.js +3 -3
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/models/list.probe.js +2 -2
- package/dist/commands/models/list.registry.js +4 -4
- package/dist/commands/models/list.status-command.js +2 -2
- package/dist/commands/onboard-auth.config-core.js +366 -28
- package/dist/commands/onboard-auth.credentials.js +71 -9
- package/dist/commands/onboard-auth.js +3 -3
- package/dist/commands/onboard-auth.models.js +26 -24
- package/dist/commands/onboard-non-interactive/local/auth-choice.js +140 -6
- package/dist/commands/status-all/report-lines.js +1 -1
- package/dist/commands/status.command.js +1 -1
- package/dist/commands/uninstall.js +3 -3
- package/dist/compat/legacy-names.js +1 -1
- package/dist/config/io.js +3 -3
- package/dist/config/schema.js +1 -1
- package/dist/config/types.js +0 -1
- package/dist/config/types.memory.js +1 -0
- package/dist/config/version.js +4 -4
- package/dist/config/zod-schema.js +0 -6
- package/dist/daemon/constants.js +7 -7
- package/dist/daemon/inspect.js +6 -6
- package/dist/daemon/systemd-unit.js +1 -1
- package/dist/discord/monitor/message-handler.process.js +6 -4
- package/dist/gateway/client.js +0 -14
- package/dist/gateway/live-image-probe.js +1 -66
- package/dist/gateway/openai-http.js +2 -2
- package/dist/gateway/openresponses-http.js +4 -4
- package/dist/gateway/server-discovery.js +2 -2
- package/dist/gateway/server-http.js +1 -1
- package/dist/gateway/server.impl.js +2 -6
- package/dist/hooks/frontmatter.js +1 -1
- package/dist/hooks/hooks-status.js +1 -1
- package/dist/hooks/install.js +2 -2
- package/dist/hooks/loader.js +1 -1
- package/dist/hooks/workspace.js +3 -3
- package/dist/index.js +2 -2
- package/dist/infra/bonjour.js +3 -3
- package/dist/infra/path-env.js +3 -3
- package/dist/infra/provider-usage.fetch.minimax.js +1 -1
- package/dist/infra/restart.js +1 -1
- package/dist/infra/tailscale.js +1 -1
- package/dist/macos/relay.js +2 -2
- package/dist/media/input-files.js +1 -1
- package/dist/media/mime.js +4 -0
- package/dist/media/png-encode.js +74 -0
- package/dist/media-understanding/providers/image.js +2 -2
- package/dist/memory/backend-config.js +207 -0
- package/dist/memory/embeddings.js +1 -1
- package/dist/memory/index.js +0 -5
- package/dist/memory/manager.js +3 -25
- package/dist/memory/types.js +1 -0
- package/dist/node-host/runner.js +2 -2
- package/dist/pairing/pairing-messages.js +1 -1
- package/dist/plugins/discovery.js +1 -1
- package/dist/plugins/install.js +2 -2
- package/dist/plugins/update.js +1 -1
- package/dist/security/audit.js +2 -2
- package/dist/shared/text/reasoning-tags.js +52 -7
- package/dist/slack/monitor/message-handler/prepare.js +10 -4
- package/dist/slack/monitor/slash.js +10 -4
- package/dist/tailscale/detect.js +146 -0
- package/dist/telegram/bot-message-context.js +1 -1
- package/dist/test-helpers/workspace.js +11 -0
- package/dist/test-utils/channel-plugins.js +82 -0
- package/dist/test-utils/ports.js +73 -0
- package/dist/utils/shell-argv.js +61 -0
- package/dist/utils.js +10 -0
- package/dist/web/qr-image.js +1 -61
- package/dist/wizard/onboarding.finalize.js +7 -7
- package/dist/wizard/onboarding.js +3 -3
- package/docs/RELEASE_WORKFOTS_COMPARISON.md +3 -3
- package/docs/_config.yml +2 -2
- package/docs/_layouts/default.html +9 -9
- package/docs/concepts/typebox.md +1 -1
- package/docs/docs.json +1 -1
- package/docs/northflank.mdx +7 -7
- package/docs/railway.mdx +3 -3
- package/docs/render.mdx +5 -5
- package/docs/start/lore.md +2 -2
- package/extensions/bluebubbles/index.ts +2 -2
- package/extensions/bluebubbles/package.json +1 -1
- package/extensions/bluebubbles/src/accounts.ts +8 -8
- package/extensions/bluebubbles/src/actions.test.ts +22 -22
- package/extensions/bluebubbles/src/actions.ts +5 -5
- package/extensions/bluebubbles/src/attachments.ts +2 -2
- package/extensions/bluebubbles/src/channel.ts +16 -16
- package/extensions/bluebubbles/src/chat.ts +2 -2
- package/extensions/bluebubbles/src/media-send.ts +2 -2
- package/extensions/bluebubbles/src/monitor.test.ts +46 -46
- package/extensions/bluebubbles/src/monitor.ts +5 -5
- package/extensions/bluebubbles/src/onboarding.ts +7 -7
- package/extensions/bluebubbles/src/reactions.ts +2 -2
- package/extensions/bluebubbles/src/send.ts +2 -2
- package/extensions/copilot-proxy/README.md +1 -1
- package/extensions/copilot-proxy/package.json +1 -1
- package/extensions/diagnostics-otel/index.ts +2 -2
- package/extensions/diagnostics-otel/package.json +1 -1
- package/extensions/diagnostics-otel/src/service.ts +3 -3
- package/extensions/discord/index.ts +2 -2
- package/extensions/discord/package.json +1 -1
- package/extensions/google-antigravity-auth/README.md +1 -1
- package/extensions/google-antigravity-auth/index.ts +1 -1
- package/extensions/google-antigravity-auth/package.json +1 -1
- package/extensions/google-gemini-cli-auth/README.md +1 -1
- package/extensions/google-gemini-cli-auth/oauth.ts +1 -1
- package/extensions/google-gemini-cli-auth/package.json +1 -1
- package/extensions/googlechat/index.ts +3 -3
- package/extensions/googlechat/package.json +1 -1
- package/extensions/googlechat/src/accounts.ts +8 -8
- package/extensions/googlechat/src/actions.ts +6 -6
- package/extensions/googlechat/src/channel.ts +21 -21
- package/extensions/googlechat/src/monitor.ts +8 -8
- package/extensions/googlechat/src/onboarding.ts +10 -10
- package/extensions/imessage/index.ts +2 -2
- package/extensions/imessage/package.json +1 -1
- package/extensions/line/index.ts +2 -2
- package/extensions/line/package.json +1 -1
- package/extensions/line/src/card-command.ts +2 -2
- package/extensions/line/src/channel.logout.test.ts +4 -4
- package/extensions/line/src/channel.sendPayload.test.ts +8 -8
- package/extensions/line/src/channel.ts +3 -3
- package/extensions/llm-task/README.md +3 -3
- package/extensions/llm-task/index.ts +2 -2
- package/extensions/llm-task/package.json +1 -1
- package/extensions/llm-task/src/llm-task-tool.ts +4 -4
- package/extensions/lobster/README.md +6 -6
- package/extensions/lobster/index.ts +2 -2
- package/extensions/lobster/src/lobster-tool.test.ts +4 -4
- package/extensions/lobster/src/lobster-tool.ts +2 -2
- package/extensions/matrix/index.ts +2 -2
- package/extensions/matrix/package.json +1 -1
- package/extensions/matrix/src/matrix/client/config.ts +1 -1
- package/extensions/matrix/src/matrix/monitor/handler.ts +1 -1
- package/extensions/matrix/src/onboarding.ts +1 -1
- package/extensions/mattermost/index.ts +2 -2
- package/extensions/mattermost/package.json +1 -1
- package/extensions/mattermost/src/mattermost/accounts.ts +8 -8
- package/extensions/mattermost/src/mattermost/monitor-helpers.ts +5 -5
- package/extensions/mattermost/src/mattermost/monitor.ts +2 -2
- package/extensions/mattermost/src/onboarding-helpers.ts +3 -3
- package/extensions/mattermost/src/onboarding.ts +2 -2
- package/extensions/memory-core/index.ts +2 -2
- package/extensions/memory-core/package.json +1 -4
- package/extensions/memory-lancedb/index.ts +3 -3
- package/extensions/memory-lancedb/package.json +1 -1
- package/extensions/msteams/index.ts +2 -2
- package/extensions/msteams/package.json +1 -1
- package/extensions/msteams/src/channel.directory.test.ts +2 -2
- package/extensions/msteams/src/channel.ts +2 -2
- package/extensions/msteams/src/graph-upload.ts +4 -4
- package/extensions/msteams/src/monitor-handler.ts +2 -2
- package/extensions/msteams/src/monitor.ts +2 -2
- package/extensions/msteams/src/onboarding.ts +9 -9
- package/extensions/msteams/src/reply-dispatcher.ts +2 -2
- package/extensions/msteams/src/send-context.ts +2 -2
- package/extensions/msteams/src/send.ts +4 -4
- package/extensions/nextcloud-talk/index.ts +2 -2
- package/extensions/nextcloud-talk/package.json +1 -1
- package/extensions/nextcloud-talk/src/channel.ts +7 -7
- package/extensions/nextcloud-talk/src/inbound.ts +7 -7
- package/extensions/nextcloud-talk/src/onboarding.ts +1 -1
- package/extensions/nostr/README.md +2 -2
- package/extensions/nostr/index.ts +5 -5
- package/extensions/nostr/package.json +1 -1
- package/extensions/nostr/src/types.ts +4 -4
- package/extensions/open-prose/index.ts +2 -2
- package/extensions/qwen-portal-auth/README.md +1 -1
- package/extensions/signal/index.ts +2 -2
- package/extensions/signal/package.json +1 -1
- package/extensions/slack/index.ts +2 -2
- package/extensions/slack/package.json +1 -1
- package/extensions/telegram/index.ts +2 -2
- package/extensions/telegram/package.json +1 -1
- package/extensions/telegram/src/channel.ts +2 -2
- package/extensions/tlon/README.md +2 -2
- package/extensions/tlon/index.ts +2 -2
- package/extensions/tlon/package.json +1 -1
- package/extensions/tlon/src/channel.ts +13 -13
- package/extensions/tlon/src/monitor/index.ts +3 -3
- package/extensions/tlon/src/onboarding.ts +3 -3
- package/extensions/tlon/src/types.ts +3 -3
- package/extensions/twitch/README.md +1 -1
- package/extensions/twitch/index.ts +2 -2
- package/extensions/twitch/package.json +1 -1
- package/extensions/twitch/src/config.ts +3 -3
- package/extensions/twitch/src/monitor.ts +3 -3
- package/extensions/twitch/src/onboarding.ts +9 -9
- package/extensions/twitch/src/outbound.test.ts +2 -2
- package/extensions/twitch/src/plugin.test.ts +2 -2
- package/extensions/twitch/src/plugin.ts +8 -8
- package/extensions/twitch/src/send.test.ts +2 -2
- package/extensions/twitch/src/send.ts +4 -4
- package/extensions/twitch/src/token.test.ts +8 -8
- package/extensions/twitch/src/token.ts +3 -3
- package/extensions/twitch/src/twitch-client.ts +3 -3
- package/extensions/twitch/src/types.ts +3 -3
- package/extensions/twitch/src/utils/markdown.ts +1 -1
- package/extensions/voice-call/README.md +3 -3
- package/extensions/voice-call/package.json +1 -1
- package/extensions/voice-call/src/core-bridge.ts +2 -2
- package/extensions/voice-call/src/response-generator.ts +1 -1
- package/extensions/whatsapp/index.ts +2 -2
- package/extensions/whatsapp/package.json +1 -1
- package/extensions/zalo/README.md +1 -1
- package/extensions/zalo/index.ts +2 -2
- package/extensions/zalo/package.json +1 -1
- package/extensions/zalo/src/accounts.ts +8 -8
- package/extensions/zalo/src/actions.ts +4 -4
- package/extensions/zalo/src/channel.directory.test.ts +2 -2
- package/extensions/zalo/src/channel.ts +18 -18
- package/extensions/zalo/src/monitor.ts +9 -9
- package/extensions/zalo/src/monitor.webhook.test.ts +2 -2
- package/extensions/zalo/src/onboarding.ts +24 -24
- package/extensions/zalo/src/send.ts +2 -2
- package/extensions/zalouser/README.md +2 -2
- package/extensions/zalouser/index.ts +2 -2
- package/extensions/zalouser/package.json +1 -1
- package/extensions/zalouser/src/accounts.ts +9 -9
- package/extensions/zalouser/src/channel.ts +24 -24
- package/extensions/zalouser/src/monitor.ts +4 -4
- package/extensions/zalouser/src/onboarding.ts +28 -28
- package/package.json +13 -250
- package/skills/nano-banana-pro/scripts/generate_image.py +1 -1
- package/skills/tmux/scripts/find-sessions.sh +1 -1
- package/CHANGELOG.md +0 -200
- package/README-header.png +0 -0
- package/git-hooks/pre-commit +0 -4
- package/scripts/format-staged.js +0 -148
- package/scripts/postinstall.js +0 -300
- package/scripts/setup-git-hooks.js +0 -96
- package/skills/webgpu-threejs-tsl/REFERENCE.md +0 -283
- package/skills/webgpu-threejs-tsl/SKILL.md +0 -91
- package/skills/webgpu-threejs-tsl/docs/compute-shaders.md +0 -404
- package/skills/webgpu-threejs-tsl/docs/core-concepts.md +0 -453
- package/skills/webgpu-threejs-tsl/docs/materials.md +0 -353
- package/skills/webgpu-threejs-tsl/docs/post-processing.md +0 -434
- package/skills/webgpu-threejs-tsl/docs/wgsl-integration.md +0 -324
- package/skills/webgpu-threejs-tsl/examples/basic-setup.js +0 -87
- package/skills/webgpu-threejs-tsl/examples/custom-material.js +0 -170
- package/skills/webgpu-threejs-tsl/examples/earth-shader.js +0 -292
- package/skills/webgpu-threejs-tsl/examples/particle-system.js +0 -259
- package/skills/webgpu-threejs-tsl/examples/post-processing.js +0 -199
- package/skills/webgpu-threejs-tsl/templates/compute-shader.js +0 -305
- 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();
|
package/dist/web/qr-image.js
CHANGED
|
@@ -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
|
|
273
|
-
: "Copy/paste this URL in a browser on this machine to control
|
|
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
|
|
318
|
-
: "Copy/paste this URL in a browser on this machine to control
|
|
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
|
-
"
|
|
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
|
|
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
|
|
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
|
-
"
|
|
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
|
|
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("
|
|
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
|
|
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
|
|
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
|
|
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: "
|
|
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: "
|
|
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("
|
|
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="
|
|
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">
|
|
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/
|
|
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/
|
|
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">
|
|
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">
|
|
119
|
+
<span class="footer__sig">poolbot.ai</span>
|
|
120
120
|
<span class="footer__sep">·</span>
|
|
121
|
-
<a href="https://github.com/
|
|
121
|
+
<a href="https://github.com/poolbot/poolbot">source</a>
|
|
122
122
|
<span class="footer__sep">·</span>
|
|
123
|
-
<a href="https://github.com/
|
|
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
|
package/docs/concepts/typebox.md
CHANGED
|
@@ -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/
|
|
61
|
+
- Generated Swift models: `apps/macos/Sources/Pool-BotProtocol/GatewayModels.swift`
|
|
62
62
|
|
|
63
63
|
## Current pipeline
|
|
64
64
|
|
package/docs/docs.json
CHANGED
package/docs/northflank.mdx
CHANGED
|
@@ -2,25 +2,25 @@
|
|
|
2
2
|
title: Deploy on Northflank
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
Deploy
|
|
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
|
|
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
|
|
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
|
|
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
|
|
18
|
-
8. Open the public
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
133
|
+
This downloads a portable backup you can restore on any Poolbot host.
|
|
134
134
|
|
|
135
135
|
## Troubleshooting
|
|
136
136
|
|
package/docs/start/lore.md
CHANGED
|
@@ -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 **
|
|
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
|
|
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 {
|
|
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:
|
|
13
|
+
register(api: PoolbotPluginApi) {
|
|
14
14
|
setBlueBubblesRuntime(api.runtime);
|
|
15
15
|
api.registerChannel({ plugin: bluebubblesPlugin });
|
|
16
16
|
api.registerHttpHandler(handleBlueBubblesWebhookRequest);
|