@poolzin/pool-bot 2026.2.21 → 2026.2.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/agents/api-key-rotation.js +47 -0
  3. package/dist/agents/apply-patch-update.js +19 -9
  4. package/dist/agents/apply-patch.js +72 -47
  5. package/dist/agents/bash-tools.exec.js +141 -559
  6. package/dist/agents/cli-backends.js +49 -6
  7. package/dist/agents/cli-runner/helpers.js +69 -152
  8. package/dist/agents/cli-runner.js +70 -19
  9. package/dist/agents/identity.js +20 -1
  10. package/dist/agents/image-sanitization.js +9 -0
  11. package/dist/agents/live-auth-keys.js +123 -26
  12. package/dist/agents/live-model-filter.js +13 -4
  13. package/dist/agents/model-catalog.js +40 -9
  14. package/dist/agents/model-forward-compat.js +60 -23
  15. package/dist/agents/model-selection.js +134 -41
  16. package/dist/agents/pi-auth-json.js +2 -2
  17. package/dist/agents/pi-embedded-helpers/bootstrap.js +65 -15
  18. package/dist/agents/pi-embedded-helpers/errors.js +140 -15
  19. package/dist/agents/pi-embedded-helpers/images.js +22 -12
  20. package/dist/agents/pi-embedded-helpers.js +2 -2
  21. package/dist/agents/pi-embedded-runner/abort.js +10 -3
  22. package/dist/agents/pi-embedded-runner/compact.js +230 -32
  23. package/dist/agents/pi-embedded-runner/extra-params.js +203 -12
  24. package/dist/agents/pi-embedded-runner/google.js +109 -19
  25. package/dist/agents/pi-embedded-runner/history.js +35 -17
  26. package/dist/agents/pi-embedded-runner/run/attempt.js +386 -95
  27. package/dist/agents/pi-embedded-runner/run/images.js +81 -55
  28. package/dist/agents/pi-embedded-runner/run/payloads.js +89 -39
  29. package/dist/agents/pi-embedded-runner/run.js +193 -25
  30. package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +2 -2
  31. package/dist/agents/pi-embedded-runner/runs.js +17 -8
  32. package/dist/agents/pi-embedded-runner/tool-result-context-guard.js +262 -0
  33. package/dist/agents/pi-embedded-runner.js +1 -1
  34. package/dist/agents/pi-embedded-subscribe.handlers.tools.js +180 -10
  35. package/dist/agents/pi-embedded-subscribe.js +37 -0
  36. package/dist/agents/pi-embedded-subscribe.tools.js +127 -30
  37. package/dist/agents/pi-model-discovery.js +9 -2
  38. package/dist/agents/pi-tool-definition-adapter.js +60 -8
  39. package/dist/agents/pi-tools.before-tool-call.js +1 -1
  40. package/dist/agents/pi-tools.js +113 -94
  41. package/dist/agents/pi-tools.read.js +337 -38
  42. package/dist/agents/poolbot-tools.js +14 -5
  43. package/dist/agents/sandbox/docker.js +10 -5
  44. package/dist/agents/sandbox/registry.js +96 -46
  45. package/dist/agents/sandbox/sanitize-env-vars.js +82 -0
  46. package/dist/agents/sandbox-paths.js +43 -10
  47. package/dist/agents/session-tool-result-guard-wrapper.js +23 -11
  48. package/dist/agents/session-tool-result-guard.js +39 -39
  49. package/dist/agents/session-transcript-repair.js +36 -33
  50. package/dist/agents/session-write-lock.js +62 -44
  51. package/dist/agents/skills/frontmatter.js +49 -88
  52. package/dist/agents/skills/workspace.js +335 -28
  53. package/dist/agents/subagent-announce.js +508 -174
  54. package/dist/agents/subagent-registry.js +45 -4
  55. package/dist/agents/subagent-spawn.js +16 -33
  56. package/dist/agents/system-prompt-report.js +27 -10
  57. package/dist/agents/system-prompt.js +26 -32
  58. package/dist/agents/tool-call-id.js +69 -17
  59. package/dist/agents/tool-display-common.js +1 -1
  60. package/dist/agents/tool-images.js +64 -31
  61. package/dist/agents/tools/canvas-tool.js +17 -11
  62. package/dist/agents/tools/common.js +37 -19
  63. package/dist/agents/tools/cron-tool.js +40 -38
  64. package/dist/agents/tools/gateway.js +70 -2
  65. package/dist/agents/tools/message-tool.js +181 -40
  66. package/dist/agents/tools/nodes-tool.js +128 -36
  67. package/dist/agents/tools/nodes-utils.js +12 -38
  68. package/dist/agents/tools/session-status-tool.js +24 -71
  69. package/dist/agents/tools/sessions-helpers.js +38 -210
  70. package/dist/agents/tools/sessions-spawn-tool.js +28 -198
  71. package/dist/agents/tools/telegram-actions.js +58 -7
  72. package/dist/agents/tools/web-fetch-utils.js +112 -7
  73. package/dist/agents/tools/web-fetch.js +279 -175
  74. package/dist/agents/tools/web-shared.js +71 -8
  75. package/dist/agents/usage.js +25 -16
  76. package/dist/auto-reply/commands-registry.data.js +85 -11
  77. package/dist/auto-reply/dispatch.js +40 -21
  78. package/dist/auto-reply/reply/abort.js +102 -33
  79. package/dist/auto-reply/reply/commands-core.js +82 -33
  80. package/dist/auto-reply/reply/commands-export-session.js +1 -1
  81. package/dist/auto-reply/reply/commands-info.js +41 -12
  82. package/dist/auto-reply/reply/commands-subagents.js +352 -100
  83. package/dist/auto-reply/reply/commands-system-prompt.js +2 -2
  84. package/dist/auto-reply/reply/dispatch-from-config.js +100 -29
  85. package/dist/auto-reply/reply/elevated-unavailable.js +1 -1
  86. package/dist/auto-reply/reply/inbound-meta.js +12 -1
  87. package/dist/auto-reply/reply/mentions.js +18 -11
  88. package/dist/auto-reply/reply/normalize-reply.js +17 -8
  89. package/dist/auto-reply/reply/reply-dispatcher.js +62 -10
  90. package/dist/auto-reply/reply/session.js +102 -21
  91. package/dist/auto-reply/reply/streaming-directives.js +16 -5
  92. package/dist/auto-reply/status.js +73 -50
  93. package/dist/browser/extension-relay.js +3 -3
  94. package/dist/browser/http-auth.js +1 -1
  95. package/dist/browser/paths.js +2 -2
  96. package/dist/build-info.json +3 -3
  97. package/dist/channels/allowlist-match.js +20 -0
  98. package/dist/channels/allowlists/resolve-utils.js +65 -2
  99. package/dist/channels/chat-type.js +8 -4
  100. package/dist/channels/dock.js +127 -35
  101. package/dist/channels/draft-stream-loop.js +6 -2
  102. package/dist/channels/plugins/actions/telegram.js +42 -18
  103. package/dist/channels/plugins/allowlist-match.js +1 -1
  104. package/dist/channels/plugins/group-mentions.js +51 -41
  105. package/dist/channels/plugins/message-action-names.js +2 -0
  106. package/dist/channels/plugins/message-actions.js +24 -5
  107. package/dist/channels/plugins/normalize/discord.js +26 -4
  108. package/dist/channels/plugins/normalize/signal.js +35 -22
  109. package/dist/channels/plugins/onboarding/helpers.js +8 -26
  110. package/dist/channels/plugins/outbound/imessage.js +15 -14
  111. package/dist/channels/registry.js +20 -7
  112. package/dist/cli/acp-cli.js +7 -5
  113. package/dist/cli/browser-cli-extension.js +25 -12
  114. package/dist/cli/browser-cli-state.cookies-storage.js +25 -6
  115. package/dist/cli/browser-cli-state.js +101 -145
  116. package/dist/cli/command-options.js +28 -0
  117. package/dist/cli/completion-cli.js +6 -6
  118. package/dist/cli/cron-cli/register.cron-add.js +25 -1
  119. package/dist/cli/cron-cli/register.cron-edit.js +44 -0
  120. package/dist/cli/cron-cli/shared.js +7 -1
  121. package/dist/cli/daemon-cli/lifecycle-core.js +23 -21
  122. package/dist/cli/daemon-cli/lifecycle.js +23 -247
  123. package/dist/cli/daemon-cli/register-service-commands.js +25 -4
  124. package/dist/cli/daemon-cli.js +1 -0
  125. package/dist/cli/devices-cli.js +33 -20
  126. package/dist/cli/gateway-cli/register.js +37 -105
  127. package/dist/cli/gateway-cli/run.js +49 -11
  128. package/dist/cli/nodes-camera.js +59 -4
  129. package/dist/cli/nodes-cli/register.camera.js +27 -24
  130. package/dist/cli/nodes-cli/rpc.js +21 -38
  131. package/dist/cli/qr-cli.js +2 -2
  132. package/dist/cli/skills-cli.format.js +2 -2
  133. package/dist/cli/update-cli/progress.js +2 -2
  134. package/dist/cli/update-cli/restart-helper.js +28 -7
  135. package/dist/cli/update-cli/shared.js +7 -7
  136. package/dist/cli/update-cli/status.js +1 -1
  137. package/dist/cli/update-cli/update-command.js +14 -8
  138. package/dist/cli/update-cli/wizard.js +2 -2
  139. package/dist/cli/update-cli.js +21 -1027
  140. package/dist/commands/auth-choice.apply.anthropic.js +10 -2
  141. package/dist/commands/channels/add-mutators.js +3 -35
  142. package/dist/commands/channels/add.js +39 -51
  143. package/dist/commands/config-validation.js +1 -1
  144. package/dist/commands/configure.gateway-auth.js +52 -15
  145. package/dist/commands/configure.gateway.js +84 -40
  146. package/dist/commands/doctor-completion.js +3 -3
  147. package/dist/commands/doctor-config-flow.js +536 -16
  148. package/dist/commands/doctor-gateway-services.js +103 -79
  149. package/dist/commands/doctor-memory-search.js +9 -9
  150. package/dist/commands/doctor-platform-notes.js +57 -30
  151. package/dist/commands/doctor-prompter.js +26 -15
  152. package/dist/commands/doctor-session-locks.js +1 -1
  153. package/dist/commands/doctor.js +21 -9
  154. package/dist/commands/model-picker.js +120 -95
  155. package/dist/commands/models/set.js +2 -21
  156. package/dist/commands/models/shared.js +65 -37
  157. package/dist/commands/onboard-helpers.js +81 -39
  158. package/dist/commands/openai-codex-oauth.js +1 -1
  159. package/dist/commands/sessions.js +52 -53
  160. package/dist/commands/status.summary.js +52 -34
  161. package/dist/commands/test-wizard-helpers.js +2 -2
  162. package/dist/config/defaults.js +79 -42
  163. package/dist/config/group-policy.js +50 -18
  164. package/dist/config/includes.js +37 -10
  165. package/dist/config/schema.help.js +5 -4
  166. package/dist/config/schema.hints.js +2 -2
  167. package/dist/config/schema.labels.js +1 -0
  168. package/dist/config/sessions/group.js +12 -11
  169. package/dist/config/sessions/paths.js +137 -11
  170. package/dist/config/sessions/store.js +185 -65
  171. package/dist/config/sessions/types.js +15 -1
  172. package/dist/config/sessions.js +1 -0
  173. package/dist/config/telegram-custom-commands.js +3 -2
  174. package/dist/config/types.js +2 -0
  175. package/dist/config/zod-schema.agent-defaults.js +6 -27
  176. package/dist/config/zod-schema.agent-runtime.js +171 -79
  177. package/dist/config/zod-schema.providers-core.js +138 -65
  178. package/dist/config/zod-schema.session.js +49 -22
  179. package/dist/control-ui/assets/index-HRr1grwl.js.map +1 -1
  180. package/dist/cron/isolated-agent/run.js +224 -57
  181. package/dist/cron/normalize.js +48 -45
  182. package/dist/cron/run-log.js +14 -0
  183. package/dist/cron/service/jobs.js +190 -28
  184. package/dist/cron/service/normalize.js +29 -11
  185. package/dist/cron/service/store.js +30 -44
  186. package/dist/cron/service/timer.js +182 -96
  187. package/dist/cron/service.js +3 -0
  188. package/dist/cron/stagger.js +37 -0
  189. package/dist/daemon/inspect.js +132 -92
  190. package/dist/daemon/runtime-paths.js +25 -4
  191. package/dist/daemon/service-audit.js +47 -16
  192. package/dist/discord/accounts.js +23 -20
  193. package/dist/discord/monitor/agent-components.js +1115 -219
  194. package/dist/discord/monitor/allow-list.js +114 -34
  195. package/dist/discord/monitor/listeners.js +204 -97
  196. package/dist/discord/monitor/message-handler.js +21 -10
  197. package/dist/discord/monitor/message-handler.preflight.js +195 -101
  198. package/dist/discord/monitor/message-handler.process.js +384 -123
  199. package/dist/discord/monitor/message-utils.js +86 -23
  200. package/dist/discord/monitor/native-command.js +77 -57
  201. package/dist/discord/monitor/provider.js +122 -117
  202. package/dist/discord/monitor/reply-context.js +20 -16
  203. package/dist/discord/monitor/reply-delivery.js +40 -8
  204. package/dist/discord/monitor/rest-fetch.js +22 -0
  205. package/dist/discord/monitor/threading.js +117 -24
  206. package/dist/discord/send.js +2 -1
  207. package/dist/discord/send.outbound.js +124 -11
  208. package/dist/discord/send.shared.js +112 -72
  209. package/dist/discord/voice-message.js +3 -3
  210. package/dist/gateway/auth.js +119 -44
  211. package/dist/gateway/call.js +76 -34
  212. package/dist/gateway/channel-health-monitor.js +57 -50
  213. package/dist/gateway/client.js +63 -29
  214. package/dist/gateway/control-ui-contract.js +1 -1
  215. package/dist/gateway/gateway-config-prompts.shared.js +2 -2
  216. package/dist/gateway/net.js +109 -1
  217. package/dist/gateway/protocol/index.js +5 -8
  218. package/dist/gateway/protocol/schema/agent.js +19 -1
  219. package/dist/gateway/protocol/schema/channels.js +21 -0
  220. package/dist/gateway/protocol/schema/cron.js +43 -30
  221. package/dist/gateway/protocol/schema/protocol-schemas.js +6 -11
  222. package/dist/gateway/protocol/schema/sessions.js +5 -1
  223. package/dist/gateway/protocol/schema.js +0 -1
  224. package/dist/gateway/server/presence-events.js +12 -0
  225. package/dist/gateway/server/ws-connection/message-handler.js +203 -212
  226. package/dist/gateway/server/ws-connection.js +58 -21
  227. package/dist/gateway/server-broadcast.js +18 -13
  228. package/dist/gateway/server-cron.js +177 -10
  229. package/dist/gateway/server-methods/agent-job.js +131 -38
  230. package/dist/gateway/server-methods/send.js +60 -14
  231. package/dist/gateway/server-methods/sessions.js +160 -96
  232. package/dist/gateway/server-methods/system.js +5 -7
  233. package/dist/gateway/server-methods-list.js +8 -0
  234. package/dist/gateway/server-methods.js +24 -8
  235. package/dist/gateway/server-node-events.js +278 -68
  236. package/dist/gateway/session-utils.fs.js +316 -75
  237. package/dist/gateway/session-utils.js +224 -70
  238. package/dist/gateway/sessions-patch.js +63 -20
  239. package/dist/gateway/test-temp-config.js +1 -1
  240. package/dist/gateway/tools-invoke-http.js +118 -70
  241. package/dist/gateway/ws-log.js +135 -107
  242. package/dist/hooks/frontmatter.js +36 -82
  243. package/dist/hooks/install.js +149 -139
  244. package/dist/hooks/internal-hooks.js +29 -4
  245. package/dist/hooks/plugin-hooks.js +2 -1
  246. package/dist/imessage/monitor/deliver.js +10 -4
  247. package/dist/imessage/monitor/monitor-provider.js +138 -375
  248. package/dist/imessage/monitor/runtime.js +4 -8
  249. package/dist/imessage/send.js +65 -19
  250. package/dist/infra/exec-approvals-allowlist.js +7 -0
  251. package/dist/infra/exec-approvals.js +35 -920
  252. package/dist/infra/exec-safe-bin-trust.js +64 -0
  253. package/dist/infra/heartbeat-runner.js +207 -134
  254. package/dist/infra/heartbeat-wake.js +183 -22
  255. package/dist/infra/install-source-utils.js +47 -0
  256. package/dist/infra/net/ssrf.js +170 -36
  257. package/dist/infra/outbound/deliver.js +224 -58
  258. package/dist/infra/outbound/message-action-spec.js +12 -5
  259. package/dist/infra/outbound/outbound-session.js +27 -25
  260. package/dist/infra/poolbot-root.js +32 -22
  261. package/dist/infra/ports.js +14 -11
  262. package/dist/infra/skills-remote.js +48 -37
  263. package/dist/infra/system-events.js +25 -11
  264. package/dist/infra/system-presence.js +26 -33
  265. package/dist/infra/tmp-poolbot-dir.js +81 -2
  266. package/dist/infra/wsl.js +37 -1
  267. package/dist/line/bot-message-context.js +163 -191
  268. package/dist/logging/subsystem.js +59 -22
  269. package/dist/markdown/ir.js +124 -50
  270. package/dist/media/store.js +1 -1
  271. package/dist/media-understanding/runner.entries.js +42 -25
  272. package/dist/media-understanding/runner.js +53 -488
  273. package/dist/memory/embeddings-gemini.js +53 -38
  274. package/dist/memory/manager-embedding-ops.js +48 -69
  275. package/dist/pairing/pairing-store.js +178 -119
  276. package/dist/plugin-sdk/index.js +34 -6
  277. package/dist/plugins/hooks.js +135 -14
  278. package/dist/plugins/install.js +190 -152
  279. package/dist/polls.js +11 -0
  280. package/dist/routing/resolve-route.js +190 -56
  281. package/dist/routing/session-key.js +38 -22
  282. package/dist/runtime.js +35 -9
  283. package/dist/security/audit-channel.js +1 -1
  284. package/dist/sessions/session-key-utils.js +29 -11
  285. package/dist/shared/frontmatter.js +5 -5
  286. package/dist/shared/node-list-types.js +1 -0
  287. package/dist/shared/string-normalization.js +15 -0
  288. package/dist/signal/monitor/event-handler.js +68 -36
  289. package/dist/signal/send.js +29 -37
  290. package/dist/slack/monitor/allow-list.js +10 -11
  291. package/dist/slack/monitor/commands.js +14 -3
  292. package/dist/slack/monitor/events/interactions.js +4 -4
  293. package/dist/slack/monitor/media.js +224 -16
  294. package/dist/slack/monitor/message-handler/dispatch.js +247 -13
  295. package/dist/slack/monitor/message-handler/prepare.js +128 -45
  296. package/dist/slack/monitor/slash.js +357 -144
  297. package/dist/slack/streaming.js +77 -0
  298. package/dist/telegram/accounts.js +40 -13
  299. package/dist/telegram/allowed-updates.js +3 -0
  300. package/dist/telegram/bot/delivery.js +129 -66
  301. package/dist/telegram/bot/helpers.js +136 -122
  302. package/dist/telegram/bot-handlers.js +600 -339
  303. package/dist/telegram/bot-message-context.js +115 -73
  304. package/dist/telegram/bot-message-dispatch.js +235 -104
  305. package/dist/telegram/bot-native-command-menu.js +3 -1
  306. package/dist/telegram/bot-native-commands.js +213 -193
  307. package/dist/telegram/bot.js +24 -132
  308. package/dist/telegram/draft-stream.js +84 -75
  309. package/dist/telegram/format.js +150 -6
  310. package/dist/telegram/send.js +415 -255
  311. package/dist/telegram/targets.js +21 -2
  312. package/dist/telegram/update-offset-store.js +19 -3
  313. package/dist/terminal/restore.js +5 -2
  314. package/dist/test-utils/fetch-mock.js +5 -0
  315. package/dist/version.js +18 -5
  316. package/dist/web/auto-reply/monitor/broadcast.js +7 -3
  317. package/dist/web/auto-reply/monitor/on-message.js +6 -3
  318. package/dist/web/inbound/media.js +34 -8
  319. package/dist/web/inbound/monitor.js +34 -17
  320. package/dist/web/inbound/send-api.js +18 -17
  321. package/dist/web/outbound.js +12 -5
  322. package/dist/wizard/clack-prompter.js +40 -7
  323. package/extensions/bluebubbles/package.json +1 -1
  324. package/extensions/copilot-proxy/package.json +1 -1
  325. package/extensions/diagnostics-otel/package.json +1 -1
  326. package/extensions/discord/package.json +1 -1
  327. package/extensions/feishu/package.json +1 -1
  328. package/extensions/google-antigravity-auth/package.json +1 -1
  329. package/extensions/google-gemini-cli-auth/package.json +1 -1
  330. package/extensions/googlechat/package.json +1 -1
  331. package/extensions/imessage/package.json +1 -1
  332. package/extensions/irc/package.json +1 -1
  333. package/extensions/line/package.json +1 -1
  334. package/extensions/llm-task/package.json +1 -1
  335. package/extensions/lobster/package.json +1 -1
  336. package/extensions/matrix/CHANGELOG.md +5 -0
  337. package/extensions/matrix/package.json +1 -1
  338. package/extensions/mattermost/package.json +1 -1
  339. package/extensions/memory-core/package.json +1 -1
  340. package/extensions/memory-lancedb/package.json +1 -1
  341. package/extensions/minimax-portal-auth/package.json +1 -1
  342. package/extensions/msteams/CHANGELOG.md +5 -0
  343. package/extensions/msteams/package.json +1 -1
  344. package/extensions/nextcloud-talk/package.json +1 -1
  345. package/extensions/nostr/CHANGELOG.md +5 -0
  346. package/extensions/nostr/package.json +1 -1
  347. package/extensions/open-prose/package.json +1 -1
  348. package/extensions/openai-codex-auth/package.json +1 -1
  349. package/extensions/signal/package.json +1 -1
  350. package/extensions/slack/package.json +1 -1
  351. package/extensions/telegram/package.json +1 -1
  352. package/extensions/tlon/package.json +1 -1
  353. package/extensions/twitch/CHANGELOG.md +5 -0
  354. package/extensions/twitch/package.json +1 -1
  355. package/extensions/voice-call/CHANGELOG.md +5 -0
  356. package/extensions/voice-call/package.json +1 -1
  357. package/extensions/whatsapp/package.json +1 -1
  358. package/extensions/zalo/CHANGELOG.md +5 -0
  359. package/extensions/zalo/package.json +1 -1
  360. package/extensions/zalouser/CHANGELOG.md +5 -0
  361. package/extensions/zalouser/package.json +1 -1
  362. package/package.json +1 -1
  363. package/skills/apple-reminders/SKILL.md +100 -49
  364. package/skills/coding-agent/SKILL.md +34 -28
  365. package/skills/github/SKILL.md +131 -16
  366. package/skills/imsg/SKILL.md +112 -15
  367. package/skills/openhue/SKILL.md +101 -19
  368. package/skills/tmux/SKILL.md +111 -79
  369. package/skills/weather/SKILL.md +88 -25
