Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
20 changes: 20 additions & 0 deletions docs/changes/unreleased/2074-settings-devices-tab.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
kind: added
title: /settings has a Devices tab to add, rename and remove your computers
pr: 2074
surface: [chat]
invalidates:
- >-
Adding and removing computers in the chat was reachable only through
/devices, /pair and the home card, and /settings had nine tabs ending
Connections, Privacy. /settings now has a Devices tab between Connections
and Privacy that lists the same devices as /devices, with r to remove, n to
rename this device, and an "Add another device" row that starts /pair.
- >-
The online dot on /devices was a literal ● in every terminal. It now comes
through the palette's glyph door, so an ASCII terminal draws # beside o.
---

The tab hosts the same device list /devices opens rather than a second one, so
the two cannot disagree. Where pairing cannot work here, it says the same one
sentence /devices says instead of showing an empty list.
14 changes: 14 additions & 0 deletions internal/manual/chat/add-or-remove-a-computer.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,20 @@ desk was removed — it can no longer reach your chats.

The list is in a fixed order: this device first, then devices that are online, then the rest, each by name. Two devices with the same name show a short tail, such as `tower #a1b2`, so you can tell them apart. Your own computer has no `r`: it cannot remove itself, and if you press `r` there the list says `this device cannot remove itself — choose another row.` A computer that is already removed does nothing when you press `r`. A removed computer can only come back as a new request that you approve. If you remove a computer from another of your devices while this list is open, its row changes to `removed` here too, without closing the list. Removing a computer does not undo what it already holds: for a lost computer read the page *Locking out a lost computer for good*.

## Devices in /settings — where your computers are on the settings page, add another device, rename this one, or remove (revoke) one from settings

Open `/settings` (or `ctrl+,`) and walk with `←` and `→` to `Devices`, between `Connections` and `Privacy` — or type `devices`, `remove`, `revoke`, `pair` or `add device` in settings search.

While loading, the tab says `looking up your devices…`. Loaded, it lists your paired computers in the same order and words as `/devices` — `●` online, `○` away (`seen 3h ago`, or `offline`), `this device`, and `removed` — followed by `Add another device`. The open tab refreshes on its own when a computer joins, renames itself or is removed.

The key line shrinks to what works on the row (`↑↓ choose` when there is more than one row, `r remove` only on a removable computer, `←→ categories`, `esc close`):

- `enter add` on `Add another device` leaves `/settings` and starts `/pair`.
- `n rename` on `this device` opens `name this device: ` under the row with `enter save · ctrl+u clear · esc cancel`. While typing, `esc` cancels the edit without closing `/settings`; a second `esc` leaves `/settings`. On another row `n` says `a device renames itself — choose this device's row, or open /devices on the one you mean.`
- `r remove` (called `codeaf devices revoke <name>` on the CLI) removes the computer under the cursor at once, marks its row `removed`, and says `desk was removed — it can no longer reach your chats.` On your own row `r` says `this device cannot remove itself — choose another row.` On `Add another device` or a `removed` row, `r` does nothing.

Where devices cannot work, the tab shows one sentence and no rows: `pairing is not available here` (a chat over `--host` or `--at`), `moving chats needs a newer furrow engine than this build carries`, or the read error. With `CODEAF_SYNC_URL=off` it lists no computers, and `enter add` answers `sync is off (CODEAF_SYNC_URL=off); pairing needs a sync address`, as `/pair` does.

## A device was removed but refreshing the list failed

After a successful removal, its confirmation stays visible even if refreshing the device list fails. The card shows the refresh error too, then clears that error when a later refresh succeeds. A failed refresh does not restore the removed computer's access. If the removal itself fails, the card shows that error and does not confirm a removal.
Expand Down
16 changes: 9 additions & 7 deletions internal/manual/chat/commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -341,7 +341,7 @@ command).
| `/pair` | `/sync`, `/link`, `/laptop` | `<code>` | on the other computer: uses a code from `/pair` there, and shows three words to compare while it waits |
| `/pair` | `/sync`, `/link`, `/laptop` | `<code> --replace` | on the other computer: like `<code>`, but a computer with chats of its own is asked first, and an explicit yes replaces them with the shared ones — chats sealed under the old identity cannot be read afterwards |
| `/pair` | `/sync`, `/link`, `/laptop` | `<link>` | on a device that is already paired: opens a new device's request from the link it shows, with its name, system, time and a check number to compare, then `a` approves and `d` declines |
| `/devices` | — | — | lists your devices with `●` online and `○` away; `n` renames this device, `r` removes the one under the cursor at once, and a removed device can only return as a new request you approve |
| `/devices` | — | — | lists your devices with `●` online and `○` away; `n` renames this device, `r` removes the one under the cursor at once, and a removed device can only return as a new request you approve (`/settings` → `Devices` holds the same list plus `Add another device`) |

