@poolzin/pool-bot 2026.1.39 → 2026.2.1

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 (511) hide show
  1. package/assets/chrome-extension/README.md +3 -3
  2. package/assets/chrome-extension/background.js +5 -5
  3. package/assets/chrome-extension/manifest.json +3 -3
  4. package/assets/chrome-extension/options.html +4 -4
  5. package/assets/chrome-extension/options.js +1 -1
  6. package/dist/acp/client.js +3 -3
  7. package/dist/acp/types.js +1 -1
  8. package/dist/agents/agent-paths.js +3 -3
  9. package/dist/agents/auth-profiles/paths.js +3 -3
  10. package/dist/agents/bash-tools.exec.js +76 -25
  11. package/dist/agents/cli-runner/helpers.js +10 -12
  12. package/dist/agents/cli-runner.js +2 -2
  13. package/dist/agents/cloudflare-ai-gateway.js +31 -0
  14. package/dist/agents/compaction.js +16 -2
  15. package/dist/agents/context-window-guard.js +13 -10
  16. package/dist/agents/context.js +4 -4
  17. package/dist/agents/docs-path.js +1 -1
  18. package/dist/agents/identity.js +47 -7
  19. package/dist/agents/memory-search.js +25 -8
  20. package/dist/agents/minimax-vlm.js +1 -1
  21. package/dist/agents/model-auth.js +12 -1
  22. package/dist/agents/model-catalog.js +4 -4
  23. package/dist/agents/model-selection.js +31 -4
  24. package/dist/agents/models-config.js +3 -3
  25. package/dist/agents/models-config.providers.js +147 -39
  26. package/dist/agents/pi-embedded-block-chunker.js +117 -42
  27. package/dist/agents/pi-embedded-helpers/errors.js +183 -78
  28. package/dist/agents/pi-embedded-helpers/openai.js +1 -1
  29. package/dist/agents/pi-embedded-helpers.js +1 -1
  30. package/dist/agents/pi-embedded-runner/compact.js +9 -8
  31. package/dist/agents/pi-embedded-runner/model.js +63 -4
  32. package/dist/agents/pi-embedded-runner/run/attempt.js +27 -17
  33. package/dist/agents/pi-embedded-runner/run.js +203 -50
  34. package/dist/agents/pi-embedded-runner/system-prompt.js +10 -2
  35. package/dist/agents/pi-embedded-runner/tool-result-truncation.js +275 -0
  36. package/dist/agents/pi-embedded-runner/utils.js +1 -1
  37. package/dist/agents/pi-embedded-subscribe.js +118 -29
  38. package/dist/agents/pi-model-discovery.js +10 -0
  39. package/dist/agents/pi-tool-definition-adapter.js +50 -9
  40. package/dist/agents/pi-tools.before-tool-call.js +67 -0
  41. package/dist/agents/pi-tools.js +20 -10
  42. package/dist/agents/pi-tools.read.js +2 -2
  43. package/dist/agents/poolbot-tools.js +15 -10
  44. package/dist/agents/sandbox-paths.js +31 -0
  45. package/dist/agents/session-file-repair.js +83 -0
  46. package/dist/agents/session-tool-result-guard.js +94 -15
  47. package/dist/agents/session-transcript-repair.js +68 -0
  48. package/dist/agents/shell-utils.js +51 -0
  49. package/dist/agents/skills/bundled-context.js +23 -0
  50. package/dist/agents/skills/bundled-dir.js +41 -7
  51. package/dist/agents/skills/frontmatter.js +1 -1
  52. package/dist/agents/skills/workspace.js +2 -2
  53. package/dist/agents/skills-install.js +60 -23
  54. package/dist/agents/subagent-announce.js +79 -34
  55. package/dist/agents/system-prompt.js +28 -4
  56. package/dist/agents/together-models.js +127 -0
  57. package/dist/agents/tool-images.js +1 -1
  58. package/dist/agents/tool-policy.conformance.js +14 -0
  59. package/dist/agents/tool-policy.js +25 -1
  60. package/dist/agents/tools/browser-tool.js +3 -3
  61. package/dist/agents/tools/cron-tool.js +166 -19
  62. package/dist/agents/tools/discord-actions-presence.js +78 -0
  63. package/dist/agents/tools/image-tool.js +2 -2
  64. package/dist/agents/tools/memory-tool.js +93 -5
  65. package/dist/agents/tools/message-tool.js +56 -2
  66. package/dist/agents/tools/sessions-history-tool.js +69 -1
  67. package/dist/agents/tools/web-search.js +211 -42
  68. package/dist/agents/usage.js +23 -1
  69. package/dist/agents/workspace-run.js +67 -0
  70. package/dist/agents/workspace-templates.js +44 -0
  71. package/dist/auto-reply/command-auth.js +121 -6
  72. package/dist/auto-reply/commands-registry.data.js +1 -1
  73. package/dist/auto-reply/envelope.js +50 -72
  74. package/dist/auto-reply/reply/commands-compact.js +1 -0
  75. package/dist/auto-reply/reply/commands-context-report.js +3 -2
  76. package/dist/auto-reply/reply/commands-context.js +1 -0
  77. package/dist/auto-reply/reply/commands-models.js +107 -60
  78. package/dist/auto-reply/reply/commands-ptt.js +171 -0
  79. package/dist/auto-reply/reply/commands-session.js +2 -2
  80. package/dist/auto-reply/reply/get-reply-run.js +16 -5
  81. package/dist/auto-reply/reply/groups.js +1 -1
  82. package/dist/auto-reply/reply/inbound-context.js +9 -1
  83. package/dist/auto-reply/reply/inbound-meta.js +130 -0
  84. package/dist/auto-reply/reply/model-selection.js +3 -3
  85. package/dist/auto-reply/reply/untrusted-context.js +15 -0
  86. package/dist/auto-reply/status.js +1 -1
  87. package/dist/auto-reply/thinking.js +88 -43
  88. package/dist/browser/bridge-server.js +13 -0
  89. package/dist/browser/cdp.helpers.js +38 -24
  90. package/dist/browser/client-fetch.js +51 -8
  91. package/dist/browser/config.js +2 -11
  92. package/dist/browser/extension-relay.js +104 -43
  93. package/dist/browser/pw-ai.js +1 -1
  94. package/dist/browser/pw-session.js +143 -8
  95. package/dist/browser/pw-tools-core.interactions.js +125 -27
  96. package/dist/browser/pw-tools-core.responses.js +1 -1
  97. package/dist/browser/pw-tools-core.state.js +1 -1
  98. package/dist/browser/routes/agent.act.js +86 -41
  99. package/dist/browser/routes/dispatcher.js +4 -4
  100. package/dist/browser/screenshot.js +1 -1
  101. package/dist/browser/server-context.js +2 -2
  102. package/dist/browser/server.js +13 -0
  103. package/dist/build-info.json +3 -3
  104. package/dist/canvas-host/a2ui.js +3 -3
  105. package/dist/channels/plugins/catalog.js +2 -2
  106. package/dist/channels/plugins/onboarding/imessage.js +1 -1
  107. package/dist/channels/plugins/onboarding/signal.js +1 -1
  108. package/dist/channels/plugins/onboarding/slack.js +4 -4
  109. package/dist/channels/plugins/onboarding/whatsapp.js +3 -3
  110. package/dist/channels/plugins/pairing-message.js +1 -1
  111. package/dist/channels/reply-prefix.js +8 -1
  112. package/dist/cli/browser-cli-extension.js +2 -2
  113. package/dist/cli/cron-cli/register.cron-add.js +61 -40
  114. package/dist/cli/cron-cli/register.cron-edit.js +60 -34
  115. package/dist/cli/cron-cli/shared.js +56 -41
  116. package/dist/cli/dns-cli.js +26 -14
  117. package/dist/cli/docs-cli.js +1 -1
  118. package/dist/cli/gateway-cli/dev.js +1 -1
  119. package/dist/cli/gateway-cli/register.js +37 -19
  120. package/dist/cli/memory-cli.js +30 -20
  121. package/dist/cli/nodes-cli/register.canvas.js +1 -1
  122. package/dist/cli/parse-bytes.js +37 -0
  123. package/dist/cli/plugins-cli.js +1 -1
  124. package/dist/cli/run-main.js +2 -2
  125. package/dist/cli/security-cli.js +1 -1
  126. package/dist/cli/tagline.js +1 -1
  127. package/dist/cli/update-cli.js +173 -52
  128. package/dist/cli/webhooks-cli.js +5 -5
  129. package/dist/commands/agent.js +1 -0
  130. package/dist/commands/agents.commands.add.js +1 -1
  131. package/dist/commands/auth-choice.apply.api-providers.js +305 -17
  132. package/dist/commands/auth-choice.apply.js +4 -1
  133. package/dist/commands/auth-choice.apply.plugin-provider.js +2 -2
  134. package/dist/commands/auth-choice.apply.xai.js +63 -0
  135. package/dist/commands/auth-choice.preferred-provider.js +7 -1
  136. package/dist/commands/configure.wizard.js +1 -1
  137. package/dist/commands/dashboard.js +1 -1
  138. package/dist/commands/docs.js +1 -1
  139. package/dist/commands/doctor-config-flow.js +61 -5
  140. package/dist/commands/doctor-gateway-services.js +3 -3
  141. package/dist/commands/doctor-state-migrations.js +1 -1
  142. package/dist/commands/doctor-update.js +3 -3
  143. package/dist/commands/doctor.js +1 -1
  144. package/dist/commands/health.js +1 -1
  145. package/dist/commands/model-allowlist.js +29 -0
  146. package/dist/commands/model-picker.js +2 -1
  147. package/dist/commands/models/list.probe.js +2 -2
  148. package/dist/commands/models/list.registry.js +4 -4
  149. package/dist/commands/models/list.status-command.js +44 -24
  150. package/dist/commands/models/shared.js +15 -0
  151. package/dist/commands/onboard-auth.config-core.js +366 -28
  152. package/dist/commands/onboard-auth.credentials.js +71 -9
  153. package/dist/commands/onboard-auth.js +3 -3
  154. package/dist/commands/onboard-auth.models.js +26 -24
  155. package/dist/commands/onboard-custom.js +384 -0
  156. package/dist/commands/onboard-non-interactive/local/auth-choice-inference.js +35 -0
  157. package/dist/commands/onboard-non-interactive/local/auth-choice.js +146 -9
  158. package/dist/commands/onboard-skills.js +63 -38
  159. package/dist/commands/openai-model-default.js +41 -0
  160. package/dist/commands/status-all/report-lines.js +1 -1
  161. package/dist/commands/status.command.js +1 -1
  162. package/dist/commands/uninstall.js +3 -3
  163. package/dist/compat/legacy-names.js +1 -1
  164. package/dist/config/defaults.js +3 -2
  165. package/dist/config/io.js +3 -3
  166. package/dist/config/paths.js +136 -35
  167. package/dist/config/plugin-auto-enable.js +21 -5
  168. package/dist/config/redact-snapshot.js +153 -0
  169. package/dist/config/schema.field-metadata.js +590 -0
  170. package/dist/config/schema.js +3 -3
  171. package/dist/config/sessions/store.js +291 -23
  172. package/dist/config/types.memory.js +1 -0
  173. package/dist/config/version.js +4 -4
  174. package/dist/config/zod-schema.agent-defaults.js +3 -0
  175. package/dist/config/zod-schema.agent-runtime.js +13 -2
  176. package/dist/config/zod-schema.providers-core.js +142 -0
  177. package/dist/config/zod-schema.session.js +3 -0
  178. package/dist/cron/delivery.js +57 -0
  179. package/dist/cron/isolated-agent/delivery-target.js +18 -3
  180. package/dist/cron/isolated-agent/helpers.js +22 -5
  181. package/dist/cron/isolated-agent/run.js +171 -63
  182. package/dist/cron/isolated-agent/session.js +2 -0
  183. package/dist/cron/normalize.js +356 -28
  184. package/dist/cron/parse.js +10 -5
  185. package/dist/cron/run-log.js +35 -10
  186. package/dist/cron/schedule.js +41 -6
  187. package/dist/cron/service/jobs.js +208 -35
  188. package/dist/cron/service/ops.js +72 -16
  189. package/dist/cron/service/state.js +2 -0
  190. package/dist/cron/service/store.js +386 -14
  191. package/dist/cron/service/timer.js +390 -147
  192. package/dist/cron/session-reaper.js +86 -0
  193. package/dist/cron/store.js +23 -8
  194. package/dist/cron/validate-timestamp.js +43 -0
  195. package/dist/daemon/constants.js +7 -7
  196. package/dist/daemon/inspect.js +6 -6
  197. package/dist/daemon/systemd-unit.js +1 -1
  198. package/dist/discord/monitor/agent-components.js +438 -0
  199. package/dist/discord/monitor/allow-list.js +28 -5
  200. package/dist/discord/monitor/gateway-registry.js +29 -0
  201. package/dist/discord/monitor/native-command.js +44 -23
  202. package/dist/discord/monitor/sender-identity.js +45 -0
  203. package/dist/discord/pluralkit.js +27 -0
  204. package/dist/discord/send.outbound.js +92 -5
  205. package/dist/discord/send.shared.js +60 -23
  206. package/dist/discord/targets.js +84 -1
  207. package/dist/entry.js +15 -9
  208. package/dist/extensionAPI.js +8 -0
  209. package/dist/gateway/control-ui.js +8 -1
  210. package/dist/gateway/hooks-mapping.js +3 -0
  211. package/dist/gateway/hooks.js +65 -0
  212. package/dist/gateway/live-image-probe.js +1 -66
  213. package/dist/gateway/net.js +96 -31
  214. package/dist/gateway/node-command-policy.js +50 -15
  215. package/dist/gateway/openai-http.js +2 -2
  216. package/dist/gateway/openresponses-http.js +4 -4
  217. package/dist/gateway/origin-check.js +56 -0
  218. package/dist/gateway/protocol/client-info.js +9 -0
  219. package/dist/gateway/protocol/index.js +9 -2
  220. package/dist/gateway/protocol/schema/agents-models-skills.js +71 -1
  221. package/dist/gateway/protocol/schema/cron.js +22 -10
  222. package/dist/gateway/protocol/schema/protocol-schemas.js +16 -2
  223. package/dist/gateway/protocol/schema/sessions.js +12 -0
  224. package/dist/gateway/server/hooks.js +1 -1
  225. package/dist/gateway/server-broadcast.js +26 -9
  226. package/dist/gateway/server-chat.js +112 -23
  227. package/dist/gateway/server-discovery-runtime.js +10 -2
  228. package/dist/gateway/server-discovery.js +2 -2
  229. package/dist/gateway/server-http.js +110 -12
  230. package/dist/gateway/server-methods/agent-timestamp.js +60 -0
  231. package/dist/gateway/server-methods/agents.js +321 -2
  232. package/dist/gateway/server-methods/usage.js +559 -16
  233. package/dist/gateway/server-runtime-state.js +22 -8
  234. package/dist/gateway/server-startup-memory.js +16 -0
  235. package/dist/gateway/server.impl.js +7 -3
  236. package/dist/gateway/session-utils.fs.js +23 -25
  237. package/dist/gateway/session-utils.js +20 -10
  238. package/dist/gateway/sessions-patch.js +7 -22
  239. package/dist/gateway/test-helpers.server.js +35 -2
  240. package/dist/hooks/frontmatter.js +1 -1
  241. package/dist/hooks/hooks-status.js +1 -1
  242. package/dist/hooks/install.js +2 -2
  243. package/dist/hooks/loader.js +1 -1
  244. package/dist/hooks/workspace.js +3 -3
  245. package/dist/imessage/constants.js +2 -0
  246. package/dist/imessage/monitor/deliver.js +4 -1
  247. package/dist/imessage/monitor/monitor-provider.js +51 -1
  248. package/dist/index.js +2 -2
  249. package/dist/infra/bonjour-discovery.js +131 -70
  250. package/dist/infra/bonjour.js +3 -3
  251. package/dist/infra/control-ui-assets.js +134 -12
  252. package/dist/infra/errors.js +12 -0
  253. package/dist/infra/exec-approvals.js +266 -57
  254. package/dist/infra/format-time/format-datetime.js +79 -0
  255. package/dist/infra/format-time/format-duration.js +81 -0
  256. package/dist/infra/format-time/format-relative.js +80 -0
  257. package/dist/infra/heartbeat-runner.js +140 -49
  258. package/dist/infra/home-dir.js +54 -0
  259. package/dist/infra/net/fetch-guard.js +122 -0
  260. package/dist/infra/net/ssrf.js +65 -29
  261. package/dist/infra/outbound/abort.js +14 -0
  262. package/dist/infra/outbound/message-action-runner.js +77 -13
  263. package/dist/infra/outbound/outbound-session.js +143 -37
  264. package/dist/infra/path-env.js +3 -3
  265. package/dist/infra/poolbot-root.js +43 -1
  266. package/dist/infra/provider-usage.fetch.minimax.js +1 -1
  267. package/dist/infra/restart.js +1 -1
  268. package/dist/infra/session-cost-usage.js +631 -41
  269. package/dist/infra/state-migrations.js +317 -47
  270. package/dist/infra/tailscale.js +1 -1
  271. package/dist/infra/update-global.js +35 -0
  272. package/dist/infra/update-runner.js +149 -43
  273. package/dist/infra/warning-filter.js +65 -0
  274. package/dist/infra/widearea-dns.js +30 -9
  275. package/dist/logging/redact-identifier.js +12 -0
  276. package/dist/macos/relay.js +2 -2
  277. package/dist/media/fetch.js +81 -58
  278. package/dist/media/input-files.js +1 -1
  279. package/dist/media/mime.js +4 -0
  280. package/dist/media/png-encode.js +74 -0
  281. package/dist/media-understanding/apply.js +403 -3
  282. package/dist/media-understanding/attachments.js +38 -27
  283. package/dist/media-understanding/defaults.js +16 -0
  284. package/dist/media-understanding/providers/deepgram/audio.js +22 -14
  285. package/dist/media-understanding/providers/google/audio.js +24 -17
  286. package/dist/media-understanding/providers/google/video.js +24 -17
  287. package/dist/media-understanding/providers/image.js +4 -4
  288. package/dist/media-understanding/providers/index.js +4 -1
  289. package/dist/media-understanding/providers/openai/audio.js +22 -14
  290. package/dist/media-understanding/providers/shared.js +16 -11
  291. package/dist/media-understanding/providers/zai/index.js +6 -0
  292. package/dist/media-understanding/runner.js +158 -90
  293. package/dist/memory/backend-config.js +207 -0
  294. package/dist/memory/batch-voyage.js +277 -0
  295. package/dist/memory/embeddings-voyage.js +75 -0
  296. package/dist/memory/embeddings.js +29 -17
  297. package/dist/memory/internal.js +101 -18
  298. package/dist/memory/manager.js +155 -48
  299. package/dist/memory/search-manager.js +173 -0
  300. package/dist/memory/session-files.js +9 -3
  301. package/dist/memory/types.js +1 -0
  302. package/dist/node-host/runner.js +36 -26
  303. package/dist/node-host/with-timeout.js +27 -0
  304. package/dist/pairing/pairing-messages.js +1 -1
  305. package/dist/plugins/commands.js +5 -1
  306. package/dist/plugins/config-state.js +86 -7
  307. package/dist/plugins/discovery.js +1 -1
  308. package/dist/plugins/install.js +2 -2
  309. package/dist/plugins/source-display.js +51 -0
  310. package/dist/plugins/update.js +1 -1
  311. package/dist/process/exec.js +20 -2
  312. package/dist/routing/resolve-route.js +12 -0
  313. package/dist/routing/session-key.js +15 -0
  314. package/dist/runtime.js +2 -0
  315. package/dist/security/audit-extra.async.js +601 -0
  316. package/dist/security/audit-extra.js +2 -830
  317. package/dist/security/audit-extra.sync.js +505 -0
  318. package/dist/security/audit.js +2 -2
  319. package/dist/security/channel-metadata.js +34 -0
  320. package/dist/security/external-content.js +88 -6
  321. package/dist/security/skill-scanner.js +330 -0
  322. package/dist/sessions/session-key-utils.js +7 -0
  323. package/dist/shared/text/reasoning-tags.js +52 -7
  324. package/dist/signal/monitor/event-handler.js +80 -1
  325. package/dist/slack/monitor/media.js +85 -15
  326. package/dist/tailscale/detect.js +145 -0
  327. package/dist/telegram/bot/helpers.js +109 -28
  328. package/dist/telegram/bot-handlers.js +144 -3
  329. package/dist/telegram/bot-message-context.js +38 -11
  330. package/dist/telegram/bot-message-dispatch.js +48 -15
  331. package/dist/telegram/bot-native-commands.js +86 -29
  332. package/dist/telegram/bot.js +30 -29
  333. package/dist/telegram/model-buttons.js +163 -0
  334. package/dist/telegram/monitor.js +110 -85
  335. package/dist/telegram/send.js +129 -47
  336. package/dist/terminal/restore.js +45 -0
  337. package/dist/test-helpers/state-dir-env.js +16 -0
  338. package/dist/test-helpers/workspace.js +11 -0
  339. package/dist/test-utils/channel-plugins.js +82 -0
  340. package/dist/test-utils/ports.js +73 -0
  341. package/dist/tts/tts.js +12 -6
  342. package/dist/tui/tui-session-actions.js +166 -54
  343. package/dist/utils/fetch-timeout.js +20 -0
  344. package/dist/utils/normalize-secret-input.js +19 -0
  345. package/dist/utils/shell-argv.js +61 -0
  346. package/dist/utils/transcript-tools.js +58 -0
  347. package/dist/utils.js +55 -14
  348. package/dist/version.js +42 -5
  349. package/dist/web/qr-image.js +1 -61
  350. package/dist/wizard/onboarding.finalize.js +7 -7
  351. package/dist/wizard/onboarding.js +3 -3
  352. package/docs/RELEASE_WORKFOTS_COMPARISON.md +3 -3
  353. package/docs/_config.yml +2 -2
  354. package/docs/_layouts/default.html +9 -9
  355. package/docs/concepts/typebox.md +1 -1
  356. package/docs/docs.json +1 -1
  357. package/docs/northflank.mdx +7 -7
  358. package/docs/railway.mdx +3 -3
  359. package/docs/render.mdx +5 -5
  360. package/docs/start/lore.md +2 -2
  361. package/extensions/bluebubbles/index.ts +2 -2
  362. package/extensions/bluebubbles/package.json +1 -1
  363. package/extensions/bluebubbles/src/accounts.ts +8 -8
  364. package/extensions/bluebubbles/src/actions.test.ts +22 -22
  365. package/extensions/bluebubbles/src/actions.ts +5 -5
  366. package/extensions/bluebubbles/src/attachments.ts +2 -2
  367. package/extensions/bluebubbles/src/channel.ts +16 -16
  368. package/extensions/bluebubbles/src/chat.ts +2 -2
  369. package/extensions/bluebubbles/src/media-send.ts +2 -2
  370. package/extensions/bluebubbles/src/monitor.test.ts +46 -46
  371. package/extensions/bluebubbles/src/monitor.ts +5 -5
  372. package/extensions/bluebubbles/src/onboarding.ts +7 -7
  373. package/extensions/bluebubbles/src/reactions.ts +2 -2
  374. package/extensions/bluebubbles/src/send.ts +2 -2
  375. package/extensions/copilot-proxy/README.md +1 -1
  376. package/extensions/copilot-proxy/package.json +1 -1
  377. package/extensions/diagnostics-otel/index.ts +2 -2
  378. package/extensions/diagnostics-otel/package.json +1 -1
  379. package/extensions/diagnostics-otel/src/service.ts +3 -3
  380. package/extensions/discord/index.ts +2 -2
  381. package/extensions/discord/package.json +1 -1
  382. package/extensions/google-antigravity-auth/README.md +1 -1
  383. package/extensions/google-antigravity-auth/index.ts +1 -1
  384. package/extensions/google-antigravity-auth/package.json +1 -1
  385. package/extensions/google-gemini-cli-auth/README.md +1 -1
  386. package/extensions/google-gemini-cli-auth/oauth.ts +1 -1
  387. package/extensions/google-gemini-cli-auth/package.json +1 -1
  388. package/extensions/googlechat/index.ts +3 -3
  389. package/extensions/googlechat/package.json +1 -1
  390. package/extensions/googlechat/src/accounts.ts +8 -8
  391. package/extensions/googlechat/src/actions.ts +6 -6
  392. package/extensions/googlechat/src/channel.ts +21 -21
  393. package/extensions/googlechat/src/monitor.ts +8 -8
  394. package/extensions/googlechat/src/onboarding.ts +10 -10
  395. package/extensions/imessage/index.ts +2 -2
  396. package/extensions/imessage/package.json +1 -1
  397. package/extensions/line/index.ts +2 -2
  398. package/extensions/line/package.json +1 -1
  399. package/extensions/line/src/card-command.ts +2 -2
  400. package/extensions/line/src/channel.logout.test.ts +4 -4
  401. package/extensions/line/src/channel.sendPayload.test.ts +8 -8
  402. package/extensions/line/src/channel.ts +3 -3
  403. package/extensions/llm-task/README.md +3 -3
  404. package/extensions/llm-task/index.ts +2 -2
  405. package/extensions/llm-task/package.json +1 -1
  406. package/extensions/llm-task/src/llm-task-tool.ts +4 -4
  407. package/extensions/lobster/README.md +6 -6
  408. package/extensions/lobster/index.ts +2 -2
  409. package/extensions/lobster/src/lobster-tool.test.ts +4 -4
  410. package/extensions/lobster/src/lobster-tool.ts +2 -2
  411. package/extensions/matrix/index.ts +2 -2
  412. package/extensions/matrix/package.json +1 -1
  413. package/extensions/matrix/src/matrix/client/config.ts +1 -1
  414. package/extensions/matrix/src/matrix/monitor/handler.ts +1 -1
  415. package/extensions/matrix/src/onboarding.ts +1 -1
  416. package/extensions/mattermost/index.ts +2 -2
  417. package/extensions/mattermost/package.json +1 -1
  418. package/extensions/mattermost/src/mattermost/accounts.ts +8 -8
  419. package/extensions/mattermost/src/mattermost/monitor-helpers.ts +5 -5
  420. package/extensions/mattermost/src/mattermost/monitor.ts +2 -2
  421. package/extensions/mattermost/src/onboarding-helpers.ts +3 -3
  422. package/extensions/mattermost/src/onboarding.ts +2 -2
  423. package/extensions/memory-core/index.ts +2 -2
  424. package/extensions/memory-core/package.json +1 -1
  425. package/extensions/memory-lancedb/index.ts +3 -3
  426. package/extensions/memory-lancedb/package.json +1 -1
  427. package/extensions/msteams/index.ts +2 -2
  428. package/extensions/msteams/package.json +1 -1
  429. package/extensions/msteams/src/channel.directory.test.ts +2 -2
  430. package/extensions/msteams/src/channel.ts +2 -2
  431. package/extensions/msteams/src/graph-upload.ts +4 -4
  432. package/extensions/msteams/src/monitor-handler.ts +2 -2
  433. package/extensions/msteams/src/monitor.ts +2 -2
  434. package/extensions/msteams/src/onboarding.ts +9 -9
  435. package/extensions/msteams/src/reply-dispatcher.ts +2 -2
  436. package/extensions/msteams/src/send-context.ts +2 -2
  437. package/extensions/msteams/src/send.ts +4 -4
  438. package/extensions/nextcloud-talk/index.ts +2 -2
  439. package/extensions/nextcloud-talk/package.json +1 -1
  440. package/extensions/nextcloud-talk/src/channel.ts +7 -7
  441. package/extensions/nextcloud-talk/src/inbound.ts +7 -7
  442. package/extensions/nextcloud-talk/src/onboarding.ts +1 -1
  443. package/extensions/nostr/README.md +2 -2
  444. package/extensions/nostr/index.ts +5 -5
  445. package/extensions/nostr/package.json +1 -1
  446. package/extensions/nostr/src/types.ts +4 -4
  447. package/extensions/open-prose/index.ts +2 -2
  448. package/extensions/qwen-portal-auth/README.md +1 -1
  449. package/extensions/signal/index.ts +2 -2
  450. package/extensions/signal/package.json +1 -1
  451. package/extensions/slack/index.ts +2 -2
  452. package/extensions/slack/package.json +1 -1
  453. package/extensions/telegram/index.ts +2 -2
  454. package/extensions/telegram/package.json +1 -1
  455. package/extensions/telegram/src/channel.ts +2 -2
  456. package/extensions/tlon/README.md +2 -2
  457. package/extensions/tlon/index.ts +2 -2
  458. package/extensions/tlon/package.json +1 -1
  459. package/extensions/tlon/src/channel.ts +13 -13
  460. package/extensions/tlon/src/monitor/index.ts +3 -3
  461. package/extensions/tlon/src/onboarding.ts +3 -3
  462. package/extensions/tlon/src/types.ts +3 -3
  463. package/extensions/twitch/README.md +1 -1
  464. package/extensions/twitch/index.ts +2 -2
  465. package/extensions/twitch/package.json +1 -1
  466. package/extensions/twitch/src/config.ts +3 -3
  467. package/extensions/twitch/src/monitor.ts +3 -3
  468. package/extensions/twitch/src/onboarding.ts +9 -9
  469. package/extensions/twitch/src/outbound.test.ts +2 -2
  470. package/extensions/twitch/src/plugin.test.ts +2 -2
  471. package/extensions/twitch/src/plugin.ts +8 -8
  472. package/extensions/twitch/src/send.test.ts +2 -2
  473. package/extensions/twitch/src/send.ts +4 -4
  474. package/extensions/twitch/src/token.test.ts +8 -8
  475. package/extensions/twitch/src/token.ts +3 -3
  476. package/extensions/twitch/src/twitch-client.ts +3 -3
  477. package/extensions/twitch/src/types.ts +3 -3
  478. package/extensions/twitch/src/utils/markdown.ts +1 -1
  479. package/extensions/voice-call/README.md +3 -3
  480. package/extensions/voice-call/package.json +1 -1
  481. package/extensions/voice-call/src/core-bridge.ts +2 -2
  482. package/extensions/voice-call/src/response-generator.ts +1 -1
  483. package/extensions/whatsapp/index.ts +2 -2
  484. package/extensions/whatsapp/package.json +1 -1
  485. package/extensions/zalo/README.md +1 -1
  486. package/extensions/zalo/index.ts +2 -2
  487. package/extensions/zalo/package.json +1 -1
  488. package/extensions/zalo/src/accounts.ts +8 -8
  489. package/extensions/zalo/src/actions.ts +4 -4
  490. package/extensions/zalo/src/channel.directory.test.ts +2 -2
  491. package/extensions/zalo/src/channel.ts +18 -18
  492. package/extensions/zalo/src/monitor.ts +9 -9
  493. package/extensions/zalo/src/monitor.webhook.test.ts +2 -2
  494. package/extensions/zalo/src/onboarding.ts +24 -24
  495. package/extensions/zalo/src/send.ts +2 -2
  496. package/extensions/zalouser/README.md +2 -2
  497. package/extensions/zalouser/index.ts +2 -2
  498. package/extensions/zalouser/package.json +1 -1
  499. package/extensions/zalouser/src/accounts.ts +9 -9
  500. package/extensions/zalouser/src/channel.ts +24 -24
  501. package/extensions/zalouser/src/monitor.ts +4 -4
  502. package/extensions/zalouser/src/onboarding.ts +28 -28
  503. package/package.json +13 -251
  504. package/skills/nano-banana-pro/scripts/generate_image.py +1 -1
  505. package/skills/tmux/scripts/find-sessions.sh +1 -1
  506. package/CHANGELOG.md +0 -102
  507. package/README-header.png +0 -0
  508. package/git-hooks/pre-commit +0 -4
  509. package/scripts/format-staged.js +0 -148
  510. package/scripts/postinstall.js +0 -300
  511. package/scripts/setup-git-hooks.js +0 -96
