@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,3 +1,4 @@
1
+ import { QIANFAN_BASE_URL, QIANFAN_DEFAULT_MODEL_ID } from "../agents/models-config.providers.js";
1
2
  export const DEFAULT_MINIMAX_BASE_URL = "https://api.minimax.io/v1";
2
3
  export const MINIMAX_API_BASE_URL = "https://api.minimax.io/anthropic";
3
4
  export const MINIMAX_HOSTED_MODEL_ID = "MiniMax-M2.1";
@@ -5,17 +6,15 @@ export const MINIMAX_HOSTED_MODEL_REF = `minimax/${MINIMAX_HOSTED_MODEL_ID}`;
5
6
  export const DEFAULT_MINIMAX_CONTEXT_WINDOW = 200000;
6
7
  export const DEFAULT_MINIMAX_MAX_TOKENS = 8192;
7
8
  export const MOONSHOT_BASE_URL = "https://api.moonshot.ai/v1";
8
- export const MOONSHOT_DEFAULT_MODEL_ID = "kimi-k2-0905-preview";
9
+ export const MOONSHOT_CN_BASE_URL = "https://api.moonshot.cn/v1";
10
+ export const MOONSHOT_DEFAULT_MODEL_ID = "kimi-k2.5";
9
11
  export const MOONSHOT_DEFAULT_MODEL_REF = `moonshot/${MOONSHOT_DEFAULT_MODEL_ID}`;
10
12
  export const MOONSHOT_DEFAULT_CONTEXT_WINDOW = 256000;
11
13
  export const MOONSHOT_DEFAULT_MAX_TOKENS = 8192;
12
- export const KIMI_CODE_BASE_URL = "https://api.kimi.com/coding/v1";
13
- export const KIMI_CODE_MODEL_ID = "kimi-for-coding";
14
- export const KIMI_CODE_MODEL_REF = `kimi-code/${KIMI_CODE_MODEL_ID}`;
15
- export const KIMI_CODE_CONTEXT_WINDOW = 262144;
16
- export const KIMI_CODE_MAX_TOKENS = 32768;
17
- export const KIMI_CODE_HEADERS = { "User-Agent": "KimiCLI/0.77" };
18
- export const KIMI_CODE_COMPAT = { supportsDeveloperRole: false };
14
+ export const KIMI_CODING_MODEL_ID = "k2p5";
15
+ export const KIMI_CODING_MODEL_REF = `kimi-coding/${KIMI_CODING_MODEL_ID}`;
16
+ export { QIANFAN_BASE_URL, QIANFAN_DEFAULT_MODEL_ID };
17
+ export const QIANFAN_DEFAULT_MODEL_REF = `qianfan/${QIANFAN_DEFAULT_MODEL_ID}`;
19
18
  // Pricing: MiniMax doesn't publish public rates. Override in models.json for accurate costs.
