@poolzin/pool-bot 2026.2.21 → 2026.2.23

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 (378) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/agents/api-key-rotation.js +47 -0
  3. package/dist/agents/apply-patch-update.js +19 -9
  4. package/dist/agents/apply-patch.js +72 -47
  5. package/dist/agents/bash-tools.exec.js +141 -559
  6. package/dist/agents/cli-backends.js +49 -6
  7. package/dist/agents/cli-runner/helpers.js +69 -152
  8. package/dist/agents/cli-runner.js +70 -19
  9. package/dist/agents/identity.js +20 -1
  10. package/dist/agents/image-sanitization.js +9 -0
  11. package/dist/agents/live-auth-keys.js +123 -26
  12. package/dist/agents/live-model-filter.js +13 -4
  13. package/dist/agents/model-catalog.js +40 -9
  14. package/dist/agents/model-forward-compat.js +60 -23
  15. package/dist/agents/model-selection.js +134 -41
  16. package/dist/agents/pi-auth-json.js +2 -2
  17. package/dist/agents/pi-embedded-helpers/bootstrap.js +65 -15
  18. package/dist/agents/pi-embedded-helpers/errors.js +140 -15
  19. package/dist/agents/pi-embedded-helpers/images.js +22 -12
  20. package/dist/agents/pi-embedded-helpers.js +2 -2
  21. package/dist/agents/pi-embedded-runner/abort.js +10 -3
  22. package/dist/agents/pi-embedded-runner/compact.js +230 -32
  23. package/dist/agents/pi-embedded-runner/extra-params.js +203 -12
  24. package/dist/agents/pi-embedded-runner/google.js +109 -19
  25. package/dist/agents/pi-embedded-runner/history.js +35 -17
  26. package/dist/agents/pi-embedded-runner/run/attempt.js +386 -95
  27. package/dist/agents/pi-embedded-runner/run/images.js +81 -55
  28. package/dist/agents/pi-embedded-runner/run/payloads.js +89 -39
  29. package/dist/agents/pi-embedded-runner/run.js +193 -25
  30. package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +2 -2
  31. package/dist/agents/pi-embedded-runner/runs.js +17 -8
  32. package/dist/agents/pi-embedded-runner/tool-result-context-guard.js +262 -0
  33. package/dist/agents/pi-embedded-runner.js +1 -1
  34. package/dist/agents/pi-embedded-subscribe.handlers.tools.js +180 -10
  35. package/dist/agents/pi-embedded-subscribe.js +37 -0
  36. package/dist/agents/pi-embedded-subscribe.tools.js +127 -30
  37. package/dist/agents/pi-model-discovery.js +9 -2
  38. package/dist/agents/pi-tool-definition-adapter.js +60 -8
  39. package/dist/agents/pi-tools.before-tool-call.js +1 -1
  40. package/dist/agents/pi-tools.js +113 -94
  41. package/dist/agents/pi-tools.read.js +337 -38
  42. package/dist/agents/poolbot-tools.js +14 -5
  43. package/dist/agents/sandbox/docker.js +10 -5
  44. package/dist/agents/sandbox/registry.js +96 -46
  45. package/dist/agents/sandbox/sanitize-env-vars.js +82 -0
  46. package/dist/agents/sandbox-paths.js +43 -10
  47. package/dist/agents/session-tool-result-guard-wrapper.js +23 -11
  48. package/dist/agents/session-tool-result-guard.js +39 -39
  49. package/dist/agents/session-transcript-repair.js +36 -33
  50. package/dist/agents/session-write-lock.js +62 -44
  51. package/dist/agents/skills/frontmatter.js +49 -88
  52. package/dist/agents/skills/workspace.js +335 -28
  53. package/dist/agents/subagent-announce.js +508 -174
  54. package/dist/agents/subagent-registry.js +45 -4
  55. package/dist/agents/subagent-spawn.js +16 -33
  56. package/dist/agents/system-prompt-report.js +27 -10
  57. package/dist/agents/system-prompt.js +26 -32
  58. package/dist/agents/tool-call-id.js +69 -17
  59. package/dist/agents/tool-display-common.js +1 -1
  60. package/dist/agents/tool-images.js +64 -31
  61. package/dist/agents/tools/canvas-tool.js +17 -11
  62. package/dist/agents/tools/common.js +37 -19
  63. package/dist/agents/tools/cron-tool.js +40 -38
  64. package/dist/agents/tools/gateway.js +70 -2
  65. package/dist/agents/tools/message-tool.js +181 -40
  66. package/dist/agents/tools/nodes-tool.js +128 -36
  67. package/dist/agents/tools/nodes-utils.js +12 -38
  68. package/dist/agents/tools/session-status-tool.js +24 -71
  69. package/dist/agents/tools/sessions-helpers.js +38 -210
  70. package/dist/agents/tools/sessions-spawn-tool.js +28 -198
  71. package/dist/agents/tools/telegram-actions.js +58 -7
  72. package/dist/agents/tools/web-fetch-utils.js +112 -7
  73. package/dist/agents/tools/web-fetch.js +279 -175
  74. package/dist/agents/tools/web-shared.js +71 -8
  75. package/dist/agents/usage.js +25 -16
  76. package/dist/auto-reply/commands-registry.data.js +85 -11
  77. package/dist/auto-reply/dispatch.js +40 -21
  78. package/dist/auto-reply/reply/abort.js +102 -33
  79. package/dist/auto-reply/reply/commands-core.js +82 -33
  80. package/dist/auto-reply/reply/commands-export-session.js +1 -1
  81. package/dist/auto-reply/reply/commands-info.js +41 -12
  82. package/dist/auto-reply/reply/commands-subagents.js +352 -100
  83. package/dist/auto-reply/reply/commands-system-prompt.js +2 -2
  84. package/dist/auto-reply/reply/dispatch-from-config.js +100 -29
  85. package/dist/auto-reply/reply/elevated-unavailable.js +1 -1
  86. package/dist/auto-reply/reply/inbound-meta.js +12 -1
  87. package/dist/auto-reply/reply/mentions.js +18 -11
  88. package/dist/auto-reply/reply/normalize-reply.js +17 -8
  89. package/dist/auto-reply/reply/reply-dispatcher.js +62 -10
  90. package/dist/auto-reply/reply/session.js +102 -21
  91. package/dist/auto-reply/reply/streaming-directives.js +16 -5
  92. package/dist/auto-reply/status.js +73 -50
  93. package/dist/browser/extension-relay.js +3 -3
  94. package/dist/browser/http-auth.js +1 -1
  95. package/dist/browser/paths.js +2 -2
  96. package/dist/build-info.json +3 -3
  97. package/dist/channels/allowlist-match.js +20 -0
  98. package/dist/channels/allowlists/resolve-utils.js +65 -2
  99. package/dist/channels/chat-type.js +8 -4
  100. package/dist/channels/dock.js +127 -35
  101. package/dist/channels/draft-stream-loop.js +6 -2
  102. package/dist/channels/plugins/actions/telegram.js +42 -18
  103. package/dist/channels/plugins/allowlist-match.js +1 -1
  104. package/dist/channels/plugins/group-mentions.js +51 -41
  105. package/dist/channels/plugins/message-action-names.js +2 -0
  106. package/dist/channels/plugins/message-actions.js +24 -5
  107. package/dist/channels/plugins/normalize/discord.js +26 -4
  108. package/dist/channels/plugins/normalize/signal.js +35 -22
  109. package/dist/channels/plugins/onboarding/helpers.js +8 -26
  110. package/dist/channels/plugins/outbound/imessage.js +15 -14
  111. package/dist/channels/registry.js +20 -7
  112. package/dist/cli/acp-cli.js +7 -5
  113. package/dist/cli/browser-cli-extension.js +25 -12
  114. package/dist/cli/browser-cli-state.cookies-storage.js +25 -6
  115. package/dist/cli/browser-cli-state.js +101 -145
  116. package/dist/cli/command-options.js +28 -0
  117. package/dist/cli/completion-cli.js +6 -6
  118. package/dist/cli/cron-cli/register.cron-add.js +25 -1
  119. package/dist/cli/cron-cli/register.cron-edit.js +44 -0
  120. package/dist/cli/cron-cli/shared.js +7 -1
  121. package/dist/cli/daemon-cli/lifecycle-core.js +23 -21
  122. package/dist/cli/daemon-cli/lifecycle.js +23 -247
  123. package/dist/cli/daemon-cli/register-service-commands.js +25 -4
  124. package/dist/cli/daemon-cli.js +1 -0
  125. package/dist/cli/devices-cli.js +33 -20
  126. package/dist/cli/gateway-cli/register.js +37 -105
  127. package/dist/cli/gateway-cli/run.js +49 -11
  128. package/dist/cli/nodes-camera.js +59 -4
  129. package/dist/cli/nodes-cli/register.camera.js +27 -24
  130. package/dist/cli/nodes-cli/rpc.js +21 -38
  131. package/dist/cli/qr-cli.js +2 -2
  132. package/dist/cli/skills-cli.format.js +2 -2
  133. package/dist/cli/update-cli/progress.js +2 -2
  134. package/dist/cli/update-cli/restart-helper.js +28 -7
  135. package/dist/cli/update-cli/shared.js +7 -7
  136. package/dist/cli/update-cli/status.js +1 -1
  137. package/dist/cli/update-cli/update-command.js +14 -8
  138. package/dist/cli/update-cli/wizard.js +2 -2
  139. package/dist/cli/update-cli.js +21 -1027
  140. package/dist/commands/auth-choice.apply.anthropic.js +10 -2
  141. package/dist/commands/channels/add-mutators.js +3 -35
  142. package/dist/commands/channels/add.js +39 -51
  143. package/dist/commands/config-validation.js +1 -1
  144. package/dist/commands/configure.gateway-auth.js +52 -15
  145. package/dist/commands/configure.gateway.js +84 -40
  146. package/dist/commands/doctor-completion.js +3 -3
  147. package/dist/commands/doctor-config-flow.js +536 -16
  148. package/dist/commands/doctor-gateway-services.js +103 -79
  149. package/dist/commands/doctor-memory-search.js +9 -9
  150. package/dist/commands/doctor-platform-notes.js +57 -30
  151. package/dist/commands/doctor-prompter.js +26 -15
  152. package/dist/commands/doctor-session-locks.js +1 -1
  153. package/dist/commands/doctor.js +21 -9
  154. package/dist/commands/model-picker.js +120 -95
  155. package/dist/commands/models/set.js +2 -21
  156. package/dist/commands/models/shared.js +65 -37
  157. package/dist/commands/onboard-helpers.js +81 -39
  158. package/dist/commands/openai-codex-oauth.js +1 -1
  159. package/dist/commands/sessions.js +52 -53
  160. package/dist/commands/status.summary.js +52 -34
  161. package/dist/commands/test-wizard-helpers.js +2 -2
  162. package/dist/config/defaults.js +79 -42
  163. package/dist/config/group-policy.js +50 -18
  164. package/dist/config/includes.js +37 -10
  165. package/dist/config/schema.help.js +5 -4
  166. package/dist/config/schema.hints.js +2 -2
  167. package/dist/config/schema.labels.js +1 -0
  168. package/dist/config/sessions/group.js +12 -11
  169. package/dist/config/sessions/paths.js +137 -11
  170. package/dist/config/sessions/store.js +185 -65
  171. package/dist/config/sessions/types.js +15 -1
  172. package/dist/config/sessions.js +1 -0
  173. package/dist/config/telegram-custom-commands.js +3 -2
  174. package/dist/config/types.js +2 -0
  175. package/dist/config/zod-schema.agent-defaults.js +6 -27
  176. package/dist/config/zod-schema.agent-runtime.js +171 -79
  177. package/dist/config/zod-schema.providers-core.js +138 -65
  178. package/dist/config/zod-schema.session.js +49 -22
  179. package/dist/control-ui/assets/index-HRr1grwl.js.map +1 -1
  180. package/dist/cron/isolated-agent/run.js +224 -57
  181. package/dist/cron/normalize.js +48 -45
  182. package/dist/cron/run-log.js +14 -0
  183. package/dist/cron/service/jobs.js +190 -28
  184. package/dist/cron/service/normalize.js +29 -11
  185. package/dist/cron/service/store.js +30 -44
  186. package/dist/cron/service/timer.js +182 -96
  187. package/dist/cron/service.js +3 -0
  188. package/dist/cron/stagger.js +37 -0
  189. package/dist/daemon/inspect.js +132 -92
  190. package/dist/daemon/runtime-paths.js +25 -4
  191. package/dist/daemon/service-audit.js +47 -16
  192. package/dist/discord/accounts.js +23 -20
  193. package/dist/discord/monitor/agent-components.js +1115 -219
  194. package/dist/discord/monitor/allow-list.js +114 -34
  195. package/dist/discord/monitor/listeners.js +204 -97
  196. package/dist/discord/monitor/message-handler.js +21 -10
  197. package/dist/discord/monitor/message-handler.preflight.js +195 -101
  198. package/dist/discord/monitor/message-handler.process.js +384 -123
  199. package/dist/discord/monitor/message-utils.js +86 -23
  200. package/dist/discord/monitor/native-command.js +77 -57
  201. package/dist/discord/monitor/provider.js +122 -117
  202. package/dist/discord/monitor/reply-context.js +20 -16
  203. package/dist/discord/monitor/reply-delivery.js +40 -8
  204. package/dist/discord/monitor/rest-fetch.js +22 -0
  205. package/dist/discord/monitor/threading.js +117 -24
  206. package/dist/discord/send.js +2 -1
  207. package/dist/discord/send.outbound.js +124 -11
  208. package/dist/discord/send.shared.js +112 -72
  209. package/dist/discord/voice-message.js +3 -3
  210. package/dist/gateway/auth.js +119 -44
  211. package/dist/gateway/call.js +76 -34
  212. package/dist/gateway/channel-health-monitor.js +57 -50
  213. package/dist/gateway/client.js +63 -29
  214. package/dist/gateway/control-ui-contract.js +1 -1
  215. package/dist/gateway/gateway-config-prompts.shared.js +2 -2
  216. package/dist/gateway/net.js +109 -1
  217. package/dist/gateway/protocol/index.js +5 -8
  218. package/dist/gateway/protocol/schema/agent.js +19 -1
  219. package/dist/gateway/protocol/schema/channels.js +21 -0
  220. package/dist/gateway/protocol/schema/cron.js +43 -30
  221. package/dist/gateway/protocol/schema/protocol-schemas.js +6 -11
  222. package/dist/gateway/protocol/schema/sessions.js +5 -1
  223. package/dist/gateway/protocol/schema.js +0 -1
  224. package/dist/gateway/server/presence-events.js +12 -0
  225. package/dist/gateway/server/ws-connection/message-handler.js +203 -212
  226. package/dist/gateway/server/ws-connection.js +58 -21
  227. package/dist/gateway/server-broadcast.js +18 -13
  228. package/dist/gateway/server-cron.js +177 -10
  229. package/dist/gateway/server-methods/agent-job.js +131 -38
  230. package/dist/gateway/server-methods/send.js +60 -14
  231. package/dist/gateway/server-methods/sessions.js +160 -96
  232. package/dist/gateway/server-methods/system.js +5 -7
  233. package/dist/gateway/server-methods-list.js +8 -0
  234. package/dist/gateway/server-methods.js +24 -8
  235. package/dist/gateway/server-node-events.js +278 -68
  236. package/dist/gateway/session-utils.fs.js +316 -75
  237. package/dist/gateway/session-utils.js +224 -70
  238. package/dist/gateway/sessions-patch.js +63 -20
  239. package/dist/gateway/test-temp-config.js +1 -1
  240. package/dist/gateway/tools-invoke-http.js +118 -70
  241. package/dist/gateway/ws-log.js +135 -107
  242. package/dist/hooks/frontmatter.js +36 -82
  243. package/dist/hooks/install.js +149 -139
  244. package/dist/hooks/internal-hooks.js +29 -4
  245. package/dist/hooks/plugin-hooks.js +2 -1
  246. package/dist/imessage/monitor/deliver.js +10 -4
  247. package/dist/imessage/monitor/monitor-provider.js +138 -375
  248. package/dist/imessage/monitor/runtime.js +4 -8
  249. package/dist/imessage/send.js +65 -19
  250. package/dist/infra/exec-approvals-allowlist.js +7 -0
  251. package/dist/infra/exec-approvals.js +35 -920
  252. package/dist/infra/exec-safe-bin-trust.js +64 -0
  253. package/dist/infra/heartbeat-runner.js +207 -134
  254. package/dist/infra/heartbeat-wake.js +183 -22
  255. package/dist/infra/install-source-utils.js +47 -0
  256. package/dist/infra/net/ssrf.js +170 -36
  257. package/dist/infra/outbound/deliver.js +224 -58
  258. package/dist/infra/outbound/message-action-spec.js +12 -5
  259. package/dist/infra/outbound/outbound-session.js +27 -25
  260. package/dist/infra/poolbot-root.js +32 -22
  261. package/dist/infra/ports.js +14 -11
  262. package/dist/infra/skills-remote.js +48 -37
  263. package/dist/infra/system-events.js +25 -11
  264. package/dist/infra/system-presence.js +26 -33
  265. package/dist/infra/tmp-poolbot-dir.js +81 -2
  266. package/dist/infra/wsl.js +37 -1
  267. package/dist/line/bot-message-context.js +163 -191
  268. package/dist/logging/subsystem.js +59 -22
  269. package/dist/markdown/ir.js +124 -50
  270. package/dist/media/store.js +1 -1
  271. package/dist/media-understanding/runner.entries.js +42 -25
  272. package/dist/media-understanding/runner.js +53 -488
  273. package/dist/memory/embeddings-gemini.js +53 -38
  274. package/dist/memory/manager-embedding-ops.js +48 -69
  275. package/dist/pairing/pairing-store.js +178 -119
  276. package/dist/plugin-sdk/index.js +34 -6
  277. package/dist/plugins/hooks.js +135 -14
  278. package/dist/plugins/install.js +190 -152
  279. package/dist/polls.js +11 -0
  280. package/dist/routing/resolve-route.js +190 -56
  281. package/dist/routing/session-key.js +38 -22
  282. package/dist/runtime.js +35 -9
  283. package/dist/security/audit-channel.js +1 -1
  284. package/dist/sessions/session-key-utils.js +29 -11
  285. package/dist/shared/frontmatter.js +5 -5
  286. package/dist/shared/node-list-types.js +1 -0
  287. package/dist/shared/string-normalization.js +15 -0
  288. package/dist/signal/monitor/event-handler.js +68 -36
  289. package/dist/signal/send.js +29 -37
  290. package/dist/slack/monitor/allow-list.js +10 -11
  291. package/dist/slack/monitor/commands.js +14 -3
  292. package/dist/slack/monitor/events/interactions.js +4 -4
  293. package/dist/slack/monitor/media.js +224 -16
  294. package/dist/slack/monitor/message-handler/dispatch.js +247 -13
  295. package/dist/slack/monitor/message-handler/prepare.js +128 -45
  296. package/dist/slack/monitor/slash.js +357 -144
  297. package/dist/slack/streaming.js +77 -0
  298. package/dist/telegram/accounts.js +40 -13
  299. package/dist/telegram/allowed-updates.js +3 -0
  300. package/dist/telegram/bot/delivery.js +129 -66
  301. package/dist/telegram/bot/helpers.js +136 -122
  302. package/dist/telegram/bot-handlers.js +600 -339
  303. package/dist/telegram/bot-message-context.js +115 -73
  304. package/dist/telegram/bot-message-dispatch.js +235 -104
  305. package/dist/telegram/bot-native-command-menu.js +3 -1
  306. package/dist/telegram/bot-native-commands.js +213 -193
  307. package/dist/telegram/bot.js +24 -132
  308. package/dist/telegram/draft-stream.js +84 -75
  309. package/dist/telegram/format.js +150 -6
  310. package/dist/telegram/send.js +415 -255
  311. package/dist/telegram/targets.js +21 -2
  312. package/dist/telegram/update-offset-store.js +19 -3
  313. package/dist/terminal/restore.js +5 -2
  314. package/dist/test-utils/fetch-mock.js +5 -0
  315. package/dist/version.js +18 -5
  316. package/dist/web/auto-reply/monitor/broadcast.js +7 -3
  317. package/dist/web/auto-reply/monitor/on-message.js +6 -3
  318. package/dist/web/inbound/media.js +34 -8
  319. package/dist/web/inbound/monitor.js +34 -17
  320. package/dist/web/inbound/send-api.js +18 -17
  321. package/dist/web/outbound.js +12 -5
  322. package/dist/wizard/clack-prompter.js +40 -7
  323. package/extensions/bluebubbles/package.json +1 -1
  324. package/extensions/copilot-proxy/package.json +1 -1
  325. package/extensions/device-pair/index.ts +2 -2
  326. package/extensions/diagnostics-otel/package.json +1 -1
  327. package/extensions/discord/package.json +1 -1
  328. package/extensions/feishu/package.json +1 -1
  329. package/extensions/google-antigravity-auth/package.json +1 -1
  330. package/extensions/google-gemini-cli-auth/package.json +1 -1
  331. package/extensions/googlechat/package.json +1 -1
  332. package/extensions/imessage/package.json +1 -1
  333. package/extensions/irc/package.json +1 -1
  334. package/extensions/irc/src/accounts.ts +1 -1
  335. package/extensions/irc/src/onboarding.ts +4 -4
  336. package/extensions/line/package.json +1 -1
  337. package/extensions/llm-task/package.json +1 -1
  338. package/extensions/lobster/package.json +1 -1
  339. package/extensions/matrix/CHANGELOG.md +10 -0
  340. package/extensions/matrix/package.json +1 -1
  341. package/extensions/mattermost/package.json +1 -1
  342. package/extensions/memory-core/package.json +1 -1
  343. package/extensions/memory-lancedb/package.json +1 -1
  344. package/extensions/minimax-portal-auth/package.json +1 -1
  345. package/extensions/msteams/CHANGELOG.md +10 -0
  346. package/extensions/msteams/package.json +1 -1
  347. package/extensions/nextcloud-talk/package.json +1 -1
  348. package/extensions/nostr/CHANGELOG.md +10 -0
  349. package/extensions/nostr/package.json +1 -1
  350. package/extensions/open-prose/package.json +1 -1
  351. package/extensions/openai-codex-auth/package.json +1 -1
  352. package/extensions/signal/package.json +1 -1
  353. package/extensions/slack/package.json +1 -1
  354. package/extensions/telegram/package.json +1 -1
  355. package/extensions/tlon/package.json +1 -1
  356. package/extensions/twitch/CHANGELOG.md +10 -0
  357. package/extensions/twitch/package.json +1 -1
  358. package/extensions/voice-call/CHANGELOG.md +10 -0
  359. package/extensions/voice-call/package.json +1 -1
  360. package/extensions/whatsapp/package.json +1 -1
  361. package/extensions/zalo/CHANGELOG.md +10 -0
  362. package/extensions/zalo/package.json +1 -1
  363. package/extensions/zalouser/CHANGELOG.md +10 -0
  364. package/extensions/zalouser/package.json +1 -1
  365. package/package.json +1 -1
  366. package/skills/apple-reminders/SKILL.md +100 -49
  367. package/skills/coding-agent/SKILL.md +34 -28
  368. package/skills/github/SKILL.md +131 -16
  369. package/skills/imsg/SKILL.md +112 -15
  370. package/skills/openhue/SKILL.md +101 -19
  371. package/skills/tmux/SKILL.md +111 -79
  372. package/skills/weather/SKILL.md +88 -25
  373. package/dist/agents/openclaw-tools.js +0 -151
  374. package/dist/agents/tool-security.js +0 -96
  375. package/dist/gateway/url-validation.js +0 -94
  376. package/dist/infra/openclaw-root.js +0 -109
  377. package/dist/infra/tmp-openclaw-dir.js +0 -81
  378. package/dist/media/path-sanitization.js +0 -78
