@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,114 @@
1
+ import { createSubsystemLogger } from "../logging/subsystem.js";
2
+ const log = createSubsystemLogger("gateway/health-monitor");
3
+ const DEFAULT_CHECK_INTERVAL_MS = 5 * 60_000;
4
+ const DEFAULT_STARTUP_GRACE_MS = 60_000;
5
+ const DEFAULT_COOLDOWN_CYCLES = 2;
6
+ const DEFAULT_MAX_RESTARTS_PER_HOUR = 3;
7
+ const ONE_HOUR_MS = 60 * 60_000;
8
+ function isManagedAccount(snapshot) {
9
+ return snapshot.enabled !== false && snapshot.configured !== false;
10
+ }
11
+ function isChannelHealthy(snapshot) {
12
+ if (!isManagedAccount(snapshot)) {
13
+ return true;
14
+ }
15
+ if (!snapshot.running) {
16
+ return false;
17
+ }
18
+ if (snapshot.connected === false) {
19
+ return false;
20
+ }
21
+ return true;
22
+ }
23
+ export function startChannelHealthMonitor(deps) {
24
+ const { channelManager, checkIntervalMs = DEFAULT_CHECK_INTERVAL_MS, startupGraceMs = DEFAULT_STARTUP_GRACE_MS, cooldownCycles = DEFAULT_COOLDOWN_CYCLES, maxRestartsPerHour = DEFAULT_MAX_RESTARTS_PER_HOUR, abortSignal, } = deps;
25
+ const cooldownMs = cooldownCycles * checkIntervalMs;
26
+ const restartRecords = new Map();
27
+ const startedAt = Date.now();
28
+ let stopped = false;
29
+ let timer = null;
30
+ const rKey = (channelId, accountId) => `${channelId}:${accountId}`;
31
+ function pruneOldRestarts(record, now) {
32
+ record.restartsThisHour = record.restartsThisHour.filter((r) => now - r.at < ONE_HOUR_MS);
33
+ }
34
+ async function runCheck() {
35
+ if (stopped) {
36
+ return;
37
+ }
38
+ const now = Date.now();
39
+ if (now - startedAt < startupGraceMs) {
40
+ return;
41
+ }
42
+ const snapshot = channelManager.getRuntimeSnapshot();
43
+ for (const [channelId, accounts] of Object.entries(snapshot.channelAccounts)) {
44
+ if (!accounts) {
45
+ continue;
46
+ }
47
+ for (const [accountId, status] of Object.entries(accounts)) {
48
+ if (!status) {
49
+ continue;
50
+ }
51
+ if (!isManagedAccount(status)) {
52
+ continue;
53
+ }
54
+ if (channelManager.isManuallyStopped(channelId, accountId)) {
55
+ continue;
56
+ }
57
+ if (isChannelHealthy(status)) {
58
+ continue;
59
+ }
60
+ const key = rKey(channelId, accountId);
61
+ const record = restartRecords.get(key) ?? {
62
+ lastRestartAt: 0,
63
+ restartsThisHour: [],
64
+ };
65
+ if (now - record.lastRestartAt <= cooldownMs) {
66
+ continue;
67
+ }
68
+ pruneOldRestarts(record, now);
69
+ if (record.restartsThisHour.length >= maxRestartsPerHour) {
70
+ log.warn?.(`[${channelId}:${accountId}] health-monitor: hit ${maxRestartsPerHour} restarts/hour limit, skipping`);
71
+ continue;
72
+ }
73
+ const reason = !status.running
74
+ ? status.reconnectAttempts && status.reconnectAttempts >= 10
75
+ ? "gave-up"
76
+ : "stopped"
77
+ : "stuck";
78
+ log.info?.(`[${channelId}:${accountId}] health-monitor: restarting (reason: ${reason})`);
79
+ try {
80
+ if (status.running) {
81
+ await channelManager.stopChannel(channelId, accountId);
82
+ }
83
+ channelManager.resetRestartAttempts(channelId, accountId);
84
+ await channelManager.startChannel(channelId, accountId);
85
+ record.lastRestartAt = now;
86
+ record.restartsThisHour.push({ at: now });
87
+ restartRecords.set(key, record);
88
+ }
89
+ catch (err) {
90
+ log.error?.(`[${channelId}:${accountId}] health-monitor: restart failed: ${String(err)}`);
91
+ }
92
+ }
93
+ }
94
+ }
95
+ function stop() {
96
+ stopped = true;
97
+ if (timer) {
98
+ clearInterval(timer);
99
+ timer = null;
100
+ }
101
+ }
102
+ if (abortSignal?.aborted) {
103
+ stopped = true;
104
+ }
105
+ else {
106
+ abortSignal?.addEventListener("abort", stop, { once: true });
107
+ timer = setInterval(() => void runCheck(), checkIntervalMs);
108
+ if (typeof timer === "object" && "unref" in timer) {
109
+ timer.unref();
110
+ }
111
+ log.info?.(`started (interval: ${Math.round(checkIntervalMs / 1000)}s, grace: ${Math.round(startupGraceMs / 1000)}s)`);
112
+ }
113
+ return { stop };
114
+ }
@@ -0,0 +1 @@
1
+ export const CONTROL_UI_BOOTSTRAP_CONFIG_PATH = "/__openclaw/control-ui-config.json";
@@ -0,0 +1,15 @@
1
+ export function buildControlUiCspHeader() {
2
+ // Control UI: block framing, block inline scripts, keep styles permissive
3
+ // (UI uses a lot of inline style attributes in templates).
4
+ return [
5
+ "default-src 'self'",
6
+ "base-uri 'none'",
7
+ "object-src 'none'",
8
+ "frame-ancestors 'none'",
9
+ "script-src 'self'",
10
+ "style-src 'self' 'unsafe-inline'",
11
+ "img-src 'self' data: https:",
12
+ "font-src 'self'",
13
+ "connect-src 'self' ws: wss:",
14
+ ].join("; ");
15
+ }
@@ -0,0 +1,25 @@
1
+ export const TAILSCALE_EXPOSURE_OPTIONS = [
2
+ { value: "off", label: "Off", hint: "No Tailscale exposure" },
3
+ {
4
+ value: "serve",
5
+ label: "Serve",
6
+ hint: "Private HTTPS for your tailnet (devices on Tailscale)",
7
+ },
8
+ {
9
+ value: "funnel",
10
+ label: "Funnel",
11
+ hint: "Public HTTPS via Tailscale Funnel (internet)",
12
+ },
13
+ ];
14
+ export const TAILSCALE_MISSING_BIN_NOTE_LINES = [
15
+ "Tailscale binary not found in PATH or /Applications.",
16
+ "Ensure Tailscale is installed from:",
17
+ " https://tailscale.com/download/mac",
18
+ "",
19
+ "You can continue setup, but serve/funnel will fail at runtime.",
20
+ ];
21
+ export const TAILSCALE_DOCS_LINES = [
22
+ "Docs:",
23
+ "https://docs.openclaw.ai/gateway/tailscale",
24
+ "https://docs.openclaw.ai/web",
25
+ ];
@@ -0,0 +1,18 @@
1
+ import { authorizeGatewayConnect } from "./auth.js";
2
+ import { sendGatewayAuthFailure } from "./http-common.js";
3
+ import { getBearerToken } from "./http-utils.js";
4
+ export async function authorizeGatewayBearerRequestOrReply(params) {
5
+ const token = getBearerToken(params.req);
6
+ const authResult = await authorizeGatewayConnect({
7
+ auth: params.auth,
8
+ connectAuth: token ? { token, password: token } : null,
9
+ req: params.req,
10
+ trustedProxies: params.trustedProxies,
11
+ rateLimiter: params.rateLimiter,
12
+ });
13
+ if (!authResult.ok) {
14
+ sendGatewayAuthFailure(params.res, authResult);
15
+ return false;
16
+ }
17
+ return true;
18
+ }
@@ -18,6 +18,24 @@ export function sendUnauthorized(res) {
18
18
  error: { message: "Unauthorized", type: "unauthorized" },
19
19
  });
