bee-tui 1.7.0

Production-grade k9s-style terminal cockpit for Ethereum Swarm Bee node operators.
Documentation
# S14 — Feed Timeline

A scrollable history walk of a Swarm feed. Where v1.5's
[`:feed-probe`](../commands/feed-probe.md) returns the latest
update only, S14 walks backward from the latest index and shows
each historical entry side-by-side: index, age, payload size,
and (when reference-shaped) the embedded Swarm reference.

## How to load

The screen has no auto-poll — it loads exactly when an operator
issues the verb:

```text
:feed-timeline <owner> <topic> [N]
```

`<owner>` and `<topic>` accept the same forms as `:feed-probe`:
20-byte hex address (`0x`-prefixed or bare) and either 64-hex
literal or arbitrary string (keccak256-hashed via
`Topic::from_string`).

`[N]` is optional — defaults to **50**, hard-capped at **1000**.
For larger walks, drive `:feed-probe` from a shell loop instead;
the cockpit's in-memory tar / mpsc plumbing isn't sized for
multi-thousand-entry walks.

The first lookup hits Bee's `/feeds/{owner}/{topic}` to find the
latest index — this can take 30-60 s on a fresh feed. The screen
shows a spinner until that completes; the historical chunks then
fetch in parallel (8-way bounded concurrency) so a 50-entry walk
finishes in seconds once the latest-index probe returns.

## Layout

```
┌ FEED TIMELINE  owner=0x12345678…  topic=ab12cd34…  latest=idx42  · 50 entries ─┐
│                                                                                │
│  INDEX     AGE      SIZE   TYPE      REF / ERROR                               │
│      42        3m     40   ref       e7f3a201cd…                               │
│      41       12m     40   ref       9b1c8a72f4…                               │
│      40       18m     20   raw       payload 12B                               │
│      39       28m      0   miss      [lost: 404 Not Found]                     │
│      38       45m     40   ref       12abcdef34…                               │
│      …                                                                         │
│  selected: ref=e7f3a201cd1f0e9b…                                               │
│  ↑↓/jk select   Tab switch screen   : command   q quit                         │
└────────────────────────────────────────────────────────────────────────────────┘
```

The cursor row is reverse-styled. **Miss** rows (chunk fetch
failed or didn't unmarshal as a SOC) render dim, so gaps in the
history are visible at a glance.

The selected-line detail at the bottom shows the full reference
of the cursored row when present, or the raw payload size + Unix
timestamp when the entry isn't reference-shaped.

## Keymap

| Key | Action |
|---|---|
| `` / `k` | Move cursor up |
| `` / `j` | Move cursor down |
| `PgUp` / `PgDn` | Jump 10 rows |
| `Tab` | Cycle to the next screen |
| `:` | Open the command bar (e.g. for `:inspect <ref>` on the cursored entry) |

## CI mode (`--once feed-timeline`)

```sh
bee-tui --once --json feed-timeline 0x1234… my-app/notifications 100
```

Emits structured JSON with `owner`, `topic`, `latest_index`,
`index_next`, `reached_requested`, and an `entries` array of
`{ index, timestamp_unix, payload_bytes, reference, error }`.
A snapshot-publish workflow can fetch 100 historical entries and
gate on `entries[0].index` strictly advancing across runs, or on
the `error` count not crossing a threshold.

## What it doesn't do

- **No epoch-feed walk.** v1.6 walks sequential feeds (indexes
  `0, 1, 2, …`). Epoch feeds (Swarm's older lookup scheme) are
  not yet supported in the walker.
- **No live refresh.** The walk is one-shot per verb invocation;
  there's no auto-poll. Re-run the verb to get a fresh snapshot.
- **No payload preview.** Raw-feed entries surface their byte
  size only; if you want the contents, pass the entry's index
  back through `:feed-probe` or feed it to `:inspect` when
  reference-shaped.
- **No write side.** `:feed-timeline` is read-only; updating a
  feed requires a private key + a stamp, both outside the
  cockpit's current write surface.