1diff --git a/pico/cli.go b/pico/cli.go
2index 613873d..f4e079f 100644
3--- a/pico/cli.go
4+++ b/pico/cli.go
5@@ -1,6 +1,8 @@
6 package pico
7
8 import (
9+ "bufio"
10+ "encoding/json"
11 "fmt"
12 "log/slog"
13 "strings"
14@@ -34,12 +36,13 @@ func getUser(s ssh.Session, dbpool db.DB) (*db.User, error) {
15 }
16
17 type Cmd struct {
18- User *db.User
19- Session shared.CmdSession
20- Log *slog.Logger
21- Dbpool db.DB
22- Write bool
23- Styles common.Styles
24+ User *db.User
25+ SshSession ssh.Session
26+ Session shared.CmdSession
27+ Log *slog.Logger
28+ Dbpool db.DB
29+ Write bool
30+ Styles common.Styles
31 }
32
33 func (c *Cmd) output(out string) {
34@@ -62,6 +65,54 @@ func (c *Cmd) notifications() error {
35 return nil
36 }
37
38+func (c *Cmd) logs() error {
39+ sshClient, err := shared.CreateSSHClient(
40+ shared.GetEnv("PICO_SENDLOG_ENDPOINT", "send.pico.sh:22"),
41+ shared.GetEnv("PICO_SENDLOG_KEY", "ssh_data/term_info_ed25519"),
42+ shared.GetEnv("PICO_SENDLOG_PASSPHRASE", ""),
43+ shared.GetEnv("PICO_SENDLOG_REMOTE_HOST", "send.pico.sh"),
44+ shared.GetEnv("PICO_SENDLOG_USER", "pico"),
45+ )
46+ if err != nil {
47+ return err
48+ }
49+
50+ session, err := sshClient.NewSession()
51+ if err != nil {
52+ return err
53+ }
54+
55+ stdoutPipe, err := session.StdoutPipe()
56+ if err != nil {
57+ return err
58+ }
59+
60+ err = session.Start("sub log-sink -k")
61+ if err != nil {
62+ return err
63+ }
64+
65+ scanner := bufio.NewScanner(stdoutPipe)
66+ for scanner.Scan() {
67+ line := scanner.Text()
68+ parsedData := map[string]any{}
69+
70+ err := json.Unmarshal([]byte(line), &parsedData)
71+ if err != nil {
72+ continue
73+ }
74+
75+ if userId, ok := parsedData["userId"]; ok {
76+ if userID, ok := userId.(string); ok {
77+ if userID == c.User.ID {
78+ wish.Println(c.SshSession, line)
79+ }
80+ }
81+ }
82+ }
83+ return scanner.Err()
84+}
85+
86 type CliHandler struct {
87 DBPool db.DB
88 Logger *slog.Logger
89@@ -113,11 +164,12 @@ func WishMiddleware(handler *CliHandler) wish.Middleware {
90 }
91
92 opts := Cmd{
93- Session: sesh,
94- User: user,
95- Log: log,
96- Dbpool: dbpool,
97- Write: false,
98+ Session: sesh,
99+ SshSession: sesh,
100+ User: user,
101+ Log: log,
102+ Dbpool: dbpool,
103+ Write: false,
104 }
105
106 cmd := strings.TrimSpace(args[0])
107@@ -125,6 +177,9 @@ func WishMiddleware(handler *CliHandler) wish.Middleware {
108 if cmd == "help" {
109 opts.help()
110 return
111+ } else if cmd == "logs" {
112+ opts.logs()
113+ return
114 } else if cmd == "pico+" {
115 opts.plus()
116 return
117diff --git a/shared/sendlog.go b/shared/sendlog.go
118index 75136b4..596fcbd 100644
119--- a/shared/sendlog.go
120+++ b/shared/sendlog.go
121@@ -138,7 +138,7 @@ func (c *SendLogWriter) Open() error {
122 c.Done = make(chan struct{})
123 c.Messages = make(chan []byte, c.BufferSize)
124
125- sshClient, err := createSSHClient(
126+ sshClient, err := CreateSSHClient(
127 GetEnv("PICO_SENDLOG_ENDPOINT", "send.pico.sh:22"),
128 GetEnv("PICO_SENDLOG_KEY", "ssh_data/term_info_ed25519"),
129 GetEnv("PICO_SENDLOG_PASSPHRASE", ""),
130@@ -248,7 +248,7 @@ func (c *SendLogWriter) Reconnect() {
131 }()
132 }
133
134-func createSSHClient(remoteHost string, keyLocation string, keyPassphrase string, remoteHostname string, remoteUser string) (*ssh.Client, error) {
135+func CreateSSHClient(remoteHost string, keyLocation string, keyPassphrase string, remoteHostname string, remoteUser string) (*ssh.Client, error) {
136 if !strings.Contains(remoteHost, ":") {
137 remoteHost += ":22"
138 }