@poolzin/pool-bot 2026.2.11 → 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 (535) hide show
  1. package/CHANGELOG.md +34 -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/usage.js +22 -0
  5. package/dist/agents/auth-profiles.js +1 -1
  6. package/dist/agents/auth-profiles.resolve-auth-profile-order.fixtures.js +23 -0
  7. package/dist/agents/bash-tools.exec-runtime.js +438 -0
  8. package/dist/agents/bash-tools.shared.js +6 -0
  9. package/dist/agents/cli-runner/reliability.js +61 -0
  10. package/dist/agents/cli-watchdog-defaults.js +11 -0
  11. package/dist/agents/command-poll-backoff.js +63 -0
  12. package/dist/agents/current-time.js +16 -0
  13. package/dist/agents/glob-pattern.js +42 -0
  14. package/dist/agents/memory-search.js +33 -0
  15. package/dist/agents/model-alias-lines.js +18 -0
  16. package/dist/agents/model-auth-label.js +61 -0
  17. package/dist/agents/model-fallback.js +59 -8
  18. package/dist/agents/models-config.e2e-harness.js +115 -0
  19. package/dist/agents/ollama-stream.js +11 -3
  20. package/dist/agents/openclaw-tools.js +135 -0
  21. package/dist/agents/pi-auth-json.js +118 -0
  22. package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +147 -0
  23. package/dist/agents/pi-embedded-subscribe.e2e-harness.js +90 -0
  24. package/dist/agents/pi-embedded-subscribe.handlers.compaction.js +63 -0
  25. package/dist/agents/pi-embedded-subscribe.handlers.tools.media.test-helpers.js +30 -0
  26. package/dist/agents/pi-extensions/session-manager-runtime-registry.js +23 -0
  27. package/dist/agents/pi-tools.before-tool-call.js +145 -4
  28. package/dist/agents/pi-tools.js +29 -9
  29. package/dist/agents/pi-tools.policy.js +85 -92
  30. package/dist/agents/pi-tools.schema.js +54 -27
  31. package/dist/agents/queued-file-writer.js +22 -0
  32. package/dist/agents/sandbox/docker.js +133 -40
  33. package/dist/agents/sandbox/fs-bridge.js +146 -0
  34. package/dist/agents/sandbox/fs-paths.js +205 -0
  35. package/dist/agents/sandbox/hash.js +4 -0
  36. package/dist/agents/sandbox/validate-sandbox-security.js +157 -0
  37. package/dist/agents/sandbox-paths.js +3 -0
  38. package/dist/agents/sandbox-tool-policy.js +26 -0
  39. package/dist/agents/sanitize-for-prompt.js +18 -0
  40. package/dist/agents/session-dirs.js +20 -0
  41. package/dist/agents/session-write-lock.js +203 -39
  42. package/dist/agents/skills/filter.js +24 -0
  43. package/dist/agents/skills/tools-dir.js +9 -0
  44. package/dist/agents/skills-install-download.js +290 -0
  45. package/dist/agents/skills-install-output.js +30 -0
  46. package/dist/agents/skills-install.download-test-utils.js +36 -0
  47. package/dist/agents/skills.e2e-test-helpers.js +13 -0
  48. package/dist/agents/subagent-announce-queue.js +59 -15
  49. package/dist/agents/subagent-depth.js +137 -0
  50. package/dist/agents/subagent-registry.js +448 -96
  51. package/dist/agents/subagent-spawn.js +262 -0
  52. package/dist/agents/system-prompt.js +52 -10
  53. package/dist/agents/test-helpers/fast-tool-stubs.js +18 -0
  54. package/dist/agents/test-helpers/host-sandbox-fs-bridge.js +74 -0
  55. package/dist/agents/tool-display-common.js +782 -0
  56. package/dist/agents/tool-loop-detection.js +466 -0
  57. package/dist/agents/tool-policy.js +6 -0
  58. package/dist/agents/tools/image-tool.js +1 -1
  59. package/dist/agents/tools/sessions-access.js +178 -0
  60. package/dist/agents/tools/sessions-resolution.js +206 -0
  61. package/dist/agents/tools/subagents-tool.js +616 -0
  62. package/dist/agents/workspace-dir.js +18 -0
  63. package/dist/agents/workspace-dirs.js +14 -0
  64. package/dist/agents/workspace.js +70 -0
  65. package/dist/auto-reply/heartbeat-reply-payload.js +18 -0
  66. package/dist/auto-reply/reply/commands-export-session.js +163 -0
  67. package/dist/auto-reply/reply/commands-mesh.js +245 -0
  68. package/dist/auto-reply/reply/commands-setunset.js +28 -0
  69. package/dist/auto-reply/reply/commands-slash-parse.js +31 -0
  70. package/dist/auto-reply/reply/commands-system-prompt.js +117 -0
  71. package/dist/auto-reply/reply/directive-handling.levels.js +17 -0
  72. package/dist/auto-reply/reply/directive-handling.params.js +1 -0
  73. package/dist/auto-reply/reply/directive-parsing.js +36 -0
  74. package/dist/auto-reply/reply/dispatcher-registry.js +43 -0
  75. package/dist/auto-reply/reply/elevated-unavailable.js +20 -0
  76. package/dist/auto-reply/reply/post-compaction-audit.js +96 -0
  77. package/dist/auto-reply/reply/post-compaction-context.js +98 -0
  78. package/dist/auto-reply/reply/reply-delivery.js +92 -0
  79. package/dist/auto-reply/reply/session-reset-prompt.js +1 -0
  80. package/dist/auto-reply/reply/session-run-accounting.js +33 -0
  81. package/dist/auto-reply/reply.directive.directive-behavior.e2e-harness.js +115 -0
  82. package/dist/auto-reply/reply.directive.directive-behavior.e2e-mocks.js +12 -0
  83. package/dist/browser/bridge-auth-registry.js +26 -0
  84. package/dist/browser/client-actions-url.js +10 -0
  85. package/dist/browser/control-auth.js +73 -0
  86. package/dist/browser/csrf.js +64 -0
  87. package/dist/browser/http-auth.js +52 -0
  88. package/dist/browser/paths.js +37 -0
  89. package/dist/browser/proxy-files.js +32 -0
  90. package/dist/browser/pw-ai-state.js +7 -0
  91. package/dist/browser/resolved-config-refresh.js +42 -0
  92. package/dist/browser/routes/path-output.js +1 -0
  93. package/dist/browser/server-context.chrome-test-harness.js +20 -0
  94. package/dist/browser/server-middleware.js +31 -0
  95. package/dist/browser/test-port.js +16 -0
  96. package/dist/build-info.json +3 -3
  97. package/dist/canvas-host/file-resolver.js +43 -0
  98. package/dist/channels/account-summary.js +19 -0
  99. package/dist/channels/draft-stream-loop.js +77 -0
  100. package/dist/channels/plugins/account-helpers.js +26 -0
  101. package/dist/channels/telegram/allow-from.js +10 -0
  102. package/dist/cli/browser-cli-resize.js +22 -0
  103. package/dist/cli/browser-cli-shared.js +8 -0
  104. package/dist/cli/clawbot-cli.js +5 -0
  105. package/dist/cli/completion-cli.js +566 -0
  106. package/dist/cli/config-cli.js +63 -5
  107. package/dist/cli/daemon-cli/lifecycle-core.js +256 -0
  108. package/dist/cli/daemon-cli/register-service-commands.js +60 -0
  109. package/dist/cli/daemon-cli-compat.js +80 -0
  110. package/dist/cli/nodes-cli/pairing-render.js +26 -0
  111. package/dist/cli/program/action-reparse.js +17 -0
  112. package/dist/cli/program/command-registry.js +17 -0
  113. package/dist/cli/program/program-context.js +8 -0
  114. package/dist/cli/program/register.subclis.js +7 -0
  115. package/dist/cli/program/routes.js +233 -0
  116. package/dist/cli/qr-cli.js +132 -0
  117. package/dist/cli/requirements-test-fixtures.js +17 -0
  118. package/dist/cli/respawn-policy.js +4 -0
  119. package/dist/cli/shared/parse-port.js +18 -0
  120. package/dist/cli/skills-cli.format.js +241 -0
  121. package/dist/cli/update-cli/progress.js +121 -0
  122. package/dist/cli/update-cli/restart-helper.js +108 -0
  123. package/dist/cli/update-cli/shared.js +196 -0
  124. package/dist/cli/update-cli/status.js +97 -0
  125. package/dist/cli/update-cli/suppress-deprecations.js +17 -0
  126. package/dist/cli/update-cli/update-command.js +506 -0
  127. package/dist/cli/update-cli/wizard.js +130 -0
  128. package/dist/cli/update-cli.js +3 -9
  129. package/dist/cli/windows-argv.js +69 -0
  130. package/dist/commands/auth-choice-legacy.js +20 -0
  131. package/dist/commands/auth-choice.apply-helpers.js +8 -0
  132. package/dist/commands/channel-test-helpers.js +19 -0
  133. package/dist/commands/cleanup-plan.js +10 -0
  134. package/dist/commands/cleanup-utils.js +7 -0
  135. package/dist/commands/config-validation.js +15 -0
  136. package/dist/commands/doctor-completion.js +112 -0
  137. package/dist/commands/doctor-memory-search.js +119 -0
  138. package/dist/commands/doctor-session-locks.js +73 -0
  139. package/dist/commands/doctor.e2e-harness.js +364 -0
  140. package/dist/commands/gateway-presence.js +19 -0
  141. package/dist/commands/model-default.js +35 -0
  142. package/dist/commands/models/fallbacks-shared.js +102 -0
  143. package/dist/commands/models/shared.js +24 -0
  144. package/dist/commands/onboard-auth.config-gateways.js +64 -0
  145. package/dist/commands/onboard-auth.config-litellm.js +45 -0
  146. package/dist/commands/onboard-auth.config-shared.js +116 -0
  147. package/dist/commands/onboard-config.js +16 -0
  148. package/dist/commands/onboard-non-interactive.test-helpers.js +31 -0
  149. package/dist/commands/onboard-provider-auth-flags.js +136 -0
  150. package/dist/commands/openai-codex-oauth.js +40 -0
  151. package/dist/commands/test-runtime-config-helpers.js +21 -0
  152. package/dist/commands/test-wizard-helpers.js +68 -0
  153. package/dist/commands/vllm-setup.js +66 -0
  154. package/dist/compat/legacy-names.js +2 -0
  155. package/dist/config/backup-rotation.js +19 -0
  156. package/dist/config/env-preserve.js +122 -0
  157. package/dist/config/includes-scan.js +78 -0
  158. package/dist/config/plugins-allowlist.js +13 -0
  159. package/dist/config/schema.help.js +256 -0
  160. package/dist/config/schema.hints.js +189 -0
  161. package/dist/config/schema.irc.js +20 -0
  162. package/dist/config/schema.labels.js +317 -0
  163. package/dist/config/sessions/delivery-info.js +40 -0
  164. package/dist/config/types.irc.js +1 -0
  165. package/dist/config/zod-schema.agent-defaults.js +14 -0
  166. package/dist/config/zod-schema.agent-model.js +10 -0
  167. package/dist/config/zod-schema.agent-runtime.js +14 -0
  168. package/dist/config/zod-schema.allowdeny.js +35 -0
  169. package/dist/config/zod-schema.sensitive.js +4 -0
  170. package/dist/control-ui/assets/index-HRr1grwl.js.map +1 -1
  171. package/dist/cron/isolated-agent/skills-snapshot.js +26 -0
  172. package/dist/cron/isolated-agent/subagent-followup.js +127 -0
  173. package/dist/cron/isolated-agent.mocks.js +12 -0
  174. package/dist/cron/isolated-agent.test-setup.js +22 -0
  175. package/dist/cron/legacy-delivery.js +43 -0
  176. package/dist/cron/webhook-url.js +22 -0
  177. package/dist/daemon/arg-split.js +40 -0
  178. package/dist/daemon/exec-file.js +23 -0
  179. package/dist/daemon/output.js +6 -0
  180. package/dist/daemon/runtime-format.js +31 -0
  181. package/dist/daemon/schtasks-exec.js +4 -0
  182. package/dist/daemon/service-audit.js +22 -0
  183. package/dist/discord/client.js +41 -0
  184. package/dist/discord/components-registry.js +57 -0
  185. package/dist/discord/components.js +816 -0
  186. package/dist/discord/guilds.js +12 -0
  187. package/dist/discord/monitor/gateway-plugin.js +48 -0
  188. package/dist/discord/monitor/presence.js +30 -0
  189. package/dist/discord/send.components.js +115 -0
  190. package/dist/discord/send.shared.js +4 -0
  191. package/dist/discord/ui.js +26 -0
  192. package/dist/discord/voice-message.js +254 -0
  193. package/dist/gateway/agent-event-assistant-text.js +5 -0
  194. package/dist/gateway/agent-prompt.js +33 -0
  195. package/dist/gateway/auth-rate-limit.js +136 -0
  196. package/dist/gateway/channel-health-monitor.js +114 -0
  197. package/dist/gateway/control-ui-contract.js +1 -0
  198. package/dist/gateway/control-ui-csp.js +15 -0
  199. package/dist/gateway/gateway-config-prompts.shared.js +25 -0
  200. package/dist/gateway/http-auth-helpers.js +18 -0
  201. package/dist/gateway/http-common.js +18 -0
  202. package/dist/gateway/http-endpoint-helpers.js +27 -0
  203. package/dist/gateway/node-invoke-sanitize.js +11 -0
  204. package/dist/gateway/node-invoke-system-run-approval.js +205 -0
  205. package/dist/gateway/probe-auth.js +21 -0
  206. package/dist/gateway/protocol/index.js +7 -2
  207. package/dist/gateway/protocol/schema/mesh.js +54 -0
  208. package/dist/gateway/protocol/schema/protocol-schemas.js +7 -0
  209. package/dist/gateway/protocol/schema.js +1 -0
  210. package/dist/gateway/server/ws-connection/auth-messages.js +54 -0
  211. package/dist/gateway/server-channels.js +11 -0
  212. package/dist/gateway/server-methods/attachment-normalize.js +16 -0
  213. package/dist/gateway/server-methods/base-hash.js +8 -0
  214. package/dist/gateway/server-methods/mesh.js +700 -0
  215. package/dist/gateway/server-methods/nodes.handlers.invoke-result.js +55 -0
  216. package/dist/gateway/server-methods/restart-request.js +13 -0
  217. package/dist/gateway/server-methods/validation.js +8 -0
  218. package/dist/gateway/server.agent.gateway-server-agent.mocks.js +35 -0
  219. package/dist/gateway/server.e2e-registry-helpers.js +1 -0
  220. package/dist/gateway/server.e2e-ws-harness.js +20 -0
  221. package/dist/gateway/test-helpers.js +2 -0
  222. package/dist/gateway/test-helpers.server.js +3 -1
  223. package/dist/gateway/test-http-response.js +12 -0
  224. package/dist/gateway/test-openai-responses-model.js +20 -0
  225. package/dist/gateway/test-temp-config.js +30 -0
  226. package/dist/gateway/test-with-server.js +32 -0
  227. package/dist/hooks/bundled/bootstrap-extra-files/handler.js +46 -0
  228. package/dist/imessage/monitor/abort-handler.js +23 -0
  229. package/dist/imessage/monitor/inbound-processing.js +346 -0
  230. package/dist/imessage/monitor/parse-notification.js +64 -0
  231. package/dist/imessage/target-parsing-helpers.js +92 -0
  232. package/dist/infra/archive.js +244 -20
  233. package/dist/infra/detect-package-manager.js +26 -0
  234. package/dist/infra/exec-approvals-allowlist.js +257 -0
  235. package/dist/infra/exec-approvals-analysis.js +770 -0
  236. package/dist/infra/exec-approvals.js +13 -0
  237. package/dist/infra/file-lock.js +1 -0
  238. package/dist/infra/gemini-auth.js +39 -0
  239. package/dist/infra/heartbeat-active-hours.js +85 -0
  240. package/dist/infra/heartbeat-events-filter.js +50 -0
  241. package/dist/infra/heartbeat-runner.test-utils.js +39 -0
  242. package/dist/infra/http-body.js +265 -0
  243. package/dist/infra/install-package-dir.js +50 -0
  244. package/dist/infra/install-safe-path.js +49 -0
  245. package/dist/infra/json-files.js +49 -0
  246. package/dist/infra/jsonl-socket.js +52 -0
  247. package/dist/infra/map-size.js +14 -0
  248. package/dist/infra/net/hostname.js +7 -0
  249. package/dist/infra/npm-registry-spec.js +39 -0
  250. package/dist/infra/openclaw-root.js +109 -0
  251. package/dist/infra/outbound/delivery-queue.js +214 -0
  252. package/dist/infra/outbound/identity.js +23 -0
  253. package/dist/infra/outbound/message-action-params.js +307 -0
  254. package/dist/infra/outbound/tool-payload.js +21 -0
  255. package/dist/infra/package-json.js +23 -0
  256. package/dist/infra/pairing-files.js +19 -0
  257. package/dist/infra/pairing-token.js +9 -0
  258. package/dist/infra/path-prepend.js +51 -0
  259. package/dist/infra/path-safety.js +16 -0
  260. package/dist/infra/process-respawn.js +49 -0
  261. package/dist/infra/runtime-status.js +16 -0
  262. package/dist/infra/session-cost-usage.types.js +1 -0
  263. package/dist/infra/session-maintenance-warning.js +89 -0
  264. package/dist/infra/system-run-command.js +78 -0
  265. package/dist/infra/tmp-openclaw-dir.js +81 -0
  266. package/dist/infra/tmp-poolbot-dir.js +2 -0
  267. package/dist/infra/update-channels.js +19 -0
  268. package/dist/line/actions.js +45 -0
  269. package/dist/line/channel-access-token.js +9 -0
  270. package/dist/line/flex-templates/basic-cards.js +332 -0
  271. package/dist/line/flex-templates/common.js +18 -0
  272. package/dist/line/flex-templates/media-control-cards.js +453 -0
  273. package/dist/line/flex-templates/message.js +10 -0
  274. package/dist/line/flex-templates/schedule-cards.js +399 -0
  275. package/dist/line/flex-templates/types.js +1 -0
  276. package/dist/line/webhook-node.js +100 -0
  277. package/dist/line/webhook-utils.js +11 -0
  278. package/dist/logging/diagnostic-session-state.js +73 -0
  279. package/dist/logging/diagnostic.js +22 -0
  280. package/dist/logging/timestamps.js +14 -0
  281. package/dist/markdown/whatsapp.js +62 -0
  282. package/dist/media/base64.js +34 -0
  283. package/dist/media/local-roots.js +32 -0
  284. package/dist/media/outbound-attachment.js +10 -0
  285. package/dist/media/read-response-with-limit.js +41 -0
  286. package/dist/media/sniff-mime-from-base64.js +19 -0
  287. package/dist/media-understanding/audio-preflight.js +67 -0
  288. package/dist/media-understanding/fs.js +13 -0
  289. package/dist/media-understanding/output-extract.js +26 -0
  290. package/dist/media-understanding/providers/audio.test-helpers.js +34 -0
  291. package/dist/media-understanding/providers/google/inline-data.js +64 -0
  292. package/dist/media-understanding/providers/shared.js +7 -0
  293. package/dist/media-understanding/runner.entries.js +459 -0
  294. package/dist/memory/batch-error-utils.js +11 -0
  295. package/dist/memory/batch-http.js +27 -0
  296. package/dist/memory/batch-output.js +29 -0
  297. package/dist/memory/batch-runner.js +22 -0
  298. package/dist/memory/batch-upload.js +23 -0
  299. package/dist/memory/batch-utils.js +26 -0
  300. package/dist/memory/embeddings-debug.js +11 -0
  301. package/dist/memory/embeddings-remote-client.js +22 -0
  302. package/dist/memory/embeddings-remote-fetch.js +14 -0
  303. package/dist/memory/embeddings.js +36 -9
  304. package/dist/memory/hybrid.js +24 -5
  305. package/dist/memory/manager-embedding-ops.js +616 -0
  306. package/dist/memory/manager-sync-ops.js +953 -0
  307. package/dist/memory/manager.js +76 -28
  308. package/dist/memory/mmr.js +164 -0
  309. package/dist/memory/qmd-manager.js +1061 -0
  310. package/dist/memory/qmd-query-parser.js +107 -0
  311. package/dist/memory/qmd-scope.js +93 -0
  312. package/dist/memory/query-expansion.js +331 -0
  313. package/dist/memory/search-manager.js +0 -1
  314. package/dist/memory/sync-index.js +21 -0
  315. package/dist/memory/sync-progress.js +22 -0
  316. package/dist/memory/sync-stale.js +30 -0
  317. package/dist/memory/temporal-decay.js +119 -0
  318. package/dist/memory/test-embeddings-mock.js +16 -0
  319. package/dist/memory/test-manager-helpers.js +14 -0
  320. package/dist/memory/test-runtime-mocks.js +11 -0
  321. package/dist/node-host/invoke-browser.js +177 -0
  322. package/dist/node-host/invoke.js +685 -0
  323. package/dist/pairing/setup-code.js +285 -0
  324. package/dist/plugin-sdk/account-id.js +1 -0
  325. package/dist/plugin-sdk/agent-media-payload.js +13 -0
  326. package/dist/plugin-sdk/allow-from.js +47 -0
  327. package/dist/plugin-sdk/command-auth.js +23 -0
  328. package/dist/plugin-sdk/config-paths.js +9 -0
  329. package/dist/plugin-sdk/file-lock.js +116 -0
  330. package/dist/plugin-sdk/json-store.js +31 -0
  331. package/dist/plugin-sdk/onboarding.js +28 -0
  332. package/dist/plugin-sdk/provider-auth-result.js +29 -0
  333. package/dist/plugin-sdk/slack-message-actions.js +133 -0
  334. package/dist/plugin-sdk/status-helpers.js +35 -0
  335. package/dist/plugin-sdk/text-chunking.js +31 -0
  336. package/dist/plugin-sdk/tool-send.js +12 -0
  337. package/dist/plugin-sdk/webhook-path.js +27 -0
  338. package/dist/plugin-sdk/webhook-targets.js +34 -0
  339. package/dist/plugins/hooks.test-helpers.js +21 -0
  340. package/dist/plugins/uninstall.js +171 -0
  341. package/dist/process/kill-tree.js +98 -0
  342. package/dist/process/supervisor/adapters/child.js +143 -0
  343. package/dist/process/supervisor/adapters/env.js +13 -0
  344. package/dist/process/supervisor/adapters/pty.js +148 -0
  345. package/dist/process/supervisor/index.js +10 -0
  346. package/dist/process/supervisor/registry.js +117 -0
  347. package/dist/process/supervisor/supervisor.js +244 -0
  348. package/dist/process/supervisor/types.js +1 -0
  349. package/dist/providers/google-shared.test-helpers.js +75 -0
  350. package/dist/security/audit-channel.js +419 -0
  351. package/dist/security/audit-tool-policy.js +1 -0
  352. package/dist/security/scan-paths.js +12 -0
  353. package/dist/sessions/input-provenance.js +55 -0
  354. package/dist/sessions/session-key-utils.js +7 -0
  355. package/dist/shared/chat-content.js +31 -0
  356. package/dist/shared/chat-envelope.js +45 -0
  357. package/dist/shared/config-eval.js +117 -0
  358. package/dist/shared/device-auth.js +16 -0
  359. package/dist/shared/entry-metadata.js +9 -0
  360. package/dist/shared/entry-status.js +25 -0
  361. package/dist/shared/frontmatter.js +98 -0
  362. package/dist/shared/model-param-b.js +19 -0
  363. package/dist/shared/net/ipv4.js +17 -0
  364. package/dist/shared/node-match.js +53 -0
  365. package/dist/shared/pid-alive.js +12 -0
  366. package/dist/shared/process-scoped-map.js +10 -0
  367. package/dist/shared/requirements.js +128 -0
  368. package/dist/shared/subagents-format.js +84 -0
  369. package/dist/shared/usage-aggregates.js +28 -0
  370. package/dist/signal/monitor/mentions.js +45 -0
  371. package/dist/signal/rpc-context.js +19 -0
  372. package/dist/slack/blocks-fallback.js +76 -0
  373. package/dist/slack/blocks-input.js +40 -0
  374. package/dist/slack/draft-stream.js +106 -0
  375. package/dist/slack/message-actions.js +51 -0
  376. package/dist/slack/modal-metadata.js +32 -0
  377. package/dist/slack/monitor/events/interactions.js +462 -0
  378. package/dist/slack/monitor/room-context.js +17 -0
  379. package/dist/slack/stream-mode.js +41 -0
  380. package/dist/telegram/bot-native-command-menu.js +64 -0
  381. package/dist/telegram/bot.media.e2e-harness.js +81 -0
  382. package/dist/telegram/button-types.js +1 -0
  383. package/dist/telegram/group-access.js +65 -0
  384. package/dist/telegram/outbound-params.js +21 -0
  385. package/dist/telegram/poll-vote-cache.js +21 -0
  386. package/dist/terminal/health-style.js +36 -0
  387. package/dist/test-utils/chunk-test-helpers.js +21 -0
  388. package/dist/test-utils/env.js +72 -0
  389. package/dist/test-utils/exec-assertions.js +12 -0
  390. package/dist/test-utils/imessage-test-plugin.js +54 -0
  391. package/dist/test-utils/mock-http-response.js +17 -0
  392. package/dist/test-utils/vitest-mock-fn.js +1 -0
  393. package/dist/tts/tts-core.js +550 -0
  394. package/dist/utils/chunk-items.js +10 -0
  395. package/dist/utils/reaction-level.js +52 -0
  396. package/dist/utils/safe-json.js +22 -0
  397. package/dist/utils/with-timeout.js +14 -0
  398. package/dist/web/media.js +17 -5
  399. package/dist/whatsapp/resolve-outbound-target.js +42 -0
  400. package/dist/wizard/onboarding.completion.js +74 -0
  401. package/extensions/bluebubbles/package.json +1 -1
  402. package/extensions/bluebubbles/src/account-resolve.ts +29 -0
  403. package/extensions/bluebubbles/src/monitor-normalize.ts +796 -0
  404. package/extensions/bluebubbles/src/monitor-processing.ts +1007 -0
  405. package/extensions/bluebubbles/src/monitor-reply-cache.ts +185 -0
  406. package/extensions/bluebubbles/src/monitor-shared.ts +51 -0
  407. package/extensions/bluebubbles/src/multipart.ts +32 -0
  408. package/extensions/bluebubbles/src/send-helpers.ts +53 -0
  409. package/extensions/bluebubbles/src/test-harness.ts +50 -0
  410. package/extensions/bluebubbles/src/test-mocks.ts +11 -0
  411. package/extensions/copilot-proxy/package.json +1 -1
  412. package/extensions/device-pair/index.ts +554 -0
  413. package/extensions/diagnostics-otel/package.json +1 -1
  414. package/extensions/discord/package.json +1 -1
  415. package/extensions/discord/src/channel.js +366 -0
  416. package/extensions/discord/src/runtime.js +10 -0
  417. package/extensions/feishu/index.ts +63 -0
  418. package/extensions/feishu/src/accounts.ts +114 -0
  419. package/extensions/feishu/src/bitable.ts +739 -0
  420. package/extensions/feishu/src/bot.ts +965 -0
  421. package/extensions/feishu/src/channel.ts +351 -0
  422. package/extensions/feishu/src/client.ts +118 -0
  423. package/extensions/feishu/src/config-schema.ts +206 -0
  424. package/extensions/feishu/src/dedup.ts +33 -0
  425. package/extensions/feishu/src/directory.ts +177 -0
  426. package/extensions/feishu/src/doc-schema.ts +47 -0
  427. package/extensions/feishu/src/docx.ts +536 -0
  428. package/extensions/feishu/src/drive-schema.ts +46 -0
  429. package/extensions/feishu/src/drive.ts +227 -0
  430. package/extensions/feishu/src/dynamic-agent.ts +131 -0
  431. package/extensions/feishu/src/media.ts +449 -0
  432. package/extensions/feishu/src/mention.ts +126 -0
  433. package/extensions/feishu/src/monitor.ts +330 -0
  434. package/extensions/feishu/src/onboarding.ts +359 -0
  435. package/extensions/feishu/src/outbound.ts +55 -0
  436. package/extensions/feishu/src/perm-schema.ts +52 -0
  437. package/extensions/feishu/src/perm.ts +173 -0
  438. package/extensions/feishu/src/policy.ts +84 -0
  439. package/extensions/feishu/src/probe.ts +44 -0
  440. package/extensions/feishu/src/reactions.ts +160 -0
  441. package/extensions/feishu/src/reply-dispatcher.ts +239 -0
  442. package/extensions/feishu/src/runtime.ts +14 -0
  443. package/extensions/feishu/src/send-result.ts +29 -0
  444. package/extensions/feishu/src/send.ts +335 -0
  445. package/extensions/feishu/src/streaming-card.ts +223 -0
  446. package/extensions/feishu/src/targets.ts +78 -0
  447. package/extensions/feishu/src/tools-config.ts +21 -0
  448. package/extensions/feishu/src/types.ts +81 -0
  449. package/extensions/feishu/src/typing.ts +80 -0
  450. package/extensions/feishu/src/wiki-schema.ts +55 -0
  451. package/extensions/feishu/src/wiki.ts +232 -0
  452. package/extensions/google-antigravity-auth/package.json +1 -1
  453. package/extensions/google-gemini-cli-auth/package.json +1 -1
  454. package/extensions/googlechat/package.json +1 -1
  455. package/extensions/imessage/package.json +1 -1
  456. package/extensions/imessage/src/channel.js +253 -0
  457. package/extensions/imessage/src/runtime.js +10 -0
  458. package/extensions/irc/index.ts +17 -0
  459. package/extensions/irc/src/accounts.ts +268 -0
  460. package/extensions/irc/src/channel.ts +367 -0
  461. package/extensions/irc/src/client.ts +439 -0
  462. package/extensions/irc/src/config-schema.ts +97 -0
  463. package/extensions/irc/src/connect-options.ts +30 -0
  464. package/extensions/irc/src/control-chars.ts +22 -0
  465. package/extensions/irc/src/inbound.ts +334 -0
  466. package/extensions/irc/src/monitor.ts +147 -0
  467. package/extensions/irc/src/normalize.ts +117 -0
  468. package/extensions/irc/src/onboarding.ts +479 -0
  469. package/extensions/irc/src/policy.ts +157 -0
  470. package/extensions/irc/src/probe.ts +53 -0
  471. package/extensions/irc/src/protocol.ts +169 -0
  472. package/extensions/irc/src/runtime.ts +14 -0
  473. package/extensions/irc/src/send.ts +88 -0
  474. package/extensions/irc/src/types.ts +93 -0
  475. package/extensions/line/package.json +1 -1
  476. package/extensions/llm-task/package.json +1 -1
  477. package/extensions/lobster/package.json +1 -1
  478. package/extensions/matrix/CHANGELOG.md +5 -0
  479. package/extensions/matrix/package.json +1 -1
  480. package/extensions/matrix/src/matrix/client-bootstrap.ts +39 -0
  481. package/extensions/mattermost/package.json +1 -1
  482. package/extensions/mattermost/src/mattermost/monitor-onchar.ts +25 -0
  483. package/extensions/mattermost/src/mattermost/monitor-websocket.ts +221 -0
  484. package/extensions/mattermost/src/mattermost/reactions.ts +130 -0
  485. package/extensions/mattermost/src/mattermost/reconnect.ts +103 -0
  486. package/extensions/memory-core/package.json +1 -1
  487. package/extensions/memory-lancedb/package.json +1 -1
  488. package/extensions/minimax-portal-auth/index.ts +161 -0
  489. package/extensions/minimax-portal-auth/oauth.ts +247 -0
  490. package/extensions/msteams/CHANGELOG.md +5 -0
  491. package/extensions/msteams/package.json +1 -1
  492. package/extensions/msteams/src/file-lock.ts +1 -0
  493. package/extensions/msteams/src/graph.ts +92 -0
  494. package/extensions/msteams/src/mentions.ts +114 -0
  495. package/extensions/msteams/src/test-runtime.ts +16 -0
  496. package/extensions/nextcloud-talk/package.json +1 -1
  497. package/extensions/nostr/CHANGELOG.md +5 -0
  498. package/extensions/nostr/package.json +1 -1
  499. package/extensions/open-prose/package.json +1 -1
  500. package/extensions/openai-codex-auth/index.ts +177 -0
  501. package/extensions/phone-control/index.ts +421 -0
  502. package/extensions/shared/resolve-target-test-helpers.ts +66 -0
  503. package/extensions/signal/package.json +1 -1
  504. package/extensions/signal/src/channel.js +273 -0
  505. package/extensions/signal/src/runtime.js +10 -0
  506. package/extensions/slack/package.json +1 -1
  507. package/extensions/slack/src/channel.js +489 -0
  508. package/extensions/slack/src/runtime.js +10 -0
  509. package/extensions/talk-voice/index.ts +150 -0
  510. package/extensions/telegram/package.json +1 -1
  511. package/extensions/telegram/src/channel.js +424 -0
  512. package/extensions/telegram/src/runtime.js +10 -0
  513. package/extensions/thread-ownership/index.ts +133 -0
  514. package/extensions/tlon/package.json +1 -1
  515. package/extensions/tlon/src/account-fields.ts +25 -0
  516. package/extensions/tlon/src/urbit/base-url.ts +57 -0
  517. package/extensions/tlon/src/urbit/channel-client.ts +157 -0
  518. package/extensions/tlon/src/urbit/channel-ops.ts +164 -0
  519. package/extensions/tlon/src/urbit/context.ts +47 -0
  520. package/extensions/tlon/src/urbit/errors.ts +51 -0
  521. package/extensions/tlon/src/urbit/fetch.ts +39 -0
  522. package/extensions/twitch/CHANGELOG.md +5 -0
  523. package/extensions/twitch/package.json +1 -1
  524. package/extensions/twitch/src/test-fixtures.ts +30 -0
  525. package/extensions/voice-call/CHANGELOG.md +5 -0
  526. package/extensions/voice-call/package.json +1 -1
  527. package/extensions/voice-call/src/allowlist.ts +19 -0
  528. package/extensions/whatsapp/package.json +1 -1
  529. package/extensions/whatsapp/src/channel.js +429 -0
  530. package/extensions/whatsapp/src/runtime.js +10 -0
  531. package/extensions/zalo/CHANGELOG.md +5 -0
  532. package/extensions/zalo/package.json +1 -1
  533. package/extensions/zalouser/CHANGELOG.md +5 -0
  534. package/extensions/zalouser/package.json +1 -1
  535. package/package.json +1 -1
