diff --git a/cmd/go2ts/go2ts.go b/cmd/go2ts/go2ts.go
index 65fc9ab..cc97c6b 100644
--- a/cmd/go2ts/go2ts.go
+++ b/cmd/go2ts/go2ts.go
@@ -12,6 +12,7 @@
 	"os"
 
 	"go.skia.org/infra/go/go2ts"
+	"sketch.dev/git_tools"
 	"sketch.dev/llm"
 	"sketch.dev/loop"
 	"sketch.dev/loop/server"
@@ -58,6 +59,8 @@
 		server.State{},
 		loop.MultipleChoiceOption{},
 		loop.MultipleChoiceParams{},
+		git_tools.DiffFile{},
+		git_tools.GitLogEntry{},
 	)
 
 	generator.GenerateNominalTypes = true
diff --git a/git_tools/git_tools.go b/git_tools/git_tools.go
index f8a1807..9ff8a71 100644
--- a/git_tools/git_tools.go
+++ b/git_tools/git_tools.go
@@ -4,7 +4,9 @@
 import (
 	"bufio"
 	"fmt"
+	"os"
 	"os/exec"
+	"path/filepath"
 	"strings"
 )
 
@@ -17,9 +19,18 @@
 	NewHash string `json:"new_hash"`
 	Status  string `json:"status"` // A=added, M=modified, D=deleted, etc.
 } // GitRawDiff returns a structured representation of the Git diff between two commits or references
