@poolzin/pool-bot 2026.2.25 → 2026.2.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/dist/acp/event-mapper.js +87 -22
  2. package/dist/acp/meta.js +12 -6
  3. package/dist/agents/agent-paths.js +8 -9
  4. package/dist/agents/agent-scope.js +7 -5
  5. package/dist/agents/auth-profiles/oauth.js +148 -64
  6. package/dist/agents/auth-profiles/session-override.js +13 -7
  7. package/dist/agents/bash-tools.exec-host-gateway.js +14 -4
  8. package/dist/agents/bash-tools.exec-runtime.js +2 -25
  9. package/dist/agents/bedrock-discovery.js +3 -1
  10. package/dist/agents/byteplus-models.js +97 -0
  11. package/dist/agents/chutes-oauth.js +1 -0
  12. package/dist/agents/cli-runner/helpers.js +4 -0
  13. package/dist/agents/compaction.js +41 -14
  14. package/dist/agents/doubao-models.js +121 -0
  15. package/dist/agents/failover-error.js +2 -0
  16. package/dist/agents/huggingface-models.js +5 -3
  17. package/dist/agents/live-model-filter.js +5 -0
  18. package/dist/agents/minimax-vlm.js +10 -8
  19. package/dist/agents/model-auth.js +6 -0
  20. package/dist/agents/model-catalog.js +3 -1
  21. package/dist/agents/model-selection.js +7 -1
  22. package/dist/agents/models-config.providers.js +93 -11
  23. package/dist/agents/ollama-stream.js +117 -4
  24. package/dist/agents/opencode-zen-models.js +22 -11
  25. package/dist/agents/pi-embedded-helpers/errors.js +55 -33
  26. package/dist/agents/pi-embedded-helpers/messaging-dedupe.js +10 -5
  27. package/dist/agents/pi-embedded-helpers/thinking.js +10 -5
  28. package/dist/agents/pi-embedded-helpers.js +1 -1
  29. package/dist/agents/pi-embedded-runner/compact.js +29 -7
  30. package/dist/agents/pi-embedded-runner/extensions.js +28 -26
  31. package/dist/agents/pi-embedded-runner/google.js +20 -8
  32. package/dist/agents/pi-embedded-runner/run/attempt.js +95 -36
  33. package/dist/agents/pi-embedded-runner/run.js +71 -12
  34. package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +11 -2
  35. package/dist/agents/pi-embedded-runner/session-manager-cache.js +11 -7
  36. package/dist/agents/pi-embedded-runner/system-prompt.js +2 -0
  37. package/dist/agents/pi-embedded-runner/thinking.js +42 -0
  38. package/dist/agents/pi-embedded-runner/tool-name-allowlist.js +19 -0
  39. package/dist/agents/pi-embedded-runner/utils.js +7 -10
  40. package/dist/agents/pi-embedded-subscribe.handlers.lifecycle.js +45 -56
  41. package/dist/agents/pi-embedded-subscribe.handlers.tools.js +2 -2
  42. package/dist/agents/pi-embedded-subscribe.js +9 -4
  43. package/dist/agents/pi-embedded-subscribe.tools.js +68 -14
  44. package/dist/agents/pi-embedded-utils.js +3 -0
  45. package/dist/agents/pi-extensions/compaction-safeguard-runtime.js +4 -20
  46. package/dist/agents/pi-extensions/compaction-safeguard.js +75 -33
  47. package/dist/agents/pi-settings.js +40 -0
  48. package/dist/agents/pi-tools.policy.js +2 -1
  49. package/dist/agents/provider/config-loader.js +1 -1
  50. package/dist/agents/sandbox/browser.js +170 -33
  51. package/dist/agents/sandbox/config-hash.js +14 -27
  52. package/dist/agents/sandbox/config.js +21 -2
  53. package/dist/agents/sandbox/constants.js +2 -0
  54. package/dist/agents/sandbox/docker.js +16 -2
  55. package/dist/agents/sandbox/novnc-auth.js +62 -0
  56. package/dist/agents/sandbox/sanitize-env-vars.js +1 -1
  57. package/dist/agents/sandbox/shared.js +10 -6
  58. package/dist/agents/sandbox-paths.js +24 -11
  59. package/dist/agents/schema/clean-for-gemini.js +132 -85
  60. package/dist/agents/session-slug.js +10 -5
  61. package/dist/agents/session-tool-result-guard-wrapper.js +1 -0
  62. package/dist/agents/session-tool-result-guard.js +3 -1
  63. package/dist/agents/session-transcript-repair.js +40 -6
  64. package/dist/agents/skills/bundled-dir.js +19 -5
  65. package/dist/agents/skills/env-overrides.js +124 -43
  66. package/dist/agents/skills/frontmatter.js +6 -6
  67. package/dist/agents/skills/plugin-skills.js +14 -7
  68. package/dist/agents/skills/workspace.js +1 -0
  69. package/dist/agents/subagent-announce.js +251 -49
  70. package/dist/agents/subagent-lifecycle-events.js +19 -0
  71. package/dist/agents/subagent-registry-cleanup.js +31 -0
  72. package/dist/agents/subagent-registry-completion.js +68 -0
  73. package/dist/agents/subagent-registry-queries.js +117 -0
  74. package/dist/agents/subagent-registry-state.js +46 -0
  75. package/dist/agents/subagent-registry.js +252 -221
  76. package/dist/agents/subagent-registry.store.js +1 -0
  77. package/dist/agents/subagent-registry.types.js +1 -0
  78. package/dist/agents/subagent-spawn.js +195 -7
  79. package/dist/agents/system-prompt.js +22 -6
  80. package/dist/agents/test-helpers/fast-coding-tools.js +1 -18
  81. package/dist/agents/test-helpers/fast-core-tools.js +1 -17
  82. package/dist/agents/timeout.js +18 -6
  83. package/dist/agents/tool-call-id.js +1 -1
  84. package/dist/agents/tool-display-common.js +162 -29
  85. package/dist/agents/tool-images.js +82 -9
  86. package/dist/agents/tool-policy.js +51 -26
  87. package/dist/agents/tools/browser-tool.js +2 -2
  88. package/dist/agents/tools/canvas-tool.js +27 -1
  89. package/dist/agents/tools/common.js +45 -0
  90. package/dist/agents/tools/discord-actions-guild.js +4 -1
  91. package/dist/agents/tools/gateway-tool.js +3 -1
  92. package/dist/agents/tools/nodes-utils.js +1 -10
  93. package/dist/agents/tools/sessions-send-helpers.js +12 -6
  94. package/dist/agents/tools/sessions-spawn-tool.js +8 -2
  95. package/dist/agents/tools/subagents-tool.js +2 -1
  96. package/dist/agents/tools/whatsapp-actions.js +10 -2
  97. package/dist/agents/tools/whatsapp-target-auth.js +18 -0
  98. package/dist/agents/transcript-policy.js +22 -8
  99. package/dist/agents/venice-models.js +11 -3
  100. package/dist/auto-reply/commands-registry.data.js +51 -0
  101. package/dist/auto-reply/commands-registry.js +4 -3
  102. package/dist/auto-reply/group-activation.js +10 -5
  103. package/dist/auto-reply/inbound-debounce.js +10 -5
  104. package/dist/auto-reply/reply/abort.js +1 -1
  105. package/dist/auto-reply/reply/agent-runner-execution.js +4 -1
  106. package/dist/auto-reply/reply/bash-command.js +41 -39
  107. package/dist/auto-reply/reply/command-gates.js +25 -0
  108. package/dist/auto-reply/reply/commands-allowlist.js +111 -72
  109. package/dist/auto-reply/reply/commands-bash.js +6 -5
  110. package/dist/auto-reply/reply/commands-config.js +30 -28
  111. package/dist/auto-reply/reply/commands-core.js +2 -1
  112. package/dist/auto-reply/reply/commands-info.js +1 -0
  113. package/dist/auto-reply/reply/commands-models.js +65 -14
  114. package/dist/auto-reply/reply/commands-session.js +237 -82
  115. package/dist/auto-reply/reply/commands-setunset.js +45 -0
  116. package/dist/auto-reply/reply/commands-subagents/action-agents.js +44 -0
  117. package/dist/auto-reply/reply/commands-subagents/action-focus.js +64 -0
  118. package/dist/auto-reply/reply/commands-subagents/action-help.js +4 -0
  119. package/dist/auto-reply/reply/commands-subagents/action-info.js +45 -0
  120. package/dist/auto-reply/reply/commands-subagents/action-kill.js +60 -0
  121. package/dist/auto-reply/reply/commands-subagents/action-list.js +44 -0
  122. package/dist/auto-reply/reply/commands-subagents/action-log.js +29 -0
  123. package/dist/auto-reply/reply/commands-subagents/action-send.js +119 -0
  124. package/dist/auto-reply/reply/commands-subagents/action-spawn.js +52 -0
  125. package/dist/auto-reply/reply/commands-subagents/action-unfocus.js +30 -0
  126. package/dist/auto-reply/reply/commands-subagents/shared.js +303 -0
  127. package/dist/auto-reply/reply/commands-subagents.js +51 -587
  128. package/dist/auto-reply/reply/commands-tts.js +10 -5
  129. package/dist/auto-reply/reply/config-value.js +10 -5
  130. package/dist/auto-reply/reply/directive-handling.model-picker.js +12 -6
  131. package/dist/auto-reply/reply/directive-handling.persist.js +9 -21
  132. package/dist/auto-reply/reply/directive-handling.shared.js +24 -4
  133. package/dist/auto-reply/reply/followup-runner.js +1 -0
  134. package/dist/auto-reply/reply/get-reply-directives-utils.js +23 -14
  135. package/dist/auto-reply/reply/get-reply-directives.js +17 -28
  136. package/dist/auto-reply/reply/get-reply-inline-actions.js +1 -0
  137. package/dist/auto-reply/reply/get-reply.js +71 -12
  138. package/dist/auto-reply/reply/model-selection.js +80 -39
  139. package/dist/auto-reply/reply/queue/enqueue.js +10 -5
  140. package/dist/auto-reply/reply/queue/state.js +13 -12
  141. package/dist/auto-reply/reply/reply-payloads.js +67 -36
  142. package/dist/auto-reply/reply/reply-reference.js +9 -8
  143. package/dist/auto-reply/reply/route-reply.js +15 -8
  144. package/dist/auto-reply/reply/session-reset-prompt.js +1 -1
  145. package/dist/auto-reply/reply/session.js +22 -6
  146. package/dist/auto-reply/reply/strip-inbound-meta.js +147 -0
  147. package/dist/auto-reply/reply/subagents-utils.js +56 -30
  148. package/dist/auto-reply/reply/typing.js +46 -21
  149. package/dist/auto-reply/send-policy.js +14 -7
  150. package/dist/auto-reply/status.js +140 -16
  151. package/dist/auto-reply/templating.js +10 -5
  152. package/dist/auto-reply/thinking.js +7 -16
  153. package/dist/auto-reply/tokens.js +21 -5
  154. package/dist/browser/bridge-server.js +36 -20
  155. package/dist/browser/cdp.helpers.js +7 -14
  156. package/dist/browser/cdp.js +35 -15
  157. package/dist/browser/chrome.profile-decoration.js +7 -4
  158. package/dist/browser/config.js +4 -0
  159. package/dist/browser/extension-relay-auth.js +55 -0
  160. package/dist/browser/extension-relay.js +74 -29
  161. package/dist/browser/navigation-guard.js +9 -1
  162. package/dist/browser/paths.js +77 -0
  163. package/dist/browser/profiles.js +13 -8
  164. package/dist/browser/pw-ai-module.js +10 -5
  165. package/dist/browser/pw-session.js +76 -39
  166. package/dist/browser/pw-tools-core.interactions.js +14 -7
  167. package/dist/browser/pw-tools-core.state.js +12 -6
  168. package/dist/browser/routes/agent.act.js +2 -2
  169. package/dist/browser/server-context.js +7 -0
  170. package/dist/build-info.json +3 -3
  171. package/dist/channels/allow-from.js +2 -1
  172. package/dist/channels/allowlists/resolve-utils.js +43 -19
  173. package/dist/channels/channel-config.js +14 -7
  174. package/dist/channels/draft-stream-loop.js +7 -0
  175. package/dist/channels/model-overrides.js +82 -0
  176. package/dist/channels/plugins/normalize/imessage.js +14 -7
  177. package/dist/channels/plugins/normalize/slack.js +10 -5
  178. package/dist/channels/plugins/normalize/telegram.js +14 -7
  179. package/dist/channels/plugins/outbound/discord.js +80 -8
  180. package/dist/channels/plugins/outbound/signal.js +11 -11
  181. package/dist/channels/plugins/setup-helpers.js +10 -5
  182. package/dist/channels/sender-label.js +14 -7
  183. package/dist/channels/session.js +4 -2
  184. package/dist/channels/status-reactions.js +297 -0
  185. package/dist/cli/banner.js +1 -1
  186. package/dist/cli/browser-cli-actions-input/register.files-downloads.js +65 -56
  187. package/dist/cli/cli-name.js +11 -11
  188. package/dist/cli/cli-utils.js +13 -3
  189. package/dist/cli/command-format.js +1 -1
  190. package/dist/cli/config-cli.js +1 -1
  191. package/dist/cli/daemon-cli/lifecycle-core.js +31 -19
  192. package/dist/cli/daemon-cli/lifecycle.js +64 -2
  193. package/dist/cli/daemon-cli/restart-health.js +126 -0
  194. package/dist/cli/daemon-cli/status.gather.js +9 -13
  195. package/dist/cli/daemon-cli/status.print.js +2 -10
  196. package/dist/cli/deps.js +27 -22
  197. package/dist/cli/gateway-cli/run-loop.js +23 -5
  198. package/dist/cli/node-cli/register.js +14 -5
  199. package/dist/cli/nodes-media-utils.js +7 -2
  200. package/dist/cli/outbound-send-deps.js +2 -9
  201. package/dist/cli/outbound-send-mapping.js +11 -0
  202. package/dist/cli/pairing-cli.js +40 -14
  203. package/dist/cli/plugins-cli.js +34 -41
  204. package/dist/cli/ports.js +11 -10
  205. package/dist/cli/program/command-registry.js +2 -11
  206. package/dist/cli/program/command-tree.js +16 -0
  207. package/dist/cli/program/preaction.js +13 -9
  208. package/dist/cli/program/register.configure.js +3 -18
  209. package/dist/cli/program/register.maintenance.js +2 -2
  210. package/dist/cli/program/register.onboard.js +2 -0
  211. package/dist/cli/program/register.status-health-sessions.js +16 -17
  212. package/dist/cli/program/register.subclis.js +93 -52
  213. package/dist/cli/route.js +11 -7
  214. package/dist/cli/system-cli.js +36 -46
  215. package/dist/cli/update-cli/shared.js +22 -9
  216. package/dist/cli/update-cli/update-command.js +89 -14
  217. package/dist/cli/update-cli/wizard.js +6 -12
  218. package/dist/commands/agent/run-context.js +18 -5
  219. package/dist/commands/agent/session-store.js +17 -4
  220. package/dist/commands/agent.js +22 -2
  221. package/dist/commands/agents.bindings.js +14 -7
  222. package/dist/commands/agents.commands.add.js +13 -9
  223. package/dist/commands/agents.commands.identity.js +12 -6
  224. package/dist/commands/agents.commands.list.js +11 -6
  225. package/dist/commands/agents.config.js +8 -10
  226. package/dist/commands/agents.providers.js +12 -6
  227. package/dist/commands/auth-choice-options.js +103 -75
  228. package/dist/commands/auth-choice.apply.byteplus.js +55 -0
  229. package/dist/commands/auth-choice.apply.js +4 -0
  230. package/dist/commands/auth-choice.apply.minimax.js +61 -13
  231. package/dist/commands/auth-choice.apply.openai.js +3 -1
  232. package/dist/commands/auth-choice.apply.volcengine.js +55 -0
  233. package/dist/commands/auth-choice.preferred-provider.js +2 -0
  234. package/dist/commands/channels/remove.js +13 -6
  235. package/dist/commands/channels/shared.js +4 -14
  236. package/dist/commands/configure.commands.js +14 -0
  237. package/dist/commands/configure.gateway.js +2 -4
  238. package/dist/commands/configure.js +1 -1
  239. package/dist/commands/configure.shared.js +11 -0
  240. package/dist/commands/daemon-install-helpers.js +2 -2
  241. package/dist/commands/dashboard.js +12 -10
  242. package/dist/commands/docs.js +14 -8
  243. package/dist/commands/doctor-config-flow.js +11 -9
  244. package/dist/commands/doctor-legacy-config.js +281 -0
  245. package/dist/commands/doctor-state-integrity.js +99 -23
  246. package/dist/commands/doctor-update.js +12 -9
  247. package/dist/commands/models/list.list-command.js +7 -5
  248. package/dist/commands/models/set-image.js +2 -21
  249. package/dist/commands/node-daemon-install-helpers.js +10 -8
  250. package/dist/commands/onboard-auth.config-minimax.js +54 -80
  251. package/dist/commands/onboard-auth.config-opencode.js +2 -18
  252. package/dist/commands/onboard-auth.credentials.js +90 -13
  253. package/dist/commands/onboard-auth.js +1 -1
  254. package/dist/commands/onboard-auth.models.js +6 -5
  255. package/dist/commands/onboard-hooks.js +1 -1
  256. package/dist/commands/onboard-non-interactive/api-keys.js +14 -7
  257. package/dist/commands/onboard-non-interactive/local/auth-choice.js +64 -49
  258. package/dist/commands/onboard-provider-auth-flags.js +14 -0
  259. package/dist/commands/onboard-remote.js +14 -7
  260. package/dist/commands/onboard.js +11 -13
  261. package/dist/commands/sandbox-display.js +6 -5
  262. package/dist/commands/status-all/diagnosis.js +14 -10
  263. package/dist/commands/status-all/format.js +1 -0
  264. package/dist/commands/status.gateway-probe.js +1 -16
  265. package/dist/commands/systemd-linger.js +12 -6
  266. package/dist/config/agent-limits.js +2 -0
  267. package/dist/config/commands.js +30 -16
  268. package/dist/config/config-paths.js +9 -11
  269. package/dist/config/defaults.js +22 -2
  270. package/dist/config/discord-preview-streaming.js +104 -0
  271. package/dist/config/env-vars.js +37 -8
  272. package/dist/config/includes.js +4 -0
  273. package/dist/config/io.js +97 -12
  274. package/dist/config/legacy.migrations.part-1.js +189 -78
  275. package/dist/config/legacy.shared.js +3 -1
  276. package/dist/config/merge-patch.js +4 -0
  277. package/dist/config/prototype-keys.js +4 -0
  278. package/dist/config/schema.help.js +44 -7
  279. package/dist/config/schema.labels.js +38 -6
  280. package/dist/config/sessions/delivery-info.js +10 -3
  281. package/dist/config/sessions/main-session.js +10 -5
  282. package/dist/config/sessions/session-file.js +33 -0
  283. package/dist/config/sessions/session-key.js +10 -5
  284. package/dist/config/sessions/store.js +1 -1
  285. package/dist/config/sessions.js +1 -0
  286. package/dist/config/zod-schema.agent-runtime.js +11 -0
  287. package/dist/config/zod-schema.js +148 -13
  288. package/dist/config/zod-schema.providers-core.js +78 -4
  289. package/dist/config/zod-schema.providers.js +6 -1
  290. package/dist/config/zod-schema.session.js +41 -2
  291. package/dist/cron/run-log.js +3 -0
  292. package/dist/cron/schedule.js +21 -10
  293. package/dist/cron/service/ops.js +35 -21
  294. package/dist/cron/service/timer.js +116 -16
  295. package/dist/cron/stagger.js +3 -1
  296. package/dist/discord/api.js +12 -6
  297. package/dist/discord/draft-chunking.js +22 -0
  298. package/dist/discord/draft-stream.js +124 -0
  299. package/dist/discord/monitor/agent-components.js +1 -1
  300. package/dist/discord/monitor/commands.js +5 -0
  301. package/dist/discord/monitor/gateway-plugin.js +2 -1
  302. package/dist/discord/monitor/listeners.js +37 -27
  303. package/dist/discord/monitor/message-handler.js +4 -1
  304. package/dist/discord/monitor/message-handler.preflight.js +65 -8
  305. package/dist/discord/monitor/message-handler.process.js +246 -217
  306. package/dist/discord/monitor/message-utils.js +143 -6
  307. package/dist/discord/monitor/model-picker-preferences.js +143 -0
  308. package/dist/discord/monitor/model-picker.js +651 -0
  309. package/dist/discord/monitor/native-command.js +573 -16
  310. package/dist/discord/monitor/provider.allowlist.js +223 -0
  311. package/dist/discord/monitor/provider.js +275 -347
  312. package/dist/discord/monitor/provider.lifecycle.js +100 -0
  313. package/dist/discord/monitor/reply-delivery.js +123 -16
  314. package/dist/discord/monitor/thread-bindings.discord-api.js +215 -0
  315. package/dist/discord/monitor/thread-bindings.js +4 -0
  316. package/dist/discord/monitor/thread-bindings.lifecycle.js +177 -0
  317. package/dist/discord/monitor/thread-bindings.manager.js +423 -0
  318. package/dist/discord/monitor/thread-bindings.messages.js +55 -0
  319. package/dist/discord/monitor/thread-bindings.state.js +358 -0
  320. package/dist/discord/monitor/thread-bindings.types.js +6 -0
  321. package/dist/discord/resolve-users.js +33 -21
  322. package/dist/discord/send.channels.js +15 -0
  323. package/dist/discord/send.js +3 -2
  324. package/dist/discord/send.outbound.js +82 -26
  325. package/dist/discord/send.permissions.js +83 -30
  326. package/dist/discord/send.reactions.js +8 -4
  327. package/dist/discord/token.js +10 -5
  328. package/dist/discord/voice/command.js +263 -0
  329. package/dist/discord/voice/manager.js +531 -0
  330. package/dist/gateway/auth.js +34 -10
  331. package/dist/gateway/call.js +4 -16
  332. package/dist/gateway/client.js +28 -4
  333. package/dist/gateway/config-reload.js +3 -4
  334. package/dist/gateway/control-ui.js +219 -96
  335. package/dist/gateway/hooks-mapping.js +88 -38
  336. package/dist/gateway/http-auth-helpers.js +3 -2
  337. package/dist/gateway/http-endpoint-helpers.js +1 -0
  338. package/dist/gateway/net.js +54 -12
  339. package/dist/gateway/node-invoke-system-run-approval.js +14 -35
  340. package/dist/gateway/node-registry.js +10 -5
  341. package/dist/gateway/openai-http.js +1 -0
  342. package/dist/gateway/openresponses-http.js +1 -0
  343. package/dist/gateway/origin-check.js +1 -18
  344. package/dist/gateway/protocol/index.js +4 -3
  345. package/dist/gateway/protocol/schema/cron.js +1 -0
  346. package/dist/gateway/protocol/schema/devices.js +1 -0
  347. package/dist/gateway/protocol/schema/protocol-schemas.js +2 -1
  348. package/dist/gateway/protocol/schema/sessions.js +6 -0
  349. package/dist/gateway/role-policy.js +17 -0
  350. package/dist/gateway/server/ws-connection/connect-policy.js +37 -0
  351. package/dist/gateway/server/ws-connection/message-handler.js +175 -148
  352. package/dist/gateway/server-chat.js +83 -25
  353. package/dist/gateway/server-constants.js +10 -9
  354. package/dist/gateway/server-cron.js +1 -0
  355. package/dist/gateway/server-http.js +16 -7
  356. package/dist/gateway/server-maintenance.js +20 -5
  357. package/dist/gateway/server-methods/chat.js +10 -6
  358. package/dist/gateway/server-methods/config.js +12 -14
  359. package/dist/gateway/server-methods/devices.js +17 -3
  360. package/dist/gateway/server-methods/models.js +11 -1
  361. package/dist/gateway/server-methods/sessions.js +64 -8
  362. package/dist/gateway/server-methods/usage.js +162 -75
  363. package/dist/gateway/server-node-events.js +29 -0
  364. package/dist/gateway/server-runtime-config.js +34 -13
  365. package/dist/gateway/server-startup-memory.js +17 -11
  366. package/dist/gateway/session-utils.fs.js +32 -34
  367. package/dist/gateway/sessions-resolve.js +17 -5
  368. package/dist/gateway/test-helpers.openai-mock.js +14 -7
  369. package/dist/gateway/tools-invoke-http.js +21 -10
  370. package/dist/hooks/bundled/bootstrap-extra-files/handler.js +3 -1
  371. package/dist/hooks/bundled/command-logger/handler.js +7 -2
  372. package/dist/hooks/bundled/session-memory/handler.js +6 -5
  373. package/dist/hooks/frontmatter.js +6 -6
  374. package/dist/hooks/gmail-watcher.js +11 -6
  375. package/dist/hooks/internal-hooks.js +11 -1
  376. package/dist/hooks/llm-slug-generator.js +4 -1
  377. package/dist/hooks/workspace.js +47 -17
  378. package/dist/imessage/accounts.js +9 -20
  379. package/dist/imessage/monitor/inbound-processing.js +2 -1
  380. package/dist/infra/archive.js +174 -73
  381. package/dist/infra/control-ui-assets.js +14 -6
  382. package/dist/infra/device-pairing.js +108 -29
  383. package/dist/infra/env.js +10 -5
  384. package/dist/infra/exec-approvals-allowlist.js +122 -0
  385. package/dist/infra/exec-approvals-analysis.js +34 -3
  386. package/dist/infra/exec-approvals.js +5 -17
  387. package/dist/infra/exec-safe-bin-policy.js +53 -45
  388. package/dist/infra/fs-safe.js +71 -39
  389. package/dist/infra/gateway-lock.js +6 -2
  390. package/dist/infra/heartbeat-wake.js +6 -12
  391. package/dist/infra/host-env-security-policy.json +19 -0
  392. package/dist/infra/host-env-security.js +66 -0
  393. package/dist/infra/net/ssrf.js +131 -38
  394. package/dist/infra/outbound/bound-delivery-router.js +88 -0
  395. package/dist/infra/outbound/channel-selection.js +12 -6
  396. package/dist/infra/outbound/envelope.js +1 -1
  397. package/dist/infra/outbound/format.js +12 -6
  398. package/dist/infra/outbound/payloads.js +14 -7
  399. package/dist/infra/outbound/session-binding-service.js +123 -0
  400. package/dist/infra/path-guards.js +25 -0
  401. package/dist/infra/provider-usage.fetch.codex.js +7 -15
  402. package/dist/infra/provider-usage.fetch.gemini.js +14 -11
  403. package/dist/infra/provider-usage.fetch.shared.js +30 -1
  404. package/dist/infra/provider-usage.fetch.zai.js +10 -9
  405. package/dist/infra/retry-policy.js +4 -2
  406. package/dist/infra/retry.js +9 -5
  407. package/dist/infra/session-cost-usage.js +107 -59
  408. package/dist/infra/session-maintenance-warning.js +3 -1
  409. package/dist/infra/shell-env.js +98 -34
  410. package/dist/infra/ssh-config.js +12 -6
  411. package/dist/infra/system-run-command.js +49 -4
  412. package/dist/infra/update-channels.js +10 -5
  413. package/dist/line/accounts.js +5 -7
  414. package/dist/line/bot-access.js +8 -20
  415. package/dist/line/bot-handlers.js +3 -1
  416. package/dist/link-understanding/detect.js +15 -7
  417. package/dist/media/constants.js +15 -6
  418. package/dist/media/image-ops.js +7 -0
  419. package/dist/media/local-roots.js +3 -2
  420. package/dist/media-understanding/apply.js +4 -1
  421. package/dist/media-understanding/concurrency.js +8 -20
  422. package/dist/memory/backend-config.js +45 -6
  423. package/dist/memory/embeddings.js +10 -4
  424. package/dist/memory/fs-utils.js +23 -0
  425. package/dist/memory/manager-search.js +12 -6
  426. package/dist/memory/manager-sync-ops.js +12 -2
  427. package/dist/memory/qmd-manager.js +466 -53
  428. package/dist/memory/query-expansion.js +167 -3
  429. package/dist/memory/status-format.js +10 -5
  430. package/dist/memory/sync-memory-files.js +1 -1
  431. package/dist/node-host/invoke-system-run.js +281 -0
  432. package/dist/node-host/invoke.js +55 -337
  433. package/dist/pairing/pairing-store.js +22 -0
  434. package/dist/plugin-sdk/allow-from.js +1 -1
  435. package/dist/plugin-sdk/command-auth.js +3 -1
  436. package/dist/plugin-sdk/index.js +6 -3
  437. package/dist/plugin-sdk/webhook-targets.js +32 -0
  438. package/dist/plugins/bundled-dir.js +9 -6
  439. package/dist/plugins/hooks.js +50 -0
  440. package/dist/plugins/install.js +28 -16
  441. package/dist/plugins/runtime.js +3 -17
  442. package/dist/plugins/update.js +78 -12
  443. package/dist/process/spawn-utils.js +14 -7
  444. package/dist/providers/github-copilot-token.js +11 -6
  445. package/dist/providers/qwen-portal-oauth.js +14 -6
  446. package/dist/routing/account-id.js +30 -0
  447. package/dist/routing/resolve-route.js +3 -7
  448. package/dist/routing/session-key.js +2 -16
  449. package/dist/security/audit-channel.js +93 -2
  450. package/dist/security/audit-extra.async.js +159 -5
  451. package/dist/security/audit-extra.js +1 -1
  452. package/dist/security/audit-extra.sync.js +85 -6
  453. package/dist/security/audit.js +40 -4
  454. package/dist/security/dm-policy-shared.js +44 -0
  455. package/dist/security/external-content.js +26 -6
  456. package/dist/shared/entry-status.js +6 -0
  457. package/dist/shared/frontmatter.js +5 -5
  458. package/dist/shared/node-match.js +11 -4
  459. package/dist/shared/operator-scope-compat.js +8 -3
  460. package/dist/signal/accounts.js +7 -20
  461. package/dist/signal/monitor/event-handler.js +3 -1
  462. package/dist/slack/accounts.js +6 -19
  463. package/dist/slack/actions.js +11 -3
  464. package/dist/slack/monitor/auth.js +1 -1
  465. package/dist/slack/monitor/message-handler/dispatch.js +50 -29
  466. package/dist/slack/monitor/replies.js +15 -7
  467. package/dist/slack/monitor/slash.js +22 -13
  468. package/dist/slack/resolve-channels.js +10 -5
  469. package/dist/slack/send.js +102 -12
  470. package/dist/slack/stream-mode.js +10 -0
  471. package/dist/slack/streaming.js +4 -2
  472. package/dist/telegram/accounts.js +19 -14
  473. package/dist/telegram/bot/helpers.js +3 -5
  474. package/dist/telegram/bot-access.js +35 -36
  475. package/dist/telegram/bot-handlers.js +120 -148
  476. package/dist/telegram/bot-message-context.js +68 -9
  477. package/dist/telegram/bot-message-dispatch.js +155 -90
  478. package/dist/telegram/bot-native-commands.js +16 -0
  479. package/dist/telegram/draft-stream.js +14 -1
  480. package/dist/telegram/inline-buttons.js +5 -15
  481. package/dist/telegram/monitor.js +11 -7
  482. package/dist/telegram/network-config.js +19 -7
  483. package/dist/telegram/send.js +3 -2
  484. package/dist/telegram/sent-message-cache.js +5 -6
  485. package/dist/telegram/status-reaction-variants.js +208 -0
  486. package/dist/telegram/sticker-cache.js +11 -9
  487. package/dist/terminal/theme.js +12 -12
  488. package/dist/tts/tts.js +80 -567
  489. package/dist/tui/components/chat-log.js +41 -8
  490. package/dist/tui/theme/theme.js +10 -12
  491. package/dist/tui/tui-local-shell.js +16 -6
  492. package/dist/tui/tui.js +58 -6
  493. package/dist/utils/account-id.js +2 -4
  494. package/dist/utils/boolean.js +10 -5
  495. package/dist/utils/directive-tags.js +11 -0
  496. package/dist/utils/queue-helpers.js +67 -12
  497. package/dist/web/auto-reply/deliver-reply.js +8 -4
  498. package/dist/web/auto-reply/mentions.js +10 -5
  499. package/dist/web/auto-reply/monitor/group-members.js +14 -7
  500. package/dist/web/auto-reply/monitor/process-message.js +45 -24
  501. package/dist/web/inbound/access-control.js +5 -2
  502. package/dist/web/login-qr.js +12 -6
  503. package/dist/web/media.js +123 -16
  504. package/extensions/bluebubbles/src/monitor-processing.ts +580 -139
  505. package/extensions/bluebubbles/src/monitor.ts +208 -1950
  506. package/package.json +1 -1
