@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
@@ -1,16 +1,22 @@
1
- import { resolveDefaultAgentId } from "../agents/agent-scope.js";
1
+ import { listAgentIds } from "../agents/agent-scope.js";
2
+ import { resolveMemorySearchConfig } from "../agents/memory-search.js";
2
3
  import { resolveMemoryBackendConfig } from "../memory/backend-config.js";
3
4
  import { getMemorySearchManager } from "../memory/index.js";
4
5
  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;
6
+ const agentIds = listAgentIds(params.cfg);
7
+ for (const agentId of agentIds) {
8
+ if (!resolveMemorySearchConfig(params.cfg, agentId)) {
9
+ continue;
10
+ }
11
+ const resolved = resolveMemoryBackendConfig({ cfg: params.cfg, agentId });
12
+ if (resolved.backend !== "qmd" || !resolved.qmd) {
13
+ continue;
14
+ }
15
+ const { manager, error } = await getMemorySearchManager({ cfg: params.cfg, agentId });
16
+ if (!manager) {
17
+ params.log.warn(`qmd memory startup initialization failed for agent "${agentId}": ${error ?? "unknown error"}`);
18
+ continue;
19
+ }
20
+ params.log.info?.(`qmd memory startup initialization armed for agent "${agentId}"`);
9
21
  }
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
22
  }
@@ -4,6 +4,7 @@ import path from "node:path";
4
4
  import { resolveSessionFilePath, resolveSessionTranscriptPath, resolveSessionTranscriptPathInDir, } from "../config/sessions.js";
5
5
  import { resolveRequiredHomeDir } from "../infra/home-dir.js";
6
6
  import { hasInterSessionUserProvenance } from "../sessions/input-provenance.js";
7
+ import { stripInlineDirectiveTagsForDisplay } from "../utils/directive-tags.js";
7
8
  import { extractToolCallNames, hasToolCall } from "../utils/transcript-tools.js";
8
9
  import { stripEnvelope } from "./chat-sanitize.js";
9
10
  const sessionTitleFieldsCache = new Map();
@@ -284,7 +285,8 @@ export function readSessionTitleFieldsFromTranscript(sessionId, storePath, sessi
284
285
  }
