Skip to content

Commit 64fa85e

Browse files
jkyberneeesclaude
andcommitted
feat: Bubble Tea TUI for the odek agent
bodek is a beautiful terminal front-end for odek. Rather than re-implementing any agent logic, it launches (or attaches to) an `odek serve` instance and renders its streaming WebSocket protocol — reusing odek's tools, danger approval engine, sandbox, skills, memory, and sessions verbatim. - internal/server: spawn/attach to `odek serve`, resolve the CSRF token via GET / Set-Cookie, supervise the subprocess lifecycle - internal/client: odek serve WebSocket protocol (x/net/websocket) — transport plus decoding of every event (token, thinking, tool_call, tool_result, done, error, approval_request, skill/memory/agent events) - internal/tui: Bubble Tea model with live token streaming, per-tool activity, inline danger approvals (a/d/t), glamour-rendered Markdown, gradient wordmark, and session token/latency telemetry - cmd/bodek: CLI entry, flags (--url, --odek-bin, --sandbox), lifecycle Verified end-to-end against a locally built odek serve: connect, token auth, WebSocket dial, prompt, and event decoding all work. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012rWqu7pktbd2ejfNw3a7Vf
1 parent d0545b8 commit 64fa85e

15 files changed

Lines changed: 1741 additions & 0 deletions

File tree

.gitignore

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Build artifacts
2+
/bin/
3+
bodek
4+
5+
# Editor / OS noise
6+
.DS_Store
7+
*.swp
8+
.idea/
9+
.vscode/

LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2026 21no.de / BackendStack21
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

Makefile

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
BINARY := bodek
2+
PKG := ./cmd/bodek
3+
GOBIN ?= $(shell go env GOPATH)/bin
4+
5+
.PHONY: all build install run fmt vet tidy clean
6+
7+
all: build
8+
9+
## build: compile the bodek binary into ./bin
10+
build:
11+
@mkdir -p bin
12+
go build -o bin/$(BINARY) $(PKG)
13+
14+
## install: install bodek into $GOBIN
15+
install:
16+
go install $(PKG)
17+
18+
## run: build and launch bodek (spawns `odek serve`)
19+
run: build
20+
./bin/$(BINARY)
21+
22+
## fmt: format all Go sources
23+
fmt:
24+
go fmt ./...
25+
26+
## vet: run go vet
27+
vet:
28+
go vet ./...
29+
30+
## tidy: tidy module dependencies
31+
tidy:
32+
go mod tidy
33+
34+
## clean: remove build artifacts
35+
clean:
36+
rm -rf bin