+// If 'to' is empty, it will show unstaged changes (diff with working directory)
 func GitRawDiff(repoDir, from, to string) ([]DiffFile, error) {
 	// Git command to generate the diff in raw format with full hashes
-	cmd := exec.Command("git", "-C", repoDir, "diff", "--raw", "--abbrev=40", from, to)
+	var cmd *exec.Cmd
+	if to == "" {
+		// If 'to' is empty, show unstaged changes
+		cmd = exec.Command("git", "-C", repoDir, "diff", "--raw", "--abbrev=40", from)
+	} else {
+		// Normal diff between two refs
+		cmd = exec.Command("git", "-C", repoDir, "diff", "--raw", "--abbrev=40", from, to)
+	}
+
 	out, err := cmd.CombinedOutput()
 	if err != nil {
 		return nil, fmt.Errorf("error executing git diff: %w - %s", err, string(out))
@@ -87,15 +98,15 @@
 	return files, nil
 }
 
-// LogEntry represents a single entry in the git log
-type LogEntry struct {
+// GitLogEntry represents a single entry in the git log
+type GitLogEntry struct {
 	Hash    string   `json:"hash"`    // The full commit hash
 	Refs    []string `json:"refs"`    // References (branches, tags) pointing to this commit
 	Subject string   `json:"subject"` // The commit subject/message
 }
 
 // GitRecentLog returns the recent commit log between the initial commit and HEAD
-func GitRecentLog(repoDir string, initialCommitHash string) ([]LogEntry, error) {
+func GitRecentLog(repoDir string, initialCommitHash string) ([]GitLogEntry, error) {
 	// Validate input
 	if initialCommitHash == "" {
 		return nil, fmt.Errorf("initial commit hash must be provided")
@@ -120,7 +131,7 @@
 }
 
 // getGitLog gets the git log with the specified format using the provided fromCommit
-func getGitLog(repoDir string, fromCommit string) ([]LogEntry, error) {
+func getGitLog(repoDir string, fromCommit string) ([]GitLogEntry, error) {
 	// Check if fromCommit~10 exists (10 commits before fromCommit)
 	checkCmd := exec.Command("git", "-C", repoDir, "rev-parse", "--verify", fromCommit+"~10")
 	if err := checkCmd.Run(); err != nil {
@@ -144,8 +155,8 @@
 }
 
 // parseGitLog parses the output of git log with null-separated fields
-func parseGitLog(logOutput string) ([]LogEntry, error) {
-	var entries []LogEntry
+func parseGitLog(logOutput string) ([]GitLogEntry, error) {
+	var entries []GitLogEntry
 	if logOutput == "" {
 		return entries, nil
 	}
@@ -165,7 +176,7 @@
 		// Parse the refs from the decoration
 		refs := parseRefs(decoration)
 
-		entries = append(entries, LogEntry{
+		entries = append(entries, GitLogEntry{
 			Hash:    hash,
 			Refs:    refs,
 			Subject: subject,
@@ -228,3 +239,70 @@
 
 	return refs
 }
+
+// validateRepoPath verifies that a file is tracked by git and within the repository boundaries
+// Returns the full path to the file if valid
+func validateRepoPath(repoDir, filePath string) (string, error) {
+	// First verify that the requested file is tracked by git to prevent
+	// access to files outside the repository
+	cmd := exec.Command("git", "-C", repoDir, "ls-files", "--error-unmatch", filePath)
+	if err := cmd.Run(); err != nil {
+		return "", fmt.Errorf("file not tracked by git or outside repository: %s", filePath)
+	}
+
+	// Construct the full file path
+	fullPath := filepath.Join(repoDir, filePath)
+
+	// Validate that the resolved path is still within the repository directory
+	// to prevent directory traversal attacks (e.g., ../../../etc/passwd)
+	absRepoDir, err := filepath.Abs(repoDir)
+	if err != nil {
+		return "", fmt.Errorf("unable to resolve absolute repository path: %w", err)
+	}
+
+	absFilePath, err := filepath.Abs(fullPath)
+	if err != nil {
+		return "", fmt.Errorf("unable to resolve absolute file path: %w", err)
+	}
+
+	// Check that the absolute file path starts with the absolute repository path
+	if !strings.HasPrefix(absFilePath, absRepoDir+string(filepath.Separator)) {
+		return "", fmt.Errorf("file path outside repository: %s", filePath)
+	}
+
+	return fullPath, nil
+}
+
+// GitCat returns the contents of a file in the repository at the given path
+// This is used to get the current working copy of a file (not using git show)
+func GitCat(repoDir, filePath string) (string, error) {
+	fullPath, err := validateRepoPath(repoDir, filePath)
+	if err != nil {
+		return "", err
+	}
+
+	// Read the file
+	content, err := os.ReadFile(fullPath)
+	if err != nil {
+		return "", fmt.Errorf("error reading file %s: %w", filePath, err)
+	}
+
+	return string(content), nil
+}
+
+// GitSaveFile saves content to a file in the repository, checking first that it's tracked by git
+// This prevents writing to files outside the repository
+func GitSaveFile(repoDir, filePath, content string) error {
+	fullPath, err := validateRepoPath(repoDir, filePath)
+	if err != nil {
+		return err
+	}
+
+	// Write the content to the file
+	err = os.WriteFile(fullPath, []byte(content), 0644)
+	if err != nil {
+		return fmt.Errorf("error writing to file %s: %w", filePath, err)
+	}
+
+	return nil
+}
diff --git a/git_tools/git_tools_test.go b/git_tools/git_tools_test.go
index 5be6b0f..e800a0c 100644
--- a/git_tools/git_tools_test.go
+++ b/git_tools/git_tools_test.go
@@ -363,3 +363,79 @@
 		})
 	}
 }
+
+func TestGitSaveFile(t *testing.T) {
+	// Create a temporary directory for the test repository
+	tmpDir, err := os.MkdirTemp("", "gitsave-test-")
+	if err != nil {
+		t.Fatalf("Failed to create temp dir: %v", err)
+	}
+	defer os.RemoveAll(tmpDir)
+
+	// Initialize a git repository
+	cmd := exec.Command("git", "init")
+	cmd.Dir = tmpDir
+	output, err := cmd.CombinedOutput()
+	if err != nil {
+		t.Fatalf("Failed to initialize git repo: %v, output: %s", err, output)
+	}
+
+	// Create and add a test file to the repo
+	testFilePath := "test-file.txt"
+	testFileContent := "initial content"
+	testFileFull := filepath.Join(tmpDir, testFilePath)
+
+	err = os.WriteFile(testFileFull, []byte(testFileContent), 0644)
+	if err != nil {
+		t.Fatalf("Failed to write test file: %v", err)
+	}
+
+	// Add the file to git
+	cmd = exec.Command("git", "add", testFilePath)
+	cmd.Dir = tmpDir
+	output, err = cmd.CombinedOutput()
+	if err != nil {
+		t.Fatalf("Failed to add test file to git: %v, output: %s", err, output)
+	}
+
+	// Commit the file
+	cmd = exec.Command("git", "commit", "-m", "Initial commit")
+	cmd.Dir = tmpDir
+	cmd.Env = append(os.Environ(),
+		"GIT_AUTHOR_NAME=Test",
+		"GIT_AUTHOR_EMAIL=test@example.com",
+		"GIT_COMMITTER_NAME=Test",
+		"GIT_COMMITTER_EMAIL=test@example.com")
+	output, err = cmd.CombinedOutput()
+	if err != nil {
+		t.Fatalf("Failed to commit test file: %v, output: %s", err, output)
+	}
+
+	// Test successful save
+	newContent := "updated content"
+	err = GitSaveFile(tmpDir, testFilePath, newContent)
+	if err != nil {
+		t.Errorf("GitSaveFile failed: %v", err)
+	}
+
+	// Verify the file was updated
+	content, err := os.ReadFile(testFileFull)
+	if err != nil {
+		t.Fatalf("Failed to read updated file: %v", err)
+	}
+	if string(content) != newContent {
+		t.Errorf("File content not updated correctly; got %q, want %q", string(content), newContent)
+	}
+
+	// Test saving a file outside the repo
+	err = GitSaveFile(tmpDir, "../outside.txt", "malicious content")
+	if err == nil {
+		t.Error("GitSaveFile should have rejected a path outside the repository")
+	}
+
+	// Test saving a file not tracked by git
+	err = GitSaveFile(tmpDir, "untracked.txt", "untracked content")
+	if err == nil {
+		t.Error("GitSaveFile should have rejected an untracked file")
+	}
+}
diff --git a/loop/server/loophttp.go b/loop/server/loophttp.go
index f7e6502..7df354d 100644
--- a/loop/server/loophttp.go
+++ b/loop/server/loophttp.go
@@ -135,6 +135,8 @@
 	// Git tool endpoints
 	s.mux.HandleFunc("/git/rawdiff", s.handleGitRawDiff)
 	s.mux.HandleFunc("/git/show", s.handleGitShow)
+	s.mux.HandleFunc("/git/cat", s.handleGitCat)
+	s.mux.HandleFunc("/git/save", s.handleGitSave)
 	s.mux.HandleFunc("/git/recentlog", s.handleGitRecentLog)
 
 	s.mux.HandleFunc("/diff", func(w http.ResponseWriter, r *http.Request) {
@@ -1230,10 +1232,11 @@
 	}
 
 	// Check if we have enough parameters
-	if from == "" || to == "" {
-		http.Error(w, "Missing required parameters: either 'commit' or both 'from' and 'to'", http.StatusBadRequest)
+	if from == "" {
+		http.Error(w, "Missing required parameter: either 'commit' or at least 'from'", http.StatusBadRequest)
 		return
 	}
+	// Note: 'to' can be empty to indicate working directory (unstaged changes)
 
 	// Call the git_tools function
 	diff, err := git_tools.GitRawDiff(repoDir, from, to)
@@ -1311,3 +1314,76 @@
 		return
 	}
 }
+
+func (s *Server) handleGitCat(w http.ResponseWriter, r *http.Request) {
+	if r.Method != "GET" {
+		w.WriteHeader(http.StatusMethodNotAllowed)
+		return
+	}
+
+	// Get the git working directory from agent
+	repoDir := s.agent.WorkingDir()
+
+	// Parse query parameters
+	query := r.URL.Query()
+	path := query.Get("path")
+
+	// Check if path is provided
+	if path == "" {
+		http.Error(w, "Missing required parameter: path", http.StatusBadRequest)
+		return
+	}
+
+	// Get file content using GitCat
+	content, err := git_tools.GitCat(repoDir, path)
+	if err != nil {
+		http.Error(w, fmt.Sprintf("Error reading file: %v", err), http.StatusInternalServerError)
+		return
+	}
+
+	// Return the content as JSON for consistency with other endpoints
+	w.Header().Set("Content-Type", "application/json")
+	if err := json.NewEncoder(w).Encode(map[string]string{"output": content}); err != nil {
+		http.Error(w, fmt.Sprintf("Error encoding response: %v", err), http.StatusInternalServerError)
+		return
+	}
+}
+
+func (s *Server) handleGitSave(w http.ResponseWriter, r *http.Request) {
+	if r.Method != "POST" {
+		w.WriteHeader(http.StatusMethodNotAllowed)
+		return
+	}
+
+	// Get the git working directory from agent
+	repoDir := s.agent.WorkingDir()
+
+	// Parse request body
+	var requestBody struct {
+		Path    string `json:"path"`
+		Content string `json:"content"`
+	}
+
+	if err := json.NewDecoder(r.Body).Decode(&requestBody); err != nil {
+		http.Error(w, fmt.Sprintf("Error parsing request body: %v", err), http.StatusBadRequest)
+		return
+	}
+	defer r.Body.Close()
+
+	// Check if path is provided
+	if requestBody.Path == "" {
+		http.Error(w, "Missing required parameter: path", http.StatusBadRequest)
+		return
+	}
+
+	// Save file content using GitSaveFile
+	err := git_tools.GitSaveFile(repoDir, requestBody.Path, requestBody.Content)
+	if err != nil {
+		http.Error(w, fmt.Sprintf("Error saving file: %v", err), http.StatusInternalServerError)
+		return
+	}
+
+	// Return simple success response
+	w.WriteHeader(http.StatusOK)
+	w.Write([]byte("ok"))
+}
diff --git a/webui/esbuild.go b/webui/esbuild.go
index fd8a459..d4f7858 100644
--- a/webui/esbuild.go
+++ b/webui/esbuild.go
@@ -121,6 +121,45 @@
 	return cacheDir, filepath.Join(cacheDir, "skui-"+hash+".zip"), nil
 }
 
+// copyMonacoAssets copies Monaco editor assets to the output directory
+func copyMonacoAssets(buildDir, outDir string) error {
+	// Create Monaco directories
+	monacoEditorDir := filepath.Join(outDir, "monaco", "min", "vs", "editor")
+	codiconDir := filepath.Join(outDir, "monaco", "min", "vs", "base", "browser", "ui", "codicons", "codicon")
+
+	if err := os.MkdirAll(monacoEditorDir, 0o777); err != nil {
+		return fmt.Errorf("failed to create monaco editor directory: %w", err)
+	}
+
+	if err := os.MkdirAll(codiconDir, 0o777); err != nil {
+		return fmt.Errorf("failed to create codicon directory: %w", err)
+	}
+
+	// Copy Monaco editor CSS
+	editorCssPath := "node_modules/monaco-editor/min/vs/editor/editor.main.css"
+	editorCss, err := os.ReadFile(filepath.Join(buildDir, editorCssPath))
+	if err != nil {
+		return fmt.Errorf("failed to read monaco editor CSS: %w", err)
+	}
+
+	if err := os.WriteFile(filepath.Join(monacoEditorDir, "editor.main.css"), editorCss, 0o666); err != nil {
+		return fmt.Errorf("failed to write monaco editor CSS: %w", err)
+	}
+
+	// Copy Codicon font
+	codiconFontPath := "node_modules/monaco-editor/min/vs/base/browser/ui/codicons/codicon/codicon.ttf"
+	codiconFont, err := os.ReadFile(filepath.Join(buildDir, codiconFontPath))
+	if err != nil {
+		return fmt.Errorf("failed to read codicon font: %w", err)
+	}
+
+	if err := os.WriteFile(filepath.Join(codiconDir, "codicon.ttf"), codiconFont, 0o666); err != nil {
+		return fmt.Errorf("failed to write codicon font: %w", err)
+	}
+
+	return nil
+}
+
 // Build unpacks and esbuild's all bundleTs typescript files
 func Build() (fs.FS, error) {
 	cacheDir, hashZip, err := zipPath()
@@ -163,13 +202,27 @@
 	if out, err := cmd.CombinedOutput(); err != nil {
 		return nil, fmt.Errorf("npm ci: %s: %v", out, err)
 	}
-	bundleTs := []string{"src/web-components/sketch-app-shell.ts"}
+	bundleTs := []string{
+		"src/web-components/sketch-app-shell.ts",
+		"src/web-components/sketch-monaco-view.ts",
+		"node_modules/monaco-editor/esm/vs/editor/editor.worker.js",
+		"node_modules/monaco-editor/esm/vs/language/typescript/ts.worker.js",
+		"node_modules/monaco-editor/esm/vs/language/html/html.worker.js",
+		"node_modules/monaco-editor/esm/vs/language/css/css.worker.js",
+		"node_modules/monaco-editor/esm/vs/language/json/json.worker.js",
+	}
+
 	for _, tsName := range bundleTs {
 		if err := esbuildBundle(tmpHashDir, filepath.Join(buildDir, tsName), ""); err != nil {
 			return nil, fmt.Errorf("esbuild: %s: %w", tsName, err)
 		}
 	}
 
+	// Copy Monaco editor assets
+	if err := copyMonacoAssets(buildDir, tmpHashDir); err != nil {
+		return nil, fmt.Errorf("failed to copy Monaco assets: %w", err)
+	}
+
 	// Copy src files used directly into the new hash output dir.
 	err = fs.WalkDir(embedded, "src", func(path string, d fs.DirEntry, err error) error {
 		if d.IsDir() {
@@ -283,6 +336,12 @@
 		// Disable minification for now
 		// "--minify",
 		"--outdir=" + outDir,
+		"--loader:.ttf=file",
+		"--loader:.eot=file",
+		"--loader:.woff=file",
+		"--loader:.woff2=file",
+		// This changes where the sourcemap points to; we need relative dirs if we're proxied into a subdirectory.
+		"--public-path=.",
 	}
 
 	// Add metafile option if path is provided
@@ -358,7 +417,10 @@
 	}
 
 	// All bundles to analyze
-	bundleTs := []string{"src/web-components/sketch-app-shell.ts"}
+	bundleTs := []string{
+		"src/web-components/sketch-app-shell.ts",
+		"src/web-components/sketch-monaco-view.ts",
+	}
 	metafiles := make([]string, len(bundleTs))
 
 	for i, tsName := range bundleTs {
diff --git a/webui/package-lock.json b/webui/package-lock.json
index f521737..cbaeef3 100644
--- a/webui/package-lock.json
+++ b/webui/package-lock.json
@@ -1,11 +1,11 @@
 {
-  "name": "webui",
+  "name": "sketch-webui",
   "version": "1.0.0",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
-      "name": "webui",
+      "name": "sketch-webui",
       "version": "1.0.0",
       "license": "ISC",
       "dependencies": {
@@ -15,10 +15,8 @@
         "lit": "^3.2.1",
         "marked": "^15.0.7",
         "mermaid": "^11.6.0",
-        "sanitize-html": "^2.15.0",
-        "vega": "^5.33.0",
-        "vega-embed": "^6.29.0",
-        "vega-lite": "^5.23.0"
+        "monaco-editor": "^0.52.2",
+        "sanitize-html": "^2.15.0"
       },
       "devDependencies": {
         "@sand4rt/experimental-ct-web": "^1.51.1",
@@ -1447,6 +1445,7 @@
       "cpu": [
         "x64"
       ],
+      "dev": true,
       "license": "MIT",
       "optional": true,
       "os": [
@@ -1870,6 +1869,7 @@
       "version": "1.0.7",
       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
       "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/@types/express": {
@@ -2650,6 +2650,7 @@
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -2658,6 +2659,7 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
       "dependencies": {
         "color-convert": "^2.0.1"
       },
@@ -3161,6 +3163,7 @@
       "version": "8.0.1",
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
       "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+      "dev": true,
       "license": "ISC",
       "dependencies": {
         "string-width": "^4.2.0",
@@ -3175,6 +3178,7 @@
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
       "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "ansi-styles": "^4.0.0",
@@ -3227,6 +3231,7 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "color-name": "~1.1.4"
@@ -3239,6 +3244,7 @@
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/command-line-args": {
@@ -3687,36 +3693,6 @@
         "node": ">=12"
       }
     },
-    "node_modules/d3-geo-projection": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-4.0.0.tgz",
-      "integrity": "sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==",
-      "license": "ISC",
-      "dependencies": {
-        "commander": "7",
-        "d3-array": "1 - 3",
-        "d3-geo": "1.12.0 - 3"
-      },
-      "bin": {
-        "geo2svg": "bin/geo2svg.js",
-        "geograticule": "bin/geograticule.js",
-        "geoproject": "bin/geoproject.js",
-        "geoquantize": "bin/geoquantize.js",
-        "geostitch": "bin/geostitch.js"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/d3-geo-projection/node_modules/commander": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
-      "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 10"
-      }
-    },
     "node_modules/d3-hierarchy": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
@@ -4200,7 +4176,8 @@
     "node_modules/emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true
     },
     "node_modules/encodeurl": {
       "version": "1.0.2",
@@ -4339,6 +4316,7 @@
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
       "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=6"
@@ -4532,12 +4510,6 @@
         "node": ">=8.6.0"
       }
     },
-    "node_modules/fast-json-patch": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz",
-      "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==",
-      "license": "MIT"
-    },
     "node_modules/fastq": {
       "version": "1.19.1",
       "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
@@ -4644,6 +4616,7 @@
       "version": "2.0.5",
       "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
       "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "dev": true,
       "license": "ISC",
       "engines": {
         "node": "6.* || 8.* || >= 10.*"
@@ -5149,6 +5122,7 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
       "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=8"
@@ -5370,12 +5344,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/json-stringify-pretty-compact": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz",
-      "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==",
-      "license": "MIT"
-    },
     "node_modules/json5": {
       "version": "2.2.3",
       "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -5852,6 +5820,11 @@
         "pathe": "^2.0.1"
       }
     },
+    "node_modules/monaco-editor": {
+      "version": "0.52.2",
+      "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz",
+      "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ=="
+    },
     "node_modules/ms": {
       "version": "2.1.3",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -5964,26 +5937,6 @@
         "node": ">= 0.4.0"
       }
     },
-    "node_modules/node-fetch": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
-      "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
-      "license": "MIT",
-      "dependencies": {
-        "whatwg-url": "^5.0.0"
-      },
-      "engines": {
-        "node": "4.x || >=6.0.0"
-      },
-      "peerDependencies": {
-        "encoding": "^0.1.0"
-      },
-      "peerDependenciesMeta": {
-        "encoding": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/node-releases": {
       "version": "2.0.19",
       "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
@@ -6791,6 +6744,7 @@
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
       "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
@@ -7060,6 +7014,7 @@
       "version": "7.7.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
       "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+      "dev": true,
       "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
@@ -7292,6 +7247,7 @@
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
       "dependencies": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
@@ -7305,6 +7261,7 @@
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
       "dependencies": {
         "ansi-regex": "^5.0.1"
       },
@@ -7487,26 +7444,6 @@
         "node": ">=0.6"
       }
     },
-    "node_modules/topojson-client": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz",
-      "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==",
-      "license": "ISC",
-      "dependencies": {
-        "commander": "2"
-      },
-      "bin": {
-        "topo2geo": "bin/topo2geo",
-        "topomerge": "bin/topomerge",
-        "topoquantize": "bin/topoquantize"
-      }
-    },
-    "node_modules/topojson-client/node_modules/commander": {
-      "version": "2.20.3",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-      "license": "MIT"
-    },
     "node_modules/tough-cookie": {
       "version": "4.1.4",
       "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
@@ -7522,12 +7459,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
-      "license": "MIT"
-    },
     "node_modules/ts-dedent": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz",
@@ -7541,6 +7472,7 @@
       "version": "2.8.1",
       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
       "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+      "dev": true,
       "license": "0BSD"
     },
     "node_modules/tsscmp": {
@@ -7731,473 +7663,6 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/vega": {
-      "version": "5.33.0",
-      "resolved": "https://registry.npmjs.org/vega/-/vega-5.33.0.tgz",
-      "integrity": "sha512-jNAGa7TxLojOpMMMrKMXXBos4K6AaLJbCgGDOw1YEkLRjUkh12pcf65J2lMSdEHjcEK47XXjKiOUVZ8L+MniBA==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "vega-crossfilter": "~4.1.3",
-        "vega-dataflow": "~5.7.7",
-        "vega-encode": "~4.10.2",
-        "vega-event-selector": "~3.0.1",
-        "vega-expression": "~5.2.0",
-        "vega-force": "~4.2.2",
-        "vega-format": "~1.1.3",
-        "vega-functions": "~5.18.0",
-        "vega-geo": "~4.4.3",
-        "vega-hierarchy": "~4.1.3",
-        "vega-label": "~1.3.1",
-        "vega-loader": "~4.5.3",
-        "vega-parser": "~6.6.0",
-        "vega-projection": "~1.6.2",
-        "vega-regression": "~1.3.1",
-        "vega-runtime": "~6.2.1",
-        "vega-scale": "~7.4.2",
-        "vega-scenegraph": "~4.13.1",
-        "vega-statistics": "~1.9.0",
-        "vega-time": "~2.1.3",
-        "vega-transforms": "~4.12.1",
-        "vega-typings": "~1.5.0",
-        "vega-util": "~1.17.2",
-        "vega-view": "~5.16.0",
-        "vega-view-transforms": "~4.6.1",
-        "vega-voronoi": "~4.2.4",
-        "vega-wordcloud": "~4.1.6"
-      }
-    },
-    "node_modules/vega-canvas": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/vega-canvas/-/vega-canvas-1.2.7.tgz",
-      "integrity": "sha512-OkJ9CACVcN9R5Pi9uF6MZBF06pO6qFpDYHWSKBJsdHP5o724KrsgR6UvbnXFH82FdsiTOff/HqjuaG8C7FL+9Q==",
-      "license": "BSD-3-Clause"
-    },
-    "node_modules/vega-crossfilter": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-4.1.3.tgz",
-      "integrity": "sha512-nyPJAXAUABc3EocUXvAL1J/IWotZVsApIcvOeZaUdEQEtZ7bt8VtP2nj3CLbHBA8FZZVV+K6SmdwvCOaAD4wFQ==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "d3-array": "^3.2.2",
-        "vega-dataflow": "^5.7.7",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-dataflow": {
-      "version": "5.7.7",
-      "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-5.7.7.tgz",
-      "integrity": "sha512-R2NX2HvgXL+u4E6u+L5lKvvRiCtnE6N6l+umgojfi53suhhkFP+zB+2UAQo4syxuZ4763H1csfkKc4xpqLzKnw==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "vega-format": "^1.1.3",
-        "vega-loader": "^4.5.3",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-embed": {
-      "version": "6.29.0",
-      "resolved": "https://registry.npmjs.org/vega-embed/-/vega-embed-6.29.0.tgz",
-      "integrity": "sha512-PmlshTLtLFLgWtF/b23T1OwX53AugJ9RZ3qPE2c01VFAbgt3/GSNI/etzA/GzdrkceXFma+FDHNXUppKuM0U6Q==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "fast-json-patch": "^3.1.1",
-        "json-stringify-pretty-compact": "^4.0.0",
-        "semver": "^7.6.3",
-        "tslib": "^2.8.1",
-        "vega-interpreter": "^1.0.5",
-        "vega-schema-url-parser": "^2.2.0",
-        "vega-themes": "^2.15.0",
-        "vega-tooltip": "^0.35.2"
-      },
-      "peerDependencies": {
-        "vega": "^5.21.0",
-        "vega-lite": "*"
-      }
-    },
-    "node_modules/vega-encode": {
-      "version": "4.10.2",
-      "resolved": "https://registry.npmjs.org/vega-encode/-/vega-encode-4.10.2.tgz",
-      "integrity": "sha512-fsjEY1VaBAmqwt7Jlpz0dpPtfQFiBdP9igEefvumSpy7XUxOJmDQcRDnT3Qh9ctkv3itfPfI9g8FSnGcv2b4jQ==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "d3-array": "^3.2.2",
-        "d3-interpolate": "^3.0.1",
-        "vega-dataflow": "^5.7.7",
-        "vega-scale": "^7.4.2",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-event-selector": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-3.0.1.tgz",
-      "integrity": "sha512-K5zd7s5tjr1LiOOkjGpcVls8GsH/f2CWCrWcpKy74gTCp+llCdwz0Enqo013ZlGaRNjfgD/o1caJRt3GSaec4A==",
-      "license": "BSD-3-Clause"
-    },
-    "node_modules/vega-expression": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-5.2.0.tgz",
-      "integrity": "sha512-WRMa4ny3iZIVAzDlBh3ipY2QUuLk2hnJJbfbncPgvTF7BUgbIbKq947z+JicWksYbokl8n1JHXJoqi3XvpG0Zw==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "@types/estree": "^1.0.0",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-force": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/vega-force/-/vega-force-4.2.2.tgz",
-      "integrity": "sha512-cHZVaY2VNNIG2RyihhSiWniPd2W9R9kJq0znxzV602CgUVgxEfTKtx/lxnVCn8nNrdKAYrGiqIsBzIeKG1GWHw==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "d3-force": "^3.0.0",
-        "vega-dataflow": "^5.7.7",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-format": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/vega-format/-/vega-format-1.1.3.tgz",
-      "integrity": "sha512-wQhw7KR46wKJAip28FF/CicW+oiJaPAwMKdrxlnTA0Nv8Bf7bloRlc+O3kON4b4H1iALLr9KgRcYTOeXNs2MOA==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "d3-array": "^3.2.2",
-        "d3-format": "^3.1.0",
-        "d3-time-format": "^4.1.0",
-        "vega-time": "^2.1.3",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-functions": {
-      "version": "5.18.0",
-      "resolved": "https://registry.npmjs.org/vega-functions/-/vega-functions-5.18.0.tgz",
-      "integrity": "sha512-+D+ey4bDAhZA2CChh7bRZrcqRUDevv05kd2z8xH+il7PbYQLrhi6g1zwvf8z3KpgGInFf5O13WuFK5DQGkz5lQ==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "d3-array": "^3.2.2",
-        "d3-color": "^3.1.0",
-        "d3-geo": "^3.1.0",
-        "vega-dataflow": "^5.7.7",
-        "vega-expression": "^5.2.0",
-        "vega-scale": "^7.4.2",
-        "vega-scenegraph": "^4.13.1",
-        "vega-selections": "^5.6.0",
-        "vega-statistics": "^1.9.0",
-        "vega-time": "^2.1.3",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-geo": {
-      "version": "4.4.3",
-      "resolved": "https://registry.npmjs.org/vega-geo/-/vega-geo-4.4.3.tgz",
-      "integrity": "sha512-+WnnzEPKIU1/xTFUK3EMu2htN35gp9usNZcC0ZFg2up1/Vqu6JyZsX0PIO51oXSIeXn9bwk6VgzlOmJUcx92tA==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "d3-array": "^3.2.2",
-        "d3-color": "^3.1.0",
-        "d3-geo": "^3.1.0",
-        "vega-canvas": "^1.2.7",
-        "vega-dataflow": "^5.7.7",
-        "vega-projection": "^1.6.2",
-        "vega-statistics": "^1.9.0",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-hierarchy": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-4.1.3.tgz",
-      "integrity": "sha512-0Z+TYKRgOEo8XYXnJc2HWg1EGpcbNAhJ9Wpi9ubIbEyEHqIgjCIyFVN8d4nSfsJOcWDzsSmRqohBztxAhOCSaw==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "d3-hierarchy": "^3.1.2",
-        "vega-dataflow": "^5.7.7",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-interpreter": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/vega-interpreter/-/vega-interpreter-1.2.0.tgz",
-      "integrity": "sha512-p408/0IPevyR/bIKdXGNzOixkTYCkH83zNhGypRqDxd/qVrdJVrh9RcECOYx1MwEc6JTB1BeK2lArHiGGuG7Hw==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-label": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/vega-label/-/vega-label-1.3.1.tgz",
-      "integrity": "sha512-Emx4b5s7pvuRj3fBkAJ/E2snCoZACfKAwxVId7f/4kYVlAYLb5Swq6W8KZHrH4M9Qds1XJRUYW9/Y3cceqzEFA==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "vega-canvas": "^1.2.7",
-        "vega-dataflow": "^5.7.7",
-        "vega-scenegraph": "^4.13.1",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-lite": {
-      "version": "5.23.0",
-      "resolved": "https://registry.npmjs.org/vega-lite/-/vega-lite-5.23.0.tgz",
-      "integrity": "sha512-l4J6+AWE3DIjvovEoHl2LdtCUkfm4zs8Xxx7INwZEAv+XVb6kR6vIN1gt3t2gN2gs/y4DYTs/RPoTeYAuEg6mA==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "json-stringify-pretty-compact": "~4.0.0",
-        "tslib": "~2.8.1",
-        "vega-event-selector": "~3.0.1",
-        "vega-expression": "~5.1.1",
-        "vega-util": "~1.17.2",
-        "yargs": "~17.7.2"
-      },
-      "bin": {
-        "vl2pdf": "bin/vl2pdf",
-        "vl2png": "bin/vl2png",
-        "vl2svg": "bin/vl2svg",
-        "vl2vg": "bin/vl2vg"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "peerDependencies": {
-        "vega": "^5.24.0"
-      }
-    },
-    "node_modules/vega-lite/node_modules/vega-expression": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-5.1.2.tgz",
-      "integrity": "sha512-fFeDTh4UtOxlZWL54jf1ZqJHinyerWq/ROiqrQxqLkNJRJ86RmxYTgXwt65UoZ/l4VUv9eAd2qoJeDEf610Umw==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "@types/estree": "^1.0.0",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-loader": {
-      "version": "4.5.3",
-      "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-4.5.3.tgz",
-      "integrity": "sha512-dUfIpxTLF2magoMaur+jXGvwMxjtdlDZaIS8lFj6N7IhUST6nIvBzuUlRM+zLYepI5GHtCLOnqdKU4XV0NggCA==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "d3-dsv": "^3.0.1",
-        "node-fetch": "^2.6.7",
-        "topojson-client": "^3.1.0",
-        "vega-format": "^1.1.3",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-parser": {
-      "version": "6.6.0",
-      "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-6.6.0.tgz",
-      "integrity": "sha512-jltyrwCTtWeidi/6VotLCybhIl+ehwnzvFWYOdWNUP0z/EskdB64YmawNwjCjzTBMemeiQtY6sJPPbewYqe3Vg==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "vega-dataflow": "^5.7.7",
-        "vega-event-selector": "^3.0.1",
-        "vega-functions": "^5.18.0",
-        "vega-scale": "^7.4.2",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-projection": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/vega-projection/-/vega-projection-1.6.2.tgz",
-      "integrity": "sha512-3pcVaQL9R3Zfk6PzopLX6awzrQUeYOXJzlfLGP2Xd93mqUepBa6m/reVrTUoSFXA3v9lfK4W/PS2AcVzD/MIcQ==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "d3-geo": "^3.1.0",
-        "d3-geo-projection": "^4.0.0",
-        "vega-scale": "^7.4.2"
-      }
-    },
-    "node_modules/vega-regression": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/vega-regression/-/vega-regression-1.3.1.tgz",
-      "integrity": "sha512-AmccF++Z9uw4HNZC/gmkQGe6JsRxTG/R4QpbcSepyMvQN1Rj5KtVqMcmVFP1r3ivM4dYGFuPlzMWvuqp0iKMkQ==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "d3-array": "^3.2.2",
-        "vega-dataflow": "^5.7.7",
-        "vega-statistics": "^1.9.0",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-runtime": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-6.2.1.tgz",
-      "integrity": "sha512-b4eot3tWKCk++INWqot+6sLn3wDTj/HE+tRSbiaf8aecuniPMlwJEK7wWuhVGeW2Ae5n8fI/8TeTViaC94bNHA==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "vega-dataflow": "^5.7.7",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-scale": {
-      "version": "7.4.2",
-      "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-7.4.2.tgz",
-      "integrity": "sha512-o6Hl76aU1jlCK7Q8DPYZ8OGsp4PtzLdzI6nGpLt8rxoE78QuB3GBGEwGAQJitp4IF7Lb2rL5oAXEl3ZP6xf9jg==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "d3-array": "^3.2.2",
-        "d3-interpolate": "^3.0.1",
-        "d3-scale": "^4.0.2",
-        "d3-scale-chromatic": "^3.1.0",
-        "vega-time": "^2.1.3",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-scenegraph": {
-      "version": "4.13.1",
-      "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-4.13.1.tgz",
-      "integrity": "sha512-LFY9+sLIxRfdDI9ZTKjLoijMkIAzPLBWHpPkwv4NPYgdyx+0qFmv+puBpAUGUY9VZqAZ736Uj5NJY9zw+/M3yQ==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "d3-path": "^3.1.0",
-        "d3-shape": "^3.2.0",
-        "vega-canvas": "^1.2.7",
-        "vega-loader": "^4.5.3",
-        "vega-scale": "^7.4.2",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-schema-url-parser": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-2.2.0.tgz",
-      "integrity": "sha512-yAtdBnfYOhECv9YC70H2gEiqfIbVkq09aaE4y/9V/ovEFmH9gPKaEgzIZqgT7PSPQjKhsNkb6jk6XvSoboxOBw==",
-      "license": "BSD-3-Clause"
-    },
-    "node_modules/vega-selections": {
-      "version": "5.6.0",
-      "resolved": "https://registry.npmjs.org/vega-selections/-/vega-selections-5.6.0.tgz",
-      "integrity": "sha512-UE2w78rUUbaV3Ph+vQbQDwh8eywIJYRxBiZdxEG/Tr/KtFMLdy2BDgNZuuDO1Nv8jImPJwONmqjNhNDYwM0VJQ==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "d3-array": "3.2.4",
-        "vega-expression": "^5.2.0",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-statistics": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/vega-statistics/-/vega-statistics-1.9.0.tgz",
-      "integrity": "sha512-GAqS7mkatpXcMCQKWtFu1eMUKLUymjInU0O8kXshWaQrVWjPIO2lllZ1VNhdgE0qGj4oOIRRS11kzuijLshGXQ==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "d3-array": "^3.2.2"
-      }
-    },
-    "node_modules/vega-themes": {
-      "version": "2.15.0",
-      "resolved": "https://registry.npmjs.org/vega-themes/-/vega-themes-2.15.0.tgz",
-      "integrity": "sha512-DicRAKG9z+23A+rH/3w3QjJvKnlGhSbbUXGjBvYGseZ1lvj9KQ0BXZ2NS/+MKns59LNpFNHGi9us/wMlci4TOA==",
-      "license": "BSD-3-Clause",
-      "peerDependencies": {
-        "vega": "*",
-        "vega-lite": "*"
-      }
-    },
-    "node_modules/vega-time": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/vega-time/-/vega-time-2.1.3.tgz",
-      "integrity": "sha512-hFcWPdTV844IiY0m97+WUoMLADCp+8yUQR1NStWhzBzwDDA7QEGGwYGxALhdMOaDTwkyoNj3V/nox2rQAJD/vQ==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "d3-array": "^3.2.2",
-        "d3-time": "^3.1.0",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-tooltip": {
-      "version": "0.35.2",
-      "resolved": "https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-0.35.2.tgz",
-      "integrity": "sha512-kuYcsAAKYn39ye5wKf2fq1BAxVcjoz0alvKp/G+7BWfIb94J0PHmwrJ5+okGefeStZnbXxINZEOKo7INHaj9GA==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "vega-util": "^1.17.2"
-      },
-      "optionalDependencies": {
-        "@rollup/rollup-linux-x64-gnu": "^4.24.4"
-      }
-    },
-    "node_modules/vega-transforms": {
-      "version": "4.12.1",
-      "resolved": "https://registry.npmjs.org/vega-transforms/-/vega-transforms-4.12.1.tgz",
-      "integrity": "sha512-Qxo+xeEEftY1jYyKgzOGc9NuW4/MqGm1YPZ5WrL9eXg2G0410Ne+xL/MFIjHF4hRX+3mgFF4Io2hPpfy/thjLg==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "d3-array": "^3.2.2",
-        "vega-dataflow": "^5.7.7",
-        "vega-statistics": "^1.9.0",
-        "vega-time": "^2.1.3",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-typings": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-1.5.0.tgz",
-      "integrity": "sha512-tcZ2HwmiQEOXIGyBMP8sdCnoFoVqHn4KQ4H0MQiHwzFU1hb1EXURhfc+Uamthewk4h/9BICtAM3AFQMjBGpjQA==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "@types/geojson": "7946.0.4",
-        "vega-event-selector": "^3.0.1",
-        "vega-expression": "^5.2.0",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-util": {
-      "version": "1.17.3",
-      "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-1.17.3.tgz",
-      "integrity": "sha512-nSNpZLUrRvFo46M5OK4O6x6f08WD1yOcEzHNlqivF+sDLSsVpstaF6fdJYwrbf/debFi2L9Tkp4gZQtssup9iQ==",
-      "license": "BSD-3-Clause"
-    },
-    "node_modules/vega-view": {
-      "version": "5.16.0",
-      "resolved": "https://registry.npmjs.org/vega-view/-/vega-view-5.16.0.tgz",
-      "integrity": "sha512-Nxp1MEAY+8bphIm+7BeGFzWPoJnX9+hgvze6wqCAPoM69YiyVR0o0VK8M2EESIL+22+Owr0Fdy94hWHnmon5tQ==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "d3-array": "^3.2.2",
-        "d3-timer": "^3.0.1",
-        "vega-dataflow": "^5.7.7",
-        "vega-format": "^1.1.3",
-        "vega-functions": "^5.18.0",
-        "vega-runtime": "^6.2.1",
-        "vega-scenegraph": "^4.13.1",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-view-transforms": {
-      "version": "4.6.1",
-      "resolved": "https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-4.6.1.tgz",
-      "integrity": "sha512-RYlyMJu5kZV4XXjmyTQKADJWDB25SMHsiF+B1rbE1p+pmdQPlp5tGdPl9r5dUJOp3p8mSt/NGI8GPGucmPMxtw==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "vega-dataflow": "^5.7.7",
-        "vega-scenegraph": "^4.13.1",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-voronoi": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-4.2.4.tgz",
-      "integrity": "sha512-lWNimgJAXGeRFu2Pz8axOUqVf1moYhD+5yhBzDSmckE9I5jLOyZc/XvgFTXwFnsVkMd1QW1vxJa+y9yfUblzYw==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "d3-delaunay": "^6.0.2",
-        "vega-dataflow": "^5.7.7",
-        "vega-util": "^1.17.3"
-      }
-    },
-    "node_modules/vega-wordcloud": {
-      "version": "4.1.6",
-      "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-4.1.6.tgz",
-      "integrity": "sha512-lFmF3u9/ozU0P+WqPjeThQfZm0PigdbXDwpIUCxczrCXKYJLYFmZuZLZR7cxtmpZ0/yuvRvAJ4g123LXbSZF8A==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "vega-canvas": "^1.2.7",
-        "vega-dataflow": "^5.7.7",
-        "vega-scale": "^7.4.2",
-        "vega-statistics": "^1.9.0",
-        "vega-util": "^1.17.3"
-      }
-    },
     "node_modules/vite": {
       "version": "6.3.4",
       "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.4.tgz",
@@ -8366,22 +7831,6 @@
       "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==",
       "license": "MIT"
     },
