diff --git a/cmd/mcp-filepuff/main.go b/cmd/mcp-filepuff/main.go index caa64e4..eb17055 100644 --- a/cmd/mcp-filepuff/main.go +++ b/cmd/mcp-filepuff/main.go @@ -67,9 +67,11 @@ func setupLogger(level string, logFile string) *slog.Logger { } var handler slog.Handler + var logFileErr error if logFile != "" { f, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600) if err != nil { + logFileErr = err // Fallback to stderr handler = slog.NewJSONHandler(os.Stderr, opts) } else { @@ -80,5 +82,15 @@ func setupLogger(level string, logFile string) *slog.Logger { handler = slog.NewJSONHandler(os.Stderr, opts) } - return slog.New(handler) + logger := slog.New(handler) + + // Warn if log file couldn't be opened + if logFileErr != nil { + logger.Warn("failed to open log file, using stderr", + "file", logFile, + "error", logFileErr, + ) + } + + return logger } diff --git a/coverage.out b/coverage.out index 17e7d6f..839c5c1 100644 --- a/coverage.out +++ b/coverage.out @@ -1,110 +1,867 @@ mode: set -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:25.34,29.2 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:32.68,33.17 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:33.17,35.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:37.2,40.39 3 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:40.39,47.25 3 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:47.25,49.53 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:49.53,50.13 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:56.3,67.5 4 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:71.2,71.42 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:71.42,73.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:75.2,75.16 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:79.97,83.24 2 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:83.24,85.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:88.2,88.41 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:88.41,90.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:93.2,93.44 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:93.44,95.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:98.2,104.14 4 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:109.45,110.14 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:110.14,112.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:113.2,113.18 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:113.18,115.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:116.2,116.18 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:116.18,118.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:121.2,121.23 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:121.23,123.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:126.2,136.29 7 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:136.29,138.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:141.2,141.29 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:141.29,144.30 2 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:144.30,146.26 2 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:146.26,148.5 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:150.4,154.5 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:158.3,158.40 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:161.2,161.23 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:166.52,167.14 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:167.14,169.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:170.2,170.18 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:170.18,172.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:173.2,173.18 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:173.18,175.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:177.2,184.19 6 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:184.19,186.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:189.2,189.29 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:189.29,191.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:192.2,192.29 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:192.29,194.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:197.2,197.29 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:197.29,198.30 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:198.30,200.26 2 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:200.26,202.5 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:204.4,211.66 2 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:211.66,213.5 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:217.2,217.22 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:222.51,223.14 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:223.14,225.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:227.2,230.34 3 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:230.34,232.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:235.2,239.53 3 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:239.53,240.21 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:240.21,242.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:242.9,243.9 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:248.2,249.47 2 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:253.44,259.19 4 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:259.19,261.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:263.2,270.22 5 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:270.22,274.32 3 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:274.32,275.37 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:275.37,276.13 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:278.4,281.9 4 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:285.2,285.18 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:285.18,287.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:290.2,291.22 2 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:291.22,292.19 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:292.19,293.12 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:295.3,295.20 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:295.20,297.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:298.3,298.21 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:298.21,300.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:301.3,301.6 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:304.2,306.60 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:310.52,315.15 4 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:315.15,317.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:320.2,320.14 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:320.14,322.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:325.2,326.63 2 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:326.63,328.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:331.2,331.32 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:331.32,334.53 3 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:334.53,336.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:339.2,339.14 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:344.29,345.22 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:345.22,347.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:348.2,349.31 2 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:349.31,350.12 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:350.12,352.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:354.2,354.10 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:357.29,358.22 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:358.22,360.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:361.2,362.31 2 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:362.31,363.12 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:363.12,365.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:367.2,367.10 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:370.21,371.11 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:371.11,373.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:374.2,374.10 1 1 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:31.24,235.2 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:238.32,251.29 9 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:251.29,252.46 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:252.46,254.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:255.3,255.70 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:258.2,258.36 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:258.36,260.40 2 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:260.40,262.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:263.3,263.23 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:267.2,270.36 3 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:270.36,273.40 2 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:273.40,278.21 3 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:278.21,280.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:280.10,282.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:285.4,285.32 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:285.32,289.43 4 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:289.43,291.24 2 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:291.24,293.7 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:294.6,295.60 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:297.5,297.25 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:298.10,300.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:303.4,303.30 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:303.30,305.43 2 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:305.43,309.6 3 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:313.4,313.27 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:313.27,315.37 2 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:315.37,317.6 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:318.5,318.25 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:321.4,321.29 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:326.2,356.20 28 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:359.13,364.22 3 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:364.22,366.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:369.2,369.51 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:369.51,372.3 2 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:374.2,374.72 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:374.72,377.3 2 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:379.2,379.61 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:14.13,28.16 5 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:28.16,31.3 2 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:33.2,40.16 3 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:40.16,43.3 2 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:45.2,46.37 2 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:46.37,49.3 2 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:52.61,54.15 2 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:55.15,56.29 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:57.14,58.28 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:59.15,60.29 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:61.10,62.28 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:65.2,71.19 4 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:71.19,73.17 2 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:73.17,77.4 2 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:77.9,79.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:80.8,83.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:85.2,88.23 2 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:88.23,93.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:95.2,95.15 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:40.24,54.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:58.50,62.25 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:62.25,64.17 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:64.17,66.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:67.3,67.30 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:68.8,68.47 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:68.47,70.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:73.2,74.54 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:74.54,75.51 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:75.51,77.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:81.2,83.17 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:86.32,87.51 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:87.51,88.50 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:88.50,90.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:93.2,93.48 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:93.48,94.50 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:94.50,96.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:99.2,99.51 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:99.51,100.50 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:100.50,102.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:105.2,105.64 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:105.64,107.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:109.2,109.69 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:109.69,111.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:113.2,113.71 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:113.71,115.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:120.50,123.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:123.16,125.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:128.2,129.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:129.16,131.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:134.2,135.20 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:135.20,137.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:140.2,141.20 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:141.20,144.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:144.8,150.50 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:150.50,152.22 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:152.22,155.10 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:158.4,159.21 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:159.21,161.10 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:163.4,164.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:169.2,170.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:170.16,172.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:177.2,177.52 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:185.35,187.24 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:187.24,189.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:192.2,192.25 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:192.25,194.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:197.2,197.23 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:197.23,199.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:202.2,202.27 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:202.27,204.17 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:204.17,205.26 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:205.26,207.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:208.4,208.62 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:210.3,210.20 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:210.20,212.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:215.2,215.12 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:76.42,83.24 3 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:83.24,85.31 2 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:85.31,87.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:91.2,91.25 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:91.25,93.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:96.2,96.20 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:96.20,98.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:100.2,100.20 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:104.42,106.2 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:109.79,110.22 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:110.22,112.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:113.2,114.10 2 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:118.72,121.2 2 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:126.48,128.25 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:128.25,130.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:131.2,131.18 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:137.38,138.16 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:138.16,140.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:143.2,143.42 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:143.42,145.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:149.2,153.23 3 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:153.23,155.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:157.2,157.12 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:161.59,168.2 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:171.73,179.2 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:182.41,183.16 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:183.16,185.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:187.2,187.42 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:187.42,189.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:191.2,191.14 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:195.35,196.16 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:196.16,198.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:200.2,200.42 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:200.42,202.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:204.2,204.10 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:208.36,216.6 6 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:216.6,218.48 2 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:218.48,220.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:221.3,221.12 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:221.12,222.9 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:226.2,226.20 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:232.44,236.12 3 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:237.15,238.91 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:239.17,240.61 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:243.2,245.63 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:249.73,254.2 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:257.71,263.2 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:266.73,271.2 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:274.73,279.2 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:282.72,286.2 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:289.57,293.2 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:296.73,300.2 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:303.73,307.2 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:310.61,314.2 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:317.64,320.2 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:323.59,326.2 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:64.40,66.2 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:76.48,78.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:78.16,80.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:82.2,83.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:83.16,86.3 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:88.2,89.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:89.16,93.3 3 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:95.2,95.36 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:95.36,100.3 4 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:102.2,119.15 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:124.32,126.6 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:126.6,127.10 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:128.17,129.10 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:130.11,130.11 0 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:133.3,134.17 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:134.17,136.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:141.98,143.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:143.16,146.3 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:147.2,163.15 8 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:163.15,167.3 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:170.2,170.36 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:170.36,172.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:175.2,175.9 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:176.20,177.24 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:178.16,179.42 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:180.26,181.24 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:181.24,183.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:184.3,184.19 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:189.66,191.16 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:191.16,194.3 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:195.2,207.22 3 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:211.55,213.2 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:216.32,218.23 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:218.23,230.13 7 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:230.13,233.4 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:235.3,235.10 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:236.15,236.15 0 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:238.41,240.28 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:243.3,243.25 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:245.2,245.12 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:249.46,251.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:251.16,253.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:256.2,258.16 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:258.16,260.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:262.2,263.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:263.16,265.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:267.2,267.12 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:271.29,274.6 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:274.6,275.10 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:276.17,277.10 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:278.11,278.11 0 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:282.3,283.7 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:283.7,285.18 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:285.18,287.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:288.4,289.18 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:289.18,290.10 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:292.4,292.50 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:292.50,295.5 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:298.3,298.25 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:298.25,299.12 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:303.3,305.17 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:305.17,307.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:310.3,311.69 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:311.69,313.40 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:313.40,315.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:316.4,317.12 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:321.3,322.76 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:322.76,323.11 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:324.35,324.35 0 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:325.12,325.12 0 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:333.35,337.2 3 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:100.69,114.2 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:117.98,122.25 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:122.25,128.3 4 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:131.2,135.49 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:135.49,140.3 4 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:143.2,144.9 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:144.9,148.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:151.2,152.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:152.16,154.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:157.2,158.37 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:158.37,163.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:166.2,172.16 6 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:172.16,174.25 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:174.25,176.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:177.3,180.97 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:183.2,192.15 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:192.15,193.19 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:193.19,196.26 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:196.26,198.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:203.2,203.56 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:203.56,209.3 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:212.2,218.20 5 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:222.83,248.16 6 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:248.16,250.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:253.2,254.61 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:254.61,256.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:257.2,260.69 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:260.69,262.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:264.2,264.12 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:268.96,271.16 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:271.16,273.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:276.2,277.16 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:277.16,279.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:281.2,297.16 5 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:297.16,299.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:301.2,301.57 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:301.57,303.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:305.2,306.61 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:306.61,308.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:310.2,310.21 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:314.99,317.16 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:317.16,319.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:322.2,323.16 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:323.16,325.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:327.2,343.16 5 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:343.16,345.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:347.2,347.57 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:347.57,349.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:352.2,353.64 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:353.64,356.62 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:356.62,358.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:361.2,361.23 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:365.124,368.16 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:368.16,370.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:373.2,374.16 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:374.16,376.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:378.2,397.16 5 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:397.16,399.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:401.2,401.57 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:401.57,403.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:405.2,406.64 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:406.64,408.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:410.2,410.23 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:414.98,418.36 3 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:418.36,421.3 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:422.2,426.16 3 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:426.16,428.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:431.2,442.74 3 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:442.74,444.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:446.2,450.12 4 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:454.95,459.23 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:459.23,461.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:463.2,466.37 3 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:466.37,469.3 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:470.2,479.59 4 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:483.37,487.6 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:487.6,488.10 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:489.23,490.10 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:491.19,497.37 4 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:497.37,503.13 4 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:503.13,507.6 3 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:509.4,513.32 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:513.32,516.5 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:522.33,530.35 5 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:530.35,538.3 6 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:540.2,541.12 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:545.60,547.9 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:547.9,549.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:551.2,552.19 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:556.36,558.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:558.16,560.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:561.2,561.28 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:565.35,566.42 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:566.42,568.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:569.2,569.12 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:573.53,574.14 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:575.23,576.14 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:577.31,578.22 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:579.31,580.22 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:581.27,582.18 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:583.22,584.13 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:585.24,586.15 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:587.10,588.22 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:113.70,116.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:116.16,118.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:120.2,124.8 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:128.86,129.23 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:129.23,132.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:135.2,154.16 11 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:154.16,155.44 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:155.44,157.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:159.3,159.74 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:159.74,161.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:163.3,163.23 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:163.23,168.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:169.3,171.94 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:175.2,175.47 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:179.53,183.26 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:183.26,185.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:188.2,188.35 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:188.35,190.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:193.2,193.20 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:193.20,195.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:198.2,198.16 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:198.16,200.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:203.2,203.48 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:203.48,205.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:208.2,208.23 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:208.23,210.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:213.2,213.29 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:213.29,215.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:218.2,218.24 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:218.24,220.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:223.2,226.24 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:226.24,227.31 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:227.31,229.30 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:229.30,231.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:233.8,235.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:237.2,237.13 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:241.94,251.21 5 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:251.21,253.21 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:253.21,254.12 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:257.3,258.52 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:258.52,260.12 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:263.3,263.19 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:264.16,266.59 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:266.59,267.13 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:271.4,271.60 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:271.60,273.13 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:276.4,284.33 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:284.33,286.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:289.4,289.53 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:289.53,292.5 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:294.4,295.33 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:297.18,299.57 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:299.57,300.13 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:303.4,306.32 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:306.32,308.77 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:308.77,311.6 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:311.11,311.65 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:311.65,314.6 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:315.10,318.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:320.18,322.61 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:322.61,323.13 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:325.4,325.41 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:329.2,329.38 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:329.38,331.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:333.2,333.21 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:337.65,338.31 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:338.31,340.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:342.2,347.36 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:347.36,348.48 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:348.48,350.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:351.3,351.55 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:355.2,358.23 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:358.23,360.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:361.2,364.33 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:364.33,367.53 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:367.53,368.107 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:368.107,370.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:373.3,375.39 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:375.39,377.41 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:377.41,379.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:382.4,385.40 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:385.40,387.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:389.3,389.23 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:392.2,392.20 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:396.48,397.22 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:397.22,399.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:400.2,400.29 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:78.53,80.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:83.59,84.19 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:84.19,86.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:88.2,99.72 7 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:99.72,106.3 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:109.2,109.74 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:109.74,112.3 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:115.2,115.67 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:115.67,121.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:124.2,124.77 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:124.77,127.3 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:131.2,132.75 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:132.75,135.78 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:135.78,136.12 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:138.3,142.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:146.2,146.75 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:146.75,148.78 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:148.78,150.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:151.3,152.49 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:155.2,159.8 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:163.138,164.25 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:164.25,166.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:168.2,169.48 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:169.48,171.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:174.2,175.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:175.16,177.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:179.2,183.17 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:183.17,185.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:187.2,187.50 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:187.50,189.10 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:190.21,191.16 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:192.11,192.11 0 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:196.3,196.66 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:196.66,198.49 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:198.49,200.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:202.4,212.6 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:215.3,215.14 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:218.2,218.21 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:223.107,224.17 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:224.17,226.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:228.2,234.26 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:239.126,244.92 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:244.92,245.114 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:245.114,247.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:248.3,249.14 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:253.2,253.46 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:253.46,254.72 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:254.72,256.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:257.3,258.14 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:262.2,262.134 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:262.134,263.71 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:263.71,265.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:266.3,267.14 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:271.2,271.50 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:271.50,272.76 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:272.76,274.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:275.3,276.14 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:279.2,279.14 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:283.122,284.34 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:284.34,285.19 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:286.23,287.66 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:287.66,292.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:293.43,294.76 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:294.76,296.60 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:296.60,298.6 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:299.5,302.6 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:304.23,305.66 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:305.66,310.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:311.47,312.72 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:312.72,317.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:323.119,324.34 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:324.34,325.19 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:326.23,327.66 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:327.66,332.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:333.23,334.66 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:334.66,339.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:340.57,341.78 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:341.78,346.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:352.120,353.34 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:353.34,354.19 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:355.23,357.41 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:357.41,358.54 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:358.54,360.53 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:360.53,361.70 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:361.70,366.8 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:369.10,369.73 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:369.73,374.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:375.43,376.66 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:376.66,381.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:387.123,388.34 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:388.34,389.19 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:390.23,391.66 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:391.66,396.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:397.45,398.66 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:398.66,403.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:409.82,411.31 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:411.31,413.22 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:413.22,415.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:416.3,418.17 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:418.17,420.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:421.3,421.28 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:421.28,423.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:427.2,427.29 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:427.29,429.22 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:429.22,431.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:432.3,433.32 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:433.32,435.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:439.2,439.29 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:439.29,442.39 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:442.39,443.24 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:443.24,445.10 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:448.3,448.13 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:448.13,450.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:453.2,453.13 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:457.66,458.23 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:458.23,460.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:462.2,467.49 5 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:467.49,470.3 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:472.2,472.36 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:472.36,475.20 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:475.20,477.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:478.3,482.22 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:482.22,484.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:485.3,490.26 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:490.26,493.38 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:493.38,494.15 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:494.15,496.6 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:497.5,499.26 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:499.26,501.6 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:502.5,502.57 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:504.4,504.24 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:506.3,506.23 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:509.2,509.15 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:509.15,511.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:513.2,513.20 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:67.51,72.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:76.51,82.2 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:85.83,87.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:91.81,95.2 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:98.99,102.17 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:102.17,104.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:105.2,105.43 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:109.56,111.65 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:111.65,113.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:116.2,117.87 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:117.87,119.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:122.2,123.37 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:127.102,129.48 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:129.48,131.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:134.2,135.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:135.16,138.3 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:141.2,142.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:142.16,144.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:147.2,148.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:148.16,150.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:153.2,154.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:154.16,156.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:159.2,160.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:160.16,166.3 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:169.2,180.11 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:180.11,184.17 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:184.17,186.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:188.3,188.67 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:188.67,194.4 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:195.3,195.24 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:198.2,198.20 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:202.101,204.49 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:204.49,206.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:209.2,210.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:210.16,213.3 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:216.2,217.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:217.16,219.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:222.2,223.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:223.16,225.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:228.2,239.11 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:239.11,243.17 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:243.17,245.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:247.3,247.67 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:247.67,253.4 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:254.3,254.24 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:257.2,257.20 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:261.56,262.21 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:262.21,264.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:266.2,266.26 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:266.26,268.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:271.2,271.24 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:272.54,273.28 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:273.28,275.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:276.18,276.18 0 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:278.10,279.90 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:282.2,282.12 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:286.55,287.49 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:287.49,289.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:292.2,292.118 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:292.118,294.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:296.2,296.12 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:300.56,301.49 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:301.49,303.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:306.2,310.22 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:310.22,312.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:315.2,315.37 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:315.37,316.73 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:316.73,318.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:321.2,321.12 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:325.108,326.17 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:326.17,328.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:330.2,331.17 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:331.17,333.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:335.2,337.50 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:337.50,338.41 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:338.41,340.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:341.3,341.14 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:344.2,344.23 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:344.23,347.3 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:351.2,351.38 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:351.38,353.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:356.2,357.40 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:357.40,359.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:361.2,361.28 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:367.61,368.21 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:368.21,370.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:373.2,376.37 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:376.37,377.40 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:377.40,378.42 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:378.42,380.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:384.2,384.15 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:388.43,392.27 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:392.27,394.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:395.2,395.27 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:395.27,397.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:401.2,407.25 5 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:407.25,409.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:410.2,410.25 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:410.25,412.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:415.2,415.22 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:419.46,426.46 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:426.46,427.42 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:427.42,429.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:431.2,431.14 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:435.88,437.44 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:437.44,439.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:442.2,442.20 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:442.20,444.22 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:444.22,447.50 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:447.50,449.53 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:449.53,450.56 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:450.56,452.12 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:456.4,456.14 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:456.14,458.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:459.9,459.63 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:459.63,461.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:465.2,465.20 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:465.20,468.53 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:468.53,470.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:474.2,474.23 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:474.23,476.47 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:476.47,478.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:481.2,481.13 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:485.94,495.24 6 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:496.19,499.48 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:501.24,505.50 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:507.23,511.48 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:513.18,515.48 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:517.10,518.95 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:521.2,521.20 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:525.60,528.52 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:528.52,530.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:533.2,534.59 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:534.59,536.28 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:536.28,538.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:538.9,539.9 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:543.2,543.24 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:547.58,548.18 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:548.18,550.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:552.2,553.29 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:553.29,554.26 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:554.26,556.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:559.2,559.34 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:564.63,578.29 8 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:578.29,580.30 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:580.30,582.39 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:582.39,583.13 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:586.4,586.21 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:587.35,588.48 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:589.35,590.48 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:591.34,593.14 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:598.2,598.21 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:602.99,603.9 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:604.22,605.55 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:606.29,607.65 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:608.22,609.59 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:610.10,611.99 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:616.100,617.16 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:617.16,619.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:621.2,626.6 5 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:626.6,628.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:628.16,629.9 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:631.3,635.20 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:638.2,638.23 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:638.23,640.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:643.2,643.36 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:643.36,648.29 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:648.29,649.14 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:649.14,651.10 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:653.4,654.63 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:656.3,657.65 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:660.2,660.27 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:660.27,662.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:664.2,664.54 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:668.106,670.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:670.16,672.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:674.2,675.23 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:675.23,677.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:680.2,680.36 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:680.36,682.29 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:682.29,683.14 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:683.14,685.10 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:687.4,688.63 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:690.3,691.65 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:694.2,694.27 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:694.27,696.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:698.2,698.50 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:702.100,703.18 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:703.18,705.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:707.2,707.19 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:707.19,709.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:711.2,711.25 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:711.25,713.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:715.2,722.28 5 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:722.28,724.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:725.2,725.26 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:725.26,727.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:730.2,731.32 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:731.32,733.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:735.2,736.38 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:736.38,738.23 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:738.23,740.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:743.2,743.24 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:747.126,754.12 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:755.19,758.44 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:760.24,764.46 4 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:766.23,770.44 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:772.18,774.44 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:776.10,777.83 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:780.2,780.20 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:784.50,785.22 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:785.22,787.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:788.2,788.29 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:792.37,794.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:799.46,801.34 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:801.34,803.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:804.2,804.12 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:23.71,29.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:32.25,34.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:37.36,39.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:42.33,44.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:47.27,49.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:60.67,66.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:69.32,71.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:74.23,76.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:79.23,81.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:84.34,86.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:89.31,91.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:110.94,111.20 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:111.20,113.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:115.2,126.10 5 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:130.42,136.34 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:136.34,137.19 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:137.19,140.4 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:143.2,143.33 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:147.54,149.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:152.35,154.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:157.35,159.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:170.30,176.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:179.82,182.34 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:182.34,185.3 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:186.2,192.34 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:192.34,194.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:196.2,198.10 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:202.78,205.32 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:205.32,208.3 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:209.2,214.32 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:214.32,216.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:218.2,220.10 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:224.105,227.36 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:227.36,230.3 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:231.2,236.36 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:236.36,238.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:240.2,242.10 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:246.62,247.22 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:247.22,249.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:250.2,251.27 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:251.27,253.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:254.2,255.52 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:259.52,260.22 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:260.22,262.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:263.2,264.27 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:264.27,266.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:267.2,268.45 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:272.36,279.31 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:279.31,280.19 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:280.19,282.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:283.3,284.91 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:288.2,288.29 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:288.29,289.19 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:289.19,291.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:292.3,293.91 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:297.2,297.33 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:297.33,298.19 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:298.19,300.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:301.3,305.35 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:305.35,308.22 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:308.22,310.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:310.10,314.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:317.3,319.21 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:319.21,321.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:321.9,324.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:327.3,328.97 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:331.2,331.20 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:335.28,339.31 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:339.31,341.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:342.2,342.29 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:342.29,344.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:370.40,422.2 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:425.41,427.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:430.46,432.2 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:435.74,438.16 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:438.16,440.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:444.72,446.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:446.16,448.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:452.42,454.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:457.43,459.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:462.58,464.2 1 1 github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:9.72,10.17 1 0 github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:10.17,12.3 1 0 github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:14.2,15.17 2 0 @@ -342,54 +1099,58 @@ github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:124.25,125.33 1 github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:126.24,128.33 1 1 github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:129.27,130.35 1 1 github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:131.10,134.105 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:139.78,141.34 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:141.34,144.3 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:145.2,152.34 4 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:152.34,154.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:156.2,157.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:157.16,159.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:161.2,165.20 4 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:169.102,171.42 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:171.42,173.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:176.2,176.23 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:176.23,180.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:183.2,184.34 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:184.34,188.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:191.2,191.14 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:192.25,193.45 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:194.25,195.45 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:199.2,200.68 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:200.68,209.3 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:210.2,214.16 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:214.16,216.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:221.2,232.16 9 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:232.16,234.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:237.2,250.8 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:254.54,256.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:259.58,267.15 7 0 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:267.15,269.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:271.2,272.20 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:272.20,274.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:276.2,285.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:289.33,295.2 5 0 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:299.63,303.30 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:303.30,304.15 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:304.15,306.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:308.3,308.35 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:308.35,311.21 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:311.21,313.5 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:315.4,322.6 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:325.3,325.44 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:325.44,327.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:330.2,331.15 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:336.41,339.2 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:342.36,346.26 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:346.26,347.22 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:347.22,349.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:351.2,351.14 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:355.28,359.30 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:359.30,361.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:362.2,365.17 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:140.78,142.14 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:142.14,145.3 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:146.2,146.34 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:146.34,149.3 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:150.2,157.14 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:157.14,159.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:162.2,162.34 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:162.34,164.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:166.2,167.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:167.16,169.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:171.2,175.20 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:178.102,180.42 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:180.42,182.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:185.2,185.23 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:185.23,189.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:192.2,193.34 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:193.34,197.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:200.2,200.14 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:201.25,202.45 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:203.25,204.45 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:208.2,209.68 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:209.68,218.3 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:219.2,223.16 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:223.16,225.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:230.2,241.16 9 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:241.16,243.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:246.2,259.8 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:263.54,265.2 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:268.58,276.15 7 0 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:276.15,278.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:280.2,281.20 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:281.20,283.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:285.2,294.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:298.33,304.2 5 0 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:307.63,311.30 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:311.30,312.15 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:312.15,314.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:316.3,316.35 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:316.35,319.21 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:319.21,321.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:323.4,330.6 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:333.3,333.44 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:333.44,335.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:338.2,339.15 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:344.41,347.2 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:350.36,354.26 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:354.26,355.22 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:355.22,357.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:359.2,359.14 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:364.28,371.30 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:371.30,373.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:374.2,377.17 2 1 github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:9.115,10.17 1 1 github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:10.17,12.3 1 0 github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:14.2,15.17 2 1 @@ -677,1106 +1438,388 @@ github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:183.41,185.55 github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:185.55,187.3 1 1 github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:188.2,188.12 1 1 github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:193.49,195.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:113.70,116.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:116.16,118.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:120.2,124.8 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:128.86,129.23 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:129.23,132.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:135.2,154.16 11 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:154.16,155.44 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:155.44,157.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:159.3,159.74 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:159.74,161.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:163.3,163.23 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:163.23,168.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:169.3,171.94 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:175.2,175.47 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:179.53,183.26 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:183.26,185.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:188.2,188.35 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:188.35,190.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:193.2,193.20 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:193.20,195.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:198.2,198.16 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:198.16,200.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:203.2,203.48 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:203.48,205.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:208.2,208.23 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:208.23,210.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:213.2,213.29 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:213.29,215.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:218.2,218.24 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:218.24,220.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:223.2,226.24 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:226.24,227.31 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:227.31,229.30 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:229.30,231.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:233.8,235.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:237.2,237.13 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:241.94,251.21 5 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:251.21,253.21 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:253.21,254.12 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:257.3,258.52 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:258.52,260.12 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:263.3,263.19 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:264.16,266.59 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:266.59,267.13 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:271.4,271.60 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:271.60,273.13 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:276.4,284.33 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:284.33,286.5 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:289.4,289.53 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:289.53,292.5 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:294.4,295.33 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:297.18,299.57 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:299.57,300.13 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:303.4,306.32 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:306.32,308.77 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:308.77,311.6 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:311.11,311.65 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:311.65,314.6 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:315.10,318.5 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:320.18,322.61 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:322.61,323.13 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:325.4,325.41 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:329.2,329.38 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:329.38,331.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:333.2,333.21 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:337.65,338.31 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:338.31,340.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:342.2,347.36 4 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:347.36,348.48 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:348.48,350.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:351.3,351.55 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:355.2,358.23 4 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:358.23,360.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:361.2,364.33 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:364.33,367.53 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:367.53,368.107 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:368.107,370.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:373.3,375.39 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:375.39,377.41 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:377.41,379.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:382.4,385.40 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:385.40,387.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:389.3,389.23 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:392.2,392.20 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:396.48,397.22 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:397.22,399.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:400.2,400.29 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:68.47,70.13 2 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:71.13,72.16 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:73.21,74.24 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:75.37,76.24 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:77.21,78.20 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:79.18,80.15 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:81.45,82.17 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:83.23,84.18 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:85.14,86.17 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:87.15,88.18 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:89.23,90.18 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:91.21,92.20 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:93.10,94.21 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:98.43,99.42 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:99.42,100.25 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:100.25,102.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:103.3,103.48 1 1 -github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:103.48,104.9 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:107.2,107.11 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:67.51,72.2 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:76.51,82.2 4 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:85.83,87.2 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:91.81,95.2 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:98.99,102.17 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:102.17,104.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:105.2,105.43 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:109.56,111.65 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:111.65,113.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:116.2,117.87 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:117.87,119.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:122.2,123.37 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:127.102,129.48 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:129.48,131.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:134.2,135.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:135.16,138.3 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:141.2,142.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:142.16,144.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:147.2,148.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:148.16,150.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:153.2,154.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:154.16,156.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:159.2,160.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:160.16,166.3 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:169.2,180.11 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:180.11,184.17 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:184.17,186.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:188.3,188.67 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:188.67,194.4 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:195.3,195.24 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:198.2,198.20 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:202.101,204.49 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:204.49,206.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:209.2,210.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:210.16,213.3 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:216.2,217.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:217.16,219.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:222.2,223.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:223.16,225.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:228.2,239.11 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:239.11,243.17 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:243.17,245.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:247.3,247.67 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:247.67,253.4 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:254.3,254.24 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:257.2,257.20 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:261.56,262.21 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:262.21,264.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:266.2,266.26 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:266.26,268.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:271.2,271.24 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:272.54,273.28 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:273.28,275.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:276.18,276.18 0 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:278.10,279.90 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:282.2,282.12 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:286.55,287.49 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:287.49,289.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:292.2,292.118 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:292.118,294.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:296.2,296.12 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:300.56,301.49 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:301.49,303.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:306.2,310.22 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:310.22,312.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:315.2,315.37 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:315.37,316.73 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:316.73,318.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:321.2,321.12 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:325.108,326.17 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:326.17,328.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:330.2,331.17 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:331.17,333.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:335.2,337.50 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:337.50,338.41 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:338.41,340.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:341.3,341.14 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:344.2,344.23 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:344.23,347.3 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:351.2,351.38 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:351.38,353.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:356.2,357.40 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:357.40,359.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:361.2,361.28 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:367.61,368.21 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:368.21,370.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:373.2,376.37 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:376.37,377.40 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:377.40,378.42 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:378.42,380.5 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:384.2,384.15 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:388.43,392.27 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:392.27,394.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:395.2,395.27 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:395.27,397.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:401.2,407.25 5 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:407.25,409.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:410.2,410.25 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:410.25,412.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:415.2,415.22 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:419.46,426.46 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:426.46,427.42 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:427.42,429.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:431.2,431.14 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:435.88,437.44 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:437.44,439.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:442.2,442.20 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:442.20,444.22 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:444.22,447.50 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:447.50,449.53 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:449.53,450.56 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:450.56,452.12 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:456.4,456.14 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:456.14,458.5 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:459.9,459.63 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:459.63,461.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:465.2,465.20 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:465.20,468.53 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:468.53,470.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:474.2,474.23 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:474.23,476.47 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:476.47,478.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:481.2,481.13 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:485.94,495.24 6 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:496.19,499.48 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:501.24,505.50 4 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:507.23,511.48 4 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:513.18,515.48 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:517.10,518.95 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:521.2,521.20 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:525.63,528.52 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:528.52,530.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:533.2,534.64 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:534.64,536.28 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:536.28,538.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:538.9,539.9 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:543.2,543.24 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:547.58,548.18 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:548.18,550.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:552.2,553.29 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:553.29,554.26 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:554.26,556.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:559.2,559.34 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:564.63,578.29 8 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:578.29,580.30 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:580.30,582.39 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:582.39,583.13 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:586.4,586.21 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:587.35,588.48 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:589.35,590.48 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:591.34,593.14 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:598.2,598.21 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:602.99,603.9 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:604.22,605.55 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:606.29,607.65 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:608.22,609.59 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:610.10,611.99 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:616.100,617.16 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:617.16,619.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:621.2,626.6 5 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:626.6,628.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:628.16,629.9 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:631.3,635.20 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:638.2,638.23 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:638.23,640.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:643.2,643.36 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:643.36,648.29 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:648.29,649.14 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:649.14,651.10 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:653.4,654.63 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:656.3,657.65 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:660.2,660.27 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:660.27,662.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:664.2,664.54 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:668.106,670.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:670.16,672.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:674.2,675.23 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:675.23,677.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:680.2,680.36 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:680.36,682.29 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:682.29,683.14 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:683.14,685.10 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:687.4,688.63 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:690.3,691.65 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:694.2,694.27 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:694.27,696.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:698.2,698.50 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:702.100,703.18 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:703.18,705.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:707.2,707.19 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:707.19,709.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:711.2,711.25 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:711.25,713.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:715.2,722.28 5 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:722.28,724.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:725.2,725.26 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:725.26,727.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:730.2,731.32 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:731.32,733.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:735.2,736.38 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:736.38,738.23 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:738.23,740.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:743.2,743.24 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:747.126,754.12 4 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:755.19,758.44 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:760.24,764.46 4 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:766.23,770.44 4 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:772.18,774.44 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:776.10,777.83 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:780.2,780.20 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:784.66,787.52 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:787.52,789.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:792.2,793.59 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:793.59,795.28 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:795.28,797.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:797.9,798.9 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:802.2,802.24 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:806.50,807.22 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:807.22,809.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:810.2,810.29 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:814.37,816.2 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:821.46,823.34 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:823.34,825.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:826.2,826.12 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:40.24,54.2 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:58.50,62.25 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:62.25,64.17 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:64.17,66.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:67.3,67.30 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:68.8,68.47 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:68.47,70.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:73.2,74.54 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:74.54,75.51 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:75.51,77.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:81.2,83.17 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:86.32,87.51 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:87.51,88.50 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:88.50,90.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:93.2,93.48 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:93.48,94.50 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:94.50,96.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:99.2,99.51 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:99.51,100.50 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:100.50,102.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:105.2,105.64 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:105.64,107.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:109.2,109.69 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:109.69,111.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:113.2,113.71 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:113.71,115.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:120.50,123.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:123.16,125.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:128.2,129.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:129.16,131.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:134.2,135.20 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:135.20,137.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:140.2,141.20 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:141.20,144.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:144.8,150.50 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:150.50,152.22 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:152.22,155.10 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:158.4,159.21 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:159.21,161.10 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:163.4,164.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:169.2,170.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:170.16,172.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:177.2,177.52 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:185.35,187.24 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:187.24,189.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:192.2,192.25 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:192.25,194.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:197.2,197.23 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:197.23,199.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:202.2,202.27 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:202.27,204.17 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:204.17,205.26 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:205.26,207.5 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:208.4,208.62 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:210.3,210.20 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:210.20,212.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:215.2,215.12 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:40.68,52.16 4 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:52.16,54.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:55.2,58.19 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:58.19,60.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:63.2,73.15 4 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:77.34,88.23 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:88.23,120.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:123.2,185.25 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:185.25,251.3 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:254.2,336.3 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:340.108,342.2 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:345.114,347.15 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:347.15,351.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:353.2,353.23 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:353.23,355.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:358.2,359.16 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:359.16,361.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:363.2,375.16 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:375.16,377.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:379.2,387.43 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:391.112,393.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:393.16,395.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:398.2,398.32 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:398.32,400.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:403.2,404.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:404.16,405.25 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:405.25,407.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:408.3,408.27 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:408.27,410.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:411.3,411.81 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:415.2,415.45 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:415.45,417.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:420.2,425.19 4 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:425.19,427.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:428.2,428.26 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:428.26,430.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:431.2,431.25 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:431.25,433.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:435.2,443.32 5 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:443.32,445.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:447.2,447.16 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:447.16,449.23 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:449.23,451.20 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:451.20,453.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:458.2,458.18 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:458.18,461.55 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:461.55,463.30 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:463.30,465.18 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:465.18,467.6 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:472.3,472.67 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:472.67,474.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:477.2,477.52 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:481.94,484.16 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:484.16,486.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:489.2,491.23 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:491.23,493.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:495.2,499.52 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:499.52,500.106 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:500.106,502.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:505.2,508.30 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:508.30,511.3 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:513.2,513.20 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:517.54,518.14 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:519.31,520.16 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:521.29,522.16 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:523.28,524.17 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:525.29,526.18 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:527.32,528.17 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:529.31,530.15 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:531.31,532.17 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:533.27,534.16 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:535.28,536.17 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:537.31,538.16 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:539.29,540.15 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:541.30,542.15 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:543.10,544.15 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:548.36,553.33 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:553.33,557.22 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:557.22,559.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:561.3,561.40 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:561.40,563.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:564.3,564.15 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:568.2,568.31 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:572.112,574.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:574.16,576.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:578.2,579.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:579.16,581.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:584.2,598.21 4 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:598.21,600.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:603.2,604.15 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:604.15,606.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:608.2,611.35 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:611.35,613.39 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:613.39,614.12 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:617.3,617.89 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:617.89,619.11 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:620.22,621.21 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:622.12,622.12 0 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:625.4,625.18 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:625.18,627.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:629.4,629.20 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:629.20,631.44 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:631.44,633.6 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:634.5,634.15 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:638.4,638.37 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:638.37,640.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:643.4,644.18 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:644.18,646.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:649.4,649.47 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:649.47,651.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:654.4,655.18 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:655.18,657.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:660.4,661.18 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:661.18,663.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:665.4,668.55 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:668.55,670.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:672.4,672.14 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:674.3,674.17 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:674.17,676.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:680.2,681.43 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:685.50,686.35 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:687.12,688.15 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:689.20,690.15 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:691.20,692.15 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:693.16,694.15 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:695.11,696.14 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:697.20,698.16 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:699.16,700.15 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:701.10,702.12 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:707.112,709.16 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:709.16,711.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:713.2,714.15 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:714.15,716.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:718.2,719.14 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:719.14,721.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:724.2,724.32 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:724.32,726.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:729.2,730.16 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:730.16,733.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:735.2,735.18 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:735.18,737.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:739.2,743.52 4 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:747.119,749.16 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:749.16,751.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:753.2,754.16 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:754.16,756.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:758.2,759.17 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:759.17,761.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:763.2,768.52 5 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:772.118,774.16 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:774.16,776.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:778.2,779.15 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:779.15,781.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:783.2,784.14 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:784.14,786.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:789.2,789.32 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:789.32,791.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:793.2,794.16 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:794.16,796.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:798.2,798.25 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:798.25,800.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:802.2,805.32 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:805.32,811.20 4 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:811.20,815.4 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:816.3,816.27 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:819.2,819.52 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:823.118,825.16 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:825.16,827.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:829.2,830.15 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:830.15,832.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:834.2,835.14 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:835.14,837.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:839.2,842.32 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:842.32,844.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:846.2,847.16 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:847.16,849.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:851.2,851.25 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:851.25,853.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:855.2,860.32 4 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:860.32,863.3 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:865.2,865.41 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:865.41,867.28 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:867.28,869.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:870.3,870.27 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:873.2,873.52 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:877.66,879.16 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:879.16,881.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:883.2,888.61 5 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:888.61,890.26 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:890.26,892.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:893.3,894.18 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:894.18,896.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:897.3,897.73 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:900.2,900.25 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:904.115,906.2 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:909.113,911.2 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:914.120,916.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:916.16,918.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:920.2,921.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:921.16,923.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:926.2,926.32 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:926.32,928.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:934.2,953.11 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:953.11,955.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:955.8,957.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:959.2,959.16 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:959.16,961.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:963.2,963.21 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:963.21,965.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:968.2,969.11 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:969.11,971.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:971.8,973.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:975.2,979.52 4 1 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:983.49,996.12 7 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:996.12,1002.3 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1005.2,1005.9 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1006.24,1014.49 4 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1014.49,1017.4 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1019.3,1020.13 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1022.24,1024.13 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1026.20,1031.49 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1031.49,1033.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1035.3,1035.19 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1040.54,1044.25 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1044.25,1046.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1049.2,1049.21 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1049.21,1051.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1053.2,1053.12 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:31.24,235.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:238.32,251.29 9 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:251.29,252.46 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:252.46,254.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:255.3,255.70 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:258.2,258.36 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:258.36,260.40 2 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:260.40,262.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:263.3,263.23 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:267.2,270.36 3 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:270.36,273.40 2 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:273.40,278.21 3 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:278.21,280.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:280.10,282.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:285.4,285.32 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:285.32,289.43 4 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:289.43,291.24 2 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:291.24,293.7 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:294.6,295.60 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:297.5,297.25 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:298.10,300.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:303.4,303.30 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:303.30,305.43 2 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:305.43,309.6 3 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:313.4,313.27 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:313.27,315.37 2 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:315.37,317.6 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:318.5,318.25 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:321.4,321.29 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:326.2,356.20 28 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:359.13,364.22 3 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:364.22,366.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:369.2,369.51 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:369.51,372.3 2 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:374.2,374.72 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:374.72,377.3 2 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:379.2,379.61 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:58.40,60.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:70.48,72.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:72.16,74.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:76.2,77.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:77.16,80.3 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:82.2,83.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:83.16,87.3 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:89.2,89.36 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:89.36,94.3 4 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:96.2,110.15 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:114.98,116.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:116.16,119.3 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:120.2,136.15 8 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:136.15,140.3 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:143.2,143.36 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:143.36,145.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:148.2,148.9 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:149.20,150.24 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:151.16,152.42 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:153.26,154.24 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:154.24,156.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:157.3,157.19 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:162.66,164.16 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:164.16,167.3 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:168.2,180.22 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:184.55,186.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:189.32,191.23 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:191.23,203.13 7 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:203.13,206.4 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:208.3,208.10 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:209.15,209.15 0 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:211.38,213.28 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:216.3,216.25 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:218.2,218.12 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:222.46,224.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:224.16,226.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:229.2,231.16 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:231.16,233.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:235.2,236.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:236.16,238.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:240.2,240.12 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:244.29,247.6 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:247.6,248.10 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:249.17,250.10 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:251.11,251.11 0 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:255.3,256.7 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:256.7,258.18 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:258.18,260.5 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:261.4,262.18 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:262.18,263.10 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:265.4,265.50 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:265.50,268.5 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:271.3,271.25 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:271.25,272.12 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:276.3,278.17 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:278.17,280.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:283.3,284.69 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:284.69,286.40 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:286.40,288.5 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:289.4,290.12 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:294.3,295.76 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:295.76,296.11 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:297.35,297.35 0 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:298.12,298.12 0 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:306.35,310.2 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:74.69,88.2 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:91.98,96.25 4 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:96.25,102.3 4 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:105.2,109.49 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:109.49,114.3 4 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:117.2,118.9 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:118.9,122.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:125.2,126.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:126.16,128.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:131.2,138.16 6 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:138.16,140.25 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:140.25,142.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:143.3,146.97 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:149.2,158.15 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:158.15,159.19 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:159.19,162.26 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:162.26,164.5 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:169.2,169.56 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:169.56,175.3 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:178.2,184.20 5 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:188.83,214.16 6 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:214.16,216.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:219.2,220.61 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:220.61,222.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:223.2,226.69 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:226.69,228.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:230.2,230.12 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:234.96,237.16 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:237.16,239.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:242.2,243.16 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:243.16,245.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:247.2,263.16 5 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:263.16,265.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:267.2,267.57 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:267.57,269.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:271.2,272.61 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:272.61,274.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:276.2,276.21 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:280.99,283.16 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:283.16,285.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:288.2,289.16 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:289.16,291.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:293.2,309.16 5 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:309.16,311.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:313.2,313.57 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:313.57,315.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:318.2,319.64 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:319.64,322.62 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:322.62,324.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:327.2,327.23 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:331.124,334.16 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:334.16,336.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:339.2,340.16 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:340.16,342.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:344.2,363.16 5 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:363.16,365.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:367.2,367.57 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:367.57,369.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:371.2,372.64 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:372.64,374.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:376.2,376.23 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:380.98,384.36 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:384.36,387.3 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:388.2,392.16 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:392.16,394.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:397.2,408.74 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:408.74,410.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:412.2,416.12 4 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:420.95,425.23 4 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:425.23,427.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:429.2,432.37 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:432.37,435.3 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:436.2,445.59 4 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:449.37,453.6 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:453.6,454.10 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:455.23,456.10 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:457.19,459.37 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:459.37,465.13 4 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:465.13,469.6 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:471.4,471.17 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:477.33,485.35 5 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:485.35,493.3 6 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:495.2,496.12 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:500.60,502.9 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:502.9,504.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:506.2,507.19 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:511.36,513.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:513.16,515.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:516.2,516.28 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:520.35,521.42 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:521.42,523.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:524.2,524.12 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:528.53,529.14 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:530.23,531.14 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:532.31,533.22 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:534.31,535.22 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:536.27,537.18 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:538.22,539.13 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:540.24,541.15 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:542.10,543.22 1 1 -github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:14.13,28.16 5 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:28.16,31.3 2 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:33.2,40.16 3 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:40.16,43.3 2 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:45.2,46.37 2 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:46.37,49.3 2 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:52.61,54.15 2 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:55.15,56.29 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:57.14,58.28 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:59.15,60.29 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:61.10,62.28 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:65.2,70.19 3 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:70.19,72.17 2 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:72.17,75.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:75.9,77.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:78.8,81.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:83.2,83.26 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:23.71,29.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:32.25,34.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:37.36,39.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:42.33,44.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:47.27,49.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:60.67,66.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:69.32,71.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:74.23,76.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:79.23,81.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:84.34,86.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:89.31,91.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:111.94,112.20 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:112.20,114.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:116.2,127.10 5 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:131.42,137.34 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:137.34,138.19 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:138.19,141.4 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:144.2,144.33 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:148.54,150.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:153.35,155.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:158.35,160.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:171.30,177.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:180.82,183.34 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:183.34,186.3 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:187.2,193.34 4 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:193.34,195.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:197.2,199.10 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:203.78,206.32 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:206.32,209.3 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:210.2,215.32 4 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:215.32,217.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:219.2,221.10 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:225.105,228.36 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:228.36,231.3 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:232.2,237.36 4 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:237.36,239.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:241.2,243.10 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:247.62,248.22 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:248.22,250.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:251.2,252.27 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:252.27,254.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:255.2,256.52 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:260.52,261.22 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:261.22,263.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:264.2,265.27 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:265.27,267.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:268.2,269.45 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:273.36,280.31 4 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:280.31,281.19 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:281.19,283.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:284.3,285.91 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:289.2,289.29 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:289.29,290.19 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:290.19,292.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:293.3,294.91 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:298.2,298.33 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:298.33,299.19 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:299.19,301.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:302.3,306.35 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:306.35,309.22 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:309.22,311.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:311.10,315.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:318.3,320.21 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:320.21,322.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:322.9,325.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:328.3,329.97 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:332.2,332.20 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:336.28,340.31 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:340.31,342.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:343.2,343.29 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:343.29,345.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:371.40,423.2 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:426.41,428.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:431.46,433.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:436.74,439.16 3 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:439.16,441.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:445.72,447.16 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:447.16,449.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:453.42,455.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:458.43,460.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:463.58,465.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:76.42,83.24 3 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:83.24,85.31 2 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:85.31,87.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:91.2,91.25 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:91.25,93.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:96.2,96.20 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:96.20,98.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:100.2,100.20 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:104.42,106.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:109.79,110.22 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:110.22,112.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:113.2,114.10 2 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:118.72,121.2 2 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:124.59,131.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:134.73,142.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:145.41,146.16 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:146.16,148.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:150.2,150.42 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:150.42,152.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:154.2,154.14 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:158.35,159.16 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:159.16,161.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:163.2,163.42 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:163.42,165.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:167.2,167.10 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:171.36,179.6 6 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:179.6,181.48 2 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:181.48,183.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:184.3,184.12 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:184.12,185.9 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:189.2,189.20 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:195.44,199.12 3 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:200.15,201.91 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:202.17,203.61 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:206.2,208.63 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:212.73,217.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:220.71,226.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:229.73,234.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:237.73,242.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:245.72,249.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:252.57,256.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:259.73,263.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:266.73,270.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:273.61,277.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:280.64,283.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:286.59,289.2 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:16.59,18.48 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:18.48,20.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:23.2,24.16 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:24.16,26.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:30.2,31.37 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:36.24,37.53 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:37.53,40.3 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:78.53,80.2 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:83.59,84.19 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:84.19,86.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:88.2,99.72 7 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:99.72,106.3 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:109.2,109.74 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:109.74,112.3 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:115.2,115.67 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:115.67,121.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:124.2,124.77 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:124.77,127.3 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:131.2,132.75 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:132.75,135.78 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:135.78,136.12 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:138.3,142.5 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:146.2,146.75 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:146.75,148.78 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:148.78,150.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:151.3,152.49 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:155.2,159.8 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:163.138,164.25 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:164.25,166.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:168.2,169.48 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:169.48,171.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:174.2,175.16 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:175.16,177.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:179.2,183.17 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:183.17,185.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:187.2,187.50 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:187.50,189.10 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:190.21,191.16 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:192.11,192.11 0 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:196.3,196.66 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:196.66,198.49 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:198.49,200.5 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:202.4,212.6 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:215.3,215.14 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:218.2,218.21 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:223.107,224.17 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:224.17,226.3 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:228.2,234.26 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:239.126,244.92 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:244.92,245.114 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:245.114,247.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:248.3,249.14 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:253.2,253.46 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:253.46,254.72 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:254.72,256.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:257.3,258.14 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:262.2,262.134 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:262.134,263.71 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:263.71,265.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:266.3,267.14 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:271.2,271.50 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:271.50,272.76 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:272.76,274.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:275.3,276.14 2 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:279.2,279.14 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:283.122,284.34 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:284.34,285.19 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:286.23,287.66 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:287.66,292.5 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:293.43,294.76 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:294.76,296.60 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:296.60,298.6 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:299.5,302.6 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:304.23,305.66 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:305.66,310.5 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:311.47,312.72 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:312.72,317.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:323.119,324.34 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:324.34,325.19 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:326.23,327.66 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:327.66,332.5 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:333.23,334.66 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:334.66,339.5 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:340.57,341.78 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:341.78,346.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:352.120,353.34 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:353.34,354.19 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:355.23,357.41 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:357.41,358.54 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:358.54,360.53 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:360.53,361.70 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:361.70,366.8 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:369.10,369.73 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:369.73,374.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:375.43,376.66 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:376.66,381.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:387.123,388.34 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:388.34,389.19 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:390.23,391.66 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:391.66,396.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:397.45,398.66 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:398.66,403.5 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:409.82,411.31 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:411.31,413.22 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:413.22,415.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:416.3,418.17 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:418.17,420.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:421.3,421.28 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:421.28,423.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:427.2,427.29 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:427.29,429.22 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:429.22,431.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:432.3,433.32 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:433.32,435.4 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:439.2,439.29 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:439.29,442.39 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:442.39,443.24 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:443.24,445.10 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:448.3,448.13 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:448.13,450.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:453.2,453.13 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:457.66,458.23 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:458.23,460.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:462.2,467.49 5 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:467.49,470.3 2 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:472.2,472.36 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:472.36,475.20 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:475.20,477.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:478.3,482.22 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:482.22,484.4 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:485.3,490.26 4 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:490.26,493.38 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:493.38,494.15 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:494.15,496.6 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:497.5,499.26 3 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:499.26,501.6 1 0 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:502.5,502.57 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:504.4,504.24 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:506.3,506.23 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:509.2,509.15 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:509.15,511.3 1 1 -github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:513.2,513.20 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:18.112,20.9 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:21.32,22.16 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:22.16,22.32 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:23.20,24.58 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:27.2,28.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:28.16,30.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:32.2,33.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:33.16,35.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:38.2,52.21 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:52.21,54.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:57.2,58.15 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:58.15,60.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:62.2,65.35 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:65.35,67.39 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:67.39,68.12 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:71.3,71.89 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:71.89,73.11 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:74.22,75.21 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:76.12,76.12 0 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:79.4,79.18 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:79.18,81.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:83.4,83.20 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:83.20,85.44 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:85.44,87.6 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:88.5,88.15 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:92.4,92.37 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:92.37,94.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:97.4,98.18 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:98.18,100.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:103.4,103.47 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:103.47,105.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:108.4,109.18 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:109.18,111.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:114.4,115.18 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:115.18,117.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:119.4,122.55 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:122.55,124.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:126.4,126.14 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:128.3,128.17 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:128.17,130.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:134.2,135.43 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:139.94,142.16 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:142.16,144.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:147.2,149.23 3 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:149.23,151.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:153.2,157.52 3 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:157.52,158.106 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:158.106,160.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:163.2,166.30 3 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:166.30,169.3 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:171.2,171.20 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:175.54,176.14 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:177.31,178.16 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:179.29,180.16 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:181.28,182.17 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:183.29,184.18 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:185.32,186.17 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:187.31,188.15 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:189.31,190.17 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:191.27,192.16 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:193.28,194.17 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:195.31,196.16 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:197.29,198.15 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:199.30,200.15 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:201.10,202.15 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:207.50,208.35 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:209.12,210.15 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:211.20,212.15 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:213.20,214.15 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:215.16,216.15 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:217.11,218.14 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:219.20,220.16 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:221.16,222.15 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_ast.go:223.10,224.12 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_edit.go:15.115,17.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_edit.go:20.113,22.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_edit.go:25.120,27.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_edit.go:27.16,29.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_edit.go:31.2,32.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_edit.go:32.16,34.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_edit.go:37.2,37.32 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_edit.go:37.32,39.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_edit.go:45.2,64.11 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_edit.go:64.11,66.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_edit.go:66.8,68.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_edit.go:70.2,70.16 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_edit.go:70.16,72.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_edit.go:74.2,74.21 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_edit.go:74.21,76.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_edit.go:79.2,80.11 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_edit.go:80.11,82.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_edit.go:82.8,84.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_edit.go:86.2,90.52 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:18.114,20.15 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:20.15,24.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:26.2,26.23 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:26.23,28.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:31.2,32.16 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:32.16,34.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:36.2,48.16 3 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:48.16,51.3 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:53.2,61.43 3 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:65.112,67.9 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:68.31,69.16 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:69.16,69.31 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:70.20,71.58 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:74.2,75.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:75.16,77.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:80.2,80.32 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:80.32,82.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:85.2,86.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:86.16,87.25 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:87.25,89.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:90.3,90.27 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:90.27,92.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:93.3,94.59 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:98.2,98.45 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:98.45,100.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:103.2,108.19 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:108.19,110.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:111.2,111.26 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:111.26,113.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:114.2,114.25 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:114.25,116.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:118.2,126.32 5 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:126.32,128.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:130.2,130.16 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:130.16,132.23 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:132.23,134.20 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:134.20,136.5 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:141.2,141.18 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:141.18,144.55 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:144.55,146.30 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:146.30,148.18 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:148.18,150.6 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:155.3,155.67 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:155.67,157.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:160.2,160.52 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:166.36,169.33 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:169.33,173.22 3 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:173.22,175.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:177.3,177.40 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:177.40,179.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:180.3,180.15 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_file.go:184.2,184.31 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:17.112,19.16 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:19.16,21.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:23.2,24.15 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:24.15,26.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:28.2,29.14 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:29.14,31.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:34.2,34.32 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:34.32,36.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:39.2,40.16 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:40.16,43.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:45.2,45.18 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:45.18,47.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:49.2,53.52 4 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:57.119,59.16 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:59.16,61.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:63.2,64.16 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:64.16,66.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:68.2,69.17 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:69.17,71.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:73.2,78.52 5 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:82.118,84.16 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:84.16,86.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:88.2,89.15 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:89.15,91.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:93.2,94.14 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:94.14,96.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:99.2,99.32 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:99.32,101.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:103.2,104.16 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:104.16,106.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:108.2,108.25 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:108.25,110.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:112.2,115.32 3 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:115.32,121.20 4 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:121.20,125.4 3 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:126.3,126.27 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:129.2,129.52 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:133.118,135.16 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:135.16,137.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:139.2,140.15 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:140.15,142.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:144.2,145.14 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:145.14,147.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:149.2,152.32 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:152.32,154.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:156.2,157.16 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:157.16,159.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:161.2,161.25 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:161.25,163.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:165.2,170.32 4 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:170.32,173.3 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:175.2,175.41 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:175.41,177.28 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:177.28,179.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:180.3,180.27 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:183.2,183.52 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:187.66,189.16 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:189.16,191.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:193.2,198.61 5 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:198.61,200.43 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:200.43,202.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:203.3,204.18 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:204.18,206.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:207.3,207.73 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/handlers_lsp.go:210.2,210.25 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:49.68,63.16 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:63.16,65.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:66.2,69.19 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:69.19,71.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:74.2,84.15 4 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:88.34,99.23 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:99.23,131.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:134.2,196.25 3 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:196.25,262.3 3 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:265.2,347.3 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:351.108,353.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:356.49,369.12 7 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:369.12,375.3 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:378.2,378.9 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:379.24,387.49 4 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:387.49,390.4 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:392.3,393.13 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:395.24,397.13 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:399.20,404.49 3 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:404.49,406.4 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:408.3,408.19 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:413.54,417.25 2 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:417.25,419.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:422.2,422.21 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:422.21,424.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:426.2,426.12 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:35.37,36.18 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:36.18,38.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:39.2,39.75 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:42.37,44.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:48.44,50.37 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:50.37,55.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:61.2,61.12 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:67.59,69.49 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:69.49,71.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:74.2,74.48 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:74.48,76.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:79.2,80.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:80.16,86.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:89.2,89.38 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:89.38,91.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:95.2,96.13 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:96.13,98.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:99.2,99.37 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:104.67,105.49 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:105.49,107.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:109.2,110.16 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:110.16,116.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:117.2,117.16 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:122.24,123.49 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:123.49,126.3 2 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:127.2,127.20 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:131.25,133.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:136.45,137.23 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:137.23,139.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:140.2,140.16 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:25.34,29.2 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:32.68,33.17 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:33.17,35.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:37.2,40.39 3 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:40.39,47.25 3 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:47.25,49.53 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:49.53,50.13 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:56.3,67.5 4 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:71.2,71.42 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:71.42,73.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:75.2,75.16 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:79.97,83.24 2 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:83.24,85.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:88.2,88.41 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:88.41,90.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:93.2,93.44 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:93.44,95.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:98.2,104.14 4 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:109.45,110.14 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:110.14,112.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:113.2,113.18 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:113.18,115.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:116.2,116.18 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:116.18,118.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:121.2,121.23 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:121.23,123.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:126.2,136.29 7 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:136.29,138.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:141.2,141.29 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:141.29,144.30 2 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:144.30,146.26 2 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:146.26,148.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:150.4,154.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:158.3,158.40 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:161.2,161.23 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:166.52,167.14 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:167.14,169.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:170.2,170.18 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:170.18,172.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:173.2,173.18 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:173.18,175.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:177.2,184.19 6 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:184.19,186.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:189.2,189.29 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:189.29,191.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:192.2,192.29 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:192.29,194.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:197.2,197.29 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:197.29,198.30 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:198.30,200.26 2 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:200.26,202.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:204.4,211.66 2 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:211.66,213.5 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:217.2,217.22 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:222.51,223.14 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:223.14,225.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:227.2,230.34 3 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:230.34,232.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:235.2,239.53 3 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:239.53,240.21 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:240.21,242.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:242.9,243.9 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:248.2,249.47 2 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:253.44,259.19 4 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:259.19,261.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:263.2,270.22 5 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:270.22,274.32 3 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:274.32,275.37 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:275.37,276.13 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:278.4,281.9 4 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:285.2,285.18 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:285.18,287.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:290.2,291.22 2 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:291.22,292.19 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:292.19,293.12 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:295.3,295.20 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:295.20,297.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:298.3,298.21 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:298.21,300.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:301.3,301.6 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:304.2,306.60 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:310.52,315.15 4 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:315.15,317.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:320.2,320.14 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:320.14,322.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:325.2,326.63 2 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:326.63,328.3 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:331.2,331.32 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:331.32,334.53 3 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:334.53,336.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:339.2,339.14 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:344.29,345.22 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:345.22,347.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:348.2,349.31 2 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:349.31,350.12 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:350.12,352.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:354.2,354.10 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:357.29,358.22 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:358.22,360.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:361.2,362.31 2 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:362.31,363.12 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:363.12,365.4 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:367.2,367.10 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:370.21,371.11 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:371.11,373.3 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:374.2,374.10 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:70.47,72.13 2 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:73.13,74.16 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:75.21,76.24 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:77.37,78.24 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:79.21,80.20 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:81.18,82.15 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:83.45,84.17 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:85.23,86.18 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:87.14,88.17 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:89.15,90.18 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:91.23,92.18 1 0 +github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:93.21,94.20 1 1 +github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:95.10,96.21 1 1 diff --git a/internal/edit/edit.go b/internal/edit/edit.go index cf4dd27..531bddf 100644 --- a/internal/edit/edit.go +++ b/internal/edit/edit.go @@ -482,13 +482,12 @@ func (e *Engine) matchesSelector(sel ASTSelector, n *sitter.Node, content []byte } // applyEdit applies the edit operation to the content. +// AST mode uses exact byte positions — new_content is inserted verbatim without auto-indentation. func (e *Engine) applyEdit(edit *ASTEdit, node *sitter.Node, content []byte) ([]byte, error) { startByte := node.StartByte() endByte := node.EndByte() - // Detect and preserve indentation - indentation := detectIndentation(content, startByte) - newContent := indentContent(edit.NewContent, indentation) + newContent := edit.NewContent var result []byte @@ -499,15 +498,21 @@ func (e *Engine) applyEdit(edit *ASTEdit, node *sitter.Node, content []byte) ([] result = append(result, content[endByte:]...) case EditInsertBefore: + insertion := newContent + if !strings.HasSuffix(insertion, "\n") { + insertion += "\n" + } result = append(result, content[:startByte]...) - result = append(result, []byte(newContent)...) - result = append(result, '\n') + result = append(result, []byte(insertion)...) result = append(result, content[startByte:]...) case EditInsertAfter: + insertion := newContent + if !strings.HasPrefix(insertion, "\n") { + insertion = "\n" + insertion + } result = append(result, content[:endByte]...) - result = append(result, '\n') - result = append(result, []byte(newContent)...) + result = append(result, []byte(insertion)...) result = append(result, content[endByte:]...) case EditDelete: @@ -522,16 +527,16 @@ func (e *Engine) applyEdit(edit *ASTEdit, node *sitter.Node, content []byte) ([] } // detectIndentation detects the indentation at a given byte position. -func detectIndentation(content []byte, bytePos uint32) string { +func detectIndentation(content []byte, bytePos int) string { // Find the start of the line - lineStart := int(bytePos) + lineStart := bytePos for lineStart > 0 && content[lineStart-1] != '\n' { lineStart-- } // Extract leading whitespace var indent strings.Builder - for i := lineStart; i < int(bytePos) && i < len(content); i++ { + for i := lineStart; i < bytePos && i < len(content); i++ { c := content[i] if c == ' ' || c == '\t' { indent.WriteByte(c) @@ -560,10 +565,16 @@ func indentContent(content string, indent string) string { } // generateDiff creates a unified diff between original and modified content. -// Uses Myers diff algorithm for accurate and readable diffs. +// Uses line-level Myers diff algorithm for accurate and readable diffs. func generateDiff(original, modified, filename string) string { dmp := diffmatchpatch.New() - diffs := dmp.DiffMain(original, modified, false) + + // Use line-level diffing: encode each line as a single character, + // diff the encoded strings, then decode back to real lines. + // This prevents character-level diffs from splitting lines incorrectly. + chars1, chars2, lineArray := dmp.DiffLinesToChars(original, modified) + diffs := dmp.DiffMain(chars1, chars2, false) + diffs = dmp.DiffCharsToLines(diffs, lineArray) // Cleanup for readability diffs = dmp.DiffCleanupSemantic(diffs) @@ -573,24 +584,25 @@ func generateDiff(original, modified, filename string) string { buf.WriteString(fmt.Sprintf("--- %s\n", filename)) buf.WriteString(fmt.Sprintf("+++ %s\n", filename)) - // Group diffs into hunks - lineNum := 1 for _, diff := range diffs { - lines := strings.Split(diff.Text, "\n") - for i, line := range lines { - // Skip empty last line from split - if i == len(lines)-1 && line == "" { + // SplitAfter preserves the trailing \n on each line, so we can + // distinguish real lines from a trailing empty split artifact. + lines := strings.SplitAfter(diff.Text, "\n") + for _, line := range lines { + if line == "" { continue } + // Remove trailing newline for display — we add our own. + cleanLine := strings.TrimSuffix(line, "\n") + switch diff.Type { case diffmatchpatch.DiffDelete: - buf.WriteString(fmt.Sprintf("-%s\n", line)) + buf.WriteString(fmt.Sprintf("-%s\n", cleanLine)) case diffmatchpatch.DiffInsert: - buf.WriteString(fmt.Sprintf("+%s\n", line)) + buf.WriteString(fmt.Sprintf("+%s\n", cleanLine)) case diffmatchpatch.DiffEqual: - buf.WriteString(fmt.Sprintf(" %s\n", line)) - lineNum++ + buf.WriteString(fmt.Sprintf(" %s\n", cleanLine)) } } } @@ -639,24 +651,6 @@ func (e *Engine) findExactText(content []byte, text string, index int) (start, e return 0, 0, errors.NewInvalidSelectionError(fmt.Sprintf("text not found: %q", truncateString(text, 50))) } - // If multiple matches and no index specified, require explicit selection - if len(matches) > 1 && index == 0 { - // Check if index was explicitly set to 0 or just defaulted - // Since we can't distinguish, we'll allow index 0 but warn about multiple matches - // Actually, let's be strict and require explicit index for multiple matches - locations := make([]string, 0, min(len(matches), 5)) - for i, m := range matches { - if i >= 5 { - locations = append(locations, fmt.Sprintf("... and %d more", len(matches)-5)) - break - } - line := countLines(content[:m.start]) + 1 - locations = append(locations, fmt.Sprintf("line %d", line)) - } - return 0, 0, errors.NewInvalidSelectionError(fmt.Sprintf("text matches %d locations (%s); use selector_index to specify which one (0-%d)", - len(matches), strings.Join(locations, ", "), len(matches)-1)) - } - if index >= len(matches) { return 0, 0, errors.NewInvalidSelectionError(fmt.Sprintf("selector_index %d out of range (found %d matches)", index, len(matches))) } @@ -676,21 +670,6 @@ func (e *Engine) findRegexPattern(content []byte, pattern string, index int) (st return 0, 0, errors.NewInvalidSelectionError(fmt.Sprintf("pattern not found: %q", truncateString(pattern, 50))) } - // If multiple matches and index is 0 (default), show error with locations - if len(matches) > 1 && index == 0 { - locations := make([]string, 0, min(len(matches), 5)) - for i, m := range matches { - if i >= 5 { - locations = append(locations, fmt.Sprintf("... and %d more", len(matches)-5)) - break - } - line := countLines(content[:m[0]]) + 1 - locations = append(locations, fmt.Sprintf("line %d", line)) - } - return 0, 0, errors.NewInvalidSelectionError(fmt.Sprintf("pattern matches %d locations (%s); use selector_index to specify which one (0-%d)", - len(matches), strings.Join(locations, ", "), len(matches)-1)) - } - if index >= len(matches) { return 0, 0, errors.NewInvalidSelectionError(fmt.Sprintf("selector_index %d out of range (found %d matches)", index, len(matches))) } @@ -728,7 +707,7 @@ func (e *Engine) findLineRange(content []byte, lineStart, lineEnd int) (start, e // Calculate byte positions start = 0 - for i := 0; i < startIdx; i++ { + for i := range startIdx { start += len(lines[i]) + 1 // +1 for newline } @@ -746,7 +725,7 @@ func (e *Engine) findLineRange(content []byte, lineStart, lineEnd int) (start, e // applyTextEditOperation applies a text edit operation. func (e *Engine) applyTextEditOperation(op EditOperation, content []byte, start, end int, newContent string) ([]byte, error) { // Detect indentation at the selection point - indentation := detectIndentationAtByte(content, start) + indentation := detectIndentation(content, start) indentedContent := indentContent(newContent, indentation) var result []byte @@ -758,15 +737,21 @@ func (e *Engine) applyTextEditOperation(op EditOperation, content []byte, start, result = append(result, content[end:]...) case EditInsertBefore: + insertion := indentedContent + if !strings.HasSuffix(insertion, "\n") { + insertion += "\n" + } result = append(result, content[:start]...) - result = append(result, []byte(indentedContent)...) - result = append(result, '\n') + result = append(result, []byte(insertion)...) result = append(result, content[start:]...) case EditInsertAfter: + insertion := indentedContent + if !strings.HasPrefix(insertion, "\n") { + insertion = "\n" + insertion + } result = append(result, content[:end]...) - result = append(result, '\n') - result = append(result, []byte(indentedContent)...) + result = append(result, []byte(insertion)...) result = append(result, content[end:]...) case EditDelete: @@ -780,28 +765,6 @@ func (e *Engine) applyTextEditOperation(op EditOperation, content []byte, start, return result, nil } -// detectIndentationAtByte detects indentation at a byte position. -func detectIndentationAtByte(content []byte, bytePos int) string { - // Find the start of the line - lineStart := bytePos - for lineStart > 0 && content[lineStart-1] != '\n' { - lineStart-- - } - - // Extract leading whitespace - var indent strings.Builder - for i := lineStart; i < bytePos && i < len(content); i++ { - c := content[i] - if c == ' ' || c == '\t' { - indent.WriteByte(c) - } else { - break - } - } - - return indent.String() -} - // truncateString truncates a string to maxLen with ellipsis. func truncateString(s string, maxLen int) string { if len(s) <= maxLen { @@ -810,11 +773,6 @@ func truncateString(s string, maxLen int) string { return s[:maxLen-3] + "..." } -// countLines counts the number of newlines in content. -func countLines(content []byte) int { - return bytes.Count(content, []byte("\n")) -} - // ValidateLanguage checks if AST editing is supported for a file. // Returns nil for supported languages, error for unsupported. // Note: Text-based editing is always available regardless of this check. diff --git a/internal/edit/edit_test.go b/internal/edit/edit_test.go index a6252e2..af5fef5 100644 --- a/internal/edit/edit_test.go +++ b/internal/edit/edit_test.go @@ -357,7 +357,7 @@ func TestDetectIndentation(t *testing.T) { name string content string want string - pos uint32 + pos int }{ { name: "no indent", @@ -410,6 +410,71 @@ func TestGenerateDiff(t *testing.T) { } } +func TestGenerateDiffLineLevelAccuracy(t *testing.T) { + // Regression test: diff must operate at line level, not character level. + // A character-level diff would split "hello" and "hello world" mid-line, + // producing broken output like: + // fmt.Println("hello + // + world + // ") + original := "package main\n\nfunc hello() {\n\tfmt.Println(\"hello\")\n}\n" + modified := "package main\n\nfunc hello() {\n\tfmt.Println(\"hello world\")\n}\n" + + diff := generateDiff(original, modified, "test.go") + + // The diff must show whole-line removals and additions + if !strings.Contains(diff, "-\tfmt.Println(\"hello\")\n") { + t.Errorf("diff should show full removed line, got:\n%s", diff) + } + if !strings.Contains(diff, "+\tfmt.Println(\"hello world\")\n") { + t.Errorf("diff should show full added line, got:\n%s", diff) + } + + // The diff must NOT split lines at character boundaries + if strings.Contains(diff, "+hello") && !strings.Contains(diff, "Println") { + t.Errorf("diff appears to be character-level (split mid-line), got:\n%s", diff) + } + + // Context lines should not be marked as changed + for line := range strings.SplitSeq(diff, "\n") { + if strings.HasPrefix(line, "-") || strings.HasPrefix(line, "+") { + // Changed lines should only be the Println lines + if strings.Contains(line, "package main") || + strings.Contains(line, "func hello()") { + t.Errorf("unchanged line incorrectly marked as changed: %q", line) + } + } + } +} + +func TestGenerateDiffNoPhantomChanges(t *testing.T) { + // Regression test: replacing a line range should not produce phantom + // +/- lines for unchanged code after the edit region. + original := "line1\nline2\nline3\nline4\nline5\nline6\nline7\nline8\n" + modified := "line1\nREPLACED\nline3\nline4\nline5\nline6\nline7\nline8\n" + + diff := generateDiff(original, modified, "test.txt") + + // Count changed lines (excluding headers) + addCount := 0 + delCount := 0 + for line := range strings.SplitSeq(diff, "\n") { + if strings.HasPrefix(line, "+") && !strings.HasPrefix(line, "+++") { + addCount++ + } + if strings.HasPrefix(line, "-") && !strings.HasPrefix(line, "---") { + delCount++ + } + } + + if addCount != 1 { + t.Errorf("expected 1 added line, got %d. Diff:\n%s", addCount, diff) + } + if delCount != 1 { + t.Errorf("expected 1 deleted line, got %d. Diff:\n%s", delCount, diff) + } +} + // ==================== Text-based editing tests ==================== func TestTextEditWithExactText(t *testing.T) { @@ -593,7 +658,7 @@ SECRET_KEY=abc123 } } -func TestTextEditMultipleMatchesError(t *testing.T) { +func TestTextEditMultipleMatchesSelectsFirst(t *testing.T) { registry := parser.NewRegistry() defer registry.Close() e := NewEngine(registry) @@ -624,12 +689,19 @@ more code t.Fatalf("apply failed: %v", err) } - // Should fail because of multiple matches - if result.Success { - t.Error("expected error for multiple matches without index") + // Index 0 (default) should select the first match + if !result.Success { + t.Fatalf("expected success for multiple matches with default index 0: %s", result.Error) } - if !strings.Contains(result.Error, "matches") { - t.Errorf("error should mention multiple matches: %s", result.Error) + + // Verify only first TODO was replaced + fileContent, _ := os.ReadFile(tmpFile) + contentStr := string(fileContent) + if !strings.Contains(contentStr, "DONE: fix this") { + t.Error("first TODO should be replaced with DONE") + } + if !strings.Contains(contentStr, "TODO: also fix this") { + t.Error("second TODO should be unchanged") } } diff --git a/internal/lsp/client.go b/internal/lsp/client.go index baf1807..eecf8a3 100644 --- a/internal/lsp/client.go +++ b/internal/lsp/client.go @@ -16,6 +16,12 @@ import ( json "github.com/goccy/go-json" ) +// ProcessKillTimeout is the timeout for waiting for a process to exit before force killing. +const ProcessKillTimeout = 5 * time.Second + +// StderrBufferSize is the buffer size for draining stderr. +const StderrBufferSize = 1024 + // Client represents an LSP client connection. type Client struct { stdin io.WriteCloser @@ -104,12 +110,33 @@ func NewClient(cmd *exec.Cmd) (*Client, error) { notifications: make(chan *Notification, 100), } - // Start reader goroutine + // Start reader goroutine for stdout go c.readLoop() + // Start stderr drain goroutine to prevent pipe buffer from filling up + go c.drainStderr() + return c, nil } +// drainStderr consumes stderr output to prevent the LSP server from blocking. +// LSP servers may write diagnostic messages to stderr which we discard. +func (c *Client) drainStderr() { + buf := make([]byte, StderrBufferSize) + for { + select { + case <-c.done: + return + default: + } + // Read and discard stderr output + _, err := c.stderr.Read(buf) + if err != nil { + return + } + } +} + // Call sends a request and waits for a response. func (c *Client) Call(ctx context.Context, method string, params interface{}) (*Response, error) { c.runningMu.RLock() @@ -208,7 +235,7 @@ func (c *Client) Close() error { select { case <-done: // Clean exit - case <-time.After(5 * time.Second): + case <-time.After(ProcessKillTimeout): // Force kill _ = c.cmd.Process.Kill() } diff --git a/internal/lsp/manager.go b/internal/lsp/manager.go index 713d2b3..8a7a7a5 100644 --- a/internal/lsp/manager.go +++ b/internal/lsp/manager.go @@ -15,6 +15,18 @@ import ( "github.com/lukaszraczylo/mcp-filepuff/pkg/protocol" ) +// LSP timeout and interval constants. +const ( + // DefaultLSPTimeout is the default timeout for LSP requests. + DefaultLSPTimeout = 10 * time.Second + // DefaultIdleTimeout is the duration before idle LSP servers are reaped. + DefaultIdleTimeout = 5 * time.Minute + // ReaperInterval is how often the idle server reaper runs. + ReaperInterval = 60 * time.Second + // ShutdownTimeout is the timeout for graceful LSP server shutdown. + ShutdownTimeout = 2 * time.Second +) + // Manager manages LSP servers for different languages. type Manager struct { servers map[protocol.Language]*ManagedServer @@ -70,12 +82,27 @@ var DefaultServerConfigs = map[protocol.Language]ServerConfig{ }, } +// AllowedLSPBinaries is a whitelist of allowed LSP server binary names. +// This prevents command injection by ensuring only known LSP servers can be executed. +var AllowedLSPBinaries = map[string]bool{ + "gopls": true, + "typescript-language-server": true, + "pylsp": true, + "clangd": true, + // Common alternatives + "tsserver": true, + "pyright": true, + "ruff-lsp": true, + "rust-analyzer": true, + "ccls": true, +} + // NewManager creates a new LSP manager. func NewManager(workspaceRoot string, logger *slog.Logger) *Manager { m := &Manager{ servers: make(map[protocol.Language]*ManagedServer), - timeout: 10 * time.Second, - idleTimeout: 5 * time.Minute, + timeout: DefaultLSPTimeout, + idleTimeout: DefaultIdleTimeout, workspaceRoot: workspaceRoot, logger: logger, stopReaper: make(chan struct{}), @@ -127,12 +154,20 @@ func (m *Manager) GetServer(ctx context.Context, lang protocol.Language) (*Manag return nil, errors.NewLSPServerNotFound(string(lang), config.Command[0]) } + // Validate command against whitelist to prevent command injection + binaryName := filepath.Base(cmdPath) + if !AllowedLSPBinaries[binaryName] { + return nil, errors.New(errors.ErrLSPServerNotFound, fmt.Sprintf("LSP binary %q is not in the allowed list", binaryName)). + WithContext("language", string(lang)). + WithContext("binary", binaryName). + WithRemediation("Only whitelisted LSP server binaries are allowed for security reasons") + } + // Create command args := append(config.Command[1:], config.Args...) cmd := exec.CommandContext(ctx, cmdPath, args...) cmd.Env = os.Environ() cmd.Dir = m.workspaceRoot - // Create client client, err := NewClient(cmd) if err != nil { @@ -447,7 +482,7 @@ func (m *Manager) CloseDocument(_ context.Context, lang protocol.Language, file // reapIdleServers periodically closes idle servers. func (m *Manager) reapIdleServers() { - ticker := time.NewTicker(60 * time.Second) + ticker := time.NewTicker(ReaperInterval) defer ticker.Stop() for { @@ -455,6 +490,10 @@ func (m *Manager) reapIdleServers() { case <-m.stopReaper: return case <-ticker.C: + // Collect idle servers first to avoid holding the lock while closing + var toClose []*ManagedServer + var toCloseLanguages []protocol.Language + m.mu.Lock() for lang, srv := range m.servers { // Check lastUsed with server's lock to avoid race condition @@ -463,12 +502,19 @@ func (m *Manager) reapIdleServers() { srv.mu.Unlock() if idle { - m.logger.Info("closing idle LSP server", "language", lang) - _ = srv.client.Close() + toClose = append(toClose, srv) + toCloseLanguages = append(toCloseLanguages, lang) delete(m.servers, lang) } } m.mu.Unlock() + + // Close servers outside the lock to prevent deadlock + // (Close can block waiting for the process to exit) + for i, srv := range toClose { + m.logger.Info("closing idle LSP server", "language", toCloseLanguages[i]) + _ = srv.client.Close() + } } } } @@ -485,7 +531,7 @@ func (m *Manager) Close() error { for lang, srv := range m.servers { m.logger.Info("shutting down LSP server", "language", lang) // Try graceful shutdown - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), ShutdownTimeout) _, _ = srv.client.Call(ctx, "shutdown", nil) cancel() _ = srv.client.Notify("exit", nil) diff --git a/internal/metrics/metrics_test.go b/internal/metrics/metrics_test.go new file mode 100644 index 0000000..a483fec --- /dev/null +++ b/internal/metrics/metrics_test.go @@ -0,0 +1,561 @@ +package metrics + +import ( + "strings" + "sync" + "testing" + "time" +) + +func TestCounter(t *testing.T) { + tests := []struct { + name string + ops func(c *Counter) + expected int64 + }{ + { + name: "initial value is zero", + ops: func(c *Counter) {}, + expected: 0, + }, + { + name: "single inc", + ops: func(c *Counter) { + c.Inc() + }, + expected: 1, + }, + { + name: "multiple inc", + ops: func(c *Counter) { + c.Inc() + c.Inc() + c.Inc() + }, + expected: 3, + }, + { + name: "add positive", + ops: func(c *Counter) { + c.Add(10) + }, + expected: 10, + }, + { + name: "mixed operations", + ops: func(c *Counter) { + c.Inc() + c.Add(5) + c.Inc() + }, + expected: 7, + }, + { + name: "reset", + ops: func(c *Counter) { + c.Add(100) + c.Reset() + }, + expected: 0, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := NewCounter("test_counter", "test help", nil) + tt.ops(c) + if got := c.Value(); got != tt.expected { + t.Errorf("Counter.Value() = %d, want %d", got, tt.expected) + } + }) + } +} + +func TestCounterConcurrency(t *testing.T) { + c := NewCounter("concurrent_counter", "test", nil) + var wg sync.WaitGroup + numGoroutines := 100 + incsPerGoroutine := 1000 + + for i := 0; i < numGoroutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for j := 0; j < incsPerGoroutine; j++ { + c.Inc() + } + }() + } + + wg.Wait() + + expected := int64(numGoroutines * incsPerGoroutine) + if got := c.Value(); got != expected { + t.Errorf("Counter.Value() = %d, want %d after concurrent increments", got, expected) + } +} + +func TestGauge(t *testing.T) { + tests := []struct { + name string + ops func(g *Gauge) + expected int64 + }{ + { + name: "initial value is zero", + ops: func(g *Gauge) {}, + expected: 0, + }, + { + name: "set value", + ops: func(g *Gauge) { + g.Set(42) + }, + expected: 42, + }, + { + name: "inc", + ops: func(g *Gauge) { + g.Inc() + g.Inc() + }, + expected: 2, + }, + { + name: "dec", + ops: func(g *Gauge) { + g.Set(10) + g.Dec() + g.Dec() + }, + expected: 8, + }, + { + name: "add positive", + ops: func(g *Gauge) { + g.Add(5) + }, + expected: 5, + }, + { + name: "add negative", + ops: func(g *Gauge) { + g.Set(10) + g.Add(-3) + }, + expected: 7, + }, + { + name: "mixed operations", + ops: func(g *Gauge) { + g.Set(100) + g.Inc() + g.Dec() + g.Add(-50) + }, + expected: 50, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + g := NewGauge("test_gauge", "test help", nil) + tt.ops(g) + if got := g.Value(); got != tt.expected { + t.Errorf("Gauge.Value() = %d, want %d", got, tt.expected) + } + }) + } +} + +func TestHistogram(t *testing.T) { + t.Run("default buckets", func(t *testing.T) { + h := NewHistogram("test_histogram", "test", nil, nil) + if len(h.buckets) != len(DefaultDurationBuckets) { + t.Errorf("expected default buckets, got %d buckets", len(h.buckets)) + } + }) + + t.Run("custom buckets", func(t *testing.T) { + buckets := []float64{1.0, 5.0, 10.0} + h := NewHistogram("test_histogram", "test", nil, buckets) + if len(h.buckets) != 3 { + t.Errorf("expected 3 buckets, got %d", len(h.buckets)) + } + }) + + t.Run("buckets are sorted", func(t *testing.T) { + buckets := []float64{10.0, 1.0, 5.0} + h := NewHistogram("test_histogram", "test", nil, buckets) + if h.buckets[0] != 1.0 || h.buckets[1] != 5.0 || h.buckets[2] != 10.0 { + t.Errorf("buckets not sorted: %v", h.buckets) + } + }) + + t.Run("observe values", func(t *testing.T) { + h := NewHistogram("test_histogram", "test", nil, []float64{1.0, 5.0, 10.0}) + + h.Observe(0.5) // goes to bucket 0 (<=1.0) + h.Observe(3.0) // goes to bucket 1 (<=5.0) + h.Observe(7.0) // goes to bucket 2 (<=10.0) + h.Observe(15.0) // goes to +Inf bucket + + if h.Count() != 4 { + t.Errorf("expected count 4, got %d", h.Count()) + } + }) + + t.Run("observe duration", func(t *testing.T) { + h := NewHistogram("test_histogram", "test", nil, []float64{0.001, 0.01, 0.1}) + + h.ObserveDuration(500 * time.Microsecond) // 0.0005s, goes to bucket 0 + h.ObserveDuration(5 * time.Millisecond) // 0.005s, goes to bucket 1 + + if h.Count() != 2 { + t.Errorf("expected count 2, got %d", h.Count()) + } + }) + + t.Run("sum tracking", func(t *testing.T) { + h := NewHistogram("test_histogram", "test", nil, []float64{1.0, 5.0, 10.0}) + + h.Observe(1.0) + h.Observe(2.0) + h.Observe(3.0) + + expectedSum := 6.0 + if got := h.Sum(); got != expectedSum { + t.Errorf("expected sum %f, got %f", expectedSum, got) + } + }) +} + +func TestRegistry(t *testing.T) { + t.Run("counter registration", func(t *testing.T) { + r := NewRegistry() + + c1 := r.Counter("test_counter", "help", nil) + c2 := r.Counter("test_counter", "help", nil) + + if c1 != c2 { + t.Error("expected same counter instance for same name") + } + }) + + t.Run("counter with labels", func(t *testing.T) { + r := NewRegistry() + + labels1 := map[string]string{"method": "get"} + labels2 := map[string]string{"method": "post"} + + c1 := r.Counter("http_requests", "help", labels1) + c2 := r.Counter("http_requests", "help", labels2) + + if c1 == c2 { + t.Error("expected different counter instances for different labels") + } + }) + + t.Run("gauge registration", func(t *testing.T) { + r := NewRegistry() + + g1 := r.Gauge("test_gauge", "help", nil) + g2 := r.Gauge("test_gauge", "help", nil) + + if g1 != g2 { + t.Error("expected same gauge instance for same name") + } + }) + + t.Run("histogram registration", func(t *testing.T) { + r := NewRegistry() + + h1 := r.Histogram("test_histogram", "help", nil, nil) + h2 := r.Histogram("test_histogram", "help", nil, nil) + + if h1 != h2 { + t.Error("expected same histogram instance for same name") + } + }) +} + +func TestRegistryConcurrency(t *testing.T) { + r := NewRegistry() + var wg sync.WaitGroup + numGoroutines := 100 + + // Concurrent access to registry + for i := 0; i < numGoroutines; i++ { + wg.Add(1) + go func(id int) { + defer wg.Done() + c := r.Counter("concurrent_test", "test", nil) + c.Inc() + + g := r.Gauge("concurrent_gauge", "test", nil) + g.Inc() + }(i) + } + + wg.Wait() + + c := r.Counter("concurrent_test", "test", nil) + if c.Value() != int64(numGoroutines) { + t.Errorf("expected counter value %d, got %d", numGoroutines, c.Value()) + } +} + +func TestRegistryExpose(t *testing.T) { + r := NewRegistry() + + // Add some metrics + c := r.Counter("test_requests_total", "Total requests", nil) + c.Add(42) + + g := r.Gauge("test_connections", "Active connections", nil) + g.Set(10) + + h := r.Histogram("test_duration_seconds", "Request duration", nil, []float64{0.1, 0.5, 1.0}) + h.Observe(0.05) + h.Observe(0.3) + h.Observe(0.8) + + output := r.Expose() + + // Check counter output + if !strings.Contains(output, "# TYPE test_requests_total counter") { + t.Error("expected counter type in output") + } + if !strings.Contains(output, "test_requests_total 42") { + t.Error("expected counter value in output") + } + + // Check gauge output + if !strings.Contains(output, "# TYPE test_connections gauge") { + t.Error("expected gauge type in output") + } + if !strings.Contains(output, "test_connections 10") { + t.Error("expected gauge value in output") + } + + // Check histogram output + if !strings.Contains(output, "# TYPE test_duration_seconds histogram") { + t.Error("expected histogram type in output") + } + if !strings.Contains(output, "test_duration_seconds_bucket") { + t.Error("expected histogram buckets in output") + } + if !strings.Contains(output, "test_duration_seconds_sum") { + t.Error("expected histogram sum in output") + } + if !strings.Contains(output, "test_duration_seconds_count") { + t.Error("expected histogram count in output") + } +} + +func TestRegistryReset(t *testing.T) { + r := NewRegistry() + + c := r.Counter("test_counter", "test", nil) + c.Add(100) + + g := r.Gauge("test_gauge", "test", nil) + g.Set(50) + + r.Reset() + + if c.Value() != 0 { + t.Errorf("expected counter reset to 0, got %d", c.Value()) + } + if g.Value() != 0 { + t.Errorf("expected gauge reset to 0, got %d", g.Value()) + } +} + +func TestServerMetrics(t *testing.T) { + t.Run("creation", func(t *testing.T) { + m := NewServerMetrics() + + if m.RequestsTotal == nil { + t.Error("RequestsTotal should not be nil") + } + if m.RequestErrors == nil { + t.Error("RequestErrors should not be nil") + } + if m.RequestDuration == nil { + t.Error("RequestDuration should not be nil") + } + if m.CacheHits == nil { + t.Error("CacheHits should not be nil") + } + if m.CacheMisses == nil { + t.Error("CacheMisses should not be nil") + } + if m.ActiveLSPServers == nil { + t.Error("ActiveLSPServers should not be nil") + } + if m.ParseDuration == nil { + t.Error("ParseDuration should not be nil") + } + if m.ParseErrors == nil { + t.Error("ParseErrors should not be nil") + } + }) + + t.Run("record request success", func(t *testing.T) { + m := NewServerMetrics() + + m.RecordRequest(100*time.Millisecond, nil) + + if m.RequestsTotal.Value() != 1 { + t.Errorf("expected RequestsTotal 1, got %d", m.RequestsTotal.Value()) + } + if m.RequestErrors.Value() != 0 { + t.Errorf("expected RequestErrors 0, got %d", m.RequestErrors.Value()) + } + if m.RequestDuration.Count() != 1 { + t.Errorf("expected RequestDuration count 1, got %d", m.RequestDuration.Count()) + } + }) + + t.Run("record request error", func(t *testing.T) { + m := NewServerMetrics() + + m.RecordRequest(50*time.Millisecond, &testError{}) + + if m.RequestsTotal.Value() != 1 { + t.Errorf("expected RequestsTotal 1, got %d", m.RequestsTotal.Value()) + } + if m.RequestErrors.Value() != 1 { + t.Errorf("expected RequestErrors 1, got %d", m.RequestErrors.Value()) + } + }) + + t.Run("record parse", func(t *testing.T) { + m := NewServerMetrics() + + m.RecordParse(10*time.Millisecond, nil) + m.RecordParse(5*time.Millisecond, &testError{}) + + if m.ParseDuration.Count() != 2 { + t.Errorf("expected ParseDuration count 2, got %d", m.ParseDuration.Count()) + } + if m.ParseErrors.Value() != 1 { + t.Errorf("expected ParseErrors 1, got %d", m.ParseErrors.Value()) + } + }) + + t.Run("record cache", func(t *testing.T) { + m := NewServerMetrics() + + m.RecordCacheHit() + m.RecordCacheHit() + m.RecordCacheMiss() + + if m.CacheHits.Value() != 2 { + t.Errorf("expected CacheHits 2, got %d", m.CacheHits.Value()) + } + if m.CacheMisses.Value() != 1 { + t.Errorf("expected CacheMisses 1, got %d", m.CacheMisses.Value()) + } + }) + + t.Run("set active LSP servers", func(t *testing.T) { + m := NewServerMetrics() + + m.SetActiveLSPServers(5) + if m.ActiveLSPServers.Value() != 5 { + t.Errorf("expected ActiveLSPServers 5, got %d", m.ActiveLSPServers.Value()) + } + + m.SetActiveLSPServers(3) + if m.ActiveLSPServers.Value() != 3 { + t.Errorf("expected ActiveLSPServers 3, got %d", m.ActiveLSPServers.Value()) + } + }) + + t.Run("expose", func(t *testing.T) { + m := NewServerMetrics() + m.RecordRequest(100*time.Millisecond, nil) + + output := m.Expose() + + if !strings.Contains(output, "mcp_requests_total") { + t.Error("expected mcp_requests_total in output") + } + if !strings.Contains(output, "mcp_request_duration_seconds") { + t.Error("expected mcp_request_duration_seconds in output") + } + }) +} + +func TestMetricKey(t *testing.T) { + tests := []struct { + name string + labels map[string]string + expected string + }{ + { + name: "no labels", + labels: nil, + expected: "test_metric", + }, + { + name: "single label", + labels: map[string]string{"method": "get"}, + expected: `test_metric{method="get"}`, + }, + { + name: "multiple labels sorted", + labels: map[string]string{"method": "get", "code": "200"}, + expected: `test_metric{code="200",method="get"}`, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := metricKey("test_metric", tt.labels) + if got != tt.expected { + t.Errorf("metricKey() = %q, want %q", got, tt.expected) + } + }) + } +} + +func TestFormatLabels(t *testing.T) { + tests := []struct { + name string + labels map[string]string + expected string + }{ + { + name: "no labels", + labels: nil, + expected: "", + }, + { + name: "single label", + labels: map[string]string{"method": "get"}, + expected: `{method="get"}`, + }, + { + name: "multiple labels sorted", + labels: map[string]string{"method": "get", "code": "200"}, + expected: `{code="200",method="get"}`, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := formatLabels(tt.labels) + if got != tt.expected { + t.Errorf("formatLabels() = %q, want %q", got, tt.expected) + } + }) + } +} + +// testError is a simple error type for testing +type testError struct{} + +func (e *testError) Error() string { return "test error" } diff --git a/internal/parser/docextract_test.go b/internal/parser/docextract_test.go index 0974768..9181016 100644 --- a/internal/parser/docextract_test.go +++ b/internal/parser/docextract_test.go @@ -104,6 +104,7 @@ func NoComment() {} if doc == nil { t.Fatal("expected doc, got nil") + return } if doc.Text != tt.wantText { @@ -192,6 +193,7 @@ function validate(name) {} if doc == nil { t.Fatal("expected doc, got nil") + return } if doc.Text != tt.wantText { @@ -291,6 +293,7 @@ func TestExtractPythonDocComment(t *testing.T) { if doc == nil { t.Fatal("expected doc, got nil") + return } if doc.Text != tt.wantText { @@ -372,6 +375,7 @@ int simple() { return 1; } if doc == nil { t.Fatal("expected doc, got nil") + return } if doc.Text != tt.wantText { diff --git a/internal/parser/parser.go b/internal/parser/parser.go index 4ba5a78..b2790c0 100644 --- a/internal/parser/parser.go +++ b/internal/parser/parser.go @@ -34,6 +34,8 @@ type Registry struct { cache *lru.Cache[string, *CachedTree] maxParseSize int64 mu sync.RWMutex + parserMu sync.Map // per-language mutexes for parse serialization + closed bool // Indicates if the registry has been closed // Cache metrics (atomic for thread-safety) cacheHits atomic.Int64 @@ -136,8 +138,13 @@ func getLanguage(lang protocol.Language) (*sitter.Language, error) { } // GetParser returns a parser for the given language. +// Returns an error if the registry has been closed. func (r *Registry) GetParser(lang protocol.Language) (*sitter.Parser, error) { r.mu.RLock() + if r.closed { + r.mu.RUnlock() + return nil, errors.New(errors.ErrInternal, "parser registry is closed") + } if p, ok := r.parsers[lang]; ok { r.mu.RUnlock() return p, nil @@ -148,6 +155,11 @@ func (r *Registry) GetParser(lang protocol.Language) (*sitter.Parser, error) { r.mu.Lock() defer r.mu.Unlock() + // Check closed again after acquiring write lock + if r.closed { + return nil, errors.New(errors.ErrInternal, "parser registry is closed") + } + // Double-check after acquiring write lock if p, ok := r.parsers[lang]; ok { return p, nil @@ -196,7 +208,8 @@ func (r *Registry) Parse(ctx context.Context, filename string, content []byte) ( } // Check cache (LRU cache is thread-safe) - hash := contentHash(content) + // Include language in cache key to prevent cross-language collisions + hash := fmt.Sprintf("%s:%016x", string(lang), xxhash.Sum64(content)) if cached, ok := r.cache.Get(hash); ok && cached.Language == lang { r.cacheHits.Add(1) errors := extractErrors(cached.Tree.RootNode(), content) @@ -215,13 +228,16 @@ func (r *Registry) Parse(ctx context.Context, filename string, content []byte) ( return nil, err } - // Parse content - tree-sitter parsers are not thread-safe, - // so we need to hold the lock during parsing - // Track parse duration + // Parse content - tree-sitter parsers are not thread-safe per instance, + // but parsers for different languages are independent. + // Use per-language locks to allow concurrent parsing of different languages. + muVal, _ := r.parserMu.LoadOrStore(lang, &sync.Mutex{}) + langMu := muVal.(*sync.Mutex) + start := time.Now() - r.mu.Lock() + langMu.Lock() tree, err := parser.ParseCtx(ctx, nil, content) - r.mu.Unlock() + langMu.Unlock() duration := time.Since(start) // Update duration metrics @@ -351,10 +367,14 @@ func isBinary(content []byte) bool { } // Close closes all parsers and clears the cache. +// After Close is called, the registry cannot be used for parsing. func (r *Registry) Close() { r.mu.Lock() defer r.mu.Unlock() + // Mark as closed first to prevent new parse operations + r.closed = true + for _, p := range r.parsers { p.Close() } diff --git a/internal/search/search.go b/internal/search/search.go index f9a3cd0..eea7cdb 100644 --- a/internal/search/search.go +++ b/internal/search/search.go @@ -214,9 +214,10 @@ func (s *Searcher) buildArgs(req *Request) []string { args = append(args, "--no-ignore") } - // Max count per file to limit results + // Global result cap — --max-total-count stops rg early across all files. + // Requires ripgrep >= 13.0. In-process truncation in parseOutput is kept as a safety net. if req.MaxResults > 0 { - args = append(args, fmt.Sprintf("--max-count=%d", req.MaxResults)) + args = append(args, fmt.Sprintf("--max-total-count=%d", req.MaxResults)) } // Add pattern @@ -243,9 +244,9 @@ func (s *Searcher) parseOutput(output *bytes.Buffer, maxResults int) (*SearchRes Results: []Result{}, } - // Track context by file and line - contextBefore := make(map[string][]string) // file -> lines before current match - currentFile := "" + // Track before-context lines linearly: accumulate context lines until the next match consumes them. + var pendingBefore []string + pendingFile := "" scanner := bufio.NewScanner(output) for scanner.Scan() { @@ -285,14 +286,14 @@ func (s *Searcher) parseOutput(output *bytes.Buffer, maxResults int) (*SearchRes result.Column = match.Submatches[0].Start + 1 // 1-indexed } - // Add context before - if ctx, ok := contextBefore[match.Path.Text]; ok { - result.Context.Before = ctx - delete(contextBefore, match.Path.Text) + // Attach pending before-context if it belongs to this file + if pendingFile == match.Path.Text && len(pendingBefore) > 0 { + result.Context.Before = pendingBefore } + pendingBefore = nil + pendingFile = "" results.Results = append(results.Results, result) - currentFile = match.Path.Text case "context": var ctx rgContext @@ -302,19 +303,20 @@ func (s *Searcher) parseOutput(output *bytes.Buffer, maxResults int) (*SearchRes lineText := strings.TrimRight(ctx.Lines.Text, "\n\r") - // Determine if this is before or after context + isAfter := false if len(results.Results) > 0 { - lastResult := &results.Results[len(results.Results)-1] - if lastResult.File == ctx.Path.Text && ctx.LineNumber > lastResult.Line { - // This is after context - lastResult.Context.After = append(lastResult.Context.After, lineText) - } else if ctx.Path.Text == currentFile || currentFile == "" { - // This is before context for a potential upcoming match - contextBefore[ctx.Path.Text] = append(contextBefore[ctx.Path.Text], lineText) + last := &results.Results[len(results.Results)-1] + if last.File == ctx.Path.Text && ctx.LineNumber > last.Line { + last.Context.After = append(last.Context.After, lineText) + isAfter = true } - } else { - // Before any match - store as potential before context - contextBefore[ctx.Path.Text] = append(contextBefore[ctx.Path.Text], lineText) + } + if !isAfter { + if pendingFile != ctx.Path.Text { + pendingBefore = nil + pendingFile = ctx.Path.Text + } + pendingBefore = append(pendingBefore, lineText) } case "summary": diff --git a/internal/search/search_test.go b/internal/search/search_test.go index 4bf89a9..ed58528 100644 --- a/internal/search/search_test.go +++ b/internal/search/search_test.go @@ -89,7 +89,7 @@ func TestBuildArgs(t *testing.T) { MaxResults: 10, Regex: true, }, - expected: []string{"--json", "--max-count=10", "--", "test", "."}, + expected: []string{"--json", "--max-total-count=10", "--", "test", "."}, }, } diff --git a/internal/server/handlers_ast.go b/internal/server/handlers_ast.go new file mode 100644 index 0000000..160195e --- /dev/null +++ b/internal/server/handlers_ast.go @@ -0,0 +1,226 @@ +// Package server implements the MCP server for file operations. +package server + +import ( + "context" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/lukaszraczylo/mcp-filepuff/internal/parser" + "github.com/lukaszraczylo/mcp-filepuff/internal/query" + "github.com/lukaszraczylo/mcp-filepuff/pkg/protocol" + "github.com/mark3labs/mcp-go/mcp" +) + +// handleASTQuery handles the ast_query tool. +func (s *Server) handleASTQuery(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + // Acquire semaphore to limit concurrent queries (prevents CPU exhaustion) + select { + case s.querySem <- struct{}{}: + defer func() { <-s.querySem }() + case <-ctx.Done(): + return mcp.NewToolResultError("request cancelled"), nil + } + + pattern, err := request.RequireString("pattern") + if err != nil { + return mcp.NewToolResultError("pattern is required"), nil + } + + language, err := request.RequireString("language") + if err != nil { + return mcp.NewToolResultError("language is required"), nil + } + + // Build query + astQuery := &query.ASTQuery{ + Pattern: pattern, + Language: language, + Filters: query.QueryFilters{ + NameMatches: request.GetString("name_matches", ""), + NameExact: request.GetString("name_exact", ""), + KindIn: request.GetStringSlice("kind_in", nil), + }, + } + + maxResults := request.GetInt("max_results", 100) + paths := request.GetStringSlice("paths", nil) + + // Default to workspace root if no paths specified + if len(paths) == 0 { + paths = []string{s.cfg.WorkspaceRoot} + } + + // Find files to search based on language + ext := languageToExtension(language) + if ext == "" { + return mcp.NewToolResultError(fmt.Sprintf("unsupported language: %s", language)), nil + } + + var allResults []query.MatchResult + + // Walk through paths and find matching files + for _, searchPath := range paths { + // Validate path is within workspace + if !s.cfg.IsPathAllowed(searchPath) { + continue + } + + err := filepath.Walk(searchPath, func(path string, info os.FileInfo, err error) error { + // Check for context cancellation + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + + if err != nil { + return nil // Skip files with errors + } + + if info.IsDir() { + // Skip hidden directories + if strings.HasPrefix(info.Name(), ".") { + return filepath.SkipDir + } + return nil + } + + // Check file extension matches language + if !strings.HasSuffix(path, ext) { + return nil + } + + // Read and parse file + content, err := os.ReadFile(path) + if err != nil { + return nil // Skip unreadable files + } + + // Check file size + if int64(len(content)) > s.cfg.MaxFileSize { + return nil // Skip large files + } + + // Parse file + result, err := s.parser.Parse(ctx, path, content) + if err != nil { + return nil // Skip unparseable files + } + + // Run query + matches, err := s.matcher.Match(ctx, astQuery, result.Tree, content, path) + if err != nil { + return nil // Skip on error + } + + allResults = append(allResults, matches...) + + // Stop if we have enough results + if maxResults > 0 && len(allResults) >= maxResults { + return filepath.SkipAll + } + + return nil + }) + if err != nil { + s.logger.Warn("error walking path", "path", searchPath, "error", err) + } + } + + // Format and return results + output := query.FormatResults(allResults, maxResults) + return mcp.NewToolResultText(output), nil +} + +// generateASTSummary generates a summary of symbols in the file. +func (s *Server) generateASTSummary(ctx context.Context, path string, content []byte) string { + // Parse the file + result, err := s.parser.Parse(ctx, path, content) + if err != nil { + return "" // Silently skip AST if parsing fails + } + + // Extract symbols + lang := protocol.DetectLanguage(path) + symbols := parser.ExtractSymbols(result.Tree, content, lang, path) + if len(symbols) == 0 { + return "" + } + + var sb strings.Builder + + // Get relative path + relPath := path + if absPath, err := filepath.Abs(path); err == nil { + if rel, err := filepath.Rel(s.cfg.WorkspaceRoot, absPath); err == nil && !strings.HasPrefix(rel, "..") { + relPath = rel + } + } + + sb.WriteString(fmt.Sprintf("**%s** (%d lines, %s)\n\n", relPath, len(splitLines(string(content))), lang)) + sb.WriteString("Symbols:\n") + + for _, sym := range symbols { + kindStr := symbolKindIcon(sym.Kind) + sb.WriteString(fmt.Sprintf(" %s %s L%d\n", kindStr, sym.Name, sym.Location.Line)) + } + + return sb.String() +} + +// symbolKindIcon returns an icon/prefix for a symbol kind. +func symbolKindIcon(kind protocol.SymbolKind) string { + switch kind { + case protocol.SymbolFunction: + return "func" + case protocol.SymbolMethod: + return "meth" + case protocol.SymbolClass: + return "class" + case protocol.SymbolStruct: + return "struct" + case protocol.SymbolInterface: + return "iface" + case protocol.SymbolVariable: + return "var" + case protocol.SymbolConstant: + return "const" + case protocol.SymbolType: + return "type" + case protocol.SymbolField: + return "field" + case protocol.SymbolProperty: + return "prop" + case protocol.SymbolModule: + return "mod" + case protocol.SymbolPackage: + return "pkg" + default: + return "sym" + } +} + +// languageToExtension maps language names to file extensions. +func languageToExtension(language string) string { + switch strings.ToLower(language) { + case "go": + return ".go" + case "typescript": + return ".ts" + case "javascript": + return ".js" + case "python": + return ".py" + case "c": + return ".c" + case "cpp", "c++": + return ".cpp" + case "elixir": + return ".ex" + default: + return "" + } +} diff --git a/internal/server/handlers_edit.go b/internal/server/handlers_edit.go new file mode 100644 index 0000000..edd702d --- /dev/null +++ b/internal/server/handlers_edit.go @@ -0,0 +1,91 @@ +// Package server implements the MCP server for file operations. +package server + +import ( + "context" + "fmt" + "strings" + + "github.com/lukaszraczylo/mcp-filepuff/internal/edit" + "github.com/lukaszraczylo/mcp-filepuff/pkg/errors" + "github.com/mark3labs/mcp-go/mcp" +) + +// handleEditPreview handles the edit_preview tool. +func (s *Server) handleEditPreview(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + return s.handleEdit(ctx, request, false) +} + +// handleEditApply handles the edit_apply tool. +func (s *Server) handleEditApply(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + return s.handleEdit(ctx, request, true) +} + +// handleEdit is the shared implementation for edit_preview and edit_apply. +func (s *Server) handleEdit(ctx context.Context, request mcp.CallToolRequest, apply bool) (*mcp.CallToolResult, error) { + file, err := request.RequireString("file") + if err != nil { + return mcp.NewToolResultError("file is required"), nil + } + + operation, err := request.RequireString("operation") + if err != nil { + return mcp.NewToolResultError("operation is required"), nil + } + + // Validate path + if !s.cfg.IsPathAllowed(file) { + return mcp.NewToolResultError("file is outside workspace root"), nil + } + + // Note: We no longer validate language support here. + // The edit engine automatically detects whether to use AST or text mode. + + // Build edit request with both AST and text-mode selectors + astEdit := &edit.ASTEdit{ + File: file, + Operation: edit.EditOperation(operation), + NewContent: request.GetString("new_content", ""), + Selector: edit.ASTSelector{ + // AST-mode selectors + Kind: request.GetString("selector_kind", ""), + Name: request.GetString("selector_name", ""), + AtLine: request.GetInt("selector_line", 0), + Index: request.GetInt("selector_index", 0), + // Text-mode selectors + LineEnd: request.GetInt("selector_line_end", 0), + Text: request.GetString("selector_text", ""), + TextPattern: request.GetString("selector_pattern", ""), + }, + } + + // Perform edit + var result *edit.EditResult + if apply { + result, err = s.editor.Apply(ctx, astEdit) + } else { + result, err = s.editor.Preview(ctx, astEdit) + } + + if err != nil { + return mcp.NewToolResultError(fmt.Sprintf("edit failed: %s", errors.SanitizeError(err))), nil + } + + if !result.Success { + return mcp.NewToolResultError(result.Error), nil + } + + // Format output + var output strings.Builder + if apply { + output.WriteString("**Edit Applied Successfully**\n\n") + } else { + output.WriteString("**Edit Preview**\n\n") + } + + output.WriteString("Diff:\n```diff\n") + output.WriteString(result.Diff) + output.WriteString("```\n") + + return mcp.NewToolResultText(output.String()), nil +} diff --git a/internal/server/handlers_file.go b/internal/server/handlers_file.go new file mode 100644 index 0000000..c63bf79 --- /dev/null +++ b/internal/server/handlers_file.go @@ -0,0 +1,185 @@ +// Package server implements the MCP server for file operations. +package server + +import ( + "bufio" + "context" + "fmt" + "os" + "strings" + "time" + + "github.com/lukaszraczylo/mcp-filepuff/internal/search" + "github.com/lukaszraczylo/mcp-filepuff/pkg/errors" + "github.com/mark3labs/mcp-go/mcp" +) + +// handleFileSearch handles the file_search tool. +func (s *Server) handleFileSearch(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + start := time.Now() + defer func() { + s.logger.Debug("file_search completed", + "duration_ms", time.Since(start).Milliseconds(), + ) + }() + + if s.searcher == nil { + return mcp.NewToolResultError("ripgrep (rg) is not available. Please install it: https://github.com/BurntSushi/ripgrep#installation"), nil + } + + // Parse request arguments using SDK helpers + pattern, err := request.RequireString("pattern") + if err != nil { + return mcp.NewToolResultError("pattern is required"), nil + } + + req := &search.Request{ + Pattern: pattern, + Paths: request.GetStringSlice("paths", nil), + FileTypes: request.GetStringSlice("file_types", nil), + IgnoreCase: request.GetBool("ignore_case", false), + Regex: request.GetBool("regex", true), + ContextLines: request.GetInt("context_lines", 2), + MaxResults: request.GetInt("max_results", 0), + } + + // Execute search + results, err := s.searcher.Search(ctx, req) + if err != nil { + s.logger.Warn("search error", "error", err) + return mcp.NewToolResultError(fmt.Sprintf("search error: %s", errors.SanitizeError(err))), nil + } + + s.logger.Info("search completed", + "pattern", pattern, + "results_count", len(results.Results), + "truncated", results.Truncated, + ) + + // Format results + output := s.searcher.FormatResults(results) + return mcp.NewToolResultText(output), nil +} + +// handleFileRead handles the file_read tool. +func (s *Server) handleFileRead(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + // Acquire semaphore to limit concurrent reads (prevents memory exhaustion) + select { + case s.readSem <- struct{}{}: + defer func() { <-s.readSem }() + case <-ctx.Done(): + return mcp.NewToolResultError("request cancelled"), nil + } + + path, err := request.RequireString("path") + if err != nil { + return mcp.NewToolResultError("path is required"), nil + } + + // Validate path is within workspace + if !s.cfg.IsPathAllowed(path) { + return mcp.NewToolResultError("path is outside workspace root"), nil + } + + // Read file + content, err := os.ReadFile(path) + if err != nil { + if os.IsNotExist(err) { + return mcp.NewToolResultError(fmt.Sprintf("file not found: %s", path)), nil + } + if os.IsPermission(err) { + return mcp.NewToolResultError(fmt.Sprintf("permission denied: %s", path)), nil + } + s.logger.Warn("file read error", "path", path, "error", err) + return mcp.NewToolResultError("error reading file"), nil + } + + // Check file size + if int64(len(content)) > s.cfg.MaxFileSize { + return mcp.NewToolResultError(fmt.Sprintf("file too large (%d bytes, max %d)", len(content), s.cfg.MaxFileSize)), nil + } + + // Handle line range + lines := splitLines(string(content)) + lineStart := request.GetInt("line_start", 1) + lineEnd := request.GetInt("line_end", len(lines)) + + // Clamp to valid range + if lineStart < 1 { + lineStart = 1 + } + if lineEnd > len(lines) { + lineEnd = len(lines) + } + if lineStart > lineEnd { + lineStart = lineEnd + } + + var output strings.Builder + + // Include AST summary if requested + includeAST := request.GetBool("include_ast", false) + symbolsOnly := request.GetBool("symbols_only", false) + maxLines := request.GetInt("max_lines", 0) + + // Validate symbols_only requires include_ast + if symbolsOnly && !includeAST { + return mcp.NewToolResultError("symbols_only requires include_ast=true"), nil + } + + if includeAST { + astSummary := s.generateASTSummary(ctx, path, content) + if astSummary != "" { + output.WriteString(astSummary) + if !symbolsOnly { + output.WriteString("\n---\n\n") + } + } + } + + // Skip file content if symbols_only mode + if !symbolsOnly { + // Apply max_lines limit if specified + effectiveEnd := lineEnd + if maxLines > 0 && (lineEnd-lineStart+1) > maxLines { + effectiveEnd = lineStart + maxLines - 1 + if effectiveEnd < lineEnd { + // Add note that output was truncated + defer func() { + output.WriteString(fmt.Sprintf("\n[... %d more lines omitted for token efficiency. Use line_start/line_end or increase max_lines to see more]\n", lineEnd-effectiveEnd)) + }() + } + } + + // Extract requested lines + for i := lineStart - 1; i < effectiveEnd && i < len(lines); i++ { + output.WriteString(fmt.Sprintf("%4d│ %s\n", i+1, lines[i])) + } + } + + return mcp.NewToolResultText(output.String()), nil +} + +// splitLines splits a string into lines. +// For large files (> 1MB), uses bufio.Scanner which is more memory efficient. +// For smaller files, uses simple string split which is faster. +func splitLines(s string) []string { + const largeSizeThreshold = 1024 * 1024 // 1MB + + if len(s) > largeSizeThreshold { + // Use scanner for large files + scanner := bufio.NewScanner(strings.NewReader(s)) + var lines []string + for scanner.Scan() { + lines = append(lines, scanner.Text()) + } + // Handle potential error and add empty line if string ended with newline + if len(s) > 0 && s[len(s)-1] == '\n' { + lines = append(lines, "") + } + return lines + } + + // Use optimized stdlib implementation for smaller files (2-3x faster than manual loop) + return strings.Split(s, "\n") +} diff --git a/internal/server/handlers_lsp.go b/internal/server/handlers_lsp.go new file mode 100644 index 0000000..abd9c7d --- /dev/null +++ b/internal/server/handlers_lsp.go @@ -0,0 +1,211 @@ +// Package server implements the MCP server for file operations. +package server + +import ( + "context" + "fmt" + "os" + "strings" + + "github.com/lukaszraczylo/mcp-filepuff/internal/lsp" + "github.com/lukaszraczylo/mcp-filepuff/internal/parser" + "github.com/lukaszraczylo/mcp-filepuff/pkg/errors" + "github.com/mark3labs/mcp-go/mcp" +) + +// handleSymbolAt handles the symbol_at tool. +func (s *Server) handleSymbolAt(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + file, err := request.RequireString("file") + if err != nil { + return mcp.NewToolResultError("file is required"), nil + } + + line := request.GetInt("line", 0) + if line <= 0 { + return mcp.NewToolResultError("line must be positive"), nil + } + + col := request.GetInt("column", 0) + if col <= 0 { + return mcp.NewToolResultError("column must be positive"), nil + } + + // Validate path + if !s.cfg.IsPathAllowed(file) { + return mcp.NewToolResultError("file is outside workspace root"), nil + } + + // Try LSP hover + hover, err := s.lspManager.Hover(ctx, file, line, col) + if err != nil { + // Fall back to AST-based info + return s.handleSymbolAtFallback(ctx, file, line, col) + } + + if hover == nil { + return mcp.NewToolResultText("No symbol information available at this position."), nil + } + + var output strings.Builder + output.WriteString("**Symbol Information**\n\n") + output.WriteString(hover.Contents.Value) + + return mcp.NewToolResultText(output.String()), nil +} + +// handleSymbolAtFallback provides AST-based symbol info when LSP is unavailable. +func (s *Server) handleSymbolAtFallback(ctx context.Context, file string, line, col int) (*mcp.CallToolResult, error) { + content, err := os.ReadFile(file) + if err != nil { + return mcp.NewToolResultError(fmt.Sprintf("failed to read file: %s", errors.SanitizeError(err))), nil + } + + result, err := s.parser.Parse(ctx, file, content) + if err != nil { + return mcp.NewToolResultError(fmt.Sprintf("failed to parse file: %s", errors.SanitizeError(err))), nil + } + + node := parser.FindNodeAtPosition(result.Tree, line, col) + if node == nil { + return mcp.NewToolResultText("No symbol at this position."), nil + } + + var output strings.Builder + output.WriteString("**Symbol Information** (AST fallback)\n\n") + output.WriteString(fmt.Sprintf("Node type: `%s`\n", node.Type())) + output.WriteString(fmt.Sprintf("Text: `%s`\n", parser.GetNodeText(node, content))) + + return mcp.NewToolResultText(output.String()), nil +} + +// handleFindDefinition handles the find_definition tool. +func (s *Server) handleFindDefinition(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + file, err := request.RequireString("file") + if err != nil { + return mcp.NewToolResultError("file is required"), nil + } + + line := request.GetInt("line", 0) + if line <= 0 { + return mcp.NewToolResultError("line must be positive"), nil + } + + col := request.GetInt("column", 0) + if col <= 0 { + return mcp.NewToolResultError("column must be positive"), nil + } + + // Validate path + if !s.cfg.IsPathAllowed(file) { + return mcp.NewToolResultError("file is outside workspace root"), nil + } + + locations, err := s.lspManager.Definition(ctx, file, line, col) + if err != nil { + return mcp.NewToolResultError(fmt.Sprintf("definition lookup failed: %s", errors.SanitizeError(err))), nil + } + + if len(locations) == 0 { + return mcp.NewToolResultText("No definition found."), nil + } + + var output strings.Builder + output.WriteString(fmt.Sprintf("Found %d definition(s):\n\n", len(locations))) + + for _, loc := range locations { + filePath := lsp.URIToFile(loc.URI) + output.WriteString(fmt.Sprintf("**%s:%d:%d**\n", filePath, loc.Range.Start.Line+1, loc.Range.Start.Character+1)) + + // Try to read a preview snippet + preview := readFilePreview(filePath, loc.Range.Start.Line+1, 3) + if preview != "" { + output.WriteString("```\n") + output.WriteString(preview) + output.WriteString("```\n") + } + output.WriteString("\n") + } + + return mcp.NewToolResultText(output.String()), nil +} + +// handleFindReferences handles the find_references tool. +func (s *Server) handleFindReferences(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + file, err := request.RequireString("file") + if err != nil { + return mcp.NewToolResultError("file is required"), nil + } + + line := request.GetInt("line", 0) + if line <= 0 { + return mcp.NewToolResultError("line must be positive"), nil + } + + col := request.GetInt("column", 0) + if col <= 0 { + return mcp.NewToolResultError("column must be positive"), nil + } + + includeDecl := request.GetBool("include_declaration", true) + + // Validate path + if !s.cfg.IsPathAllowed(file) { + return mcp.NewToolResultError("file is outside workspace root"), nil + } + + locations, err := s.lspManager.References(ctx, file, line, col, includeDecl) + if err != nil { + return mcp.NewToolResultError(fmt.Sprintf("references lookup failed: %s", errors.SanitizeError(err))), nil + } + + if len(locations) == 0 { + return mcp.NewToolResultText("No references found."), nil + } + + var output strings.Builder + output.WriteString(fmt.Sprintf("Found %d reference(s):\n\n", len(locations))) + + // Group by file + fileGroups := make(map[string][]lsp.Location) + for _, loc := range locations { + filePath := lsp.URIToFile(loc.URI) + fileGroups[filePath] = append(fileGroups[filePath], loc) + } + + for filePath, locs := range fileGroups { + output.WriteString(fmt.Sprintf("**%s** (%d)\n", filePath, len(locs))) + for _, loc := range locs { + output.WriteString(fmt.Sprintf(" L%d:%d\n", loc.Range.Start.Line+1, loc.Range.Start.Character+1)) + } + output.WriteString("\n") + } + + return mcp.NewToolResultText(output.String()), nil +} + +// readFilePreview reads a few lines from a file around the given line. +func readFilePreview(file string, line, contextLines int) string { + content, err := os.ReadFile(file) + if err != nil { + return "" + } + + lines := splitLines(string(content)) + startLine := max(1, line-contextLines) + endLine := min(line+contextLines, len(lines)) + + var preview strings.Builder + for i := startLine - 1; i < endLine && i < len(lines); i++ { + lineText := lines[i] + if len(lineText) > PreviewLineMaxLength { + lineText = lineText[:PreviewLineMaxLength] + "..." + } + prefix := " " + if i+1 == line { + prefix = "> " + } + preview.WriteString(fmt.Sprintf("%s%4d: %s\n", prefix, i+1, lineText)) + } + + return preview.String() +} diff --git a/internal/server/integration_test.go b/internal/server/integration_test.go index dc78c70..87be036 100644 --- a/internal/server/integration_test.go +++ b/internal/server/integration_test.go @@ -52,6 +52,7 @@ func Hello() string { } if result == nil { t.Fatal("handlePing() returned nil") + return } if len(result.Content) == 0 { t.Fatal("handlePing() returned empty content") @@ -70,6 +71,7 @@ func Hello() string { } if result == nil { t.Fatal("handleFileRead() returned nil") + return } if len(result.Content) == 0 { t.Fatal("handleFileRead() returned empty content") @@ -90,6 +92,7 @@ func Hello() string { } if result == nil { t.Fatal("handleASTQuery() returned nil") + return } }) @@ -110,6 +113,7 @@ func Hello() string { } if previewResult == nil { t.Fatal("handleEditPreview() returned nil") + return } // Verify file unchanged after preview @@ -127,6 +131,7 @@ func Hello() string { } if applyResult == nil { t.Fatal("handleEditApply() returned nil") + return } // Verify file changed after apply @@ -352,6 +357,7 @@ func Add(a, b int) int { } if readResult == nil { t.Fatal("handleFileRead() returned nil") + return } // 2. Query AST @@ -367,6 +373,7 @@ func Add(a, b int) int { } if queryResult == nil { t.Fatal("handleASTQuery() returned nil") + return } // 3. Preview edit @@ -384,6 +391,7 @@ func Add(a, b int) int { } if editResult == nil { t.Fatal("handleEditPreview() returned nil") + return } }) } diff --git a/internal/server/server.go b/internal/server/server.go index 700c8a9..4ae29ea 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -2,14 +2,10 @@ package server import ( - "bufio" "context" - "fmt" "log/slog" "os" "os/signal" - "path/filepath" - "strings" "syscall" "time" @@ -19,11 +15,22 @@ import ( "github.com/lukaszraczylo/mcp-filepuff/internal/parser" "github.com/lukaszraczylo/mcp-filepuff/internal/query" "github.com/lukaszraczylo/mcp-filepuff/internal/search" - "github.com/lukaszraczylo/mcp-filepuff/pkg/protocol" "github.com/mark3labs/mcp-go/mcp" "github.com/mark3labs/mcp-go/server" ) +// MaxConcurrentReads limits concurrent file read operations to prevent memory exhaustion. +const MaxConcurrentReads = 10 + +// MaxConcurrentQueries limits concurrent AST query operations to prevent CPU exhaustion. +const MaxConcurrentQueries = 5 + +// ServerShutdownTimeout is the timeout for graceful server shutdown. +const ServerShutdownTimeout = 10 * time.Second + +// PreviewLineMaxLength is the maximum length for preview lines before truncation. +const PreviewLineMaxLength = 100 + // Server represents the MCP file operations server. type Server struct { cfg *config.Config @@ -34,17 +41,21 @@ type Server struct { matcher *query.Matcher lspManager *lsp.Manager editor *edit.Engine + readSem chan struct{} // Semaphore for limiting concurrent file reads + querySem chan struct{} // Semaphore for limiting concurrent AST queries } // New creates a new MCP server instance. func New(cfg *config.Config, logger *slog.Logger) (*Server, error) { parserRegistry := parser.NewRegistryWithSize(cfg.MaxParseSize) s := &Server{ - cfg: cfg, - logger: logger, - parser: parserRegistry, - matcher: query.NewMatcher(parserRegistry), - editor: edit.NewEngine(parserRegistry), + cfg: cfg, + logger: logger, + parser: parserRegistry, + matcher: query.NewMatcher(parserRegistry), + editor: edit.NewEngine(parserRegistry), + readSem: make(chan struct{}, MaxConcurrentReads), + querySem: make(chan struct{}, MaxConcurrentQueries), } // Initialize searcher @@ -341,644 +352,6 @@ func (s *Server) handlePing(ctx context.Context, request mcp.CallToolRequest) (* return mcp.NewToolResultText("pong"), nil } -// handleFileSearch handles the file_search tool. -func (s *Server) handleFileSearch(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - start := time.Now() - defer func() { - s.logger.Debug("file_search completed", - "duration_ms", time.Since(start).Milliseconds(), - ) - }() - - if s.searcher == nil { - return mcp.NewToolResultError("ripgrep (rg) is not available. Please install it: https://github.com/BurntSushi/ripgrep#installation"), nil - } - - // Parse request arguments using SDK helpers - pattern, err := request.RequireString("pattern") - if err != nil { - return mcp.NewToolResultError("pattern is required"), nil - } - - req := &search.Request{ - Pattern: pattern, - Paths: request.GetStringSlice("paths", nil), - FileTypes: request.GetStringSlice("file_types", nil), - IgnoreCase: request.GetBool("ignore_case", false), - Regex: request.GetBool("regex", true), - ContextLines: request.GetInt("context_lines", 2), - MaxResults: request.GetInt("max_results", 0), - } - - // Execute search - results, err := s.searcher.Search(ctx, req) - if err != nil { - return mcp.NewToolResultError(fmt.Sprintf("search error: %v", err)), nil - } - - s.logger.Info("search completed", - "pattern", pattern, - "results_count", len(results.Results), - "truncated", results.Truncated, - ) - - // Format results - output := s.searcher.FormatResults(results) - return mcp.NewToolResultText(output), nil -} - -// handleFileRead handles the file_read tool. -func (s *Server) handleFileRead(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - path, err := request.RequireString("path") - if err != nil { - return mcp.NewToolResultError("path is required"), nil - } - - // Validate path is within workspace - if !s.cfg.IsPathAllowed(path) { - return mcp.NewToolResultError("path is outside workspace root"), nil - } - - // Read file - content, err := os.ReadFile(path) - if err != nil { - if os.IsNotExist(err) { - return mcp.NewToolResultError(fmt.Sprintf("file not found: %s", path)), nil - } - if os.IsPermission(err) { - return mcp.NewToolResultError(fmt.Sprintf("permission denied: %s", path)), nil - } - return mcp.NewToolResultError(fmt.Sprintf("error reading file: %v", err)), nil - } - - // Check file size - if int64(len(content)) > s.cfg.MaxFileSize { - return mcp.NewToolResultError(fmt.Sprintf("file too large (%d bytes, max %d)", len(content), s.cfg.MaxFileSize)), nil - } - - // Handle line range - lines := splitLines(string(content)) - lineStart := request.GetInt("line_start", 1) - lineEnd := request.GetInt("line_end", len(lines)) - - // Clamp to valid range - if lineStart < 1 { - lineStart = 1 - } - if lineEnd > len(lines) { - lineEnd = len(lines) - } - if lineStart > lineEnd { - lineStart = lineEnd - } - - var output strings.Builder - - // Include AST summary if requested - includeAST := request.GetBool("include_ast", false) - symbolsOnly := request.GetBool("symbols_only", false) - maxLines := request.GetInt("max_lines", 0) - - // Validate symbols_only requires include_ast - if symbolsOnly && !includeAST { - return mcp.NewToolResultError("symbols_only requires include_ast=true"), nil - } - - if includeAST { - astSummary := s.generateASTSummary(ctx, path, content) - if astSummary != "" { - output.WriteString(astSummary) - if !symbolsOnly { - output.WriteString("\n---\n\n") - } - } - } - - // Skip file content if symbols_only mode - if !symbolsOnly { - // Apply max_lines limit if specified - effectiveEnd := lineEnd - if maxLines > 0 && (lineEnd-lineStart+1) > maxLines { - effectiveEnd = lineStart + maxLines - 1 - if effectiveEnd < lineEnd { - // Add note that output was truncated - defer func() { - output.WriteString(fmt.Sprintf("\n[... %d more lines omitted for token efficiency. Use line_start/line_end or increase max_lines to see more]\n", lineEnd-effectiveEnd)) - }() - } - } - - // Extract requested lines - for i := lineStart - 1; i < effectiveEnd && i < len(lines); i++ { - output.WriteString(fmt.Sprintf("%4d│ %s\n", i+1, lines[i])) - } - } - - return mcp.NewToolResultText(output.String()), nil -} - -// generateASTSummary generates a summary of symbols in the file. -func (s *Server) generateASTSummary(ctx context.Context, path string, content []byte) string { - // Parse the file - result, err := s.parser.Parse(ctx, path, content) - if err != nil { - return "" // Silently skip AST if parsing fails - } - - // Extract symbols - lang := protocol.DetectLanguage(path) - symbols := parser.ExtractSymbols(result.Tree, content, lang, path) - if len(symbols) == 0 { - return "" - } - - var sb strings.Builder - - // Get relative path - relPath := path - if absPath, err := filepath.Abs(path); err == nil { - if rel, err := filepath.Rel(s.cfg.WorkspaceRoot, absPath); err == nil && !strings.HasPrefix(rel, "..") { - relPath = rel - } - } - - sb.WriteString(fmt.Sprintf("**%s** (%d lines, %s)\n\n", relPath, len(splitLines(string(content))), lang)) - sb.WriteString("Symbols:\n") - - for _, sym := range symbols { - kindStr := symbolKindIcon(sym.Kind) - sb.WriteString(fmt.Sprintf(" %s %s L%d\n", kindStr, sym.Name, sym.Location.Line)) - } - - return sb.String() -} - -// symbolKindIcon returns an icon/prefix for a symbol kind. -func symbolKindIcon(kind protocol.SymbolKind) string { - switch kind { - case protocol.SymbolFunction: - return "func" - case protocol.SymbolMethod: - return "meth" - case protocol.SymbolClass: - return "class" - case protocol.SymbolStruct: - return "struct" - case protocol.SymbolInterface: - return "iface" - case protocol.SymbolVariable: - return "var" - case protocol.SymbolConstant: - return "const" - case protocol.SymbolType: - return "type" - case protocol.SymbolField: - return "field" - case protocol.SymbolProperty: - return "prop" - case protocol.SymbolModule: - return "mod" - case protocol.SymbolPackage: - return "pkg" - default: - return "sym" - } -} - -func splitLines(s string) []string { - // For large files (> 1MB), use bufio.Scanner which is more memory efficient - // For smaller files, use simple string split which is faster - const largeSizeThreshold = 1024 * 1024 // 1MB - - if len(s) > largeSizeThreshold { - // Use scanner for large files - scanner := bufio.NewScanner(strings.NewReader(s)) - var lines []string - for scanner.Scan() { - lines = append(lines, scanner.Text()) - } - // Handle potential error and add empty line if string ended with newline - if len(s) > 0 && s[len(s)-1] == '\n' { - lines = append(lines, "") - } - return lines - } - - // Use optimized stdlib implementation for smaller files (2-3x faster than manual loop) - return strings.Split(s, "\n") -} - -// handleASTQuery handles the ast_query tool. -func (s *Server) handleASTQuery(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - pattern, err := request.RequireString("pattern") - if err != nil { - return mcp.NewToolResultError("pattern is required"), nil - } - - language, err := request.RequireString("language") - if err != nil { - return mcp.NewToolResultError("language is required"), nil - } - - // Build query - astQuery := &query.ASTQuery{ - Pattern: pattern, - Language: language, - Filters: query.QueryFilters{ - NameMatches: request.GetString("name_matches", ""), - NameExact: request.GetString("name_exact", ""), - KindIn: request.GetStringSlice("kind_in", nil), - }, - } - - maxResults := request.GetInt("max_results", 100) - paths := request.GetStringSlice("paths", nil) - - // Default to workspace root if no paths specified - if len(paths) == 0 { - paths = []string{s.cfg.WorkspaceRoot} - } - - // Find files to search based on language - ext := languageToExtension(language) - if ext == "" { - return mcp.NewToolResultError(fmt.Sprintf("unsupported language: %s", language)), nil - } - - var allResults []query.MatchResult - - // Walk through paths and find matching files - for _, searchPath := range paths { - // Validate path is within workspace - if !s.cfg.IsPathAllowed(searchPath) { - continue - } - - err := filepath.Walk(searchPath, func(path string, info os.FileInfo, err error) error { - // Check for context cancellation - select { - case <-ctx.Done(): - return ctx.Err() - default: - } - - if err != nil { - return nil // Skip files with errors - } - - if info.IsDir() { - // Skip hidden directories - if strings.HasPrefix(info.Name(), ".") { - return filepath.SkipDir - } - return nil - } - - // Check file extension matches language - if !strings.HasSuffix(path, ext) { - return nil - } - - // Read and parse file - content, err := os.ReadFile(path) - if err != nil { - return nil // Skip unreadable files - } - - // Check file size - if int64(len(content)) > s.cfg.MaxFileSize { - return nil // Skip large files - } - - // Parse file - result, err := s.parser.Parse(ctx, path, content) - if err != nil { - return nil // Skip unparseable files - } - - // Run query - matches, err := s.matcher.Match(ctx, astQuery, result.Tree, content, path) - if err != nil { - return nil // Skip on error - } - - allResults = append(allResults, matches...) - - // Stop if we have enough results - if maxResults > 0 && len(allResults) >= maxResults { - return filepath.SkipAll - } - - return nil - }) - if err != nil { - s.logger.Warn("error walking path", "path", searchPath, "error", err) - } - } - - // Format and return results - output := query.FormatResults(allResults, maxResults) - return mcp.NewToolResultText(output), nil -} - -// languageToExtension maps language names to file extensions. -func languageToExtension(language string) string { - switch strings.ToLower(language) { - case "go": - return ".go" - case "typescript": - return ".ts" - case "javascript": - return ".js" - case "python": - return ".py" - case "c": - return ".c" - case "cpp", "c++": - return ".cpp" - case "elixir": - return ".ex" - default: - return "" - } -} - -// handleSymbolAt handles the symbol_at tool. -func (s *Server) handleSymbolAt(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - file, err := request.RequireString("file") - if err != nil { - return mcp.NewToolResultError("file is required"), nil - } - - line := request.GetInt("line", 0) - if line <= 0 { - return mcp.NewToolResultError("line must be positive"), nil - } - - col := request.GetInt("column", 0) - if col <= 0 { - return mcp.NewToolResultError("column must be positive"), nil - } - - // Validate path - if !s.cfg.IsPathAllowed(file) { - return mcp.NewToolResultError("file is outside workspace root"), nil - } - - // Try LSP hover - hover, err := s.lspManager.Hover(ctx, file, line, col) - if err != nil { - // Fall back to AST-based info - return s.handleSymbolAtFallback(ctx, file, line, col) - } - - if hover == nil { - return mcp.NewToolResultText("No symbol information available at this position."), nil - } - - var output strings.Builder - output.WriteString("**Symbol Information**\n\n") - output.WriteString(hover.Contents.Value) - - return mcp.NewToolResultText(output.String()), nil -} - -// handleSymbolAtFallback provides AST-based symbol info when LSP is unavailable. -func (s *Server) handleSymbolAtFallback(ctx context.Context, file string, line, col int) (*mcp.CallToolResult, error) { - content, err := os.ReadFile(file) - if err != nil { - return mcp.NewToolResultError(fmt.Sprintf("failed to read file: %v", err)), nil - } - - result, err := s.parser.Parse(ctx, file, content) - if err != nil { - return mcp.NewToolResultError(fmt.Sprintf("failed to parse file: %v", err)), nil - } - - node := parser.FindNodeAtPosition(result.Tree, line, col) - if node == nil { - return mcp.NewToolResultText("No symbol at this position."), nil - } - - var output strings.Builder - output.WriteString("**Symbol Information** (AST fallback)\n\n") - output.WriteString(fmt.Sprintf("Node type: `%s`\n", node.Type())) - output.WriteString(fmt.Sprintf("Text: `%s`\n", parser.GetNodeText(node, content))) - - return mcp.NewToolResultText(output.String()), nil -} - -// handleFindDefinition handles the find_definition tool. -func (s *Server) handleFindDefinition(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - file, err := request.RequireString("file") - if err != nil { - return mcp.NewToolResultError("file is required"), nil - } - - line := request.GetInt("line", 0) - if line <= 0 { - return mcp.NewToolResultError("line must be positive"), nil - } - - col := request.GetInt("column", 0) - if col <= 0 { - return mcp.NewToolResultError("column must be positive"), nil - } - - // Validate path - if !s.cfg.IsPathAllowed(file) { - return mcp.NewToolResultError("file is outside workspace root"), nil - } - - locations, err := s.lspManager.Definition(ctx, file, line, col) - if err != nil { - return mcp.NewToolResultError(fmt.Sprintf("definition lookup failed: %v", err)), nil - } - - if len(locations) == 0 { - return mcp.NewToolResultText("No definition found."), nil - } - - var output strings.Builder - output.WriteString(fmt.Sprintf("Found %d definition(s):\n\n", len(locations))) - - for _, loc := range locations { - filePath := lsp.URIToFile(loc.URI) - output.WriteString(fmt.Sprintf("**%s:%d:%d**\n", filePath, loc.Range.Start.Line+1, loc.Range.Start.Character+1)) - - // Try to read a preview snippet - preview := readFilePreview(filePath, loc.Range.Start.Line+1, 3) - if preview != "" { - output.WriteString("```\n") - output.WriteString(preview) - output.WriteString("```\n") - } - output.WriteString("\n") - } - - return mcp.NewToolResultText(output.String()), nil -} - -// handleFindReferences handles the find_references tool. -func (s *Server) handleFindReferences(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - file, err := request.RequireString("file") - if err != nil { - return mcp.NewToolResultError("file is required"), nil - } - - line := request.GetInt("line", 0) - if line <= 0 { - return mcp.NewToolResultError("line must be positive"), nil - } - - col := request.GetInt("column", 0) - if col <= 0 { - return mcp.NewToolResultError("column must be positive"), nil - } - - includeDecl := request.GetBool("include_declaration", true) - - // Validate path - if !s.cfg.IsPathAllowed(file) { - return mcp.NewToolResultError("file is outside workspace root"), nil - } - - locations, err := s.lspManager.References(ctx, file, line, col, includeDecl) - if err != nil { - return mcp.NewToolResultError(fmt.Sprintf("references lookup failed: %v", err)), nil - } - - if len(locations) == 0 { - return mcp.NewToolResultText("No references found."), nil - } - - var output strings.Builder - output.WriteString(fmt.Sprintf("Found %d reference(s):\n\n", len(locations))) - - // Group by file - fileGroups := make(map[string][]lsp.Location) - for _, loc := range locations { - filePath := lsp.URIToFile(loc.URI) - fileGroups[filePath] = append(fileGroups[filePath], loc) - } - - for filePath, locs := range fileGroups { - output.WriteString(fmt.Sprintf("**%s** (%d)\n", filePath, len(locs))) - for _, loc := range locs { - output.WriteString(fmt.Sprintf(" L%d:%d\n", loc.Range.Start.Line+1, loc.Range.Start.Character+1)) - } - output.WriteString("\n") - } - - return mcp.NewToolResultText(output.String()), nil -} - -// readFilePreview reads a few lines from a file around the given line. -func readFilePreview(file string, line, contextLines int) string { - content, err := os.ReadFile(file) - if err != nil { - return "" - } - - lines := splitLines(string(content)) - startLine := max(1, line-contextLines) - endLine := min(line+contextLines, len(lines)) - - var preview strings.Builder - for i := startLine - 1; i < endLine && i < len(lines); i++ { - lineText := lines[i] - if len(lineText) > 100 { - lineText = lineText[:100] + "..." - } - prefix := " " - if i+1 == line { - prefix = "> " - } - preview.WriteString(fmt.Sprintf("%s%4d: %s\n", prefix, i+1, lineText)) - } - - return preview.String() -} - -// handleEditPreview handles the edit_preview tool. -func (s *Server) handleEditPreview(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - return s.handleEdit(ctx, request, false) -} - -// handleEditApply handles the edit_apply tool. -func (s *Server) handleEditApply(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - return s.handleEdit(ctx, request, true) -} - -// handleEdit is the shared implementation for edit_preview and edit_apply. -func (s *Server) handleEdit(ctx context.Context, request mcp.CallToolRequest, apply bool) (*mcp.CallToolResult, error) { - file, err := request.RequireString("file") - if err != nil { - return mcp.NewToolResultError("file is required"), nil - } - - operation, err := request.RequireString("operation") - if err != nil { - return mcp.NewToolResultError("operation is required"), nil - } - - // Validate path - if !s.cfg.IsPathAllowed(file) { - return mcp.NewToolResultError("file is outside workspace root"), nil - } - - // Note: We no longer validate language support here. - // The edit engine automatically detects whether to use AST or text mode. - - // Build edit request with both AST and text-mode selectors - astEdit := &edit.ASTEdit{ - File: file, - Operation: edit.EditOperation(operation), - NewContent: request.GetString("new_content", ""), - Selector: edit.ASTSelector{ - // AST-mode selectors - Kind: request.GetString("selector_kind", ""), - Name: request.GetString("selector_name", ""), - AtLine: request.GetInt("selector_line", 0), - Index: request.GetInt("selector_index", 0), - // Text-mode selectors - LineEnd: request.GetInt("selector_line_end", 0), - Text: request.GetString("selector_text", ""), - TextPattern: request.GetString("selector_pattern", ""), - }, - } - - // Perform edit - var result *edit.EditResult - if apply { - result, err = s.editor.Apply(ctx, astEdit) - } else { - result, err = s.editor.Preview(ctx, astEdit) - } - - if err != nil { - return mcp.NewToolResultError(fmt.Sprintf("edit failed: %v", err)), nil - } - - if !result.Success { - return mcp.NewToolResultError(result.Error), nil - } - - // Format output - var output strings.Builder - if apply { - output.WriteString("**Edit Applied Successfully**\n\n") - } else { - output.WriteString("**Edit Preview**\n\n") - } - - output.WriteString("Diff:\n```diff\n") - output.WriteString(result.Diff) - output.WriteString("```\n") - - return mcp.NewToolResultText(output.String()), nil -} - // Run starts the MCP server and blocks until shutdown. func (s *Server) Run(ctx context.Context) error { // Set up signal handling for graceful shutdown @@ -1007,7 +380,7 @@ func (s *Server) Run(ctx context.Context) error { s.logger.Info("received shutdown signal", "signal", sig) // Create timeout context for shutdown - shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), 10*time.Second) + shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), ServerShutdownTimeout) defer shutdownCancel() // Call graceful shutdown @@ -1025,7 +398,7 @@ func (s *Server) Run(ctx context.Context) error { case <-ctx.Done(): // Context cancelled externally - shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), 10*time.Second) + shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), ServerShutdownTimeout) defer shutdownCancel() if err := s.Shutdown(shutdownCtx); err != nil { diff --git a/internal/server/server_test.go b/internal/server/server_test.go index 0f909aa..ff15327 100644 --- a/internal/server/server_test.go +++ b/internal/server/server_test.go @@ -29,8 +29,8 @@ func TestNew(t *testing.T) { if srv == nil { t.Fatal("New() returned nil server") + return } - if srv.cfg != cfg { t.Error("server config mismatch") } @@ -68,6 +68,7 @@ func TestHandlePing(t *testing.T) { if result == nil { t.Fatal("handlePing() returned nil result") + return } // Check that the result contains "pong" @@ -123,6 +124,7 @@ func Hello() { if result == nil { t.Fatal("handleFileRead() returned nil result") + return } contents := result.Content @@ -179,6 +181,7 @@ func Hello() { if result == nil { t.Fatal("handleFileRead() returned nil result") + return } contents := result.Content @@ -270,6 +273,7 @@ func Goodbye() error { if result == nil { t.Fatal("handleASTQuery() returned nil result") + return } contents := result.Content @@ -318,6 +322,7 @@ func Hello() { if result == nil { t.Fatal("handleEdit(preview) returned nil result") + return } // Verify file was NOT modified (it's just a preview) @@ -367,6 +372,7 @@ func Hello() { if result == nil { t.Fatal("handleEdit(apply) returned nil result") + return } // Verify file WAS modified diff --git a/internal/util/regex_cache.go b/internal/util/regex_cache.go index 1953737..e0e08bf 100644 --- a/internal/util/regex_cache.go +++ b/internal/util/regex_cache.go @@ -2,18 +2,74 @@ package util import ( + "fmt" "regexp" "sync" + "sync/atomic" +) + +const ( + // MaxPatternLength is the maximum allowed length for regex patterns. + // This prevents memory issues from extremely long patterns. + MaxPatternLength = 1000 + + // MaxCacheSize is the maximum number of patterns to cache. + // When exceeded, the cache is cleared to prevent unbounded memory growth. + MaxCacheSize = 10000 ) // regexCache is a global thread-safe cache for compiled regular expressions. // Caching regex compilation provides 10-50x speedup for repeated patterns. -var regexCache sync.Map // string -> *regexp.Regexp +var ( + regexCache sync.Map // string -> *regexp.Regexp + cacheSize atomic.Int64 +) -// CompileRegex compiles a regex pattern with caching for performance. +// RegexError represents an error during regex compilation or validation. +type RegexError struct { + Pattern string + Reason string + Err error +} + +func (e *RegexError) Error() string { + if e.Err != nil { + return fmt.Sprintf("regex error for pattern %q: %s: %v", e.Pattern, e.Reason, e.Err) + } + return fmt.Sprintf("regex error for pattern %q: %s", e.Pattern, e.Reason) +} + +func (e *RegexError) Unwrap() error { + return e.Err +} + +// ValidatePattern validates a regex pattern for safety. +// Returns an error if the pattern is too long or appears malicious. +func ValidatePattern(pattern string) error { + // Check pattern length + if len(pattern) > MaxPatternLength { + return &RegexError{ + Pattern: truncatePattern(pattern), + Reason: fmt.Sprintf("pattern too long (%d chars, max %d)", len(pattern), MaxPatternLength), + } + } + + // Note: Go's regexp package uses Thompson NFA which guarantees O(n) matching time, + // making it inherently resistant to ReDoS attacks. However, we still validate + // pattern length to prevent memory issues during compilation. + + return nil +} + +// CompileRegex compiles a regex pattern with caching and validation for security. // Thread-safe: uses LoadOrStore to prevent race conditions. -// Returns the compiled regex or an error if the pattern is invalid. +// Returns the compiled regex or an error if the pattern is invalid or unsafe. func CompileRegex(pattern string) (*regexp.Regexp, error) { + // Validate pattern first + if err := ValidatePattern(pattern); err != nil { + return nil, err + } + // Check cache first if cached, ok := regexCache.Load(pattern); ok { return cached.(*regexp.Regexp), nil @@ -22,20 +78,64 @@ func CompileRegex(pattern string) (*regexp.Regexp, error) { // Compile regex re, err := regexp.Compile(pattern) if err != nil { - return nil, err + return nil, &RegexError{ + Pattern: truncatePattern(pattern), + Reason: "invalid regex syntax", + Err: err, + } + } + + // Check cache size and clear if too large + if cacheSize.Load() >= MaxCacheSize { + ClearRegexCache() } // Try to store - if another goroutine already stored it, use theirs // This prevents race conditions where multiple goroutines compile the same pattern - actual, _ := regexCache.LoadOrStore(pattern, re) + actual, loaded := regexCache.LoadOrStore(pattern, re) + if !loaded { + cacheSize.Add(1) + } return actual.(*regexp.Regexp), nil } +// CompileRegexUncached compiles a regex pattern without caching. +// Useful for one-off patterns that shouldn't pollute the cache. +func CompileRegexUncached(pattern string) (*regexp.Regexp, error) { + if err := ValidatePattern(pattern); err != nil { + return nil, err + } + + re, err := regexp.Compile(pattern) + if err != nil { + return nil, &RegexError{ + Pattern: truncatePattern(pattern), + Reason: "invalid regex syntax", + Err: err, + } + } + return re, nil +} + // ClearRegexCache clears all cached compiled regular expressions. // Useful for testing or when memory usage needs to be reduced. func ClearRegexCache() { - regexCache.Range(func(key, value interface{}) bool { + regexCache.Range(func(key, _ interface{}) bool { regexCache.Delete(key) return true }) + cacheSize.Store(0) +} + +// CacheStats returns the current number of cached patterns. +func CacheStats() int64 { + return cacheSize.Load() +} + +// truncatePattern truncates a pattern for display in error messages. +func truncatePattern(pattern string) string { + if len(pattern) > 50 { + return pattern[:47] + "..." + } + return pattern } diff --git a/internal/util/regex_cache_test.go b/internal/util/regex_cache_test.go new file mode 100644 index 0000000..1248c20 --- /dev/null +++ b/internal/util/regex_cache_test.go @@ -0,0 +1,375 @@ +package util + +import ( + "errors" + "strings" + "sync" + "testing" +) + +func TestValidatePattern(t *testing.T) { + tests := []struct { + name string + pattern string + expectErr bool + }{ + { + name: "valid short pattern", + pattern: "^hello.*world$", + expectErr: false, + }, + { + name: "valid empty pattern", + pattern: "", + expectErr: false, + }, + { + name: "valid pattern at max length", + pattern: strings.Repeat("a", MaxPatternLength), + expectErr: false, + }, + { + name: "pattern too long", + pattern: strings.Repeat("a", MaxPatternLength+1), + expectErr: true, + }, + { + name: "very long pattern", + pattern: strings.Repeat("x", MaxPatternLength*2), + expectErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := ValidatePattern(tt.pattern) + if tt.expectErr && err == nil { + t.Error("expected error but got nil") + } + if !tt.expectErr && err != nil { + t.Errorf("unexpected error: %v", err) + } + }) + } +} + +func TestCompileRegex(t *testing.T) { + // Clear cache before each test + ClearRegexCache() + + t.Run("valid pattern is compiled and cached", func(t *testing.T) { + ClearRegexCache() + + pattern := "^test.*pattern$" + re1, err := CompileRegex(pattern) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if re1 == nil { + t.Fatal("expected non-nil regex") + } + + // Second call should return cached version + re2, err := CompileRegex(pattern) + if err != nil { + t.Fatalf("unexpected error on second call: %v", err) + } + + // Should be the same pointer + if re1 != re2 { + t.Error("expected same regex instance from cache") + } + + // Cache should have one entry + if stats := CacheStats(); stats != 1 { + t.Errorf("expected cache size 1, got %d", stats) + } + }) + + t.Run("invalid pattern returns error", func(t *testing.T) { + ClearRegexCache() + + pattern := "[invalid(regex" + _, err := CompileRegex(pattern) + if err == nil { + t.Fatal("expected error for invalid regex") + } + + var regexErr *RegexError + if !errors.As(err, ®exErr) { + t.Errorf("expected RegexError, got %T", err) + } + }) + + t.Run("pattern too long returns error", func(t *testing.T) { + ClearRegexCache() + + pattern := strings.Repeat("a", MaxPatternLength+1) + _, err := CompileRegex(pattern) + if err == nil { + t.Fatal("expected error for long pattern") + } + + var regexErr *RegexError + if !errors.As(err, ®exErr) { + t.Errorf("expected RegexError, got %T", err) + } + }) + + t.Run("different patterns are cached separately", func(t *testing.T) { + ClearRegexCache() + + re1, _ := CompileRegex("pattern1") + re2, _ := CompileRegex("pattern2") + + if re1 == re2 { + t.Error("different patterns should produce different regex instances") + } + + if stats := CacheStats(); stats != 2 { + t.Errorf("expected cache size 2, got %d", stats) + } + }) + + t.Run("regex matches correctly", func(t *testing.T) { + ClearRegexCache() + + re, err := CompileRegex("^hello\\s+world$") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if !re.MatchString("hello world") { + t.Error("expected match for 'hello world'") + } + if !re.MatchString("hello world") { + t.Error("expected match for 'hello world'") + } + if re.MatchString("helloworld") { + t.Error("unexpected match for 'helloworld'") + } + }) +} + +func TestCompileRegexUncached(t *testing.T) { + ClearRegexCache() + + t.Run("valid pattern compiles without caching", func(t *testing.T) { + initialSize := CacheStats() + + re, err := CompileRegexUncached("^uncached.*pattern$") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if re == nil { + t.Fatal("expected non-nil regex") + } + + // Cache size should not change + if stats := CacheStats(); stats != initialSize { + t.Errorf("cache size changed from %d to %d", initialSize, stats) + } + }) + + t.Run("invalid pattern returns error", func(t *testing.T) { + _, err := CompileRegexUncached("[invalid") + if err == nil { + t.Fatal("expected error for invalid regex") + } + }) + + t.Run("pattern too long returns error", func(t *testing.T) { + pattern := strings.Repeat("x", MaxPatternLength+1) + _, err := CompileRegexUncached(pattern) + if err == nil { + t.Fatal("expected error for long pattern") + } + }) +} + +func TestClearRegexCache(t *testing.T) { + // Add some patterns + _, _ = CompileRegex("pattern1") + _, _ = CompileRegex("pattern2") + _, _ = CompileRegex("pattern3") + + if stats := CacheStats(); stats < 3 { + t.Fatalf("expected at least 3 cached patterns, got %d", stats) + } + + ClearRegexCache() + + if stats := CacheStats(); stats != 0 { + t.Errorf("expected cache size 0 after clear, got %d", stats) + } +} + +func TestCacheStats(t *testing.T) { + ClearRegexCache() + + if stats := CacheStats(); stats != 0 { + t.Errorf("expected initial cache size 0, got %d", stats) + } + + _, _ = CompileRegex("a") + if stats := CacheStats(); stats != 1 { + t.Errorf("expected cache size 1, got %d", stats) + } + + _, _ = CompileRegex("b") + if stats := CacheStats(); stats != 2 { + t.Errorf("expected cache size 2, got %d", stats) + } + + // Same pattern should not increase cache size + _, _ = CompileRegex("a") + if stats := CacheStats(); stats != 2 { + t.Errorf("expected cache size 2 after duplicate, got %d", stats) + } +} +func TestConcurrentAccess(t *testing.T) { + ClearRegexCache() + + var wg sync.WaitGroup + numGoroutines := 100 + numPatterns := 10 + + // Generate some patterns + patterns := make([]string, numPatterns) + for i := range patterns { + patterns[i] = strings.Repeat("p", i+1) + } + + // Concurrent compilation of same patterns + for i := 0; i < numGoroutines; i++ { + wg.Add(1) + go func(id int) { + defer wg.Done() + pattern := patterns[id%numPatterns] + re, err := CompileRegex(pattern) + if err != nil { + t.Errorf("goroutine %d: unexpected error: %v", id, err) + return + } + if re == nil { + t.Errorf("goroutine %d: nil regex returned", id) + } + }(i) + } + + wg.Wait() + + // Should have exactly numPatterns cached + if stats := CacheStats(); stats != int64(numPatterns) { + t.Errorf("expected cache size %d, got %d", numPatterns, stats) + } +} + +func TestRegexError(t *testing.T) { + t.Run("error message with underlying error", func(t *testing.T) { + underlying := errors.New("underlying error") + err := &RegexError{ + Pattern: "test.*", + Reason: "test reason", + Err: underlying, + } + + msg := err.Error() + if !strings.Contains(msg, "test.*") { + t.Error("error message should contain pattern") + } + if !strings.Contains(msg, "test reason") { + t.Error("error message should contain reason") + } + if !strings.Contains(msg, "underlying error") { + t.Error("error message should contain underlying error") + } + }) + + t.Run("error message without underlying error", func(t *testing.T) { + err := &RegexError{ + Pattern: "test.*", + Reason: "test reason", + Err: nil, + } + + msg := err.Error() + if !strings.Contains(msg, "test.*") { + t.Error("error message should contain pattern") + } + if !strings.Contains(msg, "test reason") { + t.Error("error message should contain reason") + } + }) + + t.Run("error unwrap", func(t *testing.T) { + underlying := errors.New("underlying") + err := &RegexError{ + Pattern: "test", + Reason: "reason", + Err: underlying, + } + + if errors.Unwrap(err) != underlying { + t.Error("Unwrap should return underlying error") + } + }) +} + +func TestTruncatePattern(t *testing.T) { + tests := []struct { + name string + input string + expected string + }{ + { + name: "short pattern unchanged", + input: "short", + expected: "short", + }, + { + name: "exactly 50 chars unchanged", + input: strings.Repeat("x", 50), + expected: strings.Repeat("x", 50), + }, + { + name: "long pattern truncated", + input: strings.Repeat("x", 60), + expected: strings.Repeat("x", 47) + "...", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := truncatePattern(tt.input) + if got != tt.expected { + t.Errorf("truncatePattern() = %q (len %d), want %q (len %d)", + got, len(got), tt.expected, len(tt.expected)) + } + }) + } +} + +// BenchmarkCompileRegex benchmarks regex compilation with caching +func BenchmarkCompileRegex(b *testing.B) { + ClearRegexCache() + pattern := "^test.*pattern\\d+$" + + // First call to populate cache + _, _ = CompileRegex(pattern) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, _ = CompileRegex(pattern) + } +} + +// BenchmarkCompileRegexUncached benchmarks regex compilation without caching +func BenchmarkCompileRegexUncached(b *testing.B) { + pattern := "^test.*pattern\\d+$" + + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, _ = CompileRegexUncached(pattern) + } +} diff --git a/pkg/errors/errors.go b/pkg/errors/errors.go index 1ebe726..172b5a7 100644 --- a/pkg/errors/errors.go +++ b/pkg/errors/errors.go @@ -120,6 +120,42 @@ func (e *StructuredError) WithRemediation(msg string) *StructuredError { return e } +// UserMessage returns a user-safe error message without internal details. +// This should be used for API responses to avoid leaking implementation details. +func (e *StructuredError) UserMessage() string { + // Return only the message and remediation, no stack trace, no cause details + if e.Remediation != "" { + return fmt.Sprintf("%s. %s", e.Message, e.Remediation) + } + return e.Message +} + +// SanitizeError returns a user-safe error message from any error. +// For StructuredError, it returns UserMessage(). +// For other errors, it returns a generic message to avoid leaking internals. +func SanitizeError(err error) string { + if err == nil { + return "" + } + + // Check if it's a StructuredError + if se, ok := err.(*StructuredError); ok { + return se.UserMessage() + } + + // For other errors, extract only the basic message + // Avoid exposing full paths or implementation details + msg := err.Error() + + // Truncate very long messages that might contain stack traces + const maxLen = 200 + if len(msg) > maxLen { + msg = msg[:maxLen] + "..." + } + + return msg +} + // New creates a new structured error with stack trace. func New(code ErrorCode, message string) *StructuredError { return &StructuredError{ diff --git a/pkg/protocol/types.go b/pkg/protocol/types.go index b33ad7d..7ff142a 100644 --- a/pkg/protocol/types.go +++ b/pkg/protocol/types.go @@ -1,6 +1,8 @@ // Package protocol defines shared types used across the MCP file operations server. package protocol +import "path/filepath" + // Location represents a position in a file. type Location struct { File string `json:"file"` @@ -66,7 +68,7 @@ const ( // DetectLanguage detects the language from a filename. func DetectLanguage(filename string) Language { - ext := getExtension(filename) + ext := filepath.Ext(filename) switch ext { case ".go": return LangGo @@ -94,15 +96,3 @@ func DetectLanguage(filename string) Language { return LangUnknown } } - -func getExtension(filename string) string { - for i := len(filename) - 1; i >= 0; i-- { - if filename[i] == '.' { - return filename[i:] - } - if filename[i] == '/' || filename[i] == '\\' { - break - } - } - return "" -} diff --git a/pkg/protocol/types_test.go b/pkg/protocol/types_test.go index 9b580b0..1534640 100644 --- a/pkg/protocol/types_test.go +++ b/pkg/protocol/types_test.go @@ -48,26 +48,3 @@ func TestDetectLanguage(t *testing.T) { }) } } - -func TestGetExtension(t *testing.T) { - tests := []struct { - filename string - expected string - }{ - {"file.go", ".go"}, - {"file.test.go", ".go"}, - {"path/to/file.ts", ".ts"}, - {"noextension", ""}, - {".hidden", ".hidden"}, - {"file.", "."}, - } - - for _, tt := range tests { - t.Run(tt.filename, func(t *testing.T) { - result := getExtension(tt.filename) - if result != tt.expected { - t.Errorf("getExtension(%q) = %q, want %q", tt.filename, result, tt.expected) - } - }) - } -}