@poolzin/pool-bot 2026.2.24 → 2026.2.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (646) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/acp/client.js +207 -18
  3. package/dist/acp/event-mapper.js +87 -22
  4. package/dist/acp/meta.js +12 -6
  5. package/dist/acp/secret-file.js +22 -0
  6. package/dist/agents/agent-paths.js +8 -9
  7. package/dist/agents/agent-scope.js +17 -5
  8. package/dist/agents/auth-profiles/oauth.js +148 -64
  9. package/dist/agents/auth-profiles/session-override.js +13 -7
  10. package/dist/agents/bash-process-registry.test-helpers.js +29 -0
  11. package/dist/agents/bash-tools.exec-approval-request.js +20 -0
  12. package/dist/agents/bash-tools.exec-host-gateway.js +240 -0
  13. package/dist/agents/bash-tools.exec-host-node.js +235 -0
  14. package/dist/agents/bash-tools.exec-runtime.js +2 -25
  15. package/dist/agents/bash-tools.exec-types.js +1 -0
  16. package/dist/agents/bash-tools.process.js +224 -218
  17. package/dist/agents/bedrock-discovery.js +3 -1
  18. package/dist/agents/byteplus-models.js +97 -0
  19. package/dist/agents/chutes-oauth.js +1 -0
  20. package/dist/agents/cli-runner/helpers.js +4 -0
  21. package/dist/agents/compaction.js +41 -14
  22. package/dist/agents/content-blocks.js +16 -0
  23. package/dist/agents/doubao-models.js +121 -0
  24. package/dist/agents/failover-error.js +2 -0
  25. package/dist/agents/huggingface-models.js +5 -3
  26. package/dist/agents/live-model-filter.js +5 -0
  27. package/dist/agents/minimax-vlm.js +10 -8
  28. package/dist/agents/model-auth.js +6 -0
  29. package/dist/agents/model-catalog.js +3 -1
  30. package/dist/agents/model-fallback.js +96 -101
  31. package/dist/agents/model-selection.js +7 -1
  32. package/dist/agents/models-config.providers.js +364 -165
  33. package/dist/agents/ollama-stream.js +117 -4
  34. package/dist/agents/opencode-zen-models.js +22 -11
  35. package/dist/agents/pi-embedded-helpers/errors.js +55 -33
  36. package/dist/agents/pi-embedded-helpers/messaging-dedupe.js +10 -5
  37. package/dist/agents/pi-embedded-helpers/thinking.js +10 -5
  38. package/dist/agents/pi-embedded-helpers.js +1 -1
  39. package/dist/agents/pi-embedded-payloads.js +1 -0
  40. package/dist/agents/pi-embedded-runner/compact.js +29 -7
  41. package/dist/agents/pi-embedded-runner/extensions.js +28 -26
  42. package/dist/agents/pi-embedded-runner/google.js +20 -8
  43. package/dist/agents/pi-embedded-runner/run/attempt.js +95 -36
  44. package/dist/agents/pi-embedded-runner/run.js +71 -12
  45. package/dist/agents/pi-embedded-runner/run.overflow-compaction.fixture.js +34 -0
  46. package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +11 -2
  47. package/dist/agents/pi-embedded-runner/session-manager-cache.js +11 -7
  48. package/dist/agents/pi-embedded-runner/system-prompt.js +2 -0
  49. package/dist/agents/pi-embedded-runner/thinking.js +42 -0
  50. package/dist/agents/pi-embedded-runner/tool-name-allowlist.js +19 -0
  51. package/dist/agents/pi-embedded-runner/utils.js +7 -10
  52. package/dist/agents/pi-embedded-subscribe.handlers.lifecycle.js +45 -56
  53. package/dist/agents/pi-embedded-subscribe.handlers.tools.js +2 -2
  54. package/dist/agents/pi-embedded-subscribe.js +9 -4
  55. package/dist/agents/pi-embedded-subscribe.tools.js +68 -14
  56. package/dist/agents/pi-embedded-utils.js +3 -0
  57. package/dist/agents/pi-extensions/compaction-safeguard-runtime.js +4 -20
  58. package/dist/agents/pi-extensions/compaction-safeguard.js +75 -33
  59. package/dist/agents/pi-settings.js +40 -0
  60. package/dist/agents/pi-tools.policy.js +2 -1
  61. package/dist/agents/provider/config-loader.js +1 -1
  62. package/dist/agents/sandbox/browser.js +170 -33
  63. package/dist/agents/sandbox/config-hash.js +14 -27
  64. package/dist/agents/sandbox/config.js +21 -2
  65. package/dist/agents/sandbox/constants.js +2 -0
  66. package/dist/agents/sandbox/docker.js +16 -2
  67. package/dist/agents/sandbox/novnc-auth.js +62 -0
  68. package/dist/agents/sandbox/sanitize-env-vars.js +1 -1
  69. package/dist/agents/sandbox/shared.js +10 -6
  70. package/dist/agents/sandbox-paths.js +24 -11
  71. package/dist/agents/schema/clean-for-gemini.js +132 -85
  72. package/dist/agents/session-slug.js +10 -5
  73. package/dist/agents/session-tool-result-guard-wrapper.js +1 -0
  74. package/dist/agents/session-tool-result-guard.js +3 -1
  75. package/dist/agents/session-transcript-repair.js +40 -6
  76. package/dist/agents/skills/bundled-dir.js +19 -5
  77. package/dist/agents/skills/env-overrides.js +124 -43
  78. package/dist/agents/skills/frontmatter.js +6 -6
  79. package/dist/agents/skills/plugin-skills.js +14 -7
  80. package/dist/agents/skills/workspace.js +1 -0
  81. package/dist/agents/skills.test-helpers.js +13 -0
  82. package/dist/agents/stable-stringify.js +12 -0
  83. package/dist/agents/subagent-announce.js +251 -49
  84. package/dist/agents/subagent-lifecycle-events.js +19 -0
  85. package/dist/agents/subagent-registry-cleanup.js +31 -0
  86. package/dist/agents/subagent-registry-completion.js +68 -0
  87. package/dist/agents/subagent-registry-queries.js +117 -0
  88. package/dist/agents/subagent-registry-state.js +46 -0
  89. package/dist/agents/subagent-registry.js +252 -221
  90. package/dist/agents/subagent-registry.mocks.shared.js +12 -0
  91. package/dist/agents/subagent-registry.store.js +1 -0
  92. package/dist/agents/subagent-registry.types.js +1 -0
  93. package/dist/agents/subagent-spawn.js +195 -7
  94. package/dist/agents/system-prompt.js +22 -6
  95. package/dist/agents/test-helpers/assistant-message-fixtures.js +29 -0
  96. package/dist/agents/test-helpers/fast-coding-tools.js +1 -18
  97. package/dist/agents/test-helpers/fast-core-tools.js +1 -17
  98. package/dist/agents/test-helpers/pi-tools-sandbox-context.js +27 -0
  99. package/dist/agents/timeout.js +18 -6
  100. package/dist/agents/tool-call-id.js +1 -1
  101. package/dist/agents/tool-display-common.js +162 -29
  102. package/dist/agents/tool-images.js +82 -9
  103. package/dist/agents/tool-policy-shared.js +108 -0
  104. package/dist/agents/tool-policy.js +51 -26
  105. package/dist/agents/tools/browser-tool.js +160 -54
  106. package/dist/agents/tools/canvas-tool.js +27 -1
  107. package/dist/agents/tools/common.js +45 -0
  108. package/dist/agents/tools/cron-tool.test-helpers.js +12 -0
  109. package/dist/agents/tools/discord-actions-guild.js +4 -1
  110. package/dist/agents/tools/discord-actions-moderation-shared.js +27 -0
  111. package/dist/agents/tools/gateway-tool.js +3 -1
  112. package/dist/agents/tools/image-tool.js +214 -99
  113. package/dist/agents/tools/nodes-utils.js +1 -10
  114. package/dist/agents/tools/sessions-history-tool.js +140 -108
  115. package/dist/agents/tools/sessions-send-helpers.js +12 -6
  116. package/dist/agents/tools/sessions-spawn-tool.js +8 -2
  117. package/dist/agents/tools/subagents-tool.js +2 -1
  118. package/dist/agents/tools/whatsapp-actions.js +10 -2
  119. package/dist/agents/tools/whatsapp-target-auth.js +18 -0
  120. package/dist/agents/transcript-policy.js +22 -8
  121. package/dist/agents/venice-models.js +11 -3
  122. package/dist/agents/workspace.js +222 -46
  123. package/dist/auto-reply/commands-registry.data.js +51 -0
  124. package/dist/auto-reply/commands-registry.js +19 -21
  125. package/dist/auto-reply/fallback-state.js +114 -0
  126. package/dist/auto-reply/group-activation.js +10 -5
  127. package/dist/auto-reply/inbound-debounce.js +10 -5
  128. package/dist/auto-reply/model-runtime.js +68 -0
  129. package/dist/auto-reply/reply/abort.js +1 -1
  130. package/dist/auto-reply/reply/agent-runner-execution.js +40 -5
  131. package/dist/auto-reply/reply/agent-runner.js +165 -39
  132. package/dist/auto-reply/reply/bash-command.js +41 -39
  133. package/dist/auto-reply/reply/command-gates.js +25 -0
  134. package/dist/auto-reply/reply/commands-allowlist.js +111 -72
  135. package/dist/auto-reply/reply/commands-bash.js +6 -5
  136. package/dist/auto-reply/reply/commands-config.js +30 -28
  137. package/dist/auto-reply/reply/commands-core.js +2 -1
  138. package/dist/auto-reply/reply/commands-info.js +1 -0
  139. package/dist/auto-reply/reply/commands-models.js +65 -14
  140. package/dist/auto-reply/reply/commands-session.js +237 -82
  141. package/dist/auto-reply/reply/commands-setunset-standard.js +13 -0
  142. package/dist/auto-reply/reply/commands-setunset.js +45 -0
  143. package/dist/auto-reply/reply/commands-subagents/action-agents.js +44 -0
  144. package/dist/auto-reply/reply/commands-subagents/action-focus.js +64 -0
  145. package/dist/auto-reply/reply/commands-subagents/action-help.js +4 -0
  146. package/dist/auto-reply/reply/commands-subagents/action-info.js +45 -0
  147. package/dist/auto-reply/reply/commands-subagents/action-kill.js +60 -0
  148. package/dist/auto-reply/reply/commands-subagents/action-list.js +44 -0
  149. package/dist/auto-reply/reply/commands-subagents/action-log.js +29 -0
  150. package/dist/auto-reply/reply/commands-subagents/action-send.js +119 -0
  151. package/dist/auto-reply/reply/commands-subagents/action-spawn.js +52 -0
  152. package/dist/auto-reply/reply/commands-subagents/action-unfocus.js +30 -0
  153. package/dist/auto-reply/reply/commands-subagents/shared.js +303 -0
  154. package/dist/auto-reply/reply/commands-subagents.js +51 -587
  155. package/dist/auto-reply/reply/commands-tts.js +10 -5
  156. package/dist/auto-reply/reply/config-value.js +10 -5
  157. package/dist/auto-reply/reply/directive-handling.model-picker.js +12 -6
  158. package/dist/auto-reply/reply/directive-handling.persist.js +9 -21
  159. package/dist/auto-reply/reply/directive-handling.shared.js +24 -4
  160. package/dist/auto-reply/reply/followup-runner.js +1 -0
  161. package/dist/auto-reply/reply/get-reply-directives-utils.js +23 -14
  162. package/dist/auto-reply/reply/get-reply-directives.js +17 -28
  163. package/dist/auto-reply/reply/get-reply-inline-actions.js +1 -0
  164. package/dist/auto-reply/reply/get-reply.js +71 -12
  165. package/dist/auto-reply/reply/model-selection.js +80 -39
  166. package/dist/auto-reply/reply/queue/enqueue.js +10 -5
  167. package/dist/auto-reply/reply/queue/state.js +13 -12
  168. package/dist/auto-reply/reply/reply-payloads.js +67 -36
  169. package/dist/auto-reply/reply/reply-reference.js +9 -8
  170. package/dist/auto-reply/reply/route-reply.js +15 -8
  171. package/dist/auto-reply/reply/session-reset-prompt.js +1 -1
  172. package/dist/auto-reply/reply/session.js +22 -6
  173. package/dist/auto-reply/reply/strip-inbound-meta.js +147 -0
  174. package/dist/auto-reply/reply/subagents-utils.js +56 -30
  175. package/dist/auto-reply/reply/typing.js +46 -21
  176. package/dist/auto-reply/send-policy.js +14 -7
  177. package/dist/auto-reply/status.js +140 -16
  178. package/dist/auto-reply/templating.js +10 -5
  179. package/dist/auto-reply/thinking.js +7 -16
  180. package/dist/auto-reply/tokens.js +21 -5
  181. package/dist/browser/bridge-server.js +36 -20
  182. package/dist/browser/cdp.helpers.js +7 -14
  183. package/dist/browser/cdp.js +35 -15
  184. package/dist/browser/chrome.profile-decoration.js +7 -4
  185. package/dist/browser/config.js +30 -0
  186. package/dist/browser/extension-relay-auth.js +55 -0
  187. package/dist/browser/extension-relay.js +74 -29
  188. package/dist/browser/navigation-guard.js +39 -0
  189. package/dist/browser/paths.js +77 -0
  190. package/dist/browser/profiles.js +13 -8
  191. package/dist/browser/pw-ai-module.js +10 -5
  192. package/dist/browser/pw-session.js +76 -39
  193. package/dist/browser/pw-tools-core.interactions.js +14 -7
  194. package/dist/browser/pw-tools-core.state.js +12 -6
  195. package/dist/browser/routes/agent.act.js +431 -424
  196. package/dist/browser/routes/agent.shared.js +47 -3
  197. package/dist/browser/routes/agent.snapshot.js +122 -116
  198. package/dist/browser/routes/agent.storage.js +303 -297
  199. package/dist/browser/routes/tabs.js +154 -100
  200. package/dist/browser/server-context.js +7 -0
  201. package/dist/browser/server-lifecycle.js +37 -0
  202. package/dist/build-info.json +3 -3
  203. package/dist/channels/allow-from.js +26 -0
  204. package/dist/channels/allowlists/resolve-utils.js +43 -19
  205. package/dist/channels/channel-config.js +14 -7
  206. package/dist/channels/draft-stream-loop.js +7 -0
  207. package/dist/channels/model-overrides.js +82 -0
  208. package/dist/channels/plugins/account-action-gate.js +13 -0
  209. package/dist/channels/plugins/message-actions.js +10 -0
  210. package/dist/channels/plugins/normalize/imessage.js +14 -7
  211. package/dist/channels/plugins/normalize/slack.js +10 -5
  212. package/dist/channels/plugins/normalize/telegram.js +14 -7
  213. package/dist/channels/plugins/outbound/discord.js +80 -8
  214. package/dist/channels/plugins/outbound/signal.js +11 -11
  215. package/dist/channels/plugins/setup-helpers.js +10 -5
  216. package/dist/channels/sender-label.js +14 -7
  217. package/dist/channels/session.js +4 -2
  218. package/dist/channels/status-reactions.js +297 -0
  219. package/dist/channels/telegram/api.js +18 -0
  220. package/dist/cli/argv.js +84 -21
  221. package/dist/cli/banner.js +3 -2
  222. package/dist/cli/browser-cli-actions-input/register.files-downloads.js +65 -56
  223. package/dist/cli/cli-name.js +11 -11
  224. package/dist/cli/cli-utils.js +13 -3
  225. package/dist/cli/command-format.js +1 -1
  226. package/dist/cli/config-cli.js +1 -1
  227. package/dist/cli/daemon-cli/lifecycle-core.js +31 -19
  228. package/dist/cli/daemon-cli/lifecycle.js +64 -2
  229. package/dist/cli/daemon-cli/restart-health.js +126 -0
  230. package/dist/cli/daemon-cli/status.gather.js +9 -13
  231. package/dist/cli/daemon-cli/status.print.js +2 -10
  232. package/dist/cli/deps.js +27 -22
  233. package/dist/cli/exec-approvals-cli.js +92 -124
  234. package/dist/cli/gateway-cli/run-loop.js +23 -5
  235. package/dist/cli/memory-cli.js +158 -61
  236. package/dist/cli/node-cli/register.js +14 -5
  237. package/dist/cli/nodes-cli/register.push.js +63 -0
  238. package/dist/cli/nodes-media-utils.js +26 -0
  239. package/dist/cli/outbound-send-deps.js +2 -9
  240. package/dist/cli/outbound-send-mapping.js +11 -0
  241. package/dist/cli/pairing-cli.js +40 -14
  242. package/dist/cli/plugins-cli.js +250 -73
  243. package/dist/cli/ports.js +11 -10
  244. package/dist/cli/program/build-program.js +3 -1
  245. package/dist/cli/program/command-registry.js +214 -136
  246. package/dist/cli/program/command-tree.js +16 -0
  247. package/dist/cli/program/help.js +43 -12
  248. package/dist/cli/program/preaction.js +13 -9
  249. package/dist/cli/program/register.configure.js +3 -18
  250. package/dist/cli/program/register.maintenance.js +2 -2
  251. package/dist/cli/program/register.onboard.js +2 -0
  252. package/dist/cli/program/register.status-health-sessions.js +16 -17
  253. package/dist/cli/program/register.subclis.js +93 -52
  254. package/dist/cli/route.js +12 -8
  255. package/dist/cli/system-cli.js +36 -46
  256. package/dist/cli/test-runtime-capture.js +24 -0
  257. package/dist/cli/update-cli/shared.js +22 -9
  258. package/dist/cli/update-cli/update-command.js +89 -14
  259. package/dist/cli/update-cli/wizard.js +6 -12
  260. package/dist/commands/agent/run-context.js +18 -5
  261. package/dist/commands/agent/session-store.js +17 -4
  262. package/dist/commands/agent.js +185 -89
  263. package/dist/commands/agents.bindings.js +14 -7
  264. package/dist/commands/agents.commands.add.js +13 -9
  265. package/dist/commands/agents.commands.identity.js +12 -6
  266. package/dist/commands/agents.commands.list.js +11 -6
  267. package/dist/commands/agents.config.js +8 -10
  268. package/dist/commands/agents.providers.js +12 -6
  269. package/dist/commands/auth-choice-options.js +103 -75
  270. package/dist/commands/auth-choice.apply.byteplus.js +55 -0
  271. package/dist/commands/auth-choice.apply.js +4 -0
  272. package/dist/commands/auth-choice.apply.minimax.js +61 -13
  273. package/dist/commands/auth-choice.apply.openai.js +3 -1
  274. package/dist/commands/auth-choice.apply.volcengine.js +55 -0
  275. package/dist/commands/auth-choice.preferred-provider.js +2 -0
  276. package/dist/commands/channels/remove.js +13 -6
  277. package/dist/commands/channels/shared.js +4 -14
  278. package/dist/commands/channels.mock-harness.js +23 -0
  279. package/dist/commands/configure.commands.js +14 -0
  280. package/dist/commands/configure.gateway.js +2 -4
  281. package/dist/commands/configure.js +1 -1
  282. package/dist/commands/configure.shared.js +11 -0
  283. package/dist/commands/daemon-install-helpers.js +2 -2
  284. package/dist/commands/daemon-install-runtime-warning.js +11 -0
  285. package/dist/commands/dashboard.js +12 -10
  286. package/dist/commands/docs.js +14 -8
  287. package/dist/commands/doctor-config-flow.js +11 -9
  288. package/dist/commands/doctor-legacy-config.js +281 -0
  289. package/dist/commands/doctor-state-integrity.js +99 -23
  290. package/dist/commands/doctor-update.js +12 -9
  291. package/dist/commands/models/list.list-command.js +7 -5
  292. package/dist/commands/models/set-image.js +2 -21
  293. package/dist/commands/node-daemon-install-helpers.js +10 -8
  294. package/dist/commands/onboard-auth.config-minimax.js +54 -80
  295. package/dist/commands/onboard-auth.config-opencode.js +2 -18
  296. package/dist/commands/onboard-auth.credentials.js +90 -13
  297. package/dist/commands/onboard-auth.js +1 -1
  298. package/dist/commands/onboard-auth.models.js +6 -5
  299. package/dist/commands/onboard-hooks.js +1 -1
  300. package/dist/commands/onboard-non-interactive/api-keys.js +14 -7
  301. package/dist/commands/onboard-non-interactive/local/auth-choice.js +64 -49
  302. package/dist/commands/onboard-provider-auth-flags.js +14 -0
  303. package/dist/commands/onboard-remote.js +14 -7
  304. package/dist/commands/onboard.js +11 -13
  305. package/dist/commands/sandbox-display.js +6 -5
  306. package/dist/commands/sessions.test-helpers.js +61 -0
  307. package/dist/commands/status-all/diagnosis.js +14 -10
  308. package/dist/commands/status-all/format.js +1 -0
  309. package/dist/commands/status.gateway-probe.js +1 -16
  310. package/dist/commands/systemd-linger.js +12 -6
  311. package/dist/config/agent-limits.js +2 -0
  312. package/dist/config/commands.js +32 -15
  313. package/dist/config/config-paths.js +9 -11
  314. package/dist/config/config.js +1 -1
  315. package/dist/config/defaults.js +22 -2
  316. package/dist/config/discord-preview-streaming.js +104 -0
  317. package/dist/config/env-substitution.js +62 -34
  318. package/dist/config/env-vars.js +45 -7
  319. package/dist/config/includes.js +4 -0
  320. package/dist/config/io.js +656 -171
  321. package/dist/config/legacy.migrations.part-1.js +189 -78
  322. package/dist/config/legacy.shared.js +3 -1
  323. package/dist/config/merge-patch.js +54 -4
  324. package/dist/config/prototype-keys.js +4 -0
  325. package/dist/config/redact-snapshot.js +404 -76
  326. package/dist/config/schema.help.js +44 -7
  327. package/dist/config/schema.js +58 -570
  328. package/dist/config/schema.labels.js +38 -6
  329. package/dist/config/sessions/delivery-info.js +10 -3
  330. package/dist/config/sessions/main-session.js +10 -5
  331. package/dist/config/sessions/session-file.js +33 -0
  332. package/dist/config/sessions/session-key.js +10 -5
  333. package/dist/config/sessions/store.js +1 -1
  334. package/dist/config/sessions.js +1 -0
  335. package/dist/config/validation.js +140 -85
  336. package/dist/config/zod-schema.agent-runtime.js +11 -0
  337. package/dist/config/zod-schema.hooks.js +40 -11
  338. package/dist/config/zod-schema.installs.js +20 -0
  339. package/dist/config/zod-schema.js +156 -20
  340. package/dist/config/zod-schema.providers-core.js +78 -4
  341. package/dist/config/zod-schema.providers.js +6 -1
  342. package/dist/config/zod-schema.session.js +41 -2
  343. package/dist/cron/run-log.js +3 -0
  344. package/dist/cron/schedule.js +21 -10
  345. package/dist/cron/service/ops.js +35 -21
  346. package/dist/cron/service/timer.js +116 -16
  347. package/dist/cron/stagger.js +3 -1
  348. package/dist/daemon/cmd-argv.js +21 -0
  349. package/dist/daemon/cmd-set.js +58 -0
  350. package/dist/daemon/service-types.js +1 -0
  351. package/dist/discord/api.js +12 -6
  352. package/dist/discord/draft-chunking.js +22 -0
  353. package/dist/discord/draft-stream.js +124 -0
  354. package/dist/discord/monitor/agent-components.js +1 -1
  355. package/dist/discord/monitor/commands.js +5 -0
  356. package/dist/discord/monitor/exec-approvals.js +357 -162
  357. package/dist/discord/monitor/gateway-plugin.js +2 -1
  358. package/dist/discord/monitor/listeners.js +37 -27
  359. package/dist/discord/monitor/message-handler.js +4 -1
  360. package/dist/discord/monitor/message-handler.preflight.js +65 -8
  361. package/dist/discord/monitor/message-handler.process.js +246 -217
  362. package/dist/discord/monitor/message-utils.js +143 -6
  363. package/dist/discord/monitor/model-picker-preferences.js +143 -0
  364. package/dist/discord/monitor/model-picker.js +651 -0
  365. package/dist/discord/monitor/native-command.js +573 -16
  366. package/dist/discord/monitor/provider.allowlist.js +223 -0
  367. package/dist/discord/monitor/provider.js +275 -347
  368. package/dist/discord/monitor/provider.lifecycle.js +100 -0
  369. package/dist/discord/monitor/reply-delivery.js +123 -16
  370. package/dist/discord/monitor/thread-bindings.discord-api.js +215 -0
  371. package/dist/discord/monitor/thread-bindings.js +4 -0
  372. package/dist/discord/monitor/thread-bindings.lifecycle.js +177 -0
  373. package/dist/discord/monitor/thread-bindings.manager.js +423 -0
  374. package/dist/discord/monitor/thread-bindings.messages.js +55 -0
  375. package/dist/discord/monitor/thread-bindings.state.js +358 -0
  376. package/dist/discord/monitor/thread-bindings.types.js +6 -0
  377. package/dist/discord/resolve-users.js +33 -21
  378. package/dist/discord/send.channels.js +15 -0
  379. package/dist/discord/send.js +3 -2
  380. package/dist/discord/send.outbound.js +82 -26
  381. package/dist/discord/send.permissions.js +83 -30
  382. package/dist/discord/send.reactions.js +8 -4
  383. package/dist/discord/token.js +10 -5
  384. package/dist/discord/voice/command.js +263 -0
  385. package/dist/discord/voice/manager.js +531 -0
  386. package/dist/gateway/auth.js +72 -13
  387. package/dist/gateway/call.js +152 -83
  388. package/dist/gateway/canvas-capability.js +75 -0
  389. package/dist/gateway/client.js +28 -4
  390. package/dist/gateway/config-reload.js +3 -4
  391. package/dist/gateway/control-plane-audit.js +28 -0
  392. package/dist/gateway/control-plane-rate-limit.js +53 -0
  393. package/dist/gateway/control-ui.js +219 -96
  394. package/dist/gateway/events.js +1 -0
  395. package/dist/gateway/hooks-mapping.js +88 -38
  396. package/dist/gateway/hooks.js +109 -54
  397. package/dist/gateway/http-auth-helpers.js +3 -2
  398. package/dist/gateway/http-common.js +22 -0
  399. package/dist/gateway/http-endpoint-helpers.js +1 -0
  400. package/dist/gateway/method-scopes.js +169 -0
  401. package/dist/gateway/net.js +74 -9
  402. package/dist/gateway/node-invoke-system-run-approval.js +14 -35
  403. package/dist/gateway/node-registry.js +10 -5
  404. package/dist/gateway/openai-http.js +1 -0
  405. package/dist/gateway/openresponses-http.js +121 -110
  406. package/dist/gateway/origin-check.js +1 -18
  407. package/dist/gateway/probe-auth.js +2 -0
  408. package/dist/gateway/protocol/index.js +4 -2
  409. package/dist/gateway/protocol/schema/cron.js +1 -0
  410. package/dist/gateway/protocol/schema/devices.js +1 -0
  411. package/dist/gateway/protocol/schema/protocol-schemas.js +4 -1
  412. package/dist/gateway/protocol/schema/push.js +18 -0
  413. package/dist/gateway/protocol/schema/sessions.js +6 -0
  414. package/dist/gateway/protocol/schema.js +1 -0
  415. package/dist/gateway/role-policy.js +17 -0
  416. package/dist/gateway/server/ws-connection/connect-policy.js +37 -0
  417. package/dist/gateway/server/ws-connection/message-handler.js +175 -148
  418. package/dist/gateway/server-chat.js +83 -25
  419. package/dist/gateway/server-constants.js +10 -9
  420. package/dist/gateway/server-cron.js +1 -0
  421. package/dist/gateway/server-http.js +247 -54
  422. package/dist/gateway/server-maintenance.js +20 -5
  423. package/dist/gateway/server-methods/agent.js +162 -24
  424. package/dist/gateway/server-methods/chat.js +465 -130
  425. package/dist/gateway/server-methods/config.js +193 -152
  426. package/dist/gateway/server-methods/devices.js +17 -3
  427. package/dist/gateway/server-methods/models.js +11 -1
  428. package/dist/gateway/server-methods/nodes.helpers.js +12 -0
  429. package/dist/gateway/server-methods/nodes.js +251 -69
  430. package/dist/gateway/server-methods/push.js +53 -0
  431. package/dist/gateway/server-methods/sessions.js +64 -8
  432. package/dist/gateway/server-methods/usage.js +162 -75
  433. package/dist/gateway/server-node-events.js +29 -0
  434. package/dist/gateway/server-reload-handlers.js +2 -3
  435. package/dist/gateway/server-runtime-config.js +39 -13
  436. package/dist/gateway/server-runtime-state.js +2 -0
  437. package/dist/gateway/server-startup-memory.js +17 -11
  438. package/dist/gateway/server-ws-runtime.js +1 -0
  439. package/dist/gateway/server.impl.js +296 -139
  440. package/dist/gateway/session-preview.test-helpers.js +11 -0
  441. package/dist/gateway/session-utils.fs.js +32 -34
  442. package/dist/gateway/sessions-resolve.js +17 -5
  443. package/dist/gateway/startup-auth.js +126 -0
  444. package/dist/gateway/test-helpers.agent-results.js +15 -0
  445. package/dist/gateway/test-helpers.mocks.js +37 -14
  446. package/dist/gateway/test-helpers.openai-mock.js +14 -7
  447. package/dist/gateway/test-helpers.server.js +161 -77
  448. package/dist/gateway/tools-invoke-http.js +21 -10
  449. package/dist/hooks/bundled/bootstrap-extra-files/handler.js +3 -1
  450. package/dist/hooks/bundled/command-logger/handler.js +7 -2
  451. package/dist/hooks/bundled/session-memory/handler.js +170 -38
  452. package/dist/hooks/frontmatter.js +6 -6
  453. package/dist/hooks/gmail-watcher-lifecycle.js +23 -0
  454. package/dist/hooks/gmail-watcher.js +11 -6
  455. package/dist/hooks/internal-hooks.js +11 -1
  456. package/dist/hooks/llm-slug-generator.js +4 -1
  457. package/dist/hooks/workspace.js +47 -17
  458. package/dist/imessage/accounts.js +9 -20
  459. package/dist/imessage/monitor/inbound-processing.js +2 -1
  460. package/dist/infra/archive-path.js +49 -0
  461. package/dist/infra/archive.js +174 -73
  462. package/dist/infra/control-ui-assets.js +14 -6
  463. package/dist/infra/device-pairing.js +204 -144
  464. package/dist/infra/env.js +10 -5
  465. package/dist/infra/exec-approvals-allowlist.js +141 -70
  466. package/dist/infra/exec-approvals-analysis.js +78 -20
  467. package/dist/infra/exec-approvals.js +5 -17
  468. package/dist/infra/exec-safe-bin-policy.js +277 -0
  469. package/dist/infra/fixed-window-rate-limit.js +33 -0
  470. package/dist/infra/fs-safe.js +71 -39
  471. package/dist/infra/gateway-lock.js +6 -2
  472. package/dist/infra/git-root.js +61 -0
  473. package/dist/infra/heartbeat-active-hours.js +2 -2
  474. package/dist/infra/heartbeat-reason.js +40 -0
  475. package/dist/infra/heartbeat-runner.js +72 -32
  476. package/dist/infra/heartbeat-wake.js +6 -12
  477. package/dist/infra/host-env-security-policy.json +19 -0
  478. package/dist/infra/host-env-security.js +66 -0
  479. package/dist/infra/install-source-utils.js +91 -7
  480. package/dist/infra/net/ssrf.js +131 -38
  481. package/dist/infra/node-pairing.js +50 -105
  482. package/dist/infra/npm-integrity.js +45 -0
  483. package/dist/infra/npm-pack-install.js +40 -0
  484. package/dist/infra/outbound/bound-delivery-router.js +88 -0
  485. package/dist/infra/outbound/channel-adapters.js +20 -7
  486. package/dist/infra/outbound/channel-selection.js +12 -6
  487. package/dist/infra/outbound/envelope.js +1 -1
  488. package/dist/infra/outbound/format.js +12 -6
  489. package/dist/infra/outbound/message-action-runner.js +107 -327
  490. package/dist/infra/outbound/message.js +59 -36
  491. package/dist/infra/outbound/outbound-policy.js +52 -25
  492. package/dist/infra/outbound/outbound-send-service.js +58 -71
  493. package/dist/infra/outbound/payloads.js +14 -7
  494. package/dist/infra/outbound/session-binding-service.js +123 -0
  495. package/dist/infra/pairing-files.js +10 -0
  496. package/dist/infra/path-guards.js +25 -0
  497. package/dist/infra/plain-object.js +9 -0
  498. package/dist/infra/provider-usage.fetch.codex.js +7 -15
  499. package/dist/infra/provider-usage.fetch.gemini.js +14 -11
  500. package/dist/infra/provider-usage.fetch.shared.js +30 -1
  501. package/dist/infra/provider-usage.fetch.zai.js +10 -9
  502. package/dist/infra/push-apns.js +365 -0
  503. package/dist/infra/restart-sentinel.js +16 -1
  504. package/dist/infra/restart.js +229 -26
  505. package/dist/infra/retry-policy.js +4 -2
  506. package/dist/infra/retry.js +9 -5
  507. package/dist/infra/scp-host.js +54 -0
  508. package/dist/infra/session-cost-usage.js +107 -59
  509. package/dist/infra/session-maintenance-warning.js +3 -1
  510. package/dist/infra/shell-env.js +98 -34
  511. package/dist/infra/ssh-config.js +12 -6
  512. package/dist/infra/system-run-command.js +49 -4
  513. package/dist/infra/update-channels.js +10 -5
  514. package/dist/infra/update-startup.js +86 -9
  515. package/dist/line/accounts.js +5 -7
  516. package/dist/line/bot-access.js +8 -20
  517. package/dist/line/bot-handlers.js +3 -1
  518. package/dist/link-understanding/detect.js +15 -7
  519. package/dist/media/constants.js +15 -6
  520. package/dist/media/image-ops.js +7 -0
  521. package/dist/media/inbound-path-policy.js +114 -0
  522. package/dist/media/input-files.js +16 -0
  523. package/dist/media/local-roots.js +3 -2
  524. package/dist/media-understanding/apply.js +4 -1
  525. package/dist/media-understanding/concurrency.js +8 -20
  526. package/dist/memory/backend-config.js +45 -6
  527. package/dist/memory/embeddings.js +10 -4
  528. package/dist/memory/fs-utils.js +23 -0
  529. package/dist/memory/manager-search.js +12 -6
  530. package/dist/memory/manager-sync-ops.js +12 -2
  531. package/dist/memory/qmd-manager.js +466 -53
  532. package/dist/memory/query-expansion.js +167 -3
  533. package/dist/memory/status-format.js +10 -5
  534. package/dist/memory/sync-memory-files.js +1 -1
  535. package/dist/memory/test-manager.js +8 -0
  536. package/dist/node-host/invoke-system-run.js +281 -0
  537. package/dist/node-host/invoke.js +55 -337
  538. package/dist/pairing/pairing-store.js +22 -0
  539. package/dist/plugin-sdk/allow-from.js +1 -1
  540. package/dist/plugin-sdk/command-auth.js +3 -1
  541. package/dist/plugin-sdk/index.js +6 -3
  542. package/dist/plugin-sdk/temp-path.js +47 -0
  543. package/dist/plugin-sdk/webhook-targets.js +32 -0
  544. package/dist/plugins/bundled-dir.js +9 -6
  545. package/dist/plugins/discovery.js +217 -23
  546. package/dist/plugins/hook-runner-global.js +16 -0
  547. package/dist/plugins/hooks.js +50 -0
  548. package/dist/plugins/install.js +28 -16
  549. package/dist/plugins/loader.js +192 -26
  550. package/dist/plugins/logger.js +8 -0
  551. package/dist/plugins/manifest-registry.js +3 -0
  552. package/dist/plugins/path-safety.js +34 -0
  553. package/dist/plugins/registry.js +5 -2
  554. package/dist/plugins/runtime/index.js +271 -206
  555. package/dist/plugins/runtime.js +3 -17
  556. package/dist/plugins/update.js +78 -12
  557. package/dist/process/spawn-utils.js +14 -7
  558. package/dist/providers/github-copilot-models.js +4 -1
  559. package/dist/providers/github-copilot-token.js +11 -6
  560. package/dist/providers/qwen-portal-oauth.js +14 -6
  561. package/dist/routing/account-id.js +30 -0
  562. package/dist/routing/resolve-route.js +3 -7
  563. package/dist/routing/session-key.js +2 -16
  564. package/dist/security/audit-channel.js +100 -20
  565. package/dist/security/audit-extra.async.js +505 -179
  566. package/dist/security/audit-extra.js +12 -2
  567. package/dist/security/audit-extra.sync.js +421 -35
  568. package/dist/security/audit-fs.js +31 -13
  569. package/dist/security/audit.js +180 -370
  570. package/dist/security/dm-policy-shared.js +68 -0
  571. package/dist/security/external-content.js +46 -14
  572. package/dist/security/fix.js +49 -85
  573. package/dist/security/scan-paths.js +20 -0
  574. package/dist/security/secret-equal.js +3 -7
  575. package/dist/security/windows-acl.js +30 -15
  576. package/dist/shared/entry-status.js +6 -0
  577. package/dist/shared/frontmatter.js +5 -5
  578. package/dist/shared/node-list-parse.js +13 -0
  579. package/dist/shared/node-match.js +11 -4
  580. package/dist/shared/operator-scope-compat.js +42 -0
  581. package/dist/shared/text-chunking.js +29 -0
  582. package/dist/signal/accounts.js +7 -20
  583. package/dist/signal/monitor/event-handler.js +3 -1
  584. package/dist/slack/accounts.js +6 -19
  585. package/dist/slack/actions.js +11 -3
  586. package/dist/slack/blocks.test-helpers.js +31 -0
  587. package/dist/slack/monitor/auth.js +1 -1
  588. package/dist/slack/monitor/message-handler/dispatch.js +50 -29
  589. package/dist/slack/monitor/mrkdwn.js +8 -0
  590. package/dist/slack/monitor/replies.js +15 -7
  591. package/dist/slack/monitor/slash.js +22 -13
  592. package/dist/slack/resolve-channels.js +10 -5
  593. package/dist/slack/send.js +102 -12
  594. package/dist/slack/stream-mode.js +10 -0
  595. package/dist/slack/streaming.js +4 -2
  596. package/dist/telegram/accounts.js +19 -14
  597. package/dist/telegram/bot/helpers.js +3 -5
  598. package/dist/telegram/bot-access.js +35 -36
  599. package/dist/telegram/bot-handlers.js +120 -148
  600. package/dist/telegram/bot-message-context.js +68 -9
  601. package/dist/telegram/bot-message-dispatch.js +477 -210
  602. package/dist/telegram/bot-native-commands.js +16 -0
  603. package/dist/telegram/draft-stream.js +44 -8
  604. package/dist/telegram/inline-buttons.js +5 -15
  605. package/dist/telegram/monitor.js +11 -7
  606. package/dist/telegram/network-config.js +19 -7
  607. package/dist/telegram/reasoning-lane-coordinator.js +128 -0
  608. package/dist/telegram/send.js +3 -2
  609. package/dist/telegram/sent-message-cache.js +5 -6
  610. package/dist/telegram/status-reaction-variants.js +208 -0
  611. package/dist/telegram/sticker-cache.js +11 -9
  612. package/dist/terminal/prompt-select-styled.js +9 -0
  613. package/dist/terminal/theme.js +12 -12
  614. package/dist/test-utils/command-runner.js +6 -0
  615. package/dist/test-utils/internal-hook-event-payload.js +10 -0
  616. package/dist/test-utils/model-auth-mock.js +12 -0
  617. package/dist/test-utils/provider-usage-fetch.js +14 -0
  618. package/dist/test-utils/temp-home.js +33 -0
  619. package/dist/tts/tts.js +80 -567
  620. package/dist/tui/components/chat-log.js +50 -8
  621. package/dist/tui/theme/theme.js +10 -12
  622. package/dist/tui/tui-command-handlers.js +36 -27
  623. package/dist/tui/tui-event-handlers.js +122 -32
  624. package/dist/tui/tui-local-shell.js +16 -6
  625. package/dist/tui/tui.js +236 -48
  626. package/dist/utils/account-id.js +2 -4
  627. package/dist/utils/boolean.js +10 -5
  628. package/dist/utils/directive-tags.js +11 -0
  629. package/dist/utils/mask-api-key.js +10 -0
  630. package/dist/utils/queue-helpers.js +67 -12
  631. package/dist/utils/run-with-concurrency.js +39 -0
  632. package/dist/web/auto-reply/deliver-reply.js +8 -4
  633. package/dist/web/auto-reply/mentions.js +10 -5
  634. package/dist/web/auto-reply/monitor/group-members.js +14 -7
  635. package/dist/web/auto-reply/monitor/process-message.js +45 -24
  636. package/dist/web/inbound/access-control.js +5 -2
  637. package/dist/web/login-qr.js +12 -6
  638. package/dist/web/media.js +126 -15
  639. package/docs/tools/slash-commands.md +5 -1
  640. package/extensions/bluebubbles/src/monitor-processing.ts +580 -139
  641. package/extensions/bluebubbles/src/monitor.ts +208 -1950
  642. package/extensions/feishu/src/external-keys.ts +19 -0
  643. package/extensions/lobster/src/windows-spawn.ts +193 -0
  644. package/extensions/matrix/src/matrix/actions/limits.ts +6 -0
  645. package/extensions/mattermost/src/mattermost/reactions.test-helpers.ts +83 -0
  646. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import { resolveGatewayLogPaths } from "../../daemon/launchd.js";
