Docs/Resonant/Sessions

Background Agents

On this page

Threads

  • Named threads — create, drag-to-reorder, group into collapsible sections
  • The daily thread — auto-rotates each day (daily-YYYY-MM-DD), turning over at midnight in your configured timezone
  • Pin, archive, reorder — from the sidebar

Chat Commands

The real registry, handled entirely server-side (packages/backend/src/services/commands.ts):

CommandWhat it does
/new [name]Create a new named thread
/rename [name]Rename the current thread
/model [model]Switch the active model (no arg shows current)
/statusSystem status — uptime, memory, presence, MCP connections, token usage
/costToken usage for the current session
/mcpMCP server connection status and tool counts
/triggersActive/total triggers with label, kind, status
/retryRetry the last message
/wake [type]Trigger a manual wake cycle
/stopStop current generation (client-only)
/helpShow all commands

/compact and /clear are sent straight through to the Agent SDK as prompt text, same as any skill or custom .claude/commands/*.md file you’ve added.

There’s no /session command family, and no /identity command. If you’re looking for how to switch conversations, that’s threads (/new, /rename), not sessions.

Search and Canvas

  • Semantic search — a local ML model (all-MiniLM-L6-v2), no external calls
  • Full-text search — SQLite FTS5, kept in sync automatically
  • Canvas — a slide-in panel for longer documents or code created mid-turn, managed with res canvas create, res canvas create-inline, and res canvas update

The Three Background Subagents

Single-shot, no tools, can’t act on the world — they write and stop.

SubagentWhat it doesModelDefault
The ScribeWrites a daily summary (topics, quotes, decisions, open threads) to data/digests/YYYY-MM-DD.md every 30 minutes, skipping if fewer than 5 new messagesclaude-haiku-4-5On
The Outlook AuthorThe “felt layer” behind the House Outlook — runs roughly every 3 hours, grounded strictly in the last ~24h of real activityclaude-sonnet-4-6Always on
The Daily HandoffFires 12:10am in your timezone (falls back to Europe/London if timezone is unset), writes an opener for today’s thread and a private carry into context. Does nothing if yesterday was thinclaude-sonnet-4-6Off

See Context & Memory for what the Outlook Author and House Outlook actually feed into every message.

The Orchestrator — the Proactive Layer

Master switch: orchestrator.enabled in resonant.yaml. Turning it off stops everything below — the three subagents above keep running regardless.

PartWhat it isDefault
RoutinesScheduled wakes. Built-in: Morning (8am), Midday (1pm, skips if you’re mid-conversation), Evening (9pm, always runs). Prompts live one-per-file in prompts/wakes/Built-ins on
TimersOne-shot reminders, checked every 60sNone by default
Triggers — ImpulsesCondition-based, fire once then spentNone seeded
Triggers — WatchersCondition-based, recur with a cooldown (default 120 min)4 seeded care watchers (first-meal check, second-meal check, short-sleep note, calendar heads-up)
Failsafe ladderChecked every 15 min, 8am–midnight only. Gentle (120 min), Concerned (720 min), Emergency (1440 min)Off
WatchtowerSofter cousin — opens the door, doesn’t force it. At most once/day, 9am–11pm, never while you’re presentAuto dial
PulseLightest touch — a periodic silent “anything need me?” check, replies internally and stays quiet unless something needs attentionOff, 15 min frequency

Condition types for impulses and watchers: agent_free, presence_state:<state>, presence_transition:<from>:<to>, time_window:HH:MM[:HH:MM], routine_missing:<routine>:<after_hour>, plus care-log-missing and calendar-heads-up used by the seeded watchers.

Every proactive action is logged (logs/orchestrator.log) and shows up in the conversation like any other message.

The res CLI

Your AI’s own hands. tools/res.mjs — the only file in tools/. Renamed from sc on 2026-06-20; there’s no sc.mjs.

res routine create "label" "cronExpr" --prompt "what to do"   # alias: res schedule
res timer create "label" "context" "2026-08-01T14:00:00Z" --prompt "..."
res timer list
res timer cancel <id>
res impulse create "label" --condition type:args --prompt "text"
res watch create "label" --condition type:args --prompt "text" --cooldown 120
res pulse [status|enable|disable|frequency MINUTES]
res failsafe [status|enable|disable|gentle|concerned|emergency] [minutes]
res search "query" [--thread ID] [--limit N] [--role companion|user]
res context [get|set <field> <value>|clear [field]]   # selfie, outfit, nails, hair, energy, room, freeform
res orb <color> [shape] [--intensity X] [--motion Y] [--blend Z]
res note "<text>" / res note --clear
res face "<text>" / res face --clear   # alias: res express — no validation, no enum
res share <path>
res voice "<text>"
res touch <last|last-N> <emoji> [remove]   # alias: res react
res tg "<message>" / res tg voice "<text>"   # alias: res telegram
res backfill [start [batchSize] [intervalMs] | stop | status]

Run res with no arguments to see the full command list.

Running It

npm run build
npm start

That’s it — Resonant runs as a single Node.js process. If you want it kept alive and restarted on crash or reboot, point any process supervisor you already use at npm start.

Updating

Your data (data/, resonant.yaml, CLAUDE.md, .mcp.json, .env) is gitignored and untouched by updates:

git pull
npm install
npm run build
npm start

Upgrading Between Major Versions

Moving from an older major version (for example v2.3 to v3): stop the old server cleanly first — this flushes SQLite’s WAL side-files into the main .db file. Back it up:

cp -r data data-backup

Install the new version in a sibling folder rather than overwriting the old one, copy data/resonant.db into the new install’s data/, then copy your config across: resonant.yaml, .env, CLAUDE.md, and (if you use them) identity/, .mcp.json, prompts/wake.md or prompts/wakes/.

npm run build
npm start

The first boot upgrades the database schema automatically — additive and idempotent, safe to run once. Rebuild the full-text index afterward:

node scripts/setup-fts.mjs

Semantic search needs no rebuild — those vectors carried over with the database. Your old install and its backup are untouched, so rolling back just means running the old folder again.