@poolzin/pool-bot 2026.2.1 → 2026.2.2

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 (38) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/README-header.png +0 -0
  3. package/dist/agents/context.js +1 -1
  4. package/dist/agents/model-catalog.js +1 -1
  5. package/dist/agents/pi-embedded-runner/compact.js +7 -10
  6. package/dist/agents/pi-embedded-runner/model.js +1 -1
  7. package/dist/agents/tools/image-tool.js +1 -1
  8. package/dist/auto-reply/envelope.js +52 -38
  9. package/dist/auto-reply/reply/mentions.js +1 -1
  10. package/dist/build-info.json +2 -2
  11. package/dist/canvas-host/a2ui/index.html +28 -28
  12. package/dist/commands/auth-choice.apply.oauth.js +1 -1
  13. package/dist/commands/models/list.registry.js +1 -1
  14. package/dist/compat/legacy-names.js +2 -0
  15. package/dist/config/paths.js +1 -1
  16. package/dist/control-ui/assets/{index-CIRDm-Lu.css → index-CSfXd2LO.css} +1 -1
  17. package/dist/control-ui/assets/{index-CmNMuoem.js → index-HRr1grwl.js} +446 -413
  18. package/dist/control-ui/assets/index-HRr1grwl.js.map +1 -0
  19. package/dist/control-ui/index.html +4 -4
  20. package/dist/cron/isolated-agent/run.js +1 -0
  21. package/dist/gateway/test-helpers.mocks.js +11 -7
  22. package/dist/infra/format-time/format-datetime.js +1 -1
  23. package/dist/media/store.js +2 -0
  24. package/dist/media-understanding/providers/image.js +1 -1
  25. package/dist/telegram/bot-message-dispatch.js +6 -2
  26. package/dist/wizard/clack-prompter.js +9 -6
  27. package/extensions/googlechat/node_modules/.bin/poolbot +21 -0
  28. package/extensions/googlechat/package.json +2 -2
  29. package/extensions/line/node_modules/.bin/poolbot +21 -0
  30. package/extensions/line/package.json +1 -1
  31. package/extensions/matrix/node_modules/.bin/poolbot +21 -0
  32. package/extensions/matrix/package.json +1 -1
  33. package/extensions/memory-core/node_modules/.bin/poolbot +21 -0
  34. package/extensions/memory-core/package.json +4 -1
  35. package/extensions/twitch/node_modules/.bin/poolbot +21 -0
  36. package/extensions/twitch/package.json +1 -1
  37. package/package.json +183 -24
  38. package/dist/control-ui/assets/index-CmNMuoem.js.map +0 -1
@@ -3,13 +3,13 @@
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>Moltbot Control</title>
6
+ <title>Poolbot Control</title>
7
7
  <meta name="color-scheme" content="dark light" />
8
8
  <link rel="icon" href="./favicon.ico" sizes="any" />
9
- <script type="module" crossorigin src="./assets/index-CmNMuoem.js"></script>
10
- <link rel="stylesheet" crossorigin href="./assets/index-CIRDm-Lu.css">
9
+ <script type="module" crossorigin src="./assets/index-HRr1grwl.js"></script>
10
+ <link rel="stylesheet" crossorigin href="./assets/index-CSfXd2LO.css">
11
11
  </head>
12
12
  <body>
13
- <moltbot-app></moltbot-app>
13
+ <poolbot-app></poolbot-app>
14
14
  </body>
15
15
  </html>
@@ -458,6 +458,7 @@ export async function runCronIsolatedAgentTurn(params) {
458
458
  startedAt: runStartedAt,
459
459
  endedAt: runEndedAt,
460
460
  outcome: { status: "ok" },
461
+ announceType: "cron job",
461
462
  });
