@poolzin/pool-bot 2026.1.39 → 2026.2.1

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 (511) hide show
  1. package/assets/chrome-extension/README.md +3 -3
  2. package/assets/chrome-extension/background.js +5 -5
  3. package/assets/chrome-extension/manifest.json +3 -3
  4. package/assets/chrome-extension/options.html +4 -4
  5. package/assets/chrome-extension/options.js +1 -1
  6. package/dist/acp/client.js +3 -3
  7. package/dist/acp/types.js +1 -1
  8. package/dist/agents/agent-paths.js +3 -3
  9. package/dist/agents/auth-profiles/paths.js +3 -3
  10. package/dist/agents/bash-tools.exec.js +76 -25
  11. package/dist/agents/cli-runner/helpers.js +10 -12
  12. package/dist/agents/cli-runner.js +2 -2
  13. package/dist/agents/cloudflare-ai-gateway.js +31 -0
  14. package/dist/agents/compaction.js +16 -2
  15. package/dist/agents/context-window-guard.js +13 -10
  16. package/dist/agents/context.js +4 -4
  17. package/dist/agents/docs-path.js +1 -1
  18. package/dist/agents/identity.js +47 -7
  19. package/dist/agents/memory-search.js +25 -8
  20. package/dist/agents/minimax-vlm.js +1 -1
  21. package/dist/agents/model-auth.js +12 -1
  22. package/dist/agents/model-catalog.js +4 -4
  23. package/dist/agents/model-selection.js +31 -4
  24. package/dist/agents/models-config.js +3 -3
  25. package/dist/agents/models-config.providers.js +147 -39
  26. package/dist/agents/pi-embedded-block-chunker.js +117 -42
  27. package/dist/agents/pi-embedded-helpers/errors.js +183 -78
  28. package/dist/agents/pi-embedded-helpers/openai.js +1 -1
  29. package/dist/agents/pi-embedded-helpers.js +1 -1
  30. package/dist/agents/pi-embedded-runner/compact.js +9 -8
  31. package/dist/agents/pi-embedded-runner/model.js +63 -4
  32. package/dist/agents/pi-embedded-runner/run/attempt.js +27 -17
  33. package/dist/agents/pi-embedded-runner/run.js +203 -50
  34. package/dist/agents/pi-embedded-runner/system-prompt.js +10 -2
  35. package/dist/agents/pi-embedded-runner/tool-result-truncation.js +275 -0
  36. package/dist/agents/pi-embedded-runner/utils.js +1 -1
  37. package/dist/agents/pi-embedded-subscribe.js +118 -29
  38. package/dist/agents/pi-model-discovery.js +10 -0
  39. package/dist/agents/pi-tool-definition-adapter.js +50 -9
  40. package/dist/agents/pi-tools.before-tool-call.js +67 -0
  41. package/dist/agents/pi-tools.js +20 -10
  42. package/dist/agents/pi-tools.read.js +2 -2
  43. package/dist/agents/poolbot-tools.js +15 -10
  44. package/dist/agents/sandbox-paths.js +31 -0
  45. package/dist/agents/session-file-repair.js +83 -0
  46. package/dist/agents/session-tool-result-guard.js +94 -15
  47. package/dist/agents/session-transcript-repair.js +68 -0
  48. package/dist/agents/shell-utils.js +51 -0
  49. package/dist/agents/skills/bundled-context.js +23 -0
  50. package/dist/agents/skills/bundled-dir.js +41 -7
  51. package/dist/agents/skills/frontmatter.js +1 -1
  52. package/dist/agents/skills/workspace.js +2 -2
  53. package/dist/agents/skills-install.js +60 -23
  54. package/dist/agents/subagent-announce.js +79 -34
  55. package/dist/agents/system-prompt.js +28 -4
  56. package/dist/agents/together-models.js +127 -0
  57. package/dist/agents/tool-images.js +1 -1
  58. package/dist/agents/tool-policy.conformance.js +14 -0
  59. package/dist/agents/tool-policy.js +25 -1
  60. package/dist/agents/tools/browser-tool.js +3 -3
  61. package/dist/agents/tools/cron-tool.js +166 -19
  62. package/dist/agents/tools/discord-actions-presence.js +78 -0
  63. package/dist/agents/tools/image-tool.js +2 -2
  64. package/dist/agents/tools/memory-tool.js +93 -5
  65. package/dist/agents/tools/message-tool.js +56 -2
  66. package/dist/agents/tools/sessions-history-tool.js +69 -1
  67. package/dist/agents/tools/web-search.js +211 -42
  68. package/dist/agents/usage.js +23 -1
  69. package/dist/agents/workspace-run.js +67 -0
  70. package/dist/agents/workspace-templates.js +44 -0
  71. package/dist/auto-reply/command-auth.js +121 -6
  72. package/dist/auto-reply/commands-registry.data.js +1 -1
  73. package/dist/auto-reply/envelope.js +50 -72
  74. package/dist/auto-reply/reply/commands-compact.js +1 -0
  75. package/dist/auto-reply/reply/commands-context-report.js +3 -2
  76. package/dist/auto-reply/reply/commands-context.js +1 -0
  77. package/dist/auto-reply/reply/commands-models.js +107 -60
  78. package/dist/auto-reply/reply/commands-ptt.js +171 -0
  79. package/dist/auto-reply/reply/commands-session.js +2 -2
  80. package/dist/auto-reply/reply/get-reply-run.js +16 -5
  81. package/dist/auto-reply/reply/groups.js +1 -1
  82. package/dist/auto-reply/reply/inbound-context.js +9 -1
  83. package/dist/auto-reply/reply/inbound-meta.js +130 -0
  84. package/dist/auto-reply/reply/model-selection.js +3 -3
  85. package/dist/auto-reply/reply/untrusted-context.js +15 -0
  86. package/dist/auto-reply/status.js +1 -1
  87. package/dist/auto-reply/thinking.js +88 -43
  88. package/dist/browser/bridge-server.js +13 -0
  89. package/dist/browser/cdp.helpers.js +38 -24
  90. package/dist/browser/client-fetch.js +51 -8
  91. package/dist/browser/config.js +2 -11
  92. package/dist/browser/extension-relay.js +104 -43
  93. package/dist/browser/pw-ai.js +1 -1
  94. package/dist/browser/pw-session.js +143 -8
  95. package/dist/browser/pw-tools-core.interactions.js +125 -27
  96. package/dist/browser/pw-tools-core.responses.js +1 -1
  97. package/dist/browser/pw-tools-core.state.js +1 -1
  98. package/dist/browser/routes/agent.act.js +86 -41
  99. package/dist/browser/routes/dispatcher.js +4 -4
  100. package/dist/browser/screenshot.js +1 -1
  101. package/dist/browser/server-context.js +2 -2
  102. package/dist/browser/server.js +13 -0
  103. package/dist/build-info.json +3 -3
  104. package/dist/canvas-host/a2ui.js +3 -3
  105. package/dist/channels/plugins/catalog.js +2 -2
  106. package/dist/channels/plugins/onboarding/imessage.js +1 -1
  107. package/dist/channels/plugins/onboarding/signal.js +1 -1
  108. package/dist/channels/plugins/onboarding/slack.js +4 -4
  109. package/dist/channels/plugins/onboarding/whatsapp.js +3 -3
  110. package/dist/channels/plugins/pairing-message.js +1 -1
  111. package/dist/channels/reply-prefix.js +8 -1
  112. package/dist/cli/browser-cli-extension.js +2 -2
  113. package/dist/cli/cron-cli/register.cron-add.js +61 -40
  114. package/dist/cli/cron-cli/register.cron-edit.js +60 -34
  115. package/dist/cli/cron-cli/shared.js +56 -41
  116. package/dist/cli/dns-cli.js +26 -14
  117. package/dist/cli/docs-cli.js +1 -1
  118. package/dist/cli/gateway-cli/dev.js +1 -1
  119. package/dist/cli/gateway-cli/register.js +37 -19
  120. package/dist/cli/memory-cli.js +30 -20
  121. package/dist/cli/nodes-cli/register.canvas.js +1 -1
  122. package/dist/cli/parse-bytes.js +37 -0
  123. package/dist/cli/plugins-cli.js +1 -1
  124. package/dist/cli/run-main.js +2 -2
  125. package/dist/cli/security-cli.js +1 -1
  126. package/dist/cli/tagline.js +1 -1
  127. package/dist/cli/update-cli.js +173 -52
  128. package/dist/cli/webhooks-cli.js +5 -5
  129. package/dist/commands/agent.js +1 -0
  130. package/dist/commands/agents.commands.add.js +1 -1
  131. package/dist/commands/auth-choice.apply.api-providers.js +305 -17
  132. package/dist/commands/auth-choice.apply.js +4 -1
  133. package/dist/commands/auth-choice.apply.plugin-provider.js +2 -2
  134. package/dist/commands/auth-choice.apply.xai.js +63 -0
  135. package/dist/commands/auth-choice.preferred-provider.js +7 -1
  136. package/dist/commands/configure.wizard.js +1 -1
  137. package/dist/commands/dashboard.js +1 -1
  138. package/dist/commands/docs.js +1 -1
  139. package/dist/commands/doctor-config-flow.js +61 -5
  140. package/dist/commands/doctor-gateway-services.js +3 -3
  141. package/dist/commands/doctor-state-migrations.js +1 -1
  142. package/dist/commands/doctor-update.js +3 -3
  143. package/dist/commands/doctor.js +1 -1
  144. package/dist/commands/health.js +1 -1
  145. package/dist/commands/model-allowlist.js +29 -0
  146. package/dist/commands/model-picker.js +2 -1
  147. package/dist/commands/models/list.probe.js +2 -2
  148. package/dist/commands/models/list.registry.js +4 -4
  149. package/dist/commands/models/list.status-command.js +44 -24
  150. package/dist/commands/models/shared.js +15 -0
  151. package/dist/commands/onboard-auth.config-core.js +366 -28
  152. package/dist/commands/onboard-auth.credentials.js +71 -9
  153. package/dist/commands/onboard-auth.js +3 -3
  154. package/dist/commands/onboard-auth.models.js +26 -24
  155. package/dist/commands/onboard-custom.js +384 -0
  156. package/dist/commands/onboard-non-interactive/local/auth-choice-inference.js +35 -0
  157. package/dist/commands/onboard-non-interactive/local/auth-choice.js +146 -9
  158. package/dist/commands/onboard-skills.js +63 -38
  159. package/dist/commands/openai-model-default.js +41 -0
  160. package/dist/commands/status-all/report-lines.js +1 -1
  161. package/dist/commands/status.command.js +1 -1
  162. package/dist/commands/uninstall.js +3 -3
  163. package/dist/compat/legacy-names.js +1 -1
  164. package/dist/config/defaults.js +3 -2
  165. package/dist/config/io.js +3 -3
  166. package/dist/config/paths.js +136 -35
  167. package/dist/config/plugin-auto-enable.js +21 -5
  168. package/dist/config/redact-snapshot.js +153 -0
  169. package/dist/config/schema.field-metadata.js +590 -0
  170. package/dist/config/schema.js +3 -3
  171. package/dist/config/sessions/store.js +291 -23
  172. package/dist/config/types.memory.js +1 -0
  173. package/dist/config/version.js +4 -4
  174. package/dist/config/zod-schema.agent-defaults.js +3 -0
  175. package/dist/config/zod-schema.agent-runtime.js +13 -2
  176. package/dist/config/zod-schema.providers-core.js +142 -0
  177. package/dist/config/zod-schema.session.js +3 -0
  178. package/dist/cron/delivery.js +57 -0
  179. package/dist/cron/isolated-agent/delivery-target.js +18 -3
  180. package/dist/cron/isolated-agent/helpers.js +22 -5
  181. package/dist/cron/isolated-agent/run.js +171 -63
  182. package/dist/cron/isolated-agent/session.js +2 -0
  183. package/dist/cron/normalize.js +356 -28
  184. package/dist/cron/parse.js +10 -5
  185. package/dist/cron/run-log.js +35 -10
  186. package/dist/cron/schedule.js +41 -6
  187. package/dist/cron/service/jobs.js +208 -35
  188. package/dist/cron/service/ops.js +72 -16
  189. package/dist/cron/service/state.js +2 -0
  190. package/dist/cron/service/store.js +386 -14
  191. package/dist/cron/service/timer.js +390 -147
  192. package/dist/cron/session-reaper.js +86 -0
  193. package/dist/cron/store.js +23 -8
  194. package/dist/cron/validate-timestamp.js +43 -0
  195. package/dist/daemon/constants.js +7 -7
  196. package/dist/daemon/inspect.js +6 -6
  197. package/dist/daemon/systemd-unit.js +1 -1
  198. package/dist/discord/monitor/agent-components.js +438 -0
  199. package/dist/discord/monitor/allow-list.js +28 -5
  200. package/dist/discord/monitor/gateway-registry.js +29 -0
  201. package/dist/discord/monitor/native-command.js +44 -23
  202. package/dist/discord/monitor/sender-identity.js +45 -0
  203. package/dist/discord/pluralkit.js +27 -0
  204. package/dist/discord/send.outbound.js +92 -5
  205. package/dist/discord/send.shared.js +60 -23
  206. package/dist/discord/targets.js +84 -1
  207. package/dist/entry.js +15 -9
  208. package/dist/extensionAPI.js +8 -0
  209. package/dist/gateway/control-ui.js +8 -1
  210. package/dist/gateway/hooks-mapping.js +3 -0
  211. package/dist/gateway/hooks.js +65 -0
  212. package/dist/gateway/live-image-probe.js +1 -66
  213. package/dist/gateway/net.js +96 -31
  214. package/dist/gateway/node-command-policy.js +50 -15
  215. package/dist/gateway/openai-http.js +2 -2
  216. package/dist/gateway/openresponses-http.js +4 -4
  217. package/dist/gateway/origin-check.js +56 -0
  218. package/dist/gateway/protocol/client-info.js +9 -0
  219. package/dist/gateway/protocol/index.js +9 -2
  220. package/dist/gateway/protocol/schema/agents-models-skills.js +71 -1
  221. package/dist/gateway/protocol/schema/cron.js +22 -10
  222. package/dist/gateway/protocol/schema/protocol-schemas.js +16 -2
  223. package/dist/gateway/protocol/schema/sessions.js +12 -0
  224. package/dist/gateway/server/hooks.js +1 -1
  225. package/dist/gateway/server-broadcast.js +26 -9
  226. package/dist/gateway/server-chat.js +112 -23
  227. package/dist/gateway/server-discovery-runtime.js +10 -2
  228. package/dist/gateway/server-discovery.js +2 -2
  229. package/dist/gateway/server-http.js +110 -12
  230. package/dist/gateway/server-methods/agent-timestamp.js +60 -0
  231. package/dist/gateway/server-methods/agents.js +321 -2
  232. package/dist/gateway/server-methods/usage.js +559 -16
  233. package/dist/gateway/server-runtime-state.js +22 -8
  234. package/dist/gateway/server-startup-memory.js +16 -0
  235. package/dist/gateway/server.impl.js +7 -3
  236. package/dist/gateway/session-utils.fs.js +23 -25
  237. package/dist/gateway/session-utils.js +20 -10
  238. package/dist/gateway/sessions-patch.js +7 -22
  239. package/dist/gateway/test-helpers.server.js +35 -2
  240. package/dist/hooks/frontmatter.js +1 -1
  241. package/dist/hooks/hooks-status.js +1 -1
  242. package/dist/hooks/install.js +2 -2
  243. package/dist/hooks/loader.js +1 -1
  244. package/dist/hooks/workspace.js +3 -3
  245. package/dist/imessage/constants.js +2 -0
  246. package/dist/imessage/monitor/deliver.js +4 -1
  247. package/dist/imessage/monitor/monitor-provider.js +51 -1
  248. package/dist/index.js +2 -2
  249. package/dist/infra/bonjour-discovery.js +131 -70
  250. package/dist/infra/bonjour.js +3 -3
  251. package/dist/infra/control-ui-assets.js +134 -12
  252. package/dist/infra/errors.js +12 -0
  253. package/dist/infra/exec-approvals.js +266 -57
  254. package/dist/infra/format-time/format-datetime.js +79 -0
  255. package/dist/infra/format-time/format-duration.js +81 -0
  256. package/dist/infra/format-time/format-relative.js +80 -0
  257. package/dist/infra/heartbeat-runner.js +140 -49
  258. package/dist/infra/home-dir.js +54 -0
  259. package/dist/infra/net/fetch-guard.js +122 -0
  260. package/dist/infra/net/ssrf.js +65 -29
  261. package/dist/infra/outbound/abort.js +14 -0
  262. package/dist/infra/outbound/message-action-runner.js +77 -13
  263. package/dist/infra/outbound/outbound-session.js +143 -37
  264. package/dist/infra/path-env.js +3 -3
  265. package/dist/infra/poolbot-root.js +43 -1
  266. package/dist/infra/provider-usage.fetch.minimax.js +1 -1
  267. package/dist/infra/restart.js +1 -1
  268. package/dist/infra/session-cost-usage.js +631 -41
  269. package/dist/infra/state-migrations.js +317 -47
  270. package/dist/infra/tailscale.js +1 -1
  271. package/dist/infra/update-global.js +35 -0
  272. package/dist/infra/update-runner.js +149 -43
  273. package/dist/infra/warning-filter.js +65 -0
  274. package/dist/infra/widearea-dns.js +30 -9
  275. package/dist/logging/redact-identifier.js +12 -0
  276. package/dist/macos/relay.js +2 -2
  277. package/dist/media/fetch.js +81 -58
  278. package/dist/media/input-files.js +1 -1
  279. package/dist/media/mime.js +4 -0
  280. package/dist/media/png-encode.js +74 -0
  281. package/dist/media-understanding/apply.js +403 -3
  282. package/dist/media-understanding/attachments.js +38 -27
  283. package/dist/media-understanding/defaults.js +16 -0
  284. package/dist/media-understanding/providers/deepgram/audio.js +22 -14
  285. package/dist/media-understanding/providers/google/audio.js +24 -17
  286. package/dist/media-understanding/providers/google/video.js +24 -17
  287. package/dist/media-understanding/providers/image.js +4 -4
  288. package/dist/media-understanding/providers/index.js +4 -1
  289. package/dist/media-understanding/providers/openai/audio.js +22 -14
  290. package/dist/media-understanding/providers/shared.js +16 -11
  291. package/dist/media-understanding/providers/zai/index.js +6 -0
  292. package/dist/media-understanding/runner.js +158 -90
  293. package/dist/memory/backend-config.js +207 -0
  294. package/dist/memory/batch-voyage.js +277 -0
  295. package/dist/memory/embeddings-voyage.js +75 -0
  296. package/dist/memory/embeddings.js +29 -17
  297. package/dist/memory/internal.js +101 -18
  298. package/dist/memory/manager.js +155 -48
  299. package/dist/memory/search-manager.js +173 -0
  300. package/dist/memory/session-files.js +9 -3
  301. package/dist/memory/types.js +1 -0
  302. package/dist/node-host/runner.js +36 -26
  303. package/dist/node-host/with-timeout.js +27 -0
  304. package/dist/pairing/pairing-messages.js +1 -1
  305. package/dist/plugins/commands.js +5 -1
  306. package/dist/plugins/config-state.js +86 -7
  307. package/dist/plugins/discovery.js +1 -1
  308. package/dist/plugins/install.js +2 -2
  309. package/dist/plugins/source-display.js +51 -0
  310. package/dist/plugins/update.js +1 -1
  311. package/dist/process/exec.js +20 -2
  312. package/dist/routing/resolve-route.js +12 -0
  313. package/dist/routing/session-key.js +15 -0
  314. package/dist/runtime.js +2 -0
  315. package/dist/security/audit-extra.async.js +601 -0
  316. package/dist/security/audit-extra.js +2 -830
  317. package/dist/security/audit-extra.sync.js +505 -0
  318. package/dist/security/audit.js +2 -2
  319. package/dist/security/channel-metadata.js +34 -0
  320. package/dist/security/external-content.js +88 -6
  321. package/dist/security/skill-scanner.js +330 -0
  322. package/dist/sessions/session-key-utils.js +7 -0
  323. package/dist/shared/text/reasoning-tags.js +52 -7
  324. package/dist/signal/monitor/event-handler.js +80 -1
  325. package/dist/slack/monitor/media.js +85 -15
  326. package/dist/tailscale/detect.js +145 -0
  327. package/dist/telegram/bot/helpers.js +109 -28
  328. package/dist/telegram/bot-handlers.js +144 -3
  329. package/dist/telegram/bot-message-context.js +38 -11
  330. package/dist/telegram/bot-message-dispatch.js +48 -15
  331. package/dist/telegram/bot-native-commands.js +86 -29
  332. package/dist/telegram/bot.js +30 -29
  333. package/dist/telegram/model-buttons.js +163 -0
  334. package/dist/telegram/monitor.js +110 -85
  335. package/dist/telegram/send.js +129 -47
  336. package/dist/terminal/restore.js +45 -0
  337. package/dist/test-helpers/state-dir-env.js +16 -0
  338. package/dist/test-helpers/workspace.js +11 -0
  339. package/dist/test-utils/channel-plugins.js +82 -0
  340. package/dist/test-utils/ports.js +73 -0
  341. package/dist/tts/tts.js +12 -6
  342. package/dist/tui/tui-session-actions.js +166 -54
  343. package/dist/utils/fetch-timeout.js +20 -0
  344. package/dist/utils/normalize-secret-input.js +19 -0
  345. package/dist/utils/shell-argv.js +61 -0
  346. package/dist/utils/transcript-tools.js +58 -0
  347. package/dist/utils.js +55 -14
  348. package/dist/version.js +42 -5
  349. package/dist/web/qr-image.js +1 -61
  350. package/dist/wizard/onboarding.finalize.js +7 -7
  351. package/dist/wizard/onboarding.js +3 -3
  352. package/docs/RELEASE_WORKFOTS_COMPARISON.md +3 -3
  353. package/docs/_config.yml +2 -2
  354. package/docs/_layouts/default.html +9 -9
  355. package/docs/concepts/typebox.md +1 -1
  356. package/docs/docs.json +1 -1
  357. package/docs/northflank.mdx +7 -7
  358. package/docs/railway.mdx +3 -3
  359. package/docs/render.mdx +5 -5
  360. package/docs/start/lore.md +2 -2
  361. package/extensions/bluebubbles/index.ts +2 -2
  362. package/extensions/bluebubbles/package.json +1 -1
  363. package/extensions/bluebubbles/src/accounts.ts +8 -8
  364. package/extensions/bluebubbles/src/actions.test.ts +22 -22
  365. package/extensions/bluebubbles/src/actions.ts +5 -5
  366. package/extensions/bluebubbles/src/attachments.ts +2 -2
  367. package/extensions/bluebubbles/src/channel.ts +16 -16
  368. package/extensions/bluebubbles/src/chat.ts +2 -2
  369. package/extensions/bluebubbles/src/media-send.ts +2 -2
  370. package/extensions/bluebubbles/src/monitor.test.ts +46 -46
  371. package/extensions/bluebubbles/src/monitor.ts +5 -5
  372. package/extensions/bluebubbles/src/onboarding.ts +7 -7
  373. package/extensions/bluebubbles/src/reactions.ts +2 -2
  374. package/extensions/bluebubbles/src/send.ts +2 -2
  375. package/extensions/copilot-proxy/README.md +1 -1
  376. package/extensions/copilot-proxy/package.json +1 -1
  377. package/extensions/diagnostics-otel/index.ts +2 -2
  378. package/extensions/diagnostics-otel/package.json +1 -1
  379. package/extensions/diagnostics-otel/src/service.ts +3 -3
  380. package/extensions/discord/index.ts +2 -2
  381. package/extensions/discord/package.json +1 -1
  382. package/extensions/google-antigravity-auth/README.md +1 -1
  383. package/extensions/google-antigravity-auth/index.ts +1 -1
  384. package/extensions/google-antigravity-auth/package.json +1 -1
  385. package/extensions/google-gemini-cli-auth/README.md +1 -1
  386. package/extensions/google-gemini-cli-auth/oauth.ts +1 -1
  387. package/extensions/google-gemini-cli-auth/package.json +1 -1
  388. package/extensions/googlechat/index.ts +3 -3
  389. package/extensions/googlechat/package.json +1 -1
  390. package/extensions/googlechat/src/accounts.ts +8 -8
  391. package/extensions/googlechat/src/actions.ts +6 -6
  392. package/extensions/googlechat/src/channel.ts +21 -21
  393. package/extensions/googlechat/src/monitor.ts +8 -8
  394. package/extensions/googlechat/src/onboarding.ts +10 -10
  395. package/extensions/imessage/index.ts +2 -2
  396. package/extensions/imessage/package.json +1 -1
  397. package/extensions/line/index.ts +2 -2
  398. package/extensions/line/package.json +1 -1
  399. package/extensions/line/src/card-command.ts +2 -2
  400. package/extensions/line/src/channel.logout.test.ts +4 -4
  401. package/extensions/line/src/channel.sendPayload.test.ts +8 -8
  402. package/extensions/line/src/channel.ts +3 -3
  403. package/extensions/llm-task/README.md +3 -3
  404. package/extensions/llm-task/index.ts +2 -2
  405. package/extensions/llm-task/package.json +1 -1
  406. package/extensions/llm-task/src/llm-task-tool.ts +4 -4
  407. package/extensions/lobster/README.md +6 -6
  408. package/extensions/lobster/index.ts +2 -2
  409. package/extensions/lobster/src/lobster-tool.test.ts +4 -4
  410. package/extensions/lobster/src/lobster-tool.ts +2 -2
  411. package/extensions/matrix/index.ts +2 -2
  412. package/extensions/matrix/package.json +1 -1
  413. package/extensions/matrix/src/matrix/client/config.ts +1 -1
  414. package/extensions/matrix/src/matrix/monitor/handler.ts +1 -1
  415. package/extensions/matrix/src/onboarding.ts +1 -1
  416. package/extensions/mattermost/index.ts +2 -2
  417. package/extensions/mattermost/package.json +1 -1
  418. package/extensions/mattermost/src/mattermost/accounts.ts +8 -8
  419. package/extensions/mattermost/src/mattermost/monitor-helpers.ts +5 -5
  420. package/extensions/mattermost/src/mattermost/monitor.ts +2 -2
  421. package/extensions/mattermost/src/onboarding-helpers.ts +3 -3
  422. package/extensions/mattermost/src/onboarding.ts +2 -2
  423. package/extensions/memory-core/index.ts +2 -2
  424. package/extensions/memory-core/package.json +1 -1
  425. package/extensions/memory-lancedb/index.ts +3 -3
  426. package/extensions/memory-lancedb/package.json +1 -1
  427. package/extensions/msteams/index.ts +2 -2
  428. package/extensions/msteams/package.json +1 -1
  429. package/extensions/msteams/src/channel.directory.test.ts +2 -2
  430. package/extensions/msteams/src/channel.ts +2 -2
  431. package/extensions/msteams/src/graph-upload.ts +4 -4
  432. package/extensions/msteams/src/monitor-handler.ts +2 -2
  433. package/extensions/msteams/src/monitor.ts +2 -2
  434. package/extensions/msteams/src/onboarding.ts +9 -9
  435. package/extensions/msteams/src/reply-dispatcher.ts +2 -2
  436. package/extensions/msteams/src/send-context.ts +2 -2
  437. package/extensions/msteams/src/send.ts +4 -4
  438. package/extensions/nextcloud-talk/index.ts +2 -2
  439. package/extensions/nextcloud-talk/package.json +1 -1
  440. package/extensions/nextcloud-talk/src/channel.ts +7 -7
  441. package/extensions/nextcloud-talk/src/inbound.ts +7 -7
  442. package/extensions/nextcloud-talk/src/onboarding.ts +1 -1
  443. package/extensions/nostr/README.md +2 -2
  444. package/extensions/nostr/index.ts +5 -5
  445. package/extensions/nostr/package.json +1 -1
  446. package/extensions/nostr/src/types.ts +4 -4
  447. package/extensions/open-prose/index.ts +2 -2
  448. package/extensions/qwen-portal-auth/README.md +1 -1
  449. package/extensions/signal/index.ts +2 -2
  450. package/extensions/signal/package.json +1 -1
  451. package/extensions/slack/index.ts +2 -2
  452. package/extensions/slack/package.json +1 -1
  453. package/extensions/telegram/index.ts +2 -2
  454. package/extensions/telegram/package.json +1 -1
  455. package/extensions/telegram/src/channel.ts +2 -2
  456. package/extensions/tlon/README.md +2 -2
  457. package/extensions/tlon/index.ts +2 -2
  458. package/extensions/tlon/package.json +1 -1
  459. package/extensions/tlon/src/channel.ts +13 -13
  460. package/extensions/tlon/src/monitor/index.ts +3 -3
  461. package/extensions/tlon/src/onboarding.ts +3 -3
  462. package/extensions/tlon/src/types.ts +3 -3
  463. package/extensions/twitch/README.md +1 -1
  464. package/extensions/twitch/index.ts +2 -2
  465. package/extensions/twitch/package.json +1 -1
  466. package/extensions/twitch/src/config.ts +3 -3
  467. package/extensions/twitch/src/monitor.ts +3 -3
  468. package/extensions/twitch/src/onboarding.ts +9 -9
  469. package/extensions/twitch/src/outbound.test.ts +2 -2
  470. package/extensions/twitch/src/plugin.test.ts +2 -2
  471. package/extensions/twitch/src/plugin.ts +8 -8
  472. package/extensions/twitch/src/send.test.ts +2 -2
  473. package/extensions/twitch/src/send.ts +4 -4
  474. package/extensions/twitch/src/token.test.ts +8 -8
  475. package/extensions/twitch/src/token.ts +3 -3
  476. package/extensions/twitch/src/twitch-client.ts +3 -3
  477. package/extensions/twitch/src/types.ts +3 -3
  478. package/extensions/twitch/src/utils/markdown.ts +1 -1
  479. package/extensions/voice-call/README.md +3 -3
  480. package/extensions/voice-call/package.json +1 -1
  481. package/extensions/voice-call/src/core-bridge.ts +2 -2
  482. package/extensions/voice-call/src/response-generator.ts +1 -1
  483. package/extensions/whatsapp/index.ts +2 -2
  484. package/extensions/whatsapp/package.json +1 -1
  485. package/extensions/zalo/README.md +1 -1
  486. package/extensions/zalo/index.ts +2 -2
  487. package/extensions/zalo/package.json +1 -1
  488. package/extensions/zalo/src/accounts.ts +8 -8
  489. package/extensions/zalo/src/actions.ts +4 -4
  490. package/extensions/zalo/src/channel.directory.test.ts +2 -2
  491. package/extensions/zalo/src/channel.ts +18 -18
  492. package/extensions/zalo/src/monitor.ts +9 -9
  493. package/extensions/zalo/src/monitor.webhook.test.ts +2 -2
  494. package/extensions/zalo/src/onboarding.ts +24 -24
  495. package/extensions/zalo/src/send.ts +2 -2
  496. package/extensions/zalouser/README.md +2 -2
  497. package/extensions/zalouser/index.ts +2 -2
  498. package/extensions/zalouser/package.json +1 -1
  499. package/extensions/zalouser/src/accounts.ts +9 -9
  500. package/extensions/zalouser/src/channel.ts +24 -24
  501. package/extensions/zalouser/src/monitor.ts +4 -4
  502. package/extensions/zalouser/src/onboarding.ts +28 -28
  503. package/package.json +13 -251
  504. package/skills/nano-banana-pro/scripts/generate_image.py +1 -1
  505. package/skills/tmux/scripts/find-sessions.sh +1 -1
  506. package/CHANGELOG.md +0 -102
  507. package/README-header.png +0 -0
  508. package/git-hooks/pre-commit +0 -4
  509. package/scripts/format-staged.js +0 -148
  510. package/scripts/postinstall.js +0 -300
  511. package/scripts/setup-git-hooks.js +0 -96
