@poolzin/pool-bot 2026.2.25 → 2026.2.26

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 (506) hide show
  1. package/dist/acp/event-mapper.js +87 -22
  2. package/dist/acp/meta.js +12 -6
  3. package/dist/agents/agent-paths.js +8 -9
  4. package/dist/agents/agent-scope.js +7 -5
  5. package/dist/agents/auth-profiles/oauth.js +148 -64
  6. package/dist/agents/auth-profiles/session-override.js +13 -7
  7. package/dist/agents/bash-tools.exec-host-gateway.js +14 -4
  8. package/dist/agents/bash-tools.exec-runtime.js +2 -25
  9. package/dist/agents/bedrock-discovery.js +3 -1
  10. package/dist/agents/byteplus-models.js +97 -0
  11. package/dist/agents/chutes-oauth.js +1 -0
  12. package/dist/agents/cli-runner/helpers.js +4 -0
  13. package/dist/agents/compaction.js +41 -14
  14. package/dist/agents/doubao-models.js +121 -0
  15. package/dist/agents/failover-error.js +2 -0
  16. package/dist/agents/huggingface-models.js +5 -3
  17. package/dist/agents/live-model-filter.js +5 -0
  18. package/dist/agents/minimax-vlm.js +10 -8
  19. package/dist/agents/model-auth.js +6 -0
  20. package/dist/agents/model-catalog.js +3 -1
  21. package/dist/agents/model-selection.js +7 -1
  22. package/dist/agents/models-config.providers.js +93 -11
  23. package/dist/agents/ollama-stream.js +117 -4
  24. package/dist/agents/opencode-zen-models.js +22 -11
  25. package/dist/agents/pi-embedded-helpers/errors.js +55 -33
  26. package/dist/agents/pi-embedded-helpers/messaging-dedupe.js +10 -5
  27. package/dist/agents/pi-embedded-helpers/thinking.js +10 -5
  28. package/dist/agents/pi-embedded-helpers.js +1 -1
  29. package/dist/agents/pi-embedded-runner/compact.js +29 -7
  30. package/dist/agents/pi-embedded-runner/extensions.js +28 -26
  31. package/dist/agents/pi-embedded-runner/google.js +20 -8
  32. package/dist/agents/pi-embedded-runner/run/attempt.js +95 -36
  33. package/dist/agents/pi-embedded-runner/run.js +71 -12
  34. package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +11 -2
  35. package/dist/agents/pi-embedded-runner/session-manager-cache.js +11 -7
  36. package/dist/agents/pi-embedded-runner/system-prompt.js +2 -0
  37. package/dist/agents/pi-embedded-runner/thinking.js +42 -0
  38. package/dist/agents/pi-embedded-runner/tool-name-allowlist.js +19 -0
  39. package/dist/agents/pi-embedded-runner/utils.js +7 -10
  40. package/dist/agents/pi-embedded-subscribe.handlers.lifecycle.js +45 -56
  41. package/dist/agents/pi-embedded-subscribe.handlers.tools.js +2 -2
  42. package/dist/agents/pi-embedded-subscribe.js +9 -4
  43. package/dist/agents/pi-embedded-subscribe.tools.js +68 -14
  44. package/dist/agents/pi-embedded-utils.js +3 -0
  45. package/dist/agents/pi-extensions/compaction-safeguard-runtime.js +4 -20
  46. package/dist/agents/pi-extensions/compaction-safeguard.js +75 -33
  47. package/dist/agents/pi-settings.js +40 -0
  48. package/dist/agents/pi-tools.policy.js +2 -1
  49. package/dist/agents/provider/config-loader.js +1 -1
  50. package/dist/agents/sandbox/browser.js +170 -33
  51. package/dist/agents/sandbox/config-hash.js +14 -27
  52. package/dist/agents/sandbox/config.js +21 -2
  53. package/dist/agents/sandbox/constants.js +2 -0
  54. package/dist/agents/sandbox/docker.js +16 -2
  55. package/dist/agents/sandbox/novnc-auth.js +62 -0
  56. package/dist/agents/sandbox/sanitize-env-vars.js +1 -1
  57. package/dist/agents/sandbox/shared.js +10 -6
  58. package/dist/agents/sandbox-paths.js +24 -11
  59. package/dist/agents/schema/clean-for-gemini.js +132 -85
  60. package/dist/agents/session-slug.js +10 -5
  61. package/dist/agents/session-tool-result-guard-wrapper.js +1 -0
  62. package/dist/agents/session-tool-result-guard.js +3 -1
  63. package/dist/agents/session-transcript-repair.js +40 -6
  64. package/dist/agents/skills/bundled-dir.js +19 -5
  65. package/dist/agents/skills/env-overrides.js +124 -43
  66. package/dist/agents/skills/frontmatter.js +6 -6
  67. package/dist/agents/skills/plugin-skills.js +14 -7
  68. package/dist/agents/skills/workspace.js +1 -0
  69. package/dist/agents/subagent-announce.js +251 -49
  70. package/dist/agents/subagent-lifecycle-events.js +19 -0
  71. package/dist/agents/subagent-registry-cleanup.js +31 -0
  72. package/dist/agents/subagent-registry-completion.js +68 -0
  73. package/dist/agents/subagent-registry-queries.js +117 -0
  74. package/dist/agents/subagent-registry-state.js +46 -0
  75. package/dist/agents/subagent-registry.js +252 -221
  76. package/dist/agents/subagent-registry.store.js +1 -0
  77. package/dist/agents/subagent-registry.types.js +1 -0
  78. package/dist/agents/subagent-spawn.js +195 -7
  79. package/dist/agents/system-prompt.js +22 -6
  80. package/dist/agents/test-helpers/fast-coding-tools.js +1 -18
  81. package/dist/agents/test-helpers/fast-core-tools.js +1 -17
  82. package/dist/agents/timeout.js +18 -6
  83. package/dist/agents/tool-call-id.js +1 -1
  84. package/dist/agents/tool-display-common.js +162 -29
  85. package/dist/agents/tool-images.js +82 -9
  86. package/dist/agents/tool-policy.js +51 -26
  87. package/dist/agents/tools/browser-tool.js +2 -2
  88. package/dist/agents/tools/canvas-tool.js +27 -1
  89. package/dist/agents/tools/common.js +45 -0
  90. package/dist/agents/tools/discord-actions-guild.js +4 -1
  91. package/dist/agents/tools/gateway-tool.js +3 -1
  92. package/dist/agents/tools/nodes-utils.js +1 -10
  93. package/dist/agents/tools/sessions-send-helpers.js +12 -6
  94. package/dist/agents/tools/sessions-spawn-tool.js +8 -2
  95. package/dist/agents/tools/subagents-tool.js +2 -1
  96. package/dist/agents/tools/whatsapp-actions.js +10 -2
  97. package/dist/agents/tools/whatsapp-target-auth.js +18 -0
  98. package/dist/agents/transcript-policy.js +22 -8
  99. package/dist/agents/venice-models.js +11 -3
  100. package/dist/auto-reply/commands-registry.data.js +51 -0
  101. package/dist/auto-reply/commands-registry.js +4 -3
  102. package/dist/auto-reply/group-activation.js +10 -5
  103. package/dist/auto-reply/inbound-debounce.js +10 -5
  104. package/dist/auto-reply/reply/abort.js +1 -1
  105. package/dist/auto-reply/reply/agent-runner-execution.js +4 -1
  106. package/dist/auto-reply/reply/bash-command.js +41 -39
  107. package/dist/auto-reply/reply/command-gates.js +25 -0
  108. package/dist/auto-reply/reply/commands-allowlist.js +111 -72
  109. package/dist/auto-reply/reply/commands-bash.js +6 -5
  110. package/dist/auto-reply/reply/commands-config.js +30 -28
  111. package/dist/auto-reply/reply/commands-core.js +2 -1
  112. package/dist/auto-reply/reply/commands-info.js +1 -0
  113. package/dist/auto-reply/reply/commands-models.js +65 -14
  114. package/dist/auto-reply/reply/commands-session.js +237 -82
  115. package/dist/auto-reply/reply/commands-setunset.js +45 -0
  116. package/dist/auto-reply/reply/commands-subagents/action-agents.js +44 -0
  117. package/dist/auto-reply/reply/commands-subagents/action-focus.js +64 -0
  118. package/dist/auto-reply/reply/commands-subagents/action-help.js +4 -0
  119. package/dist/auto-reply/reply/commands-subagents/action-info.js +45 -0
  120. package/dist/auto-reply/reply/commands-subagents/action-kill.js +60 -0
  121. package/dist/auto-reply/reply/commands-subagents/action-list.js +44 -0
  122. package/dist/auto-reply/reply/commands-subagents/action-log.js +29 -0
  123. package/dist/auto-reply/reply/commands-subagents/action-send.js +119 -0
  124. package/dist/auto-reply/reply/commands-subagents/action-spawn.js +52 -0
  125. package/dist/auto-reply/reply/commands-subagents/action-unfocus.js +30 -0
  126. package/dist/auto-reply/reply/commands-subagents/shared.js +303 -0
  127. package/dist/auto-reply/reply/commands-subagents.js +51 -587
  128. package/dist/auto-reply/reply/commands-tts.js +10 -5
  129. package/dist/auto-reply/reply/config-value.js +10 -5
  130. package/dist/auto-reply/reply/directive-handling.model-picker.js +12 -6
  131. package/dist/auto-reply/reply/directive-handling.persist.js +9 -21
  132. package/dist/auto-reply/reply/directive-handling.shared.js +24 -4
  133. package/dist/auto-reply/reply/followup-runner.js +1 -0
  134. package/dist/auto-reply/reply/get-reply-directives-utils.js +23 -14
  135. package/dist/auto-reply/reply/get-reply-directives.js +17 -28
  136. package/dist/auto-reply/reply/get-reply-inline-actions.js +1 -0
  137. package/dist/auto-reply/reply/get-reply.js +71 -12
  138. package/dist/auto-reply/reply/model-selection.js +80 -39
  139. package/dist/auto-reply/reply/queue/enqueue.js +10 -5
  140. package/dist/auto-reply/reply/queue/state.js +13 -12
  141. package/dist/auto-reply/reply/reply-payloads.js +67 -36
  142. package/dist/auto-reply/reply/reply-reference.js +9 -8
  143. package/dist/auto-reply/reply/route-reply.js +15 -8
  144. package/dist/auto-reply/reply/session-reset-prompt.js +1 -1
  145. package/dist/auto-reply/reply/session.js +22 -6
  146. package/dist/auto-reply/reply/strip-inbound-meta.js +147 -0
  147. package/dist/auto-reply/reply/subagents-utils.js +56 -30
  148. package/dist/auto-reply/reply/typing.js +46 -21
  149. package/dist/auto-reply/send-policy.js +14 -7
  150. package/dist/auto-reply/status.js +140 -16
  151. package/dist/auto-reply/templating.js +10 -5
  152. package/dist/auto-reply/thinking.js +7 -16
  153. package/dist/auto-reply/tokens.js +21 -5
  154. package/dist/browser/bridge-server.js +36 -20
  155. package/dist/browser/cdp.helpers.js +7 -14
  156. package/dist/browser/cdp.js +35 -15
  157. package/dist/browser/chrome.profile-decoration.js +7 -4
  158. package/dist/browser/config.js +4 -0
  159. package/dist/browser/extension-relay-auth.js +55 -0
  160. package/dist/browser/extension-relay.js +74 -29
  161. package/dist/browser/navigation-guard.js +9 -1
  162. package/dist/browser/paths.js +77 -0
  163. package/dist/browser/profiles.js +13 -8
  164. package/dist/browser/pw-ai-module.js +10 -5
  165. package/dist/browser/pw-session.js +76 -39
  166. package/dist/browser/pw-tools-core.interactions.js +14 -7
  167. package/dist/browser/pw-tools-core.state.js +12 -6
  168. package/dist/browser/routes/agent.act.js +2 -2
  169. package/dist/browser/server-context.js +7 -0
  170. package/dist/build-info.json +3 -3
  171. package/dist/channels/allow-from.js +2 -1
  172. package/dist/channels/allowlists/resolve-utils.js +43 -19
  173. package/dist/channels/channel-config.js +14 -7
  174. package/dist/channels/draft-stream-loop.js +7 -0
  175. package/dist/channels/model-overrides.js +82 -0
  176. package/dist/channels/plugins/normalize/imessage.js +14 -7
  177. package/dist/channels/plugins/normalize/slack.js +10 -5
  178. package/dist/channels/plugins/normalize/telegram.js +14 -7
  179. package/dist/channels/plugins/outbound/discord.js +80 -8
  180. package/dist/channels/plugins/outbound/signal.js +11 -11
  181. package/dist/channels/plugins/setup-helpers.js +10 -5
  182. package/dist/channels/sender-label.js +14 -7
  183. package/dist/channels/session.js +4 -2
  184. package/dist/channels/status-reactions.js +297 -0
  185. package/dist/cli/banner.js +1 -1
  186. package/dist/cli/browser-cli-actions-input/register.files-downloads.js +65 -56
  187. package/dist/cli/cli-name.js +11 -11
  188. package/dist/cli/cli-utils.js +13 -3
  189. package/dist/cli/command-format.js +1 -1
  190. package/dist/cli/config-cli.js +1 -1
  191. package/dist/cli/daemon-cli/lifecycle-core.js +31 -19
  192. package/dist/cli/daemon-cli/lifecycle.js +64 -2
  193. package/dist/cli/daemon-cli/restart-health.js +126 -0
  194. package/dist/cli/daemon-cli/status.gather.js +9 -13
  195. package/dist/cli/daemon-cli/status.print.js +2 -10
  196. package/dist/cli/deps.js +27 -22
  197. package/dist/cli/gateway-cli/run-loop.js +23 -5
  198. package/dist/cli/node-cli/register.js +14 -5
  199. package/dist/cli/nodes-media-utils.js +7 -2
  200. package/dist/cli/outbound-send-deps.js +2 -9
  201. package/dist/cli/outbound-send-mapping.js +11 -0
  202. package/dist/cli/pairing-cli.js +40 -14
  203. package/dist/cli/plugins-cli.js +34 -41
  204. package/dist/cli/ports.js +11 -10
  205. package/dist/cli/program/command-registry.js +2 -11
  206. package/dist/cli/program/command-tree.js +16 -0
  207. package/dist/cli/program/preaction.js +13 -9
  208. package/dist/cli/program/register.configure.js +3 -18
  209. package/dist/cli/program/register.maintenance.js +2 -2
  210. package/dist/cli/program/register.onboard.js +2 -0
  211. package/dist/cli/program/register.status-health-sessions.js +16 -17
  212. package/dist/cli/program/register.subclis.js +93 -52
  213. package/dist/cli/route.js +11 -7
  214. package/dist/cli/system-cli.js +36 -46
  215. package/dist/cli/update-cli/shared.js +22 -9
  216. package/dist/cli/update-cli/update-command.js +89 -14
  217. package/dist/cli/update-cli/wizard.js +6 -12
  218. package/dist/commands/agent/run-context.js +18 -5
  219. package/dist/commands/agent/session-store.js +17 -4
  220. package/dist/commands/agent.js +22 -2
  221. package/dist/commands/agents.bindings.js +14 -7
  222. package/dist/commands/agents.commands.add.js +13 -9
  223. package/dist/commands/agents.commands.identity.js +12 -6
  224. package/dist/commands/agents.commands.list.js +11 -6
  225. package/dist/commands/agents.config.js +8 -10
  226. package/dist/commands/agents.providers.js +12 -6
  227. package/dist/commands/auth-choice-options.js +103 -75
  228. package/dist/commands/auth-choice.apply.byteplus.js +55 -0
  229. package/dist/commands/auth-choice.apply.js +4 -0
  230. package/dist/commands/auth-choice.apply.minimax.js +61 -13
  231. package/dist/commands/auth-choice.apply.openai.js +3 -1
  232. package/dist/commands/auth-choice.apply.volcengine.js +55 -0
  233. package/dist/commands/auth-choice.preferred-provider.js +2 -0
  234. package/dist/commands/channels/remove.js +13 -6
  235. package/dist/commands/channels/shared.js +4 -14
  236. package/dist/commands/configure.commands.js +14 -0
  237. package/dist/commands/configure.gateway.js +2 -4
  238. package/dist/commands/configure.js +1 -1
  239. package/dist/commands/configure.shared.js +11 -0
  240. package/dist/commands/daemon-install-helpers.js +2 -2
  241. package/dist/commands/dashboard.js +12 -10
  242. package/dist/commands/docs.js +14 -8
  243. package/dist/commands/doctor-config-flow.js +11 -9
  244. package/dist/commands/doctor-legacy-config.js +281 -0
  245. package/dist/commands/doctor-state-integrity.js +99 -23
  246. package/dist/commands/doctor-update.js +12 -9
  247. package/dist/commands/models/list.list-command.js +7 -5
  248. package/dist/commands/models/set-image.js +2 -21
  249. package/dist/commands/node-daemon-install-helpers.js +10 -8
  250. package/dist/commands/onboard-auth.config-minimax.js +54 -80
  251. package/dist/commands/onboard-auth.config-opencode.js +2 -18
  252. package/dist/commands/onboard-auth.credentials.js +90 -13
  253. package/dist/commands/onboard-auth.js +1 -1
  254. package/dist/commands/onboard-auth.models.js +6 -5
  255. package/dist/commands/onboard-hooks.js +1 -1
  256. package/dist/commands/onboard-non-interactive/api-keys.js +14 -7
  257. package/dist/commands/onboard-non-interactive/local/auth-choice.js +64 -49
  258. package/dist/commands/onboard-provider-auth-flags.js +14 -0
  259. package/dist/commands/onboard-remote.js +14 -7
  260. package/dist/commands/onboard.js +11 -13
  261. package/dist/commands/sandbox-display.js +6 -5
  262. package/dist/commands/status-all/diagnosis.js +14 -10
  263. package/dist/commands/status-all/format.js +1 -0
  264. package/dist/commands/status.gateway-probe.js +1 -16
  265. package/dist/commands/systemd-linger.js +12 -6
  266. package/dist/config/agent-limits.js +2 -0
  267. package/dist/config/commands.js +30 -16
  268. package/dist/config/config-paths.js +9 -11
  269. package/dist/config/defaults.js +22 -2
  270. package/dist/config/discord-preview-streaming.js +104 -0
  271. package/dist/config/env-vars.js +37 -8
  272. package/dist/config/includes.js +4 -0
  273. package/dist/config/io.js +97 -12
  274. package/dist/config/legacy.migrations.part-1.js +189 -78
  275. package/dist/config/legacy.shared.js +3 -1
  276. package/dist/config/merge-patch.js +4 -0
  277. package/dist/config/prototype-keys.js +4 -0
  278. package/dist/config/schema.help.js +44 -7
  279. package/dist/config/schema.labels.js +38 -6
  280. package/dist/config/sessions/delivery-info.js +10 -3
  281. package/dist/config/sessions/main-session.js +10 -5
  282. package/dist/config/sessions/session-file.js +33 -0
  283. package/dist/config/sessions/session-key.js +10 -5
  284. package/dist/config/sessions/store.js +1 -1
  285. package/dist/config/sessions.js +1 -0
  286. package/dist/config/zod-schema.agent-runtime.js +11 -0
  287. package/dist/config/zod-schema.js +148 -13
  288. package/dist/config/zod-schema.providers-core.js +78 -4
  289. package/dist/config/zod-schema.providers.js +6 -1
  290. package/dist/config/zod-schema.session.js +41 -2
  291. package/dist/cron/run-log.js +3 -0
  292. package/dist/cron/schedule.js +21 -10
  293. package/dist/cron/service/ops.js +35 -21
  294. package/dist/cron/service/timer.js +116 -16
  295. package/dist/cron/stagger.js +3 -1
  296. package/dist/discord/api.js +12 -6
  297. package/dist/discord/draft-chunking.js +22 -0
  298. package/dist/discord/draft-stream.js +124 -0
  299. package/dist/discord/monitor/agent-components.js +1 -1
  300. package/dist/discord/monitor/commands.js +5 -0
  301. package/dist/discord/monitor/gateway-plugin.js +2 -1
  302. package/dist/discord/monitor/listeners.js +37 -27
  303. package/dist/discord/monitor/message-handler.js +4 -1
  304. package/dist/discord/monitor/message-handler.preflight.js +65 -8
  305. package/dist/discord/monitor/message-handler.process.js +246 -217
  306. package/dist/discord/monitor/message-utils.js +143 -6
  307. package/dist/discord/monitor/model-picker-preferences.js +143 -0
  308. package/dist/discord/monitor/model-picker.js +651 -0
  309. package/dist/discord/monitor/native-command.js +573 -16
  310. package/dist/discord/monitor/provider.allowlist.js +223 -0
  311. package/dist/discord/monitor/provider.js +275 -347
  312. package/dist/discord/monitor/provider.lifecycle.js +100 -0
  313. package/dist/discord/monitor/reply-delivery.js +123 -16
  314. package/dist/discord/monitor/thread-bindings.discord-api.js +215 -0
  315. package/dist/discord/monitor/thread-bindings.js +4 -0
  316. package/dist/discord/monitor/thread-bindings.lifecycle.js +177 -0
  317. package/dist/discord/monitor/thread-bindings.manager.js +423 -0
  318. package/dist/discord/monitor/thread-bindings.messages.js +55 -0
  319. package/dist/discord/monitor/thread-bindings.state.js +358 -0
  320. package/dist/discord/monitor/thread-bindings.types.js +6 -0
  321. package/dist/discord/resolve-users.js +33 -21
  322. package/dist/discord/send.channels.js +15 -0
  323. package/dist/discord/send.js +3 -2
  324. package/dist/discord/send.outbound.js +82 -26
  325. package/dist/discord/send.permissions.js +83 -30
  326. package/dist/discord/send.reactions.js +8 -4
  327. package/dist/discord/token.js +10 -5
  328. package/dist/discord/voice/command.js +263 -0
  329. package/dist/discord/voice/manager.js +531 -0
  330. package/dist/gateway/auth.js +34 -10
  331. package/dist/gateway/call.js +4 -16
  332. package/dist/gateway/client.js +28 -4
  333. package/dist/gateway/config-reload.js +3 -4
  334. package/dist/gateway/control-ui.js +219 -96
  335. package/dist/gateway/hooks-mapping.js +88 -38
  336. package/dist/gateway/http-auth-helpers.js +3 -2
  337. package/dist/gateway/http-endpoint-helpers.js +1 -0
  338. package/dist/gateway/net.js +54 -12
  339. package/dist/gateway/node-invoke-system-run-approval.js +14 -35
  340. package/dist/gateway/node-registry.js +10 -5
  341. package/dist/gateway/openai-http.js +1 -0
  342. package/dist/gateway/openresponses-http.js +1 -0
  343. package/dist/gateway/origin-check.js +1 -18
  344. package/dist/gateway/protocol/index.js +4 -3
  345. package/dist/gateway/protocol/schema/cron.js +1 -0
  346. package/dist/gateway/protocol/schema/devices.js +1 -0
  347. package/dist/gateway/protocol/schema/protocol-schemas.js +2 -1
  348. package/dist/gateway/protocol/schema/sessions.js +6 -0
  349. package/dist/gateway/role-policy.js +17 -0
  350. package/dist/gateway/server/ws-connection/connect-policy.js +37 -0
  351. package/dist/gateway/server/ws-connection/message-handler.js +175 -148
  352. package/dist/gateway/server-chat.js +83 -25
  353. package/dist/gateway/server-constants.js +10 -9
  354. package/dist/gateway/server-cron.js +1 -0
  355. package/dist/gateway/server-http.js +16 -7
  356. package/dist/gateway/server-maintenance.js +20 -5
  357. package/dist/gateway/server-methods/chat.js +10 -6
  358. package/dist/gateway/server-methods/config.js +12 -14
  359. package/dist/gateway/server-methods/devices.js +17 -3
  360. package/dist/gateway/server-methods/models.js +11 -1
  361. package/dist/gateway/server-methods/sessions.js +64 -8
  362. package/dist/gateway/server-methods/usage.js +162 -75
  363. package/dist/gateway/server-node-events.js +29 -0
  364. package/dist/gateway/server-runtime-config.js +34 -13
  365. package/dist/gateway/server-startup-memory.js +17 -11
  366. package/dist/gateway/session-utils.fs.js +32 -34
  367. package/dist/gateway/sessions-resolve.js +17 -5
  368. package/dist/gateway/test-helpers.openai-mock.js +14 -7
  369. package/dist/gateway/tools-invoke-http.js +21 -10
  370. package/dist/hooks/bundled/bootstrap-extra-files/handler.js +3 -1
  371. package/dist/hooks/bundled/command-logger/handler.js +7 -2
  372. package/dist/hooks/bundled/session-memory/handler.js +6 -5
  373. package/dist/hooks/frontmatter.js +6 -6
  374. package/dist/hooks/gmail-watcher.js +11 -6
  375. package/dist/hooks/internal-hooks.js +11 -1
  376. package/dist/hooks/llm-slug-generator.js +4 -1
  377. package/dist/hooks/workspace.js +47 -17
  378. package/dist/imessage/accounts.js +9 -20
  379. package/dist/imessage/monitor/inbound-processing.js +2 -1
  380. package/dist/infra/archive.js +174 -73
  381. package/dist/infra/control-ui-assets.js +14 -6
  382. package/dist/infra/device-pairing.js +108 -29
  383. package/dist/infra/env.js +10 -5
  384. package/dist/infra/exec-approvals-allowlist.js +122 -0
  385. package/dist/infra/exec-approvals-analysis.js +34 -3
  386. package/dist/infra/exec-approvals.js +5 -17
  387. package/dist/infra/exec-safe-bin-policy.js +53 -45
  388. package/dist/infra/fs-safe.js +71 -39
  389. package/dist/infra/gateway-lock.js +6 -2
  390. package/dist/infra/heartbeat-wake.js +6 -12
  391. package/dist/infra/host-env-security-policy.json +19 -0
  392. package/dist/infra/host-env-security.js +66 -0
  393. package/dist/infra/net/ssrf.js +131 -38
  394. package/dist/infra/outbound/bound-delivery-router.js +88 -0
  395. package/dist/infra/outbound/channel-selection.js +12 -6
  396. package/dist/infra/outbound/envelope.js +1 -1
  397. package/dist/infra/outbound/format.js +12 -6
  398. package/dist/infra/outbound/payloads.js +14 -7
  399. package/dist/infra/outbound/session-binding-service.js +123 -0
  400. package/dist/infra/path-guards.js +25 -0
  401. package/dist/infra/provider-usage.fetch.codex.js +7 -15
  402. package/dist/infra/provider-usage.fetch.gemini.js +14 -11
  403. package/dist/infra/provider-usage.fetch.shared.js +30 -1
  404. package/dist/infra/provider-usage.fetch.zai.js +10 -9
  405. package/dist/infra/retry-policy.js +4 -2
  406. package/dist/infra/retry.js +9 -5
  407. package/dist/infra/session-cost-usage.js +107 -59
  408. package/dist/infra/session-maintenance-warning.js +3 -1
  409. package/dist/infra/shell-env.js +98 -34
  410. package/dist/infra/ssh-config.js +12 -6
  411. package/dist/infra/system-run-command.js +49 -4
  412. package/dist/infra/update-channels.js +10 -5
  413. package/dist/line/accounts.js +5 -7
  414. package/dist/line/bot-access.js +8 -20
  415. package/dist/line/bot-handlers.js +3 -1
  416. package/dist/link-understanding/detect.js +15 -7
  417. package/dist/media/constants.js +15 -6
  418. package/dist/media/image-ops.js +7 -0
  419. package/dist/media/local-roots.js +3 -2
  420. package/dist/media-understanding/apply.js +4 -1
  421. package/dist/media-understanding/concurrency.js +8 -20
  422. package/dist/memory/backend-config.js +45 -6
  423. package/dist/memory/embeddings.js +10 -4
  424. package/dist/memory/fs-utils.js +23 -0
  425. package/dist/memory/manager-search.js +12 -6
  426. package/dist/memory/manager-sync-ops.js +12 -2
  427. package/dist/memory/qmd-manager.js +466 -53
  428. package/dist/memory/query-expansion.js +167 -3
  429. package/dist/memory/status-format.js +10 -5
  430. package/dist/memory/sync-memory-files.js +1 -1
  431. package/dist/node-host/invoke-system-run.js +281 -0
  432. package/dist/node-host/invoke.js +55 -337
  433. package/dist/pairing/pairing-store.js +22 -0
  434. package/dist/plugin-sdk/allow-from.js +1 -1
  435. package/dist/plugin-sdk/command-auth.js +3 -1
  436. package/dist/plugin-sdk/index.js +6 -3
  437. package/dist/plugin-sdk/webhook-targets.js +32 -0
  438. package/dist/plugins/bundled-dir.js +9 -6
  439. package/dist/plugins/hooks.js +50 -0
  440. package/dist/plugins/install.js +28 -16
  441. package/dist/plugins/runtime.js +3 -17
  442. package/dist/plugins/update.js +78 -12
  443. package/dist/process/spawn-utils.js +14 -7
  444. package/dist/providers/github-copilot-token.js +11 -6
  445. package/dist/providers/qwen-portal-oauth.js +14 -6
  446. package/dist/routing/account-id.js +30 -0
  447. package/dist/routing/resolve-route.js +3 -7
  448. package/dist/routing/session-key.js +2 -16
  449. package/dist/security/audit-channel.js +93 -2
  450. package/dist/security/audit-extra.async.js +159 -5
  451. package/dist/security/audit-extra.js +1 -1
  452. package/dist/security/audit-extra.sync.js +85 -6
  453. package/dist/security/audit.js +40 -4
  454. package/dist/security/dm-policy-shared.js +44 -0
  455. package/dist/security/external-content.js +26 -6
  456. package/dist/shared/entry-status.js +6 -0
  457. package/dist/shared/frontmatter.js +5 -5
  458. package/dist/shared/node-match.js +11 -4
  459. package/dist/shared/operator-scope-compat.js +8 -3
  460. package/dist/signal/accounts.js +7 -20
  461. package/dist/signal/monitor/event-handler.js +3 -1
  462. package/dist/slack/accounts.js +6 -19
  463. package/dist/slack/actions.js +11 -3
  464. package/dist/slack/monitor/auth.js +1 -1
  465. package/dist/slack/monitor/message-handler/dispatch.js +50 -29
  466. package/dist/slack/monitor/replies.js +15 -7
  467. package/dist/slack/monitor/slash.js +22 -13
  468. package/dist/slack/resolve-channels.js +10 -5
  469. package/dist/slack/send.js +102 -12
  470. package/dist/slack/stream-mode.js +10 -0
  471. package/dist/slack/streaming.js +4 -2
  472. package/dist/telegram/accounts.js +19 -14
  473. package/dist/telegram/bot/helpers.js +3 -5
  474. package/dist/telegram/bot-access.js +35 -36
  475. package/dist/telegram/bot-handlers.js +120 -148
  476. package/dist/telegram/bot-message-context.js +68 -9
  477. package/dist/telegram/bot-message-dispatch.js +155 -90
  478. package/dist/telegram/bot-native-commands.js +16 -0
  479. package/dist/telegram/draft-stream.js +14 -1
  480. package/dist/telegram/inline-buttons.js +5 -15
  481. package/dist/telegram/monitor.js +11 -7
  482. package/dist/telegram/network-config.js +19 -7
  483. package/dist/telegram/send.js +3 -2
  484. package/dist/telegram/sent-message-cache.js +5 -6
  485. package/dist/telegram/status-reaction-variants.js +208 -0
  486. package/dist/telegram/sticker-cache.js +11 -9
  487. package/dist/terminal/theme.js +12 -12
  488. package/dist/tts/tts.js +80 -567
  489. package/dist/tui/components/chat-log.js +41 -8
  490. package/dist/tui/theme/theme.js +10 -12
  491. package/dist/tui/tui-local-shell.js +16 -6
  492. package/dist/tui/tui.js +58 -6
  493. package/dist/utils/account-id.js +2 -4
  494. package/dist/utils/boolean.js +10 -5
  495. package/dist/utils/directive-tags.js +11 -0
  496. package/dist/utils/queue-helpers.js +67 -12
  497. package/dist/web/auto-reply/deliver-reply.js +8 -4
  498. package/dist/web/auto-reply/mentions.js +10 -5
  499. package/dist/web/auto-reply/monitor/group-members.js +14 -7
  500. package/dist/web/auto-reply/monitor/process-message.js +45 -24
  501. package/dist/web/inbound/access-control.js +5 -2
  502. package/dist/web/login-qr.js +12 -6
  503. package/dist/web/media.js +123 -16
  504. package/extensions/bluebubbles/src/monitor-processing.ts +580 -139
  505. package/extensions/bluebubbles/src/monitor.ts +208 -1950
  506. package/package.json +1 -1