462
463
  if (!didAnnounce) {
463
464
  const message = "cron announce delivery failed";
@@ -197,17 +197,21 @@ export const testState = {
197
197
  export const testIsNixMode = hoisted.testIsNixMode;
198
198
  export const sessionStoreSaveDelayMs = hoisted.sessionStoreSaveDelayMs;
199
199
  export const embeddedRunMock = hoisted.embeddedRunMock;
200
- vi.mock("@mariozechner/pi-coding-agent", async () => {
201
- const actual = await vi.importActual("@mariozechner/pi-coding-agent");
202
- return {
203
- ...actual,
204
- discoverModels: (...args) => {
200
+ vi.mock("../agents/pi-model-discovery.js", async () => {
201
+ const actual = await vi.importActual("../agents/pi-model-discovery.js");
202
+ class MockModelRegistry extends actual.ModelRegistry {
203
+ getAll() {
205
204
  if (!piSdkMock.enabled) {
206
- return actual.discoverModels(...args);
205
+ return super.getAll();
207
206
  }
208
207
  piSdkMock.discoverCalls += 1;
208
+ // Cast to expected type for testing purposes
209
209
  return piSdkMock.models;
210
- },
210
+ }
211
+ }
212
+ return {
213
+ ...actual,
214
+ ModelRegistry: MockModelRegistry,
211
215
  };
212
216
  });
213
217
  vi.mock("../cron/isolated-agent.js", () => ({
@@ -66,7 +66,7 @@ export function formatZonedTimestamp(date, options) {
66
66
  const min = pick("minute");
67
67
  const sec = options?.displaySeconds ? pick("second") : undefined;
68
68
  const tz = [...parts]
69
- .reverse()
69
+ .toReversed()
70
70
  .find((part) => part.type === "timeZoneName")
71
71
  ?.value?.trim();
72
72
  if (!yyyy || !mm || !dd || !hh || !min) {
@@ -3,6 +3,7 @@ import { createWriteStream } from "node:fs";
3
3
  import fs from "node:fs/promises";
4
4
  import { request as httpRequest } from "node:http";
5
5
  import { request as httpsRequest } from "node:https";
6
+ import os from "node:os";
6
7
  import path from "node:path";
7
8
  import { pipeline } from "node:stream/promises";
8
9
  import { resolveConfigDir } from "../utils.js";
@@ -24,6 +25,7 @@ const DEFAULT_TTL_MS = 2 * 60 * 1000; // 2 minutes
24
25
  const SAFE_PATHS = [
25
26
  "/tmp",
26
27
  "/var/tmp",
28
+ os.tmpdir(), // OS-specific temp directory (e.g. /private/var/folders/... on macOS)
27
29
  process.cwd(), // Current working directory
28
30
  resolveConfigDir(), // PoolBot config directory
29
31
  ];
@@ -1,5 +1,5 @@
1
1
  import { complete } from "@mariozechner/pi-ai";
2
- import { discoverAuthStorage, discoverModels } from "@mariozechner/pi-coding-agent";
2
+ import { discoverAuthStorage, discoverModels } from "../../agents/pi-model-discovery.js";
3
3
  import { getApiKeyForModel, requireApiKey } from "../../agents/model-auth.js";
4
4
  import { ensurePoolbotModelsJson } from "../../agents/models-config.js";
5
5
  import { minimaxUnderstandImage } from "../../agents/minimax-vlm.js";
@@ -172,7 +172,10 @@ export const dispatchTelegramMessage = async ({ context, bot, cfg, runtime, repl
172
172
  ? ctxPayload.ReplyToBody.trim() || undefined
173
173
  : undefined;
174
174
  void _replyQuoteText;
175
- const { queuedFinal } = await dispatchReplyWithBufferedBlockDispatcher({
175
+ const deliveryState = {
176
+ delivered: false,
177
+ };
178
+ const { queuedFinal, counts } = await dispatchReplyWithBufferedBlockDispatcher({
176
179
  ctx: ctxPayload,
177
180
  cfg,
178
181
  dispatcherOptions: {
@@ -197,6 +200,7 @@ export const dispatchTelegramMessage = async ({ context, bot, cfg, runtime, repl
197
200
  onVoiceRecording: sendRecordVoice,
198
201
  linkPreview: telegramCfg.linkPreview,
199
202
  });
203
+ deliveryState.delivered = true;
200
204
  },
201
205
  onError: (err, info) => {
202
206
  runtime.error?.(danger(`telegram ${info.kind} reply failed: ${String(err)}`));
@@ -230,7 +234,7 @@ export const dispatchTelegramMessage = async ({ context, bot, cfg, runtime, repl
230
234
  });
231
235
  draftStream?.stop();
232
236
  let sentFallback = false;
233
- if (!queuedFinal) {
237
+ if (!deliveryState.delivered && (counts.tool + counts.block + counts.final) > 0) {
234
238
  try {
235
239
  await deliverReplies({
236
240
  replies: [{ text: EMPTY_RESPONSE_FALLBACK }],
@@ -38,12 +38,15 @@ export function createClackPrompter() {
38
38
  }),
39
39
  initialValues: params.initialValues,
40
40
  })),
41
- text: async (params) => guardCancel(await text({
42
- message: stylePromptMessage(params.message),
43
- initialValue: params.initialValue,
44
- placeholder: params.placeholder,
45
- validate: params.validate,
46
- })),
41
+ text: async (params) => {
42
+ const validate = params.validate;
43
+ return guardCancel(await text({
44
+ message: stylePromptMessage(params.message),
45
+ initialValue: params.initialValue,
46
+ placeholder: params.placeholder,
47
+ validate: validate ? (value) => validate(value ?? "") : undefined,
48
+ }));
49
+ },
47
50
  confirm: async (params) => guardCancel(await confirm({
48
51
  message: stylePromptMessage(params.message),
49
52
  initialValue: params.initialValue,
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/dist/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules:/Users/pool/Documents/GitHub/node_modules:/Users/pool/Documents/node_modules:/Users/pool/node_modules:/Users/node_modules:/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/dist/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules:/Users/pool/Documents/GitHub/node_modules:/Users/pool/Documents/node_modules:/Users/pool/node_modules:/Users/node_modules:/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../@poolzin/pool-bot/dist/entry.js" "$@"
19
+ else
20
+ exec node "$basedir/../@poolzin/pool-bot/dist/entry.js" "$@"
21
+ fi
@@ -31,9 +31,9 @@
31
31
  "google-auth-library": "^10.5.0"
32
32
  },
33
33
  "devDependencies": {
34
- "poolbot": "workspace:*"
34
+ "@poolzin/pool-bot": "workspace:*"
35
35
  },
36
36
  "peerDependencies": {
37
- "poolbot": ">=2026.1.26"
37
+ "@poolzin/pool-bot": ">=2026.1.26"
38
38
  }
39
39
  }
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/dist/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules:/Users/pool/Documents/GitHub/node_modules:/Users/pool/Documents/node_modules:/Users/pool/node_modules:/Users/node_modules:/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/dist/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules:/Users/pool/Documents/GitHub/node_modules:/Users/pool/Documents/node_modules:/Users/pool/node_modules:/Users/node_modules:/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../@poolzin/pool-bot/dist/entry.js" "$@"
19
+ else
20
+ exec node "$basedir/../@poolzin/pool-bot/dist/entry.js" "$@"
21
+ fi
@@ -24,6 +24,6 @@
24
24
  }
25
25
  },
26
26
  "devDependencies": {
27
- "poolbot": "workspace:*"
27
+ "@poolzin/pool-bot": "workspace:*"
28
28
  }
29
29
  }
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/dist/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules:/Users/pool/Documents/GitHub/node_modules:/Users/pool/Documents/node_modules:/Users/pool/node_modules:/Users/node_modules:/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/dist/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules:/Users/pool/Documents/GitHub/node_modules:/Users/pool/Documents/node_modules:/Users/pool/node_modules:/Users/node_modules:/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../@poolzin/pool-bot/dist/entry.js" "$@"
19
+ else
20
+ exec node "$basedir/../@poolzin/pool-bot/dist/entry.js" "$@"
21
+ fi
@@ -31,6 +31,6 @@
31
31
  "zod": "^4.3.6"
32
32
  },
33
33
  "devDependencies": {
34
- "poolbot": "workspace:*"
34
+ "@poolzin/pool-bot": "workspace:*"
35
35
  }
36
36
  }
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/dist/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules:/Users/pool/Documents/GitHub/node_modules:/Users/pool/Documents/node_modules:/Users/pool/node_modules:/Users/node_modules:/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/dist/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules:/Users/pool/Documents/GitHub/node_modules:/Users/pool/Documents/node_modules:/Users/pool/node_modules:/Users/node_modules:/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../@poolzin/pool-bot/dist/entry.js" "$@"
19
+ else
20
+ exec node "$basedir/../@poolzin/pool-bot/dist/entry.js" "$@"
21
+ fi
@@ -8,7 +8,10 @@
8
8
  "./index.ts"
9
9
  ]
10
10
  },
11
+ "devDependencies": {
12
+ "@poolzin/pool-bot": "workspace:*"
13
+ },
11
14
  "peerDependencies": {
12
- "poolbot": ">=2026.1.26"
15
+ "@poolzin/pool-bot": ">=2026.1.26"
13
16
  }
14
17
  }
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/dist/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules:/Users/pool/Documents/GitHub/node_modules:/Users/pool/Documents/node_modules:/Users/pool/node_modules:/Users/node_modules:/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/dist/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules:/Users/pool/Documents/GitHub/node_modules:/Users/pool/Documents/node_modules:/Users/pool/node_modules:/Users/node_modules:/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../@poolzin/pool-bot/dist/entry.js" "$@"
19
+ else
20
+ exec node "$basedir/../@poolzin/pool-bot/dist/entry.js" "$@"
21
+ fi
@@ -10,7 +10,7 @@
10
10
  "zod": "^4.3.5"
11
11
  },
12
12
  "devDependencies": {
13
- "poolbot": "workspace:*"
13
+ "@poolzin/pool-bot": "workspace:*"
14
14
  },
15
15
  "poolbot": {
16
16
  "extensions": [
package/package.json CHANGED
@@ -1,7 +1,25 @@
1
1
  {
2
2
  "name": "@poolzin/pool-bot",
3
- "version": "2026.2.1",
3
+ "version": "2026.2.2",
4
4
  "description": "🎱 Pool Bot - AI assistant with PLCODE integrations",
5
+ "keywords": [],
6
+ "license": "MIT",
7
+ "author": "",
8
+ "bin": {
9
+ "poolbot": "dist/entry.js"
10
+ },
11
+ "files": [
12
+ "assets/",
13
+ "CHANGELOG.md",
14
+ "dist/",
15
+ "docs/",
16
+ "extensions/",
17
+ "LICENSE",
18
+ "patches/",
19
+ "README-header.png",
20
+ "README.md",
21
+ "skills/"
22
+ ],
5
23
  "type": "module",
6
24
  "main": "dist/index.js",
7
25
  "exports": {
@@ -10,38 +28,179 @@
10
28
  "./plugin-sdk/*": "./dist/plugin-sdk/*",
11
29
  "./cli-entry": "./dist/entry.js"
12
30
  },
13
- "bin": {
14
- "poolbot": "dist/entry.js"
15
- },
16
- "files": [
17
- "dist/**",
18
- "docs/**",
19
- "extensions/**",
20
- "assets/**",
21
- "skills/**",
22
- "patches/**",
23
- "README.md",
24
- "LICENSE",
25
- "package.json"
26
- ],
27
31
  "scripts": {
32
+ "android:assemble": "cd apps/android && ./gradlew :app:assembleDebug",
33
+ "android:install": "cd apps/android && ./gradlew :app:installDebug",
34
+ "android:run": "cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.openclaw.android/.MainActivity",
35
+ "android:test": "cd apps/android && ./gradlew :app:testDebugUnitTest",
36
+ "build": "tsc -p tsconfig.json && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/write-build-info.ts",
37
+ "canvas:a2ui:bundle": "bash scripts/bundle-a2ui.sh",
38
+ "check": "pnpm format:check && pnpm build && pnpm lint",
39
+ "check:docs": "pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links",
40
+ "check:loc": "node --import tsx scripts/check-ts-max-loc.ts --max 500",
28
41
  "dev": "node scripts/run-node.mjs",
29
- "build": "tsc -p tsconfig.json && node --import tsx scripts/write-build-info.ts",
42
+ "docs:bin": "node scripts/build-docs-list.mjs",
43
+ "docs:check-links": "node scripts/docs-link-audit.mjs",
44
+ "docs:dev": "cd docs && mint dev",
45
+ "docs:list": "node scripts/docs-list.js",
46
+ "format": "oxfmt --write",
47
+ "format:all": "pnpm format && pnpm format:swift",
48
+ "format:check": "oxfmt --check",
49
+ "format:docs": "git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write",
50
+ "format:docs:check": "git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check",
51
+ "format:swift": "swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/OpenClawKit/Sources",
52
+ "gateway:dev": "POOLBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway",
53
+ "gateway:dev:reset": "POOLBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset",
54
+ "gateway:watch": "node scripts/watch-node.mjs gateway --force",
55
+ "ios:build": "bash -lc 'cd apps/ios && xcodegen generate && xcodebuild -project OpenClaw.xcodeproj -scheme OpenClaw -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'",
56
+ "ios:gen": "cd apps/ios && xcodegen generate",
57
+ "ios:open": "cd apps/ios && xcodegen generate && open OpenClaw.xcodeproj",
58
+ "ios:run": "bash -lc 'cd apps/ios && xcodegen generate && xcodebuild -project OpenClaw.xcodeproj -scheme OpenClaw -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.openclaw.ios'",
59
+ "lint": "oxlint --type-aware",
60
+ "lint:all": "pnpm lint && pnpm lint:swift",
61
+ "lint:docs": "pnpm dlx markdownlint-cli2",
62
+ "lint:docs:fix": "pnpm dlx markdownlint-cli2 --fix",
63
+ "lint:fix": "oxlint --type-aware --fix && pnpm format",
64
+ "lint:swift": "swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)",
65
+ "mac:open": "open dist/PoolBot.app",
66
+ "mac:package": "bash scripts/package-mac-app.sh",
67
+ "mac:restart": "bash scripts/restart-mac.sh",
68
+ "plugins:sync": "node --import tsx scripts/sync-plugin-versions.ts",
69
+ "poolbot": "node scripts/run-node.mjs",
70
+ "poolbot:rpc": "node scripts/run-node.mjs agent --mode rpc --json",
71
+ "prepack": "pnpm build && pnpm ui:build",
72
+ "prepare": "command -v git >/dev/null 2>&1 && git config core.hooksPath git-hooks || exit 0",
73
+ "protocol:check": "pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/OpenClawProtocol/GatewayModels.swift",
74
+ "protocol:gen": "node --import tsx scripts/protocol-gen.ts",
75
+ "protocol:gen:swift": "node --import tsx scripts/protocol-gen-swift.ts",
76
+ "release:check": "node --import tsx scripts/release-check.ts",
30
77
  "start": "node scripts/run-node.mjs",
31
- "lint": "oxlint --type-aware src test",
32
- "test": "vitest"
78
+ "test": "node scripts/test-parallel.mjs",
79
+ "test:all": "pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all",
80
+ "test:coverage": "vitest run --coverage",
81
+ "test:docker:all": "pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup",
82
+ "test:docker:cleanup": "bash scripts/test-cleanup-docker.sh",
83
+ "test:docker:doctor-switch": "bash scripts/e2e/doctor-install-switch-docker.sh",
84
+ "test:docker:gateway-network": "bash scripts/e2e/gateway-network-docker.sh",
85
+ "test:docker:live-gateway": "bash scripts/test-live-gateway-models-docker.sh",
86
+ "test:docker:live-models": "bash scripts/test-live-models-docker.sh",
87
+ "test:docker:onboard": "bash scripts/e2e/onboard-docker.sh",
88
+ "test:docker:plugins": "bash scripts/e2e/plugins-docker.sh",
89
+ "test:docker:qr": "bash scripts/e2e/qr-import-docker.sh",
90
+ "test:e2e": "vitest run --config vitest.e2e.config.ts",
91
+ "test:force": "node --import tsx scripts/test-force.ts",
92
+ "test:install:e2e": "bash scripts/test-install-sh-e2e-docker.sh",
93
+ "test:live": "POOLBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts",
94
+ "test:ui": "pnpm --dir ui test",
95
+ "test:watch": "vitest",
96
+ "tui": "node scripts/run-node.mjs tui",
97
+ "tui:dev": "POOLBOT_PROFILE=dev node scripts/run-node.mjs --dev tui",
98
+ "ui:build": "node scripts/ui.js build",
99
+ "ui:dev": "node scripts/ui.js dev",
100
+ "ui:install": "node scripts/ui.js install"
33
101
  },
34
102
  "dependencies": {
35
- "@mariozechner/pi-agent-core": "0.50.0",
36
- "@mariozechner/pi-ai": "0.50.0",
37
- "@mariozechner/pi-coding-agent": "0.50.0",
38
- "poolbot": "link:./"
103
+ "@agentclientprotocol/sdk": "0.14.1",
104
+ "@aws-sdk/client-bedrock": "^3.986.0",
105
+ "@buape/carbon": "0.14.0",
106
+ "@clack/prompts": "^1.0.0",
107
+ "@grammyjs/runner": "^2.0.3",
108
+ "@grammyjs/transformer-throttler": "^1.2.1",
109
+ "@homebridge/ciao": "^1.3.5",
110
+ "@larksuiteoapi/node-sdk": "^1.58.0",
111
+ "@line/bot-sdk": "^10.6.0",
112
+ "@lydell/node-pty": "1.2.0-beta.3",
113
+ "@mariozechner/pi-agent-core": "0.52.9",
114
+ "@mariozechner/pi-ai": "0.52.9",
115
+ "@mariozechner/pi-coding-agent": "0.52.9",
116
+ "@mariozechner/pi-tui": "0.52.9",
117
+ "@mozilla/readability": "^0.6.0",
118
+ "@sinclair/typebox": "0.34.48",
119
+ "@slack/bolt": "^4.6.0",
120
+ "@slack/web-api": "^7.13.0",
121
+ "@whiskeysockets/baileys": "7.0.0-rc.9",
122
+ "ajv": "^8.17.1",
123
+ "chalk": "^5.6.2",
124
+ "chokidar": "^5.0.0",
125
+ "cli-highlight": "^2.1.11",
126
+ "commander": "^14.0.3",
127
+ "croner": "^10.0.1",
128
+ "discord-api-types": "^0.38.38",
129
+ "dotenv": "^17.2.4",
130
+ "express": "^5.2.1",
131
+ "file-type": "^21.3.0",
132
+ "grammy": "^1.40.0",
133
+ "jiti": "^2.6.1",
134
+ "json5": "^2.2.3",
135
+ "jszip": "^3.10.1",
136
+ "linkedom": "^0.18.12",
137
+ "long": "^5.3.2",
138
+ "markdown-it": "^14.1.0",
139
+ "node-edge-tts": "^1.2.10",
140
+ "osc-progress": "^0.3.0",
141
+ "pdfjs-dist": "^5.4.624",
142
+ "playwright-core": "1.58.2",
143
+ "proper-lockfile": "^4.1.2",
144
+ "qrcode-terminal": "^0.12.0",
145
+ "sharp": "^0.34.5",
146
+ "signal-utils": "^0.21.1",
147
+ "sqlite-vec": "0.1.7-alpha.2",
148
+ "tar": "7.5.7",
149
+ "tslog": "^4.10.2",
150
+ "undici": "^7.21.0",
151
+ "ws": "^8.19.0",
152
+ "yaml": "^2.8.2",
153
+ "zod": "^4.3.6"
39
154
  },
40
155
  "devDependencies": {
156
+ "@grammyjs/types": "^3.24.0",
157
+ "@lit-labs/signals": "^0.2.0",
158
+ "@lit/context": "^1.1.6",
159
+ "@types/express": "^5.0.6",
160
+ "@types/markdown-it": "^14.1.2",
161
+ "@types/node": "^25.2.2",
162
+ "@types/proper-lockfile": "^4.1.4",
163
+ "@types/qrcode-terminal": "^0.12.2",
164
+ "@types/ws": "^8.18.1",
165
+ "@typescript/native-preview": "7.0.0-dev.20260209.1",
166
+ "@vitest/coverage-v8": "^4.0.18",
167
+ "lit": "^3.3.2",
168
+ "ollama": "^0.6.3",
169
+ "oxfmt": "0.28.0",
170
+ "oxlint": "^1.43.0",
171
+ "oxlint-tsgolint": "^0.11.5",
172
+ "tsx": "^4.21.0",
41
173
  "typescript": "^5.9.3",
42
- "vitest": "^4.0.0"
174
+ "vitest": "^4.0.18"
175
+ },
176
+ "peerDependencies": {
177
+ "@napi-rs/canvas": "^0.1.89",
178
+ "node-llama-cpp": "3.15.1"
43
179
  },
44
180
  "engines": {
45
181
  "node": ">=22.12.0"
182
+ },
183
+ "packageManager": "pnpm@10.23.0",
184
+ "pnpm": {
185
+ "minimumReleaseAge": 2880,
186
+ "overrides": {
187
+ "fast-xml-parser": "5.3.4",
188
+ "form-data": "2.5.4",
189
+ "qs": "6.14.1",
190
+ "@sinclair/typebox": "0.34.48",
191
+ "tar": "7.5.7",
192
+ "tough-cookie": "4.1.3"
193
+ },
194
+ "onlyBuiltDependencies": [
195
+ "@lydell/node-pty",
196
+ "@matrix-org/matrix-sdk-crypto-nodejs",
197
+ "@napi-rs/canvas",
198
+ "@whiskeysockets/baileys",
199
+ "authenticate-pam",
200
+ "esbuild",
201
+ "node-llama-cpp",
202
+ "protobufjs",
203
+ "sharp"
204
+ ]
46
205
  }
47
- }
206
+ }