@poolzin/pool-bot 2026.2.17 → 2026.2.18

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 (469) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/agents/agent-scope.js +4 -0
  3. package/dist/agents/announce-idempotency.js +14 -0
  4. package/dist/agents/auth-profiles.resolve-auth-profile-order.fixtures.js +23 -0
  5. package/dist/agents/bash-tools.exec-runtime.js +438 -0
  6. package/dist/agents/bash-tools.shared.js +6 -0
  7. package/dist/agents/cli-runner/reliability.js +61 -0
  8. package/dist/agents/cli-watchdog-defaults.js +11 -0
  9. package/dist/agents/command-poll-backoff.js +63 -0
  10. package/dist/agents/current-time.js +16 -0
  11. package/dist/agents/model-alias-lines.js +18 -0
  12. package/dist/agents/model-auth-label.js +61 -0
  13. package/dist/agents/models-config.e2e-harness.js +115 -0
  14. package/dist/agents/ollama-stream.js +11 -3
  15. package/dist/agents/openclaw-tools.js +135 -0
  16. package/dist/agents/pi-auth-json.js +118 -0
  17. package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +147 -0
  18. package/dist/agents/pi-embedded-subscribe.e2e-harness.js +90 -0
  19. package/dist/agents/pi-embedded-subscribe.handlers.compaction.js +63 -0
  20. package/dist/agents/pi-embedded-subscribe.handlers.tools.media.test-helpers.js +30 -0
  21. package/dist/agents/pi-extensions/session-manager-runtime-registry.js +23 -0
  22. package/dist/agents/pi-tools.js +2 -0
  23. package/dist/agents/queued-file-writer.js +22 -0
  24. package/dist/agents/sandbox/docker.js +133 -40
  25. package/dist/agents/sandbox/fs-bridge.js +146 -0
  26. package/dist/agents/sandbox/fs-paths.js +205 -0
  27. package/dist/agents/sandbox/hash.js +4 -0
  28. package/dist/agents/sandbox-paths.js +3 -0
  29. package/dist/agents/session-dirs.js +20 -0
  30. package/dist/agents/skills/filter.js +24 -0
  31. package/dist/agents/skills/tools-dir.js +9 -0
  32. package/dist/agents/skills-install-download.js +290 -0
  33. package/dist/agents/skills-install-output.js +30 -0
  34. package/dist/agents/skills-install.download-test-utils.js +36 -0
  35. package/dist/agents/skills.e2e-test-helpers.js +13 -0
  36. package/dist/agents/subagent-announce-queue.js +59 -15
  37. package/dist/agents/subagent-depth.js +137 -0
  38. package/dist/agents/subagent-registry.js +448 -96
  39. package/dist/agents/subagent-spawn.js +262 -0
  40. package/dist/agents/test-helpers/fast-tool-stubs.js +18 -0
  41. package/dist/agents/test-helpers/host-sandbox-fs-bridge.js +74 -0
  42. package/dist/agents/tool-display-common.js +782 -0
  43. package/dist/agents/tools/image-tool.js +1 -1
  44. package/dist/agents/tools/sessions-access.js +178 -0
  45. package/dist/agents/tools/sessions-resolution.js +206 -0
  46. package/dist/agents/tools/subagents-tool.js +616 -0
  47. package/dist/agents/workspace-dir.js +18 -0
  48. package/dist/agents/workspace-dirs.js +14 -0
  49. package/dist/agents/workspace.js +70 -0
  50. package/dist/auto-reply/heartbeat-reply-payload.js +18 -0
  51. package/dist/auto-reply/reply/commands-export-session.js +163 -0
  52. package/dist/auto-reply/reply/commands-mesh.js +245 -0
  53. package/dist/auto-reply/reply/commands-setunset.js +28 -0
  54. package/dist/auto-reply/reply/commands-slash-parse.js +31 -0
  55. package/dist/auto-reply/reply/commands-system-prompt.js +117 -0
  56. package/dist/auto-reply/reply/directive-handling.levels.js +17 -0
  57. package/dist/auto-reply/reply/directive-handling.params.js +1 -0
  58. package/dist/auto-reply/reply/directive-parsing.js +36 -0
  59. package/dist/auto-reply/reply/dispatcher-registry.js +43 -0
  60. package/dist/auto-reply/reply/elevated-unavailable.js +20 -0
  61. package/dist/auto-reply/reply/reply-delivery.js +92 -0
  62. package/dist/auto-reply/reply/session-reset-prompt.js +1 -0
  63. package/dist/auto-reply/reply/session-run-accounting.js +33 -0
  64. package/dist/auto-reply/reply.directive.directive-behavior.e2e-harness.js +115 -0
  65. package/dist/auto-reply/reply.directive.directive-behavior.e2e-mocks.js +12 -0
  66. package/dist/browser/bridge-auth-registry.js +26 -0
  67. package/dist/browser/client-actions-url.js +10 -0
  68. package/dist/browser/control-auth.js +73 -0
  69. package/dist/browser/csrf.js +64 -0
  70. package/dist/browser/http-auth.js +52 -0
  71. package/dist/browser/paths.js +37 -0
  72. package/dist/browser/proxy-files.js +32 -0
  73. package/dist/browser/pw-ai-state.js +7 -0
  74. package/dist/browser/resolved-config-refresh.js +42 -0
  75. package/dist/browser/routes/path-output.js +1 -0
  76. package/dist/browser/server-context.chrome-test-harness.js +20 -0
  77. package/dist/browser/server-middleware.js +31 -0
  78. package/dist/browser/test-port.js +16 -0
  79. package/dist/build-info.json +3 -3
  80. package/dist/canvas-host/file-resolver.js +43 -0
  81. package/dist/channels/account-summary.js +19 -0
  82. package/dist/channels/draft-stream-loop.js +77 -0
  83. package/dist/channels/plugins/account-helpers.js +26 -0
  84. package/dist/channels/telegram/allow-from.js +10 -0
  85. package/dist/cli/browser-cli-resize.js +22 -0
  86. package/dist/cli/browser-cli-shared.js +8 -0
  87. package/dist/cli/clawbot-cli.js +5 -0
  88. package/dist/cli/completion-cli.js +566 -0
  89. package/dist/cli/config-cli.js +63 -5
  90. package/dist/cli/daemon-cli/lifecycle-core.js +256 -0
  91. package/dist/cli/daemon-cli/register-service-commands.js +60 -0
  92. package/dist/cli/daemon-cli-compat.js +80 -0
  93. package/dist/cli/nodes-cli/pairing-render.js +26 -0
  94. package/dist/cli/program/action-reparse.js +17 -0
  95. package/dist/cli/program/command-registry.js +17 -0
  96. package/dist/cli/program/program-context.js +8 -0
  97. package/dist/cli/program/register.subclis.js +7 -0
  98. package/dist/cli/program/routes.js +233 -0
  99. package/dist/cli/qr-cli.js +132 -0
  100. package/dist/cli/requirements-test-fixtures.js +17 -0
  101. package/dist/cli/respawn-policy.js +4 -0
  102. package/dist/cli/shared/parse-port.js +18 -0
  103. package/dist/cli/skills-cli.format.js +241 -0
  104. package/dist/cli/update-cli/progress.js +121 -0
  105. package/dist/cli/update-cli/restart-helper.js +108 -0
  106. package/dist/cli/update-cli/shared.js +196 -0
  107. package/dist/cli/update-cli/status.js +97 -0
  108. package/dist/cli/update-cli/suppress-deprecations.js +17 -0
  109. package/dist/cli/update-cli/update-command.js +506 -0
  110. package/dist/cli/update-cli/wizard.js +130 -0
  111. package/dist/cli/update-cli.js +3 -9
  112. package/dist/cli/windows-argv.js +69 -0
  113. package/dist/commands/auth-choice-legacy.js +20 -0
  114. package/dist/commands/auth-choice.apply-helpers.js +8 -0
  115. package/dist/commands/channel-test-helpers.js +19 -0
  116. package/dist/commands/cleanup-plan.js +10 -0
  117. package/dist/commands/cleanup-utils.js +7 -0
  118. package/dist/commands/config-validation.js +15 -0
  119. package/dist/commands/doctor-completion.js +112 -0
  120. package/dist/commands/doctor-memory-search.js +119 -0
  121. package/dist/commands/doctor-session-locks.js +73 -0
  122. package/dist/commands/doctor.e2e-harness.js +364 -0
  123. package/dist/commands/gateway-presence.js +19 -0
  124. package/dist/commands/model-default.js +35 -0
  125. package/dist/commands/models/fallbacks-shared.js +102 -0
  126. package/dist/commands/models/shared.js +24 -0
  127. package/dist/commands/onboard-auth.config-gateways.js +64 -0
  128. package/dist/commands/onboard-auth.config-litellm.js +45 -0
  129. package/dist/commands/onboard-auth.config-shared.js +116 -0
  130. package/dist/commands/onboard-config.js +16 -0
  131. package/dist/commands/onboard-non-interactive.test-helpers.js +31 -0
  132. package/dist/commands/onboard-provider-auth-flags.js +136 -0
  133. package/dist/commands/openai-codex-oauth.js +40 -0
  134. package/dist/commands/test-runtime-config-helpers.js +21 -0
  135. package/dist/commands/test-wizard-helpers.js +68 -0
  136. package/dist/commands/vllm-setup.js +66 -0
  137. package/dist/compat/legacy-names.js +2 -0
  138. package/dist/config/backup-rotation.js +19 -0
  139. package/dist/config/env-preserve.js +122 -0
  140. package/dist/config/includes-scan.js +78 -0
  141. package/dist/config/plugins-allowlist.js +13 -0
  142. package/dist/config/schema.help.js +256 -0
  143. package/dist/config/schema.hints.js +189 -0
  144. package/dist/config/schema.irc.js +20 -0
  145. package/dist/config/schema.labels.js +317 -0
  146. package/dist/config/sessions/delivery-info.js +40 -0
  147. package/dist/config/types.irc.js +1 -0
  148. package/dist/config/zod-schema.agent-model.js +10 -0
  149. package/dist/config/zod-schema.allowdeny.js +35 -0
  150. package/dist/config/zod-schema.sensitive.js +4 -0
  151. package/dist/control-ui/assets/index-HRr1grwl.js.map +1 -1
  152. package/dist/cron/isolated-agent/skills-snapshot.js +26 -0
  153. package/dist/cron/isolated-agent/subagent-followup.js +127 -0
  154. package/dist/cron/isolated-agent.mocks.js +12 -0
  155. package/dist/cron/isolated-agent.test-setup.js +22 -0
  156. package/dist/cron/legacy-delivery.js +43 -0
  157. package/dist/cron/webhook-url.js +22 -0
  158. package/dist/daemon/arg-split.js +40 -0
  159. package/dist/daemon/exec-file.js +23 -0
  160. package/dist/daemon/output.js +6 -0
  161. package/dist/daemon/runtime-format.js +31 -0
  162. package/dist/daemon/schtasks-exec.js +4 -0
  163. package/dist/daemon/service-audit.js +22 -0
  164. package/dist/discord/client.js +41 -0
  165. package/dist/discord/components-registry.js +57 -0
  166. package/dist/discord/components.js +816 -0
  167. package/dist/discord/guilds.js +12 -0
  168. package/dist/discord/monitor/gateway-plugin.js +48 -0
  169. package/dist/discord/monitor/presence.js +30 -0
  170. package/dist/discord/send.components.js +115 -0
  171. package/dist/discord/send.shared.js +4 -0
  172. package/dist/discord/ui.js +26 -0
  173. package/dist/discord/voice-message.js +254 -0
  174. package/dist/gateway/agent-event-assistant-text.js +5 -0
  175. package/dist/gateway/agent-prompt.js +33 -0
  176. package/dist/gateway/auth-rate-limit.js +136 -0
  177. package/dist/gateway/channel-health-monitor.js +114 -0
  178. package/dist/gateway/control-ui-contract.js +1 -0
  179. package/dist/gateway/control-ui-csp.js +15 -0
  180. package/dist/gateway/gateway-config-prompts.shared.js +25 -0
  181. package/dist/gateway/http-auth-helpers.js +18 -0
  182. package/dist/gateway/http-common.js +18 -0
  183. package/dist/gateway/http-endpoint-helpers.js +27 -0
  184. package/dist/gateway/node-invoke-sanitize.js +11 -0
  185. package/dist/gateway/node-invoke-system-run-approval.js +205 -0
  186. package/dist/gateway/probe-auth.js +21 -0
  187. package/dist/gateway/protocol/index.js +7 -2
  188. package/dist/gateway/protocol/schema/mesh.js +54 -0
  189. package/dist/gateway/protocol/schema/protocol-schemas.js +7 -0
  190. package/dist/gateway/protocol/schema.js +1 -0
  191. package/dist/gateway/server/ws-connection/auth-messages.js +54 -0
  192. package/dist/gateway/server-channels.js +11 -0
  193. package/dist/gateway/server-methods/attachment-normalize.js +16 -0
  194. package/dist/gateway/server-methods/base-hash.js +8 -0
  195. package/dist/gateway/server-methods/mesh.js +700 -0
  196. package/dist/gateway/server-methods/nodes.handlers.invoke-result.js +55 -0
  197. package/dist/gateway/server-methods/restart-request.js +13 -0
  198. package/dist/gateway/server-methods/validation.js +8 -0
  199. package/dist/gateway/server.agent.gateway-server-agent.mocks.js +35 -0
  200. package/dist/gateway/server.e2e-registry-helpers.js +1 -0
  201. package/dist/gateway/server.e2e-ws-harness.js +20 -0
  202. package/dist/gateway/test-helpers.js +2 -0
  203. package/dist/gateway/test-helpers.server.js +3 -1
  204. package/dist/gateway/test-http-response.js +12 -0
  205. package/dist/gateway/test-openai-responses-model.js +20 -0
  206. package/dist/gateway/test-temp-config.js +30 -0
  207. package/dist/gateway/test-with-server.js +32 -0
  208. package/dist/hooks/bundled/bootstrap-extra-files/handler.js +46 -0
  209. package/dist/imessage/monitor/abort-handler.js +23 -0
  210. package/dist/imessage/monitor/inbound-processing.js +346 -0
  211. package/dist/imessage/monitor/parse-notification.js +64 -0
  212. package/dist/imessage/target-parsing-helpers.js +92 -0
  213. package/dist/infra/archive.js +244 -20
  214. package/dist/infra/detect-package-manager.js +26 -0
  215. package/dist/infra/exec-approvals-allowlist.js +257 -0
  216. package/dist/infra/exec-approvals-analysis.js +770 -0
  217. package/dist/infra/exec-approvals.js +13 -0
  218. package/dist/infra/file-lock.js +1 -0
  219. package/dist/infra/gemini-auth.js +39 -0
  220. package/dist/infra/heartbeat-active-hours.js +85 -0
  221. package/dist/infra/heartbeat-events-filter.js +50 -0
  222. package/dist/infra/heartbeat-runner.test-utils.js +39 -0
  223. package/dist/infra/http-body.js +265 -0
  224. package/dist/infra/install-package-dir.js +50 -0
  225. package/dist/infra/install-safe-path.js +49 -0
  226. package/dist/infra/json-files.js +49 -0
  227. package/dist/infra/jsonl-socket.js +52 -0
  228. package/dist/infra/map-size.js +14 -0
  229. package/dist/infra/net/hostname.js +7 -0
  230. package/dist/infra/npm-registry-spec.js +39 -0
  231. package/dist/infra/openclaw-root.js +109 -0
  232. package/dist/infra/outbound/delivery-queue.js +214 -0
  233. package/dist/infra/outbound/identity.js +23 -0
  234. package/dist/infra/outbound/message-action-params.js +307 -0
  235. package/dist/infra/outbound/tool-payload.js +21 -0
  236. package/dist/infra/package-json.js +23 -0
  237. package/dist/infra/pairing-files.js +19 -0
  238. package/dist/infra/pairing-token.js +9 -0
  239. package/dist/infra/path-prepend.js +51 -0
  240. package/dist/infra/process-respawn.js +49 -0
  241. package/dist/infra/runtime-status.js +16 -0
  242. package/dist/infra/session-cost-usage.types.js +1 -0
  243. package/dist/infra/session-maintenance-warning.js +89 -0
  244. package/dist/infra/system-run-command.js +78 -0
  245. package/dist/infra/tmp-openclaw-dir.js +81 -0
  246. package/dist/infra/tmp-poolbot-dir.js +2 -0
  247. package/dist/infra/update-channels.js +19 -0
  248. package/dist/line/actions.js +45 -0
  249. package/dist/line/channel-access-token.js +9 -0
  250. package/dist/line/flex-templates/basic-cards.js +332 -0
  251. package/dist/line/flex-templates/common.js +18 -0
  252. package/dist/line/flex-templates/media-control-cards.js +453 -0
  253. package/dist/line/flex-templates/message.js +10 -0
  254. package/dist/line/flex-templates/schedule-cards.js +399 -0
  255. package/dist/line/flex-templates/types.js +1 -0
  256. package/dist/line/webhook-node.js +100 -0
  257. package/dist/line/webhook-utils.js +11 -0
  258. package/dist/logging/timestamps.js +14 -0
  259. package/dist/markdown/whatsapp.js +62 -0
  260. package/dist/media/base64.js +34 -0
  261. package/dist/media/local-roots.js +32 -0
  262. package/dist/media/outbound-attachment.js +10 -0
  263. package/dist/media/read-response-with-limit.js +41 -0
  264. package/dist/media/sniff-mime-from-base64.js +19 -0
  265. package/dist/media-understanding/audio-preflight.js +67 -0
  266. package/dist/media-understanding/fs.js +13 -0
  267. package/dist/media-understanding/output-extract.js +26 -0
  268. package/dist/media-understanding/providers/audio.test-helpers.js +34 -0
  269. package/dist/media-understanding/providers/google/inline-data.js +64 -0
  270. package/dist/media-understanding/providers/shared.js +7 -0
  271. package/dist/media-understanding/runner.entries.js +459 -0
  272. package/dist/memory/batch-error-utils.js +11 -0
  273. package/dist/memory/batch-http.js +27 -0
  274. package/dist/memory/batch-output.js +29 -0
  275. package/dist/memory/batch-runner.js +22 -0
  276. package/dist/memory/batch-upload.js +23 -0
  277. package/dist/memory/batch-utils.js +26 -0
  278. package/dist/memory/embeddings-debug.js +11 -0
  279. package/dist/memory/embeddings-remote-client.js +22 -0
  280. package/dist/memory/embeddings-remote-fetch.js +14 -0
  281. package/dist/memory/manager-embedding-ops.js +616 -0
  282. package/dist/memory/manager-sync-ops.js +953 -0
  283. package/dist/memory/qmd-manager.js +1061 -0
  284. package/dist/memory/qmd-query-parser.js +107 -0
  285. package/dist/memory/qmd-scope.js +93 -0
  286. package/dist/memory/search-manager.js +0 -1
  287. package/dist/memory/sync-index.js +21 -0
  288. package/dist/memory/sync-progress.js +22 -0
  289. package/dist/memory/sync-stale.js +30 -0
  290. package/dist/memory/test-embeddings-mock.js +16 -0
  291. package/dist/memory/test-manager-helpers.js +14 -0
  292. package/dist/memory/test-runtime-mocks.js +11 -0
  293. package/dist/node-host/invoke-browser.js +177 -0
  294. package/dist/node-host/invoke.js +685 -0
  295. package/dist/pairing/setup-code.js +285 -0
  296. package/dist/plugin-sdk/account-id.js +1 -0
  297. package/dist/plugin-sdk/agent-media-payload.js +13 -0
  298. package/dist/plugin-sdk/allow-from.js +47 -0
  299. package/dist/plugin-sdk/command-auth.js +23 -0
  300. package/dist/plugin-sdk/config-paths.js +9 -0
  301. package/dist/plugin-sdk/file-lock.js +116 -0
  302. package/dist/plugin-sdk/json-store.js +31 -0
  303. package/dist/plugin-sdk/onboarding.js +28 -0
  304. package/dist/plugin-sdk/provider-auth-result.js +29 -0
  305. package/dist/plugin-sdk/slack-message-actions.js +133 -0
  306. package/dist/plugin-sdk/status-helpers.js +35 -0
  307. package/dist/plugin-sdk/text-chunking.js +31 -0
  308. package/dist/plugin-sdk/tool-send.js +12 -0
  309. package/dist/plugin-sdk/webhook-path.js +27 -0
  310. package/dist/plugin-sdk/webhook-targets.js +34 -0
  311. package/dist/plugins/hooks.test-helpers.js +21 -0
  312. package/dist/plugins/uninstall.js +171 -0
  313. package/dist/process/supervisor/adapters/child.js +143 -0
  314. package/dist/process/supervisor/adapters/env.js +13 -0
  315. package/dist/process/supervisor/adapters/pty.js +148 -0
  316. package/dist/process/supervisor/index.js +10 -0
  317. package/dist/process/supervisor/registry.js +117 -0
  318. package/dist/process/supervisor/supervisor.js +244 -0
  319. package/dist/process/supervisor/types.js +1 -0
  320. package/dist/providers/google-shared.test-helpers.js +75 -0
  321. package/dist/security/audit-channel.js +419 -0
  322. package/dist/security/audit-tool-policy.js +1 -0
  323. package/dist/security/scan-paths.js +12 -0
  324. package/dist/sessions/input-provenance.js +55 -0
  325. package/dist/sessions/session-key-utils.js +7 -0
  326. package/dist/shared/chat-content.js +31 -0
  327. package/dist/shared/chat-envelope.js +45 -0
  328. package/dist/shared/config-eval.js +117 -0
  329. package/dist/shared/device-auth.js +16 -0
  330. package/dist/shared/entry-metadata.js +9 -0
  331. package/dist/shared/entry-status.js +25 -0
  332. package/dist/shared/frontmatter.js +98 -0
  333. package/dist/shared/model-param-b.js +19 -0
  334. package/dist/shared/net/ipv4.js +17 -0
  335. package/dist/shared/node-match.js +53 -0
  336. package/dist/shared/requirements.js +128 -0
  337. package/dist/shared/subagents-format.js +84 -0
  338. package/dist/shared/usage-aggregates.js +28 -0
  339. package/dist/signal/monitor/mentions.js +45 -0
  340. package/dist/signal/rpc-context.js +19 -0
  341. package/dist/slack/blocks-fallback.js +76 -0
  342. package/dist/slack/blocks-input.js +40 -0
  343. package/dist/slack/draft-stream.js +106 -0
  344. package/dist/slack/message-actions.js +51 -0
  345. package/dist/slack/modal-metadata.js +32 -0
  346. package/dist/slack/monitor/events/interactions.js +462 -0
  347. package/dist/slack/monitor/room-context.js +17 -0
  348. package/dist/slack/stream-mode.js +41 -0
  349. package/dist/telegram/bot-native-command-menu.js +64 -0
  350. package/dist/telegram/bot.media.e2e-harness.js +81 -0
  351. package/dist/telegram/button-types.js +1 -0
  352. package/dist/telegram/group-access.js +65 -0
  353. package/dist/telegram/outbound-params.js +21 -0
  354. package/dist/telegram/poll-vote-cache.js +21 -0
  355. package/dist/terminal/health-style.js +36 -0
  356. package/dist/test-utils/chunk-test-helpers.js +21 -0
  357. package/dist/test-utils/env.js +72 -0
  358. package/dist/test-utils/exec-assertions.js +12 -0
  359. package/dist/test-utils/imessage-test-plugin.js +54 -0
  360. package/dist/test-utils/mock-http-response.js +17 -0
  361. package/dist/test-utils/vitest-mock-fn.js +1 -0
  362. package/dist/tts/tts-core.js +550 -0
  363. package/dist/utils/chunk-items.js +10 -0
  364. package/dist/utils/reaction-level.js +52 -0
  365. package/dist/utils/safe-json.js +22 -0
  366. package/dist/utils/with-timeout.js +14 -0
  367. package/dist/web/media.js +17 -5
  368. package/dist/whatsapp/resolve-outbound-target.js +42 -0
  369. package/dist/wizard/onboarding.completion.js +74 -0
  370. package/extensions/bluebubbles/src/account-resolve.ts +29 -0
  371. package/extensions/bluebubbles/src/monitor-normalize.ts +796 -0
  372. package/extensions/bluebubbles/src/monitor-processing.ts +1007 -0
  373. package/extensions/bluebubbles/src/monitor-reply-cache.ts +185 -0
  374. package/extensions/bluebubbles/src/monitor-shared.ts +51 -0
  375. package/extensions/bluebubbles/src/multipart.ts +32 -0
  376. package/extensions/bluebubbles/src/send-helpers.ts +53 -0
  377. package/extensions/bluebubbles/src/test-harness.ts +50 -0
  378. package/extensions/bluebubbles/src/test-mocks.ts +11 -0
  379. package/extensions/device-pair/index.ts +554 -0
  380. package/extensions/discord/src/channel.js +366 -0
  381. package/extensions/discord/src/runtime.js +10 -0
  382. package/extensions/feishu/index.ts +63 -0
  383. package/extensions/feishu/src/accounts.ts +114 -0
  384. package/extensions/feishu/src/bitable.ts +739 -0
  385. package/extensions/feishu/src/bot.ts +965 -0
  386. package/extensions/feishu/src/channel.ts +351 -0
  387. package/extensions/feishu/src/client.ts +118 -0
  388. package/extensions/feishu/src/config-schema.ts +206 -0
  389. package/extensions/feishu/src/dedup.ts +33 -0
  390. package/extensions/feishu/src/directory.ts +177 -0
  391. package/extensions/feishu/src/doc-schema.ts +47 -0
  392. package/extensions/feishu/src/docx.ts +536 -0
  393. package/extensions/feishu/src/drive-schema.ts +46 -0
  394. package/extensions/feishu/src/drive.ts +227 -0
  395. package/extensions/feishu/src/dynamic-agent.ts +131 -0
  396. package/extensions/feishu/src/media.ts +449 -0
  397. package/extensions/feishu/src/mention.ts +126 -0
  398. package/extensions/feishu/src/monitor.ts +330 -0
  399. package/extensions/feishu/src/onboarding.ts +359 -0
  400. package/extensions/feishu/src/outbound.ts +55 -0
  401. package/extensions/feishu/src/perm-schema.ts +52 -0
  402. package/extensions/feishu/src/perm.ts +173 -0
  403. package/extensions/feishu/src/policy.ts +84 -0
  404. package/extensions/feishu/src/probe.ts +44 -0
  405. package/extensions/feishu/src/reactions.ts +160 -0
  406. package/extensions/feishu/src/reply-dispatcher.ts +239 -0
  407. package/extensions/feishu/src/runtime.ts +14 -0
  408. package/extensions/feishu/src/send-result.ts +29 -0
  409. package/extensions/feishu/src/send.ts +335 -0
  410. package/extensions/feishu/src/streaming-card.ts +223 -0
  411. package/extensions/feishu/src/targets.ts +78 -0
  412. package/extensions/feishu/src/tools-config.ts +21 -0
  413. package/extensions/feishu/src/types.ts +81 -0
  414. package/extensions/feishu/src/typing.ts +80 -0
  415. package/extensions/feishu/src/wiki-schema.ts +55 -0
  416. package/extensions/feishu/src/wiki.ts +232 -0
  417. package/extensions/imessage/src/channel.js +253 -0
  418. package/extensions/imessage/src/runtime.js +10 -0
  419. package/extensions/irc/index.ts +17 -0
  420. package/extensions/irc/src/accounts.ts +268 -0
  421. package/extensions/irc/src/channel.ts +367 -0
  422. package/extensions/irc/src/client.ts +439 -0
  423. package/extensions/irc/src/config-schema.ts +97 -0
  424. package/extensions/irc/src/connect-options.ts +30 -0
  425. package/extensions/irc/src/control-chars.ts +22 -0
  426. package/extensions/irc/src/inbound.ts +334 -0
  427. package/extensions/irc/src/monitor.ts +147 -0
  428. package/extensions/irc/src/normalize.ts +117 -0
  429. package/extensions/irc/src/onboarding.ts +479 -0
  430. package/extensions/irc/src/policy.ts +157 -0
  431. package/extensions/irc/src/probe.ts +53 -0
  432. package/extensions/irc/src/protocol.ts +169 -0
  433. package/extensions/irc/src/runtime.ts +14 -0
  434. package/extensions/irc/src/send.ts +88 -0
  435. package/extensions/irc/src/types.ts +93 -0
  436. package/extensions/matrix/src/matrix/client-bootstrap.ts +39 -0
  437. package/extensions/mattermost/src/mattermost/monitor-onchar.ts +25 -0
  438. package/extensions/mattermost/src/mattermost/monitor-websocket.ts +221 -0
  439. package/extensions/mattermost/src/mattermost/reactions.ts +130 -0
  440. package/extensions/mattermost/src/mattermost/reconnect.ts +103 -0
  441. package/extensions/minimax-portal-auth/index.ts +161 -0
  442. package/extensions/minimax-portal-auth/oauth.ts +247 -0
  443. package/extensions/msteams/src/file-lock.ts +1 -0
  444. package/extensions/msteams/src/graph.ts +92 -0
  445. package/extensions/msteams/src/mentions.ts +114 -0
  446. package/extensions/msteams/src/test-runtime.ts +16 -0
  447. package/extensions/openai-codex-auth/index.ts +177 -0
  448. package/extensions/phone-control/index.ts +421 -0
  449. package/extensions/shared/resolve-target-test-helpers.ts +66 -0
  450. package/extensions/signal/src/channel.js +273 -0
  451. package/extensions/signal/src/runtime.js +10 -0
  452. package/extensions/slack/src/channel.js +489 -0
  453. package/extensions/slack/src/runtime.js +10 -0
  454. package/extensions/talk-voice/index.ts +150 -0
  455. package/extensions/telegram/src/channel.js +424 -0
  456. package/extensions/telegram/src/runtime.js +10 -0
  457. package/extensions/thread-ownership/index.ts +133 -0
  458. package/extensions/tlon/src/account-fields.ts +25 -0
  459. package/extensions/tlon/src/urbit/base-url.ts +57 -0
  460. package/extensions/tlon/src/urbit/channel-client.ts +157 -0
  461. package/extensions/tlon/src/urbit/channel-ops.ts +164 -0
  462. package/extensions/tlon/src/urbit/context.ts +47 -0
  463. package/extensions/tlon/src/urbit/errors.ts +51 -0
  464. package/extensions/tlon/src/urbit/fetch.ts +39 -0
  465. package/extensions/twitch/src/test-fixtures.ts +30 -0
  466. package/extensions/voice-call/src/allowlist.ts +19 -0
  467. package/extensions/whatsapp/src/channel.js +429 -0
  468. package/extensions/whatsapp/src/runtime.js +10 -0
  469. package/package.json +1 -1
