tomo-ai 0.8.8 → 0.8.10
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.
- package/CHANGELOG.md +40 -0
- package/README.md +47 -4
- package/defaults/AGENT.md +2 -2
- package/defaults/skills/lcm/SKILL.md +1 -1
- package/defaults/skills/system/SKILL.md +2 -2
- package/dist/agent/audience.d.ts.map +1 -1
- package/dist/agent/audience.js +3 -2
- package/dist/agent/audience.js.map +1 -1
- package/dist/agent/commands.d.ts +19 -1
- package/dist/agent/commands.d.ts.map +1 -1
- package/dist/agent/commands.js +102 -14
- package/dist/agent/commands.js.map +1 -1
- package/dist/agent/context-nudge.d.ts +29 -0
- package/dist/agent/context-nudge.d.ts.map +1 -0
- package/dist/agent/context-nudge.js +29 -0
- package/dist/agent/context-nudge.js.map +1 -0
- package/dist/agent/delivery-pipeline.d.ts.map +1 -1
- package/dist/agent/delivery-pipeline.js +7 -2
- package/dist/agent/delivery-pipeline.js.map +1 -1
- package/dist/agent/live-session-manager.d.ts.map +1 -1
- package/dist/agent/live-session-manager.js +12 -3
- package/dist/agent/live-session-manager.js.map +1 -1
- package/dist/agent/pending-notes-queue.d.ts.map +1 -1
- package/dist/agent/pending-notes-queue.js +5 -4
- package/dist/agent/pending-notes-queue.js.map +1 -1
- package/dist/agent/proactive-send.d.ts +36 -8
- package/dist/agent/proactive-send.d.ts.map +1 -1
- package/dist/agent/proactive-send.js +168 -25
- package/dist/agent/proactive-send.js.map +1 -1
- package/dist/agent/scaffold-filter.d.ts +28 -0
- package/dist/agent/scaffold-filter.d.ts.map +1 -0
- package/dist/agent/scaffold-filter.js +53 -0
- package/dist/agent/scaffold-filter.js.map +1 -0
- package/dist/agent/sdk-options.d.ts.map +1 -1
- package/dist/agent/sdk-options.js +10 -3
- package/dist/agent/sdk-options.js.map +1 -1
- package/dist/agent/send-target.d.ts +19 -5
- package/dist/agent/send-target.d.ts.map +1 -1
- package/dist/agent/send-target.js +36 -7
- package/dist/agent/send-target.js.map +1 -1
- package/dist/agent/text-utils.d.ts +17 -0
- package/dist/agent/text-utils.d.ts.map +1 -1
- package/dist/agent/text-utils.js +29 -0
- package/dist/agent/text-utils.js.map +1 -1
- package/dist/agent/turn-runner.d.ts +10 -7
- package/dist/agent/turn-runner.d.ts.map +1 -1
- package/dist/agent/turn-runner.js +34 -15
- package/dist/agent/turn-runner.js.map +1 -1
- package/dist/agent.d.ts +19 -9
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +159 -51
- package/dist/agent.js.map +1 -1
- package/dist/channels/imessage.d.ts +13 -2
- package/dist/channels/imessage.d.ts.map +1 -1
- package/dist/channels/imessage.js +161 -15
- package/dist/channels/imessage.js.map +1 -1
- package/dist/channels/telegram.d.ts +8 -1
- package/dist/channels/telegram.d.ts.map +1 -1
- package/dist/channels/telegram.js +142 -4
- package/dist/channels/telegram.js.map +1 -1
- package/dist/channels/text-utils.d.ts +22 -0
- package/dist/channels/text-utils.d.ts.map +1 -1
- package/dist/channels/text-utils.js +40 -0
- package/dist/channels/text-utils.js.map +1 -1
- package/dist/channels/types.d.ts +41 -0
- package/dist/channels/types.d.ts.map +1 -1
- package/dist/cli/config/cron.d.ts +2 -0
- package/dist/cli/config/cron.d.ts.map +1 -0
- package/dist/cli/config/cron.js +83 -0
- package/dist/cli/config/cron.js.map +1 -0
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +19 -0
- package/dist/cli/config/index.js.map +1 -1
- package/dist/cli/cron.d.ts.map +1 -1
- package/dist/cli/cron.js +27 -9
- package/dist/cli/cron.js.map +1 -1
- package/dist/cli/daemon.d.ts +0 -1
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/daemon.js +2 -47
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/lcm.js +12 -1
- package/dist/cli/lcm.js.map +1 -1
- package/dist/cli/status-info.d.ts +10 -0
- package/dist/cli/status-info.d.ts.map +1 -0
- package/dist/cli/status-info.js +40 -0
- package/dist/cli/status-info.js.map +1 -0
- package/dist/cli/status.d.ts +33 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +111 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/continuity.d.ts.map +1 -1
- package/dist/continuity.js +2 -1
- package/dist/continuity.js.map +1 -1
- package/dist/cron/format.d.ts +8 -0
- package/dist/cron/format.d.ts.map +1 -0
- package/dist/cron/format.js +38 -0
- package/dist/cron/format.js.map +1 -0
- package/dist/cron/scheduler.d.ts.map +1 -1
- package/dist/cron/scheduler.js +2 -1
- package/dist/cron/scheduler.js.map +1 -1
- package/dist/cron/store.d.ts +6 -0
- package/dist/cron/store.d.ts.map +1 -1
- package/dist/cron/store.js +28 -0
- package/dist/cron/store.js.map +1 -1
- package/dist/lcm/blocks.d.ts +14 -7
- package/dist/lcm/blocks.d.ts.map +1 -1
- package/dist/lcm/blocks.js +77 -59
- package/dist/lcm/blocks.js.map +1 -1
- package/dist/lcm/compact.d.ts +9 -0
- package/dist/lcm/compact.d.ts.map +1 -1
- package/dist/lcm/compact.js +69 -7
- package/dist/lcm/compact.js.map +1 -1
- package/dist/lcm/runner.d.ts.map +1 -1
- package/dist/lcm/runner.js +7 -5
- package/dist/lcm/runner.js.map +1 -1
- package/dist/lcm/stats.d.ts +13 -4
- package/dist/lcm/stats.d.ts.map +1 -1
- package/dist/lcm/stats.js +59 -20
- package/dist/lcm/stats.js.map +1 -1
- package/dist/mcp/internal-server.d.ts.map +1 -1
- package/dist/mcp/internal-server.js +78 -12
- package/dist/mcp/internal-server.js.map +1 -1
- package/dist/mcp/people-tools.d.ts +28 -0
- package/dist/mcp/people-tools.d.ts.map +1 -0
- package/dist/mcp/people-tools.js +95 -0
- package/dist/mcp/people-tools.js.map +1 -0
- package/dist/people.d.ts +134 -0
- package/dist/people.d.ts.map +1 -0
- package/dist/people.js +387 -0
- package/dist/people.js.map +1 -0
- package/dist/router.js +1 -8
- package/dist/router.js.map +1 -1
- package/dist/sessions/keys.d.ts +2 -0
- package/dist/sessions/keys.d.ts.map +1 -1
- package/dist/sessions/keys.js +7 -0
- package/dist/sessions/keys.js.map +1 -1
- package/dist/sessions/pause-store.d.ts +24 -0
- package/dist/sessions/pause-store.d.ts.map +1 -0
- package/dist/sessions/pause-store.js +62 -0
- package/dist/sessions/pause-store.js.map +1 -0
- package/dist/sessions/store.d.ts +3 -2
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +19 -6
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +7 -0
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/tomo-event.d.ts +64 -0
- package/dist/tomo-event.d.ts.map +1 -0
- package/dist/tomo-event.js +139 -0
- package/dist/tomo-event.js.map +1 -0
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/index.js +37 -2
- package/dist/workspace/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,45 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.8.10 (2026-07-06)
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- **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.
|
|
8
|
+
- **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`.
|
|
9
|
+
- **`/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`.
|
|
10
|
+
- **`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.
|
|
11
|
+
- **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).
|
|
12
|
+
|
|
13
|
+
### Bug fixes
|
|
14
|
+
|
|
15
|
+
- **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.
|
|
16
|
+
- **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.
|
|
17
|
+
- **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.
|
|
18
|
+
- **`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.
|
|
19
|
+
|
|
20
|
+
## 0.8.9 (2026-07-05)
|
|
21
|
+
|
|
22
|
+
### Features
|
|
23
|
+
|
|
24
|
+
- **People registry for group-chat identity recognition** (#214). Group senders used to be just a display-name string, so a friend using a nickname, renaming their Telegram profile, or appearing under a different name per channel looked like a different person — and recognition relied on the model remembering to consult a freeform memory file. Identity resolution is now deterministic and harness-side, keyed on stable channel ids, with a structured people registry as the source of truth: `IncomingMessage` carries a `senderId` (Telegram user id, normalized iMessage address); `SessionEntry.participantIds` tracks display names seen per id so profile renames stay one human; person records live at `memory/people/*.md` (DM-only ones under `memory/private/people/`) with name/aliases/handles frontmatter and automatic handle binding the first time a sender's name unambiguously matches an unbound record. Group transcript lines annotate the canonical identity inline (`kw 🚀 (Kevin Wang): ...`), the group prompt lists resolved participants, and every prompt gets a PEOPLE roster. New `list_people` / `upsert_person` MCP tools let the agent maintain the registry. Private records never enter group flows: the transcript annotation and auto-bind candidates are unconditionally public-scoped (so a group-only DM record can't leak or double-bind), and display-name matching falls back to comparing with emoji/symbols/punctuation stripped so a decorated profile name (`kw 🚀`) still binds against alias `kw`.
|
|
25
|
+
- **Prune-first context nudge** (#211). The compaction ladder now attempts a cheaper tool-result prune before escalating to a daily rollup nudge. The post-turn context-pressure check is skipped on the turn that actually compacted, whose in-memory reading is measured against the pre-rewrite context and always reads stale-high — that stale reading used to escalate every prune straight into a daily rollup, defeating prune-first; the next turn's fresh reading on the reloaded session now drives both escalation and latch reset.
|
|
26
|
+
- **Satellite iMessage tagging** (18d0e37). Inbound iMessage text from an iMessageLite / satellite source (detected from the BlueBubbles message or handle service) is prefixed with a short satellite marker, with dispatch-level coverage for serialized handle service and empty satellite rows.
|
|
27
|
+
|
|
28
|
+
### Bug fixes
|
|
29
|
+
|
|
30
|
+
- **Proactive and system-turn deliveries are now recorded and correctly routed** (#204, #205, #206). A batch of `#203` fixes closing the "delivered but unrecallable / misrouted" gaps for messages the assistant sends outside a user turn. Continuity heartbeats, cron-window deliveries made during heartbeat turns, and the post-restart status notice were never written to the transcript (the continuity `TurnSpec` used `transcript: "never"`, now `"on-delivery"`; the opt-out policy was removed so no turn type can skip recording again). `send_message` calls targeting a raw `<channel>:<chatId>` key that matches an identity's bound DM chat now canonicalize to that identity's `dm:` session for transcript/recall purposes while delivery stays pinned to the named channel, and `delegateToSession` threads the raw reply-target through as a delivery override so a pinned `telegram:<chatId>` delegate no longer gets re-routed to a different channel by the dm session's reply policy. `normalizeSendTarget` now matches iMessage chats by the identifier extracted from the chat GUID (shared with the router via `extractImessageIdentifier` in `sessions/keys.ts`), with group keys excluded.
|
|
31
|
+
- **LCM compaction range safety anchors** (#209). Compaction ranges are now guarded with UUID anchors so a range resolved against one view of the session file can't silently compact the wrong events if the file shifted underneath it.
|
|
32
|
+
- **LCM nudge: empty daily nudges and CJK token estimates** (#207). Empty daily nudges are handled instead of firing a no-op housekeeping turn, and the token estimate accounts for CJK text; a redundant nudge session lookup was also removed.
|
|
33
|
+
- **LCM cleanup: dead code, TOCTOU trigger race, and timezone parsing** (#206). Removed a duplicated `removeSet` loop in `compact.ts` whose comment described behavior that didn't exist, plus unused `countRawTailToday`/`convIndices` helpers; `checkAndClearCompactTrigger` now unlinks directly and treats `ENOENT` as "no trigger" so a concurrent clear can't throw out of post-turn bookkeeping; and `resolveTimeRange` parses date-only boundaries (`YYYY-MM-DD`) as the full local day instead of UTC midnight, so `--to-time 2026-03-28` now includes that whole day.
|
|
34
|
+
|
|
35
|
+
### Other
|
|
36
|
+
|
|
37
|
+
- **Unified `<tomo-event>` envelope for harness-composed messages** (#212). The two ad-hoc conventions for harness-injected user-turn messages (bare `System: ...` prefix and bracketed `[System: ...]` note) are replaced with a single XML envelope built by one helper, migrating all 13 producers (heartbeat, restart, cron, lcm-rollup, context-nudges, summon/dismiss, audience, errors, direct-send, delegate) with body content unchanged; consumers stay tolerant of the legacy forms so old transcripts never need migration. The envelope escapes any body-injected `</tomo-event>` closer with a minimal injective scheme so user-controlled cron/direct-send/delegate text round-trips exactly and can't close the envelope early. Also adds a conservative outbound scaffold-leak filter that truncates assistant messages at an anchored `end_of_dialog` sentinel or a paragraph-initial narrator leak before delivery.
|
|
38
|
+
- **LCM rollup quality feedback** (#210). Improved the quality signal surfaced by the daily-rollup path so low-value rollups are easier to spot.
|
|
39
|
+
- Bump `@anthropic-ai/claude-agent-sdk` from 0.3.195 to 0.3.201 (#217).
|
|
40
|
+
- Bump `@clack/prompts` from 1.6.0 to 1.7.0 (#216).
|
|
41
|
+
- Bump dev dependencies: `tsx` 4.22.4 → 4.23.0 and `typescript-eslint` 8.62.0 → 8.62.1 (#215).
|
|
42
|
+
|
|
3
43
|
## 0.8.8 (2026-07-03)
|
|
4
44
|
|
|
5
45
|
### Features
|
package/README.md
CHANGED
|
@@ -46,11 +46,19 @@ tomo start # Start in background (daemon)
|
|
|
46
46
|
tomo start -f # Start in foreground (for dev)
|
|
47
47
|
tomo stop # Stop the daemon
|
|
48
48
|
tomo restart # Restart the daemon
|
|
49
|
+
tomo restart --reason "..." # Restart and tell the agent why afterward
|
|
49
50
|
tomo status # Show PID and uptime
|
|
50
51
|
tomo logs # View logs (pretty-printed)
|
|
51
52
|
tomo logs -f # Follow logs live
|
|
52
53
|
tomo sessions list # Show active sessions
|
|
53
|
-
tomo sessions clear
|
|
54
|
+
tomo sessions clear [key] # Unlink one session (or all sessions)
|
|
55
|
+
tomo cron # Manage scheduled tasks (add / list / remove / run <id>)
|
|
56
|
+
tomo continuity # Manually trigger a continuity heartbeat
|
|
57
|
+
tomo lcm # Context tools (stats / blocks / compact / search / prune-tools / rollups)
|
|
58
|
+
tomo backup # Back up all Tomo data (create / list / restore <date>)
|
|
59
|
+
tomo migrate # Import conversation history from other platforms (openclaw <file>)
|
|
60
|
+
tomo update # Update Tomo to the latest version and restart
|
|
61
|
+
tomo uninstall # Stop Tomo and remove the login item (keeps your data)
|
|
54
62
|
```
|
|
55
63
|
|
|
56
64
|
## Chat Commands
|
|
@@ -60,10 +68,14 @@ tomo sessions clear # Reset all sessions
|
|
|
60
68
|
| `/new` | Start a new conversation (resets session) |
|
|
61
69
|
| `/model` | Switch model (Claude aliases, direct model IDs, or LiteLLM `provider/model` names) |
|
|
62
70
|
| `/restore` | Restore `config.json` from `config.json.bak` and restart |
|
|
63
|
-
| `/login` | Refresh Claude login from a configured owner's private DM |
|
|
71
|
+
| `/login` | Refresh Claude login from a configured owner's private DM (`/login cancel` aborts a pending login) |
|
|
64
72
|
| `/status` | Show session info (model, channel, message count) |
|
|
65
73
|
| `/cost` | Show current-session cost for 1d / 7d / 1mo |
|
|
66
74
|
| `/pet` | Check Tomo's pet's mood, growth stage, and stats |
|
|
75
|
+
| `/summon` | (groups) Pull your main DM session into this group temporarily |
|
|
76
|
+
| `/dismiss` | (groups) Hand the group back to its own Tomo session |
|
|
77
|
+
|
|
78
|
+
**Summon** — `/summon` in a group routes that group's messages into your main `dm:` session, so Tomo answers with your full personal context. Group-facing replies go through an explicit `send_message` direct call; plain output stays in your private DM. `/dismiss` hands back, and the summon auto-expires after `summonExpiryMinutes` (default 60) of group inactivity.
|
|
67
79
|
|
|
68
80
|
## Features
|
|
69
81
|
|
|
@@ -83,6 +95,12 @@ During `tomo init`, you choose a name, your preferred name, and a tone (chill /
|
|
|
83
95
|
|
|
84
96
|
File-based persistent memory at `~/.tomo/workspace/memory/`. The `MEMORY.md` index is injected into every conversation. Tomo reads and writes memory files autonomously — it remembers who you are, your preferences, and past context across sessions.
|
|
85
97
|
|
|
98
|
+
Beyond memory files, the `recall_conversation` tool lets Tomo search a session's full message history — including everything compacted out of its context window or archived to monthly transcript files.
|
|
99
|
+
|
|
100
|
+
### People Registry
|
|
101
|
+
|
|
102
|
+
Tomo keeps person records at `~/.tomo/workspace/memory/people/*.md` — canonical name, aliases/nicknames, and per-channel handles in frontmatter, freeform notes below. Group messages are annotated with the sender's resolved name, and handles auto-bind the first time a sender's display name matches a record — you only ever refer to people by name. Records meant for your eyes only live under `memory/private/people/` and never enter group chats. Tomo maintains the registry itself via the `list_people` / `upsert_person` tools.
|
|
103
|
+
|
|
86
104
|
### Channels
|
|
87
105
|
|
|
88
106
|
- **Telegram** — DM and group chat support
|
|
@@ -119,8 +137,19 @@ Tomo has access to Claude's built-in tools:
|
|
|
119
137
|
| Skill | Specialized workflows |
|
|
120
138
|
| TodoWrite | Task tracking within a turn |
|
|
121
139
|
| NotebookEdit | Edit Jupyter notebooks |
|
|
122
|
-
|
|
123
|
-
|
|
140
|
+
|
|
141
|
+
Plus a built-in `tomo-internal` MCP server:
|
|
142
|
+
|
|
143
|
+
| Group | Tool | Capability |
|
|
144
|
+
|-------|------|-----------|
|
|
145
|
+
| Messaging | `send_message` | Message another session — `delegate` mode (recipient's Claude composes) or `direct` mode (verbatim text) |
|
|
146
|
+
| | `list_sessions` | List identities and active group chats (titles, participants) |
|
|
147
|
+
| | `rename_group_chat` | Rename a real Telegram/iMessage group chat |
|
|
148
|
+
| | `react_to_message` | React/tapback to a message in a session — latest inbound by default, or matched by text |
|
|
149
|
+
| Scheduling | `schedule_create` / `schedule_list` / `schedule_remove` | Manage scheduled tasks (one-shot, interval, or cron) |
|
|
150
|
+
| People | `list_people` / `upsert_person` | Read and maintain the people registry |
|
|
151
|
+
| History | `recall_conversation` | Search the session's full history, including compacted and archived messages |
|
|
152
|
+
| Pet | `pet_status` / `pet_hatch` / `pet_feed` / `pet_play` / `pet_sleep` | Care for Tomo's virtual pet |
|
|
124
153
|
|
|
125
154
|
### External MCP Servers
|
|
126
155
|
|
|
@@ -166,6 +195,10 @@ If browser login is needed, Tomo forwards the authorize URL to your private chat
|
|
|
166
195
|
|
|
167
196
|
Tomo can create scheduled tasks on its own — just ask "remind me in 30 minutes to stretch" or "check the weather every morning at 9am." Supports one-shot reminders, recurring intervals, and cron expressions.
|
|
168
197
|
|
|
198
|
+
### Pet
|
|
199
|
+
|
|
200
|
+
Tomo can hatch and raise a virtual pet — Tamagotchi-style, with hunger, mood, energy, and growth stages, persisted in `~/.tomo/data/pet.json`. Tomo cares for it with its pet tools; check in with `/pet`.
|
|
201
|
+
|
|
169
202
|
### Sessions
|
|
170
203
|
|
|
171
204
|
- Multi-turn conversations via Claude Agent SDK session resume
|
|
@@ -173,6 +206,10 @@ Tomo can create scheduled tasks on its own — just ask "remind me in 30 minutes
|
|
|
173
206
|
- `/new` in Telegram to start fresh
|
|
174
207
|
- Unlinked sessions kept for 30 days before cleanup
|
|
175
208
|
|
|
209
|
+
### Context Management (LCM)
|
|
210
|
+
|
|
211
|
+
Instead of lossy auto-compaction, long conversations are rolled up into hierarchical summary blocks (daily → weekly → monthly → yearly), so old context degrades gracefully rather than disappearing. The `lcm` config block controls the housekeeping nudges: at `nudgeAtPct` context usage (default 70%) Tomo is prompted to prune bulky tool results or run a rollup, re-arming once usage drops below `nudgeResetPct`; `groupCompactStyle` chooses hierarchical rollups (`"lcm"`, default) or SDK auto-compact (`"sdk"`) for group chats.
|
|
212
|
+
|
|
176
213
|
### Logging
|
|
177
214
|
|
|
178
215
|
Structured logs via [pino](https://github.com/pinojs/pino):
|
|
@@ -190,11 +227,16 @@ Structured logs via [pino](https://github.com/pinojs/pino):
|
|
|
190
227
|
SOUL.md # Your personality config
|
|
191
228
|
AGENT.md # Your operating rules
|
|
192
229
|
IDENTITY.md # Your identity config
|
|
230
|
+
CONTINUITY.md # Standing instructions for continuity heartbeats
|
|
193
231
|
memory/ # Persistent memory files
|
|
232
|
+
people/ # People registry records (private ones under memory/private/people/)
|
|
233
|
+
secrets/ # Harness-managed credentials (e.g. MCP OAuth tokens, mode 0600)
|
|
194
234
|
.claude/skills/ # Agent skills
|
|
195
235
|
data/
|
|
196
236
|
cron/jobs.json # Scheduled tasks
|
|
197
237
|
sessions/ # Transcript logs and session registry
|
|
238
|
+
pet.json # Virtual pet state
|
|
239
|
+
summons.json # Active group summons
|
|
198
240
|
logs/
|
|
199
241
|
tomo.log # Daemon logs
|
|
200
242
|
```
|
|
@@ -240,6 +282,7 @@ Run `tomo config` for interactive setup, or edit `~/.tomo/config.json` directly:
|
|
|
240
282
|
"maxOutputChars": 8000
|
|
241
283
|
},
|
|
242
284
|
"groupSecret": "tomo-xxxxxxxx",
|
|
285
|
+
"summonExpiryMinutes": 60,
|
|
243
286
|
"lcm": {
|
|
244
287
|
"nudgeAtPct": 70,
|
|
245
288
|
"nudgeResetPct": 60,
|
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 `
|
|
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
|
|
|
@@ -35,6 +35,6 @@ How to reply to a summoned group message:
|
|
|
35
35
|
- **To the group**: call `send_message` with the group's session key and mode `direct`. Compose the message yourself — you are the session with the context. Never use `delegate` for a summoned group; that wakes the group's own session, which is exactly what summoning bypasses.
|
|
36
36
|
- **To the user privately**: plain text replies in a summoned turn go to the user's private DM, not the group. Use that only for side-notes worth telling them privately; otherwise end the turn with `NO_REPLY`.
|
|
37
37
|
- Match the group's tone and reply like a participant — short, no headers, address people by name when natural. Not every message needs a group reply; stay silent (`NO_REPLY`, no tool call) for chatter that isn't for you.
|
|
38
|
-
- The harness flags audience changes (`[System: audience switched ...]`) whenever consecutive messages hop between the private DM and a group, or between groups. Treat that as a hard reset of tone and privacy — trust the tags over conversational momentum.
|
|
38
|
+
- The harness flags audience changes (a `<tomo-event type="audience" ...>` envelope; legacy transcripts show `[System: audience switched ...]`) whenever consecutive messages hop between the private DM and a group, or between groups. Treat that as a hard reset of tone and privacy — trust the tags over conversational momentum.
|
|
39
39
|
|
|
40
40
|
Everyone in the group can read what you send it. Keep private memories and DM context out of group-facing messages — being summoned shares your judgment and knowledge, not the user's private life.
|
|
@@ -45,7 +45,7 @@ tomo lcm yearly --session-id SESSION_ID --summary "<yearly summary>" # last c
|
|
|
45
45
|
|
|
46
46
|
These consume block summaries already in your context — no tool calls needed to fetch source data. You just read the child blocks and synthesize.
|
|
47
47
|
|
|
48
|
-
The harness will nudge you via a
|
|
48
|
+
The harness will nudge you via a `<tomo-event type="lcm-rollup" ...>` message when rollups are due (idempotent — catches missed Mondays etc.).
|
|
49
49
|
|
|
50
50
|
## Other commands
|
|
51
51
|
|
|
@@ -91,7 +91,7 @@ Reply with exactly `NO_REPLY` to suppress delivery to the channel. Use for backg
|
|
|
91
91
|
Every message includes a timestamp prefix like `[Mon 04/07 14:30 PDT]` so you always know the current time.
|
|
92
92
|
|
|
93
93
|
### System messages
|
|
94
|
-
|
|
94
|
+
Harness-composed messages (cron triggers, heartbeats, group context) arrive wrapped in a `<tomo-event type="..." ts="...">` envelope. Legacy transcripts show them prefixed with `System:` or `[System: ...]` instead. Either way they are from the harness, not from a human.
|
|
95
95
|
|
|
96
96
|
### Group chats
|
|
97
97
|
Two listen modes per group:
|
|
@@ -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-
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audience.d.ts","sourceRoot":"","sources":["../../src/agent/audience.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"audience.d.ts","sourceRoot":"","sources":["../../src/agent/audience.ts"],"names":[],"mappings":"AAEA;;sBAEsB;AACtB,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEtG;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,SAAS,EAAE,MAAM,EAAE,EACnB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAClC,MAAM,CAgBR"}
|
package/dist/agent/audience.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { formatTomoEvent } from "../tomo-event.js";
|
|
1
2
|
/** Audience identifier for an inbound message on a unified dm: session —
|
|
2
3
|
* "dm" for private messages, the raw "<channel>:<chatId>" key for (summoned)
|
|
3
4
|
* group messages. */
|
|
@@ -19,10 +20,10 @@ export function audienceSwitchNote(prev, audiences, label) {
|
|
|
19
20
|
return "";
|
|
20
21
|
const distinct = [...new Set(audiences)];
|
|
21
22
|
if (distinct.length > 1) {
|
|
22
|
-
return `
|
|
23
|
+
return formatTomoEvent("audience", `Audience check — the messages below span ${distinct.map(label).join(" and ")}. Mind each message's tag when replying; group replies only via send_message.`, { name: "check" });
|
|
23
24
|
}
|
|
24
25
|
if (prev === undefined || distinct[0] === prev)
|
|
25
26
|
return "";
|
|
26
|
-
return `
|
|
27
|
+
return formatTomoEvent("audience", `Audience switched — the previous message in this session was from ${label(prev)}; this one is from ${label(distinct[0])}. Re-anchor tone and privacy to the new audience.`, { name: "switch" });
|
|
27
28
|
}
|
|
28
29
|
//# sourceMappingURL=audience.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audience.js","sourceRoot":"","sources":["../../src/agent/audience.ts"],"names":[],"mappings":"AAAA;;sBAEsB;AACtB,MAAM,UAAU,UAAU,CAAC,WAAmB,EAAE,OAA8C;IAC5F,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACrE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAwB,EACxB,SAAmB,EACnB,KAAmC;IAEnC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IACzC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"audience.js","sourceRoot":"","sources":["../../src/agent/audience.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;sBAEsB;AACtB,MAAM,UAAU,UAAU,CAAC,WAAmB,EAAE,OAA8C;IAC5F,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACrE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAwB,EACxB,SAAmB,EACnB,KAAmC;IAEnC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IACzC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,eAAe,CACpB,UAAU,EACV,4CAA4C,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,+EAA+E,EAC5J,EAAE,IAAI,EAAE,OAAO,EAAE,CAClB,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC1D,OAAO,eAAe,CACpB,UAAU,EACV,qEAAqE,KAAK,CAAC,IAAI,CAAC,sBAAsB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,mDAAmD,EAC3K,EAAE,IAAI,EAAE,QAAQ,EAAE,CACnB,CAAC;AACJ,CAAC"}
|
package/dist/agent/commands.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/agent/commands.js
CHANGED
|
@@ -8,6 +8,7 @@ import { DEFAULT_MODEL, MODEL_ALIASES, isLiteLlmProviderModel, modelHelpText, re
|
|
|
8
8
|
import { buildSessionCostReport } from "../costs.js";
|
|
9
9
|
import { CHATGPT_SUBSCRIPTION_DEFAULT_MODEL, CHATGPT_SUBSCRIPTION_MODE, isChatGptSubscriptionModel, liteLlmModeLabel, } from "../litellm.js";
|
|
10
10
|
import { log } from "../logger.js";
|
|
11
|
+
import { formatTomoEvent } from "../tomo-event.js";
|
|
11
12
|
import { PetStore } from "../mcp/pet-store.js";
|
|
12
13
|
import { ClaudeLoginManager } from "./claude-login.js";
|
|
13
14
|
/** Back up ~/.tomo/config.json before a programmatic rewrite. */
|
|
@@ -17,7 +18,7 @@ export function backupConfigFile() {
|
|
|
17
18
|
}
|
|
18
19
|
/**
|
|
19
20
|
* Handles slash commands typed in chat (/new, /model, /status, /pet,
|
|
20
|
-
* /cost, /restore, /login).
|
|
21
|
+
* /cost, /restore, /login, /pause, /resume).
|
|
21
22
|
* Wired to Channel.onCommand by the Agent.
|
|
22
23
|
*/
|
|
23
24
|
export class ChatCommandHandler {
|
|
@@ -35,6 +36,14 @@ export class ChatCommandHandler {
|
|
|
35
36
|
this.claudeLogin.stop();
|
|
36
37
|
}
|
|
37
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
|
+
}
|
|
38
47
|
if (this.restoringConfig) {
|
|
39
48
|
await channel.send({ chatId, text: "Restore is already in progress. Restarting Tomo..." });
|
|
40
49
|
return;
|
|
@@ -50,6 +59,10 @@ export class ChatCommandHandler {
|
|
|
50
59
|
await this.handleSummonCommand(channel, command, chatId, senderName, senderId);
|
|
51
60
|
return;
|
|
52
61
|
}
|
|
62
|
+
if (command === "pause" || command === "resume") {
|
|
63
|
+
await this.handlePauseCommand(channel, command, chatId, senderName);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
53
66
|
if (command === "new") {
|
|
54
67
|
this.deps.closeLiveSession(key);
|
|
55
68
|
this.deps.sessions.clearSdkSessionId(key);
|
|
@@ -58,6 +71,11 @@ export class ChatCommandHandler {
|
|
|
58
71
|
return;
|
|
59
72
|
}
|
|
60
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
|
+
}
|
|
61
79
|
const arg = args?.trim();
|
|
62
80
|
if (!arg) {
|
|
63
81
|
const current = this.deps.modelOverrides.get(key) ?? config.model;
|
|
@@ -96,8 +114,14 @@ export class ChatCommandHandler {
|
|
|
96
114
|
return;
|
|
97
115
|
}
|
|
98
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
|
+
}
|
|
99
124
|
this.deps.modelOverrides.set(key, resolved);
|
|
100
|
-
this.persistModelOverride(key, resolved);
|
|
101
125
|
// Model changes require a fresh SDK child process, but keep the SDK
|
|
102
126
|
// session ID so continuity survives switching between Claude and LiteLLM.
|
|
103
127
|
// getOrCreateLiveSession repairs provider-specific JSONL quirks before
|
|
@@ -108,6 +132,11 @@ export class ChatCommandHandler {
|
|
|
108
132
|
return;
|
|
109
133
|
}
|
|
110
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
|
+
}
|
|
111
140
|
await this.restoreConfigAndRestart(channel, chatId);
|
|
112
141
|
return;
|
|
113
142
|
}
|
|
@@ -153,6 +182,9 @@ export class ChatCommandHandler {
|
|
|
153
182
|
const summoned = this.deps.router.getSummonedIdentity(channel.name, chatId);
|
|
154
183
|
if (summoned)
|
|
155
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
|
+
}
|
|
156
188
|
lines.push(`Model: ${model}`);
|
|
157
189
|
if (config.litellm?.baseUrl) {
|
|
158
190
|
lines.push(`Gateway: LiteLLM (${liteLlmModeLabel(config.litellm.mode)})`);
|
|
@@ -207,7 +239,7 @@ export class ChatCommandHandler {
|
|
|
207
239
|
return;
|
|
208
240
|
}
|
|
209
241
|
this.deps.router.dismissGroup(channel.name, chatId);
|
|
210
|
-
this.deps.queuePendingNote(`dm:${summoned}`, `
|
|
242
|
+
this.deps.queuePendingNote(`dm:${summoned}`, formatTomoEvent("dismiss", `You have been dismissed from the group "${groupLabel}" — its messages no longer reach this session, and the group's own Tomo session has taken back over.`, { name: rawKey }));
|
|
211
243
|
await channel.send({ chatId, text: "Handed back to this group's own Tomo session." });
|
|
212
244
|
return;
|
|
213
245
|
}
|
|
@@ -226,24 +258,80 @@ export class ChatCommandHandler {
|
|
|
226
258
|
const expiryNote = config.summonExpiryMinutes > 0
|
|
227
259
|
? ` or after ${config.summonExpiryMinutes} minutes of group inactivity`
|
|
228
260
|
: "";
|
|
229
|
-
this.deps.queuePendingNote(`dm:${identity.name.toLowerCase()}`,
|
|
261
|
+
this.deps.queuePendingNote(`dm:${identity.name.toLowerCase()}`, formatTomoEvent("summon", `${identity.name} summoned you into the group chat "${groupLabel}" (${rawKey}). Until dismissed${expiryNote}, messages from that group arrive in this session tagged [group ...] with the sender's name. To reply in the group, call send_message with mode "direct" and target "${rawKey}" — compose the reply yourself, with your context. Plain text you output goes to ${identity.name}'s private DM, not the group. Everyone in the group can read what you send it — keep private memory and DM context out of group-facing messages.`, { name: rawKey }));
|
|
230
262
|
log.info({ channel: channel.name, chatId, identity: identity.name, sender: senderName }, "Group summoned via /summon");
|
|
231
263
|
await channel.send({
|
|
232
264
|
chatId,
|
|
233
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` : ""}.`,
|
|
234
266
|
});
|
|
235
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. */
|
|
236
317
|
persistModelOverride(key, model) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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
|
+
}
|
|
247
335
|
}
|
|
248
336
|
async handleClaudeLogin(channel, chatId, senderId, args) {
|
|
249
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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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type ContextNudgeLatch = "prune" | "daily" | "compact";
|
|
2
|
+
export type ContextNudgeDecision = {
|
|
3
|
+
kind: "none";
|
|
4
|
+
newLatch: ContextNudgeLatch | null;
|
|
5
|
+
} | {
|
|
6
|
+
kind: "prune";
|
|
7
|
+
newLatch: "prune";
|
|
8
|
+
} | {
|
|
9
|
+
kind: "daily";
|
|
10
|
+
newLatch: "daily";
|
|
11
|
+
} | {
|
|
12
|
+
kind: "compact";
|
|
13
|
+
newLatch: "compact";
|
|
14
|
+
reason: "threshold" | "daily-empty";
|
|
15
|
+
};
|
|
16
|
+
interface DecideContextNudgeInput {
|
|
17
|
+
usedFrac: number;
|
|
18
|
+
latchState: ContextNudgeLatch | undefined;
|
|
19
|
+
prunableSufficient: boolean;
|
|
20
|
+
dailyRangeAvailable: boolean;
|
|
21
|
+
thresholds: {
|
|
22
|
+
nudgeAtPct: number;
|
|
23
|
+
nudgeResetPct: number;
|
|
24
|
+
compactNudgePct: number;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export declare function decideContextNudge(input: DecideContextNudgeInput): ContextNudgeDecision;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=context-nudge.d.ts.map
|