@poolzin/pool-bot 2026.3.25 → 2026.3.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/dist/agents/model-fallback.js +5 -4
  2. package/dist/agents/tools/common.js +16 -201
  3. package/dist/auto-reply/auto-reply/reply/agent-runner-execution.js +502 -0
  4. package/dist/auto-reply/auto-reply/reply/agent-runner-helpers.js +65 -0
  5. package/dist/auto-reply/auto-reply/reply/agent-runner-memory.js +160 -0
  6. package/dist/auto-reply/auto-reply/reply/agent-runner-payloads.js +85 -0
  7. package/dist/auto-reply/auto-reply/reply/agent-runner-utils.js +101 -0
  8. package/dist/auto-reply/auto-reply/reply/bash-command.js +338 -0
  9. package/dist/auto-reply/auto-reply/reply/block-streaming.js +91 -0
  10. package/dist/auto-reply/auto-reply/reply/commands-approve.js +88 -0
  11. package/dist/auto-reply/auto-reply/reply/commands-bash.js +26 -0
  12. package/dist/auto-reply/auto-reply/reply/commands-compact.js +107 -0
  13. package/dist/auto-reply/auto-reply/reply/commands-config.js +241 -0
  14. package/dist/auto-reply/auto-reply/reply/commands-context-report.js +295 -0
  15. package/dist/auto-reply/auto-reply/reply/commands-context.js +30 -0
  16. package/dist/auto-reply/auto-reply/reply/commands-core.js +151 -0
  17. package/dist/auto-reply/auto-reply/reply/commands-export-session.js +163 -0
  18. package/dist/auto-reply/auto-reply/reply/commands-info.js +184 -0
  19. package/dist/auto-reply/auto-reply/reply/commands-models.js +299 -0
  20. package/dist/auto-reply/auto-reply/reply/commands-plugin.js +35 -0
  21. package/dist/auto-reply/auto-reply/reply/commands-ptt.js +171 -0
  22. package/dist/auto-reply/auto-reply/reply/commands-setunset-standard.js +13 -0
  23. package/dist/auto-reply/auto-reply/reply/commands-setunset.js +73 -0
  24. package/dist/auto-reply/auto-reply/reply/commands-slash-parse.js +31 -0
  25. package/dist/auto-reply/auto-reply/reply/commands-status.js +178 -0
  26. package/dist/auto-reply/auto-reply/reply/commands-subagents.js +73 -0
  27. package/dist/auto-reply/auto-reply/reply/commands-system-prompt.js +117 -0
  28. package/dist/auto-reply/auto-reply/reply/commands-tts.js +231 -0
  29. package/dist/auto-reply/auto-reply/reply/directive-handling.impl.js +380 -0
  30. package/dist/auto-reply/auto-reply/reply/followup-runner.js +227 -0
  31. package/dist/auto-reply/auto-reply/reply/get-reply-directives-apply.js +201 -0
  32. package/dist/auto-reply/auto-reply/reply/get-reply-directives-utils.js +54 -0
  33. package/dist/auto-reply/auto-reply/reply/get-reply-directives.js +332 -0
  34. package/dist/auto-reply/auto-reply/reply/get-reply-inline-actions.js +258 -0
  35. package/dist/auto-reply/auto-reply/reply/get-reply-run.js +297 -0
  36. package/dist/auto-reply/auto-reply/reply/groups.js +102 -0
  37. package/dist/auto-reply/auto-reply/reply/mentions.js +129 -0
  38. package/dist/auto-reply/auto-reply/reply/reply-delivery.js +92 -0
  39. package/dist/auto-reply/auto-reply/reply/reply-directives.js +30 -0
  40. package/dist/auto-reply/auto-reply/reply/reply-dispatcher.js +152 -0
  41. package/dist/auto-reply/auto-reply/reply/reply-elevated.js +166 -0
  42. package/dist/auto-reply/auto-reply/reply/reply-inline.js +28 -0
  43. package/dist/auto-reply/auto-reply/reply/reply-payloads.js +114 -0
  44. package/dist/auto-reply/auto-reply/reply/reply-reference.js +36 -0
  45. package/dist/auto-reply/auto-reply/reply/reply-tags.js +13 -0
  46. package/dist/auto-reply/auto-reply/reply/reply-threading.js +41 -0
  47. package/dist/auto-reply/auto-reply/reply/session-updates.js +233 -0
  48. package/dist/auto-reply/auto-reply/reply/stage-sandbox-media.js +146 -0
  49. package/dist/build-info.json +3 -3
  50. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  51. package/dist/canvas-host/a2ui/a2ui.bundle.js +2 -17772
  52. package/dist/canvas-host/a2ui/index.html +1 -307
  53. package/dist/channels/channels/directory-config.js +185 -0
  54. package/dist/channels/channels/discord/handle-action.guild-admin.js +332 -0
  55. package/dist/channels/channels/discord/handle-action.js +165 -0
  56. package/dist/channels/channels/discord.js +413 -0
  57. package/dist/channels/channels/dock.js +436 -0
  58. package/dist/channels/channels/index.js +51 -0
  59. package/dist/channels/channels/plugins/outbound/discord.js +101 -0
  60. package/dist/channels/channels/whatsapp.js +17 -0
  61. package/dist/channels/plugins/types.js +1 -1
  62. package/dist/channels/run-state-machine.js +7 -0
  63. package/dist/commands/models/auth.js +47 -1
  64. package/dist/commands-subagents/action-agents.js +44 -0
  65. package/dist/commands-subagents/action-focus.js +64 -0
  66. package/dist/commands-subagents/action-help.js +4 -0
  67. package/dist/commands-subagents/action-info.js +45 -0
  68. package/dist/commands-subagents/action-kill.js +60 -0
  69. package/dist/commands-subagents/action-list.js +44 -0
  70. package/dist/commands-subagents/action-log.js +29 -0
  71. package/dist/commands-subagents/action-send.js +119 -0
  72. package/dist/commands-subagents/action-spawn.js +52 -0
  73. package/dist/commands-subagents/action-unfocus.js +30 -0
  74. package/dist/commands-subagents/shared.js +303 -0
  75. package/dist/config/config.js +1 -8
  76. package/dist/config/types.secrets.js +61 -0
  77. package/dist/control-ui/assets/{index-D7shnQwQ.js → index-umCsvrWy.js} +884 -741
  78. package/dist/control-ui/assets/index-umCsvrWy.js.map +1 -0
  79. package/dist/control-ui/assets/pt-BR-DedEVAvY.js +2 -0
  80. package/dist/control-ui/assets/pt-BR-DedEVAvY.js.map +1 -0
  81. package/dist/control-ui/assets/zh-CN-CDzeklK-.js +2 -0
  82. package/dist/control-ui/assets/zh-CN-CDzeklK-.js.map +1 -0
  83. package/dist/control-ui/assets/zh-TW-BJCRYNWH.js +2 -0
  84. package/dist/control-ui/assets/zh-TW-BJCRYNWH.js.map +1 -0
  85. package/dist/control-ui/index.html +1 -1
  86. package/dist/gateway/method-scopes.js +9 -1
  87. package/dist/gateway/node-pending-work.js +142 -0
  88. package/dist/gateway/protocol/index.js +5 -1
  89. package/dist/gateway/protocol/schema/nodes.js +18 -0
  90. package/dist/gateway/server-methods/nodes-pending.js +96 -0
  91. package/dist/gateway/server-methods-list.js +4 -0
  92. package/dist/gateway/server-methods.js +2 -0
  93. package/dist/imessage/channel.js +253 -0
  94. package/dist/imessage/monitor/echo-cache.js +70 -0
  95. package/dist/imessage/monitor/loop-rate-limiter.js +51 -0
  96. package/dist/imessage/monitor/reflection-guard.js +50 -0
  97. package/dist/imessage/monitor/sanitize-outbound.js +25 -0
  98. package/dist/imessage/monitor/self-chat-cache.js +75 -0
  99. package/dist/imessage/runtime.js +3 -0
  100. package/dist/infra/exec-approval-reply.js +7 -0
  101. package/dist/infra/tmp-openclaw-dir.js +84 -0
  102. package/dist/pairing/pairing-challenge.js +15 -0
  103. package/dist/plugin-sdk/account-id.d.ts +1 -0
  104. package/dist/plugin-sdk/agent-media-payload.d.ts +12 -0
  105. package/dist/plugin-sdk/allow-from.d.ts +27 -0
  106. package/dist/plugin-sdk/command-auth.d.ts +25 -0
  107. package/dist/plugin-sdk/command-auth.js +3 -1
  108. package/dist/plugin-sdk/config-paths.d.ts +6 -0
  109. package/dist/plugin-sdk/file-lock.d.ts +16 -0
  110. package/dist/plugin-sdk/index.d.ts +428 -0
  111. package/dist/plugin-sdk/index.js +237 -103
  112. package/dist/plugin-sdk/json-store.d.ts +5 -0
  113. package/dist/plugin-sdk/keyed-async-queue.d.ts +12 -0
  114. package/dist/plugin-sdk/onboarding.d.ts +11 -0
  115. package/dist/plugin-sdk/provider-auth-result.d.ts +14 -0
  116. package/dist/plugin-sdk/slack-message-actions.d.ts +11 -0
  117. package/dist/plugin-sdk/status-helpers.d.ts +25 -0
  118. package/dist/plugin-sdk/temp-path.d.ts +12 -0
  119. package/dist/plugin-sdk/text-chunking.d.ts +1 -0
  120. package/dist/plugin-sdk/tool-send.d.ts +4 -0
  121. package/dist/plugin-sdk/webhook-path.d.ts +6 -0
  122. package/dist/plugin-sdk/webhook-targets.d.ts +23 -0
  123. package/dist/plugin-sdk/windows-spawn.d.ts +39 -0
  124. package/dist/plugin-sdk-internal/accounts.js +6 -0
  125. package/dist/plugin-sdk-internal/discord.js +23 -0
  126. package/dist/plugin-sdk-internal/imessage.js +13 -0
  127. package/dist/plugin-sdk-internal/setup.js +9 -0
  128. package/dist/plugin-sdk-internal/signal.js +13 -0
  129. package/dist/plugin-sdk-internal/slack.js +22 -0
  130. package/dist/plugin-sdk-internal/telegram.js +32 -0
  131. package/dist/plugin-sdk-internal/whatsapp.js +29 -0
  132. package/dist/routing/session-key.js +4 -185
  133. package/dist/shared/pid-alive.js +2 -61
  134. package/dist/shared/process-scoped-map.js +5 -7
  135. package/dist/signal/channel.js +264 -0
  136. package/dist/signal/monitor/access-policy.js +60 -0
  137. package/dist/signal/runtime.js +3 -0
  138. package/dist/slack/account-inspect.js +135 -0
  139. package/dist/slack/blocks-input.js +7 -38
  140. package/dist/slack/channel.js +394 -0
  141. package/dist/slack/interactive-replies.js +28 -0
  142. package/dist/slack/monitor/channel-type.js +31 -0
  143. package/dist/slack/monitor/dm-auth.js +49 -0
  144. package/dist/slack/monitor/events/interactions.modal.js +137 -0
  145. package/dist/slack/monitor/events/message-subtype-handlers.js +68 -0
  146. package/dist/slack/monitor/events/system-event-context.js +29 -0
  147. package/dist/slack/monitor/events/system-event-test-harness.js +41 -0
  148. package/dist/slack/monitor/external-arg-menu-store.js +46 -0
  149. package/dist/slack/monitor/message-handler/prepare-content.js +69 -0
  150. package/dist/slack/monitor/message-handler/prepare-thread-context.js +91 -0
  151. package/dist/slack/monitor/message-handler/prepare.test-helpers.js +55 -0
  152. package/dist/slack/monitor/reconnect-policy.js +78 -0
  153. package/dist/slack/monitor/slash-commands.runtime.js +1 -0
  154. package/dist/slack/monitor/slash-dispatch.runtime.js +9 -0
  155. package/dist/slack/monitor/slash-skill-commands.runtime.js +1 -0
  156. package/dist/slack/resolve-allowlist-common.js +36 -0
  157. package/dist/slack/runtime.js +3 -0
  158. package/dist/slack/sent-thread-cache.js +61 -0
  159. package/dist/slack/truncate.js +10 -0
  160. package/dist/telegram/account-inspect.js +175 -0
  161. package/dist/telegram/allow-from.js +10 -0
  162. package/dist/telegram/api-fetch.js +18 -0
  163. package/dist/telegram/approval-buttons.js +30 -0
  164. package/dist/telegram/audit-membership-runtime.js +61 -0
  165. package/dist/telegram/bot/delivery.replies.js +508 -0
  166. package/dist/telegram/bot/delivery.resolve-media.js +227 -0
  167. package/dist/telegram/bot/delivery.send.js +132 -0
  168. package/dist/telegram/bot/reply-threading.js +46 -0
  169. package/dist/telegram/bot-message-context.body.js +186 -0
  170. package/dist/telegram/bot-message-context.session.js +207 -0
  171. package/dist/telegram/bot-message-context.types.js +1 -0
  172. package/dist/telegram/bot-native-commands.test-helpers.js +117 -0
  173. package/dist/telegram/bot.media.e2e-harness.js +81 -0
  174. package/dist/telegram/bot.media.test-utils.js +81 -0
  175. package/dist/telegram/channel-actions.js +225 -0
  176. package/dist/telegram/channel.js +515 -0
  177. package/dist/telegram/conversation-route.js +107 -0
  178. package/dist/telegram/delivery.js +2 -0
  179. package/dist/telegram/delivery.replies.js +508 -0
  180. package/dist/telegram/dm-access.js +86 -0
  181. package/dist/telegram/draft-stream.test-helpers.js +62 -0
  182. package/dist/telegram/exec-approvals-handler.js +281 -0
  183. package/dist/telegram/exec-approvals.js +62 -0
  184. package/dist/telegram/forum-service-message.js +22 -0
  185. package/dist/telegram/group-config-helpers.js +10 -0
  186. package/dist/telegram/lane-delivery-state.js +19 -0
  187. package/dist/telegram/lane-delivery-text-deliverer.js +357 -0
  188. package/dist/telegram/lane-delivery.js +2 -0
  189. package/dist/telegram/normalize.js +37 -0
  190. package/dist/telegram/onboarding.js +192 -0
  191. package/dist/telegram/outbound-adapter.js +100 -0
  192. package/dist/telegram/polling-session.js +275 -0
  193. package/dist/telegram/runtime.js +3 -0
  194. package/dist/telegram/sendchataction-401-backoff.js +71 -0
  195. package/dist/telegram/sequential-key.js +46 -0
  196. package/dist/telegram/status-issues.js +105 -0
  197. package/dist/telegram/target-writeback.js +165 -0
  198. package/dist/telegram/thread-bindings.js +560 -0
  199. package/dist/utils.js +32 -257
  200. package/dist/wizard/prompts.js +5 -5
  201. package/extensions/feishu/src/policy.ts +1 -1
  202. package/extensions/firecrawl/index.test.ts +82 -0
  203. package/extensions/firecrawl/index.ts +20 -0
  204. package/extensions/firecrawl/openclaw.plugin.json +8 -0
  205. package/extensions/firecrawl/package.json +12 -0
  206. package/extensions/firecrawl/src/config.ts +159 -0
  207. package/extensions/firecrawl/src/firecrawl-client.ts +446 -0
  208. package/extensions/firecrawl/src/firecrawl-scrape-tool.ts +89 -0
  209. package/extensions/firecrawl/src/firecrawl-search-provider.ts +63 -0
  210. package/extensions/firecrawl/src/firecrawl-search-tool.ts +76 -0
  211. package/package.json +1 -1
  212. package/dist/.buildstamp +0 -1
  213. package/dist/acp/bindings-store.js +0 -209
  214. package/dist/acp/control-plane/runtime-cache.js +0 -54
  215. package/dist/acp/control-plane/runtime-options.js +0 -215
  216. package/dist/acp/control-plane/session-actor-queue.js +0 -36
  217. package/dist/acp/index.js +0 -2
  218. package/dist/acp/runtime/errors.js +0 -47
  219. package/dist/acp/runtime/registry.js +0 -86
  220. package/dist/acp/secret-file.js +0 -22
  221. package/dist/agents/auth-profiles.resolve-auth-profile-order.fixtures.js +0 -23
  222. package/dist/agents/bash-process-registry.test-helpers.js +0 -29
  223. package/dist/agents/bash-tools.exec-approval-request.js +0 -20
  224. package/dist/agents/bash-tools.exec-host-gateway.js +0 -240
  225. package/dist/agents/bash-tools.exec-host-node.js +0 -235
  226. package/dist/agents/checkpoint-manager.js +0 -290
  227. package/dist/agents/claude-cli-runner.js +0 -3
  228. package/dist/agents/error-classifier.js +0 -251
  229. package/dist/agents/live-model-filter.js +0 -84
  230. package/dist/agents/nvidia-models.js +0 -228
  231. package/dist/agents/pi-embedded-runner/run.overflow-compaction.fixture.js +0 -34
  232. package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +0 -156
  233. package/dist/agents/pi-embedded-subscribe.handlers.tools.media.test-helpers.js +0 -30
  234. package/dist/agents/provider/config-loader.js +0 -76
  235. package/dist/agents/provider/index.js +0 -15
  236. package/dist/agents/provider/models-dev.js +0 -129
  237. package/dist/agents/provider/session-binding.js +0 -376
  238. package/dist/agents/queued-file-writer.js +0 -22
  239. package/dist/agents/skills/bundled-context.js +0 -23
  240. package/dist/agents/skills/security.js +0 -211
  241. package/dist/agents/skills/tools-dir.js +0 -9
  242. package/dist/agents/skills-install-download.js +0 -290
  243. package/dist/agents/skills-install-output.js +0 -30
  244. package/dist/agents/skills-install.download-test-utils.js +0 -36
  245. package/dist/agents/skills.test-helpers.js +0 -13
  246. package/dist/agents/subagent-announce-reliability.js +0 -160
  247. package/dist/agents/subagent-registry.mocks.shared.js +0 -12
  248. package/dist/agents/test-helpers/assistant-message-fixtures.js +0 -29
  249. package/dist/agents/test-helpers/fast-coding-tools.js +0 -1
  250. package/dist/agents/test-helpers/fast-core-tools.js +0 -8
  251. package/dist/agents/test-helpers/fast-tool-stubs.js +0 -18
  252. package/dist/agents/test-helpers/host-sandbox-fs-bridge.js +0 -74
  253. package/dist/agents/test-helpers/pi-tools-sandbox-context.js +0 -27
  254. package/dist/agents/tool-display-common.js +0 -915
  255. package/dist/agents/tool-policy-shared.js +0 -108
  256. package/dist/agents/tool-policy.conformance.js +0 -14
  257. package/dist/agents/tool-result-truncation.js +0 -299
  258. package/dist/agents/tools/cron-tool.test-helpers.js +0 -12
  259. package/dist/agents/tools/discord-actions-moderation-shared.js +0 -27
  260. package/dist/agents/tools/discord-actions-presence.js +0 -78
  261. package/dist/control-ui/assets/index-D7shnQwQ.js.map +0 -1
  262. package/dist/discord/discord-improvements.js +0 -167
  263. package/dist/discord/index.js +0 -2
  264. package/dist/hooks/bundled/boot-md/HOOK.md +0 -19
  265. package/dist/hooks/bundled/command-logger/HOOK.md +0 -122
  266. package/dist/hooks/bundled/session-memory/HOOK.md +0 -86
  267. package/dist/hooks/bundled/soul-evil/HOOK.md +0 -71
  268. package/dist/whatsapp/normalize.js +0 -66
  269. package/dist/whatsapp/resolve-outbound-target.js +0 -42
  270. /package/dist/{acp/runtime/types.js → auto-reply/auto-reply/reply/commands-types.js} +0 -0
  271. /package/dist/{agents/pi-embedded-payloads.js → slack/account-surface-fields.js} +0 -0
