@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
@@ -4,10 +4,10 @@ import { parseDiscordTarget } from "../../discord/targets.js";
4
4
  import { parseIMessageTarget, normalizeIMessageHandle } from "../../imessage/targets.js";
5
5
  import { buildAgentSessionKey, } from "../../routing/resolve-route.js";
6
6
  import { resolveThreadSessionKeys } from "../../routing/session-key.js";
7
+ import { resolveSignalPeerId, resolveSignalRecipient, resolveSignalSender, } from "../../signal/identity.js";
7
8
  import { resolveSlackAccount } from "../../slack/accounts.js";
8
9
  import { createSlackWebClient } from "../../slack/client.js";
9
10
  import { normalizeAllowListLower } from "../../slack/monitor/allow-list.js";
10
- import { resolveSignalPeerId, resolveSignalRecipient, resolveSignalSender, } from "../../signal/identity.js";
11
11
  import { parseSlackTarget } from "../../slack/targets.js";
12
12
  import { buildTelegramGroupPeerId } from "../../telegram/bot/helpers.js";
13
13
  import { resolveTelegramTargetChatType } from "../../telegram/inline-buttons.js";
@@ -18,19 +18,23 @@ const UUID_COMPACT_RE = /^[0-9a-f]{32}$/i;
18
18
  // Cache Slack channel type lookups to avoid repeated API calls.
19
19
  const SLACK_CHANNEL_TYPE_CACHE = new Map();
20
20
  function looksLikeUuid(value) {
21
- if (UUID_RE.test(value) || UUID_COMPACT_RE.test(value))
21
+ if (UUID_RE.test(value) || UUID_COMPACT_RE.test(value)) {
22
22
  return true;
23
+ }
23
24
  const compact = value.replace(/-/g, "");
24
- if (!/^[0-9a-f]+$/i.test(compact))
25
+ if (!/^[0-9a-f]+$/i.test(compact)) {
25
26
  return false;
27
+ }
26
28
  return /[a-f]/i.test(compact);
27
29
  }