@@ -1,14 +1,14 @@
1
1
  import { WebSocketServer } from "ws";
2
2
  import { CANVAS_HOST_PATH } from "../canvas-host/a2ui.js";
3
3
  import { createCanvasHostHandler } from "../canvas-host/server.js";
4
- import { createGatewayHooksRequestHandler } from "./server/hooks.js";
5
- import { listenGatewayHttpServer } from "./server/http-listen.js";
6
4
  import { resolveGatewayListenHosts } from "./net.js";
7
- import { createGatewayPluginRequestHandler } from "./server/plugins-http.js";
8
5
  import { createGatewayBroadcaster } from "./server-broadcast.js";
9
- import { createChatRunState } from "./server-chat.js";
6
+ import { createChatRunState, createToolEventRecipientRegistry, } from "./server-chat.js";
10
7
  import { MAX_PAYLOAD_BYTES } from "./server-constants.js";
11
8
  import { attachGatewayUpgradeHandler, createGatewayHttpServer } from "./server-http.js";
9
+ import { createGatewayHooksRequestHandler } from "./server/hooks.js";
10
+ import { listenGatewayHttpServer } from "./server/http-listen.js";
11
+ import { createGatewayPluginRequestHandler } from "./server/plugins-http.js";
12
12
  export async function createGatewayRuntimeState(params) {
13
13
  let canvasHost = null;
14
14
  if (params.canvasHostEnabled) {
@@ -29,6 +29,10 @@ export async function createGatewayRuntimeState(params) {
29
29
  params.logCanvas.warn(`canvas host failed to start: ${String(err)}`);
30
30
  }
31
31
  }
32
+ // Create clients set before HTTP server so it can be passed to both
33
+ // createGatewayHttpServer (for canvas auth) and attachGatewayUpgradeHandler
34
+ const clients = new Set();
35
+ const { broadcast, broadcastToConnIds } = createGatewayBroadcaster({ clients });
32
36
  const handleHooksRequest = createGatewayHooksRequestHandler({
33
37
  deps: params.deps,
34
38
  getHooksConfig: params.hooksConfig,
@@ -46,8 +50,10 @@ export async function createGatewayRuntimeState(params) {
46
50
  for (const host of bindHosts) {
47
51
  const httpServer = createGatewayHttpServer({
48
52
  canvasHost,
53
+ clients,
49
54
  controlUiEnabled: params.controlUiEnabled,
50
55
  controlUiBasePath: params.controlUiBasePath,
56
+ controlUiRoot: params.controlUiRoot,
51
57
  openAiChatCompletionsEnabled: params.openAiChatCompletionsEnabled,
52
58
  openResponsesEnabled: params.openResponsesEnabled,
53
59
  openResponsesConfig: params.openResponsesConfig,
@@ -66,8 +72,9 @@ export async function createGatewayRuntimeState(params) {
66
72
  httpBindHosts.push(host);
67
73
  }
68
74
  catch (err) {
69
- if (host === bindHosts[0])
75
+ if (host === bindHosts[0]) {
70
76
  throw err;
77
+ }
71
78
  params.log.warn(`gateway: failed to bind loopback alias ${host}:${params.port} (${String(err)})`);
72
79
  }
73
80
  }
@@ -80,10 +87,14 @@ export async function createGatewayRuntimeState(params) {
80
87
  maxPayload: MAX_PAYLOAD_BYTES,
81
88
  });
82
89
  for (const server of httpServers) {
83
- attachGatewayUpgradeHandler({ httpServer: server, wss, canvasHost });
90
+ attachGatewayUpgradeHandler({
91
+ httpServer: server,
92
+ wss,
93
+ canvasHost,
94
+ clients,
95
+ resolvedAuth: params.resolvedAuth,
96
+ });
84
97
  }
85
- const clients = new Set();
86
- const { broadcast } = createGatewayBroadcaster({ clients });
87
98
  const agentRunSeq = new Map();
88
99
  const dedupe = new Map();
89
100
  const chatRunState = createChatRunState();
@@ -93,6 +104,7 @@ export async function createGatewayRuntimeState(params) {
93
104
  const addChatRun = chatRunRegistry.add;
94
105
  const removeChatRun = chatRunRegistry.remove;
95
106
  const chatAbortControllers = new Map();
107
+ const toolEventRecipients = createToolEventRecipientRegistry();
96
108
  return {
97
109
  canvasHost,
98
110
  httpServer,
@@ -101,6 +113,7 @@ export async function createGatewayRuntimeState(params) {
101
113
  wss,
102
114
  clients,
103
115
  broadcast,
116
+ broadcastToConnIds,
104
117
  agentRunSeq,
105
118
  dedupe,
106
119
  chatRunState,
@@ -109,5 +122,6 @@ export async function createGatewayRuntimeState(params) {
109
122
  addChatRun,
110
123
  removeChatRun,
111
124
  chatAbortControllers,
125
+ toolEventRecipients,
112
126
  };
113
127
  }
@@ -0,0 +1,16 @@
1
+ import { resolveDefaultAgentId } from "../agents/agent-scope.js";
2
+ import { resolveMemoryBackendConfig } from "../memory/backend-config.js";
3
+ import { getMemorySearchManager } from "../memory/index.js";
4
+ export async function startGatewayMemoryBackend(params) {
5
+ const agentId = resolveDefaultAgentId(params.cfg);
6
+ const resolved = resolveMemoryBackendConfig({ cfg: params.cfg, agentId });
7
+ if (resolved.backend !== "qmd" || !resolved.qmd) {
8
+ return;
9
+ }
10
+ const { manager, error } = await getMemorySearchManager({ cfg: params.cfg, agentId });
11
+ if (!manager) {
12
+ params.log.warn(`qmd memory startup initialization failed for agent "${agentId}": ${error ?? "unknown error"}`);
13
+ return;
14
+ }
15
+ params.log.info?.(`qmd memory startup initialization armed for agent "${agentId}"`);
16
+ }
@@ -12,7 +12,7 @@ import { clearAgentRunContext, onAgentEvent } from "../infra/agent-events.js";
12
12
  import { onHeartbeatEvent } from "../infra/heartbeat-events.js";
13
13
  import { startHeartbeatRunner } from "../infra/heartbeat-runner.js";
14
14
  import { getMachineDisplayName } from "../infra/machine-name.js";
15
- import { ensureMoltbotCliOnPath } from "../infra/path-env.js";
15
+ import { ensurePoolbotCliOnPath } from "../infra/path-env.js";
16
16
  import { primeRemoteSkillsCache, refreshRemoteBinsForConnectedNodes, setSkillsRemoteRegistry, } from "../infra/skills-remote.js";
17
17
  import { scheduleGatewayUpdateCheck } from "../infra/update-startup.js";
18
18
  import { setGatewaySigusr1RestartPolicy } from "../infra/restart.js";
@@ -50,7 +50,7 @@ import { loadGatewayTlsRuntime } from "./server/tls.js";
50
50
  import { createWizardSessionTracker } from "./server-wizard-sessions.js";
51
51
  import { attachGatewayWsHandlers } from "./server-ws-runtime.js";
52
52
  export { __resetModelCatalogCacheForTest } from "./server-model-catalog.js";
53
- ensureMoltbotCliOnPath();
53
+ ensurePoolbotCliOnPath();
54
54
  const log = createSubsystemLogger("gateway");
55
55
  const logCanvas = log.child("canvas");
56
56
  const logDiscovery = log.child("discovery");
@@ -156,7 +156,7 @@ export async function startGatewayServer(port = 18789, opts = {}) {
156
156
  if (cfgAtStart.gateway?.tls?.enabled && !gatewayTls.enabled) {
157
157
  throw new Error(gatewayTls.error ?? "gateway tls: failed to enable");
158
158
  }
159
- const { canvasHost, httpServer, httpServers, httpBindHosts, wss, clients, broadcast, agentRunSeq, dedupe, chatRunState, chatRunBuffers, chatDeltaSentAt, addChatRun, removeChatRun, chatAbortControllers, } = await createGatewayRuntimeState({
159
+ const { canvasHost, httpServer, httpServers, httpBindHosts, wss, clients, broadcast, agentRunSeq, dedupe, chatRunState, chatRunBuffers, chatDeltaSentAt, addChatRun, removeChatRun, chatAbortControllers, broadcastToConnIds, toolEventRecipients, } = await createGatewayRuntimeState({
160
160
  cfg: cfgAtStart,
161
161
  bindHost,
162
162
  port,
@@ -257,11 +257,13 @@ export async function startGatewayServer(port = 18789, opts = {}) {
257
257
  });
258
258
  const agentUnsub = onAgentEvent(createAgentEventHandler({
259
259
  broadcast,
260
+ broadcastToConnIds,
260
261
  nodeSendToSession,
261
262
  agentRunSeq,
262
263
  chatRunState,
263
264
  resolveSessionKeyForRun,
264
265
  clearAgentRunContext,
266
+ toolEventRecipients,
265
267
  }));
266
268
  const heartbeatUnsub = onHeartbeatEvent((evt) => {
267
269
  broadcast("heartbeat", evt, { dropIfSlow: true });
@@ -304,6 +306,7 @@ export async function startGatewayServer(port = 18789, opts = {}) {
304
306
  incrementPresenceVersion,
305
307
  getHealthVersion,
306
308
  broadcast,
309
+ broadcastToConnIds,
307
310
  nodeSendToSession,
308
311
  nodeSendToAllSubscribed,
309
312
  nodeSubscribe,
@@ -318,6 +321,7 @@ export async function startGatewayServer(port = 18789, opts = {}) {
318
321
  chatDeltaSentAt: chatRunState.deltaSentAt,
319
322
  addChatRun,
320
323
  removeChatRun,
324
+ registerToolEventRecipient: toolEventRecipients.add,
321
325
  dedupe,
322
326
  wizardSessions,
323
327
  findRunningWizard,
@@ -2,6 +2,8 @@ import fs from "node:fs";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
4
  import { resolveSessionTranscriptPath } from "../config/sessions.js";
5
+ import { resolveRequiredHomeDir } from "../infra/home-dir.js";
6
+ import { extractToolCallNames, hasToolCall } from "../utils/transcript-tools.js";
5
7
  import { stripEnvelope } from "./chat-sanitize.js";
6
8
  export function readSessionMessages(sessionId, storePath, sessionFile) {
7
9
  const candidates = resolveSessionTranscriptCandidates(sessionId, storePath, sessionFile);
@@ -17,6 +19,22 @@ export function readSessionMessages(sessionId, storePath, sessionFile) {
17
19
  const parsed = JSON.parse(line);
18
20
  if (parsed?.message) {
19
21
  messages.push(parsed.message);
22
+ continue;
23
+ }
24
+ // Compaction entries are not "message" records, but they're useful context for debugging.
25
+ // Emit a lightweight synthetic message that the Web UI can render as a divider.
26
+ if (parsed?.type === "compaction") {
27
+ const ts = typeof parsed.timestamp === "string" ? Date.parse(parsed.timestamp) : Number.NaN;
28
+ const timestamp = Number.isFinite(ts) ? ts : Date.now();
29
+ messages.push({
30
+ role: "system",
31
+ content: [{ type: "text", text: "Compaction" }],
32
+ timestamp,
33
+ __poolbot: {
34
+ kind: "compaction",
35
+ id: typeof parsed.id === "string" ? parsed.id : undefined,
36
+ },
37
+ });
20
38
  }
21
39
  }
22
40
  catch {
@@ -36,7 +54,8 @@ export function resolveSessionTranscriptCandidates(sessionId, storePath, session
36
54
  if (agentId) {
37
55
  candidates.push(resolveSessionTranscriptPath(sessionId, agentId));
38
56
  }
39
- candidates.push(path.join(os.homedir(), ".poolbot", "sessions", `${sessionId}.jsonl`));
57
+ const home = resolveRequiredHomeDir(process.env, os.homedir);
58
+ candidates.push(path.join(home, ".poolbot", "sessions", `${sessionId}.jsonl`));
40
59
  return candidates;
41
60
  }
42
61
  export function archiveFileOnDisk(filePath, reason) {
@@ -214,31 +233,10 @@ function extractPreviewText(message) {
214
233
  return null;
215
234
  }
216
235
  function isToolCall(message) {
217
- if (message.toolName || message.tool_name)
218
- return true;
219
- if (!Array.isArray(message.content))
220
- return false;
221
- return message.content.some((entry) => {
222
- if (entry?.name)
223
- return true;
224
- const raw = typeof entry?.type === "string" ? entry.type.toLowerCase() : "";
225
- return raw === "toolcall" || raw === "tool_call";
226
- });
236
+ return hasToolCall(message);
227
237
  }
228
238
  function extractToolNames(message) {
229
- const names = [];
230
- if (Array.isArray(message.content)) {
231
- for (const entry of message.content) {
232
- if (typeof entry?.name === "string" && entry.name.trim()) {
233
- names.push(entry.name.trim());
234
- }
235
- }
236
- }
237
- const toolName = typeof message.toolName === "string" ? message.toolName : message.tool_name;
238
- if (typeof toolName === "string" && toolName.trim()) {
239
- names.push(toolName.trim());
240
- }
241
- return names;
239
+ return extractToolCallNames(message);
242
240
  }
243
241
  function extractMediaSummary(message) {
244
242
  if (!Array.isArray(message.content))
@@ -316,7 +314,7 @@ function readRecentMessagesFromTranscript(filePath, maxMessages, readBytes) {
316
314
  // skip malformed lines
317
315
  }
318
316
  }
319
- return collected.reverse();
317
+ return collected.toReversed();
320
318
  }
321
319
  catch {
322
320
  return [];
@@ -3,11 +3,12 @@ import path from "node:path";
3
3
  import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js";
4
4
  import { lookupContextTokens } from "../agents/context.js";
5
5
  import { DEFAULT_CONTEXT_TOKENS, DEFAULT_MODEL, DEFAULT_PROVIDER } from "../agents/defaults.js";
6
- import { resolveConfiguredModelRef } from "../agents/model-selection.js";
6
+ import { resolveConfiguredModelRef, resolveDefaultModelForAgent, } from "../agents/model-selection.js";
7
7
  import { loadConfig } from "../config/config.js";
8
8
  import { resolveStateDir } from "../config/paths.js";
9
9
  import { buildGroupDisplayName, canonicalizeMainSessionAlias, loadSessionStore, resolveMainSessionKey, resolveStorePath, } from "../config/sessions.js";
10
10
  import { normalizeAgentId, normalizeMainKey, parseAgentSessionKey, } from "../routing/session-key.js";
11
+ import { isCronRunSessionKey } from "../sessions/session-key-utils.js";
11
12
  import { normalizeSessionDeliveryFields } from "../utils/delivery-context.js";
12
13
  import { readFirstUserMessageFromTranscript, readLastMessagePreviewFromTranscript, } from "./session-utils.fs.js";
13
14
  export { archiveFileOnDisk, capArrayByJsonBytes, readFirstUserMessageFromTranscript, readLastMessagePreviewFromTranscript, readSessionPreviewItemsFromTranscript, readSessionMessages, resolveSessionTranscriptCandidates, } from "./session-utils.fs.js";
@@ -374,12 +375,14 @@ export function getSessionDefaults(cfg) {
374
375
  contextTokens: contextTokens ?? null,
375
376
  };
376
377
  }
377
- export function resolveSessionModelRef(cfg, entry) {
378
- const resolved = resolveConfiguredModelRef({
379
- cfg,
380
- defaultProvider: DEFAULT_PROVIDER,
381
- defaultModel: DEFAULT_MODEL,
382
- });
378
+ export function resolveSessionModelRef(cfg, entry, agentId) {
379
+ const resolved = agentId
380
+ ? resolveDefaultModelForAgent({ cfg, agentId })
381
+ : resolveConfiguredModelRef({
382
+ cfg,
383
+ defaultProvider: DEFAULT_PROVIDER,
384
+ defaultModel: DEFAULT_MODEL,
385
+ });
383
386
  let provider = resolved.provider;
384
387
  let model = resolved.model;
385
388
  const storedModelOverride = entry?.modelOverride?.trim();
@@ -405,6 +408,8 @@ export function listSessionsFromStore(params) {
405
408
  : undefined;
406
409
  let sessions = Object.entries(store)
407
410
  .filter(([key]) => {
411
+ if (isCronRunSessionKey(key))
412
+ return false;
408
413
  if (!includeGlobal && key === "global")
409
414
  return false;
410
415
  if (!includeUnknown && key === "unknown")
@@ -458,6 +463,11 @@ export function listSessionsFromStore(params) {
458
463
  entry?.label ??
459
464
  originLabel;
460
465
  const deliveryFields = normalizeSessionDeliveryFields(entry);
466
+ const parsedAgent = parseAgentSessionKey(key);
467
+ const sessionAgentId = normalizeAgentId(parsedAgent?.agentId ?? resolveDefaultAgentId(cfg));
468
+ const resolvedModel = resolveSessionModelRef(cfg, entry, sessionAgentId);
469
+ const modelProvider = resolvedModel.provider ?? DEFAULT_PROVIDER;
470
+ const model = resolvedModel.model ?? DEFAULT_MODEL;
461
471
  return {
462
472
  key,
463
473
  entry,
@@ -483,8 +493,8 @@ export function listSessionsFromStore(params) {
483
493
  outputTokens: entry?.outputTokens,
484
494
  totalTokens: total,
485
495
  responseUsage: entry?.responseUsage,
486
- modelProvider: entry?.modelProvider,
487
- model: entry?.model,
496
+ modelProvider,
497
+ model,
488
498
  contextTokens: entry?.contextTokens,
489
499
  deliveryContext: deliveryFields.deliveryContext,
490
500
  lastChannel: deliveryFields.lastChannel ?? entry?.lastChannel,
@@ -492,7 +502,7 @@ export function listSessionsFromStore(params) {
492
502
  lastAccountId: deliveryFields.lastAccountId ?? entry?.lastAccountId,
493
503
  };
494
504
  })
495
- .sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));
505
+ .toSorted((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));
496
506
  if (search) {
497
507
  sessions = sessions.filter((s) => {
498
508
  const fields = [s.displayName, s.label, s.subject, s.sessionId, s.key];
@@ -1,9 +1,9 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { DEFAULT_MODEL, DEFAULT_PROVIDER } from "../agents/defaults.js";
3
- import { resolveAllowedModelRef, resolveConfiguredModelRef } from "../agents/model-selection.js";
2
+ import { resolveAllowedModelRef, resolveDefaultModelForAgent } from "../agents/model-selection.js";
3
+ import { resolveDefaultAgentId } from "../agents/agent-scope.js";
4
4
  import { normalizeGroupActivation } from "../auto-reply/group-activation.js";
5
5
  import { formatThinkingLevels, formatXHighModelHint, normalizeElevatedLevel, normalizeReasoningLevel, normalizeThinkLevel, normalizeUsageDisplay, supportsXHighThinking, } from "../auto-reply/thinking.js";
6
- import { isSubagentSessionKey } from "../routing/session-key.js";
6
+ import { isSubagentSessionKey, normalizeAgentId, parseAgentSessionKey, } from "../routing/session-key.js";
7
7
  import { applyVerboseOverride, parseVerboseOverride } from "../sessions/level-overrides.js";
8
8
  import { normalizeSendPolicy } from "../sessions/send-policy.js";
9
9
  import { parseSessionLabel } from "../sessions/session-label.js";
@@ -36,6 +36,9 @@ function normalizeExecAsk(raw) {
36
36
  export async function applySessionsPatchToStore(params) {
37
37
  const { cfg, store, storeKey, patch } = params;
38
38
  const now = Date.now();
39
+ const parsedAgent = parseAgentSessionKey(storeKey);
40
+ const sessionAgentId = normalizeAgentId(parsedAgent?.agentId ?? resolveDefaultAgentId(cfg));
41
+ const resolvedDefault = resolveDefaultModelForAgent({ cfg, agentId: sessionAgentId });
39
42
  const existing = store[storeKey];
40
43
  const next = existing
41
44
  ? {
@@ -89,19 +92,11 @@ export async function applySessionsPatchToStore(params) {
89
92
  else if (raw !== undefined) {
90
93
  const normalized = normalizeThinkLevel(String(raw));
91
94
  if (!normalized) {
92
- const resolvedDefault = resolveConfiguredModelRef({
93
- cfg,
94
- defaultProvider: DEFAULT_PROVIDER,
95
- defaultModel: DEFAULT_MODEL,
96
- });
97
95
  const hintProvider = existing?.providerOverride?.trim() || resolvedDefault.provider;
98
96
  const hintModel = existing?.modelOverride?.trim() || resolvedDefault.model;
99
97
  return invalid(`invalid thinkingLevel (use ${formatThinkingLevels(hintProvider, hintModel, "|")})`);
100
98
  }
101
- if (normalized === "off")
102
- delete next.thinkingLevel;
103
- else
104
- next.thinkingLevel = normalized;
99
+ next.thinkingLevel = normalized;
105
100
  }
106
101
  }
107
102
  if ("verboseLevel" in patch) {
@@ -205,11 +200,6 @@ export async function applySessionsPatchToStore(params) {
205
200
  }
206
201
  if ("model" in patch) {
207
202
  const raw = patch.model;
208
- const resolvedDefault = resolveConfiguredModelRef({
209
- cfg,
210
- defaultProvider: DEFAULT_PROVIDER,
211
- defaultModel: DEFAULT_MODEL,
212
- });
213
203
  if (raw === null) {
214
204
  applyModelOverrideToSessionEntry({
215
205
  entry: next,
@@ -254,11 +244,6 @@ export async function applySessionsPatchToStore(params) {
254
244
  }
255
245
  }
256
246
  if (next.thinkingLevel === "xhigh") {
257
- const resolvedDefault = resolveConfiguredModelRef({
258
- cfg,
259
- defaultProvider: DEFAULT_PROVIDER,
260
- defaultModel: DEFAULT_MODEL,
261
- });
262
247
  const effectiveProvider = next.providerOverride ?? resolvedDefault.provider;
263
248
  const effectiveModel = next.modelOverride ?? resolvedDefault.model;
264
249
  if (!supportsXHighThinking(effectiveProvider, effectiveModel)) {
@@ -26,6 +26,7 @@ let previousConfigPath;
26
26
  let previousSkipBrowserControl;
27
27
  let previousSkipGmailWatcher;
28
28
  let previousSkipCanvasHost;
29
+ let previousBundledPluginsDir;
29
30
  let tempHome;
30
31
  let tempConfigRoot;
31
32
  export async function writeSessionStore(params) {
@@ -56,6 +57,7 @@ async function setupGatewayTestHome() {
56
57
  previousSkipBrowserControl = process.env.CLAWDBOT_SKIP_BROWSER_CONTROL_SERVER;
57
58
  previousSkipGmailWatcher = process.env.CLAWDBOT_SKIP_GMAIL_WATCHER;
58
59
  previousSkipCanvasHost = process.env.CLAWDBOT_SKIP_CANVAS_HOST;
60
+ previousBundledPluginsDir = process.env.CLAWDBOT_BUNDLED_PLUGINS_DIR;
59
61
  tempHome = await fs.mkdtemp(path.join(os.tmpdir(), "poolbot-gateway-home-"));
60
62
  process.env.HOME = tempHome;
61
63
  process.env.USERPROFILE = tempHome;
@@ -66,6 +68,9 @@ function applyGatewaySkipEnv() {
66
68
  process.env.CLAWDBOT_SKIP_BROWSER_CONTROL_SERVER = "1";
67
69
  process.env.CLAWDBOT_SKIP_GMAIL_WATCHER = "1";
68
70
  process.env.CLAWDBOT_SKIP_CANVAS_HOST = "1";
71
+ process.env.CLAWDBOT_BUNDLED_PLUGINS_DIR = tempHome
72
+ ? path.join(tempHome, "poolbot-test-no-bundled-extensions")
73
+ : "poolbot-test-no-bundled-extensions";
69
74
  }
70
75
  async function resetGatewayTestState(options) {
71
76
  // Some tests intentionally use fake timers; ensure they don't leak into gateway suites.
@@ -146,6 +151,10 @@ async function cleanupGatewayTestHome(options) {
146
151
  delete process.env.CLAWDBOT_SKIP_CANVAS_HOST;
147
152
  else
148
153
  process.env.CLAWDBOT_SKIP_CANVAS_HOST = previousSkipCanvasHost;
154
+ if (previousBundledPluginsDir === undefined)
155
+ delete process.env.CLAWDBOT_BUNDLED_PLUGINS_DIR;
156
+ else
157
+ process.env.CLAWDBOT_BUNDLED_PLUGINS_DIR = previousBundledPluginsDir;
149
158
  }
150
159
  if (options.restoreEnv && tempHome) {
151
160
  await fs.rm(tempHome, {
@@ -224,7 +233,8 @@ timeoutMs = 10_000) {
224
233
  }
225
234
  export async function startGatewayServer(port, opts) {
226
235
  const mod = await serverModulePromise;
227
- return await mod.startGatewayServer(port, opts);
236
+ const resolvedOpts = opts?.controlUiEnabled === undefined ? { ...opts, controlUiEnabled: false } : opts;
237
+ return await mod.startGatewayServer(port, resolvedOpts);
228
238
  }
229
239
  export async function startServerWithClient(token, opts) {
230
240
  let port = await getFreePort();
@@ -259,7 +269,30 @@ export async function startServerWithClient(token, opts) {
259
269
  throw new Error("failed to start gateway server after retries");
260
270
  }
261
271
  const ws = new WebSocket(`ws://127.0.0.1:${port}`);
262
- await new Promise((resolve) => ws.once("open", resolve));
272
+ await new Promise((resolve, reject) => {
273
+ const timer = setTimeout(() => reject(new Error("timeout waiting for ws open")), 10_000);
274
+ const cleanup = () => {
275
+ clearTimeout(timer);
276
+ ws.off("open", onOpen);
277
+ ws.off("error", onError);
278
+ ws.off("close", onClose);
279
+ };
280
+ const onOpen = () => {
281
+ cleanup();
282
+ resolve();
283
+ };
284
+ const onError = (err) => {
285
+ cleanup();
286
+ reject(err instanceof Error ? err : new Error(String(err)));
287
+ };
288
+ const onClose = (code, reason) => {
289
+ cleanup();
290
+ reject(new Error(`closed ${code}: ${reason.toString()}`));
291
+ };
292
+ ws.once("open", onOpen);
293
+ ws.once("error", onError);
294
+ ws.once("close", onClose);
295
+ });
263
296
  return { server, ws, port, prevToken: prev };
264
297
  }
265
298
  export async function connectReq(ws, opts) {
@@ -52,7 +52,7 @@ function parseFrontmatterBool(value, fallback) {
52
52
  const parsed = parseBooleanValue(value);
53
53
  return parsed === undefined ? fallback : parsed;
54
54
  }
55
- export function resolveMoltbotMetadata(frontmatter) {
55
+ export function resolvePoolbotMetadata(frontmatter) {
56
56
  const raw = getFrontmatterValue(frontmatter, "metadata");
57
57
  if (!raw)
58
58
  return undefined;
@@ -16,7 +16,7 @@ function normalizeInstallOptions(entry) {
16
16
  let label = (spec.label ?? "").trim();
17
17
  if (!label) {
18
18
  if (spec.kind === "bundled") {
19
- label = "Bundled with Moltbot";
19
+ label = "Bundled with Poolbot";
20
20
  }
21
21
  else if (spec.kind === "npm" && spec.package) {
22
22
  label = `Install ${spec.package} (npm)`;
@@ -23,7 +23,7 @@ export function resolveHookInstallDir(hookId, hooksDir) {
23
23
  const hooksBase = hooksDir ? resolveUserPath(hooksDir) : path.join(CONFIG_DIR, "hooks");
24
24
  return path.join(hooksBase, safeDirName(hookId));
25
25
  }
26
- async function ensureMoltbotHooks(manifest) {
26
+ async function ensurePoolbotHooks(manifest) {
27
27
  const hooks = manifest.poolbot?.hooks ?? manifest[LEGACY_MANIFEST_KEY]?.hooks;
28
28
  if (!Array.isArray(hooks)) {
29
29
  throw new Error("package.json missing poolbot.hooks");
@@ -72,7 +72,7 @@ async function installHookPackageFromDir(params) {
72
72
  }
73
73
  let hookEntries;
74
74
  try {
75
- hookEntries = await ensureMoltbotHooks(manifest);
75
+ hookEntries = await ensurePoolbotHooks(manifest);
76
76
  }
77
77
  catch (err) {
78
78
  return { ok: false, error: String(err) };
@@ -17,7 +17,7 @@ import { shouldIncludeHook } from "./config.js";
17
17
  * 1. Directory-based discovery (bundled, managed, workspace)
18
18
  * 2. Legacy config handlers (backwards compatibility)
19
19
  *
20
- * @param cfg - Moltbot configuration
20
+ * @param cfg - Poolbot configuration
21
21
  * @param workspaceDir - Workspace directory for hook discovery
22
22
  * @returns Number of handlers successfully loaded
23
23
  *
@@ -4,7 +4,7 @@ import { LEGACY_MANIFEST_KEY } from "../compat/legacy-names.js";
4
4
  import { CONFIG_DIR, resolveUserPath } from "../utils.js";
5
5
  import { resolveBundledHooksDir } from "./bundled-dir.js";
6
6
  import { shouldIncludeHook } from "./config.js";
7
- import { parseFrontmatter, resolveMoltbotMetadata, resolveHookInvocationPolicy, } from "./frontmatter.js";
7
+ import { parseFrontmatter, resolvePoolbotMetadata, resolveHookInvocationPolicy, } from "./frontmatter.js";
8
8
  function filterHookEntries(entries, config, eligibility) {
9
9
  return entries.filter((entry) => shouldIncludeHook({ entry, config, eligibility }));
10
10
  }
@@ -128,7 +128,7 @@ export function loadHookEntriesFromDir(params) {
128
128
  pluginId: params.pluginId,
129
129
  },
130
130
  frontmatter,
131
- metadata: resolveMoltbotMetadata(frontmatter),
131
+ metadata: resolvePoolbotMetadata(frontmatter),
132
132
  invocation: resolveHookInvocationPolicy(frontmatter),
133
133
  };
134
134
  return entry;
@@ -185,7 +185,7 @@ function loadHookEntries(workspaceDir, opts) {
185
185
  return {
186
186
  hook,
187
187
  frontmatter,
188
- metadata: resolveMoltbotMetadata(frontmatter),
188
+ metadata: resolvePoolbotMetadata(frontmatter),
189
189
  invocation: resolveHookInvocationPolicy(frontmatter),
190
190
  };
191
191
  });
@@ -0,0 +1,2 @@
1
+ /** Default timeout for iMessage probe/RPC operations (10 seconds). */
2
+ export const DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS = 10_000;
@@ -4,7 +4,7 @@ import { resolveMarkdownTableMode } from "../../config/markdown-tables.js";
4
4
  import { convertMarkdownTables } from "../../markdown/tables.js";
5
5
  import { sendMessageIMessage } from "../send.js";
6
6
  export async function deliverReplies(params) {
7
- const { replies, target, client, runtime, maxBytes, textLimit, accountId } = params;
7
+ const { replies, target, client, runtime, maxBytes, textLimit, accountId, sentMessageCache } = params;
8
8
  const cfg = loadConfig();
9
9
  const tableMode = resolveMarkdownTableMode({
10
10
  cfg,
@@ -25,6 +25,7 @@ export async function deliverReplies(params) {
25
25
  client,
26
26
  accountId,
27
27
  });
28
+ sentMessageCache?.remember(target, chunk);
28
29
  }
29
30
  }
30
31
  else {
@@ -38,6 +39,8 @@ export async function deliverReplies(params) {
38
39
  client,
39
40
  accountId,
40
41
  });
42
+ if (caption)
43
+ sentMessageCache?.remember(target, caption);
41
44
  }
42
45
  }
43
46
  runtime.log?.(`imessage: delivered reply to ${target}`);