@@ -1,11 +1,13 @@
1
1
  import { EventEmitter } from "node:events";
2
2
  import { registerUnhandledRejectionHandler } from "../../infra/unhandled-rejections.js";
3
+ import { hasInterSessionUserProvenance, normalizeInputProvenance, } from "../../sessions/input-provenance.js";
4
+ import { resolveImageSanitizationLimits } from "../image-sanitization.js";
3
5
  import { downgradeOpenAIReasoningBlocks, isCompactionFailureError, isGoogleModelApi, sanitizeGoogleTurnOrdering, sanitizeSessionMessagesImages, } from "../pi-embedded-helpers.js";
4
- import { sanitizeToolUseResultPairing } from "../session-transcript-repair.js";
5
- import { log } from "./logger.js";
6
- import { describeUnknownError } from "./utils.js";
7
6
  import { cleanToolSchemaForGemini } from "../pi-tools.schema.js";
7
+ import { sanitizeToolCallInputs, stripToolResultDetails, sanitizeToolUseResultPairing, } from "../session-transcript-repair.js";
8
8
  import { resolveTranscriptPolicy } from "../transcript-policy.js";
9
+ import { log } from "./logger.js";
10
+ import { describeUnknownError } from "./utils.js";
9
11
  const GOOGLE_TURN_ORDERING_CUSTOM_TYPE = "google-turn-ordering-bootstrap";