@@ -2,7 +2,7 @@ import path from "node:path";
2
2
  import { confirm, isCancel } from "@clack/prompts";
3
3
  import { checkShellCompletionStatus, ensureCompletionCacheExists, } from "../../commands/doctor-completion.js";
4
4
  import { doctorCommand } from "../../commands/doctor.js";
5
- import { readConfigFileSnapshot, writeConfigFile } from "../../config/config.js";
5
+ import { readConfigFileSnapshot, resolveGatewayPort, writeConfigFile, } from "../../config/config.js";
6
6
  import { resolveGatewayService } from "../../daemon/service.js";
7
7
  import { channelToNpmTag, DEFAULT_GIT_CHANNEL, DEFAULT_PACKAGE_CHANNEL, normalizeUpdateChannel, } from "../../infra/update-channels.js";
8
8
  import { compareSemverStrings, resolveNpmChannelTag, checkUpdateStatus, } from "../../infra/update-check.js";
@@ -17,12 +17,14 @@ import { pathExists } from "../../utils.js";
17
17
  import { replaceCliName, resolveCliName } from "../cli-name.js";
18
18
  import { formatCliCommand } from "../command-format.js";
19
19
  import { installCompletion } from "../completion-cli.js";
20
- import { runDaemonRestart } from "../daemon-cli.js";
20
+ import { runDaemonInstall, runDaemonRestart } from "../daemon-cli.js";
21
+ import { renderRestartDiagnostics, terminateStaleGatewayPids, waitForGatewayHealthyRestart, } from "../daemon-cli/restart-health.js";
21
22
  import { createUpdateProgress, printResult } from "./progress.js";
