@poolzin/pool-bot 2026.2.20 → 2026.2.22

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 (388) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/agents/api-key-rotation.js +47 -0
  3. package/dist/agents/apply-patch-update.js +19 -9
  4. package/dist/agents/apply-patch.js +72 -47
  5. package/dist/agents/bash-tools.exec.js +141 -559
  6. package/dist/agents/cli-backends.js +49 -6
  7. package/dist/agents/cli-runner/helpers.js +69 -152
  8. package/dist/agents/cli-runner.js +70 -19
  9. package/dist/agents/identity.js +20 -1
  10. package/dist/agents/image-sanitization.js +9 -0
  11. package/dist/agents/live-auth-keys.js +123 -26
  12. package/dist/agents/live-model-filter.js +13 -4
  13. package/dist/agents/model-auth.js +12 -0
  14. package/dist/agents/model-catalog.js +40 -9
  15. package/dist/agents/model-fallback.js +24 -0
  16. package/dist/agents/model-forward-compat.js +60 -23
  17. package/dist/agents/model-selection.js +134 -41
  18. package/dist/agents/pi-auth-json.js +2 -2
  19. package/dist/agents/pi-embedded-helpers/bootstrap.js +65 -15
  20. package/dist/agents/pi-embedded-helpers/errors.js +140 -15
  21. package/dist/agents/pi-embedded-helpers/images.js +22 -12
  22. package/dist/agents/pi-embedded-helpers.js +2 -2
  23. package/dist/agents/pi-embedded-runner/abort.js +10 -3
  24. package/dist/agents/pi-embedded-runner/compact.js +230 -32
  25. package/dist/agents/pi-embedded-runner/extra-params.js +203 -12
  26. package/dist/agents/pi-embedded-runner/google.js +109 -19
  27. package/dist/agents/pi-embedded-runner/history.js +35 -17
  28. package/dist/agents/pi-embedded-runner/run/attempt.js +386 -80
  29. package/dist/agents/pi-embedded-runner/run/images.js +81 -55
  30. package/dist/agents/pi-embedded-runner/run/payloads.js +89 -39
  31. package/dist/agents/pi-embedded-runner/run.js +193 -25
  32. package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +2 -2
  33. package/dist/agents/pi-embedded-runner/runs.js +17 -8
  34. package/dist/agents/pi-embedded-runner/tool-result-context-guard.js +262 -0
  35. package/dist/agents/pi-embedded-runner.js +1 -1
  36. package/dist/agents/pi-embedded-subscribe.handlers.tools.js +180 -10
  37. package/dist/agents/pi-embedded-subscribe.js +37 -0
  38. package/dist/agents/pi-embedded-subscribe.tools.js +127 -30
  39. package/dist/agents/pi-model-discovery.js +9 -2
  40. package/dist/agents/pi-tool-definition-adapter.js +60 -8
  41. package/dist/agents/pi-tools.before-tool-call.js +1 -1
  42. package/dist/agents/pi-tools.js +113 -94
  43. package/dist/agents/pi-tools.read.js +337 -38
  44. package/dist/agents/poolbot-tools.js +14 -5
  45. package/dist/agents/provider/config-loader.js +76 -0
  46. package/dist/agents/provider/index.js +15 -0
  47. package/dist/agents/provider/integration.js +136 -0
  48. package/dist/agents/provider/models-dev.js +129 -0
  49. package/dist/agents/provider/rate-limits.js +458 -0
  50. package/dist/agents/provider/request-monitor.js +449 -0
  51. package/dist/agents/provider/session-binding.js +376 -0
  52. package/dist/agents/provider/token-pool.js +541 -0
  53. package/dist/agents/sandbox/docker.js +10 -5
  54. package/dist/agents/sandbox/registry.js +96 -46
  55. package/dist/agents/sandbox/sanitize-env-vars.js +82 -0
  56. package/dist/agents/sandbox-paths.js +43 -10
  57. package/dist/agents/session-tool-result-guard-wrapper.js +23 -11
  58. package/dist/agents/session-tool-result-guard.js +39 -39
  59. package/dist/agents/session-transcript-repair.js +36 -33
  60. package/dist/agents/session-write-lock.js +62 -44
  61. package/dist/agents/skills/frontmatter.js +49 -88
  62. package/dist/agents/skills/workspace.js +335 -28
  63. package/dist/agents/subagent-announce.js +508 -174
  64. package/dist/agents/subagent-registry.js +45 -4
  65. package/dist/agents/subagent-spawn.js +16 -33
  66. package/dist/agents/system-prompt-report.js +27 -10
  67. package/dist/agents/system-prompt.js +26 -32
  68. package/dist/agents/tool-call-id.js +69 -17
  69. package/dist/agents/tool-display-common.js +1 -1
  70. package/dist/agents/tool-images.js +64 -31
  71. package/dist/agents/tools/canvas-tool.js +17 -11
  72. package/dist/agents/tools/common.js +37 -19
  73. package/dist/agents/tools/cron-tool.js +40 -38
  74. package/dist/agents/tools/gateway.js +70 -2
  75. package/dist/agents/tools/message-tool.js +181 -40
  76. package/dist/agents/tools/nodes-tool.js +128 -36
  77. package/dist/agents/tools/nodes-utils.js +12 -38
  78. package/dist/agents/tools/session-status-tool.js +24 -71
  79. package/dist/agents/tools/sessions-helpers.js +38 -210
  80. package/dist/agents/tools/sessions-spawn-tool.js +28 -198
  81. package/dist/agents/tools/telegram-actions.js +58 -7
  82. package/dist/agents/tools/web-fetch-utils.js +112 -7
  83. package/dist/agents/tools/web-fetch.js +279 -175
  84. package/dist/agents/tools/web-shared.js +71 -8
  85. package/dist/agents/usage.js +25 -16
  86. package/dist/auto-reply/commands-registry.data.js +85 -11
  87. package/dist/auto-reply/dispatch.js +40 -21
  88. package/dist/auto-reply/reply/abort.js +102 -33
  89. package/dist/auto-reply/reply/commands-core.js +82 -33
  90. package/dist/auto-reply/reply/commands-export-session.js +1 -1
  91. package/dist/auto-reply/reply/commands-info.js +41 -12
  92. package/dist/auto-reply/reply/commands-subagents.js +352 -100
  93. package/dist/auto-reply/reply/commands-system-prompt.js +2 -2
  94. package/dist/auto-reply/reply/dispatch-from-config.js +100 -29
  95. package/dist/auto-reply/reply/elevated-unavailable.js +1 -1
  96. package/dist/auto-reply/reply/inbound-meta.js +12 -1
  97. package/dist/auto-reply/reply/mentions.js +18 -11
  98. package/dist/auto-reply/reply/normalize-reply.js +17 -8
  99. package/dist/auto-reply/reply/reply-dispatcher.js +62 -10
  100. package/dist/auto-reply/reply/session.js +102 -21
  101. package/dist/auto-reply/reply/streaming-directives.js +16 -5
  102. package/dist/auto-reply/status.js +73 -50
  103. package/dist/browser/extension-relay.js +3 -3
  104. package/dist/browser/http-auth.js +1 -1
  105. package/dist/browser/paths.js +2 -2
  106. package/dist/build-info.json +3 -3
  107. package/dist/channels/allowlist-match.js +20 -0
  108. package/dist/channels/allowlists/resolve-utils.js +65 -2
  109. package/dist/channels/chat-type.js +8 -4
  110. package/dist/channels/dock.js +127 -35
  111. package/dist/channels/draft-stream-loop.js +6 -2
  112. package/dist/channels/plugins/actions/telegram.js +42 -18
  113. package/dist/channels/plugins/allowlist-match.js +1 -1
  114. package/dist/channels/plugins/group-mentions.js +51 -41
  115. package/dist/channels/plugins/message-action-names.js +2 -0
  116. package/dist/channels/plugins/message-actions.js +24 -5
  117. package/dist/channels/plugins/normalize/discord.js +26 -4
  118. package/dist/channels/plugins/normalize/signal.js +35 -22
  119. package/dist/channels/plugins/onboarding/helpers.js +8 -26
  120. package/dist/channels/plugins/outbound/imessage.js +15 -14
  121. package/dist/channels/registry.js +20 -7
  122. package/dist/cli/acp-cli.js +7 -5
  123. package/dist/cli/browser-cli-extension.js +25 -12
  124. package/dist/cli/browser-cli-state.cookies-storage.js +25 -6
  125. package/dist/cli/browser-cli-state.js +101 -145
  126. package/dist/cli/command-options.js +28 -0
  127. package/dist/cli/completion-cli.js +6 -6
  128. package/dist/cli/cron-cli/register.cron-add.js +25 -1
  129. package/dist/cli/cron-cli/register.cron-edit.js +44 -0
  130. package/dist/cli/cron-cli/shared.js +7 -1
  131. package/dist/cli/daemon-cli/lifecycle-core.js +23 -21
  132. package/dist/cli/daemon-cli/lifecycle.js +23 -247
  133. package/dist/cli/daemon-cli/register-service-commands.js +25 -4
  134. package/dist/cli/daemon-cli.js +1 -0
  135. package/dist/cli/devices-cli.js +33 -20
  136. package/dist/cli/gateway-cli/register.js +37 -105
  137. package/dist/cli/gateway-cli/run.js +49 -11
  138. package/dist/cli/nodes-camera.js +59 -4
  139. package/dist/cli/nodes-cli/register.camera.js +27 -24
  140. package/dist/cli/nodes-cli/rpc.js +21 -38
  141. package/dist/cli/qr-cli.js +2 -2
  142. package/dist/cli/skills-cli.format.js +2 -2
  143. package/dist/cli/update-cli/progress.js +2 -2
  144. package/dist/cli/update-cli/restart-helper.js +28 -7
  145. package/dist/cli/update-cli/shared.js +7 -7
  146. package/dist/cli/update-cli/status.js +1 -1
  147. package/dist/cli/update-cli/update-command.js +14 -8
  148. package/dist/cli/update-cli/wizard.js +2 -2
  149. package/dist/cli/update-cli.js +21 -1027
  150. package/dist/commands/auth-choice.apply.anthropic.js +10 -2
  151. package/dist/commands/channels/add-mutators.js +3 -35
  152. package/dist/commands/channels/add.js +39 -51
  153. package/dist/commands/config-validation.js +1 -1
  154. package/dist/commands/configure.gateway-auth.js +52 -15
  155. package/dist/commands/configure.gateway.js +84 -40
  156. package/dist/commands/doctor-completion.js +3 -3
  157. package/dist/commands/doctor-config-flow.js +536 -16
  158. package/dist/commands/doctor-gateway-services.js +103 -79
  159. package/dist/commands/doctor-memory-search.js +9 -9
  160. package/dist/commands/doctor-platform-notes.js +57 -30
  161. package/dist/commands/doctor-prompter.js +26 -15
  162. package/dist/commands/doctor-session-locks.js +1 -1
  163. package/dist/commands/doctor.js +21 -9
  164. package/dist/commands/model-picker.js +120 -95
  165. package/dist/commands/models/set.js +2 -21
  166. package/dist/commands/models/shared.js +65 -37
  167. package/dist/commands/onboard-helpers.js +81 -39
  168. package/dist/commands/openai-codex-oauth.js +1 -1
  169. package/dist/commands/sessions.js +52 -53
  170. package/dist/commands/status.summary.js +52 -34
  171. package/dist/commands/test-wizard-helpers.js +2 -2
  172. package/dist/config/defaults.js +79 -42
  173. package/dist/config/group-policy.js +50 -18
  174. package/dist/config/includes.js +37 -10
  175. package/dist/config/schema.help.js +5 -4
  176. package/dist/config/schema.hints.js +2 -2
  177. package/dist/config/schema.labels.js +1 -0
  178. package/dist/config/sessions/group.js +12 -11
  179. package/dist/config/sessions/paths.js +137 -11
  180. package/dist/config/sessions/store.js +185 -65
  181. package/dist/config/sessions/types.js +15 -1
  182. package/dist/config/sessions.js +1 -0
  183. package/dist/config/telegram-custom-commands.js +3 -2
  184. package/dist/config/types.js +2 -0
  185. package/dist/config/zod-schema.agent-defaults.js +6 -27
  186. package/dist/config/zod-schema.agent-runtime.js +171 -79
  187. package/dist/config/zod-schema.providers-core.js +138 -65
  188. package/dist/config/zod-schema.session.js +49 -22
  189. package/dist/control-ui/assets/index-HRr1grwl.js.map +1 -1
  190. package/dist/cron/isolated-agent/run.js +224 -57
  191. package/dist/cron/normalize.js +48 -45
  192. package/dist/cron/run-log.js +14 -0
  193. package/dist/cron/service/jobs.js +190 -28
  194. package/dist/cron/service/normalize.js +29 -11
  195. package/dist/cron/service/store.js +30 -44
  196. package/dist/cron/service/timer.js +182 -96
  197. package/dist/cron/service.js +3 -0
  198. package/dist/cron/stagger.js +37 -0
  199. package/dist/daemon/inspect.js +132 -92
  200. package/dist/daemon/runtime-paths.js +25 -4
  201. package/dist/daemon/service-audit.js +47 -16
  202. package/dist/discord/accounts.js +23 -20
  203. package/dist/discord/monitor/agent-components.js +1115 -219
  204. package/dist/discord/monitor/allow-list.js +114 -34
  205. package/dist/discord/monitor/listeners.js +204 -97
  206. package/dist/discord/monitor/message-handler.js +21 -10
  207. package/dist/discord/monitor/message-handler.preflight.js +195 -101
  208. package/dist/discord/monitor/message-handler.process.js +384 -123
  209. package/dist/discord/monitor/message-utils.js +86 -23
  210. package/dist/discord/monitor/native-command.js +77 -57
  211. package/dist/discord/monitor/provider.js +122 -117
  212. package/dist/discord/monitor/reply-context.js +20 -16
  213. package/dist/discord/monitor/reply-delivery.js +40 -8
  214. package/dist/discord/monitor/rest-fetch.js +22 -0
  215. package/dist/discord/monitor/threading.js +117 -24
  216. package/dist/discord/send.js +2 -1
  217. package/dist/discord/send.outbound.js +124 -11
  218. package/dist/discord/send.shared.js +112 -72
  219. package/dist/discord/voice-message.js +3 -3
  220. package/dist/gateway/auth.js +119 -44
  221. package/dist/gateway/call.js +76 -34
  222. package/dist/gateway/channel-health-monitor.js +57 -50
  223. package/dist/gateway/client.js +63 -29
  224. package/dist/gateway/control-ui-contract.js +1 -1
  225. package/dist/gateway/gateway-config-prompts.shared.js +2 -2
  226. package/dist/gateway/net.js +109 -1
  227. package/dist/gateway/protocol/index.js +5 -8
  228. package/dist/gateway/protocol/schema/agent.js +19 -1
  229. package/dist/gateway/protocol/schema/channels.js +21 -0
  230. package/dist/gateway/protocol/schema/cron.js +43 -30
  231. package/dist/gateway/protocol/schema/protocol-schemas.js +6 -11
  232. package/dist/gateway/protocol/schema/sessions.js +5 -1
  233. package/dist/gateway/protocol/schema.js +0 -1
  234. package/dist/gateway/server/presence-events.js +12 -0
  235. package/dist/gateway/server/ws-connection/message-handler.js +203 -212
  236. package/dist/gateway/server/ws-connection.js +58 -21
  237. package/dist/gateway/server-broadcast.js +18 -13
  238. package/dist/gateway/server-cron.js +177 -10
  239. package/dist/gateway/server-methods/agent-job.js +131 -38
  240. package/dist/gateway/server-methods/send.js +60 -14
  241. package/dist/gateway/server-methods/sessions.js +160 -96
  242. package/dist/gateway/server-methods/system.js +5 -7
  243. package/dist/gateway/server-methods-list.js +8 -0
  244. package/dist/gateway/server-methods.js +24 -8
  245. package/dist/gateway/server-node-events.js +278 -68
  246. package/dist/gateway/session-utils.fs.js +316 -75
  247. package/dist/gateway/session-utils.js +224 -70
  248. package/dist/gateway/sessions-patch.js +63 -20
  249. package/dist/gateway/test-temp-config.js +1 -1
  250. package/dist/gateway/tools-invoke-http.js +118 -70
  251. package/dist/gateway/ws-log.js +135 -107
  252. package/dist/hooks/frontmatter.js +36 -82
  253. package/dist/hooks/install.js +149 -139
  254. package/dist/hooks/internal-hooks.js +29 -4
  255. package/dist/hooks/plugin-hooks.js +2 -1
  256. package/dist/imessage/monitor/deliver.js +10 -4
  257. package/dist/imessage/monitor/monitor-provider.js +138 -375
  258. package/dist/imessage/monitor/runtime.js +4 -8
  259. package/dist/imessage/send.js +65 -19
  260. package/dist/infra/exec-approvals-allowlist.js +7 -0
  261. package/dist/infra/exec-approvals.js +35 -920
  262. package/dist/infra/exec-safe-bin-trust.js +64 -0
  263. package/dist/infra/heartbeat-runner.js +207 -134
  264. package/dist/infra/heartbeat-wake.js +183 -22
  265. package/dist/infra/install-source-utils.js +47 -0
  266. package/dist/infra/net/ssrf.js +170 -36
  267. package/dist/infra/outbound/deliver.js +224 -58
  268. package/dist/infra/outbound/message-action-spec.js +12 -5
  269. package/dist/infra/outbound/outbound-session.js +27 -25
  270. package/dist/infra/poolbot-root.js +32 -22
  271. package/dist/infra/ports.js +14 -11
  272. package/dist/infra/skills-remote.js +48 -37
  273. package/dist/infra/system-events.js +25 -11
  274. package/dist/infra/system-presence.js +26 -33
  275. package/dist/infra/tmp-poolbot-dir.js +81 -2
  276. package/dist/infra/wsl.js +37 -1
  277. package/dist/line/bot-message-context.js +163 -191
  278. package/dist/logging/subsystem.js +59 -22
  279. package/dist/markdown/ir.js +124 -50
  280. package/dist/media/store.js +1 -1
  281. package/dist/media-understanding/runner.entries.js +42 -25
  282. package/dist/media-understanding/runner.js +53 -488
  283. package/dist/memory/embeddings-gemini.js +53 -38
  284. package/dist/memory/manager-embedding-ops.js +48 -69
  285. package/dist/pairing/pairing-store.js +178 -119
  286. package/dist/plugin-sdk/index.js +34 -6
  287. package/dist/plugins/hooks.js +135 -14
  288. package/dist/plugins/install.js +190 -152
  289. package/dist/polls.js +11 -0
  290. package/dist/routing/resolve-route.js +190 -56
  291. package/dist/routing/session-key.js +38 -22
  292. package/dist/runtime.js +35 -9
  293. package/dist/security/audit-channel.js +1 -1
  294. package/dist/sessions/session-key-utils.js +29 -11
  295. package/dist/shared/frontmatter.js +5 -5
  296. package/dist/shared/node-list-types.js +1 -0
  297. package/dist/shared/string-normalization.js +15 -0
  298. package/dist/signal/monitor/event-handler.js +68 -36
  299. package/dist/signal/send.js +29 -37
  300. package/dist/slack/monitor/allow-list.js +10 -11
  301. package/dist/slack/monitor/commands.js +14 -3
  302. package/dist/slack/monitor/events/interactions.js +4 -4
  303. package/dist/slack/monitor/media.js +224 -16
  304. package/dist/slack/monitor/message-handler/dispatch.js +247 -13
  305. package/dist/slack/monitor/message-handler/prepare.js +128 -45
  306. package/dist/slack/monitor/slash.js +357 -144
  307. package/dist/slack/streaming.js +77 -0
  308. package/dist/telegram/accounts.js +40 -13
  309. package/dist/telegram/allowed-updates.js +3 -0
  310. package/dist/telegram/bot/delivery.js +129 -66
  311. package/dist/telegram/bot/helpers.js +136 -122
  312. package/dist/telegram/bot-handlers.js +600 -339
  313. package/dist/telegram/bot-message-context.js +115 -73
  314. package/dist/telegram/bot-message-dispatch.js +235 -104
  315. package/dist/telegram/bot-native-command-menu.js +3 -1
  316. package/dist/telegram/bot-native-commands.js +213 -193
  317. package/dist/telegram/bot.js +24 -132
  318. package/dist/telegram/draft-stream.js +84 -75
  319. package/dist/telegram/format.js +150 -6
  320. package/dist/telegram/send.js +415 -255
  321. package/dist/telegram/targets.js +21 -2
  322. package/dist/telegram/update-offset-store.js +19 -3
  323. package/dist/terminal/restore.js +5 -2
  324. package/dist/test-utils/fetch-mock.js +5 -0
  325. package/dist/version.js +18 -5
  326. package/dist/web/auto-reply/monitor/broadcast.js +7 -3
  327. package/dist/web/auto-reply/monitor/on-message.js +6 -3
  328. package/dist/web/inbound/media.js +34 -8
  329. package/dist/web/inbound/monitor.js +34 -17
  330. package/dist/web/inbound/send-api.js +18 -17
  331. package/dist/web/outbound.js +12 -5
  332. package/dist/wizard/clack-prompter.js +40 -7
  333. package/extensions/bluebubbles/package.json +1 -1
  334. package/extensions/copilot-proxy/package.json +1 -1
  335. package/extensions/diagnostics-otel/package.json +1 -1
  336. package/extensions/discord/package.json +1 -1
  337. package/extensions/feishu/package.json +1 -1
  338. package/extensions/google-antigravity-auth/package.json +1 -1
  339. package/extensions/google-gemini-cli-auth/package.json +1 -1
  340. package/extensions/googlechat/package.json +1 -1
  341. package/extensions/imessage/package.json +1 -1
  342. package/extensions/irc/package.json +1 -1
  343. package/extensions/line/package.json +1 -1
  344. package/extensions/llm-task/package.json +1 -1
  345. package/extensions/lobster/package.json +1 -1
  346. package/extensions/matrix/CHANGELOG.md +5 -0
  347. package/extensions/matrix/package.json +1 -1
  348. package/extensions/mattermost/package.json +1 -1
  349. package/extensions/memory-core/package.json +1 -1
  350. package/extensions/memory-lancedb/package.json +1 -1
  351. package/extensions/minimax-portal-auth/package.json +1 -1
  352. package/extensions/msteams/CHANGELOG.md +5 -0
  353. package/extensions/msteams/package.json +1 -1
  354. package/extensions/nextcloud-talk/package.json +1 -1
  355. package/extensions/nostr/CHANGELOG.md +5 -0
  356. package/extensions/nostr/package.json +1 -1
  357. package/extensions/open-prose/package.json +1 -1
  358. package/extensions/openai-codex-auth/package.json +1 -1
  359. package/extensions/signal/package.json +1 -1
  360. package/extensions/slack/package.json +1 -1
  361. package/extensions/telegram/package.json +1 -1
  362. package/extensions/tlon/package.json +1 -1
  363. package/extensions/twitch/CHANGELOG.md +5 -0
  364. package/extensions/twitch/package.json +1 -1
  365. package/extensions/voice-call/CHANGELOG.md +5 -0
  366. package/extensions/voice-call/package.json +1 -1
  367. package/extensions/whatsapp/package.json +1 -1
  368. package/extensions/zalo/CHANGELOG.md +5 -0
  369. package/extensions/zalo/package.json +1 -1
  370. package/extensions/zalouser/CHANGELOG.md +5 -0
  371. package/extensions/zalouser/package.json +1 -1
  372. package/package.json +1 -1
  373. package/skills/apple-reminders/SKILL.md +100 -49
  374. package/skills/coding-agent/SKILL.md +34 -28
  375. package/skills/github/SKILL.md +131 -16
  376. package/skills/imsg/SKILL.md +112 -15
  377. package/skills/openhue/SKILL.md +101 -19
  378. package/skills/plcode-controller/SKILL.md +156 -0
  379. package/skills/plcode-controller/assets/operator-prompts.md +65 -0
  380. package/skills/plcode-controller/references/command-cheatsheet.md +53 -0
  381. package/skills/plcode-controller/references/failure-handling.md +60 -0
  382. package/skills/plcode-controller/references/model-selection.md +57 -0
  383. package/skills/plcode-controller/references/plan-vs-build.md +52 -0
  384. package/skills/plcode-controller/references/question-handling.md +40 -0
  385. package/skills/plcode-controller/references/session-management.md +63 -0
  386. package/skills/plcode-controller/references/workflow.md +35 -0
  387. package/skills/tmux/SKILL.md +111 -79
  388. package/skills/weather/SKILL.md +88 -25
