package cilogs
import (
"errors"
"fmt"
"github.com/bluesky-social/indigo/atproto/syntax"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/ssh"
wishtea "github.com/charmbracelet/wish/bubbletea"
"tangled.org/core/api/org_tangled"
)
func (s *Server) teaHandler(sess ssh.Session) (tea.Model, []tea.ProgramOption) {
remote := sess.RemoteAddr().String()
args := sess.Command()
l := s.logger.With("remote", remote)
l.Info("SSH connection", "args", args)
defer l.Info("SSH connection closed", "remote", remote)
renderer := wishtea.MakeRenderer(sess)
if len(args) != 2 {
l.Warn("bad invocation", "args", args)
return newErrorModel(renderer, "usage: ssh -t -p <port> <host> <repoDID> <sha>"), wishtea.MakeOptions(sess)
}
repoDID := args[0]
sha := args[1]
l = l.With("repoDID", repoDID, "sha", sha)
repo, err := syntax.ParseDID(repoDID)
if err != nil {
l.Warn("bad repo did", "err", err)
return newErrorModel(renderer, fmt.Sprintf("%q is not a repo did", repoDID)), wishtea.MakeOptions(sess)
}
xrpcc, err := s.spindles.Of(sess.Context(), repo)
if err != nil {
l.Warn("no spindle for repo", "err", err)
if errors.Is(err, ErrNoSpindle) {
return newErrorModel(renderer, fmt.Sprintf("no spindle configured for repo %s", repoDID)), wishtea.MakeOptions(sess)
}
return newErrorModel(renderer, fmt.Sprintf("could not look up the spindle for repo %s", repoDID)), wishtea.MakeOptions(sess)
}
l = l.With("spindle", xrpcc.Host)
out, err := org_tangled.CiQueryPipelines(sess.Context(), xrpcc, []string{sha}, "", 1, repoDID, nil)
if err != nil || len(out.Pipelines) == 0 {
l.Warn("pipeline not found", "err", err)
return newErrorModel(renderer, fmt.Sprintf("pipeline not found for repo %s @ %s", repoDID, sha)), wishtea.MakeOptions(sess)
}
pipeline := out.Pipelines[0]
if _, err := syntax.ParseRecordKey(pipeline.Id); err != nil {
l.Warn("invalid pipeline id", "id", pipeline.Id, "err", err)
return newErrorModel(renderer, fmt.Sprintf("invalid pipeline id %q", pipeline.Id)), wishtea.MakeOptions(sess)
}
l.Info("serving pipeline", "pipeline", pipeline.Id, "workflows", len(pipeline.Workflows))
pty, _, _ := sess.Pty()
opts := append(wishtea.MakeOptions(sess), tea.WithAltScreen())
return newPipelineModel(renderer, xrpcc, pipeline, pty.Window.Width, pty.Window.Height), opts
}