repos / pico

pico services - prose.sh, pastes.sh, imgs.sh, feeds.sh, pgs.sh
git clone https://github.com/picosh/pico.git

commit
adf572f
parent
6ecebee
author
Antonio Mika
date
2024-11-16 16:57:22 +0000 UTC
Update pipe logger and other utils
9 files changed,  +133, -117
M go.mod
M go.sum
M .vscode/launch.json
+4, -1
 1@@ -11,7 +11,10 @@
 2       "mode": "auto",
 3       "program": "${workspaceFolder}/cmd/${input:service}/${input:type}/main.go",
 4       "envFile": "${workspaceFolder}/.env",
 5-      "cwd": "${workspaceFolder}"
 6+      "cwd": "${workspaceFolder}",
 7+      "buildFlags": [
 8+        "-race"
 9+      ]
10     }
11   ],
12   "inputs": [
M auth/api.go
+2, -2
 1@@ -20,8 +20,8 @@ import (
 2 	"github.com/picosh/pico/db"
 3 	"github.com/picosh/pico/db/postgres"
 4 	"github.com/picosh/pico/shared"
 5-	"github.com/picosh/pubsub"
 6 	"github.com/picosh/utils"
 7+	"github.com/picosh/utils/pipe"
 8 )
 9 
10 type Client struct {
11@@ -644,7 +644,7 @@ func handler(routes []shared.Route, client *Client) http.HandlerFunc {
12 
13 func metricDrainSub(ctx context.Context, dbpool db.DB, logger *slog.Logger, secret string) {
14 	conn := shared.NewPicoPipeClient()
15-	stdoutPipe, err := pubsub.RemoteSub("sub metric-drain -k", ctx, conn)
16+	stdoutPipe, err := pipe.Sub("sub metric-drain -k", ctx, conn)
17 
18 	if err != nil {
19 		logger.Error("could not sub to metric-drain", "err", err)
M go.mod
+36, -34
  1@@ -10,6 +10,8 @@ go 1.23.1
  2 
  3 // replace github.com/picosh/pubsub => ../pubsub
  4 
  5+// replace github.com/picosh/utils => ../utils
  6+
  7 replace git.sr.ht/~delthas/senpai => github.com/picosh/senpai v0.0.0-20240503200611-af89e73973b0
  8 
  9 replace github.com/gdamore/tcell/v2 => github.com/delthas/tcell/v2 v2.4.1-0.20230710100648-1489e78d90fb
 10@@ -20,7 +22,7 @@ require (
 11 	github.com/antoniomika/syncmap v1.0.0
 12 	github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de
 13 	github.com/charmbracelet/bubbles v0.20.0
 14-	github.com/charmbracelet/bubbletea v1.1.2
 15+	github.com/charmbracelet/bubbletea v1.2.2
 16 	github.com/charmbracelet/glamour v0.8.0
 17 	github.com/charmbracelet/lipgloss v1.0.0
 18 	github.com/charmbracelet/promwish v0.7.0
 19@@ -36,10 +38,10 @@ require (
 20 	github.com/muesli/termenv v0.15.3-0.20240912151726-82936c5ea257
 21 	github.com/neurosnap/go-exif-remove v0.0.0-20221010134343-50d1e3c35577
 22 	github.com/picosh/pobj v0.0.0-20241016194248-c39198b2ff23
 23-	github.com/picosh/pubsub v0.0.0-20241114162342-5138571dceda
 24+	github.com/picosh/pubsub v0.0.0-20241114191831-ec8f16c0eb88
 25 	github.com/picosh/send v0.0.0-20241107150437-0febb0049b4f
 26 	github.com/picosh/tunkit v0.0.0-20240905223921-532404cef9d9
 27-	github.com/picosh/utils v0.0.0-20241018143404-b351d5d765f3
 28+	github.com/picosh/utils v0.0.0-20241116165501-b922efcc56f4
 29 	github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06
 30 	github.com/sendgrid/sendgrid-go v3.16.0+incompatible
 31 	github.com/simplesurance/go-ip-anonymizer v0.0.0-20200429124537-35a880f8e87d
 32@@ -50,7 +52,7 @@ require (
 33 	go.abhg.dev/goldmark/anchor v0.1.1
 34 	go.abhg.dev/goldmark/hashtag v0.3.1
 35 	go.abhg.dev/goldmark/toc v0.10.0
 36-	golang.org/x/crypto v0.28.0
 37+	golang.org/x/crypto v0.29.0
 38 	gopkg.in/yaml.v2 v2.4.0
 39 )
 40 
 41@@ -61,24 +63,24 @@ require (
 42 	github.com/andybalholm/cascadia v1.3.2 // indirect
 43 	github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect
 44 	github.com/atotto/clipboard v0.1.4 // indirect
 45-	github.com/aws/aws-sdk-go-v2 v1.32.3 // indirect
 46+	github.com/aws/aws-sdk-go-v2 v1.32.4 // indirect
 47 	github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 // indirect
 48-	github.com/aws/aws-sdk-go-v2/config v1.28.1 // indirect
 49-	github.com/aws/aws-sdk-go-v2/credentials v1.17.42 // indirect
 50-	github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 // indirect
 51-	github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35 // indirect
 52-	github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 // indirect
 53-	github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 // indirect
 54+	github.com/aws/aws-sdk-go-v2/config v1.28.4 // indirect
 55+	github.com/aws/aws-sdk-go-v2/credentials v1.17.45 // indirect
 56+	github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.19 // indirect
 57+	github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.38 // indirect
 58+	github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.23 // indirect
 59+	github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.23 // indirect
 60 	github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
 61-	github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22 // indirect
 62+	github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.23 // indirect
 63 	github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 // indirect
 64-	github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3 // indirect
 65-	github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 // indirect
 66-	github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3 // indirect
 67-	github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2 // indirect
 68-	github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 // indirect
 69-	github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 // indirect
 70-	github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 // indirect
 71+	github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.4 // indirect
 72+	github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.4 // indirect
 73+	github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.4 // indirect
 74+	github.com/aws/aws-sdk-go-v2/service/s3 v1.67.0 // indirect
 75+	github.com/aws/aws-sdk-go-v2/service/sso v1.24.5 // indirect
 76+	github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.4 // indirect
 77+	github.com/aws/aws-sdk-go-v2/service/sts v1.33.0 // indirect
 78 	github.com/aws/smithy-go v1.22.0 // indirect
 79 	github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
 80 	github.com/aymerick/douceur v0.2.0 // indirect
 81@@ -86,11 +88,11 @@ require (
 82 	github.com/cespare/xxhash/v2 v2.3.0 // indirect
 83 	github.com/charmbracelet/keygen v0.5.1 // indirect
 84 	github.com/charmbracelet/log v0.4.0 // indirect
 85-	github.com/charmbracelet/x/ansi v0.4.2 // indirect
 86+	github.com/charmbracelet/x/ansi v0.4.5 // indirect
 87 	github.com/charmbracelet/x/conpty v0.1.0 // indirect
 88-	github.com/charmbracelet/x/errors v0.0.0-20241101155414-3df16cb7eefd // indirect
 89+	github.com/charmbracelet/x/errors v0.0.0-20241113152101-0af7d04e9f32 // indirect
 90 	github.com/charmbracelet/x/input v0.2.0 // indirect
 91-	github.com/charmbracelet/x/term v0.2.0 // indirect
 92+	github.com/charmbracelet/x/term v0.2.1 // indirect
 93 	github.com/charmbracelet/x/termios v0.1.0 // indirect
 94 	github.com/creack/pty v1.1.24 // indirect
 95 	github.com/delthas/go-libnp v0.0.0-20221222161248-0e45ece1f878 // indirect
 96@@ -115,14 +117,14 @@ require (
 97 	github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect
 98 	github.com/goccy/go-json v0.10.3 // indirect
 99 	github.com/godbus/dbus/v5 v5.1.0 // indirect
100-	github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
101+	github.com/golang-jwt/jwt/v4 v4.5.1 // indirect
102 	github.com/golang/geo v0.0.0-20230421003525-6adc56603217 // indirect
103 	github.com/golang/protobuf v1.5.4 // indirect
104 	github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
105 	github.com/gorilla/css v1.0.1 // indirect
106 	github.com/json-iterator/go v1.1.12 // indirect
107 	github.com/klauspost/compress v1.17.11 // indirect
108-	github.com/klauspost/cpuid/v2 v2.2.8 // indirect
109+	github.com/klauspost/cpuid/v2 v2.2.9 // indirect
110 	github.com/kr/fs v0.1.0 // indirect
111 	github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
112 	github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 // indirect
113@@ -130,7 +132,7 @@ require (
114 	github.com/mattn/go-localereader v0.0.1 // indirect
115 	github.com/mattn/go-runewidth v0.0.16 // indirect
116 	github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
117-	github.com/minio/madmin-go/v3 v3.0.75 // indirect
118+	github.com/minio/madmin-go/v3 v3.0.77 // indirect
119 	github.com/minio/md5-simd v1.1.2 // indirect
120 	github.com/minio/minio-go/v7 v7.0.80 // indirect
121 	github.com/mmcdole/goxpp v1.1.1 // indirect
122@@ -150,7 +152,7 @@ require (
123 	github.com/prometheus/common v0.60.1 // indirect
124 	github.com/prometheus/procfs v0.15.1 // indirect
125 	github.com/prometheus/prom2json v1.4.1 // indirect
126-	github.com/prometheus/prometheus v0.55.0 // indirect
127+	github.com/prometheus/prometheus v0.300.0 // indirect
128 	github.com/rivo/uniseg v0.4.7 // indirect
129 	github.com/rogpeppe/go-internal v1.11.0 // indirect
130 	github.com/rs/xid v1.6.0 // indirect
131@@ -165,13 +167,13 @@ require (
132 	github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
133 	github.com/yuin/goldmark-emoji v1.0.4 // indirect
134 	github.com/yusufpapurcu/wmi v1.2.4 // indirect
135-	golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c // indirect
136-	golang.org/x/net v0.30.0 // indirect
137-	golang.org/x/sync v0.8.0 // indirect
138-	golang.org/x/sys v0.26.0 // indirect
139-	golang.org/x/term v0.25.0 // indirect
140-	golang.org/x/text v0.19.0 // indirect
141-	golang.org/x/time v0.7.0 // indirect
142-	google.golang.org/protobuf v1.35.1 // indirect
143+	golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f // indirect
144+	golang.org/x/net v0.31.0 // indirect
145+	golang.org/x/sync v0.9.0 // indirect
146+	golang.org/x/sys v0.27.0 // indirect
147+	golang.org/x/term v0.26.0 // indirect
148+	golang.org/x/text v0.20.0 // indirect
149+	golang.org/x/time v0.8.0 // indirect
150+	google.golang.org/protobuf v1.35.2 // indirect
151 	mvdan.cc/xurls/v2 v2.5.0 // indirect
152 )
M go.sum
+68, -67
  1@@ -23,42 +23,42 @@ github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhP
  2 github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw=
  3 github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
  4 github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
  5-github.com/aws/aws-sdk-go-v2 v1.32.3 h1:T0dRlFBKcdaUPGNtkBSwHZxrtis8CQU17UpNBZYd0wk=
  6-github.com/aws/aws-sdk-go-v2 v1.32.3/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo=
  7+github.com/aws/aws-sdk-go-v2 v1.32.4 h1:S13INUiTxgrPueTmrm5DZ+MiAo99zYzHEFh1UNkOxNE=
  8+github.com/aws/aws-sdk-go-v2 v1.32.4/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo=
  9 github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 h1:pT3hpW0cOHRJx8Y0DfJUEQuqPild8jRGmSFmBgvydr0=
 10 github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6/go.mod h1:j/I2++U0xX+cr44QjHay4Cvxj6FUbnxrgmqN3H1jTZA=
 11-github.com/aws/aws-sdk-go-v2/config v1.28.1 h1:oxIvOUXy8x0U3fR//0eq+RdCKimWI900+SV+10xsCBw=
 12-github.com/aws/aws-sdk-go-v2/config v1.28.1/go.mod h1:bRQcttQJiARbd5JZxw6wG0yIK3eLeSCPdg6uqmmlIiI=
 13-github.com/aws/aws-sdk-go-v2/credentials v1.17.42 h1:sBP0RPjBU4neGpIYyx8mkU2QqLPl5u9cmdTWVzIpHkM=
 14-github.com/aws/aws-sdk-go-v2/credentials v1.17.42/go.mod h1:FwZBfU530dJ26rv9saAbxa9Ej3eF/AK0OAY86k13n4M=
 15-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 h1:68jFVtt3NulEzojFesM/WVarlFpCaXLKaBxDpzkQ9OQ=
 16-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18/go.mod h1:Fjnn5jQVIo6VyedMc0/EhPpfNlPl7dHV916O6B+49aE=
 17-github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35 h1:ihPPdcCVSN0IvBByXwqVp28/l4VosBZ6sDulcvU2J7w=
 18-github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35/go.mod h1:JkgEhs3SVF51Dj3m1Bj+yL8IznpxzkwlA3jLg3x7Kls=
 19-github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 h1:Jw50LwEkVjuVzE1NzkhNKkBf9cRN7MtE1F/b2cOKTUM=
 20-github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22/go.mod h1:Y/SmAyPcOTmpeVaWSzSKiILfXTVJwrGmYZhcRbhWuEY=
 21-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 h1:981MHwBaRZM7+9QSR6XamDzF/o7ouUGxFzr+nVSIhrs=
 22-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22/go.mod h1:1RA1+aBEfn+CAB/Mh0MB6LsdCYCnjZm7tKXtnk499ZQ=
 23+github.com/aws/aws-sdk-go-v2/config v1.28.4 h1:qgD0MKmkIzZR2DrAjWJcI9UkndjR+8f6sjUQvXh0mb0=
 24+github.com/aws/aws-sdk-go-v2/config v1.28.4/go.mod h1:LgnWnNzHZw4MLplSyEGia0WgJ/kCGD86zGCjvNpehJs=
 25+github.com/aws/aws-sdk-go-v2/credentials v1.17.45 h1:DUgm5lFso57E7150RBgu1JpVQoF8fAPretiDStIuVjg=
 26+github.com/aws/aws-sdk-go-v2/credentials v1.17.45/go.mod h1:dnBpENcPC1ekZrGpSWspX+ZRGzhkvqngT2Qp5xBR1dY=
 27+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.19 h1:woXadbf0c7enQ2UGCi8gW/WuKmE0xIzxBF/eD94jMKQ=
 28+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.19/go.mod h1:zminj5ucw7w0r65bP6nhyOd3xL6veAUMc3ElGMoLVb4=
 29+github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.38 h1:xN0PViSptTHJ7QIKyWeWntuTCZoejutTPfhsZIoMDy0=
 30+github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.38/go.mod h1:orUzUoWBICDyc+hz49KpySb3sa2Tw3c0IaFqrH4c4dg=
 31+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.23 h1:A2w6m6Tmr+BNXjDsr7M90zkWjsu4JXHwrzPg235STs4=
 32+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.23/go.mod h1:35EVp9wyeANdujZruvHiQUAo9E3vbhnIO1mTCAxMlY0=
 33+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.23 h1:pgYW9FCabt2M25MoHYCfMrVY2ghiiBKYWUVXfwZs+sU=
 34+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.23/go.mod h1:c48kLgzO19wAu3CPkDWC28JbaJ+hfQlsdl7I2+oqIbk=
 35 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ=
 36 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
 37-github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22 h1:yV+hCAHZZYJQcwAaszoBNwLbPItHvApxT0kVIw6jRgs=
 38-github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22/go.mod h1:kbR1TL8llqB1eGnVbybcA4/wgScxdylOdyAd51yxPdw=
 39+github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.23 h1:1SZBDiRzzs3sNhOMVApyWPduWYGAX0imGy06XiBnCAM=
 40+github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.23/go.mod h1:i9TkxgbZmHVh2S0La6CAXtnyFhlCX/pJ0JsOvBAS6Mk=
 41 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 h1:TToQNkvGguu209puTojY/ozlqy2d/SFNcoLIqTFi42g=
 42 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0/go.mod h1:0jp+ltwkf+SwG2fm/PKo8t4y8pJSgOCO4D8Lz3k0aHQ=
 43-github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3 h1:kT6BcZsmMtNkP/iYMcRG+mIEA/IbeiUimXtGmqF39y0=
 44-github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3/go.mod h1:Z8uGua2k4PPaGOYn66pK02rhMrot3Xk3tpBuUFPomZU=
 45-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 h1:qcxX0JYlgWH3hpPUnd6U0ikcl6LLA9sLkXE2w1fpMvY=
 46-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3/go.mod h1:cLSNEmI45soc+Ef8K/L+8sEA3A3pYFEYf5B5UI+6bH4=
 47-github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3 h1:ZC7Y/XgKUxwqcdhO5LE8P6oGP1eh6xlQReWNKfhvJno=
 48-github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3/go.mod h1:WqfO7M9l9yUAw0HcHaikwRd/H6gzYdz7vjejCA5e2oY=
 49-github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2 h1:p9TNFL8bFUMd+38YIpTAXpoxyz0MxC7FlbFEH4P4E1U=
 50-github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2/go.mod h1:fNjyo0Coen9QTwQLWeV6WO2Nytwiu+cCcWaTdKCAqqE=
 51-github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 h1:UTpsIf0loCIWEbrqdLb+0RxnTXfWh2vhw4nQmFi4nPc=
 52-github.com/aws/aws-sdk-go-v2/service/sso v1.24.3/go.mod h1:FZ9j3PFHHAR+w0BSEjK955w5YD2UwB/l/H0yAK3MJvI=
 53-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 h1:2YCmIXv3tmiItw0LlYf6v7gEHebLY45kBEnPezbUKyU=
 54-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3/go.mod h1:u19stRyNPxGhj6dRm+Cdgu6N75qnbW7+QN0q0dsAk58=
 55-github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 h1:wVnQ6tigGsRqSWDEEyH6lSAJ9OyFUsSnbaUWChuSGzs=
 56-github.com/aws/aws-sdk-go-v2/service/sts v1.32.3/go.mod h1:VZa9yTFyj4o10YGsmDO4gbQJUvvhY72fhumT8W4LqsE=
 57+github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.4 h1:aaPpoG15S2qHkWm4KlEyF01zovK1nW4BBbyXuHNSE90=
 58+github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.4/go.mod h1:eD9gS2EARTKgGr/W5xwgY/ik9z/zqpW+m/xOQbVxrMk=
 59+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.4 h1:tHxQi/XHPK0ctd/wdOw0t7Xrc2OxcRCnVzv8lwWPu0c=
 60+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.4/go.mod h1:4GQbF1vJzG60poZqWatZlhP31y8PGCCVTvIGPdaaYJ0=
 61+github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.4 h1:E5ZAVOmI2apR8ADb72Q63KqwwwdW1XcMeXIlrZ1Psjg=
 62+github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.4/go.mod h1:wezzqVUOVVdk+2Z/JzQT4NxAU0NbhRe5W8pIE72jsWI=
 63+github.com/aws/aws-sdk-go-v2/service/s3 v1.67.0 h1:SwaJ0w0MOp0pBTIKTamLVeTKD+iOWyNJRdJ2KCQRg6Q=
 64+github.com/aws/aws-sdk-go-v2/service/s3 v1.67.0/go.mod h1:TMhLIyRIyoGVlaEMAt+ITMbwskSTpcGsCPDq91/ihY0=
 65+github.com/aws/aws-sdk-go-v2/service/sso v1.24.5 h1:HJwZwRt2Z2Tdec+m+fPjvdmkq2s9Ra+VR0hjF7V2o40=
 66+github.com/aws/aws-sdk-go-v2/service/sso v1.24.5/go.mod h1:wrMCEwjFPms+V86TCQQeOxQF/If4vT44FGIOFiMC2ck=
 67+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.4 h1:zcx9LiGWZ6i6pjdcoE9oXAB6mUdeyC36Ia/QEiIvYdg=
 68+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.4/go.mod h1:Tp/ly1cTjRLGBBmNccFumbZ8oqpZlpdhFf80SrRh4is=
 69+github.com/aws/aws-sdk-go-v2/service/sts v1.33.0 h1:s7LRgBqhwLaxcocnAniBJp7gaAB+4I4vHzqUqjH18yc=
 70+github.com/aws/aws-sdk-go-v2/service/sts v1.33.0/go.mod h1:9XEUty5v5UAsMiFOBJrNibZgwCeOma73jgGwwhgffa8=
 71 github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM=
 72 github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
 73 github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
 74@@ -73,8 +73,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF
 75 github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 76 github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE=
 77 github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU=
 78-github.com/charmbracelet/bubbletea v1.1.2 h1:naQXF2laRxyLyil/i7fxdpiz1/k06IKquhm4vBfHsIc=
 79-github.com/charmbracelet/bubbletea v1.1.2/go.mod h1:9HIU/hBV24qKjlehyj8z1r/tR9TYTQEag+cWZnuXo8E=
 80+github.com/charmbracelet/bubbletea v1.2.2 h1:EMz//Ky/aFS2uLcKqpCst5UOE6z5CFDGRsUpyXz0chs=
 81+github.com/charmbracelet/bubbletea v1.2.2/go.mod h1:Qr6fVQw+wX7JkWWkVyXYk/ZUQ92a6XNekLXa3rR18MM=
 82 github.com/charmbracelet/glamour v0.8.0 h1:tPrjL3aRcQbn++7t18wOpgLyl8wrOHUEDS7IZ68QtZs=
 83 github.com/charmbracelet/glamour v0.8.0/go.mod h1:ViRgmKkf3u5S7uakt2czJ272WSg2ZenlYEZXT2x7Bjw=
 84 github.com/charmbracelet/keygen v0.5.1 h1:zBkkYPtmKDVTw+cwUyY6ZwGDhRxXkEp0Oxs9sqMLqxI=
 85@@ -89,18 +89,18 @@ github.com/charmbracelet/ssh v0.0.0-20240725163421-eb71b85b27aa h1:6rePgmsJguB6Z
 86 github.com/charmbracelet/ssh v0.0.0-20240725163421-eb71b85b27aa/go.mod h1:LmMZag2g7ILMmWtDmU7dIlctUopwmb73KpPzj0ip1uk=
 87 github.com/charmbracelet/wish v1.4.3 h1:7FvNLoPGqiT7EdjQP4+XuvM1Hrnx9DyknilbD+Okx1s=
 88 github.com/charmbracelet/wish v1.4.3/go.mod h1:hVgmhwhd52fLmO6m5AkREUMZYqQ0qmIJQDMe3HsNPmU=
 89-github.com/charmbracelet/x/ansi v0.4.2 h1:0JM6Aj/g/KC154/gOP4vfxun0ff6itogDYk41kof+qk=
 90-github.com/charmbracelet/x/ansi v0.4.2/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw=
 91+github.com/charmbracelet/x/ansi v0.4.5 h1:LqK4vwBNaXw2AyGIICa5/29Sbdq58GbGdFngSexTdRM=
 92+github.com/charmbracelet/x/ansi v0.4.5/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw=
 93 github.com/charmbracelet/x/conpty v0.1.0 h1:4zc8KaIcbiL4mghEON8D72agYtSeIgq8FSThSPQIb+U=
 94 github.com/charmbracelet/x/conpty v0.1.0/go.mod h1:rMFsDJoDwVmiYM10aD4bH2XiRgwI7NYJtQgl5yskjEQ=
 95-github.com/charmbracelet/x/errors v0.0.0-20241101155414-3df16cb7eefd h1:sWN1wUxIICSfrMkXnYcAUkQ5CPVi5ZM12y2excuG9WU=
 96-github.com/charmbracelet/x/errors v0.0.0-20241101155414-3df16cb7eefd/go.mod h1:2P0UgXMEa6TsToMSuFqKFQR+fZTO9CNGUNokkPatT/0=
 97+github.com/charmbracelet/x/errors v0.0.0-20241113152101-0af7d04e9f32 h1:FzJOeR9C8zL99r2Y0mobrTsoFykBTS15gYS315IxJNE=
 98+github.com/charmbracelet/x/errors v0.0.0-20241113152101-0af7d04e9f32/go.mod h1:2P0UgXMEa6TsToMSuFqKFQR+fZTO9CNGUNokkPatT/0=
 99 github.com/charmbracelet/x/exp/golden v0.0.0-20240815200342-61de596daa2b h1:MnAMdlwSltxJyULnrYbkZpp4k58Co7Tah3ciKhSNo0Q=
100 github.com/charmbracelet/x/exp/golden v0.0.0-20240815200342-61de596daa2b/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U=
101 github.com/charmbracelet/x/input v0.2.0 h1:1Sv+y/flcqUfUH2PXNIDKDIdT2G8smOnGOgawqhwy8A=
102 github.com/charmbracelet/x/input v0.2.0/go.mod h1:KUSFIS6uQymtnr5lHVSOK9j8RvwTD4YHnWnzJUYnd/M=
103-github.com/charmbracelet/x/term v0.2.0 h1:cNB9Ot9q8I711MyZ7myUR5HFWL/lc3OpU8jZ4hwm0x0=
104-github.com/charmbracelet/x/term v0.2.0/go.mod h1:GVxgxAbjUrmpvIINHIQnJJKpMlHiZ4cktEQCN6GWyF0=
105+github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
106+github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
107 github.com/charmbracelet/x/termios v0.1.0 h1:y4rjAHeFksBAfGbkRDmVinMg7x7DELIGAFbdNvxg97k=
108 github.com/charmbracelet/x/termios v0.1.0/go.mod h1:H/EVv/KRnrYjz+fCYa9bsKdqF3S8ouDK0AZEbG7r+/U=
109 github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s=
110@@ -172,8 +172,8 @@ github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
111 github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
112 github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
113 github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
114-github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
115-github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
116+github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo=
117+github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
118 github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
119 github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
120 github.com/golang/geo v0.0.0-20230421003525-6adc56603217 h1:HKlyj6in2JV6wVkmQ4XmG/EIm+SCYlPZ+V4GWit7Z+I=
121@@ -200,8 +200,8 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm
122 github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
123 github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
124 github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
125-github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
126-github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
127+github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=
128+github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=
129 github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8=
130 github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
131 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
132@@ -232,8 +232,8 @@ github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zk
133 github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
134 github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk=
135 github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA=
136-github.com/minio/madmin-go/v3 v3.0.75 h1:m3D0jmGK7TUPjKM4bFqR8l2mabHCozH0Zy8ToIvgy88=
137-github.com/minio/madmin-go/v3 v3.0.75/go.mod h1:ku/RUc2xeo4Uui/GHUURMoNEVXk4Ih40xA3KHLyMF1o=
138+github.com/minio/madmin-go/v3 v3.0.77 h1:cqp5kVeT5anDyocvoN81puwpy+GN7t+Xdj6xCLpnONE=
139+github.com/minio/madmin-go/v3 v3.0.77/go.mod h1:ku/RUc2xeo4Uui/GHUURMoNEVXk4Ih40xA3KHLyMF1o=
140 github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
141 github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
142 github.com/minio/minio-go/v7 v7.0.80 h1:2mdUHXEykRdY/BigLt3Iuu1otL0JTogT0Nmltg0wujk=
143@@ -269,16 +269,17 @@ github.com/picosh/go-rsync-receiver v0.0.0-20240709135253-1daf4b12a9fc h1:bvcsoO
144 github.com/picosh/go-rsync-receiver v0.0.0-20240709135253-1daf4b12a9fc/go.mod h1:i0iR3W4GSm1PuvVxB9OH32E5jP+CYkVb2NQSe0JCtlo=
145 github.com/picosh/pobj v0.0.0-20241016194248-c39198b2ff23 h1:NEJ5a4UXeF0/X7xmYNzXcwLQID9DwgazlqkMMC5zZ3M=
146 github.com/picosh/pobj v0.0.0-20241016194248-c39198b2ff23/go.mod h1:cF+eAl4G1vU+WOD8cYCKaxokHo6MWmbR8J4/SJnvESg=
147-github.com/picosh/pubsub v0.0.0-20241114162342-5138571dceda h1:0prs4E8ai30JhQm6ZH2b9NYD5NcKGElnmP21XiS2IH8=
148-github.com/picosh/pubsub v0.0.0-20241114162342-5138571dceda/go.mod h1:m6ZZpg+lZB3XTIKlbSqQgi4NrBPtARv23b8vGYDoCo4=
149+github.com/picosh/pubsub v0.0.0-20241114191831-ec8f16c0eb88 h1:hdxE6rquHHw1/eeqS1b+ojLaxGtN8zOiTUclPwaVbPg=
150+github.com/picosh/pubsub v0.0.0-20241114191831-ec8f16c0eb88/go.mod h1:+9hDKIDHQCvGFigCVlIl589BwpT9R4boKhUVc/OgRU4=
151 github.com/picosh/send v0.0.0-20241107150437-0febb0049b4f h1:pdEh1Z7zH5Og9nS7jRuqwup3bcPsC6faDNQ6mgrV9ws=
152 github.com/picosh/send v0.0.0-20241107150437-0febb0049b4f/go.mod h1:RAgLDK3LrDK6pNeXtU9tjo28obl5DxShcTUk2nm/KCM=
153 github.com/picosh/senpai v0.0.0-20240503200611-af89e73973b0 h1:pBRIbiCj7K6rGELijb//dYhyCo8A3fvxW5dijrJVtjs=
154 github.com/picosh/senpai v0.0.0-20240503200611-af89e73973b0/go.mod h1:QaBDtybFC5gz7EG/9c3bgzuyW7W5W2rYLFZxWNuWk3Q=
155 github.com/picosh/tunkit v0.0.0-20240905223921-532404cef9d9 h1:g5oZmnDFr11HarA8IAXcc4o9PBlolSM59QIATCSoato=
156 github.com/picosh/tunkit v0.0.0-20240905223921-532404cef9d9/go.mod h1:UrDH/VCIc1wg/L6iY2zSYt4TiGw+25GsKSnkVkU40Dw=
157-github.com/picosh/utils v0.0.0-20241018143404-b351d5d765f3 h1:1t/w0GrzwA3rkdotEsHbZIlCOv0T28qtO0U60/iOgQQ=
158 github.com/picosh/utils v0.0.0-20241018143404-b351d5d765f3/go.mod h1:ftrp1FjbKK/mFnBAYGymA1QEtPlkA0+lWkPI5h0HKt4=
159+github.com/picosh/utils v0.0.0-20241116165501-b922efcc56f4 h1:F5HYOJKgAVjZHjqrZPwPHbJwiH2VMK5cgfruc/c7GU8=
160+github.com/picosh/utils v0.0.0-20241116165501-b922efcc56f4/go.mod h1:HogYEyJ43IGXrOa3D/kjM1pkzNAyh+pejRyv8Eo//pk=
161 github.com/pkg/sftp v1.13.7 h1:uv+I3nNJvlKZIQGSr8JVQLNHFU9YhhNpvC14Y6KgmSM=
162 github.com/pkg/sftp v1.13.7/go.mod h1:KMKI0t3T6hfA+lTR/ssZdunHo+uwq7ghoN09/FSu3DY=
163 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
164@@ -296,8 +297,8 @@ github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0leargg
165 github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
166 github.com/prometheus/prom2json v1.4.1 h1:7McxdrHgPEOtMwWjkKtd0v5AhpR2Q6QAnlHKVxq0+tQ=
167 github.com/prometheus/prom2json v1.4.1/go.mod h1:CzOQykSKFxXuC7ELUZHOHQvwKesQ3eN0p2PWLhFitQM=
168-github.com/prometheus/prometheus v0.55.0 h1:ITinOi1zr3HemoVWHf679PfRRmpxZOcR4nEvsze6eB0=
169-github.com/prometheus/prometheus v0.55.0/go.mod h1:GGS7QlWKCqCbcEzWsVahYIfQwiGhcExkarHyLJTsv6I=
170+github.com/prometheus/prometheus v0.300.0 h1:nVxAKi1ceyQxKa8r3gzMQyp7pMLeN1sPWvOlrv3ce1Q=
171+github.com/prometheus/prometheus v0.300.0/go.mod h1:gtTPY/XVyCdqqnjA3NzDMb0/nc5H9hOu1RMame+gHyM=
172 github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
173 github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
174 github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
175@@ -370,10 +371,10 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh
176 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
177 golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g=
178 golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
179-golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
180-golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
181-golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY=
182-golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8=
183+golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ=
184+golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
185+golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo=
186+golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:D5SMRVC3C2/4+F/DB1wZsLRnSNimn2Sp/NPsCrsv8ak=
187 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
188 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
189 golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
190@@ -390,14 +391,14 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
191 golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
192 golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
193 golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ=
194-golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
195-golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
196+golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
197+golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
198 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
199 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
200 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
201 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
202-golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
203-golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
204+golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ=
205+golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
206 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
207 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
208 golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
209@@ -417,8 +418,8 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
210 golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
211 golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
212 golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
213-golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
214-golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
215+golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
216+golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
217 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
218 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
219 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
220@@ -426,26 +427,26 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
221 golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
222 golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww=
223 golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
224-golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
225-golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
226+golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU=
227+golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E=
228 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
229 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
230 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
231 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
232 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
233 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
234-golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
235-golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
236+golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
237+golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
238 golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
239-golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
240-golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
241+golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg=
242+golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
243 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
244 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
245 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
246 golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
247 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
248-google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
249-google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
250+google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
251+google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
252 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
253 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
254 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
M pico/cli.go
+2, -2
 1@@ -17,7 +17,7 @@ import (
 2 	"github.com/picosh/pico/tui/plus"
 3 	"github.com/picosh/utils"
 4 
 5-	pipeLogger "github.com/picosh/pubsub/log"
 6+	pipeLogger "github.com/picosh/utils/pipe/log"
 7 )
 8 
 9 func getUser(s ssh.Session, dbpool db.DB) (*db.User, error) {
10@@ -71,7 +71,7 @@ func (c *Cmd) notifications() error {
11 
12 func (c *Cmd) logs(ctx context.Context) error {
13 	conn := shared.NewPicoPipeClient()
14-	stdoutPipe, err := pipeLogger.ConnectToLogs(ctx, conn)
15+	stdoutPipe, err := pipeLogger.ReadLogs(ctx, conn)
16 
17 	if err != nil {
18 		return err
M shared/analytics.go
+13, -4
 1@@ -13,7 +13,7 @@ import (
 2 	"net/url"
 3 
 4 	"github.com/picosh/pico/db"
 5-	"github.com/picosh/pubsub"
 6+	"github.com/picosh/utils/pipe"
 7 	"github.com/simplesurance/go-ip-anonymizer/ipanonymizer"
 8 	"github.com/x-way/crawlerdetect"
 9 )
10@@ -167,8 +167,17 @@ func AnalyticsVisitFromRequest(r *http.Request, dbpool db.DB, userID string) (*d
11 
12 func AnalyticsCollect(ch chan *db.AnalyticsVisits, dbpool db.DB, logger *slog.Logger) {
13 	info := NewPicoPipeClient()
14-	metricDrain := pubsub.NewRemoteClientWriter(info, logger, 0)
15-	go metricDrain.KeepAlive("pub metric-drain -b=false")
16+	metricDrain, err := pipe.NewClient(logger, info)
17+	if err != nil {
18+		logger.Error("could not create metric-drain client", "err", err)
19+		return
20+	}
21+
22+	s, err := metricDrain.AddSession("metric-drain", "pub metric-drain -b=false", -1, -1)
23+	if err != nil {
24+		logger.Error("could not add session for metric-drain", "err", err)
25+		return
26+	}
27 
28 	for visit := range ch {
29 		data, err := json.Marshal(visit)
30@@ -176,7 +185,7 @@ func AnalyticsCollect(ch chan *db.AnalyticsVisits, dbpool db.DB, logger *slog.Lo
31 			logger.Error("could not json marshall visit record", "err", err)
32 		}
33 		data = append(data, '\n')
34-		_, err = metricDrain.Write(data)
35+		_, err = s.Write(data)
36 		if err != nil {
37 			logger.Error("could not write to metric-drain", "err", err)
38 		}
M shared/config.go
+3, -2
 1@@ -9,11 +9,12 @@ import (
 2 	"os"
 3 	"path"
 4 	"strings"
 5+	"time"
 6 
 7 	"github.com/picosh/pico/db"
 8 	"github.com/picosh/utils"
 9 
10-	pipeLogger "github.com/picosh/pubsub/log"
11+	pipeLogger "github.com/picosh/utils/pipe/log"
12 )
13 
14 var DefaultEmail = "hello@pico.sh"
15@@ -279,7 +280,7 @@ func CreateLogger(space string) *slog.Logger {
16 
17 	if strings.ToLower(utils.GetEnv("PICO_PIPE_ENABLED", "true")) == "true" {
18 		conn := NewPicoPipeClient()
19-		newLog, err := pipeLogger.SendLogRegister(log, conn, 100)
20+		newLog, err := pipeLogger.RegisterLogger(log, conn, 100, 10*time.Millisecond)
21 
22 		if err == nil {
23 			newLogger = newLog
M shared/pubsub.go
+3, -3
 1@@ -1,12 +1,12 @@
 2 package shared
 3 
 4 import (
 5-	"github.com/picosh/pubsub"
 6 	"github.com/picosh/utils"
 7+	"github.com/picosh/utils/pipe"
 8 )
 9 
10-func NewPicoPipeClient() *pubsub.RemoteClientInfo {
11-	return &pubsub.RemoteClientInfo{
12+func NewPicoPipeClient() *pipe.SSHClientInfo {
13+	return &pipe.SSHClientInfo{
14 		RemoteHost:     utils.GetEnv("PICO_PIPE_ENDPOINT", "pipe.pico.sh:22"),
15 		KeyLocation:    utils.GetEnv("PICO_PIPE_KEY", "ssh_data/term_info_ed25519"),
16 		KeyPassphrase:  utils.GetEnv("PICO_PIPE_PASSPHRASE", ""),
M tui/logs/logs.go
+2, -2
 1@@ -16,7 +16,7 @@ import (
 2 	"github.com/picosh/pico/tui/pages"
 3 	"github.com/picosh/utils"
 4 
 5-	pipeLogger "github.com/picosh/pubsub/log"
 6+	pipeLogger "github.com/picosh/utils/pipe/log"
 7 )
 8 
 9 type state int
10@@ -172,7 +172,7 @@ func (m Model) waitForActivity(sub chan map[string]any) tea.Cmd {
11 func (m Model) connectLogs(sub chan map[string]any) tea.Cmd {
12 	return func() tea.Msg {
13 		conn := shared.NewPicoPipeClient()
14-		stdoutPipe, err := pipeLogger.ConnectToLogs(m.ctx, conn)
15+		stdoutPipe, err := pipeLogger.ReadLogs(m.ctx, conn)
16 		if err != nil {
17 			return errMsg(err)
18 		}