@@ -0,0 +1,2 @@
1
+ const e={common:{health:"Saúde",ok:"OK",offline:"Offline",connect:"Conectar",refresh:"Atualizar",enabled:"Ativado",disabled:"Desativado",na:"n/a",docs:"Docs",resources:"Recursos"},nav:{chat:"Chat",control:"Controle",agent:"Agente",settings:"Configurações",expand:"Expandir barra lateral",collapse:"Recolher barra lateral"},tabs:{agents:"Agentes",overview:"Visão Geral",channels:"Canais",instances:"Instâncias",sessions:"Sessões",usage:"Uso",cron:"Tarefas Cron",skills:"Habilidades",nodes:"Nós",chat:"Chat",config:"Config",debug:"Debug",logs:"Logs"},subtitles:{agents:"Gerenciar espaços de trabalho, ferramentas e identidades de agentes.",overview:"Status do gateway, pontos de entrada e leitura rápida de saúde.",channels:"Gerenciar canais e configurações.",instances:"Beacons de presença de clientes e nós conectados.",sessions:"Inspecionar sessões ativas e ajustar padrões por sessão.",usage:"Monitorar uso e custos da API.",cron:"Agendar despertares e execuções recorrentes de agentes.",skills:"Gerenciar disponibilidade de habilidades e injeção de chaves de API.",nodes:"Dispositivos pareados, capacidades e exposição de comandos.",chat:"Sessão de chat direta com o gateway para intervenções rápidas.",config:"Editar ~/.poolbot/poolbot.json com segurança.",debug:"Snapshots do gateway, eventos e chamadas RPC manuais.",logs:"Acompanhamento ao vivo dos logs de arquivo do gateway."},overview:{access:{title:"Acesso ao Gateway",subtitle:"Onde o dashboard se conecta e como ele se autentica.",wsUrl:"URL WebSocket",token:"Token do Gateway",password:"Senha (não armazenada)",sessionKey:"Chave de Sessão Padrão",language:"Idioma",connectHint:"Clique em Conectar para aplicar as alterações de conexão.",trustedProxy:"Autenticado por proxy confiável."},snapshot:{title:"Snapshot",subtitle:"Informações mais recentes do handshake do gateway.",status:"Status",uptime:"Tempo de Atividade",tickInterval:"Intervalo de Tick",lastChannelsRefresh:"Última Atualização de Canais",channelsHint:"Use Canais para vincular WhatsApp, Telegram, Discord, Signal ou iMessage."},stats:{instances:"Instâncias",instancesHint:"Beacons de presença nos últimos 5 minutos.",sessions:"Sessões",sessionsHint:"Chaves de sessão recentes rastreadas pelo gateway.",cron:"Cron",cronNext:"Próximo despertar {time}"},notes:{title:"Notas",subtitle:"Lembretes rápidos para configurações de controle remoto.",tailscaleTitle:"Tailscale serve",tailscaleText:"Prefira o modo serve para manter o gateway em loopback com autenticação tailnet.",sessionTitle:"Higiene de sessão",sessionText:"Use /new ou sessions.patch para redefinir o contexto.",cronTitle:"Lembretes de Cron",cronText:"Use sessões isoladas para execuções recorrentes."},auth:{required:"Este gateway requer autenticação. Adicione um token ou senha e clique em Conectar.",failed:"Falha na autenticação. Recopie uma URL com token usando {command}, ou atualize o token e clique em Conectar."},insecure:{hint:"Esta página é HTTP, então o navegador bloqueia a identidade do dispositivo. Use HTTPS (Tailscale Serve) ou abra {url} no host do gateway.",stayHttp:"Se você precisar permanecer em HTTP, defina {config} (apenas token)."}},chat:{disconnected:"Desconectado do gateway.",refreshTitle:"Atualizar dados do chat",thinkingToggle:"Alternar saída de pensamento/trabalho do assistente",focusToggle:"Alternar modo de foco (ocultar barra lateral + cabeçalho da página)",onboardingDisabled:"Desativado durante a integração"},languages:{en:"English",zhCN:"简体中文 (Chinês Simplificado)",zhTW:"繁體中文 (Chinês Tradicional)",ptBR:"Português (Português Brasileiro)"}};export{e as pt_BR};
2
+ //# sourceMappingURL=pt-BR-DedEVAvY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pt-BR-DedEVAvY.js","sources":["../../../ui/src/i18n/locales/pt-BR.ts"],"sourcesContent":["import type { TranslationMap } from \"../lib/types.ts\";\n\nexport const pt_BR: TranslationMap = {\n common: {\n health: \"Saúde\",\n ok: \"OK\",\n offline: \"Offline\",\n connect: \"Conectar\",\n refresh: \"Atualizar\",\n enabled: \"Ativado\",\n disabled: \"Desativado\",\n na: \"n/a\",\n docs: \"Docs\",\n resources: \"Recursos\",\n },\n nav: {\n chat: \"Chat\",\n control: \"Controle\",\n agent: \"Agente\",\n settings: \"Configurações\",\n expand: \"Expandir barra lateral\",\n collapse: \"Recolher barra lateral\",\n },\n tabs: {\n agents: \"Agentes\",\n overview: \"Visão Geral\",\n channels: \"Canais\",\n instances: \"Instâncias\",\n sessions: \"Sessões\",\n usage: \"Uso\",\n cron: \"Tarefas Cron\",\n skills: \"Habilidades\",\n nodes: \"Nós\",\n chat: \"Chat\",\n config: \"Config\",\n debug: \"Debug\",\n logs: \"Logs\",\n },\n subtitles: {\n agents: \"Gerenciar espaços de trabalho, ferramentas e identidades de agentes.\",\n overview: \"Status do gateway, pontos de entrada e leitura rápida de saúde.\",\n channels: \"Gerenciar canais e configurações.\",\n instances: \"Beacons de presença de clientes e nós conectados.\",\n sessions: \"Inspecionar sessões ativas e ajustar padrões por sessão.\",\n usage: \"Monitorar uso e custos da API.\",\n cron: \"Agendar despertares e execuções recorrentes de agentes.\",\n skills: \"Gerenciar disponibilidade de habilidades e injeção de chaves de API.\",\n nodes: \"Dispositivos pareados, capacidades e exposição de comandos.\",\n chat: \"Sessão de chat direta com o gateway para intervenções rápidas.\",\n config: \"Editar ~/.poolbot/poolbot.json com segurança.\",\n debug: \"Snapshots do gateway, eventos e chamadas RPC manuais.\",\n logs: \"Acompanhamento ao vivo dos logs de arquivo do gateway.\",\n },\n overview: {\n access: {\n title: \"Acesso ao Gateway\",\n subtitle: \"Onde o dashboard se conecta e como ele se autentica.\",\n wsUrl: \"URL WebSocket\",\n token: \"Token do Gateway\",\n password: \"Senha (não armazenada)\",\n sessionKey: \"Chave de Sessão Padrão\",\n language: \"Idioma\",\n connectHint: \"Clique em Conectar para aplicar as alterações de conexão.\",\n trustedProxy: \"Autenticado por proxy confiável.\",\n },\n snapshot: {\n title: \"Snapshot\",\n subtitle: \"Informações mais recentes do handshake do gateway.\",\n status: \"Status\",\n uptime: \"Tempo de Atividade\",\n tickInterval: \"Intervalo de Tick\",\n lastChannelsRefresh: \"Última Atualização de Canais\",\n channelsHint: \"Use Canais para vincular WhatsApp, Telegram, Discord, Signal ou iMessage.\",\n },\n stats: {\n instances: \"Instâncias\",\n instancesHint: \"Beacons de presença nos últimos 5 minutos.\",\n sessions: \"Sessões\",\n sessionsHint: \"Chaves de sessão recentes rastreadas pelo gateway.\",\n cron: \"Cron\",\n cronNext: \"Próximo despertar {time}\",\n },\n notes: {\n title: \"Notas\",\n subtitle: \"Lembretes rápidos para configurações de controle remoto.\",\n tailscaleTitle: \"Tailscale serve\",\n tailscaleText:\n \"Prefira o modo serve para manter o gateway em loopback com autenticação tailnet.\",\n sessionTitle: \"Higiene de sessão\",\n sessionText: \"Use /new ou sessions.patch para redefinir o contexto.\",\n cronTitle: \"Lembretes de Cron\",\n cronText: \"Use sessões isoladas para execuções recorrentes.\",\n },\n auth: {\n required:\n \"Este gateway requer autenticação. Adicione um token ou senha e clique em Conectar.\",\n failed:\n \"Falha na autenticação. Recopie uma URL com token usando {command}, ou atualize o token e clique em Conectar.\",\n },\n insecure: {\n hint: \"Esta página é HTTP, então o navegador bloqueia a identidade do dispositivo. Use HTTPS (Tailscale Serve) ou abra {url} no host do gateway.\",\n stayHttp: \"Se você precisar permanecer em HTTP, defina {config} (apenas token).\",\n },\n },\n chat: {\n disconnected: \"Desconectado do gateway.\",\n refreshTitle: \"Atualizar dados do chat\",\n thinkingToggle: \"Alternar saída de pensamento/trabalho do assistente\",\n focusToggle: \"Alternar modo de foco (ocultar barra lateral + cabeçalho da página)\",\n onboardingDisabled: \"Desativado durante a integração\",\n },\n languages: {\n en: \"English\",\n zhCN: \"简体中文 (Chinês Simplificado)\",\n zhTW: \"繁體中文 (Chinês Tradicional)\",\n ptBR: \"Português (Português Brasileiro)\",\n },\n};\n"],"names":["pt_BR"],"mappings":"AAEO,MAAMA,EAAwB,CACnC,OAAQ,CACN,OAAQ,QACR,GAAI,KACJ,QAAS,UACT,QAAS,WACT,QAAS,YACT,QAAS,UACT,SAAU,aACV,GAAI,MACJ,KAAM,OACN,UAAW,UAAA,EAEb,IAAK,CACH,KAAM,OACN,QAAS,WACT,MAAO,SACP,SAAU,gBACV,OAAQ,yBACR,SAAU,wBAAA,EAEZ,KAAM,CACJ,OAAQ,UACR,SAAU,cACV,SAAU,SACV,UAAW,aACX,SAAU,UACV,MAAO,MACP,KAAM,eACN,OAAQ,cACR,MAAO,MACP,KAAM,OACN,OAAQ,SACR,MAAO,QACP,KAAM,MAAA,EAER,UAAW,CACT,OAAQ,uEACR,SAAU,kEACV,SAAU,oCACV,UAAW,oDACX,SAAU,2DACV,MAAO,iCACP,KAAM,0DACN,OAAQ,uEACR,MAAO,8DACP,KAAM,iEACN,OAAQ,gDACR,MAAO,wDACP,KAAM,wDAAA,EAER,SAAU,CACR,OAAQ,CACN,MAAO,oBACP,SAAU,uDACV,MAAO,gBACP,MAAO,mBACP,SAAU,yBACV,WAAY,yBACZ,SAAU,SACV,YAAa,4DACb,aAAc,kCAAA,EAEhB,SAAU,CACR,MAAO,WACP,SAAU,qDACV,OAAQ,SACR,OAAQ,qBACR,aAAc,oBACd,oBAAqB,+BACrB,aAAc,2EAAA,EAEhB,MAAO,CACL,UAAW,aACX,cAAe,6CACf,SAAU,UACV,aAAc,qDACd,KAAM,OACN,SAAU,0BAAA,EAEZ,MAAO,CACL,MAAO,QACP,SAAU,2DACV,eAAgB,kBAChB,cACE,mFACF,aAAc,oBACd,YAAa,wDACb,UAAW,oBACX,SAAU,kDAAA,EAEZ,KAAM,CACJ,SACE,qFACF,OACE,8GAAA,EAEJ,SAAU,CACR,KAAM,4IACN,SAAU,sEAAA,CACZ,EAEF,KAAM,CACJ,aAAc,2BACd,aAAc,0BACd,eAAgB,sDAChB,YAAa,sEACb,mBAAoB,iCAAA,EAEtB,UAAW,CACT,GAAI,UACJ,KAAM,6BACN,KAAM,4BACN,KAAM,kCAAA,CAEV"}
@@ -0,0 +1,2 @@
1
+ const e={common:{health:"健康状况",ok:"正常",offline:"离线",connect:"连接",refresh:"刷新",enabled:"已启用",disabled:"已禁用",na:"不适用",docs:"文档",resources:"资源"},nav:{chat:"聊天",control:"控制",agent:"代理",settings:"设置",expand:"展开侧边栏",collapse:"折叠侧边栏"},tabs:{agents:"代理",overview:"概览",channels:"频道",instances:"实例",sessions:"会话",usage:"使用情况",cron:"定时任务",skills:"技能",nodes:"节点",chat:"聊天",config:"配置",debug:"调试",logs:"日志"},subtitles:{agents:"管理代理工作区、工具和身份。",overview:"网关状态、入口点和快速健康读取。",channels:"管理频道和设置。",instances:"来自已连接客户端和节点的在线信号。",sessions:"检查活动会话并调整每个会话的默认设置。",usage:"监控 API 使用情况和成本。",cron:"安排唤醒和重复的代理运行。",skills:"管理技能可用性和 API 密钥注入。",nodes:"配对设备、功能和命令公开。",chat:"用于快速干预的直接网关聊天会话。",config:"安全地编辑 ~/.poolbot/poolbot.json。",debug:"网关快照、事件和手动 RPC 调用。",logs:"网关文件日志的实时追踪。"},overview:{access:{title:"网关访问",subtitle:"仪表板连接的位置及其身份验证方式。",wsUrl:"WebSocket URL",token:"网关令牌",password:"密码 (不存储)",sessionKey:"默认会话密钥",language:"语言",connectHint:"点击连接以应用连接更改。",trustedProxy:"通过受信任代理认证。"},snapshot:{title:"快照",subtitle:"最新的网关握手信息。",status:"状态",uptime:"运行时间",tickInterval:"刻度间隔",lastChannelsRefresh:"最后频道刷新",channelsHint:"使用频道链接 WhatsApp、Telegram、Discord、Signal 或 iMessage。"},stats:{instances:"实例",instancesHint:"过去 5 分钟内的在线信号。",sessions:"会话",sessionsHint:"网关跟踪的最近会话密钥。",cron:"定时任务",cronNext:"下次唤醒 {time}"},notes:{title:"备注",subtitle:"远程控制设置的快速提醒。",tailscaleTitle:"Tailscale serve",tailscaleText:"首选 serve 模式以通过 tailnet 身份验证将网关保持在回环地址。",sessionTitle:"会话清理",sessionText:"使用 /new 或 sessions.patch 重置上下文。",cronTitle:"定时任务提醒",cronText:"为重复运行使用隔离的会话。"},auth:{required:"此网关需要身份验证。添加令牌或密码,然后点击连接。",failed:"身份验证失败。请使用 {command} 重新复制令牌化 URL,或更新令牌,然后点击连接。"},insecure:{hint:"此页面为 HTTP,因此浏览器阻止设备标识。请使用 HTTPS (Tailscale Serve) 或在网关主机上打开 {url}。",stayHttp:"如果您必须保持 HTTP,请设置 {config} (仅限令牌)。"}},chat:{disconnected:"已断开与网关的连接。",refreshTitle:"刷新聊天数据",thinkingToggle:"切换助手思考/工作输出",focusToggle:"切换专注模式 (隐藏侧边栏 + 页面页眉)",onboardingDisabled:"引导期间禁用"},languages:{en:"English",zhCN:"简体中文 (简体中文)",zhTW:"繁體中文 (繁体中文)",ptBR:"Português (巴西葡萄牙语)"}};export{e as zh_CN};
2
+ //# sourceMappingURL=zh-CN-CDzeklK-.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zh-CN-CDzeklK-.js","sources":["../../../ui/src/i18n/locales/zh-CN.ts"],"sourcesContent":["import type { TranslationMap } from \"../lib/types.ts\";\n\nexport const zh_CN: TranslationMap = {\n common: {\n health: \"健康状况\",\n ok: \"正常\",\n offline: \"离线\",\n connect: \"连接\",\n refresh: \"刷新\",\n enabled: \"已启用\",\n disabled: \"已禁用\",\n na: \"不适用\",\n docs: \"文档\",\n resources: \"资源\",\n },\n nav: {\n chat: \"聊天\",\n control: \"控制\",\n agent: \"代理\",\n settings: \"设置\",\n expand: \"展开侧边栏\",\n collapse: \"折叠侧边栏\",\n },\n tabs: {\n agents: \"代理\",\n overview: \"概览\",\n channels: \"频道\",\n instances: \"实例\",\n sessions: \"会话\",\n usage: \"使用情况\",\n cron: \"定时任务\",\n skills: \"技能\",\n nodes: \"节点\",\n chat: \"聊天\",\n config: \"配置\",\n debug: \"调试\",\n logs: \"日志\",\n },\n subtitles: {\n agents: \"管理代理工作区、工具和身份。\",\n overview: \"网关状态、入口点和快速健康读取。\",\n channels: \"管理频道和设置。\",\n instances: \"来自已连接客户端和节点的在线信号。\",\n sessions: \"检查活动会话并调整每个会话的默认设置。\",\n usage: \"监控 API 使用情况和成本。\",\n cron: \"安排唤醒和重复的代理运行。\",\n skills: \"管理技能可用性和 API 密钥注入。\",\n nodes: \"配对设备、功能和命令公开。\",\n chat: \"用于快速干预的直接网关聊天会话。\",\n config: \"安全地编辑 ~/.poolbot/poolbot.json。\",\n debug: \"网关快照、事件和手动 RPC 调用。\",\n logs: \"网关文件日志的实时追踪。\",\n },\n overview: {\n access: {\n title: \"网关访问\",\n subtitle: \"仪表板连接的位置及其身份验证方式。\",\n wsUrl: \"WebSocket URL\",\n token: \"网关令牌\",\n password: \"密码 (不存储)\",\n sessionKey: \"默认会话密钥\",\n language: \"语言\",\n connectHint: \"点击连接以应用连接更改。\",\n trustedProxy: \"通过受信任代理认证。\",\n },\n snapshot: {\n title: \"快照\",\n subtitle: \"最新的网关握手信息。\",\n status: \"状态\",\n uptime: \"运行时间\",\n tickInterval: \"刻度间隔\",\n lastChannelsRefresh: \"最后频道刷新\",\n channelsHint: \"使用频道链接 WhatsApp、Telegram、Discord、Signal 或 iMessage。\",\n },\n stats: {\n instances: \"实例\",\n instancesHint: \"过去 5 分钟内的在线信号。\",\n sessions: \"会话\",\n sessionsHint: \"网关跟踪的最近会话密钥。\",\n cron: \"定时任务\",\n cronNext: \"下次唤醒 {time}\",\n },\n notes: {\n title: \"备注\",\n subtitle: \"远程控制设置的快速提醒。\",\n tailscaleTitle: \"Tailscale serve\",\n tailscaleText: \"首选 serve 模式以通过 tailnet 身份验证将网关保持在回环地址。\",\n sessionTitle: \"会话清理\",\n sessionText: \"使用 /new 或 sessions.patch 重置上下文。\",\n cronTitle: \"定时任务提醒\",\n cronText: \"为重复运行使用隔离的会话。\",\n },\n auth: {\n required: \"此网关需要身份验证。添加令牌或密码,然后点击连接。\",\n failed: \"身份验证失败。请使用 {command} 重新复制令牌化 URL,或更新令牌,然后点击连接。\",\n },\n insecure: {\n hint: \"此页面为 HTTP,因此浏览器阻止设备标识。请使用 HTTPS (Tailscale Serve) 或在网关主机上打开 {url}。\",\n stayHttp: \"如果您必须保持 HTTP,请设置 {config} (仅限令牌)。\",\n },\n },\n chat: {\n disconnected: \"已断开与网关的连接。\",\n refreshTitle: \"刷新聊天数据\",\n thinkingToggle: \"切换助手思考/工作输出\",\n focusToggle: \"切换专注模式 (隐藏侧边栏 + 页面页眉)\",\n onboardingDisabled: \"引导期间禁用\",\n },\n languages: {\n en: \"English\",\n zhCN: \"简体中文 (简体中文)\",\n zhTW: \"繁體中文 (繁体中文)\",\n ptBR: \"Português (巴西葡萄牙语)\",\n },\n};\n"],"names":["zh_CN"],"mappings":"AAEO,MAAMA,EAAwB,CACnC,OAAQ,CACN,OAAQ,OACR,GAAI,KACJ,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,MACT,SAAU,MACV,GAAI,MACJ,KAAM,KACN,UAAW,IAAA,EAEb,IAAK,CACH,KAAM,KACN,QAAS,KACT,MAAO,KACP,SAAU,KACV,OAAQ,QACR,SAAU,OAAA,EAEZ,KAAM,CACJ,OAAQ,KACR,SAAU,KACV,SAAU,KACV,UAAW,KACX,SAAU,KACV,MAAO,OACP,KAAM,OACN,OAAQ,KACR,MAAO,KACP,KAAM,KACN,OAAQ,KACR,MAAO,KACP,KAAM,IAAA,EAER,UAAW,CACT,OAAQ,iBACR,SAAU,mBACV,SAAU,WACV,UAAW,oBACX,SAAU,sBACV,MAAO,kBACP,KAAM,gBACN,OAAQ,qBACR,MAAO,gBACP,KAAM,mBACN,OAAQ,iCACR,MAAO,qBACP,KAAM,cAAA,EAER,SAAU,CACR,OAAQ,CACN,MAAO,OACP,SAAU,oBACV,MAAO,gBACP,MAAO,OACP,SAAU,WACV,WAAY,SACZ,SAAU,KACV,YAAa,eACb,aAAc,YAAA,EAEhB,SAAU,CACR,MAAO,KACP,SAAU,aACV,OAAQ,KACR,OAAQ,OACR,aAAc,OACd,oBAAqB,SACrB,aAAc,qDAAA,EAEhB,MAAO,CACL,UAAW,KACX,cAAe,iBACf,SAAU,KACV,aAAc,eACd,KAAM,OACN,SAAU,aAAA,EAEZ,MAAO,CACL,MAAO,KACP,SAAU,eACV,eAAgB,kBAChB,cAAe,yCACf,aAAc,OACd,YAAa,kCACb,UAAW,SACX,SAAU,eAAA,EAEZ,KAAM,CACJ,SAAU,4BACV,OAAQ,gDAAA,EAEV,SAAU,CACR,KAAM,qEACN,SAAU,mCAAA,CACZ,EAEF,KAAM,CACJ,aAAc,aACd,aAAc,SACd,eAAgB,cAChB,YAAa,wBACb,mBAAoB,QAAA,EAEtB,UAAW,CACT,GAAI,UACJ,KAAM,cACN,KAAM,cACN,KAAM,oBAAA,CAEV"}
@@ -0,0 +1,2 @@
1
+ const e={common:{health:"健康狀況",ok:"正常",offline:"離線",connect:"連接",refresh:"刷新",enabled:"已啟用",disabled:"已禁用",na:"不適用",docs:"文檔",resources:"資源"},nav:{chat:"聊天",control:"控制",agent:"代理",settings:"設置",expand:"展開側邊欄",collapse:"折疊側邊欄"},tabs:{agents:"代理",overview:"概覽",channels:"頻道",instances:"實例",sessions:"會話",usage:"使用情況",cron:"定時任務",skills:"技能",nodes:"節點",chat:"聊天",config:"配置",debug:"調試",logs:"日誌"},subtitles:{agents:"管理代理工作區、工具和身份。",overview:"網關狀態、入口點和快速健康讀取。",channels:"管理頻道和設置。",instances:"來自已連接客戶端和節點的在線信號。",sessions:"檢查活動會話並調整每個會話的默認設置。",usage:"監控 API 使用情況和成本。",cron:"安排喚醒和重複的代理運行。",skills:"管理技能可用性和 API 密鑰注入。",nodes:"配對設備、功能和命令公開。",chat:"用於快速干預的直接網關聊天會話。",config:"安全地編輯 ~/.poolbot/poolbot.json。",debug:"網關快照、事件和手動 RPC 調用。",logs:"網關文件日志的實時追蹤。"},overview:{access:{title:"網關訪問",subtitle:"儀表板連接的位置及其身份驗證方式。",wsUrl:"WebSocket URL",token:"網關令牌",password:"密碼 (不存儲)",sessionKey:"默認會話密鑰",language:"語言",connectHint:"點擊連接以應用連接更改。",trustedProxy:"通過受信任代理身份驗證。"},snapshot:{title:"快照",subtitle:"最新的網關握手信息。",status:"狀態",uptime:"運行時間",tickInterval:"刻度間隔",lastChannelsRefresh:"最後頻道刷新",channelsHint:"使用頻道鏈接 WhatsApp、Telegram、Discord、Signal 或 iMessage。"},stats:{instances:"實例",instancesHint:"過去 5 分鐘內的在線信號。",sessions:"會話",sessionsHint:"網關跟蹤的最近會話密鑰。",cron:"定時任務",cronNext:"下次喚醒 {time}"},notes:{title:"備註",subtitle:"遠程控制設置的快速提醒。",tailscaleTitle:"Tailscale serve",tailscaleText:"首選 serve 模式以通過 tailnet 身份驗證將網關保持在回環地址。",sessionTitle:"會話清理",sessionText:"使用 /new 或 sessions.patch 重置上下文。",cronTitle:"定時任務提醒",cronText:"為重複運行使用隔離的會話。"},auth:{required:"此網關需要身份驗證。添加令牌或密碼,然後點擊連接。",failed:"身份驗證失敗。請使用 {command} 重新複製令牌化 URL,或更新令牌,然後點擊連接。"},insecure:{hint:"此頁面為 HTTP,因此瀏覽器阻止設備標識。請使用 HTTPS (Tailscale Serve) 或在網關主機上打開 {url}。",stayHttp:"如果您必須保持 HTTP,請設置 {config} (僅限令牌)。"}},chat:{disconnected:"已斷開與網關的連接。",refreshTitle:"刷新聊天數據",thinkingToggle:"切換助手思考/工作輸出",focusToggle:"切換專注模式 (隱藏側邊欄 + 頁面頁眉)",onboardingDisabled:"引導期間禁用"},languages:{en:"English",zhCN:"简体中文 (簡體中文)",zhTW:"繁體中文 (繁體中文)",ptBR:"Português (巴西葡萄牙語)"}};export{e as zh_TW};
2
+ //# sourceMappingURL=zh-TW-BJCRYNWH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zh-TW-BJCRYNWH.js","sources":["../../../ui/src/i18n/locales/zh-TW.ts"],"sourcesContent":["import type { TranslationMap } from \"../lib/types.ts\";\n\nexport const zh_TW: TranslationMap = {\n common: {\n health: \"健康狀況\",\n ok: \"正常\",\n offline: \"離線\",\n connect: \"連接\",\n refresh: \"刷新\",\n enabled: \"已啟用\",\n disabled: \"已禁用\",\n na: \"不適用\",\n docs: \"文檔\",\n resources: \"資源\",\n },\n nav: {\n chat: \"聊天\",\n control: \"控制\",\n agent: \"代理\",\n settings: \"設置\",\n expand: \"展開側邊欄\",\n collapse: \"折疊側邊欄\",\n },\n tabs: {\n agents: \"代理\",\n overview: \"概覽\",\n channels: \"頻道\",\n instances: \"實例\",\n sessions: \"會話\",\n usage: \"使用情況\",\n cron: \"定時任務\",\n skills: \"技能\",\n nodes: \"節點\",\n chat: \"聊天\",\n config: \"配置\",\n debug: \"調試\",\n logs: \"日誌\",\n },\n subtitles: {\n agents: \"管理代理工作區、工具和身份。\",\n overview: \"網關狀態、入口點和快速健康讀取。\",\n channels: \"管理頻道和設置。\",\n instances: \"來自已連接客戶端和節點的在線信號。\",\n sessions: \"檢查活動會話並調整每個會話的默認設置。\",\n usage: \"監控 API 使用情況和成本。\",\n cron: \"安排喚醒和重複的代理運行。\",\n skills: \"管理技能可用性和 API 密鑰注入。\",\n nodes: \"配對設備、功能和命令公開。\",\n chat: \"用於快速干預的直接網關聊天會話。\",\n config: \"安全地編輯 ~/.poolbot/poolbot.json。\",\n debug: \"網關快照、事件和手動 RPC 調用。\",\n logs: \"網關文件日志的實時追蹤。\",\n },\n overview: {\n access: {\n title: \"網關訪問\",\n subtitle: \"儀表板連接的位置及其身份驗證方式。\",\n wsUrl: \"WebSocket URL\",\n token: \"網關令牌\",\n password: \"密碼 (不存儲)\",\n sessionKey: \"默認會話密鑰\",\n language: \"語言\",\n connectHint: \"點擊連接以應用連接更改。\",\n trustedProxy: \"通過受信任代理身份驗證。\",\n },\n snapshot: {\n title: \"快照\",\n subtitle: \"最新的網關握手信息。\",\n status: \"狀態\",\n uptime: \"運行時間\",\n tickInterval: \"刻度間隔\",\n lastChannelsRefresh: \"最後頻道刷新\",\n channelsHint: \"使用頻道鏈接 WhatsApp、Telegram、Discord、Signal 或 iMessage。\",\n },\n stats: {\n instances: \"實例\",\n instancesHint: \"過去 5 分鐘內的在線信號。\",\n sessions: \"會話\",\n sessionsHint: \"網關跟蹤的最近會話密鑰。\",\n cron: \"定時任務\",\n cronNext: \"下次喚醒 {time}\",\n },\n notes: {\n title: \"備註\",\n subtitle: \"遠程控制設置的快速提醒。\",\n tailscaleTitle: \"Tailscale serve\",\n tailscaleText: \"首選 serve 模式以通過 tailnet 身份驗證將網關保持在回環地址。\",\n sessionTitle: \"會話清理\",\n sessionText: \"使用 /new 或 sessions.patch 重置上下文。\",\n cronTitle: \"定時任務提醒\",\n cronText: \"為重複運行使用隔離的會話。\",\n },\n auth: {\n required: \"此網關需要身份驗證。添加令牌或密碼,然後點擊連接。\",\n failed: \"身份驗證失敗。請使用 {command} 重新複製令牌化 URL,或更新令牌,然後點擊連接。\",\n },\n insecure: {\n hint: \"此頁面為 HTTP,因此瀏覽器阻止設備標識。請使用 HTTPS (Tailscale Serve) 或在網關主機上打開 {url}。\",\n stayHttp: \"如果您必須保持 HTTP,請設置 {config} (僅限令牌)。\",\n },\n },\n chat: {\n disconnected: \"已斷開與網關的連接。\",\n refreshTitle: \"刷新聊天數據\",\n thinkingToggle: \"切換助手思考/工作輸出\",\n focusToggle: \"切換專注模式 (隱藏側邊欄 + 頁面頁眉)\",\n onboardingDisabled: \"引導期間禁用\",\n },\n languages: {\n en: \"English\",\n zhCN: \"简体中文 (簡體中文)\",\n zhTW: \"繁體中文 (繁體中文)\",\n ptBR: \"Português (巴西葡萄牙語)\",\n },\n};\n"],"names":["zh_TW"],"mappings":"AAEO,MAAMA,EAAwB,CACnC,OAAQ,CACN,OAAQ,OACR,GAAI,KACJ,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,MACT,SAAU,MACV,GAAI,MACJ,KAAM,KACN,UAAW,IAAA,EAEb,IAAK,CACH,KAAM,KACN,QAAS,KACT,MAAO,KACP,SAAU,KACV,OAAQ,QACR,SAAU,OAAA,EAEZ,KAAM,CACJ,OAAQ,KACR,SAAU,KACV,SAAU,KACV,UAAW,KACX,SAAU,KACV,MAAO,OACP,KAAM,OACN,OAAQ,KACR,MAAO,KACP,KAAM,KACN,OAAQ,KACR,MAAO,KACP,KAAM,IAAA,EAER,UAAW,CACT,OAAQ,iBACR,SAAU,mBACV,SAAU,WACV,UAAW,oBACX,SAAU,sBACV,MAAO,kBACP,KAAM,gBACN,OAAQ,qBACR,MAAO,gBACP,KAAM,mBACN,OAAQ,iCACR,MAAO,qBACP,KAAM,cAAA,EAER,SAAU,CACR,OAAQ,CACN,MAAO,OACP,SAAU,oBACV,MAAO,gBACP,MAAO,OACP,SAAU,WACV,WAAY,SACZ,SAAU,KACV,YAAa,eACb,aAAc,cAAA,EAEhB,SAAU,CACR,MAAO,KACP,SAAU,aACV,OAAQ,KACR,OAAQ,OACR,aAAc,OACd,oBAAqB,SACrB,aAAc,qDAAA,EAEhB,MAAO,CACL,UAAW,KACX,cAAe,iBACf,SAAU,KACV,aAAc,eACd,KAAM,OACN,SAAU,aAAA,EAEZ,MAAO,CACL,MAAO,KACP,SAAU,eACV,eAAgB,kBAChB,cAAe,yCACf,aAAc,OACd,YAAa,kCACb,UAAW,SACX,SAAU,eAAA,EAEZ,KAAM,CACJ,SAAU,4BACV,OAAQ,gDAAA,EAEV,SAAU,CACR,KAAM,qEACN,SAAU,mCAAA,CACZ,EAEF,KAAM,CACJ,aAAc,aACd,aAAc,SACd,eAAgB,cAChB,YAAa,wBACb,mBAAoB,QAAA,EAEtB,UAAW,CACT,GAAI,UACJ,KAAM,cACN,KAAM,cACN,KAAM,oBAAA,CAEV"}
@@ -6,7 +6,7 @@
6
6
  <title>Poolbot Control</title>
