mirror of
https://github.com/aljazceru/opencode.git
synced 2025-12-24 03:04:21 +01:00
Enhance UI feedback and improve file diff visualization
- Improve diff display in permission dialogs with better formatting - Add visual indicators for focus changes in permission dialogs - Increase diagnostics timeout from 5 to 10 seconds - Fix write tool to show proper diffs for existing files - Update status component to properly handle messages 🤖 Generated with termai Co-Authored-By: termai <noreply@termai.io>
This commit is contained in:
@@ -72,6 +72,7 @@ func notifyLspOpenFile(ctx context.Context, filePath string, lsps map[string]*ls
|
||||
|
||||
// Create a notification handler that will signal when diagnostics are received
|
||||
handler := func(params json.RawMessage) {
|
||||
lsp.HandleDiagnostics(client, params)
|
||||
var diagParams protocol.PublishDiagnosticsParams
|
||||
if err := json.Unmarshal(params, &diagParams); err != nil {
|
||||
return
|
||||
@@ -103,8 +104,8 @@ func notifyLspOpenFile(ctx context.Context, filePath string, lsps map[string]*ls
|
||||
select {
|
||||
case <-diagChan:
|
||||
// Diagnostics received
|
||||
case <-time.After(5 * time.Second):
|
||||
// Timeout after 2 seconds - this is a fallback in case no diagnostics are published
|
||||
case <-time.After(10 * time.Second):
|
||||
// Timeout after 5 seconds - this is a fallback in case no diagnostics are published
|
||||
case <-ctx.Done():
|
||||
// Context cancelled
|
||||
}
|
||||
|
||||
@@ -303,23 +303,46 @@ func GenerateDiff(oldContent, newContent string) string {
|
||||
diffs = dmp.DiffCharsToLines(diffs, dmpStrings)
|
||||
diffs = dmp.DiffCleanupSemantic(diffs)
|
||||
buff := strings.Builder{}
|
||||
|
||||
// Add a header to make the diff more readable
|
||||
buff.WriteString("Changes:\n")
|
||||
|
||||
for _, diff := range diffs {
|
||||
text := diff.Text
|
||||
|
||||
switch diff.Type {
|
||||
case diffmatchpatch.DiffInsert:
|
||||
for line := range strings.SplitSeq(text, "\n") {
|
||||
for _, line := range strings.Split(text, "\n") {
|
||||
if line == "" {
|
||||
continue
|
||||
}
|
||||
_, _ = buff.WriteString("+ " + line + "\n")
|
||||
}
|
||||
case diffmatchpatch.DiffDelete:
|
||||
for line := range strings.SplitSeq(text, "\n") {
|
||||
for _, line := range strings.Split(text, "\n") {
|
||||
if line == "" {
|
||||
continue
|
||||
}
|
||||
_, _ = buff.WriteString("- " + line + "\n")
|
||||
}
|
||||
case diffmatchpatch.DiffEqual:
|
||||
if len(text) > 40 {
|
||||
_, _ = buff.WriteString(" " + text[:20] + "..." + text[len(text)-20:] + "\n")
|
||||
// Only show a small context for unchanged text
|
||||
lines := strings.Split(text, "\n")
|
||||
if len(lines) > 3 {
|
||||
// Show only first and last line of context with a separator
|
||||
if lines[0] != "" {
|
||||
_, _ = buff.WriteString(" " + lines[0] + "\n")
|
||||
}
|
||||
_, _ = buff.WriteString(" ...\n")
|
||||
if lines[len(lines)-1] != "" {
|
||||
_, _ = buff.WriteString(" " + lines[len(lines)-1] + "\n")
|
||||
}
|
||||
} else {
|
||||
for line := range strings.SplitSeq(text, "\n") {
|
||||
// Show all lines for small contexts
|
||||
for _, line := range lines {
|
||||
if line == "" {
|
||||
continue
|
||||
}
|
||||
_, _ = buff.WriteString(" " + line + "\n")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,6 +101,15 @@ func (w *writeTool) Run(ctx context.Context, call ToolCall) (ToolResponse, error
|
||||
}
|
||||
|
||||
notifyLspOpenFile(ctx, filePath, w.lspClients)
|
||||
// Get old content for diff if file exists
|
||||
oldContent := ""
|
||||
if fileInfo != nil && !fileInfo.IsDir() {
|
||||
oldBytes, readErr := os.ReadFile(filePath)
|
||||
if readErr == nil {
|
||||
oldContent = string(oldBytes)
|
||||
}
|
||||
}
|
||||
|
||||
p := permission.Default.Request(
|
||||
permission.CreatePermissionRequest{
|
||||
Path: filePath,
|
||||
@@ -109,7 +118,7 @@ func (w *writeTool) Run(ctx context.Context, call ToolCall) (ToolResponse, error
|
||||
Description: fmt.Sprintf("Create file %s", filePath),
|
||||
Params: WritePermissionsParams{
|
||||
FilePath: filePath,
|
||||
Content: GenerateDiff("", params.Content),
|
||||
Content: GenerateDiff(oldContent, params.Content),
|
||||
},
|
||||
},
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user