The words to type are `/pair`, `/pair <code>`, `/sync`, `/link` and `/laptop`. All five open the same door. In a terminal `codeaf pair --code` shows a code and `codeaf pair <code>` uses one; bare `codeaf pair` requests approval by link instead. The page *Pairing your chats with a second computer* has the whole story: the three words, one attempt for each code, and what revoking cannot take back.

Expand Down Expand Up @@ -1817,7 +1817,7 @@ this split when it opens; configure the remote profile on that machine.
## /settings, /set, /config — opening and navigating settings

`/settings` (or `/set`, `/config`, or ctrl+,) opens a fullscreen page: a tab bar over the
codeaf settings, plus a tab of connected accounts. It was the first of the three fullscreen
codeaf settings, plus tabs for connected accounts and paired devices. It was the first of the three fullscreen
pages here — the others are `/history` (the activity page, ctrl+.) and `/home` — and **only one
of the three is ever up at a time**: opening any one closes the other two.

Expand All @@ -1844,7 +1844,7 @@ and saves. Text and number editors offer adjacent Save/Cancel controls. Invalid
input keeps the draft and shows its error beside it. Escape cancels an open editor
or choice list without saving.

esc backs out one layer at a time: the search first, then anything the `Connections` tab
esc backs out one layer at a time: the search first, then anything the `Connections` or `Devices` tab
has open, then the panel. The head line says `esc close` on the right. The
bottom legend normally reads
`↑↓ move · ←→ tabs · enter change · type to search · esc close`.
Expand Down Expand Up @@ -1918,7 +1918,7 @@ Refusals inside the panel, exactly as written:
they say `that model is chosen where its session is opened`.
- Any refusal from the settings registry is shown on the foot line in the registry's own
words. Nothing is swallowed.
- A search that matches nothing says `nothing matches`. The `Connections` tab has its own
- A search that matches nothing says `nothing matches`. The `Connections` and `Devices` tabs have their own
sentences.

## config.json keys are not read — why codeaf says a setting I wrote is ignored
Expand All @@ -1943,14 +1943,16 @@ value to the key a settings row names (`settings` lists every one), or delete th

Settings now groups controls by what you want to change:

`General · Models · Memory · Tasks · AI teams · Permissions · Spending · Connections · Privacy`
`General · Models · Memory · Tasks · AI teams · Permissions · Spending · Connections · Devices · Privacy`

General holds appearance, input and updates. Models holds model selection and
advanced routing/context controls. Memory holds `notice things to remember` —
whether codeaf may keep a line on its own after a turn you typed — and a link to
the Memories tab. Tasks controls delegated work; AI teams sets defaults
for groups of AI chats. Permissions controls approvals. Spending holds limits.
Connections holds accounts, keys, web search and remote connection settings.
Devices lists your paired computers, renames this one, removes another, and starts
`/pair` from `Add another device`.
Privacy holds history, drafts and data-sharing choices.

Old saved keys and values are unchanged. Search accepts old labels and keys,
Expand All @@ -1965,7 +1967,7 @@ a scrolling category bar. The selected category remains visible; `…` indicates
more categories. Left and right change category and the bar follows. Only
visible controls can be clicked. Hover shows row help without changing its value.

Type to search across settings and connection services. Escape clears the
Type to search across settings, connection services and paired devices. Escape clears the
search before leaving settings. Advanced controls remain searchable while
collapsed. Escape from an editor cancels its unfinished edit.

Expand Down Expand Up @@ -2014,7 +2016,7 @@ have no provider row behind them, so nothing unfolds there and the legend does n
key.

While any of those layers is up — the value box, the model picker, the key box on the
Connections tab — the foot drops `tab next place`, because the layer has taken that key.
Connections tab, the device rename box on the Devices tab — the foot drops `tab next place`, because the layer has taken that key.