README.md

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
# bodek
2+
3+
**A beautiful [Bubble Tea](https://github.com/charmbracelet/bubbletea) terminal interface for the [odek](https://github.com/BackendStack21/odek) agent.**
4+
5+
```
6+
██████ ██████ ██████ ███████ ██ ██
7+
██ ██ ██ ██ ██ ██ ██ ██ ██
8+
██████ ██ ██ ██ ██ █████ █████
9+
██ ██ ██ ██ ██ ██ ██ ██ ██
10+
██████ ██████ ██████ ███████ ██ ██
11+
```
12+
13+
bodek is a **pure front-end**. It launches (or attaches to) an `odek serve`
14+
instance and renders the agent's live stream — reasoning, tokens, tool calls,
15+
approvals, skills, and memory — as a polished TUI. Every bit of agent
16+
behaviour (tools, danger gating, sandbox, skills, memory, sessions) comes from
17+
**odek itself**; bodek never re-implements any of it.
18+
19+
---
20+
21+
## Why a separate front-end?
22+
23+
odek already ships a streaming WebSocket protocol (the one its Web UI speaks).
24+
bodek reuses that exact protocol from the terminal, which means:
25+
26+
- **Zero duplicated logic** — tools, the `danger` approval engine, the Docker
27+
sandbox, skills, and memory all run inside odek, unchanged.
28+
- **Full fidelity** — token streaming, per-tool activity, and security prompts
29+
appear in the TUI exactly as the engine emits them.
30+
- **One source of truth** — upgrade odek and bodek gets the new behaviour for
31+
free.
32+
33+
```
34+
┌──────────────┐ WebSocket (RFC 6455, JSON) ┌──────────────────┐
35+
│ bodek │ ◄────────────────────────────► │ odek serve │
36+
│ (Bubble Tea) │ tokens · tools · approvals │ (ReAct engine, │
37+
│ TUI client │ │ tools, sandbox) │
38+
└──────────────┘ └──────────────────┘
39+
```
40+
41+
---
42+
43+
## Install
44+
45+
```bash
46+
# Install odek (the engine) and bodek (the TUI)
47+
go install github.com/BackendStack21/odek/cmd/odek@latest
48+
go install github.com/BackendStack21/bodek/cmd/bodek@latest
49+
50+
# Provide an LLM key (any OpenAI-compatible provider)
51+
export ODEK_API_KEY=sk-...
52+
53+
bodek
54+
```
55+
56+
bodek looks for `odek` on your `PATH`. To point at a specific binary use
57+
`--odek-bin`, or skip spawning entirely with `--url`.
58+
59+
---
60+
61+
## Usage
62+
63+
```bash
64+
bodek # launch odek serve and start chatting
65+
bodek --sandbox # run tool calls inside odek's Docker sandbox
66+
bodek --url http://127.0.0.1:8080 # attach to an already-running odek serve
67+
bodek --odek-bin ./odek # use a specific odek binary
68+
bodek -- --prompt-caching # pass extra flags through to `odek serve`
69+
```
70+
71+
Configuration (model, base URL, API key, MCP servers, memory, skills) is read
72+
by `odek serve` from its usual chain — `~/.odek/config.json``./odek.json`
73+
`ODEK_*` env vars — so bodek inherits whatever you've already set up.
74+
75+
### Key bindings
76+
77+
| Key | Action |
78+
|-----|--------|
79+
| `` | Send the prompt |
80+
| `^J` | Insert a newline in the input |
81+
| `^T` | Toggle extended thinking for the next turn |
82+
| `^L` | Clear the conversation |
83+
| `PgUp` / `PgDn` / wheel | Scroll the transcript |
84+
| `^C` | Quit |
85+
86+
When the agent requests approval for a dangerous operation, answer inline:
87+
88+
| Key | Action |
89+
|-----|--------|
90+
| `a` | Approve once |
91+
| `d` | Deny |
92+
| `t` | Trust this risk class for the session (when offered) |
93+
94+
---
95+
96+
## What you see
97+
98+
- **Streaming answers** rendered as Markdown ([glamour](https://github.com/charmbracelet/glamour)).
99+
- **Tool activity** — every `tool_call`/`tool_result` shown live with a spinner,
100+
argument preview, and a one-line result.
101+
- **Security approvals** — odek's `danger` engine prompts surface as an inline
102+
panel; your answer is sent straight back over the socket.
103+
- **Live reasoning** — the model's pre-tool thinking streams in dimmed text.
104+
- **Telemetry** — session token totals and last-turn latency in the chrome.
105+
- **Engine notices** — skill loads, memory merges, and agent signals appear as
106+
quiet status lines.
107+
108+
---
109+
110+
## Development
111+
112+
```bash
113+
make build # → bin/bodek
114+
make run # build and launch
115+
make vet
116+
make tidy
117+
```
118+
119+
Project layout:
120+
121+
| Path | Responsibility |
122+
|------|----------------|
123+
| `cmd/bodek` | CLI entry point: flags, lifecycle, wiring |
124+
| `internal/server` | Launch / attach to `odek serve`, resolve the auth token |
125+
| `internal/client` | odek serve WebSocket protocol (transport + event decoding) |
126+
| `internal/tui` | The Bubble Tea model, update loop, and view |
127+
128+
---
129+
130+
## License
131+
132+
MIT — see [LICENSE](LICENSE).

go.mod

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
module github.com/BackendStack21/bodek
2+
3+
go 1.25.0
4+
5+
require (
6+
github.com/charmbracelet/bubbles v1.0.0
7+
github.com/charmbracelet/bubbletea v1.3.10
8+
github.com/charmbracelet/glamour v1.0.0
9+
github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834
10+
golang.org/x/net v0.56.0
11+
)
12+
13+
require (
14+
github.com/alecthomas/chroma/v2 v2.20.0 // indirect
15+
github.com/atotto/clipboard v0.1.4 // indirect
16+
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
17+
github.com/aymerick/douceur v0.2.0 // indirect
18+
github.com/charmbracelet/colorprofile v0.4.1 // indirect
19+
github.com/charmbracelet/x/ansi v0.11.6 // indirect
20+
github.com/charmbracelet/x/cellbuf v0.0.15 // indirect
21+
github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf // indirect
22+
github.com/charmbracelet/x/term v0.2.2 // indirect
23+
github.com/clipperhouse/displaywidth v0.9.0 // indirect
24+
github.com/clipperhouse/stringish v0.1.1 // indirect
25+
github.com/clipperhouse/uax29/v2 v2.5.0 // indirect
26+
github.com/dlclark/regexp2 v1.11.5 // indirect
27+
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
28+
github.com/gorilla/css v1.0.1 // indirect
29+
github.com/lucasb-eyer/go-colorful v1.3.0 // indirect
30+
github.com/mattn/go-isatty v0.0.20 // indirect
31+
github.com/mattn/go-localereader v0.0.1 // indirect
32+
github.com/mattn/go-runewidth v0.0.19 // indirect
33+
github.com/microcosm-cc/bluemonday v1.0.27 // indirect
34+
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
35+
github.com/muesli/cancelreader v0.2.2 // indirect
36+
github.com/muesli/reflow v0.3.0 // indirect
37+
github.com/muesli/termenv v0.16.0 // indirect
38+
github.com/rivo/uniseg v0.4.7 // indirect
39+
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
40+
github.com/yuin/goldmark v1.7.13 // indirect
41+
github.com/yuin/goldmark-emoji v1.0.6 // indirect
42+
golang.org/x/sys v0.46.0 // indirect
43+
golang.org/x/term v0.44.0 // indirect
44+
golang.org/x/text v0.38.0 // indirect
45+
)

go.sum

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
2+
github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
3+
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
4+
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
5+
github.com/alecthomas/chroma/v2 v2.20.0 h1:sfIHpxPyR07/Oylvmcai3X/exDlE8+FA820NTz+9sGw=
6+
github.com/alecthomas/chroma/v2 v2.20.0/go.mod h1:e7tViK0xh/Nf4BYHl00ycY6rV7b8iXBksI9E359yNmA=
7+
github.com/alecthomas/repr v0.5.1 h1:E3G4t2QbHTSNpPKBgMTln5KLkZHLOcU7r37J4pXBuIg=
8+
github.com/alecthomas/repr v0.5.1/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
9+
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
10+
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
11+
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
12+
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
13+
github.com/aymanbagabas/go-udiff v0.3.1 h1:LV+qyBQ2pqe0u42ZsUEtPiCaUoqgA9gYRDs3vj1nolY=
14+
github.com/aymanbagabas/go-udiff v0.3.1/go.mod h1:G0fsKmG+P6ylD0r6N/KgQD/nWzgfnl8ZBcNLgcbrw8E=
15+
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
16+
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
17+
github.com/charmbracelet/bubbles v1.0.0 h1:12J8/ak/uCZEMQ6KU7pcfwceyjLlWsDLAxB5fXonfvc=
18+
github.com/charmbracelet/bubbles v1.0.0/go.mod h1:9d/Zd5GdnauMI5ivUIVisuEm3ave1XwXtD1ckyV6r3E=
19+
github.com/charmbracelet/bubbletea v1.3.10 h1:otUDHWMMzQSB0Pkc87rm691KZ3SWa4KUlvF9nRvCICw=
20+
github.com/charmbracelet/bubbletea v1.3.10/go.mod h1:ORQfo0fk8U+po9VaNvnV95UPWA1BitP1E0N6xJPlHr4=
21+
github.com/charmbracelet/colorprofile v0.4.1 h1:a1lO03qTrSIRaK8c3JRxJDZOvhvIeSco3ej+ngLk1kk=
22+
github.com/charmbracelet/colorprofile v0.4.1/go.mod h1:U1d9Dljmdf9DLegaJ0nGZNJvoXAhayhmidOdcBwAvKk=
23+
github.com/charmbracelet/glamour v1.0.0 h1:AWMLOVFHTsysl4WV8T8QgkQ0s/ZNZo7CiE4WKhk8l08=
24+
github.com/charmbracelet/glamour v1.0.0/go.mod h1:DSdohgOBkMr2ZQNhw4LZxSGpx3SvpeujNoXrQyH2hxo=
25+
github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 h1:ZR7e0ro+SZZiIZD7msJyA+NjkCNNavuiPBLgerbOziE=
26+
github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834/go.mod h1:aKC/t2arECF6rNOnaKaVU6y4t4ZeHQzqfxedE/VkVhA=
27+
github.com/charmbracelet/x/ansi v0.11.6 h1:GhV21SiDz/45W9AnV2R61xZMRri5NlLnl6CVF7ihZW8=
28+
github.com/charmbracelet/x/ansi v0.11.6/go.mod h1:2JNYLgQUsyqaiLovhU2Rv/pb8r6ydXKS3NIttu3VGZQ=
29+
github.com/charmbracelet/x/cellbuf v0.0.15 h1:ur3pZy0o6z/R7EylET877CBxaiE1Sp1GMxoFPAIztPI=
30+
github.com/charmbracelet/x/cellbuf v0.0.15/go.mod h1:J1YVbR7MUuEGIFPCaaZ96KDl5NoS0DAWkskup+mOY+Q=
31+
github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91 h1:payRxjMjKgx2PaCWLZ4p3ro9y97+TVLZNaRZgJwSVDQ=
32+
github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U=
33+
github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf h1:rLG0Yb6MQSDKdB52aGX55JT1oi0P0Kuaj7wi1bLUpnI=
34+
github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf/go.mod h1:B3UgsnsBZS/eX42BlaNiJkD1pPOUa+oF1IYC6Yd2CEU=
35+
github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk=
36+
github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI=
37+
github.com/clipperhouse/displaywidth v0.9.0 h1:Qb4KOhYwRiN3viMv1v/3cTBlz3AcAZX3+y9OLhMtAtA=
38+
github.com/clipperhouse/displaywidth v0.9.0/go.mod h1:aCAAqTlh4GIVkhQnJpbL0T/WfcrJXHcj8C0yjYcjOZA=
39+
github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs=
40+
github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA=
41+
github.com/clipperhouse/uax29/v2 v2.5.0 h1:x7T0T4eTHDONxFJsL94uKNKPHrclyFI0lm7+w94cO8U=
42+
github.com/clipperhouse/uax29/v2 v2.5.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g=
43+
github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ=
44+
github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
45+
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
46+
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
47+
github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8=
48+
github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0=
49+
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
50+
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
51+
github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag=
52+
github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
53+
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
54+
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
55+
github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4=
56+
github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88=
57+
github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
58+
github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw=
59+
github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
60+
github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk=
61+
github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA=
62+
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI=
63+
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo=
64+
github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
65+
github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
66+
github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s=
67+
github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8=
68+
github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc=
69+
github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk=
70+
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
71+
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
72+
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
73+
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
74+
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
75+
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
76+
github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA=
77+
github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg=
78+
github.com/yuin/goldmark-emoji v1.0.6 h1:QWfF2FYaXwL74tfGOW5izeiZepUDroDJfWubQI9HTHs=
79+
github.com/yuin/goldmark-emoji v1.0.6/go.mod h1:ukxJDKFpdFb5x0a5HqbdlcKtebh086iJpI31LTKmWuA=
80+
golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
81+
golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
82+
golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o=
83+
golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec=
84+
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
85+
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
86+
golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw=
87+
golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
88+
golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc=
89+
golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y=
90+
golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE=
91+
golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4=

0 commit comments

Comments
 (0)