@poolzin/pool-bot 2026.3.22 → 2026.3.23

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 (124) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/dist/acp/bindings-store.js +209 -0
  3. package/dist/acp/control-plane/runtime-cache.js +54 -0
  4. package/dist/acp/control-plane/runtime-options.js +215 -0
  5. package/dist/acp/control-plane/session-actor-queue.js +36 -0
  6. package/dist/acp/runtime/errors.js +47 -0
  7. package/dist/acp/runtime/registry.js +86 -0
  8. package/dist/acp/runtime/types.js +1 -0
  9. package/dist/acp/translator.js +97 -0
  10. package/dist/agents/failover-error.js +145 -47
  11. package/dist/browser/browser-profile-manager.js +319 -0
  12. package/dist/browser/cdp-proxy-bypass.js +129 -0
  13. package/dist/browser/cdp-timeouts.js +41 -0
  14. package/dist/browser/chrome-extension-validator.js +406 -0
  15. package/dist/browser/chrome-mcp-snapshot.js +222 -0
  16. package/dist/browser/chrome-mcp.js +421 -0
  17. package/dist/browser/chrome-mcp.snapshot.js +133 -0
  18. package/dist/browser/errors.js +67 -0
  19. package/dist/browser/form-fields.js +22 -0
  20. package/dist/browser/output-atomic.js +44 -0
  21. package/dist/browser/profile-capabilities.js +47 -0
  22. package/dist/browser/safe-filename.js +25 -0
  23. package/dist/browser/snapshot-roles.js +60 -0
  24. package/dist/build-info.json +3 -3
  25. package/dist/commands/security-owner-only.js +86 -0
  26. package/dist/control-ui/assets/{index-Dvkl4Xlx.js → index-D7shnQwQ.js} +404 -388
  27. package/dist/control-ui/assets/index-D7shnQwQ.js.map +1 -0
  28. package/dist/control-ui/index.html +1 -1
  29. package/dist/cron/cron-filters.js +150 -0
  30. package/dist/gateway/device-pairing-security.js +197 -0
  31. package/dist/gateway/event-deduplication.js +167 -0
  32. package/dist/gateway/run-tracker.js +253 -0
  33. package/dist/gateway/server-methods/nodes.js +14 -0
  34. package/dist/gateway/websocket-preauth-security.js +188 -0
  35. package/dist/infra/errors.js +53 -13
  36. package/dist/infra/exec-approvals-security.js +217 -0
  37. package/dist/infra/security/command-analyzer.js +257 -0
  38. package/dist/plugins/loader.js +16 -8
  39. package/dist/security/external-content.js +51 -1
  40. package/dist/sessions/session-costs.js +228 -0
  41. package/dist/shared/param-key.js +16 -0
  42. package/dist/shared/poll-params.js +58 -0
  43. package/dist/shared/polls.js +55 -0
  44. package/docs/DASHBOARD-GAP-ANALYSIS-AND-PLAN.md +430 -0
  45. package/docs/FEATURES.md +523 -0
  46. package/docs/FINAL-IMPLEMENTATION-REVIEW.md +274 -0
  47. package/docs/FINAL-IMPLEMENTATION-SUMMARY.md +356 -0
  48. package/docs/FINAL-PROFESSIONAL-EVALUATION.md +312 -0
  49. package/docs/IMPLEMENTATION-PRIORITY-EVALUATION.md +298 -0
  50. package/docs/IMPLEMENTATION-PROGRESS.md +237 -0
  51. package/docs/IMPLEMENTATION-REVIEW-PHASE1-2.md +381 -0
  52. package/docs/IMPLEMENTATION-REVIEW-PHASE4.md +389 -0
  53. package/docs/IMPLEMENTATION-REVIEW-PHASE5.md +420 -0
  54. package/docs/IMPLEMENTATION-REVIEW-PHASE6.md +422 -0
  55. package/docs/IMPLEMENTATION-REVIEW-PHASE7-FINAL.md +184 -0
  56. package/docs/MIKRODASH-ANALYSIS.md +412 -0
  57. package/docs/OPENCLAW-GAP-ANALYSIS-FINAL.md +431 -0
  58. package/docs/OPENCLAW-VS-POOLBOT-ANALYSIS.md +351 -0
  59. package/docs/PHASE-7-SUMMARY.md +144 -0
  60. package/docs/POOLBOT-OFFICE-PLAN.md +697 -0
  61. package/docs/PROJECT-FINAL-STATUS.md +237 -0
  62. package/docs/README.md +116 -0
  63. package/docs/REAL-IMPROVEMENTS-EVALUATION.md +477 -0
  64. package/docs/SECURITY-HARDENING-IMPLEMENTATION.md +161 -0
  65. package/docs/channels/googlechat.md +235 -206
  66. package/docs/channels/irc.md +332 -0
  67. package/docs/channels/nostr.md +255 -168
  68. package/docs/components/command-palette.md +166 -0
  69. package/docs/components/login-gate.md +219 -0
  70. package/docs/getting-started/installation.md +191 -0
  71. package/docs/getting-started/introduction.md +120 -0
  72. package/docs/improvements/USAGE-GUIDE.md +359 -0
  73. package/docs/plans/2026-03-15-openclaw-features-implementation.md +1632 -0
  74. package/docs/reference/deadcode-detection.md +72 -0
  75. package/extensions/acpx/node_modules/.bin/acpx +21 -0
  76. package/extensions/agency-agents/node_modules/.bin/vite +4 -4
  77. package/extensions/agency-agents/node_modules/.bin/vitest +2 -2
  78. package/extensions/googlechat/node_modules/.bin/tsc +21 -0
  79. package/extensions/googlechat/node_modules/.bin/tsserver +21 -0
  80. package/extensions/googlechat/node_modules/.bin/vitest +21 -0
  81. package/extensions/googlechat/package.json +11 -28
  82. package/extensions/googlechat/src/googlechat-channel.test.ts +60 -0
  83. package/extensions/googlechat/src/googlechat-channel.ts +120 -0
  84. package/extensions/googlechat/src/index.ts +14 -0
  85. package/extensions/irc/node_modules/.bin/tsc +21 -0
  86. package/extensions/irc/node_modules/.bin/tsserver +21 -0
  87. package/extensions/irc/node_modules/.bin/vitest +21 -0
  88. package/extensions/irc/package.json +16 -8
  89. package/extensions/irc/src/index.ts +14 -0
  90. package/extensions/irc/src/irc-channel.test.ts +43 -0
  91. package/extensions/irc/src/irc-channel.ts +191 -0
  92. package/extensions/keyed-async-queue/node_modules/.bin/tsc +21 -0
  93. package/extensions/keyed-async-queue/node_modules/.bin/tsserver +21 -0
  94. package/extensions/keyed-async-queue/node_modules/.bin/vitest +21 -0
  95. package/extensions/keyed-async-queue/package.json +20 -0
  96. package/extensions/keyed-async-queue/src/index.ts +14 -0
  97. package/extensions/keyed-async-queue/src/queue.test.ts +135 -0
  98. package/extensions/keyed-async-queue/src/queue.ts +200 -0
  99. package/extensions/memory-core/node_modules/.bin/tsc +21 -0
  100. package/extensions/memory-core/node_modules/.bin/tsserver +21 -0
  101. package/extensions/memory-core/node_modules/.bin/vitest +21 -0
  102. package/extensions/memory-core/package.json +11 -8
  103. package/extensions/memory-core/src/index.ts +14 -0
  104. package/extensions/memory-core/src/memory-manager.test.ts +124 -0
  105. package/extensions/memory-core/src/memory-manager.ts +186 -0
  106. package/extensions/nostr/node_modules/.bin/tsc +2 -2
  107. package/extensions/nostr/node_modules/.bin/tsserver +2 -2
  108. package/extensions/nostr/node_modules/.bin/vitest +21 -0
  109. package/extensions/nostr/package.json +15 -24
  110. package/extensions/nostr/src/index.ts +14 -0
  111. package/extensions/nostr/src/nostr-channel.test.ts +55 -0
  112. package/extensions/nostr/src/nostr-channel.ts +228 -0
  113. package/extensions/page-agent/node_modules/.bin/vitest +2 -2
  114. package/extensions/test-utils/node_modules/.bin/jiti +21 -0
  115. package/extensions/test-utils/node_modules/.bin/playwright +21 -0
  116. package/extensions/test-utils/node_modules/.bin/tsx +21 -0
  117. package/extensions/test-utils/node_modules/.bin/vite +21 -0
  118. package/extensions/test-utils/node_modules/.bin/vitest +21 -0
  119. package/extensions/test-utils/node_modules/.bin/yaml +21 -0
  120. package/extensions/xyops/node_modules/.bin/vitest +2 -2
  121. package/package.json +2 -1
  122. package/dist/control-ui/assets/index-Dvkl4Xlx.js.map +0 -1
  123. package/extensions/googlechat/node_modules/.bin/poolbot +0 -21
  124. package/extensions/memory-core/node_modules/.bin/poolbot +0 -21
