@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,541 +1,27 @@
1
1
  import { CHANNEL_IDS } from "../channels/registry.js";
2
2
  import { VERSION } from "../version.js";
3
+ import { applySensitiveHints, buildBaseHints, mapSensitivePaths } from "./schema.hints.js";
3
4
  import { PoolBotSchema } from "./zod-schema.js";
4
- const GROUP_LABELS = {
5
- wizard: "Wizard",
6
- update: "Update",
7
- diagnostics: "Diagnostics",
8
- logging: "Logging",
9
- gateway: "Gateway",
10
- nodeHost: "Node Host",
11
- agents: "Agents",
12
- tools: "Tools",
13
- bindings: "Bindings",
14
- audio: "Audio",
15
- models: "Models",
16
- messages: "Messages",
17
- commands: "Commands",
18
- session: "Session",
19
- cron: "Cron",
20
- hooks: "Hooks",
21
- ui: "UI",
22
- browser: "Browser",
23
- talk: "Talk",
24
- channels: "Messaging Channels",
25
- skills: "Skills",
26
- plugins: "Plugins",
27
- discovery: "Discovery",
28
- presence: "Presence",
29
- voicewake: "Voice Wake",
30
- };
31
- const GROUP_ORDER = {
32
- wizard: 20,
33
- update: 25,
34
- diagnostics: 27,
35
- gateway: 30,
36
- nodeHost: 35,
37
- agents: 40,
38
- tools: 50,
39
- bindings: 55,
40
- audio: 60,
41
- models: 70,
42
- messages: 80,
43
- commands: 85,
44
- session: 90,
45
- cron: 100,
46
- hooks: 110,
47
- ui: 120,
48
- browser: 130,
49
- talk: 140,
50
- channels: 150,
51
- skills: 200,
52
- plugins: 205,
53
- discovery: 210,
54
- presence: 220,
55
- voicewake: 230,
56
- logging: 900,
57
- };
58
- const FIELD_LABELS = {
59
- "meta.lastTouchedVersion": "Config Last Touched Version",
60
- "meta.lastTouchedAt": "Config Last Touched At",
61
- "update.channel": "Update Channel",
62
- "update.checkOnStart": "Update Check on Start",
63
- "diagnostics.enabled": "Diagnostics Enabled",
64
- "diagnostics.flags": "Diagnostics Flags",
65
- "diagnostics.otel.enabled": "OpenTelemetry Enabled",
66
- "diagnostics.otel.endpoint": "OpenTelemetry Endpoint",
67
- "diagnostics.otel.protocol": "OpenTelemetry Protocol",
68
- "diagnostics.otel.headers": "OpenTelemetry Headers",
69
- "diagnostics.otel.serviceName": "OpenTelemetry Service Name",
70
- "diagnostics.otel.traces": "OpenTelemetry Traces Enabled",
71
- "diagnostics.otel.metrics": "OpenTelemetry Metrics Enabled",
72
- "diagnostics.otel.logs": "OpenTelemetry Logs Enabled",
73
- "diagnostics.otel.sampleRate": "OpenTelemetry Trace Sample Rate",
74
- "diagnostics.otel.flushIntervalMs": "OpenTelemetry Flush Interval (ms)",
75
- "diagnostics.cacheTrace.enabled": "Cache Trace Enabled",
76
- "diagnostics.cacheTrace.filePath": "Cache Trace File Path",
77
- "diagnostics.cacheTrace.includeMessages": "Cache Trace Include Messages",
78
- "diagnostics.cacheTrace.includePrompt": "Cache Trace Include Prompt",
79
- "diagnostics.cacheTrace.includeSystem": "Cache Trace Include System",
80
- "agents.list.*.identity.avatar": "Identity Avatar",
81
- "gateway.remote.url": "Remote Gateway URL",
82
- "gateway.remote.sshTarget": "Remote Gateway SSH Target",
83
- "gateway.remote.sshIdentity": "Remote Gateway SSH Identity",
84
- "gateway.remote.token": "Remote Gateway Token",
85
- "gateway.remote.password": "Remote Gateway Password",
86
- "gateway.remote.tlsFingerprint": "Remote Gateway TLS Fingerprint",
87
- "gateway.auth.token": "Gateway Token",
88
- "gateway.auth.password": "Gateway Password",
89
- "tools.media.image.enabled": "Enable Image Understanding",
90
- "tools.media.image.maxBytes": "Image Understanding Max Bytes",
91
- "tools.media.image.maxChars": "Image Understanding Max Chars",
92
- "tools.media.image.prompt": "Image Understanding Prompt",
93
- "tools.media.image.timeoutSeconds": "Image Understanding Timeout (sec)",
94
- "tools.media.image.attachments": "Image Understanding Attachment Policy",
95
- "tools.media.image.models": "Image Understanding Models",
96
- "tools.media.image.scope": "Image Understanding Scope",
97
- "tools.media.models": "Media Understanding Shared Models",
98
- "tools.media.concurrency": "Media Understanding Concurrency",
99
- "tools.media.audio.enabled": "Enable Audio Understanding",
100
- "tools.media.audio.maxBytes": "Audio Understanding Max Bytes",
101
- "tools.media.audio.maxChars": "Audio Understanding Max Chars",
102
- "tools.media.audio.prompt": "Audio Understanding Prompt",
103
- "tools.media.audio.timeoutSeconds": "Audio Understanding Timeout (sec)",
104
- "tools.media.audio.language": "Audio Understanding Language",
105
- "tools.media.audio.attachments": "Audio Understanding Attachment Policy",
106
- "tools.media.audio.models": "Audio Understanding Models",
107
- "tools.media.audio.scope": "Audio Understanding Scope",
108
- "tools.media.video.enabled": "Enable Video Understanding",
109
- "tools.media.video.maxBytes": "Video Understanding Max Bytes",
110
- "tools.media.video.maxChars": "Video Understanding Max Chars",
111
- "tools.media.video.prompt": "Video Understanding Prompt",
112
- "tools.media.video.timeoutSeconds": "Video Understanding Timeout (sec)",
113
- "tools.media.video.attachments": "Video Understanding Attachment Policy",
114
- "tools.media.video.models": "Video Understanding Models",
115
- "tools.media.video.scope": "Video Understanding Scope",
116
- "tools.links.enabled": "Enable Link Understanding",
117
- "tools.links.maxLinks": "Link Understanding Max Links",
118
- "tools.links.timeoutSeconds": "Link Understanding Timeout (sec)",
119
- "tools.links.models": "Link Understanding Models",
120
- "tools.links.scope": "Link Understanding Scope",
121
- "tools.profile": "Tool Profile",
122
- "tools.alsoAllow": "Tool Allowlist Additions",
123
- "agents.list[].tools.profile": "Agent Tool Profile",
124
- "agents.list[].tools.alsoAllow": "Agent Tool Allowlist Additions",
125
- "tools.byProvider": "Tool Policy by Provider",
126
- "agents.list[].tools.byProvider": "Agent Tool Policy by Provider",
127
- "tools.exec.applyPatch.enabled": "Enable apply_patch",
128
- "tools.exec.applyPatch.allowModels": "apply_patch Model Allowlist",
129
- "tools.exec.notifyOnExit": "Exec Notify On Exit",
130
- "tools.exec.approvalRunningNoticeMs": "Exec Approval Running Notice (ms)",
131
- "tools.exec.host": "Exec Host",
132
- "tools.exec.security": "Exec Security",
133
- "tools.exec.ask": "Exec Ask",
134
- "tools.exec.node": "Exec Node Binding",
135
- "tools.exec.pathPrepend": "Exec PATH Prepend",
136
- "tools.exec.safeBins": "Exec Safe Bins",
137
- "tools.message.allowCrossContextSend": "Allow Cross-Context Messaging",
138
- "tools.message.crossContext.allowWithinProvider": "Allow Cross-Context (Same Provider)",
139
- "tools.message.crossContext.allowAcrossProviders": "Allow Cross-Context (Across Providers)",
140
- "tools.message.crossContext.marker.enabled": "Cross-Context Marker",
141
- "tools.message.crossContext.marker.prefix": "Cross-Context Marker Prefix",
142
- "tools.message.crossContext.marker.suffix": "Cross-Context Marker Suffix",
143
- "tools.message.broadcast.enabled": "Enable Message Broadcast",
144
- "tools.web.search.enabled": "Enable Web Search Tool",
145
- "tools.web.search.provider": "Web Search Provider",
146
- "tools.web.search.apiKey": "Brave Search API Key",
147
- "tools.web.search.maxResults": "Web Search Max Results",
148
- "tools.web.search.timeoutSeconds": "Web Search Timeout (sec)",
149
- "tools.web.search.cacheTtlMinutes": "Web Search Cache TTL (min)",
150
- "tools.web.fetch.enabled": "Enable Web Fetch Tool",
151
- "tools.web.fetch.maxChars": "Web Fetch Max Chars",
152
- "tools.web.fetch.timeoutSeconds": "Web Fetch Timeout (sec)",
153
- "tools.web.fetch.cacheTtlMinutes": "Web Fetch Cache TTL (min)",
154
- "tools.web.fetch.maxRedirects": "Web Fetch Max Redirects",
155
- "tools.web.fetch.userAgent": "Web Fetch User-Agent",
156
- "gateway.controlUi.basePath": "Control UI Base Path",
157
- "gateway.controlUi.allowInsecureAuth": "Allow Insecure Control UI Auth",
158
- "gateway.controlUi.dangerouslyDisableDeviceAuth": "Dangerously Disable Control UI Device Auth",
159
- "gateway.http.endpoints.chatCompletions.enabled": "OpenAI Chat Completions Endpoint",
160
- "gateway.reload.mode": "Config Reload Mode",
161
- "gateway.reload.debounceMs": "Config Reload Debounce (ms)",
162
- "gateway.nodes.browser.mode": "Gateway Node Browser Mode",
163
- "gateway.nodes.browser.node": "Gateway Node Browser Pin",
164
- "gateway.nodes.allowCommands": "Gateway Node Allowlist (Extra Commands)",
165
- "gateway.nodes.denyCommands": "Gateway Node Denylist",
166
- "nodeHost.browserProxy.enabled": "Node Browser Proxy Enabled",
167
- "nodeHost.browserProxy.allowProfiles": "Node Browser Proxy Allowed Profiles",
168
- "skills.load.watch": "Watch Skills",
169
- "skills.load.watchDebounceMs": "Skills Watch Debounce (ms)",
170
- "agents.defaults.workspace": "Workspace",
171
- "agents.defaults.repoRoot": "Repo Root",
172
- "agents.defaults.bootstrapMaxChars": "Bootstrap Max Chars",
173
- "agents.defaults.envelopeTimezone": "Envelope Timezone",
174
- "agents.defaults.envelopeTimestamp": "Envelope Timestamp",
175
- "agents.defaults.envelopeElapsed": "Envelope Elapsed",
176
- "agents.defaults.memorySearch": "Memory Search",
177
- "agents.defaults.memorySearch.enabled": "Enable Memory Search",
178
- "agents.defaults.memorySearch.sources": "Memory Search Sources",
179
- "agents.defaults.memorySearch.experimental.sessionMemory": "Memory Search Session Index (Experimental)",
180
- "agents.defaults.memorySearch.provider": "Memory Search Provider",
181
- "agents.defaults.memorySearch.remote.baseUrl": "Remote Embedding Base URL",
182
- "agents.defaults.memorySearch.remote.apiKey": "Remote Embedding API Key",
183
- "agents.defaults.memorySearch.remote.headers": "Remote Embedding Headers",
184
- "agents.defaults.memorySearch.remote.batch.concurrency": "Remote Batch Concurrency",
185
- "agents.defaults.memorySearch.model": "Memory Search Model",
186
- "agents.defaults.memorySearch.fallback": "Memory Search Fallback",
187
- "agents.defaults.memorySearch.local.modelPath": "Local Embedding Model Path",
188
- "agents.defaults.memorySearch.store.path": "Memory Search Index Path",
189
- "agents.defaults.memorySearch.store.vector.enabled": "Memory Search Vector Index",
190
- "agents.defaults.memorySearch.store.vector.extensionPath": "Memory Search Vector Extension Path",
191
- "agents.defaults.memorySearch.chunking.tokens": "Memory Chunk Tokens",
192
- "agents.defaults.memorySearch.chunking.overlap": "Memory Chunk Overlap Tokens",
193
- "agents.defaults.memorySearch.sync.onSessionStart": "Index on Session Start",
194
- "agents.defaults.memorySearch.sync.onSearch": "Index on Search (Lazy)",
195
- "agents.defaults.memorySearch.sync.watch": "Watch Memory Files",
196
- "agents.defaults.memorySearch.sync.watchDebounceMs": "Memory Watch Debounce (ms)",
197
- "agents.defaults.memorySearch.sync.sessions.deltaBytes": "Session Delta Bytes",
198
- "agents.defaults.memorySearch.sync.sessions.deltaMessages": "Session Delta Messages",
199
- "agents.defaults.memorySearch.query.maxResults": "Memory Search Max Results",
200
- "agents.defaults.memorySearch.query.minScore": "Memory Search Min Score",
201
- "agents.defaults.memorySearch.query.hybrid.enabled": "Memory Search Hybrid",
202
- "agents.defaults.memorySearch.query.hybrid.vectorWeight": "Memory Search Vector Weight",
203
- "agents.defaults.memorySearch.query.hybrid.textWeight": "Memory Search Text Weight",
204
- "agents.defaults.memorySearch.query.hybrid.candidateMultiplier": "Memory Search Hybrid Candidate Multiplier",
205
- "agents.defaults.memorySearch.cache.enabled": "Memory Search Embedding Cache",
206
- "agents.defaults.memorySearch.cache.maxEntries": "Memory Search Embedding Cache Max Entries",
207
- "auth.profiles": "Auth Profiles",
208
- "auth.order": "Auth Profile Order",
209
- "auth.cooldowns.billingBackoffHours": "Billing Backoff (hours)",
210
- "auth.cooldowns.billingBackoffHoursByProvider": "Billing Backoff Overrides",
211
- "auth.cooldowns.billingMaxHours": "Billing Backoff Cap (hours)",
212
- "auth.cooldowns.failureWindowHours": "Failover Window (hours)",
213
- "agents.defaults.models": "Models",
214
- "agents.defaults.model.primary": "Primary Model",
215
- "agents.defaults.model.fallbacks": "Model Fallbacks",
216
- "agents.defaults.imageModel.primary": "Image Model",
217
- "agents.defaults.imageModel.fallbacks": "Image Model Fallbacks",
218
- "agents.defaults.humanDelay.mode": "Human Delay Mode",
219
- "agents.defaults.humanDelay.minMs": "Human Delay Min (ms)",
220
- "agents.defaults.humanDelay.maxMs": "Human Delay Max (ms)",
221
- "agents.defaults.cliBackends": "CLI Backends",
222
- "commands.native": "Native Commands",
223
- "commands.nativeSkills": "Native Skill Commands",
224
- "commands.text": "Text Commands",
225
- "commands.bash": "Allow Bash Chat Command",
226
- "commands.bashForegroundMs": "Bash Foreground Window (ms)",
227
- "commands.config": "Allow /config",
228
- "commands.debug": "Allow /debug",
229
- "commands.restart": "Allow Restart",
230
- "commands.useAccessGroups": "Use Access Groups",
231
- "ui.seamColor": "Accent Color",
232
- "ui.assistant.name": "Assistant Name",
233
- "ui.assistant.avatar": "Assistant Avatar",
234
- "browser.evaluateEnabled": "Browser Evaluate Enabled",
235
- "browser.snapshotDefaults": "Browser Snapshot Defaults",
236
- "browser.snapshotDefaults.mode": "Browser Snapshot Mode",
237
- "browser.remoteCdpTimeoutMs": "Remote CDP Timeout (ms)",
238
- "browser.remoteCdpHandshakeTimeoutMs": "Remote CDP Handshake Timeout (ms)",
239
- "session.dmScope": "DM Session Scope",
240
- "session.agentToAgent.maxPingPongTurns": "Agent-to-Agent Ping-Pong Turns",
241
- "messages.ackReaction": "Ack Reaction Emoji",
242
- "messages.ackReactionScope": "Ack Reaction Scope",
243
- "messages.inbound.debounceMs": "Inbound Message Debounce (ms)",
244
- "talk.apiKey": "Talk API Key",
245
- "channels.whatsapp": "WhatsApp",
246
- "channels.telegram": "Telegram",
247
- "channels.telegram.customCommands": "Telegram Custom Commands",
248
- "channels.discord": "Discord",
249
- "channels.slack": "Slack",
250
- "channels.mattermost": "Mattermost",
251
- "channels.signal": "Signal",
252
- "channels.imessage": "iMessage",
253
- "channels.bluebubbles": "BlueBubbles",
254
- "channels.msteams": "MS Teams",
255
- "channels.telegram.botToken": "Telegram Bot Token",
256
- "channels.telegram.dmPolicy": "Telegram DM Policy",
257
- "channels.telegram.streamMode": "Telegram Draft Stream Mode",
258
- "channels.telegram.draftChunk.minChars": "Telegram Draft Chunk Min Chars",
259
- "channels.telegram.draftChunk.maxChars": "Telegram Draft Chunk Max Chars",
260
- "channels.telegram.draftChunk.breakPreference": "Telegram Draft Chunk Break Preference",
261
- "channels.telegram.retry.attempts": "Telegram Retry Attempts",
262
- "channels.telegram.retry.minDelayMs": "Telegram Retry Min Delay (ms)",
263
- "channels.telegram.retry.maxDelayMs": "Telegram Retry Max Delay (ms)",
264
- "channels.telegram.retry.jitter": "Telegram Retry Jitter",
265
- "channels.telegram.network.autoSelectFamily": "Telegram autoSelectFamily",
266
- "channels.telegram.timeoutSeconds": "Telegram API Timeout (seconds)",
267
- "channels.telegram.capabilities.inlineButtons": "Telegram Inline Buttons",
268
- "channels.whatsapp.dmPolicy": "WhatsApp DM Policy",
269
- "channels.whatsapp.selfChatMode": "WhatsApp Self-Phone Mode",
270
- "channels.whatsapp.debounceMs": "WhatsApp Message Debounce (ms)",
271
- "channels.signal.dmPolicy": "Signal DM Policy",
272
- "channels.imessage.dmPolicy": "iMessage DM Policy",
273
- "channels.bluebubbles.dmPolicy": "BlueBubbles DM Policy",
274
- "channels.discord.dm.policy": "Discord DM Policy",
275
- "channels.discord.retry.attempts": "Discord Retry Attempts",
276
- "channels.discord.retry.minDelayMs": "Discord Retry Min Delay (ms)",
277
- "channels.discord.retry.maxDelayMs": "Discord Retry Max Delay (ms)",
278
- "channels.discord.retry.jitter": "Discord Retry Jitter",
279
- "channels.discord.maxLinesPerMessage": "Discord Max Lines Per Message",
280
- "channels.discord.intents.presence": "Discord Presence Intent",
281
- "channels.discord.intents.guildMembers": "Discord Guild Members Intent",
282
- "channels.slack.dm.policy": "Slack DM Policy",
283
- "channels.slack.allowBots": "Slack Allow Bot Messages",
284
- "channels.discord.token": "Discord Bot Token",
285
- "channels.slack.botToken": "Slack Bot Token",
286
- "channels.slack.appToken": "Slack App Token",
287
- "channels.slack.userToken": "Slack User Token",
288
- "channels.slack.userTokenReadOnly": "Slack User Token Read Only",
289
- "channels.slack.thread.historyScope": "Slack Thread History Scope",
290
- "channels.slack.thread.inheritParent": "Slack Thread Parent Inheritance",
291
- "channels.mattermost.botToken": "Mattermost Bot Token",
292
- "channels.mattermost.baseUrl": "Mattermost Base URL",
293
- "channels.mattermost.chatmode": "Mattermost Chat Mode",
294
- "channels.mattermost.oncharPrefixes": "Mattermost Onchar Prefixes",
295
- "channels.mattermost.requireMention": "Mattermost Require Mention",
296
- "channels.signal.account": "Signal Account",
297
- "channels.imessage.cliPath": "iMessage CLI Path",
298
- "agents.list[].identity.avatar": "Agent Avatar",
299
- "discovery.mdns.mode": "mDNS Discovery Mode",
300
- "plugins.enabled": "Enable Plugins",
301
- "plugins.allow": "Plugin Allowlist",
302
- "plugins.deny": "Plugin Denylist",
303
- "plugins.load.paths": "Plugin Load Paths",
304
- "plugins.slots": "Plugin Slots",
305
- "plugins.slots.memory": "Memory Plugin",
306
- "plugins.entries": "Plugin Entries",
307
- "plugins.entries.*.enabled": "Plugin Enabled",
308
- "plugins.entries.*.config": "Plugin Config",
309
- "plugins.installs": "Plugin Install Records",
310
- "plugins.installs.*.source": "Plugin Install Source",
311
- "plugins.installs.*.spec": "Plugin Install Spec",
312
- "plugins.installs.*.sourcePath": "Plugin Install Source Path",
313
- "plugins.installs.*.installPath": "Plugin Install Path",
314
- "plugins.installs.*.version": "Plugin Install Version",
315
- "plugins.installs.*.installedAt": "Plugin Install Time",
316
- };
317
- const FIELD_HELP = {
318
- "meta.lastTouchedVersion": "Auto-set when Poolbot writes the config.",
319
- "meta.lastTouchedAt": "ISO timestamp of the last config write (auto-set).",
320
- "update.channel": 'Update channel for git + npm installs ("stable", "beta", or "dev").',
321
- "update.checkOnStart": "Check for npm updates when the gateway starts (default: true).",
322
- "gateway.remote.url": "Remote Gateway WebSocket URL (ws:// or wss://).",
323
- "gateway.remote.tlsFingerprint": "Expected sha256 TLS fingerprint for the remote gateway (pin to avoid MITM).",
324
- "gateway.remote.sshTarget": "Remote gateway over SSH (tunnels the gateway port to localhost). Format: user@host or user@host:port.",
325
- "gateway.remote.sshIdentity": "Optional SSH identity file path (passed to ssh -i).",
326
- "agents.list[].identity.avatar": "Avatar image path (relative to the agent workspace only) or a remote URL/data URL.",
327
- "discovery.mdns.mode": 'mDNS broadcast mode ("minimal" default, "full" includes cliPath/sshPort, "off" disables mDNS).',
328
- "gateway.auth.token": "Required by default for gateway access (unless using Tailscale Serve identity); required for non-loopback binds.",
329
- "gateway.auth.password": "Required for Tailscale funnel.",
330
- "gateway.controlUi.basePath": "Optional URL prefix where the Control UI is served (e.g. /poolbot).",
331
- "gateway.controlUi.allowInsecureAuth": "Allow Control UI auth over insecure HTTP (token-only; not recommended).",
332
- "gateway.controlUi.dangerouslyDisableDeviceAuth": "DANGEROUS. Disable Control UI device identity checks (token/password only).",
333
- "gateway.http.endpoints.chatCompletions.enabled": "Enable the OpenAI-compatible `POST /v1/chat/completions` endpoint (default: false).",
334
- "gateway.reload.mode": 'Hot reload strategy for config changes ("hybrid" recommended).',
335
- "gateway.reload.debounceMs": "Debounce window (ms) before applying config changes.",
336
- "gateway.nodes.browser.mode": 'Node browser routing ("auto" = pick single connected browser node, "manual" = require node param, "off" = disable).',
337
- "gateway.nodes.browser.node": "Pin browser routing to a specific node id or name (optional).",
338
- "gateway.nodes.allowCommands": "Extra node.invoke commands to allow beyond the gateway defaults (array of command strings).",
339
- "gateway.nodes.denyCommands": "Commands to block even if present in node claims or default allowlist.",
340
- "nodeHost.browserProxy.enabled": "Expose the local browser control server via node proxy.",
341
- "nodeHost.browserProxy.allowProfiles": "Optional allowlist of browser profile names exposed via the node proxy.",
342
- "diagnostics.flags": 'Enable targeted diagnostics logs by flag (e.g. ["telegram.http"]). Supports wildcards like "telegram.*" or "*".',
343
- "diagnostics.cacheTrace.enabled": "Log cache trace snapshots for embedded agent runs (default: false).",
344
- "diagnostics.cacheTrace.filePath": "JSONL output path for cache trace logs (default: $POOLBOT_STATE_DIR/logs/cache-trace.jsonl).",
345
- "diagnostics.cacheTrace.includeMessages": "Include full message payloads in trace output (default: true).",
346
- "diagnostics.cacheTrace.includePrompt": "Include prompt text in trace output (default: true).",
347
- "diagnostics.cacheTrace.includeSystem": "Include system prompt in trace output (default: true).",
348
- "tools.exec.applyPatch.enabled": "Experimental. Enables apply_patch for OpenAI models when allowed by tool policy.",
349
- "tools.exec.applyPatch.allowModels": 'Optional allowlist of model ids (e.g. "gpt-5.2" or "openai/gpt-5.2").',
350
- "tools.exec.notifyOnExit": "When true (default), backgrounded exec sessions enqueue a system event and request a heartbeat on exit.",
351
- "tools.exec.pathPrepend": "Directories to prepend to PATH for exec runs (gateway/sandbox).",
352
- "tools.exec.safeBins": "Allow stdin-only safe binaries to run without explicit allowlist entries.",
353
- "tools.message.allowCrossContextSend": "Legacy override: allow cross-context sends across all providers.",
354
- "tools.message.crossContext.allowWithinProvider": "Allow sends to other channels within the same provider (default: true).",
355
- "tools.message.crossContext.allowAcrossProviders": "Allow sends across different providers (default: false).",
356
- "tools.message.crossContext.marker.enabled": "Add a visible origin marker when sending cross-context (default: true).",
357
- "tools.message.crossContext.marker.prefix": 'Text prefix for cross-context markers (supports "{channel}").',
358
- "tools.message.crossContext.marker.suffix": 'Text suffix for cross-context markers (supports "{channel}").',
359
- "tools.message.broadcast.enabled": "Enable broadcast action (default: true).",
360
- "tools.web.search.enabled": "Enable the web_search tool (requires a provider API key).",
361
- "tools.web.search.provider": 'Search provider ("brave" or "perplexity").',
362
- "tools.web.search.apiKey": "Brave Search API key (fallback: BRAVE_API_KEY env var).",
363
- "tools.web.search.maxResults": "Default number of results to return (1-10).",
364
- "tools.web.search.timeoutSeconds": "Timeout in seconds for web_search requests.",
365
- "tools.web.search.cacheTtlMinutes": "Cache TTL in minutes for web_search results.",
366
- "tools.web.search.perplexity.apiKey": "Perplexity or OpenRouter API key (fallback: PERPLEXITY_API_KEY or OPENROUTER_API_KEY env var).",
367
- "tools.web.search.perplexity.baseUrl": "Perplexity base URL override (default: https://openrouter.ai/api/v1 or https://api.perplexity.ai).",
368
- "tools.web.search.perplexity.model": 'Perplexity model override (default: "perplexity/sonar-pro").',
369
- "tools.web.fetch.enabled": "Enable the web_fetch tool (lightweight HTTP fetch).",
370
- "tools.web.fetch.maxChars": "Max characters returned by web_fetch (truncated).",
371
- "tools.web.fetch.timeoutSeconds": "Timeout in seconds for web_fetch requests.",
372
- "tools.web.fetch.cacheTtlMinutes": "Cache TTL in minutes for web_fetch results.",
373
- "tools.web.fetch.maxRedirects": "Maximum redirects allowed for web_fetch (default: 3).",
374
- "tools.web.fetch.userAgent": "Override User-Agent header for web_fetch requests.",
375
- "tools.web.fetch.readability": "Use Readability to extract main content from HTML (fallbacks to basic HTML cleanup).",
376
- "tools.web.fetch.firecrawl.enabled": "Enable Firecrawl fallback for web_fetch (if configured).",
377
- "tools.web.fetch.firecrawl.apiKey": "Firecrawl API key (fallback: FIRECRAWL_API_KEY env var).",
378
- "tools.web.fetch.firecrawl.baseUrl": "Firecrawl base URL (e.g. https://api.firecrawl.dev or custom endpoint).",
379
- "tools.web.fetch.firecrawl.onlyMainContent": "When true, Firecrawl returns only the main content (default: true).",
380
- "tools.web.fetch.firecrawl.maxAgeMs": "Firecrawl maxAge (ms) for cached results when supported by the API.",
381
- "tools.web.fetch.firecrawl.timeoutSeconds": "Timeout in seconds for Firecrawl requests.",
382
- "channels.slack.allowBots": "Allow bot-authored messages to trigger Slack replies (default: false).",
383
- "channels.slack.thread.historyScope": 'Scope for Slack thread history context ("thread" isolates per thread; "channel" reuses channel history).',
384
- "channels.slack.thread.inheritParent": "If true, Slack thread sessions inherit the parent channel transcript (default: false).",
385
- "channels.mattermost.botToken": "Bot token from Mattermost System Console -> Integrations -> Bot Accounts.",
386
- "channels.mattermost.baseUrl": "Base URL for your Mattermost server (e.g., https://chat.example.com).",
387
- "channels.mattermost.chatmode": 'Reply to channel messages on mention ("oncall"), on trigger chars (">" or "!") ("onchar"), or on every message ("onmessage").',
388
- "channels.mattermost.oncharPrefixes": 'Trigger prefixes for onchar mode (default: [">", "!"]).',
389
- "channels.mattermost.requireMention": "Require @mention in channels before responding (default: true).",
390
- "auth.profiles": "Named auth profiles (provider + mode + optional email).",
391
- "auth.order": "Ordered auth profile IDs per provider (used for automatic failover).",
392
- "auth.cooldowns.billingBackoffHours": "Base backoff (hours) when a profile fails due to billing/insufficient credits (default: 5).",
393
- "auth.cooldowns.billingBackoffHoursByProvider": "Optional per-provider overrides for billing backoff (hours).",
394
- "auth.cooldowns.billingMaxHours": "Cap (hours) for billing backoff (default: 24).",
395
- "auth.cooldowns.failureWindowHours": "Failure window (hours) for backoff counters (default: 24).",
396
- "agents.defaults.bootstrapMaxChars": "Max characters of each workspace bootstrap file injected into the system prompt before truncation (default: 20000).",
397
- "agents.defaults.repoRoot": "Optional repository root shown in the system prompt runtime line (overrides auto-detect).",
398
- "agents.defaults.envelopeTimezone": 'Timezone for message envelopes ("utc", "local", "user", or an IANA timezone string).',
399
- "agents.defaults.envelopeTimestamp": 'Include absolute timestamps in message envelopes ("on" or "off").',
400
- "agents.defaults.envelopeElapsed": 'Include elapsed time in message envelopes ("on" or "off").',
401
- "agents.defaults.models": "Configured model catalog (keys are full provider/model IDs).",
402
- "agents.defaults.memorySearch": "Vector search over MEMORY.md and memory/*.md (per-agent overrides supported).",
403
- "agents.defaults.memorySearch.sources": 'Sources to index for memory search (default: ["memory"]; add "sessions" to include session transcripts).',
404
- "agents.defaults.memorySearch.experimental.sessionMemory": "Enable experimental session transcript indexing for memory search (default: false).",
405
- "agents.defaults.memorySearch.provider": 'Embedding provider ("openai", "gemini", "voyage", or "local").',
406
- "agents.defaults.memorySearch.remote.baseUrl": "Custom base URL for remote embeddings (OpenAI-compatible proxies or Gemini overrides).",
407
- "agents.defaults.memorySearch.remote.apiKey": "Custom API key for the remote embedding provider.",
408
- "agents.defaults.memorySearch.remote.headers": "Extra headers for remote embeddings (merged; remote overrides OpenAI headers).",
409
- "agents.defaults.memorySearch.remote.batch.enabled": "Enable batch API for memory embeddings (OpenAI/Gemini; default: true).",
410
- "agents.defaults.memorySearch.remote.batch.wait": "Wait for batch completion when indexing (default: true).",
411
- "agents.defaults.memorySearch.remote.batch.concurrency": "Max concurrent embedding batch jobs for memory indexing (default: 2).",
412
- "agents.defaults.memorySearch.remote.batch.pollIntervalMs": "Polling interval in ms for batch status (default: 2000).",
413
- "agents.defaults.memorySearch.remote.batch.timeoutMinutes": "Timeout in minutes for batch indexing (default: 60).",
414
- "agents.defaults.memorySearch.local.modelPath": "Local GGUF model path or hf: URI (node-llama-cpp).",
415
- "agents.defaults.memorySearch.fallback": 'Fallback provider when embeddings fail ("openai", "gemini", "local", "voyage", or "none").',
416
- "agents.defaults.memorySearch.store.path": "SQLite index path (default: ~/.poolbot/memory/{agentId}.sqlite).",
417
- "agents.defaults.memorySearch.store.vector.enabled": "Enable sqlite-vec extension for vector search (default: true).",
418
- "agents.defaults.memorySearch.store.vector.extensionPath": "Optional override path to sqlite-vec extension library (.dylib/.so/.dll).",
419
- "agents.defaults.memorySearch.query.hybrid.enabled": "Enable hybrid BM25 + vector search for memory (default: true).",
420
- "agents.defaults.memorySearch.query.hybrid.vectorWeight": "Weight for vector similarity when merging results (0-1).",
421
- "agents.defaults.memorySearch.query.hybrid.textWeight": "Weight for BM25 text relevance when merging results (0-1).",
422
- "agents.defaults.memorySearch.query.hybrid.candidateMultiplier": "Multiplier for candidate pool size (default: 4).",
423
- "agents.defaults.memorySearch.cache.enabled": "Cache chunk embeddings in SQLite to speed up reindexing and frequent updates (default: true).",
424
- "agents.defaults.memorySearch.cache.maxEntries": "Optional cap on cached embeddings (best-effort).",
425
- "agents.defaults.memorySearch.sync.onSearch": "Lazy sync: schedule a reindex on search after changes.",
426
- "agents.defaults.memorySearch.sync.watch": "Watch memory files for changes (chokidar).",
427
- "agents.defaults.memorySearch.sync.sessions.deltaBytes": "Minimum appended bytes before session transcripts trigger reindex (default: 100000).",
428
- "agents.defaults.memorySearch.sync.sessions.deltaMessages": "Minimum appended JSONL lines before session transcripts trigger reindex (default: 50).",
429
- "plugins.enabled": "Enable plugin/extension loading (default: true).",
430
- "plugins.allow": "Optional allowlist of plugin ids; when set, only listed plugins load.",
431
- "plugins.deny": "Optional denylist of plugin ids; deny wins over allowlist.",
432
- "plugins.load.paths": "Additional plugin files or directories to load.",
433
- "plugins.slots": "Select which plugins own exclusive slots (memory, etc.).",
434
- "plugins.slots.memory": 'Select the active memory plugin by id, or "none" to disable memory plugins.',
435
- "plugins.entries": "Per-plugin settings keyed by plugin id (enable/disable + config payloads).",
436
- "plugins.entries.*.enabled": "Overrides plugin enable/disable for this entry (restart required).",
437
- "plugins.entries.*.config": "Plugin-defined config payload (schema is provided by the plugin).",
438
- "plugins.installs": "CLI-managed install metadata (used by `poolbot plugins update` to locate install sources).",
439
- "plugins.installs.*.source": 'Install source ("npm", "archive", or "path").',
440
- "plugins.installs.*.spec": "Original npm spec used for install (if source is npm).",
441
- "plugins.installs.*.sourcePath": "Original archive/path used for install (if any).",
442
- "plugins.installs.*.installPath": "Resolved install directory (usually ~/.poolbot/extensions/<id>).",
443
- "plugins.installs.*.version": "Version recorded at install time (if available).",
444
- "plugins.installs.*.installedAt": "ISO timestamp of last install/update.",
445
- "agents.list.*.identity.avatar": "Agent avatar (workspace-relative path, http(s) URL, or data URI).",
446
- "agents.defaults.model.primary": "Primary model (provider/model).",
447
- "agents.defaults.model.fallbacks": "Ordered fallback models (provider/model). Used when the primary model fails.",
448
- "agents.defaults.imageModel.primary": "Optional image model (provider/model) used when the primary model lacks image input.",
449
- "agents.defaults.imageModel.fallbacks": "Ordered fallback image models (provider/model).",
450
- "agents.defaults.cliBackends": "Optional CLI backends for text-only fallback (claude-cli, etc.).",
451
- "agents.defaults.humanDelay.mode": 'Delay style for block replies ("off", "natural", "custom").',
452
- "agents.defaults.humanDelay.minMs": "Minimum delay in ms for custom humanDelay (default: 800).",
453
- "agents.defaults.humanDelay.maxMs": "Maximum delay in ms for custom humanDelay (default: 2500).",
454
- "commands.native": "Register native commands with channels that support it (Discord/Slack/Telegram).",
455
- "commands.nativeSkills": "Register native skill commands (user-invocable skills) with channels that support it.",
456
- "commands.text": "Allow text command parsing (slash commands only).",
457
- "commands.bash": "Allow bash chat command (`!`; `/bash` alias) to run host shell commands (default: false; requires tools.elevated).",
458
- "commands.bashForegroundMs": "How long bash waits before backgrounding (default: 2000; 0 backgrounds immediately).",
459
- "commands.config": "Allow /config chat command to read/write config on disk (default: false).",
460
- "commands.debug": "Allow /debug chat command for runtime-only overrides (default: false).",
461
- "commands.restart": "Allow /restart and gateway restart tool actions (default: false).",
462
- "commands.useAccessGroups": "Enforce access-group allowlists/policies for commands.",
463
- "session.dmScope": 'DM session scoping: "main" keeps continuity; "per-peer" or "per-channel-peer" isolates DM history (recommended for shared inboxes).',
464
- "session.identityLinks": "Map canonical identities to provider-prefixed peer IDs for DM session linking (example: telegram:123456).",
465
- "channels.telegram.configWrites": "Allow Telegram to write config in response to channel events/commands (default: true).",
466
- "channels.slack.configWrites": "Allow Slack to write config in response to channel events/commands (default: true).",
467
- "channels.mattermost.configWrites": "Allow Mattermost to write config in response to channel events/commands (default: true).",
468
- "channels.discord.configWrites": "Allow Discord to write config in response to channel events/commands (default: true).",
469
- "channels.whatsapp.configWrites": "Allow WhatsApp to write config in response to channel events/commands (default: true).",
470
- "channels.signal.configWrites": "Allow Signal to write config in response to channel events/commands (default: true).",
471
- "channels.imessage.configWrites": "Allow iMessage to write config in response to channel events/commands (default: true).",
472
- "channels.msteams.configWrites": "Allow Microsoft Teams to write config in response to channel events/commands (default: true).",
473
- "channels.discord.commands.native": 'Override native commands for Discord (bool or "auto").',
474
- "channels.discord.commands.nativeSkills": 'Override native skill commands for Discord (bool or "auto").',
475
- "channels.telegram.commands.native": 'Override native commands for Telegram (bool or "auto").',
476
- "channels.telegram.commands.nativeSkills": 'Override native skill commands for Telegram (bool or "auto").',
477
- "channels.slack.commands.native": 'Override native commands for Slack (bool or "auto").',
478
- "channels.slack.commands.nativeSkills": 'Override native skill commands for Slack (bool or "auto").',
479
- "session.agentToAgent.maxPingPongTurns": "Max reply-back turns between requester and target (0–5).",
480
- "channels.telegram.customCommands": "Additional Telegram bot menu commands (merged with native; conflicts ignored).",
481
- "messages.ackReaction": "Emoji reaction used to acknowledge inbound messages (empty disables).",
482
- "messages.ackReactionScope": 'When to send ack reactions ("group-mentions", "group-all", "direct", "all").',
483
- "messages.inbound.debounceMs": "Debounce window (ms) for batching rapid inbound messages from the same sender (0 to disable).",
484
- "channels.telegram.dmPolicy": 'Direct message access control ("pairing" recommended). "open" requires channels.telegram.allowFrom=["*"].',
485
- "channels.telegram.streamMode": "Draft streaming mode for Telegram replies (off | partial | block). Separate from block streaming; requires private topics + sendMessageDraft.",
486
- "channels.telegram.draftChunk.minChars": 'Minimum chars before emitting a Telegram draft update when channels.telegram.streamMode="block" (default: 200).',
487
- "channels.telegram.draftChunk.maxChars": 'Target max size for a Telegram draft update chunk when channels.telegram.streamMode="block" (default: 800; clamped to channels.telegram.textChunkLimit).',
488
- "channels.telegram.draftChunk.breakPreference": "Preferred breakpoints for Telegram draft chunks (paragraph | newline | sentence). Default: paragraph.",
489
- "channels.telegram.retry.attempts": "Max retry attempts for outbound Telegram API calls (default: 3).",
490
- "channels.telegram.retry.minDelayMs": "Minimum retry delay in ms for Telegram outbound calls.",
491
- "channels.telegram.retry.maxDelayMs": "Maximum retry delay cap in ms for Telegram outbound calls.",
492
- "channels.telegram.retry.jitter": "Jitter factor (0-1) applied to Telegram retry delays.",
493
- "channels.telegram.network.autoSelectFamily": "Override Node autoSelectFamily for Telegram (true=enable, false=disable).",
494
- "channels.telegram.timeoutSeconds": "Max seconds before Telegram API requests are aborted (default: 500 per grammY).",
495
- "channels.whatsapp.dmPolicy": 'Direct message access control ("pairing" recommended). "open" requires channels.whatsapp.allowFrom=["*"].',
496
- "channels.whatsapp.selfChatMode": "Same-phone setup (bot uses your personal WhatsApp number).",
497
- "channels.whatsapp.debounceMs": "Debounce window (ms) for batching rapid consecutive messages from the same sender (0 to disable).",
498
- "channels.signal.dmPolicy": 'Direct message access control ("pairing" recommended). "open" requires channels.signal.allowFrom=["*"].',
499
- "channels.imessage.dmPolicy": 'Direct message access control ("pairing" recommended). "open" requires channels.imessage.allowFrom=["*"].',
500
- "channels.bluebubbles.dmPolicy": 'Direct message access control ("pairing" recommended). "open" requires channels.bluebubbles.allowFrom=["*"].',
501
- "channels.discord.dm.policy": 'Direct message access control ("pairing" recommended). "open" requires channels.discord.dm.allowFrom=["*"].',
502
- "channels.discord.retry.attempts": "Max retry attempts for outbound Discord API calls (default: 3).",
503
- "channels.discord.retry.minDelayMs": "Minimum retry delay in ms for Discord outbound calls.",
504
- "channels.discord.retry.maxDelayMs": "Maximum retry delay cap in ms for Discord outbound calls.",
505
- "channels.discord.retry.jitter": "Jitter factor (0-1) applied to Discord retry delays.",
506
- "channels.discord.maxLinesPerMessage": "Soft max line count per Discord message (default: 17).",
507
- "channels.discord.intents.presence": "Enable the Guild Presences privileged intent. Must also be enabled in the Discord Developer Portal. Allows tracking user activities (e.g. Spotify). Default: false.",
508
- "channels.discord.intents.guildMembers": "Enable the Guild Members privileged intent. Must also be enabled in the Discord Developer Portal. Default: false.",
509
- "channels.slack.dm.policy": 'Direct message access control ("pairing" recommended). "open" requires channels.slack.dm.allowFrom=["*"].',
510
- };
511
- const FIELD_PLACEHOLDERS = {
512
- "gateway.remote.url": "ws://host:18789",
513
- "gateway.remote.tlsFingerprint": "sha256:ab12cd34…",
514
- "gateway.remote.sshTarget": "user@host",
515
- "gateway.controlUi.basePath": "/poolbot",
516
- "channels.mattermost.baseUrl": "https://chat.example.com",
517
- "agents.list[].identity.avatar": "avatars/clawd.png",
518
- };
519
- const SENSITIVE_PATTERNS = [/token/i, /password/i, /secret/i, /api.?key/i];
520
- function isSensitivePath(path) {
521
- return SENSITIVE_PATTERNS.some((pattern) => pattern.test(path));
522
- }
523
5
  function cloneSchema(value) {
524
- if (typeof structuredClone === "function")
6
+ if (typeof structuredClone === "function") {
525
7
  return structuredClone(value);
8
+ }
526
9
  return JSON.parse(JSON.stringify(value));
527
10
  }