@@ -1,5 +1,5 @@
1
1
  import { discoverAuthStorage, discoverModels } from "@mariozechner/pi-coding-agent";
2
- import { resolveMoltbotAgentDir } from "../agent-paths.js";
2
+ import { resolvePoolbotAgentDir } from "../agent-paths.js";
3
3
  import { DEFAULT_CONTEXT_TOKENS } from "../defaults.js";
4
4
  import { normalizeModelCompat } from "../model-compat.js";
5
5
  import { normalizeProviderId } from "../model-selection.js";
@@ -8,7 +8,12 @@ export function buildInlineProviderModels(providers) {
8
8
  const trimmed = providerId.trim();
9
9
  if (!trimmed)
10
10
  return [];
11
- return (entry?.models ?? []).map((model) => ({ ...model, provider: trimmed }));
11
+ return (entry?.models ?? []).map((model) => ({
12
+ ...model,
13
+ provider: trimmed,
14
+ baseUrl: entry?.baseUrl,
15
+ ...(entry?.api && !model.api ? { api: entry.api } : {}),
16
+ }));
12
17
  });
13
18
  }
14
19
  export function buildModelAliasLines(cfg) {
@@ -24,15 +29,68 @@ export function buildModelAliasLines(cfg) {
24
29
  entries.push({ alias, model });
25
30
  }
26
31
  return entries
27
- .sort((a, b) => a.alias.localeCompare(b.alias))
32
+ .toSorted((a, b) => a.alias.localeCompare(b.alias))
28
33
  .map((entry) => `- ${entry.alias}: ${entry.model}`);
29
34
  }