-    "node_modules/webidl-conversions": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
-      "license": "BSD-2-Clause"
-    },
-    "node_modules/whatwg-url": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-      "license": "MIT",
-      "dependencies": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
-      }
-    },
     "node_modules/which": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -8452,6 +7901,7 @@
       "version": "5.0.8",
       "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
       "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+      "dev": true,
       "license": "ISC",
       "engines": {
         "node": ">=10"
@@ -8468,6 +7918,7 @@
       "version": "17.7.2",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
       "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "cliui": "^8.0.1",
@@ -8486,6 +7937,7 @@
       "version": "21.1.1",
       "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
       "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+      "dev": true,
       "license": "ISC",
       "engines": {
         "node": ">=12"
diff --git a/webui/package.json b/webui/package.json
index 0dc86fa..1b5a638 100644
--- a/webui/package.json
+++ b/webui/package.json
@@ -30,6 +30,7 @@
     "lit": "^3.2.1",
     "marked": "^15.0.7",
     "mermaid": "^11.6.0",
+    "monaco-editor": "^0.52.2",
     "sanitize-html": "^2.15.0"
   },
   "devDependencies": {
diff --git a/webui/src/sketch-app-shell.css b/webui/src/sketch-app-shell.css
index 31a7676..88b08a9 100644
--- a/webui/src/sketch-app-shell.css
+++ b/webui/src/sketch-app-shell.css
@@ -7,3 +7,15 @@
   margin: 0;
   display: flex;
 }
+
+/* 
+ * Import Monaco editor's Codicon font - this is critical for icons
+ * IMPORTANT: This font-face declaration MUST remain in global CSS.
+ * Chrome does not apply @font-face rules properly when they're inside shadow DOM.
+ * Do not move this to the sketch-monaco-view component despite it being used there.
+ */
+@font-face {
+  font-family: "codicon";
+  font-display: block;
+  src: url('./monaco/min/vs/base/browser/ui/codicons/codicon/codicon.ttf') format('truetype');
+}
diff --git a/webui/src/types.ts b/webui/src/types.ts
index e7f7dbc..37e724e 100644
--- a/webui/src/types.ts
+++ b/webui/src/types.ts
@@ -97,6 +97,21 @@
 	responseOptions: MultipleChoiceOption[] | null;
 }
 
+export interface DiffFile {
+	path: string;
+	old_mode: string;
+	new_mode: string;
+	old_hash: string;
+	new_hash: string;
+	status: string;
+}
+
+export interface GitLogEntry {
+	hash: string;
+	refs: string[] | null;
+	subject: string;
+}
+
 export type CodingAgentMessageType = 'user' | 'agent' | 'error' | 'budget' | 'tool' | 'commit' | 'auto';
 
 export type Duration = number;
diff --git a/webui/src/web-components/demo/index.html b/webui/src/web-components/demo/index.html
index e8db7d8..2dd8f18 100644
--- a/webui/src/web-components/demo/index.html
+++ b/webui/src/web-components/demo/index.html
@@ -23,6 +23,12 @@
       <li>
         <a href="sketch-view-mode-select.demo.html">sketch-view-mode-select</a>
       </li>
+      <li>
+        <a href="sketch-monaco-view.demo.html">sketch-monaco-view</a>
+      </li>
+      <li>
+        <a href="sketch-diff2-view.demo.html">sketch-diff2-view</a>
+      </li>
     </ul>
   </body>
 </html>