@@ -1,44 +1,50 @@
1
+ import fs from "node:fs/promises";
1
2
  import { logVerbose } from "../../globals.js";
3
+ import { createInternalHookEvent, triggerInternalHook } from "../../hooks/internal-hooks.js";
4
+ import { getGlobalHookRunner } from "../../plugins/hook-runner-global.js";
2
5
  import { resolveSendPolicy } from "../../sessions/send-policy.js";
3
6
  import { shouldHandleTextCommands } from "../commands-registry.js";
4
- import { createInternalHookEvent, triggerInternalHook } from "../../hooks/internal-hooks.js";
5
- import { routeReply } from "./route-reply.js";
7
+ import { handleAllowlistCommand } from "./commands-allowlist.js";
8
+ import { handleApproveCommand } from "./commands-approve.js";
6
9
  import { handleBashCommand } from "./commands-bash.js";
7
10
  import { handleCompactCommand } from "./commands-compact.js";
8
11
  import { handleConfigCommand, handleDebugCommand } from "./commands-config.js";
9
- import { handleCommandsListCommand, handleContextCommand, handleHelpCommand, handleStatusCommand, handleWhoamiCommand, } from "./commands-info.js";
10
- import { handleAllowlistCommand } from "./commands-allowlist.js";
11
- import { handleApproveCommand } from "./commands-approve.js";
12
- import { handleSubagentsCommand } from "./commands-subagents.js";
12
+ import { handleCommandsListCommand, handleContextCommand, handleExportSessionCommand, handleHelpCommand, handleStatusCommand, handleWhoamiCommand, } from "./commands-info.js";
13
13
  import { handleModelsCommand } from "./commands-models.js";