@@ -0,0 +1,247 @@
1
+ import { createHash, randomBytes, randomUUID } from "node:crypto";
2
+
3
+ export type MiniMaxRegion = "cn" | "global";
4
+
5
+ const MINIMAX_OAUTH_CONFIG = {
6
+ cn: {
7
+ baseUrl: "https://api.minimaxi.com",
8
+ clientId: "78257093-7e40-4613-99e0-527b14b39113",
9
+ },
10
+ global: {
11
+ baseUrl: "https://api.minimax.io",
12
+ clientId: "78257093-7e40-4613-99e0-527b14b39113",
13
+ },
14
+ } as const;
15
+
16
+ const MINIMAX_OAUTH_SCOPE = "group_id profile model.completion";
17
+ const MINIMAX_OAUTH_GRANT_TYPE = "urn:ietf:params:oauth:grant-type:user_code";
18
+
19
+ function getOAuthEndpoints(region: MiniMaxRegion) {
20
+ const config = MINIMAX_OAUTH_CONFIG[region];
21
+ return {
22
+ codeEndpoint: `${config.baseUrl}/oauth/code`,
23
+ tokenEndpoint: `${config.baseUrl}/oauth/token`,
24
+ clientId: config.clientId,
25
+ baseUrl: config.baseUrl,
26
+ };
27
+ }
28
+
29
+ export type MiniMaxOAuthAuthorization = {
30
+ user_code: string;
31
+ verification_uri: string;
32
+ expired_in: number;
33
+ interval?: number;
34
+ state: string;
35
+ };
36
+
37
+ export type MiniMaxOAuthToken = {
38
+ access: string;
39
+ refresh: string;
40
+ expires: number;
41
+ resourceUrl?: string;
42
+ notification_message?: string;
43
+ };
44
+
45
+ type TokenPending = { status: "pending"; message?: string };
46
+
47
+ type TokenResult =
48
+ | { status: "success"; token: MiniMaxOAuthToken }
49
+ | TokenPending
50
+ | { status: "error"; message: string };
51
+
52
+ function toFormUrlEncoded(data: Record<string, string>): string {
53
+ return Object.entries(data)
54
+ .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
55
+ .join("&");
56
+ }
57
+
58
+ function generatePkce(): { verifier: string; challenge: string; state: string } {
59
+ const verifier = randomBytes(32).toString("base64url");
60
+ const challenge = createHash("sha256").update(verifier).digest("base64url");
61
+ const state = randomBytes(16).toString("base64url");
62
+ return { verifier, challenge, state };
63
+ }
64
+
65
+ async function requestOAuthCode(params: {
66
+ challenge: string;
67
+ state: string;
68
+ region: MiniMaxRegion;
69
+ }): Promise<MiniMaxOAuthAuthorization> {
70
+ const endpoints = getOAuthEndpoints(params.region);
71
+ const response = await fetch(endpoints.codeEndpoint, {
72
+ method: "POST",
73
+ headers: {
74
+ "Content-Type": "application/x-www-form-urlencoded",
75
+ Accept: "application/json",
76
+ "x-request-id": randomUUID(),
77
+ },
78
+ body: toFormUrlEncoded({
79
+ response_type: "code",
80
+ client_id: endpoints.clientId,
81
+ scope: MINIMAX_OAUTH_SCOPE,
82
+ code_challenge: params.challenge,
83
+ code_challenge_method: "S256",
84
+ state: params.state,
85
+ }),
86
+ });
87
+
88
+ if (!response.ok) {
89
+ const text = await response.text();
90
+ throw new Error(`MiniMax OAuth authorization failed: ${text || response.statusText}`);
91
+ }
92
+
93
+ const payload = (await response.json()) as MiniMaxOAuthAuthorization & { error?: string };
94
+ if (!payload.user_code || !payload.verification_uri) {
95
+ throw new Error(
96
+ payload.error ??
97
+ "MiniMax OAuth authorization returned an incomplete payload (missing user_code or verification_uri).",
98
+ );
99
+ }
100
+ if (payload.state !== params.state) {
101
+ throw new Error("MiniMax OAuth state mismatch: possible CSRF attack or session corruption.");
102
+ }
103
+ return payload;
104
+ }
105
+
106
+ async function pollOAuthToken(params: {
107
+ userCode: string;
108
+ verifier: string;
109
+ region: MiniMaxRegion;
110
+ }): Promise<TokenResult> {
111
+ const endpoints = getOAuthEndpoints(params.region);
112
+ const response = await fetch(endpoints.tokenEndpoint, {
113
+ method: "POST",
114
+ headers: {
115
+ "Content-Type": "application/x-www-form-urlencoded",
116
+ Accept: "application/json",
117
+ },
118
+ body: toFormUrlEncoded({
119
+ grant_type: MINIMAX_OAUTH_GRANT_TYPE,
120
+ client_id: endpoints.clientId,
121
+ user_code: params.userCode,
122
+ code_verifier: params.verifier,
123
+ }),
124
+ });
125
+
126
+ const text = await response.text();
127
+ let payload:
128
+ | {
129
+ status?: string;
130
+ base_resp?: { status_code?: number; status_msg?: string };
131
+ }
132
+ | undefined;
133
+ if (text) {
134
+ try {
135
+ payload = JSON.parse(text) as typeof payload;
136
+ } catch {
137
+ payload = undefined;
138
+ }
139
+ }
140
+
141
+ if (!response.ok) {
142
+ return {
143
+ status: "error",
144
+ message:
145
+ (payload?.base_resp?.status_msg ?? text) || "MiniMax OAuth failed to parse response.",
146
+ };
147
+ }
148
+
149
+ if (!payload) {
150
+ return { status: "error", message: "MiniMax OAuth failed to parse response." };
151
+ }
152
+
153
+ const tokenPayload = payload as {
154
+ status: string;
155
+ access_token?: string | null;
156
+ refresh_token?: string | null;
157
+ expired_in?: number | null;
158
+ token_type?: string;
159
+ resource_url?: string;
160
+ notification_message?: string;
161
+ };
162
+
163
+ if (tokenPayload.status === "error") {
164
+ return { status: "error", message: "An error occurred. Please try again later" };
165
+ }
166
+
167
+ if (tokenPayload.status != "success") {
168
+ return { status: "pending", message: "current user code is not authorized" };
169
+ }
170
+
171
+ if (!tokenPayload.access_token || !tokenPayload.refresh_token || !tokenPayload.expired_in) {
172
+ return { status: "error", message: "MiniMax OAuth returned incomplete token payload." };
173
+ }
174
+
175
+ return {
176
+ status: "success",
177
+ token: {
178
+ access: tokenPayload.access_token,
179
+ refresh: tokenPayload.refresh_token,
180
+ expires: tokenPayload.expired_in,
181
+ resourceUrl: tokenPayload.resource_url,
182
+ notification_message: tokenPayload.notification_message,
183
+ },
184
+ };
185
+ }
186
+
187
+ export async function loginMiniMaxPortalOAuth(params: {
188
+ openUrl: (url: string) => Promise<void>;
189
+ note: (message: string, title?: string) => Promise<void>;
190
+ progress: { update: (message: string) => void; stop: (message?: string) => void };
191
+ region?: MiniMaxRegion;
192
+ }): Promise<MiniMaxOAuthToken> {
193
+ const region = params.region ?? "global";
194
+ const { verifier, challenge, state } = generatePkce();
195
+ const oauth = await requestOAuthCode({ challenge, state, region });
196
+ const verificationUrl = oauth.verification_uri;
197
+
198
+ const noteLines = [
199
+ `Open ${verificationUrl} to approve access.`,
200
+ `If prompted, enter the code ${oauth.user_code}.`,
201
+ `Interval: ${oauth.interval ?? "default (2000ms)"}, Expires at: ${oauth.expired_in} unix timestamp`,
202
+ ];
203
+ await params.note(noteLines.join("\n"), "MiniMax OAuth");
204
+
205
+ try {
206
+ await params.openUrl(verificationUrl);
207
+ } catch {
208
+ // Fall back to manual copy/paste if browser open fails.
209
+ }
210
+
211
+ let pollIntervalMs = oauth.interval ? oauth.interval : 2000;
212
+ const expireTimeMs = oauth.expired_in;
213
+
214
+ while (Date.now() < expireTimeMs) {
215
+ params.progress.update("Waiting for MiniMax OAuth approval…");
216
+ const result = await pollOAuthToken({
217
+ userCode: oauth.user_code,
218
+ verifier,
219
+ region,
220
+ });
221
+
222
+ // // Debug: print poll result
223
+ // await params.note(
224
+ // `status: ${result.status}` +
225
+ // (result.status === "success" ? `\ntoken: ${JSON.stringify(result.token, null, 2)}` : "") +
226
+ // (result.status === "error" ? `\nmessage: ${result.message}` : "") +
227
+ // (result.status === "pending" && result.message ? `\nmessage: ${result.message}` : ""),
228
+ // "MiniMax OAuth Poll Result",
229
+ // );
230
+
231
+ if (result.status === "success") {
232
+ return result.token;
233
+ }
234
+
235
+ if (result.status === "error") {
236
+ throw new Error(`MiniMax OAuth failed: ${result.message}`);
237
+ }
238
+
239
+ if (result.status === "pending") {
240
+ pollIntervalMs = Math.min(pollIntervalMs * 1.5, 10000);
241
+ }
242
+
243
+ await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
244
+ }
245
+
246
+ throw new Error("MiniMax OAuth timed out waiting for authorization.");
247
+ }
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.2.17
4
+
5
+ ### Changes
6
+ - Version alignment with core Poolbot release numbers.
7
+
3
8
  ## 2026.1.23
