@poolzin/pool-bot 2026.2.24 → 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 (646) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/acp/client.js +207 -18
  3. package/dist/acp/event-mapper.js +87 -22
  4. package/dist/acp/meta.js +12 -6
  5. package/dist/acp/secret-file.js +22 -0
  6. package/dist/agents/agent-paths.js +8 -9
  7. package/dist/agents/agent-scope.js +17 -5
  8. package/dist/agents/auth-profiles/oauth.js +148 -64
  9. package/dist/agents/auth-profiles/session-override.js +13 -7
  10. package/dist/agents/bash-process-registry.test-helpers.js +29 -0
  11. package/dist/agents/bash-tools.exec-approval-request.js +20 -0
  12. package/dist/agents/bash-tools.exec-host-gateway.js +240 -0
  13. package/dist/agents/bash-tools.exec-host-node.js +235 -0
  14. package/dist/agents/bash-tools.exec-runtime.js +2 -25
  15. package/dist/agents/bash-tools.exec-types.js +1 -0
  16. package/dist/agents/bash-tools.process.js +224 -218
  17. package/dist/agents/bedrock-discovery.js +3 -1
  18. package/dist/agents/byteplus-models.js +97 -0
  19. package/dist/agents/chutes-oauth.js +1 -0
  20. package/dist/agents/cli-runner/helpers.js +4 -0
  21. package/dist/agents/compaction.js +41 -14
  22. package/dist/agents/content-blocks.js +16 -0
  23. package/dist/agents/doubao-models.js +121 -0
  24. package/dist/agents/failover-error.js +2 -0
  25. package/dist/agents/huggingface-models.js +5 -3
  26. package/dist/agents/live-model-filter.js +5 -0
  27. package/dist/agents/minimax-vlm.js +10 -8
  28. package/dist/agents/model-auth.js +6 -0
  29. package/dist/agents/model-catalog.js +3 -1
  30. package/dist/agents/model-fallback.js +96 -101
  31. package/dist/agents/model-selection.js +7 -1
  32. package/dist/agents/models-config.providers.js +364 -165
  33. package/dist/agents/ollama-stream.js +117 -4
  34. package/dist/agents/opencode-zen-models.js +22 -11
  35. package/dist/agents/pi-embedded-helpers/errors.js +55 -33
  36. package/dist/agents/pi-embedded-helpers/messaging-dedupe.js +10 -5
  37. package/dist/agents/pi-embedded-helpers/thinking.js +10 -5
  38. package/dist/agents/pi-embedded-helpers.js +1 -1
  39. package/dist/agents/pi-embedded-payloads.js +1 -0
  40. package/dist/agents/pi-embedded-runner/compact.js +29 -7
  41. package/dist/agents/pi-embedded-runner/extensions.js +28 -26
  42. package/dist/agents/pi-embedded-runner/google.js +20 -8
  43. package/dist/agents/pi-embedded-runner/run/attempt.js +95 -36
  44. package/dist/agents/pi-embedded-runner/run.js +71 -12
  45. package/dist/agents/pi-embedded-runner/run.overflow-compaction.fixture.js +34 -0
  46. package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +11 -2
  47. package/dist/agents/pi-embedded-runner/session-manager-cache.js +11 -7
  48. package/dist/agents/pi-embedded-runner/system-prompt.js +2 -0
  49. package/dist/agents/pi-embedded-runner/thinking.js +42 -0
  50. package/dist/agents/pi-embedded-runner/tool-name-allowlist.js +19 -0
  51. package/dist/agents/pi-embedded-runner/utils.js +7 -10
  52. package/dist/agents/pi-embedded-subscribe.handlers.lifecycle.js +45 -56
  53. package/dist/agents/pi-embedded-subscribe.handlers.tools.js +2 -2
  54. package/dist/agents/pi-embedded-subscribe.js +9 -4
  55. package/dist/agents/pi-embedded-subscribe.tools.js +68 -14
  56. package/dist/agents/pi-embedded-utils.js +3 -0
  57. package/dist/agents/pi-extensions/compaction-safeguard-runtime.js +4 -20
  58. package/dist/agents/pi-extensions/compaction-safeguard.js +75 -33
  59. package/dist/agents/pi-settings.js +40 -0
  60. package/dist/agents/pi-tools.policy.js +2 -1
  61. package/dist/agents/provider/config-loader.js +1 -1
  62. package/dist/agents/sandbox/browser.js +170 -33
  63. package/dist/agents/sandbox/config-hash.js +14 -27
  64. package/dist/agents/sandbox/config.js +21 -2
  65. package/dist/agents/sandbox/constants.js +2 -0
  66. package/dist/agents/sandbox/docker.js +16 -2
  67. package/dist/agents/sandbox/novnc-auth.js +62 -0
  68. package/dist/agents/sandbox/sanitize-env-vars.js +1 -1
  69. package/dist/agents/sandbox/shared.js +10 -6
  70. package/dist/agents/sandbox-paths.js +24 -11
  71. package/dist/agents/schema/clean-for-gemini.js +132 -85
  72. package/dist/agents/session-slug.js +10 -5
  73. package/dist/agents/session-tool-result-guard-wrapper.js +1 -0
  74. package/dist/agents/session-tool-result-guard.js +3 -1
  75. package/dist/agents/session-transcript-repair.js +40 -6
  76. package/dist/agents/skills/bundled-dir.js +19 -5
  77. package/dist/agents/skills/env-overrides.js +124 -43
  78. package/dist/agents/skills/frontmatter.js +6 -6
  79. package/dist/agents/skills/plugin-skills.js +14 -7
  80. package/dist/agents/skills/workspace.js +1 -0
  81. package/dist/agents/skills.test-helpers.js +13 -0
  82. package/dist/agents/stable-stringify.js +12 -0
  83. package/dist/agents/subagent-announce.js +251 -49
  84. package/dist/agents/subagent-lifecycle-events.js +19 -0
  85. package/dist/agents/subagent-registry-cleanup.js +31 -0
  86. package/dist/agents/subagent-registry-completion.js +68 -0
  87. package/dist/agents/subagent-registry-queries.js +117 -0
  88. package/dist/agents/subagent-registry-state.js +46 -0
  89. package/dist/agents/subagent-registry.js +252 -221
  90. package/dist/agents/subagent-registry.mocks.shared.js +12 -0
  91. package/dist/agents/subagent-registry.store.js +1 -0
  92. package/dist/agents/subagent-registry.types.js +1 -0
  93. package/dist/agents/subagent-spawn.js +195 -7
  94. package/dist/agents/system-prompt.js +22 -6
  95. package/dist/agents/test-helpers/assistant-message-fixtures.js +29 -0
  96. package/dist/agents/test-helpers/fast-coding-tools.js +1 -18
  97. package/dist/agents/test-helpers/fast-core-tools.js +1 -17
  98. package/dist/agents/test-helpers/pi-tools-sandbox-context.js +27 -0
  99. package/dist/agents/timeout.js +18 -6
  100. package/dist/agents/tool-call-id.js +1 -1
  101. package/dist/agents/tool-display-common.js +162 -29
  102. package/dist/agents/tool-images.js +82 -9
  103. package/dist/agents/tool-policy-shared.js +108 -0
  104. package/dist/agents/tool-policy.js +51 -26
  105. package/dist/agents/tools/browser-tool.js +160 -54
  106. package/dist/agents/tools/canvas-tool.js +27 -1
  107. package/dist/agents/tools/common.js +45 -0
  108. package/dist/agents/tools/cron-tool.test-helpers.js +12 -0
  109. package/dist/agents/tools/discord-actions-guild.js +4 -1
  110. package/dist/agents/tools/discord-actions-moderation-shared.js +27 -0
  111. package/dist/agents/tools/gateway-tool.js +3 -1
  112. package/dist/agents/tools/image-tool.js +214 -99
  113. package/dist/agents/tools/nodes-utils.js +1 -10
  114. package/dist/agents/tools/sessions-history-tool.js +140 -108
  115. package/dist/agents/tools/sessions-send-helpers.js +12 -6
  116. package/dist/agents/tools/sessions-spawn-tool.js +8 -2
  117. package/dist/agents/tools/subagents-tool.js +2 -1
  118. package/dist/agents/tools/whatsapp-actions.js +10 -2
  119. package/dist/agents/tools/whatsapp-target-auth.js +18 -0
  120. package/dist/agents/transcript-policy.js +22 -8
  121. package/dist/agents/venice-models.js +11 -3
  122. package/dist/agents/workspace.js +222 -46
  123. package/dist/auto-reply/commands-registry.data.js +51 -0
  124. package/dist/auto-reply/commands-registry.js +19 -21
  125. package/dist/auto-reply/fallback-state.js +114 -0
  126. package/dist/auto-reply/group-activation.js +10 -5
  127. package/dist/auto-reply/inbound-debounce.js +10 -5
  128. package/dist/auto-reply/model-runtime.js +68 -0
  129. package/dist/auto-reply/reply/abort.js +1 -1
  130. package/dist/auto-reply/reply/agent-runner-execution.js +40 -5
  131. package/dist/auto-reply/reply/agent-runner.js +165 -39
  132. package/dist/auto-reply/reply/bash-command.js +41 -39
  133. package/dist/auto-reply/reply/command-gates.js +25 -0
  134. package/dist/auto-reply/reply/commands-allowlist.js +111 -72
  135. package/dist/auto-reply/reply/commands-bash.js +6 -5
  136. package/dist/auto-reply/reply/commands-config.js +30 -28
  137. package/dist/auto-reply/reply/commands-core.js +2 -1
  138. package/dist/auto-reply/reply/commands-info.js +1 -0
  139. package/dist/auto-reply/reply/commands-models.js +65 -14
  140. package/dist/auto-reply/reply/commands-session.js +237 -82
  141. package/dist/auto-reply/reply/commands-setunset-standard.js +13 -0
  142. package/dist/auto-reply/reply/commands-setunset.js +45 -0
  143. package/dist/auto-reply/reply/commands-subagents/action-agents.js +44 -0
  144. package/dist/auto-reply/reply/commands-subagents/action-focus.js +64 -0
  145. package/dist/auto-reply/reply/commands-subagents/action-help.js +4 -0
  146. package/dist/auto-reply/reply/commands-subagents/action-info.js +45 -0
  147. package/dist/auto-reply/reply/commands-subagents/action-kill.js +60 -0
  148. package/dist/auto-reply/reply/commands-subagents/action-list.js +44 -0
  149. package/dist/auto-reply/reply/commands-subagents/action-log.js +29 -0
  150. package/dist/auto-reply/reply/commands-subagents/action-send.js +119 -0
  151. package/dist/auto-reply/reply/commands-subagents/action-spawn.js +52 -0
  152. package/dist/auto-reply/reply/commands-subagents/action-unfocus.js +30 -0
  153. package/dist/auto-reply/reply/commands-subagents/shared.js +303 -0
  154. package/dist/auto-reply/reply/commands-subagents.js +51 -587
  155. package/dist/auto-reply/reply/commands-tts.js +10 -5
  156. package/dist/auto-reply/reply/config-value.js +10 -5
  157. package/dist/auto-reply/reply/directive-handling.model-picker.js +12 -6
  158. package/dist/auto-reply/reply/directive-handling.persist.js +9 -21
  159. package/dist/auto-reply/reply/directive-handling.shared.js +24 -4
  160. package/dist/auto-reply/reply/followup-runner.js +1 -0
  161. package/dist/auto-reply/reply/get-reply-directives-utils.js +23 -14
  162. package/dist/auto-reply/reply/get-reply-directives.js +17 -28
  163. package/dist/auto-reply/reply/get-reply-inline-actions.js +1 -0
  164. package/dist/auto-reply/reply/get-reply.js +71 -12
  165. package/dist/auto-reply/reply/model-selection.js +80 -39
  166. package/dist/auto-reply/reply/queue/enqueue.js +10 -5
  167. package/dist/auto-reply/reply/queue/state.js +13 -12
  168. package/dist/auto-reply/reply/reply-payloads.js +67 -36
  169. package/dist/auto-reply/reply/reply-reference.js +9 -8
  170. package/dist/auto-reply/reply/route-reply.js +15 -8
  171. package/dist/auto-reply/reply/session-reset-prompt.js +1 -1
  172. package/dist/auto-reply/reply/session.js +22 -6
  173. package/dist/auto-reply/reply/strip-inbound-meta.js +147 -0
  174. package/dist/auto-reply/reply/subagents-utils.js +56 -30
  175. package/dist/auto-reply/reply/typing.js +46 -21
  176. package/dist/auto-reply/send-policy.js +14 -7
  177. package/dist/auto-reply/status.js +140 -16
  178. package/dist/auto-reply/templating.js +10 -5
  179. package/dist/auto-reply/thinking.js +7 -16
  180. package/dist/auto-reply/tokens.js +21 -5
  181. package/dist/browser/bridge-server.js +36 -20
  182. package/dist/browser/cdp.helpers.js +7 -14
  183. package/dist/browser/cdp.js +35 -15
  184. package/dist/browser/chrome.profile-decoration.js +7 -4
  185. package/dist/browser/config.js +30 -0
  186. package/dist/browser/extension-relay-auth.js +55 -0
  187. package/dist/browser/extension-relay.js +74 -29
  188. package/dist/browser/navigation-guard.js +39 -0
  189. package/dist/browser/paths.js +77 -0
  190. package/dist/browser/profiles.js +13 -8
  191. package/dist/browser/pw-ai-module.js +10 -5
  192. package/dist/browser/pw-session.js +76 -39
  193. package/dist/browser/pw-tools-core.interactions.js +14 -7
  194. package/dist/browser/pw-tools-core.state.js +12 -6
  195. package/dist/browser/routes/agent.act.js +431 -424
  196. package/dist/browser/routes/agent.shared.js +47 -3
  197. package/dist/browser/routes/agent.snapshot.js +122 -116
  198. package/dist/browser/routes/agent.storage.js +303 -297
  199. package/dist/browser/routes/tabs.js +154 -100
  200. package/dist/browser/server-context.js +7 -0
  201. package/dist/browser/server-lifecycle.js +37 -0
  202. package/dist/build-info.json +3 -3
  203. package/dist/channels/allow-from.js +26 -0
  204. package/dist/channels/allowlists/resolve-utils.js +43 -19
  205. package/dist/channels/channel-config.js +14 -7
  206. package/dist/channels/draft-stream-loop.js +7 -0
  207. package/dist/channels/model-overrides.js +82 -0
  208. package/dist/channels/plugins/account-action-gate.js +13 -0
  209. package/dist/channels/plugins/message-actions.js +10 -0
  210. package/dist/channels/plugins/normalize/imessage.js +14 -7
  211. package/dist/channels/plugins/normalize/slack.js +10 -5
  212. package/dist/channels/plugins/normalize/telegram.js +14 -7
  213. package/dist/channels/plugins/outbound/discord.js +80 -8
  214. package/dist/channels/plugins/outbound/signal.js +11 -11
  215. package/dist/channels/plugins/setup-helpers.js +10 -5
  216. package/dist/channels/sender-label.js +14 -7
  217. package/dist/channels/session.js +4 -2
  218. package/dist/channels/status-reactions.js +297 -0
  219. package/dist/channels/telegram/api.js +18 -0
  220. package/dist/cli/argv.js +84 -21
  221. package/dist/cli/banner.js +3 -2
  222. package/dist/cli/browser-cli-actions-input/register.files-downloads.js +65 -56
  223. package/dist/cli/cli-name.js +11 -11
  224. package/dist/cli/cli-utils.js +13 -3
  225. package/dist/cli/command-format.js +1 -1
  226. package/dist/cli/config-cli.js +1 -1
  227. package/dist/cli/daemon-cli/lifecycle-core.js +31 -19
  228. package/dist/cli/daemon-cli/lifecycle.js +64 -2
  229. package/dist/cli/daemon-cli/restart-health.js +126 -0
  230. package/dist/cli/daemon-cli/status.gather.js +9 -13
  231. package/dist/cli/daemon-cli/status.print.js +2 -10
  232. package/dist/cli/deps.js +27 -22
  233. package/dist/cli/exec-approvals-cli.js +92 -124
  234. package/dist/cli/gateway-cli/run-loop.js +23 -5
  235. package/dist/cli/memory-cli.js +158 -61
  236. package/dist/cli/node-cli/register.js +14 -5
  237. package/dist/cli/nodes-cli/register.push.js +63 -0
  238. package/dist/cli/nodes-media-utils.js +26 -0
  239. package/dist/cli/outbound-send-deps.js +2 -9
  240. package/dist/cli/outbound-send-mapping.js +11 -0
  241. package/dist/cli/pairing-cli.js +40 -14
  242. package/dist/cli/plugins-cli.js +250 -73
  243. package/dist/cli/ports.js +11 -10
  244. package/dist/cli/program/build-program.js +3 -1
  245. package/dist/cli/program/command-registry.js +214 -136
  246. package/dist/cli/program/command-tree.js +16 -0
  247. package/dist/cli/program/help.js +43 -12
  248. package/dist/cli/program/preaction.js +13 -9
  249. package/dist/cli/program/register.configure.js +3 -18
  250. package/dist/cli/program/register.maintenance.js +2 -2
  251. package/dist/cli/program/register.onboard.js +2 -0
  252. package/dist/cli/program/register.status-health-sessions.js +16 -17
  253. package/dist/cli/program/register.subclis.js +93 -52
  254. package/dist/cli/route.js +12 -8
  255. package/dist/cli/system-cli.js +36 -46
  256. package/dist/cli/test-runtime-capture.js +24 -0
  257. package/dist/cli/update-cli/shared.js +22 -9
  258. package/dist/cli/update-cli/update-command.js +89 -14
  259. package/dist/cli/update-cli/wizard.js +6 -12
  260. package/dist/commands/agent/run-context.js +18 -5
  261. package/dist/commands/agent/session-store.js +17 -4
  262. package/dist/commands/agent.js +185 -89
  263. package/dist/commands/agents.bindings.js +14 -7
  264. package/dist/commands/agents.commands.add.js +13 -9
  265. package/dist/commands/agents.commands.identity.js +12 -6
  266. package/dist/commands/agents.commands.list.js +11 -6
  267. package/dist/commands/agents.config.js +8 -10
  268. package/dist/commands/agents.providers.js +12 -6
  269. package/dist/commands/auth-choice-options.js +103 -75
  270. package/dist/commands/auth-choice.apply.byteplus.js +55 -0
  271. package/dist/commands/auth-choice.apply.js +4 -0
  272. package/dist/commands/auth-choice.apply.minimax.js +61 -13
  273. package/dist/commands/auth-choice.apply.openai.js +3 -1
  274. package/dist/commands/auth-choice.apply.volcengine.js +55 -0
  275. package/dist/commands/auth-choice.preferred-provider.js +2 -0
  276. package/dist/commands/channels/remove.js +13 -6
  277. package/dist/commands/channels/shared.js +4 -14
  278. package/dist/commands/channels.mock-harness.js +23 -0
  279. package/dist/commands/configure.commands.js +14 -0
  280. package/dist/commands/configure.gateway.js +2 -4
  281. package/dist/commands/configure.js +1 -1
  282. package/dist/commands/configure.shared.js +11 -0
  283. package/dist/commands/daemon-install-helpers.js +2 -2
  284. package/dist/commands/daemon-install-runtime-warning.js +11 -0
  285. package/dist/commands/dashboard.js +12 -10
  286. package/dist/commands/docs.js +14 -8
  287. package/dist/commands/doctor-config-flow.js +11 -9
  288. package/dist/commands/doctor-legacy-config.js +281 -0
  289. package/dist/commands/doctor-state-integrity.js +99 -23
  290. package/dist/commands/doctor-update.js +12 -9
  291. package/dist/commands/models/list.list-command.js +7 -5
  292. package/dist/commands/models/set-image.js +2 -21
  293. package/dist/commands/node-daemon-install-helpers.js +10 -8
  294. package/dist/commands/onboard-auth.config-minimax.js +54 -80
  295. package/dist/commands/onboard-auth.config-opencode.js +2 -18
  296. package/dist/commands/onboard-auth.credentials.js +90 -13
  297. package/dist/commands/onboard-auth.js +1 -1
  298. package/dist/commands/onboard-auth.models.js +6 -5
  299. package/dist/commands/onboard-hooks.js +1 -1
  300. package/dist/commands/onboard-non-interactive/api-keys.js +14 -7
  301. package/dist/commands/onboard-non-interactive/local/auth-choice.js +64 -49
  302. package/dist/commands/onboard-provider-auth-flags.js +14 -0
  303. package/dist/commands/onboard-remote.js +14 -7
  304. package/dist/commands/onboard.js +11 -13
  305. package/dist/commands/sandbox-display.js +6 -5
  306. package/dist/commands/sessions.test-helpers.js +61 -0
  307. package/dist/commands/status-all/diagnosis.js +14 -10
  308. package/dist/commands/status-all/format.js +1 -0
  309. package/dist/commands/status.gateway-probe.js +1 -16
  310. package/dist/commands/systemd-linger.js +12 -6
  311. package/dist/config/agent-limits.js +2 -0
  312. package/dist/config/commands.js +32 -15
  313. package/dist/config/config-paths.js +9 -11
  314. package/dist/config/config.js +1 -1
  315. package/dist/config/defaults.js +22 -2
  316. package/dist/config/discord-preview-streaming.js +104 -0
  317. package/dist/config/env-substitution.js +62 -34
  318. package/dist/config/env-vars.js +45 -7
  319. package/dist/config/includes.js +4 -0
  320. package/dist/config/io.js +656 -171
  321. package/dist/config/legacy.migrations.part-1.js +189 -78
  322. package/dist/config/legacy.shared.js +3 -1
  323. package/dist/config/merge-patch.js +54 -4
  324. package/dist/config/prototype-keys.js +4 -0
  325. package/dist/config/redact-snapshot.js +404 -76
  326. package/dist/config/schema.help.js +44 -7
  327. package/dist/config/schema.js +58 -570
  328. package/dist/config/schema.labels.js +38 -6
  329. package/dist/config/sessions/delivery-info.js +10 -3
  330. package/dist/config/sessions/main-session.js +10 -5
  331. package/dist/config/sessions/session-file.js +33 -0
  332. package/dist/config/sessions/session-key.js +10 -5
  333. package/dist/config/sessions/store.js +1 -1
  334. package/dist/config/sessions.js +1 -0
  335. package/dist/config/validation.js +140 -85
  336. package/dist/config/zod-schema.agent-runtime.js +11 -0
  337. package/dist/config/zod-schema.hooks.js +40 -11
  338. package/dist/config/zod-schema.installs.js +20 -0
  339. package/dist/config/zod-schema.js +156 -20
  340. package/dist/config/zod-schema.providers-core.js +78 -4
  341. package/dist/config/zod-schema.providers.js +6 -1
  342. package/dist/config/zod-schema.session.js +41 -2
  343. package/dist/cron/run-log.js +3 -0
  344. package/dist/cron/schedule.js +21 -10
  345. package/dist/cron/service/ops.js +35 -21
  346. package/dist/cron/service/timer.js +116 -16
  347. package/dist/cron/stagger.js +3 -1
  348. package/dist/daemon/cmd-argv.js +21 -0
  349. package/dist/daemon/cmd-set.js +58 -0
  350. package/dist/daemon/service-types.js +1 -0
  351. package/dist/discord/api.js +12 -6
  352. package/dist/discord/draft-chunking.js +22 -0
  353. package/dist/discord/draft-stream.js +124 -0
  354. package/dist/discord/monitor/agent-components.js +1 -1
  355. package/dist/discord/monitor/commands.js +5 -0
  356. package/dist/discord/monitor/exec-approvals.js +357 -162
  357. package/dist/discord/monitor/gateway-plugin.js +2 -1
  358. package/dist/discord/monitor/listeners.js +37 -27
  359. package/dist/discord/monitor/message-handler.js +4 -1
  360. package/dist/discord/monitor/message-handler.preflight.js +65 -8
  361. package/dist/discord/monitor/message-handler.process.js +246 -217
  362. package/dist/discord/monitor/message-utils.js +143 -6
  363. package/dist/discord/monitor/model-picker-preferences.js +143 -0
  364. package/dist/discord/monitor/model-picker.js +651 -0
  365. package/dist/discord/monitor/native-command.js +573 -16
  366. package/dist/discord/monitor/provider.allowlist.js +223 -0
  367. package/dist/discord/monitor/provider.js +275 -347
  368. package/dist/discord/monitor/provider.lifecycle.js +100 -0
  369. package/dist/discord/monitor/reply-delivery.js +123 -16
  370. package/dist/discord/monitor/thread-bindings.discord-api.js +215 -0
  371. package/dist/discord/monitor/thread-bindings.js +4 -0
  372. package/dist/discord/monitor/thread-bindings.lifecycle.js +177 -0
  373. package/dist/discord/monitor/thread-bindings.manager.js +423 -0
  374. package/dist/discord/monitor/thread-bindings.messages.js +55 -0
  375. package/dist/discord/monitor/thread-bindings.state.js +358 -0
  376. package/dist/discord/monitor/thread-bindings.types.js +6 -0
  377. package/dist/discord/resolve-users.js +33 -21
  378. package/dist/discord/send.channels.js +15 -0
  379. package/dist/discord/send.js +3 -2
  380. package/dist/discord/send.outbound.js +82 -26
  381. package/dist/discord/send.permissions.js +83 -30
  382. package/dist/discord/send.reactions.js +8 -4
  383. package/dist/discord/token.js +10 -5
  384. package/dist/discord/voice/command.js +263 -0
  385. package/dist/discord/voice/manager.js +531 -0
  386. package/dist/gateway/auth.js +72 -13
  387. package/dist/gateway/call.js +152 -83
  388. package/dist/gateway/canvas-capability.js +75 -0
  389. package/dist/gateway/client.js +28 -4
  390. package/dist/gateway/config-reload.js +3 -4
  391. package/dist/gateway/control-plane-audit.js +28 -0
  392. package/dist/gateway/control-plane-rate-limit.js +53 -0
  393. package/dist/gateway/control-ui.js +219 -96
  394. package/dist/gateway/events.js +1 -0
  395. package/dist/gateway/hooks-mapping.js +88 -38
  396. package/dist/gateway/hooks.js +109 -54
  397. package/dist/gateway/http-auth-helpers.js +3 -2
  398. package/dist/gateway/http-common.js +22 -0
  399. package/dist/gateway/http-endpoint-helpers.js +1 -0
  400. package/dist/gateway/method-scopes.js +169 -0
  401. package/dist/gateway/net.js +74 -9
  402. package/dist/gateway/node-invoke-system-run-approval.js +14 -35
  403. package/dist/gateway/node-registry.js +10 -5
  404. package/dist/gateway/openai-http.js +1 -0
  405. package/dist/gateway/openresponses-http.js +121 -110
  406. package/dist/gateway/origin-check.js +1 -18
  407. package/dist/gateway/probe-auth.js +2 -0
  408. package/dist/gateway/protocol/index.js +4 -2
  409. package/dist/gateway/protocol/schema/cron.js +1 -0
  410. package/dist/gateway/protocol/schema/devices.js +1 -0
  411. package/dist/gateway/protocol/schema/protocol-schemas.js +4 -1
  412. package/dist/gateway/protocol/schema/push.js +18 -0
  413. package/dist/gateway/protocol/schema/sessions.js +6 -0
  414. package/dist/gateway/protocol/schema.js +1 -0
  415. package/dist/gateway/role-policy.js +17 -0
  416. package/dist/gateway/server/ws-connection/connect-policy.js +37 -0
  417. package/dist/gateway/server/ws-connection/message-handler.js +175 -148
  418. package/dist/gateway/server-chat.js +83 -25
  419. package/dist/gateway/server-constants.js +10 -9
  420. package/dist/gateway/server-cron.js +1 -0
  421. package/dist/gateway/server-http.js +247 -54
  422. package/dist/gateway/server-maintenance.js +20 -5
  423. package/dist/gateway/server-methods/agent.js +162 -24
  424. package/dist/gateway/server-methods/chat.js +465 -130
  425. package/dist/gateway/server-methods/config.js +193 -152
  426. package/dist/gateway/server-methods/devices.js +17 -3
  427. package/dist/gateway/server-methods/models.js +11 -1
  428. package/dist/gateway/server-methods/nodes.helpers.js +12 -0
  429. package/dist/gateway/server-methods/nodes.js +251 -69
  430. package/dist/gateway/server-methods/push.js +53 -0
  431. package/dist/gateway/server-methods/sessions.js +64 -8
  432. package/dist/gateway/server-methods/usage.js +162 -75
  433. package/dist/gateway/server-node-events.js +29 -0
  434. package/dist/gateway/server-reload-handlers.js +2 -3
  435. package/dist/gateway/server-runtime-config.js +39 -13
  436. package/dist/gateway/server-runtime-state.js +2 -0
  437. package/dist/gateway/server-startup-memory.js +17 -11
  438. package/dist/gateway/server-ws-runtime.js +1 -0
  439. package/dist/gateway/server.impl.js +296 -139
  440. package/dist/gateway/session-preview.test-helpers.js +11 -0
  441. package/dist/gateway/session-utils.fs.js +32 -34
  442. package/dist/gateway/sessions-resolve.js +17 -5
  443. package/dist/gateway/startup-auth.js +126 -0
  444. package/dist/gateway/test-helpers.agent-results.js +15 -0
  445. package/dist/gateway/test-helpers.mocks.js +37 -14
  446. package/dist/gateway/test-helpers.openai-mock.js +14 -7
  447. package/dist/gateway/test-helpers.server.js +161 -77
  448. package/dist/gateway/tools-invoke-http.js +21 -10
  449. package/dist/hooks/bundled/bootstrap-extra-files/handler.js +3 -1
  450. package/dist/hooks/bundled/command-logger/handler.js +7 -2
  451. package/dist/hooks/bundled/session-memory/handler.js +170 -38
  452. package/dist/hooks/frontmatter.js +6 -6
  453. package/dist/hooks/gmail-watcher-lifecycle.js +23 -0
  454. package/dist/hooks/gmail-watcher.js +11 -6
  455. package/dist/hooks/internal-hooks.js +11 -1
  456. package/dist/hooks/llm-slug-generator.js +4 -1
  457. package/dist/hooks/workspace.js +47 -17
  458. package/dist/imessage/accounts.js +9 -20
  459. package/dist/imessage/monitor/inbound-processing.js +2 -1
  460. package/dist/infra/archive-path.js +49 -0
  461. package/dist/infra/archive.js +174 -73
  462. package/dist/infra/control-ui-assets.js +14 -6
  463. package/dist/infra/device-pairing.js +204 -144
  464. package/dist/infra/env.js +10 -5
  465. package/dist/infra/exec-approvals-allowlist.js +141 -70
  466. package/dist/infra/exec-approvals-analysis.js +78 -20
  467. package/dist/infra/exec-approvals.js +5 -17
  468. package/dist/infra/exec-safe-bin-policy.js +277 -0
  469. package/dist/infra/fixed-window-rate-limit.js +33 -0
  470. package/dist/infra/fs-safe.js +71 -39
  471. package/dist/infra/gateway-lock.js +6 -2
  472. package/dist/infra/git-root.js +61 -0
  473. package/dist/infra/heartbeat-active-hours.js +2 -2
  474. package/dist/infra/heartbeat-reason.js +40 -0
  475. package/dist/infra/heartbeat-runner.js +72 -32
  476. package/dist/infra/heartbeat-wake.js +6 -12
  477. package/dist/infra/host-env-security-policy.json +19 -0
  478. package/dist/infra/host-env-security.js +66 -0
  479. package/dist/infra/install-source-utils.js +91 -7
  480. package/dist/infra/net/ssrf.js +131 -38
  481. package/dist/infra/node-pairing.js +50 -105
  482. package/dist/infra/npm-integrity.js +45 -0
  483. package/dist/infra/npm-pack-install.js +40 -0
  484. package/dist/infra/outbound/bound-delivery-router.js +88 -0
  485. package/dist/infra/outbound/channel-adapters.js +20 -7
  486. package/dist/infra/outbound/channel-selection.js +12 -6
  487. package/dist/infra/outbound/envelope.js +1 -1
  488. package/dist/infra/outbound/format.js +12 -6
  489. package/dist/infra/outbound/message-action-runner.js +107 -327
  490. package/dist/infra/outbound/message.js +59 -36
  491. package/dist/infra/outbound/outbound-policy.js +52 -25
  492. package/dist/infra/outbound/outbound-send-service.js +58 -71
  493. package/dist/infra/outbound/payloads.js +14 -7
  494. package/dist/infra/outbound/session-binding-service.js +123 -0
  495. package/dist/infra/pairing-files.js +10 -0
  496. package/dist/infra/path-guards.js +25 -0
  497. package/dist/infra/plain-object.js +9 -0
  498. package/dist/infra/provider-usage.fetch.codex.js +7 -15
  499. package/dist/infra/provider-usage.fetch.gemini.js +14 -11
  500. package/dist/infra/provider-usage.fetch.shared.js +30 -1
  501. package/dist/infra/provider-usage.fetch.zai.js +10 -9
  502. package/dist/infra/push-apns.js +365 -0
  503. package/dist/infra/restart-sentinel.js +16 -1
  504. package/dist/infra/restart.js +229 -26
  505. package/dist/infra/retry-policy.js +4 -2
  506. package/dist/infra/retry.js +9 -5
  507. package/dist/infra/scp-host.js +54 -0
  508. package/dist/infra/session-cost-usage.js +107 -59
  509. package/dist/infra/session-maintenance-warning.js +3 -1
  510. package/dist/infra/shell-env.js +98 -34
  511. package/dist/infra/ssh-config.js +12 -6
  512. package/dist/infra/system-run-command.js +49 -4
  513. package/dist/infra/update-channels.js +10 -5
  514. package/dist/infra/update-startup.js +86 -9
  515. package/dist/line/accounts.js +5 -7
  516. package/dist/line/bot-access.js +8 -20
  517. package/dist/line/bot-handlers.js +3 -1
  518. package/dist/link-understanding/detect.js +15 -7
  519. package/dist/media/constants.js +15 -6
  520. package/dist/media/image-ops.js +7 -0
  521. package/dist/media/inbound-path-policy.js +114 -0
  522. package/dist/media/input-files.js +16 -0
  523. package/dist/media/local-roots.js +3 -2
  524. package/dist/media-understanding/apply.js +4 -1
  525. package/dist/media-understanding/concurrency.js +8 -20
  526. package/dist/memory/backend-config.js +45 -6
  527. package/dist/memory/embeddings.js +10 -4
  528. package/dist/memory/fs-utils.js +23 -0
  529. package/dist/memory/manager-search.js +12 -6
  530. package/dist/memory/manager-sync-ops.js +12 -2
  531. package/dist/memory/qmd-manager.js +466 -53
  532. package/dist/memory/query-expansion.js +167 -3
  533. package/dist/memory/status-format.js +10 -5
  534. package/dist/memory/sync-memory-files.js +1 -1
  535. package/dist/memory/test-manager.js +8 -0
  536. package/dist/node-host/invoke-system-run.js +281 -0
  537. package/dist/node-host/invoke.js +55 -337
  538. package/dist/pairing/pairing-store.js +22 -0
  539. package/dist/plugin-sdk/allow-from.js +1 -1
  540. package/dist/plugin-sdk/command-auth.js +3 -1
  541. package/dist/plugin-sdk/index.js +6 -3
  542. package/dist/plugin-sdk/temp-path.js +47 -0
  543. package/dist/plugin-sdk/webhook-targets.js +32 -0
  544. package/dist/plugins/bundled-dir.js +9 -6
  545. package/dist/plugins/discovery.js +217 -23
  546. package/dist/plugins/hook-runner-global.js +16 -0
  547. package/dist/plugins/hooks.js +50 -0
  548. package/dist/plugins/install.js +28 -16
  549. package/dist/plugins/loader.js +192 -26
  550. package/dist/plugins/logger.js +8 -0
  551. package/dist/plugins/manifest-registry.js +3 -0
  552. package/dist/plugins/path-safety.js +34 -0
  553. package/dist/plugins/registry.js +5 -2
  554. package/dist/plugins/runtime/index.js +271 -206
  555. package/dist/plugins/runtime.js +3 -17
  556. package/dist/plugins/update.js +78 -12
  557. package/dist/process/spawn-utils.js +14 -7
  558. package/dist/providers/github-copilot-models.js +4 -1
  559. package/dist/providers/github-copilot-token.js +11 -6
  560. package/dist/providers/qwen-portal-oauth.js +14 -6
  561. package/dist/routing/account-id.js +30 -0
  562. package/dist/routing/resolve-route.js +3 -7
  563. package/dist/routing/session-key.js +2 -16
  564. package/dist/security/audit-channel.js +100 -20
  565. package/dist/security/audit-extra.async.js +505 -179
  566. package/dist/security/audit-extra.js +12 -2
  567. package/dist/security/audit-extra.sync.js +421 -35
  568. package/dist/security/audit-fs.js +31 -13
  569. package/dist/security/audit.js +180 -370
  570. package/dist/security/dm-policy-shared.js +68 -0
  571. package/dist/security/external-content.js +46 -14
  572. package/dist/security/fix.js +49 -85
  573. package/dist/security/scan-paths.js +20 -0
  574. package/dist/security/secret-equal.js +3 -7
  575. package/dist/security/windows-acl.js +30 -15
  576. package/dist/shared/entry-status.js +6 -0
  577. package/dist/shared/frontmatter.js +5 -5
  578. package/dist/shared/node-list-parse.js +13 -0
  579. package/dist/shared/node-match.js +11 -4
  580. package/dist/shared/operator-scope-compat.js +42 -0
  581. package/dist/shared/text-chunking.js +29 -0
  582. package/dist/signal/accounts.js +7 -20
  583. package/dist/signal/monitor/event-handler.js +3 -1
  584. package/dist/slack/accounts.js +6 -19
  585. package/dist/slack/actions.js +11 -3
  586. package/dist/slack/blocks.test-helpers.js +31 -0
  587. package/dist/slack/monitor/auth.js +1 -1
  588. package/dist/slack/monitor/message-handler/dispatch.js +50 -29
  589. package/dist/slack/monitor/mrkdwn.js +8 -0
  590. package/dist/slack/monitor/replies.js +15 -7
  591. package/dist/slack/monitor/slash.js +22 -13
  592. package/dist/slack/resolve-channels.js +10 -5
  593. package/dist/slack/send.js +102 -12
  594. package/dist/slack/stream-mode.js +10 -0
  595. package/dist/slack/streaming.js +4 -2
  596. package/dist/telegram/accounts.js +19 -14
  597. package/dist/telegram/bot/helpers.js +3 -5
  598. package/dist/telegram/bot-access.js +35 -36
  599. package/dist/telegram/bot-handlers.js +120 -148
  600. package/dist/telegram/bot-message-context.js +68 -9
  601. package/dist/telegram/bot-message-dispatch.js +477 -210
  602. package/dist/telegram/bot-native-commands.js +16 -0
  603. package/dist/telegram/draft-stream.js +44 -8
  604. package/dist/telegram/inline-buttons.js +5 -15
  605. package/dist/telegram/monitor.js +11 -7
  606. package/dist/telegram/network-config.js +19 -7
  607. package/dist/telegram/reasoning-lane-coordinator.js +128 -0
  608. package/dist/telegram/send.js +3 -2
  609. package/dist/telegram/sent-message-cache.js +5 -6
  610. package/dist/telegram/status-reaction-variants.js +208 -0
  611. package/dist/telegram/sticker-cache.js +11 -9
  612. package/dist/terminal/prompt-select-styled.js +9 -0
  613. package/dist/terminal/theme.js +12 -12
  614. package/dist/test-utils/command-runner.js +6 -0
  615. package/dist/test-utils/internal-hook-event-payload.js +10 -0
  616. package/dist/test-utils/model-auth-mock.js +12 -0
  617. package/dist/test-utils/provider-usage-fetch.js +14 -0
  618. package/dist/test-utils/temp-home.js +33 -0
  619. package/dist/tts/tts.js +80 -567
  620. package/dist/tui/components/chat-log.js +50 -8
  621. package/dist/tui/theme/theme.js +10 -12
  622. package/dist/tui/tui-command-handlers.js +36 -27
  623. package/dist/tui/tui-event-handlers.js +122 -32
  624. package/dist/tui/tui-local-shell.js +16 -6
  625. package/dist/tui/tui.js +236 -48
  626. package/dist/utils/account-id.js +2 -4
  627. package/dist/utils/boolean.js +10 -5
  628. package/dist/utils/directive-tags.js +11 -0
  629. package/dist/utils/mask-api-key.js +10 -0
  630. package/dist/utils/queue-helpers.js +67 -12
  631. package/dist/utils/run-with-concurrency.js +39 -0
  632. package/dist/web/auto-reply/deliver-reply.js +8 -4
  633. package/dist/web/auto-reply/mentions.js +10 -5
  634. package/dist/web/auto-reply/monitor/group-members.js +14 -7
  635. package/dist/web/auto-reply/monitor/process-message.js +45 -24
  636. package/dist/web/inbound/access-control.js +5 -2
  637. package/dist/web/login-qr.js +12 -6
  638. package/dist/web/media.js +126 -15
  639. package/docs/tools/slash-commands.md +5 -1
  640. package/extensions/bluebubbles/src/monitor-processing.ts +580 -139
  641. package/extensions/bluebubbles/src/monitor.ts +208 -1950
  642. package/extensions/feishu/src/external-keys.ts +19 -0
  643. package/extensions/lobster/src/windows-spawn.ts +193 -0
  644. package/extensions/matrix/src/matrix/actions/limits.ts +6 -0
  645. package/extensions/mattermost/src/mattermost/reactions.test-helpers.ts +83 -0
  646. package/package.json +1 -1