diff --git a/webui/src/web-components/demo/mock-git-data-service.ts b/webui/src/web-components/demo/mock-git-data-service.ts
new file mode 100644
index 0000000..74937f0
--- /dev/null
+++ b/webui/src/web-components/demo/mock-git-data-service.ts
@@ -0,0 +1,403 @@
+// mock-git-data-service.ts
+// Mock implementation of GitDataService for the demo environment
+
+import { GitDataService, GitDiffFile } from '../git-data-service';
+import { GitLogEntry } from '../../types';
+
+/**
+ * Demo implementation of GitDataService with canned responses
+ */
+export class MockGitDataService implements GitDataService {
+  constructor() {
+    console.log('MockGitDataService instance created');
+  }
+
+  // Mock commit history
+  private mockCommits: GitLogEntry[] = [
+    {
+      hash: 'abc123456789',
+      subject: 'Implement new file picker UI',
+      refs: ['HEAD', 'main']
+    },
+    {
+      hash: 'def987654321',
+      subject: 'Add range picker component',
+      refs: []
+    },
+    {
+      hash: 'ghi456789123',
+      subject: 'Fix styling issues in navigation',
+      refs: []
+    },
+    {
+      hash: 'jkl789123456',
+      subject: 'Initial commit',
+      refs: ['sketch-base']
+    }
+  ];
+
+  // Mock diff files for various scenarios
+  private mockDiffFiles: GitDiffFile[] = [
+    {
+      path: 'src/components/FilePicker.js',
+      status: 'A',
+      new_mode: '100644',
+      old_mode: '000000',
+      old_hash: '0000000000000000000000000000000000000000',
+      new_hash: 'def0123456789abcdef0123456789abcdef0123'
+    },
+    {
+      path: 'src/components/RangePicker.js',
+      status: 'A',
+      new_mode: '100644',
+      old_mode: '000000',
+      old_hash: '0000000000000000000000000000000000000000',
+      new_hash: 'cde0123456789abcdef0123456789abcdef0123'
+    },
+    {
+      path: 'src/components/App.js',
+      status: 'M',
+      new_mode: '100644',
+      old_mode: '100644',
+      old_hash: 'abc0123456789abcdef0123456789abcdef0123',
+      new_hash: 'bcd0123456789abcdef0123456789abcdef0123'
+    },
+    {
+      path: 'src/styles/main.css',
+      status: 'M',
+      new_mode: '100644',
+      old_mode: '100644',
+      old_hash: 'fgh0123456789abcdef0123456789abcdef0123',
+      new_hash: 'ghi0123456789abcdef0123456789abcdef0123'
+    }
+  ];
+
+  // Mock file content for different files and commits
+  private appJSOriginal = `function App() {
+  return (
+    <div className="app">
+      <header>
+        <h1>Git Diff Viewer</h1>
+      </header>
+      <main>
+        <p>Select a file to view differences</p>
+      </main>
+    </div>
+  );
+}`;
+
+  private appJSModified = `function App() {
+  const [files, setFiles] = useState([]);
+  const [selectedFile, setSelectedFile] = useState(null);
+  
+  // Load commits and files
+  useEffect(() => {
+    // Code to load commits would go here
+    // setCommits(...);
+  }, []);
+  
+  return (
+    <div className="app">
+      <header>
+        <h1>Git Diff Viewer</h1>
+      </header>
+      <main>
+        <FilePicker files={files} onFileSelect={setSelectedFile} />
+        <div className="diff-view">
+          {selectedFile ? (
+            <div>Diff view for {selectedFile.path}</div>
+          ) : (
+            <p>Select a file to view differences</p>
+          )}
+        </div>
+      </main>
+    </div>
+  );
+}`;
+
+  private filePickerJS = `function FilePicker({ files, onFileSelect }) {
+  const [selectedIndex, setSelectedIndex] = useState(0);
+  
+  useEffect(() => {
+    // Reset selection when files change
+    setSelectedIndex(0);
+    if (files.length > 0) {
+      onFileSelect(files[0]);
+    }
+  }, [files, onFileSelect]);
+  
+  const handleNext = () => {
+    if (selectedIndex < files.length - 1) {
+      const newIndex = selectedIndex + 1;
+      setSelectedIndex(newIndex);
+      onFileSelect(files[newIndex]);
+    }
+  };
+  
+  const handlePrevious = () => {
+    if (selectedIndex > 0) {
+      const newIndex = selectedIndex - 1;
+      setSelectedIndex(newIndex);
+      onFileSelect(files[newIndex]);
+    }
+  };
+  
+  return (
+    <div className="file-picker">
+      <select value={selectedIndex} onChange={(e) => {
+        const index = parseInt(e.target.value, 10);
+        setSelectedIndex(index);
+        onFileSelect(files[index]);
+      }}>
+        {files.map((file, index) => (
+          <option key={file.path} value={index}>
+            {file.status} {file.path}
+          </option>
+        ))}
+      </select>
+      
+      <div className="navigation-buttons">
+        <button 
+          onClick={handlePrevious} 
+          disabled={selectedIndex === 0}
+        >
+          Previous
+        </button>
+        <button 
+          onClick={handleNext} 
+          disabled={selectedIndex === files.length - 1}
+        >
+          Next
+        </button>
+      </div>
+    </div>
+  );
+}`;
+
+  private rangePickerJS = `function RangePicker({ commits, onRangeChange }) {
+  const [rangeType, setRangeType] = useState('range');
+  const [startCommit, setStartCommit] = useState(commits[0]);
+  const [endCommit, setEndCommit] = useState(commits[commits.length - 1]);
+
+  const handleTypeChange = (e) => {
+    setRangeType(e.target.value);
+    if (e.target.value === 'single') {
+      onRangeChange({ type: 'single', commit: startCommit });
+    } else {
+      onRangeChange({ type: 'range', from: startCommit, to: endCommit });
+    }
+  };
+
+  return (
+    <div className="range-picker">
+      <div className="range-type-selector">
+        <label>
+          <input 
+            type="radio" 
+            value="range" 
+            checked={rangeType === 'range'} 
+            onChange={handleTypeChange} 
+          />
+          Commit Range
+        </label>
+        <label>
+          <input 
+            type="radio" 
+            value="single" 
+            checked={rangeType === 'single'} 
+            onChange={handleTypeChange} 
+          />
+          Single Commit
+        </label>
+      </div>
+    </div>
+  );
+}`;
+
+  private mainCSSOriginal = `body {
+  font-family: sans-serif;
+  margin: 0;
+  padding: 0;
+}
+
+.app {
+  max-width: 1200px;
+  margin: 0 auto;
+  padding: 20px;
+}
+
+header {
+  margin-bottom: 20px;
+}
+
+h1 {
+  color: #333;
+}`;
+
+  private mainCSSModified = `body {
+  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+  margin: 0;
+  padding: 0;
+  background-color: #f5f5f5;
+}
+
+.app {
+  max-width: 1200px;
+  margin: 0 auto;
+  padding: 20px;
+}
+
+header {
+  margin-bottom: 20px;
+  border-bottom: 1px solid #ddd;
+  padding-bottom: 10px;
+}
+
+h1 {
+  color: #333;
+}
+
+.file-picker {
+  display: flex;
+  gap: 8px;
+  align-items: center;
+  margin-bottom: 20px;
+}
+
+.file-picker select {
+  flex: 1;
+  padding: 8px;
+  border-radius: 4px;
+  border: 1px solid #ddd;
+}
+
+.navigation-buttons {
+  display: flex;
+  gap: 8px;
+}
+
+button {
+  padding: 8px 12px;
+  background-color: #4a7dfc;
+  color: white;
+  border: none;
+  border-radius: 4px;
+  cursor: pointer;
+}`;
+
+  async getCommitHistory(initialCommit?: string): Promise<GitLogEntry[]> {
+    console.log(`[MockGitDataService] Getting commit history from ${initialCommit || 'beginning'}`);
+    
+    // If initialCommit is provided, return commits from that commit to HEAD
+    if (initialCommit) {
+      const startIndex = this.mockCommits.findIndex(commit => commit.hash === initialCommit);
+      if (startIndex >= 0) {
+        return this.mockCommits.slice(0, startIndex + 1);
+      }
+    }
+    
+    return [...this.mockCommits];
+  }
+
+  async getDiff(from: string, to: string): Promise<GitDiffFile[]> {
+    console.log(`[MockGitDataService] Getting diff from ${from} to ${to}`);
+    
+    return [...this.mockDiffFiles];
+  }
+
+  async getCommitDiff(commit: string): Promise<GitDiffFile[]> {
+    console.log(`[MockGitDataService] Getting diff for commit ${commit}`);
+    
+    // Return a subset of files for specific commits
+    if (commit === 'abc123456789') {
+      return this.mockDiffFiles.slice(0, 2);
+    } else if (commit === 'def987654321') {
+      return this.mockDiffFiles.slice(1, 3);
+    }
+    
+    // For other commits, return all files
+    return [...this.mockDiffFiles];
+  }
+
+  async getFileContent(fileHash: string): Promise<string> {
+    console.log(`[MockGitDataService] Getting file content for hash: ${fileHash}`);
+    
+    // Return different content based on the file hash
+    if (fileHash === 'bcd0123456789abcdef0123456789abcdef0123') {
+      return this.appJSModified;
+    } else if (fileHash === 'abc0123456789abcdef0123456789abcdef0123') {
+      return this.appJSOriginal;
+    } else if (fileHash === 'def0123456789abcdef0123456789abcdef0123') {
+      return this.filePickerJS;
+    } else if (fileHash === 'cde0123456789abcdef0123456789abcdef0123') {
+      return this.rangePickerJS;
+    } else if (fileHash === 'ghi0123456789abcdef0123456789abcdef0123') {
+      return this.mainCSSModified;
+    } else if (fileHash === 'fgh0123456789abcdef0123456789abcdef0123') {
+      return this.mainCSSOriginal;
+    }
+    
+    // Return empty string for unknown file hashes
+    return '';
+  }
+
+  async getBaseCommitRef(): Promise<string> {
+    console.log('[MockGitDataService] Getting base commit ref');
+    
+    // Find the commit with the sketch-base ref
+    const baseCommit = this.mockCommits.find(commit => 
+      commit.refs && commit.refs.includes('sketch-base')
+    );
+    
+    if (baseCommit) {
+      return baseCommit.hash;
+    }
+    
+    // Fallback to the last commit in our list
+    return this.mockCommits[this.mockCommits.length - 1].hash;
+  }
+
+  // Helper to simulate network delay
+  private delay(ms: number): Promise<void> {
+    return new Promise(resolve => setTimeout(resolve, ms));
+  }
+  
+  async getWorkingCopyContent(filePath: string): Promise<string> {
+    console.log(`[MockGitDataService] Getting working copy content for path: ${filePath}`);
+    
+    // Return different content based on the file path
+    if (filePath === 'src/components/App.js') {
+      return this.appJSModified;
+    } else if (filePath === 'src/components/FilePicker.js') {
+      return this.filePickerJS;
+    } else if (filePath === 'src/components/RangePicker.js') {
+      return this.rangePickerJS;
+    } else if (filePath === 'src/styles/main.css') {
+      return this.mainCSSModified;
+    }
+    
+    // Return empty string for unknown file paths
+    return '';
+  }
+  
+  async getUnstagedChanges(from: string = 'HEAD'): Promise<GitDiffFile[]> {
+    console.log(`[MockGitDataService] Getting unstaged changes from ${from}`);
+    
+    // Create a new array of files with 0000000... as the new hashes
+    // to simulate unstaged changes
+    return this.mockDiffFiles.map(file => ({
+      ...file,
+      newHash: '0000000000000000000000000000000000000000'
+    }));
+  }
+  
+  async saveFileContent(filePath: string, content: string): Promise<void> {
+    console.log(`[MockGitDataService] Saving file content for path: ${filePath}`);
+    // Simulate a network delay
+    await this.delay(500);
+    // In a mock implementation, we just log the save attempt
+    console.log(`File would be saved: ${filePath} (${content.length} characters)`);
+    // Return void as per interface
+  }
+
+}
\ No newline at end of file
diff --git a/webui/src/web-components/demo/sketch-diff2-view.demo.html b/webui/src/web-components/demo/sketch-diff2-view.demo.html
new file mode 100644
index 0000000..da9e46f
--- /dev/null
+++ b/webui/src/web-components/demo/sketch-diff2-view.demo.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>Sketch Monaco Diff View Demo</title>
+  <script type="module">
+    // Set up the demo environment with mock data service
+    import { MockGitDataService } from './mock-git-data-service.ts';
+    import '../sketch-diff2-view.ts';
+    
+    // Wait for DOM content to be loaded before initializing components
+    document.addEventListener('DOMContentLoaded', () => {
+      // Create a mock service instance
+      const mockService = new MockGitDataService();
+      console.log('Demo initialized with MockGitDataService');
+      
+      // Get the diff2 view component and set its gitService property
+      const diff2View = document.querySelector('sketch-diff2-view');
+      if (diff2View) {
+        diff2View.gitService = mockService;
+      }
+    });
+  </script>
+  <style>
+    body {
+      font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
+      max-width: 1200px;
+      margin: 0 auto;
+      padding: 2rem;
+    }
+
+    h1 {
+      color: #333;
+      margin-bottom: 2rem;
+    }
+
+    .control-panel {
+      margin-bottom: 2rem;
+      padding: 1rem;
+      background-color: #f0f0f0;
+      border-radius: 4px;
+    }
+    
+    .demo-container {
+      display: flex;
+      height: 80vh; /* Use viewport height to ensure good sizing */
+      min-height: 600px; /* Minimum height */
+      border: 1px solid #ddd;
+      margin-top: 20px;
+      margin-bottom: 30px;
+    }
+
+    sketch-diff2-view {
+      width: 100%;
+      height: 100%;
+    }
+  </style>
+</head>
+<body>
+  <h1>Sketch Monaco Diff View Demo</h1>
+
+  <div class="control-panel">
+    <p>This demonstrates the Monaco-based diff view with range and file pickers.</p>
+    <p>Using mock data to simulate the real API responses.</p>
+  </div>
+
+  <div class="demo-container">
+    <sketch-diff2-view></sketch-diff2-view>
+  </div>
+  
+
+</body>
+</html>
diff --git a/webui/src/web-components/demo/sketch-monaco-view.demo.html b/webui/src/web-components/demo/sketch-monaco-view.demo.html
new file mode 100644
index 0000000..92da292
--- /dev/null
+++ b/webui/src/web-components/demo/sketch-monaco-view.demo.html
@@ -0,0 +1,178 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>Sketch Monaco Viewer Demo</title>
+    <script type="module" src="../sketch-monaco-view.ts"></script>
+    <style>
+      body {
+        font-family:
+          -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica,
+          Arial, sans-serif;
+        max-width: 1200px;
+        margin: 0 auto;
+        padding: 2rem;
+      }
+
+      h1 {
+        color: #333;
+        margin-bottom: 2rem;
+      }
+
+      .control-panel {
+        margin-bottom: 2rem;
+        padding: 1rem;
+        background-color: #f0f0f0;
+        border-radius: 4px;
+      }
+      
+      button {
+        padding: 8px 12px;
+        background-color: #4285f4;
+        color: white;
+        border: none;
+        border-radius: 4px;
+        cursor: pointer;
+        margin-right: 8px;
+      }
+      
+      button:hover {
+        background-color: #3367d6;
+      }
+      
+      sketch-monaco-view {
+        margin-top: 20px;
+        height: 500px;
+      }
+    </style>
+  </head>
+  <body>
+    <h1>Sketch Monaco Viewer Demo</h1>
+
+    <div class="control-panel">
+      <p>This is a demo page for the sketch-monaco-view component.</p>
+      <div>
+        <button id="example1">Example 1: JavaScript</button>
+        <button id="example2">Example 2: HTML</button>
+        <button id="example3">Example 3: Go</button>
+      </div>
+    </div>
+
+    <sketch-monaco-view id="diffEditor"></sketch-monaco-view>
+    
+    <script>
+      document.addEventListener('DOMContentLoaded', () => {
+        const diffEditor = document.getElementById('diffEditor');
+        
+        // Set initial example
+        diffEditor.originalCode = `function hello() {
+  console.log("Hello World");
+  return true;
+}`;
+        
+        diffEditor.modifiedCode = `function hello() {
+  // Add a comment
+  console.log("Hello Updated World");
+  return true;
+}`;
+        
+        // Example 1: JavaScript
+        document.getElementById('example1').addEventListener('click', () => {
+          diffEditor.setOriginalCode(
+            `function calculateTotal(items) {
+  return items
+    .map(item => item.price * item.quantity)
+    .reduce((a, b) => a + b, 0);
+}`,
+            'original.js'
+          );
+          
+          diffEditor.setModifiedCode(
+            `function calculateTotal(items) {
+  // Apply discount if available
+  return items
+    .map(item => {
+      const price = item.discount ? 
+        item.price * (1 - item.discount) : 
+        item.price;
+      return price * item.quantity;
+    })
+    .reduce((a, b) => a + b, 0);
+}`,
+            'modified.js'
+          );
+        });
+        
+        // Example 2: HTML
+        document.getElementById('example2').addEventListener('click', () => {
+          diffEditor.setOriginalCode(
+            `<!DOCTYPE html>
+<html>
+<head>
+  <title>Demo Page</title>
+</head>
+<body>
+  <h1>Hello World</h1>
+  <p>This is a paragraph.</p>
+</body>
+</html>`,
+            'original.html'
+          );
+          
+          diffEditor.setModifiedCode(
+            `<!DOCTYPE html>
+<html>
+<head>
+  <title>Demo Page</title>
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <link rel="stylesheet" href="styles.css">
+</head>
+<body>
+  <header>
+    <h1>Hello World</h1>
+  </header>
+  <main>
+    <p>This is a paragraph with some <strong>bold</strong> text.</p>
+  </main>
+  <footer>
+    <p>&copy; 2025</p>
+  </footer>
+</body>
+</html>`,
+            'modified.html'
+          );
+        });
+        
+        // Example 3: Go
+        document.getElementById('example3').addEventListener('click', () => {
+          diffEditor.setOriginalCode(
+            `package main
+
+import "fmt"
+
+func main() {
+	fmt.Println("Hello, world!")
+}`,
+            'original.go'
+          );
+          
+          diffEditor.setModifiedCode(
+            `package main
+
+import (
+	"fmt"
+	"time"
+)
+
+func main() {
+	fmt.Println("Hello, world!")
+	fmt.Printf("The time is %s\n", time.Now().Format(time.RFC3339))
+}`,
+            'modified.go'
+          );
+        });
+      });
+    </script>
+  </body>
+</html>
diff --git a/webui/src/web-components/git-data-service.ts b/webui/src/web-components/git-data-service.ts
new file mode 100644
index 0000000..c22b851
--- /dev/null
+++ b/webui/src/web-components/git-data-service.ts
@@ -0,0 +1,220 @@
+// git-data-service.ts
+// Interface and implementation for fetching Git data
+
+import { DiffFile, GitLogEntry } from '../types';
+
+// Re-export DiffFile as GitDiffFile
+export type GitDiffFile = DiffFile;
+
+/**
+ * Interface for Git data services
+ */
+export interface GitDataService {
+  /**
+   * Fetches recent commit history
+   * @param initialCommit The initial commit hash to start from
+   * @returns List of commits
+   */
+  getCommitHistory(initialCommit?: string): Promise<GitLogEntry[]>;
+
+  /**
+   * Fetches diff between two commits
+   * @param from Starting commit hash
+   * @param to Ending commit hash (can be empty string for unstaged changes)
+   * @returns List of changed files
+   */
+  getDiff(from: string, to: string): Promise<GitDiffFile[]>;
+
+  /**
+   * Fetches diff for a single commit
+   * @param commit Commit hash
+   * @returns List of changed files
+   */
+  getCommitDiff(commit: string): Promise<GitDiffFile[]>;
+
+  /**
+   * Fetches file content from git using a file hash
+   * @param fileHash Git blob hash of the file to fetch
+   * @returns File content as string
+   */
+  getFileContent(fileHash: string): Promise<string>;
+
+  /**
+   * Gets file content from the current working directory
+   * @param filePath Path to the file within the repository
+   * @returns File content as string
+   */
+  getWorkingCopyContent(filePath: string): Promise<string>;
+  
+  /**
+   * Saves file content to the working directory
+   * @param filePath Path to the file within the repository
+   * @param content New content to save to the file
+   */
+  saveFileContent(filePath: string, content: string): Promise<void>;
+
+  /**
+   * Gets the base commit reference (often "sketch-base")
+   * @returns Base commit reference
+   */
+  getBaseCommitRef(): Promise<string>;
+
+  /**
+   * Fetches unstaged changes (diff between a commit and working directory)
+   * @param from Starting commit hash (defaults to HEAD if not specified)
+   * @returns List of changed files
+   */
+  getUnstagedChanges(from?: string): Promise<GitDiffFile[]>;
+}
+
+/**
+ * Default implementation of GitDataService for the real application
+ */
+export class DefaultGitDataService implements GitDataService {
+  private baseCommitRef: string | null = null;
+
+  async getCommitHistory(initialCommit?: string): Promise<GitLogEntry[]> {
+    try {
+      const url = initialCommit 
+        ? `git/recentlog?initialCommit=${encodeURIComponent(initialCommit)}` 
+        : 'git/recentlog';
+      const response = await fetch(url);
+      
+      if (!response.ok) {
+        throw new Error(`Failed to fetch commit history: ${response.statusText}`);
+      }
+      
+      return await response.json();
+    } catch (error) {
+      console.error('Error fetching commit history:', error);
+      throw error;
+    }
+  }
+
+  async getDiff(from: string, to: string): Promise<GitDiffFile[]> {
+    try {
+      const url = `git/rawdiff?from=${encodeURIComponent(from)}&to=${encodeURIComponent(to)}`;
+      const response = await fetch(url);
+      
+      if (!response.ok) {
+        throw new Error(`Failed to fetch diff: ${response.statusText}`);
+      }
+      
+      return await response.json();
+    } catch (error) {
+      console.error('Error fetching diff:', error);
+      throw error;
+    }
+  }
+
+  async getCommitDiff(commit: string): Promise<GitDiffFile[]> {
+    try {
+      const url = `git/rawdiff?commit=${encodeURIComponent(commit)}`;
+      const response = await fetch(url);
+      
+      if (!response.ok) {
+        throw new Error(`Failed to fetch commit diff: ${response.statusText}`);
+      }
+      
+      return await response.json();
+    } catch (error) {
+      console.error('Error fetching commit diff:', error);
+      throw error;
+    }
+  }
+
+  async getFileContent(fileHash: string): Promise<string> {
+    try {
+      // If the hash is marked as a working copy (special value '000000' or empty)
+      if (fileHash === '0000000000000000000000000000000000000000' || !fileHash) {
+        // This shouldn't happen, but if it does, return empty string
+        // Working copy content should be fetched through getWorkingCopyContent
+        console.warn('Invalid file hash for getFileContent, returning empty string');
+        return '';
+      }
+      
+      const url = `git/show?hash=${encodeURIComponent(fileHash)}`;
+      const response = await fetch(url);
+      
+      if (!response.ok) {
+        throw new Error(`Failed to fetch file content: ${response.statusText}`);
+      }
+      
+      const data = await response.json();
+      return data.output || '';
+    } catch (error) {
+      console.error('Error fetching file content:', error);
+      throw error;
+    }
+  }
+  
+  async getWorkingCopyContent(filePath: string): Promise<string> {
+    try {
+      const url = `git/cat?path=${encodeURIComponent(filePath)}`;
+      const response = await fetch(url);
+      
+      if (!response.ok) {
+        throw new Error(`Failed to fetch working copy content: ${response.statusText}`);
+      }
+      
+      const data = await response.json();
+      return data.output || '';
+    } catch (error) {
+      console.error('Error fetching working copy content:', error);
+      throw error;
+    }
+  }
+  
+  async saveFileContent(filePath: string, content: string): Promise<void> {
+    try {
+      const url = `git/save`;
+      const response = await fetch(url, {
+        method: 'POST',
+        headers: {
+          'Content-Type': 'application/json',
+        },
+        body: JSON.stringify({
+          path: filePath,
+          content: content
+        }),
+      });
+      
+      if (!response.ok) {
+        const errorText = await response.text();
+        throw new Error(`Failed to save file content: ${response.statusText} - ${errorText}`);
+      }
+      
+      // Don't need to return the response, just ensure it was successful
+    } catch (error) {
+      console.error('Error saving file content:', error);
+      throw error;
+    }
+  }
+  
+  async getUnstagedChanges(from: string = 'HEAD'): Promise<GitDiffFile[]> {
+    try {
+      // To get unstaged changes, we diff the specified commit (or HEAD) with an empty 'to'
+      return await this.getDiff(from, '');
+    } catch (error) {
+      console.error('Error fetching unstaged changes:', error);
+      throw error;
+    }
+  }
+
+  async getBaseCommitRef(): Promise<string> {
+    // Cache the base commit reference to avoid multiple requests
+    if (this.baseCommitRef) {
+      return this.baseCommitRef;
+    }
+
+    try {
+      // This could be replaced with a specific endpoint call if available
+      // For now, we'll use a fixed value or try to get it from the server
+      this.baseCommitRef = 'sketch-base';
+      return this.baseCommitRef;
+    } catch (error) {
+      console.error('Error fetching base commit reference:', error);
+      throw error;
+    }
+  }
+}
\ No newline at end of file
diff --git a/webui/src/web-components/sketch-app-shell.ts b/webui/src/web-components/sketch-app-shell.ts
index 7436671..aebabd9 100644
--- a/webui/src/web-components/sketch-app-shell.ts
+++ b/webui/src/web-components/sketch-app-shell.ts
@@ -1,13 +1,17 @@
 import { css, html, LitElement } from "lit";
 import { customElement, property, state } from "lit/decorators.js";
 import { ConnectionStatus, DataManager } from "../data";
-import { AgentMessage, GitCommit, State } from "../types";
+import { AgentMessage, GitLogEntry, State } from "../types";
 import { aggregateAgentMessages } from "./aggregateAgentMessages";
 
 import "./sketch-chat-input";
 import "./sketch-container-status";
 import "./sketch-diff-view";
 import { SketchDiffView } from "./sketch-diff-view";
+import "./sketch-diff2-view";
+import { SketchDiff2View } from "./sketch-diff2-view";
+import { DefaultGitDataService } from "./git-data-service";
+import "./sketch-monaco-view";
 import "./sketch-network-status";
 import "./sketch-call-status";
 import "./sketch-terminal";
@@ -18,13 +22,13 @@
 import { createRef, ref } from "lit/directives/ref.js";
 import { SketchChatInput } from "./sketch-chat-input";
 
-type ViewMode = "chat" | "diff" | "terminal";
+type ViewMode = "chat" | "diff" | "diff2" | "terminal";
 
 @customElement("sketch-app-shell")
 export class SketchAppShell extends LitElement {
   // Current view mode (chat, diff, terminal)
   @state()
-  viewMode: "chat" | "diff" | "terminal" = "chat";
+  viewMode: ViewMode = "chat";
 
   // Current commit hash for diff view
   @state()
@@ -119,14 +123,21 @@
       align-self: stretch;
       overflow-y: auto;
       flex: 1;
+      display: flex;
+      flex-direction: column;
+      min-height: 0; /* Critical for proper flex child behavior */
     }
 
     #view-container-inner {
       max-width: 1200px;
+      width: calc(100% - 40px);
       margin: 0 auto;
       position: relative;
       padding-bottom: 10px;
       padding-top: 10px;
+      display: flex;
+      flex-direction: column;
+      height: 100%; /* Ensure it takes full height of parent */
     }
 
     #chat-input {
@@ -157,18 +168,44 @@
       text-overflow: ellipsis;
     }
 
-    /* Allow the container to expand to full width in diff mode */
-    #view-container-inner.diff-active {
+    /* Allow the container to expand to full width and height in diff mode */
+    #view-container-inner.diff-active,
+    #view-container-inner.diff2-active {
       max-width: 100%;
       width: 100%;
+      height: 100%;
+      padding: 0; /* Remove padding for more space */
+      display: flex;
+      flex-direction: column;
+      flex: 1;
+      min-height: 0; /* Critical for flex behavior */
     }
 
     /* Individual view styles */
     .chat-view,
     .diff-view,
+    .diff2-view,
     .terminal-view {
       display: none; /* Hidden by default */
       width: 100%;
+      height: 100%;
+    }
+    
+    /* Make chat view take full width available */
+    .chat-view.view-active {
+      display: flex;
+      flex-direction: column;
+      width: 100%;
+    }
+    
+    /* Monaco diff2 view needs to take all available space */
+    .diff2-view.view-active {
+      flex: 1;
+      overflow: hidden;
+      min-height: 0; /* Required for proper flex child behavior */
+      display: flex;
+      flex-direction: column;
+      height: 100%;
     }
 
     /* Active view styles - these will be applied via JavaScript */
@@ -472,7 +509,7 @@
     }
   }
 
