@poolzin/pool-bot 2026.1.39 → 2026.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (511) hide show
  1. package/assets/chrome-extension/README.md +3 -3
  2. package/assets/chrome-extension/background.js +5 -5
  3. package/assets/chrome-extension/manifest.json +3 -3
  4. package/assets/chrome-extension/options.html +4 -4
  5. package/assets/chrome-extension/options.js +1 -1
  6. package/dist/acp/client.js +3 -3
  7. package/dist/acp/types.js +1 -1
  8. package/dist/agents/agent-paths.js +3 -3
  9. package/dist/agents/auth-profiles/paths.js +3 -3
  10. package/dist/agents/bash-tools.exec.js +76 -25
  11. package/dist/agents/cli-runner/helpers.js +10 -12
  12. package/dist/agents/cli-runner.js +2 -2
  13. package/dist/agents/cloudflare-ai-gateway.js +31 -0
  14. package/dist/agents/compaction.js +16 -2
  15. package/dist/agents/context-window-guard.js +13 -10
  16. package/dist/agents/context.js +4 -4
  17. package/dist/agents/docs-path.js +1 -1
  18. package/dist/agents/identity.js +47 -7
  19. package/dist/agents/memory-search.js +25 -8
  20. package/dist/agents/minimax-vlm.js +1 -1
  21. package/dist/agents/model-auth.js +12 -1
  22. package/dist/agents/model-catalog.js +4 -4
  23. package/dist/agents/model-selection.js +31 -4
  24. package/dist/agents/models-config.js +3 -3
  25. package/dist/agents/models-config.providers.js +147 -39
  26. package/dist/agents/pi-embedded-block-chunker.js +117 -42
  27. package/dist/agents/pi-embedded-helpers/errors.js +183 -78
  28. package/dist/agents/pi-embedded-helpers/openai.js +1 -1
  29. package/dist/agents/pi-embedded-helpers.js +1 -1
  30. package/dist/agents/pi-embedded-runner/compact.js +9 -8
  31. package/dist/agents/pi-embedded-runner/model.js +63 -4
  32. package/dist/agents/pi-embedded-runner/run/attempt.js +27 -17
  33. package/dist/agents/pi-embedded-runner/run.js +203 -50
  34. package/dist/agents/pi-embedded-runner/system-prompt.js +10 -2
  35. package/dist/agents/pi-embedded-runner/tool-result-truncation.js +275 -0
  36. package/dist/agents/pi-embedded-runner/utils.js +1 -1
  37. package/dist/agents/pi-embedded-subscribe.js +118 -29
  38. package/dist/agents/pi-model-discovery.js +10 -0
  39. package/dist/agents/pi-tool-definition-adapter.js +50 -9
  40. package/dist/agents/pi-tools.before-tool-call.js +67 -0
  41. package/dist/agents/pi-tools.js +20 -10
  42. package/dist/agents/pi-tools.read.js +2 -2
  43. package/dist/agents/poolbot-tools.js +15 -10
  44. package/dist/agents/sandbox-paths.js +31 -0
  45. package/dist/agents/session-file-repair.js +83 -0
  46. package/dist/agents/session-tool-result-guard.js +94 -15
  47. package/dist/agents/session-transcript-repair.js +68 -0
  48. package/dist/agents/shell-utils.js +51 -0
  49. package/dist/agents/skills/bundled-context.js +23 -0
  50. package/dist/agents/skills/bundled-dir.js +41 -7
  51. package/dist/agents/skills/frontmatter.js +1 -1
  52. package/dist/agents/skills/workspace.js +2 -2
  53. package/dist/agents/skills-install.js +60 -23
  54. package/dist/agents/subagent-announce.js +79 -34
  55. package/dist/agents/system-prompt.js +28 -4
  56. package/dist/agents/together-models.js +127 -0
  57. package/dist/agents/tool-images.js +1 -1
  58. package/dist/agents/tool-policy.conformance.js +14 -0
  59. package/dist/agents/tool-policy.js +25 -1
  60. package/dist/agents/tools/browser-tool.js +3 -3
  61. package/dist/agents/tools/cron-tool.js +166 -19
  62. package/dist/agents/tools/discord-actions-presence.js +78 -0
  63. package/dist/agents/tools/image-tool.js +2 -2
  64. package/dist/agents/tools/memory-tool.js +93 -5
  65. package/dist/agents/tools/message-tool.js +56 -2
  66. package/dist/agents/tools/sessions-history-tool.js +69 -1
  67. package/dist/agents/tools/web-search.js +211 -42
  68. package/dist/agents/usage.js +23 -1
  69. package/dist/agents/workspace-run.js +67 -0
  70. package/dist/agents/workspace-templates.js +44 -0
  71. package/dist/auto-reply/command-auth.js +121 -6
  72. package/dist/auto-reply/commands-registry.data.js +1 -1
  73. package/dist/auto-reply/envelope.js +50 -72
  74. package/dist/auto-reply/reply/commands-compact.js +1 -0
  75. package/dist/auto-reply/reply/commands-context-report.js +3 -2
  76. package/dist/auto-reply/reply/commands-context.js +1 -0
  77. package/dist/auto-reply/reply/commands-models.js +107 -60
  78. package/dist/auto-reply/reply/commands-ptt.js +171 -0
  79. package/dist/auto-reply/reply/commands-session.js +2 -2
  80. package/dist/auto-reply/reply/get-reply-run.js +16 -5
  81. package/dist/auto-reply/reply/groups.js +1 -1
  82. package/dist/auto-reply/reply/inbound-context.js +9 -1
  83. package/dist/auto-reply/reply/inbound-meta.js +130 -0
  84. package/dist/auto-reply/reply/model-selection.js +3 -3
  85. package/dist/auto-reply/reply/untrusted-context.js +15 -0
  86. package/dist/auto-reply/status.js +1 -1
  87. package/dist/auto-reply/thinking.js +88 -43
  88. package/dist/browser/bridge-server.js +13 -0
  89. package/dist/browser/cdp.helpers.js +38 -24
  90. package/dist/browser/client-fetch.js +51 -8
  91. package/dist/browser/config.js +2 -11
  92. package/dist/browser/extension-relay.js +104 -43
  93. package/dist/browser/pw-ai.js +1 -1
  94. package/dist/browser/pw-session.js +143 -8
  95. package/dist/browser/pw-tools-core.interactions.js +125 -27
  96. package/dist/browser/pw-tools-core.responses.js +1 -1
  97. package/dist/browser/pw-tools-core.state.js +1 -1
  98. package/dist/browser/routes/agent.act.js +86 -41
  99. package/dist/browser/routes/dispatcher.js +4 -4
  100. package/dist/browser/screenshot.js +1 -1
  101. package/dist/browser/server-context.js +2 -2
  102. package/dist/browser/server.js +13 -0
  103. package/dist/build-info.json +3 -3
  104. package/dist/canvas-host/a2ui.js +3 -3
  105. package/dist/channels/plugins/catalog.js +2 -2
  106. package/dist/channels/plugins/onboarding/imessage.js +1 -1
  107. package/dist/channels/plugins/onboarding/signal.js +1 -1
  108. package/dist/channels/plugins/onboarding/slack.js +4 -4
  109. package/dist/channels/plugins/onboarding/whatsapp.js +3 -3
  110. package/dist/channels/plugins/pairing-message.js +1 -1
  111. package/dist/channels/reply-prefix.js +8 -1
  112. package/dist/cli/browser-cli-extension.js +2 -2
  113. package/dist/cli/cron-cli/register.cron-add.js +61 -40
  114. package/dist/cli/cron-cli/register.cron-edit.js +60 -34
  115. package/dist/cli/cron-cli/shared.js +56 -41
  116. package/dist/cli/dns-cli.js +26 -14
  117. package/dist/cli/docs-cli.js +1 -1
  118. package/dist/cli/gateway-cli/dev.js +1 -1
  119. package/dist/cli/gateway-cli/register.js +37 -19
  120. package/dist/cli/memory-cli.js +30 -20
  121. package/dist/cli/nodes-cli/register.canvas.js +1 -1
  122. package/dist/cli/parse-bytes.js +37 -0
  123. package/dist/cli/plugins-cli.js +1 -1
  124. package/dist/cli/run-main.js +2 -2
  125. package/dist/cli/security-cli.js +1 -1
  126. package/dist/cli/tagline.js +1 -1
  127. package/dist/cli/update-cli.js +173 -52
  128. package/dist/cli/webhooks-cli.js +5 -5
  129. package/dist/commands/agent.js +1 -0
  130. package/dist/commands/agents.commands.add.js +1 -1
  131. package/dist/commands/auth-choice.apply.api-providers.js +305 -17
  132. package/dist/commands/auth-choice.apply.js +4 -1
  133. package/dist/commands/auth-choice.apply.plugin-provider.js +2 -2
  134. package/dist/commands/auth-choice.apply.xai.js +63 -0
  135. package/dist/commands/auth-choice.preferred-provider.js +7 -1
  136. package/dist/commands/configure.wizard.js +1 -1
  137. package/dist/commands/dashboard.js +1 -1
  138. package/dist/commands/docs.js +1 -1
  139. package/dist/commands/doctor-config-flow.js +61 -5
  140. package/dist/commands/doctor-gateway-services.js +3 -3
  141. package/dist/commands/doctor-state-migrations.js +1 -1
  142. package/dist/commands/doctor-update.js +3 -3
  143. package/dist/commands/doctor.js +1 -1
  144. package/dist/commands/health.js +1 -1
  145. package/dist/commands/model-allowlist.js +29 -0
  146. package/dist/commands/model-picker.js +2 -1
  147. package/dist/commands/models/list.probe.js +2 -2
  148. package/dist/commands/models/list.registry.js +4 -4
  149. package/dist/commands/models/list.status-command.js +44 -24
  150. package/dist/commands/models/shared.js +15 -0
  151. package/dist/commands/onboard-auth.config-core.js +366 -28
  152. package/dist/commands/onboard-auth.credentials.js +71 -9
  153. package/dist/commands/onboard-auth.js +3 -3
  154. package/dist/commands/onboard-auth.models.js +26 -24
  155. package/dist/commands/onboard-custom.js +384 -0
  156. package/dist/commands/onboard-non-interactive/local/auth-choice-inference.js +35 -0
  157. package/dist/commands/onboard-non-interactive/local/auth-choice.js +146 -9
  158. package/dist/commands/onboard-skills.js +63 -38
  159. package/dist/commands/openai-model-default.js +41 -0
  160. package/dist/commands/status-all/report-lines.js +1 -1
  161. package/dist/commands/status.command.js +1 -1
  162. package/dist/commands/uninstall.js +3 -3
  163. package/dist/compat/legacy-names.js +1 -1
  164. package/dist/config/defaults.js +3 -2
  165. package/dist/config/io.js +3 -3
  166. package/dist/config/paths.js +136 -35
  167. package/dist/config/plugin-auto-enable.js +21 -5
  168. package/dist/config/redact-snapshot.js +153 -0
  169. package/dist/config/schema.field-metadata.js +590 -0
  170. package/dist/config/schema.js +3 -3
  171. package/dist/config/sessions/store.js +291 -23
  172. package/dist/config/types.memory.js +1 -0
  173. package/dist/config/version.js +4 -4
  174. package/dist/config/zod-schema.agent-defaults.js +3 -0
  175. package/dist/config/zod-schema.agent-runtime.js +13 -2
  176. package/dist/config/zod-schema.providers-core.js +142 -0
  177. package/dist/config/zod-schema.session.js +3 -0
  178. package/dist/cron/delivery.js +57 -0
  179. package/dist/cron/isolated-agent/delivery-target.js +18 -3
  180. package/dist/cron/isolated-agent/helpers.js +22 -5
  181. package/dist/cron/isolated-agent/run.js +171 -63
  182. package/dist/cron/isolated-agent/session.js +2 -0
  183. package/dist/cron/normalize.js +356 -28
  184. package/dist/cron/parse.js +10 -5
  185. package/dist/cron/run-log.js +35 -10
  186. package/dist/cron/schedule.js +41 -6
  187. package/dist/cron/service/jobs.js +208 -35
  188. package/dist/cron/service/ops.js +72 -16
  189. package/dist/cron/service/state.js +2 -0
  190. package/dist/cron/service/store.js +386 -14
  191. package/dist/cron/service/timer.js +390 -147
  192. package/dist/cron/session-reaper.js +86 -0
  193. package/dist/cron/store.js +23 -8
  194. package/dist/cron/validate-timestamp.js +43 -0
  195. package/dist/daemon/constants.js +7 -7
  196. package/dist/daemon/inspect.js +6 -6
  197. package/dist/daemon/systemd-unit.js +1 -1
  198. package/dist/discord/monitor/agent-components.js +438 -0
  199. package/dist/discord/monitor/allow-list.js +28 -5
  200. package/dist/discord/monitor/gateway-registry.js +29 -0
  201. package/dist/discord/monitor/native-command.js +44 -23
  202. package/dist/discord/monitor/sender-identity.js +45 -0
  203. package/dist/discord/pluralkit.js +27 -0
  204. package/dist/discord/send.outbound.js +92 -5
  205. package/dist/discord/send.shared.js +60 -23
  206. package/dist/discord/targets.js +84 -1
  207. package/dist/entry.js +15 -9
  208. package/dist/extensionAPI.js +8 -0
  209. package/dist/gateway/control-ui.js +8 -1
  210. package/dist/gateway/hooks-mapping.js +3 -0
  211. package/dist/gateway/hooks.js +65 -0
  212. package/dist/gateway/live-image-probe.js +1 -66
  213. package/dist/gateway/net.js +96 -31
  214. package/dist/gateway/node-command-policy.js +50 -15
  215. package/dist/gateway/openai-http.js +2 -2
  216. package/dist/gateway/openresponses-http.js +4 -4
  217. package/dist/gateway/origin-check.js +56 -0
  218. package/dist/gateway/protocol/client-info.js +9 -0
  219. package/dist/gateway/protocol/index.js +9 -2
  220. package/dist/gateway/protocol/schema/agents-models-skills.js +71 -1
  221. package/dist/gateway/protocol/schema/cron.js +22 -10
  222. package/dist/gateway/protocol/schema/protocol-schemas.js +16 -2
  223. package/dist/gateway/protocol/schema/sessions.js +12 -0
  224. package/dist/gateway/server/hooks.js +1 -1
  225. package/dist/gateway/server-broadcast.js +26 -9
  226. package/dist/gateway/server-chat.js +112 -23
  227. package/dist/gateway/server-discovery-runtime.js +10 -2
  228. package/dist/gateway/server-discovery.js +2 -2
  229. package/dist/gateway/server-http.js +110 -12
  230. package/dist/gateway/server-methods/agent-timestamp.js +60 -0
  231. package/dist/gateway/server-methods/agents.js +321 -2
  232. package/dist/gateway/server-methods/usage.js +559 -16
  233. package/dist/gateway/server-runtime-state.js +22 -8
  234. package/dist/gateway/server-startup-memory.js +16 -0
  235. package/dist/gateway/server.impl.js +7 -3
  236. package/dist/gateway/session-utils.fs.js +23 -25
  237. package/dist/gateway/session-utils.js +20 -10
  238. package/dist/gateway/sessions-patch.js +7 -22
  239. package/dist/gateway/test-helpers.server.js +35 -2
  240. package/dist/hooks/frontmatter.js +1 -1
  241. package/dist/hooks/hooks-status.js +1 -1
  242. package/dist/hooks/install.js +2 -2
  243. package/dist/hooks/loader.js +1 -1
  244. package/dist/hooks/workspace.js +3 -3
  245. package/dist/imessage/constants.js +2 -0
  246. package/dist/imessage/monitor/deliver.js +4 -1
  247. package/dist/imessage/monitor/monitor-provider.js +51 -1
  248. package/dist/index.js +2 -2
  249. package/dist/infra/bonjour-discovery.js +131 -70
  250. package/dist/infra/bonjour.js +3 -3
  251. package/dist/infra/control-ui-assets.js +134 -12
  252. package/dist/infra/errors.js +12 -0
  253. package/dist/infra/exec-approvals.js +266 -57
  254. package/dist/infra/format-time/format-datetime.js +79 -0
  255. package/dist/infra/format-time/format-duration.js +81 -0
  256. package/dist/infra/format-time/format-relative.js +80 -0
  257. package/dist/infra/heartbeat-runner.js +140 -49
  258. package/dist/infra/home-dir.js +54 -0
  259. package/dist/infra/net/fetch-guard.js +122 -0
  260. package/dist/infra/net/ssrf.js +65 -29
  261. package/dist/infra/outbound/abort.js +14 -0
  262. package/dist/infra/outbound/message-action-runner.js +77 -13
  263. package/dist/infra/outbound/outbound-session.js +143 -37
  264. package/dist/infra/path-env.js +3 -3
  265. package/dist/infra/poolbot-root.js +43 -1
  266. package/dist/infra/provider-usage.fetch.minimax.js +1 -1
  267. package/dist/infra/restart.js +1 -1
  268. package/dist/infra/session-cost-usage.js +631 -41
  269. package/dist/infra/state-migrations.js +317 -47
  270. package/dist/infra/tailscale.js +1 -1
  271. package/dist/infra/update-global.js +35 -0
  272. package/dist/infra/update-runner.js +149 -43
  273. package/dist/infra/warning-filter.js +65 -0
  274. package/dist/infra/widearea-dns.js +30 -9
  275. package/dist/logging/redact-identifier.js +12 -0
  276. package/dist/macos/relay.js +2 -2
  277. package/dist/media/fetch.js +81 -58
  278. package/dist/media/input-files.js +1 -1
  279. package/dist/media/mime.js +4 -0
  280. package/dist/media/png-encode.js +74 -0
  281. package/dist/media-understanding/apply.js +403 -3
  282. package/dist/media-understanding/attachments.js +38 -27
  283. package/dist/media-understanding/defaults.js +16 -0
  284. package/dist/media-understanding/providers/deepgram/audio.js +22 -14
  285. package/dist/media-understanding/providers/google/audio.js +24 -17
  286. package/dist/media-understanding/providers/google/video.js +24 -17
  287. package/dist/media-understanding/providers/image.js +4 -4
  288. package/dist/media-understanding/providers/index.js +4 -1
  289. package/dist/media-understanding/providers/openai/audio.js +22 -14
  290. package/dist/media-understanding/providers/shared.js +16 -11
  291. package/dist/media-understanding/providers/zai/index.js +6 -0
  292. package/dist/media-understanding/runner.js +158 -90
  293. package/dist/memory/backend-config.js +207 -0
  294. package/dist/memory/batch-voyage.js +277 -0
  295. package/dist/memory/embeddings-voyage.js +75 -0
  296. package/dist/memory/embeddings.js +29 -17
  297. package/dist/memory/internal.js +101 -18
  298. package/dist/memory/manager.js +155 -48
  299. package/dist/memory/search-manager.js +173 -0
  300. package/dist/memory/session-files.js +9 -3
  301. package/dist/memory/types.js +1 -0
  302. package/dist/node-host/runner.js +36 -26
  303. package/dist/node-host/with-timeout.js +27 -0
  304. package/dist/pairing/pairing-messages.js +1 -1
  305. package/dist/plugins/commands.js +5 -1
  306. package/dist/plugins/config-state.js +86 -7
  307. package/dist/plugins/discovery.js +1 -1
  308. package/dist/plugins/install.js +2 -2
  309. package/dist/plugins/source-display.js +51 -0
  310. package/dist/plugins/update.js +1 -1
  311. package/dist/process/exec.js +20 -2
  312. package/dist/routing/resolve-route.js +12 -0
  313. package/dist/routing/session-key.js +15 -0
  314. package/dist/runtime.js +2 -0
  315. package/dist/security/audit-extra.async.js +601 -0
  316. package/dist/security/audit-extra.js +2 -830
  317. package/dist/security/audit-extra.sync.js +505 -0
  318. package/dist/security/audit.js +2 -2
  319. package/dist/security/channel-metadata.js +34 -0
  320. package/dist/security/external-content.js +88 -6
  321. package/dist/security/skill-scanner.js +330 -0
  322. package/dist/sessions/session-key-utils.js +7 -0
  323. package/dist/shared/text/reasoning-tags.js +52 -7
  324. package/dist/signal/monitor/event-handler.js +80 -1
  325. package/dist/slack/monitor/media.js +85 -15
  326. package/dist/tailscale/detect.js +145 -0
  327. package/dist/telegram/bot/helpers.js +109 -28
  328. package/dist/telegram/bot-handlers.js +144 -3
  329. package/dist/telegram/bot-message-context.js +38 -11
  330. package/dist/telegram/bot-message-dispatch.js +48 -15
  331. package/dist/telegram/bot-native-commands.js +86 -29
  332. package/dist/telegram/bot.js +30 -29
  333. package/dist/telegram/model-buttons.js +163 -0
  334. package/dist/telegram/monitor.js +110 -85
  335. package/dist/telegram/send.js +129 -47
  336. package/dist/terminal/restore.js +45 -0
  337. package/dist/test-helpers/state-dir-env.js +16 -0
  338. package/dist/test-helpers/workspace.js +11 -0
  339. package/dist/test-utils/channel-plugins.js +82 -0
  340. package/dist/test-utils/ports.js +73 -0
  341. package/dist/tts/tts.js +12 -6
  342. package/dist/tui/tui-session-actions.js +166 -54
  343. package/dist/utils/fetch-timeout.js +20 -0
  344. package/dist/utils/normalize-secret-input.js +19 -0
  345. package/dist/utils/shell-argv.js +61 -0
  346. package/dist/utils/transcript-tools.js +58 -0
  347. package/dist/utils.js +55 -14
  348. package/dist/version.js +42 -5
  349. package/dist/web/qr-image.js +1 -61
  350. package/dist/wizard/onboarding.finalize.js +7 -7
  351. package/dist/wizard/onboarding.js +3 -3
  352. package/docs/RELEASE_WORKFOTS_COMPARISON.md +3 -3
  353. package/docs/_config.yml +2 -2
  354. package/docs/_layouts/default.html +9 -9
  355. package/docs/concepts/typebox.md +1 -1
  356. package/docs/docs.json +1 -1
  357. package/docs/northflank.mdx +7 -7
  358. package/docs/railway.mdx +3 -3
  359. package/docs/render.mdx +5 -5
  360. package/docs/start/lore.md +2 -2
  361. package/extensions/bluebubbles/index.ts +2 -2
  362. package/extensions/bluebubbles/package.json +1 -1
  363. package/extensions/bluebubbles/src/accounts.ts +8 -8
  364. package/extensions/bluebubbles/src/actions.test.ts +22 -22
  365. package/extensions/bluebubbles/src/actions.ts +5 -5
  366. package/extensions/bluebubbles/src/attachments.ts +2 -2
  367. package/extensions/bluebubbles/src/channel.ts +16 -16
  368. package/extensions/bluebubbles/src/chat.ts +2 -2
  369. package/extensions/bluebubbles/src/media-send.ts +2 -2
  370. package/extensions/bluebubbles/src/monitor.test.ts +46 -46
  371. package/extensions/bluebubbles/src/monitor.ts +5 -5
  372. package/extensions/bluebubbles/src/onboarding.ts +7 -7
  373. package/extensions/bluebubbles/src/reactions.ts +2 -2
  374. package/extensions/bluebubbles/src/send.ts +2 -2
  375. package/extensions/copilot-proxy/README.md +1 -1
  376. package/extensions/copilot-proxy/package.json +1 -1
  377. package/extensions/diagnostics-otel/index.ts +2 -2
  378. package/extensions/diagnostics-otel/package.json +1 -1
  379. package/extensions/diagnostics-otel/src/service.ts +3 -3
  380. package/extensions/discord/index.ts +2 -2
  381. package/extensions/discord/package.json +1 -1
  382. package/extensions/google-antigravity-auth/README.md +1 -1
  383. package/extensions/google-antigravity-auth/index.ts +1 -1
  384. package/extensions/google-antigravity-auth/package.json +1 -1
  385. package/extensions/google-gemini-cli-auth/README.md +1 -1
  386. package/extensions/google-gemini-cli-auth/oauth.ts +1 -1
  387. package/extensions/google-gemini-cli-auth/package.json +1 -1
  388. package/extensions/googlechat/index.ts +3 -3
  389. package/extensions/googlechat/package.json +1 -1
  390. package/extensions/googlechat/src/accounts.ts +8 -8
  391. package/extensions/googlechat/src/actions.ts +6 -6
  392. package/extensions/googlechat/src/channel.ts +21 -21
  393. package/extensions/googlechat/src/monitor.ts +8 -8
  394. package/extensions/googlechat/src/onboarding.ts +10 -10
  395. package/extensions/imessage/index.ts +2 -2
  396. package/extensions/imessage/package.json +1 -1
  397. package/extensions/line/index.ts +2 -2
  398. package/extensions/line/package.json +1 -1
  399. package/extensions/line/src/card-command.ts +2 -2
  400. package/extensions/line/src/channel.logout.test.ts +4 -4
  401. package/extensions/line/src/channel.sendPayload.test.ts +8 -8
  402. package/extensions/line/src/channel.ts +3 -3
  403. package/extensions/llm-task/README.md +3 -3
  404. package/extensions/llm-task/index.ts +2 -2
  405. package/extensions/llm-task/package.json +1 -1
  406. package/extensions/llm-task/src/llm-task-tool.ts +4 -4
  407. package/extensions/lobster/README.md +6 -6
  408. package/extensions/lobster/index.ts +2 -2
  409. package/extensions/lobster/src/lobster-tool.test.ts +4 -4
  410. package/extensions/lobster/src/lobster-tool.ts +2 -2
  411. package/extensions/matrix/index.ts +2 -2
  412. package/extensions/matrix/package.json +1 -1
  413. package/extensions/matrix/src/matrix/client/config.ts +1 -1
  414. package/extensions/matrix/src/matrix/monitor/handler.ts +1 -1
  415. package/extensions/matrix/src/onboarding.ts +1 -1
  416. package/extensions/mattermost/index.ts +2 -2
  417. package/extensions/mattermost/package.json +1 -1
  418. package/extensions/mattermost/src/mattermost/accounts.ts +8 -8
  419. package/extensions/mattermost/src/mattermost/monitor-helpers.ts +5 -5
  420. package/extensions/mattermost/src/mattermost/monitor.ts +2 -2
  421. package/extensions/mattermost/src/onboarding-helpers.ts +3 -3
  422. package/extensions/mattermost/src/onboarding.ts +2 -2
  423. package/extensions/memory-core/index.ts +2 -2
  424. package/extensions/memory-core/package.json +1 -1
  425. package/extensions/memory-lancedb/index.ts +3 -3
  426. package/extensions/memory-lancedb/package.json +1 -1
  427. package/extensions/msteams/index.ts +2 -2
  428. package/extensions/msteams/package.json +1 -1
  429. package/extensions/msteams/src/channel.directory.test.ts +2 -2
  430. package/extensions/msteams/src/channel.ts +2 -2
  431. package/extensions/msteams/src/graph-upload.ts +4 -4
  432. package/extensions/msteams/src/monitor-handler.ts +2 -2
  433. package/extensions/msteams/src/monitor.ts +2 -2
  434. package/extensions/msteams/src/onboarding.ts +9 -9
  435. package/extensions/msteams/src/reply-dispatcher.ts +2 -2
  436. package/extensions/msteams/src/send-context.ts +2 -2
  437. package/extensions/msteams/src/send.ts +4 -4
  438. package/extensions/nextcloud-talk/index.ts +2 -2
  439. package/extensions/nextcloud-talk/package.json +1 -1
  440. package/extensions/nextcloud-talk/src/channel.ts +7 -7
  441. package/extensions/nextcloud-talk/src/inbound.ts +7 -7
  442. package/extensions/nextcloud-talk/src/onboarding.ts +1 -1
  443. package/extensions/nostr/README.md +2 -2
  444. package/extensions/nostr/index.ts +5 -5
  445. package/extensions/nostr/package.json +1 -1
  446. package/extensions/nostr/src/types.ts +4 -4
  447. package/extensions/open-prose/index.ts +2 -2
  448. package/extensions/qwen-portal-auth/README.md +1 -1
  449. package/extensions/signal/index.ts +2 -2
  450. package/extensions/signal/package.json +1 -1
  451. package/extensions/slack/index.ts +2 -2
  452. package/extensions/slack/package.json +1 -1
  453. package/extensions/telegram/index.ts +2 -2
  454. package/extensions/telegram/package.json +1 -1
  455. package/extensions/telegram/src/channel.ts +2 -2
  456. package/extensions/tlon/README.md +2 -2
  457. package/extensions/tlon/index.ts +2 -2
  458. package/extensions/tlon/package.json +1 -1
  459. package/extensions/tlon/src/channel.ts +13 -13
  460. package/extensions/tlon/src/monitor/index.ts +3 -3
  461. package/extensions/tlon/src/onboarding.ts +3 -3
  462. package/extensions/tlon/src/types.ts +3 -3
  463. package/extensions/twitch/README.md +1 -1
  464. package/extensions/twitch/index.ts +2 -2
  465. package/extensions/twitch/package.json +1 -1
  466. package/extensions/twitch/src/config.ts +3 -3
  467. package/extensions/twitch/src/monitor.ts +3 -3
  468. package/extensions/twitch/src/onboarding.ts +9 -9
  469. package/extensions/twitch/src/outbound.test.ts +2 -2
  470. package/extensions/twitch/src/plugin.test.ts +2 -2
  471. package/extensions/twitch/src/plugin.ts +8 -8
  472. package/extensions/twitch/src/send.test.ts +2 -2
  473. package/extensions/twitch/src/send.ts +4 -4
  474. package/extensions/twitch/src/token.test.ts +8 -8
  475. package/extensions/twitch/src/token.ts +3 -3
  476. package/extensions/twitch/src/twitch-client.ts +3 -3
  477. package/extensions/twitch/src/types.ts +3 -3
  478. package/extensions/twitch/src/utils/markdown.ts +1 -1
  479. package/extensions/voice-call/README.md +3 -3
  480. package/extensions/voice-call/package.json +1 -1
  481. package/extensions/voice-call/src/core-bridge.ts +2 -2
  482. package/extensions/voice-call/src/response-generator.ts +1 -1
  483. package/extensions/whatsapp/index.ts +2 -2
  484. package/extensions/whatsapp/package.json +1 -1
  485. package/extensions/zalo/README.md +1 -1
  486. package/extensions/zalo/index.ts +2 -2
  487. package/extensions/zalo/package.json +1 -1
  488. package/extensions/zalo/src/accounts.ts +8 -8
  489. package/extensions/zalo/src/actions.ts +4 -4
  490. package/extensions/zalo/src/channel.directory.test.ts +2 -2
  491. package/extensions/zalo/src/channel.ts +18 -18
  492. package/extensions/zalo/src/monitor.ts +9 -9
  493. package/extensions/zalo/src/monitor.webhook.test.ts +2 -2
  494. package/extensions/zalo/src/onboarding.ts +24 -24
  495. package/extensions/zalo/src/send.ts +2 -2
  496. package/extensions/zalouser/README.md +2 -2
  497. package/extensions/zalouser/index.ts +2 -2
  498. package/extensions/zalouser/package.json +1 -1
  499. package/extensions/zalouser/src/accounts.ts +9 -9
  500. package/extensions/zalouser/src/channel.ts +24 -24
  501. package/extensions/zalouser/src/monitor.ts +4 -4
  502. package/extensions/zalouser/src/onboarding.ts +28 -28
  503. package/package.json +13 -251
  504. package/skills/nano-banana-pro/scripts/generate_image.py +1 -1
  505. package/skills/tmux/scripts/find-sessions.sh +1 -1
  506. package/CHANGELOG.md +0 -102
  507. package/README-header.png +0 -0
  508. package/git-hooks/pre-commit +0 -4
  509. package/scripts/format-staged.js +0 -148
  510. package/scripts/postinstall.js +0 -300
  511. package/scripts/setup-git-hooks.js +0 -96