@@ -0,0 +1,47 @@
1
+ export function getBrowserProfileCapabilities(profile) {
2
+ if (profile.driver === "extension") {
3
+ return {
4
+ mode: "local-extension-relay",
5
+ isRemote: false,
6
+ requiresRelay: true,
7
+ requiresAttachedTab: true,
8
+ usesPersistentPlaywright: false,
9
+ supportsPerTabWs: false,
10
+ supportsJsonTabEndpoints: true,
11
+ supportsReset: true,
12
+ supportsManagedTabLimit: false,
13
+ };
14
+ }
15
+ return {
16
+ mode: "local-managed",
17
+ isRemote: !profile.cdpIsLoopback,
18
+ requiresRelay: false,
19
+ requiresAttachedTab: false,
20
+ usesPersistentPlaywright: false,
21
+ supportsPerTabWs: profile.cdpIsLoopback,
22
+ supportsJsonTabEndpoints: profile.cdpIsLoopback,
23
+ supportsReset: profile.cdpIsLoopback,
24
+ supportsManagedTabLimit: profile.cdpIsLoopback,
25
+ };
26
+ }
27
+ export function resolveDefaultSnapshotFormat(params) {
28
+ if (params.explicitFormat) {
29
+ return params.explicitFormat;
30
+ }
31
+ if (params.mode === "efficient") {
32
+ return "ai";
33
+ }
34
+ const capabilities = getBrowserProfileCapabilities(params.profile);
35
+ if (capabilities.mode === "local-extension-relay") {
36
+ return "aria";
37
+ }
38
+ return params.hasPlaywright ? "ai" : "aria";
39
+ }
40
+ export function shouldUsePlaywrightForScreenshot(params) {
41
+ const capabilities = getBrowserProfileCapabilities(params.profile);
42
+ return (capabilities.requiresRelay || !params.wsUrl || Boolean(params.ref) || Boolean(params.element));
43
+ }
44
+ export function shouldUsePlaywrightForAriaSnapshot(params) {
45
+ const capabilities = getBrowserProfileCapabilities(params.profile);
46
+ return capabilities.requiresRelay || !params.wsUrl;
47
+ }
@@ -0,0 +1,25 @@
1
+ import path from "node:path";
2
+ export function sanitizeUntrustedFileName(fileName, fallbackName) {
3
+ const trimmed = String(fileName ?? "").trim();
4
+ if (!trimmed) {
5
+ return fallbackName;
6
+ }
7
+ let base = path.posix.basename(trimmed);
8
+ base = path.win32.basename(base);
9
+ let cleaned = "";
10
+ for (let i = 0; i < base.length; i++) {
11
+ const code = base.charCodeAt(i);
12
+ if (code < 0x20 || code === 0x7f) {
13
+ continue;
14
+ }
15
+ cleaned += base[i];
16
+ }
17
+ base = cleaned.trim();
18
+ if (!base || base === "." || base === "..") {
19
+ return fallbackName;
20
+ }
21
+ if (base.length > 200) {
22
+ base = base.slice(0, 200);
23
+ }
24
+ return base;
25
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Shared ARIA role classification sets used by both the Playwright and Chrome MCP
3
+ * snapshot paths. Keep these in sync — divergence causes the two drivers to produce
4
+ * different snapshot output for the same page.
5
+ */
6
+ /** Roles that represent user-interactive elements and always get a ref. */
7
+ export const INTERACTIVE_ROLES = new Set([
8
+ "button",
9
+ "checkbox",
10
+ "combobox",
11
+ "link",
12
+ "listbox",
13
+ "menuitem",
14
+ "menuitemcheckbox",
15
+ "menuitemradio",
16
+ "option",
17
+ "radio",
18
+ "searchbox",
19
+ "slider",
20
+ "spinbutton",
21
+ "switch",
22
+ "tab",
23
+ "textbox",
24
+ "treeitem",
25
+ ]);
26
+ /** Roles that carry meaningful content and get a ref when named. */
27
+ export const CONTENT_ROLES = new Set([
28
+ "article",
29
+ "cell",
30
+ "columnheader",
31
+ "gridcell",
32
+ "heading",
33
+ "listitem",
34
+ "main",
35
+ "navigation",
36
+ "region",
37
+ "rowheader",
38
+ ]);
39
+ /** Structural/container roles — typically skipped in compact mode. */
40
+ export const STRUCTURAL_ROLES = new Set([
41
+ "application",
42
+ "directory",
43
+ "document",
44
+ "generic",
45
+ "grid",
46
+ "group",
47
+ "ignored",
48
+ "list",
49
+ "menu",
50
+ "menubar",
51
+ "none",
52
+ "presentation",
53
+ "row",
54
+ "rowgroup",
55
+ "table",
56
+ "tablist",
57
+ "toolbar",
58
+ "tree",
59
+ "treegrid",
60
+ ]);
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2026.3.22",
3
- "commit": "d73f24d737d21800609b762183d8554526df0ee7",
4
- "builtAt": "2026-03-13T23:59:05.337Z"
2
+ "version": "2026.3.23",
3
+ "commit": "127528099de2f9958448f0d468e1a91bdf3bb13e",
4
+ "builtAt": "2026-03-16T05:19:01.312Z"
5
5
  }
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Commands Security - Owner-Only Enforcement
3
+ *
4
+ * Security hardening for sensitive commands:
5
+ * - /config - Configuration management
6
+ * - /debug - Runtime debug information
7
+ *
8
+ * GHSA-commands-owner-only: Require sender ownership for owner-only commands
9
+ */
10
+ /**
11
+ * List of owner-only commands
12
+ */
13
+ export const OWNER_ONLY_COMMANDS = new Set([
14
+ "config",
15
+ "debug",
16
+ "config.set",
17
+ "config.get",
18
+ "config.reset",
19
+ "debug.gateway",
20
+ "debug.sessions",
21
+ "debug.memory",
22
+ ]);
23
+ /**
24
+ * Check if a command requires owner-only access
25
+ */
26
+ export function isOwnerOnlyCommand(command) {
27
+ const normalized = command.toLowerCase().trim();
28
+ return OWNER_ONLY_COMMANDS.has(normalized);
29
+ }
30
+ /**
31
+ * Validate sender ownership for owner-only commands
32
+ *
33
+ * Returns true if sender is authorized, false otherwise
34
+ */
35
+ export function validateOwnerOnlyAccess(params) {
36
+ const { command, senderId, config } = params;
37
+ // Check if command requires owner-only access
38
+ if (!isOwnerOnlyCommand(command)) {
39
+ return true;
40
+ }
41
+ // Get owner ID from config (check multiple possible locations)
42
+ const ownerId = config.gateway?.ownerId ||
43
+ config?.ownerId ||
44
+ config.auth?.ownerId;
45
+ if (!ownerId) {
46
+ // No owner configured, allow access (legacy mode)
47
+ return true;
48
+ }
49
+ // Validate sender ownership
50
+ return senderId === ownerId;
51
+ }
52
+ /**
53
+ * Get owner-only command error message
54
+ */
55
+ export function getOwnerOnlyErrorMessage(command) {
56
+ return `Command "${command}" requires owner access. Only the gateway owner can execute this command.`;
57
+ }
58
+ /**
59
+ * Analyze command security requirements
60
+ */
61
+ export function analyzeCommandSecurity(params) {
62
+ const { command, senderId, config } = params;
63
+ const isOwnerOnly = isOwnerOnlyCommand(command);
64
+ const senderAuthorized = validateOwnerOnlyAccess({ command, senderId, config });
65
+ // Determine security level
66
+ let securityLevel;
67
+ if (isOwnerOnly) {
68
+ securityLevel = "owner";
69
+ }
70
+ else if (command.startsWith("admin.")) {
71
+ securityLevel = "admin";
72
+ }
73
+ else if (command.startsWith("user.")) {
74
+ securityLevel = "user";
75
+ }
76
+ else {
77
+ securityLevel = "public";
78
+ }
79
+ return {
80
+ command,
81
+ isOwnerOnly,
82
+ senderAuthorized,
83
+ requiresElevation: isOwnerOnly && !senderAuthorized,
84
+ securityLevel,
85
+ };
86
+ }