summaryrefslogtreecommitdiffhomepage
path: root/internal/tui/components/logs
diff options
context:
space:
mode:
authoradamdottv <[email protected]>2025-05-14 13:06:09 -0500
committeradamdottv <[email protected]>2025-05-14 13:06:09 -0500
commit3982be4310aa57209fd4ce2be833c3515f759ba8 (patch)
tree1bf577d7185afb153dd1f3e8fd7c4dbe36bb6448 /internal/tui/components/logs
parent4c998d4f4ff2d9570796a81a95eb84d34d0a6939 (diff)
downloadopencode-3982be4310aa57209fd4ce2be833c3515f759ba8.tar.gz
opencode-3982be4310aa57209fd4ce2be833c3515f759ba8.zip
feat: session specific logs
Diffstat (limited to 'internal/tui/components/logs')
-rw-r--r--internal/tui/components/logs/table.go80
1 files changed, 41 insertions, 39 deletions
diff --git a/internal/tui/components/logs/table.go b/internal/tui/components/logs/table.go
index fa701adee..4d33679bb 100644
--- a/internal/tui/components/logs/table.go
+++ b/internal/tui/components/logs/table.go
@@ -2,14 +2,16 @@ package logs
import (
"context"
+ "log/slog"
"github.com/charmbracelet/bubbles/key"
"github.com/charmbracelet/bubbles/table"
tea "github.com/charmbracelet/bubbletea"
+ "github.com/sst/opencode/internal/app"
"github.com/sst/opencode/internal/logging"
"github.com/sst/opencode/internal/pubsub"
- "github.com/sst/opencode/internal/tui/components/chat"
"github.com/sst/opencode/internal/tui/layout"
+ "github.com/sst/opencode/internal/tui/state"
"github.com/sst/opencode/internal/tui/theme"
)
@@ -20,6 +22,7 @@ type TableComponent interface {
}
type tableCmp struct {
+ app *app.App
table table.Model
focused bool
logs []logging.Log
@@ -28,7 +31,7 @@ type tableCmp struct {
type selectedLogMsg logging.Log
-type logsLoadedMsg struct {
+type LogsLoadedMsg struct {
logs []logging.Log
}
@@ -39,21 +42,17 @@ func (i *tableCmp) Init() tea.Cmd {
func (i *tableCmp) fetchLogs() tea.Cmd {
return func() tea.Msg {
ctx := context.Background()
- loggingService := logging.GetService()
- if loggingService == nil {
- return nil
- }
var logs []logging.Log
var err error
- sessionId := "" // TODO: session.CurrentSessionID()
// Limit the number of logs to improve performance
const logLimit = 100
- if sessionId == "" {
- logs, err = loggingService.ListAll(ctx, logLimit)
+ if i.app.CurrentSession.ID == "" {
+ logs, err = i.app.Logs.ListAll(ctx, logLimit)
} else {
- logs, err = loggingService.ListBySession(ctx, sessionId)
+ logs, err = i.app.Logs.ListBySession(ctx, i.app.CurrentSession.ID)
+
// Trim logs if there are too many
if err == nil && len(logs) > logLimit {
logs = logs[len(logs)-logLimit:]
@@ -61,10 +60,33 @@ func (i *tableCmp) fetchLogs() tea.Cmd {
}
if err != nil {
+ slog.Error("Failed to fetch logs", "error", err)
return nil
}
- return logsLoadedMsg{logs: logs}
+ return LogsLoadedMsg{logs: logs}
+ }
+}
+
+func (i *tableCmp) updateRows() tea.Cmd {
+ return func() tea.Msg {
+ rows := make([]table.Row, 0, len(i.logs))
+
+ for _, log := range i.logs {
+ timeStr := log.Timestamp.Local().Format("15:04:05")
+
+ // Include ID as hidden first column for selection
+ row := table.Row{
+ log.ID,
+ timeStr,
+ log.Level,
+ log.Message,
+ }
+ rows = append(rows, row)
+ }
+
+ i.table.SetRows(rows)
+ return nil
}
}
@@ -72,12 +94,11 @@ func (i *tableCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
var cmds []tea.Cmd
switch msg := msg.(type) {
- case logsLoadedMsg:
+ case LogsLoadedMsg:
i.logs = msg.logs
- i.updateRows()
- return i, nil
+ return i, i.updateRows()
- case chat.SessionSelectedMsg:
+ case state.SessionSelectedMsg:
return i, i.fetchLogs()
case pubsub.Event[logging.Log]:
@@ -88,7 +109,7 @@ func (i *tableCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
if len(i.logs) > 100 {
i.logs = i.logs[:100]
}
- i.updateRows()
+ return i, i.updateRows()
}
return i, nil
}
@@ -116,9 +137,9 @@ func (i *tableCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
})
}
+ i.selectedLogID = selectedRow[0]
}
- i.selectedLogID = selectedRow[0]
return i, tea.Batch(cmds...)
}
@@ -160,26 +181,7 @@ func (i *tableCmp) BindingKeys() []key.Binding {
return layout.KeyMapToSlice(i.table.KeyMap)
}
-func (i *tableCmp) updateRows() {
- rows := make([]table.Row, 0, len(i.logs))
-
- for _, log := range i.logs {
- timeStr := log.Timestamp.Local().Format("15:04:05")
-
- // Include ID as hidden first column for selection
- row := table.Row{
- log.ID,
- timeStr,
- log.Level,
- log.Message,
- }
- rows = append(rows, row)
- }
-
- i.table.SetRows(rows)
-}
-
-func NewLogsTable() TableComponent {
+func NewLogsTable(app *app.App) TableComponent {
columns := []table.Column{
{Title: "ID", Width: 0}, // ID column with zero width
{Title: "Time", Width: 8},
@@ -192,6 +194,7 @@ func NewLogsTable() TableComponent {
)
tableModel.Focus()
return &tableCmp{
+ app: app,
table: tableModel,
logs: []logging.Log{},
}
@@ -206,6 +209,5 @@ func (i *tableCmp) Focus() {
// Blur implements the blurable interface
func (i *tableCmp) Blur() {
i.focused = false
- // Table doesn't have a Blur method, but we can implement it here
- // to satisfy the interface
+ i.table.Blur()
}