@poolzin/pool-bot 2026.2.25 → 2026.2.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/dist/acp/event-mapper.js +87 -22
  2. package/dist/acp/meta.js +12 -6
  3. package/dist/agents/agent-paths.js +8 -9
  4. package/dist/agents/agent-scope.js +7 -5
  5. package/dist/agents/auth-profiles/oauth.js +148 -64
  6. package/dist/agents/auth-profiles/session-override.js +13 -7
  7. package/dist/agents/bash-tools.exec-host-gateway.js +14 -4
  8. package/dist/agents/bash-tools.exec-runtime.js +2 -25
  9. package/dist/agents/bedrock-discovery.js +3 -1
  10. package/dist/agents/byteplus-models.js +97 -0
  11. package/dist/agents/chutes-oauth.js +1 -0
  12. package/dist/agents/cli-runner/helpers.js +4 -0
  13. package/dist/agents/compaction.js +41 -14
  14. package/dist/agents/doubao-models.js +121 -0
  15. package/dist/agents/failover-error.js +2 -0
  16. package/dist/agents/huggingface-models.js +5 -3
  17. package/dist/agents/live-model-filter.js +5 -0
  18. package/dist/agents/minimax-vlm.js +10 -8
  19. package/dist/agents/model-auth.js +6 -0
  20. package/dist/agents/model-catalog.js +3 -1
  21. package/dist/agents/model-selection.js +7 -1
  22. package/dist/agents/models-config.providers.js +93 -11
  23. package/dist/agents/ollama-stream.js +117 -4
  24. package/dist/agents/opencode-zen-models.js +22 -11
  25. package/dist/agents/pi-embedded-helpers/errors.js +55 -33
  26. package/dist/agents/pi-embedded-helpers/messaging-dedupe.js +10 -5
  27. package/dist/agents/pi-embedded-helpers/thinking.js +10 -5
  28. package/dist/agents/pi-embedded-helpers.js +1 -1
  29. package/dist/agents/pi-embedded-runner/compact.js +29 -7
  30. package/dist/agents/pi-embedded-runner/extensions.js +28 -26
  31. package/dist/agents/pi-embedded-runner/google.js +20 -8
  32. package/dist/agents/pi-embedded-runner/run/attempt.js +95 -36
  33. package/dist/agents/pi-embedded-runner/run.js +71 -12
  34. package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +11 -2
  35. package/dist/agents/pi-embedded-runner/session-manager-cache.js +11 -7
  36. package/dist/agents/pi-embedded-runner/system-prompt.js +2 -0
  37. package/dist/agents/pi-embedded-runner/thinking.js +42 -0
  38. package/dist/agents/pi-embedded-runner/tool-name-allowlist.js +19 -0
  39. package/dist/agents/pi-embedded-runner/utils.js +7 -10
  40. package/dist/agents/pi-embedded-subscribe.handlers.lifecycle.js +45 -56
  41. package/dist/agents/pi-embedded-subscribe.handlers.tools.js +2 -2
  42. package/dist/agents/pi-embedded-subscribe.js +9 -4
  43. package/dist/agents/pi-embedded-subscribe.tools.js +68 -14
  44. package/dist/agents/pi-embedded-utils.js +3 -0
  45. package/dist/agents/pi-extensions/compaction-safeguard-runtime.js +4 -20
  46. package/dist/agents/pi-extensions/compaction-safeguard.js +75 -33
  47. package/dist/agents/pi-settings.js +40 -0
  48. package/dist/agents/pi-tools.policy.js +2 -1
  49. package/dist/agents/provider/config-loader.js +1 -1
  50. package/dist/agents/sandbox/browser.js +170 -33
  51. package/dist/agents/sandbox/config-hash.js +14 -27
  52. package/dist/agents/sandbox/config.js +21 -2
  53. package/dist/agents/sandbox/constants.js +2 -0
  54. package/dist/agents/sandbox/docker.js +16 -2
  55. package/dist/agents/sandbox/novnc-auth.js +62 -0
  56. package/dist/agents/sandbox/sanitize-env-vars.js +1 -1
  57. package/dist/agents/sandbox/shared.js +10 -6
  58. package/dist/agents/sandbox-paths.js +24 -11
  59. package/dist/agents/schema/clean-for-gemini.js +132 -85
  60. package/dist/agents/session-slug.js +10 -5
  61. package/dist/agents/session-tool-result-guard-wrapper.js +1 -0
  62. package/dist/agents/session-tool-result-guard.js +3 -1
  63. package/dist/agents/session-transcript-repair.js +40 -6
  64. package/dist/agents/skills/bundled-dir.js +19 -5
  65. package/dist/agents/skills/env-overrides.js +124 -43
  66. package/dist/agents/skills/frontmatter.js +6 -6
  67. package/dist/agents/skills/plugin-skills.js +14 -7
  68. package/dist/agents/skills/workspace.js +1 -0
  69. package/dist/agents/subagent-announce.js +251 -49
  70. package/dist/agents/subagent-lifecycle-events.js +19 -0
  71. package/dist/agents/subagent-registry-cleanup.js +31 -0
  72. package/dist/agents/subagent-registry-completion.js +68 -0
  73. package/dist/agents/subagent-registry-queries.js +117 -0
  74. package/dist/agents/subagent-registry-state.js +46 -0
  75. package/dist/agents/subagent-registry.js +252 -221
  76. package/dist/agents/subagent-registry.store.js +1 -0
  77. package/dist/agents/subagent-registry.types.js +1 -0
  78. package/dist/agents/subagent-spawn.js +195 -7
  79. package/dist/agents/system-prompt.js +22 -6
  80. package/dist/agents/test-helpers/fast-coding-tools.js +1 -18
  81. package/dist/agents/test-helpers/fast-core-tools.js +1 -17
  82. package/dist/agents/timeout.js +18 -6
  83. package/dist/agents/tool-call-id.js +1 -1
  84. package/dist/agents/tool-display-common.js +162 -29
  85. package/dist/agents/tool-images.js +82 -9
  86. package/dist/agents/tool-policy.js +51 -26
  87. package/dist/agents/tools/browser-tool.js +2 -2
  88. package/dist/agents/tools/canvas-tool.js +27 -1
  89. package/dist/agents/tools/common.js +45 -0
  90. package/dist/agents/tools/discord-actions-guild.js +4 -1
  91. package/dist/agents/tools/gateway-tool.js +3 -1
  92. package/dist/agents/tools/nodes-utils.js +1 -10
  93. package/dist/agents/tools/sessions-send-helpers.js +12 -6
  94. package/dist/agents/tools/sessions-spawn-tool.js +8 -2
  95. package/dist/agents/tools/subagents-tool.js +2 -1
  96. package/dist/agents/tools/whatsapp-actions.js +10 -2
  97. package/dist/agents/tools/whatsapp-target-auth.js +18 -0
  98. package/dist/agents/transcript-policy.js +22 -8
  99. package/dist/agents/venice-models.js +11 -3
  100. package/dist/auto-reply/commands-registry.data.js +51 -0
  101. package/dist/auto-reply/commands-registry.js +4 -3
  102. package/dist/auto-reply/group-activation.js +10 -5
  103. package/dist/auto-reply/inbound-debounce.js +10 -5
  104. package/dist/auto-reply/reply/abort.js +1 -1
  105. package/dist/auto-reply/reply/agent-runner-execution.js +4 -1
  106. package/dist/auto-reply/reply/bash-command.js +41 -39
  107. package/dist/auto-reply/reply/command-gates.js +25 -0
  108. package/dist/auto-reply/reply/commands-allowlist.js +111 -72
  109. package/dist/auto-reply/reply/commands-bash.js +6 -5
  110. package/dist/auto-reply/reply/commands-config.js +30 -28
  111. package/dist/auto-reply/reply/commands-core.js +2 -1
  112. package/dist/auto-reply/reply/commands-info.js +1 -0
  113. package/dist/auto-reply/reply/commands-models.js +65 -14
  114. package/dist/auto-reply/reply/commands-session.js +237 -82
  115. package/dist/auto-reply/reply/commands-setunset.js +45 -0
  116. package/dist/auto-reply/reply/commands-subagents/action-agents.js +44 -0
  117. package/dist/auto-reply/reply/commands-subagents/action-focus.js +64 -0
  118. package/dist/auto-reply/reply/commands-subagents/action-help.js +4 -0
  119. package/dist/auto-reply/reply/commands-subagents/action-info.js +45 -0
  120. package/dist/auto-reply/reply/commands-subagents/action-kill.js +60 -0
  121. package/dist/auto-reply/reply/commands-subagents/action-list.js +44 -0
  122. package/dist/auto-reply/reply/commands-subagents/action-log.js +29 -0
  123. package/dist/auto-reply/reply/commands-subagents/action-send.js +119 -0
  124. package/dist/auto-reply/reply/commands-subagents/action-spawn.js +52 -0
  125. package/dist/auto-reply/reply/commands-subagents/action-unfocus.js +30 -0
  126. package/dist/auto-reply/reply/commands-subagents/shared.js +303 -0
  127. package/dist/auto-reply/reply/commands-subagents.js +51 -587
  128. package/dist/auto-reply/reply/commands-tts.js +10 -5
  129. package/dist/auto-reply/reply/config-value.js +10 -5
  130. package/dist/auto-reply/reply/directive-handling.model-picker.js +12 -6
  131. package/dist/auto-reply/reply/directive-handling.persist.js +9 -21
  132. package/dist/auto-reply/reply/directive-handling.shared.js +24 -4
  133. package/dist/auto-reply/reply/followup-runner.js +1 -0
  134. package/dist/auto-reply/reply/get-reply-directives-utils.js +23 -14
  135. package/dist/auto-reply/reply/get-reply-directives.js +17 -28
  136. package/dist/auto-reply/reply/get-reply-inline-actions.js +1 -0
  137. package/dist/auto-reply/reply/get-reply.js +71 -12
  138. package/dist/auto-reply/reply/model-selection.js +80 -39
  139. package/dist/auto-reply/reply/queue/enqueue.js +10 -5
  140. package/dist/auto-reply/reply/queue/state.js +13 -12
  141. package/dist/auto-reply/reply/reply-payloads.js +67 -36
  142. package/dist/auto-reply/reply/reply-reference.js +9 -8
  143. package/dist/auto-reply/reply/route-reply.js +15 -8
  144. package/dist/auto-reply/reply/session-reset-prompt.js +1 -1
  145. package/dist/auto-reply/reply/session.js +22 -6
  146. package/dist/auto-reply/reply/strip-inbound-meta.js +147 -0
  147. package/dist/auto-reply/reply/subagents-utils.js +56 -30
  148. package/dist/auto-reply/reply/typing.js +46 -21
  149. package/dist/auto-reply/send-policy.js +14 -7
  150. package/dist/auto-reply/status.js +140 -16
  151. package/dist/auto-reply/templating.js +10 -5
  152. package/dist/auto-reply/thinking.js +7 -16
  153. package/dist/auto-reply/tokens.js +21 -5
  154. package/dist/browser/bridge-server.js +36 -20
  155. package/dist/browser/cdp.helpers.js +7 -14
  156. package/dist/browser/cdp.js +35 -15
  157. package/dist/browser/chrome.profile-decoration.js +7 -4
  158. package/dist/browser/config.js +4 -0
  159. package/dist/browser/extension-relay-auth.js +55 -0
  160. package/dist/browser/extension-relay.js +74 -29
  161. package/dist/browser/navigation-guard.js +9 -1
  162. package/dist/browser/paths.js +77 -0
  163. package/dist/browser/profiles.js +13 -8
  164. package/dist/browser/pw-ai-module.js +10 -5
  165. package/dist/browser/pw-session.js +76 -39
  166. package/dist/browser/pw-tools-core.interactions.js +14 -7
  167. package/dist/browser/pw-tools-core.state.js +12 -6
  168. package/dist/browser/routes/agent.act.js +2 -2
  169. package/dist/browser/server-context.js +7 -0
  170. package/dist/build-info.json +3 -3
  171. package/dist/channels/allow-from.js +2 -1
  172. package/dist/channels/allowlists/resolve-utils.js +43 -19
  173. package/dist/channels/channel-config.js +14 -7
  174. package/dist/channels/draft-stream-loop.js +7 -0
  175. package/dist/channels/model-overrides.js +82 -0
  176. package/dist/channels/plugins/normalize/imessage.js +14 -7
  177. package/dist/channels/plugins/normalize/slack.js +10 -5
  178. package/dist/channels/plugins/normalize/telegram.js +14 -7
  179. package/dist/channels/plugins/outbound/discord.js +80 -8
  180. package/dist/channels/plugins/outbound/signal.js +11 -11
  181. package/dist/channels/plugins/setup-helpers.js +10 -5
  182. package/dist/channels/sender-label.js +14 -7
  183. package/dist/channels/session.js +4 -2
  184. package/dist/channels/status-reactions.js +297 -0
  185. package/dist/cli/banner.js +1 -1
  186. package/dist/cli/browser-cli-actions-input/register.files-downloads.js +65 -56
  187. package/dist/cli/cli-name.js +11 -11
  188. package/dist/cli/cli-utils.js +13 -3
  189. package/dist/cli/command-format.js +1 -1
  190. package/dist/cli/config-cli.js +1 -1
  191. package/dist/cli/daemon-cli/lifecycle-core.js +31 -19
  192. package/dist/cli/daemon-cli/lifecycle.js +64 -2
  193. package/dist/cli/daemon-cli/restart-health.js +126 -0
  194. package/dist/cli/daemon-cli/status.gather.js +9 -13
  195. package/dist/cli/daemon-cli/status.print.js +2 -10
  196. package/dist/cli/deps.js +27 -22
  197. package/dist/cli/gateway-cli/run-loop.js +23 -5
  198. package/dist/cli/node-cli/register.js +14 -5
  199. package/dist/cli/nodes-media-utils.js +7 -2
  200. package/dist/cli/outbound-send-deps.js +2 -9
  201. package/dist/cli/outbound-send-mapping.js +11 -0
  202. package/dist/cli/pairing-cli.js +40 -14
  203. package/dist/cli/plugins-cli.js +34 -41
  204. package/dist/cli/ports.js +11 -10
  205. package/dist/cli/program/command-registry.js +2 -11
  206. package/dist/cli/program/command-tree.js +16 -0
  207. package/dist/cli/program/preaction.js +13 -9
  208. package/dist/cli/program/register.configure.js +3 -18
  209. package/dist/cli/program/register.maintenance.js +2 -2
  210. package/dist/cli/program/register.onboard.js +2 -0
  211. package/dist/cli/program/register.status-health-sessions.js +16 -17
  212. package/dist/cli/program/register.subclis.js +93 -52
  213. package/dist/cli/route.js +11 -7
  214. package/dist/cli/system-cli.js +36 -46
  215. package/dist/cli/update-cli/shared.js +22 -9
  216. package/dist/cli/update-cli/update-command.js +89 -14
  217. package/dist/cli/update-cli/wizard.js +6 -12
  218. package/dist/commands/agent/run-context.js +18 -5
  219. package/dist/commands/agent/session-store.js +17 -4
  220. package/dist/commands/agent.js +22 -2
  221. package/dist/commands/agents.bindings.js +14 -7
  222. package/dist/commands/agents.commands.add.js +13 -9
  223. package/dist/commands/agents.commands.identity.js +12 -6
  224. package/dist/commands/agents.commands.list.js +11 -6
  225. package/dist/commands/agents.config.js +8 -10
  226. package/dist/commands/agents.providers.js +12 -6
  227. package/dist/commands/auth-choice-options.js +103 -75
  228. package/dist/commands/auth-choice.apply.byteplus.js +55 -0
  229. package/dist/commands/auth-choice.apply.js +4 -0
  230. package/dist/commands/auth-choice.apply.minimax.js +61 -13
  231. package/dist/commands/auth-choice.apply.openai.js +3 -1
  232. package/dist/commands/auth-choice.apply.volcengine.js +55 -0
  233. package/dist/commands/auth-choice.preferred-provider.js +2 -0
  234. package/dist/commands/channels/remove.js +13 -6
  235. package/dist/commands/channels/shared.js +4 -14
  236. package/dist/commands/configure.commands.js +14 -0
  237. package/dist/commands/configure.gateway.js +2 -4
  238. package/dist/commands/configure.js +1 -1
  239. package/dist/commands/configure.shared.js +11 -0
  240. package/dist/commands/daemon-install-helpers.js +2 -2
  241. package/dist/commands/dashboard.js +12 -10
  242. package/dist/commands/docs.js +14 -8
  243. package/dist/commands/doctor-config-flow.js +11 -9
  244. package/dist/commands/doctor-legacy-config.js +281 -0
  245. package/dist/commands/doctor-state-integrity.js +99 -23
  246. package/dist/commands/doctor-update.js +12 -9
  247. package/dist/commands/models/list.list-command.js +7 -5
  248. package/dist/commands/models/set-image.js +2 -21
  249. package/dist/commands/node-daemon-install-helpers.js +10 -8
  250. package/dist/commands/onboard-auth.config-minimax.js +54 -80
  251. package/dist/commands/onboard-auth.config-opencode.js +2 -18
  252. package/dist/commands/onboard-auth.credentials.js +90 -13
  253. package/dist/commands/onboard-auth.js +1 -1
  254. package/dist/commands/onboard-auth.models.js +6 -5
  255. package/dist/commands/onboard-hooks.js +1 -1
  256. package/dist/commands/onboard-non-interactive/api-keys.js +14 -7
  257. package/dist/commands/onboard-non-interactive/local/auth-choice.js +64 -49
  258. package/dist/commands/onboard-provider-auth-flags.js +14 -0
  259. package/dist/commands/onboard-remote.js +14 -7
  260. package/dist/commands/onboard.js +11 -13
  261. package/dist/commands/sandbox-display.js +6 -5
  262. package/dist/commands/status-all/diagnosis.js +14 -10
  263. package/dist/commands/status-all/format.js +1 -0
  264. package/dist/commands/status.gateway-probe.js +1 -16
  265. package/dist/commands/systemd-linger.js +12 -6
  266. package/dist/config/agent-limits.js +2 -0
  267. package/dist/config/commands.js +30 -16
  268. package/dist/config/config-paths.js +9 -11
  269. package/dist/config/defaults.js +22 -2
  270. package/dist/config/discord-preview-streaming.js +104 -0
  271. package/dist/config/env-vars.js +37 -8
  272. package/dist/config/includes.js +4 -0
  273. package/dist/config/io.js +97 -12
  274. package/dist/config/legacy.migrations.part-1.js +189 -78
  275. package/dist/config/legacy.shared.js +3 -1
  276. package/dist/config/merge-patch.js +4 -0
  277. package/dist/config/prototype-keys.js +4 -0
  278. package/dist/config/schema.help.js +44 -7
  279. package/dist/config/schema.labels.js +38 -6
  280. package/dist/config/sessions/delivery-info.js +10 -3
  281. package/dist/config/sessions/main-session.js +10 -5
  282. package/dist/config/sessions/session-file.js +33 -0
  283. package/dist/config/sessions/session-key.js +10 -5
  284. package/dist/config/sessions/store.js +1 -1
  285. package/dist/config/sessions.js +1 -0
  286. package/dist/config/zod-schema.agent-runtime.js +11 -0
  287. package/dist/config/zod-schema.js +148 -13
  288. package/dist/config/zod-schema.providers-core.js +78 -4
  289. package/dist/config/zod-schema.providers.js +6 -1
  290. package/dist/config/zod-schema.session.js +41 -2
  291. package/dist/cron/run-log.js +3 -0
  292. package/dist/cron/schedule.js +21 -10
  293. package/dist/cron/service/ops.js +35 -21
  294. package/dist/cron/service/timer.js +116 -16
  295. package/dist/cron/stagger.js +3 -1
  296. package/dist/discord/api.js +12 -6
  297. package/dist/discord/draft-chunking.js +22 -0
  298. package/dist/discord/draft-stream.js +124 -0
  299. package/dist/discord/monitor/agent-components.js +1 -1
  300. package/dist/discord/monitor/commands.js +5 -0
  301. package/dist/discord/monitor/gateway-plugin.js +2 -1
  302. package/dist/discord/monitor/listeners.js +37 -27
  303. package/dist/discord/monitor/message-handler.js +4 -1
  304. package/dist/discord/monitor/message-handler.preflight.js +65 -8
  305. package/dist/discord/monitor/message-handler.process.js +246 -217
  306. package/dist/discord/monitor/message-utils.js +143 -6
  307. package/dist/discord/monitor/model-picker-preferences.js +143 -0
  308. package/dist/discord/monitor/model-picker.js +651 -0
  309. package/dist/discord/monitor/native-command.js +573 -16
  310. package/dist/discord/monitor/provider.allowlist.js +223 -0
  311. package/dist/discord/monitor/provider.js +275 -347
  312. package/dist/discord/monitor/provider.lifecycle.js +100 -0
  313. package/dist/discord/monitor/reply-delivery.js +123 -16
  314. package/dist/discord/monitor/thread-bindings.discord-api.js +215 -0
  315. package/dist/discord/monitor/thread-bindings.js +4 -0
  316. package/dist/discord/monitor/thread-bindings.lifecycle.js +177 -0
  317. package/dist/discord/monitor/thread-bindings.manager.js +423 -0
  318. package/dist/discord/monitor/thread-bindings.messages.js +55 -0
  319. package/dist/discord/monitor/thread-bindings.state.js +358 -0
  320. package/dist/discord/monitor/thread-bindings.types.js +6 -0
  321. package/dist/discord/resolve-users.js +33 -21
  322. package/dist/discord/send.channels.js +15 -0
  323. package/dist/discord/send.js +3 -2
  324. package/dist/discord/send.outbound.js +82 -26
  325. package/dist/discord/send.permissions.js +83 -30
  326. package/dist/discord/send.reactions.js +8 -4
  327. package/dist/discord/token.js +10 -5
  328. package/dist/discord/voice/command.js +263 -0
  329. package/dist/discord/voice/manager.js +531 -0
  330. package/dist/gateway/auth.js +34 -10
  331. package/dist/gateway/call.js +4 -16
  332. package/dist/gateway/client.js +28 -4
  333. package/dist/gateway/config-reload.js +3 -4
  334. package/dist/gateway/control-ui.js +219 -96
  335. package/dist/gateway/hooks-mapping.js +88 -38
  336. package/dist/gateway/http-auth-helpers.js +3 -2
  337. package/dist/gateway/http-endpoint-helpers.js +1 -0
  338. package/dist/gateway/net.js +54 -12
  339. package/dist/gateway/node-invoke-system-run-approval.js +14 -35
  340. package/dist/gateway/node-registry.js +10 -5
  341. package/dist/gateway/openai-http.js +1 -0
  342. package/dist/gateway/openresponses-http.js +1 -0
  343. package/dist/gateway/origin-check.js +1 -18
  344. package/dist/gateway/protocol/index.js +4 -3
  345. package/dist/gateway/protocol/schema/cron.js +1 -0
  346. package/dist/gateway/protocol/schema/devices.js +1 -0
  347. package/dist/gateway/protocol/schema/protocol-schemas.js +2 -1
  348. package/dist/gateway/protocol/schema/sessions.js +6 -0
  349. package/dist/gateway/role-policy.js +17 -0
  350. package/dist/gateway/server/ws-connection/connect-policy.js +37 -0
  351. package/dist/gateway/server/ws-connection/message-handler.js +175 -148
  352. package/dist/gateway/server-chat.js +83 -25
  353. package/dist/gateway/server-constants.js +10 -9
  354. package/dist/gateway/server-cron.js +1 -0
  355. package/dist/gateway/server-http.js +16 -7
  356. package/dist/gateway/server-maintenance.js +20 -5
  357. package/dist/gateway/server-methods/chat.js +10 -6
  358. package/dist/gateway/server-methods/config.js +12 -14
  359. package/dist/gateway/server-methods/devices.js +17 -3
  360. package/dist/gateway/server-methods/models.js +11 -1
  361. package/dist/gateway/server-methods/sessions.js +64 -8
  362. package/dist/gateway/server-methods/usage.js +162 -75
  363. package/dist/gateway/server-node-events.js +29 -0
  364. package/dist/gateway/server-runtime-config.js +34 -13
  365. package/dist/gateway/server-startup-memory.js +17 -11
  366. package/dist/gateway/session-utils.fs.js +32 -34
  367. package/dist/gateway/sessions-resolve.js +17 -5
  368. package/dist/gateway/test-helpers.openai-mock.js +14 -7
  369. package/dist/gateway/tools-invoke-http.js +21 -10
  370. package/dist/hooks/bundled/bootstrap-extra-files/handler.js +3 -1
  371. package/dist/hooks/bundled/command-logger/handler.js +7 -2
  372. package/dist/hooks/bundled/session-memory/handler.js +6 -5
  373. package/dist/hooks/frontmatter.js +6 -6
  374. package/dist/hooks/gmail-watcher.js +11 -6
  375. package/dist/hooks/internal-hooks.js +11 -1
  376. package/dist/hooks/llm-slug-generator.js +4 -1
  377. package/dist/hooks/workspace.js +47 -17
  378. package/dist/imessage/accounts.js +9 -20
  379. package/dist/imessage/monitor/inbound-processing.js +2 -1
  380. package/dist/infra/archive.js +174 -73
  381. package/dist/infra/control-ui-assets.js +14 -6
  382. package/dist/infra/device-pairing.js +108 -29
  383. package/dist/infra/env.js +10 -5
  384. package/dist/infra/exec-approvals-allowlist.js +122 -0
  385. package/dist/infra/exec-approvals-analysis.js +34 -3
  386. package/dist/infra/exec-approvals.js +5 -17
  387. package/dist/infra/exec-safe-bin-policy.js +53 -45
  388. package/dist/infra/fs-safe.js +71 -39
  389. package/dist/infra/gateway-lock.js +6 -2
  390. package/dist/infra/heartbeat-wake.js +6 -12
  391. package/dist/infra/host-env-security-policy.json +19 -0
  392. package/dist/infra/host-env-security.js +66 -0
  393. package/dist/infra/net/ssrf.js +131 -38
  394. package/dist/infra/outbound/bound-delivery-router.js +88 -0
  395. package/dist/infra/outbound/channel-selection.js +12 -6
  396. package/dist/infra/outbound/envelope.js +1 -1
  397. package/dist/infra/outbound/format.js +12 -6
  398. package/dist/infra/outbound/payloads.js +14 -7
  399. package/dist/infra/outbound/session-binding-service.js +123 -0
  400. package/dist/infra/path-guards.js +25 -0
  401. package/dist/infra/provider-usage.fetch.codex.js +7 -15
  402. package/dist/infra/provider-usage.fetch.gemini.js +14 -11
  403. package/dist/infra/provider-usage.fetch.shared.js +30 -1
  404. package/dist/infra/provider-usage.fetch.zai.js +10 -9
  405. package/dist/infra/retry-policy.js +4 -2
  406. package/dist/infra/retry.js +9 -5
  407. package/dist/infra/session-cost-usage.js +107 -59
  408. package/dist/infra/session-maintenance-warning.js +3 -1
  409. package/dist/infra/shell-env.js +98 -34
  410. package/dist/infra/ssh-config.js +12 -6
  411. package/dist/infra/system-run-command.js +49 -4
  412. package/dist/infra/update-channels.js +10 -5
  413. package/dist/line/accounts.js +5 -7
  414. package/dist/line/bot-access.js +8 -20
  415. package/dist/line/bot-handlers.js +3 -1
  416. package/dist/link-understanding/detect.js +15 -7
  417. package/dist/media/constants.js +15 -6
  418. package/dist/media/image-ops.js +7 -0
  419. package/dist/media/local-roots.js +3 -2
  420. package/dist/media-understanding/apply.js +4 -1
  421. package/dist/media-understanding/concurrency.js +8 -20
  422. package/dist/memory/backend-config.js +45 -6
  423. package/dist/memory/embeddings.js +10 -4
  424. package/dist/memory/fs-utils.js +23 -0
  425. package/dist/memory/manager-search.js +12 -6
  426. package/dist/memory/manager-sync-ops.js +12 -2
  427. package/dist/memory/qmd-manager.js +466 -53
  428. package/dist/memory/query-expansion.js +167 -3
  429. package/dist/memory/status-format.js +10 -5
  430. package/dist/memory/sync-memory-files.js +1 -1
  431. package/dist/node-host/invoke-system-run.js +281 -0
  432. package/dist/node-host/invoke.js +55 -337
  433. package/dist/pairing/pairing-store.js +22 -0
  434. package/dist/plugin-sdk/allow-from.js +1 -1
  435. package/dist/plugin-sdk/command-auth.js +3 -1
  436. package/dist/plugin-sdk/index.js +6 -3
  437. package/dist/plugin-sdk/webhook-targets.js +32 -0
  438. package/dist/plugins/bundled-dir.js +9 -6
  439. package/dist/plugins/hooks.js +50 -0
  440. package/dist/plugins/install.js +28 -16
  441. package/dist/plugins/runtime.js +3 -17
  442. package/dist/plugins/update.js +78 -12
  443. package/dist/process/spawn-utils.js +14 -7
  444. package/dist/providers/github-copilot-token.js +11 -6
  445. package/dist/providers/qwen-portal-oauth.js +14 -6
  446. package/dist/routing/account-id.js +30 -0
  447. package/dist/routing/resolve-route.js +3 -7
  448. package/dist/routing/session-key.js +2 -16
  449. package/dist/security/audit-channel.js +93 -2
  450. package/dist/security/audit-extra.async.js +159 -5
  451. package/dist/security/audit-extra.js +1 -1
  452. package/dist/security/audit-extra.sync.js +85 -6
  453. package/dist/security/audit.js +40 -4
  454. package/dist/security/dm-policy-shared.js +44 -0
  455. package/dist/security/external-content.js +26 -6
  456. package/dist/shared/entry-status.js +6 -0
  457. package/dist/shared/frontmatter.js +5 -5
  458. package/dist/shared/node-match.js +11 -4
  459. package/dist/shared/operator-scope-compat.js +8 -3
  460. package/dist/signal/accounts.js +7 -20
  461. package/dist/signal/monitor/event-handler.js +3 -1
  462. package/dist/slack/accounts.js +6 -19
  463. package/dist/slack/actions.js +11 -3
  464. package/dist/slack/monitor/auth.js +1 -1
  465. package/dist/slack/monitor/message-handler/dispatch.js +50 -29
  466. package/dist/slack/monitor/replies.js +15 -7
  467. package/dist/slack/monitor/slash.js +22 -13
  468. package/dist/slack/resolve-channels.js +10 -5
  469. package/dist/slack/send.js +102 -12
  470. package/dist/slack/stream-mode.js +10 -0
  471. package/dist/slack/streaming.js +4 -2
  472. package/dist/telegram/accounts.js +19 -14
  473. package/dist/telegram/bot/helpers.js +3 -5
  474. package/dist/telegram/bot-access.js +35 -36
  475. package/dist/telegram/bot-handlers.js +120 -148
  476. package/dist/telegram/bot-message-context.js +68 -9
  477. package/dist/telegram/bot-message-dispatch.js +155 -90
  478. package/dist/telegram/bot-native-commands.js +16 -0
  479. package/dist/telegram/draft-stream.js +14 -1
  480. package/dist/telegram/inline-buttons.js +5 -15
  481. package/dist/telegram/monitor.js +11 -7
  482. package/dist/telegram/network-config.js +19 -7
  483. package/dist/telegram/send.js +3 -2
  484. package/dist/telegram/sent-message-cache.js +5 -6
  485. package/dist/telegram/status-reaction-variants.js +208 -0
  486. package/dist/telegram/sticker-cache.js +11 -9
  487. package/dist/terminal/theme.js +12 -12
  488. package/dist/tts/tts.js +80 -567
  489. package/dist/tui/components/chat-log.js +41 -8
  490. package/dist/tui/theme/theme.js +10 -12
  491. package/dist/tui/tui-local-shell.js +16 -6
  492. package/dist/tui/tui.js +58 -6
  493. package/dist/utils/account-id.js +2 -4
  494. package/dist/utils/boolean.js +10 -5
  495. package/dist/utils/directive-tags.js +11 -0
  496. package/dist/utils/queue-helpers.js +67 -12
  497. package/dist/web/auto-reply/deliver-reply.js +8 -4
  498. package/dist/web/auto-reply/mentions.js +10 -5
  499. package/dist/web/auto-reply/monitor/group-members.js +14 -7
  500. package/dist/web/auto-reply/monitor/process-message.js +45 -24
  501. package/dist/web/inbound/access-control.js +5 -2
  502. package/dist/web/login-qr.js +12 -6
  503. package/dist/web/media.js +123 -16
  504. package/extensions/bluebubbles/src/monitor-processing.ts +580 -139
  505. package/extensions/bluebubbles/src/monitor.ts +208 -1950
  506. package/package.json +1 -1