@@ -1,7 +1,10 @@
1
+ import { createSubsystemLogger } from "../logging/subsystem.js";
1
2
  import { DEFAULT_COPILOT_API_BASE_URL, resolveCopilotApiToken, } from "../providers/github-copilot-token.js";
2
3
  import { ensureAuthProfileStore, listProfilesForProvider } from "./auth-profiles.js";
3
4
  import { discoverBedrockModels } from "./bedrock-discovery.js";
5
+ import { buildBytePlusModelDefinition, BYTEPLUS_BASE_URL, BYTEPLUS_MODEL_CATALOG, BYTEPLUS_CODING_BASE_URL, BYTEPLUS_CODING_MODEL_CATALOG, } from "./byteplus-models.js";
4
6
  import { buildCloudflareAiGatewayModelDefinition, resolveCloudflareAiGatewayBaseUrl, } from "./cloudflare-ai-gateway.js";
7
+ import { buildDoubaoModelDefinition, DOUBAO_BASE_URL, DOUBAO_MODEL_CATALOG, DOUBAO_CODING_BASE_URL, DOUBAO_CODING_MODEL_CATALOG, } from "./doubao-models.js";
5
8
  import { discoverHuggingfaceModels, HUGGINGFACE_BASE_URL, HUGGINGFACE_MODEL_CATALOG, buildHuggingfaceModelDefinition, } from "./huggingface-models.js";