4
9
 
5
10
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@poolbot/msteams",
3
- "version": "2026.1.26",
3
+ "version": "2026.2.17",
4
4
  "type": "module",
5
5
  "description": "Poolbot Microsoft Teams channel plugin",
6
6
  "poolbot": {
@@ -0,0 +1 @@
1
+ export { withFileLock } from "poolbot/plugin-sdk";
@@ -0,0 +1,92 @@
1
+ import type { MSTeamsConfig } from "poolbot/plugin-sdk";
2
+ import { GRAPH_ROOT } from "./attachments/shared.js";
3
+ import { loadMSTeamsSdkWithAuth } from "./sdk.js";
4
+ import { resolveMSTeamsCredentials } from "./token.js";
5
+
6
+ export type GraphUser = {
7
+ id?: string;
8
+ displayName?: string;
9
+ userPrincipalName?: string;
10
+ mail?: string;
11
+ };
12
+
13
+ export type GraphGroup = {
14
+ id?: string;
15
+ displayName?: string;
16
+ };
17
+
18
+ export type GraphChannel = {
19
+ id?: string;
20
+ displayName?: string;
21
+ };
22
+
23
+ export type GraphResponse<T> = { value?: T[] };
24
+
25
+ function readAccessToken(value: unknown): string | null {
26
+ if (typeof value === "string") {
27
+ return value;
28
+ }
29
+ if (value && typeof value === "object") {
30
+ const token =
31
+ (value as { accessToken?: unknown }).accessToken ?? (value as { token?: unknown }).token;
32
+ return typeof token === "string" ? token : null;
33
+ }
34
+ return null;
35
+ }
36
+
37
+ export function normalizeQuery(value?: string | null): string {
38
+ return value?.trim() ?? "";
39
+ }
40
+
41
+ export function escapeOData(value: string): string {
42
+ return value.replace(/'/g, "''");
43
+ }
44
+
45
+ export async function fetchGraphJson<T>(params: {
46
+ token: string;
47
+ path: string;
48
+ headers?: Record<string, string>;
49
+ }): Promise<T> {
50
+ const res = await fetch(`${GRAPH_ROOT}${params.path}`, {
51
+ headers: {
52
+ Authorization: `Bearer ${params.token}`,
53
+ ...params.headers,
54
+ },
55
+ });
56
+ if (!res.ok) {
57
+ const text = await res.text().catch(() => "");
58
+ throw new Error(`Graph ${params.path} failed (${res.status}): ${text || "unknown error"}`);
59
+ }
60
+ return (await res.json()) as T;
61
+ }
62
+
63
+ export async function resolveGraphToken(cfg: unknown): Promise<string> {
64
+ const creds = resolveMSTeamsCredentials(
65
+ (cfg as { channels?: { msteams?: unknown } })?.channels?.msteams as MSTeamsConfig | undefined,
66
+ );
67
+ if (!creds) {
68
+ throw new Error("MS Teams credentials missing");
69
+ }
70
+ const { sdk, authConfig } = await loadMSTeamsSdkWithAuth(creds);
71
+ const tokenProvider = new sdk.MsalTokenProvider(authConfig);
72
+ const token = await tokenProvider.getAccessToken("https://graph.microsoft.com");
73
+ const accessToken = readAccessToken(token);
74
+ if (!accessToken) {
75
+ throw new Error("MS Teams graph token unavailable");
76
+ }
77
+ return accessToken;
78
+ }
79
+
80
+ export async function listTeamsByName(token: string, query: string): Promise<GraphGroup[]> {
81
+ const escaped = escapeOData(query);
82
+ const filter = `resourceProvisioningOptions/Any(x:x eq 'Team') and startsWith(displayName,'${escaped}')`;
83
+ const path = `/groups?$filter=${encodeURIComponent(filter)}&$select=id,displayName`;
84
+ const res = await fetchGraphJson<GraphResponse<GraphGroup>>({ token, path });
85
+ return res.value ?? [];
86
+ }
87
+
88
+ export async function listChannelsForTeam(token: string, teamId: string): Promise<GraphChannel[]> {
89
+ const path = `/teams/${encodeURIComponent(teamId)}/channels?$select=id,displayName`;
90
+ const res = await fetchGraphJson<GraphResponse<GraphChannel>>({ token, path });
91
+ return res.value ?? [];
92
+ }
@@ -0,0 +1,114 @@
1
+ /**
2
+ * MS Teams mention handling utilities.
3
+ *
4
+ * Mentions in Teams require:
5
+ * 1. Text containing <at>Name</at> tags
6
+ * 2. entities array with mention metadata
7
+ */
8
+
9
+ export type MentionEntity = {
10
+ type: "mention";
11
+ text: string;
12
+ mentioned: {
13
+ id: string;
14
+ name: string;
15
+ };
16
+ };
17
+
18
+ export type MentionInfo = {
19
+ /** User/bot ID (e.g., "28:xxx" or AAD object ID) */
20
+ id: string;
21
+ /** Display name */
22
+ name: string;
23
+ };
24
+
25
+ /**
26
+ * Check whether an ID looks like a valid Teams user/bot identifier.
27
+ * Accepts:
28
+ * - Bot Framework IDs: "28:xxx..." / "29:xxx..." / "8:orgid:..."
29
+ * - AAD object IDs (UUIDs): "d5318c29-33ac-4e6b-bd42-57b8b793908f"
30
+ *
31
+ * Keep this permissive enough for real Teams IDs while still rejecting
32
+ * documentation placeholders like `@[表示名](ユーザーID)`.
33
+ */
34
+ const TEAMS_BOT_ID_PATTERN = /^\d+:[a-z0-9._=-]+(?::[a-z0-9._=-]+)*$/i;
35
+ const AAD_OBJECT_ID_PATTERN = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i;
36
+
37
+ function isValidTeamsId(id: string): boolean {
38
+ return TEAMS_BOT_ID_PATTERN.test(id) || AAD_OBJECT_ID_PATTERN.test(id);
39
+ }
40
+
41
+ /**
42
+ * Parse mentions from text in the format @[Name](id).
43
+ * Example: "Hello @[John Doe](28:xxx-yyy-zzz)!"
44
+ *
45
+ * Only matches where the id looks like a real Teams user/bot ID are treated
46
+ * as mentions. This avoids false positives from documentation or code samples
47
+ * embedded in the message (e.g. `@[表示名](ユーザーID)` in backticks).
48
+ *
49
+ * Returns both the formatted text with <at> tags and the entities array.
50
+ */
51
+ export function parseMentions(text: string): {
52
+ text: string;
53
+ entities: MentionEntity[];
54
+ } {
55
+ const mentionPattern = /@\[([^\]]+)\]\(([^)]+)\)/g;
56
+ const entities: MentionEntity[] = [];
57
+
58
+ // Replace @[Name](id) with <at>Name</at> only for valid Teams IDs
59
+ const formattedText = text.replace(mentionPattern, (match, name, id) => {
60
+ const trimmedId = id.trim();
61
+
62
+ // Skip matches where the id doesn't look like a real Teams identifier
63
+ if (!isValidTeamsId(trimmedId)) {
64
+ return match;
65
+ }
66
+
67
+ const trimmedName = name.trim();
68
+ const mentionTag = `<at>${trimmedName}</at>`;
69
+ entities.push({
70
+ type: "mention",
71
+ text: mentionTag,
72
+ mentioned: {
73
+ id: trimmedId,
74
+ name: trimmedName,
75
+ },
76
+ });
77
+ return mentionTag;
78
+ });
79
+
80
+ return {
81
+ text: formattedText,
82
+ entities,
83
+ };
84
+ }
85
+
86
+ /**
87
+ * Build mention entities array from a list of mentions.
88
+ * Use this when you already have the mention info and formatted text.
89
+ */
90
+ export function buildMentionEntities(mentions: MentionInfo[]): MentionEntity[] {
91
+ return mentions.map((mention) => ({
92
+ type: "mention",
93
+ text: `<at>${mention.name}</at>`,
94
+ mentioned: {
95
+ id: mention.id,
96
+ name: mention.name,
97
+ },
98
+ }));
99
+ }
100
+
101
+ /**
102
+ * Format text with mentions using <at> tags.
103
+ * This is a convenience function when you want to manually format mentions.
104
+ */
105
+ export function formatMentionText(text: string, mentions: MentionInfo[]): string {
106
+ let formatted = text;
107
+ for (const mention of mentions) {
108
+ // Replace @Name or @name with <at>Name</at>
109
+ const escapedName = mention.name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
110
+ const namePattern = new RegExp(`@${escapedName}`, "gi");
111
+ formatted = formatted.replace(namePattern, `<at>${mention.name}</at>`);
112
+ }
113
+ return formatted;
114
+ }
@@ -0,0 +1,16 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ import type { PluginRuntime } from "poolbot/plugin-sdk";
4
+
5
+ export const msteamsRuntimeStub = {
6
+ state: {
7
+ resolveStateDir: (env: NodeJS.ProcessEnv = process.env, homedir?: () => string) => {
8
+ const override = env.POOLBOT_STATE_DIR?.trim() || env.POOLBOT_STATE_DIR?.trim();
9
+ if (override) {
10
+ return override;
11
+ }
12
+ const resolvedHome = homedir ? homedir() : os.homedir();
13
+ return path.join(resolvedHome, ".openclaw");
14
+ },
15
+ },
16
+ } as unknown as PluginRuntime;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@poolbot/nextcloud-talk",
3
- "version": "2026.1.26",
3
+ "version": "2026.2.17",
4
4
  "type": "module",
5
5
  "description": "Poolbot Nextcloud Talk channel plugin",
6
6
  "poolbot": {
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.2.17
4
+
5
+ ### Changes
6
+ - Version alignment with core Poolbot release numbers.
7
+
3
8
  ## 2026.1.23
4
9
 
5
10
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@poolbot/nostr",
3
- "version": "2026.1.26",
3
+ "version": "2026.2.17",
4
4
  "type": "module",
5
5
  "description": "Poolbot Nostr channel plugin for NIP-04 encrypted DMs",
6
6
  "poolbot": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@poolbot/open-prose",
3
- "version": "2026.1.26",
3
+ "version": "2026.2.17",
4
4
  "type": "module",
5
5
  "description": "OpenProse VM skill pack plugin (slash command + telemetry).",
6
6
  "poolbot": {