-  updateUrlForViewMode(mode: "chat" | "diff" | "terminal"): void {
+  updateUrlForViewMode(mode: ViewMode): void {
     // Get the current URL without search parameters
     const url = new URL(window.location.href);
 
@@ -508,7 +545,7 @@
    * Handle view mode selection event
    */
   private _handleViewModeSelect(event: CustomEvent) {
-    const mode = event.detail.mode as "chat" | "diff" | "terminal";
+    const mode = event.detail.mode as "chat" | "diff" | "diff2" | "terminal";
     this.toggleViewMode(mode, true);
   }
 
@@ -526,6 +563,11 @@
     window.console.log("_handleMultipleChoice", event);
     this._sendChat;
   }
+
+  private _handleDiffComment(event: CustomEvent) {
+    // Empty stub required by the event binding in the template
+    // Actual handling occurs at global level in sketch-chat-input component
+  }
   /**
    * Listen for commit diff event
    * @param commitHash The commit hash to show diff for
@@ -534,16 +576,12 @@
     // Store the commit hash
     this.currentCommitHash = commitHash;
 
-    // Switch to diff view
-    this.toggleViewMode("diff", true);
+    this.toggleViewMode("diff2", true);
 
-    // Wait for DOM update to complete
     this.updateComplete.then(() => {
-      // Get the diff view component
-      const diffView = this.shadowRoot?.querySelector("sketch-diff-view");
-      if (diffView) {
-        // Call the showCommitDiff method
-        (diffView as any).showCommitDiff(commitHash);
+      const diff2View = this.shadowRoot?.querySelector("sketch-diff2-view");
+      if (diff2View) {
+        (diff2View as SketchDiff2View).refreshDiffView();
       }
     });
   }
@@ -571,19 +609,25 @@
       );
       const chatView = this.shadowRoot?.querySelector(".chat-view");
       const diffView = this.shadowRoot?.querySelector(".diff-view");
-
+      const diff2View = this.shadowRoot?.querySelector(".diff2-view");
       const terminalView = this.shadowRoot?.querySelector(".terminal-view");
 
       // Remove active class from all views
       chatView?.classList.remove("view-active");
       diffView?.classList.remove("view-active");
+      diff2View?.classList.remove("view-active");
       terminalView?.classList.remove("view-active");
 
       // Add/remove diff-active class on view container
       if (mode === "diff") {
         viewContainerInner?.classList.add("diff-active");
+        viewContainerInner?.classList.remove("diff2-active");
+      } else if (mode === "diff2") {
+        viewContainerInner?.classList.add("diff2-active");
+        viewContainerInner?.classList.remove("diff-active");
       } else {
         viewContainerInner?.classList.remove("diff-active");
+        viewContainerInner?.classList.remove("diff2-active");
       }
 
       // Add active class to the selected view
@@ -602,6 +646,16 @@
             (diffViewComp as any).loadDiffContent();
           }
           break;
+          
+        case "diff2":
+          diff2View?.classList.add("view-active");
+          // Refresh git/recentlog when Monaco diff view is opened
+          // This ensures branch information is always up-to-date, as branches can change frequently
+          const diff2ViewComp = this.shadowRoot?.querySelector("sketch-diff2-view");
+          if (diff2ViewComp) {
+            (diff2ViewComp as SketchDiff2View).refreshDiffView();
+          }
+          break;
 
         case "terminal":
           terminalView?.classList.add("view-active");
@@ -997,6 +1051,16 @@
               .commitHash=${this.currentCommitHash}
             ></sketch-diff-view>
           </div>
+          
+          <div
+            class="diff2-view ${this.viewMode === "diff2" ? "view-active" : ""}"
+          >
+            <sketch-diff2-view
+              .commit=${this.currentCommitHash}
+              .gitService=${new DefaultGitDataService()}
+              @diff-comment="${this._handleDiffComment}"
+            ></sketch-diff2-view>
+          </div>
 
           <div
             class="terminal-view ${this.viewMode === "terminal"
@@ -1005,6 +1069,7 @@
           >
             <sketch-terminal></sketch-terminal>
           </div>
+
         </div>
       </div>
 
diff --git a/webui/src/web-components/sketch-diff-empty-view.ts b/webui/src/web-components/sketch-diff-empty-view.ts
new file mode 100644
index 0000000..ecee534
--- /dev/null
+++ b/webui/src/web-components/sketch-diff-empty-view.ts
@@ -0,0 +1,79 @@
+import { css, html, LitElement } from "lit";
+import { customElement } from "lit/decorators.js";
+
+/**
+ * A component that displays helpful information when the diff view is empty
+ */
+@customElement("sketch-diff-empty-view")
+export class SketchDiffEmptyView extends LitElement {
+  static styles = css`
+    :host {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      height: 100%;
+      width: 100%;
+      box-sizing: border-box;
+    }
+
+    .empty-diff-box {
+      margin: 2rem auto;
+      max-width: 1200px;
+      width: 90%;
+      padding: 2rem;
+      border: 2px solid #e0e0e0;
+      border-radius: 8px;
+      box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
+      background-color: #ffffff;
+      text-align: center;
+    }
+
+    .empty-diff-title {
+      font-size: 1.5rem;
+      font-weight: 600;
+      margin-bottom: 1.5rem;
+      text-align: center;
+      color: #333;
+    }
+
+    .empty-diff-content {
+      color: #666;
+      line-height: 1.6;
+      font-size: 1rem;
+      text-align: left;
+      margin-bottom: 1rem;
+    }
+
+    strong {
+      font-weight: 600;
+      color: #333;
+    }
+  `;
+
+  render() {
+    return html`
+      <div class="empty-diff-box">
+        <h2 class="empty-diff-title">How to use the Diff View</h2>
+        
+        <p class="empty-diff-content">
+          By default, the diff view shows differences between when you started Sketch (the "sketch-base" tag) and the current state. Choose a commit to look at, or, a range of commits, and navigate across files.
+        </p>
+
+        <p class="empty-diff-content">
+          You can select text to leave comments on the code. These will be added to your chat window, and you can click Send to send them along to the agent, which will respond in the chat window.
+        </p>
+
+        <p class="empty-diff-content">
+          If the range includes <strong>Uncommitted Changes</strong>, you can <strong>edit</strong> the text as well, and it auto-saves. If you want to clear up a comment or write your own text, just go ahead and do it! Once you're done, though, be sure to commit your changes, either by asking the agent to do so or in the Terminal view.
+        </p>
+      </div>
+    `;
+  }
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    "sketch-diff-empty-view": SketchDiffEmptyView;
+  }
+}
diff --git a/webui/src/web-components/sketch-diff-file-picker.ts b/webui/src/web-components/sketch-diff-file-picker.ts
new file mode 100644
index 0000000..c7978ee
--- /dev/null
+++ b/webui/src/web-components/sketch-diff-file-picker.ts
@@ -0,0 +1,322 @@
+// sketch-diff-file-picker.ts
+// Component for selecting files from a diff
+
+import { css, html, LitElement } from "lit";
+import { customElement, property, state } from "lit/decorators.js";
+import { GitDiffFile } from "./git-data-service";
+
+/**
+ * Component for selecting files from a diff with next/previous navigation
+ */
+@customElement("sketch-diff-file-picker")
+export class SketchDiffFilePicker extends LitElement {
+  @property({ type: Array })
+  files: GitDiffFile[] = [];
+
+  @property({ type: String })
+  selectedPath: string = "";
+
+  @state()
+  private selectedIndex: number = -1;
+
+  static styles = css`
+    :host {
+      display: block;
+      width: 100%;
+      font-family: var(--font-family, system-ui, sans-serif);
+    }
+
+    .file-picker {
+      display: flex;
+      gap: 8px;
+      align-items: center;
+      background-color: var(--background-light, #f8f8f8);
+      border-radius: 4px;
+      border: 1px solid var(--border-color, #e0e0e0);
+      padding: 8px 12px;
+      width: 100%;
+      box-sizing: border-box;
+    }
+
+    .file-select {
+      flex: 1;
+      min-width: 200px;
+      max-width: calc(100% - 230px); /* Leave space for the navigation buttons and file info */
+      overflow: hidden;
+    }
+
+    select {
+      width: 100%;
+      max-width: 100%;
+      padding: 8px 12px;
+      border-radius: 4px;
+      border: 1px solid var(--border-color, #e0e0e0);
+      background-color: white;
+      font-size: 14px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+    }
+
+    .navigation-buttons {
+      display: flex;
+      gap: 8px;
+    }
+
+    button {
+      padding: 8px 12px;
+      background-color: var(--button-bg, #4a7dfc);
+      color: var(--button-text, white);
+      border: none;
+      border-radius: 4px;
+      cursor: pointer;
+      font-size: 14px;
+      transition: background-color 0.2s;
+    }
+
+    button:hover {
+      background-color: var(--button-hover, #3a6eee);
+    }
+
+    button:disabled {
+      background-color: var(--button-disabled, #cccccc);
+      cursor: not-allowed;
+    }
+
+    .file-info {
+      font-size: 14px;
+      color: var(--text-muted, #666);
+      margin-left: 8px;
+      white-space: nowrap;
+    }
+
+    .no-files {
+      color: var(--text-muted, #666);
+      font-style: italic;
+    }
+
+    @media (max-width: 768px) {
+      .file-picker {
+        flex-direction: column;
+        align-items: stretch;
+      }
+
+      .file-select {
+        max-width: 100%; /* Full width on small screens */
+        margin-bottom: 8px;
+      }
+
+      .navigation-buttons {
+        width: 100%;
+        justify-content: space-between;
+      }
+      
+      .file-info {
+        margin-left: 0;
+        margin-top: 8px;
+        text-align: center;
+      }
+    }
+  `;
+
+  updated(changedProperties: Map<string, any>) {
+    // If files changed, reset the selection
+    if (changedProperties.has('files')) {
+      this.updateSelectedIndex();
+    }
+
+    // If selectedPath changed externally, update the index
+    if (changedProperties.has('selectedPath')) {
+      this.updateSelectedIndex();
+    }
+  }
+  
+  connectedCallback() {
+    super.connectedCallback();
+    // Initialize the selection when the component is connected, but only if files exist
+    if (this.files && this.files.length > 0) {
+      this.updateSelectedIndex();
+      
+      // Explicitly trigger file selection event for the first file when there's only one file
+      // This ensures the diff view is updated even when navigation buttons aren't clicked
+      if (this.files.length === 1) {
+        this.selectFileByIndex(0);
+      }
+    }
+  }
+
+  render() {
+    if (!this.files || this.files.length === 0) {
+      return html`<div class="no-files">No files to display</div>`;
+    }
+
+    return html`
+      <div class="file-picker">
+        <div class="file-select">
+          <select @change=${this.handleSelect}>
+            ${this.files.map(
+              (file, index) => html`
+                <option 
+                  value=${index} 
+                  ?selected=${index === this.selectedIndex}
+                >
+                  ${this.formatFileOption(file)}
+                </option>
+              `
+            )}
+          </select>
+        </div>
+        
+        <div class="navigation-buttons">
+          <button 
+            @click=${this.handlePrevious} 
+            ?disabled=${this.selectedIndex <= 0}
+          >
+            Previous
+          </button>
+          <button 
+            @click=${this.handleNext} 
+            ?disabled=${this.selectedIndex >= this.files.length - 1}
+          >
+            Next
+          </button>
+        </div>
+
+        ${this.selectedIndex >= 0 ? this.renderFileInfo() : ''}
+      </div>
+    `;
+  }
+
+  renderFileInfo() {
+    const file = this.files[this.selectedIndex];
+    return html`
+      <div class="file-info">
+        ${this.getFileStatusName(file.status)} | 
+        ${this.selectedIndex + 1} of ${this.files.length}
+      </div>
+    `;
+  }
+
+  /**
+   * Format a file for display in the dropdown
+   */
+  formatFileOption(file: GitDiffFile): string {
+    const statusSymbol = this.getFileStatusSymbol(file.status);
+    return `${statusSymbol} ${file.path}`;
+  }
+
+  /**
+   * Get a short symbol for the file status
+   */
+  getFileStatusSymbol(status: string): string {
+    switch (status.toUpperCase()) {
+      case 'A': return '+';
+      case 'M': return 'M';
+      case 'D': return '-';
+      case 'R': return 'R';
+      default: return '?';
+    }
+  }
+
+  /**
+   * Get a descriptive name for the file status
+   */
+  getFileStatusName(status: string): string {
+    switch (status.toUpperCase()) {
+      case 'A': return 'Added';
+      case 'M': return 'Modified';
+      case 'D': return 'Deleted';
+      case 'R': return 'Renamed';
+      default: return 'Unknown';
+    }
+  }
+
+  /**
+   * Handle file selection from dropdown
+   */
+  handleSelect(event: Event) {
+    const select = event.target as HTMLSelectElement;
+    const index = parseInt(select.value, 10);
+    this.selectFileByIndex(index);
+  }
+
+  /**
+   * Handle previous button click
+   */
+  handlePrevious() {
+    if (this.selectedIndex > 0) {
+      this.selectFileByIndex(this.selectedIndex - 1);
+    }
+  }
+
+  /**
+   * Handle next button click
+   */
+  handleNext() {
+    if (this.selectedIndex < this.files.length - 1) {
+      this.selectFileByIndex(this.selectedIndex + 1);
+    }
+  }
+
+  /**
+   * Select a file by index and dispatch event
+   */
+  selectFileByIndex(index: number) {
+    if (index >= 0 && index < this.files.length) {
+      this.selectedIndex = index;
+      this.selectedPath = this.files[index].path;
+      
+      const event = new CustomEvent('file-selected', {
+        detail: { file: this.files[index] },
+        bubbles: true,
+        composed: true
+      });
+      
+      this.dispatchEvent(event);
+    }
+  }
+
+  /**
+   * Update the selected index based on the selectedPath
+   */
+  private updateSelectedIndex() {
+    // Add defensive check for files array
+    if (!this.files || this.files.length === 0) {
+      this.selectedIndex = -1;
+      return;
+    }
+
+    if (this.selectedPath) {
+      // Find the file with the matching path
+      const index = this.files.findIndex(file => file.path === this.selectedPath);
+      if (index >= 0) {
+        this.selectedIndex = index;
+        return;
+      }
+    }
+
+    // Default to first file if no match or no path
+    this.selectedIndex = 0;
+    const newSelectedPath = this.files[0].path;
+    
+    // Only dispatch event if the path has actually changed and files exist
+    if (this.selectedPath !== newSelectedPath && this.files && this.files.length > 0) {
+      this.selectedPath = newSelectedPath;
+      
+      // Dispatch the event directly - we've already checked the files array
+      const event = new CustomEvent('file-selected', {
+        detail: { file: this.files[0] },
+        bubbles: true,
+        composed: true
+      });
+      
+      this.dispatchEvent(event);
+    }
+  }
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    "sketch-diff-file-picker": SketchDiffFilePicker;
+  }
+}
diff --git a/webui/src/web-components/sketch-diff-range-picker.ts b/webui/src/web-components/sketch-diff-range-picker.ts
new file mode 100644
index 0000000..9893875
--- /dev/null
+++ b/webui/src/web-components/sketch-diff-range-picker.ts
@@ -0,0 +1,373 @@
+// sketch-diff-range-picker.ts
+// Component for selecting commit range for diffs
+
+import { css, html, LitElement } from "lit";
+import { customElement, property, state } from "lit/decorators.js";
+import { GitDataService, DefaultGitDataService } from "./git-data-service";
+import { GitLogEntry } from "../types";
+
+/**
+ * Range type for diff views
+ */
+export type DiffRange = 
+  | { type: 'range'; from: string; to: string } 
+  | { type: 'single'; commit: string };
+
+/**
+ * Component for selecting commit range for diffs
+ */
+@customElement("sketch-diff-range-picker")
+export class SketchDiffRangePicker extends LitElement {
+  @property({ type: Array })
+  commits: GitLogEntry[] = [];
+
+  @state()
+  private rangeType: 'range' | 'single' = 'range';
+
+  @state()
+  private fromCommit: string = '';
+
+  @state()
+  private toCommit: string = '';
+
+  @state()
+  private singleCommit: string = '';
+
+  @state()
+  private loading: boolean = true;
+
+  @state()
+  private error: string | null = null;
+  
+  @property({ attribute: false, type: Object })
+  gitService!: GitDataService;
+  
+  constructor() {
+    super();
+    console.log('SketchDiffRangePicker initialized');
+  }
+
+  static styles = css`
+    :host {
+      display: block;
+      width: 100%;
+      font-family: var(--font-family, system-ui, sans-serif);
+      color: var(--text-color, #333);
+    }
+
+    .range-picker {
+      display: flex;
+      flex-direction: row;
+      align-items: center;
+      gap: 12px;
+      padding: 12px;
+      background-color: var(--background-light, #f8f8f8);
+      border-radius: 4px;
+      border: 1px solid var(--border-color, #e0e0e0);
+      flex-wrap: wrap; /* Allow wrapping on small screens */
+      width: 100%;
+      box-sizing: border-box;
+    }
+
+    .range-type-selector {
+      display: flex;
+      gap: 16px;
+      flex-shrink: 0;
+    }
+
+    .range-type-option {
+      display: flex;
+      align-items: center;
+      gap: 6px;
+      cursor: pointer;
+      white-space: nowrap;
+    }
+
+    .commit-selectors {
+      display: flex;
+      flex-direction: row;
+      align-items: center;
+      gap: 12px;
+      flex: 1;
+      flex-wrap: wrap; /* Allow wrapping on small screens */
+    }
+
+    .commit-selector {
+      display: flex;
+      align-items: center;
+      gap: 8px;
+      flex: 1;
+      min-width: 200px;
+      max-width: calc(50% - 12px); /* Half width minus half the gap */
+      overflow: hidden;
+    }
+
+    select {
+      padding: 6px 8px;
+      border-radius: 4px;
+      border: 1px solid var(--border-color, #e0e0e0);
+      background-color: var(--background, #fff);
+      max-width: 100%;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+    }
+
+    label {
+      font-weight: 500;
+      font-size: 14px;
+    }
+
+    .loading {
+      font-style: italic;
+      color: var(--text-muted, #666);
+    }
+
+    .error {
+      color: var(--error-color, #dc3545);
+      font-size: 14px;
+    }
+    
+    @media (max-width: 768px) {
+      .commit-selector {
+        max-width: 100%;
+      }
+    }
+  `;
+
+  connectedCallback() {
+    super.connectedCallback();
+    // Wait for DOM to be fully loaded to ensure proper initialization order
+    if (document.readyState === 'complete') {
+      this.loadCommits();
+    } else {
+      window.addEventListener('load', () => {
+        setTimeout(() => this.loadCommits(), 0); // Give time for provider initialization
+      });
+    }
+  }
+
+  render() {
+    return html`
+      <div class="range-picker">
+        ${this.loading
+          ? html`<div class="loading">Loading commits...</div>`
+          : this.error
+          ? html`<div class="error">${this.error}</div>`
+          : this.renderRangePicker()
+        }
+      </div>
+    `;
+  }
+
+  renderRangePicker() {
+    return html`
+      <div class="range-type-selector">
+        <label class="range-type-option">
+          <input
+            type="radio"
+            name="rangeType"
+            value="range"
+            ?checked=${this.rangeType === 'range'}
+            @change=${() => this.setRangeType('range')}
+          />
+          Commit Range
+        </label>
+        <label class="range-type-option">
+          <input
+            type="radio"
+            name="rangeType"
+            value="single"
+            ?checked=${this.rangeType === 'single'}
+            @change=${() => this.setRangeType('single')}
+          />
+          Single Commit
+        </label>
+      </div>
+
+      <div class="commit-selectors">
+        ${this.rangeType === 'range'
+          ? this.renderRangeSelectors()
+          : this.renderSingleSelector()
+        }
+      </div>
+    `;
+  }
+
+  renderRangeSelectors() {
+    return html`
+      <div class="commit-selector">
+        <label for="fromCommit">From:</label>
+        <select
+          id="fromCommit"
+          .value=${this.fromCommit}
+          @change=${this.handleFromChange}
+        >
+          ${this.commits.map(
+            commit => html`
+              <option value=${commit.hash} ?selected=${commit.hash === this.fromCommit}>
+                ${this.formatCommitOption(commit)}
+              </option>
+            `
+          )}
+        </select>
+      </div>
+      <div class="commit-selector">
+        <label for="toCommit">To:</label>
+        <select
+          id="toCommit"
+          .value=${this.toCommit}
+          @change=${this.handleToChange}
+        >
+          <option value="" ?selected=${this.toCommit === ''}>Uncommitted Changes</option>
+          ${this.commits.map(
+            commit => html`
+              <option value=${commit.hash} ?selected=${commit.hash === this.toCommit}>
+                ${this.formatCommitOption(commit)}
+              </option>
+            `
+          )}
+        </select>
+      </div>
+    `;
+  }
+
+  renderSingleSelector() {
+    return html`
+      <div class="commit-selector">
+        <label for="singleCommit">Commit:</label>
+        <select
+          id="singleCommit"
+          .value=${this.singleCommit}
+          @change=${this.handleSingleChange}
+        >
+          ${this.commits.map(
+            commit => html`
+              <option value=${commit.hash} ?selected=${commit.hash === this.singleCommit}>
+                ${this.formatCommitOption(commit)}
+              </option>
+            `
+          )}
+        </select>
+      </div>
+    `;
+  }
+
+  /**
+   * Format a commit for display in the dropdown
+   */
+  formatCommitOption(commit: GitLogEntry): string {
+    const shortHash = commit.hash.substring(0, 7);
+    let label = `${shortHash} ${commit.subject}`;
+    
+    if (commit.refs && commit.refs.length > 0) {
+      label += ` (${commit.refs.join(', ')})`;
+    }
+    
+    return label;
+  }
+
+  /**
+   * Load commits from the Git data service
+   */
+  async loadCommits() {
+    this.loading = true;
+    this.error = null;
+
+    if (!this.gitService) {
+      console.error('GitService was not provided to sketch-diff-range-picker');
+      throw Error();
+    }
+
+    try {
+      // Get the base commit reference
+      const baseCommitRef = await this.gitService.getBaseCommitRef();
+      
+      // Load commit history
+      this.commits = await this.gitService.getCommitHistory(baseCommitRef);
+      
+      // Set default selections
+      if (this.commits.length > 0) {
+        // For range, default is base to HEAD
+        // TODO: is sketch-base right in the unsafe context, where it's sketch-base-...
+        // should this be startswith?
+        const baseCommit = this.commits.find(c => 
+          c.refs && c.refs.some(ref => ref.includes('sketch-base'))
+        );
+        
+        this.fromCommit = baseCommit ? baseCommit.hash : this.commits[this.commits.length - 1].hash;
+        // Default to Uncommitted Changes by setting toCommit to empty string
+        this.toCommit = ''; // Empty string represents uncommitted changes
+        
+        // For single, default to HEAD
+        this.singleCommit = this.commits[0].hash;
+        
+        // Dispatch initial range event
+        this.dispatchRangeEvent();
+      }
+    } catch (error) {
+      console.error('Error loading commits:', error);
+      this.error = `Error loading commits: ${error.message}`;
+    } finally {
+      this.loading = false;
+    }
+  }
+
+  /**
+   * Handle range type change
+   */
+  setRangeType(type: 'range' | 'single') {
+    this.rangeType = type;
+    this.dispatchRangeEvent();
+  }
+
+  /**
+   * Handle From commit change
+   */
+  handleFromChange(event: Event) {
+    const select = event.target as HTMLSelectElement;
+    this.fromCommit = select.value;
+    this.dispatchRangeEvent();
+  }
+
+  /**
+   * Handle To commit change
+   */
+  handleToChange(event: Event) {
+    const select = event.target as HTMLSelectElement;
+    this.toCommit = select.value;
+    this.dispatchRangeEvent();
+  }
+
+  /**
+   * Handle Single commit change
+   */
+  handleSingleChange(event: Event) {
+    const select = event.target as HTMLSelectElement;
+    this.singleCommit = select.value;
+    this.dispatchRangeEvent();
+  }
+
+  /**
+   * Dispatch range change event
+   */
+  dispatchRangeEvent() {
+    const range: DiffRange = this.rangeType === 'range'
+      ? { type: 'range', from: this.fromCommit, to: this.toCommit }
+      : { type: 'single', commit: this.singleCommit };
+    
+    const event = new CustomEvent('range-change', {
+      detail: { range },
+      bubbles: true,
+      composed: true
+    });
+    
+    this.dispatchEvent(event);
+  }
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    "sketch-diff-range-picker": SketchDiffRangePicker;
+  }
+}
diff --git a/webui/src/web-components/sketch-diff2-view.ts b/webui/src/web-components/sketch-diff2-view.ts
new file mode 100644
index 0000000..5ac7459
--- /dev/null
+++ b/webui/src/web-components/sketch-diff2-view.ts
@@ -0,0 +1,536 @@
+import { css, html, LitElement } from "lit";
+import { customElement, property, state } from "lit/decorators.js";
+import "./sketch-monaco-view";
+import "./sketch-diff-range-picker";
+import "./sketch-diff-file-picker";
+import "./sketch-diff-empty-view";
+import { GitDiffFile, GitDataService, DefaultGitDataService } from "./git-data-service";
+import { DiffRange } from "./sketch-diff-range-picker";
+
+/**
+ * A component that displays diffs using Monaco editor with range and file pickers
+ */
+@customElement("sketch-diff2-view")
+export class SketchDiff2View extends LitElement {
+  /**
+   * Handles comment events from the Monaco editor and forwards them to the chat input
+   * using the same event format as the original diff view for consistency.
+   */
+  private handleMonacoComment(event: CustomEvent) {
+    try {
+      // Validate incoming data
+      if (!event.detail || !event.detail.formattedComment) {
+        console.error('Invalid comment data received');
+        return;
+      }
+      
+      // Create and dispatch event using the standardized format
+      const commentEvent = new CustomEvent('diff-comment', {
+        detail: { comment: event.detail.formattedComment },
+        bubbles: true,
+        composed: true
+      });
+      
+      this.dispatchEvent(commentEvent);
+    } catch (error) {
+      console.error('Error handling Monaco comment:', error);
+    }
+  }
+  
+  /**
+   * Handle save events from the Monaco editor
+   */
+  private async handleMonacoSave(event: CustomEvent) {
+    try {
+      // Validate incoming data
+      if (!event.detail || !event.detail.path || event.detail.content === undefined) {
+        console.error('Invalid save data received');
+        return;
+      }
+      
+      const { path, content } = event.detail;
+      
+      // Get Monaco view component
+      const monacoView = this.shadowRoot?.querySelector('sketch-monaco-view');
+      if (!monacoView) {
+        console.error('Monaco view not found');
+        return;
+      }
+      
+      try {
+        await this.gitService?.saveFileContent(path, content);
+        console.log(`File saved: ${path}`);
+        (monacoView as any).notifySaveComplete(true);
+      } catch (error) {
+        console.error(`Error saving file: ${error instanceof Error ? error.message : String(error)}`);
+        (monacoView as any).notifySaveComplete(false);
+      }
+    } catch (error) {
+      console.error('Error handling save:', error);
+    }
+  }
+  @property({ type: String })
+  initialCommit: string = "";
+  
+  // The commit to show - used when showing a specific commit from timeline
+  @property({ type: String })
+  commit: string = "";
+
+  @property({ type: String })
+  selectedFilePath: string = "";
+
+  @state()
+  private files: GitDiffFile[] = [];
+  
+  @state()
+  private currentRange: DiffRange = { type: 'range', from: '', to: 'HEAD' };
+
+  @state()
+  private originalCode: string = "";
+
+  @state()
+  private modifiedCode: string = "";
+  
+  @state()
+  private isRightEditable: boolean = false;
+
+  @state()
+  private loading: boolean = false;
+
+  @state()
+  private error: string | null = null;
+
+  static styles = css`
+    :host {
+      display: flex;
+      height: 100%;
+      flex: 1;
+      flex-direction: column;
+      min-height: 0; /* Critical for flex child behavior */
+      overflow: hidden;
+      position: relative; /* Establish positioning context */
+    }
+
+    .controls {
+      padding: 8px 16px;
+      border-bottom: 1px solid var(--border-color, #e0e0e0);
+      background-color: var(--background-light, #f8f8f8);
+      flex-shrink: 0; /* Prevent controls from shrinking */
+    }
+    
+    .controls-container {
+      display: flex;
+      flex-direction: column;
+      gap: 12px;
+    }
+    
+    .range-row {
+      width: 100%;
+      display: flex;
+    }
+    
+    .file-row {
+      width: 100%;
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      gap: 10px;
+    }
+    
+    sketch-diff-range-picker {
+      width: 100%;
+    }
+    
+    sketch-diff-file-picker {
+      flex: 1;
+    }
+    
+    .view-toggle-button {
+      background-color: #f0f0f0;
+      border: 1px solid #ccc;
+      border-radius: 4px;
+      padding: 6px 12px;
+      font-size: 12px;
+      cursor: pointer;
+      white-space: nowrap;
+      transition: background-color 0.2s;
+    }
+    
+    .view-toggle-button:hover {
+      background-color: #e0e0e0;
+    }
+
+    .diff-container {
+      flex: 1;
+      overflow: hidden;
+      display: flex;
+      flex-direction: column;
+      min-height: 0; /* Critical for flex child to respect parent height */
+      position: relative; /* Establish positioning context */
+      height: 100%; /* Take full height */
+    }
+
+    .diff-content {
+      flex: 1;
+      overflow: hidden;
+      min-height: 0; /* Required for proper flex behavior */
+      display: flex; /* Required for child to take full height */
+      position: relative; /* Establish positioning context */
+      height: 100%; /* Take full height */
+    }
+
+    .loading, .empty-diff {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      height: 100%;
+      font-family: var(--font-family, system-ui, sans-serif);
+    }
+    
+    .empty-diff {
+      color: var(--text-secondary-color, #666);
+      font-size: 16px;
+      text-align: center;
+    }
+
+    .error {
+      color: var(--error-color, #dc3545);
+      padding: 16px;
+      font-family: var(--font-family, system-ui, sans-serif);
+    }
+
+    sketch-monaco-view {
+      --editor-width: 100%;
+      --editor-height: 100%;
+      flex: 1; /* Make Monaco view take full height */
+      display: flex; /* Required for child to take full height */
+      position: absolute; /* Absolute positioning to take full space */
+      top: 0;
+      left: 0;
+      right: 0;
+      bottom: 0;
+      height: 100%; /* Take full height */
+      width: 100%;  /* Take full width */
+    }
+  `;
+
+  @property({ attribute: false, type: Object })
+  gitService!: GitDataService;
+  
+  // The gitService must be passed from parent to ensure proper dependency injection
+
+  constructor() {
+    super();
+    console.log('SketchDiff2View initialized');
+    
+    // Fix for monaco-aria-container positioning
+    // Add a global style to ensure proper positioning of aria containers
+    const styleElement = document.createElement('style');
+    styleElement.textContent = `
+      .monaco-aria-container {
+        position: absolute !important;
+        top: 0 !important;
+        left: 0 !important;
+        width: 1px !important;
+        height: 1px !important;
+        overflow: hidden !important;
+        clip: rect(1px, 1px, 1px, 1px) !important;
+        white-space: nowrap !important;
+        margin: 0 !important;
+        padding: 0 !important;
+        border: 0 !important;
+        z-index: -1 !important;
+      }
+    `;
+    document.head.appendChild(styleElement);
+  }
+
+  connectedCallback() {
+    super.connectedCallback();
+    // Initialize with default range and load data
+    // Get base commit if not set
+    if (this.currentRange.type === 'range' && !('from' in this.currentRange && this.currentRange.from)) {
+      this.gitService.getBaseCommitRef().then(baseRef => {
+        this.currentRange = { type: 'range', from: baseRef, to: 'HEAD' };
+        this.loadDiffData();
+      }).catch(error => {
+        console.error('Error getting base commit ref:', error);
+        // Use default range
+        this.loadDiffData();
+      });
+    } else {
+      this.loadDiffData();
+    }
+  }
+
+  // Toggle hideUnchangedRegions setting
+  @state()
+  private hideUnchangedRegionsEnabled: boolean = true;
+  
+  // Toggle hideUnchangedRegions setting
+  private toggleHideUnchangedRegions() {
+    this.hideUnchangedRegionsEnabled = !this.hideUnchangedRegionsEnabled;
+    
+    // Get the Monaco view component
+    const monacoView = this.shadowRoot?.querySelector('sketch-monaco-view');
+    if (monacoView) {
+      (monacoView as any).toggleHideUnchangedRegions(this.hideUnchangedRegionsEnabled);
+    }
+  }
+  
+  render() {
+    return html`
+      <div class="controls">
+        <div class="controls-container">
+          <div class="range-row">
+            <sketch-diff-range-picker
+              .gitService="${this.gitService}"
+              @range-change="${this.handleRangeChange}"
+            ></sketch-diff-range-picker>
+          </div>
+          
+          <div class="file-row">
+            <sketch-diff-file-picker
+              .files="${this.files}"
+              .selectedPath="${this.selectedFilePath}"
+              @file-selected="${this.handleFileSelected}"
+            ></sketch-diff-file-picker>
+            
+            <div style="display: flex; gap: 8px;">
+              ${this.isRightEditable ? html`
+                <div class="editable-indicator" title="This file is editable">
+                  <span style="padding: 6px 12px; background-color: #e9ecef; border-radius: 4px; font-size: 12px; color: #495057;">
+                    Editable
+                  </span>
+                </div>
+              ` : ''}
+              <button 
+                class="view-toggle-button"
+                @click="${this.toggleHideUnchangedRegions}"
+                title="${this.hideUnchangedRegionsEnabled ? 'Expand All' : 'Hide Unchanged'}"
+              >
+                ${this.hideUnchangedRegionsEnabled ? 'Expand All' : 'Hide Unchanged'}
+              </button>
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <div class="diff-container">
+        <div class="diff-content">
+          ${this.renderDiffContent()}
+        </div>
+      </div>
+    `;
+  }
+
+  renderDiffContent() {
+    if (this.loading) {
+      return html`<div class="loading">Loading diff...</div>`;
+    }
+
+    if (this.error) {
+      return html`<div class="error">${this.error}</div>`;
+    }
+
+    if (this.files.length === 0) {
+      return html`<sketch-diff-empty-view></sketch-diff-empty-view>`;
+    }
+    
+    if (!this.selectedFilePath) {
+      return html`<div class="loading">Select a file to view diff</div>`;
+    }
+
+    return html`
+      <sketch-monaco-view
+        .originalCode="${this.originalCode}"
+        .modifiedCode="${this.modifiedCode}"
+        .originalFilename="${this.selectedFilePath}"
+        .modifiedFilename="${this.selectedFilePath}"
+        ?readOnly="${!this.isRightEditable}"
+        ?editable-right="${this.isRightEditable}"
+        @monaco-comment="${this.handleMonacoComment}"
+        @monaco-save="${this.handleMonacoSave}"
+      ></sketch-monaco-view>
+    `;
+  }
+
+  /**
+   * Load diff data for the current range
+   */
+  async loadDiffData() {
+    this.loading = true;
+    this.error = null;
+
+    try {
+      // Initialize files as empty array if undefined
+      if (!this.files) {
+        this.files = [];
+      }
+
+      // Load diff data based on the current range type
+      if (this.currentRange.type === 'single') {
+        this.files = await this.gitService.getCommitDiff(this.currentRange.commit);
+      } else {
+        this.files = await this.gitService.getDiff(this.currentRange.from, this.currentRange.to);
+      }
+
+      // Ensure files is always an array, even when API returns null
+      if (!this.files) {
+        this.files = [];
+      }
+      
+      // If we have files, select the first one and load its content
+      if (this.files.length > 0) {
+        const firstFile = this.files[0];
+        this.selectedFilePath = firstFile.path;
+        
+        // Directly load the file content, especially important when there's only one file
+        // as sometimes the file-selected event might not fire in that case
+        this.loadFileContent(firstFile);
+      } else {
+        // No files to display - reset the view to initial state
+        this.selectedFilePath = '';
+        this.originalCode = '';
+        this.modifiedCode = '';
+      }
+    } catch (error) {
+      console.error('Error loading diff data:', error);
+      this.error = `Error loading diff data: ${error.message}`;
+      // Ensure files is an empty array when an error occurs
+      this.files = [];
+      // Reset the view to initial state
+      this.selectedFilePath = '';
+      this.originalCode = '';
+      this.modifiedCode = '';
+    } finally {
+      this.loading = false;
+    }
+  }
+
+  /**
+   * Load the content of the selected file
+   */
+  async loadFileContent(file: GitDiffFile) {
+    this.loading = true;
+    this.error = null;
+
+    try {
+      let fromCommit: string;
+      let toCommit: string;
+      let isUnstagedChanges = false;
+      
+      // Determine the commits to compare based on the current range
+      if (this.currentRange.type === 'single') {
+        fromCommit = `${this.currentRange.commit}^`;
+        toCommit = this.currentRange.commit;
+      } else {
+        fromCommit = this.currentRange.from;
+        toCommit = this.currentRange.to;
+        // Check if this is an unstaged changes view
+        isUnstagedChanges = toCommit === '';
+      }
+
+      // Set editability based on whether we're showing uncommitted changes
+      this.isRightEditable = isUnstagedChanges;
+
+      // Load the original code based on file status
+      if (file.status === 'A') {
+        // Added file: empty original
+        this.originalCode = '';
+      } else {
+        // For modified, renamed, or deleted files: load original content
+        this.originalCode = await this.gitService.getFileContent(file.old_hash || '');
+      }
+      
+      // For modified code, always use working copy when editable
+      if (this.isRightEditable) {
+        try {
+          // Always use working copy when editable, regardless of diff status
+          // This ensures we have the latest content even if the diff hasn't been refreshed
+          this.modifiedCode = await this.gitService.getWorkingCopyContent(file.path);
+        } catch (error) {
+          if (file.status === 'D') {
+            // For deleted files, silently use empty content
+            console.warn(`Could not get working copy for deleted file ${file.path}, using empty content`);
+            this.modifiedCode = '';
+          } else {
+            // For any other file status, propagate the error
+            console.error(`Failed to get working copy for ${file.path}:`, error);
+            throw error; // Rethrow to be caught by the outer try/catch
+          }
+        }
+      } else {
+        // For non-editable view, use git content based on file status
+        if (file.status === 'D') {
+          // Deleted file: empty modified
+          this.modifiedCode = '';
+        } else {
+          // Added/modified/renamed: use the content from git
+          this.modifiedCode = await this.gitService.getFileContent(file.new_hash || '');
+        }
+      }
+      
+      // Don't make deleted files editable
+      if (file.status === 'D') {
+        this.isRightEditable = false;
+      }
+    } catch (error) {
+      console.error('Error loading file content:', error);
+      this.error = `Error loading file content: ${error.message}`;
+      this.isRightEditable = false;
+    } finally {
+      this.loading = false;
+    }
+  }
+
+  /**
+   * Handle range change event from the range picker
+   */
+  handleRangeChange(event: CustomEvent) {
+    const { range } = event.detail;
+    console.log('Range changed:', range);
+    this.currentRange = range;
+    
+    // Load diff data for the new range
+    this.loadDiffData();
+  }
+
+  /**
+   * Handle file selection event from the file picker
+   */
+  handleFileSelected(event: CustomEvent) {
+    const file = event.detail.file as GitDiffFile;
+    this.selectedFilePath = file.path;
+    this.loadFileContent(file);
+  }
+
+  /**
+   * Refresh the diff view by reloading commits and diff data
+   * 
+   * This is called when the Monaco diff tab is activated to ensure:
+   * 1. Branch information from git/recentlog is current (branches can change frequently)
+   * 2. The diff content is synchronized with the latest repository state
+   * 3. Users always see up-to-date information without manual refresh
+   */
+  refreshDiffView() {
+    // First refresh the range picker to get updated branch information
+    const rangePicker = this.shadowRoot?.querySelector('sketch-diff-range-picker');
+    if (rangePicker) {
+      (rangePicker as any).loadCommits();
+    }
+    
+    if (this.commit) {
+      this.currentRange = { type: 'single', commit: this.commit };
+    }
+    
+    // Then reload diff data based on the current range
+    this.loadDiffData();
+  }
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    "sketch-diff2-view": SketchDiff2View;
+  }
+}
diff --git a/webui/src/web-components/sketch-monaco-view.ts b/webui/src/web-components/sketch-monaco-view.ts
new file mode 100644
index 0000000..590ec5e
--- /dev/null
+++ b/webui/src/web-components/sketch-monaco-view.ts
@@ -0,0 +1,1121 @@
+import { css, html, LitElement } from "lit";
+import { customElement, property, state } from "lit/decorators.js";
+import { createRef, Ref, ref } from "lit/directives/ref.js";
+
+// See https://rodydavis.com/posts/lit-monaco-editor for some ideas.
+
+import * as monaco from "monaco-editor";
+
+// Configure Monaco to use local workers with correct relative paths
+
+// Define Monaco CSS styles as a string constant
+const monacoStyles = `
+  /* Import Monaco editor styles */
+  @import url('./static/monaco/min/vs/editor/editor.main.css');
+  
+  /* Codicon font is now defined globally in sketch-app-shell.css */
+  
+  /* Custom Monaco styles */
+  .monaco-editor {
+    width: 100%;
+    height: 100%;
+  }
+  
+  /* Custom font stack - ensure we have good monospace fonts */
+  .monaco-editor .view-lines,
+  .monaco-editor .view-line,
+  .monaco-editor-pane,
+  .monaco-editor .inputarea {
+    font-family: "Menlo", "Monaco", "Consolas", "Courier New", monospace !important;
+    font-size: 13px !important;
+    font-feature-settings: "liga" 0, "calt" 0 !important;
+    line-height: 1.5 !important;
+  }
+  
+  /* Ensure light theme colors */
+  .monaco-editor, .monaco-editor-background, .monaco-editor .inputarea.ime-input {
+    background-color: var(--monaco-editor-bg, #ffffff) !important;
+  }
+  
+  .monaco-editor .margin {
+    background-color: var(--monaco-editor-margin, #f5f5f5) !important;
+  }
+`;
+
+// Configure Monaco to use local workers with correct relative paths
+// Monaco looks for this global configuration to determine how to load web workers
+// @ts-ignore - MonacoEnvironment is added to the global scope at runtime
+self.MonacoEnvironment = {
+  getWorkerUrl: function (_moduleId, label) {
+    if (label === "json") {
+      return "./static/json.worker.js";
+    }
+    if (label === "css" || label === "scss" || label === "less") {
+      return "./static/css.worker.js";
+    }
+    if (label === "html" || label === "handlebars" || label === "razor") {
+      return "./static/html.worker.js";
+    }
+    if (label === "typescript" || label === "javascript") {
+      return "./static/ts.worker.js";
+    }
+    return "./static/editor.worker.js";
+  },
+};
+
+@customElement("sketch-monaco-view")
+export class CodeDiffEditor extends LitElement {
+  // Editable state
+  @property({ type: Boolean, attribute: "editable-right" })
+  editableRight?: boolean;
+  private container: Ref<HTMLElement> = createRef();
+  editor?: monaco.editor.IStandaloneDiffEditor;
+  @property() language?: string = "javascript";
+
+  // Save state properties
+  @state() private saveState: "idle" | "modified" | "saving" | "saved" = "idle";
+  @state() private debounceSaveTimeout: number | null = null;
+  @state() private lastSavedContent: string = "";
+  @property() originalCode?: string = "// Original code here";
+  @property() modifiedCode?: string = "// Modified code here";
+  @property() originalFilename?: string = "original.js";
+  @property() modifiedFilename?: string = "modified.js";
+
+  /* Selected text and indicators */
+  @state()
+  private selectedText: string | null = null;
+
+  @state()
+  private selectionRange: {
+    startLineNumber: number;
+    startColumn: number;
+    endLineNumber: number;
+    endColumn: number;
+  } | null = null;
+
+  @state()
+  private showCommentIndicator: boolean = false;
+
+  @state()
+  private indicatorPosition: { top: number; left: number } = {
+    top: 0,
+    left: 0,
+  };
+
+  @state()
+  private showCommentBox: boolean = false;
+
+  @state()
+  private commentText: string = "";
+
+  @state()
+  private activeEditor: "original" | "modified" = "modified"; // Track which editor is active
+
+  // Custom event to request save action from external components
+  private requestSave() {
+    if (this.saveState !== "modified") return;
+
+    this.saveState = "saving";
+
+    // Get current content from modified editor
+    const modifiedContent = this.modifiedModel?.getValue() || "";
+
+    // Create and dispatch the save event
+    const saveEvent = new CustomEvent("monaco-save", {
+      detail: {
+        path: this.modifiedFilename,
+        content: modifiedContent,
+      },
+      bubbles: true,
+      composed: true,
+    });
+
+    this.dispatchEvent(saveEvent);
+  }
+
+  // Method to be called from parent when save is complete
+  public notifySaveComplete(success: boolean) {
+    if (success) {
+      this.saveState = "saved";
+      // Update last saved content
+      this.lastSavedContent = this.modifiedModel?.getValue() || "";
+      // Reset to idle after a delay
+      setTimeout(() => {
+        this.saveState = "idle";
+      }, 2000);
+    } else {
+      // Return to modified state on error
+      this.saveState = "modified";
+    }
+  }
+
+  // Setup content change listener for debounced save
+  private setupContentChangeListener() {
+    if (!this.editor || !this.editableRight) return;
+
+    const modifiedEditor = this.editor.getModifiedEditor();
+    if (!modifiedEditor || !modifiedEditor.getModel()) return;
+
+    // Store initial content
+    this.lastSavedContent = modifiedEditor.getModel()!.getValue();
+
+    // Listen for content changes
+    modifiedEditor.getModel()!.onDidChangeContent(() => {
+      const currentContent = modifiedEditor.getModel()!.getValue();
+
+      // Check if content has actually changed from last saved state
+      if (currentContent !== this.lastSavedContent) {
+        this.saveState = "modified";
+
+        // Debounce save request
+        if (this.debounceSaveTimeout) {
+          window.clearTimeout(this.debounceSaveTimeout);
+        }
+
+        this.debounceSaveTimeout = window.setTimeout(() => {
+          this.requestSave();
+          this.debounceSaveTimeout = null;
+        }, 1000); // 1 second debounce
+      }
+    });
+  }
+
+  static styles = css`
+    /* Save indicator styles */
+    .save-indicator {
+      position: absolute;
+      top: 4px;
+      right: 4px;
+      padding: 3px 8px;
+      border-radius: 3px;
+      font-size: 12px;
+      font-family: system-ui, sans-serif;
+      color: white;
+      z-index: 100;
+      opacity: 0.9;
+      pointer-events: none;
+      transition: opacity 0.3s ease;
+    }
+
+    .save-indicator.modified {
+      background-color: #f0ad4e;
+    }
+
+    .save-indicator.saving {
+      background-color: #5bc0de;
+    }
+
+    .save-indicator.saved {
+      background-color: #5cb85c;
+    }
+
+    /* Editor host styles */
+    :host {
+      --editor-width: 100%;
+      --editor-height: 100%;
+      display: flex;
+      flex: 1;
+      min-height: 0; /* Critical for flex layout */
+      position: relative; /* Establish positioning context */
+      height: 100%; /* Take full height */
+      width: 100%; /* Take full width */
+    }
+    main {
+      width: var(--editor-width);
+      height: var(--editor-height);
+      border: 1px solid #e0e0e0;
+      flex: 1;
+      min-height: 300px; /* Ensure a minimum height for the editor */
+      position: absolute; /* Absolute positioning to take full space */
+      top: 0;
+      left: 0;
+      right: 0;
+      bottom: 0;
+    }
+
+    /* Comment indicator and box styles */
+    .comment-indicator {
+      position: fixed;
+      background-color: rgba(66, 133, 244, 0.9);
+      color: white;
+      border-radius: 3px;
+      padding: 3px 8px;
+      font-size: 12px;
+      cursor: pointer;
+      box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
+      z-index: 10000;
+      animation: fadeIn 0.2s ease-in-out;
+      display: flex;
+      align-items: center;
+      gap: 4px;
+      pointer-events: all;
+    }
+
+    .comment-indicator:hover {
+      background-color: rgba(66, 133, 244, 1);
+    }
+
+    .comment-indicator span {
+      line-height: 1;
+    }
+
+    .comment-box {
+      position: fixed;
+      background-color: white;
+      border: 1px solid #ddd;
+      border-radius: 4px;
+      box-shadow: 0 3px 10px rgba(0, 0, 0, 0.15);
+      padding: 12px;
+      z-index: 10001;
+      width: 350px;
+      animation: fadeIn 0.2s ease-in-out;
+      max-height: 80vh;
+      overflow-y: auto;
+    }
+
+    .comment-box-header {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      margin-bottom: 8px;
+    }
+
+    .comment-box-header h3 {
+      margin: 0;
+      font-size: 14px;
+      font-weight: 500;
+    }
+
+    .close-button {
+      background: none;
+      border: none;
+      cursor: pointer;
+      font-size: 16px;
+      color: #666;
+      padding: 2px 6px;
+    }
+
+    .close-button:hover {
+      color: #333;
+    }
+
+    .selected-text-preview {
+      background-color: #f5f5f5;
+      border: 1px solid #eee;
+      border-radius: 3px;
+      padding: 8px;
+      margin-bottom: 10px;
+      font-family: monospace;
+      font-size: 12px;
+      max-height: 80px;
+      overflow-y: auto;
+      white-space: pre-wrap;
+      word-break: break-all;
+    }
+
+    .comment-textarea {
+      width: 100%;
+      min-height: 80px;
+      padding: 8px;
+      border: 1px solid #ddd;
+      border-radius: 3px;
+      resize: vertical;
+      font-family: inherit;
+      margin-bottom: 10px;
+      box-sizing: border-box;
+    }
+
+    .comment-actions {
+      display: flex;
+      justify-content: flex-end;
+      gap: 8px;
+    }
+
+    .comment-actions button {
+      padding: 6px 12px;
+      border-radius: 3px;
+      cursor: pointer;
+      font-size: 12px;
+    }
+
+    .cancel-button {
+      background-color: transparent;
+      border: 1px solid #ddd;
+    }
+
+    .cancel-button:hover {
+      background-color: #f5f5f5;
+    }
+
+    .submit-button {
+      background-color: #4285f4;
+      color: white;
+      border: none;
+    }
+
+    .submit-button:hover {
+      background-color: #3367d6;
+    }
+
+    @keyframes fadeIn {
+      from {
+        opacity: 0;
+      }
+      to {
+        opacity: 1;
+      }
+    }
+  `;
+
+  render() {
+    return html`
+      <style>
+        ${monacoStyles}
+      </style>
+      <main ${ref(this.container)}></main>
+
+      <!-- Save indicator - shown when editing -->
+      ${this.editableRight && this.saveState !== "idle"
+        ? html`
+            <div class="save-indicator ${this.saveState}">
+              ${this.saveState === "modified"
+                ? "Modified..."
+                : this.saveState === "saving"
+                  ? "Saving..."
+                  : this.saveState === "saved"
+                    ? "Saved"
+                    : ""}
+            </div>
+          `
+        : ""}
+
+      <!-- Comment indicator - shown when text is selected -->
+      ${this.showCommentIndicator
+        ? html`
+            <div
+              class="comment-indicator"
+              style="top: ${this.indicatorPosition.top}px; left: ${this
+                .indicatorPosition.left}px;"
+              @click="${this.handleIndicatorClick}"
+              @mouseenter="${() => {
+                this._isHovering = true;
+              }}"
+              @mouseleave="${() => {
+                this._isHovering = false;
+              }}"
+            >
+              <span>💬</span>
+              <span>Add comment</span>
+            </div>
+          `
+        : ""}
+
+      <!-- Comment box - shown when indicator is clicked -->
+      ${this.showCommentBox
+        ? html`
+            <div
+              class="comment-box"
+              style="${this.calculateCommentBoxPosition()}"
+              @mouseenter="${() => {
+                this._isHovering = true;
+              }}"
+              @mouseleave="${() => {
+                this._isHovering = false;
+              }}"
+            >
+              <div class="comment-box-header">
+                <h3>Add comment</h3>
+                <button class="close-button" @click="${this.closeCommentBox}">
+                  ×
+                </button>
+              </div>
+              <div class="selected-text-preview">${this.selectedText}</div>
+              <textarea
+                class="comment-textarea"
+                placeholder="Type your comment here..."
+                .value="${this.commentText}"
+                @input="${this.handleCommentInput}"
+              ></textarea>
+              <div class="comment-actions">
+                <button class="cancel-button" @click="${this.closeCommentBox}">
+                  Cancel
+                </button>
+                <button class="submit-button" @click="${this.submitComment}">
+                  Submit
+                </button>
+              </div>
+            </div>
+          `
+        : ""}
+    `;
+  }
+
+  /**
+   * Calculate the optimal position for the comment box to keep it in view
+   */
+  private calculateCommentBoxPosition(): string {
+    // Get viewport dimensions
+    const viewportWidth = window.innerWidth;
+    const viewportHeight = window.innerHeight;
+
+    // Default position (below indicator)
+    let top = this.indicatorPosition.top + 30;
+    let left = this.indicatorPosition.left;
+
+    // Estimated box dimensions
+    const boxWidth = 350;
+    const boxHeight = 300;
+
+    // Check if box would go off the right edge
+    if (left + boxWidth > viewportWidth) {
+      left = viewportWidth - boxWidth - 20; // Keep 20px margin
+    }
+
+    // Check if box would go off the bottom
+    const bottomSpace = viewportHeight - top;
+    if (bottomSpace < boxHeight) {
+      // Not enough space below, try to position above if possible
+      if (this.indicatorPosition.top > boxHeight) {
+        // Position above the indicator
+        top = this.indicatorPosition.top - boxHeight - 10;
+      } else {
+        // Not enough space above either, position at top of viewport with margin
+        top = 10;
+      }
+    }
+
+    // Ensure box is never positioned off-screen
+    top = Math.max(10, top);
+    left = Math.max(10, left);
+
+    return `top: ${top}px; left: ${left}px;`;
+  }
+
+  setOriginalCode(code: string, filename?: string) {
+    this.originalCode = code;
+    if (filename) {
+      this.originalFilename = filename;
+    }
+
+    // Update the model if the editor is initialized
+    if (this.editor) {
+      const model = this.editor.getOriginalEditor().getModel();
+      if (model) {
+        model.setValue(code);
+        if (filename) {
+          monaco.editor.setModelLanguage(
+            model,
+            this.getLanguageForFile(filename),
+          );
+        }
+      }
+    }
+  }
+
+  setModifiedCode(code: string, filename?: string) {
+    this.modifiedCode = code;
+    if (filename) {
+      this.modifiedFilename = filename;
+    }
+
+    // Update the model if the editor is initialized
+    if (this.editor) {
+      const model = this.editor.getModifiedEditor().getModel();
+      if (model) {
+        model.setValue(code);
+        if (filename) {
+          monaco.editor.setModelLanguage(
+            model,
+            this.getLanguageForFile(filename),
+          );
+        }
+      }
+    }
+  }
+
+  private getLanguageForFile(filename: string): string {
+    const extension = filename.split(".").pop()?.toLowerCase() || "";
+    const langMap: Record<string, string> = {
+      js: "javascript",
+      ts: "typescript",
+      py: "python",
+      html: "html",
+      css: "css",
+      json: "json",
+      md: "markdown",
+      go: "go",
+    };
+    return langMap[extension] || this.language || "plaintext";
+  }
+
+  /**
+   * Update editor options
+   */
+  setOptions(value: monaco.editor.IDiffEditorConstructionOptions) {
+    if (this.editor) {
+      this.editor.updateOptions(value);
+    }
+  }
+
+  /**
+   * Toggle hideUnchangedRegions feature
+   */
+  toggleHideUnchangedRegions(enabled: boolean) {
+    if (this.editor) {
+      this.editor.updateOptions({
+        hideUnchangedRegions: {
+          enabled: enabled,
+          contextLineCount: 3,
+          minimumLineCount: 3,
+          revealLineCount: 10,
+        },
+      });
+    }
+  }
+
+  // Models for the editor
+  private originalModel?: monaco.editor.ITextModel;
+  private modifiedModel?: monaco.editor.ITextModel;
+
+  private initializeEditor() {
+    try {
+      // Disable semantic validation globally for TypeScript/JavaScript
+      monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
+        noSemanticValidation: true
+      });
+      monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({
+        noSemanticValidation: true
+      });
+      
+      // First time initialization
+      if (!this.editor) {
+        // Create the diff editor only once
+        this.editor = monaco.editor.createDiffEditor(this.container.value!, {
+          automaticLayout: true,
+          // Make it read-only by default
+        // We'll adjust individual editor settings after creation
+        readOnly: true,
+          theme: "vs", // Always use light mode
+          renderSideBySide: true,
+          ignoreTrimWhitespace: false,
+          // Focus on the differences by hiding unchanged regions
+          hideUnchangedRegions: {
+            enabled: true, // Enable the feature
+            contextLineCount: 3, // Show 3 lines of context around each difference
+            minimumLineCount: 3, // Hide regions only when they're at least 3 lines
+            revealLineCount: 10, // Show 10 lines when expanding a hidden region
+          },
+        });
+
+        console.log("Monaco diff editor created");
+
+        // Set up selection change event listeners for both editors
+        this.setupSelectionChangeListeners();
+
+        // If this is an editable view, set the correct read-only state for each editor
+        if (this.editableRight) {
+          // Make sure the original editor is always read-only
+          this.editor.getOriginalEditor().updateOptions({ readOnly: true });
+          // Make sure the modified editor is editable
+          this.editor.getModifiedEditor().updateOptions({ readOnly: false });
+        }
+      }
+
+      // Create or update models
+      this.updateModels();
+          // Set up content change listener
+          this.setupContentChangeListener();
+
+      // Force layout recalculation after a short delay
+      // This ensures the editor renders properly, especially with single files
+      setTimeout(() => {
+        if (this.editor) {
+          this.editor.layout();
+          console.log("Monaco diff editor layout updated");
+        }
+      }, 50);
+
+      console.log("Monaco diff editor initialized");
+    } catch (error) {
+      console.error("Error initializing Monaco editor:", error);
+    }
+  }
+
+  /**
+   * Sets up event listeners for text selection in both editors.
+   * This enables showing the comment UI when users select text and
+   * manages the visibility of UI components based on user interactions.
+   */
+  private setupSelectionChangeListeners() {
+    try {
+      if (!this.editor) {
+        console.log("Editor not available for setting up listeners");
+        return;
+      }
+
+      // Get both original and modified editors
+      const originalEditor = this.editor.getOriginalEditor();
+      const modifiedEditor = this.editor.getModifiedEditor();
+
+      if (!originalEditor || !modifiedEditor) {
+        console.log("Original or modified editor not available");
+        return;
+      }
+
+      // Add selection change listener to original editor
+      originalEditor.onDidChangeCursorSelection((e) => {
+        this.handleSelectionChange(e, originalEditor, "original");
+      });
+
+      // Add selection change listener to modified editor
+      modifiedEditor.onDidChangeCursorSelection((e) => {
+        this.handleSelectionChange(e, modifiedEditor, "modified");
+      });
+
+      // Create a debounced function for mouse move handling
+      let mouseMoveTimeout: number | null = null;
+      const handleMouseMove = () => {
+        // Clear any existing timeout
+        if (mouseMoveTimeout) {
+          window.clearTimeout(mouseMoveTimeout);
+        }
+
+        // If there's text selected and we're not showing the comment box, keep indicator visible
+        if (this.selectedText && !this.showCommentBox) {
+          this.showCommentIndicator = true;
+          this.requestUpdate();
+        }
+
+        // Set a new timeout to hide the indicator after a delay
+        mouseMoveTimeout = window.setTimeout(() => {
+          // Only hide if we're not showing the comment box and not actively hovering
+          if (!this.showCommentBox && !this._isHovering) {
+            this.showCommentIndicator = false;
+            this.requestUpdate();
+          }
+        }, 2000); // Hide after 2 seconds of inactivity
+      };
+
+      // Add mouse move listeners with debouncing
+      originalEditor.onMouseMove(() => handleMouseMove());
+      modifiedEditor.onMouseMove(() => handleMouseMove());
+
+      // Track hover state over the indicator and comment box
+      this._isHovering = false;
+
+      // Use the global document click handler to detect clicks outside
+      this._documentClickHandler = (e: MouseEvent) => {
+        try {
+          const target = e.target as HTMLElement;
+          const isIndicator =
+            target.matches(".comment-indicator") ||
+            !!target.closest(".comment-indicator");
+          const isCommentBox =
+            target.matches(".comment-box") || !!target.closest(".comment-box");
+
+          // If click is outside our UI elements
+          if (!isIndicator && !isCommentBox) {
+            // If we're not showing the comment box, hide the indicator
+            if (!this.showCommentBox) {
+              this.showCommentIndicator = false;
+              this.requestUpdate();
+            }
+          }
+        } catch (error) {
+          console.error("Error in document click handler:", error);
+        }
+      };
+
+      // Add the document click listener
+      document.addEventListener("click", this._documentClickHandler);
+
+      console.log("Selection change listeners set up successfully");
+    } catch (error) {
+      console.error("Error setting up selection listeners:", error);
+    }
+  }
+
+  // Track mouse hover state
+  private _isHovering = false;
+
+  // Store document click handler for cleanup
+  private _documentClickHandler: ((e: MouseEvent) => void) | null = null;
+
+  /**
+   * Handle selection change events from either editor
+   */
+  private handleSelectionChange(
+    e: monaco.editor.ICursorSelectionChangedEvent,
+    editor: monaco.editor.IStandaloneCodeEditor,
+    editorType: "original" | "modified",
+  ) {
+    try {
+      // If we're not making a selection (just moving cursor), do nothing
+      if (e.selection.isEmpty()) {
+        // Don't hide indicator or box if already shown
+        if (!this.showCommentBox) {
+          this.selectedText = null;
+          this.selectionRange = null;
+          this.showCommentIndicator = false;
+        }
+        return;
+      }
+
+      // Get selected text
+      const model = editor.getModel();
+      if (!model) {
+        console.log("No model available for selection");
+        return;
+      }
+
+      // Make sure selection is within valid range
+      const lineCount = model.getLineCount();
+      if (
+        e.selection.startLineNumber > lineCount ||
+        e.selection.endLineNumber > lineCount
+      ) {
+        console.log("Selection out of bounds");
+        return;
+      }
+
+      // Store which editor is active
+      this.activeEditor = editorType;
+
+      // Store selection range
+      this.selectionRange = {
+        startLineNumber: e.selection.startLineNumber,
+        startColumn: e.selection.startColumn,
+        endLineNumber: e.selection.endLineNumber,
+        endColumn: e.selection.endColumn,
+      };
+
+      try {
+        // Get the selected text
+        this.selectedText = model.getValueInRange(e.selection);
+      } catch (error) {
+        console.error("Error getting selected text:", error);
+        return;
+      }
+
+      // If there's selected text, show the indicator
+      if (this.selectedText && this.selectedText.trim() !== "") {
+        // Calculate indicator position safely
+        try {
+          // Use the editor's DOM node as positioning context
+          const editorDomNode = editor.getDomNode();
+          if (!editorDomNode) {
+            console.log("No editor DOM node available");
+            return;
+          }
+
+          // Get position from editor
+          const position = {
+            lineNumber: e.selection.endLineNumber,
+            column: e.selection.endColumn,
+          };
+
+          // Use editor's built-in method for coordinate conversion
+          const selectionCoords = editor.getScrolledVisiblePosition(position);
+
+          if (selectionCoords) {
+            // Get accurate DOM position for the selection end
+            const editorRect = editorDomNode.getBoundingClientRect();
+
+            // Calculate the actual screen position
+            const screenLeft = editorRect.left + selectionCoords.left;
+            const screenTop = editorRect.top + selectionCoords.top;
+
+            // Store absolute screen coordinates
+            this.indicatorPosition = {
+              top: screenTop,
+              left: screenLeft + 10, // Slight offset
+            };
+
+            // Check window boundaries to ensure the indicator stays visible
+            const viewportWidth = window.innerWidth;
+            const viewportHeight = window.innerHeight;
+
+            // Keep indicator within viewport bounds
+            if (this.indicatorPosition.left + 150 > viewportWidth) {
+              this.indicatorPosition.left = viewportWidth - 160;
+            }
+
+            if (this.indicatorPosition.top + 40 > viewportHeight) {
+              this.indicatorPosition.top = viewportHeight - 50;
+            }
+
+            // Show the indicator
+            this.showCommentIndicator = true;
+
+            // Request an update to ensure UI reflects changes
+            this.requestUpdate();
+          }
+        } catch (error) {
+          console.error("Error positioning comment indicator:", error);
+        }
+      }
+    } catch (error) {
+      console.error("Error handling selection change:", error);
+    }
+  }
+
+  /**
+   * Handle click on the comment indicator
+   */
+  private handleIndicatorClick(e: Event) {
+    try {
+      e.stopPropagation();
+      e.preventDefault();
+
+      this.showCommentBox = true;
+      this.commentText = ""; // Reset comment text
+
+      // Don't hide the indicator while comment box is shown
+      this.showCommentIndicator = true;
+
+      // Ensure UI updates
+      this.requestUpdate();
+    } catch (error) {
+      console.error("Error handling indicator click:", error);
+    }
+  }
+
+  /**
+   * Handle changes to the comment text
+   */
+  private handleCommentInput(e: Event) {
+    const target = e.target as HTMLTextAreaElement;
+    this.commentText = target.value;
+  }
+
+  /**
+   * Close the comment box
+   */
+  private closeCommentBox() {
+    this.showCommentBox = false;
+    // Also hide the indicator
+    this.showCommentIndicator = false;
+  }
+
+  /**
+   * Submit the comment
+   */
+  private submitComment() {
+    try {
+      if (!this.selectedText || !this.commentText) {
+        console.log("Missing selected text or comment");
+        return;
+      }
+
+      // Get the correct filename based on active editor
+      const fileContext =
+        this.activeEditor === "original"
+          ? this.originalFilename || "Original file"
+          : this.modifiedFilename || "Modified file";
+
+      // Include editor info to make it clear which version was commented on
+      const editorLabel =
+        this.activeEditor === "original" ? "[Original]" : "[Modified]";
+
+      // Format the comment in a readable way
+      const formattedComment = `\`\`\`\n${fileContext} ${editorLabel}:\n${this.selectedText}\n\`\`\`\n\n${this.commentText}`;
+
+      // Close UI before dispatching to prevent interaction conflicts
+      this.closeCommentBox();
+
+      // Use setTimeout to ensure the UI has updated before sending the event
+      setTimeout(() => {
+        try {
+          // Dispatch a custom event with the comment details
+          const event = new CustomEvent("monaco-comment", {
+            detail: {
+              fileContext,
+              selectedText: this.selectedText,
+              commentText: this.commentText,
+              formattedComment,
+              selectionRange: this.selectionRange,
+              activeEditor: this.activeEditor,
+            },
+            bubbles: true,
+            composed: true,
+          });
+
+          this.dispatchEvent(event);
+        } catch (error) {
+          console.error("Error dispatching comment event:", error);
+        }
+      }, 0);
+    } catch (error) {
+      console.error("Error submitting comment:", error);
+      this.closeCommentBox();
+    }
+  }
+
+  private updateModels() {
+    try {
+      // Get language based on filename
+      const originalLang = this.getLanguageForFile(this.originalFilename || "");
+      const modifiedLang = this.getLanguageForFile(this.modifiedFilename || "");
+
+      // Always create new models with unique URIs based on timestamp to avoid conflicts
+      const timestamp = new Date().getTime();
+      // TODO: Could put filename in these URIs; unclear how they're used right now.
+      const originalUri = monaco.Uri.parse(
+        `file:///original-${timestamp}.${originalLang}`,
+      );
+      const modifiedUri = monaco.Uri.parse(
+        `file:///modified-${timestamp}.${modifiedLang}`,
+      );
+
+      // Store references to old models
+      const oldOriginalModel = this.originalModel;
+      const oldModifiedModel = this.modifiedModel;
+
+      // Nullify instance variables to prevent accidental use
+      this.originalModel = undefined;
+      this.modifiedModel = undefined;
+
+      // Clear the editor model first to release Monaco's internal references
+      if (this.editor) {
+        this.editor.setModel(null);
+      }
+
+      // Now it's safe to dispose the old models
+      if (oldOriginalModel) {
+        oldOriginalModel.dispose();
+      }
+
+      if (oldModifiedModel) {
+        oldModifiedModel.dispose();
+      }
+
+      // Create new models
+      this.originalModel = monaco.editor.createModel(
+        this.originalCode || "",
+        originalLang,
+        originalUri,
+      );
+
+      this.modifiedModel = monaco.editor.createModel(
+        this.modifiedCode || "",
+        modifiedLang,
+        modifiedUri,
+      );
+
+      // Set the new models on the editor
+      if (this.editor) {
+        this.editor.setModel({
+          original: this.originalModel,
+          modified: this.modifiedModel,
+        });
+      }
+      this.setupContentChangeListener();
+    } catch (error) {
+      console.error("Error updating Monaco models:", error);
+    }
+  }
+
+  updated(changedProperties: Map<string, any>) {
+    // If any relevant properties changed, just update the models
+    if (
+      changedProperties.has("originalCode") ||
+      changedProperties.has("modifiedCode") ||
+      changedProperties.has("originalFilename") ||
+      changedProperties.has("modifiedFilename") ||
+      changedProperties.has("editableRight")
+    ) {
+      if (this.editor) {
+        this.updateModels();
+
+        // Force layout recalculation after model updates
+        setTimeout(() => {
+          if (this.editor) {
+            this.editor.layout();
+          }
+        }, 50);
+      } else {
+        // If the editor isn't initialized yet but we received content,
+        // initialize it now
+        this.initializeEditor();
+      }
+    }
+  }
+
+  // Add resize observer to ensure editor resizes when container changes
+  firstUpdated() {
+    // Initialize the editor
+    this.initializeEditor();
+
+    // Create a ResizeObserver to monitor container size changes
+    if (window.ResizeObserver) {
+      const resizeObserver = new ResizeObserver(() => {
+        if (this.editor) {
+          this.editor.layout();
+        }
+      });
+
+      // Start observing the container
+      if (this.container.value) {
+        resizeObserver.observe(this.container.value);
+      }
+
+      // Store the observer for cleanup
+      this._resizeObserver = resizeObserver;
+    }
+
+    // If editable, set up edit mode and content change listener
+    if (this.editableRight && this.editor) {
+      // Ensure the original editor is read-only
+      this.editor.getOriginalEditor().updateOptions({ readOnly: true });
+      // Ensure the modified editor is editable
+      this.editor.getModifiedEditor().updateOptions({ readOnly: false });
+    }
+  }
+
+  private _resizeObserver: ResizeObserver | null = null;
+
+  disconnectedCallback() {
+    super.disconnectedCallback();
+
+    try {
+      // Clean up resources when element is removed
+      if (this.editor) {
+        this.editor.dispose();
+        this.editor = undefined;
+      }
+
+      // Dispose models to prevent memory leaks
+      if (this.originalModel) {
+        this.originalModel.dispose();
+        this.originalModel = undefined;
+      }
+
+      if (this.modifiedModel) {
+        this.modifiedModel.dispose();
+        this.modifiedModel = undefined;
+      }
+
+      // Clean up resize observer
+      if (this._resizeObserver) {
+        this._resizeObserver.disconnect();
+        this._resizeObserver = null;
+      }
+
+      // Remove document click handler if set
+      if (this._documentClickHandler) {
+        document.removeEventListener("click", this._documentClickHandler);
+        this._documentClickHandler = null;
+      }
+    } catch (error) {
+      console.error("Error in disconnectedCallback:", error);
+    }
+  }
+
+  // disconnectedCallback implementation is defined below
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    "sketch-monaco-view": CodeDiffEditor;
+  }
+}
diff --git a/webui/src/web-components/sketch-timeline.ts b/webui/src/web-components/sketch-timeline.ts
index 3870e39..1b27570 100644
--- a/webui/src/web-components/sketch-timeline.ts
+++ b/webui/src/web-components/sketch-timeline.ts
@@ -53,6 +53,7 @@
       padding: 0 15px;
       box-sizing: border-box;
       overflow-x: hidden;
