Diff
1diff --git a/cmd/soft/serve/server.go b/cmd/soft/serve/server.go
2index 4182553daab0c7e3b264c400c78f7526588e2287..17a978ae286ec5699dacecdd61a2a15dc5b13e6e 100644
3--- a/cmd/soft/serve/server.go
4+++ b/cmd/soft/serve/server.go
5@@ -9,6 +9,7 @@ import (
6
7 "charm.land/log/v2"
8
9+ "charm.land/ssh"
10 "github.com/charmbracelet/soft-serve/pkg/access"
11 "github.com/charmbracelet/soft-serve/pkg/backend"
12 "github.com/charmbracelet/soft-serve/pkg/config"
13@@ -21,7 +22,6 @@ import (
14 "github.com/charmbracelet/soft-serve/pkg/stats"
15 "github.com/charmbracelet/soft-serve/pkg/utils"
16 "github.com/charmbracelet/soft-serve/pkg/web"
17- "github.com/charmbracelet/ssh"
18 "golang.org/x/sync/errgroup"
19 )
20
21diff --git a/go.mod b/go.mod
22index 8d31e7cd37299f80f7136e9ebcff68bef8231b31..e39c72ec7774664624aa022f4c80500724fea78d 100644
23--- a/go.mod
24+++ b/go.mod
25@@ -8,6 +8,7 @@ require (
26 charm.land/glamour/v2 v2.0.1
27 charm.land/lipgloss/v2 v2.0.5
28 charm.land/log/v2 v2.0.0
29+ charm.land/ssh v0.4.1
30 charm.land/wish/v2 v2.0.1
31 github.com/alecthomas/chroma/v2 v2.27.0
32 github.com/aymanbagabas/git-module v1.8.4-0.20250826192401-1f81c5471e53
33@@ -16,7 +17,6 @@ require (
34 github.com/charmbracelet/colorprofile v0.4.3
35 github.com/charmbracelet/git-lfs-transfer v0.1.1-0.20240708204110-bacbfdb68d92
36 github.com/charmbracelet/keygen v0.5.4
37- github.com/charmbracelet/ssh v0.1.0
38 github.com/charmbracelet/x/ansi v0.11.7
39 github.com/dustin/go-humanize v1.0.1
40 github.com/go-git/go-git/v5 v5.19.2
41@@ -53,6 +53,7 @@ require (
42 github.com/aymerick/douceur v0.2.0 // indirect
43 github.com/beorn7/perks v1.0.1 // indirect
44 github.com/cespare/xxhash/v2 v2.3.0 // indirect
45+ github.com/charmbracelet/ssh v0.0.0-20250826160808-ebfa259c7309 // indirect
46 github.com/charmbracelet/ultraviolet v0.0.0-20260730002925-d9e819d7acab // indirect
47 github.com/charmbracelet/x/conpty v0.2.0 // indirect
48 github.com/charmbracelet/x/exp/slice v0.0.0-20260727090823-41c9e6be3365 // indirect
49@@ -79,6 +80,7 @@ require (
50 github.com/muesli/mango-pflag v0.2.0 // indirect
51 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
52 github.com/ncruces/go-strftime v1.0.0 // indirect
53+ github.com/pires/go-proxyproto v0.15.0 // indirect
54 github.com/prometheus/client_model v0.6.2 // indirect
55 github.com/prometheus/common v0.70.1 // indirect
56 github.com/prometheus/procfs v0.21.1 // indirect
57diff --git a/go.sum b/go.sum
58index c558bd5efafbe9d50db329da6234285bd35c6505..9c692c8216e0b2871560b7bf391a735f1def9b53 100644
59--- a/go.sum
60+++ b/go.sum
61@@ -8,6 +8,10 @@ charm.land/lipgloss/v2 v2.0.5 h1:kbNxgeeUOYv5J0YdpxFjfvf3dFvqH8Aci4zB6xqFtrY=
62 charm.land/lipgloss/v2 v2.0.5/go.mod h1:9oqhxt4yxIMe6q5A4kHr44DremZk7J9UNh74GlWa5nc=
63 charm.land/log/v2 v2.0.0 h1:SY3Cey7ipx86/MBXQHwsguOT6X1exT94mmJRdzTNs+s=
64 charm.land/log/v2 v2.0.0/go.mod h1:c3cZSRqm20qUVVAR1WmS/7ab8bgha3C6G7DjPcaVZz0=
65+charm.land/ssh v0.4.0 h1:ySUejeQd7GVEYqeyJnHxsI9QEa30egg6tr4ZBRroKH8=
66+charm.land/ssh v0.4.0/go.mod h1:so/3IECPNlYZSnE7JKn7NFmcUyyxJqIAeM4TJy35qPk=
67+charm.land/ssh v0.4.1 h1:vDb2hzUX4IYx+6Y+58aVlap8CGyIu+bJT7Awchpz+ow=
68+charm.land/ssh v0.4.1/go.mod h1:so/3IECPNlYZSnE7JKn7NFmcUyyxJqIAeM4TJy35qPk=
69 charm.land/wish/v2 v2.0.1 h1:xYOsvQG/bYNRoKUBt0AEyMiCv9rksmCOG/fD5WifAzg=
70 charm.land/wish/v2 v2.0.1/go.mod h1:uBWdsKTFk9BE0JsdEv8KKF8/abBfRe/hKEGOBm3OKZA=
71 filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
72@@ -42,8 +46,8 @@ github.com/charmbracelet/git-lfs-transfer v0.1.1-0.20240708204110-bacbfdb68d92 h
73 github.com/charmbracelet/git-lfs-transfer v0.1.1-0.20240708204110-bacbfdb68d92/go.mod h1:UrXUCm3xLQkq15fu7qlXHUMlrhdlXHoi13KH2Dfiits=
74 github.com/charmbracelet/keygen v0.5.4 h1:XQYgf6UEaTGgQSSmiPpIQ78WfseNQp4Pz8N/c1OsrdA=
75 github.com/charmbracelet/keygen v0.5.4/go.mod h1:t4oBRr41bvK7FaJsAaAQhhkUuHslzFXVjOBwA55CZNM=
76-github.com/charmbracelet/ssh v0.1.0 h1:ObnbYmAcIejsRLcGrVcVbFhpp5+qEA1P3p70M/gDZTA=
77-github.com/charmbracelet/ssh v0.1.0/go.mod h1:R9cISUs5kAH4Cq/rguNbSwcR+slE5Dfm8FEs//uoIGE=
78+github.com/charmbracelet/ssh v0.0.0-20250826160808-ebfa259c7309 h1:dCVbCRRtg9+tsfiTXTp0WupDlHruAXyp+YoxGVofHHc=
79+github.com/charmbracelet/ssh v0.0.0-20250826160808-ebfa259c7309/go.mod h1:R9cISUs5kAH4Cq/rguNbSwcR+slE5Dfm8FEs//uoIGE=
80 github.com/charmbracelet/ultraviolet v0.0.0-20260730002925-d9e819d7acab h1:hs24U4HpMigM5LDaDh0DFW/kONgNsTAU/V8Z9vUNBPQ=
81 github.com/charmbracelet/ultraviolet v0.0.0-20260730002925-d9e819d7acab/go.mod h1:psnCZIfwwxVs6v6DhUc6NJ8AQ3ejvs2ejKwoOMeVmUk=
82 github.com/charmbracelet/x/ansi v0.11.7 h1:kzv1kJvjg2S3r9KHo8hDdHFQLEqn4RBCb39dAYC84jI=
83@@ -164,6 +168,10 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq
84 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
85 github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w=
86 github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
87+github.com/pires/go-proxyproto v0.12.0 h1:TTCxD66dU898tahivkqc3hoceZp7P44FnorWyo9d5vM=
88+github.com/pires/go-proxyproto v0.12.0/go.mod h1:qUvfqUMEoX7T8g0q7TQLDnhMjdTrxnG0hvpMn+7ePNI=
89+github.com/pires/go-proxyproto v0.15.0 h1:dTshmNbFm/D+0+sbrxUuddPOZ5Y0B7c5NhtsBkm6LqI=
90+github.com/pires/go-proxyproto v0.15.0/go.mod h1:OXsCrKwrK2tXS9YrI5tkHx5xaQlO8FH3lFW76orFh24=
91 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
92 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
93 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
94diff --git a/pkg/ssh/cmd/cmd.go b/pkg/ssh/cmd/cmd.go
95index 18624eb333adb56ba7992c154c79d15fad20f43b..2862c5e923da445da6ccd659f5bcb996ed95f8eb 100644
96--- a/pkg/ssh/cmd/cmd.go
97+++ b/pkg/ssh/cmd/cmd.go
98@@ -7,13 +7,13 @@ import (
99 "text/template"
100 "unicode"
101
102+ "charm.land/ssh"
103 "github.com/charmbracelet/soft-serve/pkg/access"
104 "github.com/charmbracelet/soft-serve/pkg/backend"
105 "github.com/charmbracelet/soft-serve/pkg/config"
106 "github.com/charmbracelet/soft-serve/pkg/proto"
107 "github.com/charmbracelet/soft-serve/pkg/sshutils"
108 "github.com/charmbracelet/soft-serve/pkg/utils"
109- "github.com/charmbracelet/ssh"
110 "github.com/spf13/cobra"
111 )
112
113diff --git a/pkg/ssh/middleware.go b/pkg/ssh/middleware.go
114index 25a00b1a26754eae77b359bee82a68d178848884..ae45c13a3df0a508057557f1eb24ab738eb187ce 100644
115--- a/pkg/ssh/middleware.go
116+++ b/pkg/ssh/middleware.go
117@@ -6,6 +6,7 @@ import (
118 "time"
119
120 "charm.land/log/v2"
121+ "charm.land/ssh"
122 "charm.land/wish/v2"
123 "github.com/charmbracelet/soft-serve/pkg/backend"
124 "github.com/charmbracelet/soft-serve/pkg/config"
125@@ -14,7 +15,6 @@ import (
126 "github.com/charmbracelet/soft-serve/pkg/ssh/cmd"
127 "github.com/charmbracelet/soft-serve/pkg/sshutils"
128 "github.com/charmbracelet/soft-serve/pkg/store"
129- "github.com/charmbracelet/ssh"
130 "github.com/prometheus/client_golang/prometheus"
131 "github.com/prometheus/client_golang/prometheus/promauto"
132 "github.com/spf13/cobra"
133diff --git a/pkg/ssh/middleware_test.go b/pkg/ssh/middleware_test.go
134index 149fd8d8bc9ca16b8e703f1729753965d519c0c8..98c7db88260174d0c6740756e78be83a0bda9527 100644
135--- a/pkg/ssh/middleware_test.go
136+++ b/pkg/ssh/middleware_test.go
137@@ -5,6 +5,7 @@ import (
138 "net"
139 "testing"
140
141+ "charm.land/ssh"
142 "github.com/charmbracelet/keygen"
143 "github.com/charmbracelet/soft-serve/pkg/backend"
144 "github.com/charmbracelet/soft-serve/pkg/config"
145@@ -13,7 +14,6 @@ import (
146 "github.com/charmbracelet/soft-serve/pkg/proto"
147 "github.com/charmbracelet/soft-serve/pkg/store"
148 "github.com/charmbracelet/soft-serve/pkg/store/database"
149- "github.com/charmbracelet/ssh"
150 "github.com/matryer/is"
151 gossh "golang.org/x/crypto/ssh"
152 _ "modernc.org/sqlite"
153diff --git a/pkg/ssh/session.go b/pkg/ssh/session.go
154index 295542d5ef6d1196d46d11ac751416516869d3b9..a0b50b47109445091be399c9650520ac3de30736 100644
155--- a/pkg/ssh/session.go
156+++ b/pkg/ssh/session.go
157@@ -4,6 +4,7 @@ import (
158 "time"
159
160 tea "charm.land/bubbletea/v2"
161+ "charm.land/ssh"
162 "charm.land/wish/v2"
163 bm "charm.land/wish/v2/bubbletea"
164 "github.com/charmbracelet/soft-serve/pkg/access"
165@@ -11,7 +12,6 @@ import (
166 "github.com/charmbracelet/soft-serve/pkg/config"
167 "github.com/charmbracelet/soft-serve/pkg/proto"
168 "github.com/charmbracelet/soft-serve/pkg/ui/common"
169- "github.com/charmbracelet/ssh"
170 "github.com/prometheus/client_golang/prometheus"
171 "github.com/prometheus/client_golang/prometheus/promauto"
172 )
173diff --git a/pkg/ssh/session_test.go b/pkg/ssh/session_test.go
174index 4ec33caed61c38d5711049e798b3250d5c93c343..3d1b9f3b781ee52a77ce1ffada1a0f54237672e8 100644
175--- a/pkg/ssh/session_test.go
176+++ b/pkg/ssh/session_test.go
177@@ -9,6 +9,7 @@ import (
178 "time"
179
180 "charm.land/log/v2"
181+ "charm.land/ssh"
182 bm "charm.land/wish/v2/bubbletea"
183 "charm.land/wish/v2/testsession"
184 "github.com/charmbracelet/soft-serve/pkg/backend"
185@@ -18,7 +19,6 @@ import (
186 "github.com/charmbracelet/soft-serve/pkg/store"
187 "github.com/charmbracelet/soft-serve/pkg/store/database"
188 "github.com/charmbracelet/soft-serve/pkg/test"
189- "github.com/charmbracelet/ssh"
190 "github.com/matryer/is"
191 gossh "golang.org/x/crypto/ssh"
192 _ "modernc.org/sqlite" // sqlite driver
193diff --git a/pkg/ssh/ssh.go b/pkg/ssh/ssh.go
194index 6fc9fcdf82e78b45890e0ce88ef1a0324a0019e7..fa87d371c9513c48982789823b0edfe56a61c10e 100644
195--- a/pkg/ssh/ssh.go
196+++ b/pkg/ssh/ssh.go
197@@ -9,6 +9,7 @@ import (
198 "time"
199
200 "charm.land/log/v2"
201+ "charm.land/ssh"
202 "charm.land/wish/v2"
203 bm "charm.land/wish/v2/bubbletea"
204 rm "charm.land/wish/v2/recover"
205@@ -17,7 +18,6 @@ import (
206 "github.com/charmbracelet/soft-serve/pkg/config"
207 "github.com/charmbracelet/soft-serve/pkg/db"
208 "github.com/charmbracelet/soft-serve/pkg/store"
209- "github.com/charmbracelet/ssh"
210 "github.com/prometheus/client_golang/prometheus"
211 "github.com/prometheus/client_golang/prometheus/promauto"
212 gossh "golang.org/x/crypto/ssh"
213diff --git a/pkg/sshutils/utils.go b/pkg/sshutils/utils.go
214index 2686ac7bc306e4cdbf40687087d1ed15375c0b5c..2fb663f262fe72200f228ee60c12eb385c2aa706 100644
215--- a/pkg/sshutils/utils.go
216+++ b/pkg/sshutils/utils.go
217@@ -4,7 +4,7 @@ import (
218 "bytes"
219 "context"
220
221- "github.com/charmbracelet/ssh"
222+ "charm.land/ssh"
223 gossh "golang.org/x/crypto/ssh"
224 )
225
226diff --git a/pkg/ui/common/common.go b/pkg/ui/common/common.go
227index 7412a8f07e469b5b6e06838c575072dd9a782dd6..6153ee3210a700787eeb81af64af4d5fbaf83437 100644
228--- a/pkg/ui/common/common.go
229+++ b/pkg/ui/common/common.go
230@@ -5,13 +5,13 @@ import (
231 "fmt"
232
233 "charm.land/log/v2"
234+ "charm.land/ssh"
235 "github.com/alecthomas/chroma/v2/lexers"
236 "github.com/charmbracelet/soft-serve/git"
237 "github.com/charmbracelet/soft-serve/pkg/backend"
238 "github.com/charmbracelet/soft-serve/pkg/config"
239 "github.com/charmbracelet/soft-serve/pkg/ui/keymap"
240 "github.com/charmbracelet/soft-serve/pkg/ui/styles"
241- "github.com/charmbracelet/ssh"
242 zone "github.com/lrstanley/bubblezone/v2"
243 )
244