webui: add model name to info popup k/v pairs

Co-Authored-By: sketch <hello@sketch.dev>
Change-ID: s89edebe17dd6d6edk
diff --git a/loop/server/loophttp.go b/loop/server/loophttp.go
index cc183d3..dcb315f 100644
--- a/loop/server/loophttp.go
+++ b/loop/server/loophttp.go
@@ -159,6 +159,7 @@
 	DiffLinesRemoved     int                           `json:"diff_lines_removed"`              // Lines removed from sketch-base to HEAD
 	OpenPorts            []Port                        `json:"open_ports,omitempty"`            // Currently open TCP ports
 	TokenContextWindow   int                           `json:"token_context_window,omitempty"`
+	Model                string                        `json:"model,omitempty"` // Name of the model being used
 	SessionEnded         bool                          `json:"session_ended,omitempty"`
 	CanSendMessages      bool                          `json:"can_send_messages,omitempty"`
 	EndedAt              time.Time                     `json:"ended_at,omitempty"`
@@ -1386,6 +1387,7 @@
 		DiffLinesRemoved:     diffRemoved,
 		OpenPorts:            s.getOpenPorts(),
 		TokenContextWindow:   s.agent.TokenContextWindow(),
+		Model:                s.agent.ModelName(),
 	}
 }
 
diff --git a/loop/server/loophttp_test.go b/loop/server/loophttp_test.go
index 04a18ba..fa591b2 100644
--- a/loop/server/loophttp_test.go
+++ b/loop/server/loophttp_test.go
@@ -35,6 +35,7 @@
 	slug                     string
 	retryNumber              int
 	skabandAddr              string
+	model                    string
 }
 
 // TokenContextWindow implements loop.CodingAgent.
@@ -42,6 +43,11 @@
 	return 200000
 }
 
+// ModelName implements loop.CodingAgent.
+func (m *mockAgent) ModelName() string {
+	return m.model
+}
+
 func (m *mockAgent) NewIterator(ctx context.Context, nextMessageIdx int) loop.MessageIterator {
 	m.mu.RLock()
 	// Send existing messages that should be available immediately
@@ -293,6 +299,7 @@
 		branchName:               "sketch/test-branch",
 		branchPrefix:             "sketch/",
 		slug:                     "test-slug",
+		model:                    "fake-model",
 	}
 
 	// Add the initial messages before creating the server
@@ -428,6 +435,7 @@
 	mockAgent := &mockAgent{
 		workingDir:   t.TempDir(), // Use a temp directory
 		branchPrefix: "sketch/",
+		model:        "fake-model",
 	}
 
 	// Create the server with the mock agent
@@ -475,6 +483,7 @@
 	mockAgent := &mockAgent{
 		workingDir:   t.TempDir(), // Use a temp directory
 		branchPrefix: "sketch/",
+		model:        "fake-model",
 	}
 
 	// Create the server with the mock agent
@@ -514,6 +523,7 @@
 		messageCount: 0,
 		sessionID:    "test-session",
 		branchPrefix: "sketch/",
+		model:        "fake-model",
 	}
 
 	ctx := context.Background()
@@ -618,6 +628,7 @@
 		branchPrefix:  "test-",
 		workingDir:    "/tmp/test",
 		sessionID:     "test-session",
+		model:         "fake-model",
 		slug:          "test-slug",
 		skabandAddr:   "http://localhost:8080",
 	}
@@ -686,6 +697,7 @@
 	mockAgent := &mockAgent{
 		workingDir:   t.TempDir(),
 		branchPrefix: "sketch/",
+		model:        "fake-model",
 	}
 
 	// Create the server with the mock agent
@@ -771,6 +783,7 @@
 	mockAgent := &mockAgent{
 		workingDir:   t.TempDir(),
 		branchPrefix: "sketch/",
+		model:        "fake-model",
 	}
 
 	// Create the server with the mock agent