@@ -128,7 +128,7 @@ function resolveInstallInfo(params) {
128
128
  };
129
129
  }
130
130
  function buildCatalogEntry(candidate) {
131
- const manifest = candidate.packageMoltbot;
131
+ const manifest = candidate.packagePoolbot;
132
132
  if (!manifest?.channel)
133
133
  return null;
134
134
  const id = manifest.channel.id?.trim();
@@ -151,7 +151,7 @@ function buildExternalCatalogEntry(entry) {
151
151
  const manifest = entry.poolbot ?? entry[LEGACY_MANIFEST_KEY];
152
152
  return buildCatalogEntry({
153
153
  packageName: entry.name,
154
- packageMoltbot: manifest,
154
+ packagePoolbot: manifest,
155
155
  });
156
156
  }
157
157
  export function buildChannelUiCatalog(plugins) {
@@ -213,7 +213,7 @@ export const imessageOnboardingAdapter = {
213
213
  }
214
214
  await prompter.note([
215
215
  "This is still a work in progress.",
216
- "Ensure Moltbot has Full Disk Access to Messages DB.",
216
+ "Ensure Poolbot has Full Disk Access to Messages DB.",
217
217
  "Grant Automation permission for Messages when prompted.",
218
218
  "List chats with: imsg chats --limit 20",
219
219
  `Docs: ${formatDocsLink("/imessage", "imessage")}`,
@@ -244,7 +244,7 @@ export const signalOnboardingAdapter = {
244
244
  }
245
245
  }
246
246
  await prompter.note([
247
- 'Link device with: signal-cli link -n "Moltbot"',
247
+ 'Link device with: signal-cli link -n "Poolbot"',
248
248
  "Scan QR in Signal → Linked Devices",
249
249
  `Then run: ${formatCliCommand("poolbot gateway call channels.status --params '{\"probe\":true}'")}`,
250
250
  `Docs: ${formatDocsLink("/signal", "signal")}`,
@@ -25,11 +25,11 @@ function setSlackDmPolicy(cfg, dmPolicy) {
25
25
  };
26
26
  }
27
27
  function buildSlackManifest(botName) {
28
- const safeName = botName.trim() || "Moltbot";
28
+ const safeName = botName.trim() || "Poolbot";
29
29
  const manifest = {
30
30
  display_information: {
31
31
  name: safeName,
32
- description: `${safeName} connector for Moltbot`,
32
+ description: `${safeName} connector for Poolbot`,
33
33
  },
34
34
  features: {
35
35
  bot_user: {
@@ -43,7 +43,7 @@ function buildSlackManifest(botName) {
43
43
  slash_commands: [
44
44
  {
45
45
  command: "/clawd",
46
- description: "Send a message to Moltbot",
46
+ description: "Send a message to Poolbot",
47
47
  should_escape: false,
48
48
  },
49
49
  ],
@@ -312,7 +312,7 @@ export const slackOnboardingAdapter = {
312
312
  let appToken = null;
313
313
  const slackBotName = String(await prompter.text({
314
314
  message: "Slack bot display name (used for manifest)",
315
- initialValue: "Moltbot",
315
+ initialValue: "Poolbot",
316
316
  })).trim();
317
317
  if (!accountConfigured) {
318
318
  await noteSlackTokenHelp(prompter, slackBotName);
@@ -37,7 +37,7 @@ async function promptWhatsAppAllowFrom(cfg, _runtime, prompter, options) {
37
37
  const existingAllowFrom = cfg.channels?.whatsapp?.allowFrom ?? [];
38
38
  const existingLabel = existingAllowFrom.length > 0 ? existingAllowFrom.join(", ") : "unset";
39
39
  if (options?.forceAllowlist) {
40
- await prompter.note("We need the sender/owner number so Moltbot can allowlist you.", "WhatsApp number");
40
+ await prompter.note("We need the sender/owner number so Poolbot can allowlist you.", "WhatsApp number");
41
41
  const entry = await prompter.text({
42
42
  message: "Your personal WhatsApp number (the phone you will message from)",
43
43
  placeholder: "+15555550123",
@@ -81,11 +81,11 @@ async function promptWhatsAppAllowFrom(cfg, _runtime, prompter, options) {
81
81
  message: "WhatsApp phone setup",
82
82
  options: [
83
83
  { value: "personal", label: "This is my personal phone number" },
84
- { value: "separate", label: "Separate phone just for Moltbot" },
84
+ { value: "separate", label: "Separate phone just for Poolbot" },
85
85
  ],
86
86
  }));
87
87
  if (phoneMode === "personal") {
88
- await prompter.note("We need the sender/owner number so Moltbot can allowlist you.", "WhatsApp number");
88
+ await prompter.note("We need the sender/owner number so Poolbot can allowlist you.", "WhatsApp number");
89
89
  const entry = await prompter.text({
90
90
  message: "Your personal WhatsApp number (the phone you will message from)",
91
91
  placeholder: "+15555550123",
@@ -1 +1 @@
1
- export const PAIRING_APPROVED_MESSAGE = "✅ Moltbot access approved. Send a message to start chatting.";
1
+ export const PAIRING_APPROVED_MESSAGE = "✅ Poolbot access approved. Send a message to start chatting.";
@@ -14,8 +14,15 @@ export function createReplyPrefixContext(params) {
14
14
  };
15
15
  return {
16
16
  prefixContext,
17
- responsePrefix: resolveEffectiveMessagesConfig(cfg, agentId).responsePrefix,
17
+ responsePrefix: resolveEffectiveMessagesConfig(cfg, agentId, {
18
+ channel: params.channel,
19
+ accountId: params.accountId,
20
+ }).responsePrefix,
18
21
  responsePrefixContextProvider: () => prefixContext,
19
22
  onModelSelected,
20
23
  };
21
24
  }
25
+ export function createReplyPrefixOptions(params) {
26
+ const { responsePrefix, responsePrefixContextProvider, onModelSelected } = createReplyPrefixContext(params);
27
+ return { responsePrefix, responsePrefixContextProvider, onModelSelected };
28
+ }
@@ -23,7 +23,7 @@ function hasManifest(dir) {
23
23
  export async function installChromeExtension(opts) {
24
24
  const src = opts?.sourceDir ?? bundledExtensionRootDir();
25
25
  if (!hasManifest(src)) {
26
- throw new Error("Bundled Chrome extension is missing. Reinstall Moltbot and try again.");
26
+ throw new Error("Bundled Chrome extension is missing. Reinstall Poolbot and try again.");
27
27
  }
28
28
  const stateDir = opts?.stateDir ?? STATE_DIR;
29
29
  const dest = path.join(stateDir, "browser", "chrome-extension");
@@ -67,7 +67,7 @@ export function registerBrowserExtensionCommands(browser, parentOpts) {
67
67
  "Next:",
68
68
  `- Chrome → chrome://extensions → enable “Developer mode”`,
69
69
  `- “Load unpacked” → select: ${displayPath}`,
70
- `- Pin “Moltbot Browser Relay”, then click it on the tab (badge shows ON)`,
70
+ `- Pin “Poolbot Browser Relay”, then click it on the tab (badge shows ON)`,
71
71
  "",
72
72
  `${theme.muted("Docs:")} ${formatDocsLink("/tools/chrome-extension", "docs.molt.bot/tools/chrome-extension")}`,
73
73
  ].join("\n")));
@@ -1,9 +1,9 @@
1
1
  import { danger } from "../../globals.js";
2
- import { defaultRuntime } from "../../runtime.js";
3
2
  import { sanitizeAgentId } from "../../routing/session-key.js";
3
+ import { defaultRuntime } from "../../runtime.js";
4
4
  import { addGatewayClientOptions, callGatewayFromCli } from "../gateway-rpc.js";
5
5
  import { parsePositiveIntOrUndefined } from "../program/helpers.js";
6
- import { getCronChannelOptions, parseAtMs, parseDurationMs, printCronList, warnIfCronSchedulerDisabled, } from "./shared.js";
6
+ import { getCronChannelOptions, parseAt, parseDurationMs, printCronList, warnIfCronSchedulerDisabled, } from "./shared.js";
7
7
  export function registerCronStatusCommand(cron) {
8
8
  addGatewayClientOptions(cron
9
9
  .command("status")
@@ -53,9 +53,10 @@ export function registerCronAddCommand(cron) {
53
53
  .option("--description <text>", "Optional description")
54
54
  .option("--disabled", "Create job disabled", false)
55
55
  .option("--delete-after-run", "Delete one-shot job after it succeeds", false)
56
+ .option("--keep-after-run", "Keep one-shot job after it succeeds", false)
56
57
  .option("--agent <id>", "Agent id for this job")
57
- .option("--session <target>", "Session target (main|isolated)", "main")
58
- .option("--wake <mode>", "Wake mode (now|next-heartbeat)", "next-heartbeat")
58
+ .option("--session <target>", "Session target (main|isolated)")
59
+ .option("--wake <mode>", "Wake mode (now|next-heartbeat)", "now")
59
60
  .option("--at <when>", "Run once at time (ISO) or +duration (e.g. 20m)")
60
61
  .option("--every <duration>", "Run every duration (e.g. 10m, 1h)")
61
62
  .option("--cron <expr>", "Cron expression (5-field)")
@@ -65,15 +66,14 @@ export function registerCronAddCommand(cron) {
65
66
  .option("--thinking <level>", "Thinking level for agent jobs (off|minimal|low|medium|high)")
66
67
  .option("--model <model>", "Model override for agent jobs (provider/model or alias)")
67
68
  .option("--timeout-seconds <n>", "Timeout seconds for agent jobs")
68
- .option("--deliver", "Deliver agent output (required when using last-route delivery without --to)", false)
69
+ .option("--announce", "Announce summary to a chat (subagent-style)", false)
70
+ .option("--deliver", "Deprecated (use --announce). Announces a summary to a chat.")
71
+ .option("--no-deliver", "Disable announce delivery and skip main-session summary")
69
72
  .option("--channel <channel>", `Delivery channel (${getCronChannelOptions()})`, "last")
70
73
  .option("--to <dest>", "Delivery destination (E.164, Telegram chatId, or Discord channel/user)")
71
74
  .option("--best-effort-deliver", "Do not fail the job if delivery fails", false)
72
- .option("--post-prefix <prefix>", "Prefix for main-session post", "Cron")
73
- .option("--post-mode <mode>", "What to post back to main for isolated jobs (summary|full)", "summary")
74
- .option("--post-max-chars <n>", "Max chars when --post-mode=full (default 8000)", "8000")
75
75
  .option("--json", "Output JSON", false)
76
- .action(async (opts) => {
76
+ .action(async (opts, cmd) => {
77
77
  try {
78
78
  const schedule = (() => {
79
79
  const at = typeof opts.at === "string" ? opts.at : "";
@@ -84,15 +84,17 @@ export function registerCronAddCommand(cron) {
84
84
  throw new Error("Choose exactly one schedule: --at, --every, or --cron");
85
85
  }
86
86
  if (at) {
87
- const atMs = parseAtMs(at);
88
- if (!atMs)
87
+ const atIso = parseAt(at);
88
+ if (!atIso) {
89
89
  throw new Error("Invalid --at; use ISO time or duration like 20m");
90
- return { kind: "at", atMs };
90
+ }
91
+ return { kind: "at", at: atIso };
91
92
  }
92
93
  if (every) {
93
94
  const everyMs = parseDurationMs(every);
94
- if (!everyMs)
95
+ if (!everyMs) {
95
96
  throw new Error("Invalid --every; use e.g. 10m, 1h, 1d");
97
+ }
96
98
  return { kind: "every", everyMs };
97
99
  }
98
100
  return {
@@ -101,19 +103,20 @@ export function registerCronAddCommand(cron) {
101
103
  tz: typeof opts.tz === "string" && opts.tz.trim() ? opts.tz.trim() : undefined,
102
104
  };
103
105
  })();
104
- const sessionTargetRaw = typeof opts.session === "string" ? opts.session : "main";
105
- const sessionTarget = sessionTargetRaw.trim() || "main";
106
- if (sessionTarget !== "main" && sessionTarget !== "isolated") {
107
- throw new Error("--session must be main or isolated");
108
- }
109
- const wakeModeRaw = typeof opts.wake === "string" ? opts.wake : "next-heartbeat";
110
- const wakeMode = wakeModeRaw.trim() || "next-heartbeat";
106
+ const wakeModeRaw = typeof opts.wake === "string" ? opts.wake : "now";
107
+ const wakeMode = wakeModeRaw.trim() || "now";
111
108
  if (wakeMode !== "now" && wakeMode !== "next-heartbeat") {
112
109
  throw new Error("--wake must be now or next-heartbeat");
113
110
  }
114
111
  const agentId = typeof opts.agent === "string" && opts.agent.trim()
115
112
  ? sanitizeAgentId(opts.agent.trim())
116
113
  : undefined;
114
+ const hasAnnounce = Boolean(opts.announce) || opts.deliver === true;
115
+ const hasNoDeliver = opts.deliver === false;
116
+ const deliveryFlagCount = [hasAnnounce, hasNoDeliver].filter(Boolean).length;
117
+ if (deliveryFlagCount > 1) {
118
+ throw new Error("Choose at most one of --announce or --no-deliver");
119
+ }
117
120
  const payload = (() => {
118
121
  const systemEvent = typeof opts.systemEvent === "string" ? opts.systemEvent.trim() : "";
119
122
  const message = typeof opts.message === "string" ? opts.message.trim() : "";
@@ -121,8 +124,9 @@ export function registerCronAddCommand(cron) {
121
124
  if (chosen !== 1) {
122
125
  throw new Error("Choose exactly one payload: --system-event or --message");
123
126
  }
124
- if (systemEvent)
127
+ if (systemEvent) {
125
128
  return { kind: "systemEvent", text: systemEvent };
129
+ }
126
130
  const timeoutSeconds = parsePositiveIntOrUndefined(opts.timeoutSeconds);
127
131
  return {
128
132
  kind: "agentTurn",
@@ -132,35 +136,43 @@ export function registerCronAddCommand(cron) {
132
136
  ? opts.thinking.trim()
133
137
  : undefined,
134
138
  timeoutSeconds: timeoutSeconds && Number.isFinite(timeoutSeconds) ? timeoutSeconds : undefined,
135
- deliver: opts.deliver ? true : undefined,
136
- channel: typeof opts.channel === "string" ? opts.channel : "last",
137
- to: typeof opts.to === "string" && opts.to.trim() ? opts.to.trim() : undefined,
138
- bestEffortDeliver: opts.bestEffortDeliver ? true : undefined,
139
139
  };
140
140
  })();
141
+ const optionSource = typeof cmd?.getOptionValueSource === "function"
142
+ ? (name) => cmd.getOptionValueSource(name)
143
+ : () => undefined;
144
+ const sessionSource = optionSource("session");
145
+ const sessionTargetRaw = typeof opts.session === "string" ? opts.session.trim() : "";
146
+ const inferredSessionTarget = payload.kind === "agentTurn" ? "isolated" : "main";
147
+ const sessionTarget = sessionSource === "cli" ? sessionTargetRaw || "" : inferredSessionTarget;
148
+ if (sessionTarget !== "main" && sessionTarget !== "isolated") {
149
+ throw new Error("--session must be main or isolated");
150
+ }
151
+ if (opts.deleteAfterRun && opts.keepAfterRun) {
152
+ throw new Error("Choose --delete-after-run or --keep-after-run, not both");
153
+ }
141
154
  if (sessionTarget === "main" && payload.kind !== "systemEvent") {
142
155
  throw new Error("Main jobs require --system-event (systemEvent).");
143
156
  }
144
157
  if (sessionTarget === "isolated" && payload.kind !== "agentTurn") {
145
158
  throw new Error("Isolated jobs require --message (agentTurn).");
146
159
  }
147
- const isolation = sessionTarget === "isolated"
148
- ? {
149
- postToMainPrefix: typeof opts.postPrefix === "string" && opts.postPrefix.trim()
150
- ? opts.postPrefix.trim()
151
- : "Cron",
152
- postToMainMode: opts.postMode === "full" || opts.postMode === "summary"
153
- ? opts.postMode
154
- : undefined,
155
- postToMainMaxChars: typeof opts.postMaxChars === "string" && /^\d+$/.test(opts.postMaxChars)
156
- ? Number.parseInt(opts.postMaxChars, 10)
157
- : undefined,
158
- }
160
+ if ((opts.announce || typeof opts.deliver === "boolean") &&
161
+ (sessionTarget !== "isolated" || payload.kind !== "agentTurn")) {
162
+ throw new Error("--announce/--no-deliver require --session isolated.");
163
+ }
164
+ const deliveryMode = sessionTarget === "isolated" && payload.kind === "agentTurn"
165
+ ? hasAnnounce
166
+ ? "announce"
167
+ : hasNoDeliver
168
+ ? "none"
169
+ : "announce"
159
170
  : undefined;
160
171
  const nameRaw = typeof opts.name === "string" ? opts.name : "";
161
172
  const name = nameRaw.trim();
162
- if (!name)
173
+ if (!name) {
163
174
  throw new Error("--name is required");
175
+ }
164
176
  const description = typeof opts.description === "string" && opts.description.trim()
165
177
  ? opts.description.trim()
166
178
  : undefined;
@@ -168,13 +180,22 @@ export function registerCronAddCommand(cron) {
168
180
  name,
169
181
  description,
170
182
  enabled: !opts.disabled,
171
- deleteAfterRun: Boolean(opts.deleteAfterRun),
183
+ deleteAfterRun: opts.deleteAfterRun ? true : opts.keepAfterRun ? false : undefined,
172
184
  agentId,
173
185
  schedule,
174
186
  sessionTarget,
175
187
  wakeMode,
176
188
  payload,
177
- isolation,
189
+ delivery: deliveryMode
190
+ ? {
191
+ mode: deliveryMode,
192
+ channel: typeof opts.channel === "string" && opts.channel.trim()
193
+ ? opts.channel.trim()
194
+ : undefined,
195
+ to: typeof opts.to === "string" && opts.to.trim() ? opts.to.trim() : undefined,
196
+ bestEffort: opts.bestEffortDeliver ? true : undefined,
197
+ }
198
+ : undefined,
178
199
  };
179
200
  const res = await callGatewayFromCli("cron.add", opts, params);
180
201
  defaultRuntime.log(JSON.stringify(res, null, 2));
@@ -1,11 +1,12 @@
1
1
  import { danger } from "../../globals.js";
2
- import { defaultRuntime } from "../../runtime.js";
3
2
  import { sanitizeAgentId } from "../../routing/session-key.js";
3
+ import { defaultRuntime } from "../../runtime.js";
4
4
  import { addGatewayClientOptions, callGatewayFromCli } from "../gateway-rpc.js";
5
- import { getCronChannelOptions, parseAtMs, parseDurationMs, warnIfCronSchedulerDisabled, } from "./shared.js";
5
+ import { getCronChannelOptions, parseAt, parseDurationMs, warnIfCronSchedulerDisabled, } from "./shared.js";
6
6
  const assignIf = (target, key, value, shouldAssign) => {
7
- if (shouldAssign)
7
+ if (shouldAssign) {
8
8
  target[key] = value;
9
+ }
9
10
  };
10
11
  export function registerCronEditCommand(cron) {
11
12
  addGatewayClientOptions(cron
@@ -31,13 +32,13 @@ export function registerCronEditCommand(cron) {
31
32
  .option("--thinking <level>", "Thinking level for agent jobs")
32
33
  .option("--model <model>", "Model override for agent jobs")
33
34
  .option("--timeout-seconds <n>", "Timeout seconds for agent jobs")
34
- .option("--deliver", "Deliver agent output (required when using last-route delivery without --to)")
35
- .option("--no-deliver", "Disable delivery")
35
+ .option("--announce", "Announce summary to a chat (subagent-style)")
36
+ .option("--deliver", "Deprecated (use --announce). Announces a summary to a chat.")
37
+ .option("--no-deliver", "Disable announce delivery")
36
38
  .option("--channel <channel>", `Delivery channel (${getCronChannelOptions()})`)
37
39
  .option("--to <dest>", "Delivery destination (E.164, Telegram chatId, or Discord channel/user)")
38
40
  .option("--best-effort-deliver", "Do not fail job if delivery fails")
39
41
  .option("--no-best-effort-deliver", "Fail job when delivery fails")
40
- .option("--post-prefix <prefix>", "Prefix for summary system event")
41
42
  .action(async (id, opts) => {
42
43
  try {
43
44
  if (opts.session === "main" && opts.message) {
@@ -46,31 +47,40 @@ export function registerCronEditCommand(cron) {
46
47
  if (opts.session === "isolated" && opts.systemEvent) {
47
48
  throw new Error("Isolated jobs cannot use --system-event; use --message or --session main.");
48
49
  }
49
- if (opts.session === "main" && typeof opts.postPrefix === "string") {
50
- throw new Error("--post-prefix only applies to isolated jobs.");
50
+ if (opts.announce && typeof opts.deliver === "boolean") {
51
+ throw new Error("Choose --announce or --no-deliver (not multiple).");
51
52
  }
52
53
  const patch = {};
53
- if (typeof opts.name === "string")
54
+ if (typeof opts.name === "string") {
54
55
  patch.name = opts.name;
55
- if (typeof opts.description === "string")
56
+ }
57
+ if (typeof opts.description === "string") {
56
58
  patch.description = opts.description;
57
- if (opts.enable && opts.disable)
59
+ }
60
+ if (opts.enable && opts.disable) {
58
61
  throw new Error("Choose --enable or --disable, not both");
59
- if (opts.enable)
62
+ }
63
+ if (opts.enable) {
60
64
  patch.enabled = true;
61
- if (opts.disable)
65
+ }
66
+ if (opts.disable) {
62
67
  patch.enabled = false;
68
+ }
63
69
  if (opts.deleteAfterRun && opts.keepAfterRun) {
64
70
  throw new Error("Choose --delete-after-run or --keep-after-run, not both");
65
71
  }
66
- if (opts.deleteAfterRun)
72
+ if (opts.deleteAfterRun) {
67
73
  patch.deleteAfterRun = true;
68
- if (opts.keepAfterRun)
74
+ }
75
+ if (opts.keepAfterRun) {
69
76
  patch.deleteAfterRun = false;
70
- if (typeof opts.session === "string")
77
+ }
78
+ if (typeof opts.session === "string") {
71
79
  patch.sessionTarget = opts.session;
72
- if (typeof opts.wake === "string")
80
+ }
81
+ if (typeof opts.wake === "string") {
73
82
  patch.wakeMode = opts.wake;
83
+ }
74
84
  if (opts.agent && opts.clearAgent) {
75
85
  throw new Error("Use --agent or --clear-agent, not both");
76
86
  }
@@ -81,18 +91,21 @@ export function registerCronEditCommand(cron) {
81
91
  patch.agentId = null;
82
92
  }
83
93
  const scheduleChosen = [opts.at, opts.every, opts.cron].filter(Boolean).length;
84
- if (scheduleChosen > 1)
94
+ if (scheduleChosen > 1) {
85
95
  throw new Error("Choose at most one schedule change");
96
+ }
86
97
  if (opts.at) {
87
- const atMs = parseAtMs(String(opts.at));
88
- if (!atMs)
98
+ const atIso = parseAt(String(opts.at));
99
+ if (!atIso) {
89
100
  throw new Error("Invalid --at");
90
- patch.schedule = { kind: "at", atMs };
101
+ }
102
+ patch.schedule = { kind: "at", at: atIso };
91
103
  }
92
104
  else if (opts.every) {
93
105
  const everyMs = parseDurationMs(String(opts.every));
94
- if (!everyMs)
106
+ if (!everyMs) {
95
107
  throw new Error("Invalid --every");
108
+ }
96
109
  patch.schedule = { kind: "every", everyMs };
97
110
  }
98
111
  else if (opts.cron) {
@@ -111,14 +124,16 @@ export function registerCronEditCommand(cron) {
111
124
  ? Number.parseInt(String(opts.timeoutSeconds), 10)
112
125
  : undefined;
113
126
  const hasTimeoutSeconds = Boolean(timeoutSeconds && Number.isFinite(timeoutSeconds));
127
+ const hasDeliveryModeFlag = opts.announce || typeof opts.deliver === "boolean";
128
+ const hasDeliveryTarget = typeof opts.channel === "string" || typeof opts.to === "string";
129
+ const hasBestEffort = typeof opts.bestEffortDeliver === "boolean";
114
130
  const hasAgentTurnPatch = typeof opts.message === "string" ||
115
131
  Boolean(model) ||
116
132
  Boolean(thinking) ||
117
133
  hasTimeoutSeconds ||
118
- typeof opts.deliver === "boolean" ||
119
- typeof opts.channel === "string" ||
120
- typeof opts.to === "string" ||
121
- typeof opts.bestEffortDeliver === "boolean";
134
+ hasDeliveryModeFlag ||
135
+ hasDeliveryTarget ||
136
+ hasBestEffort;
122
137
  if (hasSystemEventPatch && hasAgentTurnPatch) {
123
138
  throw new Error("Choose at most one payload change");
124
139
  }
@@ -134,16 +149,27 @@ export function registerCronEditCommand(cron) {
134
149
  assignIf(payload, "model", model, Boolean(model));
135
150
  assignIf(payload, "thinking", thinking, Boolean(thinking));
136
151
  assignIf(payload, "timeoutSeconds", timeoutSeconds, hasTimeoutSeconds);
137
- assignIf(payload, "deliver", opts.deliver, typeof opts.deliver === "boolean");
138
- assignIf(payload, "channel", opts.channel, typeof opts.channel === "string");
139
- assignIf(payload, "to", opts.to, typeof opts.to === "string");
140
- assignIf(payload, "bestEffortDeliver", opts.bestEffortDeliver, typeof opts.bestEffortDeliver === "boolean");
141
152
  patch.payload = payload;
142
153
  }
143
- if (typeof opts.postPrefix === "string") {
144
- patch.isolation = {
145
- postToMainPrefix: opts.postPrefix.trim() ? opts.postPrefix : "Cron",
146
- };
154
+ if (hasDeliveryModeFlag || hasDeliveryTarget || hasBestEffort) {
155
+ const deliveryMode = opts.announce || opts.deliver === true
156
+ ? "announce"
157
+ : opts.deliver === false
158
+ ? "none"
159
+ : "announce";
160
+ const delivery = { mode: deliveryMode };
161
+ if (typeof opts.channel === "string") {
162
+ const channel = opts.channel.trim();
163
+ delivery.channel = channel ? channel : undefined;
164
+ }
165
+ if (typeof opts.to === "string") {
166
+ const to = opts.to.trim();
167
+ delivery.to = to ? to : undefined;
168
+ }
169
+ if (typeof opts.bestEffortDeliver === "boolean") {
170
+ delivery.bestEffort = opts.bestEffortDeliver;
171
+ }
172
+ patch.delivery = delivery;
147
173
  }
148
174
  const res = await callGatewayFromCli("cron.update", opts, {
149
175
  id,