on main help sign in
chore: refactor implementation
2ddc453Kujtim Hoxha
internal/fsext/fileutil.go+20
@@ -262,3 +262,23 @@ func DirTrim(pwd string, lim int) string {
262 out = filepath.Join("~", out)
262 out = filepath.Join("~", out)
263 return out
263 return out
264}
264}
265+
266+// PathOrPrefix returns the prefix if the path starts with it, or falls back to
267+// the path otherwise.
268+func PathOrPrefix(path, prefix string) string {
269+ if HasPrefix(path, prefix) {
270+ return prefix
271+ }
272+ return path
273+}
274+
275+// HasPrefix checks if the given path starts with the specified prefix.
276+func HasPrefix(path, prefix string) bool {
277+ if abs, err := filepath.Abs(path); err == nil {
278+ path = abs
279+ }
280+ if abs, err := filepath.Abs(prefix); err == nil {
281+ prefix = abs
282+ }
283+ return strings.HasPrefix(path, prefix)
284+}
internal/llm/tools/edit.go+4−16
@@ -11,6 +11,7 @@ import (
11 "time"
11 "time"
12
12
13 "github.com/charmbracelet/crush/internal/diff"
13 "github.com/charmbracelet/crush/internal/diff"
14+ "github.com/charmbracelet/crush/internal/fsext"
14 "github.com/charmbracelet/crush/internal/history"
15 "github.com/charmbracelet/crush/internal/history"
15
16
16 "github.com/charmbracelet/crush/internal/lsp"
17 "github.com/charmbracelet/crush/internal/lsp"
@@ -215,14 +216,10 @@ func (e *editTool) createNewFile(ctx context.Context, filePath, content string,
215 content,
216 content,
216 strings.TrimPrefix(filePath, e.workingDir),
217 strings.TrimPrefix(filePath, e.workingDir),
217 )
218 )
218− permissionPath := filePath
219− if strings.HasPrefix(filePath, e.workingDir) {
220− permissionPath = e.workingDir
221− }
222 p := e.permissions.Request(
219 p := e.permissions.Request(
223 permission.CreatePermissionRequest{
220 permission.CreatePermissionRequest{
224 SessionID: sessionID,
221 SessionID: sessionID,
225− Path: permissionPath,
222+ Path: fsext.PathOrPrefix(filePath, e.workingDir),
226 ToolCallID: call.ID,
223 ToolCallID: call.ID,
227 ToolName: EditToolName,
224 ToolName: EditToolName,
228 Action: "write",
225 Action: "write",
@@ -340,15 +337,10 @@ func (e *editTool) deleteContent(ctx context.Context, filePath, oldString string
340 strings.TrimPrefix(filePath, e.workingDir),
337 strings.TrimPrefix(filePath, e.workingDir),
341 )
338 )
342
339
343− permissionPath := filePath
344− if strings.HasPrefix(filePath, e.workingDir) {
345− permissionPath = e.workingDir
346− }
347−
348 p := e.permissions.Request(
340 p := e.permissions.Request(
349 permission.CreatePermissionRequest{
341 permission.CreatePermissionRequest{
350 SessionID: sessionID,
342 SessionID: sessionID,
351− Path: permissionPath,
343+ Path: fsext.PathOrPrefix(filePath, e.workingDir),
352 ToolCallID: call.ID,
344 ToolCallID: call.ID,
353 ToolName: EditToolName,
345 ToolName: EditToolName,
354 Action: "write",
346 Action: "write",
@@ -476,14 +468,10 @@ func (e *editTool) replaceContent(ctx context.Context, filePath, oldString, newS
476 strings.TrimPrefix(filePath, e.workingDir),
468 strings.TrimPrefix(filePath, e.workingDir),
477 )
469 )
478
470
479− permissionPath := filePath
480− if strings.HasPrefix(filePath, e.workingDir) {
481− permissionPath = e.workingDir
482− }
483 p := e.permissions.Request(
471 p := e.permissions.Request(
484 permission.CreatePermissionRequest{
472 permission.CreatePermissionRequest{
485 SessionID: sessionID,
473 SessionID: sessionID,
486− Path: permissionPath,
474+ Path: fsext.PathOrPrefix(filePath, e.workingDir),
487 ToolCallID: call.ID,
475 ToolCallID: call.ID,
488 ToolName: EditToolName,
476 ToolName: EditToolName,
489 Action: "write",
477 Action: "write",
internal/llm/tools/multiedit.go+3−11
@@ -11,6 +11,7 @@ import (
11 "time"
11 "time"
12
12
13 "github.com/charmbracelet/crush/internal/diff"
13 "github.com/charmbracelet/crush/internal/diff"
14+ "github.com/charmbracelet/crush/internal/fsext"
14 "github.com/charmbracelet/crush/internal/history"
15 "github.com/charmbracelet/crush/internal/history"
15 "github.com/charmbracelet/crush/internal/lsp"
16 "github.com/charmbracelet/crush/internal/lsp"
16 "github.com/charmbracelet/crush/internal/permission"
17 "github.com/charmbracelet/crush/internal/permission"
@@ -250,14 +251,9 @@ func (m *multiEditTool) processMultiEditWithCreation(ctx context.Context, params
250 // Check permissions
251 // Check permissions
251 _, additions, removals := diff.GenerateDiff("", currentContent, strings.TrimPrefix(params.FilePath, m.workingDir))
252 _, additions, removals := diff.GenerateDiff("", currentContent, strings.TrimPrefix(params.FilePath, m.workingDir))
252
253
253− permissionPath := params.FilePath
254− if strings.HasPrefix(params.FilePath, m.workingDir) {
255− permissionPath = m.workingDir
256− }
257−
258 p := m.permissions.Request(permission.CreatePermissionRequest{
254 p := m.permissions.Request(permission.CreatePermissionRequest{
259 SessionID: sessionID,
255 SessionID: sessionID,
260− Path: permissionPath,
256+ Path: fsext.PathOrPrefix(params.FilePath, m.workingDir),
261 ToolCallID: call.ID,
257 ToolCallID: call.ID,
262 ToolName: MultiEditToolName,
258 ToolName: MultiEditToolName,
263 Action: "write",
259 Action: "write",
@@ -364,13 +360,9 @@ func (m *multiEditTool) processMultiEditExistingFile(ctx context.Context, params
364
360
365 // Generate diff and check permissions
361 // Generate diff and check permissions
366 _, additions, removals := diff.GenerateDiff(oldContent, currentContent, strings.TrimPrefix(params.FilePath, m.workingDir))
362 _, additions, removals := diff.GenerateDiff(oldContent, currentContent, strings.TrimPrefix(params.FilePath, m.workingDir))
367− permissionPath := params.FilePath
368− if strings.HasPrefix(params.FilePath, m.workingDir) {
369− permissionPath = m.workingDir
370− }
371 p := m.permissions.Request(permission.CreatePermissionRequest{
363 p := m.permissions.Request(permission.CreatePermissionRequest{
372 SessionID: sessionID,
364 SessionID: sessionID,
373− Path: permissionPath,
365+ Path: fsext.PathOrPrefix(params.FilePath, m.workingDir),
374 ToolCallID: call.ID,
366 ToolCallID: call.ID,
375 ToolName: MultiEditToolName,
367 ToolName: MultiEditToolName,
376 Action: "write",
368 Action: "write",
internal/llm/tools/write.go+2−6
@@ -11,6 +11,7 @@ import (
11 "time"
11 "time"
12
12
13 "github.com/charmbracelet/crush/internal/diff"
13 "github.com/charmbracelet/crush/internal/diff"
14+ "github.com/charmbracelet/crush/internal/fsext"
14 "github.com/charmbracelet/crush/internal/history"
15 "github.com/charmbracelet/crush/internal/history"
15
16
16 "github.com/charmbracelet/crush/internal/lsp"
17 "github.com/charmbracelet/crush/internal/lsp"
@@ -172,15 +173,10 @@ func (w *writeTool) Run(ctx context.Context, call ToolCall) (ToolResponse, error
172 strings.TrimPrefix(filePath, w.workingDir),
173 strings.TrimPrefix(filePath, w.workingDir),
173 )
174 )
174
175
175− permissionPath := filePath
176− if strings.HasPrefix(filePath, w.workingDir) {
177− permissionPath = w.workingDir
178− }
179−
180 p := w.permissions.Request(
176 p := w.permissions.Request(
181 permission.CreatePermissionRequest{
177 permission.CreatePermissionRequest{
182 SessionID: sessionID,
178 SessionID: sessionID,
183− Path: permissionPath,
179+ Path: fsext.PathOrPrefix(filePath, w.workingDir),
184 ToolCallID: call.ID,
180 ToolCallID: call.ID,
185 ToolName: WriteToolName,
181 ToolName: WriteToolName,
186 Action: "write",
182 Action: "write",