+      flex: 1;
     }
 
     /* Chat-like timeline styles */
@@ -69,6 +70,7 @@
       overflow-x: hidden;
       padding-left: 1em;
       max-width: 100%;
+      width: 100%;
     }
     #jump-to-latest {
       display: none;
@@ -94,7 +96,8 @@
     /* Welcome box styles for the empty chat state */
     .welcome-box {
       margin: 2rem auto;
-      max-width: 80%;
+      max-width: 90%;
+      width: 90%;
       padding: 2rem;
       border: 2px solid #e0e0e0;
       border-radius: 8px;
diff --git a/webui/src/web-components/sketch-view-mode-select.test.ts b/webui/src/web-components/sketch-view-mode-select.test.ts
index 79cdd8d..58cf535 100644
--- a/webui/src/web-components/sketch-view-mode-select.test.ts
+++ b/webui/src/web-components/sketch-view-mode-select.test.ts
@@ -35,11 +35,11 @@
   });
 
   // Click the diff button
-  await component.locator("#showDiffButton").click();
+  await component.locator("#showDiff2Button").click();
 
   // Wait for the event and check its details
   const detail: any = await eventPromise;
-  expect(detail.mode).toBe("diff");
+  expect(detail.mode).toBe("diff2");
 });
 
 test("updates the active mode when receiving update-active-mode event", async ({
@@ -56,7 +56,7 @@
   // Dispatch the update-active-mode event
   await component.evaluate((el) => {
     const updateEvent = new CustomEvent("update-active-mode", {
-      detail: { mode: "diff" },
+      detail: { mode: "diff2" },
       bubbles: true,
     });
     el.dispatchEvent(updateEvent);
@@ -66,10 +66,10 @@
   activeMode = await component.evaluate(
     (el: SketchViewModeSelect) => el.activeMode,
   );
-  expect(activeMode).toBe("diff");
+  expect(activeMode).toBe("diff2");
 
   // Check that the diff button is now active
-  await expect(component.locator("#showDiffButton.active")).toBeVisible();
+  await expect(component.locator("#showDiff2Button.active")).toBeVisible();
 });
 
 test("correctly marks the active button based on mode", async ({ mount }) => {
@@ -86,6 +86,6 @@
   await expect(
     component.locator("#showConversationButton.active"),
   ).not.toBeVisible();
-  await expect(component.locator("#showDiffButton.active")).not.toBeVisible();
+  await expect(component.locator("#showDiff2Button.active")).not.toBeVisible();
   await expect(component.locator("#showChartsButton.active")).not.toBeVisible();
 });
diff --git a/webui/src/web-components/sketch-view-mode-select.ts b/webui/src/web-components/sketch-view-mode-select.ts
index abfe551..df84a87 100644
--- a/webui/src/web-components/sketch-view-mode-select.ts
+++ b/webui/src/web-components/sketch-view-mode-select.ts
@@ -6,7 +6,7 @@
 export class SketchViewModeSelect extends LitElement {
   // Current active mode
   @property()
-  activeMode: "chat" | "diff" | "terminal" = "chat";
+  activeMode: "chat" | "diff" | "diff2" | "terminal" = "chat";
   // Header bar: view mode buttons
 
   static styles = css`
@@ -87,7 +87,7 @@
   /**
    * Handle view mode button clicks
    */
-  private _handleViewModeClick(mode: "chat" | "diff" | "terminal") {
+  private _handleViewModeClick(mode: "chat" | "diff" | "diff2" | "terminal") {
     // Dispatch a custom event to notify the app shell to change the view
     const event = new CustomEvent("view-mode-select", {
       detail: { mode },
@@ -131,15 +131,15 @@
           <span>Chat</span>
         </button>
         <button
-          id="showDiffButton"
-          class="tab-btn ${this.activeMode === "diff" ? "active" : ""}"
+          id="showDiff2Button"
+          class="tab-btn ${this.activeMode === "diff2" ? "active" : ""}"
           title="Diff View"
-          @click=${() => this._handleViewModeClick("diff")}
+          @click=${() => this._handleViewModeClick("diff2")}
         >
           <span class="tab-icon">±</span>
           <span>Diff</span>
         </button>
-
+        
         <button
           id="showTerminalButton"
           class="tab-btn ${this.activeMode === "terminal" ? "active" : ""}"
diff --git a/webui/vite.config.mts b/webui/vite.config.mts
index 9765931..b212792 100644
--- a/webui/vite.config.mts
+++ b/webui/vite.config.mts
@@ -11,11 +11,13 @@
       include: ["./src/**/*.ts"],
       presets: [presets.lit],
     }),
-    // Custom plugin for handling the root path redirect
+    // Custom plugin for handling the root path redirect and Monaco workers
     {
       name: "configure-server",
       configureServer(server) {
+        // Handle root redirects and Monaco worker proxying
         server.middlewares.use((req, res, next) => {
+          // Root redirect
           if (req.url === "/") {
             res.writeHead(302, {
               Location: "/src/web-components/demo/index.html",
@@ -23,6 +25,74 @@
             res.end();
             return;
           }
+
+          // Monaco worker and asset mapping
+          // This ensures the development paths match the production paths
+
+          // Handle worker URLs
+          if (req.url?.startsWith("/static/editor.worker.js")) {
+            const workerPath =
+              "/node_modules/monaco-editor/esm/vs/editor/editor.worker.js";
+            res.writeHead(302, { Location: workerPath });
+            res.end();
+            return;
+          }
+
+          if (req.url?.startsWith("/static/json.worker.js")) {
+            const workerPath =
+              "/node_modules/monaco-editor/esm/vs/language/json/json.worker.js";
+            res.writeHead(302, { Location: workerPath });
+            res.end();
+            return;
+          }
+
+          if (req.url?.startsWith("/static/css.worker.js")) {
+            const workerPath =
+              "/node_modules/monaco-editor/esm/vs/language/css/css.worker.js";
+            res.writeHead(302, { Location: workerPath });
+            res.end();
+            return;
+          }
+
+          if (req.url?.startsWith("/static/html.worker.js")) {
+            const workerPath =
+              "/node_modules/monaco-editor/esm/vs/language/html/html.worker.js";
+            res.writeHead(302, { Location: workerPath });
+            res.end();
+            return;
+          }
+
+          if (req.url?.startsWith("/static/ts.worker.js")) {
+            const workerPath =
+              "/node_modules/monaco-editor/esm/vs/language/typescript/ts.worker.js";
+            res.writeHead(302, { Location: workerPath });
+            res.end();
+            return;
+          }
+
+          // Handle CSS and font files
+          if (
+            req.url?.startsWith("/static/monaco/min/vs/editor/editor.main.css")
+          ) {
+            const cssPath =
+              "/node_modules/monaco-editor/min/vs/editor/editor.main.css";
+            res.writeHead(302, { Location: cssPath });
+            res.end();
+            return;
+          }
+
+          if (
+            req.url?.startsWith(
+              "/static/monaco/min/vs/base/browser/ui/codicons/codicon/codicon.ttf",
+            )
+          ) {
+            const fontPath =
+              "/node_modules/monaco-editor/min/vs/base/browser/ui/codicons/codicon/codicon.ttf";
+            res.writeHead(302, { Location: fontPath });
+            res.end();
+            return;
+          }
+
           next();
         });
       },
@@ -36,4 +106,40 @@
       allow: ["."],
     },
   },
+  // Configure Monaco Editor
+  resolve: {
+    alias: {
+      "monaco-editor": "monaco-editor/esm/vs/editor/editor.api",
+    },
+  },
+  optimizeDeps: {
+    include: ["monaco-editor"],
+  },
+  // Allow importing CSS as string
+  css: {
+    preprocessorOptions: {
+      additionalData: '@import "monaco-editor/min/vs/editor/editor.main.css";',
+    },
+  },
+  build: {
+    rollupOptions: {
+      output: {
+        manualChunks: {
+          "monaco-editor": ["monaco-editor"],
+          // Add separate chunks for Monaco editor workers
+          "monaco-editor-worker": ["monaco-editor/esm/vs/editor/editor.worker"],
+          "monaco-json-worker": [
+            "monaco-editor/esm/vs/language/json/json.worker",
+          ],
+          "monaco-css-worker": ["monaco-editor/esm/vs/language/css/css.worker"],
+          "monaco-html-worker": [
+            "monaco-editor/esm/vs/language/html/html.worker",
+          ],
+          "monaco-ts-worker": [
+            "monaco-editor/esm/vs/language/typescript/ts.worker",
+          ],
+        },
+      },
+    },
+  },
 });