35
+ // Well-known model IDs for forward-compatible resolution
36
+ export const OPENAI_CODEX_GPT_53_MODEL_ID = "codex-gpt-5.3";
37
+ export const OPENAI_CODEX_TEMPLATE_MODEL_IDS = ["codex-mini-*"];
38
+ export const ANTHROPIC_OPUS_46_MODEL_ID = "claude-opus-4-0624";
39
+ export const ANTHROPIC_OPUS_46_DOT_MODEL_ID = "claude-opus-4.6";
40
+ export const ANTHROPIC_OPUS_TEMPLATE_MODEL_IDS = ["claude-opus-4-*", "claude-opus-4.*"];
41
+ /**
42
+ * Resolve forward-compat fallback for OpenAI codex-gpt-5.3 requests.
43
+ * If the exact model is not in the registry, try `codex-mini-*` template matches.
44
+ */
45
+ export function resolveOpenAICodexGpt53FallbackModel(modelRegistry, provider) {
46
+ for (const templateId of OPENAI_CODEX_TEMPLATE_MODEL_IDS) {
47
+ const match = modelRegistry.find(provider, templateId);
48
+ if (match)
49
+ return match;
50
+ }
51
+ return null;
52
+ }
53
+ /**
54
+ * Resolve forward-compat fallback for Anthropic claude-opus-4.6 requests.
55
+ * If the exact model is not in the registry, try `claude-opus-4-*` template matches.
56
+ */
57
+ export function resolveAnthropicOpus46ForwardCompatModel(modelRegistry, provider, modelId) {
58
+ if (modelId !== ANTHROPIC_OPUS_46_MODEL_ID && modelId !== ANTHROPIC_OPUS_46_DOT_MODEL_ID) {
59
+ return null;
60
+ }
61
+ for (const templateId of ANTHROPIC_OPUS_TEMPLATE_MODEL_IDS) {
62
+ const match = modelRegistry.find(provider, templateId);
63
+ if (match)
64
+ return match;
65
+ }
66
+ return null;
67
+ }
30
68
  export function resolveModel(provider, modelId, agentDir, cfg) {
31
- const resolvedAgentDir = agentDir ?? resolveMoltbotAgentDir();
69
+ const resolvedAgentDir = agentDir ?? resolvePoolbotAgentDir();
32
70
  const authStorage = discoverAuthStorage(resolvedAgentDir);
33
71
  const modelRegistry = discoverModels(authStorage, resolvedAgentDir);
34
72
  const model = modelRegistry.find(provider, modelId);
35
73
  if (!model) {
74
+ // Try codex forward-compat fallback
75
+ if (modelId === OPENAI_CODEX_GPT_53_MODEL_ID) {
76
+ const codexFallback = resolveOpenAICodexGpt53FallbackModel(modelRegistry, provider);
77
+ if (codexFallback) {
78
+ return {
79
+ model: normalizeModelCompat(codexFallback),
80
+ authStorage,
81
+ modelRegistry,
82
+ };
83
+ }
84
+ }
85
+ // Try Anthropic opus forward-compat fallback
86
+ const opusFallback = resolveAnthropicOpus46ForwardCompatModel(modelRegistry, provider, modelId);
87
+ if (opusFallback) {
88
+ return {
89
+ model: normalizeModelCompat(opusFallback),
90
+ authStorage,
91
+ modelRegistry,
92
+ };
93
+ }
36
94
  const providers = cfg?.models?.providers ?? {};
37
95
  const inlineModels = buildInlineProviderModels(providers);
38
96
  const normalizedProvider = normalizeProviderId(provider);
@@ -57,6 +115,7 @@ export function resolveModel(provider, modelId, agentDir, cfg) {
57
115
  cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
58
116
  contextWindow: providerCfg?.models?.[0]?.contextWindow ?? DEFAULT_CONTEXT_TOKENS,
59
117
  maxTokens: providerCfg?.models?.[0]?.maxTokens ?? DEFAULT_CONTEXT_TOKENS,
118
+ baseUrl: providerCfg?.baseUrl,
60
119
  });
61
120
  return { model: fallbackModel, authStorage, modelRegistry };
62
121
  }