6
9
  import { resolveAwsSdkEnvVarName, resolveEnvApiKey } from "./model-auth.js";
7
10
  import { OLLAMA_NATIVE_BASE_URL } from "./ollama-stream.js";
@@ -14,12 +17,12 @@ const MINIMAX_DEFAULT_VISION_MODEL_ID = "MiniMax-VL-01";
14
17
  const MINIMAX_DEFAULT_CONTEXT_WINDOW = 200000;
15
18
  const MINIMAX_DEFAULT_MAX_TOKENS = 8192;
16
19
  const MINIMAX_OAUTH_PLACEHOLDER = "minimax-oauth";
17
- // Pricing: MiniMax doesn't publish public rates. Override in models.json for accurate costs.
20
+ // Pricing per 1M tokens (USD) https://platform.minimaxi.com/document/Price
18
21
  const MINIMAX_API_COST = {
19
- input: 15,
20
- output: 60,
21
- cacheRead: 2,
22
- cacheWrite: 10,
22
+ input: 0.3,
23
+ output: 1.2,
24
+ cacheRead: 0.03,
25
+ cacheWrite: 0.12,
23
26
  };
24
27
  function buildMinimaxModel(params) {
25
28
  return {
@@ -55,6 +58,16 @@ const MOONSHOT_DEFAULT_COST = {
55
58
  cacheRead: 0,
56
59
  cacheWrite: 0,
57
60
  };
61
+ const KIMI_CODING_BASE_URL = "https://api.kimi.com/coding/";
62
+ const KIMI_CODING_DEFAULT_MODEL_ID = "k2p5";
63
+ const KIMI_CODING_DEFAULT_CONTEXT_WINDOW = 262144;
64
+ const KIMI_CODING_DEFAULT_MAX_TOKENS = 32768;
65
+ const KIMI_CODING_DEFAULT_COST = {
66
+ input: 0,
67
+ output: 0,
68
+ cacheRead: 0,
69
+ cacheWrite: 0,
70
+ };
58
71
  const QWEN_PORTAL_BASE_URL = "https://portal.qwen.ai/v1";
59
72
  const QWEN_PORTAL_OAUTH_PLACEHOLDER = "qwen-oauth";
60
73
  const QWEN_PORTAL_DEFAULT_CONTEXT_WINDOW = 128000;
@@ -104,6 +117,7 @@ const NVIDIA_DEFAULT_COST = {
104
117
  cacheRead: 0,
105
118
  cacheWrite: 0,
106
119
  };
120
+ const log = createSubsystemLogger("agents/model-providers");
107
121
  /**
108
122
  * Derive the Ollama native API base URL from a configured base URL.
109
123
  *
@@ -131,12 +145,12 @@ async function discoverOllamaModels(baseUrl) {
131
145
  signal: AbortSignal.timeout(5000),
132
146
  });
133
147
  if (!response.ok) {
134
- console.warn(`Failed to discover Ollama models: ${response.status}`);
148
+ log.warn(`Failed to discover Ollama models: ${response.status}`);
135
149
  return [];
136
150
  }
137
151
  const data = (await response.json());
138
152
  if (!data.models || data.models.length === 0) {
139
- console.warn("No Ollama models found on local instance");
153
+ log.warn("No Ollama models found on local instance");
140
154
  return [];
141
155
  }
142
156
  return data.models.map((model) => {
@@ -154,7 +168,7 @@ async function discoverOllamaModels(baseUrl) {
154
168
  });
155
169
  }
156
170
  catch (error) {
157
- console.warn(`Failed to discover Ollama models: ${String(error)}`);
171
+ log.warn(`Failed to discover Ollama models: ${String(error)}`);
158
172
  return [];
159
173
  }
160
174
  }
@@ -172,13 +186,13 @@ async function discoverVllmModels(baseUrl, apiKey) {
172
186
  signal: AbortSignal.timeout(5000),
173
187
  });
174
188
  if (!response.ok) {
175
- console.warn(`Failed to discover vLLM models: ${response.status}`);
189
+ log.warn(`Failed to discover vLLM models: ${response.status}`);
176
190
  return [];
177
191
  }
178
192
  const data = (await response.json());
179
193
  const models = data.data ?? [];
180
194
  if (models.length === 0) {
181
- console.warn("No vLLM models found on local instance");
195
+ log.warn("No vLLM models found on local instance");
182
196
  return [];
183
197
  }
184
198
  return models
@@ -200,7 +214,7 @@ async function discoverVllmModels(baseUrl, apiKey) {
200
214
  });
201
215
  }
202
216
  catch (error) {
203
- console.warn(`Failed to discover vLLM models: ${String(error)}`);
217
+ log.warn(`Failed to discover vLLM models: ${String(error)}`);
204
218
  return [];
205
219
  }
206
220
  }
@@ -382,6 +396,23 @@ function buildMoonshotProvider() {
382
396
  ],
383
397
  };
384
398
  }
399
+ export function buildKimiCodingProvider() {
400
+ return {
401
+ baseUrl: KIMI_CODING_BASE_URL,
402
+ api: "anthropic-messages",
403
+ models: [
404
+ {
405
+ id: KIMI_CODING_DEFAULT_MODEL_ID,
406
+ name: "Kimi for Coding",
407
+ reasoning: true,
408
+ input: ["text", "image"],
409
+ cost: KIMI_CODING_DEFAULT_COST,
410
+ contextWindow: KIMI_CODING_DEFAULT_CONTEXT_WINDOW,
411
+ maxTokens: KIMI_CODING_DEFAULT_MAX_TOKENS,
412
+ },
413
+ ],
414
+ };
415
+ }
385
416
  function buildQwenPortalProvider() {
386
417
  return {
387
418
  baseUrl: QWEN_PORTAL_BASE_URL,
@@ -415,6 +446,34 @@ function buildSyntheticProvider() {
415
446
  models: SYNTHETIC_MODEL_CATALOG.map(buildSyntheticModelDefinition),
416
447
  };
417
448
  }
449
+ function buildDoubaoProvider() {
450
+ return {
451
+ baseUrl: DOUBAO_BASE_URL,
452
+ api: "openai-completions",
453
+ models: DOUBAO_MODEL_CATALOG.map(buildDoubaoModelDefinition),
454
+ };
455
+ }
456
+ function buildDoubaoCodingProvider() {
457
+ return {
458
+ baseUrl: DOUBAO_CODING_BASE_URL,
459
+ api: "openai-completions",
460
+ models: DOUBAO_CODING_MODEL_CATALOG.map(buildDoubaoModelDefinition),
461
+ };
462
+ }
463
+ function buildBytePlusProvider() {
464
+ return {
465
+ baseUrl: BYTEPLUS_BASE_URL,
466
+ api: "openai-completions",
467
+ models: BYTEPLUS_MODEL_CATALOG.map(buildBytePlusModelDefinition),
468
+ };
469
+ }
470
+ function buildBytePlusCodingProvider() {
471
+ return {
472
+ baseUrl: BYTEPLUS_CODING_BASE_URL,
473
+ api: "openai-completions",
474
+ models: BYTEPLUS_CODING_MODEL_CATALOG.map(buildBytePlusModelDefinition),
475
+ };
476
+ }
418
477
  export function buildXiaomiProvider() {
419
478
  return {
420
479
  baseUrl: XIAOMI_BASE_URL,
@@ -563,6 +622,11 @@ export async function resolveImplicitProviders(params) {
563
622
  if (moonshotKey) {
564
623
  providers.moonshot = { ...buildMoonshotProvider(), apiKey: moonshotKey };
565
624
  }
625
+ const kimiCodingKey = resolveEnvApiKeyVarName("kimi-coding") ??
626
+ resolveApiKeyFromProfiles({ provider: "kimi-coding", store: authStore });
627
+ if (kimiCodingKey) {
628
+ providers["kimi-coding"] = { ...buildKimiCodingProvider(), apiKey: kimiCodingKey };
629
+ }
566
630
  const syntheticKey = resolveEnvApiKeyVarName("synthetic") ??
567
631
  resolveApiKeyFromProfiles({ provider: "synthetic", store: authStore });
568
632
  if (syntheticKey) {
@@ -580,6 +644,24 @@ export async function resolveImplicitProviders(params) {
580
644
  apiKey: QWEN_PORTAL_OAUTH_PLACEHOLDER,
581
645
  };
582
646
  }
647
+ const volcengineKey = resolveEnvApiKeyVarName("volcengine") ??
648
+ resolveApiKeyFromProfiles({ provider: "volcengine", store: authStore });
649
+ if (volcengineKey) {
650
+ providers.volcengine = { ...buildDoubaoProvider(), apiKey: volcengineKey };
651
+ providers["volcengine-plan"] = {
652
+ ...buildDoubaoCodingProvider(),
653
+ apiKey: volcengineKey,
654
+ };
655
+ }
656
+ const byteplusKey = resolveEnvApiKeyVarName("byteplus") ??
657
+ resolveApiKeyFromProfiles({ provider: "byteplus", store: authStore });
658
+ if (byteplusKey) {
659
+ providers.byteplus = { ...buildBytePlusProvider(), apiKey: byteplusKey };
660
+ providers["byteplus-plan"] = {
661
+ ...buildBytePlusCodingProvider(),
662
+ apiKey: byteplusKey,
663
+ };
664
+ }
583
665
  const xiaomiKey = resolveEnvApiKeyVarName("xiaomi") ??
584
666
  resolveApiKeyFromProfiles({ provider: "xiaomi", store: authStore });
585
667
  if (xiaomiKey) {
@@ -1,6 +1,119 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { createAssistantMessageEventStream } from "@mariozechner/pi-ai";
3
+ import { createSubsystemLogger } from "../logging/subsystem.js";
4
+ const log = createSubsystemLogger("ollama-stream");
3
5
  export const OLLAMA_NATIVE_BASE_URL = "http://127.0.0.1:11434";
6
+ const MAX_SAFE_INTEGER_ABS_STR = String(Number.MAX_SAFE_INTEGER);
7
+ function isAsciiDigit(ch) {
8
+ return ch !== undefined && ch >= "0" && ch <= "9";
9
+ }
10
+ function parseJsonNumberToken(input, start) {
11
+ let idx = start;
12
+ if (input[idx] === "-") {
13
+ idx += 1;
14
+ }
15
+ if (idx >= input.length) {
16
+ return null;
17
+ }
18
+ if (input[idx] === "0") {
19
+ idx += 1;
20
+ }
21
+ else if (isAsciiDigit(input[idx]) && input[idx] !== "0") {
22
+ while (isAsciiDigit(input[idx])) {
23
+ idx += 1;
24
+ }
25
+ }
26
+ else {
27
+ return null;
28
+ }
29
+ let isInteger = true;
30
+ if (input[idx] === ".") {
31
+ isInteger = false;
32
+ idx += 1;
33
+ if (!isAsciiDigit(input[idx])) {
34
+ return null;
35
+ }
36
+ while (isAsciiDigit(input[idx])) {
37
+ idx += 1;
38
+ }
39
+ }
40
+ if (input[idx] === "e" || input[idx] === "E") {
41
+ isInteger = false;
42
+ idx += 1;
43
+ if (input[idx] === "+" || input[idx] === "-") {
44
+ idx += 1;
45
+ }
46
+ if (!isAsciiDigit(input[idx])) {
47
+ return null;
48
+ }
49
+ while (isAsciiDigit(input[idx])) {
50
+ idx += 1;
51
+ }
52
+ }
53
+ return {
54
+ token: input.slice(start, idx),
55
+ end: idx,
56
+ isInteger,
57
+ };
58
+ }
59
+ function isUnsafeIntegerLiteral(token) {
60
+ const digits = token[0] === "-" ? token.slice(1) : token;
61
+ if (digits.length < MAX_SAFE_INTEGER_ABS_STR.length) {
62
+ return false;
63
+ }
64
+ if (digits.length > MAX_SAFE_INTEGER_ABS_STR.length) {
65
+ return true;
66
+ }
67
+ return digits > MAX_SAFE_INTEGER_ABS_STR;
68
+ }
69
+ function quoteUnsafeIntegerLiterals(input) {
70
+ let out = "";
71
+ let inString = false;
72
+ let escaped = false;
73
+ let idx = 0;
74
+ while (idx < input.length) {
75
+ const ch = input[idx] ?? "";
76
+ if (inString) {
77
+ out += ch;
78
+ if (escaped) {
79
+ escaped = false;
80
+ }
81
+ else if (ch === "\\") {
82
+ escaped = true;
83
+ }
84
+ else if (ch === '"') {
85
+ inString = false;
86
+ }
87
+ idx += 1;
88
+ continue;
89
+ }
90
+ if (ch === '"') {
91
+ inString = true;
92
+ out += ch;
93
+ idx += 1;
94
+ continue;
95
+ }
96
+ if (ch === "-" || isAsciiDigit(ch)) {
97
+ const parsed = parseJsonNumberToken(input, idx);
98
+ if (parsed) {
99
+ if (parsed.isInteger && isUnsafeIntegerLiteral(parsed.token)) {
100
+ out += `"${parsed.token}"`;
101
+ }
102
+ else {
103
+ out += parsed.token;
104
+ }
105
+ idx = parsed.end;
106
+ continue;
107
+ }
108
+ }
109
+ out += ch;
110
+ idx += 1;
111
+ }
112
+ return out;
113
+ }
114
+ function parseJsonPreservingUnsafeIntegers(input) {
115
+ return JSON.parse(quoteUnsafeIntegerLiterals(input));
116
+ }
4
117
  function extractTextContent(content) {
5
118
  if (typeof content === "string") {
6
119
  return content;
@@ -159,19 +272,19 @@ export async function* parseNdjsonStream(reader) {
159
272
  continue;
160
273
  }
161
274
  try {
162
- yield JSON.parse(trimmed);
275
+ yield parseJsonPreservingUnsafeIntegers(trimmed);
163
276
  }
164
277
  catch {
165
- console.warn("[ollama-stream] Skipping malformed NDJSON line:", trimmed.slice(0, 120));
278
+ log.warn(`Skipping malformed NDJSON line: ${trimmed.slice(0, 120)}`);
166
279
  }
167
280
  }
168
281
  }
169
282
  if (buffer.trim()) {
170
283
  try {
171
- yield JSON.parse(buffer.trim());
284
+ yield parseJsonPreservingUnsafeIntegers(buffer.trim());
172
285
  }
173
286
  catch {
174
- console.warn("[ollama-stream] Skipping malformed trailing data:", buffer.trim().slice(0, 120));
287
+ log.warn(`Skipping malformed trailing data: ${buffer.trim().slice(0, 120)}`);
175
288
  }
176
289
  }
177
290
  }
@@ -1,14 +1,19 @@
1
1
  /**
2
2
  * OpenCode Zen model catalog with dynamic fetching, caching, and static fallback.
3
3
  *
4
- * OpenCode Zen is a $200/month subscription that provides proxy access to multiple
5
- * AI models (Claude, GPT, Gemini, etc.) through a single API endpoint.
4
+ * OpenCode Zen is a pay-as-you-go token-based API that provides access to curated
5
+ * models optimized for coding agents. It uses per-request billing with auto top-up.
6
+ *
7
+ * Note: OpenCode Black ($20/$100/$200/month subscriptions) is a separate product
8
+ * with flat-rate usage tiers. This module handles Zen, not Black.
6
9
  *
7
10
  * API endpoint: https://opencode.ai/zen/v1
8
11
  * Auth URL: https://opencode.ai/auth
9
12
  */
13
+ import { createSubsystemLogger } from "../logging/subsystem.js";
14
+ const log = createSubsystemLogger("opencode-zen-models");
10
15
  export const OPENCODE_ZEN_API_BASE_URL = "https://opencode.ai/zen/v1";
11
- export const OPENCODE_ZEN_DEFAULT_MODEL = "claude-opus-4-5";
16
+ export const OPENCODE_ZEN_DEFAULT_MODEL = "claude-opus-4-6";
12
17
  export const OPENCODE_ZEN_DEFAULT_MODEL_REF = `opencode/${OPENCODE_ZEN_DEFAULT_MODEL}`;
13
18
  // Cache for fetched models (1 hour TTL)
14
19
  let cachedModels = null;
@@ -16,18 +21,19 @@ let cacheTimestamp = 0;
16
21
  const CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour
17
22
  /**
18
23
  * Model aliases for convenient shortcuts.
19
- * Users can use "opus" instead of "claude-opus-4-5", etc.
24
+ * Users can use "opus" instead of "claude-opus-4-6", etc.
20
25
  */
21
26
  export const OPENCODE_ZEN_MODEL_ALIASES = {
22
27
  // Claude
23
- opus: "claude-opus-4-5",
28
+ opus: "claude-opus-4-6",
29
+ "opus-4.6": "claude-opus-4-6",
24
30
  "opus-4.5": "claude-opus-4-5",
25
- "opus-4": "claude-opus-4-5",
31
+ "opus-4": "claude-opus-4-6",
26
32
  // Legacy Claude aliases (OpenCode Zen rotates model catalogs; keep old keys working).
27
- sonnet: "claude-opus-4-5",
28
- "sonnet-4": "claude-opus-4-5",
29
- haiku: "claude-opus-4-5",
30
- "haiku-3.5": "claude-opus-4-5",
33
+ sonnet: "claude-opus-4-6",
34
+ "sonnet-4": "claude-opus-4-6",
35
+ haiku: "claude-opus-4-6",
36
+ "haiku-3.5": "claude-opus-4-6",
31
37
  // GPT-5.x family
32
38
  gpt5: "gpt-5.2",
33
39
  "gpt-5": "gpt-5.2",
@@ -99,6 +105,7 @@ const MODEL_COSTS = {
99
105
  cacheRead: 0.107,
100
106
  cacheWrite: 0,
101
107
  },
108
+ "claude-opus-4-6": { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 },
102
109
  "claude-opus-4-5": { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 },
103
110
  "gemini-3-pro": { input: 2, output: 12, cacheRead: 0.2, cacheWrite: 0 },
104
111
  "gpt-5.1-codex-mini": {
@@ -121,6 +128,7 @@ const MODEL_COSTS = {
121
128
  const DEFAULT_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
122
129
  const MODEL_CONTEXT_WINDOWS = {
123
130
  "gpt-5.1-codex": 400000,
131
+ "claude-opus-4-6": 1000000,
124
132
  "claude-opus-4-5": 200000,
125
133
  "gemini-3-pro": 1048576,
126
134
  "gpt-5.1-codex-mini": 400000,
@@ -135,6 +143,7 @@ function getDefaultContextWindow(modelId) {
135
143
  }
136
144
  const MODEL_MAX_TOKENS = {
137
145
  "gpt-5.1-codex": 128000,
146
+ "claude-opus-4-6": 128000,
138
147
  "claude-opus-4-5": 64000,
139
148
  "gemini-3-pro": 65536,
140
149
  "gpt-5.1-codex-mini": 128000,
@@ -168,6 +177,7 @@ function buildModelDefinition(modelId) {
168
177
  */
169
178
  const MODEL_NAMES = {
170
179
  "gpt-5.1-codex": "GPT-5.1 Codex",
180
+ "claude-opus-4-6": "Claude Opus 4.6",
171
181
  "claude-opus-4-5": "Claude Opus 4.5",
172
182
  "gemini-3-pro": "Gemini 3 Pro",
173
183
  "gpt-5.1-codex-mini": "GPT-5.1 Codex Mini",
@@ -192,6 +202,7 @@ function formatModelName(modelId) {
192
202
  export function getOpencodeZenStaticFallbackModels() {
193
203
  const modelIds = [
194
204
  "gpt-5.1-codex",
205
+ "claude-opus-4-6",
195
206
  "claude-opus-4-5",
196
207
  "gemini-3-pro",
197
208
  "gpt-5.1-codex-mini",
@@ -241,7 +252,7 @@ export async function fetchOpencodeZenModels(apiKey) {
241
252
  return models;
242
253
  }
243
254
  catch (error) {
244
- console.warn(`[opencode-zen] Failed to fetch models, using static fallback: ${String(error)}`);
255
+ log.warn(`Failed to fetch models, using static fallback: ${String(error)}`);
245
256
  return getOpencodeZenStaticFallbackModels();
246
257
  }
247
258
  }
@@ -1,8 +1,13 @@
1
+ import { createSubsystemLogger } from "../../logging/subsystem.js";
1
2
  import { formatSandboxToolPolicyBlockedMessage } from "../sandbox.js";
2
- export function formatBillingErrorMessage(provider) {
3
+ import { stableStringify } from "../stable-stringify.js";
4
+ const log = createSubsystemLogger("errors");
5
+ export function formatBillingErrorMessage(provider, model) {
3
6
  const providerName = provider?.trim();
4
- if (providerName) {
5
- return `⚠️ ${providerName} returned a billing error — your API key has run out of credits or has an insufficient balance. Check your ${providerName} billing dashboard and top up or switch to a different API key.`;
7
+ const modelName = model?.trim();
8
+ const providerLabel = providerName && modelName ? `${providerName} (${modelName})` : providerName || undefined;
9
+ if (providerLabel) {
10
+ return `⚠️ ${providerLabel} returned a billing error — your API key has run out of credits or has an insufficient balance. Check your ${providerName} billing dashboard and top up or switch to a different API key.`;
6
11
  }
7
12
  return "⚠️ API provider returned a billing error — your API key has run out of credits or has an insufficient balance. Check your provider's billing dashboard and top up or switch to a different API key.";
8
13
  }
@@ -199,15 +204,6 @@ function shouldRewriteContextOverflowText(raw) {
199
204
  ERROR_PREFIX_RE.test(raw) ||
200
205
  CONTEXT_OVERFLOW_ERROR_HEAD_RE.test(raw));
201
206
  }
202
- function shouldRewriteBillingText(raw) {
203
- if (!isBillingErrorMessage(raw)) {
204
- return false;
205
- }
206
- return (isRawApiErrorPayload(raw) ||
207
- isLikelyHttpErrorText(raw) ||
208
- ERROR_PREFIX_RE.test(raw) ||
209
- BILLING_ERROR_HEAD_RE.test(raw));
210
- }
211
207
  function isErrorPayloadObject(payload) {
212
208
  if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
213
209
  return false;
@@ -260,18 +256,6 @@ function parseApiErrorPayload(raw) {
260
256
  }
261
257
  return null;
262
258
  }
263
- function stableStringify(value) {
264
- if (!value || typeof value !== "object") {
265
- return JSON.stringify(value) ?? "null";
266
- }
267
- if (Array.isArray(value)) {
268
- return `[${value.map((entry) => stableStringify(entry)).join(",")}]`;
269
- }
270
- const record = value;
271
- const keys = Object.keys(record).toSorted();
272
- const entries = keys.map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`);
273
- return `{${entries.join(",")}}`;
274
- }
275
259
  export function getApiErrorPayloadFingerprint(raw) {
276
260
  if (!raw) {
277
261
  return null;
@@ -404,14 +388,14 @@ export function formatAssistantErrorText(msg, opts) {
404
388
  return "LLM request timed out.";
405
389
  }
406
390
  if (isBillingErrorMessage(raw)) {
407
- return formatBillingErrorMessage(opts?.provider);
391
+ return formatBillingErrorMessage(opts?.provider, opts?.model ?? msg.model);
408
392
  }
409
393
  if (isLikelyHttpErrorText(raw) || isRawApiErrorPayload(raw)) {
410
394
  return formatRawAssistantErrorForUi(raw);
411
395
  }
412
396
  // Never return raw unhandled errors - log for debugging but return safe message
413
397
  if (raw.length > 600) {
414
- console.warn("[formatAssistantErrorText] Long error truncated:", raw.slice(0, 200));
398
+ log.warn(`Long error truncated: ${raw.slice(0, 200)}`);
415
399
  }
416
400
  return raw.length > 600 ? `${raw.slice(0, 600)}…` : raw;
417
401
  }
@@ -453,12 +437,6 @@ export function sanitizeUserFacingText(text, opts) {
453
437
  return formatRawAssistantErrorForUi(trimmed);
454
438
  }
455
439
  }
456
- // Preserve legacy behavior for explicit billing-head text outside known
457
- // error contexts (e.g., "billing: please upgrade your plan"), while
458
- // keeping conversational billing mentions untouched.
459
- if (shouldRewriteBillingText(trimmed)) {
460
- return BILLING_ERROR_USER_MESSAGE;
461
- }
462
440
  // Strip leading blank lines (including whitespace-only lines) without clobbering indentation on
463
441
  // the first content line (e.g. markdown/code blocks).
464
442
  const withoutLeadingEmptyLines = stripped.replace(/^(?:[ \t]*\r?\n)+/, "");
@@ -479,7 +457,12 @@ const ERROR_PATTERNS = {
479
457
  "resource_exhausted",
480
458
  "usage limit",
481
459
  ],
482
- overloaded: [/overloaded_error|"type"\s*:\s*"overloaded_error"/i, "overloaded"],
460
+ overloaded: [
461
+ /overloaded_error|"type"\s*:\s*"overloaded_error"/i,
462
+ "overloaded",
463
+ "service unavailable",
464
+ "high demand",
465
+ ],
483
466
  timeout: [
484
467
  "timeout",
485
468
  "timed out",
@@ -575,6 +558,15 @@ export function isAuthErrorMessage(raw) {
575
558
  export function isOverloadedErrorMessage(raw) {
576
559
  return matchesErrorPatterns(raw, ERROR_PATTERNS.overloaded);
577
560
  }
561
+ function isJsonApiInternalServerError(raw) {
562
+ if (!raw) {
563
+ return false;
564
+ }
565
+ const value = raw.toLowerCase();
566
+ // Anthropic often wraps transient 500s in JSON payloads like:
567
+ // {"type":"error","error":{"type":"api_error","message":"Internal server error"}}
568
+ return value.includes('"type":"api_error"') && value.includes("internal server error");
569
+ }
578
570
  export function parseImageDimensionError(raw) {
579
571
  if (!raw) {
580
572
  return null;
@@ -624,6 +616,30 @@ export function isAuthAssistantError(msg) {
624
616
  }
625
617
  return isAuthErrorMessage(msg.errorMessage ?? "");
626
618
  }
619
+ export function isModelNotFoundErrorMessage(raw) {
620
+ if (!raw) {
621
+ return false;
622
+ }
623
+ const lower = raw.toLowerCase();
624
+ // Direct pattern matches from Pool Bot internals and common providers.
625
+ if (lower.includes("unknown model") ||
626
+ lower.includes("model not found") ||
627
+ lower.includes("model_not_found") ||
628
+ lower.includes("not_found_error") ||
629
+ (lower.includes("does not exist") && lower.includes("model")) ||
630
+ (lower.includes("invalid model") && !lower.includes("invalid model reference"))) {
631
+ return true;
632
+ }
633
+ // Google Gemini: "models/X is not found for api version"
634
+ if (/models\/[^\s]+ is not found/i.test(raw)) {
635
+ return true;
636
+ }
637
+ // JSON error payloads: {"status": "NOT_FOUND"} or {"code": 404} combined with not-found text.
638
+ if (/\b404\b/.test(raw) && /not[-_ ]?found/i.test(raw)) {
639
+ return true;
640
+ }
641
+ return false;
642
+ }
627
643
  export function classifyFailoverReason(raw) {
628
644
  if (isImageDimensionErrorMessage(raw)) {
629
645
  return null;
@@ -631,10 +647,16 @@ export function classifyFailoverReason(raw) {
631
647
  if (isImageSizeError(raw)) {
632
648
  return null;
633
649
  }
650
+ if (isModelNotFoundErrorMessage(raw)) {
651
+ return "model_not_found";
652
+ }
634
653
  if (isTransientHttpError(raw)) {
635
654
  // Treat transient 5xx provider failures as retryable transport issues.
636
655
  return "timeout";
637
656
  }
657
+ if (isJsonApiInternalServerError(raw)) {
658
+ return "timeout";
659
+ }
638
660
  if (isRateLimitErrorMessage(raw)) {
639
661
  return "rate_limit";
640
662
  }
@@ -15,21 +15,26 @@ export function normalizeTextForComparison(text) {
15
15
  .trim();
16
16
  }
17
17
  export function isMessagingToolDuplicateNormalized(normalized, normalizedSentTexts) {
18
- if (normalizedSentTexts.length === 0)
18
+ if (normalizedSentTexts.length === 0) {
19
19
  return false;
20
- if (!normalized || normalized.length < MIN_DUPLICATE_TEXT_LENGTH)
20
+ }
21
+ if (!normalized || normalized.length < MIN_DUPLICATE_TEXT_LENGTH) {
21
22
  return false;
23
+ }
22
24
  return normalizedSentTexts.some((normalizedSent) => {
23
- if (!normalizedSent || normalizedSent.length < MIN_DUPLICATE_TEXT_LENGTH)
25
+ if (!normalizedSent || normalizedSent.length < MIN_DUPLICATE_TEXT_LENGTH) {
24
26
  return false;
27
+ }
25
28
  return normalized.includes(normalizedSent) || normalizedSent.includes(normalized);
26
29
  });
27
30
  }
28
31
  export function isMessagingToolDuplicate(text, sentTexts) {
29
- if (sentTexts.length === 0)
32
+ if (sentTexts.length === 0) {
30
33
  return false;
34
+ }
31
35
  const normalized = normalizeTextForComparison(text);
32
- if (!normalized || normalized.length < MIN_DUPLICATE_TEXT_LENGTH)
36
+ if (!normalized || normalized.length < MIN_DUPLICATE_TEXT_LENGTH) {
33
37
  return false;
38
+ }
34
39
  return isMessagingToolDuplicateNormalized(normalized, sentTexts.map(normalizeTextForComparison));
35
40
  }
@@ -1,8 +1,9 @@
1
1
  import { normalizeThinkLevel } from "../../auto-reply/thinking.js";
2
2
  function extractSupportedValues(raw) {
3
3
  const match = raw.match(/supported values are:\s*([^\n.]+)/i) ?? raw.match(/supported values:\s*([^\n.]+)/i);
4
- if (!match?.[1])
4
+ if (!match?.[1]) {
5
5
  return [];
6
+ }
6
7
  const fragment = match[1];
7
8
  const quoted = Array.from(fragment.matchAll(/['"]([^'"]+)['"]/g)).map((entry) => entry[1]?.trim());
8
9
  if (quoted.length > 0) {
@@ -15,17 +16,21 @@ function extractSupportedValues(raw) {
15
16
  }
16
17
  export function pickFallbackThinkingLevel(params) {
17
18
  const raw = params.message?.trim();
18
- if (!raw)
19
+ if (!raw) {
19
20
  return undefined;
21
+ }
20
22
  const supported = extractSupportedValues(raw);
21
- if (supported.length === 0)
23
+ if (supported.length === 0) {
22
24
  return undefined;
25
+ }
23
26
  for (const entry of supported) {
24
27
  const normalized = normalizeThinkLevel(entry);
25
- if (!normalized)
28
+ if (!normalized) {
26
29
  continue;
27
- if (params.attempted.has(normalized))
30
+ }
31
+ if (params.attempted.has(normalized)) {
28
32
  continue;
33
+ }
29
34
  return normalized;
30
35
  }
31
36
  return undefined;
@@ -1,5 +1,5 @@
1
1
  export { buildBootstrapContextFiles, DEFAULT_BOOTSTRAP_MAX_CHARS, DEFAULT_BOOTSTRAP_TOTAL_MAX_CHARS, ensureSessionHeader, resolveBootstrapMaxChars, resolveBootstrapTotalMaxChars, stripThoughtSignatures, } from "./pi-embedded-helpers/bootstrap.js";
2
- export { BILLING_ERROR_USER_MESSAGE, formatBillingErrorMessage, classifyFailoverReason, formatRawAssistantErrorForUi, formatAssistantErrorText, getApiErrorPayloadFingerprint, isAuthAssistantError, isAuthErrorMessage, isBillingAssistantError, parseApiErrorInfo, sanitizeUserFacingText, isBillingErrorMessage, isCloudflareOrHtmlErrorPage, isCloudCodeAssistFormatError, isCompactionFailureError, isContextOverflowError, isLikelyContextOverflowError, isFailoverAssistantError, isFailoverErrorMessage, isImageDimensionErrorMessage, isImageSizeError, isOverloadedErrorMessage, isRawApiErrorPayload, isRateLimitAssistantError, isRateLimitErrorMessage, isTransientHttpError, isTimeoutErrorMessage, parseImageDimensionError, parseImageSizeError, } from "./pi-embedded-helpers/errors.js";
2
+ export { BILLING_ERROR_USER_MESSAGE, formatBillingErrorMessage, classifyFailoverReason, formatRawAssistantErrorForUi, formatAssistantErrorText, getApiErrorPayloadFingerprint, isAuthAssistantError, isAuthErrorMessage, isModelNotFoundErrorMessage, isBillingAssistantError, parseApiErrorInfo, sanitizeUserFacingText, isBillingErrorMessage, isCloudflareOrHtmlErrorPage, isCloudCodeAssistFormatError, isCompactionFailureError, isContextOverflowError, isLikelyContextOverflowError, isFailoverAssistantError, isFailoverErrorMessage, isImageDimensionErrorMessage, isImageSizeError, isOverloadedErrorMessage, isRawApiErrorPayload, isRateLimitAssistantError, isRateLimitErrorMessage, isTransientHttpError, isTimeoutErrorMessage, parseImageDimensionError, parseImageSizeError, } from "./pi-embedded-helpers/errors.js";
3
3
  export { isGoogleModelApi, sanitizeGoogleTurnOrdering } from "./pi-embedded-helpers/google.js";
4
4
  export { downgradeOpenAIReasoningBlocks } from "./pi-embedded-helpers/openai.js";
5
5
  export { isEmptyAssistantMessageContent, sanitizeSessionMessagesImages, } from "./pi-embedded-helpers/images.js";