Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
4b7b2be
feat(chat): pin, archive and search columns for conversations (#18)
derekhearst Sep 23, 2026
db748e0
feat(chat): index messages and tool calls for conversation search (#18)
derekhearst Sep 23, 2026
ea75a4c
feat(chat): pin, archive and search remote functions (#18)
derekhearst Sep 23, 2026
a0a6933
feat(chat): export a conversation as Markdown or JSON (#18)
derekhearst Sep 23, 2026
879c445
feat(chat-console): conversation menu, pinned group, archive view and…
derekhearst Sep 23, 2026
97542af
test(chat): pin the conversation lifecycle, search and export (#18)
derekhearst Sep 23, 2026
a4ca4a4
docs(chat): the conversation lifecycle, search and export (#18)
derekhearst Sep 23, 2026
ff9ca17
fix(chat-console): key sidebar groups by day, and keep highlights unp…
derekhearst Sep 23, 2026
bb9bef6
fix(chat-console): a row's hidden actions cannot be clicked
derekhearst Sep 23, 2026
d54eaf7
fix(chat-console): one empty message per search, not two
derekhearst Sep 23, 2026
9df0c82
fix(chat-console): Escape on the row's menu button closes the menu
derekhearst Sep 23, 2026
b211be1
fix(chat): search snippets keep the words around a match (#18)
derekhearst Sep 24, 2026
ad43641
fix(chat): the search backfill skips a message deleted mid-batch (#18)
derekhearst Sep 24, 2026
31d91e3
fix(chat): export file names never split an emoji (#18)
derekhearst Sep 24, 2026
c348fa4
fix(chat-console): pinned chats by pin time, the archive by archive t…
derekhearst Sep 24, 2026
bf37518
fix(chat-console): the archive loads before it says it is empty (#18)
derekhearst Sep 24, 2026
9ab8d7f
fix(chat): a phone's "Recent chats" are the latest, not the pinned (#18)
derekhearst Sep 24, 2026
dafcb42
fix(chat): pin and archive answer 404 for a chat that is not yours (#18)
derekhearst Sep 24, 2026
1821d93
fix(chat): deleting a conversation stops its running turn first (#18)
derekhearst Sep 24, 2026
f242821
test(chat): keep the unarchived chat among the recent ones (#18)
derekhearst Sep 24, 2026
e5f908e
docs(chat): pin and archive order, delete under a running turn, extra…
derekhearst Sep 24, 2026
edbf6a3
Merge feat/32-orchestration into feat/18-conversation-lifecycle
derekhearst Sep 24, 2026
ec198f6
Merge origin/main into feat/18-conversation-lifecycle
derekhearst Sep 24, 2026
cb9305e
Merge origin/main (#95, #24 rewind) into feat/18-conversation-lifecycle
derekhearst Sep 24, 2026
c542668
fix(chat): search and export read a delegated child's card as #32 wri…
derekhearst Sep 24, 2026
d616235
docs(chat): #35's delete notes describe the one delete path it shares…
derekhearst Sep 24, 2026
471e9e6
Merge feat/32-orchestration into feat/18-conversation-lifecycle
derekhearst Sep 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ Self-hosted autonomous AI agent platform for a single owner, with a sandboxed wo

AgentStudio provides a streaming chat interface where the assistant can call tools such as web search and sandboxed code execution. The filesystem toolset supports ranged file reads, full writes, unified-diff patch apply, deterministic string replace, recursive directory listing, search, move/rename, delete, and file metadata lookups. Chat supports editing and branching, interleaved tool and thinking blocks, per-message performance and cost metrics, model selection, and per-prompt reasoning effort selection.

Conversations can be pinned to the top of the sidebar, archived (the everyday way to tidy the list: hidden, never deleted, restored from the Archived view or by replying), renamed, deleted behind a confirmation, and exported as a Markdown transcript or a complete JSON file. The sidebar's search box also searches the whole history on the server — message text and the work each turn did (file paths, commands, links a tool printed) — and shows highlighted extracts. See [docs/chat/chat.md](docs/chat/chat.md).

Shell commands render as a small terminal: the command, its output in a fixed-width font with colour codes cleaned out, the last 20 lines first with a control to show the rest, a copy button, and a badge for how it ended (such as `exit 2`). A command the agent runs in the background (a dev server, a long build) streams its output into that card while the turn runs, shows as a header chip with a stop button, and ends when the reply does; the card and the agent both say so. Deleting a conversation stops its running turn and those commands first. See [docs/chat/spec.md](docs/chat/spec.md#command-output).

Editing a message or regenerating a reply cuts the conversation back so the model sees only what was kept plus the message it is answering. In a project (or an agent with a persistent workspace) the agent's file changes are checkpointed every turn, and Edit and Regenerate offer to restore the files the dropped replies changed — showing the files and line counts first, and asking again before overwriting uncommitted changes in an imported repository. **Compact Conversation** runs the SDK's own `/compact`. See [docs/chat/chat.md](docs/chat/chat.md).
Expand Down Expand Up @@ -219,7 +221,7 @@ Notes:
- Tools (what agents can call, approvals, code execution): `docs/tools/tools.md`
- Chat plan: `docs/chat/plan.md`
- Chat spec (composer shortcuts, attachments, safe rendering): `docs/chat/spec.md`
- Chat: editing, regenerating, restoring files and compacting: `docs/chat/chat.md`
- Chat (conversations: pin, archive, search, export; editing, regenerating, restoring files and compacting): `docs/chat/chat.md`
- Models, the subscription and the optional gateway: `docs/llm/llm.md`
- Memory spec: `docs/memory/spec.md`
- Automations: `docs/automations/automations.md`
Expand Down Expand Up @@ -278,6 +280,7 @@ bun run bench:longmemeval:smoke --dataset=oracle --limit=5
- `/setup` First-run owner account creation (only until an owner exists; asks for the setup token on a production build)
- `/chat` Conversations
- `/chat/[id]` Chat detail, with the Preview + Files rail ([docs](docs/chat-console/chat-console.md))
- `GET /chat/[id]/export?format=md|json` Download one conversation as a Markdown transcript or complete JSON ([docs](docs/chat/chat.md#export-a-conversation))
- `/runs/[id]` One run's event timeline: every tool call, result and approval ([docs](docs/runs/spec.md))
- `/activity` Usage strip (runs, tokens, tools, budget headroom, anomalies) above the activity feed ([docs](docs/activity/spec.md))
- `/review` Cost, recent failures, logs and the review inbox
Expand Down
28 changes: 28 additions & 0 deletions docs/chat-console/chat-console.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,34 @@ Opening another chat from the sidebar gives that chat a fresh page. Nothing the
chat was doing (a reply streaming in, its tool cards, its Stop button, an error and its
Retry) carries over. See "Switching conversations mid-turn" in the chat spec.

### Pinned, archived, searched (#18)

The rules behind these are in the [chat domain doc](../chat/chat.md); this is how the
sidebar presents them.

- **Pinned chats** sit in their own **Pinned** group above everything else, whichever way
the list is grouped (date, project, none), most recently pinned first. The rest of the
list is ordered by last activity.
- **Each row has a "⋯" menu**: Archive, Pin to top / Unpin, Rename, Export as Markdown,
Export as JSON and, last and in red, Delete… (which asks first). On a computer the menu
button and a one-click **Archive** button appear when the pointer is over the row or a
row control has keyboard focus, covering the time label; on a touch screen or in the
phone's navigation drawer the "⋯" button is always shown and the row keeps room for it,
so the title never collapses. The menu opens inline under its row, so neither the
scrolling list nor the drawer can cut it off. Clicking anywhere else, or Escape, closes it.
- **The Status filter** (in the menu under the search box) has three views: **All** (every
chat that is not archived), **Running** (chats with a turn in progress) and **Archived**.
The Archived view shows a bar with a **Back to chats** link, and "Loading…" until the
archive has arrived. It is ordered, grouped by day and labelled by when each chat was
archived rather than by its last activity. ("Archived" used to mean "not running", and
"Active" meant running; both were renamed when the real archive arrived.)
- **The search box** filters the loaded list by title and latest reply as you type. After a
quarter-second pause it also searches the whole history on the server, and matches in
messages and tool calls appear under **In messages**: title, an *archived* badge where it
applies, when the matching message was written, and up to three lines of extract with the
matched words highlighted. The extract is always shown as text; the highlighting is added
by the page. Pinning, archiving, renaming or deleting a chat re-runs the search.

## The right rail

The rail sits to the right of a conversation. It only appears on a chat: the home page
Expand Down
Loading
Loading