285
286
  function extractTextFromContent(content) {
286
287
  if (typeof content === "string") {
287
- return content.trim() || null;
288
+ const normalized = stripInlineDirectiveTagsForDisplay(content).text.trim();
289
+ return normalized || null;
288
290
  }
289
291
  if (!Array.isArray(content)) {
290
292
  return null;
@@ -294,9 +296,9 @@ function extractTextFromContent(content) {
294
296
  continue;
295
297
  }
296
298
  if (part.type === "text" || part.type === "output_text" || part.type === "input_text") {
297
- const trimmed = part.text.trim();
298
- if (trimmed) {
299
- return trimmed;
299
+ const normalized = stripInlineDirectiveTagsForDisplay(part.text).text.trim();
300
+ if (normalized) {
301
+ return normalized;
300
302
  }
301
303
  }
302
304
  }
@@ -336,20 +338,15 @@ function extractFirstUserMessageFromTranscriptChunk(chunk, opts) {
336
338
  }
337
339
  return null;
338
340
  }
339
- export function readFirstUserMessageFromTranscript(sessionId, storePath, sessionFile, agentId, opts) {
341
+ function findExistingTranscriptPath(sessionId, storePath, sessionFile, agentId) {
340
342
  const candidates = resolveSessionTranscriptCandidates(sessionId, storePath, sessionFile, agentId);
341
- const filePath = candidates.find((p) => fs.existsSync(p));
342
- if (!filePath) {
343
- return null;
344
- }
343
+ return candidates.find((p) => fs.existsSync(p)) ?? null;
344
+ }
345
+ function withOpenTranscriptFd(filePath, read) {
345
346
  let fd = null;
346
347
  try {
347
348
  fd = fs.openSync(filePath, "r");
348
- const chunk = readTranscriptHeadChunk(fd);
349
- if (!chunk) {
350
- return null;
351
- }
352
- return extractFirstUserMessageFromTranscriptChunk(chunk, opts);
349
+ return read(fd);
353
350
  }
354
351
  catch {
355
352
  // file read error
@@ -361,6 +358,19 @@ export function readFirstUserMessageFromTranscript(sessionId, storePath, session
361
358
  }
362
359
  return null;
363
360
  }
361
+ export function readFirstUserMessageFromTranscript(sessionId, storePath, sessionFile, agentId, opts) {
362
+ const filePath = findExistingTranscriptPath(sessionId, storePath, sessionFile, agentId);
363
+ if (!filePath) {
364
+ return null;
365
+ }
366
+ return withOpenTranscriptFd(filePath, (fd) => {
367
+ const chunk = readTranscriptHeadChunk(fd);
368
+ if (!chunk) {
369
+ return null;
370
+ }
371
+ return extractFirstUserMessageFromTranscriptChunk(chunk, opts);
372
+ });
373
+ }
364
374
  const LAST_MSG_MAX_BYTES = 16384;
365
375
  const LAST_MSG_MAX_LINES = 20;
366
376
  function readLastMessagePreviewFromOpenTranscript(params) {
@@ -391,30 +401,18 @@ function readLastMessagePreviewFromOpenTranscript(params) {
391
401
  return null;
392
402
  }
393
403
  export function readLastMessagePreviewFromTranscript(sessionId, storePath, sessionFile, agentId) {
394
- const candidates = resolveSessionTranscriptCandidates(sessionId, storePath, sessionFile, agentId);
395
- const filePath = candidates.find((p) => fs.existsSync(p));
404
+ const filePath = findExistingTranscriptPath(sessionId, storePath, sessionFile, agentId);
396
405
  if (!filePath) {
397
406
  return null;
398
407
  }
399
- let fd = null;
400
- try {
401
- fd = fs.openSync(filePath, "r");
408
+ return withOpenTranscriptFd(filePath, (fd) => {
402
409
  const stat = fs.fstatSync(fd);
403
410
  const size = stat.size;
404
411
  if (size === 0) {
405
412
  return null;
406
413
  }
407
414
  return readLastMessagePreviewFromOpenTranscript({ fd, size });
408
- }
409
- catch {
410
- // file error
411
- }
412
- finally {
413
- if (fd !== null) {
414
- fs.closeSync(fd);
415
- }
416
- }
417
- return null;
415
+ });
418
416
  }
419
417
  const PREVIEW_READ_SIZES = [64 * 1024, 256 * 1024, 1024 * 1024];
420
418
  const PREVIEW_MAX_LINES = 200;
@@ -446,20 +444,20 @@ function truncatePreviewText(text, maxChars) {
446
444
  }
447
445
  function extractPreviewText(message) {
448
446
  if (typeof message.content === "string") {
449
- const trimmed = message.content.trim();
450
- return trimmed ? trimmed : null;
447
+ const normalized = stripInlineDirectiveTagsForDisplay(message.content).text.trim();
448
+ return normalized ? normalized : null;
451
449
  }
452
450
  if (Array.isArray(message.content)) {
453
451
  const parts = message.content
454
- .map((entry) => (typeof entry?.text === "string" ? entry.text : ""))
452
+ .map((entry) => typeof entry?.text === "string" ? stripInlineDirectiveTagsForDisplay(entry.text).text : "")
455
453
  .filter((text) => text.trim().length > 0);
456
454
  if (parts.length > 0) {
457
455
  return parts.join("\n").trim();
458
456
  }
459
457
  }
460
458
  if (typeof message.text === "string") {
461
- const trimmed = message.text.trim();
462
- return trimmed ? trimmed : null;
459
+ const normalized = stripInlineDirectiveTagsForDisplay(message.text).text.trim();
460
+ return normalized ? normalized : null;
463
461
  }
464
462
  return null;
465
463
  }
@@ -1,8 +1,8 @@
1
- import { loadSessionStore } from "../config/sessions.js";
1
+ import { loadSessionStore, updateSessionStore } from "../config/sessions.js";
2
2
  import { parseSessionLabel } from "../sessions/session-label.js";
3
3
  import { ErrorCodes, errorShape, } from "./protocol/index.js";
4
- import { listSessionsFromStore, loadCombinedSessionStoreForGateway, resolveGatewaySessionStoreTarget, } from "./session-utils.js";
5
- export function resolveSessionKeyFromResolveParams(params) {
4
+ import { listSessionsFromStore, loadCombinedSessionStoreForGateway, pruneLegacyStoreKeys, resolveGatewaySessionStoreTarget, } from "./session-utils.js";
5
+ export async function resolveSessionKeyFromResolveParams(params) {
6
6
  const { cfg, p } = params;
7
7
  const key = typeof p.key === "string" ? p.key.trim() : "";
8
8
  const hasKey = key.length > 0;
@@ -25,13 +25,25 @@ export function resolveSessionKeyFromResolveParams(params) {
25
25
  if (hasKey) {
26
26
  const target = resolveGatewaySessionStoreTarget({ cfg, key });
27
27
  const store = loadSessionStore(target.storePath);
28
- const existingKey = target.storeKeys.find((candidate) => store[candidate]);
29
- if (!existingKey) {
28
+ if (store[target.canonicalKey]) {
29
+ return { ok: true, key: target.canonicalKey };
30
+ }
31
+ const legacyKey = target.storeKeys.find((candidate) => store[candidate]);
32
+ if (!legacyKey) {
30
33
  return {
31
34
  ok: false,
32
35
  error: errorShape(ErrorCodes.INVALID_REQUEST, `No session found: ${key}`),
33
36
  };
34
37
  }
38
+ await updateSessionStore(target.storePath, (s) => {
39
+ const liveTarget = resolveGatewaySessionStoreTarget({ cfg, key, store: s });
40
+ const canonicalKey = liveTarget.canonicalKey;
41
+ // Migrate the first legacy entry to the canonical key.
42
+ if (!s[canonicalKey] && s[legacyKey]) {
43
+ s[canonicalKey] = s[legacyKey];
44
+ }
45
+ pruneLegacyStoreKeys({ store: s, canonicalKey, candidates: liveTarget.storeKeys });
46
+ });
35
47
  return { ok: true, key: target.canonicalKey };
36
48
  }
37
49
  if (hasSessionId) {
@@ -1,8 +1,9 @@
1
1
  function extractLastUserText(input) {
2
2
  for (let i = input.length - 1; i >= 0; i -= 1) {
3
3
  const item = input[i];
4
- if (!item || item.role !== "user")
4
+ if (!item || item.role !== "user") {
5
5
  continue;
6
+ }
6
7
  const content = item.content;
7
8
  if (Array.isArray(content)) {
8
9
  const text = content
@@ -13,8 +14,9 @@ function extractLastUserText(input) {
13
14
  .map((c) => c.text)
14
15
  .join("\n")
15
16
  .trim();
16
- if (text)
17
+ if (text) {
17
18
  return text;
19
+ }
18
20
  }
19
21
  }
20
22
  return "";
@@ -22,8 +24,9 @@ function extractLastUserText(input) {
22
24
  function extractToolOutput(input) {
23
25
  for (const itemRaw of input) {
24
26
  const item = itemRaw;
25
- if (!item || item.type !== "function_call_output")
27
+ if (!item || item.type !== "function_call_output") {
26
28
  continue;
29
+ }
27
30
  return typeof item.output === "string" ? item.output : "";
28
31
  }
29
32
  return "";
@@ -98,14 +101,18 @@ async function* fakeOpenAIResponsesStream(params) {
98
101
  };
99
102
  }
100
103
  function decodeBodyText(body) {
101
- if (!body)
104
+ if (!body) {
102
105
  return "";
103
- if (typeof body === "string")
106
+ }
107
+ if (typeof body === "string") {
104
108
  return body;
105
- if (body instanceof Uint8Array)
109
+ }
110
+ if (body instanceof Uint8Array) {
106
111
  return Buffer.from(body).toString("utf8");
107
- if (body instanceof ArrayBuffer)
112
+ }
113
+ if (body instanceof ArrayBuffer) {
108
114
  return Buffer.from(new Uint8Array(body)).toString("utf8");
115
+ }
109
116
  return "";
110
117
  }
111
118
  async function buildOpenAIResponsesSse(params) {
@@ -11,7 +11,7 @@ import { getPluginToolMeta } from "../plugins/tools.js";
11
11
  import { isSubagentSessionKey } from "../routing/session-key.js";
12
12
  import { DEFAULT_GATEWAY_HTTP_TOOL_DENY } from "../security/dangerous-tools.js";
13
13
  import { normalizeMessageChannel } from "../utils/message-channel.js";
14
- import { authorizeGatewayConnect } from "./auth.js";
14
+ import { authorizeHttpGatewayConnect } from "./auth.js";
15
15
  import { readJsonBodyOrError, sendGatewayAuthFailure, sendInvalidRequest, sendJson, sendMethodNotAllowed, } from "./http-common.js";
16
16
  import { getBearerToken, getHeader } from "./http-utils.js";
17
17
  const DEFAULT_BODY_BYTES = 2 * 1024 * 1024;
@@ -71,14 +71,23 @@ function getErrorMessage(err) {
71
71
  }
72
72
  return String(err);
73
73
  }
74
- function isToolInputError(err) {
74
+ function resolveToolInputErrorStatus(err) {
75
75
  if (err instanceof ToolInputError) {
76
- return true;
76
+ const status = err.status;
77
+ return typeof status === "number" ? status : 400;
78
+ }
79
+ if (typeof err !== "object" || err === null || !("name" in err)) {
80
+ return null;
81
+ }
82
+ const name = err.name;
83
+ if (name !== "ToolInputError" && name !== "ToolAuthorizationError") {
84
+ return null;
77
85
  }
78
- return (typeof err === "object" &&
79
- err !== null &&
80
- "name" in err &&
81
- err.name === "ToolInputError");
86
+ const status = err.status;
87
+ if (typeof status === "number") {
88
+ return status;
89
+ }
90
+ return name === "ToolAuthorizationError" ? 403 : 400;
82
91
  }
83
92
  export async function handleToolsInvokeHttpRequest(req, res, opts) {
84
93
  const url = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
@@ -91,11 +100,12 @@ export async function handleToolsInvokeHttpRequest(req, res, opts) {
91
100
  }
92
101
  const cfg = loadConfig();
93
102
  const token = getBearerToken(req);
94
- const authResult = await authorizeGatewayConnect({
103
+ const authResult = await authorizeHttpGatewayConnect({
95
104
  auth: opts.auth,
96
105
  connectAuth: token ? { token, password: token } : null,
97
106
  req,
98
107
  trustedProxies: opts.trustedProxies ?? cfg.gateway?.trustedProxies,
108
+ allowRealIpFallback: opts.allowRealIpFallback ?? cfg.gateway?.allowRealIpFallback,
99
109
  rateLimiter: opts.rateLimiter,
100
110
  });
101
111
  if (!authResult.ok) {
@@ -216,8 +226,9 @@ export async function handleToolsInvokeHttpRequest(req, res, opts) {
216
226
  sendJson(res, 200, { ok: true, result });
217
227
  }
218
228
  catch (err) {
219
- if (isToolInputError(err)) {
220
- sendJson(res, 400, {
229
+ const inputStatus = resolveToolInputErrorStatus(err);
230
+ if (inputStatus !== null) {
231
+ sendJson(res, inputStatus, {
221
232
  ok: false,
222
233
  error: { type: "tool_error", message: getErrorMessage(err) || "invalid tool arguments" },
223
234
  });
@@ -1,7 +1,9 @@
1
1
  import { filterBootstrapFilesForSession, loadExtraBootstrapFiles, } from "../../../agents/workspace.js";
2
+ import { createSubsystemLogger } from "../../../logging/subsystem.js";
2
3
  import { resolveHookConfig } from "../../config.js";
3
4
  import { isAgentBootstrapEvent } from "../../hooks.js";
4
5
  const HOOK_KEY = "bootstrap-extra-files";
6
+ const log = createSubsystemLogger("bootstrap-extra-files");
5
7
  function normalizeStringArray(value) {
6
8
  if (!Array.isArray(value)) {
7
9
  return [];
@@ -40,7 +42,7 @@ const bootstrapExtraFilesHook = async (event) => {
40
42
  context.bootstrapFiles = filterBootstrapFilesForSession([...context.bootstrapFiles, ...extras], context.sessionKey);
41
43
  }
42
44
  catch (err) {
43
- console.warn(`[bootstrap-extra-files] failed: ${String(err)}`);
45
+ log.warn(`failed: ${String(err)}`);
44
46
  }
45
47
  };
46
48
  export default bootstrapExtraFilesHook;
@@ -25,6 +25,9 @@
25
25
  import fs from "node:fs/promises";
26
26
  import path from "node:path";
27
27
  import os from "node:os";
28
+ import { resolveStateDir } from "../../../config/paths.js";
29
+ import { createSubsystemLogger } from "../../../logging/subsystem.js";
30
+ const log = createSubsystemLogger("command-logger");
28
31
  /**
29
32
  * Log all command events to a file
30
33
  */
@@ -35,7 +38,8 @@ const logCommand = async (event) => {
35
38
  }
36
39
  try {
37
40
  // Create log directory
38
- const logDir = path.join(os.homedir(), ".poolbot", "logs");
41
+ const stateDir = resolveStateDir(process.env, os.homedir);
42
+ const logDir = path.join(stateDir, "logs");
39
43
  await fs.mkdir(logDir, { recursive: true });
40
44
  // Append to command log file
41
45
  const logFile = path.join(logDir, "commands.log");
@@ -49,7 +53,8 @@ const logCommand = async (event) => {
49
53
  await fs.appendFile(logFile, logLine, "utf-8");
50
54
  }
51
55
  catch (err) {
52
- console.error("[command-logger] Failed to log command:", err instanceof Error ? err.message : String(err));
56
+ const message = err instanceof Error ? err.message : String(err);
57
+ log.error(`Failed to log command: ${message}`);
53
58
  }
54
59
  };
55
60
  export default logCommand;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Session memory hook handler
3
3
  *
4
- * Saves session context to memory when /new command is triggered
4
+ * Saves session context to memory when /new or /reset command is triggered
5
5
  * Creates a new dated memory file with LLM-generated slug
6
6
  */
7
7
  import fs from "node:fs/promises";
@@ -137,15 +137,16 @@ async function findPreviousSessionFile(params) {
137
137
  return undefined;
138
138
  }
139
139
  /**
140
- * Save session context to memory when /new command is triggered
140
+ * Save session context to memory when /new or /reset command is triggered
141
141
  */
142
142
  const saveSessionToMemory = async (event) => {
143
- // Only trigger on 'new' command
144
- if (event.type !== "command" || event.action !== "new") {
143
+ // Only trigger on reset/new commands
144
+ const isResetCommand = event.action === "new" || event.action === "reset";
145
+ if (event.type !== "command" || !isResetCommand) {
145
146
  return;
146
147
  }
147
148
  try {
148
- log.debug("Hook triggered for /new command");
149
+ log.debug("Hook triggered for reset/new command", { action: event.action });
149
150
  const context = event.context || {};
150
151
  const cfg = context.cfg;
151
152
  const agentId = resolveAgentIdFromSessionKey(event.sessionKey);
@@ -1,10 +1,10 @@
1
1
  import { parseFrontmatterBlock } from "../markdown/frontmatter.js";
2
- import { getFrontmatterString, normalizeStringList, parsePoolbotManifestInstallBase, parseFrontmatterBool, resolvePoolbotManifestBlock, resolvePoolbotManifestInstall, resolvePoolbotManifestOs, resolvePoolbotManifestRequires, } from "../shared/frontmatter.js";
2
+ import { getFrontmatterString, normalizeStringList, parsePoolBotManifestInstallBase, parseFrontmatterBool, resolvePoolBotManifestBlock, resolvePoolBotManifestInstall, resolvePoolBotManifestOs, resolvePoolBotManifestRequires, } from "../shared/frontmatter.js";
3
3
  export function parseFrontmatter(content) {
4
4
  return parseFrontmatterBlock(content);
5
5
  }
6
6
  function parseInstallSpec(input) {
7
- const parsed = parsePoolbotManifestInstallBase(input, ["bundled", "npm", "git"]);
7
+ const parsed = parsePoolBotManifestInstallBase(input, ["bundled", "npm", "git"]);
8
8
  if (!parsed) {
9
9
  return undefined;
10
10
  }
@@ -30,13 +30,13 @@ function parseInstallSpec(input) {
30
30
  return spec;
31
31
  }
32
32
  export function resolvePoolbotMetadata(frontmatter) {
33
- const metadataObj = resolvePoolbotManifestBlock({ frontmatter });
33
+ const metadataObj = resolvePoolBotManifestBlock({ frontmatter });
34
34
  if (!metadataObj) {
35
35
  return undefined;
36
36
  }
37
- const requires = resolvePoolbotManifestRequires(metadataObj);
38
- const install = resolvePoolbotManifestInstall(metadataObj, parseInstallSpec);
39
- const osRaw = resolvePoolbotManifestOs(metadataObj);
37
+ const requires = resolvePoolBotManifestRequires(metadataObj);
38
+ const install = resolvePoolBotManifestInstall(metadataObj, parseInstallSpec);
39
+ const osRaw = resolvePoolBotManifestOs(metadataObj);
40
40
  const eventsRaw = normalizeStringList(metadataObj.events);
41
41
  return {
42
42
  always: typeof metadataObj.always === "boolean" ? metadataObj.always : undefined,
@@ -8,8 +8,8 @@ import { spawn } from "node:child_process";
8
8
  import { hasBinary } from "../agents/skills.js";
9
9
  import { createSubsystemLogger } from "../logging/subsystem.js";
10
10
  import { runCommandWithTimeout } from "../process/exec.js";
11
- import { buildGogWatchServeArgs, buildGogWatchStartArgs, resolveGmailHookRuntimeConfig, } from "./gmail.js";
12
11
  import { ensureTailscaleEndpoint } from "./gmail-setup-utils.js";
12
+ import { buildGogWatchServeArgs, buildGogWatchStartArgs, resolveGmailHookRuntimeConfig, } from "./gmail.js";
13
13
  const log = createSubsystemLogger("gmail-watcher");
14
14
  const ADDRESS_IN_USE_RE = /address already in use|EADDRINUSE/i;
15
15
  export function isAddressInUseError(line) {
@@ -58,13 +58,15 @@ function spawnGogServe(cfg) {
58
58
  });
59
59
  child.stdout?.on("data", (data) => {
60
60
  const line = data.toString().trim();
61
- if (line)
61
+ if (line) {
62
62
  log.info(`[gog] ${line}`);
63
+ }
63
64
  });
64
65
  child.stderr?.on("data", (data) => {
65
66
  const line = data.toString().trim();
66
- if (!line)
67
+ if (!line) {
67
68
  return;
69
+ }
68
70
  if (isAddressInUseError(line)) {
69
71
  addressInUse = true;
70
72
  }
@@ -74,8 +76,9 @@ function spawnGogServe(cfg) {
74
76
  log.error(`gog process error: ${String(err)}`);
75
77
  });
76
78
  child.on("exit", (code, signal) => {
77
- if (shuttingDown)
79
+ if (shuttingDown) {
78
80
  return;
81
+ }
79
82
  if (addressInUse) {
80
83
  log.warn("gog serve failed to bind (address already in use); stopping restarts. " +
81
84
  "Another watcher is likely running. Set POOLBOT_SKIP_GMAIL_WATCHER=1 or stop the other process.");
@@ -85,8 +88,9 @@ function spawnGogServe(cfg) {
85
88
  log.warn(`gog exited (code=${code}, signal=${signal}); restarting in 5s`);
86
89
  watcherProcess = null;
87
90
  setTimeout(() => {
88
- if (shuttingDown || !currentConfig)
91
+ if (shuttingDown || !currentConfig) {
89
92
  return;
93
+ }
90
94
  watcherProcess = spawnGogServe(currentConfig);
91
95
  }, 5000);
92
96
  });
@@ -146,8 +150,9 @@ export async function startGmailWatcher(cfg) {
146
150
  // Set up renewal interval
147
151
  const renewMs = runtimeConfig.renewEveryMinutes * 60_000;
148
152
  renewInterval = setInterval(() => {
149
- if (shuttingDown)
153
+ if (shuttingDown) {
150
154
  return;
155
+ }
151
156
  void startGmailWatch(runtimeConfig);
152
157
  }, renewMs);
153
158
  log.info(`gmail watcher started for ${runtimeConfig.account} (renew every ${runtimeConfig.renewEveryMinutes}m)`);
@@ -4,8 +4,10 @@
4
4
  * Provides an extensible event-driven hook system for agent events
5
5
  * like command processing, session lifecycle, etc.
6
6
  */
7
+ import { createSubsystemLogger } from "../logging/subsystem.js";
7
8
  /** Registry of hook handlers by event key */
8
9
  const handlers = new Map();
10
+ const log = createSubsystemLogger("internal-hooks");
9
11
  /**
10
12
  * Register a hook handler for a specific event type or event:action combination
11
13
  *
@@ -87,7 +89,8 @@ export async function triggerInternalHook(event) {
87
89
  await handler(event);
88
90
  }
89
91
  catch (err) {
90
- console.error(`Hook error [${event.type}:${event.action}]:`, err instanceof Error ? err.message : String(err));
92
+ const message = err instanceof Error ? err.message : String(err);
93
+ log.error(`Hook error [${event.type}:${event.action}]: ${message}`);
91
94
  }
92
95
  }
93
96
  }
@@ -122,6 +125,13 @@ export function isAgentBootstrapEvent(event) {
122
125
  }
123
126
  return Array.isArray(context.bootstrapFiles);
124
127
  }
128
+ export function isGatewayStartupEvent(event) {
129
+ if (event.type !== "gateway" || event.action !== "startup") {
130
+ return false;
131
+ }
132
+ const context = event.context;
133
+ return Boolean(context && typeof context === "object");
134
+ }
125
135
  export function isMessageReceivedEvent(event) {
126
136
  if (event.type !== "message" || event.action !== "received") {
127
137
  return false;
@@ -6,6 +6,8 @@ import os from "node:os";
6
6
  import path from "node:path";
7
7
  import { runEmbeddedPiAgent } from "../agents/pi-embedded.js";
8
8
  import { resolveDefaultAgentId, resolveAgentWorkspaceDir, resolveAgentDir, } from "../agents/agent-scope.js";
9
+ import { createSubsystemLogger } from "../logging/subsystem.js";
10
+ const log = createSubsystemLogger("llm-slug-generator");
9
11
  /**
10
12
  * Generate a short 1-2 word filename slug from session content using LLM
11
13
  */
@@ -53,7 +55,8 @@ Reply with ONLY the slug, nothing else. Examples: "vendor-pitch", "api-design",
53
55
  return null;
54
56
  }
55
57
  catch (err) {
56
- console.error("[llm-slug-generator] Failed to generate slug:", err);
58
+ const message = err instanceof Error ? (err.stack ?? err.message) : String(err);
59
+ log.error(`Failed to generate slug: ${message}`);
57
60
  return null;
58
61
  }
59
62
  finally {