@@ -15,15 +15,16 @@ import { isSubagentSessionKey } from "../../../routing/session-key.js";
15
15
  import { resolveUserPath } from "../../../utils.js";
16
16
  import { createCacheTrace } from "../../cache-trace.js";
17
17
  import { createAnthropicPayloadLogger } from "../../anthropic-payload-log.js";
18
- import { resolveMoltbotAgentDir } from "../../agent-paths.js";
18
+ import { resolvePoolbotAgentDir } from "../../agent-paths.js";
19
19
  import { resolveSessionAgentIds } from "../../agent-scope.js";
20
20
  import { makeBootstrapWarn, resolveBootstrapContextForRun } from "../../bootstrap-files.js";
21
- import { resolveMoltbotDocsPath } from "../../docs-path.js";
21
+ import { resolvePoolbotDocsPath } from "../../docs-path.js";
22
22
  import { resolveModelAuthMode } from "../../model-auth.js";
23
23
  import { isCloudCodeAssistFormatError, resolveBootstrapMaxChars, validateAnthropicTurns, validateGeminiTurns, } from "../../pi-embedded-helpers.js";
24
24
  import { subscribeEmbeddedPiSession } from "../../pi-embedded-subscribe.js";
25
25
  import { ensurePiCompactionReserveTokens, resolveCompactionReserveTokensFloor, } from "../../pi-settings.js";