@@ -2,6 +2,8 @@ import { getChannelPlugin, normalizeChannelId } from "../channels/plugins/index.
2
2
  import { normalizeTargetForProvider } from "../infra/outbound/target-normalization.js";
3
3
  import { MEDIA_TOKEN_RE } from "../media/parse.js";
4
4
  import { truncateUtf16Safe } from "../utils.js";
5
+ import { collectTextContentBlocks } from "./content-blocks.js";
6
+ import { normalizeToolName } from "./tool-policy.js";
5
7
  const TOOL_RESULT_MAX_CHARS = 8000;
6
8
  const TOOL_ERROR_MAX_CHARS = 400;
7
9
  function truncateToolText(text) {
@@ -23,6 +25,20 @@ function normalizeToolErrorText(text) {
23
25
  ? `${truncateUtf16Safe(firstLine, TOOL_ERROR_MAX_CHARS)}…`
24
26
  : firstLine;
25
27
  }
28
+ function isErrorLikeStatus(status) {
29
+ const normalized = status.trim().toLowerCase();
30
+ if (!normalized) {
31
+ return false;
32
+ }
33
+ if (normalized === "0" ||
34
+ normalized === "ok" ||
35
+ normalized === "success" ||
36
+ normalized === "completed" ||
37
+ normalized === "running") {
38
+ return false;
39
+ }
40
+ return /error|fail|timeout|timed[_\s-]?out|denied|cancel|invalid|forbidden/.test(normalized);
41
+ }
26
42
  function readErrorCandidate(value) {
27
43
  if (typeof value === "string") {
28
44
  return normalizeToolErrorText(value);
@@ -51,7 +67,10 @@ function extractErrorField(value) {
51
67
  return direct;
52
68
  }
53
69
  const status = typeof record.status === "string" ? record.status.trim() : "";
54
- return status ? normalizeToolErrorText(status) : undefined;
70
+ if (!status || !isErrorLikeStatus(status)) {
71
+ return undefined;
72
+ }
73
+ return normalizeToolErrorText(status);
55
74
  }
56
75
  export function sanitizeToolResult(result) {
57
76
  if (!result || typeof result !== "object") {
@@ -87,20 +106,9 @@ export function extractToolResultText(result) {
87
106
  return undefined;
88
107
  }
89
108
  const record = result;
90
- const content = Array.isArray(record.content) ? record.content : null;
91
- if (!content) {
92
- return undefined;
93
- }
94
- const texts = content
109
+ const texts = collectTextContentBlocks(record.content)
95
110
  .map((item) => {
96
- if (!item || typeof item !== "object") {
97
- return undefined;
98
- }
99
- const entry = item;
100
- if (entry.type !== "text" || typeof entry.text !== "string") {
101
- return undefined;
102
- }
103
- const trimmed = entry.text.trim();
111
+ const trimmed = item.trim();
104
112
  return trimmed ? trimmed : undefined;
105
113
  })
106
114
  .filter((value) => Boolean(value));
@@ -109,6 +117,52 @@ export function extractToolResultText(result) {
109
117
  }
110
118
  return texts.join("\n");
111
119
  }
120
+ // Core tool names that are allowed to emit local MEDIA: paths.
121
+ // Plugin/MCP tools are intentionally excluded to prevent untrusted file reads.
122
+ const TRUSTED_TOOL_RESULT_MEDIA = new Set([
123
+ "agents_list",
124
+ "apply_patch",
125
+ "browser",
126
+ "canvas",
127
+ "cron",
128
+ "edit",
129
+ "exec",
130
+ "gateway",
131
+ "image",
132
+ "memory_get",
133
+ "memory_search",
134
+ "message",
135
+ "nodes",
136
+ "process",
137
+ "read",
138
+ "session_status",
139
+ "sessions_history",
140
+ "sessions_list",
141
+ "sessions_send",
142
+ "sessions_spawn",
143
+ "subagents",
144
+ "tts",
145
+ "web_fetch",
146
+ "web_search",
147
+ "write",
148
+ ]);
149
+ const HTTP_URL_RE = /^https?:\/\//i;
150
+ export function isToolResultMediaTrusted(toolName) {
151
+ if (!toolName) {
152
+ return false;
153
+ }
154
+ const normalized = normalizeToolName(toolName);
155
+ return TRUSTED_TOOL_RESULT_MEDIA.has(normalized);
156
+ }
157
+ export function filterToolResultMediaUrls(toolName, mediaUrls) {
158
+ if (mediaUrls.length === 0) {
159
+ return mediaUrls;
160
+ }
161
+ if (isToolResultMediaTrusted(toolName)) {
162
+ return mediaUrls;
163
+ }
164
+ return mediaUrls.filter((url) => HTTP_URL_RE.test(url.trim()));
165
+ }
112
166
  /**
113
167
  * Extract media file paths from a tool result.
114
168
  *
@@ -1,6 +1,9 @@
1
1
  import { stripReasoningTagsFromText } from "../shared/text/reasoning-tags.js";
2
2
  import { sanitizeUserFacingText } from "./pi-embedded-helpers.js";
3
3
  import { formatToolDetail, resolveToolDisplay } from "./tool-display.js";
4
+ export function isAssistantMessage(msg) {
5
+ return msg?.role === "assistant";
6
+ }
4
7
  /**
5
8
  * Strip malformed Minimax tool invocations that leak into text content.
6
9
  * Minimax sometimes embeds tool calls as XML in text blocks instead of
@@ -1,20 +1,4 @@
1
- // Session-scoped runtime registry keyed by object identity.
2
- // Follows the same WeakMap pattern as context-pruning/runtime.ts.
3
- const REGISTRY = new WeakMap();
4
- export function setCompactionSafeguardRuntime(sessionManager, value) {
5
- if (!sessionManager || typeof sessionManager !== "object") {
6
- return;
7
- }
8
- const key = sessionManager;
9
- if (value === null) {
10
- REGISTRY.delete(key);
11
- return;
12
- }
13
- REGISTRY.set(key, value);
14
- }
15
- export function getCompactionSafeguardRuntime(sessionManager) {
16
- if (!sessionManager || typeof sessionManager !== "object") {
17
- return null;
18
- }
19
- return REGISTRY.get(sessionManager) ?? null;
20
- }
1
+ import { createSessionManagerRuntimeRegistry } from "./session-manager-runtime-registry.js";
2
+ const registry = createSessionManagerRuntimeRegistry();
3
+ export const setCompactionSafeguardRuntime = registry.set;
4
+ export const getCompactionSafeguardRuntime = registry.get;
@@ -1,5 +1,11 @@
1
- import { BASE_CHUNK_RATIO, MIN_CHUNK_RATIO, SAFETY_MARGIN, computeAdaptiveChunkRatio, estimateMessagesTokens, isOversizedForSummary, pruneHistoryForContextShare, resolveContextWindowTokens, summarizeInStages, } from "../compaction.js";
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { extractSections } from "../../auto-reply/reply/post-compaction-context.js";
4
+ import { createSubsystemLogger } from "../../logging/subsystem.js";
5
+ import { BASE_CHUNK_RATIO, MIN_CHUNK_RATIO, SAFETY_MARGIN, SUMMARIZATION_OVERHEAD_TOKENS, computeAdaptiveChunkRatio, estimateMessagesTokens, isOversizedForSummary, pruneHistoryForContextShare, resolveContextWindowTokens, summarizeInStages, } from "../compaction.js";
6
+ import { collectTextContentBlocks } from "../content-blocks.js";
2
7
  import { getCompactionSafeguardRuntime } from "./compaction-safeguard-runtime.js";
8
+ const log = createSubsystemLogger("compaction-safeguard");
3
9
  const FALLBACK_SUMMARY = "Summary unavailable due to context limits. Older messages were truncated.";
4
10
  const TURN_PREFIX_INSTRUCTIONS = "This summary covers the prefix of a split turn. Focus on the original request," +
5
11
  " early progress, and any details needed to understand the retained suffix.";
@@ -9,54 +15,51 @@ function normalizeFailureText(text) {
9
15
  return text.replace(/\s+/g, " ").trim();
10
16
  }
11
17
  function truncateFailureText(text, maxChars) {
12
- if (text.length <= maxChars)
18
+ if (text.length <= maxChars) {
13
19
  return text;
20
+ }
14
21
  return `${text.slice(0, Math.max(0, maxChars - 3))}...`;
15
22
  }
16
23
  function formatToolFailureMeta(details) {
17
- if (!details || typeof details !== "object")
24
+ if (!details || typeof details !== "object") {
18
25
  return undefined;
26
+ }
19
27
  const record = details;
20
28
  const status = typeof record.status === "string" ? record.status : undefined;
21
29
  const exitCode = typeof record.exitCode === "number" && Number.isFinite(record.exitCode)
22
30
  ? record.exitCode
23
31
  : undefined;
24
32
  const parts = [];
25
- if (status)
33
+ if (status) {
26
34
  parts.push(`status=${status}`);
27
- if (exitCode !== undefined)
35
+ }
36
+ if (exitCode !== undefined) {
28
37
  parts.push(`exitCode=${exitCode}`);
38
+ }
29
39
  return parts.length > 0 ? parts.join(" ") : undefined;
30
40
  }
31
41
  function extractToolResultText(content) {
32
- if (!Array.isArray(content))
33
- return "";
34
- const parts = [];
35
- for (const block of content) {
36
- if (!block || typeof block !== "object")
37
- continue;
38
- const rec = block;
39
- if (rec.type === "text" && typeof rec.text === "string") {
40
- parts.push(rec.text);
41
- }
42
- }
43
- return parts.join("\n");
42
+ return collectTextContentBlocks(content).join("\n");
44
43
  }
45
44
  function collectToolFailures(messages) {
46
45
  const failures = [];
47
46
  const seen = new Set();
48
47
  for (const message of messages) {
49
- if (!message || typeof message !== "object")
48
+ if (!message || typeof message !== "object") {
50
49
  continue;
50
+ }
51
51
  const role = message.role;
52
- if (role !== "toolResult")
52
+ if (role !== "toolResult") {
53
53
  continue;
54
+ }
54
55
  const toolResult = message;
55
- if (toolResult.isError !== true)
56
+ if (toolResult.isError !== true) {
56
57
  continue;
58
+ }
57
59
  const toolCallId = typeof toolResult.toolCallId === "string" ? toolResult.toolCallId : "";
58
- if (!toolCallId || seen.has(toolCallId))
60
+ if (!toolCallId || seen.has(toolCallId)) {
59
61
  continue;
62
+ }
60
63
  seen.add(toolCallId);
61
64
  const toolName = typeof toolResult.toolName === "string" && toolResult.toolName.trim()
62
65
  ? toolResult.toolName
@@ -70,8 +73,9 @@ function collectToolFailures(messages) {
70
73
  return failures;
71
74
  }
72
75
  function formatToolFailuresSection(failures) {
73
- if (failures.length === 0)
76
+ if (failures.length === 0) {
74
77
  return "";
78
+ }
75
79
  const lines = failures.slice(0, MAX_TOOL_FAILURES).map((failure) => {
76
80
  const meta = failure.meta ? ` (${failure.meta})` : "";
77
81
  return `- ${failure.toolName}${meta}: ${failure.summary}`;
@@ -83,8 +87,8 @@ function formatToolFailuresSection(failures) {
83
87
  }
84
88
  function computeFileLists(fileOps) {
85
89
  const modified = new Set([...fileOps.edited, ...fileOps.written]);
86
- const readFiles = [...fileOps.read].filter((f) => !modified.has(f)).sort();
87
- const modifiedFiles = [...modified].sort();
90
+ const readFiles = [...fileOps.read].filter((f) => !modified.has(f)).toSorted();
91
+ const modifiedFiles = [...modified].toSorted();
88
92
  return { readFiles, modifiedFiles };
89
93
  }
90
94
  function formatFileOperations(readFiles, modifiedFiles) {
@@ -95,10 +99,39 @@ function formatFileOperations(readFiles, modifiedFiles) {
95
99
  if (modifiedFiles.length > 0) {
96
100
  sections.push(`<modified-files>\n${modifiedFiles.join("\n")}\n</modified-files>`);
97
101
  }
98
- if (sections.length === 0)
102
+ if (sections.length === 0) {
99
103
  return "";
104
+ }
100
105
  return `\n\n${sections.join("\n\n")}`;
101
106
  }
107
+ /**
108
+ * Read and format critical workspace context for compaction summary.
109
+ * Extracts "Session Startup" and "Red Lines" from AGENTS.md.
110
+ * Limited to 2000 chars to avoid bloating the summary.
111
+ */
112
+ async function readWorkspaceContextForSummary() {
113
+ const MAX_SUMMARY_CONTEXT_CHARS = 2000;
114
+ const workspaceDir = process.cwd();
115
+ const agentsPath = path.join(workspaceDir, "AGENTS.md");
116
+ try {
117
+ if (!fs.existsSync(agentsPath)) {
118
+ return "";
119
+ }
120
+ const content = await fs.promises.readFile(agentsPath, "utf-8");
121
+ const sections = extractSections(content, ["Session Startup", "Red Lines"]);
122
+ if (sections.length === 0) {
123
+ return "";
124
+ }
125
+ const combined = sections.join("\n\n");
126
+ const safeContent = combined.length > MAX_SUMMARY_CONTEXT_CHARS
127
+ ? combined.slice(0, MAX_SUMMARY_CONTEXT_CHARS) + "\n...[truncated]..."
128
+ : combined;
129
+ return `\n\n<workspace-critical-rules>\n${safeContent}\n</workspace-critical-rules>`;
130
+ }
131
+ catch {
132
+ return "";
133
+ }
134
+ }
102
135
  export default function compactionSafeguardExtension(api) {
103
136
  api.on("session_before_compact", async (event, ctx) => {
104
137
  const { preparation, customInstructions, signal } = event;
@@ -133,10 +166,11 @@ export default function compactionSafeguardExtension(api) {
133
166
  };
134
167
  }
135
168
  try {
136
- const contextWindowTokens = resolveContextWindowTokens(model);
169
+ const runtime = getCompactionSafeguardRuntime(ctx.sessionManager);
170
+ const modelContextWindow = resolveContextWindowTokens(model);
171
+ const contextWindowTokens = runtime?.contextWindowTokens ?? modelContextWindow;
137
172
  const turnPrefixMessages = preparation.turnPrefixMessages ?? [];
138
173
  let messagesToSummarize = preparation.messagesToSummarize;
139
- const runtime = getCompactionSafeguardRuntime(ctx.sessionManager);
140
174
  const maxHistoryShare = runtime?.maxHistoryShare ?? 0.5;
141
175
  const tokensBefore = typeof preparation.tokensBefore === "number" && Number.isFinite(preparation.tokensBefore)
142
176
  ? preparation.tokensBefore
@@ -156,14 +190,15 @@ export default function compactionSafeguardExtension(api) {
156
190
  });
157
191
  if (pruned.droppedChunks > 0) {
158
192
  const newContentRatio = (newContentTokens / contextWindowTokens) * 100;
159
- console.warn(`Compaction safeguard: new content uses ${newContentRatio.toFixed(1)}% of context; dropped ${pruned.droppedChunks} older chunk(s) ` +
193
+ log.warn(`Compaction safeguard: new content uses ${newContentRatio.toFixed(1)}% of context; dropped ${pruned.droppedChunks} older chunk(s) ` +
160
194
  `(${pruned.droppedMessages} messages) to fit history budget.`);
161
195
  messagesToSummarize = pruned.messages;
162
196
  // Summarize dropped messages so context isn't lost
163
197
  if (pruned.droppedMessagesList.length > 0) {
164
198
  try {
165
199
  const droppedChunkRatio = computeAdaptiveChunkRatio(pruned.droppedMessagesList, contextWindowTokens);
166
- const droppedMaxChunkTokens = Math.max(1, Math.floor(contextWindowTokens * droppedChunkRatio));
200
+ const droppedMaxChunkTokens = Math.max(1, Math.floor(contextWindowTokens * droppedChunkRatio) -
201
+ SUMMARIZATION_OVERHEAD_TOKENS);
167
202
  droppedSummary = await summarizeInStages({
168
203
  messages: pruned.droppedMessagesList,
169
204
  model,
@@ -177,16 +212,18 @@ export default function compactionSafeguardExtension(api) {
177
212
  });
178
213
  }
179
214
  catch (droppedError) {
180
- console.warn(`Compaction safeguard: failed to summarize dropped messages, continuing without: ${droppedError instanceof Error ? droppedError.message : String(droppedError)}`);
215
+ log.warn(`Compaction safeguard: failed to summarize dropped messages, continuing without: ${droppedError instanceof Error ? droppedError.message : String(droppedError)}`);
181
216
  }
182
217
  }
183
218
  }
184
219
  }
185
220
  }
186
- // Use adaptive chunk ratio based on message sizes
221
+ // Use adaptive chunk ratio based on message sizes, reserving headroom for
222
+ // the summarization prompt, system prompt, previous summary, and reasoning budget
223
+ // that generateSummary adds on top of the serialized conversation chunk.
187
224
  const allMessages = [...messagesToSummarize, ...turnPrefixMessages];
188
225
  const adaptiveRatio = computeAdaptiveChunkRatio(allMessages, contextWindowTokens);
189
- const maxChunkTokens = Math.max(1, Math.floor(contextWindowTokens * adaptiveRatio));
226
+ const maxChunkTokens = Math.max(1, Math.floor(contextWindowTokens * adaptiveRatio) - SUMMARIZATION_OVERHEAD_TOKENS);
190
227
  const reserveTokens = Math.max(1, Math.floor(preparation.settings.reserveTokens));
191
228
  // Feed dropped-messages summary as previousSummary so the main summarization
192
229
  // incorporates context from pruned messages instead of losing it entirely.
@@ -219,6 +256,11 @@ export default function compactionSafeguardExtension(api) {
219
256
  }
220
257
  summary += toolFailureSection;
221
258
  summary += fileOpsSummary;
259
+ // Append workspace critical context (Session Startup + Red Lines from AGENTS.md)
260
+ const workspaceContext = await readWorkspaceContextForSummary();
261
+ if (workspaceContext) {
262
+ summary += workspaceContext;
263
+ }
222
264
  return {
223
265
  compaction: {
224
266
  summary,
@@ -229,7 +271,7 @@ export default function compactionSafeguardExtension(api) {
229
271
  };
230
272
  }
231
273
  catch (error) {
232
- console.warn(`Compaction summarization failed; truncating history: ${error instanceof Error ? error.message : String(error)}`);
274
+ log.warn(`Compaction summarization failed; truncating history: ${error instanceof Error ? error.message : String(error)}`);
233
275
  return {
234
276
  compaction: {
235
277
  summary: fallbackSummary,
@@ -17,3 +17,43 @@ export function resolveCompactionReserveTokensFloor(cfg) {
17
17
  }
18
18
  return DEFAULT_PI_COMPACTION_RESERVE_TOKENS_FLOOR;
19
19
  }
20
+ function toNonNegativeInt(value) {
21
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
22
+ return undefined;
23
+ }
24
+ return Math.floor(value);
25
+ }
26
+ function toPositiveInt(value) {
27
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
28
+ return undefined;
29
+ }
30
+ return Math.floor(value);
31
+ }
32
+ export function applyPiCompactionSettingsFromConfig(params) {
33
+ const currentReserveTokens = params.settingsManager.getCompactionReserveTokens();
34
+ const currentKeepRecentTokens = params.settingsManager.getCompactionKeepRecentTokens();
35
+ const compactionCfg = params.cfg?.agents?.defaults?.compaction;
36
+ const configuredReserveTokens = toNonNegativeInt(compactionCfg?.reserveTokens);
37
+ const configuredKeepRecentTokens = toPositiveInt(compactionCfg?.keepRecentTokens);
38
+ const reserveTokensFloor = resolveCompactionReserveTokensFloor(params.cfg);
39
+ const targetReserveTokens = Math.max(configuredReserveTokens ?? currentReserveTokens, reserveTokensFloor);
40
+ const targetKeepRecentTokens = configuredKeepRecentTokens ?? currentKeepRecentTokens;
41
+ const overrides = {};
42
+ if (targetReserveTokens !== currentReserveTokens) {
43
+ overrides.reserveTokens = targetReserveTokens;
44
+ }
45
+ if (targetKeepRecentTokens !== currentKeepRecentTokens) {
46
+ overrides.keepRecentTokens = targetKeepRecentTokens;
47
+ }
48
+ const didOverride = Object.keys(overrides).length > 0;
49
+ if (didOverride) {
50
+ params.settingsManager.applyOverrides({ compaction: overrides });
51
+ }
52
+ return {
53
+ didOverride,
54
+ compaction: {
55
+ reserveTokens: targetReserveTokens,
56
+ keepRecentTokens: targetKeepRecentTokens,
57
+ },
58
+ };
59
+ }
@@ -5,6 +5,7 @@ import { normalizeMessageChannel } from "../utils/message-channel.js";
5
5
  import { resolveAgentConfig, resolveAgentIdFromSessionKey } from "./agent-scope.js";
6
6
  import { compileGlobPatterns, matchesAnyGlobPattern } from "./glob-pattern.js";
7
7
  import { pickSandboxToolPolicy } from "./sandbox-tool-policy.js";
8
+ import { DEFAULT_SUBAGENT_MAX_SPAWN_DEPTH } from "../config/agent-limits.js";
8
9
  import { expandToolGroups, normalizeToolName } from "./tool-policy.js";
9
10
  function makeToolPolicyMatcher(policy) {
10
11
  const deny = compileGlobPatterns({
@@ -75,7 +76,7 @@ function resolveSubagentDenyList(depth, maxSpawnDepth) {
75
76
  }
76
77
  export function resolveSubagentToolPolicy(cfg, depth) {
77
78
  const configured = cfg?.tools?.subagents?.tools;
78
- const maxSpawnDepth = cfg?.agents?.defaults?.subagents?.maxSpawnDepth ?? 1;
79
+ const maxSpawnDepth = cfg?.agents?.defaults?.subagents?.maxSpawnDepth ?? DEFAULT_SUBAGENT_MAX_SPAWN_DEPTH;
79
80
  const effectiveDepth = typeof depth === "number" && depth >= 0 ? depth : 1;
80
81
  const baseDeny = resolveSubagentDenyList(effectiveDepth, maxSpawnDepth);
81
82
  const deny = [...baseDeny, ...(Array.isArray(configured?.deny) ? configured.deny : [])];
@@ -46,7 +46,7 @@ export function loadPoolConfig(cfg) {
46
46
  }
47
47
  try {
48
48
  TokenPool.addToken(providerID, tokenCfg.id, tokenCfg.key, {
49
- tier: tokenCfg.tier ?? "paid",
49
+ tier: (tokenCfg.tier ?? "paid"),
50
50
  label: tokenCfg.label,
51
51
  enabled: tokenCfg.enabled ?? true,
52
52
  });