tomo-ai 0.8.9 → 0.8.11

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 (192) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +16 -2
  3. package/defaults/AGENT.md +1 -1
  4. package/defaults/skills/system/SKILL.md +1 -1
  5. package/dist/agent/commands.d.ts +19 -1
  6. package/dist/agent/commands.d.ts.map +1 -1
  7. package/dist/agent/commands.js +99 -12
  8. package/dist/agent/commands.js.map +1 -1
  9. package/dist/agent/delivery-pipeline.d.ts.map +1 -1
  10. package/dist/agent/delivery-pipeline.js +8 -1
  11. package/dist/agent/delivery-pipeline.js.map +1 -1
  12. package/dist/agent/live-session.d.ts +3 -0
  13. package/dist/agent/live-session.d.ts.map +1 -1
  14. package/dist/agent/live-session.js +33 -0
  15. package/dist/agent/live-session.js.map +1 -1
  16. package/dist/agent/proactive-send.d.ts +32 -6
  17. package/dist/agent/proactive-send.d.ts.map +1 -1
  18. package/dist/agent/proactive-send.js +151 -16
  19. package/dist/agent/proactive-send.js.map +1 -1
  20. package/dist/agent/sdk-options.d.ts.map +1 -1
  21. package/dist/agent/sdk-options.js +3 -1
  22. package/dist/agent/sdk-options.js.map +1 -1
  23. package/dist/agent/text-utils.d.ts +22 -0
  24. package/dist/agent/text-utils.d.ts.map +1 -1
  25. package/dist/agent/text-utils.js +36 -0
  26. package/dist/agent/text-utils.js.map +1 -1
  27. package/dist/agent/turn-runner.d.ts +7 -5
  28. package/dist/agent/turn-runner.d.ts.map +1 -1
  29. package/dist/agent/turn-runner.js +41 -12
  30. package/dist/agent/turn-runner.js.map +1 -1
  31. package/dist/agent.d.ts +20 -2
  32. package/dist/agent.d.ts.map +1 -1
  33. package/dist/agent.js +109 -17
  34. package/dist/agent.js.map +1 -1
  35. package/dist/channels/heic.d.ts +21 -0
  36. package/dist/channels/heic.d.ts.map +1 -0
  37. package/dist/channels/heic.js +107 -0
  38. package/dist/channels/heic.js.map +1 -0
  39. package/dist/channels/imessage-dedupe.d.ts +9 -0
  40. package/dist/channels/imessage-dedupe.d.ts.map +1 -1
  41. package/dist/channels/imessage-dedupe.js +18 -0
  42. package/dist/channels/imessage-dedupe.js.map +1 -1
  43. package/dist/channels/imessage-imsg.d.ts +194 -0
  44. package/dist/channels/imessage-imsg.d.ts.map +1 -0
  45. package/dist/channels/imessage-imsg.js +1298 -0
  46. package/dist/channels/imessage-imsg.js.map +1 -0
  47. package/dist/channels/imessage.d.ts +13 -2
  48. package/dist/channels/imessage.d.ts.map +1 -1
  49. package/dist/channels/imessage.js +157 -19
  50. package/dist/channels/imessage.js.map +1 -1
  51. package/dist/channels/imsg-satellite.d.ts +56 -0
  52. package/dist/channels/imsg-satellite.d.ts.map +1 -0
  53. package/dist/channels/imsg-satellite.js +107 -0
  54. package/dist/channels/imsg-satellite.js.map +1 -0
  55. package/dist/channels/index.d.ts +1 -0
  56. package/dist/channels/index.d.ts.map +1 -1
  57. package/dist/channels/index.js +1 -0
  58. package/dist/channels/index.js.map +1 -1
  59. package/dist/channels/telegram.d.ts +9 -1
  60. package/dist/channels/telegram.d.ts.map +1 -1
  61. package/dist/channels/telegram.js +206 -4
  62. package/dist/channels/telegram.js.map +1 -1
  63. package/dist/channels/text-utils.d.ts +10 -0
  64. package/dist/channels/text-utils.d.ts.map +1 -1
  65. package/dist/channels/text-utils.js +26 -0
  66. package/dist/channels/text-utils.js.map +1 -1
  67. package/dist/channels/types.d.ts +34 -0
  68. package/dist/channels/types.d.ts.map +1 -1
  69. package/dist/cli/config/channels.d.ts.map +1 -1
  70. package/dist/cli/config/channels.js +45 -4
  71. package/dist/cli/config/channels.js.map +1 -1
  72. package/dist/cli/config/cron.d.ts +2 -0
  73. package/dist/cli/config/cron.d.ts.map +1 -0
  74. package/dist/cli/config/cron.js +83 -0
  75. package/dist/cli/config/cron.js.map +1 -0
  76. package/dist/cli/config/identities.js +1 -1
  77. package/dist/cli/config/identities.js.map +1 -1
  78. package/dist/cli/config/index.d.ts.map +1 -1
  79. package/dist/cli/config/index.js +19 -0
  80. package/dist/cli/config/index.js.map +1 -1
  81. package/dist/cli/cron.d.ts.map +1 -1
  82. package/dist/cli/cron.js +27 -9
  83. package/dist/cli/cron.js.map +1 -1
  84. package/dist/cli/daemon.d.ts +0 -1
  85. package/dist/cli/daemon.d.ts.map +1 -1
  86. package/dist/cli/daemon.js +2 -47
  87. package/dist/cli/daemon.js.map +1 -1
  88. package/dist/cli/start.js +36 -2
  89. package/dist/cli/start.js.map +1 -1
  90. package/dist/cli/status-info.d.ts +10 -0
  91. package/dist/cli/status-info.d.ts.map +1 -0
  92. package/dist/cli/status-info.js +40 -0
  93. package/dist/cli/status-info.js.map +1 -0
  94. package/dist/cli/status.d.ts +33 -0
  95. package/dist/cli/status.d.ts.map +1 -0
  96. package/dist/cli/status.js +111 -0
  97. package/dist/cli/status.js.map +1 -0
  98. package/dist/cli/watch.d.ts +3 -0
  99. package/dist/cli/watch.d.ts.map +1 -0
  100. package/dist/cli/watch.js +15 -0
  101. package/dist/cli/watch.js.map +1 -0
  102. package/dist/cli.js +4 -1
  103. package/dist/cli.js.map +1 -1
  104. package/dist/config.d.ts +12 -0
  105. package/dist/config.d.ts.map +1 -1
  106. package/dist/config.js +17 -1
  107. package/dist/config.js.map +1 -1
  108. package/dist/continuity.d.ts +4 -0
  109. package/dist/continuity.d.ts.map +1 -1
  110. package/dist/continuity.js +15 -1
  111. package/dist/continuity.js.map +1 -1
  112. package/dist/cron/format.d.ts +8 -0
  113. package/dist/cron/format.d.ts.map +1 -0
  114. package/dist/cron/format.js +38 -0
  115. package/dist/cron/format.js.map +1 -0
  116. package/dist/cron/scheduler.d.ts.map +1 -1
  117. package/dist/cron/scheduler.js +3 -0
  118. package/dist/cron/scheduler.js.map +1 -1
  119. package/dist/cron/store.d.ts +6 -0
  120. package/dist/cron/store.d.ts.map +1 -1
  121. package/dist/cron/store.js +28 -0
  122. package/dist/cron/store.js.map +1 -1
  123. package/dist/logger.d.ts.map +1 -1
  124. package/dist/logger.js +32 -0
  125. package/dist/logger.js.map +1 -1
  126. package/dist/mcp/internal-server.d.ts.map +1 -1
  127. package/dist/mcp/internal-server.js +73 -12
  128. package/dist/mcp/internal-server.js.map +1 -1
  129. package/dist/runtime-paths.d.ts +1 -0
  130. package/dist/runtime-paths.d.ts.map +1 -1
  131. package/dist/runtime-paths.js +1 -0
  132. package/dist/runtime-paths.js.map +1 -1
  133. package/dist/sessions/pause-store.d.ts +24 -0
  134. package/dist/sessions/pause-store.d.ts.map +1 -0
  135. package/dist/sessions/pause-store.js +62 -0
  136. package/dist/sessions/pause-store.js.map +1 -0
  137. package/dist/sessions/store.d.ts.map +1 -1
  138. package/dist/sessions/store.js +16 -0
  139. package/dist/sessions/store.js.map +1 -1
  140. package/dist/watch/bus.d.ts +36 -0
  141. package/dist/watch/bus.d.ts.map +1 -0
  142. package/dist/watch/bus.js +44 -0
  143. package/dist/watch/bus.js.map +1 -0
  144. package/dist/watch/client.d.ts +31 -0
  145. package/dist/watch/client.d.ts.map +1 -0
  146. package/dist/watch/client.js +101 -0
  147. package/dist/watch/client.js.map +1 -0
  148. package/dist/watch/protocol.d.ts +144 -0
  149. package/dist/watch/protocol.d.ts.map +1 -0
  150. package/dist/watch/protocol.js +20 -0
  151. package/dist/watch/protocol.js.map +1 -0
  152. package/dist/watch/server.d.ts +41 -0
  153. package/dist/watch/server.d.ts.map +1 -0
  154. package/dist/watch/server.js +161 -0
  155. package/dist/watch/server.js.map +1 -0
  156. package/dist/watch/snapshot.d.ts +22 -0
  157. package/dist/watch/snapshot.d.ts.map +1 -0
  158. package/dist/watch/snapshot.js +43 -0
  159. package/dist/watch/snapshot.js.map +1 -0
  160. package/dist/watch/tui/app.d.ts +7 -0
  161. package/dist/watch/tui/app.d.ts.map +1 -0
  162. package/dist/watch/tui/app.js +135 -0
  163. package/dist/watch/tui/app.js.map +1 -0
  164. package/dist/watch/tui/feed.d.ts +12 -0
  165. package/dist/watch/tui/feed.d.ts.map +1 -0
  166. package/dist/watch/tui/feed.js +58 -0
  167. package/dist/watch/tui/feed.js.map +1 -0
  168. package/dist/watch/tui/format.d.ts +12 -0
  169. package/dist/watch/tui/format.d.ts.map +1 -0
  170. package/dist/watch/tui/format.js +58 -0
  171. package/dist/watch/tui/format.js.map +1 -0
  172. package/dist/watch/tui/header.d.ts +7 -0
  173. package/dist/watch/tui/header.d.ts.map +1 -0
  174. package/dist/watch/tui/header.js +15 -0
  175. package/dist/watch/tui/header.js.map +1 -0
  176. package/dist/watch/tui/index.d.ts +3 -0
  177. package/dist/watch/tui/index.d.ts.map +1 -0
  178. package/dist/watch/tui/index.js +24 -0
  179. package/dist/watch/tui/index.js.map +1 -0
  180. package/dist/watch/tui/log-tail.d.ts +6 -0
  181. package/dist/watch/tui/log-tail.d.ts.map +1 -0
  182. package/dist/watch/tui/log-tail.js +73 -0
  183. package/dist/watch/tui/log-tail.js.map +1 -0
  184. package/dist/watch/tui/model.d.ts +69 -0
  185. package/dist/watch/tui/model.d.ts.map +1 -0
  186. package/dist/watch/tui/model.js +268 -0
  187. package/dist/watch/tui/model.js.map +1 -0
  188. package/dist/watch/tui/sidebar.d.ts +8 -0
  189. package/dist/watch/tui/sidebar.d.ts.map +1 -0
  190. package/dist/watch/tui/sidebar.js +31 -0
  191. package/dist/watch/tui/sidebar.js.map +1 -0
  192. package/package.json +4 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,35 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.8.11 (2026-07-09)