@@ -0,0 +1,26 @@
1
+ import { resolveAgentSkillsFilter } from "../../agents/agent-scope.js";
2
+ import { buildWorkspaceSkillSnapshot } from "../../agents/skills.js";
3
+ import { matchesSkillFilter } from "../../agents/skills/filter.js";
4
+ import { getSkillsSnapshotVersion } from "../../agents/skills/refresh.js";
5
+ import { getRemoteSkillEligibility } from "../../infra/skills-remote.js";
6
+ export function resolveCronSkillsSnapshot(params) {
7
+ if (params.isFastTestEnv) {
8
+ // Fast unit-test mode skips filesystem scans and snapshot refresh writes.
9
+ return params.existingSnapshot ?? { prompt: "", skills: [] };
10
+ }
11
+ const snapshotVersion = getSkillsSnapshotVersion(params.workspaceDir);
12
+ const skillFilter = resolveAgentSkillsFilter(params.config, params.agentId);
13
+ const existingSnapshot = params.existingSnapshot;
14
+ const shouldRefresh = !existingSnapshot ||
15
+ existingSnapshot.version !== snapshotVersion ||
16
+ !matchesSkillFilter(existingSnapshot.skillFilter, skillFilter);
17
+ if (!shouldRefresh) {
18
+ return existingSnapshot;
19
+ }
20
+ return buildWorkspaceSkillSnapshot(params.workspaceDir, {
21
+ config: params.config,
22
+ skillFilter,
23
+ eligibility: { remote: getRemoteSkillEligibility() },
24
+ snapshotVersion,
25
+ });
26
+ }
@@ -0,0 +1,127 @@
1
+ import { countActiveDescendantRuns, listDescendantRunsForRequester, } from "../../agents/subagent-registry.js";
2
+ import { readLatestAssistantReply } from "../../agents/tools/agent-step.js";
3
+ import { SILENT_REPLY_TOKEN } from "../../auto-reply/tokens.js";
4
+ const CRON_SUBAGENT_WAIT_POLL_MS = 500;
5
+ const CRON_SUBAGENT_WAIT_MIN_MS = 30_000;
6
+ const CRON_SUBAGENT_FINAL_REPLY_GRACE_MS = 5_000;
7
+ export function isLikelyInterimCronMessage(value) {
8
+ const text = value.trim();
9
+ if (!text) {
10
+ return true;
11
+ }
12
+ const normalized = text.toLowerCase().replace(/\s+/g, " ");
13
+ const words = normalized.split(" ").filter(Boolean).length;
14
+ const interimHints = [
15
+ "on it",
16
+ "pulling everything together",
17
+ "give me a few",
18
+ "give me a few min",
19
+ "few minutes",
20
+ "let me compile",
21
+ "i'll gather",
22
+ "i will gather",
23
+ "working on it",
24
+ "retrying now",
25
+ "should be about",
26
+ "should have your summary",
27
+ "subagent spawned",
28
+ "spawned a subagent",
29
+ "it'll auto-announce when done",
30
+ "it will auto-announce when done",
31
+ "auto-announce when done",
32
+ "both subagents are running",
33
+ "wait for them to report back",
34
+ ];
35
+ return words <= 45 && interimHints.some((hint) => normalized.includes(hint));
36
+ }
37
+ export function expectsSubagentFollowup(value) {
38
+ const normalized = value.trim().toLowerCase().replace(/\s+/g, " ");
39
+ if (!normalized) {
40
+ return false;
41
+ }
42
+ const hints = [
43
+ "subagent spawned",
44
+ "spawned a subagent",
45
+ "auto-announce when done",
46
+ "both subagents are running",
47
+ "wait for them to report back",
48
+ ];
49
+ return hints.some((hint) => normalized.includes(hint));
50
+ }
51
+ export async function readDescendantSubagentFallbackReply(params) {
52
+ const descendants = listDescendantRunsForRequester(params.sessionKey)
53
+ .filter((entry) => typeof entry.endedAt === "number" &&
54
+ entry.endedAt >= params.runStartedAt &&
55
+ entry.childSessionKey.trim().length > 0)
56
+ .toSorted((a, b) => (a.endedAt ?? 0) - (b.endedAt ?? 0));
57
+ if (descendants.length === 0) {
58
+ return undefined;
59
+ }
60
+ const latestByChild = new Map();
61
+ for (const entry of descendants) {
62
+ const childKey = entry.childSessionKey.trim();
63
+ if (!childKey) {
64
+ continue;
65
+ }
66
+ const current = latestByChild.get(childKey);
67
+ if (!current || (entry.endedAt ?? 0) >= (current.endedAt ?? 0)) {
68
+ latestByChild.set(childKey, entry);
69
+ }
70
+ }
71
+ const replies = [];
72
+ const latestRuns = [...latestByChild.values()]
73
+ .toSorted((a, b) => (a.endedAt ?? 0) - (b.endedAt ?? 0))
74
+ .slice(-4);
75
+ for (const entry of latestRuns) {
76
+ const reply = (await readLatestAssistantReply({ sessionKey: entry.childSessionKey }))?.trim();
77
+ if (!reply || reply.toUpperCase() === SILENT_REPLY_TOKEN.toUpperCase()) {
78
+ continue;
79
+ }
80
+ replies.push(reply);
81
+ }
82
+ if (replies.length === 0) {
83
+ return undefined;
84
+ }
85
+ if (replies.length === 1) {
86
+ return replies[0];
87
+ }
88
+ return replies.join("\n\n");
89
+ }
90
+ export async function waitForDescendantSubagentSummary(params) {
91
+ const initialReply = params.initialReply?.trim();
92
+ const deadline = Date.now() + Math.max(CRON_SUBAGENT_WAIT_MIN_MS, Math.floor(params.timeoutMs));
93
+ let sawActiveDescendants = params.observedActiveDescendants === true;
94
+ let drainedAtMs;
95
+ while (Date.now() < deadline) {
96
+ const activeDescendants = countActiveDescendantRuns(params.sessionKey);
97
+ if (activeDescendants > 0) {
98
+ sawActiveDescendants = true;
99
+ drainedAtMs = undefined;
100
+ await new Promise((resolve) => setTimeout(resolve, CRON_SUBAGENT_WAIT_POLL_MS));
101
+ continue;
102
+ }
103
+ if (!sawActiveDescendants) {
104
+ return initialReply;
105
+ }
106
+ if (!drainedAtMs) {
107
+ drainedAtMs = Date.now();
108
+ }
109
+ const latest = (await readLatestAssistantReply({ sessionKey: params.sessionKey }))?.trim();
110
+ if (latest &&
111
+ latest.toUpperCase() !== SILENT_REPLY_TOKEN.toUpperCase() &&
112
+ (latest !== initialReply || !isLikelyInterimCronMessage(latest))) {
113
+ return latest;
114
+ }
115
+ if (Date.now() - drainedAtMs >= CRON_SUBAGENT_FINAL_REPLY_GRACE_MS) {
116
+ return undefined;
117
+ }
118
+ await new Promise((resolve) => setTimeout(resolve, CRON_SUBAGENT_WAIT_POLL_MS));
119
+ }
120
+ const latest = (await readLatestAssistantReply({ sessionKey: params.sessionKey }))?.trim();
121
+ if (latest &&
122
+ latest.toUpperCase() !== SILENT_REPLY_TOKEN.toUpperCase() &&
123
+ (latest !== initialReply || !isLikelyInterimCronMessage(latest))) {
124
+ return latest;
125
+ }
126
+ return undefined;
127
+ }
@@ -0,0 +1,12 @@
1
+ import { vi } from "vitest";
2
+ vi.mock("../agents/pi-embedded.js", () => ({
3
+ abortEmbeddedPiRun: vi.fn().mockReturnValue(false),
4
+ runEmbeddedPiAgent: vi.fn(),
5
+ resolveEmbeddedSessionLane: (key) => `session:${key.trim() || "main"}`,
6
+ }));
7
+ vi.mock("../agents/model-catalog.js", () => ({
8
+ loadModelCatalog: vi.fn(),
9
+ }));
10
+ vi.mock("../agents/subagent-announce.js", () => ({
11
+ runSubagentAnnounceFlow: vi.fn(),
12
+ }));
@@ -0,0 +1,22 @@
1
+ import { vi } from "vitest";
2
+ import { loadModelCatalog } from "../agents/model-catalog.js";
3
+ import { runEmbeddedPiAgent } from "../agents/pi-embedded.js";
4
+ import { runSubagentAnnounceFlow } from "../agents/subagent-announce.js";
5
+ import { telegramOutbound } from "../channels/plugins/outbound/telegram.js";
6
+ import { setActivePluginRegistry } from "../plugins/runtime.js";
7
+ import { createOutboundTestPlugin, createTestRegistry } from "../test-utils/channel-plugins.js";
8
+ export function setupIsolatedAgentTurnMocks(params) {
9
+ if (params?.fast) {
10
+ vi.stubEnv("POOLBOT_TEST_FAST", "1");
11
+ }
12
+ vi.mocked(runEmbeddedPiAgent).mockReset();
13
+ vi.mocked(loadModelCatalog).mockResolvedValue([]);
14
+ vi.mocked(runSubagentAnnounceFlow).mockReset().mockResolvedValue(true);
15
+ setActivePluginRegistry(createTestRegistry([
16
+ {
17
+ pluginId: "telegram",
18
+ plugin: createOutboundTestPlugin({ id: "telegram", outbound: telegramOutbound }),
19
+ source: "test",
20
+ },
21
+ ]));
22
+ }
@@ -0,0 +1,43 @@
1
+ export function hasLegacyDeliveryHints(payload) {
2
+ if (typeof payload.deliver === "boolean") {
3
+ return true;
4
+ }
5
+ if (typeof payload.bestEffortDeliver === "boolean") {
6
+ return true;
7
+ }
8
+ if (typeof payload.to === "string" && payload.to.trim()) {
9
+ return true;
10
+ }
11
+ return false;
12
+ }
13
+ export function buildDeliveryFromLegacyPayload(payload) {
14
+ const deliver = payload.deliver;
15
+ const mode = deliver === false ? "none" : "announce";
16
+ const channelRaw = typeof payload.channel === "string" ? payload.channel.trim().toLowerCase() : "";
17
+ const toRaw = typeof payload.to === "string" ? payload.to.trim() : "";
18
+ const next = { mode };
19
+ if (channelRaw) {
20
+ next.channel = channelRaw;
21
+ }
22
+ if (toRaw) {
23
+ next.to = toRaw;
24
+ }
25
+ if (typeof payload.bestEffortDeliver === "boolean") {
26
+ next.bestEffort = payload.bestEffortDeliver;
27
+ }
28
+ return next;
29
+ }
30
+ export function stripLegacyDeliveryFields(payload) {
31
+ if ("deliver" in payload) {
32
+ delete payload.deliver;
33
+ }
34
+ if ("channel" in payload) {
35
+ delete payload.channel;
36
+ }
37
+ if ("to" in payload) {
38
+ delete payload.to;
39
+ }
40
+ if ("bestEffortDeliver" in payload) {
41
+ delete payload.bestEffortDeliver;
42
+ }
43
+ }
@@ -0,0 +1,22 @@
1
+ function isAllowedWebhookProtocol(protocol) {
2
+ return protocol === "http:" || protocol === "https:";
3
+ }
4
+ export function normalizeHttpWebhookUrl(value) {
5
+ if (typeof value !== "string") {
6
+ return null;
7
+ }
8
+ const trimmed = value.trim();
9
+ if (!trimmed) {
10
+ return null;
11
+ }
12
+ try {
13
+ const parsed = new URL(trimmed);
14
+ if (!isAllowedWebhookProtocol(parsed.protocol)) {
15
+ return null;
16
+ }
17
+ return trimmed;
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ }
@@ -0,0 +1,40 @@
1
+ export function splitArgsPreservingQuotes(value, options) {
2
+ const args = [];
3
+ let current = "";
4
+ let inQuotes = false;
5
+ const escapeMode = options?.escapeMode ?? "none";
6
+ for (let i = 0; i < value.length; i++) {
7
+ const char = value[i];
8
+ if (escapeMode === "backslash" && char === "\\") {
9
+ if (i + 1 < value.length) {
10
+ current += value[i + 1];
11
+ i++;
12
+ }
13
+ continue;
14
+ }
15
+ if (escapeMode === "backslash-quote-only" &&
16
+ char === "\\" &&
17
+ i + 1 < value.length &&
18
+ value[i + 1] === '"') {
19
+ current += '"';
20
+ i++;
21
+ continue;
22
+ }
23
+ if (char === '"') {
24
+ inQuotes = !inQuotes;
25
+ continue;
26
+ }
27
+ if (!inQuotes && /\s/.test(char)) {
28
+ if (current) {
29
+ args.push(current);
30
+ current = "";
31
+ }
32
+ continue;
33
+ }
34
+ current += char;
35
+ }
36
+ if (current) {
37
+ args.push(current);
38
+ }
39
+ return args;
40
+ }
@@ -0,0 +1,23 @@
1
+ import { execFile } from "node:child_process";
2
+ export async function execFileUtf8(command, args, options = {}) {
3
+ return await new Promise((resolve) => {
4
+ execFile(command, args, { ...options, encoding: "utf8" }, (error, stdout, stderr) => {
5
+ if (!error) {
6
+ resolve({
7
+ stdout: String(stdout ?? ""),
8
+ stderr: String(stderr ?? ""),
9
+ code: 0,
10
+ });
11
+ return;
12
+ }
13
+ const e = error;
14
+ const stderrText = String(stderr ?? "");
15
+ resolve({
16
+ stdout: String(stdout ?? ""),
17
+ stderr: stderrText ||
18
+ (typeof e.message === "string" ? e.message : typeof error === "string" ? error : ""),
19
+ code: typeof e.code === "number" ? e.code : 1,
20
+ });
21
+ });
22
+ });
23
+ }
@@ -0,0 +1,6 @@
1
+ import { colorize, isRich, theme } from "../terminal/theme.js";
2
+ export const toPosixPath = (value) => value.replace(/\\/g, "/");
3
+ export function formatLine(label, value) {
4
+ const rich = isRich();
5
+ return `${colorize(rich, theme.muted, `${label}:`)} ${colorize(rich, theme.command, value)}`;
6
+ }
@@ -0,0 +1,31 @@
1
+ import { formatRuntimeStatusWithDetails } from "../infra/runtime-status.js";
2
+ export function formatRuntimeStatus(runtime) {
3
+ if (!runtime) {
4
+ return null;
5
+ }
6
+ const details = [];
7
+ if (runtime.subState) {
8
+ details.push(`sub ${runtime.subState}`);
9
+ }
10
+ if (runtime.lastExitStatus !== undefined) {
11
+ details.push(`last exit ${runtime.lastExitStatus}`);
12
+ }
13
+ if (runtime.lastExitReason) {
14
+ details.push(`reason ${runtime.lastExitReason}`);
15
+ }
16
+ if (runtime.lastRunResult) {
17
+ details.push(`last run ${runtime.lastRunResult}`);
18
+ }
19
+ if (runtime.lastRunTime) {
20
+ details.push(`last run time ${runtime.lastRunTime}`);
21
+ }
22
+ if (runtime.detail) {
23
+ details.push(runtime.detail);
24
+ }
25
+ return formatRuntimeStatusWithDetails({
26
+ status: runtime.status,
27
+ pid: runtime.pid,
28
+ state: runtime.state,
29
+ details,
30
+ });
31
+ }
@@ -0,0 +1,4 @@
1
+ import { execFileUtf8 } from "./exec-file.js";
2
+ export async function execSchtasks(args) {
3
+ return await execFileUtf8("schtasks", args, { windowsHide: true });
4
+ }
@@ -18,6 +18,7 @@ export const SERVICE_AUDIT_CODES = {
18
18
  systemdAfterNetworkOnline: "systemd-after-network-online",
19
19
  systemdRestartSec: "systemd-restart-sec",
20
20
  systemdWantsNetworkOnline: "systemd-wants-network-online",
21
+ gatewayTokenDrift: "gateway-token-drift",
21
22
  };
22
23
  export function needsNodeRuntimeMigration(issues) {
23
24
  return issues.some((issue) => issue.code === SERVICE_AUDIT_CODES.gatewayRuntimeBun ||
@@ -254,6 +255,27 @@ async function auditGatewayRuntime(env, command, issues, platform) {
254
255
  }
255
256
  }
256
257
  }
258
+ /**
259
+ * Check if the service's embedded token differs from the config file token.
260
+ * Returns an issue if drift is detected (service will use old token after restart).
261
+ */
262
+ export function checkTokenDrift(params) {
263
+ const { serviceToken, configToken } = params;
264
+ // No drift if both are undefined/empty
265
+ if (!serviceToken && !configToken) {
266
+ return null;
267
+ }
268
+ // Drift: config has token, service has different or no token
269
+ if (configToken && serviceToken !== configToken) {
270
+ return {
271
+ code: SERVICE_AUDIT_CODES.gatewayTokenDrift,
272
+ message: "Config token differs from service token. The daemon will use the old token after restart.",
273
+ detail: "Run `poolbot gateway install --force` to sync the token.",
274
+ level: "recommended",
275
+ };
276
+ }
277
+ return null;
278
+ }
257
279
  export async function auditGatewayServiceConfig(params) {
258
280
  const issues = [];
259
281
  const platform = params.platform ?? process.platform;
@@ -0,0 +1,41 @@
1
+ import { RequestClient } from "@buape/carbon";
2
+ import { loadConfig } from "../config/config.js";
3
+ import { createDiscordRetryRunner } from "../infra/retry-policy.js";
4
+ import { resolveDiscordAccount } from "./accounts.js";
5
+ import { normalizeDiscordToken } from "./token.js";
6
+ function resolveToken(params) {
7
+ const explicit = normalizeDiscordToken(params.explicit);
8
+ if (explicit) {
9
+ return explicit;
10
+ }
11
+ const fallback = normalizeDiscordToken(params.fallbackToken);
12
+ if (!fallback) {
13
+ throw new Error(`Discord bot token missing for account "${params.accountId}" (set discord.accounts.${params.accountId}.token or DISCORD_BOT_TOKEN for default).`);
14
+ }
15
+ return fallback;
16
+ }
17
+ function resolveRest(token, rest) {
18
+ return rest ?? new RequestClient(token);
19
+ }
20
+ export function createDiscordRestClient(opts, cfg = loadConfig()) {
21
+ const account = resolveDiscordAccount({ cfg, accountId: opts.accountId });
22
+ const token = resolveToken({
23
+ explicit: opts.token,
24
+ accountId: account.accountId,
25
+ fallbackToken: account.token,
26
+ });
27
+ const rest = resolveRest(token, opts.rest);
28
+ return { token, rest, account };
29
+ }
30
+ export function createDiscordClient(opts, cfg = loadConfig()) {
31
+ const { token, rest, account } = createDiscordRestClient(opts, cfg);
32
+ const request = createDiscordRetryRunner({
33
+ retry: opts.retry,
34
+ configRetry: account.config.retry,
35
+ verbose: opts.verbose,
36
+ });
37
+ return { token, rest, request };
38
+ }
39
+ export function resolveDiscordRest(opts) {
40
+ return createDiscordRestClient(opts).rest;
41
+ }
@@ -0,0 +1,57 @@
1
+ const DEFAULT_COMPONENT_TTL_MS = 30 * 60 * 1000;
2
+ const componentEntries = new Map();
3
+ const modalEntries = new Map();
4
+ function isExpired(entry, now) {
5
+ return typeof entry.expiresAt === "number" && entry.expiresAt <= now;
6
+ }
7
+ function normalizeEntryTimestamps(entry, now, ttlMs) {
8
+ const createdAt = entry.createdAt ?? now;
9
+ const expiresAt = entry.expiresAt ?? createdAt + ttlMs;
10
+ return { ...entry, createdAt, expiresAt };
11
+ }
12
+ export function registerDiscordComponentEntries(params) {
13
+ const now = Date.now();
14
+ const ttlMs = params.ttlMs ?? DEFAULT_COMPONENT_TTL_MS;
15
+ for (const entry of params.entries) {
16
+ const normalized = normalizeEntryTimestamps({ ...entry, messageId: params.messageId ?? entry.messageId }, now, ttlMs);
17
+ componentEntries.set(entry.id, normalized);
18
+ }
19
+ for (const modal of params.modals) {
20
+ const normalized = normalizeEntryTimestamps({ ...modal, messageId: params.messageId ?? modal.messageId }, now, ttlMs);
21
+ modalEntries.set(modal.id, normalized);
22
+ }
23
+ }
24
+ export function resolveDiscordComponentEntry(params) {
25
+ const entry = componentEntries.get(params.id);
26
+ if (!entry) {
27
+ return null;
28
+ }
29
+ const now = Date.now();
30
+ if (isExpired(entry, now)) {
31
+ componentEntries.delete(params.id);
32
+ return null;
33
+ }
34
+ if (params.consume !== false) {
35
+ componentEntries.delete(params.id);
36
+ }
37
+ return entry;
38
+ }
39
+ export function resolveDiscordModalEntry(params) {
40
+ const entry = modalEntries.get(params.id);
41
+ if (!entry) {
42
+ return null;
43
+ }
44
+ const now = Date.now();
45
+ if (isExpired(entry, now)) {
46
+ modalEntries.delete(params.id);
47
+ return null;
48
+ }
49
+ if (params.consume !== false) {
50
+ modalEntries.delete(params.id);
51
+ }
52
+ return entry;
53
+ }
54
+ export function clearDiscordComponentEntries() {
55
+ componentEntries.clear();
56
+ modalEntries.clear();
57
+ }