14
- import { handleTtsCommands } from "./commands-tts.js";
15
- import { handleAbortTrigger, handleActivationCommand, handleRestartCommand, handleSendPolicyCommand, handleStopCommand, handleUsageCommand, } from "./commands-session.js";
16
14
  import { handlePluginCommand } from "./commands-plugin.js";
17
- const HANDLERS = [
18
- // Plugin commands are processed first, before built-in commands
19
- handlePluginCommand,
20
- handleBashCommand,
21
- handleActivationCommand,
22
- handleSendPolicyCommand,
23
- handleUsageCommand,
24
- handleRestartCommand,
25
- handleTtsCommands,
26
- handleHelpCommand,
27
- handleCommandsListCommand,
28
- handleStatusCommand,
29
- handleAllowlistCommand,
30
- handleApproveCommand,
31
- handleContextCommand,
32
- handleWhoamiCommand,
33
- handleSubagentsCommand,
34
- handleConfigCommand,
35
- handleDebugCommand,
36
- handleModelsCommand,
37
- handleStopCommand,
38
- handleCompactCommand,
39
- handleAbortTrigger,
40
- ];
15
+ import { handleAbortTrigger, handleActivationCommand, handleRestartCommand, handleSendPolicyCommand, handleStopCommand, handleUsageCommand, } from "./commands-session.js";
16
+ import { handleSubagentsCommand } from "./commands-subagents.js";
17
+ import { handleTtsCommands } from "./commands-tts.js";
18
+ import { routeReply } from "./route-reply.js";
19
+ let HANDLERS = null;
41
20
  export async function handleCommands(params) {
21
+ if (HANDLERS === null) {
22
+ HANDLERS = [
23
+ // Plugin commands are processed first, before built-in commands
24
+ handlePluginCommand,
25
+ handleBashCommand,
26
+ handleActivationCommand,
27
+ handleSendPolicyCommand,
28
+ handleUsageCommand,
29
+ handleRestartCommand,
30
+ handleTtsCommands,
31
+ handleHelpCommand,
32
+ handleCommandsListCommand,
33
+ handleStatusCommand,
34
+ handleAllowlistCommand,
35
+ handleApproveCommand,
36
+ handleContextCommand,
37
+ handleExportSessionCommand,
38
+ handleWhoamiCommand,
39
+ handleSubagentsCommand,
40
+ handleConfigCommand,
41
+ handleDebugCommand,
42
+ handleModelsCommand,
43
+ handleStopCommand,
44
+ handleCompactCommand,
45
+ handleAbortTrigger,
46
+ ];
47
+ }
42
48
  const resetMatch = params.command.commandBodyNormalized.match(/^\/(new|reset)(?:\s|$)/);
43
49
  const resetRequested = Boolean(resetMatch);
44
50
  if (resetRequested && !params.command.isAuthorizedSender) {
@@ -59,6 +65,7 @@ export async function handleCommands(params) {
59
65
  // Send hook messages immediately if present
60
66
  if (hookEvent.messages.length > 0) {
61
67
  // Use OriginatingChannel/To if available, otherwise fall back to command channel/from
68
+ // oxlint-disable-next-line typescript/no-explicit-any
62
69
  const channel = params.ctx.OriginatingChannel || params.command.channel;
63
70
  // For replies, use 'from' (the sender) not 'to' (which might be the bot itself)
64
71
  const to = params.ctx.OriginatingTo || params.command.from || params.command.to;
@@ -75,6 +82,47 @@ export async function handleCommands(params) {
75
82
  });
76
83
  }
77
84
  }
85
+ // Fire before_reset plugin hook — extract memories before session history is lost
86
+ const hookRunner = getGlobalHookRunner();
87
+ if (hookRunner?.hasHooks("before_reset")) {
88
+ const prevEntry = params.previousSessionEntry;
89
+ const sessionFile = prevEntry?.sessionFile;
90
+ // Fire-and-forget: read old session messages and run hook
91
+ void (async () => {
92
+ try {
93
+ const messages = [];
94
+ if (sessionFile) {
95
+ const content = await fs.readFile(sessionFile, "utf-8");
96
+ for (const line of content.split("\n")) {
97
+ if (!line.trim()) {
98
+ continue;
99
+ }
100
+ try {
101
+ const entry = JSON.parse(line);
102
+ if (entry.type === "message" && entry.message) {
103
+ messages.push(entry.message);
104
+ }
105
+ }
106
+ catch {
107
+ // skip malformed lines
108
+ }
109
+ }
110
+ }
111
+ else {
112
+ logVerbose("before_reset: no session file available, firing hook with empty messages");
113
+ }
114
+ await hookRunner.runBeforeReset({ sessionFile, messages, reason: commandAction }, {
115
+ agentId: params.sessionKey?.split(":")[0] ?? "main",
116
+ sessionKey: params.sessionKey,
117
+ sessionId: prevEntry?.sessionId,
118
+ workspaceDir: params.workspaceDir,
119
+ });
120
+ }
121
+ catch (err) {
122
+ logVerbose(`before_reset hook failed: ${String(err)}`);
123
+ }
124
+ })();
125
+ }
78
126
  }
