@poolzin/pool-bot 2026.3.25 → 2026.3.26

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 (271) hide show
  1. package/dist/agents/model-fallback.js +5 -4
  2. package/dist/agents/tools/common.js +16 -201
  3. package/dist/auto-reply/auto-reply/reply/agent-runner-execution.js +502 -0
  4. package/dist/auto-reply/auto-reply/reply/agent-runner-helpers.js +65 -0
  5. package/dist/auto-reply/auto-reply/reply/agent-runner-memory.js +160 -0
  6. package/dist/auto-reply/auto-reply/reply/agent-runner-payloads.js +85 -0
  7. package/dist/auto-reply/auto-reply/reply/agent-runner-utils.js +101 -0
  8. package/dist/auto-reply/auto-reply/reply/bash-command.js +338 -0
  9. package/dist/auto-reply/auto-reply/reply/block-streaming.js +91 -0
  10. package/dist/auto-reply/auto-reply/reply/commands-approve.js +88 -0
  11. package/dist/auto-reply/auto-reply/reply/commands-bash.js +26 -0
  12. package/dist/auto-reply/auto-reply/reply/commands-compact.js +107 -0
  13. package/dist/auto-reply/auto-reply/reply/commands-config.js +241 -0
  14. package/dist/auto-reply/auto-reply/reply/commands-context-report.js +295 -0
  15. package/dist/auto-reply/auto-reply/reply/commands-context.js +30 -0
  16. package/dist/auto-reply/auto-reply/reply/commands-core.js +151 -0
  17. package/dist/auto-reply/auto-reply/reply/commands-export-session.js +163 -0
  18. package/dist/auto-reply/auto-reply/reply/commands-info.js +184 -0
  19. package/dist/auto-reply/auto-reply/reply/commands-models.js +299 -0
  20. package/dist/auto-reply/auto-reply/reply/commands-plugin.js +35 -0
  21. package/dist/auto-reply/auto-reply/reply/commands-ptt.js +171 -0
  22. package/dist/auto-reply/auto-reply/reply/commands-setunset-standard.js +13 -0
  23. package/dist/auto-reply/auto-reply/reply/commands-setunset.js +73 -0
  24. package/dist/auto-reply/auto-reply/reply/commands-slash-parse.js +31 -0
  25. package/dist/auto-reply/auto-reply/reply/commands-status.js +178 -0
  26. package/dist/auto-reply/auto-reply/reply/commands-subagents.js +73 -0
  27. package/dist/auto-reply/auto-reply/reply/commands-system-prompt.js +117 -0
  28. package/dist/auto-reply/auto-reply/reply/commands-tts.js +231 -0
  29. package/dist/auto-reply/auto-reply/reply/directive-handling.impl.js +380 -0
  30. package/dist/auto-reply/auto-reply/reply/followup-runner.js +227 -0
  31. package/dist/auto-reply/auto-reply/reply/get-reply-directives-apply.js +201 -0
  32. package/dist/auto-reply/auto-reply/reply/get-reply-directives-utils.js +54 -0
  33. package/dist/auto-reply/auto-reply/reply/get-reply-directives.js +332 -0
  34. package/dist/auto-reply/auto-reply/reply/get-reply-inline-actions.js +258 -0
  35. package/dist/auto-reply/auto-reply/reply/get-reply-run.js +297 -0
  36. package/dist/auto-reply/auto-reply/reply/groups.js +102 -0
  37. package/dist/auto-reply/auto-reply/reply/mentions.js +129 -0
  38. package/dist/auto-reply/auto-reply/reply/reply-delivery.js +92 -0
  39. package/dist/auto-reply/auto-reply/reply/reply-directives.js +30 -0
  40. package/dist/auto-reply/auto-reply/reply/reply-dispatcher.js +152 -0
  41. package/dist/auto-reply/auto-reply/reply/reply-elevated.js +166 -0
  42. package/dist/auto-reply/auto-reply/reply/reply-inline.js +28 -0
  43. package/dist/auto-reply/auto-reply/reply/reply-payloads.js +114 -0
  44. package/dist/auto-reply/auto-reply/reply/reply-reference.js +36 -0
  45. package/dist/auto-reply/auto-reply/reply/reply-tags.js +13 -0
  46. package/dist/auto-reply/auto-reply/reply/reply-threading.js +41 -0
  47. package/dist/auto-reply/auto-reply/reply/session-updates.js +233 -0
  48. package/dist/auto-reply/auto-reply/reply/stage-sandbox-media.js +146 -0
  49. package/dist/build-info.json +3 -3
  50. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  51. package/dist/canvas-host/a2ui/a2ui.bundle.js +2 -17772
  52. package/dist/canvas-host/a2ui/index.html +1 -307
  53. package/dist/channels/channels/directory-config.js +185 -0
  54. package/dist/channels/channels/discord/handle-action.guild-admin.js +332 -0
  55. package/dist/channels/channels/discord/handle-action.js +165 -0
  56. package/dist/channels/channels/discord.js +413 -0
  57. package/dist/channels/channels/dock.js +436 -0
  58. package/dist/channels/channels/index.js +51 -0
  59. package/dist/channels/channels/plugins/outbound/discord.js +101 -0
  60. package/dist/channels/channels/whatsapp.js +17 -0
  61. package/dist/channels/plugins/types.js +1 -1
  62. package/dist/channels/run-state-machine.js +7 -0
  63. package/dist/commands/models/auth.js +47 -1
  64. package/dist/commands-subagents/action-agents.js +44 -0
  65. package/dist/commands-subagents/action-focus.js +64 -0
  66. package/dist/commands-subagents/action-help.js +4 -0
  67. package/dist/commands-subagents/action-info.js +45 -0
  68. package/dist/commands-subagents/action-kill.js +60 -0
  69. package/dist/commands-subagents/action-list.js +44 -0
  70. package/dist/commands-subagents/action-log.js +29 -0
  71. package/dist/commands-subagents/action-send.js +119 -0
  72. package/dist/commands-subagents/action-spawn.js +52 -0
  73. package/dist/commands-subagents/action-unfocus.js +30 -0
  74. package/dist/commands-subagents/shared.js +303 -0
  75. package/dist/config/config.js +1 -8
  76. package/dist/config/types.secrets.js +61 -0
  77. package/dist/control-ui/assets/{index-D7shnQwQ.js → index-umCsvrWy.js} +884 -741
  78. package/dist/control-ui/assets/index-umCsvrWy.js.map +1 -0
  79. package/dist/control-ui/assets/pt-BR-DedEVAvY.js +2 -0
  80. package/dist/control-ui/assets/pt-BR-DedEVAvY.js.map +1 -0
  81. package/dist/control-ui/assets/zh-CN-CDzeklK-.js +2 -0
  82. package/dist/control-ui/assets/zh-CN-CDzeklK-.js.map +1 -0
  83. package/dist/control-ui/assets/zh-TW-BJCRYNWH.js +2 -0
  84. package/dist/control-ui/assets/zh-TW-BJCRYNWH.js.map +1 -0
  85. package/dist/control-ui/index.html +1 -1
  86. package/dist/gateway/method-scopes.js +9 -1
  87. package/dist/gateway/node-pending-work.js +142 -0
  88. package/dist/gateway/protocol/index.js +5 -1
  89. package/dist/gateway/protocol/schema/nodes.js +18 -0
  90. package/dist/gateway/server-methods/nodes-pending.js +96 -0
  91. package/dist/gateway/server-methods-list.js +4 -0
  92. package/dist/gateway/server-methods.js +2 -0
  93. package/dist/imessage/channel.js +253 -0
  94. package/dist/imessage/monitor/echo-cache.js +70 -0
  95. package/dist/imessage/monitor/loop-rate-limiter.js +51 -0
  96. package/dist/imessage/monitor/reflection-guard.js +50 -0
  97. package/dist/imessage/monitor/sanitize-outbound.js +25 -0
  98. package/dist/imessage/monitor/self-chat-cache.js +75 -0
  99. package/dist/imessage/runtime.js +3 -0
  100. package/dist/infra/exec-approval-reply.js +7 -0
  101. package/dist/infra/tmp-openclaw-dir.js +84 -0
  102. package/dist/pairing/pairing-challenge.js +15 -0
  103. package/dist/plugin-sdk/account-id.d.ts +1 -0
  104. package/dist/plugin-sdk/agent-media-payload.d.ts +12 -0
  105. package/dist/plugin-sdk/allow-from.d.ts +27 -0
  106. package/dist/plugin-sdk/command-auth.d.ts +25 -0
  107. package/dist/plugin-sdk/command-auth.js +3 -1
  108. package/dist/plugin-sdk/config-paths.d.ts +6 -0
  109. package/dist/plugin-sdk/file-lock.d.ts +16 -0
  110. package/dist/plugin-sdk/index.d.ts +428 -0
  111. package/dist/plugin-sdk/index.js +237 -103
  112. package/dist/plugin-sdk/json-store.d.ts +5 -0
  113. package/dist/plugin-sdk/keyed-async-queue.d.ts +12 -0
  114. package/dist/plugin-sdk/onboarding.d.ts +11 -0
  115. package/dist/plugin-sdk/provider-auth-result.d.ts +14 -0
  116. package/dist/plugin-sdk/slack-message-actions.d.ts +11 -0
  117. package/dist/plugin-sdk/status-helpers.d.ts +25 -0
  118. package/dist/plugin-sdk/temp-path.d.ts +12 -0
  119. package/dist/plugin-sdk/text-chunking.d.ts +1 -0
  120. package/dist/plugin-sdk/tool-send.d.ts +4 -0
  121. package/dist/plugin-sdk/webhook-path.d.ts +6 -0
  122. package/dist/plugin-sdk/webhook-targets.d.ts +23 -0
  123. package/dist/plugin-sdk/windows-spawn.d.ts +39 -0
  124. package/dist/plugin-sdk-internal/accounts.js +6 -0
  125. package/dist/plugin-sdk-internal/discord.js +23 -0
  126. package/dist/plugin-sdk-internal/imessage.js +13 -0
  127. package/dist/plugin-sdk-internal/setup.js +9 -0
  128. package/dist/plugin-sdk-internal/signal.js +13 -0
  129. package/dist/plugin-sdk-internal/slack.js +22 -0
  130. package/dist/plugin-sdk-internal/telegram.js +32 -0
  131. package/dist/plugin-sdk-internal/whatsapp.js +29 -0
  132. package/dist/routing/session-key.js +4 -185
  133. package/dist/shared/pid-alive.js +2 -61
  134. package/dist/shared/process-scoped-map.js +5 -7
  135. package/dist/signal/channel.js +264 -0
  136. package/dist/signal/monitor/access-policy.js +60 -0
  137. package/dist/signal/runtime.js +3 -0
  138. package/dist/slack/account-inspect.js +135 -0
  139. package/dist/slack/blocks-input.js +7 -38
  140. package/dist/slack/channel.js +394 -0
  141. package/dist/slack/interactive-replies.js +28 -0
  142. package/dist/slack/monitor/channel-type.js +31 -0
  143. package/dist/slack/monitor/dm-auth.js +49 -0
  144. package/dist/slack/monitor/events/interactions.modal.js +137 -0
  145. package/dist/slack/monitor/events/message-subtype-handlers.js +68 -0
  146. package/dist/slack/monitor/events/system-event-context.js +29 -0
  147. package/dist/slack/monitor/events/system-event-test-harness.js +41 -0
  148. package/dist/slack/monitor/external-arg-menu-store.js +46 -0
  149. package/dist/slack/monitor/message-handler/prepare-content.js +69 -0
  150. package/dist/slack/monitor/message-handler/prepare-thread-context.js +91 -0
  151. package/dist/slack/monitor/message-handler/prepare.test-helpers.js +55 -0
  152. package/dist/slack/monitor/reconnect-policy.js +78 -0
  153. package/dist/slack/monitor/slash-commands.runtime.js +1 -0
  154. package/dist/slack/monitor/slash-dispatch.runtime.js +9 -0
  155. package/dist/slack/monitor/slash-skill-commands.runtime.js +1 -0
  156. package/dist/slack/resolve-allowlist-common.js +36 -0
  157. package/dist/slack/runtime.js +3 -0
  158. package/dist/slack/sent-thread-cache.js +61 -0
  159. package/dist/slack/truncate.js +10 -0
  160. package/dist/telegram/account-inspect.js +175 -0
  161. package/dist/telegram/allow-from.js +10 -0
  162. package/dist/telegram/api-fetch.js +18 -0
  163. package/dist/telegram/approval-buttons.js +30 -0
  164. package/dist/telegram/audit-membership-runtime.js +61 -0
  165. package/dist/telegram/bot/delivery.replies.js +508 -0
  166. package/dist/telegram/bot/delivery.resolve-media.js +227 -0
  167. package/dist/telegram/bot/delivery.send.js +132 -0
  168. package/dist/telegram/bot/reply-threading.js +46 -0
  169. package/dist/telegram/bot-message-context.body.js +186 -0
  170. package/dist/telegram/bot-message-context.session.js +207 -0
  171. package/dist/telegram/bot-message-context.types.js +1 -0
  172. package/dist/telegram/bot-native-commands.test-helpers.js +117 -0
  173. package/dist/telegram/bot.media.e2e-harness.js +81 -0
  174. package/dist/telegram/bot.media.test-utils.js +81 -0
  175. package/dist/telegram/channel-actions.js +225 -0
  176. package/dist/telegram/channel.js +515 -0
  177. package/dist/telegram/conversation-route.js +107 -0
  178. package/dist/telegram/delivery.js +2 -0
  179. package/dist/telegram/delivery.replies.js +508 -0
  180. package/dist/telegram/dm-access.js +86 -0
  181. package/dist/telegram/draft-stream.test-helpers.js +62 -0
  182. package/dist/telegram/exec-approvals-handler.js +281 -0
  183. package/dist/telegram/exec-approvals.js +62 -0
  184. package/dist/telegram/forum-service-message.js +22 -0
  185. package/dist/telegram/group-config-helpers.js +10 -0
  186. package/dist/telegram/lane-delivery-state.js +19 -0
  187. package/dist/telegram/lane-delivery-text-deliverer.js +357 -0
  188. package/dist/telegram/lane-delivery.js +2 -0
  189. package/dist/telegram/normalize.js +37 -0
  190. package/dist/telegram/onboarding.js +192 -0
  191. package/dist/telegram/outbound-adapter.js +100 -0
  192. package/dist/telegram/polling-session.js +275 -0
  193. package/dist/telegram/runtime.js +3 -0
  194. package/dist/telegram/sendchataction-401-backoff.js +71 -0
  195. package/dist/telegram/sequential-key.js +46 -0
  196. package/dist/telegram/status-issues.js +105 -0
  197. package/dist/telegram/target-writeback.js +165 -0
  198. package/dist/telegram/thread-bindings.js +560 -0
  199. package/dist/utils.js +10 -276
  200. package/dist/wizard/prompts.js +5 -5
  201. package/extensions/feishu/src/policy.ts +1 -1
  202. package/extensions/firecrawl/index.test.ts +82 -0
  203. package/extensions/firecrawl/index.ts +20 -0
  204. package/extensions/firecrawl/openclaw.plugin.json +8 -0
  205. package/extensions/firecrawl/package.json +12 -0
  206. package/extensions/firecrawl/src/config.ts +159 -0
  207. package/extensions/firecrawl/src/firecrawl-client.ts +446 -0
  208. package/extensions/firecrawl/src/firecrawl-scrape-tool.ts +89 -0
  209. package/extensions/firecrawl/src/firecrawl-search-provider.ts +63 -0
  210. package/extensions/firecrawl/src/firecrawl-search-tool.ts +76 -0
  211. package/package.json +1 -1
  212. package/dist/.buildstamp +0 -1
  213. package/dist/acp/bindings-store.js +0 -209
  214. package/dist/acp/control-plane/runtime-cache.js +0 -54
  215. package/dist/acp/control-plane/runtime-options.js +0 -215
  216. package/dist/acp/control-plane/session-actor-queue.js +0 -36
  217. package/dist/acp/index.js +0 -2
  218. package/dist/acp/runtime/errors.js +0 -47
  219. package/dist/acp/runtime/registry.js +0 -86
  220. package/dist/acp/secret-file.js +0 -22
  221. package/dist/agents/auth-profiles.resolve-auth-profile-order.fixtures.js +0 -23
  222. package/dist/agents/bash-process-registry.test-helpers.js +0 -29
  223. package/dist/agents/bash-tools.exec-approval-request.js +0 -20
  224. package/dist/agents/bash-tools.exec-host-gateway.js +0 -240
  225. package/dist/agents/bash-tools.exec-host-node.js +0 -235
  226. package/dist/agents/checkpoint-manager.js +0 -290
  227. package/dist/agents/claude-cli-runner.js +0 -3
  228. package/dist/agents/error-classifier.js +0 -251
  229. package/dist/agents/live-model-filter.js +0 -84
  230. package/dist/agents/nvidia-models.js +0 -228
  231. package/dist/agents/pi-embedded-runner/run.overflow-compaction.fixture.js +0 -34
  232. package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +0 -156
  233. package/dist/agents/pi-embedded-subscribe.handlers.tools.media.test-helpers.js +0 -30
  234. package/dist/agents/provider/config-loader.js +0 -76
  235. package/dist/agents/provider/index.js +0 -15
  236. package/dist/agents/provider/models-dev.js +0 -129
  237. package/dist/agents/provider/session-binding.js +0 -376
  238. package/dist/agents/queued-file-writer.js +0 -22
  239. package/dist/agents/skills/bundled-context.js +0 -23
  240. package/dist/agents/skills/security.js +0 -211
  241. package/dist/agents/skills/tools-dir.js +0 -9
  242. package/dist/agents/skills-install-download.js +0 -290
  243. package/dist/agents/skills-install-output.js +0 -30
  244. package/dist/agents/skills-install.download-test-utils.js +0 -36
  245. package/dist/agents/skills.test-helpers.js +0 -13
  246. package/dist/agents/subagent-announce-reliability.js +0 -160
  247. package/dist/agents/subagent-registry.mocks.shared.js +0 -12
  248. package/dist/agents/test-helpers/assistant-message-fixtures.js +0 -29
  249. package/dist/agents/test-helpers/fast-coding-tools.js +0 -1
  250. package/dist/agents/test-helpers/fast-core-tools.js +0 -8
  251. package/dist/agents/test-helpers/fast-tool-stubs.js +0 -18
  252. package/dist/agents/test-helpers/host-sandbox-fs-bridge.js +0 -74
  253. package/dist/agents/test-helpers/pi-tools-sandbox-context.js +0 -27
  254. package/dist/agents/tool-display-common.js +0 -915
  255. package/dist/agents/tool-policy-shared.js +0 -108
  256. package/dist/agents/tool-policy.conformance.js +0 -14
  257. package/dist/agents/tool-result-truncation.js +0 -299
  258. package/dist/agents/tools/cron-tool.test-helpers.js +0 -12
  259. package/dist/agents/tools/discord-actions-moderation-shared.js +0 -27
  260. package/dist/agents/tools/discord-actions-presence.js +0 -78
  261. package/dist/control-ui/assets/index-D7shnQwQ.js.map +0 -1
  262. package/dist/discord/discord-improvements.js +0 -167
  263. package/dist/discord/index.js +0 -2
  264. package/dist/hooks/bundled/boot-md/HOOK.md +0 -19
  265. package/dist/hooks/bundled/command-logger/HOOK.md +0 -122
  266. package/dist/hooks/bundled/session-memory/HOOK.md +0 -86
  267. package/dist/hooks/bundled/soul-evil/HOOK.md +0 -71
  268. package/dist/whatsapp/normalize.js +0 -66
  269. package/dist/whatsapp/resolve-outbound-target.js +0 -42
  270. /package/dist/{acp/runtime/types.js → auto-reply/auto-reply/reply/commands-types.js} +0 -0
  271. /package/dist/{agents/pi-embedded-payloads.js → slack/account-surface-fields.js} +0 -0