@@ -411,20 +411,24 @@ function scanTopLevelChars(command, visit) {
411
411
  }
412
412
  }
413
413
  }
414
- function firstTopLevelStage(command) {
415
- let splitIndex = -1;
414
+ function splitTopLevelStages(command) {
415
+ const parts = [];
416
+ let start = 0;
416
417
  scanTopLevelChars(command, (char, index) => {
417
418
  if (char === ";") {
418
- splitIndex = index;
419
- return false;
419
+ parts.push(command.slice(start, index));
420
+ start = index + 1;
421
+ return true;
420
422
  }
421
423
  if ((char === "&" || char === "|") && command[index + 1] === char) {
422
- splitIndex = index;
423
- return false;
424
+ parts.push(command.slice(start, index));
425
+ start = index + 2;
426
+ return true;
424
427
  }
425
428
  return true;
426
429
  });
427
- return splitIndex >= 0 ? command.slice(0, splitIndex) : command;
430
+ parts.push(command.slice(start));
431
+ return parts.map((part) => part.trim()).filter((part) => part.length > 0);
428
432
  }
429
433
  function splitTopLevelPipes(command) {
430
434
  const parts = [];
@@ -439,31 +443,66 @@ function splitTopLevelPipes(command) {
439
443
  parts.push(command.slice(start));
440
444
  return parts.map((part) => part.trim()).filter((part) => part.length > 0);
441
445
  }
446
+ function parseChdirTarget(head) {
447
+ const words = splitShellWords(head, 3);
448
+ const bin = binaryName(words[0]);
449
+ if (bin === "cd" || bin === "pushd") {
450
+ return words[1] || undefined;
451
+ }
452
+ return undefined;
453
+ }
454
+ function isChdirCommand(head) {
455
+ const bin = binaryName(splitShellWords(head, 2)[0]);
456
+ return bin === "cd" || bin === "pushd" || bin === "popd";
457
+ }
458
+ function isPopdCommand(head) {
459
+ return binaryName(splitShellWords(head, 2)[0]) === "popd";
460
+ }
442
461
  function stripShellPreamble(command) {
443
462
  let rest = command.trim();
463
+ let chdirPath;
444
464
  for (let i = 0; i < 4; i += 1) {
445
- const andIndex = rest.indexOf("&&");
446
- const semicolonIndex = rest.indexOf(";");
447
- const newlineIndex = rest.indexOf("\n");
448
- const candidates = [
449
- { index: andIndex, length: 2 },
450
- { index: semicolonIndex, length: 1 },
451
- { index: newlineIndex, length: 1 },
452
- ]
453
- .filter((candidate) => candidate.index >= 0)
454
- .toSorted((a, b) => a.index - b.index);
455
- const first = candidates[0];
465
+ // Find the first top-level separator (&&, ||, ;, \n) respecting quotes/escaping.
466
+ let first;
467
+ scanTopLevelChars(rest, (char, idx) => {
468
+ if (char === "&" && rest[idx + 1] === "&") {
469
+ first = { index: idx, length: 2 };
470
+ return false;
471
+ }
472
+ if (char === "|" && rest[idx + 1] === "|") {
473
+ first = { index: idx, length: 2, isOr: true };
474
+ return false;
475
+ }
476
+ if (char === ";" || char === "\n") {
477
+ first = { index: idx, length: 1 };
478
+ return false;
479
+ }
480
+ });
456
481
  const head = (first ? rest.slice(0, first.index) : rest).trim();
457
- const isPreamble = head.startsWith("set ") || head.startsWith("export ") || head.startsWith("unset ");
482
+ // cd/pushd/popd is preamble when followed by && / ; / \n, or when we already
483
+ // stripped at least one preamble segment (handles chained cd's like `cd /tmp && cd /app`).
484
+ // NOT for || — `cd /app || npm install` means npm runs when cd *fails*, so (in /app) is wrong.
485
+ const isChdir = (first ? !first.isOr : i > 0) && isChdirCommand(head);
486
+ const isPreamble = head.startsWith("set ") || head.startsWith("export ") || head.startsWith("unset ") || isChdir;
458
487
  if (!isPreamble) {
459
488
  break;
460
489
  }
490
+ if (isChdir) {
491
+ // popd returns to the previous directory, so inferred cwd from earlier
492
+ // preamble steps is no longer reliable.
493
+ if (isPopdCommand(head)) {
494
+ chdirPath = undefined;
495
+ }
496
+ else {
497
+ chdirPath = parseChdirTarget(head) ?? chdirPath;
498
+ }
499
+ }
461
500
  rest = first ? rest.slice(first.index + first.length).trimStart() : "";
462
501
  if (!rest) {
463
502
  break;
464
503
  }
465
504
  }
466
- return rest.trim();
505
+ return { command: rest.trim(), chdirPath };
467
506
  }
468
507
  function summarizeKnownExec(words) {
469
508
  if (words.length === 0) {
@@ -696,12 +735,7 @@ function summarizeKnownExec(words) {
696
735
  }
697
736
  return /^[A-Za-z0-9._/-]+$/.test(arg) ? `run ${bin} ${arg}` : `run ${bin}`;
698
737
  }
699
- function summarizeExecCommand(command) {
700
- const cleaned = stripShellPreamble(command);
701
- const stage = firstTopLevelStage(cleaned).trim();
702
- if (!stage) {
703
- return cleaned ? summarizeKnownExec(trimLeadingEnv(splitShellWords(cleaned))) : undefined;
704
- }
738
+ function summarizePipeline(stage) {
705
739
  const pipeline = splitTopLevelPipes(stage);
706
740
  if (pipeline.length > 1) {
707
741
  const first = summarizeKnownExec(trimLeadingEnv(splitShellWords(pipeline[0])));
@@ -711,6 +745,92 @@ function summarizeExecCommand(command) {
711
745
  }
712
746
  return summarizeKnownExec(trimLeadingEnv(splitShellWords(stage)));
713
747
  }
748
+ function summarizeExecCommand(command) {
749
+ const { command: cleaned, chdirPath } = stripShellPreamble(command);
750
+ if (!cleaned) {
751
+ // All segments were preamble (e.g. `cd /tmp && cd /app`) — preserve chdirPath for context.
752
+ return chdirPath ? { text: "", chdirPath } : undefined;
753
+ }
754
+ const stages = splitTopLevelStages(cleaned);
755
+ if (stages.length === 0) {
756
+ return undefined;
757
+ }
758
+ const summaries = stages.map((stage) => summarizePipeline(stage));
759
+ const text = summaries.length === 1 ? summaries[0] : summaries.join(" → ");
760
+ const allGeneric = summaries.every((s) => isGenericSummary(s));
761
+ return { text, chdirPath, allGeneric };
762
+ }
763
+ /** Known summarizer prefixes that indicate a recognized command with useful context. */
764
+ const KNOWN_SUMMARY_PREFIXES = [
765
+ "check git",
766
+ "view git",
767
+ "show git",
768
+ "list git",
769
+ "switch git",
770
+ "create git",
771
+ "pull git",
772
+ "push git",
773
+ "fetch git",
774
+ "merge git",
775
+ "rebase git",
776
+ "stage git",
777
+ "restore git",
778
+ "reset git",
779
+ "stash git",
780
+ "search ",
781
+ "find files",
782
+ "list files",
783
+ "show first",
784
+ "show last",
785
+ "print line",
786
+ "print text",
787
+ "copy ",
788
+ "move ",
789
+ "remove ",
790
+ "create folder",
791
+ "create file",
792
+ "fetch http",
793
+ "install dependencies",
794
+ "run tests",
795
+ "run build",
796
+ "start app",
797
+ "run lint",
798
+ "run poolbot",
799
+ "run node script",
800
+ "run node ",
801
+ "run python",
802
+ "run ruby",
803
+ "run php",
804
+ "run sed",
805
+ "run git ",
806
+ "run npm ",
807
+ "run pnpm ",
808
+ "run yarn ",
809
+ "run bun ",
810
+ "check js syntax",
811
+ ];
812
+ /** True when the summary is generic and the raw command would be more informative. */
813
+ function isGenericSummary(summary) {
814
+ if (summary === "run command") {
815
+ return true;
816
+ }
817
+ // "run <binary>" or "run <binary> <arg>" without useful context
818
+ if (summary.startsWith("run ")) {
819
+ return !KNOWN_SUMMARY_PREFIXES.some((prefix) => summary.startsWith(prefix));
820
+ }
821
+ return false;
822
+ }
823
+ /** Compact the raw command for display: collapse whitespace, trim long strings. */
824
+ function compactRawCommand(raw, maxLength = 120) {
825
+ const oneLine = raw
826
+ .replace(/\s*\n\s*/g, " ")
827
+ .replace(/\s{2,}/g, " ")
828
+ .trim();
829
+ if (oneLine.length <= maxLength) {
830
+ return oneLine;
831
+ }
832
+ return `${oneLine.slice(0, Math.max(0, maxLength - 1))}…`;
833
+ }
714
834
  export function resolveExecDetail(args) {
715
835
  const record = asRecord(args);
716
836
  if (!record) {
@@ -721,14 +841,27 @@ export function resolveExecDetail(args) {
721
841
  return undefined;
722
842
  }
723
843
  const unwrapped = unwrapShellWrapper(raw);
724
- const summary = summarizeExecCommand(unwrapped) ?? summarizeExecCommand(raw) ?? "run command";
844
+ const result = summarizeExecCommand(unwrapped) ?? summarizeExecCommand(raw);
845
+ const summary = result?.text || "run command";
725
846
  const cwdRaw = typeof record.workdir === "string"
726
847
  ? record.workdir
727
848
  : typeof record.cwd === "string"
728
849
  ? record.cwd
729
850
  : undefined;
730
- const cwd = cwdRaw?.trim();
731
- return cwd ? `${summary} (in ${cwd})` : summary;
851
+ // Explicit workdir takes priority; fall back to cd path extracted from the command.
852
+ const cwd = cwdRaw?.trim() || result?.chdirPath || undefined;
853
+ const compact = compactRawCommand(unwrapped);
854
+ // When ALL stages are generic (e.g. "run jj"), use the compact raw command instead.
855
+ // For mixed stages like "run cargo build → run tests", keep the summary since some parts are useful.
856
+ if (result?.allGeneric !== false && isGenericSummary(summary)) {
857
+ return cwd ? `${compact} (in ${cwd})` : compact;
858
+ }
859
+ const displaySummary = cwd ? `${summary} (in ${cwd})` : summary;
860
+ // Append the raw command when the summary differs meaningfully from the command itself.
861
+ if (compact && compact !== displaySummary && compact !== summary) {
862
+ return `${displaySummary}\n\n\`${compact}\``;
863
+ }
864
+ return displaySummary;
732
865
  }
733
866
  export function resolveActionSpec(spec, action) {
734
867
  if (!spec || !action) {
@@ -1,5 +1,5 @@
1
1
  import { createSubsystemLogger } from "../logging/subsystem.js";
2
- import { getImageMetadata, resizeToJpeg } from "../media/image-ops.js";
2
+ import { buildImageResizeSideGrid, getImageMetadata, IMAGE_REDUCE_QUALITY_STEPS, resizeToJpeg, } from "../media/image-ops.js";
3
3
  import { DEFAULT_IMAGE_MAX_BYTES, DEFAULT_IMAGE_MAX_DIMENSION_PX, } from "./image-sanitization.js";
4
4
  // Anthropic Messages API limitations (observed in Pool Bot sessions):
5
5
  // - Images over ~2000px per side can fail in multi-image requests.
@@ -49,6 +49,68 @@ function formatBytesShort(bytes) {
49
49
  }
50
50
  return `${(bytes / (1024 * 1024)).toFixed(2)}MB`;
51
51
  }
52
+ function parseMediaPathFromText(text) {
53
+ for (const line of text.split(/\r?\n/u)) {
54
+ const trimmed = line.trim();
55
+ if (!trimmed.startsWith("MEDIA:")) {
56
+ continue;
57
+ }
58
+ const raw = trimmed.slice("MEDIA:".length).trim();
59
+ if (!raw) {
60
+ continue;
61
+ }
62
+ const backtickWrapped = raw.match(/^`([^`]+)`$/u);
63
+ return (backtickWrapped?.[1] ?? raw).trim();
64
+ }
65
+ return undefined;
66
+ }
67
+ function fileNameFromPathLike(pathLike) {
68
+ const value = pathLike.trim();
69
+ if (!value) {
70
+ return undefined;
71
+ }
72
+ try {
73
+ const url = new URL(value);
74
+ const candidate = url.pathname.split("/").filter(Boolean).at(-1);
75
+ return candidate && candidate.length > 0 ? candidate : undefined;
76
+ }
77
+ catch {
78
+ // Not a URL; continue with path-like parsing.
79
+ }
80
+ const normalized = value.replaceAll("\\", "/");
81
+ const candidate = normalized.split("/").filter(Boolean).at(-1);
82
+ return candidate && candidate.length > 0 ? candidate : undefined;
83
+ }
84
+ function inferImageFileName(params) {
85
+ const rec = params.block;
86
+ const explicitKeys = ["fileName", "filename", "path", "url"];
87
+ for (const key of explicitKeys) {
88
+ const raw = rec[key];
89
+ if (typeof raw !== "string" || raw.trim().length === 0) {
90
+ continue;
91
+ }
92
+ const candidate = fileNameFromPathLike(raw);
93
+ if (candidate) {
94
+ return candidate;
95
+ }
96
+ }
97
+ if (typeof rec.name === "string" && rec.name.trim().length > 0) {
98
+ return rec.name.trim();
99
+ }
100
+ if (params.mediaPathHint) {
101
+ const candidate = fileNameFromPathLike(params.mediaPathHint);
102
+ if (candidate) {
103
+ return candidate;
104
+ }
105
+ }
106
+ if (typeof params.label === "string" && params.label.startsWith("read:")) {
107
+ const candidate = fileNameFromPathLike(params.label.slice("read:".length));
108
+ if (candidate) {
109
+ return candidate;
110
+ }
111
+ }
112
+ return undefined;
113
+ }
52
114
  async function resizeImageBase64IfNeeded(params) {
53
115
  const buf = Buffer.from(params.base64, "base64");
54
116
  const meta = await getImageMetadata(buf);
@@ -69,16 +131,12 @@ async function resizeImageBase64IfNeeded(params) {
69
131
  height,
70
132
  };
71
133
  }
72
- const qualities = [85, 75, 65, 55, 45, 35];
73
134
  const maxDim = hasDimensions ? Math.max(width ?? 0, height ?? 0) : params.maxDimensionPx;
74
135
  const sideStart = maxDim > 0 ? Math.min(params.maxDimensionPx, maxDim) : params.maxDimensionPx;
75
- const sideGrid = [sideStart, 1800, 1600, 1400, 1200, 1000, 800]
76
- .filter((v) => v > 0 && v <= params.maxDimensionPx)
77
- .filter((v, i, arr) => v > 0 && arr.indexOf(v) === i)
78
- .toSorted((a, b) => b - a);
136
+ const sideGrid = buildImageResizeSideGrid(params.maxDimensionPx, sideStart);
79
137
  let smallest = null;
80
138
  for (const side of sideGrid) {
81
- for (const quality of qualities) {
139
+ for (const quality of IMAGE_REDUCE_QUALITY_STEPS) {
82
140
  const out = await resizeToJpeg({
83
141
  buffer: buf,
84
142
  maxSide: side,
@@ -92,11 +150,15 @@ async function resizeImageBase64IfNeeded(params) {
92
150
  const sourcePixels = typeof width === "number" && typeof height === "number"
93
151
  ? `${width}x${height}px`
94
152
  : "unknown";
153
+ const sourceWithFile = params.fileName
154
+ ? `${params.fileName} ${sourcePixels}`
155
+ : sourcePixels;
95
156
  const byteReductionPct = buf.byteLength > 0
96
157
  ? Number((((buf.byteLength - out.byteLength) / buf.byteLength) * 100).toFixed(1))
97
158
  : 0;
98
- log.info(`Image resized to fit limits: ${sourcePixels} ${formatBytesShort(buf.byteLength)} -> ${formatBytesShort(out.byteLength)} (-${byteReductionPct}%)`, {
159
+ log.info(`Image resized to fit limits: ${sourceWithFile} ${formatBytesShort(buf.byteLength)} -> ${formatBytesShort(out.byteLength)} (-${byteReductionPct}%)`, {
99
160
  label: params.label,
161
+ fileName: params.fileName,
100
162
  sourceMimeType: params.mimeType,
101
163
  sourceWidth: width,
102
164
  sourceHeight: height,
@@ -125,8 +187,10 @@ async function resizeImageBase64IfNeeded(params) {
125
187
  const maxMb = (params.maxBytes / (1024 * 1024)).toFixed(0);
126
188
  const gotMb = (best.byteLength / (1024 * 1024)).toFixed(2);
127
189
  const sourcePixels = typeof width === "number" && typeof height === "number" ? `${width}x${height}px` : "unknown";
128
- log.warn(`Image resize failed to fit limits: ${sourcePixels} best=${formatBytesShort(best.byteLength)} limit=${formatBytesShort(params.maxBytes)}`, {
190
+ const sourceWithFile = params.fileName ? `${params.fileName} ${sourcePixels}` : sourcePixels;
191
+ log.warn(`Image resize failed to fit limits: ${sourceWithFile} best=${formatBytesShort(best.byteLength)} limit=${formatBytesShort(params.maxBytes)}`, {
129
192
  label: params.label,
193
+ fileName: params.fileName,
130
194
  sourceMimeType: params.mimeType,
131
195
  sourceWidth: width,
132
196
  sourceHeight: height,
@@ -143,7 +207,14 @@ export async function sanitizeContentBlocksImages(blocks, label, opts = {}) {
143
207
  const maxDimensionPx = Math.max(opts.maxDimensionPx ?? MAX_IMAGE_DIMENSION_PX, 1);
144
208
  const maxBytes = Math.max(opts.maxBytes ?? MAX_IMAGE_BYTES, 1);
145
209
  const out = [];
210
+ let mediaPathHint;
146
211
  for (const block of blocks) {
212
+ if (isTextBlock(block)) {
213
+ const mediaPath = parseMediaPathFromText(block.text);
214
+ if (mediaPath) {
215
+ mediaPathHint = mediaPath;
216
+ }
217
+ }
147
218
  if (!isImageBlock(block)) {
148
219
  out.push(block);
149
220
  continue;
@@ -159,12 +230,14 @@ export async function sanitizeContentBlocksImages(blocks, label, opts = {}) {
159
230
  try {
160
231
  const inferredMimeType = inferMimeTypeFromBase64(data);
161
232
  const mimeType = inferredMimeType ?? block.mimeType;
233
+ const fileName = inferImageFileName({ block, label, mediaPathHint });
162
234
  const resized = await resizeImageBase64IfNeeded({
163
235
  base64: data,
164
236
  mimeType,
165
237
  maxDimensionPx,
166
238
  maxBytes,
167
239
  label,
240
+ fileName,
168
241
  });
169
242
  out.push({
170
243
  ...block,
@@ -0,0 +1,108 @@
1
+ const TOOL_NAME_ALIASES = {
2
+ bash: "exec",
3
+ "apply-patch": "apply_patch",
4
+ };
5
+ export const TOOL_GROUPS = {
6
+ // NOTE: Keep canonical (lowercase) tool names here.
7
+ "group:memory": ["memory_search", "memory_get"],
8
+ "group:web": ["web_search", "web_fetch"],
9
+ // Basic workspace/file tools
10
+ "group:fs": ["read", "write", "edit", "apply_patch"],
11
+ // Host/runtime execution tools
12
+ "group:runtime": ["exec", "process"],
13
+ // Session management tools
14
+ "group:sessions": [
15
+ "sessions_list",
16
+ "sessions_history",
17
+ "sessions_send",
18
+ "sessions_spawn",
19
+ "subagents",
20
+ "session_status",
21
+ ],
22
+ // UI helpers
23
+ "group:ui": ["browser", "canvas"],
24
+ // Automation + infra
25
+ "group:automation": ["cron", "gateway"],
26
+ // Messaging surface
27
+ "group:messaging": ["message"],
28
+ // Nodes + device tools
29
+ "group:nodes": ["nodes"],
30
+ // All Pool Bot native tools (excludes provider plugins).
31
+ "group:poolbot": [
32
+ "browser",
33
+ "canvas",
34
+ "nodes",
35
+ "cron",
36
+ "message",
37
+ "gateway",
38
+ "agents_list",
39
+ "sessions_list",
40
+ "sessions_history",
41
+ "sessions_send",
42
+ "sessions_spawn",
43
+ "subagents",
44
+ "session_status",
45
+ "memory_search",
46
+ "memory_get",
47
+ "web_search",
48
+ "web_fetch",
49
+ "image",
50
+ ],
51
+ };
52
+ const TOOL_PROFILES = {
53
+ minimal: {
54
+ allow: ["session_status"],
55
+ },
56
+ coding: {
57
+ allow: ["group:fs", "group:runtime", "group:sessions", "group:memory", "image"],
58
+ },
59
+ messaging: {
60
+ allow: [
61
+ "group:messaging",
62
+ "sessions_list",
63
+ "sessions_history",
64
+ "sessions_send",
65
+ "session_status",
66
+ ],
67
+ },
68
+ full: {},
69
+ };
70
+ export function normalizeToolName(name) {
71
+ const normalized = name.trim().toLowerCase();
72
+ return TOOL_NAME_ALIASES[normalized] ?? normalized;
73
+ }
74
+ export function normalizeToolList(list) {
75
+ if (!list) {
76
+ return [];
77
+ }
78
+ return list.map(normalizeToolName).filter(Boolean);
79
+ }
80
+ export function expandToolGroups(list) {
81
+ const normalized = normalizeToolList(list);
82
+ const expanded = [];
83
+ for (const value of normalized) {
84
+ const group = TOOL_GROUPS[value];
85
+ if (group) {
86
+ expanded.push(...group);
87
+ continue;
88
+ }
89
+ expanded.push(value);
90
+ }
91
+ return Array.from(new Set(expanded));
92
+ }
93
+ export function resolveToolProfilePolicy(profile) {
94
+ if (!profile) {
95
+ return undefined;
96
+ }
97
+ const resolved = TOOL_PROFILES[profile];
98
+ if (!resolved) {
99
+ return undefined;
100
+ }
101
+ if (!resolved.allow && !resolved.deny) {
102
+ return undefined;
103
+ }
104
+ return {
105
+ allow: resolved.allow ? [...resolved.allow] : undefined,
106
+ deny: resolved.deny ? [...resolved.deny] : undefined,
107
+ };
108
+ }