26
- import { createMoltbotCodingTools } from "../../pi-tools.js";
26
+ import { createPoolbotCodingTools } from "../../pi-tools.js";
27
+ import { repairSessionFileIfNeeded } from "../../session-file-repair.js";
27
28
  import { resolveSandboxContext } from "../../sandbox.js";
28
29
  import { guardSessionManager } from "../../session-tool-result-guard-wrapper.js";
29
30
  import { resolveTranscriptPolicy } from "../../transcript-policy.js";
@@ -44,10 +45,11 @@ import { clearActiveEmbeddedRun, setActiveEmbeddedRun, } from "../runs.js";
44
45
  import { buildEmbeddedSandboxInfo } from "../sandbox-info.js";
45
46
  import { prewarmSessionFile, trackSessionManagerAccess } from "../session-manager-cache.js";
46
47
  import { prepareSessionManagerForRun } from "../session-manager-init.js";
47
- import { buildEmbeddedSystemPrompt, createSystemPromptOverride } from "../system-prompt.js";
48
+ import { applySystemPromptOverrideToSession, buildEmbeddedSystemPrompt, createSystemPromptOverride, } from "../system-prompt.js";
48
49
  import { splitSdkTools } from "../tool-split.js";
49
50
  import { toClientToolDefinitions } from "../../pi-tool-definition-adapter.js";
50
51
  import { buildSystemPromptParams } from "../../system-prompt-params.js";
52
+ import { detectRuntimeShell } from "../../shell-utils.js";
51
53
  import { describeUnknownError, mapThinkingLevel } from "../utils.js";
52
54
  import { resolveSandboxRuntimeStatus } from "../../sandbox/runtime-status.js";
53
55
  import { buildTtsSystemPromptHint } from "../../../tts/tts.js";