528
11
  function asSchemaObject(value) {
529
- if (!value || typeof value !== "object" || Array.isArray(value))
12
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
530
13
  return null;
14
+ }
531
15
  return value;
532
16
  }
533
17
  function isObjectSchema(schema) {
534
18
  const type = schema.type;
535
- if (type === "object")
19
+ if (type === "object") {
536
20
  return true;
537
- if (Array.isArray(type) && type.includes("object"))
21
+ }
22
+ if (Array.isArray(type) && type.includes("object")) {
538
23
  return true;
24
+ }
539
25
  return Boolean(schema.properties || schema.additionalProperties);
540
26
  }
541
27
  function mergeObjectSchema(base, extension) {
@@ -552,48 +38,30 @@ function mergeObjectSchema(base, extension) {
552
38
  merged.required = Array.from(mergedRequired);
553
39
  }
554
40
  const additional = extension.additionalProperties ?? base.additionalProperties;
555
- if (additional !== undefined)
41
+ if (additional !== undefined) {
556
42
  merged.additionalProperties = additional;
557
- return merged;
558
- }
559
- function buildBaseHints() {
560
- const hints = {};
561
- for (const [group, label] of Object.entries(GROUP_LABELS)) {
562
- hints[group] = {
563
- label,
564
- group: label,
565
- order: GROUP_ORDER[group],
566
- };
567
- }
568
- for (const [path, label] of Object.entries(FIELD_LABELS)) {
569
- const current = hints[path];
570
- hints[path] = current ? { ...current, label } : { label };
571
- }
572
- for (const [path, help] of Object.entries(FIELD_HELP)) {
573
- const current = hints[path];
574
- hints[path] = current ? { ...current, help } : { help };
575
- }
576
- for (const [path, placeholder] of Object.entries(FIELD_PLACEHOLDERS)) {
577
- const current = hints[path];
578
- hints[path] = current ? { ...current, placeholder } : { placeholder };
579
43
  }
580
- return hints;
44
+ return merged;
581
45
  }
582
- function applySensitiveHints(hints) {
583
- const next = { ...hints };
584
- for (const key of Object.keys(next)) {
585
- if (isSensitivePath(key)) {
586
- next[key] = { ...next[key], sensitive: true };
587
- }
588
- }
589
- return next;
46
+ function collectExtensionHintKeys(hints, plugins, channels) {
47
+ const pluginPrefixes = plugins
48
+ .map((plugin) => plugin.id.trim())
49
+ .filter(Boolean)
50
+ .map((id) => `plugins.entries.${id}`);
51
+ const channelPrefixes = channels
52
+ .map((channel) => channel.id.trim())
53
+ .filter(Boolean)
54
+ .map((id) => `channels.${id}`);
55
+ const prefixes = [...pluginPrefixes, ...channelPrefixes];
56
+ return new Set(Object.keys(hints).filter((key) => prefixes.some((prefix) => key === prefix || key.startsWith(`${prefix}.`))));
590
57
  }
591
58
  function applyPluginHints(hints, plugins) {
592
59
  const next = { ...hints };
593
60
  for (const plugin of plugins) {
594
61
  const id = plugin.id.trim();
595
- if (!id)
62
+ if (!id) {
596
63
  continue;
64
+ }
597
65
  const name = (plugin.name ?? id).trim() || id;
598
66
  const basePath = `plugins.entries.${id}`;
599
67
  next[basePath] = {
@@ -615,8 +83,9 @@ function applyPluginHints(hints, plugins) {
615
83
  const uiHints = plugin.configUiHints ?? {};
616
84
  for (const [relPathRaw, hint] of Object.entries(uiHints)) {
617
85
  const relPath = relPathRaw.trim().replace(/^\./, "");
618
- if (!relPath)
86
+ if (!relPath) {
619
87
  continue;
88
+ }
620
89
  const key = `${basePath}.config.${relPath}`;
621
90
  next[key] = {
622
91
  ...next[key],
@@ -630,8 +99,9 @@ function applyChannelHints(hints, channels) {
630
99
  const next = { ...hints };
631
100
  for (const channel of channels) {
632
101
  const id = channel.id.trim();
633
- if (!id)
102
+ if (!id) {
634
103
  continue;
104
+ }
635
105
  const basePath = `channels.${id}`;
636
106
  const current = next[basePath] ?? {};
637
107
  const label = channel.label?.trim();
@@ -644,8 +114,9 @@ function applyChannelHints(hints, channels) {
644
114
  const uiHints = channel.configUiHints ?? {};
645
115
  for (const [relPathRaw, hint] of Object.entries(uiHints)) {
646
116
  const relPath = relPathRaw.trim().replace(/^\./, "");
647
- if (!relPath)
117
+ if (!relPath) {
648
118
  continue;
119
+ }
649
120
  const key = `${basePath}.${relPath}`;
650
121
  next[key] = {
651
122
  ...next[key],
@@ -660,15 +131,17 @@ function listHeartbeatTargetChannels(channels) {
660
131
  const ordered = [];
661
132
  for (const id of CHANNEL_IDS) {
662
133
  const normalized = id.trim().toLowerCase();
663
- if (!normalized || seen.has(normalized))
134
+ if (!normalized || seen.has(normalized)) {
664
135
  continue;
136
+ }
665
137
  seen.add(normalized);
666
138
  ordered.push(normalized);
667
139
  }
668
140
  for (const channel of channels) {
669
141
  const normalized = channel.id.trim().toLowerCase();
670
- if (!normalized || seen.has(normalized))
142
+ if (!normalized || seen.has(normalized)) {
671
143
  continue;
144
+ }
672
145
  seen.add(normalized);
673
146
  ordered.push(normalized);
674
147
  }
@@ -695,14 +168,16 @@ function applyPluginSchemas(schema, plugins) {
695
168
  const root = asSchemaObject(next);
696
169
  const pluginsNode = asSchemaObject(root?.properties?.plugins);
697
170
  const entriesNode = asSchemaObject(pluginsNode?.properties?.entries);
698
- if (!entriesNode)
171
+ if (!entriesNode) {
699
172
  return next;
173
+ }
700
174
  const entryBase = asSchemaObject(entriesNode.additionalProperties);
701
175
  const entryProperties = entriesNode.properties ?? {};
702
176
  entriesNode.properties = entryProperties;
703
177
  for (const plugin of plugins) {
704
- if (!plugin.configSchema)
178
+ if (!plugin.configSchema) {
705
179
  continue;
180
+ }
706
181
  const entrySchema = entryBase
707
182
  ? cloneSchema(entryBase)
708
183
  : { type: "object" };
@@ -727,13 +202,15 @@ function applyChannelSchemas(schema, channels) {
727
202
  const next = cloneSchema(schema);
728
203
  const root = asSchemaObject(next);
729
204
  const channelsNode = asSchemaObject(root?.properties?.channels);
730
- if (!channelsNode)
205
+ if (!channelsNode) {
731
206
  return next;
207
+ }
732
208
  const channelProps = channelsNode.properties ?? {};
733
209
  channelsNode.properties = channelProps;
734
210
  for (const channel of channels) {
735
- if (!channel.configSchema)
211
+ if (!channel.configSchema) {
736
212
  continue;
213
+ }
737
214
  const existing = asSchemaObject(channelProps[channel.id]);
738
215
  const incoming = asSchemaObject(channel.configSchema);
739
216
  if (existing && incoming && isObjectSchema(existing) && isObjectSchema(incoming)) {
@@ -749,8 +226,15 @@ let cachedBase = null;
749
226
  function stripChannelSchema(schema) {
750
227
  const next = cloneSchema(schema);
751
228
  const root = asSchemaObject(next);
752
- if (!root || !root.properties)
229
+ if (!root || !root.properties) {
753
230
  return next;
231
+ }
232
+ // Allow `$schema` in config files for editor tooling, but hide it from the
233
+ // Control UI form schema so it does not show up as a configurable section.
234
+ delete root.properties.$schema;
235
+ if (Array.isArray(root.required)) {
236
+ root.required = root.required.filter((key) => key !== "$schema");
237
+ }
754
238
  const channelsNode = asSchemaObject(root.properties.channels);
755
239
  if (channelsNode) {
756
240
  channelsNode.properties = {};
@@ -760,14 +244,15 @@ function stripChannelSchema(schema) {
760
244
  return next;
761
245
  }
762
246
  function buildBaseConfigSchema() {
763
- if (cachedBase)
247
+ if (cachedBase) {
764
248
  return cachedBase;
249
+ }
765
250
  const schema = PoolBotSchema.toJSONSchema({
766
251
  target: "draft-07",
767
252
  unrepresentable: "any",
768
253
  });
769
254
  schema.title = "PoolBotConfig";
770
- const hints = applySensitiveHints(buildBaseHints());
255
+ const hints = mapSensitivePaths(PoolBotSchema, "", buildBaseHints());
771
256
  const next = {
772
257
  schema: stripChannelSchema(schema),
773
258
  uiHints: hints,
@@ -781,9 +266,12 @@ export function buildConfigSchema(params) {
781
266
  const base = buildBaseConfigSchema();
782
267
  const plugins = params?.plugins ?? [];
783
268
  const channels = params?.channels ?? [];
784
- if (plugins.length === 0 && channels.length === 0)
269
+ if (plugins.length === 0 && channels.length === 0) {
785
270
  return base;
786
- const mergedHints = applySensitiveHints(applyHeartbeatTargetHints(applyChannelHints(applyPluginHints(base.uiHints, plugins), channels), channels));
271
+ }
272
+ const mergedWithoutSensitiveHints = applyHeartbeatTargetHints(applyChannelHints(applyPluginHints(base.uiHints, plugins), channels), channels);
273
+ const extensionHintKeys = collectExtensionHintKeys(mergedWithoutSensitiveHints, plugins, channels);
274
+ const mergedHints = applySensitiveHints(mergedWithoutSensitiveHints, extensionHintKeys);
787
275
  const mergedSchema = applyChannelSchemas(applyPluginSchemas(base.schema, plugins), channels);
788
276
  return {
789
277
  ...base,