@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
@@ -4,17 +4,18 @@ import os from "node:os";
4
4
  import path from "node:path";
5
5
  import { resolveDefaultAgentId } from "../agents/agent-scope.js";
6
6
  import { loadConfig } from "../config/config.js";
7
+ import { resolveStateDir } from "../config/paths.js";
7
8
  import { resolveSessionTranscriptsDirForAgent } from "../config/sessions/paths.js";
8
9
  import { setVerbose } from "../globals.js";
9
- import { withProgress, withProgressTotals } from "./progress.js";
10
- import { formatErrorMessage, withManager } from "./cli-utils.js";
11
10
  import { getMemorySearchManager } from "../memory/index.js";
12
- import { listMemoryFiles } from "../memory/internal.js";
11
+ import { listMemoryFiles, normalizeExtraMemoryPaths } from "../memory/internal.js";
13
12
  import { defaultRuntime } from "../runtime.js";
14
13
  import { formatDocsLink } from "../terminal/links.js";
15
14
  import { colorize, isRich, theme } from "../terminal/theme.js";
16
- import { resolveStateDir } from "../config/paths.js";
17
15
  import { shortenHomeInString, shortenHomePath } from "../utils.js";
16
+ import { formatErrorMessage, withManager } from "./cli-utils.js";
17
+ import { formatHelpExamples } from "./help-format.js";
18
+ import { withProgress, withProgressTotals } from "./progress.js";
18
19
  function formatSourceLabel(source, workspaceDir, agentId) {
19
20
  if (source === "memory") {
20
21
  return shortenHomeInString(`memory (MEMORY.md + ${path.join(workspaceDir, "memory")}${path.sep}*.md)`);
@@ -27,20 +28,39 @@ function formatSourceLabel(source, workspaceDir, agentId) {
27
28
  }
28
29
  function resolveAgent(cfg, agent) {
29
30
  const trimmed = agent?.trim();
30
- if (trimmed)
31
+ if (trimmed) {
31
32
  return trimmed;
33
+ }
32
34
  return resolveDefaultAgentId(cfg);
33
35
  }
34
36
  function resolveAgentIds(cfg, agent) {
35
37
  const trimmed = agent?.trim();
36
- if (trimmed)
38
+ if (trimmed) {
37
39
  return [trimmed];
40
+ }
38
41
  const list = cfg.agents?.list ?? [];
39
42
  if (list.length > 0) {
40
43
  return list.map((entry) => entry.id).filter(Boolean);
41
44
  }
42
45
  return [resolveDefaultAgentId(cfg)];
43
46
  }
47
+ function formatExtraPaths(workspaceDir, extraPaths) {
48
+ return normalizeExtraMemoryPaths(workspaceDir, extraPaths).map((entry) => shortenHomePath(entry));
49
+ }
50
+ async function withMemoryManagerForAgent(params) {
51
+ await withManager({
52
+ getManager: () => getMemorySearchManager({
53
+ cfg: params.cfg,
54
+ agentId: params.agentId,
55
+ }),
56
+ onMissing: (error) => defaultRuntime.log(error ?? "Memory search disabled."),
57
+ onCloseError: (err) => defaultRuntime.error(`Memory manager close failed: ${formatErrorMessage(err)}`),
58
+ close: async (manager) => {
59
+ await manager.close?.();
60
+ },
61
+ run: params.run,
62
+ });
63
+ }
44
64
  async function checkReadableFile(pathname) {
45
65
  try {
46
66
  await fs.access(pathname, fsSync.constants.R_OK);
@@ -48,8 +68,9 @@ async function checkReadableFile(pathname) {
48
68
  }
49
69
  catch (err) {
50
70
  const code = err.code;
51
- if (code === "ENOENT")
71
+ if (code === "ENOENT") {
52
72
  return { exists: false };
73
+ }
53
74
  return {
54
75
  exists: true,
55
76
  issue: `${shortenHomePath(pathname)} not readable (${code ?? "error"})`,
@@ -74,17 +95,41 @@ async function scanSessionFiles(agentId) {
74
95
  return { source: "sessions", totalFiles: null, issues };
75
96
  }
76
97
  }
77
- async function scanMemoryFiles(workspaceDir) {
98
+ async function scanMemoryFiles(workspaceDir, extraPaths = []) {
78
99
  const issues = [];
79
100
  const memoryFile = path.join(workspaceDir, "MEMORY.md");
80
101
  const altMemoryFile = path.join(workspaceDir, "memory.md");
81
102
  const memoryDir = path.join(workspaceDir, "memory");
82
103
  const primary = await checkReadableFile(memoryFile);
83
104
  const alt = await checkReadableFile(altMemoryFile);
84
- if (primary.issue)
105
+ if (primary.issue) {
85
106
  issues.push(primary.issue);
86
- if (alt.issue)
107
+ }
108
+ if (alt.issue) {
87
109
  issues.push(alt.issue);
110
+ }
111
+ const resolvedExtraPaths = normalizeExtraMemoryPaths(workspaceDir, extraPaths);
112
+ for (const extraPath of resolvedExtraPaths) {
113
+ try {
114
+ const stat = await fs.lstat(extraPath);
115
+ if (stat.isSymbolicLink()) {
116
+ continue;
117
+ }
118
+ const extraCheck = await checkReadableFile(extraPath);
119
+ if (extraCheck.issue) {
120
+ issues.push(extraCheck.issue);
121
+ }
122
+ }
123
+ catch (err) {
124
+ const code = err.code;
125
+ if (code === "ENOENT") {
126
+ issues.push(`additional memory path missing (${shortenHomePath(extraPath)})`);
127
+ }
128
+ else {
129
+ issues.push(`additional memory path not accessible (${shortenHomePath(extraPath)}): ${code ?? "error"}`);
130
+ }
131
+ }
132
+ }
88
133
  let dirReadable = null;
89
134
  try {
90
135
  await fs.access(memoryDir, fsSync.constants.R_OK);
@@ -104,7 +149,7 @@ async function scanMemoryFiles(workspaceDir) {
104
149
  let listed = [];
105
150
  let listedOk = false;
106
151
  try {
107
- listed = await listMemoryFiles(workspaceDir);
152
+ listed = await listMemoryFiles(workspaceDir, resolvedExtraPaths);
108
153
  listedOk = true;
109
154
  }
110
155
  catch (err) {
@@ -121,10 +166,12 @@ async function scanMemoryFiles(workspaceDir) {
121
166
  else {
122
167
  const files = new Set(listedOk ? listed : []);
123
168
  if (!listedOk) {
124
- if (primary.exists)
169
+ if (primary.exists) {
125
170
  files.add(memoryFile);
126
- if (alt.exists)
171
+ }
172
+ if (alt.exists) {
127
173
  files.add(altMemoryFile);
174
+ }
128
175
  }
129
176
  totalFiles = files.size;
130
177
  }
@@ -133,11 +180,37 @@ async function scanMemoryFiles(workspaceDir) {
133
180
  }
134
181
  return { source: "memory", totalFiles, issues };
135
182
  }
183
+ async function summarizeQmdIndexArtifact(manager) {
184
+ const status = manager.status?.();
185
+ if (!status || status.backend !== "qmd") {
186
+ return null;
187
+ }
188
+ const dbPath = status.dbPath?.trim();
189
+ if (!dbPath) {
190
+ return null;
191
+ }
192
+ let stat;
193
+ try {
194
+ stat = await fs.stat(dbPath);
195
+ }
196
+ catch (err) {
197
+ const code = err.code;
198
+ if (code === "ENOENT") {
199
+ throw new Error(`QMD index file not found: ${shortenHomePath(dbPath)}`, { cause: err });
200
+ }
201
+ throw new Error(`QMD index file check failed: ${shortenHomePath(dbPath)} (${code ?? "error"})`, { cause: err });
202
+ }
203
+ if (!stat.isFile() || stat.size <= 0) {
204
+ throw new Error(`QMD index file is empty: ${shortenHomePath(dbPath)}`);
205
+ }
206
+ return `QMD index: ${shortenHomePath(dbPath)} (${stat.size} bytes)`;
207
+ }
136
208
  async function scanMemorySources(params) {
137
209
  const scans = [];
210
+ const extraPaths = params.extraPaths ?? [];
138
211
  for (const source of params.sources) {
139
212
  if (source === "memory") {
140
- scans.push(await scanMemoryFiles(params.workspaceDir));
213
+ scans.push(await scanMemoryFiles(params.workspaceDir, extraPaths));
141
214
  }
142
215
  if (source === "sessions") {
143
216
  scans.push(await scanSessionFiles(params.agentId));
@@ -157,43 +230,42 @@ export async function runMemoryStatus(opts) {
157
230
  const agentIds = resolveAgentIds(cfg, opts.agent);
158
231
  const allResults = [];
159
232
  for (const agentId of agentIds) {
160
- await withManager({
161
- getManager: () => getMemorySearchManager({ cfg, agentId }),
162
- onMissing: (error) => defaultRuntime.log(error ?? "Memory search disabled."),
163
- onCloseError: (err) => defaultRuntime.error(`Memory manager close failed: ${formatErrorMessage(err)}`),
164
- close: async (manager) => {
165
- await manager.close?.();
166
- },
233
+ await withMemoryManagerForAgent({
234
+ cfg,
235
+ agentId,
167
236
  run: async (manager) => {
168
237
  const deep = Boolean(opts.deep || opts.index);
169
238
  let embeddingProbe;
170
239
  let indexError;
240
+ const syncFn = manager.sync ? manager.sync.bind(manager) : undefined;
171
241
  if (deep) {
172
- await withProgress({ label: "Checking memory", total: 2 }, async (progress) => {
173
- progress.setLabel("Probing vector");
242
+ await withProgress({ label: "Checking memory\u2026", total: 2 }, async (progress) => {
243
+ progress.setLabel("Probing vector\u2026");
174
244
  await manager.probeVectorAvailability();
175
245
  progress.tick();
176
- progress.setLabel("Probing embeddings");
246
+ progress.setLabel("Probing embeddings\u2026");
177
247
  embeddingProbe = await manager.probeEmbeddingAvailability();
178
248
  progress.tick();
179
249
  });
180
- if (opts.index) {
250
+ if (opts.index && syncFn) {
181
251
  await withProgressTotals({
182
- label: "Indexing memory",
252
+ label: "Indexing memory\u2026",
183
253
  total: 0,
184
254
  fallback: opts.verbose ? "line" : undefined,
185
255
  }, async (update, progress) => {
186
256
  try {
187
- await manager.sync?.({
257
+ await syncFn({
188
258
  reason: "cli",
259
+ force: Boolean(opts.force),
189
260
  progress: (syncUpdate) => {
190
261
  update({
191
262
  completed: syncUpdate.completed,
192
263
  total: syncUpdate.total,
193
264
  label: syncUpdate.label,
194
265
  });
195
- if (syncUpdate.label)
266
+ if (syncUpdate.label) {
196
267
  progress.setLabel(syncUpdate.label);
268
+ }
197
269
  },
198
270
  });
199
271
  }
@@ -204,6 +276,9 @@ export async function runMemoryStatus(opts) {
204
276
  }
205
277
  });
206
278
  }
279
+ else if (opts.index && !syncFn) {
280
+ defaultRuntime.log("Memory backend does not support manual reindex.");
281
+ }
207
282
  }
208
283
  else {
209
284
  await manager.probeVectorAvailability();
@@ -216,6 +291,7 @@ export async function runMemoryStatus(opts) {
216
291
  workspaceDir,
217
292
  agentId,
218
293
  sources,
294
+ extraPaths: status.extraPaths,
219
295
  })
220
296
  : undefined;
221
297
  allResults.push({ agentId, status, embeddingProbe, indexError, scan });
@@ -240,8 +316,8 @@ export async function runMemoryStatus(opts) {
240
316
  const chunksIndexed = status.chunks ?? 0;
241
317
  const totalFiles = scan?.totalFiles ?? null;
242
318
  const indexedLabel = totalFiles === null
243
- ? `${filesIndexed}/? files · ${chunksIndexed} chunks`
244
- : `${filesIndexed}/${totalFiles} files · ${chunksIndexed} chunks`;
319
+ ? `${filesIndexed}/? files \u00b7 ${chunksIndexed} chunks`
320
+ : `${filesIndexed}/${totalFiles} files \u00b7 ${chunksIndexed} chunks`;
245
321
  if (opts.index) {
246
322
  const line = indexError ? `Memory index failed: ${indexError}` : "Memory index complete.";
247
323
  defaultRuntime.log(line);
@@ -251,11 +327,15 @@ export async function runMemoryStatus(opts) {
251
327
  const storePath = status.dbPath ? shortenHomePath(status.dbPath) : "<unknown>";
252
328
  const workspacePath = status.workspaceDir ? shortenHomePath(status.workspaceDir) : "<unknown>";
253
329
  const sourceList = status.sources?.length ? status.sources.join(", ") : null;
330
+ const extraPaths = status.workspaceDir
331
+ ? formatExtraPaths(status.workspaceDir, status.extraPaths ?? [])
332
+ : [];
254
333
  const lines = [
255
334
  `${heading("Memory Search")} ${muted(`(${agentId})`)}`,
256
335
  `${label("Provider")} ${info(status.provider)} ${muted(`(requested: ${requestedProvider})`)}`,
257
336
  `${label("Model")} ${info(modelLabel)}`,
258
337
  sourceList ? `${label("Sources")} ${info(sourceList)}` : null,
338
+ extraPaths.length ? `${label("Extra paths")} ${info(extraPaths.join(", "))}` : null,
259
339
  `${label("Indexed")} ${success(indexedLabel)}`,
260
340
  `${label("Dirty")} ${status.dirty ? warn("yes") : muted("no")}`,
261
341
  `${label("Store")} ${info(storePath)}`,
@@ -272,11 +352,11 @@ export async function runMemoryStatus(opts) {
272
352
  if (status.sourceCounts?.length) {
273
353
  lines.push(label("By source"));
274
354
  for (const entry of status.sourceCounts) {
275
- const total = scan?.sources.find((scanEntry) => scanEntry.source === entry.source)?.totalFiles;
355
+ const total = scan?.sources?.find((scanEntry) => scanEntry.source === entry.source)?.totalFiles;
276
356
  const counts = total === null
277
- ? `${entry.files}/? files · ${entry.chunks} chunks`
278
- : `${entry.files}/${total} files · ${entry.chunks} chunks`;
279
- lines.push(` ${accent(entry.source)} ${muted("·")} ${muted(counts)}`);
357
+ ? `${entry.files}/? files \u00b7 ${entry.chunks} chunks`
358
+ : `${entry.files}/${total} files \u00b7 ${entry.chunks} chunks`;
359
+ lines.push(` ${accent(entry.source)} ${muted("\u00b7")} ${muted(counts)}`);
280
360
  }
281
361
  }
282
362
  if (status.fallback) {
@@ -361,8 +441,13 @@ export async function runMemoryStatus(opts) {
361
441
  export function registerMemoryCli(program) {
362
442
  const memory = program
363
443
  .command("memory")
364
- .description("Memory search tools")
365
- .addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/memory", "docs.molt.bot/cli/memory")}\n`);
444
+ .description("Search, inspect, and reindex memory files")
445
+ .addHelpText("after", () => `\n${theme.heading("Examples:")}\n${formatHelpExamples([
446
+ ["poolbot memory status", "Show index and provider status."],
447
+ ["poolbot memory index --force", "Force a full reindex."],
448
+ ['poolbot memory search --query "deployment notes"', "Search indexed memory entries."],
449
+ ["poolbot memory status --json", "Output machine-readable JSON."],
450
+ ])}\n\n${theme.muted("Docs:")} ${formatDocsLink("/cli/memory", "docs.molt.bot/cli/memory")}\n`);
366
451
  memory
367
452
  .command("status")
368
453
  .description("Show memory search index status")
@@ -385,15 +470,12 @@ export function registerMemoryCli(program) {
385
470
  const cfg = loadConfig();
386
471
  const agentIds = resolveAgentIds(cfg, opts.agent);
387
472
  for (const agentId of agentIds) {
388
- await withManager({
389
- getManager: () => getMemorySearchManager({ cfg, agentId }),
390
- onMissing: (error) => defaultRuntime.log(error ?? "Memory search disabled."),
391
- onCloseError: (err) => defaultRuntime.error(`Memory manager close failed: ${formatErrorMessage(err)}`),
392
- close: async (manager) => {
393
- await manager.close?.();
394
- },
473
+ await withMemoryManagerForAgent({
474
+ cfg,
475
+ agentId,
395
476
  run: async (manager) => {
396
477
  try {
478
+ const syncFn = manager.sync ? manager.sync.bind(manager) : undefined;
397
479
  if (opts.verbose) {
398
480
  const status = manager.status();
399
481
  const rich = isRich();
@@ -403,13 +485,21 @@ export function registerMemoryCli(program) {
403
485
  const warn = (text) => colorize(rich, theme.warn, text);
404
486
  const label = (text) => muted(`${text}:`);
405
487
  const sourceLabels = (status.sources ?? []).map((source) => formatSourceLabel(source, status.workspaceDir ?? "", agentId));
488
+ const extraPaths = status.workspaceDir
489
+ ? formatExtraPaths(status.workspaceDir, status.extraPaths ?? [])
490
+ : [];
491
+ const requestedProvider = status.requestedProvider ?? status.provider;
492
+ const modelLabel = status.model ?? status.provider;
406
493
  const lines = [
407
494
  `${heading("Memory Index")} ${muted(`(${agentId})`)}`,
408
- `${label("Provider")} ${info(status.provider)} ${muted(`(requested: ${status.requestedProvider ?? status.provider})`)}`,
409
- `${label("Model")} ${info(status.model ?? status.provider)}`,
495
+ `${label("Provider")} ${info(status.provider)} ${muted(`(requested: ${requestedProvider})`)}`,
496
+ `${label("Model")} ${info(modelLabel)}`,
410
497
  sourceLabels.length
411
498
  ? `${label("Sources")} ${info(sourceLabels.join(", "))}`
412
499
  : null,
500
+ extraPaths.length
501
+ ? `${label("Extra paths")} ${info(extraPaths.join(", "))}`
502
+ : null,
413
503
  ].filter(Boolean);
414
504
  if (status.fallback) {
415
505
  lines.push(`${label("Fallback")} ${warn(status.fallback.from)}`);
@@ -418,7 +508,7 @@ export function registerMemoryCli(program) {
418
508
  defaultRuntime.log("");
419
509
  }
420
510
  const startedAt = Date.now();
421
- let lastLabel = "Indexing memory";
511
+ let lastLabel = "Indexing memory\u2026";
422
512
  let lastCompleted = 0;
423
513
  let lastTotal = 0;
424
514
  const formatElapsed = () => {
@@ -429,12 +519,14 @@ export function registerMemoryCli(program) {
429
519
  return `${minutes}:${String(remainingSeconds).padStart(2, "0")}`;
430
520
  };
431
521
  const formatEta = () => {
432
- if (lastTotal <= 0 || lastCompleted <= 0)
522
+ if (lastTotal <= 0 || lastCompleted <= 0) {
433
523
  return null;
524
+ }
434
525
  const elapsedMs = Math.max(1, Date.now() - startedAt);
435
526
  const rate = lastCompleted / elapsedMs;
436
- if (!Number.isFinite(rate) || rate <= 0)
527
+ if (!Number.isFinite(rate) || rate <= 0) {
437
528
  return null;
529
+ }
438
530
  const remainingMs = Math.max(0, (lastTotal - lastCompleted) / rate);
439
531
  const seconds = Math.floor(remainingMs / 1000);
440
532
  const minutes = Math.floor(seconds / 60);
@@ -445,11 +537,15 @@ export function registerMemoryCli(program) {
445
537
  const elapsed = formatElapsed();
446
538
  const eta = formatEta();
447
539
  return eta
448
- ? `${lastLabel} · elapsed ${elapsed} · eta ${eta}`
449
- : `${lastLabel} · elapsed ${elapsed}`;
540
+ ? `${lastLabel} \u00b7 elapsed ${elapsed} \u00b7 eta ${eta}`
541
+ : `${lastLabel} \u00b7 elapsed ${elapsed}`;
450
542
  };
543
+ if (!syncFn) {
544
+ defaultRuntime.log("Memory backend does not support manual reindex.");
545
+ return;
546
+ }
451
547
  await withProgressTotals({
452
- label: "Indexing memory",
548
+ label: "Indexing memory\u2026",
453
549
  total: 0,
454
550
  fallback: opts.verbose ? "line" : undefined,
455
551
  }, async (update, progress) => {
@@ -457,12 +553,13 @@ export function registerMemoryCli(program) {
457
553
  progress.setLabel(buildLabel());
458
554
  }, 1000);
459
555
  try {
460
- await manager.sync?.({
556
+ await syncFn({
461
557
  reason: "cli",
462
- force: opts.force,
558
+ force: Boolean(opts.force),
463
559
  progress: (syncUpdate) => {
464
- if (syncUpdate.label)
560
+ if (syncUpdate.label) {
465
561
  lastLabel = syncUpdate.label;
562
+ }
466
563
  lastCompleted = syncUpdate.completed;
467
564
  lastTotal = syncUpdate.total;
468
565
  update({
@@ -478,6 +575,10 @@ export function registerMemoryCli(program) {
478
575
  clearInterval(interval);
479
576
  }
480
577
  });
578
+ const qmdIndexSummary = await summarizeQmdIndexArtifact(manager);
579
+ if (qmdIndexSummary) {
580
+ defaultRuntime.log(qmdIndexSummary);
581
+ }
481
582
  defaultRuntime.log(`Memory index updated (${agentId}).`);
482
583
  }
483
584
  catch (err) {
@@ -500,13 +601,9 @@ export function registerMemoryCli(program) {
500
601
  .action(async (query, opts) => {
501
602
  const cfg = loadConfig();
502
603
  const agentId = resolveAgent(cfg, opts.agent);
503
- await withManager({
504
- getManager: () => getMemorySearchManager({ cfg, agentId }),
505
- onMissing: (error) => defaultRuntime.log(error ?? "Memory search disabled."),
506
- onCloseError: (err) => defaultRuntime.error(`Memory manager close failed: ${formatErrorMessage(err)}`),
507
- close: async (manager) => {
508
- await manager.close?.();
509
- },
604
+ await withMemoryManagerForAgent({
605
+ cfg,
606
+ agentId,
510
607
  run: async (manager) => {
511
608
  let results;
512
609
  try {
@@ -1,9 +1,10 @@
1
- import { formatDocsLink } from "../../terminal/links.js";
2
- import { theme } from "../../terminal/theme.js";
3
1
  import { loadNodeHostConfig } from "../../node-host/config.js";
4
2
  import { runNodeHost } from "../../node-host/runner.js";
5
- import { runNodeDaemonInstall, runNodeDaemonRestart, runNodeDaemonStatus, runNodeDaemonStop, runNodeDaemonUninstall, } from "./daemon.js";
3
+ import { formatDocsLink } from "../../terminal/links.js";
4
+ import { theme } from "../../terminal/theme.js";
6
5
  import { parsePort } from "../daemon-cli/shared.js";
6
+ import { formatHelpExamples } from "../help-format.js";
7
+ import { runNodeDaemonInstall, runNodeDaemonRestart, runNodeDaemonStatus, runNodeDaemonStop, runNodeDaemonUninstall, } from "./daemon.js";
7
8
  function parsePortWithFallback(value, fallback) {
8
9
  const parsed = parsePort(value);
9
10
  return parsed ?? fallback;
@@ -11,8 +12,16 @@ function parsePortWithFallback(value, fallback) {
11
12
  export function registerNodeCli(program) {
12
13
  const node = program
13
14
  .command("node")
14
- .description("Run a headless node host (system.run/system.which)")
15
- .addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/node", "docs.molt.bot/cli/node")}\n`);
15
+ .description("Run and manage the headless node host service")
16
+ .addHelpText("after", () => `\n${theme.heading("Examples:")}\n${formatHelpExamples([
17
+ [
18
+ "poolbot node run --host 127.0.0.1 --port 18789",
19
+ "Run the node host in the foreground.",
20
+ ],
21
+ ["poolbot node status", "Check node host service status."],
22
+ ["poolbot node install", "Install the node host service."],
23
+ ["poolbot node restart", "Restart the installed node host service."],
24
+ ])}\n\n${theme.muted("Docs:")} ${formatDocsLink("/cli/node", "docs.molt.bot/cli/node")}\n`);
16
25
  node
17
26
  .command("run")
18
27
  .description("Run the headless node host (foreground)")
@@ -0,0 +1,63 @@
1
+ import { defaultRuntime } from "../../runtime.js";
2
+ import { getNodesTheme, runNodesCommand } from "./cli-utils.js";
3
+ import { callGatewayCli, nodesCallOpts, resolveNodeId } from "./rpc.js";
4
+ function normalizeEnvironment(value) {
5
+ if (typeof value !== "string") {
6
+ return null;
7
+ }
8
+ const normalized = value.trim().toLowerCase();
9
+ if (normalized === "sandbox" || normalized === "production") {
10
+ return normalized;
11
+ }
12
+ return null;
13
+ }
14
+ export function registerNodesPushCommand(nodes) {
15
+ nodesCallOpts(nodes
16
+ .command("push")
17
+ .description("Send an APNs test push to an iOS node")
18
+ .requiredOption("--node <idOrNameOrIp>", "Node id, name, or IP")
19
+ .option("--title <text>", "Push title", "Pool Bot")
20
+ .option("--body <text>", "Push body")
21
+ .option("--environment <sandbox|production>", "Override APNs environment")
22
+ .action(async (opts) => {
23
+ await runNodesCommand("push", async () => {
24
+ const nodeId = await resolveNodeId(opts, String(opts.node ?? ""));
25
+ const title = String(opts.title ?? "").trim() || "Pool Bot";
26
+ const body = String(opts.body ?? "").trim() || `Push test for node ${nodeId}`;
27
+ const environment = normalizeEnvironment(opts.environment);
28
+ if (opts.environment && !environment) {
29
+ throw new Error("invalid --environment (use sandbox|production)");
30
+ }
31
+ const params = {
32
+ nodeId,
33
+ title,
34
+ body,
35
+ };
36
+ if (environment) {
37
+ params.environment = environment;
38
+ }
39
+ const result = await callGatewayCli("push.test", opts, params);
40
+ if (opts.json) {
41
+ defaultRuntime.log(JSON.stringify(result, null, 2));
42
+ return;
43
+ }
44
+ const parsed = typeof result === "object" && result !== null
45
+ ? result
46
+ : {};
47
+ const ok = parsed.ok === true;
48
+ const status = typeof parsed.status === "number" ? parsed.status : 0;
49
+ const reason = typeof parsed.reason === "string" && parsed.reason.trim().length > 0
50
+ ? parsed.reason.trim()
51
+ : undefined;
52
+ const env = typeof parsed.environment === "string" && parsed.environment.trim().length > 0
53
+ ? parsed.environment.trim()
54
+ : "unknown";
55
+ const { ok: okLabel, error: errorLabel } = getNodesTheme();
56
+ const label = ok ? okLabel : errorLabel;
57
+ defaultRuntime.log(label(`push.test status=${status} ok=${ok} env=${env}`));
58
+ if (reason) {
59
+ defaultRuntime.log(`reason: ${reason}`);
60
+ }
61
+ });
62
+ }), { timeoutMs: 25_000 });
63
+ }
@@ -0,0 +1,26 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import fs from "node:fs";
3
+ import { resolvePreferredPoolbotTmpDir } from "../infra/tmp-poolbot-dir.js";
4
+ export function asRecord(value) {
5
+ return typeof value === "object" && value !== null ? value : {};
6
+ }
7
+ export function asString(value) {
8
+ return typeof value === "string" ? value : undefined;
9
+ }
10
+ export function asNumber(value) {
11
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
12
+ }
13
+ export function asBoolean(value) {
14
+ return typeof value === "boolean" ? value : undefined;
15
+ }
16
+ export function resolveTempPathParts(opts) {
17
+ const tmpDir = opts.tmpDir ?? resolvePreferredPoolbotTmpDir();
18
+ if (!opts.tmpDir) {
19
+ fs.mkdirSync(tmpDir, { recursive: true, mode: 0o700 });
20
+ }
21
+ return {
22
+ tmpDir,
23
+ id: opts.id ?? randomUUID(),
24
+ ext: opts.ext.startsWith(".") ? opts.ext : `.${opts.ext}`,
25
+ };
26
+ }
@@ -1,11 +1,4 @@
1
- // Provider docking: extend this mapping when adding new outbound send deps.
1
+ import { createOutboundSendDepsFromCliSource, } from "./outbound-send-mapping.js";
2
2
  export function createOutboundSendDeps(deps) {
3
- return {
4
- sendWhatsApp: deps.sendMessageWhatsApp,
5
- sendTelegram: deps.sendMessageTelegram,
6
- sendDiscord: deps.sendMessageDiscord,
7
- sendSlack: deps.sendMessageSlack,
8
- sendSignal: deps.sendMessageSignal,
9
- sendIMessage: deps.sendMessageIMessage,
10
- };
3
+ return createOutboundSendDepsFromCliSource(deps);
11
4
  }
@@ -0,0 +1,11 @@
1
+ // Provider docking: extend this mapping when adding new outbound send deps.
2
+ export function createOutboundSendDepsFromCliSource(deps) {
3
+ return {
4
+ sendWhatsApp: deps.sendMessageWhatsApp,
5
+ sendTelegram: deps.sendMessageTelegram,
6
+ sendDiscord: deps.sendMessageDiscord,
7
+ sendSlack: deps.sendMessageSlack,
8
+ sendSignal: deps.sendMessageSignal,
9
+ sendIMessage: deps.sendMessageIMessage,
10
+ };
11
+ }