2
2
  import { formatPortDiagnostics } from "../../infra/ports.js";
3
3
  import { summarizeRestartSentinel, } from "../../infra/restart-sentinel.js";
4
- import { formatAge, redactSecrets } from "./format.js";
4
+ import { formatTimeAgo, redactSecrets } from "./format.js";
5
5
  import { readFileTailLines, summarizeLogTail } from "./gateway.js";
6
6
  export async function appendStatusAllDiagnosis(params) {
7
7
  const { lines, muted, ok, warn, fail } = params;
@@ -11,7 +11,7 @@ export async function appendStatusAllDiagnosis(params) {
11
11
  lines.push(`${icon} ${colored}`);
12
12
  };
13
13
  lines.push("");
14
- lines.push(`${muted("Gateway connection details:")}`);
14
+ lines.push(muted("Gateway connection details:"));
15
15
  for (const line of redactSecrets(params.connectionDetailsForReport)
16
16
  .split("\n")
17
17
  .map((l) => l.trimEnd())) {
@@ -40,7 +40,7 @@ export async function appendStatusAllDiagnosis(params) {
40
40
  }
41
41
  if (params.sentinel?.payload) {
42
42
  emitCheck("Restart sentinel present", "warn");
43
- lines.push(` ${muted(`${summarizeRestartSentinel(params.sentinel.payload)} · ${formatAge(Date.now() - params.sentinel.payload.ts)}`)}`);
43
+ lines.push(` ${muted(`${summarizeRestartSentinel(params.sentinel.payload)} · ${formatTimeAgo(Date.now() - params.sentinel.payload.ts)}`)}`);
44
44
  }
45
45
  else {
46
46
  emitCheck("Restart sentinel: none", "ok");
@@ -49,7 +49,7 @@ export async function appendStatusAllDiagnosis(params) {
49
49
  const isTrivialLastErr = lastErrClean.length < 8 || lastErrClean === "}" || lastErrClean === "{";
50
50
  if (lastErrClean && !isTrivialLastErr) {
51
51
  lines.push("");
52
- lines.push(`${muted("Gateway last log line:")}`);
52
+ lines.push(muted("Gateway last log line:"));
53
53
  lines.push(` ${muted(redactSecrets(lastErrClean))}`);
54
54
  }
55
55
  if (params.portUsage) {
@@ -101,7 +101,7 @@ export async function appendStatusAllDiagnosis(params) {
101
101
  ]);
102
102
  if (stderrTail.length > 0 || stdoutTail.length > 0) {
103
103
  lines.push("");
104
- lines.push(`${muted(`Gateway logs (tail, summarized): ${logPaths.logDir}`)}`);
104
+ lines.push(muted(`Gateway logs (tail, summarized): ${logPaths.logDir}`));
105
105
  lines.push(` ${muted(`# stderr: ${logPaths.stderrPath}`)}`);
106
106
  for (const line of summarizeLogTail(stderrTail, { maxLines: 22 }).map(redactSecrets)) {
107
107
  lines.push(` ${muted(line)}`);
@@ -127,16 +127,20 @@ export async function appendStatusAllDiagnosis(params) {
127
127
  emitCheck(`Channel issues skipped (gateway ${params.gatewayReachable ? "query failed" : "unreachable"})`, "warn");
128
128
  }
129
129
  const healthErr = (() => {
130
- if (!params.health || typeof params.health !== "object")
130
+ if (!params.health || typeof params.health !== "object") {
131
131
  return "";
132
+ }
132
133
  const record = params.health;
133
- if (!("error" in record))
134
+ if (!("error" in record)) {
134
135
  return "";
136
+ }
135
137
  const value = record.error;
136
- if (!value)
138
+ if (!value) {
137
139
  return "";
138
- if (typeof value === "string")
140
+ }
141
+ if (typeof value === "string") {
139
142
  return value;
143
+ }
140
144
  try {
141
145
  return JSON.stringify(value, null, 2);
142
146
  }
@@ -146,7 +150,7 @@ export async function appendStatusAllDiagnosis(params) {
146
150
  })();
147
151
  if (healthErr) {
148
152
  lines.push("");
149
- lines.push(`${muted("Gateway health:")}`);
153
+ lines.push(muted("Gateway health:"));
150
154
  lines.push(` ${muted(redactSecrets(healthErr))}`);
151
155
  }
152
156
  lines.push("");
@@ -30,6 +30,7 @@ export function formatGatewayAuthUsed(auth) {
30
30
  return "password";
31
31
  return "none";
32
32
  }
33
+ export { formatTimeAgo } from "../../infra/format-time/format-relative.js";
33
34
  export function redactSecrets(text) {
34
35
  if (!text)
35
36
  return text;
@@ -1,3 +1,4 @@
1
+ export { pickGatewaySelfPresence } from "./gateway-presence.js";
1
2
  export function resolveGatewayProbeAuth(cfg) {
2
3
  const isRemoteMode = cfg.gateway?.mode === "remote";
3
4
  const remote = isRemoteMode ? cfg.gateway?.remote : undefined;
@@ -8,10 +9,8 @@ export function resolveGatewayProbeAuth(cfg) {
8
9
  ? remote.token.trim()
9
10
  : undefined
10
11
  : process.env.POOLBOT_GATEWAY_TOKEN?.trim() ||
11
- process.env.CLAWDBOT_GATEWAY_TOKEN?.trim() ||
12
12
  (typeof authToken === "string" && authToken.trim().length > 0 ? authToken.trim() : undefined);
13
13
  const password = process.env.POOLBOT_GATEWAY_PASSWORD?.trim() ||
14
- process.env.CLAWDBOT_GATEWAY_PASSWORD?.trim() ||
15
14
  (isRemoteMode
16
15
  ? typeof remote?.password === "string" && remote.password.trim().length > 0
17
16
  ? remote.password.trim()
@@ -21,17 +20,3 @@ export function resolveGatewayProbeAuth(cfg) {
21
20
  : undefined);
22
21
  return { token, password };
23
22
  }
24
- export function pickGatewaySelfPresence(presence) {
25
- if (!Array.isArray(presence))
26
- return null;
27
- const entries = presence;
28
- const self = entries.find((e) => e.mode === "gateway" && e.reason === "self") ?? null;
29
- if (!self)
30
- return null;
31
- return {
32
- host: typeof self.host === "string" ? self.host : undefined,
33
- ip: typeof self.ip === "string" ? self.ip : undefined,
34
- version: typeof self.version === "string" ? self.version : undefined,
35
- platform: typeof self.platform === "string" ? self.platform : undefined,
36
- };
37
- }
@@ -1,10 +1,12 @@
1
1
  import { enableSystemdUserLinger, isSystemdUserServiceAvailable, readSystemdUserLingerStatus, } from "../daemon/systemd.js";
2
2
  import { note } from "../terminal/note.js";
3
3
  export async function ensureSystemdUserLingerInteractive(params) {
4
- if (process.platform !== "linux")
4
+ if (process.platform !== "linux") {
5
5
  return;
6
- if (params.prompt === false)
6
+ }
7
+ if (params.prompt === false) {
7
8
  return;
9
+ }
8
10
  const env = params.env ?? process.env;
9
11
  const prompter = params.prompter ?? { note };
10
12
  const title = params.title ?? "Systemd";
@@ -17,8 +19,9 @@ export async function ensureSystemdUserLingerInteractive(params) {
17
19
  await prompter.note("Unable to read loginctl linger status. Ensure systemd + loginctl are available.", title);
18
20
  return;
19
21
  }
20
- if (status.linger === "yes")
22
+ if (status.linger === "yes") {
21
23
  return;
24
+ }
22
25
  const reason = params.reason ??
23
26
  "Systemd user services stop when you log out or go idle, which kills the Gateway.";
24
27
  const actionNote = params.requireConfirm
@@ -56,14 +59,17 @@ export async function ensureSystemdUserLingerInteractive(params) {
56
59
  await prompter.note(`Run manually: sudo loginctl enable-linger ${status.user}`, title);
57
60
  }
58
61
  export async function ensureSystemdUserLingerNonInteractive(params) {
59
- if (process.platform !== "linux")
62
+ if (process.platform !== "linux") {
60
63
  return;
64
+ }
61
65
  const env = params.env ?? process.env;
62
- if (!(await isSystemdUserServiceAvailable()))
66
+ if (!(await isSystemdUserServiceAvailable())) {
63
67
  return;
68
+ }
64
69
  const status = await readSystemdUserLingerStatus(env);
65
- if (!status || status.linger === "yes")
70
+ if (!status || status.linger === "yes") {
66
71
  return;
72
+ }
67
73
  const result = await enableSystemdUserLinger({
68
74
  env,
69
75
  user: status.user,
@@ -1,5 +1,7 @@
1
1
  export const DEFAULT_AGENT_MAX_CONCURRENT = 4;
2
2
  export const DEFAULT_SUBAGENT_MAX_CONCURRENT = 8;
3
+ // Keep depth-1 subagents as leaves unless config explicitly opts into nesting.
4
+ export const DEFAULT_SUBAGENT_MAX_SPAWN_DEPTH = 1;
3
5
  export function resolveAgentMaxConcurrent(cfg) {
4
6
  const raw = cfg?.agents?.defaults?.maxConcurrent;
5
7
  if (typeof raw === "number" && Number.isFinite(raw)) {
@@ -1,38 +1,55 @@
1
1
  import { normalizeChannelId } from "../channels/plugins/index.js";
2
+ import { isPlainObject } from "../infra/plain-object.js";
2
3
  function resolveAutoDefault(providerId) {
3
4
  const id = normalizeChannelId(providerId);
4
- if (!id)
5
+ if (!id) {
5
6
  return false;
6
- if (id === "discord" || id === "telegram")
7
+ }
8
+ if (id === "discord" || id === "telegram") {
7
9
  return true;
8
- if (id === "slack")
10
+ }
11
+ if (id === "slack") {
9
12
  return false;
13
+ }
10
14
  return false;
11
15
  }
12
16
  export function resolveNativeSkillsEnabled(params) {
13
- const { providerId, providerSetting, globalSetting } = params;
14
- const setting = providerSetting === undefined ? globalSetting : providerSetting;
15
- if (setting === true)
16
- return true;
17
- if (setting === false)
18
- return false;
19
- return resolveAutoDefault(providerId);
17
+ return resolveNativeCommandSetting(params);
20
18
  }
21
19
  export function resolveNativeCommandsEnabled(params) {
20
+ return resolveNativeCommandSetting(params);
21
+ }
22
+ function resolveNativeCommandSetting(params) {
22
23
  const { providerId, providerSetting, globalSetting } = params;
23
24
  const setting = providerSetting === undefined ? globalSetting : providerSetting;
24
- if (setting === true)
25
+ if (setting === true) {
25
26
  return true;
26
- if (setting === false)
27
+ }
28
+ if (setting === false) {
27
29
  return false;
28
- // auto or undefined -> heuristic
30
+ }
29
31
  return resolveAutoDefault(providerId);
30
32
  }
31
33
  export function isNativeCommandsExplicitlyDisabled(params) {
32
34
  const { providerSetting, globalSetting } = params;
33
- if (providerSetting === false)
35
+ if (providerSetting === false) {
34
36
  return true;
35
- if (providerSetting === undefined)
37
+ }
38
+ if (providerSetting === undefined) {
36
39
  return globalSetting === false;
40
+ }
37
41
  return false;
38
42
  }
43
+ function getOwnCommandFlagValue(config, key) {
44
+ const { commands } = config ?? {};
45
+ if (!isPlainObject(commands) || !Object.hasOwn(commands, key)) {
46
+ return undefined;
47
+ }
48
+ return commands[key];
49
+ }
50
+ export function isCommandFlagEnabled(config, key) {
51
+ return getOwnCommandFlagValue(config, key) === true;
52
+ }
53
+ export function isRestartEnabled(config) {
54
+ return getOwnCommandFlagValue(config, "restart") !== false;
55
+ }
@@ -1,4 +1,5 @@
1
- const BLOCKED_KEYS = new Set(["__proto__", "prototype", "constructor"]);
1
+ import { isPlainObject } from "../utils.js";
2
+ import { isBlockedObjectKey } from "./prototype-keys.js";
2
3
  export function parseConfigPath(raw) {
3
4
  const trimmed = raw.trim();
4
5
  if (!trimmed) {
@@ -14,7 +15,7 @@ export function parseConfigPath(raw) {
14
15
  error: "Invalid path. Use dot notation (e.g. foo.bar).",
15
16
  };
16
17
  }
17
- if (parts.some((part) => BLOCKED_KEYS.has(part))) {
18
+ if (parts.some((part) => isBlockedObjectKey(part))) {
18
19
  return { ok: false, error: "Invalid path segment." };
19
20
  }
20
21
  return { ok: true, path: parts };
@@ -37,14 +38,16 @@ export function unsetConfigValueAtPath(root, path) {
37
38
  for (let idx = 0; idx < path.length - 1; idx += 1) {
38
39
  const key = path[idx];
39
40
  const next = cursor[key];
40
- if (!isPlainObject(next))
41
+ if (!isPlainObject(next)) {
41
42
  return false;
43
+ }
42
44
  stack.push({ node: cursor, key });
43
45
  cursor = next;
44
46
  }
45
47
  const leafKey = path[path.length - 1];
46
- if (!(leafKey in cursor))
48
+ if (!(leafKey in cursor)) {
47
49
  return false;
50
+ }
48
51
  delete cursor[leafKey];
49
52
  for (let idx = stack.length - 1; idx >= 0; idx -= 1) {
50
53
  const { node, key } = stack[idx];
@@ -61,15 +64,10 @@ export function unsetConfigValueAtPath(root, path) {
61
64
  export function getConfigValueAtPath(root, path) {
62
65
  let cursor = root;
63
66
  for (const key of path) {
64
- if (!isPlainObject(cursor))
67
+ if (!isPlainObject(cursor)) {
65
68
  return undefined;
69
+ }
66
70
  cursor = cursor[key];
67
71
  }
68
72
  return cursor;
69
73
  }
70
- function isPlainObject(value) {
71
- return (typeof value === "object" &&
72
- value !== null &&
73
- !Array.isArray(value) &&
74
- Object.prototype.toString.call(value) === "[object Object]");
75
- }
@@ -1,4 +1,4 @@
1
- export { createConfigIO, loadConfig, parseConfigJson5, readConfigFileSnapshot, resolveConfigSnapshotHash, writeConfigFile, } from "./io.js";
1
+ export { createConfigIO, loadConfig, parseConfigJson5, readConfigFileSnapshot, readConfigFileSnapshotForWrite, resolveConfigSnapshotHash, writeConfigFile, } from "./io.js";
2
2
  export { migrateLegacyConfig } from "./legacy-migrate.js";
3
3
  export * from "./paths.js";
4
4
  export * from "./runtime-overrides.js";
@@ -1,5 +1,5 @@
1
1
  import { DEFAULT_CONTEXT_TOKENS } from "../agents/defaults.js";
2
- import { parseModelRef } from "../agents/model-selection.js";
2
+ import { normalizeProviderId, parseModelRef } from "../agents/model-selection.js";
3
3
  import { DEFAULT_AGENT_MAX_CONCURRENT, DEFAULT_SUBAGENT_MAX_CONCURRENT } from "./agent-limits.js";
4
4
  import { resolveTalkApiKey } from "./talk.js";
5
5
  let defaultWarnState = { warned: false };
@@ -22,6 +22,12 @@ const DEFAULT_MODEL_COST = {
22
22
  };
23
23
  const DEFAULT_MODEL_INPUT = ["text"];
24
24
  const DEFAULT_MODEL_MAX_TOKENS = 8192;
25
+ function resolveDefaultProviderApi(providerId, providerApi) {
26
+ if (providerApi) {
27
+ return providerApi;
28
+ }
29
+ return normalizeProviderId(providerId) === "anthropic" ? "anthropic-messages" : undefined;
30
+ }
25
31
  function isPositiveNumber(value) {
26
32
  return typeof value === "number" && Number.isFinite(value) && value > 0;
27
33
  }
@@ -135,6 +141,12 @@ export function applyModelDefaults(cfg) {
135
141
  if (!Array.isArray(models) || models.length === 0) {
136
142
  continue;
137
143
  }
144
+ const providerApi = resolveDefaultProviderApi(providerId, provider.api);
145
+ let nextProvider = provider;
146
+ if (providerApi && provider.api !== providerApi) {
147
+ mutated = true;
148
+ nextProvider = { ...nextProvider, api: providerApi };
149
+ }
138
150
  let providerMutated = false;
139
151
  const nextModels = models.map((model) => {
140
152
  const raw = model;
@@ -168,6 +180,10 @@ export function applyModelDefaults(cfg) {
168
180
  if (raw.maxTokens !== maxTokens) {
169
181
  modelMutated = true;
170
182
  }
183
+ const api = raw.api ?? providerApi;
184
+ if (raw.api !== api) {
185
+ modelMutated = true;
186
+ }
171
187
  if (!modelMutated) {
172
188
  return model;
173
189
  }
@@ -179,12 +195,16 @@ export function applyModelDefaults(cfg) {
179
195
  cost,
180
196
  contextWindow,
181
197
  maxTokens,
198
+ api,
182
199
  };
183
200
  });
184
201
  if (!providerMutated) {
202
+ if (nextProvider !== provider) {
203
+ nextProviders[providerId] = nextProvider;
204
+ }
185
205
  continue;
186
206
  }
187
- nextProviders[providerId] = { ...provider, models: nextModels };
207
+ nextProviders[providerId] = { ...nextProvider, models: nextModels };
188
208
  mutated = true;
189
209
  }
190
210
  if (mutated) {
@@ -0,0 +1,104 @@
1
+ function normalizeStreamingMode(value) {
2
+ if (typeof value !== "string") {
3
+ return null;
4
+ }
5
+ const normalized = value.trim().toLowerCase();
6
+ return normalized || null;
7
+ }
8
+ export function parseStreamingMode(value) {
9
+ const normalized = normalizeStreamingMode(value);
10
+ if (normalized === "off" ||
11
+ normalized === "partial" ||
12
+ normalized === "block" ||
13
+ normalized === "progress") {
14
+ return normalized;
15
+ }
16
+ return null;
17
+ }
18
+ export function parseDiscordPreviewStreamMode(value) {
19
+ const parsed = parseStreamingMode(value);
20
+ if (!parsed) {
21
+ return null;
22
+ }
23
+ return parsed === "progress" ? "partial" : parsed;
24
+ }
25
+ export function parseSlackLegacyDraftStreamMode(value) {
26
+ const normalized = normalizeStreamingMode(value);
27
+ if (normalized === "replace" || normalized === "status_final" || normalized === "append") {
28
+ return normalized;
29
+ }
30
+ return null;
31
+ }
32
+ export function mapSlackLegacyDraftStreamModeToStreaming(mode) {
33
+ if (mode === "append") {
34
+ return "block";
35
+ }
36
+ if (mode === "status_final") {
37
+ return "progress";
38
+ }
39
+ return "partial";
40
+ }
41
+ export function mapStreamingModeToSlackLegacyDraftStreamMode(mode) {
42
+ if (mode === "block") {
43
+ return "append";
44
+ }
45
+ if (mode === "progress") {
46
+ return "status_final";
47
+ }
48
+ return "replace";
49
+ }
50
+ export function resolveTelegramPreviewStreamMode(params = {}) {
51
+ const parsedStreaming = parseStreamingMode(params.streaming);
52
+ if (parsedStreaming) {
53
+ if (parsedStreaming === "progress") {
54
+ return "partial";
55
+ }
56
+ return parsedStreaming;
57
+ }
58
+ const legacy = parseDiscordPreviewStreamMode(params.streamMode);
59
+ if (legacy) {
60
+ return legacy;
61
+ }
62
+ if (typeof params.streaming === "boolean") {
63
+ return params.streaming ? "partial" : "off";
64
+ }
65
+ return "off";
66
+ }
67
+ export function resolveDiscordPreviewStreamMode(params = {}) {
68
+ const parsedStreaming = parseDiscordPreviewStreamMode(params.streaming);
69
+ if (parsedStreaming) {
70
+ return parsedStreaming;
71
+ }
72
+ const legacy = parseDiscordPreviewStreamMode(params.streamMode);
73
+ if (legacy) {
74
+ return legacy;
75
+ }
76
+ if (typeof params.streaming === "boolean") {
77
+ return params.streaming ? "partial" : "off";
78
+ }
79
+ return "off";
80
+ }
81
+ export function resolveSlackStreamingMode(params = {}) {
82
+ const parsedStreaming = parseStreamingMode(params.streaming);
83
+ if (parsedStreaming) {
84
+ return parsedStreaming;
85
+ }
86
+ const legacyStreamMode = parseSlackLegacyDraftStreamMode(params.streamMode);
87
+ if (legacyStreamMode) {
88
+ return mapSlackLegacyDraftStreamModeToStreaming(legacyStreamMode);
89
+ }
90
+ // Legacy `streaming` was a Slack native-streaming toggle; preview mode stayed replace.
91
+ if (typeof params.streaming === "boolean") {
92
+ return "partial";
93
+ }
94
+ return "partial";
95
+ }
96
+ export function resolveSlackNativeStreaming(params = {}) {
97
+ if (typeof params.nativeStreaming === "boolean") {
98
+ return params.nativeStreaming;
99
+ }
100
+ if (typeof params.streaming === "boolean") {
101
+ return params.streaming;
102
+ }
103
+ return true;
104
+ }
@@ -21,6 +21,7 @@
21
21
  */
22
22
  // Pattern for valid uppercase env var names: starts with letter or underscore,
23
23
  // followed by letters, numbers, or underscores (all uppercase)
24
+ import { isPlainObject } from "../utils.js";
24
25
  const ENV_VAR_NAME_PATTERN = /^[A-Z_][A-Z0-9_]*$/;
25
26
  export class MissingEnvVarError extends Error {
26
27
  varName;
@@ -32,11 +33,35 @@ export class MissingEnvVarError extends Error {
32
33
  this.name = "MissingEnvVarError";
33
34
  }
34
35
  }
35
- function isPlainObject(value) {
36
- return (typeof value === "object" &&
37
- value !== null &&
38
- !Array.isArray(value) &&
39
- Object.prototype.toString.call(value) === "[object Object]");
36
+ function parseEnvTokenAt(value, index) {
37
+ if (value[index] !== "$") {
38
+ return null;
39
+ }
40
+ const next = value[index + 1];
41
+ const afterNext = value[index + 2];
42
+ // Escaped: $${VAR} -> ${VAR}
43
+ if (next === "$" && afterNext === "{") {
44
+ const start = index + 3;
45
+ const end = value.indexOf("}", start);
46
+ if (end !== -1) {
47
+ const name = value.slice(start, end);
48
+ if (ENV_VAR_NAME_PATTERN.test(name)) {
49
+ return { kind: "escaped", name, end };
50
+ }
51
+ }
52
+ }
53
+ // Substitution: ${VAR} -> value
54
+ if (next === "{") {
55
+ const start = index + 2;
56
+ const end = value.indexOf("}", start);
57
+ if (end !== -1) {
58
+ const name = value.slice(start, end);
59
+ if (ENV_VAR_NAME_PATTERN.test(name)) {
60
+ return { kind: "substitution", name, end };
61
+ }
62
+ }
63
+ }
64
+ return null;
40
65
  }
41
66
  function substituteString(value, env, configPath) {
42
67
  if (!value.includes("$")) {
@@ -49,43 +74,46 @@ function substituteString(value, env, configPath) {
49
74
  chunks.push(char);
50
75
  continue;
51
76
  }
52
- const next = value[i + 1];
53
- const afterNext = value[i + 2];
54
- // Escaped: $${VAR} -> ${VAR}
55
- if (next === "$" && afterNext === "{") {
56
- const start = i + 3;
57
- const end = value.indexOf("}", start);
58
- if (end !== -1) {
59
- const name = value.slice(start, end);
60
- if (ENV_VAR_NAME_PATTERN.test(name)) {
61
- chunks.push(`\${${name}}`);
62
- i = end;
63
- continue;
64
- }
65
- }
77
+ const token = parseEnvTokenAt(value, i);
78
+ if (token?.kind === "escaped") {
79
+ chunks.push(`\${${token.name}}`);
80
+ i = token.end;
81
+ continue;
66
82
  }
67
- // Substitution: ${VAR} -> value
68
- if (next === "{") {
69
- const start = i + 2;
70
- const end = value.indexOf("}", start);
71
- if (end !== -1) {
72
- const name = value.slice(start, end);
73
- if (ENV_VAR_NAME_PATTERN.test(name)) {
74
- const envValue = env[name];
75
- if (envValue === undefined || envValue === "") {
76
- throw new MissingEnvVarError(name, configPath);
77
- }
78
- chunks.push(envValue);
79
- i = end;
80
- continue;
81
- }
83
+ if (token?.kind === "substitution") {
84
+ const envValue = env[token.name];
85
+ if (envValue === undefined || envValue === "") {
86
+ throw new MissingEnvVarError(token.name, configPath);
82
87
  }
88
+ chunks.push(envValue);
89
+ i = token.end;
90
+ continue;
83
91
  }
84
92
  // Leave untouched if not a recognized pattern
85
93
  chunks.push(char);
86
94
  }
87
95
  return chunks.join("");
88
96
  }
97
+ export function containsEnvVarReference(value) {
98
+ if (!value.includes("$")) {
99
+ return false;
100
+ }
101
+ for (let i = 0; i < value.length; i += 1) {
102
+ const char = value[i];
103
+ if (char !== "$") {
104
+ continue;
105
+ }
106
+ const token = parseEnvTokenAt(value, i);
107
+ if (token?.kind === "escaped") {
108
+ i = token.end;
109
+ continue;
110
+ }
111
+ if (token?.kind === "substitution") {
112
+ return true;
113
+ }
114
+ }
115
+ return false;
116
+ }
89
117
  function substituteAny(value, env, path) {
90
118
  if (typeof value === "string") {
91
119
  return substituteString(value, env, path);
@@ -1,21 +1,59 @@
1
- export function collectConfigEnvVars(cfg) {
1
+ import { isDangerousHostEnvVarName, normalizeEnvVarKey } from "../infra/host-env-security.js";
2
+ function collectConfigEnvVarsByTarget(cfg) {
2
3
  const envConfig = cfg?.env;
3
- if (!envConfig)
4
+ if (!envConfig) {
4
5
  return {};
6
+ }
5
7
  const entries = {};
6
8
  if (envConfig.vars) {
7
- for (const [key, value] of Object.entries(envConfig.vars)) {
8
- if (!value)
9
+ for (const [rawKey, value] of Object.entries(envConfig.vars)) {
10
+ if (!value) {
11
+ continue;
12
+ }
13
+ const key = normalizeEnvVarKey(rawKey, { portable: true });
14
+ if (!key) {
9
15
  continue;
16
+ }
17
+ if (isDangerousHostEnvVarName(key)) {
18
+ continue;
19
+ }
10
20
  entries[key] = value;
11
21
  }
12
22
  }
13
- for (const [key, value] of Object.entries(envConfig)) {
14
- if (key === "shellEnv" || key === "vars")
23
+ for (const [rawKey, value] of Object.entries(envConfig)) {
24
+ if (rawKey === "shellEnv" || rawKey === "vars") {
15
25
  continue;
16
- if (typeof value !== "string" || !value.trim())
26
+ }
27
+ if (typeof value !== "string" || !value.trim()) {
28
+ continue;
29
+ }
30
+ const key = normalizeEnvVarKey(rawKey, { portable: true });
31
+ if (!key) {
32
+ continue;
33
+ }
34
+ if (isDangerousHostEnvVarName(key)) {
17
35
  continue;
36
+ }
18
37
  entries[key] = value;
19
38
  }
20
39
  return entries;
21
40
  }
41
+ export function collectConfigRuntimeEnvVars(cfg) {
42
+ return collectConfigEnvVarsByTarget(cfg);
43
+ }
44
+ export function collectConfigServiceEnvVars(cfg) {
45
+ return collectConfigEnvVarsByTarget(cfg);
46
+ }
47
+ /** @deprecated Use `collectConfigRuntimeEnvVars` or `collectConfigServiceEnvVars`. */
48
+ export function collectConfigEnvVars(cfg) {
49
+ return collectConfigRuntimeEnvVars(cfg);
50
+ }
51
+ export function applyConfigEnvVars(cfg, env = process.env) {
52
+ const entries = collectConfigRuntimeEnvVars(cfg);
53
+ for (const [key, value] of Object.entries(entries)) {
54
+ if (env[key]?.trim()) {
55
+ continue;
56
+ }
57
+ env[key] = value;
58
+ }
59
+ }