22
23
  import { prepareRestartScript, runRestartScript } from "./restart-helper.js";
23
- import { DEFAULT_PACKAGE_NAME, ensureGitCheckout, normalizeTag, readPackageName, readPackageVersion, resolveGitInstallDir, resolveGlobalManager, resolveNodeRunner, resolveTargetVersion, resolveUpdateRoot, runUpdateStep, tryWriteCompletionCache, } from "./shared.js";
24
+ import { DEFAULT_PACKAGE_NAME, createGlobalCommandRunner, ensureGitCheckout, normalizeTag, parseTimeoutMsOrExit, readPackageName, readPackageVersion, resolveGitInstallDir, resolveGlobalManager, resolveNodeRunner, resolveTargetVersion, resolveUpdateRoot, runUpdateStep, tryWriteCompletionCache, } from "./shared.js";
24
25
  import { suppressDeprecations } from "./suppress-deprecations.js";
25
26
  const CLI_NAME = resolveCliName();
27
+ const SERVICE_REFRESH_TIMEOUT_MS = 60_000;
26
28
  const UPDATE_QUIPS = [
27
29
  "Leveled up! New skills unlocked. You're welcome.",
28
30
  "Fresh code, same lobster. Miss me?",
@@ -48,6 +50,43 @@ const UPDATE_QUIPS = [
48
50
  function pickUpdateQuip() {
49
51
  return UPDATE_QUIPS[Math.floor(Math.random() * UPDATE_QUIPS.length)] ?? "Update complete.";
50
52
  }
53
+ function resolveGatewayInstallEntrypointCandidates(root) {
54
+ if (!root) {
55
+ return [];
56
+ }
57
+ return [
58
+ path.join(root, "dist", "entry.js"),
59
+ path.join(root, "dist", "entry.mjs"),
60
+ path.join(root, "dist", "index.js"),
61
+ path.join(root, "dist", "index.mjs"),
62
+ ];
63
+ }
64
+ function formatCommandFailure(stdout, stderr) {
65
+ const detail = (stderr || stdout).trim();
66
+ if (!detail) {
67
+ return "command returned a non-zero exit code";
68
+ }
69
+ return detail.split("\n").slice(-3).join("\n");
70
+ }
71
+ async function refreshGatewayServiceEnv(params) {
72
+ const args = ["gateway", "install", "--force"];
73
+ if (params.jsonMode) {
74
+ args.push("--json");
75
+ }
76
+ for (const candidate of resolveGatewayInstallEntrypointCandidates(params.result.root)) {
77
+ if (!(await pathExists(candidate))) {
78
+ continue;
79
+ }
80
+ const res = await runCommandWithTimeout([resolveNodeRunner(), candidate, ...args], {
81
+ timeoutMs: SERVICE_REFRESH_TIMEOUT_MS,
82
+ });
83
+ if (res.code === 0) {
84
+ return;
85
+ }
86
+ throw new Error(`updated install refresh failed (${candidate}): ${formatCommandFailure(res.stdout, res.stderr)}`);
87
+ }
88
+ await runDaemonInstall({ force: true, json: params.jsonMode || undefined });
89
+ }
51
90
  async function tryInstallShellCompletion(opts) {
52
91
  if (opts.jsonMode || !process.stdin.isTTY) {
53
92
  return;
@@ -93,10 +132,7 @@ async function runPackageInstallUpdate(params) {
93
132
  installKind: params.installKind,
94
133
  timeoutMs: params.timeoutMs,
95
134
  });
96
- const runCommand = async (argv, options) => {
97
- const res = await runCommandWithTimeout(argv, options);
98
- return { stdout: res.stdout, stderr: res.stderr, code: res.code };
99
- };
135
+ const runCommand = createGlobalCommandRunner();
100
136
  const pkgRoot = await resolveGlobalPackageRoot(manager, runCommand, params.timeoutMs);
101
137
  const packageName = (pkgRoot ? await readPackageName(pkgRoot) : await readPackageName(params.root)) ??
102
138
  DEFAULT_PACKAGE_NAME;
@@ -289,6 +325,19 @@ async function maybeRestartService(params) {
289
325
  try {
290
326
  let restarted = false;
291
327
  let restartInitiated = false;
328
+ if (params.refreshServiceEnv) {
329
+ try {
330
+ await refreshGatewayServiceEnv({
331
+ result: params.result,
332
+ jsonMode: Boolean(params.opts.json),
333
+ });
334
+ }
335
+ catch (err) {
336
+ if (!params.opts.json) {
337
+ defaultRuntime.log(theme.warn(`Failed to refresh gateway service environment from updated install: ${String(err)}`));
338
+ }
339
+ }
340
+ }
292
341
  if (params.restartScriptPath) {
293
342
  await runRestartScript(params.restartScriptPath);
294
343
  restartInitiated = true;
@@ -314,8 +363,32 @@ async function maybeRestartService(params) {
314
363
  }
315
364
  }
316
365
  if (!params.opts.json && restartInitiated) {
317
- defaultRuntime.log(theme.success("Daemon restart initiated."));
318
- defaultRuntime.log(theme.muted(`Verify with \`${replaceCliName(formatCliCommand("poolbot gateway status"), CLI_NAME)}\` once the gateway is back.`));
366
+ const service = resolveGatewayService();
367
+ let health = await waitForGatewayHealthyRestart({
368
+ service,
369
+ port: params.gatewayPort,
370
+ });
371
+ if (!health.healthy && health.staleGatewayPids.length > 0) {
372
+ if (!params.opts.json) {
373
+ defaultRuntime.log(theme.warn(`Found stale gateway process(es) after restart: ${health.staleGatewayPids.join(", ")}. Cleaning up...`));
374
+ }
375
+ await terminateStaleGatewayPids(health.staleGatewayPids);
376
+ await runDaemonRestart();
377
+ health = await waitForGatewayHealthyRestart({
378
+ service,
379
+ port: params.gatewayPort,
380
+ });
381
+ }
382
+ if (health.healthy) {
383
+ defaultRuntime.log(theme.success("Daemon restart completed."));
384
+ }
385
+ else {
386
+ defaultRuntime.log(theme.warn("Gateway did not become healthy after restart."));
387
+ for (const line of renderRestartDiagnostics(health)) {
388
+ defaultRuntime.log(theme.muted(line));
389
+ }
390
+ defaultRuntime.log(theme.muted(`Run \`${replaceCliName(formatCliCommand("poolbot gateway status --probe --deep"), CLI_NAME)}\` for details.`));
391
+ }
319
392
  defaultRuntime.log("");
320
393
  }
321
394
  }
@@ -339,11 +412,9 @@ async function maybeRestartService(params) {
339
412
  }
340
413
  export async function updateCommand(opts) {
341
414
  suppressDeprecations();
342
- const timeoutMs = opts.timeout ? Number.parseInt(opts.timeout, 10) * 1000 : undefined;
415
+ const timeoutMs = parseTimeoutMsOrExit(opts.timeout);
343
416
  const shouldRestart = opts.restart !== false;
344
- if (timeoutMs !== undefined && (Number.isNaN(timeoutMs) || timeoutMs <= 0)) {
345
- defaultRuntime.error("--timeout must be a positive integer (seconds)");
346
- defaultRuntime.exit(1);
417
+ if (timeoutMs === null) {
347
418
  return;
348
419
  }
349
420
  const root = await resolveUpdateRoot();
@@ -439,11 +510,13 @@ export async function updateCommand(opts) {
439
510
  const { progress, stop } = createUpdateProgress(showProgress);
440
511
  const startedAt = Date.now();
441
512
  let restartScriptPath = null;
513
+ let refreshGatewayServiceEnv = false;
442
514
  if (shouldRestart) {
443
515
  try {
444
516
  const loaded = await resolveGatewayService().isLoaded({ env: process.env });
445
517
  if (loaded) {
446
518
  restartScriptPath = await prepareRestartScript(process.env);
519
+ refreshGatewayServiceEnv = true;
447
520
  }
448
521
  }
449
522
  catch {
@@ -484,7 +557,7 @@ export async function updateCommand(opts) {
484
557
  }
485
558
  if (result.reason === "not-git-install") {
486
559
  defaultRuntime.log(theme.warn(`Skipped: this Pool Bot install isn't a git checkout, and the package manager couldn't be detected. Update via your package manager, then run \`${replaceCliName(formatCliCommand("poolbot doctor"), CLI_NAME)}\` and \`${replaceCliName(formatCliCommand("poolbot gateway restart"), CLI_NAME)}\`.`));
487
- defaultRuntime.log(theme.muted(`Examples: \`${replaceCliName("npm i -g poolbot@latest", CLI_NAME)}\` or \`${replaceCliName("pnpm add -g poolbot@latest", CLI_NAME)}\``));
560
+ defaultRuntime.log(theme.muted(`Examples: \`${replaceCliName("npm i -g @poolzin/pool-bot@latest", CLI_NAME)}\` or \`${replaceCliName("pnpm add -g poolbot@latest", CLI_NAME)}\``));
488
561
  }
489
562
  defaultRuntime.exit(0);
490
563
  return;
@@ -504,6 +577,8 @@ export async function updateCommand(opts) {
504
577
  shouldRestart,
505
578
  result,
506
579
  opts,
580
+ refreshServiceEnv: refreshGatewayServiceEnv,
581
+ gatewayPort: resolveGatewayPort(configSnapshot.valid ? configSnapshot.config : undefined),
507
582
  restartScriptPath,
508
583
  });
509
584
  if (!opts.json) {
@@ -1,28 +1,22 @@
1
- import { confirm, isCancel, select } from "@clack/prompts";
1
+ import { confirm, isCancel } from "@clack/prompts";
2
2
  import { readConfigFileSnapshot } from "../../config/config.js";
3
3
  import { formatUpdateChannelLabel, normalizeUpdateChannel, resolveEffectiveUpdateChannel, } from "../../infra/update-channels.js";
4
4
  import { checkUpdateStatus } from "../../infra/update-check.js";
5
5
  import { defaultRuntime } from "../../runtime.js";
6
- import { stylePromptHint, stylePromptMessage } from "../../terminal/prompt-style.js";
6
+ import { selectStyled } from "../../terminal/prompt-select-styled.js";
7
+ import { stylePromptMessage } from "../../terminal/prompt-style.js";
7
8
  import { theme } from "../../terminal/theme.js";
8
9
  import { pathExists } from "../../utils.js";
9
- import { isEmptyDir, isGitCheckout, resolveGitInstallDir, resolveUpdateRoot, } from "./shared.js";
10
+ import { isEmptyDir, isGitCheckout, parseTimeoutMsOrExit, resolveGitInstallDir, resolveUpdateRoot, } from "./shared.js";
10
11
  import { updateCommand } from "./update-command.js";
11
- const selectStyled = (params) => select({
12
- ...params,
13
- message: stylePromptMessage(params.message),
14
- options: params.options.map((opt) => opt.hint === undefined ? opt : { ...opt, hint: stylePromptHint(opt.hint) }),
15
- });
16
12
  export async function updateWizardCommand(opts = {}) {
17
13
  if (!process.stdin.isTTY) {
18
14
  defaultRuntime.error("Update wizard requires a TTY. Use `poolbot update --channel <stable|beta|dev>` instead.");
19
15
  defaultRuntime.exit(1);
20
16
  return;
21
17
  }
22
- const timeoutMs = opts.timeout ? Number.parseInt(opts.timeout, 10) * 1000 : undefined;
23
- if (timeoutMs !== undefined && (Number.isNaN(timeoutMs) || timeoutMs <= 0)) {
24
- defaultRuntime.error("--timeout must be a positive integer (seconds)");
25
- defaultRuntime.exit(1);
18
+ const timeoutMs = parseTimeoutMsOrExit(opts.timeout);
19
+ if (timeoutMs === null) {
26
20
  return;
27
21
  }
28
22
  const root = await resolveUpdateRoot();
@@ -3,25 +3,38 @@ import { resolveMessageChannel } from "../../utils/message-channel.js";
3
3
  export function resolveAgentRunContext(opts) {
4
4
  const merged = opts.runContext ? { ...opts.runContext } : {};
5
5
  const normalizedChannel = resolveMessageChannel(merged.messageChannel ?? opts.messageChannel, opts.replyChannel ?? opts.channel);
6
- if (normalizedChannel)
6
+ if (normalizedChannel) {
7
7
  merged.messageChannel = normalizedChannel;
8
+ }
8
9
  const normalizedAccountId = normalizeAccountId(merged.accountId ?? opts.accountId);
9
- if (normalizedAccountId)
10
+ if (normalizedAccountId) {
10
11
  merged.accountId = normalizedAccountId;
12
+ }
11
13
  const groupId = (merged.groupId ?? opts.groupId)?.toString().trim();
12
- if (groupId)
14
+ if (groupId) {
13
15
  merged.groupId = groupId;
16
+ }
14
17
  const groupChannel = (merged.groupChannel ?? opts.groupChannel)?.toString().trim();
15
- if (groupChannel)
18
+ if (groupChannel) {
16
19
  merged.groupChannel = groupChannel;
20
+ }
17
21
  const groupSpace = (merged.groupSpace ?? opts.groupSpace)?.toString().trim();
18
- if (groupSpace)
22
+ if (groupSpace) {
19
23
  merged.groupSpace = groupSpace;
24
+ }
20
25
  if (merged.currentThreadTs == null &&
21
26
  opts.threadId != null &&
22
27
  opts.threadId !== "" &&
23
28
  opts.threadId !== null) {
24
29
  merged.currentThreadTs = String(opts.threadId);
25
30
  }
31
+ // Populate currentChannelId from the outbound target so that
32
+ // resolveTelegramAutoThreadId can match the originating chat.
33
+ if (!merged.currentChannelId && opts.to) {
34
+ const trimmedTo = opts.to.trim();
35
+ if (trimmedTo) {
36
+ merged.currentChannelId = trimmedTo;
37
+ }
38
+ }
26
39
  return merged;
27
40
  }
@@ -2,11 +2,13 @@ import { setCliSessionId } from "../../agents/cli-session.js";
2
2
  import { lookupContextTokens } from "../../agents/context.js";
3
3
  import { DEFAULT_CONTEXT_TOKENS } from "../../agents/defaults.js";
4
4
  import { isCliProvider } from "../../agents/model-selection.js";
5
- import { hasNonzeroUsage } from "../../agents/usage.js";
5
+ import { deriveSessionTotalTokens, hasNonzeroUsage } from "../../agents/usage.js";
6
6
  import { updateSessionStore } from "../../config/sessions.js";
7
7
  export async function updateSessionStoreAfterAgentRun(params) {
8
8
  const { cfg, sessionId, sessionKey, storePath, sessionStore, defaultProvider, defaultModel, fallbackProvider, fallbackModel, result, } = params;
9
9
  const usage = result.meta.agentMeta?.usage;
10
+ const promptTokens = result.meta.agentMeta?.promptTokens;
11
+ const compactionsThisRun = Math.max(0, result.meta.agentMeta?.compactionCount ?? 0);
10
12
  const modelUsed = result.meta.agentMeta?.model ?? fallbackModel ?? defaultModel;
11
13
  const providerUsed = result.meta.agentMeta?.provider ?? fallbackProvider ?? defaultProvider;
12
14
  const contextTokens = params.contextTokensOverride ?? lookupContextTokens(modelUsed) ?? DEFAULT_CONTEXT_TOKENS;
@@ -24,17 +26,28 @@ export async function updateSessionStoreAfterAgentRun(params) {
24
26
  };
25
27
  if (isCliProvider(providerUsed, cfg)) {
26
28
  const cliSessionId = result.meta.agentMeta?.sessionId?.trim();
27
- if (cliSessionId)
29
+ if (cliSessionId) {
28
30
  setCliSessionId(next, providerUsed, cliSessionId);
31
+ }
29
32
  }
30
33
  next.abortedLastRun = result.meta.aborted ?? false;
31
34
  if (hasNonzeroUsage(usage)) {
32
35
  const input = usage.input ?? 0;
33
36
  const output = usage.output ?? 0;
34
- const promptTokens = input + (usage.cacheRead ?? 0) + (usage.cacheWrite ?? 0);
37
+ const totalTokens = deriveSessionTotalTokens({
38
+ usage,
39
+ contextTokens,
40
+ promptTokens,
41
+ }) ?? input;
35
42
  next.inputTokens = input;
36
43
  next.outputTokens = output;
37
- next.totalTokens = promptTokens > 0 ? promptTokens : (usage.total ?? input);
44
+ next.totalTokens = totalTokens;
45
+ next.totalTokensFresh = true;
46
+ next.cacheRead = usage.cacheRead ?? 0;
47
+ next.cacheWrite = usage.cacheWrite ?? 0;
48
+ }
49
+ if (compactionsThisRun > 0) {
50
+ next.compactionCount = (entry.compactionCount ?? 0) + compactionsThisRun;
38
51
  }
39
52
  sessionStore[sessionKey] = next;
40
53
  await updateSessionStore(storePath, (store) => {
@@ -1,3 +1,4 @@
1
+ import path from "node:path";
1
2
  import { listAgentIds, resolveAgentDir, resolveEffectiveModelFallbacks, resolveAgentModelPrimary, resolveAgentSkillsFilter, resolveAgentWorkspaceDir, } from "../agents/agent-scope.js";
2
3
  import { ensureAuthProfileStore } from "../agents/auth-profiles.js";
3
4
  import { clearSessionAuthProfileOverride } from "../agents/auth-profiles/session-override.js";
@@ -17,7 +18,7 @@ import { formatThinkingLevels, formatXHighModelHint, normalizeThinkLevel, normal
17
18
  import { formatCliCommand } from "../cli/command-format.js";
18
19
  import { createDefaultDeps } from "../cli/deps.js";
19
20
  import { loadConfig } from "../config/config.js";
20
- import { resolveAgentIdFromSessionKey, resolveSessionFilePath, updateSessionStore, } from "../config/sessions.js";
21
+ import { parseSessionThreadInfo, resolveAndPersistSessionFile, resolveAgentIdFromSessionKey, resolveSessionFilePath, resolveSessionTranscriptPath, updateSessionStore, } from "../config/sessions.js";
21
22
  import { clearAgentRunContext, emitAgentEvent, registerAgentRunContext, } from "../infra/agent-events.js";
22
23
  import { getRemoteSkillEligibility } from "../infra/skills-remote.js";
23
24
  import { normalizeAgentId } from "../routing/session-key.js";
@@ -256,6 +257,7 @@ export async function agentCommand(opts, runtime = defaultRuntime, deps = create
256
257
  storePath,
257
258
  entry: next,
258
259
  });
260
+ sessionEntry = next;
259
261
  }
260
262
  const agentModelPrimary = resolveAgentModelPrimary(cfg, sessionAgentId);
261
263
  const cfgForModelSelection = agentModelPrimary
@@ -387,9 +389,27 @@ export async function agentCommand(opts, runtime = defaultRuntime, deps = create
387
389
  });
388
390
  }
389
391
  }
390
- const sessionFile = resolveSessionFilePath(sessionId, sessionEntry, {
392
+ let sessionFile = resolveSessionFilePath(sessionId, sessionEntry, {
391
393
  agentId: sessionAgentId,
392
394
  });
395
+ if (sessionStore && sessionKey) {
396
+ const threadIdFromSessionKey = parseSessionThreadInfo(sessionKey).threadId;
397
+ const fallbackSessionFile = !sessionEntry?.sessionFile
398
+ ? resolveSessionTranscriptPath(sessionId, sessionAgentId, opts.threadId ?? threadIdFromSessionKey)
399
+ : undefined;
400
+ const resolvedSessionFile = await resolveAndPersistSessionFile({
401
+ sessionId,
402
+ sessionKey,
403
+ sessionStore,
404
+ storePath,
405
+ sessionEntry,
406
+ agentId: sessionAgentId,
407
+ sessionsDir: path.dirname(storePath),
408
+ fallbackSessionFile,
409
+ });
410
+ sessionFile = resolvedSessionFile.sessionFile;
411
+ sessionEntry = resolvedSessionFile.sessionEntry;
412
+ }
393
413
  const startedAt = Date.now();
394
414
  let lifecycleEnded = false;
395
415
  let result;
@@ -15,14 +15,18 @@ function bindingMatchKey(match) {
15
15
  export function describeBinding(binding) {
16
16
  const match = binding.match;
17
17
  const parts = [match.channel];
18
- if (match.accountId)
18
+ if (match.accountId) {
19
19
  parts.push(`accountId=${match.accountId}`);
20
- if (match.peer)
20
+ }
21
+ if (match.peer) {
21
22
  parts.push(`peer=${match.peer.kind}:${match.peer.id}`);
22
- if (match.guildId)
23
+ }
24
+ if (match.guildId) {
23
25
  parts.push(`guild=${match.guildId}`);
24
- if (match.teamId)
26
+ }
27
+ if (match.teamId) {
25
28
  parts.push(`team=${match.teamId}`);
29
+ }
26
30
  return parts.join(" ");
27
31
  }
28
32
  export function applyAgentBindings(cfg, bindings) {
@@ -68,8 +72,9 @@ export function applyAgentBindings(cfg, bindings) {
68
72
  }
69
73
  function resolveDefaultAccountId(cfg, provider) {
70
74
  const plugin = getChannelPlugin(provider);
71
- if (!plugin)
75
+ if (!plugin) {
72
76
  return DEFAULT_ACCOUNT_ID;
77
+ }
73
78
  return resolveChannelDefaultAccountId({ plugin, cfg });
74
79
  }
75
80
  export function buildChannelBindings(params) {
@@ -98,8 +103,9 @@ export function parseBindingSpecs(params) {
98
103
  const agentId = normalizeAgentId(params.agentId);
99
104
  for (const raw of specs) {
100
105
  const trimmed = raw?.trim();
101
- if (!trimmed)
106
+ if (!trimmed) {
102
107
  continue;
108
+ }
103
109
  const [channelRaw, accountRaw] = trimmed.split(":", 2);
104
110
  const channel = normalizeChannelId(channelRaw);
105
111
  if (!channel) {
@@ -118,8 +124,9 @@ export function parseBindingSpecs(params) {
118
124
  }
119
125
  }
120
126
  const match = { channel };
121
- if (accountId)
127
+ if (accountId) {
122
128
  match.accountId = accountId;
129
+ }
123
130
  bindings.push({ agentId, match });
124
131
  }
125
132
  return { bindings, errors };
@@ -13,8 +13,8 @@ import { WizardCancelledError } from "../wizard/prompts.js";
13
13
  import { applyAgentBindings, buildChannelBindings, describeBinding, parseBindingSpecs, } from "./agents.bindings.js";
14
14
  import { createQuietRuntime, requireValidConfig } from "./agents.command-shared.js";
15
15
  import { applyAgentConfig, findAgentEntryIndex, listAgentEntries } from "./agents.config.js";
16
- import { applyAuthChoice, warnIfModelConfigLooksOff } from "./auth-choice.js";
17
16
  import { promptAuthChoiceGrouped } from "./auth-choice-prompt.js";
17
+ import { applyAuthChoice, warnIfModelConfigLooksOff } from "./auth-choice.js";
18
18
  import { setupChannels } from "./onboard-channels.js";
19
19
  import { ensureWorkspaceAndSessions } from "./onboard-helpers.js";
20
20
  async function fileExists(pathname) {
@@ -28,8 +28,9 @@ async function fileExists(pathname) {
28
28
  }
29
29
  export async function agentsAddCommand(opts, runtime = defaultRuntime, params) {
30
30
  const cfg = await requireValidConfig(runtime);
31
- if (!cfg)
31
+ if (!cfg) {
32
32
  return;
33
+ }
33
34
  const workspaceFlag = opts.workspace?.trim();
34
35
  const nameInput = opts.name?.trim();
35
36
  const hasFlags = params?.hasFlags === true;
@@ -90,8 +91,9 @@ export async function agentsAddCommand(opts, runtime = defaultRuntime, params) {
90
91
  ? applyAgentBindings(nextConfig, bindingParse.bindings)
91
92
  : { config: nextConfig, added: [], skipped: [], conflicts: [] };
92
93
  await writeConfigFile(bindingResult.config);
93
- if (!opts.json)
94
+ if (!opts.json) {
94
95
  logConfigUpdated(runtime);
96
+ }
95
97
  const quietRuntime = opts.json ? createQuietRuntime(runtime) : runtime;
96
98
  await ensureWorkspaceAndSessions(workspaceDir, quietRuntime, {
97
99
  skipBootstrap: Boolean(bindingResult.config.agents?.defaults?.skipBootstrap),
@@ -116,8 +118,9 @@ export async function agentsAddCommand(opts, runtime = defaultRuntime, params) {
116
118
  runtime.log(`Agent: ${agentId}`);
117
119
  runtime.log(`Workspace: ${shortenHomePath(workspaceDir)}`);
118
120
  runtime.log(`Agent dir: ${shortenHomePath(agentDir)}`);
119
- if (model)
121
+ if (model) {
120
122
  runtime.log(`Model: ${model}`);
123
+ }
121
124
  if (bindingResult.conflicts.length > 0) {
122
125
  runtime.error([
123
126
  "Skipped bindings already claimed by another agent:",
@@ -129,13 +132,14 @@ export async function agentsAddCommand(opts, runtime = defaultRuntime, params) {
129
132
  }
130
133
  const prompter = createClackPrompter();
131
134
  try {
132
- await prompter.intro("Add Poolbot agent");
135
+ await prompter.intro("Add Pool Bot agent");
133
136
  const name = nameInput ??
134
137
  (await prompter.text({
135
138
  message: "Agent name",
136
139
  validate: (value) => {
137
- if (!value?.trim())
140
+ if (!value?.trim()) {
138
141
  return "Required";
142
+ }
139
143
  const normalized = normalizeAgentId(value);
140
144
  if (normalized === DEFAULT_AGENT_ID) {
141
145
  return `"${DEFAULT_AGENT_ID}" is reserved. Choose another name.`;
@@ -143,7 +147,7 @@ export async function agentsAddCommand(opts, runtime = defaultRuntime, params) {
143
147
  return undefined;
144
148
  },
145
149
  }));
146
- const agentName = String(name).trim();
150
+ const agentName = String(name ?? "").trim();
147
151
  const agentId = normalizeAgentId(agentName);
148
152
  if (agentName !== agentId) {
149
153
  await prompter.note(`Normalized id to "${agentId}".`, "Agent id");
@@ -165,7 +169,7 @@ export async function agentsAddCommand(opts, runtime = defaultRuntime, params) {
165
169
  initialValue: workspaceDefault,
166
170
  validate: (value) => (value?.trim() ? undefined : "Required"),
167
171
  });
168
- const workspaceDir = resolveUserPath(String(workspaceInput).trim() || workspaceDefault);
172
+ const workspaceDir = resolveUserPath(String(workspaceInput ?? "").trim() || workspaceDefault);
169
173
  const agentDir = resolveAgentDir(cfg, agentId);
170
174
  let nextConfig = applyAgentConfig(cfg, {
171
175
  agentId,
@@ -285,7 +289,7 @@ export async function agentsAddCommand(opts, runtime = defaultRuntime, params) {
285
289
  }
286
290
  catch (err) {
287
291
  if (err instanceof WizardCancelledError) {
288
- runtime.exit(0);
292
+ runtime.exit(1);
289
293
  return;
290
294
  }
291
295
  throw err;
@@ -38,8 +38,9 @@ function resolveAgentIdByWorkspace(cfg, workspaceDir) {
38
38
  }
39
39
  export async function agentsSetIdentityCommand(opts, runtime = defaultRuntime) {
40
40
  const cfg = await requireValidConfig(runtime);
41
- if (!cfg)
41
+ if (!cfg) {
42
42
  return;
43
+ }
43
44
  const agentRaw = coerceTrimmed(opts.agent);
44
45
  const nameRaw = coerceTrimmed(opts.name);
45
46
  const emojiRaw = coerceTrimmed(opts.emoji);
@@ -155,14 +156,19 @@ export async function agentsSetIdentityCommand(opts, runtime = defaultRuntime) {
155
156
  }
156
157
  logConfigUpdated(runtime);
157
158
  runtime.log(`Agent: ${agentId}`);
158
- if (nextIdentity.name)
159
+ if (nextIdentity.name) {
159
160
  runtime.log(`Name: ${nextIdentity.name}`);
160
- if (nextIdentity.theme)
161
+ }
162
+ if (nextIdentity.theme) {
161
163
  runtime.log(`Theme: ${nextIdentity.theme}`);
162
- if (nextIdentity.emoji)
164
+ }
165
+ if (nextIdentity.emoji) {
163
166
  runtime.log(`Emoji: ${nextIdentity.emoji}`);
164
- if (nextIdentity.avatar)
167
+ }
168
+ if (nextIdentity.avatar) {
165
169
  runtime.log(`Avatar: ${nextIdentity.avatar}`);
166
- if (workspaceDir)
170
+ }
171
+ if (workspaceDir) {
167
172
  runtime.log(`Workspace: ${shortenHomePath(workspaceDir)}`);
173
+ }
168
174
  }
@@ -1,6 +1,6 @@
1
+ import { formatCliCommand } from "../cli/command-format.js";
1
2
  import { normalizeAgentId } from "../routing/session-key.js";
2
3
  import { defaultRuntime } from "../runtime.js";
3
- import { formatCliCommand } from "../cli/command-format.js";
4
4
  import { shortenHomePath } from "../utils.js";
5
5
  import { describeBinding } from "./agents.bindings.js";
6
6
  import { requireValidConfig } from "./agents.command-shared.js";
@@ -12,10 +12,12 @@ function formatSummary(summary) {
12
12
  ? `${summary.id}${defaultTag} (${summary.name})`
13
13
  : `${summary.id}${defaultTag}`;
14
14
  const identityParts = [];
15
- if (summary.identityEmoji)
15
+ if (summary.identityEmoji) {
16
16
  identityParts.push(summary.identityEmoji);
17
- if (summary.identityName)
17
+ }
18
+ if (summary.identityName) {
18
19
  identityParts.push(summary.identityName);
20
+ }
19
21
  const identityLine = identityParts.length > 0 ? identityParts.join(" ") : null;
20
22
  const identitySource = summary.identitySource === "identity"
21
23
  ? "IDENTITY.md"
@@ -28,8 +30,9 @@ function formatSummary(summary) {
28
30
  }
29
31
  lines.push(` Workspace: ${shortenHomePath(summary.workspace)}`);
30
32
  lines.push(` Agent dir: ${shortenHomePath(summary.agentDir)}`);
31
- if (summary.model)
33
+ if (summary.model) {
32
34
  lines.push(` Model: ${summary.model}`);
35
+ }
33
36
  lines.push(` Routing rules: ${summary.bindings}`);
34
37
  if (summary.routes?.length) {
35
38
  lines.push(` Routing: ${summary.routes.join(", ")}`);
@@ -50,8 +53,9 @@ function formatSummary(summary) {
50
53
  }
51
54
  export async function agentsListCommand(opts, runtime = defaultRuntime) {
52
55
  const cfg = await requireValidConfig(runtime);
53
- if (!cfg)
56
+ if (!cfg) {
54
57
  return;
58
+ }
55
59
  const summaries = buildAgentSummaries(cfg);
56
60
  const bindingMap = new Map();
57
61
  for (const binding of cfg.bindings ?? []) {
@@ -84,8 +88,9 @@ export async function agentsListCommand(opts, runtime = defaultRuntime) {
84
88
  bindings,
85
89
  providerStatus,
86
90
  });
87
- if (providerLines.length > 0)
91
+ if (providerLines.length > 0) {
88
92
  summary.providers = providerLines;
93
+ }
89
94
  }
90
95
  if (opts.json) {
91
96
  runtime.log(JSON.stringify(summaries, null, 2));
@@ -1,12 +1,7 @@
1
- import { resolveAgentDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, } from "../agents/agent-scope.js";
1
+ import { listAgentEntries, resolveAgentDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, } from "../agents/agent-scope.js";
2
2
  import { identityHasValues, loadAgentIdentityFromWorkspace, parseIdentityMarkdown as parseIdentityMarkdownFile, } from "../agents/identity-file.js";
3
3
  import { normalizeAgentId } from "../routing/session-key.js";
4
- export function listAgentEntries(cfg) {
5
- const list = cfg.agents?.list;
6
- if (!Array.isArray(list))
7
- return [];
8
- return list.filter((entry) => Boolean(entry && typeof entry === "object"));
9
- }
4
+ export { listAgentEntries };
10
5
  export function findAgentEntryIndex(list, agentId) {
11
6
  const id = normalizeAgentId(agentId);
12
7
  return list.findIndex((entry) => normalizeAgentId(entry.id) === id);
@@ -23,13 +18,15 @@ function resolveAgentModel(cfg, agentId) {
23
18
  }
24
19
  if (typeof entry.model === "object") {
25
20
  const primary = entry.model.primary?.trim();
26
- if (primary)
21
+ if (primary) {
27
22
  return primary;
23
+ }
28
24
  }
29
25
  }
30
26
  const raw = cfg.agents?.defaults?.model;
31
- if (typeof raw === "string")
27
+ if (typeof raw === "string") {
32
28
  return raw;
29
+ }
33
30
  return raw?.primary?.trim() || undefined;
34
31
  }
35
32
  export function parseIdentityMarkdown(content) {
@@ -37,8 +34,9 @@ export function parseIdentityMarkdown(content) {
37
34
  }
38
35
  export function loadAgentIdentity(workspace) {
39
36
  const parsed = loadAgentIdentityFromWorkspace(workspace);
40
- if (!parsed)
37
+ if (!parsed) {
41
38
  return null;
39
+ }
42
40
  return identityHasValues(parsed) ? parsed : null;
43
41
  }
44
42
  export function buildAgentSummaries(cfg) {