20
20
  }
21
+ export function sendRateLimited(res, retryAfterMs) {
22
+ if (retryAfterMs && retryAfterMs > 0) {
23
+ res.setHeader("Retry-After", String(Math.ceil(retryAfterMs / 1000)));
24
+ }
25
+ sendJson(res, 429, {
26
+ error: {
27
+ message: "Too many failed authentication attempts. Please try again later.",
28
+ type: "rate_limited",
29
+ },
30
+ });
31
+ }
32
+ export function sendGatewayAuthFailure(res, authResult) {
33
+ if (authResult.rateLimited) {
34
+ sendRateLimited(res, authResult.retryAfterMs);
35
+ return;
36
+ }
37
+ sendUnauthorized(res);
38
+ }
21
39
  export function sendInvalidRequest(res, message) {
22
40
  sendJson(res, 400, {
23
41
  error: { message, type: "invalid_request_error" },
@@ -0,0 +1,27 @@
1
+ import { authorizeGatewayBearerRequestOrReply } from "./http-auth-helpers.js";
2
+ import { readJsonBodyOrError, sendMethodNotAllowed } from "./http-common.js";
3
+ export async function handleGatewayPostJsonEndpoint(req, res, opts) {
4
+ const url = new URL(req.url ?? "/", `http://${req.headers.host || "localhost"}`);
5
+ if (url.pathname !== opts.pathname) {
6
+ return false;
7
+ }
8
+ if (req.method !== "POST") {
9
+ sendMethodNotAllowed(res);
10
+ return undefined;
11
+ }
12
+ const authorized = await authorizeGatewayBearerRequestOrReply({
13
+ req,
14
+ res,
15
+ auth: opts.auth,
16
+ trustedProxies: opts.trustedProxies,
17
+ rateLimiter: opts.rateLimiter,
18
+ });
19
+ if (!authorized) {
20
+ return undefined;
21
+ }
22
+ const body = await readJsonBodyOrError(req, res, opts.maxBodyBytes);
23
+ if (body === undefined) {
24
+ return undefined;
25
+ }
26
+ return { body };
27
+ }
@@ -0,0 +1,11 @@
1
+ import { sanitizeSystemRunParamsForForwarding } from "./node-invoke-system-run-approval.js";
2
+ export function sanitizeNodeInvokeParamsForForwarding(opts) {
3
+ if (opts.command === "system.run") {
4
+ return sanitizeSystemRunParamsForForwarding({
5
+ rawParams: opts.rawParams,
6
+ client: opts.client,
7
+ execApprovalManager: opts.execApprovalManager,
8
+ });
9
+ }
10
+ return { ok: true, params: opts.rawParams };
11
+ }
@@ -0,0 +1,205 @@
1
+ import { formatExecCommand, validateSystemRunCommandConsistency, } from "../infra/system-run-command.js";
2
+ function asRecord(value) {
3
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
4
+ return null;
5
+ }
6
+ return value;
7
+ }
8
+ function normalizeString(value) {
9
+ if (typeof value !== "string") {
10
+ return null;
11
+ }
12
+ const trimmed = value.trim();
13
+ return trimmed ? trimmed : null;
14
+ }
15
+ function normalizeApprovalDecision(value) {
16
+ const s = normalizeString(value);
17
+ return s === "allow-once" || s === "allow-always" ? s : null;
18
+ }
19
+ function clientHasApprovals(client) {
20
+ const scopes = Array.isArray(client?.connect?.scopes) ? client?.connect?.scopes : [];
21
+ return scopes.includes("operator.admin") || scopes.includes("operator.approvals");
22
+ }
23
+ function getCmdText(params) {
24
+ const raw = normalizeString(params.rawCommand);
25
+ if (raw) {
26
+ return raw;
27
+ }
28
+ if (Array.isArray(params.command)) {
29
+ const parts = params.command.map((v) => String(v));
30
+ if (parts.length > 0) {
31
+ return formatExecCommand(parts);
32
+ }
33
+ }
34
+ return "";
35
+ }
36
+ function approvalMatchesRequest(params, record) {
37
+ if (record.request.host !== "node") {
38
+ return false;
39
+ }
40
+ const cmdText = getCmdText(params);
41
+ if (!cmdText || record.request.command !== cmdText) {
42
+ return false;
43
+ }
44
+ const reqCwd = record.request.cwd ?? null;
45
+ const runCwd = normalizeString(params.cwd) ?? null;
46
+ if (reqCwd !== runCwd) {
47
+ return false;
48
+ }
49
+ const reqAgentId = record.request.agentId ?? null;
50
+ const runAgentId = normalizeString(params.agentId) ?? null;
51
+ if (reqAgentId !== runAgentId) {
52
+ return false;
53
+ }
54
+ const reqSessionKey = record.request.sessionKey ?? null;
55
+ const runSessionKey = normalizeString(params.sessionKey) ?? null;
56
+ if (reqSessionKey !== runSessionKey) {
57
+ return false;
58
+ }
59
+ return true;
60
+ }
61
+ function pickSystemRunParams(raw) {
62
+ // Defensive allowlist: only forward fields that the node-host `system.run` handler understands.
63
+ // This prevents future internal control fields from being smuggled through the gateway.
64
+ const next = {};
65
+ for (const key of [
66
+ "command",
67
+ "rawCommand",
68
+ "cwd",
69
+ "env",
70
+ "timeoutMs",
71
+ "needsScreenRecording",
72
+ "agentId",
73
+ "sessionKey",
74
+ "runId",
75
+ ]) {
76
+ if (key in raw) {
77
+ next[key] = raw[key];
78
+ }
79
+ }
80
+ return next;
81
+ }
82
+ /**
83
+ * Gate `system.run` approval flags (`approved`, `approvalDecision`) behind a real
84
+ * `exec.approval.*` record. This prevents users with only `operator.write` from
85
+ * bypassing node-host approvals by injecting control fields into `node.invoke`.
86
+ */
87
+ export function sanitizeSystemRunParamsForForwarding(opts) {
88
+ const obj = asRecord(opts.rawParams);
89
+ if (!obj) {
90
+ return { ok: true, params: opts.rawParams };
91
+ }
92
+ const p = obj;
93
+ const argv = Array.isArray(p.command) ? p.command.map((v) => String(v)) : [];
94
+ const raw = normalizeString(p.rawCommand);
95
+ if (raw) {
96
+ if (!Array.isArray(p.command) || argv.length === 0) {
97
+ return {
98
+ ok: false,
99
+ message: "rawCommand requires params.command",
100
+ details: { code: "MISSING_COMMAND" },
101
+ };
102
+ }
103
+ const validation = validateSystemRunCommandConsistency({ argv, rawCommand: raw });
104
+ if (!validation.ok) {
105
+ return {
106
+ ok: false,
107
+ message: validation.message,
108
+ details: validation.details ?? { code: "RAW_COMMAND_MISMATCH" },
109
+ };
110
+ }
111
+ }
112
+ const approved = p.approved === true;
113
+ const requestedDecision = normalizeApprovalDecision(p.approvalDecision);
114
+ const wantsApprovalOverride = approved || requestedDecision !== null;
115
+ // Always strip control fields from user input. If the override is allowed,
116
+ // we re-add trusted fields based on the gateway approval record.
117
+ const next = pickSystemRunParams(obj);
118
+ if (!wantsApprovalOverride) {
119
+ return { ok: true, params: next };
120
+ }
121
+ const runId = normalizeString(p.runId);
122
+ if (!runId) {
123
+ return {
124
+ ok: false,
125
+ message: "approval override requires params.runId",
126
+ details: { code: "MISSING_RUN_ID" },
127
+ };
128
+ }
129
+ const manager = opts.execApprovalManager;
130
+ if (!manager) {
131
+ return {
132
+ ok: false,
133
+ message: "exec approvals unavailable",
134
+ details: { code: "APPROVALS_UNAVAILABLE" },
135
+ };
136
+ }
137
+ const snapshot = manager.getSnapshot(runId);
138
+ if (!snapshot) {
139
+ return {
140
+ ok: false,
141
+ message: "unknown or expired approval id",
142
+ details: { code: "UNKNOWN_APPROVAL_ID", runId },
143
+ };
144
+ }
145
+ const nowMs = typeof opts.nowMs === "number" ? opts.nowMs : Date.now();
146
+ if (nowMs > snapshot.expiresAtMs) {
147
+ return {
148
+ ok: false,
149
+ message: "approval expired",
150
+ details: { code: "APPROVAL_EXPIRED", runId },
151
+ };
152
+ }
153
+ // Prefer binding by device identity (stable across reconnects / per-call clients like callGateway()).
154
+ // Fallback to connId only when device identity is not available.
155
+ const snapshotDeviceId = snapshot.requestedByDeviceId ?? null;
156
+ const clientDeviceId = opts.client?.connect?.device?.id ?? null;
157
+ if (snapshotDeviceId) {
158
+ if (snapshotDeviceId !== clientDeviceId) {
159
+ return {
160
+ ok: false,
161
+ message: "approval id not valid for this device",
162
+ details: { code: "APPROVAL_DEVICE_MISMATCH", runId },
163
+ };
164
+ }
165
+ }
166
+ else if (snapshot.requestedByConnId &&
167
+ snapshot.requestedByConnId !== (opts.client?.connId ?? null)) {
168
+ return {
169
+ ok: false,
170
+ message: "approval id not valid for this client",
171
+ details: { code: "APPROVAL_CLIENT_MISMATCH", runId },
172
+ };
173
+ }
174
+ if (!approvalMatchesRequest(p, snapshot)) {
175
+ return {
176
+ ok: false,
177
+ message: "approval id does not match request",
178
+ details: { code: "APPROVAL_REQUEST_MISMATCH", runId },
179
+ };
180
+ }
181
+ // Normal path: enforce the decision recorded by the gateway.
182
+ if (snapshot.decision === "allow-once" || snapshot.decision === "allow-always") {
183
+ next.approved = true;
184
+ next.approvalDecision = snapshot.decision;
185
+ return { ok: true, params: next };
186
+ }
187
+ // If the approval request timed out (decision=null), allow askFallback-driven
188
+ // "allow-once" ONLY for clients that are allowed to use exec approvals.
189
+ const timedOut = snapshot.resolvedAtMs !== undefined &&
190
+ snapshot.decision === undefined &&
191
+ snapshot.resolvedBy === null;
192
+ if (timedOut &&
193
+ approved &&
194
+ requestedDecision === "allow-once" &&
195
+ clientHasApprovals(opts.client)) {
196
+ next.approved = true;
197
+ next.approvalDecision = "allow-once";
198
+ return { ok: true, params: next };
199
+ }
200
+ return {
201
+ ok: false,
202
+ message: "approval required",
203
+ details: { code: "APPROVAL_REQUIRED", runId },
204
+ };
205
+ }
@@ -0,0 +1,21 @@
1
+ export function resolveGatewayProbeAuth(params) {
2
+ const env = params.env ?? process.env;
3
+ const authToken = params.cfg.gateway?.auth?.token;
4
+ const authPassword = params.cfg.gateway?.auth?.password;
5
+ const remote = params.cfg.gateway?.remote;
6
+ const token = params.mode === "remote"
7
+ ? typeof remote?.token === "string" && remote.token.trim()
8
+ ? remote.token.trim()
9
+ : undefined
10
+ : env.POOLBOT_GATEWAY_TOKEN?.trim() ||
11
+ (typeof authToken === "string" && authToken.trim() ? authToken.trim() : undefined);
12
+ const password = env.POOLBOT_GATEWAY_PASSWORD?.trim() ||
13
+ (params.mode === "remote"
14
+ ? typeof remote?.password === "string" && remote.password.trim()
15
+ ? remote.password.trim()
16
+ : undefined
17
+ : typeof authPassword === "string" && authPassword.trim()
18
+ ? authPassword.trim()
19
+ : undefined);
20
+ return { token, password };
21
+ }
@@ -1,5 +1,5 @@
1
1
  import AjvPkg from "ajv";
2
- import { AgentEventSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, AgentParamsSchema, AgentSummarySchema, AgentsFileEntrySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema, AgentsUpdateParamsSchema, AgentsUpdateResultSchema, AgentsDeleteParamsSchema, AgentsDeleteResultSchema, AgentsFilesGetParamsSchema, AgentsFilesGetResultSchema, AgentsFilesListParamsSchema, AgentsFilesListResultSchema, AgentsFilesSetParamsSchema, AgentsFilesSetResultSchema, AgentsListParamsSchema, AgentsListResultSchema, AgentWaitParamsSchema, ChannelsLogoutParamsSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChatAbortParamsSchema, ChatEventSchema, ChatHistoryParamsSchema, ChatInjectParamsSchema, ChatSendParamsSchema, ConfigApplyParamsSchema, ConfigGetParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, ConfigSetParamsSchema, ConnectParamsSchema, CronAddParamsSchema, CronJobSchema, CronListParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, CronStatusParamsSchema, CronUpdateParamsSchema, DevicePairApproveParamsSchema, DevicePairListParamsSchema, DevicePairRejectParamsSchema, DeviceTokenRevokeParamsSchema, DeviceTokenRotateParamsSchema, ExecApprovalsGetParamsSchema, ExecApprovalsNodeGetParamsSchema, ExecApprovalsNodeSetParamsSchema, ExecApprovalsSetParamsSchema, ExecApprovalRequestParamsSchema, ExecApprovalResolveParamsSchema, ErrorCodes, ErrorShapeSchema, EventFrameSchema, errorShape, GatewayFrameSchema, HelloOkSchema, LogsTailParamsSchema, LogsTailResultSchema, ModelsListParamsSchema, NodeDescribeParamsSchema, NodeEventParamsSchema, NodeInvokeParamsSchema, NodeInvokeResultParamsSchema, NodeListParamsSchema, NodePairApproveParamsSchema, NodePairListParamsSchema, NodePairRejectParamsSchema, NodePairRequestParamsSchema, NodePairVerifyParamsSchema, NodeRenameParamsSchema, PollParamsSchema, PROTOCOL_VERSION, PresenceEntrySchema, ProtocolSchemas, RequestFrameSchema, ResponseFrameSchema, SendParamsSchema, SessionsCompactParamsSchema, SessionsDeleteParamsSchema, SessionsListParamsSchema, SessionsPatchParamsSchema, SessionsPreviewParamsSchema, SessionsResetParamsSchema, SessionsResolveParamsSchema, SessionsUsageParamsSchema, ShutdownEventSchema, SkillsBinsParamsSchema, SkillsInstallParamsSchema, SkillsStatusParamsSchema, SkillsUpdateParamsSchema, SnapshotSchema, StateVersionSchema, TalkModeParamsSchema, TickEventSchema, UpdateRunParamsSchema, WakeParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, WizardCancelParamsSchema, WizardNextParamsSchema, WizardNextResultSchema, WizardStartParamsSchema, WizardStartResultSchema, WizardStatusParamsSchema, WizardStatusResultSchema, WizardStepSchema, } from "./schema.js";
2
+ import { AgentEventSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, AgentParamsSchema, AgentSummarySchema, AgentsFileEntrySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema, AgentsUpdateParamsSchema, AgentsUpdateResultSchema, AgentsDeleteParamsSchema, AgentsDeleteResultSchema, AgentsFilesGetParamsSchema, AgentsFilesGetResultSchema, AgentsFilesListParamsSchema, AgentsFilesListResultSchema, AgentsFilesSetParamsSchema, AgentsFilesSetResultSchema, AgentsListParamsSchema, AgentsListResultSchema, AgentWaitParamsSchema, ChannelsLogoutParamsSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChatAbortParamsSchema, ChatEventSchema, ChatHistoryParamsSchema, ChatInjectParamsSchema, ChatSendParamsSchema, ConfigApplyParamsSchema, ConfigGetParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, ConfigSetParamsSchema, ConnectParamsSchema, CronAddParamsSchema, CronJobSchema, CronListParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, CronStatusParamsSchema, CronUpdateParamsSchema, DevicePairApproveParamsSchema, DevicePairListParamsSchema, DevicePairRejectParamsSchema, DeviceTokenRevokeParamsSchema, DeviceTokenRotateParamsSchema, ExecApprovalsGetParamsSchema, ExecApprovalsNodeGetParamsSchema, ExecApprovalsNodeSetParamsSchema, ExecApprovalsSetParamsSchema, ExecApprovalRequestParamsSchema, ExecApprovalResolveParamsSchema, ErrorCodes, ErrorShapeSchema, EventFrameSchema, errorShape, GatewayFrameSchema, HelloOkSchema, LogsTailParamsSchema, LogsTailResultSchema, ModelsListParamsSchema, MeshPlanParamsSchema, MeshPlanAutoParamsSchema, MeshRetryParamsSchema, MeshRunParamsSchema, MeshStatusParamsSchema, MeshWorkflowPlanSchema, NodeDescribeParamsSchema, NodeEventParamsSchema, NodeInvokeParamsSchema, NodeInvokeResultParamsSchema, NodeListParamsSchema, NodePairApproveParamsSchema, NodePairListParamsSchema, NodePairRejectParamsSchema, NodePairRequestParamsSchema, NodePairVerifyParamsSchema, NodeRenameParamsSchema, PollParamsSchema, PROTOCOL_VERSION, PresenceEntrySchema, ProtocolSchemas, RequestFrameSchema, ResponseFrameSchema, SendParamsSchema, SessionsCompactParamsSchema, SessionsDeleteParamsSchema, SessionsListParamsSchema, SessionsPatchParamsSchema, SessionsPreviewParamsSchema, SessionsResetParamsSchema, SessionsResolveParamsSchema, SessionsUsageParamsSchema, ShutdownEventSchema, SkillsBinsParamsSchema, SkillsInstallParamsSchema, SkillsStatusParamsSchema, SkillsUpdateParamsSchema, SnapshotSchema, StateVersionSchema, TalkModeParamsSchema, TickEventSchema, UpdateRunParamsSchema, WakeParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, WizardCancelParamsSchema, WizardNextParamsSchema, WizardNextResultSchema, WizardStartParamsSchema, WizardStartResultSchema, WizardStatusParamsSchema, WizardStatusResultSchema, WizardStepSchema, } from "./schema.js";
3
3
  const ajv = new AjvPkg({
4
4
  allErrors: true,
5
5
  strict: false,
@@ -85,6 +85,11 @@ export const validateChatEvent = ajv.compile(ChatEventSchema);
85
85
  export const validateUpdateRunParams = ajv.compile(UpdateRunParamsSchema);
86
86
  export const validateWebLoginStartParams = ajv.compile(WebLoginStartParamsSchema);
87
87
  export const validateWebLoginWaitParams = ajv.compile(WebLoginWaitParamsSchema);
88
+ export const validateMeshPlanParams = ajv.compile(MeshPlanParamsSchema);
89
+ export const validateMeshPlanAutoParams = ajv.compile(MeshPlanAutoParamsSchema);
90
+ export const validateMeshRunParams = ajv.compile(MeshRunParamsSchema);
91
+ export const validateMeshStatusParams = ajv.compile(MeshStatusParamsSchema);
92
+ export const validateMeshRetryParams = ajv.compile(MeshRetryParamsSchema);
88
93
  export function formatValidationErrors(errors) {
89
94
  if (!errors?.length)
90
95
  return "unknown validation error";
@@ -113,4 +118,4 @@ export function formatValidationErrors(errors) {
113
118
  }
114
119
  return unique.join("; ");
115
120
  }
116
- export { ConnectParamsSchema, HelloOkSchema, RequestFrameSchema, ResponseFrameSchema, EventFrameSchema, GatewayFrameSchema, PresenceEntrySchema, SnapshotSchema, ErrorShapeSchema, StateVersionSchema, AgentEventSchema, ChatEventSchema, SendParamsSchema, PollParamsSchema, AgentParamsSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, WakeParamsSchema, NodePairRequestParamsSchema, NodePairListParamsSchema, NodePairApproveParamsSchema, NodePairRejectParamsSchema, NodePairVerifyParamsSchema, NodeListParamsSchema, NodeInvokeParamsSchema, SessionsListParamsSchema, SessionsPreviewParamsSchema, SessionsPatchParamsSchema, SessionsResetParamsSchema, SessionsDeleteParamsSchema, SessionsCompactParamsSchema, SessionsUsageParamsSchema, ConfigGetParamsSchema, ConfigSetParamsSchema, ConfigApplyParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, WizardStartParamsSchema, WizardNextParamsSchema, WizardCancelParamsSchema, WizardStatusParamsSchema, WizardStepSchema, WizardNextResultSchema, WizardStartResultSchema, WizardStatusResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChannelsLogoutParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, AgentSummarySchema, AgentsListParamsSchema, AgentsListResultSchema, AgentsFileEntrySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema, AgentsUpdateParamsSchema, AgentsUpdateResultSchema, AgentsDeleteParamsSchema, AgentsDeleteResultSchema, AgentsFilesListParamsSchema, AgentsFilesListResultSchema, AgentsFilesGetParamsSchema, AgentsFilesGetResultSchema, AgentsFilesSetParamsSchema, AgentsFilesSetResultSchema, ModelsListParamsSchema, SkillsStatusParamsSchema, SkillsInstallParamsSchema, SkillsUpdateParamsSchema, CronJobSchema, CronListParamsSchema, CronStatusParamsSchema, CronAddParamsSchema, CronUpdateParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, LogsTailParamsSchema, LogsTailResultSchema, ChatHistoryParamsSchema, ChatSendParamsSchema, ChatInjectParamsSchema, UpdateRunParamsSchema, TickEventSchema, ShutdownEventSchema, ProtocolSchemas, PROTOCOL_VERSION, ErrorCodes, errorShape, };
121
+ export { ConnectParamsSchema, HelloOkSchema, RequestFrameSchema, ResponseFrameSchema, EventFrameSchema, GatewayFrameSchema, PresenceEntrySchema, SnapshotSchema, ErrorShapeSchema, StateVersionSchema, AgentEventSchema, ChatEventSchema, SendParamsSchema, PollParamsSchema, AgentParamsSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, WakeParamsSchema, NodePairRequestParamsSchema, NodePairListParamsSchema, NodePairApproveParamsSchema, NodePairRejectParamsSchema, NodePairVerifyParamsSchema, NodeListParamsSchema, NodeInvokeParamsSchema, SessionsListParamsSchema, SessionsPreviewParamsSchema, SessionsPatchParamsSchema, SessionsResetParamsSchema, SessionsDeleteParamsSchema, SessionsCompactParamsSchema, SessionsUsageParamsSchema, ConfigGetParamsSchema, ConfigSetParamsSchema, ConfigApplyParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, WizardStartParamsSchema, WizardNextParamsSchema, WizardCancelParamsSchema, WizardStatusParamsSchema, WizardStepSchema, WizardNextResultSchema, WizardStartResultSchema, WizardStatusResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChannelsLogoutParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, AgentSummarySchema, AgentsListParamsSchema, AgentsListResultSchema, AgentsFileEntrySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema, AgentsUpdateParamsSchema, AgentsUpdateResultSchema, AgentsDeleteParamsSchema, AgentsDeleteResultSchema, AgentsFilesListParamsSchema, AgentsFilesListResultSchema, AgentsFilesGetParamsSchema, AgentsFilesGetResultSchema, AgentsFilesSetParamsSchema, AgentsFilesSetResultSchema, ModelsListParamsSchema, SkillsStatusParamsSchema, SkillsInstallParamsSchema, SkillsUpdateParamsSchema, CronJobSchema, CronListParamsSchema, CronStatusParamsSchema, CronAddParamsSchema, CronUpdateParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, LogsTailParamsSchema, LogsTailResultSchema, ChatHistoryParamsSchema, ChatSendParamsSchema, ChatInjectParamsSchema, UpdateRunParamsSchema, TickEventSchema, ShutdownEventSchema, MeshPlanParamsSchema, MeshPlanAutoParamsSchema, MeshWorkflowPlanSchema, MeshRunParamsSchema, MeshStatusParamsSchema, MeshRetryParamsSchema, ProtocolSchemas, PROTOCOL_VERSION, ErrorCodes, errorShape, };
@@ -0,0 +1,54 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { NonEmptyString } from "./primitives.js";
3
+ export const MeshPlanStepSchema = Type.Object({
4
+ id: NonEmptyString,
5
+ name: Type.Optional(NonEmptyString),
6
+ prompt: NonEmptyString,
7
+ dependsOn: Type.Optional(Type.Array(NonEmptyString, { maxItems: 64 })),
8
+ agentId: Type.Optional(NonEmptyString),
9
+ sessionKey: Type.Optional(NonEmptyString),
10
+ thinking: Type.Optional(Type.String()),
11
+ timeoutMs: Type.Optional(Type.Integer({ minimum: 1_000, maximum: 3_600_000 })),
12
+ }, { additionalProperties: false });
13
+ export const MeshWorkflowPlanSchema = Type.Object({
14
+ planId: NonEmptyString,
15
+ goal: NonEmptyString,
16
+ createdAt: Type.Integer({ minimum: 0 }),
17
+ steps: Type.Array(MeshPlanStepSchema, { minItems: 1, maxItems: 128 }),
18
+ }, { additionalProperties: false });
19
+ export const MeshPlanParamsSchema = Type.Object({
20
+ goal: NonEmptyString,
21
+ steps: Type.Optional(Type.Array(Type.Object({
22
+ id: Type.Optional(NonEmptyString),
23
+ name: Type.Optional(NonEmptyString),
24
+ prompt: NonEmptyString,
25
+ dependsOn: Type.Optional(Type.Array(NonEmptyString, { maxItems: 64 })),
26
+ agentId: Type.Optional(NonEmptyString),
27
+ sessionKey: Type.Optional(NonEmptyString),
28
+ thinking: Type.Optional(Type.String()),
29
+ timeoutMs: Type.Optional(Type.Integer({ minimum: 1_000, maximum: 3_600_000 })),
30
+ }, { additionalProperties: false }), { minItems: 1, maxItems: 128 })),
31
+ }, { additionalProperties: false });
32
+ export const MeshRunParamsSchema = Type.Object({
33
+ plan: MeshWorkflowPlanSchema,
34
+ continueOnError: Type.Optional(Type.Boolean()),
35
+ maxParallel: Type.Optional(Type.Integer({ minimum: 1, maximum: 16 })),
36
+ defaultStepTimeoutMs: Type.Optional(Type.Integer({ minimum: 1_000, maximum: 3_600_000 })),
37
+ lane: Type.Optional(Type.String()),
38
+ }, { additionalProperties: false });
39
+ export const MeshPlanAutoParamsSchema = Type.Object({
40
+ goal: NonEmptyString,
41
+ maxSteps: Type.Optional(Type.Integer({ minimum: 1, maximum: 16 })),
42
+ agentId: Type.Optional(NonEmptyString),
43
+ sessionKey: Type.Optional(NonEmptyString),
44
+ thinking: Type.Optional(Type.String()),
45
+ timeoutMs: Type.Optional(Type.Integer({ minimum: 1_000, maximum: 3_600_000 })),
46
+ lane: Type.Optional(Type.String()),
47
+ }, { additionalProperties: false });
48
+ export const MeshStatusParamsSchema = Type.Object({
49
+ runId: NonEmptyString,
50
+ }, { additionalProperties: false });
51
+ export const MeshRetryParamsSchema = Type.Object({
52
+ runId: NonEmptyString,
53
+ stepIds: Type.Optional(Type.Array(NonEmptyString, { minItems: 1, maxItems: 128 })),
54
+ }, { additionalProperties: false });
@@ -6,6 +6,7 @@ import { CronAddParamsSchema, CronJobSchema, CronListParamsSchema, CronRemovePar
6
6
  import { ExecApprovalsGetParamsSchema, ExecApprovalsNodeGetParamsSchema, ExecApprovalsNodeSetParamsSchema, ExecApprovalsSetParamsSchema, ExecApprovalsSnapshotSchema, ExecApprovalRequestParamsSchema, ExecApprovalResolveParamsSchema, } from "./exec-approvals.js";
7
7
  import { DevicePairApproveParamsSchema, DevicePairListParamsSchema, DevicePairRejectParamsSchema, DevicePairRequestedEventSchema, DevicePairResolvedEventSchema, DeviceTokenRevokeParamsSchema, DeviceTokenRotateParamsSchema, } from "./devices.js";
8
8
  import { ConnectParamsSchema, ErrorShapeSchema, EventFrameSchema, GatewayFrameSchema, HelloOkSchema, RequestFrameSchema, ResponseFrameSchema, ShutdownEventSchema, TickEventSchema, } from "./frames.js";
9
+ import { MeshPlanAutoParamsSchema, MeshPlanParamsSchema, MeshRetryParamsSchema, MeshRunParamsSchema, MeshStatusParamsSchema, MeshWorkflowPlanSchema, } from "./mesh.js";
9
10
  import { ChatAbortParamsSchema, ChatEventSchema, ChatHistoryParamsSchema, ChatInjectParamsSchema, ChatSendParamsSchema, LogsTailParamsSchema, LogsTailResultSchema, } from "./logs-chat.js";
10
11
  import { NodeDescribeParamsSchema, NodeEventParamsSchema, NodeInvokeParamsSchema, NodeInvokeResultParamsSchema, NodeInvokeRequestEventSchema, NodeListParamsSchema, NodePairApproveParamsSchema, NodePairListParamsSchema, NodePairRejectParamsSchema, NodePairRequestParamsSchema, NodePairVerifyParamsSchema, NodeRenameParamsSchema, } from "./nodes.js";
11
12
  import { SessionsCompactParamsSchema, SessionsDeleteParamsSchema, SessionsListParamsSchema, SessionsPatchParamsSchema, SessionsPreviewParamsSchema, SessionsResetParamsSchema, SessionsResolveParamsSchema, SessionsUsageParamsSchema, } from "./sessions.js";
@@ -127,5 +128,11 @@ export const ProtocolSchemas = {
127
128
  UpdateRunParams: UpdateRunParamsSchema,
128
129
  TickEvent: TickEventSchema,
129
130
  ShutdownEvent: ShutdownEventSchema,
131
+ MeshPlanParams: MeshPlanParamsSchema,
132
+ MeshPlanAutoParams: MeshPlanAutoParamsSchema,
133
+ MeshWorkflowPlan: MeshWorkflowPlanSchema,
134
+ MeshRunParams: MeshRunParamsSchema,
135
+ MeshStatusParams: MeshStatusParamsSchema,
136
+ MeshRetryParams: MeshRetryParamsSchema,
130
137
  };
131
138
  export const PROTOCOL_VERSION = 3;
@@ -13,4 +13,5 @@ export * from "./schema/protocol-schemas.js";
13
13
  export * from "./schema/sessions.js";
14
14
  export * from "./schema/snapshot.js";
15
15
  export * from "./schema/types.js";
16
+ export * from "./schema/mesh.js";
16
17
  export * from "./schema/wizard.js";
@@ -0,0 +1,54 @@
1
+ import { isGatewayCliClient, isWebchatClient } from "../../../utils/message-channel.js";
2
+ import { GATEWAY_CLIENT_IDS } from "../../protocol/client-info.js";
3
+ export function formatGatewayAuthFailureMessage(params) {
4
+ const { authMode, authProvided, reason, client } = params;
5
+ const isCli = isGatewayCliClient(client);
6
+ const isControlUi = client?.id === GATEWAY_CLIENT_IDS.CONTROL_UI;
7
+ const isWebchat = isWebchatClient(client);
8
+ const uiHint = "open the dashboard URL and paste the token in Control UI settings";
9
+ const tokenHint = isCli
10
+ ? "set gateway.remote.token to match gateway.auth.token"
11
+ : isControlUi || isWebchat
12
+ ? uiHint
13
+ : "provide gateway auth token";
14
+ const passwordHint = isCli
15
+ ? "set gateway.remote.password to match gateway.auth.password"
16
+ : isControlUi || isWebchat
17
+ ? "enter the password in Control UI settings"
18
+ : "provide gateway auth password";
19
+ switch (reason) {
20
+ case "token_missing":
21
+ return `unauthorized: gateway token missing (${tokenHint})`;
22
+ case "token_mismatch":
23
+ return `unauthorized: gateway token mismatch (${tokenHint})`;
24
+ case "token_missing_config":
25
+ return "unauthorized: gateway token not configured on gateway (set gateway.auth.token)";
26
+ case "password_missing":
27
+ return `unauthorized: gateway password missing (${passwordHint})`;
28
+ case "password_mismatch":
29
+ return `unauthorized: gateway password mismatch (${passwordHint})`;
30
+ case "password_missing_config":
31
+ return "unauthorized: gateway password not configured on gateway (set gateway.auth.password)";
32
+ case "tailscale_user_missing":
33
+ return "unauthorized: tailscale identity missing (use Tailscale Serve auth or gateway token/password)";
34
+ case "tailscale_proxy_missing":
35
+ return "unauthorized: tailscale proxy headers missing (use Tailscale Serve or gateway token/password)";
36
+ case "tailscale_whois_failed":
37
+ return "unauthorized: tailscale identity check failed (use Tailscale Serve auth or gateway token/password)";
38
+ case "tailscale_user_mismatch":
39
+ return "unauthorized: tailscale identity mismatch (use Tailscale Serve auth or gateway token/password)";
40
+ case "rate_limited":
41
+ return "unauthorized: too many failed authentication attempts (retry later)";
42
+ case "device_token_mismatch":
43
+ return "unauthorized: device token mismatch (rotate/reissue device token)";
44
+ default:
45
+ break;
46
+ }
47
+ if (authMode === "token" && authProvided === "none") {
48
+ return `unauthorized: gateway token missing (${tokenHint})`;
49
+ }
50
+ if (authMode === "password" && authProvided === "none") {
51
+ return `unauthorized: gateway password missing (${passwordHint})`;
52
+ }
53
+ return "unauthorized";
54
+ }