@@ -1,307 +1 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>Poolbot Canvas</title>
7
- <script>
8
- (() => {
9
- try {
10
- const params = new URLSearchParams(window.location.search);
11
- const platform = (params.get("platform") || "").trim().toLowerCase();
12
- if (platform) {
13
- document.documentElement.dataset.platform = platform;
14
- return;
15
- }
16
- if (/android/i.test(navigator.userAgent || "")) {
17
- document.documentElement.dataset.platform = "android";
18
- }
19
- } catch (_) {}
20
- })();
21
- </script>
22
- <style>
23
- :root {
24
- color-scheme: dark;
25
- }
26
- @media (prefers-reduced-motion: reduce) {
27
- body::before,
28
- body::after {
29
- animation: none !important;
30
- }
31
- }
32
- html,
33
- body {
34
- height: 100%;
35
- margin: 0;
36
- }
37
- body {
38
- font:
39
- 14px system-ui,
40
- -apple-system,
41
- BlinkMacSystemFont,
42
- "Roboto",
43
- sans-serif;
44
- background:
45
- radial-gradient(1200px 900px at 15% 20%, rgba(42, 113, 255, 0.18), rgba(0, 0, 0, 0) 55%),
46
- radial-gradient(900px 700px at 85% 30%, rgba(255, 0, 138, 0.14), rgba(0, 0, 0, 0) 60%),
47
- radial-gradient(1000px 900px at 60% 90%, rgba(0, 209, 255, 0.1), rgba(0, 0, 0, 0) 60%),
48
- #000;
49
- color: #e5e7eb;
50
- overflow: hidden;
51
- }
52
- :root[data-platform="android"] body {
53
- background:
54
- radial-gradient(1200px 900px at 15% 20%, rgba(42, 113, 255, 0.62), rgba(0, 0, 0, 0) 55%),
55
- radial-gradient(900px 700px at 85% 30%, rgba(255, 0, 138, 0.52), rgba(0, 0, 0, 0) 60%),
56
- radial-gradient(1000px 900px at 60% 90%, rgba(0, 209, 255, 0.48), rgba(0, 0, 0, 0) 60%),
57
- #0b1328;
58
- }
59
- body::before {
60
- content: "";
61
- position: fixed;
62
- inset: -20%;
63
- background:
64
- repeating-linear-gradient(
65
- 0deg,
66
- rgba(255, 255, 255, 0.03) 0,
67
- rgba(255, 255, 255, 0.03) 1px,
68
- transparent 1px,
69
- transparent 48px
70
- ),
71
- repeating-linear-gradient(
72
- 90deg,
73
- rgba(255, 255, 255, 0.03) 0,
74
- rgba(255, 255, 255, 0.03) 1px,
75
- transparent 1px,
76
- transparent 48px
77
- );
78
- transform: translate3d(0, 0, 0) rotate(-7deg);
79
- will-change: transform, opacity;
80
- -webkit-backface-visibility: hidden;
81
- backface-visibility: hidden;
82
- opacity: 0.45;
83
- pointer-events: none;
84
- animation: poolbot-grid-drift 140s ease-in-out infinite alternate;
85
- }
86
- :root[data-platform="android"] body::before {
87
- opacity: 0.8;
88
- }
89
- body::after {
90
- content: "";
91
- position: fixed;
92
- inset: -35%;
93
- background:
94
- radial-gradient(900px 700px at 30% 30%, rgba(42, 113, 255, 0.16), rgba(0, 0, 0, 0) 60%),
95
- radial-gradient(800px 650px at 70% 35%, rgba(255, 0, 138, 0.12), rgba(0, 0, 0, 0) 62%),
96
- radial-gradient(900px 800px at 55% 75%, rgba(0, 209, 255, 0.1), rgba(0, 0, 0, 0) 62%);
97
- filter: blur(28px);
98
- opacity: 0.52;
99
- will-change: transform, opacity;
100
- -webkit-backface-visibility: hidden;
101
- backface-visibility: hidden;
102
- transform: translate3d(0, 0, 0);
103
- pointer-events: none;
104
- animation: poolbot-glow-drift 110s ease-in-out infinite alternate;
105
- }
106
- :root[data-platform="android"] body::after {
107
- opacity: 0.85;
108
- }
109
- @supports (mix-blend-mode: screen) {
110
- body::after {
111
- mix-blend-mode: screen;
112
- }
113
- }
114
- @supports not (mix-blend-mode: screen) {
115
- body::after {
116
- opacity: 0.7;
117
- }
118
- }
119
- @keyframes poolbot-grid-drift {
120
- 0% {
121
- transform: translate3d(-12px, 8px, 0) rotate(-7deg);
122
- opacity: 0.4;
123
- }
124
- 50% {
125
- transform: translate3d(10px, -7px, 0) rotate(-6.6deg);
126
- opacity: 0.56;
127
- }
128
- 100% {
129
- transform: translate3d(-8px, 6px, 0) rotate(-7.2deg);
130
- opacity: 0.42;
131
- }
132
- }
133
- @keyframes poolbot-glow-drift {
134
- 0% {
135
- transform: translate3d(-18px, 12px, 0) scale(1.02);
136
- opacity: 0.4;
137
- }
138
- 50% {
139
- transform: translate3d(14px, -10px, 0) scale(1.05);
140
- opacity: 0.52;
141
- }
142
- 100% {
143
- transform: translate3d(-10px, 8px, 0) scale(1.03);
144
- opacity: 0.43;
145
- }
146
- }
147
- canvas {
148
- position: fixed;
149
- inset: 0;
150
- display: block;
151
- width: 100vw;
152
- height: 100vh;
153
- touch-action: none;
154
- z-index: 1;
155
- }
156
- :root[data-platform="android"] #poolbot-canvas {
157
- background:
158
- radial-gradient(1100px 800px at 20% 15%, rgba(42, 113, 255, 0.78), rgba(0, 0, 0, 0) 58%),
159
- radial-gradient(900px 650px at 82% 28%, rgba(255, 0, 138, 0.66), rgba(0, 0, 0, 0) 62%),
160
- radial-gradient(1000px 900px at 60% 88%, rgba(0, 209, 255, 0.58), rgba(0, 0, 0, 0) 62%),
161
- #141c33;
162
- }
163
- #poolbot-status {
164
- position: fixed;
165
- inset: 0;
166
- display: none;
167
- align-items: center;
168
- justify-content: center;
169
- flex-direction: column;
170
- padding: 24px;
171
- box-sizing: border-box;
172
- pointer-events: none;
173
- z-index: 3;
174
- }
175
- #poolbot-status .card {
176
- width: min(560px, 88vw);
177
- text-align: left;
178
- padding: 14px 16px 12px;
179
- border-radius: 16px;
180
- background: linear-gradient(140deg, rgba(23, 24, 35, 0.78), rgba(18, 19, 28, 0.55));
181
- border: 1px solid rgba(255, 255, 255, 0.12);
182
- box-shadow:
183
- 0 16px 46px rgba(0, 0, 0, 0.52),
184
- inset 0 1px 0 rgba(255, 255, 255, 0.06);
185
- -webkit-backdrop-filter: blur(18px) saturate(140%);
186
- backdrop-filter: blur(18px) saturate(140%);
187
- }
188
- #poolbot-status .title {
189
- font:
190
- 600 12px/1.2 -apple-system,
191
- BlinkMacSystemFont,
192
- "SF Pro Text",
193
- system-ui,
194
- sans-serif;
195
- letter-spacing: 0.45px;
196
- text-transform: uppercase;
197
- color: rgba(255, 255, 255, 0.7);
198
- }
199
- #poolbot-status .subtitle {
200
- margin-top: 8px;
201
- font:
202
- 500 13px/1.45 -apple-system,
203
- BlinkMacSystemFont,
204
- "SF Pro Text",
205
- system-ui,
206
- sans-serif;
207
- color: rgba(255, 255, 255, 0.9);
208
- white-space: pre-wrap;
209
- overflow-wrap: anywhere;
210
- }
211
- poolbot-a2ui-host {
212
- display: block;
213
- height: 100%;
214
- position: fixed;
215
- inset: 0;
216
- z-index: 4;
217
- --poolbot-a2ui-inset-top: 28px;
218
- --poolbot-a2ui-inset-right: 0px;
219
- --poolbot-a2ui-inset-bottom: 0px;
220
- --poolbot-a2ui-inset-left: 0px;
221
- --poolbot-a2ui-scroll-pad-bottom: 0px;
222
- --poolbot-a2ui-status-top: calc(50% - 18px);
223
- --poolbot-a2ui-empty-top: 18px;
224
- }
225
- </style>
226
- </head>
227
- <body>
228
- <canvas id="poolbot-canvas"></canvas>
229
- <div id="poolbot-status">
230
- <div class="card">
231
- <div class="title" id="poolbot-status-title">Ready</div>
232
- <div class="subtitle" id="poolbot-status-subtitle">Waiting for agent</div>
233
- </div>
234
- </div>
235
- <poolbot-a2ui-host></poolbot-a2ui-host>
236
- <script src="a2ui.bundle.js"></script>
237
- <script>
238
- (() => {
239
- const canvas = document.getElementById("poolbot-canvas");
240
- const ctx = canvas.getContext("2d");
241
- const statusEl = document.getElementById("poolbot-status");
242
- const titleEl = document.getElementById("poolbot-status-title");
243
- const subtitleEl = document.getElementById("poolbot-status-subtitle");
244
- const debugStatusEnabledByQuery = (() => {
245
- try {
246
- const params = new URLSearchParams(window.location.search);
247
- const raw = params.get("debugStatus") ?? params.get("debug");
248
- if (!raw) return false;
249
- const normalized = String(raw).trim().toLowerCase();
250
- return normalized === "1" || normalized === "true" || normalized === "yes";
251
- } catch (_) {
252
- return false;
253
- }
254
- })();
255
- let debugStatusEnabled = debugStatusEnabledByQuery;
256
-
257
- function resize() {
258
- const dpr = window.devicePixelRatio || 1;
259
- const w = Math.max(1, Math.floor(window.innerWidth * dpr));
260
- const h = Math.max(1, Math.floor(window.innerHeight * dpr));
261
- canvas.width = w;
262
- canvas.height = h;
263
- ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
264
- }
265
-
266
- window.addEventListener("resize", resize);
267
- resize();
268
-
269
- const setDebugStatusEnabled = (enabled) => {
270
- debugStatusEnabled = !!enabled;
271
- if (!statusEl) return;
272
- if (!debugStatusEnabled) {
273
- statusEl.style.display = "none";
274
- }
275
- };
276
-
277
- if (statusEl && !debugStatusEnabled) {
278
- statusEl.style.display = "none";
279
- }
280
-
281
- window.__poolbot = {
282
- canvas,
283
- ctx,
284
- setDebugStatusEnabled,
285
- setStatus: (title, subtitle) => {
286
- if (!statusEl || !debugStatusEnabled) return;
287
- if (!title && !subtitle) {
288
- statusEl.style.display = "none";
289
- return;
290
- }
291
- statusEl.style.display = "flex";
292
- if (titleEl && typeof title === "string") titleEl.textContent = title;
293
- if (subtitleEl && typeof subtitle === "string") subtitleEl.textContent = subtitle;
294
- if (!debugStatusEnabled) {
295
- clearTimeout(window.__statusTimeout);
296
- window.__statusTimeout = setTimeout(() => {
297
- statusEl.style.display = "none";
298
- }, 3000);
299
- } else {
300
- clearTimeout(window.__statusTimeout);
301
- }
302
- },
303
- };
304
- })();
305
- </script>
306
- </body>
307
- </html>
1
+ <!-- A2UI stub - Artifacts UI placeholder -->
@@ -0,0 +1,185 @@
1
+ import { resolveSlackAccount } from "../../slack/accounts.js";
2
+ import { resolveDiscordAccount } from "../../discord/accounts.js";
3
+ import { resolveTelegramAccount } from "../../telegram/accounts.js";
4
+ import { resolveWhatsAppAccount } from "../../web/accounts.js";
5
+ import { normalizeSlackMessagingTarget } from "./normalize/slack.js";
6
+ import { isWhatsAppGroupJid, normalizeWhatsAppTarget } from "../../whatsapp/normalize.js";
7
+ export async function listSlackDirectoryPeersFromConfig(params) {
8
+ const account = resolveSlackAccount({ cfg: params.cfg, accountId: params.accountId });
9
+ const q = params.query?.trim().toLowerCase() || "";
10
+ const ids = new Set();
11
+ for (const entry of account.dm?.allowFrom ?? []) {
12
+ const raw = String(entry).trim();
13
+ if (!raw || raw === "*")
14
+ continue;
15
+ ids.add(raw);
16
+ }
17
+ for (const id of Object.keys(account.config.dms ?? {})) {
18
+ const trimmed = id.trim();
19
+ if (trimmed)
20
+ ids.add(trimmed);
21
+ }
22
+ for (const channel of Object.values(account.config.channels ?? {})) {
23
+ for (const user of channel.users ?? []) {
24
+ const raw = String(user).trim();
25
+ if (raw)
26
+ ids.add(raw);
27
+ }
28
+ }
29
+ return Array.from(ids)
30
+ .map((raw) => raw.trim())
31
+ .filter(Boolean)
32
+ .map((raw) => {
33
+ const mention = raw.match(/^<@([A-Z0-9]+)>$/i);
34
+ const normalizedUserId = (mention?.[1] ?? raw).replace(/^(slack|user):/i, "").trim();
35
+ if (!normalizedUserId)
36
+ return null;
37
+ const target = `user:${normalizedUserId}`;
38
+ return normalizeSlackMessagingTarget(target) ?? target.toLowerCase();
39
+ })
40
+ .filter((id) => Boolean(id))
41
+ .filter((id) => id.startsWith("user:"))
42
+ .filter((id) => (q ? id.toLowerCase().includes(q) : true))
43
+ .slice(0, params.limit && params.limit > 0 ? params.limit : undefined)
44
+ .map((id) => ({ kind: "user", id }));
45
+ }
46
+ export async function listSlackDirectoryGroupsFromConfig(params) {
47
+ const account = resolveSlackAccount({ cfg: params.cfg, accountId: params.accountId });
48
+ const q = params.query?.trim().toLowerCase() || "";
49
+ return Object.keys(account.config.channels ?? {})
50
+ .map((raw) => raw.trim())
51
+ .filter(Boolean)
52
+ .map((raw) => normalizeSlackMessagingTarget(raw) ?? raw.toLowerCase())
53
+ .filter((id) => id.startsWith("channel:"))
54
+ .filter((id) => (q ? id.toLowerCase().includes(q) : true))
55
+ .slice(0, params.limit && params.limit > 0 ? params.limit : undefined)
56
+ .map((id) => ({ kind: "group", id }));
57
+ }
58
+ export async function listDiscordDirectoryPeersFromConfig(params) {
59
+ const account = resolveDiscordAccount({ cfg: params.cfg, accountId: params.accountId });
60
+ const q = params.query?.trim().toLowerCase() || "";
61
+ const ids = new Set();
62
+ for (const entry of account.config.dm?.allowFrom ?? []) {
63
+ const raw = String(entry).trim();
64
+ if (!raw || raw === "*")
65
+ continue;
66
+ ids.add(raw);
67
+ }
68
+ for (const id of Object.keys(account.config.dms ?? {})) {
69
+ const trimmed = id.trim();
70
+ if (trimmed)
71
+ ids.add(trimmed);
72
+ }
73
+ for (const guild of Object.values(account.config.guilds ?? {})) {
74
+ for (const entry of guild.users ?? []) {
75
+ const raw = String(entry).trim();
76
+ if (raw)
77
+ ids.add(raw);
78
+ }
79
+ for (const channel of Object.values(guild.channels ?? {})) {
80
+ for (const user of channel.users ?? []) {
81
+ const raw = String(user).trim();
82
+ if (raw)
83
+ ids.add(raw);
84
+ }
85
+ }
86
+ }
87
+ return Array.from(ids)
88
+ .map((raw) => raw.trim())
89
+ .filter(Boolean)
90
+ .map((raw) => {
91
+ const mention = raw.match(/^<@!?(\d+)>$/);
92
+ const cleaned = (mention?.[1] ?? raw).replace(/^(discord|user):/i, "").trim();
93
+ if (!/^\d+$/.test(cleaned))
94
+ return null;
95
+ return `user:${cleaned}`;
96
+ })
97
+ .filter((id) => Boolean(id))
98
+ .filter((id) => (q ? id.toLowerCase().includes(q) : true))
99
+ .slice(0, params.limit && params.limit > 0 ? params.limit : undefined)
100
+ .map((id) => ({ kind: "user", id }));
101
+ }
102
+ export async function listDiscordDirectoryGroupsFromConfig(params) {
103
+ const account = resolveDiscordAccount({ cfg: params.cfg, accountId: params.accountId });
104
+ const q = params.query?.trim().toLowerCase() || "";
105
+ const ids = new Set();
106
+ for (const guild of Object.values(account.config.guilds ?? {})) {
107
+ for (const channelId of Object.keys(guild.channels ?? {})) {
108
+ const trimmed = channelId.trim();
109
+ if (trimmed)
110
+ ids.add(trimmed);
111
+ }
112
+ }
113
+ return Array.from(ids)
114
+ .map((raw) => raw.trim())
115
+ .filter(Boolean)
116
+ .map((raw) => {
117
+ const mention = raw.match(/^<#(\d+)>$/);
118
+ const cleaned = (mention?.[1] ?? raw).replace(/^(discord|channel|group):/i, "").trim();
119
+ if (!/^\d+$/.test(cleaned))
120
+ return null;
121
+ return `channel:${cleaned}`;
122
+ })
123
+ .filter((id) => Boolean(id))
124
+ .filter((id) => (q ? id.toLowerCase().includes(q) : true))
125
+ .slice(0, params.limit && params.limit > 0 ? params.limit : undefined)
126
+ .map((id) => ({ kind: "group", id }));
127
+ }
128
+ export async function listTelegramDirectoryPeersFromConfig(params) {
129
+ const account = resolveTelegramAccount({ cfg: params.cfg, accountId: params.accountId });
130
+ const q = params.query?.trim().toLowerCase() || "";
131
+ const raw = [
132
+ ...(account.config.allowFrom ?? []).map((entry) => String(entry)),
133
+ ...Object.keys(account.config.dms ?? {}),
134
+ ];
135
+ return Array.from(new Set(raw
136
+ .map((entry) => entry.trim())
137
+ .filter(Boolean)
138
+ .map((entry) => entry.replace(/^(telegram|tg):/i, ""))))
139
+ .map((entry) => {
140
+ const trimmed = entry.trim();
141
+ if (!trimmed)
142
+ return null;
143
+ if (/^-?\d+$/.test(trimmed))
144
+ return trimmed;
145
+ const withAt = trimmed.startsWith("@") ? trimmed : `@${trimmed}`;
146
+ return withAt;
147
+ })
148
+ .filter((id) => Boolean(id))
149
+ .filter((id) => (q ? id.toLowerCase().includes(q) : true))
150
+ .slice(0, params.limit && params.limit > 0 ? params.limit : undefined)
151
+ .map((id) => ({ kind: "user", id }));
152
+ }
153
+ export async function listTelegramDirectoryGroupsFromConfig(params) {
154
+ const account = resolveTelegramAccount({ cfg: params.cfg, accountId: params.accountId });
155
+ const q = params.query?.trim().toLowerCase() || "";
156
+ return Object.keys(account.config.groups ?? {})
157
+ .map((id) => id.trim())
158
+ .filter((id) => Boolean(id) && id !== "*")
159
+ .filter((id) => (q ? id.toLowerCase().includes(q) : true))
160
+ .slice(0, params.limit && params.limit > 0 ? params.limit : undefined)
161
+ .map((id) => ({ kind: "group", id }));
162
+ }
163
+ export async function listWhatsAppDirectoryPeersFromConfig(params) {
164
+ const account = resolveWhatsAppAccount({ cfg: params.cfg, accountId: params.accountId });
165
+ const q = params.query?.trim().toLowerCase() || "";
166
+ return (account.allowFrom ?? [])
167
+ .map((entry) => String(entry).trim())
168
+ .filter((entry) => Boolean(entry) && entry !== "*")
169
+ .map((entry) => normalizeWhatsAppTarget(entry) ?? "")
170
+ .filter(Boolean)
171
+ .filter((id) => !isWhatsAppGroupJid(id))
172
+ .filter((id) => (q ? id.toLowerCase().includes(q) : true))
173
+ .slice(0, params.limit && params.limit > 0 ? params.limit : undefined)
174
+ .map((id) => ({ kind: "user", id }));
175
+ }
176
+ export async function listWhatsAppDirectoryGroupsFromConfig(params) {
177
+ const account = resolveWhatsAppAccount({ cfg: params.cfg, accountId: params.accountId });
178
+ const q = params.query?.trim().toLowerCase() || "";
179
+ return Object.keys(account.groups ?? {})
180
+ .map((id) => id.trim())
181
+ .filter((id) => Boolean(id) && id !== "*")
182
+ .filter((id) => (q ? id.toLowerCase().includes(q) : true))
183
+ .slice(0, params.limit && params.limit > 0 ? params.limit : undefined)
184
+ .map((id) => ({ kind: "group", id }));
185
+ }