@@ -1,20 +1,17 @@
1
+ import { collectProviderApiKeysForExecution, executeWithApiKeyRotation, } from "../agents/api-key-rotation.js";
1
2
  import { requireApiKey, resolveApiKeyForProvider } from "../agents/model-auth.js";
2
- import { isTruthyEnvValue } from "../infra/env.js";
3
- import { createSubsystemLogger } from "../logging/subsystem.js";
3
+ import { parseGeminiAuth } from "../infra/gemini-auth.js";
4
+ import { debugEmbeddingsLog } from "./embeddings-debug.js";
4
5
  const DEFAULT_GEMINI_BASE_URL = "https://generativelanguage.googleapis.com/v1beta";
5
6
  export const DEFAULT_GEMINI_EMBEDDING_MODEL = "gemini-embedding-001";
6
- const debugEmbeddings = isTruthyEnvValue(process.env.POOLBOT_DEBUG_MEMORY_EMBEDDINGS || process.env.CLAWDBOT_DEBUG_MEMORY_EMBEDDINGS);
7
- const log = createSubsystemLogger("memory/embeddings");
8
- const debugLog = (message, meta) => {
9
- if (!debugEmbeddings)
10
- return;
11
- const suffix = meta ? ` ${JSON.stringify(meta)}` : "";
12
- log.raw(`${message}${suffix}`);
7
+ const GEMINI_MAX_INPUT_TOKENS = {
8
+ "text-embedding-004": 2048,
13
9
  };
14
10
  function resolveRemoteApiKey(remoteApiKey) {
15
11
  const trimmed = remoteApiKey?.trim();
16
- if (!trimmed)
12
+ if (!trimmed) {
17
13
  return undefined;
14
+ }
18
15
  if (trimmed === "GOOGLE_API_KEY" || trimmed === "GEMINI_API_KEY") {
19
16
  return process.env[trimmed]?.trim();
20
17
  }
@@ -22,20 +19,24 @@ function resolveRemoteApiKey(remoteApiKey) {
22
19
  }
23
20
  function normalizeGeminiModel(model) {
24
21
  const trimmed = model.trim();
25
- if (!trimmed)
22
+ if (!trimmed) {
26
23
  return DEFAULT_GEMINI_EMBEDDING_MODEL;
24
+ }
27
25
  const withoutPrefix = trimmed.replace(/^models\//, "");
28
- if (withoutPrefix.startsWith("gemini/"))
26
+ if (withoutPrefix.startsWith("gemini/")) {
29
27
  return withoutPrefix.slice("gemini/".length);
30
- if (withoutPrefix.startsWith("google/"))
28
+ }
29
+ if (withoutPrefix.startsWith("google/")) {
31
30
  return withoutPrefix.slice("google/".length);
31
+ }
32
32
  return withoutPrefix;
33
33
  }
34
34
  function normalizeGeminiBaseUrl(raw) {
35
35
  const trimmed = raw.replace(/\/+$/, "");
36
36
  const openAiIndex = trimmed.indexOf("/openai");
37
- if (openAiIndex > -1)
37
+ if (openAiIndex > -1) {
38
38
  return trimmed.slice(0, openAiIndex);
39
+ }
39
40
  return trimmed;
40
41
  }
41
42
  function buildGeminiModelPath(model) {
@@ -46,42 +47,53 @@ export async function createGeminiEmbeddingProvider(options) {
46
47
  const baseUrl = client.baseUrl.replace(/\/$/, "");
47
48
  const embedUrl = `${baseUrl}/${client.modelPath}:embedContent`;
48
49
  const batchUrl = `${baseUrl}/${client.modelPath}:batchEmbedContents`;
49
- const embedQuery = async (text) => {
50
- if (!text.trim())
51
- return [];
52
- const res = await fetch(embedUrl, {
50
+ const fetchWithGeminiAuth = async (apiKey, endpoint, body) => {
51
+ const authHeaders = parseGeminiAuth(apiKey);
52
+ const headers = {
53
+ ...authHeaders.headers,
54
+ ...client.headers,
55
+ };
56
+ const res = await fetch(endpoint, {
53
57
  method: "POST",
54
- headers: client.headers,
55
- body: JSON.stringify({
56
- content: { parts: [{ text }] },
57
- taskType: "RETRIEVAL_QUERY",
58
- }),
58
+ headers,
59
+ body: JSON.stringify(body),
59
60
  });
60
61
  if (!res.ok) {
61
62
  const payload = await res.text();
62
63
  throw new Error(`gemini embeddings failed: ${res.status} ${payload}`);
63
64
  }
64
- const payload = (await res.json());
65
+ return (await res.json());
66
+ };
67
+ const embedQuery = async (text) => {
68
+ if (!text.trim()) {
69
+ return [];
70
+ }
71
+ const payload = await executeWithApiKeyRotation({
72
+ provider: "google",
73
+ apiKeys: client.apiKeys,
74
+ execute: (apiKey) => fetchWithGeminiAuth(apiKey, embedUrl, {
75
+ content: { parts: [{ text }] },
76
+ taskType: "RETRIEVAL_QUERY",
77
+ }),
78
+ });
65
79
  return payload.embedding?.values ?? [];
66
80
  };
67
81
  const embedBatch = async (texts) => {
68
- if (texts.length === 0)
82
+ if (texts.length === 0) {
69
83
  return [];
84
+ }
70
85
  const requests = texts.map((text) => ({
71
86
  model: client.modelPath,
72
87
  content: { parts: [{ text }] },
73
88
  taskType: "RETRIEVAL_DOCUMENT",
74
89
  }));
75
- const res = await fetch(batchUrl, {
76
- method: "POST",
77
- headers: client.headers,
78
- body: JSON.stringify({ requests }),
90
+ const payload = await executeWithApiKeyRotation({
91
+ provider: "google",
92
+ apiKeys: client.apiKeys,
93
+ execute: (apiKey) => fetchWithGeminiAuth(apiKey, batchUrl, {
94
+ requests,
95
+ }),
79
96
  });
80
- if (!res.ok) {
81
- const payload = await res.text();
82
- throw new Error(`gemini embeddings failed: ${res.status} ${payload}`);
83
- }
84
- const payload = (await res.json());
85
97
  const embeddings = Array.isArray(payload.embeddings) ? payload.embeddings : [];
86
98
  return texts.map((_, index) => embeddings[index]?.values ?? []);
87
99
  };
@@ -89,6 +101,7 @@ export async function createGeminiEmbeddingProvider(options) {
89
101
  provider: {
90
102
  id: "gemini",
91
103
  model: client.model,
104
+ maxInputTokens: GEMINI_MAX_INPUT_TOKENS[client.model],
92
105
  embedQuery,
93
106
  embedBatch,
94
107
  },
@@ -111,13 +124,15 @@ export async function resolveGeminiEmbeddingClient(options) {
111
124
  const baseUrl = normalizeGeminiBaseUrl(rawBaseUrl);
112
125
  const headerOverrides = Object.assign({}, providerConfig?.headers, remote?.headers);
113
126
  const headers = {
114
- "Content-Type": "application/json",
115
- "x-goog-api-key": apiKey,
116
127
  ...headerOverrides,
117
128
  };
129
+ const apiKeys = collectProviderApiKeysForExecution({
130
+ provider: "google",
131
+ primaryApiKey: apiKey,
132
+ });
118
133
  const model = normalizeGeminiModel(options.model);
119
134
  const modelPath = buildGeminiModelPath(model);
120
- debugLog("memory embeddings: gemini client", {
135
+ debugEmbeddingsLog("memory embeddings: gemini client", {
121
136
  rawBaseUrl,
122
137
  baseUrl,
123
138
  model,
@@ -125,5 +140,5 @@ export async function resolveGeminiEmbeddingClient(options) {
125
140
  embedEndpoint: `${baseUrl}/${modelPath}:embedContent`,
126
141
  batchEndpoint: `${baseUrl}/${modelPath}:batchEmbedContents`,
127
142
  });
128
- return { baseUrl, headers, model, modelPath };
143
+ return { baseUrl, headers, model, modelPath, apiKeys };
129
144
  }
@@ -263,34 +263,32 @@ export class MemoryManagerEmbeddingOps extends MemoryManagerSyncOps {
263
263
  debug: (message, data) => log.debug(message, data ? { ...data, source, chunks: chunks.length } : { source, chunks: chunks.length }),
264
264
  };
265
265
  }
266
- async embedChunksWithVoyageBatch(chunks, entry, source) {
267
- const voyage = this.voyage;
268
- if (!voyage) {
269
- return this.embedChunksInBatches(chunks);
266
+ async embedChunksWithProviderBatch(params) {
267
+ if (!params.enabled) {
268
+ return this.embedChunksInBatches(params.chunks);
270
269
  }
271
- if (chunks.length === 0) {
270
+ if (params.chunks.length === 0) {
272
271
  return [];
273
272
  }
274
- const { embeddings, missing } = this.collectCachedEmbeddings(chunks);
273
+ const { embeddings, missing } = this.collectCachedEmbeddings(params.chunks);
275
274
  if (missing.length === 0) {
276
275
  return embeddings;
277
276
  }
278
277
  const { requests, mapping } = this.buildBatchRequests({
279
278
  missing,
280
- entry,
281
- source,
282
- build: (chunk) => ({
283
- body: { input: chunk.text },
284
- }),
279
+ entry: params.entry,
280
+ source: params.source,
281
+ build: params.buildRequest,
282
+ });
283
+ const runnerOptions = this.buildEmbeddingBatchRunnerOptions({
284
+ requests,
285
+ chunks: params.chunks,
286
+ source: params.source,
285
287
  });
286
- const runnerOptions = this.buildEmbeddingBatchRunnerOptions({ requests, chunks, source });
287
288
  const batchResult = await this.runBatchWithFallback({
288
- provider: "voyage",
289
- run: async () => await runVoyageEmbeddingBatches({
290
- client: voyage,
291
- ...runnerOptions,
292
- }),
293
- fallback: async () => await this.embedChunksInBatches(chunks),
289
+ provider: params.provider,
290
+ run: async () => await params.runBatch(runnerOptions),
291
+ fallback: async () => await this.embedChunksInBatches(params.chunks),
294
292
  });
295
293
  if (Array.isArray(batchResult)) {
296
294
  return batchResult;
@@ -298,81 +296,62 @@ export class MemoryManagerEmbeddingOps extends MemoryManagerSyncOps {
298
296
  this.applyBatchEmbeddings({ byCustomId: batchResult, mapping, embeddings });
299
297
  return embeddings;
300
298
  }
299
+ async embedChunksWithVoyageBatch(chunks, entry, source) {
300
+ const voyage = this.voyage;
301
+ return await this.embedChunksWithProviderBatch({
302
+ chunks,
303
+ entry,
304
+ source,
305
+ provider: "voyage",
306
+ enabled: Boolean(voyage),
307
+ buildRequest: (chunk) => ({
308
+ body: { input: chunk.text },
309
+ }),
310
+ runBatch: async (runnerOptions) => await runVoyageEmbeddingBatches({
311
+ client: voyage,
312
+ ...runnerOptions,
313
+ }),
314
+ });
315
+ }
301
316
  async embedChunksWithOpenAiBatch(chunks, entry, source) {
302
317
  const openAi = this.openAi;
303
- if (!openAi) {
304
- return this.embedChunksInBatches(chunks);
305
- }
306
- if (chunks.length === 0) {
307
- return [];
308
- }
309
- const { embeddings, missing } = this.collectCachedEmbeddings(chunks);
310
- if (missing.length === 0) {
311
- return embeddings;
312
- }
313
- const { requests, mapping } = this.buildBatchRequests({
314
- missing,
318
+ return await this.embedChunksWithProviderBatch({
319
+ chunks,
315
320
  entry,
316
321
  source,
317
- build: (chunk) => ({
322
+ provider: "openai",
323
+ enabled: Boolean(openAi),
324
+ buildRequest: (chunk) => ({
318
325
  method: "POST",
319
326
  url: OPENAI_BATCH_ENDPOINT,
320
327
  body: {
321
- model: this.openAi?.model ?? this.provider?.model ?? "text-embedding-3-small",
328
+ model: openAi?.model ?? this.provider?.model ?? "text-embedding-3-small",
322
329
  input: chunk.text,
323
330
  },
324
331
  }),
325
- });
326
- const runnerOptions = this.buildEmbeddingBatchRunnerOptions({ requests, chunks, source });
327
- const batchResult = await this.runBatchWithFallback({
328
- provider: "openai",
329
- run: async () => await runOpenAiEmbeddingBatches({
330
- openAi,
332
+ runBatch: async (runnerOptions) => await runOpenAiEmbeddingBatches({
333
+ openAi: openAi,
331
334
  ...runnerOptions,
332
335
  }),
333
- fallback: async () => await this.embedChunksInBatches(chunks),
334
336
  });
335
- if (Array.isArray(batchResult)) {
336
- return batchResult;
337
- }
338
- this.applyBatchEmbeddings({ byCustomId: batchResult, mapping, embeddings });
339
- return embeddings;
340
337
  }
341
338
  async embedChunksWithGeminiBatch(chunks, entry, source) {
342
339
  const gemini = this.gemini;
343
- if (!gemini) {
344
- return this.embedChunksInBatches(chunks);
345
- }
346
- if (chunks.length === 0) {
347
- return [];
348
- }
349
- const { embeddings, missing } = this.collectCachedEmbeddings(chunks);
350
- if (missing.length === 0) {
351
- return embeddings;
352
- }
353
- const { requests, mapping } = this.buildBatchRequests({
354
- missing,
340
+ return await this.embedChunksWithProviderBatch({
341
+ chunks,
355
342
  entry,
356
343
  source,
357
- build: (chunk) => ({
344
+ provider: "gemini",
345
+ enabled: Boolean(gemini),
346
+ buildRequest: (chunk) => ({
358
347
  content: { parts: [{ text: chunk.text }] },
359
348
  taskType: "RETRIEVAL_DOCUMENT",
360
349
  }),
361
- });
362
- const runnerOptions = this.buildEmbeddingBatchRunnerOptions({ requests, chunks, source });
363
- const batchResult = await this.runBatchWithFallback({
364
- provider: "gemini",
365
- run: async () => await runGeminiEmbeddingBatches({
366
- gemini,
350
+ runBatch: async (runnerOptions) => await runGeminiEmbeddingBatches({
351
+ gemini: gemini,
367
352
  ...runnerOptions,
368
353
  }),
369
- fallback: async () => await this.embedChunksInBatches(chunks),
370
354
  });
371
- if (Array.isArray(batchResult)) {
372
- return batchResult;
373
- }
374
- this.applyBatchEmbeddings({ byCustomId: batchResult, mapping, embeddings });
375
- return embeddings;
376
355
  }
377
356
  async embedBatchWithRetry(texts) {
378
357
  if (texts.length === 0) {