79
127
  const allowTextCommands = shouldHandleTextCommands({
80
128
  cfg: params.cfg,
@@ -83,8 +131,9 @@ export async function handleCommands(params) {
83
131
  });
84
132
  for (const handler of HANDLERS) {
85
133
  const result = await handler(params, allowTextCommands);
86
- if (result)
134
+ if (result) {
87
135
  return result;
136
+ }
88
137
  }
89
138
  const sendPolicy = resolveSendPolicy({
90
139
  cfg: params.cfg,
@@ -135,7 +135,7 @@ export async function buildExportSessionReply(params) {
135
135
  const html = generateHtml(sessionData);
136
136
  // 6. Determine output path
137
137
  const timestamp = new Date().toISOString().replace(/[:.]/g, "-").slice(0, 19);
138
- const defaultFileName = `openclaw-session-${entry.sessionId.slice(0, 8)}-${timestamp}.html`;
138
+ const defaultFileName = `poolbot-session-${entry.sessionId.slice(0, 8)}-${timestamp}.html`;
139
139
  const outputPath = args.outputPath
140
140
  ? path.resolve(args.outputPath.startsWith("~")
141
141
  ? args.outputPath.replace("~", process.env.HOME ?? "")
@@ -1,13 +1,16 @@
1
1
  import { logVerbose } from "../../globals.js";
2
2
  import { listSkillCommandsForAgents } from "../skill-commands.js";
3
3
  import { buildCommandsMessage, buildCommandsMessagePaginated, buildHelpMessage, } from "../status.js";
4
- import { buildStatusReply } from "./commands-status.js";
5
4
  import { buildContextReply } from "./commands-context-report.js";
5
+ import { buildExportSessionReply } from "./commands-export-session.js";
6
+ import { buildStatusReply } from "./commands-status.js";
6
7
  export const handleHelpCommand = async (params, allowTextCommands) => {
7
- if (!allowTextCommands)
8
+ if (!allowTextCommands) {
8
9
  return null;
9
- if (params.command.commandBodyNormalized !== "/help")
10
+ }
11
+ if (params.command.commandBodyNormalized !== "/help") {
10
12
  return null;
13
+ }
11
14
  if (!params.command.isAuthorizedSender) {
12
15
  logVerbose(`Ignoring /help from unauthorized sender: ${params.command.senderId || "<unknown>"}`);
13
16
  return { shouldContinue: false };
@@ -18,10 +21,12 @@ export const handleHelpCommand = async (params, allowTextCommands) => {
18
21
  };
19
22
  };
20
23
  export const handleCommandsListCommand = async (params, allowTextCommands) => {
21
- if (!allowTextCommands)
24
+ if (!allowTextCommands) {
22
25
  return null;
23
- if (params.command.commandBodyNormalized !== "/commands")
26
+ }
27
+ if (params.command.commandBodyNormalized !== "/commands") {
24
28
  return null;
29
+ }
25
30
  if (!params.command.isAuthorizedSender) {
26
31
  logVerbose(`Ignoring /commands from unauthorized sender: ${params.command.senderId || "<unknown>"}`);
27
32
  return { shouldContinue: false };
@@ -82,11 +87,13 @@ export function buildCommandsPaginationKeyboard(currentPage, totalPages, agentId
82
87
  return [buttons];
83
88
  }
84
89
  export const handleStatusCommand = async (params, allowTextCommands) => {
85
- if (!allowTextCommands)
90
+ if (!allowTextCommands) {
86
91
  return null;
92
+ }
87
93
  const statusRequested = params.directives.hasStatusDirective || params.command.commandBodyNormalized === "/status";
88
- if (!statusRequested)
94
+ if (!statusRequested) {
89
95
  return null;
96
+ }
90
97
  if (!params.command.isAuthorizedSender) {
91
98
  logVerbose(`Ignoring /status from unauthorized sender: ${params.command.senderId || "<unknown>"}`);
92
99
  return { shouldContinue: false };
@@ -112,22 +119,43 @@ export const handleStatusCommand = async (params, allowTextCommands) => {
112
119
  return { shouldContinue: false, reply };
113
120
  };
114
121
  export const handleContextCommand = async (params, allowTextCommands) => {
115
- if (!allowTextCommands)
122
+ if (!allowTextCommands) {
116
123
  return null;
124
+ }
117
125
  const normalized = params.command.commandBodyNormalized;
118
- if (normalized !== "/context" && !normalized.startsWith("/context "))
126
+ if (normalized !== "/context" && !normalized.startsWith("/context ")) {
119
127
  return null;
128
+ }
120
129
  if (!params.command.isAuthorizedSender) {
121
130
  logVerbose(`Ignoring /context from unauthorized sender: ${params.command.senderId || "<unknown>"}`);
122
131
  return { shouldContinue: false };
123
132
  }
124
133
  return { shouldContinue: false, reply: await buildContextReply(params) };
125
134
  };
135
+ export const handleExportSessionCommand = async (params, allowTextCommands) => {
136
+ if (!allowTextCommands) {
137
+ return null;
138
+ }
139
+ const normalized = params.command.commandBodyNormalized;
140
+ if (normalized !== "/export-session" &&
141
+ !normalized.startsWith("/export-session ") &&
142
+ normalized !== "/export" &&
143
+ !normalized.startsWith("/export ")) {
144
+ return null;
145
+ }
146
+ if (!params.command.isAuthorizedSender) {
147
+ logVerbose(`Ignoring /export-session from unauthorized sender: ${params.command.senderId || "<unknown>"}`);
148
+ return { shouldContinue: false };
149
+ }
150
+ return { shouldContinue: false, reply: await buildExportSessionReply(params) };
151
+ };
126
152
  export const handleWhoamiCommand = async (params, allowTextCommands) => {
127
- if (!allowTextCommands)
153
+ if (!allowTextCommands) {
128
154
  return null;
129
- if (params.command.commandBodyNormalized !== "/whoami")
155
+ }
156
+ if (params.command.commandBodyNormalized !== "/whoami") {
130
157
  return null;
158
+ }
131
159
  if (!params.command.isAuthorizedSender) {
132
160
  logVerbose(`Ignoring /whoami from unauthorized sender: ${params.command.senderId || "<unknown>"}`);
133
161
  return { shouldContinue: false };
@@ -135,8 +163,9 @@ export const handleWhoamiCommand = async (params, allowTextCommands) => {
135
163
  const senderId = params.ctx.SenderId ?? "";
136
164
  const senderUsername = params.ctx.SenderUsername ?? "";
137
165
  const lines = ["🧭 Identity", `Channel: ${params.command.channel}`];
138
- if (senderId)
166
+ if (senderId) {
139
167
  lines.push(`User id: ${senderId}`);
168
+ }
140
169
  if (senderUsername) {
141
170
  const handle = senderUsername.startsWith("@") ? senderUsername : `@${senderUsername}`;
142
171
  lines.push(`Username: ${handle}`);