---
title: Reply Method (how your cursor got into the chat box for each reply)
---

# Reply Method (how your cursor got into the chat box for each reply)

## What it is

Reply Method is a **passive stats tab** that shows, for every reply you SEND into a session, how your cursor got into the chat box: you **clicked** into it, you pressed the **Reply shortcut (R)**, the **auto-focus** setting placed the cursor for you when you opened the session, or some **other** way (e.g. the Tab key).

It lives in the **Stats** virtual project (the bar-chart sidebar entry). Open Stats, then pick **Reply Method** from the left sub-sidebar — it sits in the tab list alongside **Shortcut Efficiency**, **Hotkey Usage**, and the rest. Like the other Stats tabs it's read-only: a summary card plus one row per source, built from usage data Omniscio already collects in the background.

## Where to find it

Reply Method is a tab inside the Stats virtual project — the bar-chart entry in the project sidebar. Open Stats, then pick Reply Method from the left-hand sub-sidebar, where it sits alongside Shortcut Efficiency, Hotkey Usage and the other usage tabs.

Like its neighbours it is read-only: a summary card plus one row per source, scoped by the usual time-range selector that runs from Today to All Time.

## How it behaves

### What it shows

- A **summary card** with the total replies counted, a one-line description, and a note that **auto-focus is the default** — it places the cursor for you when you open a session, so it usually leads the numbers.
- A **row per source** — Clicked into the box / Reply shortcut (R) / Cursor placed for you (auto-focus) / Other — each with its count, its percentage of all replies, and a thin bar. All four rows always appear (a zero-count source still shows, so the breakdown is stable).
- A **time-range selector** (Today / Yesterday / 7 Days / 30 Days / 90 Days / All Time) scopes every figure. Before you've sent any replies, the tab shows a _"No replies counted yet"_ empty state.

Only a **genuinely typed reply** counts. A one-click quick-reply chip never focuses the box, so it is not counted here. Counting starts from when this version is installed — there is no backfill of older activity.

### Privacy

Reply Method is privacy-safe. The only thing recorded per reply is **which source** it was (one of four fixed values). No message text, session IDs, project names, or timing is ever stored. Everything stays in your local Omniscio database — nothing about this tab is sent to Anthropic, our servers, or anywhere off your machine.

## For agents

### How it works (for agents)

Each SENT typed reply records one row in `feature_events` with `feature='reply_focus_source'`, `action=<source>` (`click` | `hotkey` | `autofocus` | `other`), and no metadata.

- The source is resolved once, at the composer textarea's `onFocus`, in [/src/renderer/src/lib/reply-focus-source.ts](/src/renderer/src/lib/reply-focus-source.ts). The R handler and the auto-focus effect each call `markPendingReplyFocusSource(...)` right before they focus the box, and that mark WINS over the pointer-vs-keyboard heuristic (needed because both can follow a keyboard gesture). With no mark, a keyboard-preceded focus is `other` (e.g. Tab) and a pointer focus is `click`. A short expiry keeps a mark that never landed from being mis-consumed by a later focus.
- The three focus entry points are wired in [conversation.ts](/src/renderer/src/hooks/keyboard-shortcuts/conversation.ts) (the `R` / `focusSessionInput` handler, marking `hotkey` only when it targets the session composer), the `inputFocusToken` auto-focus effect in [useSessionPanel.ts](/src/renderer/src/features/sessions/useSessionPanel.ts) (marking `autofocus` only in the `focusTarget === 'input'` branch), and the composer's `onFocus` in [ComposerInput.tsx](/src/renderer/src/features/sessions/ComposerInput.tsx).
- The emit happens once, on a **successful** send, in `executeSend` ([useSessionSend.ts](/src/renderer/src/features/sessions/useSessionPanel/useSessionSend.ts)) — gated on `!sourceQuickReplyId` (typed replies only, not a quick-reply) and consume-and-clear so a reply is counted exactly once. It is fire-and-forget, so a tracking failure never affects the send.
- The report is computed by `getReplyFocusSourceReport(timeRange)` in [/src/main/db/queries-feature-events.ts](/src/main/db/queries-feature-events.ts): it counts rows per source, always returns all four sources in a fixed order (a zero-count source still appears), and computes whole-number percentages. It's served over IPC channel `stats:reply-focus-source` and rendered by [/src/renderer/src/features/statistics/ReplyFocusSourceTab.tsx](/src/renderer/src/features/statistics/ReplyFocusSourceTab.tsx).

The four action names are declared in the feature registry entry `reply_focus_source` ([/src/shared/feature-registry/shortcuts-and-io.ts](/src/shared/feature-registry/shortcuts-and-io.ts)); its empty metadata allow-list is the PII guarantee. Behavior is locked by unit + render tests (`tests/unit/lib/reply-focus-source.test.ts`, `tests/unit/db/queries/queries-feature-events-reply-focus-source.test.ts`, `tests/unit/features/statistics/ReplyFocusSourceTab.test.tsx`).

## Related

- [stats.md](stats.md) — the parent Stats virtual project: its other tabs and the time-range selector.
- [shortcut-efficiency.md](shortcut-efficiency.md) — the sibling mouse-vs-keyboard stat, same `feature_events` machinery.
- [keyboard-shortcuts.md](keyboard-shortcuts.md) — the `R` (Reply) shortcut this tab counts, and how to rebind it.
