@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
@@ -1,20 +1,13 @@
1
- import path from "node:path";
2
- import { fileURLToPath } from "node:url";
3
1
  import { resolveContextWindowInfo } from "../context-window-guard.js";
4
2
  import { DEFAULT_CONTEXT_TOKENS } from "../defaults.js";
5
3
  import { setCompactionSafeguardRuntime } from "../pi-extensions/compaction-safeguard-runtime.js";
4
+ import compactionSafeguardExtension from "../pi-extensions/compaction-safeguard.js";
5
+ import contextPruningExtension from "../pi-extensions/context-pruning.js";
6
6
  import { setContextPruningRuntime } from "../pi-extensions/context-pruning/runtime.js";
7
7
  import { computeEffectiveSettings } from "../pi-extensions/context-pruning/settings.js";
8
8
  import { makeToolPrunablePredicate } from "../pi-extensions/context-pruning/tools.js";
9
9
  import { ensurePiCompactionReserveTokens } from "../pi-settings.js";
10
10
  import { isCacheTtlEligibleProvider, readLastCacheTtlTimestamp } from "./cache-ttl.js";
11
- function resolvePiExtensionPath(id) {
12
- const self = fileURLToPath(import.meta.url);
13
- const dir = path.dirname(self);
14
- // In dev this file is `.ts` (tsx), in production it's `.js`.
15
- const ext = path.extname(self) === ".ts" ? "ts" : "js";
16
- return path.join(dir, "..", "pi-extensions", `${id}.${ext}`);
17
- }
18
11
  function resolveContextWindowTokens(params) {
19
12
  return resolveContextWindowInfo({
20
13
  cfg: params.cfg,
@@ -24,41 +17,50 @@ function resolveContextWindowTokens(params) {
24
17
  defaultTokens: DEFAULT_CONTEXT_TOKENS,
25
18
  }).tokens;
26
19
  }
27
- function buildContextPruningExtension(params) {
20
+ function buildContextPruningFactory(params) {
28
21
  const raw = params.cfg?.agents?.defaults?.contextPruning;
29
- if (raw?.mode !== "cache-ttl")
30
- return {};
31
- if (!isCacheTtlEligibleProvider(params.provider, params.modelId))
32
- return {};
22
+ if (raw?.mode !== "cache-ttl") {
23
+ return undefined;
24
+ }
25
+ if (!isCacheTtlEligibleProvider(params.provider, params.modelId)) {
26
+ return undefined;
27
+ }
33
28
  const settings = computeEffectiveSettings(raw);
34
- if (!settings)
35
- return {};
29
+ if (!settings) {
30
+ return undefined;
31
+ }
36
32
  setContextPruningRuntime(params.sessionManager, {
37
33
  settings,
38
34
  contextWindowTokens: resolveContextWindowTokens(params),
39
35
  isToolPrunable: makeToolPrunablePredicate(settings.tools),
40
36
  lastCacheTouchAt: readLastCacheTtlTimestamp(params.sessionManager),
41
37
  });
42
- return {
43
- additionalExtensionPaths: [resolvePiExtensionPath("context-pruning")],
44
- };
38
+ return contextPruningExtension;
45
39
  }
46
40
  function resolveCompactionMode(cfg) {
47
41
  return cfg?.agents?.defaults?.compaction?.mode === "safeguard" ? "safeguard" : "default";
48
42
  }
49
- export function buildEmbeddedExtensionPaths(params) {
50
- const paths = [];
43
+ export function buildEmbeddedExtensionFactories(params) {
44
+ const factories = [];
51
45
  if (resolveCompactionMode(params.cfg) === "safeguard") {
52
46
  const compactionCfg = params.cfg?.agents?.defaults?.compaction;
47
+ const contextWindowInfo = resolveContextWindowInfo({
48
+ cfg: params.cfg,
49
+ provider: params.provider,
50
+ modelId: params.modelId,
51
+ modelContextWindow: params.model?.contextWindow,
52
+ defaultTokens: DEFAULT_CONTEXT_TOKENS,
53
+ });
53
54
  setCompactionSafeguardRuntime(params.sessionManager, {
54
55
  maxHistoryShare: compactionCfg?.maxHistoryShare,
56
+ contextWindowTokens: contextWindowInfo.tokens,
55
57
  });
56
- paths.push(resolvePiExtensionPath("compaction-safeguard"));
58
+ factories.push(compactionSafeguardExtension);
57
59
  }
58
- const pruning = buildContextPruningExtension(params);
59
- if (pruning.additionalExtensionPaths) {
60
- paths.push(...pruning.additionalExtensionPaths);
60
+ const pruningFactory = buildContextPruningFactory(params);
61
+ if (pruningFactory) {
62
+ factories.push(pruningFactory);
61
63
  }
62
- return paths;
64
+ return factories;
63
65
  }
64
66
  export { ensurePiCompactionReserveTokens };
@@ -7,6 +7,7 @@ import { cleanToolSchemaForGemini } from "../pi-tools.schema.js";
7
7
  import { sanitizeToolCallInputs, stripToolResultDetails, sanitizeToolUseResultPairing, } from "../session-transcript-repair.js";
8
8
  import { resolveTranscriptPolicy } from "../transcript-policy.js";
9
9
  import { log } from "./logger.js";
10
+ import { dropThinkingBlocks } from "./thinking.js";
10
11
  import { describeUnknownError } from "./utils.js";
11
12
  const GOOGLE_TURN_ORDERING_CUSTOM_TYPE = "google-turn-ordering-bootstrap";
12
13
  const GOOGLE_SCHEMA_UNSUPPORTED_KEYWORDS = new Set([
@@ -71,6 +72,12 @@ export function sanitizeAntigravityThinkingBlocks(messages) {
71
72
  const rec = block;
72
73
  const candidate = rec.thinkingSignature ?? rec.signature ?? rec.thought_signature ?? rec.thoughtSignature;
73
74
  if (!isValidAntigravitySignature(candidate)) {
75
+ // Preserve reasoning content as plain text when signatures are invalid/missing.
76
+ // Antigravity Claude rejects unsigned thinking blocks, but dropping them loses context.
77
+ const thinkingText = block.thinking;
78
+ if (typeof thinkingText === "string" && thinkingText.trim()) {
79
+ nextContent.push({ type: "text", text: thinkingText });
80
+ }
74
81
  contentChanged = true;
75
82
  continue;
76
83
  }
@@ -199,11 +206,11 @@ function findUnsupportedSchemaKeywords(schema, path) {
199
206
  return violations;
200
207
  }
201
208
  export function sanitizeToolsForGoogle(params) {
202
- // google-antigravity serves Anthropic models (e.g. claude-opus-4-6-thinking),
203
- // NOT Gemini. Applying Gemini schema cleaning strips JSON Schema keywords
204
- // (minimum, maximum, format, etc.) that Anthropic's API requires for
205
- // draft 2020-12 compliance. Only clean for actual Gemini providers.
206
- if (params.provider !== "google-gemini-cli") {
209
+ // Cloud Code Assist uses the OpenAPI 3.03 `parameters` field for both Gemini
210
+ // AND Claude models. This field does not support JSON Schema keywords such as
211
+ // patternProperties, additionalProperties, $ref, etc. We must clean schemas
212
+ // for every provider that routes through this path.
213
+ if (params.provider !== "google-gemini-cli" && params.provider !== "google-antigravity") {
207
214
  return params.tools;
208
215
  }
209
216
  return params.tools.map((tool) => {
@@ -350,10 +357,15 @@ export async function sanitizeSessionHistory(params) {
350
357
  sanitizeThoughtSignatures: policy.sanitizeThoughtSignatures,
351
358
  ...resolveImageSanitizationLimits(params.config),
352
359
  });
353
- const sanitizedThinking = policy.normalizeAntigravityThinkingBlocks
354
- ? sanitizeAntigravityThinkingBlocks(sanitizedImages)
360
+ const droppedThinking = policy.dropThinkingBlocks
361
+ ? dropThinkingBlocks(sanitizedImages)
355
362
  : sanitizedImages;
356
- const sanitizedToolCalls = sanitizeToolCallInputs(sanitizedThinking);
363
+ const sanitizedThinking = policy.sanitizeThinkingSignatures
364
+ ? sanitizeAntigravityThinkingBlocks(droppedThinking)
365
+ : droppedThinking;
366
+ const sanitizedToolCalls = sanitizeToolCallInputs(sanitizedThinking, {
367
+ allowedToolNames: params.allowedToolNames,
368
+ });
357
369
  const repairedTools = policy.repairToolUseResultPairing
358
370
  ? sanitizeToolUseResultPairing(sanitizedToolCalls)
359
371
  : sanitizedToolCalls;
@@ -1,7 +1,7 @@
1
1
  import fs from "node:fs/promises";
2
2
  import os from "node:os";
3
3
  import { streamSimple } from "@mariozechner/pi-ai";
4
- import { createAgentSession, SessionManager, SettingsManager } from "@mariozechner/pi-coding-agent";
4
+ import { createAgentSession, DefaultResourceLoader, SessionManager, SettingsManager, } from "@mariozechner/pi-coding-agent";
5
5
  import { resolveHeartbeatPrompt } from "../../../auto-reply/heartbeat.js";
6
6
  import { resolveChannelCapabilities } from "../../../config/channel-capabilities.js";
7
7
  import { getMachineDisplayName } from "../../../infra/machine-name.js";
@@ -30,7 +30,7 @@ import { resolveDefaultModelForAgent } from "../../model-selection.js";
30
30
  import { createOllamaStreamFn, OLLAMA_NATIVE_BASE_URL } from "../../ollama-stream.js";
31
31
  import { isCloudCodeAssistFormatError, resolveBootstrapMaxChars, resolveBootstrapTotalMaxChars, validateAnthropicTurns, validateGeminiTurns, } from "../../pi-embedded-helpers.js";
32
32
  import { subscribeEmbeddedPiSession } from "../../pi-embedded-subscribe.js";
33
- import { ensurePiCompactionReserveTokens, resolveCompactionReserveTokensFloor, } from "../../pi-settings.js";
33
+ import { applyPiCompactionSettingsFromConfig } from "../../pi-settings.js";
34
34
  import { toClientToolDefinitions } from "../../pi-tool-definition-adapter.js";
35
35
  import { createPoolbotCodingTools, resolveToolLoopDetectionConfig } from "../../pi-tools.js";
36
36
  import { resolveSandboxContext } from "../../sandbox.js";
@@ -47,7 +47,7 @@ import { resolveTranscriptPolicy } from "../../transcript-policy.js";
47
47
  import { DEFAULT_BOOTSTRAP_FILENAME } from "../../workspace.js";
48
48
  import { isRunnerAbortError } from "../abort.js";
49
49
  import { appendCacheTtlTimestamp, isCacheTtlEligibleProvider } from "../cache-ttl.js";
50
- import { buildEmbeddedExtensionPaths } from "../extensions.js";
50
+ import { buildEmbeddedExtensionFactories } from "../extensions.js";
51
51
  import { applyExtraParamsToAgent } from "../extra-params.js";
52
52
  import { logToolSchemasForGoogle, sanitizeAntigravityThinkingBlocks, sanitizeSessionHistory, sanitizeToolsForGoogle, } from "../google.js";
53
53
  import { getDmHistoryLimitFromSessionKey, limitHistoryTurns } from "../history.js";
@@ -58,6 +58,8 @@ import { buildEmbeddedSandboxInfo } from "../sandbox-info.js";
58
58
  import { prewarmSessionFile, trackSessionManagerAccess } from "../session-manager-cache.js";
59
59
  import { prepareSessionManagerForRun } from "../session-manager-init.js";
60
60
  import { applySystemPromptOverrideToSession, buildEmbeddedSystemPrompt, createSystemPromptOverride, } from "../system-prompt.js";
61
+ import { dropThinkingBlocks } from "../thinking.js";
62
+ import { collectAllowedToolNames } from "../tool-name-allowlist.js";
61
63
  import { installToolResultContextGuard } from "../tool-result-context-guard.js";
62
64
  import { splitSdkTools } from "../tool-split.js";
63
65
  import { describeUnknownError, mapThinkingLevel } from "../utils.js";
@@ -101,6 +103,37 @@ export function injectHistoryImagesIntoMessages(messages, historyImagesByIndex)
101
103
  }
102
104
  return didMutate;
103
105
  }
106
+ export async function resolvePromptBuildHookResult(params) {
107
+ const promptBuildResult = params.hookRunner?.hasHooks("before_prompt_build")
108
+ ? await params.hookRunner
109
+ .runBeforePromptBuild({
110
+ prompt: params.prompt,
111
+ messages: params.messages,
112
+ }, params.hookCtx)
113
+ .catch((hookErr) => {
114
+ log.warn(`before_prompt_build hook failed: ${String(hookErr)}`);
115
+ return undefined;
116
+ })
117
+ : undefined;
118
+ const legacyResult = params.legacyBeforeAgentStartResult ??
119
+ (params.hookRunner?.hasHooks("before_agent_start")
120
+ ? await params.hookRunner
121
+ .runBeforeAgentStart({
122
+ prompt: params.prompt,
123
+ messages: params.messages,
124
+ }, params.hookCtx)
125
+ .catch((hookErr) => {
126
+ log.warn(`before_agent_start hook (legacy prompt build path) failed: ${String(hookErr)}`);
127
+ return undefined;
128
+ })
129
+ : undefined);
130
+ return {
131
+ systemPrompt: promptBuildResult?.systemPrompt ?? legacyResult?.systemPrompt,
132
+ prependContext: [promptBuildResult?.prependContext, legacyResult?.prependContext]
133
+ .filter((value) => Boolean(value))
134
+ .join("\n\n"),
135
+ };
136
+ }
104
137
  function summarizeMessagePayload(msg) {
105
138
  const content = msg.content;
106
139
  if (typeof content === "string") {
@@ -244,6 +277,10 @@ export async function runEmbeddedAttempt(params) {
244
277
  disableMessageTool: params.disableMessageTool,
245
278
  });
246
279
  const tools = sanitizeToolsForGoogle({ tools: toolsRaw, provider: params.provider });
280
+ const allowedToolNames = collectAllowedToolNames({
281
+ tools,
282
+ clientTools: params.clientTools,
283
+ });
247
284
  logToolSchemasForGoogle({ tools, provider: params.provider });
248
285
  const machineName = await getMachineDisplayName();
249
286
  const runtimeChannel = normalizeMessageChannel(params.messageChannel ?? params.messageProvider);
@@ -349,6 +386,10 @@ export async function runEmbeddedAttempt(params) {
349
386
  reasoningLevel: params.reasoningLevel ?? "off",
350
387
  extraSystemPrompt: params.extraSystemPrompt,
351
388
  ownerNumbers: params.ownerNumbers,
389
+ ownerDisplay: params.config?.commands?.ownerDisplay,
390
+ ownerDisplaySecret: params.config?.commands?.ownerDisplaySecret ??
391
+ params.config?.gateway?.auth?.token ??
392
+ params.config?.gateway?.remote?.token,
352
393
  reasoningTagHint,
353
394
  heartbeatPrompt: isDefaultAgent
354
395
  ? resolveHeartbeatPrompt(params.config?.agents?.defaults?.heartbeat?.prompt)
@@ -424,6 +465,7 @@ export async function runEmbeddedAttempt(params) {
424
465
  sessionKey: params.sessionKey,
425
466
  inputProvenance: params.inputProvenance,
426
467
  allowSyntheticToolResults: transcriptPolicy.allowSyntheticToolResults,
468
+ allowedToolNames,
427
469
  });
428
470
  trackSessionManagerAccess(params.sessionFile);
429
471
  await prepareSessionManagerForRun({
@@ -434,18 +476,31 @@ export async function runEmbeddedAttempt(params) {
434
476
  cwd: effectiveWorkspace,
435
477
  });
436
478
  const settingsManager = SettingsManager.create(effectiveWorkspace, agentDir);
437
- ensurePiCompactionReserveTokens({
479
+ applyPiCompactionSettingsFromConfig({
438
480
  settingsManager,
439
- minReserveTokens: resolveCompactionReserveTokensFloor(params.config),
481
+ cfg: params.config,
440
482
  });
441
- // Call for side effects (sets compaction/pruning runtime state)
442
- buildEmbeddedExtensionPaths({
483
+ // Sets compaction/pruning runtime state and returns extension factories
484
+ // that must be passed to the resource loader for the safeguard to be active.
485
+ const extensionFactories = buildEmbeddedExtensionFactories({
443
486
  cfg: params.config,
444
487
  sessionManager,
445
488
  provider: params.provider,
446
489
  modelId: params.modelId,
447
490
  model: params.model,
448
491
  });
492
+ // Only create an explicit resource loader when there are extension factories
493
+ // to register; otherwise let createAgentSession use its built-in default.
494
+ let resourceLoader;
495
+ if (extensionFactories.length > 0) {
496
+ resourceLoader = new DefaultResourceLoader({
497
+ cwd: resolvedWorkspace,
498
+ agentDir,
499
+ settingsManager,
500
+ extensionFactories,
501
+ });
502
+ await resourceLoader.reload();
503
+ }
449
504
  // Get hook runner early so it's available when creating tools
450
505
  const hookRunner = getGlobalHookRunner();
451
506
  const { builtInTools, customTools } = splitSdkTools({
@@ -479,6 +534,7 @@ export async function runEmbeddedAttempt(params) {
479
534
  customTools: allCustomTools,
480
535
  sessionManager,
481
536
  settingsManager,
537
+ resourceLoader,
482
538
  }));
483
539
  applySystemPromptOverrideToSession(session, systemPromptText);
484
540
  if (!session) {
@@ -533,6 +589,28 @@ export async function runEmbeddedAttempt(params) {
533
589
  });
534
590
  activeSession.agent.streamFn = cacheTrace.wrapStreamFn(activeSession.agent.streamFn);
535
591
  }
592
+ // Copilot/Claude can reject persisted `thinking` blocks (e.g. thinkingSignature:"reasoning_text")
593
+ // on *any* follow-up provider call (including tool continuations). Wrap the stream function
594
+ // so every outbound request sees sanitized messages.
595
+ if (transcriptPolicy.dropThinkingBlocks) {
596
+ const inner = activeSession.agent.streamFn;
597
+ activeSession.agent.streamFn = (model, context, options) => {
598
+ const ctx = context;
599
+ const messages = ctx?.messages;
600
+ if (!Array.isArray(messages)) {
601
+ return inner(model, context, options);
602
+ }
603
+ const sanitized = dropThinkingBlocks(messages);
604
+ if (sanitized === messages) {
605
+ return inner(model, context, options);
606
+ }
607
+ const nextContext = {
608
+ ...context,
609
+ messages: sanitized,
610
+ };
611
+ return inner(model, nextContext, options);
612
+ };
613
+ }
536
614
  if (anthropicPayloadLogger) {
537
615
  activeSession.agent.streamFn = anthropicPayloadLogger.wrapStreamFn(activeSession.agent.streamFn);
538
616
  }
@@ -542,6 +620,7 @@ export async function runEmbeddedAttempt(params) {
542
620
  modelApi: params.model.api,
543
621
  modelId: params.modelId,
544
622
  provider: params.provider,
623
+ allowedToolNames,
545
624
  config: params.config,
546
625
  sessionManager,
547
626
  sessionId: params.sessionId,
@@ -725,34 +804,13 @@ export async function runEmbeddedAttempt(params) {
725
804
  workspaceDir: params.workspaceDir,
726
805
  messageProvider: params.messageProvider ?? undefined,
727
806
  };
728
- const promptBuildResult = hookRunner?.hasHooks("before_prompt_build")
729
- ? await hookRunner
730
- .runBeforePromptBuild({
731
- prompt: params.prompt,
732
- messages: activeSession.messages,
733
- }, hookCtx)
734
- .catch((hookErr) => {
735
- log.warn(`before_prompt_build hook failed: ${String(hookErr)}`);
736
- return undefined;
737
- })
738
- : undefined;
739
- const legacyResult = hookRunner?.hasHooks("before_agent_start")
740
- ? await hookRunner
741
- .runBeforeAgentStart({
742
- prompt: params.prompt,
743
- messages: activeSession.messages,
744
- }, hookCtx)
745
- .catch((hookErr) => {
746
- log.warn(`before_agent_start hook (legacy prompt build path) failed: ${String(hookErr)}`);
747
- return undefined;
748
- })
749
- : undefined;
750
- const hookResult = {
751
- systemPrompt: promptBuildResult?.systemPrompt ?? legacyResult?.systemPrompt,
752
- prependContext: [promptBuildResult?.prependContext, legacyResult?.prependContext]
753
- .filter((value) => Boolean(value))
754
- .join("\n\n"),
755
- };
807
+ const hookResult = await resolvePromptBuildHookResult({
808
+ prompt: params.prompt,
809
+ messages: activeSession.messages,
810
+ hookCtx,
811
+ hookRunner,
812
+ legacyBeforeAgentStartResult: params.legacyBeforeAgentStartResult,
813
+ });
756
814
  {
757
815
  if (hookResult?.prependContext) {
758
816
  effectivePrompt = `${hookResult.prependContext}\n\n${params.prompt}`;
@@ -774,7 +832,8 @@ export async function runEmbeddedAttempt(params) {
774
832
  sessionManager.resetLeaf();
775
833
  }
776
834
  const sessionContext = sessionManager.buildSessionContext();
777
- const sanitizedOrphan = transcriptPolicy.normalizeAntigravityThinkingBlocks
835
+ const sanitizedOrphan = transcriptPolicy.sanitizeThinkingSignatures ||
836
+ transcriptPolicy.normalizeAntigravityThinkingBlocks
778
837
  ? sanitizeAntigravityThinkingBlocks(sessionContext.messages)
779
838
  : sessionContext.messages;
780
839
  activeSession.agent.replaceMessages(sanitizedOrphan);
@@ -43,6 +43,16 @@ const createUsageAccumulator = () => ({
43
43
  function createCompactionDiagId() {
44
44
  return `ovf-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
45
45
  }
46
+ // Defensive guard for the outer run loop across all retry branches.
47
+ const BASE_RUN_RETRY_ITERATIONS = 24;
48
+ const RUN_RETRY_ITERATIONS_PER_PROFILE = 8;
49
+ const MIN_RUN_RETRY_ITERATIONS = 32;
50
+ const MAX_RUN_RETRY_ITERATIONS = 160;
51
+ function resolveMaxRunRetryIterations(profileCandidateCount) {
52
+ const scaled = BASE_RUN_RETRY_ITERATIONS +
53
+ Math.max(1, profileCandidateCount) * RUN_RETRY_ITERATIONS_PER_PROFILE;
54
+ return Math.min(MAX_RUN_RETRY_ITERATIONS, Math.max(MIN_RUN_RETRY_ITERATIONS, scaled));
55
+ }
46
56
  const hasUsageValues = (usage) => !!usage &&
47
57
  [usage.input, usage.output, usage.cacheRead, usage.cacheWrite, usage.total].some((value) => typeof value === "number" && Number.isFinite(value) && value > 0);
48
58
  const mergeUsageIntoAccumulator = (target, usage) => {
@@ -89,6 +99,12 @@ const toNormalizedUsage = (usage) => {
89
99
  total: lastPromptTokens + usage.output || undefined,
90
100
  };
91
101
  };
102
+ function resolveActiveErrorContext(params) {
103
+ return {
104
+ provider: params.lastAssistant?.provider ?? params.provider,
105
+ model: params.lastAssistant?.model ?? params.model,
106
+ };
107
+ }
92
108
  export async function runEmbeddedPiAgent(params) {
93
109
  const sessionLane = resolveSessionLane(params.sessionKey?.trim() || params.sessionId);
94
110
  const globalLane = resolveGlobalLane(params.lane);
@@ -129,6 +145,7 @@ export async function runEmbeddedPiAgent(params) {
129
145
  // Legacy compatibility: before_agent_start is also checked for override
130
146
  // fields if present. New hook takes precedence when both are set.
131
147
  let modelResolveOverride;
148
+ let legacyBeforeAgentStartResult;
132
149
  const hookRunner = getGlobalHookRunner();
133
150
  const hookCtx = {
134
151
  agentId: workspaceResolution.agentId,
@@ -147,10 +164,11 @@ export async function runEmbeddedPiAgent(params) {
147
164
  }
148
165
  if (hookRunner?.hasHooks("before_agent_start")) {
149
166
  try {
150
- const legacyResult = await hookRunner.runBeforeAgentStart({ prompt: params.prompt }, hookCtx);
167
+ legacyBeforeAgentStartResult = await hookRunner.runBeforeAgentStart({ prompt: params.prompt }, hookCtx);
151
168
  modelResolveOverride = {
152
- providerOverride: modelResolveOverride?.providerOverride ?? legacyResult?.providerOverride,
153
- modelOverride: modelResolveOverride?.modelOverride ?? legacyResult?.modelOverride,
169
+ providerOverride: modelResolveOverride?.providerOverride ??
170
+ legacyBeforeAgentStartResult?.providerOverride,
171
+ modelOverride: modelResolveOverride?.modelOverride ?? legacyBeforeAgentStartResult?.modelOverride,
154
172
  };
155
173
  }
156
174
  catch (hookErr) {
@@ -167,7 +185,11 @@ export async function runEmbeddedPiAgent(params) {
167
185
  }
168
186
  const { model, error, authStorage, modelRegistry } = resolveModel(provider, modelId, agentDir, params.config);
169
187
  if (!model) {
170
- throw new Error(error ?? `Unknown model: ${provider}/${modelId}`);
188
+ throw new FailoverError(error ?? `Unknown model: ${provider}/${modelId}`, {
189
+ reason: "model_not_found",
190
+ provider,
191
+ model: modelId,
192
+ });
171
193
  }
172
194
  const ctxInfo = resolveContextWindowInfo({
173
195
  cfg: params.config,
@@ -335,13 +357,41 @@ export async function runEmbeddedPiAgent(params) {
335
357
  }
336
358
  }
337
359
  const MAX_OVERFLOW_COMPACTION_ATTEMPTS = 3;
360
+ const MAX_RUN_LOOP_ITERATIONS = resolveMaxRunRetryIterations(profileCandidates.length);
338
361
  let overflowCompactionAttempts = 0;
339
362
  let toolResultTruncationAttempted = false;
340
363
  const usageAccumulator = createUsageAccumulator();
341
364
  let lastRunPromptUsage;
342
365
  let autoCompactionCount = 0;
366
+ let runLoopIterations = 0;
343
367
  try {
344
368
  while (true) {
369
+ if (runLoopIterations >= MAX_RUN_LOOP_ITERATIONS) {
370
+ const message = `Exceeded retry limit after ${runLoopIterations} attempts ` +
371
+ `(max=${MAX_RUN_LOOP_ITERATIONS}).`;
372
+ log.error(`[run-retry-limit] sessionKey=${params.sessionKey ?? params.sessionId} ` +
373
+ `provider=${provider}/${modelId} attempts=${runLoopIterations} ` +
374
+ `maxAttempts=${MAX_RUN_LOOP_ITERATIONS}`);
375
+ return {
376
+ payloads: [
377
+ {
378
+ text: "Request failed after repeated internal retries. " +
379
+ "Please try again, or use /new to start a fresh session.",
380
+ isError: true,
381
+ },
382
+ ],
383
+ meta: {
384
+ durationMs: Date.now() - started,
385
+ agentMeta: {
386
+ sessionId: params.sessionId,
387
+ provider,
388
+ model: model.id,
389
+ },
390
+ error: { kind: "retry_limit", message },
391
+ },
392
+ };
393
+ }
394
+ runLoopIterations += 1;
345
395
  attemptedThinking.add(thinkLevel);
346
396
  await fs.mkdir(resolvedWorkspace, { recursive: true });
347
397
  const prompt = provider === "anthropic" ? scrubAnthropicRefusalMagic(params.prompt) : params.prompt;
@@ -376,6 +426,7 @@ export async function runEmbeddedPiAgent(params) {
376
426
  authStorage,
377
427
  modelRegistry,
378
428
  agentId: workspaceResolution.agentId,
429
+ legacyBeforeAgentStartResult,
379
430
  thinkLevel,
380
431
  verboseLevel: params.verboseLevel,
381
432
  reasoningLevel: params.reasoningLevel,
@@ -413,11 +464,17 @@ export async function runEmbeddedPiAgent(params) {
413
464
  const lastTurnTotal = lastAssistantUsage?.total ?? attemptUsage?.total;
414
465
  const attemptCompactionCount = Math.max(0, attempt.compactionCount ?? 0);
415
466
  autoCompactionCount += attemptCompactionCount;
467
+ const activeErrorContext = resolveActiveErrorContext({
468
+ lastAssistant,
469
+ provider,
470
+ model: modelId,
471
+ });
416
472
  const formattedAssistantErrorText = lastAssistant
417
473
  ? formatAssistantErrorText(lastAssistant, {
418
474
  cfg: params.config,
419
475
  sessionKey: params.sessionKey ?? params.sessionId,
420
- provider,
476
+ provider: activeErrorContext.provider,
477
+ model: activeErrorContext.model,
421
478
  })
422
479
  : undefined;
423
480
  const assistantErrorText = lastAssistant?.stopReason === "error"
@@ -533,8 +590,8 @@ export async function runEmbeddedPiAgent(params) {
533
590
  });
534
591
  if (truncResult.truncated) {
535
592
  log.info(`[context-overflow-recovery] Truncated ${truncResult.truncatedCount} tool result(s); retrying prompt`);
536
- // Session is now smaller; allow compaction retries again.
537
- overflowCompactionAttempts = 0;
593
+ // Do NOT reset overflowCompactionAttempts here the global cap must remain
594
+ // enforced across all iterations to prevent unbounded compaction cycles (OC-65).
538
595
  continue;
539
596
  }
540
597
  log.warn(`[context-overflow-recovery] Tool result truncation did not help: ${truncResult.reason ?? "unknown"}`);
@@ -725,7 +782,8 @@ export async function runEmbeddedPiAgent(params) {
725
782
  ? formatAssistantErrorText(lastAssistant, {
726
783
  cfg: params.config,
727
784
  sessionKey: params.sessionKey ?? params.sessionId,
728
- provider,
785
+ provider: activeErrorContext.provider,
786
+ model: activeErrorContext.model,
729
787
  })
730
788
  : undefined) ||
731
789
  lastAssistant?.errorMessage?.trim() ||
@@ -734,7 +792,7 @@ export async function runEmbeddedPiAgent(params) {
734
792
  : rateLimitFailure
735
793
  ? "LLM request rate limited."
736
794
  : billingFailure
737
- ? formatBillingErrorMessage(provider)
795
+ ? formatBillingErrorMessage(activeErrorContext.provider, activeErrorContext.model)
738
796
  : authFailure
739
797
  ? "LLM request unauthorized."
740
798
  : "LLM request failed.");
@@ -742,8 +800,8 @@ export async function runEmbeddedPiAgent(params) {
742
800
  (isTimeoutErrorMessage(message) ? 408 : undefined);
743
801
  throw new FailoverError(message, {
744
802
  reason: assistantFailoverReason ?? "unknown",
745
- provider,
746
- model: modelId,
803
+ provider: activeErrorContext.provider,
804
+ model: activeErrorContext.model,
747
805
  profileId: lastProfileId,
748
806
  status,
749
807
  });
@@ -776,7 +834,8 @@ export async function runEmbeddedPiAgent(params) {
776
834
  lastToolError: attempt.lastToolError,
777
835
  config: params.config,
778
836
  sessionKey: params.sessionKey ?? params.sessionId,
779
- provider,
837
+ provider: activeErrorContext.provider,
838
+ model: activeErrorContext.model,
780
839
  verboseLevel: params.verboseLevel,
781
840
  reasoningLevel: params.reasoningLevel,
782
841
  toolResultFormat: resolvedToolResultFormat,
@@ -0,0 +1,34 @@
1
+ export function makeAttemptResult(overrides = {}) {
2
+ return {
3
+ aborted: false,
4
+ timedOut: false,
5
+ timedOutDuringCompaction: false,
6
+ promptError: null,
7
+ sessionIdUsed: "test-session",
8
+ assistantTexts: ["Hello!"],
9
+ toolMetas: [],
10
+ lastAssistant: undefined,
11
+ messagesSnapshot: [],
12
+ didSendViaMessagingTool: false,
13
+ messagingToolSentTexts: [],
14
+ messagingToolSentMediaUrls: [],
15
+ messagingToolSentTargets: [],
16
+ cloudCodeAssistFormatError: false,
17
+ ...overrides,
18
+ };
19
+ }
20
+ export function mockOverflowRetrySuccess(params) {
21
+ const overflowError = new Error(params.overflowMessage ?? "request_too_large: Request size exceeds model context window");
22
+ params.runEmbeddedAttempt.mockResolvedValueOnce(makeAttemptResult({ promptError: overflowError }));
23
+ params.runEmbeddedAttempt.mockResolvedValueOnce(makeAttemptResult({ promptError: null }));
24
+ params.compactDirect.mockResolvedValueOnce({
25
+ ok: true,
26
+ compacted: true,
27
+ result: {
28
+ summary: "Compacted session",
29
+ firstKeptEntryId: "entry-5",
30
+ tokensBefore: 150000,
31
+ },
32
+ });
33
+ return overflowError;
34
+ }
@@ -1,4 +1,13 @@
1
1
  import { vi } from "vitest";
2
+ export const mockedGlobalHookRunner = {
3
+ hasHooks: vi.fn((_hookName) => false),
4
+ runBeforeAgentStart: vi.fn(async (_event, _ctx) => undefined),
5
+ runBeforePromptBuild: vi.fn(async (_event, _ctx) => undefined),
6
+ runBeforeModelResolve: vi.fn(async (_event, _ctx) => undefined),
7
+ };
8
+ vi.mock("../../plugins/hook-runner-global.js", () => ({
9
+ getGlobalHookRunner: vi.fn(() => mockedGlobalHookRunner),
10
+ }));
2
11
  vi.mock("../auth-profiles.js", () => ({
3
12
  isProfileInCooldown: vi.fn(() => false),
4
13
  markAuthProfileFailure: vi.fn(async () => { }),
@@ -78,7 +87,7 @@ vi.mock("../model-auth.js", () => ({
78
87
  resolveAuthProfileOrder: vi.fn(() => []),
79
88
  }));
80
89
  vi.mock("../models-config.js", () => ({
81
- ensurePoolbotModelsJson: vi.fn(async () => { }),
90
+ ensurePoolBotModelsJson: vi.fn(async () => { }),
82
91
  }));
83
92
  vi.mock("../context-window-guard.js", () => ({
84
93
  CONTEXT_WINDOW_HARD_MIN_TOKENS: 1000,
@@ -101,7 +110,7 @@ vi.mock("../../utils/message-channel.js", () => ({
101
110
  isMarkdownCapableMessageChannel: vi.fn(() => true),
102
111
  }));
103
112
  vi.mock("../agent-paths.js", () => ({
104
- resolvePoolbotAgentDir: vi.fn(() => "/tmp/agent-dir"),
113
+ resolvePoolBotAgentDir: vi.fn(() => "/tmp/agent-dir"),
105
114
  }));
106
115
  vi.mock("../defaults.js", () => ({
107
116
  DEFAULT_CONTEXT_TOKENS: 200000,