## Task model seats and their limits in Settings

Expand Down
4 changes: 2 additions & 2 deletions internal/manual/chat/keys.md
Original file line number Diff line number Diff line change
Expand Up @@ -1966,10 +1966,10 @@ into… picker, typing filters, `↑` `↓` walk, `enter` moves, `esc` cancels.
the *teams page* page.

**Settings panel** (`ctrl+,`): `esc` backs out one layer at a time — search, then an
open account, then the panel · `left`/`shift+tab` and `right`/`tab` change tab ·
open account or device rename, then the panel · `left`/`shift+tab` and `right`/`tab` change tab ·
`up`/`ctrl+p`, `down`/`ctrl+n`, `pgup`, `pgdown`, `home`, `end` walk · `enter` activates,
and `space` activates too — except while a search is on, when it goes into the box, so
a phrase like `shell command` can be written · `backspace`, `ctrl+u`, `ctrl+w` edit the
a phrase like `shell command` can be written · on the **Devices** tab without a search, `n` renames this device and `r` removes the selected computer · `backspace`, `ctrl+u`, `ctrl+w` edit the
search · anything else types into it.

**Sessions place** (`ctrl+.`, or `/history`, or the one dim door line at the bottom of the task
Expand Down
2 changes: 1 addition & 1 deletion internal/manual/chat/models-and-cost.md
Original file line number Diff line number Diff line change
Expand Up @@ -3089,7 +3089,7 @@ Open **Spending** for monetary limits. There is no practice limit: codeaf no lon
The settings panel's tab bar reads, in order:

```
General · Models · Memory · Tasks · AI teams · Permissions · Spending · Connections · Privacy
General · Models · Memory · Tasks · AI teams · Permissions · Spending · Connections · Devices · Privacy
```

Money is on **Spending** and nowhere else. The rows that used to share it are on the two
Expand Down
6 changes: 3 additions & 3 deletions internal/manual/chat/naming-a-device.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Moving chats and pairing are available by default on Linux, macOS and native Win

Older chats move through an independent copy. Once paired, codeaf prepares chats active in the last 30 days in the background, one at a time; opening another older chat prepares its copy then. This build shows and writes to the copy. The original files stay untouched and remain usable in older codeaf builds.

Every screen that names a device uses one name for it: the home rows (`running on tower`, `tower offline`), `Continue tower's latest chat here?`, the approve screen, `tower is now paired. Your chats can continue there.`, `/devices`, and the line after a move, `Moved from tower in 4s`. A device is called by its host name, the word your operating system already uses for it, until you give it a name. A name is only a label. It is not a key and it signs nothing, and renaming a device changes nothing about what it can reach.
Every screen that names a device uses one name for it: the home rows (`running on tower`, `tower offline`), `Continue tower's latest chat here?`, the approve screen, `tower is now paired. Your chats can continue there.`, `/devices`, `/settings` → `Devices`, and the line after a move, `Moved from tower in 4s`. A device is called by its host name, the word your operating system already uses for it, until you give it a name. A name is only a label. It is not a key and it signs nothing, and renaming a device changes nothing about what it can reach.

Because you never named this device, it kept the default. Name it and every other device shows the new name.

Expand All @@ -28,7 +28,7 @@ Type this on the device you mean:
codeaf devices rename "atlas"
```

Or open `/devices`, stay on the row marked `this device`, and press `n`. The name is filled in under the list:
Or open `/devices` (or `/settings` → `Devices`), stay on the row marked `this device`, and press `n`. The name is filled in under the list:

```
name this device: atlas▏
Expand Down Expand Up @@ -59,4 +59,4 @@ One to 32 characters you can see. Spaces at the start and end are dropped. A nam
- `a device name is at most 32 characters`
- `a device name cannot hold control characters or line breaks`

Two devices may have the same name. `/devices` then adds a short tail, such as `tower #a1b2`, so you can tell them apart.
Two devices may have the same name. `/devices` and `/settings` → `Devices` then add a short tail, such as `tower #a1b2`, so you can tell them apart.
2 changes: 1 addition & 1 deletion internal/manual/chat/reaching-this-machine-without-ssh.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ You learn one thing: **a code shown on a screen you own, typed on the other comp
| What the other computer gets | a key to this machine's tools: a hand on that one machine | your identity: your chats, your saved keys and your sync, on every computer you own |
| The code | six digits, shown `715 302`, typed with the name of the machine | a number, then six digits, shown `42-715-302`; the number is the place, so the code carries it |
| This machine must | stay on and stay connected | be there only while you pair |
| Who can undo it | this machine alone, with `codeaf devices revoke <name>`, at once | you, with `codeaf devices revoke <name>`, but it cuts the relay only; see the page *Pairing your chats with a second computer* |
| Who can undo it | this machine alone, with `codeaf devices revoke <name>`, at once | you, with `r` in `/devices` or `/settings` → `Devices`, or `codeaf devices revoke <name>`, but it cuts the relay only; see the page *Pairing your chats with a second computer* |

**One code never gives both.** A code for your chats does not give a shell on any machine. A code for a machine does not give your chats.

Expand Down
10 changes: 7 additions & 3 deletions internal/manual/chat/settings.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
## Find a setting — categories, search and advanced controls

Open `/settings` or press `ctrl+,`. Settings is organized into General, Models,
Memory, Tasks, AI teams, Permissions, Spending, Connections and Privacy. Wide
Memory, Tasks, AI teams, Permissions, Spending, Connections, Devices and Privacy. Wide
terminals keep the categories beside the controls; narrow terminals show a
category bar. Left and right change category, up and down choose a row, and
Enter changes it. The pointer can select the same controls.

Type to search across categories, including advanced controls and connection
services. Old setting names and configuration keys remain searchable. Clear the
Type to search across categories, including advanced controls, connection
services and paired devices. Old setting names and configuration keys remain searchable. Clear the
query to return to browsing; Escape clears it first, then closes settings. Model
pickers have their own **Filter models** box. Each category keeps uncommon controls behind
`Advanced`; search can find them without opening that section first.
Expand Down Expand Up @@ -138,6 +138,10 @@ Ordinary account connection does not require you to create your own OAuth app.
**Models** selects supported models and reasoning effort; advanced controls hold
routing, internal role overrides and context limits.

**Devices** lists your paired computers in the same words and order as `/devices`,
renames this device with `n`, removes another with `r`, and starts `/pair` from
`Add another device`.

**Privacy** separates input history, unfinished drafts, anonymous usage reporting
and **shared model recommendations** (formerly Model Pool). Recommendations can
**use and contribute**, **use only**, or remain **off**. Disabling one privacy
Expand Down
6 changes: 3 additions & 3 deletions internal/manual/chat/use-this-on-another-computer.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ This page is the code way. A new computer can also ask to join and be approved f

There are two doors. Pick one.

1. On the computer that has your chats, type `/pair` in the chat. Or run `codeaf pair --code` in a terminal. It shows a code and how to use it:
1. On the computer that has your chats, type `/pair` in the chat (or choose `Add another device` in `/settings` → `Devices`). Or run `codeaf pair --code` in a terminal. It shows a code and how to use it:

```
this shares your chats with the device you pair
Expand Down Expand Up @@ -215,7 +215,7 @@ There is no phone app for continuing chats. A phone browser can open the `/p/` p

Moving chats and pairing are available by default on Linux, macOS and native Windows on every build with a compatible engine. Pair both computers first.

When moving chats is available, `codeaf devices` lists every device linked to this computer, in up to two groups. A group with nothing in it does not show. With nothing of either kind it says:
When moving chats is available, `codeaf devices` lists every device linked to this computer, in up to two groups (in the chat, `/devices` and `/settings` → `Devices` list your paired computers). A group with nothing in it does not show. With nothing of either kind it says:

```
nothing is paired yet — run `codeaf pair` to add another device, or `codeaf serve` to let a device use this machine.
Expand All @@ -242,7 +242,7 @@ devices that can use this machine

## Remove a paired computer — revoke and the chats it already downloaded

To remove a computer, run `codeaf devices revoke <name>` with the name from the list. It works on both groups. When you remove a device that holds your chats, it says:
To remove a computer from a terminal, run `codeaf devices revoke <name>` with the name from the list (in the chat, press `r` on its row in `/devices` or `/settings` → `Devices`). In the terminal, `revoke` works on both groups. When you remove a device that holds your chats, it says:

```
desktop was removed — it can no longer sync your chats.
Expand Down
Loading
Loading