7
7
  <meta name="color-scheme" content="dark light" />
8
8
  <link rel="icon" href="./favicon.ico" sizes="any" />
9
- <script type="module" crossorigin src="./assets/index-D7shnQwQ.js"></script>
9
+ <script type="module" crossorigin src="./assets/index-umCsvrWy.js"></script>
10
10
  <link rel="stylesheet" crossorigin href="./assets/index-CSfXd2LO.css">
11
11
  </head>
12
12
  <body>
@@ -8,7 +8,13 @@ export const CLI_DEFAULT_OPERATOR_SCOPES = [
8
8
  APPROVALS_SCOPE,
9
9
  PAIRING_SCOPE,
10
10
  ];
11
- const NODE_ROLE_METHODS = new Set(["node.invoke.result", "node.event", "skills.bins"]);
11
+ const NODE_ROLE_METHODS = new Set([
12
+ "node.invoke.result",
13
+ "node.event",
14
+ "skills.bins",
15
+ "node.pending.pull",
16
+ "node.pending.ack",
17
+ ]);
12
18
  const METHOD_SCOPE_GROUPS = {
13
19
  [APPROVALS_SCOPE]: [
14
20
  "exec.approval.request",
@@ -75,6 +81,8 @@ const METHOD_SCOPE_GROUPS = {
75
81
  "tts.setProvider",
76
82
  "voicewake.set",
77
83
  "node.invoke",
84
+ "node.pending.drain",
85
+ "node.pending.enqueue",
78
86
  "chat.send",
79
87
  "chat.abort",
80
88
  "browser.request",
@@ -0,0 +1,142 @@
1
+ import { randomUUID } from "node:crypto";
2
+ export const NODE_PENDING_WORK_TYPES = ["status.request", "location.request"];
3
+ export const NODE_PENDING_WORK_PRIORITIES = ["default", "normal", "high"];
4
+ const DEFAULT_STATUS_ITEM_ID = "baseline-status";
5
+ const DEFAULT_STATUS_PRIORITY = "default";
6
+ const DEFAULT_PRIORITY = "normal";
7
+ const DEFAULT_MAX_ITEMS = 4;
8
+ const MAX_ITEMS = 10;
9
+ const PRIORITY_RANK = {
10
+ high: 3,
11
+ normal: 2,
12
+ default: 1,
13
+ };
14
+ const stateByNodeId = new Map();
15
+ function getOrCreateState(nodeId) {
16
+ let state = stateByNodeId.get(nodeId);
17
+ if (!state) {
18
+ state = {
19
+ revision: 0,
20
+ itemsById: new Map(),
21
+ };
22
+ stateByNodeId.set(nodeId, state);
23
+ }
24
+ return state;
25
+ }
26
+ function pruneExpired(state, nowMs) {
27
+ let changed = false;
28
+ for (const [id, item] of state.itemsById) {
29
+ if (item.expiresAtMs !== null && item.expiresAtMs <= nowMs) {
30
+ state.itemsById.delete(id);
31
+ changed = true;
32
+ }
33
+ }
34
+ if (changed) {
35
+ state.revision += 1;
36
+ }
37
+ return changed;
38
+ }
39
+ function sortedItems(state) {
40
+ return [...state.itemsById.values()].toSorted((a, b) => {
41
+ const priorityDelta = PRIORITY_RANK[b.priority] - PRIORITY_RANK[a.priority];
42
+ if (priorityDelta !== 0) {
43
+ return priorityDelta;
44
+ }
45
+ if (a.createdAtMs !== b.createdAtMs) {
46
+ return a.createdAtMs - b.createdAtMs;
47
+ }
48
+ return a.id.localeCompare(b.id);
49
+ });
50
+ }
51
+ function makeBaselineStatusItem(nowMs) {
52
+ return {
53
+ id: DEFAULT_STATUS_ITEM_ID,
54
+ type: "status.request",
55
+ priority: DEFAULT_STATUS_PRIORITY,
56
+ createdAtMs: nowMs,
57
+ expiresAtMs: null,
58
+ };
59
+ }
60
+ export function enqueueNodePendingWork(params) {
61
+ const nodeId = params.nodeId.trim();
62
+ if (!nodeId) {
63
+ throw new Error("nodeId required");
64
+ }
65
+ const nowMs = Date.now();
66
+ const state = getOrCreateState(nodeId);
67
+ pruneExpired(state, nowMs);
68
+ const existing = [...state.itemsById.values()].find((item) => item.type === params.type);
69
+ if (existing) {
70
+ return { revision: state.revision, item: existing, deduped: true };
71
+ }
72
+ const item = {
73
+ id: randomUUID(),
74
+ type: params.type,
75
+ priority: params.priority ?? DEFAULT_PRIORITY,
76
+ createdAtMs: nowMs,
77
+ expiresAtMs: typeof params.expiresInMs === "number" && Number.isFinite(params.expiresInMs)
78
+ ? nowMs + Math.max(1_000, Math.trunc(params.expiresInMs))
79
+ : null,
80
+ ...(params.payload ? { payload: params.payload } : {}),
81
+ };
82
+ state.itemsById.set(item.id, item);
83
+ state.revision += 1;
84
+ return { revision: state.revision, item, deduped: false };
85
+ }
86
+ export function drainNodePendingWork(nodeId, opts = {}) {
87
+ const normalizedNodeId = nodeId.trim();
88
+ if (!normalizedNodeId) {
89
+ return { revision: 0, items: [], hasMore: false };
90
+ }
91
+ const nowMs = opts.nowMs ?? Date.now();
92
+ const state = stateByNodeId.get(normalizedNodeId);
93
+ const revision = state?.revision ?? 0;
94
+ if (state) {
95
+ pruneExpired(state, nowMs);
96
+ }
97
+ const maxItems = Math.min(MAX_ITEMS, Math.max(1, Math.trunc(opts.maxItems ?? DEFAULT_MAX_ITEMS)));
98
+ const explicitItems = state ? sortedItems(state) : [];
99
+ const items = explicitItems.slice(0, maxItems);
100
+ const hasExplicitStatus = explicitItems.some((item) => item.type === "status.request");
101
+ const includeBaseline = opts.includeDefaultStatus !== false && !hasExplicitStatus;
102
+ if (includeBaseline && items.length < maxItems) {
103
+ items.push(makeBaselineStatusItem(nowMs));
104
+ }
105
+ const explicitReturnedCount = items.filter((item) => item.id !== DEFAULT_STATUS_ITEM_ID).length;
106
+ const baselineIncluded = items.some((item) => item.id === DEFAULT_STATUS_ITEM_ID);
107
+ return {
108
+ revision,
109
+ items,
110
+ hasMore: explicitItems.length > explicitReturnedCount || (includeBaseline && !baselineIncluded),
111
+ };
112
+ }
113
+ export function acknowledgeNodePendingWork(params) {
114
+ const nodeId = params.nodeId.trim();
115
+ if (!nodeId) {
116
+ return { revision: 0, removedItemIds: [] };
117
+ }
118
+ const state = stateByNodeId.get(nodeId);
119
+ if (!state) {
120
+ return { revision: 0, removedItemIds: [] };
121
+ }
122
+ const removedItemIds = [];
123
+ for (const itemId of params.itemIds) {
124
+ const trimmedId = itemId.trim();
125
+ if (!trimmedId || trimmedId === DEFAULT_STATUS_ITEM_ID) {
126
+ continue;
127
+ }
128
+ if (state.itemsById.delete(trimmedId)) {
129
+ removedItemIds.push(trimmedId);
130
+ }
131
+ }
132
+ if (removedItemIds.length > 0) {
133
+ state.revision += 1;
134
+ }
135
+ return { revision: state.revision, removedItemIds };
136
+ }
137
+ export function resetNodePendingWorkForTests() {
138
+ stateByNodeId.clear();
139
+ }
140
+ export function getNodePendingWorkStateCountForTests() {
141
+ return stateByNodeId.size;
142
+ }
@@ -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, TalkConfigParamsSchema, TalkConfigResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChatAbortParamsSchema, ChatEventSchema, ChatHistoryParamsSchema, ChatInjectParamsSchema, ChatSendParamsSchema, ConfigApplyParamsSchema, ConfigGetParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, ConfigSetParamsSchema, ConnectParamsSchema, CronAddParamsSchema, CronJobSchema, CronListParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, CronStatusParamsSchema, CronUpdateParamsSchema, DevicePairApproveParamsSchema, DevicePairListParamsSchema, DevicePairRemoveParamsSchema, 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, PushTestParamsSchema, PushTestResultSchema, 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, SwarmListParamsSchema, SwarmStatusParamsSchema, SwarmCreateParamsSchema, SwarmListResultSchema, SwarmStatusResultSchema, SwarmCreateResultSchema, SwarmStateSchema, SwarmMemberSchema, SwarmTaskSchema, SwarmStrategySchema, } 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, TalkConfigParamsSchema, TalkConfigResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChatAbortParamsSchema, ChatEventSchema, ChatHistoryParamsSchema, ChatInjectParamsSchema, ChatSendParamsSchema, ConfigApplyParamsSchema, ConfigGetParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, ConfigSetParamsSchema, ConnectParamsSchema, CronAddParamsSchema, CronJobSchema, CronListParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, CronStatusParamsSchema, CronUpdateParamsSchema, DevicePairApproveParamsSchema, DevicePairListParamsSchema, DevicePairRemoveParamsSchema, 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, NodePendingAckParamsSchema, NodePendingDrainParamsSchema, NodePendingEnqueueParamsSchema, NodePendingPullParamsSchema, NodeRenameParamsSchema, PollParamsSchema, PROTOCOL_VERSION, PushTestParamsSchema, PushTestResultSchema, 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, SwarmListParamsSchema, SwarmStatusParamsSchema, SwarmCreateParamsSchema, SwarmListResultSchema, SwarmStatusResultSchema, SwarmCreateResultSchema, SwarmStateSchema, SwarmMemberSchema, SwarmTaskSchema, SwarmStrategySchema, } from "./schema.js";
3
3
  const ajv = new AjvPkg({
4
4
  allErrors: true,
5
5
  strict: false,
@@ -33,6 +33,10 @@ export const validateNodeDescribeParams = ajv.compile(NodeDescribeParamsSchema);
33
33
  export const validateNodeInvokeParams = ajv.compile(NodeInvokeParamsSchema);
34
34
  export const validateNodeInvokeResultParams = ajv.compile(NodeInvokeResultParamsSchema);
35
35
  export const validateNodeEventParams = ajv.compile(NodeEventParamsSchema);
36
+ export const validateNodePendingDrainParams = ajv.compile(NodePendingDrainParamsSchema);
37
+ export const validateNodePendingEnqueueParams = ajv.compile(NodePendingEnqueueParamsSchema);
38
+ export const validateNodePendingPullParams = ajv.compile(NodePendingPullParamsSchema);
39
+ export const validateNodePendingAckParams = ajv.compile(NodePendingAckParamsSchema);
36
40
  export const validatePushTestParams = ajv.compile(PushTestParamsSchema);
37
41
  export const validateSessionsListParams = ajv.compile(SessionsListParamsSchema);
38
42
  export const validateSessionsPreviewParams = ajv.compile(SessionsPreviewParamsSchema);
@@ -52,3 +52,21 @@ export const NodeInvokeRequestEventSchema = Type.Object({
52
52
  timeoutMs: Type.Optional(Type.Integer({ minimum: 0 })),
53
53
  idempotencyKey: Type.Optional(NonEmptyString),
54
54
  }, { additionalProperties: false });
55
+ export const NodePendingDrainParamsSchema = Type.Object({
56
+ nodeId: NonEmptyString,
57
+ revision: Type.Optional(Type.Integer({ minimum: 0 })),
58
+ limit: Type.Optional(Type.Integer({ minimum: 1, maximum: 100 })),
59
+ }, { additionalProperties: false });
60
+ export const NodePendingEnqueueParamsSchema = Type.Object({
61
+ nodeId: NonEmptyString,
62
+ type: NonEmptyString,
63
+ priority: Type.Optional(NonEmptyString),
64
+ payload: Type.Optional(Type.Unknown()),
65
+ }, { additionalProperties: false });
66
+ export const NodePendingPullParamsSchema = Type.Object({
67
+ revision: Type.Optional(Type.Integer({ minimum: 0 })),
68
+ limit: Type.Optional(Type.Integer({ minimum: 1, maximum: 100 })),
69
+ }, { additionalProperties: false });
70
+ export const NodePendingAckParamsSchema = Type.Object({
71
+ itemIds: Type.Array(NonEmptyString),
72
+ }, { additionalProperties: false });
@@ -0,0 +1,96 @@
1
+ import { acknowledgeNodePendingWork, drainNodePendingWork, enqueueNodePendingWork, } from "../node-pending-work.js";
2
+ import { ErrorCodes, errorShape, validateNodePendingAckParams, validateNodePendingDrainParams, validateNodePendingEnqueueParams, validateNodePendingPullParams, } from "../protocol/index.js";
3
+ import { respondInvalidParams, respondUnavailableOnThrow } from "./nodes.helpers.js";
4
+ function resolveClientNodeId(client) {
5
+ const nodeId = client?.connect?.device?.id ?? client?.connect?.client?.id ?? "";
6
+ const trimmed = nodeId.trim();
7
+ return trimmed.length > 0 ? trimmed : null;
8
+ }
9
+ export const nodePendingHandlers = {
10
+ "node.pending.drain": async ({ params, respond, client }) => {
11
+ if (!validateNodePendingDrainParams(params)) {
12
+ respondInvalidParams({
13
+ respond,
14
+ method: "node.pending.drain",
15
+ validator: validateNodePendingDrainParams,
16
+ });
17
+ return;
18
+ }
19
+ const nodeId = resolveClientNodeId(client);
20
+ if (!nodeId) {
21
+ respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, "node.pending.drain requires a connected device identity"));
22
+ return;
23
+ }
24
+ const p = params;
25
+ const drained = drainNodePendingWork(nodeId, {
26
+ maxItems: p.limit,
27
+ includeDefaultStatus: true,
28
+ });
29
+ respond(true, { nodeId, ...drained }, undefined);
30
+ },
31
+ "node.pending.enqueue": async ({ params, respond }) => {
32
+ if (!validateNodePendingEnqueueParams(params)) {
33
+ respondInvalidParams({
34
+ respond,
35
+ method: "node.pending.enqueue",
36
+ validator: validateNodePendingEnqueueParams,
37
+ });
38
+ return;
39
+ }
40
+ const p = params;
41
+ await respondUnavailableOnThrow(respond, async () => {
42
+ const queued = enqueueNodePendingWork({
43
+ nodeId: p.nodeId,
44
+ type: p.type,
45
+ priority: p.priority,
46
+ expiresInMs: p.expiresInMs,
47
+ });
48
+ respond(true, {
49
+ nodeId: p.nodeId,
50
+ revision: queued.revision,
51
+ queued: queued.item,
52
+ wakeTriggered: false,
53
+ }, undefined);
54
+ });
55
+ },
56
+ "node.pending.pull": async ({ params, respond, client }) => {
57
+ if (!validateNodePendingPullParams(params)) {
58
+ respondInvalidParams({
59
+ respond,
60
+ method: "node.pending.pull",
61
+ validator: validateNodePendingPullParams,
62
+ });
63
+ return;
64
+ }
65
+ const nodeId = resolveClientNodeId(client);
66
+ if (!nodeId) {
67
+ respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, "node.pending.pull requires a connected device identity"));
68
+ return;
69
+ }
70
+ const p = params;
71
+ const drained = drainNodePendingWork(nodeId, {
72
+ maxItems: p.limit,
73
+ includeDefaultStatus: true,
74
+ });
75
+ respond(true, { nodeId, ...drained }, undefined);
76
+ },
77
+ "node.pending.ack": async ({ params, respond, client }) => {
78
+ if (!validateNodePendingAckParams(params)) {
79
+ respondInvalidParams({
80
+ respond,
81
+ method: "node.pending.ack",
82
+ validator: validateNodePendingAckParams,
83
+ });
84
+ return;
85
+ }
86
+ const nodeId = resolveClientNodeId(client);
87
+ if (!nodeId) {
88
+ respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, "node.pending.ack requires a connected device identity"));
89
+ return;
90
+ }
91
+ const p = params;
92
+ const itemIds = Array.isArray(p.itemIds) ? p.itemIds : [];
93
+ const { revision, removedItemIds } = acknowledgeNodePendingWork({ nodeId, itemIds });
94
+ respond(true, { nodeId, revision, removedItemIds }, undefined);
95
+ },
96
+ };
@@ -71,6 +71,10 @@ const BASE_METHODS = [
71
71
  "node.invoke",
72
72
  "node.invoke.result",
73
73
  "node.event",
74
+ "node.pending.drain",
75
+ "node.pending.enqueue",
76
+ "node.pending.pull",
77
+ "node.pending.ack",
74
78
  "cron.list",
75
79
  "cron.status",
76
80
  "cron.add",
@@ -12,6 +12,7 @@ import { healthHandlers } from "./server-methods/health.js";
12
12
  import { logsHandlers } from "./server-methods/logs.js";
13
13
  import { modelsHandlers } from "./server-methods/models.js";
14
14
  import { nodeHandlers } from "./server-methods/nodes.js";
15
+ import { nodePendingHandlers } from "./server-methods/nodes-pending.js";
15
16
  import { sendHandlers } from "./server-methods/send.js";
16
17
  import { sessionsHandlers } from "./server-methods/sessions.js";
17
18
  import { skillsHandlers } from "./server-methods/skills.js";
@@ -188,6 +189,7 @@ export const coreGatewayHandlers = {
188
189
  ...systemHandlers,
189
190
  ...updateHandlers,
190
191
  ...nodeHandlers,
192
+ ...nodePendingHandlers,
191
193
  ...sendHandlers,
192
194
  ...usageHandlers,
193
195
  ...agentHandlers,