4
+
5
+ ### Features
6
+
7
+ - **`imsg`-backed iMessage channel (BlueBubbles successor)** (#230, #231, #232, #234). A new `ImsgChannel` (`src/channels/imessage-imsg.ts`) implements the `Channel` surface over a single long-lived `imsg rpc` child (newline-delimited JSON-RPC 2.0 on stdio), selectable via `channels.imessage.provider: "imsg"` without touching the BlueBubbles channel. Inbound uses the `watch.subscribe` all-chat stream with attachments (local file paths), reply context, inbound tapbacks, slash commands, and group/DM mapping; outbound covers chunked sends, threaded replies via `send.rich` (with plain-send fallback), attachments, targeted tapbacks, typing indicators, mark-read, and unsend. Message edit is gated on the `imsg status --json` bridge selector probe, so on macOS 26 (where the edit selectors are gone OS-wide) the channel refuses cleanly instead of crashing Messages. The child restarts on crash with escalating backoff and resumes the watch from a persisted rowid cursor, and persistent GUID dedupe is shared with the BlueBubbles store so a provider cutover never re-dispatches messages. Session keys stay compatible — chat.db chat GUIDs are used verbatim (identical to what BlueBubbles reported), so existing session mappings survive. Inbound HEIC/HEIF attachments that `imsg` doesn't pre-convert are normalized to JPEG channel-side via macOS `sips` (by mime, `.heic`/`.heif` extension, or `ftyp` magic-byte sniff), read-only-safe (converts into a temp JPEG that is read then unlinked) and never dropped on conversion failure.
8
+ - **`tomo watch` — live mission-control TUI** (#229). An always-on terminal dashboard for watching what Tomo is doing, backed by a daemon-side event bus. `src/watch/bus.ts` is an in-process `WatchBus` singleton with a ring buffer, fed by emit hooks in `SessionStore.append` (inbound/outbound messages), `LiveSession` (tool start/end with durations, compact boundaries), `TurnRunner` (turn start/end with ingress source), the per-turn cost/context stats closure, `CronScheduler`, `ContinuityRunner`, and a pino tap (warn/error → "issue" events). `server.ts` serves NDJSON over `~/.tomo/watch.sock` (0600) — a snapshot on connect (vitals, cron next-runs, cost 24h/7d, feed backfill), then live relay; inbound "send" frames route chat into the dm session. The Ink/React TUI renders an activity feed (messages, tools with status + duration, turn summaries with cost + ctx%, cron, heartbeats), a pinned in-flight turn line, a vitals sidebar (context gauge, cost, next-up, last warn/error), a chat line, a raw-log-tail toggle, a group-traffic filter, scroll with follow mode, and a help overlay. Auto-reconnects with an offline header state and drops to a 15s idle render tick so it can stay open 24/7. The daemon never depends on clients.
9
+
10
+ ### Bug fixes
11
+
12
+ - **Trailing `NO_REPLY` suppresses the whole block/turn** (#233). A reply whose final line(s) are a bare `NO_REPLY` is now suppressed entirely instead of delivering the stripped remainder — the agent narrates housekeeping turns and ends them with `NO_REPLY`, and that narration (sometimes including the literal `NO_REPLY` text) previously leaked to the channel (owner decision 2026-07-08: trailing `NO_REPLY` marks the whole response as not-for-the-channel). `agent/text-utils` gains `endsWithTrailingNoReply()` (`stripTrailingNoReply` stays exported for the watch TUI, which still shows the visible text); `TurnRunner.runSendTurn` (cron/continuity) silences the entire turn; imsg and BlueBubbles streaming drop a block whose trailing line is bare `NO_REPLY`; and Telegram streaming retracts the already-streamed message before the multi-part delivery path. Follow-up rounds close the Telegram over-4096 rollover gaps: finalized rollover head chunks are now deleted and un-recorded (new `forgetOwnMessage`) on every block-abandoning path (`finalFlush` suppression, multi-part re-delivery, `discardBlock`, `cancel`), suppression is judged on the full block buffer rather than the post-rollover slice, and attachment blocks (`MEDIA:`/`STICKER:`) are suppressed as a whole.
13
+ - **iMessage inbound reply context only for genuine threaded replies** (#234). Since the imsg cutover, nearly every inbound iMessage arrived tagged `[replying to: "..."]` even when the sender never used long-press → Reply, because the channel fell back to `reply_to_guid` — a chat.db column populated on almost every row (it points at the preceding message, usually our own last outbound; verified 186/186 inbound DM rows over 3 days carried it, vs. 7 with a genuine thread originator). The reply marker is now gated on `thread_originator_guid` only, with fallback to the recent-message ring and then a quote-less marker. Outbound threading and tapback handling are untouched.
14
+ - **imsg channel post-merge review fixes** (#232). `stop()` no longer leaves in-flight requests hanging forever — `killChild()` now rejects pending requests before nulling the child. A failed row with no numeric rowid (parsed as `0`) no longer wedges the cursor floor permanently — it is logged and skipped. A write parked on `drain` now settles when its response arrives (the response proves the child consumed the line), so a healthy answering child is never killed by the drain backstop. A temp JPEG from a failed HEIC conversion is unlinked instead of leaking.
15
+
16
+ ## 0.8.10 (2026-07-06)
17
+
18
+ ### Features
19
+
20
+ - **Edit and unsend Tomo's own sent messages** (#226). New `edit_message` and `unsend_message` MCP tools let the agent fix or retract a message it already delivered — the most recent own message by default, or a specific one via case-insensitive substring match over its own recent messages (matching `fromMe` messages only). `Channel` gains optional `editMessage`/`unsendMessage` capabilities: Telegram uses `editMessageText` (with a Markdown→plain fallback mirroring `send()`) and `deleteMessage`, with friendly errors for Telegram's ~48h delete window; iMessage/BlueBubbles uses the Private API `/message/:guid/edit` and `/unsend` (macOS Ventura+; Apple's 15-min edit and 2-min unsend windows), updating or dropping the cached ring text on success. Telegram now also tracks a per-chat recent-message window, so `react_to_message`'s `match` and `send_message`'s `reply_to` are no longer iMessage-only. Captioned Telegram photos are now recorded into that window too (via `editMessageCaption` fallback), so a no-match `unsend` right after one no longer deletes the previous text message instead of the photo.
21
+ - **iMessage reply threading and targeted tapbacks** (#221). Inbound threaded replies (`threadOriginatorGuid`) surface as a `[replying to: "..."]` marker quoting the first 60 chars of the original, degrading to a quote-less marker when the lookup fails and never blocking delivery. Outbound honors `OutgoingMessage.replyTo` on the Private API (`selectedMessageGuid` + `partIndex`, first chunk only). A bounded per-chat window (50) of recent message GUIDs + text is tracked from the webhook for both inbound and `isFromMe` rows and exposed via the new optional `Channel.recentMessages`.
22
+ - **`/pause` and `/resume` for group chats** (#224). Any group member can `/pause` to temporarily silence Tomo in that group — inbound group messages are dropped at receipt, never reaching a session, the batcher, or the transcript, so nothing from the paused period enters context. `/resume` lifts it. Both are group-only and need no owner identity. The new `PauseStore` persists paused keys at `~/.tomo/data/pauses.json` (surviving restarts); `enqueueMessage` gates before routing resolution (so a paused group can't extend a summon's activity clock) and re-checks per item at batch-processing time. Registered in Telegram (command list + bot menu) and iMessage, and surfaced in `/status`.
23
+ - **`tomo status` dashboard and config health** (#225). `tomo status` is upgraded from a bare PID/uptime line into a dashboard: daemon state, config validation issues, configured channels, active sessions (context %, queries, cost), and upcoming scheduled-task runs. `tomo config` now shows daemon state at the top and surfaces `configIssues` inline — previously a broken config value silently blocked startup with no hint in the very UI meant to repair it. Pid-file liveness helpers are extracted into `src/cli/status-info.ts`, shared by the daemon, status command, and config menu.
24
+ - **Scheduled-tasks view and cron enable/disable** (#225). The interactive `tomo config` menu gains a "Scheduled tasks" section showing each cron job's status (enabled/disabled, schedule, next/last run, failure state) with enable, disable, and remove actions. New `CronStore.setEnabled()` keeps a disabled job but stops it running; enabling recomputes the next run and re-arms an expired one-shot with its retry budget reset. Same actions exposed via `tomo cron enable/disable <id>`. Shared schedule/relative-time formatters moved to `src/cron/format.ts` so the CLI and config view render consistently (`every 2h` instead of `every 120m`; relative next-run times).
25
+
26
+ ### Bug fixes
27
+
28
+ - **Send-turn responses ending in `NO_REPLY` no longer drop earlier text** (#223). Non-streaming turns (cron jobs, delegate `send_message` notifications, continuity heartbeats) run through `TurnRunner.runSendTurn`, which sees the whole turn's text blocks joined into one string. A blanket `includes("NO_REPLY")` check silently dropped the entire response when a turn emitted real user-facing text mid-turn and only ended with `NO_REPLY` (e.g. text → tool_use → `NO_REPLY`). New `stripTrailingNoReply()` peels only a bare trailing `NO_REPLY` block, so earlier substantive text still ships while a response whose only content is `NO_REPLY` stays silent and housekeeping turns are unaffected.
29
+ - **Slash commands gated on the channel allowlist; `/restore` and `/model` owner-gated** (#220). Slash commands went straight from `Channel.onCommand` into the handler without the allowlist check that inbound messages get; `handle()` now checks `router.isAllowed()` first and drops disallowed chats silently. `/restore` and `/model` additionally require the sender to own a configured identity (unchanged when no identities are configured). `persistModelOverride`'s config read/parse/write is hardened so a malformed `config.json` yields an error reply instead of an unhandled exception, updating in-memory state only after a successful write.
30
+ - **iMessage command dispatch normalizes the sender address** (#220). The BlueBubbles webhook's slash-command path passed the raw handle address as `senderId` while the message path normalized it, so a formatted address like `+1 (555) 123-4567` failed owner checks against a configured `+15551234567`. Command dispatch now derives `senderId` exactly like the message path.
31
+ - **`tomo status` uptime and disabled-cron next-run** (#225). `getDaemonStatus` could report a slightly negative uptime when the pid file's mtime landed a fraction ahead of `Date.now()` (filesystem timestamp granularity) — now clamped to zero. Disabling a cron job left its `nextRunAt` in place, so views showed a "next run" for a job that would never fire — now cleared on disable.
32
+
3
33
  ## 0.8.9 (2026-07-05)
4
34
 
5
35
  ### Features
package/README.md CHANGED
@@ -108,11 +108,12 @@ Tomo keeps person records at `~/.tomo/workspace/memory/people/*.md` — canonica
108
108
  - Image/photo support (sends to Claude as vision input)
109
109
  - Group chat: defaults to mention-required (only responds when @mentioned or replied to); per-group passive listen mode opt-in via `channels.telegram.passiveGroups`
110
110
  - Markdown rendering with plain-text fallback
111
- - **iMessage** — via [BlueBubbles](https://bluebubbles.app)
111
+ - **iMessage** — via [BlueBubbles](https://bluebubbles.app) (default) or the [imsg CLI](https://github.com/openclaw/imsg) (`channels.imessage.provider: "imsg"`)
112
112
  - DM and group chat support
113
113
  - Image attachment support
114
114
  - Contact name resolution from Mac contacts
115
115
  - Group chat: observes all messages, only responds when relevant (replies `NO_REPLY` to stay silent)
116
+ - imsg provider: no external server — Tomo spawns one `imsg rpc` child (needs Full Disk Access); adds inbound tapbacks and built-in reply context, and gates message editing on a live macOS selector probe
116
117
 
117
118
  ### Multi-Channel Sessions
118
119
 
@@ -145,7 +146,7 @@ Plus a built-in `tomo-internal` MCP server:
145
146
  | Messaging | `send_message` | Message another session — `delegate` mode (recipient's Claude composes) or `direct` mode (verbatim text) |
146
147
  | | `list_sessions` | List identities and active group chats (titles, participants) |
147
148
  | | `rename_group_chat` | Rename a real Telegram/iMessage group chat |
148
- | | `react_to_latest_message` | React/tapback to the latest inbound message in a session |
149
+ | | `react_to_message` | React/tapback to a message in a session — latest inbound by default, or matched by text |
149
150
  | Scheduling | `schedule_create` / `schedule_list` / `schedule_remove` | Manage scheduled tasks (one-shot, interval, or cron) |
150
151
  | People | `list_people` / `upsert_person` | Read and maintain the people registry |
151
152
  | History | `recall_conversation` | Search the session's full history, including compacted and archived messages |
@@ -291,6 +292,16 @@ Run `tomo config` for interactive setup, or edit `~/.tomo/config.json` directly:
291
292
  }
292
293
  ```
293
294
 
295
+ To run iMessage through the local [imsg CLI](https://github.com/openclaw/imsg) instead of a BlueBubbles server (the Tomo process needs Full Disk Access; advanced features additionally need `imsg launch`):
296
+
297
+ ```json
298
+ {
299
+ "channels": {
300
+ "imessage": { "provider": "imsg", "cliPath": "/opt/homebrew/bin/imsg", "allowlist": ["+15551234567"] }
301
+ }
302
+ }
303
+ ```
304
+
294
305
  Environment variables override config file values:
295
306
 
296
307
  | Variable | Description |
@@ -298,6 +309,9 @@ Environment variables override config file values:
298
309
  | `ANTHROPIC_API_KEY` | Use Anthropic API-key authentication; overrides the authentication stored in `config.json` |
299
310
  | `TELEGRAM_BOT_TOKEN` | Override Telegram token |
300
311
  | `IMESSAGE_URL` | Override BlueBubbles URL |
312
+ | `IMESSAGE_PROVIDER` | iMessage backend: `bluebubbles` (default) or `imsg` |
313
+ | `IMSG_CLI_PATH` | Path to the `imsg` binary (default: `imsg` on PATH) |
314
+ | `IMSG_DB_PATH` | Override chat.db path passed to `imsg rpc --db` |
301
315
  | `IMESSAGE_TYPING_START_DELAY_MS` | Delay before showing iMessage typing for ordinary turns (default: `1200`) |
302
316
  | `IMESSAGE_PASSIVE_TYPING_START_DELAY_MS` | Delay before showing iMessage typing for passive iMessage group turns (default: `4000`) |
303
317
  | `CLAUDE_MODEL` | Override model |
package/defaults/AGENT.md CHANGED
@@ -24,7 +24,7 @@ Call `list_sessions` first if you're unsure which group to address. For normal i
24
24
 
25
25
  You also have `rename_group_chat` for changing the real title of a Telegram or iMessage group. Only use it when the user explicitly asks to rename a group, and pass a group session key from `list_sessions`.
26
26
 
27
- You also have `react_to_latest_message` for reacting/tapbacking to the latest inbound message Tomo has seen in a session. Latest-message state is in-memory since startup; if the tool says none is known, wait for a new inbound message. Usually pass the current Session key.
27
+ You also have `react_to_message` for reacting/tapbacking to a message — the latest inbound one by default, or a specific one via `match` (a case-insensitive substring of its text, searched newest-first over the chat's recent messages). Latest-message state is in-memory since startup; if the tool says none is known, wait for a new inbound message or use `match`. Usually pass the current Session key.
28
28
 
29
29
  ## Summoned Groups
30
30
 
@@ -109,7 +109,7 @@ In-process MCP tools let you message outside the current conversation:
109
109
  - `delegate` (default): describe the *intent* (e.g. "follow up with Alice about her recent trip"). The recipient session's Claude composes the actual message in its own voice/context. Best for social or contextual relays. Fire-and-forget.
110
110
  - `direct`: send the verbatim text. Recipient is not triggered into a Claude turn. Best for factual broadcasts ("meeting moved to 3pm"), pasted content, or self-targeted mid-loop progress updates.
111
111
  - `mcp__tomo-internal__rename_group_chat(target, title)` — rename the real Telegram or iMessage group title. Use only when the user explicitly asks for a rename; `target` must be a group session key from `list_sessions`.
112
- - `mcp__tomo-internal__react_to_latest_message(target, reaction, remove?)` — react/tapback to the latest inbound message Tomo has seen in that session since startup. This latest-message state is in-memory; after a restart, wait for a new inbound message before using it. Usually pass the current Session key. Reactions: `love`, `like`, `dislike`, `laugh`, `emphasize`, `question`.
112
+ - `mcp__tomo-internal__react_to_message(target, reaction, match?, remove?)` — react/tapback to a message: the latest inbound one Tomo has seen in that session by default, or a specific one via `match` (case-insensitive substring of its text, searched newest-first over the chat's recent messages; currently iMessage only). Latest-message state is in-memory; after a restart, wait for a new inbound message or use `match`. Usually pass the current Session key. Reactions: `love`, `like`, `dislike`, `laugh`, `emphasize`, `question`.
113
113
 
114
114
  Pass identity name (`"alice"`) or session key (`"telegram:-1001234567"`) as `target`. Call `list_sessions` first if unsure. Tool result lines (with `is_error` flag) appear in `tomo logs` immediately after the corresponding tool call.
115
115
 
@@ -1,11 +1,14 @@
1
1
  import type { Channel } from "../channels/types.js";
2
2
  import type { IdentityRouter } from "../router.js";
3
3
  import type { SessionStore } from "../sessions/index.js";
4
+ import type { PauseStore } from "../sessions/pause-store.js";
4
5
  /** Back up ~/.tomo/config.json before a programmatic rewrite. */
5
6
  export declare function backupConfigFile(): void;
6
7
  export interface ChatCommandDeps {
7
8
  router: IdentityRouter;
8
9
  sessions: SessionStore;
10
+ /** Shared with the Agent — paused groups are dropped at message receipt. */
11
+ pauses: PauseStore;
9
12
  /** Shared with the Agent — per-session model overrides read at session create time. */
10
13
  modelOverrides: Map<string, string>;
11
14
  closeLiveSession(key: string): void;
@@ -14,7 +17,7 @@ export interface ChatCommandDeps {
14
17
  }
15
18
  /**
16
19
  * Handles slash commands typed in chat (/new, /model, /status, /pet,
17
- * /cost, /restore, /login).
20
+ * /cost, /restore, /login, /pause, /resume).
18
21
  * Wired to Channel.onCommand by the Agent.
19
22
  */
20
23
  export declare class ChatCommandHandler {
@@ -33,6 +36,21 @@ export declare class ChatCommandHandler {
33
36
  * explicit send_message direct tool call to the raw group session key.
34
37
  */
35
38
  private handleSummonCommand;
39
+ /**
40
+ * /pause drops ALL of a group's inbound messages at receipt — nothing
41
+ * reaches the agent, its context, or the transcript — until someone sends
42
+ * /resume. Group-only; ANY group member can pause or resume (no owner
43
+ * check). Slash commands keep flowing while paused — that is how /resume
44
+ * gets through.
45
+ */
46
+ private handlePauseCommand;
47
+ /** Gate for config-mutating commands (/model, /restore): the sender must own
48
+ * a configured identity on this channel — the same identityForSender check
49
+ * /login uses. With no identities configured there are no owners to
50
+ * restrict to, so these commands stay available to allowed chats. */
51
+ private isIdentityOwner;
52
+ /** Persist a /model override into config.json. Returns false (after logging,
53
+ * leaving in-memory state untouched) if the file can't be read or written. */
36
54
  private persistModelOverride;
37
55
  private handleClaudeLogin;
38
56
  private scheduleRestart;
@@ -1 +1 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/agent/commands.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAezD,iEAAiE;AACjE,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,YAAY,CAAC;IACvB,uFAAuF;IACvF,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACpC,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1D;AAED;;;;GAIG;AACH,qBAAa,kBAAkB;IAIjB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;gBAE3B,IAAI,EAAE,eAAe;IAElD,qFAAqF;IACrF,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,IAAI,IAAI;IAIN,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyKpI;;;;;OAKG;YACW,mBAAmB;IAsEjC,OAAO,CAAC,oBAAoB;YAed,iBAAiB;IAuE/B,OAAO,CAAC,eAAe;YAgBT,uBAAuB;CAwBtC"}
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/agent/commands.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAe7D,iEAAiE;AACjE,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,YAAY,CAAC;IACvB,4EAA4E;IAC5E,MAAM,EAAE,UAAU,CAAC;IACnB,uFAAuF;IACvF,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACpC,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1D;AAED;;;;GAIG;AACH,qBAAa,kBAAkB;IAIjB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;gBAE3B,IAAI,EAAE,eAAe;IAElD,qFAAqF;IACrF,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,IAAI,IAAI;IAIN,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0MpI;;;;;OAKG;YACW,mBAAmB;IAsEjC;;;;;;OAMG;YACW,kBAAkB;IAqChC;;;0EAGsE;IACtE,OAAO,CAAC,eAAe;IAMvB;mFAC+E;IAC/E,OAAO,CAAC,oBAAoB;YAoBd,iBAAiB;IAuE/B,OAAO,CAAC,eAAe;YAgBT,uBAAuB;CAwBtC"}
@@ -18,7 +18,7 @@ export function backupConfigFile() {
18
18
  }
19
19
  /**
20
20
  * Handles slash commands typed in chat (/new, /model, /status, /pet,
21
- * /cost, /restore, /login).
21
+ * /cost, /restore, /login, /pause, /resume).
22
22
  * Wired to Channel.onCommand by the Agent.
23
23
  */
24
24
  export class ChatCommandHandler {
@@ -36,6 +36,14 @@ export class ChatCommandHandler {
36
36
  this.claudeLogin.stop();
37
37
  }
38
38
  async handle(channel, command, chatId, senderName, args, senderId) {
39
+ // Commands obey the same channel allowlist as inbound messages
40
+ // (Agent.enqueueMessage): check channel+chatId BEFORE resolving, so a
41
+ // disallowed chat can't touch routing state, and drop silently — the
42
+ // message path never replies to chats outside the allowlist.
43
+ if (!this.deps.router.isAllowed(channel.name, chatId)) {
44
+ log.debug({ channel: channel.name, chatId, command }, "Command blocked at receipt (not in allowlist)");
45
+ return;
46
+ }
39
47
  if (this.restoringConfig) {
40
48
  await channel.send({ chatId, text: "Restore is already in progress. Restarting Tomo..." });
41
49
  return;
@@ -51,6 +59,10 @@ export class ChatCommandHandler {
51
59
  await this.handleSummonCommand(channel, command, chatId, senderName, senderId);
52
60
  return;
53
61
  }
62
+ if (command === "pause" || command === "resume") {
63
+ await this.handlePauseCommand(channel, command, chatId, senderName);
64
+ return;
65
+ }
54
66
  if (command === "new") {
55
67
  this.deps.closeLiveSession(key);
56
68
  this.deps.sessions.clearSdkSessionId(key);
@@ -59,6 +71,11 @@ export class ChatCommandHandler {
59
71
  return;
60
72
  }
61
73
  if (command === "model") {
74
+ if (!this.isIdentityOwner(channel, senderId)) {
75
+ log.info({ channel: channel.name, chatId, sender: senderName }, "/model refused (sender is not a configured identity)");
76
+ await channel.send({ chatId, text: "Only a configured owner can change the model." });
77
+ return;
78
+ }
62
79
  const arg = args?.trim();
63
80
  if (!arg) {
64
81
  const current = this.deps.modelOverrides.get(key) ?? config.model;
@@ -97,8 +114,14 @@ export class ChatCommandHandler {
97
114
  return;
98
115
  }
99
116
  }
117
+ if (!this.persistModelOverride(key, resolved)) {
118
+ await channel.send({
119
+ chatId,
120
+ text: "[error] Could not save the model override to ~/.tomo/config.json — model unchanged. Check the file (or /restore) and try again.",
121
+ });
122
+ return;
123
+ }
100
124
  this.deps.modelOverrides.set(key, resolved);
101
- this.persistModelOverride(key, resolved);
102
125
  // Model changes require a fresh SDK child process, but keep the SDK
103
126
  // session ID so continuity survives switching between Claude and LiteLLM.
104
127
  // getOrCreateLiveSession repairs provider-specific JSONL quirks before
@@ -109,6 +132,11 @@ export class ChatCommandHandler {
109
132
  return;
110
133
  }
111
134
  if (command === "restore") {
135
+ if (!this.isIdentityOwner(channel, senderId)) {
136
+ log.info({ channel: channel.name, chatId, sender: senderName }, "/restore refused (sender is not a configured identity)");
137
+ await channel.send({ chatId, text: "Only a configured owner can restore config." });
138
+ return;
139
+ }
112
140
  await this.restoreConfigAndRestart(channel, chatId);
113
141
  return;
114
142
  }
@@ -154,6 +182,9 @@ export class ChatCommandHandler {
154
182
  const summoned = this.deps.router.getSummonedIdentity(channel.name, chatId);
155
183
  if (summoned)
156
184
  lines.push(`Summoned: messages route to dm:${summoned} (/dismiss to hand back)`);
185
+ if (this.deps.pauses.isPaused(`${channel.name}:${chatId}`)) {
186
+ lines.push("Paused: yes — group messages are being ignored (/resume to lift)");
187
+ }
157
188
  lines.push(`Model: ${model}`);
158
189
  if (config.litellm?.baseUrl) {
159
190
  lines.push(`Gateway: LiteLLM (${liteLlmModeLabel(config.litellm.mode)})`);
@@ -234,17 +265,73 @@ export class ChatCommandHandler {
234
265
  text: `${identity.name}'s main Tomo session is now handling this group. /dismiss hands back to the group's own session${expiryNote ? `; it also hands back automatically after ${config.summonExpiryMinutes}m of inactivity` : ""}.`,
235
266
  });
236
267
  }
268
+ /**
269
+ * /pause drops ALL of a group's inbound messages at receipt — nothing
270
+ * reaches the agent, its context, or the transcript — until someone sends
271
+ * /resume. Group-only; ANY group member can pause or resume (no owner
272
+ * check). Slash commands keep flowing while paused — that is how /resume
273
+ * gets through.
274
+ */
275
+ async handlePauseCommand(channel, command, chatId, senderName) {
276
+ const rawKey = `${channel.name}:${chatId}`;
277
+ if (!isGroupSessionKey(rawKey)) {
278
+ await channel.send({ chatId, text: `/${command} only works in group chats.` });
279
+ return;
280
+ }
281
+ if (command === "pause") {
282
+ if (this.deps.pauses.isPaused(rawKey)) {
283
+ await channel.send({ chatId, text: "Tomo is already paused here. Send /resume to bring it back." });
284
+ return;
285
+ }
286
+ this.deps.pauses.pause(rawKey, senderName);
287
+ log.info({ channel: channel.name, chatId, sender: senderName }, "Group paused via /pause");
288
+ await channel.send({
289
+ chatId,
290
+ text: "Tomo is paused in this group. Messages sent here will be completely ignored (not read, not remembered) until someone sends /resume.",
291
+ });
292
+ return;
293
+ }
294
+ if (!this.deps.pauses.resume(rawKey)) {
295
+ await channel.send({ chatId, text: "Tomo isn't paused in this group." });
296
+ return;
297
+ }
298
+ log.info({ channel: channel.name, chatId, sender: senderName }, "Group resumed via /resume");
299
+ await channel.send({
300
+ chatId,
301
+ text: "Tomo is back. Messages sent while paused were ignored; new messages will be handled normally.",
302
+ });
303
+ }
304
+ /** Gate for config-mutating commands (/model, /restore): the sender must own
305
+ * a configured identity on this channel — the same identityForSender check
306
+ * /login uses. With no identities configured there are no owners to
307
+ * restrict to, so these commands stay available to allowed chats. */
308
+ isIdentityOwner(channel, senderId) {
309
+ if (config.identities.length === 0)
310
+ return true;
311
+ if (!senderId)
312
+ return false;
313
+ return this.deps.router.identityForSender(channel.name, senderId) !== undefined;
314
+ }
315
+ /** Persist a /model override into config.json. Returns false (after logging,
316
+ * leaving in-memory state untouched) if the file can't be read or written. */
237
317
  persistModelOverride(key, model) {
238
- config.sessionModelOverrides[key] = model;
239
- const cfg = existsSync(CONFIG_PATH)
240
- ? JSON.parse(readFileSync(CONFIG_PATH, "utf-8"))
241
- : {};
242
- const overrides = (cfg.sessionModelOverrides ?? {});
243
- overrides[key] = model;
244
- cfg.sessionModelOverrides = overrides;
245
- mkdirSync(dirname(CONFIG_PATH), { recursive: true });
246
- backupConfigFile();
247
- writeJsonAtomicSync(CONFIG_PATH, cfg, { mode: 0o600 });
318
+ try {
319
+ const cfg = existsSync(CONFIG_PATH)
320
+ ? JSON.parse(readFileSync(CONFIG_PATH, "utf-8"))
321
+ : {};
322
+ const overrides = (cfg.sessionModelOverrides ?? {});
323
+ overrides[key] = model;
324
+ cfg.sessionModelOverrides = overrides;
325
+ mkdirSync(dirname(CONFIG_PATH), { recursive: true });
326
+ backupConfigFile();
327
+ writeJsonAtomicSync(CONFIG_PATH, cfg, { mode: 0o600 });
328
+ config.sessionModelOverrides[key] = model;
329
+ return true;
330
+ }
331
+ catch (err) {
332
+ log.error({ err, key }, "Failed to persist model override");
333
+ return false;
334
+ }
248
335
  }
249
336
  async handleClaudeLogin(channel, chatId, senderId, args) {
250
337
  const rawKey = `${channel.name}:${chatId}`;
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/agent/commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/agent/commands.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"delivery-pipeline.d.ts","sourceRoot":"","sources":["../../src/agent/delivery-pipeline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGtE,OAAO,EAAE,kBAAkB,EAAiB,MAAM,iBAAiB,CAAC;AAGpE,UAAU,oBAAoB;IAC5B,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CACvE;AAED,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE/D,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAM9D;AAED,qBAAa,gBAAgB;IACf,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,oBAAoB;IAE9C;;;;;;OAMG;IACG,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,OAAO,EACrB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,gBAAgB,EACxB,QAAQ,GAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAuB,GACtD,OAAO,CAAC,IAAI,CAAC;IAoBhB;;;OAGG;IACG,uBAAuB,CAC3B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,iBAA4C,GACnD,OAAO,CAAC,IAAI,CAAC;IAoBhB;;;;OAIG;IACH,gBAAgB,CACd,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,gBAAgB,GACvB,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;CAsBnC"}
1
+ {"version":3,"file":"delivery-pipeline.d.ts","sourceRoot":"","sources":["../../src/agent/delivery-pipeline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGtE,OAAO,EAA2B,kBAAkB,EAAiB,MAAM,iBAAiB,CAAC;AAG7F,UAAU,oBAAoB;IAC5B,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CACvE;AAED,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE/D,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAM9D;AAED,qBAAa,gBAAgB;IACf,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,oBAAoB;IAE9C;;;;;;OAMG;IACG,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,OAAO,EACrB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,gBAAgB,EACxB,QAAQ,GAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAuB,GACtD,OAAO,CAAC,IAAI,CAAC;IAoBhB;;;OAGG;IACG,uBAAuB,CAC3B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,iBAA4C,GACnD,OAAO,CAAC,IAAI,CAAC;IAoBhB;;;;OAIG;IACH,gBAAgB,CACd,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,gBAAgB,GACvB,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;CA4BnC"}
@@ -2,7 +2,7 @@ import { existsSync } from "node:fs";
2
2
  import { log } from "../logger.js";
3
3
  import { deliverTextParts } from "../channels/delivery.js";
4
4
  import { restoreLiteralNewlines } from "../channels/text-utils.js";
5
- import { extractAttachments, isSilentReply } from "./text-utils.js";
5
+ import { endsWithTrailingNoReply, extractAttachments, isSilentReply } from "./text-utils.js";
6
6
  import { filterScaffoldLeak } from "./scaffold-filter.js";
7
7
  export function isAgentErrorResponse(response) {
8
8
  const text = response.trim();
@@ -79,6 +79,13 @@ export class DeliveryPipeline {
79
79
  const attachments = extractAttachments(blockText);
80
80
  if (attachments.mediaPaths.length > 0 || attachments.stickerIds.length > 0) {
81
81
  await stream.discardBlock();
82
+ // Attachment blocks bypass the StreamingMessage (and therefore the
83
+ // channels' trailing-NO_REPLY suppression), so enforce the semantics
84
+ // here: a block whose trailing line(s) are bare NO_REPLY ships
85
+ // NOTHING — no text, no media, no stickers (owner decision
86
+ // 2026-07-08). The stream buffer is already discarded above.
87
+ if (endsWithTrailingNoReply(blockText))
88
+ return;
82
89
  await this.deliverAssistantContent(channel, chatId, blockText, attachments);
83
90
  return;
84
91
  }
@@ -1 +1 @@
1
- {"version":3,"file":"delivery-pipeline.js","sourceRoot":"","sources":["../../src/agent/delivery-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAQ1D,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;WAC/B,6CAA6C,CAAC,IAAI,CAAC,IAAI,CAAC;WACxD,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;WAC9B,gDAAgD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,OAAO,gBAAgB;IACP;IAApB,YAAoB,IAA0B;QAA1B,SAAI,GAAJ,IAAI,CAAsB;IAAG,CAAC;IAElD;;;;;;OAMG;IACH,KAAK,CAAC,eAAe,CACnB,UAAkB,EAClB,YAAqB,EACrB,WAAmB,EACnB,QAAgB,EAChB,MAAwB,EACxB,WAA0C,aAAa;QAEvD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QAEpF,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC3C,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,MAAM,YAAY,GAAG,WAAW,QAAQ,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YAC1D,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QAED,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,uBAAuB,CAC3B,OAAgB,EAChB,MAAc,EACd,IAAY,EACZ,SAA4B,kBAAkB,CAAC,IAAI,CAAC;QAEpD,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;QACrD,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;YAC7C,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1E,IAAI,CAAC,KAAK,CAAC,IAAI,OAAO;gBAAE,QAAQ,GAAG,IAAI,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACrD,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,gBAAgB,CACd,OAAgB,EAChB,MAAc,EACd,MAAwB;QAExB,OAAO,KAAK,EAAE,YAAoB,EAAE,EAAE;YACpC,IAAI,CAAC;gBACH,IAAI,oBAAoB,CAAC,YAAY,CAAC,EAAE,CAAC;oBACvC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;oBACtB,OAAO;gBACT,CAAC;gBACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;gBAClD,IAAI,QAAQ,CAAC,QAAQ;oBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,8BAA8B,CAAC,CAAC;gBAC3F,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC;gBAChC,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBAClD,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3E,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;oBAC5B,MAAM,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;oBAC5E,OAAO;gBACT,CAAC;gBACD,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;YAC7B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,uBAAuB,CAAC,CAAC;YACpE,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"delivery-pipeline.js","sourceRoot":"","sources":["../../src/agent/delivery-pipeline.ts"],"names":[],"mappings":"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"}
@@ -67,6 +67,8 @@ export declare class LiveSession {
67
67
  private unownedTurnFactory;
68
68
  private timeoutMs;
69
69
  private pendingToolNames;
70
+ /** tool_use_id → start time, for tool.end durations on the watch bus. */
71
+ private pendingToolStarts;
70
72
  /** Agent tool_use id → subagent_type, so a subagent's tool logs can name which agent ran them. */
71
73
  private subagentTypeById;
72
74
  private activeStreamBlockTypes;
@@ -105,6 +107,7 @@ export declare class LiveSession {
105
107
  * turn state (parts/streamingText) or channel-facing callbacks.
106
108
  */
107
109
  private logSubagentEvent;
110
+ private publishToolStart;
108
111
  private logToolResults;
109
112
  /**
110
113
  * Steered-message bookkeeping from the CLI's replay events (requires the
@@ -1 +1 @@
1
- {"version":3,"file":"live-session.d.ts","sourceRoot":"","sources":["../../src/agent/live-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"live-session.d.ts","sourceRoot":"","sources":["../../src/agent/live-session.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import { query } from "@anthropic-ai/claude-agent-sdk";
2
2
  import { log } from "../logger.js";
3
+ import { watchBus } from "../watch/bus.js";
4
+ import { clip, TOOL_DETAIL_LIMIT } from "../watch/protocol.js";
3
5
  import { resetTurnBudget } from "./sdk-options.js";
4
6
  /**
5
7
  * Sentinel resolution for a steered message that merged into the in-flight
@@ -144,6 +146,8 @@ export class LiveSession {
144
146
  // Maps tool_use_id → tool name so we can label tool_result log lines
145
147
  // (the result event only carries the use id, not the original name).
146
148
  pendingToolNames = new Map();
149
+ /** tool_use_id → start time, for tool.end durations on the watch bus. */
150
+ pendingToolStarts = new Map();
147
151
  /** Agent tool_use id → subagent_type, so a subagent's tool logs can name which agent ran them. */
148
152
  subagentTypeById = new Map();
149
153
  activeStreamBlockTypes = new Map();
@@ -337,6 +341,7 @@ export class LiveSession {
337
341
  this.subagentTypeById.set(block.id, subType);
338
342
  }
339
343
  log.info({ tool: block.name }, summarizeToolInput(block.name, block.input));
344
+ this.publishToolStart(block);
340
345
  }
341
346
  }
342
347
  }
@@ -349,6 +354,12 @@ export class LiveSession {
349
354
  if (event.type === "system" && event.subtype === "compact_boundary") {
350
355
  const compact = event;
351
356
  log.info({ pre: compact.compact_metadata?.pre_tokens, post: compact.compact_metadata?.post_tokens }, "Context compacted");
357
+ watchBus.publish({
358
+ type: "compact",
359
+ ...(this.sessionKey ? { sessionKey: this.sessionKey } : {}),
360
+ preTokens: compact.compact_metadata?.pre_tokens,
361
+ postTokens: compact.compact_metadata?.post_tokens,
362
+ });
352
363
  }
353
364
  if (event.type === "tool_use_summary") {
354
365
  log.debug(event.summary);
@@ -435,6 +446,7 @@ export class LiveSession {
435
446
  this.subagentTypeById.set(block.id, subType);
436
447
  }
437
448
  log.info({ tool: block.name, agent: agentName }, summarizeToolInput(block.name, block.input));
449
+ this.publishToolStart(block, agentName);
438
450
  }
439
451
  }
440
452
  }
@@ -442,16 +454,37 @@ export class LiveSession {
442
454
  this.logToolResults(event.message.content, agentName);
443
455
  }
444
456
  }
457
+ publishToolStart(block, agent) {
458
+ if (block.id)
459
+ this.pendingToolStarts.set(block.id, Date.now());
460
+ watchBus.publish({
461
+ type: "tool.start",
462
+ ...(this.sessionKey ? { sessionKey: this.sessionKey } : {}),
463
+ tool: block.name,
464
+ ...(agent ? { agent } : {}),
465
+ detail: clip(summarizeToolInput(block.name, block.input), TOOL_DETAIL_LIMIT),
466
+ });
467
+ }
445
468
  logToolResults(content, agent) {
446
469
  for (const block of content) {
447
470
  if (block && typeof block === "object" && "type" in block && block.type === "tool_result") {
448
471
  const tr = block;
449
472
  const name = tr.tool_use_id ? this.pendingToolNames.get(tr.tool_use_id) : undefined;
473
+ const startedAt = tr.tool_use_id ? this.pendingToolStarts.get(tr.tool_use_id) : undefined;
450
474
  if (tr.tool_use_id) {
451
475
  this.pendingToolNames.delete(tr.tool_use_id);
476
+ this.pendingToolStarts.delete(tr.tool_use_id);
452
477
  this.subagentTypeById.delete(tr.tool_use_id);
453
478
  }
454
479
  log.info({ tool: name ?? "?", ...(tr.is_error ? { is_error: true } : {}), ...(agent ? { agent } : {}) }, `${tr.is_error ? "[ERR] " : ""}${name ?? "?"} result: ${summarizeToolResult(tr.content)}`);
480
+ watchBus.publish({
481
+ type: "tool.end",
482
+ ...(this.sessionKey ? { sessionKey: this.sessionKey } : {}),
483
+ tool: name ?? "?",
484
+ ok: !tr.is_error,
485
+ ...(startedAt !== undefined ? { durationMs: Date.now() - startedAt } : {}),
486
+ ...(agent ? { agent } : {}),
487
+ });
455
488
  }
456
489
  }
457
490
  }