20
19
  export const MINIMAX_API_COST = {
21
20
  input: 15,
@@ -41,12 +40,6 @@ export const MOONSHOT_DEFAULT_COST = {
41
40
  cacheRead: 0,
42
41
  cacheWrite: 0,
43
42
  };
44
- export const KIMI_CODE_DEFAULT_COST = {
45
- input: 0,
46
- output: 0,
47
- cacheRead: 0,
48
- cacheWrite: 0,
49
- };
50
43
  const MINIMAX_MODEL_CATALOG = {
51
44
  "MiniMax-M2.1": { name: "MiniMax M2.1", reasoning: false },
52
45
  "MiniMax-M2.1-lightning": {
@@ -77,7 +70,7 @@ export function buildMinimaxApiModelDefinition(modelId) {
77
70
  export function buildMoonshotModelDefinition() {
78
71
  return {
79
72
  id: MOONSHOT_DEFAULT_MODEL_ID,
80
- name: "Kimi K2 0905 Preview",
73
+ name: "Kimi K2.5",
81
74
  reasoning: false,
82
75
  input: ["text"],
83
76
  cost: MOONSHOT_DEFAULT_COST,
@@ -85,16 +78,25 @@ export function buildMoonshotModelDefinition() {
85
78
  maxTokens: MOONSHOT_DEFAULT_MAX_TOKENS,
86
79
  };
87
80
  }
88
- export function buildKimiCodeModelDefinition() {
81
+ export const XAI_BASE_URL = "https://api.x.ai/v1";
82
+ export const XAI_DEFAULT_MODEL_ID = "grok-4";
83
+ export const XAI_DEFAULT_MODEL_REF = `xai/${XAI_DEFAULT_MODEL_ID}`;
84
+ export const XAI_DEFAULT_CONTEXT_WINDOW = 131072;
85
+ export const XAI_DEFAULT_MAX_TOKENS = 8192;
86
+ export const XAI_DEFAULT_COST = {
87
+ input: 0,
88
+ output: 0,
89
+ cacheRead: 0,
90
+ cacheWrite: 0,
91
+ };
92
+ export function buildXaiModelDefinition() {
89
93
  return {
90
- id: KIMI_CODE_MODEL_ID,
91
- name: "Kimi For Coding",
92
- reasoning: true,
94
+ id: XAI_DEFAULT_MODEL_ID,
95
+ name: "Grok 4",
96
+ reasoning: false,
93
97
  input: ["text"],
94
- cost: KIMI_CODE_DEFAULT_COST,
95
- contextWindow: KIMI_CODE_CONTEXT_WINDOW,
96
- maxTokens: KIMI_CODE_MAX_TOKENS,
97
- headers: KIMI_CODE_HEADERS,
98
- compat: KIMI_CODE_COMPAT,
98
+ cost: XAI_DEFAULT_COST,
99
+ contextWindow: XAI_DEFAULT_CONTEXT_WINDOW,
100
+ maxTokens: XAI_DEFAULT_MAX_TOKENS,
99
101
  };
100
102
  }
@@ -0,0 +1,384 @@
1
+ import { DEFAULT_PROVIDER } from "../agents/defaults.js";
2
+ import { buildModelAliasIndex, modelKey } from "../agents/model-selection.js";
3
+ import { fetchWithTimeout } from "../utils/fetch-timeout.js";
4
+ import { applyPrimaryModel } from "./model-picker.js";
5
+ import { normalizeAlias } from "./models/shared.js";
6
+ const DEFAULT_OLLAMA_BASE_URL = "http://127.0.0.1:11434/v1";
7
+ const DEFAULT_CONTEXT_WINDOW = 4096;
8
+ const DEFAULT_MAX_TOKENS = 4096;
9
+ const VERIFY_TIMEOUT_MS = 10000;
10
+ const COMPATIBILITY_OPTIONS = [
11
+ {
12
+ value: "openai",
13
+ label: "OpenAI-compatible",
14
+ hint: "Uses /chat/completions",
15
+ api: "openai-completions",
16
+ },
17
+ {
18
+ value: "anthropic",
19
+ label: "Anthropic-compatible",
20
+ hint: "Uses /messages",
21
+ api: "anthropic-messages",
22
+ },
23
+ {
24
+ value: "unknown",
25
+ label: "Unknown (detect automatically)",
26
+ hint: "Probes OpenAI then Anthropic endpoints",
27
+ },
28
+ ];
29
+ function normalizeEndpointId(raw) {
30
+ const trimmed = raw.trim().toLowerCase();
31
+ if (!trimmed) {
32
+ return "";
33
+ }
34
+ return trimmed.replace(/[^a-z0-9-]+/g, "-").replace(/^-+|-+$/g, "");
35
+ }
36
+ function buildEndpointIdFromUrl(baseUrl) {
37
+ try {
38
+ const url = new URL(baseUrl);
39
+ const host = url.hostname.replace(/[^a-z0-9]+/gi, "-").toLowerCase();
40
+ const port = url.port ? `-${url.port}` : "";
41
+ const candidate = `custom-${host}${port}`;
42
+ return normalizeEndpointId(candidate) || "custom";
43
+ }
44
+ catch {
45
+ return "custom";
46
+ }
47
+ }
48
+ function resolveUniqueEndpointId(params) {
49
+ const normalized = normalizeEndpointId(params.requestedId) || "custom";
50
+ const existing = params.providers[normalized];
51
+ if (!existing?.baseUrl || existing.baseUrl === params.baseUrl) {
52
+ return { providerId: normalized, renamed: false };
53
+ }
54
+ let suffix = 2;
55
+ let candidate = `${normalized}-${suffix}`;
56
+ while (params.providers[candidate]) {
57
+ suffix += 1;
58
+ candidate = `${normalized}-${suffix}`;
59
+ }
60
+ return { providerId: candidate, renamed: true };
61
+ }
62
+ function resolveAliasError(params) {
63
+ const trimmed = params.raw.trim();
64
+ if (!trimmed) {
65
+ return undefined;
66
+ }
67
+ let normalized;
68
+ try {
69
+ normalized = normalizeAlias(trimmed);
70
+ }
71
+ catch (err) {
72
+ return err instanceof Error ? err.message : "Alias is invalid.";
73
+ }
74
+ const aliasIndex = buildModelAliasIndex({
75
+ cfg: params.cfg,
76
+ defaultProvider: DEFAULT_PROVIDER,
77
+ });
78
+ const aliasKey = normalized.toLowerCase();
79
+ const existing = aliasIndex.byAlias.get(aliasKey);
80
+ if (!existing) {
81
+ return undefined;
82
+ }
83
+ const existingKey = modelKey(existing.ref.provider, existing.ref.model);
84
+ if (existingKey === params.modelRef) {
85
+ return undefined;
86
+ }
87
+ return `Alias ${normalized} already points to ${existingKey}.`;
88
+ }
89
+ function buildOpenAiHeaders(apiKey) {
90
+ const headers = {};
91
+ if (apiKey) {
92
+ headers.Authorization = `Bearer ${apiKey}`;
93
+ }
94
+ return headers;
95
+ }
96
+ function buildAnthropicHeaders(apiKey) {
97
+ const headers = {
98
+ "anthropic-version": "2023-06-01",
99
+ };
100
+ if (apiKey) {
101
+ headers["x-api-key"] = apiKey;
102
+ }
103
+ return headers;
104
+ }
105
+ function formatVerificationError(error) {
106
+ if (!error) {
107
+ return "unknown error";
108
+ }
109
+ if (error instanceof Error) {
110
+ return error.message;
111
+ }
112
+ if (typeof error === "string") {
113
+ return error;
114
+ }
115
+ try {
116
+ return JSON.stringify(error);
117
+ }
118
+ catch {
119
+ return "unknown error";
120
+ }
121
+ }
122
+ async function requestOpenAiVerification(params) {
123
+ const endpoint = new URL("chat/completions", params.baseUrl.endsWith("/") ? params.baseUrl : `${params.baseUrl}/`).href;
124
+ try {
125
+ const res = await fetchWithTimeout(endpoint, {
126
+ method: "POST",
127
+ headers: {
128
+ "Content-Type": "application/json",
129
+ ...buildOpenAiHeaders(params.apiKey),
130
+ },
131
+ body: JSON.stringify({
132
+ model: params.modelId,
133
+ messages: [{ role: "user", content: "Hi" }],
134
+ max_tokens: 5,
135
+ }),
136
+ }, VERIFY_TIMEOUT_MS);
137
+ return { ok: res.ok, status: res.status };
138
+ }
139
+ catch (error) {
140
+ return { ok: false, error };
141
+ }
142
+ }
143
+ async function requestAnthropicVerification(params) {
144
+ const endpoint = new URL("messages", params.baseUrl.endsWith("/") ? params.baseUrl : `${params.baseUrl}/`).href;
145
+ try {
146
+ const res = await fetchWithTimeout(endpoint, {
147
+ method: "POST",
148
+ headers: {
149
+ "Content-Type": "application/json",
150
+ ...buildAnthropicHeaders(params.apiKey),
151
+ },
152
+ body: JSON.stringify({
153
+ model: params.modelId,
154
+ max_tokens: 16,
155
+ messages: [{ role: "user", content: "Hi" }],
156
+ }),
157
+ }, VERIFY_TIMEOUT_MS);
158
+ return { ok: res.ok, status: res.status };
159
+ }
160
+ catch (error) {
161
+ return { ok: false, error };
162
+ }
163
+ }
164
+ async function promptBaseUrlAndKey(params) {
165
+ const baseUrlInput = await params.prompter.text({
166
+ message: "API Base URL",
167
+ initialValue: params.initialBaseUrl ?? DEFAULT_OLLAMA_BASE_URL,
168
+ placeholder: "https://api.example.com/v1",
169
+ validate: (val) => {
170
+ try {
171
+ new URL(val);
172
+ return undefined;
173
+ }
174
+ catch {
175
+ return "Please enter a valid URL (e.g. http://...)";
176
+ }
177
+ },
178
+ });
179
+ const apiKeyInput = await params.prompter.text({
180
+ message: "API Key (leave blank if not required)",
181
+ placeholder: "sk-...",
182
+ initialValue: "",
183
+ });
184
+ return { baseUrl: baseUrlInput.trim(), apiKey: apiKeyInput.trim() };
185
+ }
186
+ export async function promptCustomApiConfig(params) {
187
+ const { prompter, runtime, config } = params;
188
+ const baseInput = await promptBaseUrlAndKey({ prompter });
189
+ let baseUrl = baseInput.baseUrl;
190
+ let apiKey = baseInput.apiKey;
191
+ const compatibilityChoice = await prompter.select({
192
+ message: "Endpoint compatibility",
193
+ options: COMPATIBILITY_OPTIONS.map((option) => ({
194
+ value: option.value,
195
+ label: option.label,
196
+ hint: option.hint,
197
+ })),
198
+ });
199
+ let modelId = (await prompter.text({
200
+ message: "Model ID",
201
+ placeholder: "e.g. llama3, claude-3-7-sonnet",
202
+ validate: (val) => (val.trim() ? undefined : "Model ID is required"),
203
+ })).trim();
204
+ let compatibility = compatibilityChoice === "unknown" ? null : compatibilityChoice;
205
+ let providerApi = COMPATIBILITY_OPTIONS.find((entry) => entry.value === compatibility)?.api ??
206
+ "openai-completions";
207
+ while (true) {
208
+ let verifiedFromProbe = false;
209
+ if (!compatibility) {
210
+ const probeSpinner = prompter.progress("Detecting endpoint type...");
211
+ const openaiProbe = await requestOpenAiVerification({ baseUrl, apiKey, modelId });
212
+ if (openaiProbe.ok) {
213
+ probeSpinner.stop("Detected OpenAI-compatible endpoint.");
214
+ compatibility = "openai";
215
+ providerApi = "openai-completions";
216
+ verifiedFromProbe = true;
217
+ }
218
+ else {
219
+ const anthropicProbe = await requestAnthropicVerification({ baseUrl, apiKey, modelId });
220
+ if (anthropicProbe.ok) {
221
+ probeSpinner.stop("Detected Anthropic-compatible endpoint.");
222
+ compatibility = "anthropic";
223
+ providerApi = "anthropic-messages";
224
+ verifiedFromProbe = true;
225
+ }
226
+ else {
227
+ probeSpinner.stop("Could not detect endpoint type.");
228
+ await prompter.note("This endpoint did not respond to OpenAI or Anthropic style requests.", "Endpoint detection");
229
+ const retryChoice = await prompter.select({
230
+ message: "What would you like to change?",
231
+ options: [
232
+ { value: "baseUrl", label: "Change base URL" },
233
+ { value: "model", label: "Change model" },
234
+ { value: "both", label: "Change base URL and model" },
235
+ ],
236
+ });
237
+ if (retryChoice === "baseUrl" || retryChoice === "both") {
238
+ const retryInput = await promptBaseUrlAndKey({
239
+ prompter,
240
+ initialBaseUrl: baseUrl,
241
+ });
242
+ baseUrl = retryInput.baseUrl;
243
+ apiKey = retryInput.apiKey;
244
+ }
245
+ if (retryChoice === "model" || retryChoice === "both") {
246
+ modelId = (await prompter.text({
247
+ message: "Model ID",
248
+ placeholder: "e.g. llama3, claude-3-7-sonnet",
249
+ validate: (val) => (val.trim() ? undefined : "Model ID is required"),
250
+ })).trim();
251
+ }
252
+ continue;
253
+ }
254
+ }
255
+ }
256
+ if (verifiedFromProbe) {
257
+ break;
258
+ }
259
+ const verifySpinner = prompter.progress("Verifying...");
260
+ const result = compatibility === "anthropic"
261
+ ? await requestAnthropicVerification({ baseUrl, apiKey, modelId })
262
+ : await requestOpenAiVerification({ baseUrl, apiKey, modelId });
263
+ if (result.ok) {
264
+ verifySpinner.stop("Verification successful.");
265
+ break;
266
+ }
267
+ if (result.status !== undefined) {
268
+ verifySpinner.stop(`Verification failed: status ${result.status}`);
269
+ }
270
+ else {
271
+ verifySpinner.stop(`Verification failed: ${formatVerificationError(result.error)}`);
272
+ }
273
+ const retryChoice = await prompter.select({
274
+ message: "What would you like to change?",
275
+ options: [
276
+ { value: "baseUrl", label: "Change base URL" },
277
+ { value: "model", label: "Change model" },
278
+ { value: "both", label: "Change base URL and model" },
279
+ ],
280
+ });
281
+ if (retryChoice === "baseUrl" || retryChoice === "both") {
282
+ const retryInput = await promptBaseUrlAndKey({
283
+ prompter,
284
+ initialBaseUrl: baseUrl,
285
+ });
286
+ baseUrl = retryInput.baseUrl;
287
+ apiKey = retryInput.apiKey;
288
+ }
289
+ if (retryChoice === "model" || retryChoice === "both") {
290
+ modelId = (await prompter.text({
291
+ message: "Model ID",
292
+ placeholder: "e.g. llama3, claude-3-7-sonnet",
293
+ validate: (val) => (val.trim() ? undefined : "Model ID is required"),
294
+ })).trim();
295
+ }
296
+ if (compatibilityChoice === "unknown") {
297
+ compatibility = null;
298
+ }
299
+ }
300
+ const providers = config.models?.providers ?? {};
301
+ const suggestedId = buildEndpointIdFromUrl(baseUrl);
302
+ const providerIdInput = await prompter.text({
303
+ message: "Endpoint ID",
304
+ initialValue: suggestedId,
305
+ placeholder: "custom",
306
+ validate: (value) => {
307
+ const normalized = normalizeEndpointId(value);
308
+ if (!normalized) {
309
+ return "Endpoint ID is required.";
310
+ }
311
+ return undefined;
312
+ },
313
+ });
314
+ const providerIdResult = resolveUniqueEndpointId({
315
+ requestedId: providerIdInput,
316
+ baseUrl,
317
+ providers,
318
+ });
319
+ if (providerIdResult.renamed) {
320
+ await prompter.note(`Endpoint ID "${providerIdInput}" already exists for a different base URL. Using "${providerIdResult.providerId}".`, "Endpoint ID");
321
+ }
322
+ const providerId = providerIdResult.providerId;
323
+ const modelRef = modelKey(providerId, modelId);
324
+ const aliasInput = await prompter.text({
325
+ message: "Model alias (optional)",
326
+ placeholder: "e.g. local, ollama",
327
+ initialValue: "",
328
+ validate: (value) => resolveAliasError({ raw: value, cfg: config, modelRef }),
329
+ });
330
+ const alias = aliasInput.trim();
331
+ const existingProvider = providers[providerId];
332
+ const existingModels = Array.isArray(existingProvider?.models) ? existingProvider.models : [];
333
+ const hasModel = existingModels.some((model) => model.id === modelId);
334
+ const nextModel = {
335
+ id: modelId,
336
+ name: `${modelId} (Custom Provider)`,
337
+ contextWindow: DEFAULT_CONTEXT_WINDOW,
338
+ maxTokens: DEFAULT_MAX_TOKENS,
339
+ input: ["text"],
340
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
341
+ reasoning: false,
342
+ };
343
+ const mergedModels = hasModel ? existingModels : [...existingModels, nextModel];
344
+ const { apiKey: existingApiKey, ...existingProviderRest } = existingProvider ?? {};
345
+ const normalizedApiKey = apiKey.trim() || (existingApiKey ? existingApiKey.trim() : undefined);
346
+ let newConfig = {
347
+ ...config,
348
+ models: {
349
+ ...config.models,
350
+ mode: config.models?.mode ?? "merge",
351
+ providers: {
352
+ ...providers,
353
+ [providerId]: {
354
+ ...existingProviderRest,
355
+ baseUrl,
356
+ api: providerApi,
357
+ ...(normalizedApiKey ? { apiKey: normalizedApiKey } : {}),
358
+ models: mergedModels.length > 0 ? mergedModels : [nextModel],
359
+ },
360
+ },
361
+ },
362
+ };
363
+ newConfig = applyPrimaryModel(newConfig, modelRef);
364
+ if (alias) {
365
+ newConfig = {
366
+ ...newConfig,
367
+ agents: {
368
+ ...newConfig.agents,
369
+ defaults: {
370
+ ...newConfig.agents?.defaults,
371
+ models: {
372
+ ...newConfig.agents?.defaults?.models,
373
+ [modelRef]: {
374
+ ...newConfig.agents?.defaults?.models?.[modelRef],
375
+ alias,
376
+ },
377
+ },
378
+ },
379
+ },
380
+ };
381
+ }
382
+ runtime.log(`Configured custom provider: ${providerId}/${modelId}`);
383
+ return { config: newConfig, providerId, modelId };
384
+ }
@@ -0,0 +1,35 @@
1
+ const AUTH_CHOICE_FLAG_MAP = [
2
+ { flag: "anthropicApiKey", authChoice: "apiKey", label: "--anthropic-api-key" },
3
+ { flag: "geminiApiKey", authChoice: "gemini-api-key", label: "--gemini-api-key" },
4
+ { flag: "openaiApiKey", authChoice: "openai-api-key", label: "--openai-api-key" },
5
+ { flag: "openrouterApiKey", authChoice: "openrouter-api-key", label: "--openrouter-api-key" },
6
+ { flag: "aiGatewayApiKey", authChoice: "ai-gateway-api-key", label: "--ai-gateway-api-key" },
7
+ {
8
+ flag: "cloudflareAiGatewayApiKey",
9
+ authChoice: "cloudflare-ai-gateway-api-key",
10
+ label: "--cloudflare-ai-gateway-api-key",
11
+ },
12
+ { flag: "moonshotApiKey", authChoice: "moonshot-api-key", label: "--moonshot-api-key" },
13
+ { flag: "kimiCodeApiKey", authChoice: "kimi-code-api-key", label: "--kimi-code-api-key" },
14
+ { flag: "syntheticApiKey", authChoice: "synthetic-api-key", label: "--synthetic-api-key" },
15
+ { flag: "veniceApiKey", authChoice: "venice-api-key", label: "--venice-api-key" },
16
+ { flag: "zaiApiKey", authChoice: "zai-api-key", label: "--zai-api-key" },
17
+ { flag: "xiaomiApiKey", authChoice: "xiaomi-api-key", label: "--xiaomi-api-key" },
18
+ { flag: "xaiApiKey", authChoice: "xai-api-key", label: "--xai-api-key" },
19
+ { flag: "minimaxApiKey", authChoice: "minimax-api", label: "--minimax-api-key" },
20
+ { flag: "opencodeZenApiKey", authChoice: "opencode-zen", label: "--opencode-zen-api-key" },
21
+ ];
22
+ // Infer auth choice from explicit provider API key flags.
23
+ export function inferAuthChoiceFromFlags(opts) {
24
+ const matches = AUTH_CHOICE_FLAG_MAP.filter(({ flag }) => {
25
+ const value = opts[flag];
26
+ if (typeof value === "string") {
27
+ return value.trim().length > 0;
28
+ }
29
+ return Boolean(value);
30
+ });
31
+ return {
32
+ choice: matches[0]?.authChoice,
33
+ matches,
34
+ };
35
+ }