10
12
  const GOOGLE_SCHEMA_UNSUPPORTED_KEYWORDS = new Set([
11
13
  "patternProperties",
@@ -30,17 +32,21 @@ const GOOGLE_SCHEMA_UNSUPPORTED_KEYWORDS = new Set([
30
32
  "maxProperties",
31
33
  ]);
32
34
  const ANTIGRAVITY_SIGNATURE_RE = /^[A-Za-z0-9+/]+={0,2}$/;
35
+ const INTER_SESSION_PREFIX_BASE = "[Inter-session message]";
33
36
  function isValidAntigravitySignature(value) {
34
- if (typeof value !== "string")
37
+ if (typeof value !== "string") {
35
38
  return false;
39
+ }
36
40
  const trimmed = value.trim();
37
- if (!trimmed)
41
+ if (!trimmed) {
38
42
  return false;
39
- if (trimmed.length % 4 !== 0)
43
+ }
44
+ if (trimmed.length % 4 !== 0) {
40
45
  return false;
46
+ }
41
47
  return ANTIGRAVITY_SIGNATURE_RE.test(trimmed);
42
48
  }
43
- function sanitizeAntigravityThinkingBlocks(messages) {
49
+ export function sanitizeAntigravityThinkingBlocks(messages) {
44
50
  let touched = false;
45
51
  const out = [];
46
52
  for (const msg of messages) {
@@ -91,9 +97,81 @@ function sanitizeAntigravityThinkingBlocks(messages) {
91
97
  }
92
98
  return touched ? out : messages;
93
99
  }
100
+ function buildInterSessionPrefix(message) {
101
+ const provenance = normalizeInputProvenance(message.provenance);
102
+ if (!provenance) {
103
+ return INTER_SESSION_PREFIX_BASE;
104
+ }
105
+ const details = [
106
+ provenance.sourceSessionKey ? `sourceSession=${provenance.sourceSessionKey}` : undefined,
107
+ provenance.sourceChannel ? `sourceChannel=${provenance.sourceChannel}` : undefined,
108
+ provenance.sourceTool ? `sourceTool=${provenance.sourceTool}` : undefined,
109
+ ].filter(Boolean);
110
+ if (details.length === 0) {
111
+ return INTER_SESSION_PREFIX_BASE;
112
+ }
113
+ return `${INTER_SESSION_PREFIX_BASE} ${details.join(" ")}`;
114
+ }
115
+ function annotateInterSessionUserMessages(messages) {
116
+ let touched = false;
117
+ const out = [];
118
+ for (const msg of messages) {
119
+ if (!hasInterSessionUserProvenance(msg)) {
120
+ out.push(msg);
121
+ continue;
122
+ }
123
+ const prefix = buildInterSessionPrefix(msg);
124
+ const user = msg;
125
+ if (typeof user.content === "string") {
126
+ if (user.content.startsWith(prefix)) {
127
+ out.push(msg);
128
+ continue;
129
+ }
130
+ touched = true;
131
+ out.push({
132
+ ...msg,
133
+ content: `${prefix}\n${user.content}`,
134
+ });
135
+ continue;
136
+ }
137
+ if (!Array.isArray(user.content)) {
138
+ out.push(msg);
139
+ continue;
140
+ }
141
+ const textIndex = user.content.findIndex((block) => block &&
142
+ typeof block === "object" &&
143
+ block.type === "text" &&
144
+ typeof block.text === "string");
145
+ if (textIndex >= 0) {
146
+ const existing = user.content[textIndex];
147
+ if (existing.text.startsWith(prefix)) {
148
+ out.push(msg);
149
+ continue;
150
+ }
151
+ const nextContent = [...user.content];
152
+ nextContent[textIndex] = {
153
+ ...existing,
154
+ text: `${prefix}\n${existing.text}`,
155
+ };
156
+ touched = true;
157
+ out.push({
158
+ ...msg,
159
+ content: nextContent,
160
+ });
161
+ continue;
162
+ }
163
+ touched = true;
164
+ out.push({
165
+ ...msg,
166
+ content: [{ type: "text", text: prefix }, ...user.content],
167
+ });
168
+ }
169
+ return touched ? out : messages;
170
+ }
94
171
  function findUnsupportedSchemaKeywords(schema, path) {
95
- if (!schema || typeof schema !== "object")
172
+ if (!schema || typeof schema !== "object") {
96
173
  return [];
174
+ }
97
175
  if (Array.isArray(schema)) {
98
176
  return schema.flatMap((item, index) => findUnsupportedSchemaKeywords(item, `${path}[${index}]`));
99
177
  }
@@ -108,8 +186,9 @@ function findUnsupportedSchemaKeywords(schema, path) {
108
186
  }
109
187
  }
110
188
  for (const [key, value] of Object.entries(record)) {
111
- if (key === "properties")
189
+ if (key === "properties") {
112
190
  continue;
191
+ }
113
192
  if (GOOGLE_SCHEMA_UNSUPPORTED_KEYWORDS.has(key)) {
114
193
  violations.push(`${path}.${key}`);
115
194
  }
@@ -120,12 +199,17 @@ function findUnsupportedSchemaKeywords(schema, path) {
120
199
  return violations;
121
200
  }
122
201
  export function sanitizeToolsForGoogle(params) {
123
- if (params.provider !== "google-antigravity" && params.provider !== "google-gemini-cli") {
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") {
124
207
  return params.tools;
125
208
  }
126
209
  return params.tools.map((tool) => {
127
- if (!tool.parameters || typeof tool.parameters !== "object")
210
+ if (!tool.parameters || typeof tool.parameters !== "object") {
128
211
  return tool;
212
+ }
129
213
  return {
130
214
  ...tool,
131
215
  parameters: cleanToolSchemaForGemini(tool.parameters),
@@ -170,8 +254,9 @@ export function onUnhandledCompactionFailure(cb) {
170
254
  }
171
255
  registerUnhandledRejectionHandler((reason) => {
172
256
  const message = describeUnknownError(reason);
173
- if (!isCompactionFailureError(message))
257
+ if (!isCompactionFailureError(message)) {
174
258
  return false;
259
+ }
175
260
  log.error(`Auto-compaction failed (unhandled): ${message}`);
176
261
  compactionFailureEmitter.emit("failure", message);
177
262
  return true;
@@ -182,8 +267,9 @@ function readLastModelSnapshot(sessionManager) {
182
267
  const entries = sessionManager.getEntries();
183
268
  for (let i = entries.length - 1; i >= 0; i--) {
184
269
  const entry = entries[i];
185
- if (entry?.type !== "custom" || entry?.customType !== MODEL_SNAPSHOT_CUSTOM_TYPE)
270
+ if (entry?.type !== "custom" || entry?.customType !== MODEL_SNAPSHOT_CUSTOM_TYPE) {
186
271
  continue;
272
+ }
187
273
  const data = entry?.data;
188
274
  if (data && typeof data === "object") {
189
275
  return data;
@@ -255,19 +341,23 @@ export async function sanitizeSessionHistory(params) {
255
341
  provider: params.provider,
256
342
  modelId: params.modelId,
257
343
  });
258
- const sanitizedImages = await sanitizeSessionMessagesImages(params.messages, "session:history", {
344
+ const withInterSessionMarkers = annotateInterSessionUserMessages(params.messages);
345
+ const sanitizedImages = await sanitizeSessionMessagesImages(withInterSessionMarkers, "session:history", {
259
346
  sanitizeMode: policy.sanitizeMode,
260
347
  sanitizeToolCallIds: policy.sanitizeToolCallIds,
261
348
  toolCallIdMode: policy.toolCallIdMode,
262
349
  preserveSignatures: policy.preserveSignatures,
263
350
  sanitizeThoughtSignatures: policy.sanitizeThoughtSignatures,
351
+ ...resolveImageSanitizationLimits(params.config),
264
352
  });
265
353
  const sanitizedThinking = policy.normalizeAntigravityThinkingBlocks
266
354
  ? sanitizeAntigravityThinkingBlocks(sanitizedImages)
267
355
  : sanitizedImages;
356
+ const sanitizedToolCalls = sanitizeToolCallInputs(sanitizedThinking);
268
357
  const repairedTools = policy.repairToolUseResultPairing
269
- ? sanitizeToolUseResultPairing(sanitizedThinking)
270
- : sanitizedThinking;
358
+ ? sanitizeToolUseResultPairing(sanitizedToolCalls)
359
+ : sanitizedToolCalls;
360
+ const sanitizedToolResults = stripToolResultDetails(repairedTools);
271
361
  const isOpenAIResponsesApi = params.modelApi === "openai-responses" || params.modelApi === "openai-codex-responses";
272
362
  const hasSnapshot = Boolean(params.provider || params.modelApi || params.modelId);
273
363
  const priorSnapshot = hasSnapshot ? readLastModelSnapshot(params.sessionManager) : null;
@@ -279,9 +369,9 @@ export async function sanitizeSessionHistory(params) {
279
369
  modelId: params.modelId,
280
370
  })
281
371
  : false;
282
- const sanitizedOpenAI = isOpenAIResponsesApi && modelChanged
283
- ? downgradeOpenAIReasoningBlocks(repairedTools)
284
- : repairedTools;
372
+ const sanitizedOpenAI = isOpenAIResponsesApi
373
+ ? downgradeOpenAIReasoningBlocks(sanitizedToolResults)
374
+ : sanitizedToolResults;
285
375
  if (hasSnapshot && (!priorSnapshot || modelChanged)) {
286
376
  appendModelSnapshot(params.sessionManager, {
287
377
  timestamp: Date.now(),
@@ -8,8 +8,9 @@ function stripThreadSuffix(value) {
8
8
  * assistant responses). This reduces token usage for long-running DM sessions.
9
9
  */
10
10
  export function limitHistoryTurns(messages, limit) {
11
- if (!limit || limit <= 0 || messages.length === 0)
11
+ if (!limit || limit <= 0 || messages.length === 0) {
12
12
  return messages;
13
+ }
13
14
  let userCount = 0;
14
15
  let lastUserIndex = messages.length;
15
16
  for (let i = messages.length - 1; i >= 0; i--) {
@@ -26,36 +27,53 @@ export function limitHistoryTurns(messages, limit) {
26
27
  /**
27
28
  * Extract provider + user ID from a session key and look up dmHistoryLimit.
28
29
  * Supports per-DM overrides and provider defaults.
30
+ * For channel/group sessions, uses historyLimit from provider config.
29
31
  */
30
- export function getDmHistoryLimitFromSessionKey(sessionKey, config) {
31
- if (!sessionKey || !config)
32
+ export function getHistoryLimitFromSessionKey(sessionKey, config) {
33
+ if (!sessionKey || !config) {
32
34
  return undefined;
35
+ }
33
36
  const parts = sessionKey.split(":").filter(Boolean);
34
37
  const providerParts = parts.length >= 3 && parts[0] === "agent" ? parts.slice(2) : parts;
35
38
  const provider = providerParts[0]?.toLowerCase();
36
- if (!provider)
39
+ if (!provider) {
37
40
  return undefined;
41
+ }
38
42
  const kind = providerParts[1]?.toLowerCase();
39
43
  const userIdRaw = providerParts.slice(2).join(":");
40
44
  const userId = stripThreadSuffix(userIdRaw);
41
- if (kind !== "dm")
42
- return undefined;
43
- const getLimit = (providerConfig) => {
44
- if (!providerConfig)
45
- return undefined;
46
- if (userId && providerConfig.dms?.[userId]?.historyLimit !== undefined) {
47
- return providerConfig.dms[userId].historyLimit;
48
- }
49
- return providerConfig.dmHistoryLimit;
50
- };
51
45
  const resolveProviderConfig = (cfg, providerId) => {
52
46
  const channels = cfg?.channels;
53
- if (!channels || typeof channels !== "object")
47
+ if (!channels || typeof channels !== "object") {
54
48
  return undefined;
49
+ }
55
50
  const entry = channels[providerId];
56
- if (!entry || typeof entry !== "object" || Array.isArray(entry))
51
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
57
52
  return undefined;
53
+ }
58
54
  return entry;
59
55
  };
60
- return getLimit(resolveProviderConfig(config, provider));
56
+ const providerConfig = resolveProviderConfig(config, provider);
57
+ if (!providerConfig) {
58
+ return undefined;
59
+ }
60
+ // For DM sessions: per-DM override -> dmHistoryLimit.
61
+ // Accept both "direct" (new) and "dm" (legacy) for backward compat.
62
+ if (kind === "dm" || kind === "direct") {
63
+ if (userId && providerConfig.dms?.[userId]?.historyLimit !== undefined) {
64
+ return providerConfig.dms[userId].historyLimit;
65
+ }
66
+ return providerConfig.dmHistoryLimit;
67
+ }
68
+ // For channel/group sessions: use historyLimit from provider config
69
+ // This prevents context overflow in long-running channel sessions
70
+ if (kind === "channel" || kind === "group") {
71
+ return providerConfig.historyLimit;
72
+ }
73
+ return undefined;
61
74
  }
75
+ /**
76
+ * @deprecated Use getHistoryLimitFromSessionKey instead.
77
+ * Alias for backward compatibility.
78
+ */
79
+ export const getDmHistoryLimitFromSessionKey = getHistoryLimitFromSessionKey;