28
30
  function normalizeThreadId(value) {
29
- if (value == null)
31
+ if (value == null) {
30
32
  return undefined;
33
+ }
31
34
  if (typeof value === "number") {
32
- if (!Number.isFinite(value))
35
+ if (!Number.isFinite(value)) {
33
36
  return undefined;
37
+ }
34
38
  return String(Math.trunc(value));
35
39
  }
36
40
  const trimmed = value.trim();
@@ -40,8 +44,9 @@ function stripProviderPrefix(raw, channel) {
40
44
  const trimmed = raw.trim();
41
45
  const lower = trimmed.toLowerCase();
42
46
  const prefix = `${channel.toLowerCase()}:`;
43
- if (lower.startsWith(prefix))
47
+ if (lower.startsWith(prefix)) {
44
48
  return trimmed.slice(prefix.length).trim();
49
+ }
45
50
  return trimmed;
46
51
  }
47
52
  function stripKindPrefix(raw) {
@@ -49,17 +54,20 @@ function stripKindPrefix(raw) {
49
54
  }
50
55
  function inferPeerKind(params) {
51
56
  const resolvedKind = params.resolvedTarget?.kind;
52
- if (resolvedKind === "user")
57
+ if (resolvedKind === "user") {
53
58
  return "dm";
54
- if (resolvedKind === "channel")
59
+ }
60
+ if (resolvedKind === "channel") {
55
61
  return "channel";
62
+ }
56
63
  if (resolvedKind === "group") {
57
64
  const plugin = getChannelPlugin(params.channel);
58
65
  const chatTypes = plugin?.capabilities?.chatTypes ?? [];
59
66
  const supportsChannel = chatTypes.includes("channel");
60
67
  const supportsGroup = chatTypes.includes("group");
61
- if (supportsChannel && !supportsGroup)
68
+ if (supportsChannel && !supportsGroup) {
62
69
  return "channel";
70
+ }
63
71
  return "group";
64
72
  }
65
73
  return "dm";
@@ -68,6 +76,7 @@ function buildBaseSessionKey(params) {
68
76
  return buildAgentSessionKey({
69
77
  agentId: params.agentId,
70
78
  channel: params.channel,
79
+ accountId: params.accountId,
71
80
  peer: params.peer,
72
81
  dmScope: params.cfg.session?.dmScope ?? "main",
73
82
  identityLinks: params.cfg.session?.identityLinks,
@@ -76,11 +85,13 @@ function buildBaseSessionKey(params) {
76
85
  // Best-effort mpim detection: allowlist/config, then Slack API (if token available).
77
86
  async function resolveSlackChannelType(params) {
78
87
  const channelId = params.channelId.trim();
79
- if (!channelId)
88
+ if (!channelId) {
80
89
  return "unknown";
90
+ }
81
91
  const cached = SLACK_CHANNEL_TYPE_CACHE.get(`${params.accountId ?? "default"}:${channelId}`);
82
- if (cached)
92
+ if (cached) {
83
93
  return cached;
94
+ }
84
95
  const account = resolveSlackAccount({ cfg: params.cfg, accountId: params.accountId });
85
96
  const groupChannels = normalizeAllowListLower(account.dm?.groupChannels);
86
97
  const channelIdLower = channelId.toLowerCase();
@@ -123,8 +134,9 @@ async function resolveSlackChannelType(params) {
123
134
  }
124
135
  async function resolveSlackSession(params) {
125
136
  const parsed = parseSlackTarget(params.target, { defaultKind: "channel" });
126
- if (!parsed)
137
+ if (!parsed) {
127
138
  return null;
139
+ }
128
140
  const isDm = parsed.kind === "user";
129
141
  let peerKind = isDm ? "dm" : "channel";
130
142
  if (!isDm && /^G/i.test(parsed.id)) {
@@ -134,10 +146,12 @@ async function resolveSlackSession(params) {
134
146
  accountId: params.accountId,
135
147
  channelId: parsed.id,
136
148
  });
137
- if (channelType === "group")
149
+ if (channelType === "group") {
138
150
  peerKind = "group";
139
- if (channelType === "dm")
151
+ }
152
+ if (channelType === "dm") {
140
153
  peerKind = "dm";
154
+ }
141
155
  }
142
156
  const peer = {
143
157
  kind: peerKind,
@@ -147,6 +161,7 @@ async function resolveSlackSession(params) {
147
161
  cfg: params.cfg,
148
162
  agentId: params.agentId,
149
163
  channel: "slack",
164
+ accountId: params.accountId,
150
165
  peer,
151
166
  });
152
167
  const threadId = normalizeThreadId(params.threadId ?? params.replyToId);
@@ -170,8 +185,9 @@ async function resolveSlackSession(params) {
170
185
  }
171
186
  function resolveDiscordSession(params) {
172
187
  const parsed = parseDiscordTarget(params.target, { defaultKind: "channel" });
173
- if (!parsed)
188
+ if (!parsed) {
174
189
  return null;
190
+ }
175
191
  const isDm = parsed.kind === "user";
176
192
  const peer = {
177
193
  kind: isDm ? "dm" : "channel",
@@ -181,6 +197,7 @@ function resolveDiscordSession(params) {
181
197
  cfg: params.cfg,
182
198
  agentId: params.agentId,
183
199
  channel: "discord",
200
+ accountId: params.accountId,
184
201
  peer,
185
202
  });
186
203
  const explicitThreadId = normalizeThreadId(params.threadId);
@@ -204,8 +221,9 @@ function resolveDiscordSession(params) {
204
221
  function resolveTelegramSession(params) {
205
222
  const parsed = parseTelegramTarget(params.target);
206
223
  const chatId = parsed.chatId.trim();
207
- if (!chatId)
224
+ if (!chatId) {
208
225
  return null;
226
+ }
209
227
  const parsedThreadId = parsed.messageThreadId;
210
228
  const fallbackThreadId = normalizeThreadId(params.threadId);
211
229
  const resolvedThreadId = parsedThreadId ?? (fallbackThreadId ? Number.parseInt(fallbackThreadId, 10) : undefined);
@@ -225,6 +243,7 @@ function resolveTelegramSession(params) {
225
243
  cfg: params.cfg,
226
244
  agentId: params.agentId,
227
245
  channel: "telegram",
246
+ accountId: params.accountId,
228
247
  peer,
229
248
  });
230
249
  return {
@@ -239,8 +258,9 @@ function resolveTelegramSession(params) {
239
258
  }
240
259
  function resolveWhatsAppSession(params) {
241
260
  const normalized = normalizeWhatsAppTarget(params.target);
242
- if (!normalized)
261
+ if (!normalized) {
243
262
  return null;
263
+ }
244
264
  const isGroup = isWhatsAppGroupJid(normalized);
245
265
  const peer = {
246
266
  kind: isGroup ? "group" : "dm",
@@ -250,6 +270,7 @@ function resolveWhatsAppSession(params) {
250
270
  cfg: params.cfg,
251
271
  agentId: params.agentId,
252
272
  channel: "whatsapp",
273
+ accountId: params.accountId,
253
274
  peer,
254
275
  });
255
276
  return {
@@ -266,13 +287,15 @@ function resolveSignalSession(params) {
266
287
  const lowered = stripped.toLowerCase();
267
288
  if (lowered.startsWith("group:")) {
268
289
  const groupId = stripped.slice("group:".length).trim();
269
- if (!groupId)
290
+ if (!groupId) {
270
291
  return null;
292
+ }
271
293
  const peer = { kind: "group", id: groupId };
272
294
  const baseSessionKey = buildBaseSessionKey({
273
295
  cfg: params.cfg,
274
296
  agentId: params.agentId,
275
297
  channel: "signal",
298
+ accountId: params.accountId,
276
299
  peer,
277
300
  });
278
301
  return {
@@ -291,8 +314,9 @@ function resolveSignalSession(params) {
291
314
  else if (lowered.startsWith("u:")) {
292
315
  recipient = stripped.slice("u:".length).trim();
293
316
  }
294
- if (!recipient)
317
+ if (!recipient) {
295
318
  return null;
319
+ }
296
320
  const uuidCandidate = recipient.toLowerCase().startsWith("uuid:")
297
321
  ? recipient.slice("uuid:".length)
298
322
  : recipient;
@@ -307,6 +331,7 @@ function resolveSignalSession(params) {
307
331
  cfg: params.cfg,
308
332
  agentId: params.agentId,
309
333
  channel: "signal",
334
+ accountId: params.accountId,
310
335
  peer,
311
336
  });
312
337
  return {
@@ -322,13 +347,15 @@ function resolveIMessageSession(params) {
322
347
  const parsed = parseIMessageTarget(params.target);
323
348
  if (parsed.kind === "handle") {
324
349
  const handle = normalizeIMessageHandle(parsed.to);
325
- if (!handle)
350
+ if (!handle) {
326
351
  return null;
352
+ }
327
353
  const peer = { kind: "dm", id: handle };
328
354
  const baseSessionKey = buildBaseSessionKey({
329
355
  cfg: params.cfg,
330
356
  agentId: params.agentId,
331
357
  channel: "imessage",
358
+ accountId: params.accountId,
332
359
  peer,
333
360
  });
334
361
  return {
@@ -345,13 +372,15 @@ function resolveIMessageSession(params) {
345
372
  : parsed.kind === "chat_guid"
346
373
  ? parsed.chatGuid
347
374
  : parsed.chatIdentifier;
348
- if (!peerId)
375
+ if (!peerId) {
349
376
  return null;
377
+ }
350
378
  const peer = { kind: "group", id: peerId };
351
379
  const baseSessionKey = buildBaseSessionKey({
352
380
  cfg: params.cfg,
353
381
  agentId: params.agentId,
354
382
  channel: "imessage",
383
+ accountId: params.accountId,
355
384
  peer,
356
385
  });
357
386
  const toPrefix = parsed.kind === "chat_id"
@@ -372,13 +401,15 @@ function resolveMatrixSession(params) {
372
401
  const stripped = stripProviderPrefix(params.target, "matrix");
373
402
  const isUser = params.resolvedTarget?.kind === "user" || stripped.startsWith("@") || /^user:/i.test(stripped);
374
403
  const rawId = stripKindPrefix(stripped);
375
- if (!rawId)
404
+ if (!rawId) {
376
405
  return null;
406
+ }
377
407
  const peer = { kind: isUser ? "dm" : "channel", id: rawId };
378
408
  const baseSessionKey = buildBaseSessionKey({
379
409
  cfg: params.cfg,
380
410
  agentId: params.agentId,
381
411
  channel: "matrix",
412
+ accountId: params.accountId,
382
413
  peer,
383
414
  });
384
415
  return {
@@ -392,14 +423,16 @@ function resolveMatrixSession(params) {
392
423
  }
393
424
  function resolveMSTeamsSession(params) {
394
425
  let trimmed = params.target.trim();
395
- if (!trimmed)
426
+ if (!trimmed) {
396
427
  return null;
428
+ }
397
429
  trimmed = trimmed.replace(/^(msteams|teams):/i, "").trim();
398
430
  const lower = trimmed.toLowerCase();
399
431
  const isUser = lower.startsWith("user:");
400
432
  const rawId = stripKindPrefix(trimmed);
401
- if (!rawId)
433
+ if (!rawId) {
402
434
  return null;
435
+ }
403
436
  const conversationId = rawId.split(";")[0] ?? rawId;
404
437
  const isChannel = !isUser && /@thread\.tacv2/i.test(conversationId);
405
438
  const peer = {
@@ -410,6 +443,7 @@ function resolveMSTeamsSession(params) {
410
443
  cfg: params.cfg,
411
444
  agentId: params.agentId,
412
445
  channel: "msteams",
446
+ accountId: params.accountId,
413
447
  peer,
414
448
  });
415
449
  return {
@@ -427,8 +461,9 @@ function resolveMSTeamsSession(params) {
427
461
  }
428
462
  function resolveMattermostSession(params) {
429
463
  let trimmed = params.target.trim();
430
- if (!trimmed)
464
+ if (!trimmed) {
431
465
  return null;
466
+ }
432
467
  trimmed = trimmed.replace(/^mattermost:/i, "").trim();
433
468
  const lower = trimmed.toLowerCase();
434
469
  const isUser = lower.startsWith("user:") || trimmed.startsWith("@");
@@ -436,13 +471,15 @@ function resolveMattermostSession(params) {
436
471
  trimmed = trimmed.slice(1).trim();
437
472
  }
438
473
  const rawId = stripKindPrefix(trimmed);
439
- if (!rawId)
474
+ if (!rawId) {
440
475
  return null;
476
+ }
441
477
  const peer = { kind: isUser ? "dm" : "channel", id: rawId };
442
478
  const baseSessionKey = buildBaseSessionKey({
443
479
  cfg: params.cfg,
444
480
  agentId: params.agentId,
445
481
  channel: "mattermost",
482
+ accountId: params.accountId,
446
483
  peer,
447
484
  });
448
485
  const threadId = normalizeThreadId(params.replyToId ?? params.threadId);
@@ -474,8 +511,9 @@ function resolveBlueBubblesSession(params) {
474
511
  const peerId = isGroup
475
512
  ? rawPeerId.replace(/^(chat_id|chat_guid|chat_identifier):/i, "")
476
513
  : rawPeerId;
477
- if (!peerId)
514
+ if (!peerId) {
478
515
  return null;
516
+ }
479
517
  const peer = {
480
518
  kind: isGroup ? "group" : "dm",
481
519
  id: peerId,
@@ -484,6 +522,7 @@ function resolveBlueBubblesSession(params) {
484
522
  cfg: params.cfg,
485
523
  agentId: params.agentId,
486
524
  channel: "bluebubbles",
525
+ accountId: params.accountId,
487
526
  peer,
488
527
  });
489
528
  return {
@@ -497,17 +536,20 @@ function resolveBlueBubblesSession(params) {
497
536
  }
498
537
  function resolveNextcloudTalkSession(params) {
499
538
  let trimmed = params.target.trim();
500
- if (!trimmed)
539
+ if (!trimmed) {
501
540
  return null;
541
+ }
502
542
  trimmed = trimmed.replace(/^(nextcloud-talk|nc-talk|nc):/i, "").trim();
503
543
  trimmed = trimmed.replace(/^room:/i, "").trim();
504
- if (!trimmed)
544
+ if (!trimmed) {
505
545
  return null;
546
+ }
506
547
  const peer = { kind: "group", id: trimmed };
507
548
  const baseSessionKey = buildBaseSessionKey({
508
549
  cfg: params.cfg,
509
550
  agentId: params.agentId,
510
551
  channel: "nextcloud-talk",
552
+ accountId: params.accountId,
511
553
  peer,
512
554
  });
513
555
  return {
@@ -523,8 +565,9 @@ function resolveZaloSession(params) {
523
565
  const trimmed = stripProviderPrefix(params.target, "zalo")
524
566
  .replace(/^(zl):/i, "")
525
567
  .trim();
526
- if (!trimmed)
568
+ if (!trimmed) {
527
569
  return null;
570
+ }
528
571
  const isGroup = trimmed.toLowerCase().startsWith("group:");
529
572
  const peerId = stripKindPrefix(trimmed);
530
573
  const peer = { kind: isGroup ? "group" : "dm", id: peerId };
@@ -532,6 +575,7 @@ function resolveZaloSession(params) {
532
575
  cfg: params.cfg,
533
576
  agentId: params.agentId,
534
577
  channel: "zalo",
578
+ accountId: params.accountId,
535
579
  peer,
536
580
  });
537
581
  return {
@@ -547,8 +591,9 @@ function resolveZalouserSession(params) {
547
591
  const trimmed = stripProviderPrefix(params.target, "zalouser")
548
592
  .replace(/^(zlu):/i, "")
549
593
  .trim();
550
- if (!trimmed)
594
+ if (!trimmed) {
551
595
  return null;
596
+ }
552
597
  const isGroup = trimmed.toLowerCase().startsWith("group:");
553
598
  const peerId = stripKindPrefix(trimmed);
554
599
  // Keep DM vs group aligned with inbound sessions for Zalo Personal.
@@ -557,6 +602,7 @@ function resolveZalouserSession(params) {
557
602
  cfg: params.cfg,
558
603
  agentId: params.agentId,
559
604
  channel: "zalouser",
605
+ accountId: params.accountId,
560
606
  peer,
561
607
  });
562
608
  return {
@@ -570,13 +616,15 @@ function resolveZalouserSession(params) {
570
616
  }
571
617
  function resolveNostrSession(params) {
572
618
  const trimmed = stripProviderPrefix(params.target, "nostr").trim();
573
- if (!trimmed)
619
+ if (!trimmed) {
574
620
  return null;
621
+ }
575
622
  const peer = { kind: "dm", id: trimmed };
576
623
  const baseSessionKey = buildBaseSessionKey({
577
624
  cfg: params.cfg,
578
625
  agentId: params.agentId,
579
626
  channel: "nostr",
627
+ accountId: params.accountId,
580
628
  peer,
581
629
  });
582
630
  return {
@@ -590,15 +638,17 @@ function resolveNostrSession(params) {
590
638
  }
591
639
  function normalizeTlonShip(raw) {
592
640
  const trimmed = raw.trim();
593
- if (!trimmed)
641
+ if (!trimmed) {
594
642
  return trimmed;
643
+ }
595
644
  return trimmed.startsWith("~") ? trimmed : `~${trimmed}`;
596
645
  }
597
646
  function resolveTlonSession(params) {
598
647
  let trimmed = stripProviderPrefix(params.target, "tlon");
599
648
  trimmed = trimmed.trim();
600
- if (!trimmed)
649
+ if (!trimmed) {
601
650
  return null;
651
+ }
602
652
  const lower = trimmed.toLowerCase();
603
653
  let isGroup = lower.startsWith("group:") || lower.startsWith("room:") || lower.startsWith("chat/");
604
654
  let peerId = trimmed;
@@ -635,6 +685,7 @@ function resolveTlonSession(params) {
635
685
  cfg: params.cfg,
636
686
  agentId: params.agentId,
637
687
  channel: "tlon",
688
+ accountId: params.accountId,
638
689
  peer,
639
690
  });
640
691
  return {
@@ -646,17 +697,69 @@ function resolveTlonSession(params) {
646
697
  to: `tlon:${peerId}`,
647
698
  };
648
699
  }
700
+ /**
701
+ * Feishu ID formats:
702
+ * - oc_xxx: chat_id (group chat)
703
+ * - ou_xxx: user open_id (DM)
704
+ * - on_xxx: user union_id (DM)
705
+ * - cli_xxx: app_id (not a valid send target)
706
+ */
707
+ function resolveFeishuSession(params) {
708
+ let trimmed = stripProviderPrefix(params.target, "feishu");
709
+ trimmed = stripProviderPrefix(trimmed, "lark").trim();
710
+ if (!trimmed) {
711
+ return null;
712
+ }
713
+ const lower = trimmed.toLowerCase();
714
+ let isGroup = false;
715
+ if (lower.startsWith("group:") || lower.startsWith("chat:")) {
716
+ trimmed = trimmed.replace(/^(group|chat):/i, "").trim();
717
+ isGroup = true;
718
+ }
719
+ else if (lower.startsWith("user:") || lower.startsWith("dm:")) {
720
+ trimmed = trimmed.replace(/^(user|dm):/i, "").trim();
721
+ isGroup = false;
722
+ }
723
+ const idLower = trimmed.toLowerCase();
724
+ if (idLower.startsWith("oc_")) {
725
+ isGroup = true;
726
+ }
727
+ else if (idLower.startsWith("ou_") || idLower.startsWith("on_")) {
728
+ isGroup = false;
729
+ }
730
+ const peer = {
731
+ kind: isGroup ? "group" : "dm",
732
+ id: trimmed,
733
+ };
734
+ const baseSessionKey = buildBaseSessionKey({
735
+ cfg: params.cfg,
736
+ agentId: params.agentId,
737
+ channel: "feishu",
738
+ accountId: params.accountId,
739
+ peer,
740
+ });
741
+ return {
742
+ sessionKey: baseSessionKey,
743
+ baseSessionKey,
744
+ peer,
745
+ chatType: isGroup ? "group" : "direct",
746
+ from: isGroup ? `feishu:group:${trimmed}` : `feishu:${trimmed}`,
747
+ to: trimmed,
748
+ };
749
+ }
649
750
  function resolveFallbackSession(params) {
650
751
  const trimmed = stripProviderPrefix(params.target, params.channel).trim();
651
- if (!trimmed)
752
+ if (!trimmed) {
652
753
  return null;
754
+ }
653
755
  const peerKind = inferPeerKind({
654
756
  channel: params.channel,
655
757
  resolvedTarget: params.resolvedTarget,
656
758
  });
657
759
  const peerId = stripKindPrefix(trimmed);
658
- if (!peerId)
760
+ if (!peerId) {
659
761
  return null;
762
+ }
660
763
  const peer = { kind: peerKind, id: peerId };
661
764
  const baseSessionKey = buildBaseSessionKey({
662
765
  cfg: params.cfg,
@@ -678,8 +781,9 @@ function resolveFallbackSession(params) {
678
781
  }
679
782
  export async function resolveOutboundSessionRoute(params) {
680
783
  const target = params.target.trim();
681
- if (!target)
784
+ if (!target) {
682
785
  return null;
786
+ }
683
787
  switch (params.channel) {
684
788
  case "slack":
685
789
  return await resolveSlackSession({ ...params, target });
@@ -711,6 +815,8 @@ export async function resolveOutboundSessionRoute(params) {
711
815
  return resolveNostrSession({ ...params, target });
712
816
  case "tlon":
713
817
  return resolveTlonSession({ ...params, target });
818
+ case "feishu":
819
+ return resolveFeishuSession({ ...params, target });
714
820
  default:
715
821
  return resolveFallbackSession({ ...params, target });
716
822
  }
@@ -45,8 +45,8 @@ function candidateBinDirs(opts) {
45
45
  // Bundled macOS app: `poolbot` lives next to the executable (process.execPath).
46
46
  try {
47
47
  const execDir = path.dirname(execPath);
48
- const siblingMoltbot = path.join(execDir, "poolbot");
49
- if (isExecutable(siblingMoltbot))
48
+ const siblingPoolbot = path.join(execDir, "poolbot");
49
+ if (isExecutable(siblingPoolbot))
50
50
  candidates.push(execDir);
51
51
  }
52
52
  catch {
@@ -79,7 +79,7 @@ function candidateBinDirs(opts) {
79
79
  * Best-effort PATH bootstrap so skills that require the `poolbot` CLI can run
80
80
  * under launchd/minimal environments (and inside the macOS app bundle).
81
81
  */
82
- export function ensureMoltbotCliOnPath(opts = {}) {
82
+ export function ensurePoolbotCliOnPath(opts = {}) {
83
83
  if (isTruthyEnvValue(process.env.CLAWDBOT_PATH_BOOTSTRAPPED))
84
84
  return;
85
85
  process.env.CLAWDBOT_PATH_BOOTSTRAPPED = "1";
@@ -1,7 +1,8 @@
1
+ import fsSync from "node:fs";
1
2
  import fs from "node:fs/promises";
2
3
  import path from "node:path";
3
4
  import { fileURLToPath } from "node:url";
4
- const CORE_PACKAGE_NAMES = new Set(["poolbot", "poolbot"]);
5
+ const CORE_PACKAGE_NAMES = new Set(["poolbot"]);
5
6
  async function readPackageName(dir) {
6
7
  try {
7
8
  const raw = await fs.readFile(path.join(dir, "package.json"), "utf-8");
@@ -12,6 +13,16 @@ async function readPackageName(dir) {
12
13
  return null;
13
14
  }
14
15
  }
16
+ function readPackageNameSync(dir) {
17
+ try {
18
+ const raw = fsSync.readFileSync(path.join(dir, "package.json"), "utf-8");
19
+ const parsed = JSON.parse(raw);
20
+ return typeof parsed.name === "string" ? parsed.name : null;
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
15
26
  async function findPackageRoot(startDir, maxDepth = 12) {
16
27
  let current = path.resolve(startDir);
17
28
  for (let i = 0; i < maxDepth; i += 1) {
@@ -25,6 +36,19 @@ async function findPackageRoot(startDir, maxDepth = 12) {
25
36
  }
26
37
  return null;
27
38
  }
39
+ function findPackageRootSync(startDir, maxDepth = 12) {
40
+ let current = path.resolve(startDir);
41
+ for (let i = 0; i < maxDepth; i += 1) {
42
+ const name = readPackageNameSync(current);
43
+ if (name && CORE_PACKAGE_NAMES.has(name))
44
+ return current;
45
+ const parent = path.dirname(current);
46
+ if (parent === current)
47
+ break;
48
+ current = parent;
49
+ }
50
+ return null;
51
+ }
28
52
  function candidateDirsFromArgv1(argv1) {
29
53
  const normalized = path.resolve(argv1);
30
54
  const candidates = [path.dirname(normalized)];
@@ -55,3 +79,21 @@ export async function resolvePoolBotPackageRoot(opts) {
55
79
  }
56
80
  return null;
57
81
  }
82
+ export function resolvePoolBotPackageRootSync(opts) {
83
+ const candidates = [];
84
+ if (opts.moduleUrl) {
85
+ candidates.push(path.dirname(fileURLToPath(opts.moduleUrl)));
86
+ }
87
+ if (opts.argv1) {
88
+ candidates.push(...candidateDirsFromArgv1(opts.argv1));
89
+ }
90
+ if (opts.cwd) {
91
+ candidates.push(opts.cwd);
92
+ }
93
+ for (const candidate of candidates) {
94
+ const found = findPackageRootSync(candidate);
95
+ if (found)
96
+ return found;
97
+ }
98
+ return null;
99
+ }
@@ -260,7 +260,7 @@ export async function fetchMinimaxUsage(apiKey, timeoutMs, fetchFn) {
260
260
  headers: {
261
261
  Authorization: `Bearer ${apiKey}`,
262
262
  "Content-Type": "application/json",
263
- "MM-API-Source": "Moltbot",
263
+ "MM-API-Source": "Poolbot",
264
264
  },
265
265
  }, timeoutMs, fetchFn);
266
266
  if (!res.ok) {
@@ -71,7 +71,7 @@ function normalizeSystemdUnit(raw, profile) {
71
71
  }
72
72
  return unit.endsWith(".service") ? unit : `${unit}.service`;
73
73
  }
74
- export function triggerMoltbotRestart() {
74
+ export function triggerPoolbotRestart() {
75
75
  if (process.env.VITEST || process.env.NODE_ENV === "test") {
76
76
  return { ok: true, method: "supervisor", detail: "test mode" };
77
77
  }