@@ -141,12 +143,12 @@ export async function runEmbeddedAttempt(params) {
141
143
  const workspaceNotes = hookAdjustedBootstrapFiles.some((file) => file.name === DEFAULT_BOOTSTRAP_FILENAME && !file.missing)
142
144
  ? ["Reminder: commit your changes in this workspace after edits."]
143
145
  : undefined;
144
- const agentDir = params.agentDir ?? resolveMoltbotAgentDir();
146
+ const agentDir = params.agentDir ?? resolvePoolbotAgentDir();
145
147
  // Check if the model supports native image input
146
148
  const modelHasVision = params.model.input?.includes("image") ?? false;
147
149
  const toolsRaw = params.disableTools
148
150
  ? []
149
- : createMoltbotCodingTools({
151
+ : createPoolbotCodingTools({
150
152
  exec: {
151
153
  ...params.execOverrides,
152
154
  elevated: params.bashElevated,
@@ -164,6 +166,7 @@ export async function runEmbeddedAttempt(params) {
164
166
  senderName: params.senderName,
165
167
  senderUsername: params.senderUsername,
166
168
  senderE164: params.senderE164,
169
+ senderIsOwner: params.senderIsOwner,
167
170
  sessionKey: params.sessionKey ?? params.sessionId,
168
171
  agentDir,
169
172
  workspaceDir: effectiveWorkspace,
@@ -177,6 +180,8 @@ export async function runEmbeddedAttempt(params) {
177
180
  replyToMode: params.replyToMode,
178
181
  hasRepliedRef: params.hasRepliedRef,
179
182
  modelHasVision,
183
+ requireExplicitMessageTarget: params.requireExplicitMessageTarget ?? isSubagentSessionKey(params.sessionKey),
184
+ disableMessageTool: params.disableMessageTool,
180
185
  });
181
186
  const tools = sanitizeToolsForGoogle({ tools: toolsRaw, provider: params.provider });
182
187
  logToolSchemasForGoogle({ tools, provider: params.provider });
@@ -263,11 +268,12 @@ export async function runEmbeddedAttempt(params) {
263
268
  channel: runtimeChannel,
264
269
  capabilities: runtimeCapabilities,
265
270
  channelActions,
271
+ shell: detectRuntimeShell(),
266
272
  },
267
273
  });
268
274
  const isDefaultAgent = sessionAgentId === defaultAgentId;
269
275
  const promptMode = isSubagentSessionKey(params.sessionKey) ? "minimal" : "full";
270
- const docsPath = await resolveMoltbotDocsPath({
276
+ const docsPath = await resolvePoolbotDocsPath({
271
277
  workspaceDir: effectiveWorkspace,
272
278
  argv1: process.argv[1],
273
279
  cwd: process.cwd(),
@@ -299,6 +305,7 @@ export async function runEmbeddedAttempt(params) {
299
305
  userTime,
300
306
  userTimeFormat,
301
307
  contextFiles,
308
+ memoryCitationsMode: params.config?.memory?.citations,
302
309
  });
303
310
  const systemPromptReport = buildSystemPromptReport({
304
311
  source: "run",
@@ -322,13 +329,18 @@ export async function runEmbeddedAttempt(params) {
322
329
  skillsPrompt,
323
330
  tools,
324
331
  });
325
- const systemPrompt = createSystemPromptOverride(appendPrompt);
332
+ const systemPromptOverride = createSystemPromptOverride(appendPrompt);
333
+ const systemPromptText = systemPromptOverride();
326
334
  const sessionLock = await acquireSessionWriteLock({
327
335
  sessionFile: params.sessionFile,
328
336
  });
329
337
  let sessionManager;
330
338
  let session;
331
339
  try {
340
+ await repairSessionFileIfNeeded({
341
+ sessionFile: params.sessionFile,
342
+ warn: (message) => log.warn(message),
343
+ });
332
344
  const hadSessionFile = await fs
333
345
  .stat(params.sessionFile)
334
346
  .then(() => true)
@@ -357,7 +369,7 @@ export async function runEmbeddedAttempt(params) {
357
369
  settingsManager,
358
370
  minReserveTokens: resolveCompactionReserveTokensFloor(params.config),
359
371
  });
360
- const additionalExtensionPaths = buildEmbeddedExtensionPaths({
372
+ buildEmbeddedExtensionPaths({
361
373
  cfg: params.config,
362
374
  sessionManager,
363
375
  provider: params.provider,
@@ -373,7 +385,7 @@ export async function runEmbeddedAttempt(params) {
373
385
  const clientToolDefs = params.clientTools
374
386
  ? toClientToolDefinitions(params.clientTools, (toolName, toolParams) => {
375
387
  clientToolCallDetected = { name: toolName, params: toolParams };
376
- })
388
+ }, { agentId: sessionAgentId, sessionKey: params.sessionKey })
377
389
  : [];
378
390
  const allCustomTools = [...customTools, ...clientToolDefs];
379
391
  ({ session } = await createAgentSession({
@@ -383,15 +395,12 @@ export async function runEmbeddedAttempt(params) {
383
395
  modelRegistry: params.modelRegistry,
384
396
  model: params.model,
385
397
  thinkingLevel: mapThinkingLevel(params.thinkLevel),
386
- systemPrompt,
387
398
  tools: builtInTools,
388
399
  customTools: allCustomTools,
389
400
  sessionManager,
390
401
  settingsManager,
391
- skills: [],
392
- contextFiles: [],
393
- additionalExtensionPaths,
394
402
  }));
403
+ applySystemPromptOverrideToSession(session, systemPromptText);
395
404
  if (!session) {
396
405
  throw new Error("Embedded agent session missing");
397
406
  }
@@ -423,7 +432,7 @@ export async function runEmbeddedAttempt(params) {
423
432
  if (cacheTrace) {
424
433
  cacheTrace.recordStage("session:loaded", {
425
434
  messages: activeSession.messages,
426
- system: systemPrompt,
435
+ system: systemPromptText,
427
436
  note: "after session create",
428
437
  });
429
438
  activeSession.agent.streamFn = cacheTrace.wrapStreamFn(activeSession.agent.streamFn);
@@ -570,6 +579,7 @@ export async function runEmbeddedAttempt(params) {
570
579
  }
571
580
  // Get hook runner once for both before_agent_start and agent_end hooks
572
581
  const hookRunner = getGlobalHookRunner();
582
+ const hookAgentId = sessionAgentId;
573
583
  let promptError = null;
574
584
  try {
575
585
  const promptStartedAt = Date.now();
@@ -581,7 +591,7 @@ export async function runEmbeddedAttempt(params) {
581
591
  prompt: params.prompt,
582
592
  messages: activeSession.messages,
583
593
  }, {
584
- agentId: params.sessionKey?.split(":")[0] ?? "main",
594
+ agentId: hookAgentId,
585
595
  sessionKey: params.sessionKey,
586
596
  workspaceDir: params.workspaceDir,
587
597
  messageProvider: params.messageProvider ?? undefined,
@@ -694,7 +704,7 @@ export async function runEmbeddedAttempt(params) {
694
704
  error: promptError ? describeUnknownError(promptError) : undefined,
695
705
  durationMs: Date.now() - promptStartedAt,
696
706
  }, {
697
- agentId: params.sessionKey?.split(":")[0] ?? "main",
707
+ agentId: hookAgentId,
698
708
  sessionKey: params.sessionKey,
699
709
  workspaceDir: params.workspaceDir,
700
710
  messageProvider: params.messageProvider ?? undefined,
@@ -1,23 +1,24 @@
1
1
  import fs from "node:fs/promises";
2
2
  import { enqueueCommandInLane } from "../../process/command-queue.js";
3
- import { resolveUserPath } from "../../utils.js";
4
3
  import { isMarkdownCapableMessageChannel } from "../../utils/message-channel.js";
5
- import { resolveMoltbotAgentDir } from "../agent-paths.js";
4
+ import { resolvePoolbotAgentDir } from "../agent-paths.js";
6
5
  import { isProfileInCooldown, markAuthProfileFailure, markAuthProfileGood, markAuthProfileUsed, } from "../auth-profiles.js";
7
6
  import { CONTEXT_WINDOW_HARD_MIN_TOKENS, CONTEXT_WINDOW_WARN_BELOW_TOKENS, evaluateContextWindowGuard, resolveContextWindowInfo, } from "../context-window-guard.js";
8
7
  import { DEFAULT_CONTEXT_TOKENS, DEFAULT_MODEL, DEFAULT_PROVIDER } from "../defaults.js";
9
8
  import { FailoverError, resolveFailoverStatus } from "../failover-error.js";
10
9
  import { ensureAuthProfileStore, getApiKeyForModel, resolveAuthProfileOrder, } from "../model-auth.js";
11
10
  import { normalizeProviderId } from "../model-selection.js";
12
- import { ensureMoltbotModelsJson } from "../models-config.js";
13
- import { classifyFailoverReason, formatAssistantErrorText, isAuthAssistantError, isCompactionFailureError, isContextOverflowError, isFailoverAssistantError, isFailoverErrorMessage, parseImageDimensionError, isRateLimitAssistantError, isTimeoutErrorMessage, pickFallbackThinkingLevel, } from "../pi-embedded-helpers.js";
11
+ import { ensurePoolbotModelsJson } from "../models-config.js";
12
+ import { BILLING_ERROR_USER_MESSAGE, classifyFailoverReason, formatAssistantErrorText, isAuthAssistantError, isBillingAssistantError, isCompactionFailureError, isContextOverflowError, isFailoverAssistantError, isFailoverErrorMessage, parseImageSizeError, parseImageDimensionError, isRateLimitAssistantError, isTimeoutErrorMessage, pickFallbackThinkingLevel, } from "../pi-embedded-helpers.js";
14
13
  import { normalizeUsage } from "../usage.js";
14
+ import { redactRunIdentifier, resolveRunWorkspaceDir } from "../workspace-run.js";
15
15
  import { compactEmbeddedPiSessionDirect } from "./compact.js";
16
16
  import { resolveGlobalLane, resolveSessionLane } from "./lanes.js";
17
17
  import { log } from "./logger.js";
18
18
  import { resolveModel } from "./model.js";
19
19
  import { runEmbeddedAttempt } from "./run/attempt.js";
20
20
  import { buildEmbeddedRunPayloads } from "./run/payloads.js";
21
+ import { truncateOversizedToolResultsInSession, sessionLikelyHasOversizedToolResults, } from "./tool-result-truncation.js";
21
22
  import { describeUnknownError } from "./utils.js";
22
23
  // Avoid Anthropic's refusal test token poisoning session transcripts.
23
24
  const ANTHROPIC_MAGIC_STRING_TRIGGER_REFUSAL = "ANTHROPIC_MAGIC_STRING_TRIGGER_REFUSAL";
@@ -27,6 +28,45 @@ function scrubAnthropicRefusalMagic(prompt) {
27
28
  return prompt;
28
29
  return prompt.replaceAll(ANTHROPIC_MAGIC_STRING_TRIGGER_REFUSAL, ANTHROPIC_MAGIC_STRING_REPLACEMENT);
29
30
  }
31
+ const createUsageAccumulator = () => ({
32
+ input: 0,
33
+ output: 0,
34
+ cacheRead: 0,
35
+ cacheWrite: 0,
36
+ total: 0,
37
+ });
38
+ const hasUsageValues = (usage) => !!usage &&
39
+ [usage.input, usage.output, usage.cacheRead, usage.cacheWrite, usage.total].some((value) => typeof value === "number" && Number.isFinite(value) && value > 0);
40
+ const mergeUsageIntoAccumulator = (target, usage) => {
41
+ if (!hasUsageValues(usage)) {
42
+ return;
43
+ }
44
+ target.input += usage.input ?? 0;
45
+ target.output += usage.output ?? 0;
46
+ target.cacheRead += usage.cacheRead ?? 0;
47
+ target.cacheWrite += usage.cacheWrite ?? 0;
48
+ target.total +=
49
+ usage.total ??
50
+ (usage.input ?? 0) + (usage.output ?? 0) + (usage.cacheRead ?? 0) + (usage.cacheWrite ?? 0);
51
+ };
52
+ const toNormalizedUsage = (usage) => {
53
+ const hasUsage = usage.input > 0 ||
54
+ usage.output > 0 ||
55
+ usage.cacheRead > 0 ||
56
+ usage.cacheWrite > 0 ||
57
+ usage.total > 0;
58
+ if (!hasUsage) {
59
+ return undefined;
60
+ }
61
+ const derivedTotal = usage.input + usage.output + usage.cacheRead + usage.cacheWrite;
62
+ return {
63
+ input: usage.input || undefined,
64
+ output: usage.output || undefined,
65
+ cacheRead: usage.cacheRead || undefined,
66
+ cacheWrite: usage.cacheWrite || undefined,
67
+ total: usage.total || derivedTotal || undefined,
68
+ };
69
+ };
30
70
  export async function runEmbeddedPiAgent(params) {
31
71
  const sessionLane = resolveSessionLane(params.sessionKey?.trim() || params.sessionId);
32
72
  const globalLane = resolveGlobalLane(params.lane);
@@ -42,13 +82,24 @@ export async function runEmbeddedPiAgent(params) {
42
82
  const isProbeSession = params.sessionId?.startsWith("probe-") ?? false;
43
83
  return enqueueSession(() => enqueueGlobal(async () => {
44
84
  const started = Date.now();
45
- const resolvedWorkspace = resolveUserPath(params.workspaceDir);
85
+ const workspaceResolution = resolveRunWorkspaceDir({
86
+ workspaceDir: params.workspaceDir,
87
+ sessionKey: params.sessionKey,
88
+ config: params.config,
89
+ });
90
+ const resolvedWorkspace = workspaceResolution.workspaceDir;
91
+ const redactedSessionId = redactRunIdentifier(params.sessionId);
92
+ const redactedSessionKey = redactRunIdentifier(params.sessionKey);
93
+ const redactedWorkspace = redactRunIdentifier(resolvedWorkspace);
94
+ if (workspaceResolution.usedFallback) {
95
+ log.warn(`[workspace-fallback] caller=runEmbeddedPiAgent reason=${workspaceResolution.fallbackReason} run=${params.runId} session=${redactedSessionId} sessionKey=${redactedSessionKey} agent=${workspaceResolution.agentId} workspace=${redactedWorkspace}`);
96
+ }
46
97
  const prevCwd = process.cwd();
47
98
  const provider = (params.provider ?? DEFAULT_PROVIDER).trim() || DEFAULT_PROVIDER;
48
99
  const modelId = (params.model ?? DEFAULT_MODEL).trim() || DEFAULT_MODEL;
49
- const agentDir = params.agentDir ?? resolveMoltbotAgentDir();
100
+ const agentDir = params.agentDir ?? resolvePoolbotAgentDir();
50
101
  const fallbackConfigured = (params.config?.agents?.defaults?.model?.fallbacks?.length ?? 0) > 0;
51
- await ensureMoltbotModelsJson(params.config, agentDir);
102
+ await ensurePoolbotModelsJson(params.config, agentDir);
52
103
  const { model, error, authStorage, modelRegistry } = resolveModel(provider, modelId, agentDir, params.config);
53
104
  if (!model) {
54
105
  throw new Error(error ?? `Unknown model: ${provider}/${modelId}`);
@@ -213,7 +264,11 @@ export async function runEmbeddedPiAgent(params) {
213
264
  throwAuthProfileFailover({ allInCooldown: false, error: err });
214
265
  }
215
266
  }
216
- let overflowCompactionAttempted = false;
267
+ const MAX_OVERFLOW_COMPACTION_ATTEMPTS = 3;
268
+ let overflowCompactionAttempts = 0;
269
+ let toolResultTruncationAttempted = false;
270
+ const usageAccumulator = createUsageAccumulator();
271
+ let autoCompactionCount = 0;
217
272
  try {
218
273
  while (true) {
219
274
  attemptedThinking.add(thinkLevel);
@@ -231,12 +286,13 @@ export async function runEmbeddedPiAgent(params) {
231
286
  groupChannel: params.groupChannel,
232
287
  groupSpace: params.groupSpace,
233
288
  spawnedBy: params.spawnedBy,
289
+ senderIsOwner: params.senderIsOwner,
234
290
  currentChannelId: params.currentChannelId,
235
291
  currentThreadTs: params.currentThreadTs,
236
292
  replyToMode: params.replyToMode,
237
293
  hasRepliedRef: params.hasRepliedRef,
238
294
  sessionFile: params.sessionFile,
239
- workspaceDir: params.workspaceDir,
295
+ workspaceDir: resolvedWorkspace,
240
296
  agentDir,
241
297
  config: params.config,
242
298
  skillsSnapshot: params.skillsSnapshot,
@@ -274,46 +330,135 @@ export async function runEmbeddedPiAgent(params) {
274
330
  enforceFinalTag: params.enforceFinalTag,
275
331
  });
276
332
  const { aborted, promptError, timedOut, sessionIdUsed, lastAssistant } = attempt;
277
- if (promptError && !aborted) {
278
- const errorText = describeUnknownError(promptError);
279
- if (isContextOverflowError(errorText)) {
280
- const isCompactionFailure = isCompactionFailureError(errorText);
281
- // Attempt auto-compaction on context overflow (not compaction_failure)
282
- if (!isCompactionFailure && !overflowCompactionAttempted) {
283
- log.warn(`context overflow detected; attempting auto-compaction for ${provider}/${modelId}`);
284
- overflowCompactionAttempted = true;
285
- const compactResult = await compactEmbeddedPiSessionDirect({
333
+ mergeUsageIntoAccumulator(usageAccumulator, attempt.attemptUsage ?? normalizeUsage(lastAssistant?.usage));
334
+ autoCompactionCount += Math.max(0, attempt.compactionCount ?? 0);
335
+ const formattedAssistantErrorText = lastAssistant
336
+ ? formatAssistantErrorText(lastAssistant, {
337
+ cfg: params.config,
338
+ sessionKey: params.sessionKey ?? params.sessionId,
339
+ })
340
+ : undefined;
341
+ const assistantErrorText = lastAssistant?.stopReason === "error"
342
+ ? lastAssistant.errorMessage?.trim() || formattedAssistantErrorText
343
+ : undefined;
344
+ const contextOverflowError = !aborted
345
+ ? (() => {
346
+ if (promptError) {
347
+ const errorText = describeUnknownError(promptError);
348
+ if (isContextOverflowError(errorText)) {
349
+ return { text: errorText, source: "promptError" };
350
+ }
351
+ // Prompt submission failed with a non-overflow error. Do not
352
+ // inspect prior assistant errors from history for this attempt.
353
+ return null;
354
+ }
355
+ if (assistantErrorText && isContextOverflowError(assistantErrorText)) {
356
+ return { text: assistantErrorText, source: "assistantError" };
357
+ }
358
+ return null;
359
+ })()
360
+ : null;
361
+ if (contextOverflowError) {
362
+ const errorText = contextOverflowError.text;
363
+ const msgCount = attempt.messagesSnapshot?.length ?? 0;
364
+ log.warn(`[context-overflow-diag] sessionKey=${params.sessionKey ?? params.sessionId} ` +
365
+ `provider=${provider}/${modelId} source=${contextOverflowError.source} ` +
366
+ `messages=${msgCount} sessionFile=${params.sessionFile} ` +
367
+ `compactionAttempts=${overflowCompactionAttempts} error=${errorText.slice(0, 200)}`);
368
+ const isCompactionFailure = isCompactionFailureError(errorText);
369
+ // Attempt auto-compaction on context overflow (not compaction_failure)
370
+ if (!isCompactionFailure &&
371
+ overflowCompactionAttempts < MAX_OVERFLOW_COMPACTION_ATTEMPTS) {
372
+ overflowCompactionAttempts++;
373
+ log.warn(`context overflow detected (attempt ${overflowCompactionAttempts}/${MAX_OVERFLOW_COMPACTION_ATTEMPTS}); attempting auto-compaction for ${provider}/${modelId}`);
374
+ const compactResult = await compactEmbeddedPiSessionDirect({
375
+ sessionId: params.sessionId,
376
+ sessionKey: params.sessionKey,
377
+ messageChannel: params.messageChannel,
378
+ messageProvider: params.messageProvider,
379
+ agentAccountId: params.agentAccountId,
380
+ authProfileId: lastProfileId,
381
+ sessionFile: params.sessionFile,
382
+ workspaceDir: resolvedWorkspace,
383
+ agentDir,
384
+ config: params.config,
385
+ skillsSnapshot: params.skillsSnapshot,
386
+ senderIsOwner: params.senderIsOwner,
387
+ provider,
388
+ model: modelId,
389
+ thinkLevel,
390
+ reasoningLevel: params.reasoningLevel,
391
+ bashElevated: params.bashElevated,
392
+ extraSystemPrompt: params.extraSystemPrompt,
393
+ ownerNumbers: params.ownerNumbers,
394
+ });
395
+ if (compactResult.compacted) {
396
+ autoCompactionCount += 1;
397
+ log.info(`auto-compaction succeeded for ${provider}/${modelId}; retrying prompt`);
398
+ continue;
399
+ }
400
+ log.warn(`auto-compaction failed for ${provider}/${modelId}: ${compactResult.reason ?? "nothing to compact"}`);
401
+ }
402
+ // Fallback: try truncating oversized tool results in the session.
403
+ // This handles the case where a single tool result exceeds the
404
+ // context window and compaction cannot reduce it further.
405
+ if (!toolResultTruncationAttempted) {
406
+ const contextWindowTokens = ctxInfo.tokens;
407
+ const hasOversized = attempt.messagesSnapshot
408
+ ? sessionLikelyHasOversizedToolResults({
409
+ messages: attempt.messagesSnapshot,
410
+ contextWindowTokens,
411
+ })
412
+ : false;
413
+ if (hasOversized) {
414
+ toolResultTruncationAttempted = true;
415
+ log.warn(`[context-overflow-recovery] Attempting tool result truncation for ${provider}/${modelId} ` +
416
+ `(contextWindow=${contextWindowTokens} tokens)`);
417
+ const truncResult = await truncateOversizedToolResultsInSession({
418
+ sessionFile: params.sessionFile,
419
+ contextWindowTokens,
286
420
  sessionId: params.sessionId,
287
421
  sessionKey: params.sessionKey,
288
- messageChannel: params.messageChannel,
289
- messageProvider: params.messageProvider,
290
- agentAccountId: params.agentAccountId,
291
- authProfileId: lastProfileId,
292
- sessionFile: params.sessionFile,
293
- workspaceDir: params.workspaceDir,
294
- agentDir,
295
- config: params.config,
296
- skillsSnapshot: params.skillsSnapshot,
297
- provider,
298
- model: modelId,
299
- thinkLevel,
300
- reasoningLevel: params.reasoningLevel,
301
- bashElevated: params.bashElevated,
302
- extraSystemPrompt: params.extraSystemPrompt,
303
- ownerNumbers: params.ownerNumbers,
304
422
  });
305
- if (compactResult.compacted) {
306
- log.info(`auto-compaction succeeded for ${provider}/${modelId}; retrying prompt`);
423
+ if (truncResult.truncated) {
424
+ log.info(`[context-overflow-recovery] Truncated ${truncResult.truncatedCount} tool result(s); retrying prompt`);
425
+ // Session is now smaller; allow compaction retries again.
426
+ overflowCompactionAttempts = 0;
307
427
  continue;
308
428
  }
309
- log.warn(`auto-compaction failed for ${provider}/${modelId}: ${compactResult.reason ?? "nothing to compact"}`);
429
+ log.warn(`[context-overflow-recovery] Tool result truncation did not help: ${truncResult.reason ?? "unknown"}`);
310
430
  }
311
- const kind = isCompactionFailure ? "compaction_failure" : "context_overflow";
431
+ }
432
+ const kind = isCompactionFailure ? "compaction_failure" : "context_overflow";
433
+ return {
434
+ payloads: [
435
+ {
436
+ text: "Context overflow: prompt too large for the model. " +
437
+ "Try /reset (or /new) to start a fresh session, or use a larger-context model.",
438
+ isError: true,
439
+ },
440
+ ],
441
+ meta: {
442
+ durationMs: Date.now() - started,
443
+ agentMeta: {
444
+ sessionId: sessionIdUsed,
445
+ provider,
446
+ model: model.id,
447
+ },
448
+ systemPromptReport: attempt.systemPromptReport,
449
+ error: { kind, message: errorText },
450
+ },
451
+ };
452
+ }
453
+ if (promptError && !aborted) {
454
+ const errorText = describeUnknownError(promptError);
455
+ // Handle role ordering errors with a user-friendly message
456
+ if (/incorrect role information|roles must alternate/i.test(errorText)) {
312
457
  return {
313
458
  payloads: [
314
459
  {
315
- text: "Context overflow: prompt too large for the model. " +
316
- "Try again with less input or a larger-context model.",
460
+ text: "Message ordering conflict - please try again. " +
461
+ "If this persists, use /new to start a fresh session.",
317
462
  isError: true,
318
463
  },
319
464
  ],
@@ -325,17 +470,21 @@ export async function runEmbeddedPiAgent(params) {
325
470
  model: model.id,
326
471
  },
327
472
  systemPromptReport: attempt.systemPromptReport,
328
- error: { kind, message: errorText },
473
+ error: { kind: "role_ordering", message: errorText },
329
474
  },
330
475
  };
331
476
  }
332
- // Handle role ordering errors with a user-friendly message
333
- if (/incorrect role information|roles must alternate/i.test(errorText)) {
477
+ // Handle image size errors with a user-friendly message (no retry needed)
478
+ const imageSizeError = parseImageSizeError(errorText);
479
+ if (imageSizeError) {
480
+ const maxMb = imageSizeError.maxMb;
481
+ const maxMbLabel = typeof maxMb === "number" && Number.isFinite(maxMb) ? `${maxMb}` : null;
482
+ const maxBytesHint = maxMbLabel ? ` (max ${maxMbLabel}MB)` : "";
334
483
  return {
335
484
  payloads: [
336
485
  {
337
- text: "Message ordering conflict - please try again. " +
338
- "If this persists, use /new to start a fresh session.",
486
+ text: `Image too large for the model${maxBytesHint}. ` +
487
+ "Please compress or resize the image and try again.",
339
488
  isError: true,
340
489
  },
341
490
  ],
@@ -347,7 +496,7 @@ export async function runEmbeddedPiAgent(params) {
347
496
  model: model.id,
348
497
  },
349
498
  systemPromptReport: attempt.systemPromptReport,
350
- error: { kind: "role_ordering", message: errorText },
499
+ error: { kind: "image_size", message: errorText },
351
500
  },
352
501
  };
353
502
  }
@@ -399,6 +548,7 @@ export async function runEmbeddedPiAgent(params) {
399
548
  }
400
549
  const authFailure = isAuthAssistantError(lastAssistant);
401
550
  const rateLimitFailure = isRateLimitAssistantError(lastAssistant);
551
+ const billingFailure = isBillingAssistantError(lastAssistant);
402
552
  const failoverFailure = isFailoverAssistantError(lastAssistant);
403
553
  const assistantFailoverReason = classifyFailoverReason(lastAssistant?.errorMessage ?? "");
404
554
  const cloudCodeAssistFormatError = attempt.cloudCodeAssistFormatError;
@@ -456,9 +606,11 @@ export async function runEmbeddedPiAgent(params) {
456
606
  ? "LLM request timed out."
457
607
  : rateLimitFailure
458
608
  ? "LLM request rate limited."
459
- : authFailure
460
- ? "LLM request unauthorized."
461
- : "LLM request failed.");
609
+ : billingFailure
610
+ ? BILLING_ERROR_USER_MESSAGE
611
+ : authFailure
612
+ ? "LLM request unauthorized."
613
+ : "LLM request failed.");
462
614
  const status = resolveFailoverStatus(assistantFailoverReason ?? "unknown") ??
463
615
  (isTimeoutErrorMessage(message) ? 408 : undefined);
464
616
  throw new FailoverError(message, {
@@ -470,12 +622,13 @@ export async function runEmbeddedPiAgent(params) {
470
622
  });
471
623
  }
472
624
  }
473
- const usage = normalizeUsage(lastAssistant?.usage);
625
+ const usage = toNormalizedUsage(usageAccumulator);
474
626
  const agentMeta = {
475
627
  sessionId: sessionIdUsed,
476
628
  provider: lastAssistant?.provider ?? provider,
477
629
  model: lastAssistant?.model ?? model.id,
478
630
  usage,
631
+ compactionCount: autoCompactionCount > 0 ? autoCompactionCount : undefined,
479
632
  };
480
633
  const payloads = buildEmbeddedRunPayloads({
481
634
  assistantTexts: attempt.assistantTexts,