llm/ant: convert dumpText constant to dump-ant-calls command line flag

Co-Authored-By: sketch <hello@sketch.dev>
Change-ID: sd58268f97ed95de8k
diff --git a/llm/ant/ant.go b/llm/ant/ant.go
index 2afc69f..0b65d48 100644
--- a/llm/ant/ant.go
+++ b/llm/ant/ant.go
@@ -59,11 +59,12 @@
 // Service provides Claude completions.
 // Fields should not be altered concurrently with calling any method on Service.
 type Service struct {
-	HTTPC     *http.Client // defaults to http.DefaultClient if nil
-	URL       string       // defaults to DefaultURL if empty
-	APIKey    string       // must be non-empty
-	Model     string       // defaults to DefaultModel if empty
-	MaxTokens int          // defaults to DefaultMaxTokens if zero
+	HTTPC        *http.Client // defaults to http.DefaultClient if nil
+	URL          string       // defaults to DefaultURL if empty
+	APIKey       string       // must be non-empty
+	Model        string       // defaults to DefaultModel if empty
+	MaxTokens    int          // defaults to DefaultMaxTokens if zero
+	DumpAntCalls bool         // whether to dump request/response text to files for debugging; defaults to false
 }
 
 var _ llm.Service = (*Service)(nil)
@@ -209,13 +210,8 @@
 	TokenEfficientToolUse bool `json:"-"` // DO NOT USE, broken on Anthropic's side as of 2025-02-28
 }
 
-const dumpText = false // debugging toggle to dump raw communications with Claude using dumpToFile
-
 // dumpToFile writes the content to a timestamped file in ~/.cache/sketch/, with typ in the filename.
 func dumpToFile(typ string, content []byte) error {
-	if !dumpText {
-		return nil
-	}
 	homeDir, err := os.UserHomeDir()
 	if err != nil {
 		return err
@@ -444,7 +440,7 @@
 
 	var payload []byte
 	var err error
-	if dumpText || testing.Testing() {
+	if s.DumpAntCalls || testing.Testing() {
 		payload, err = json.MarshalIndent(request, "", " ")
 	} else {
 		payload, err = json.Marshal(request)
@@ -476,8 +472,10 @@
 			slog.WarnContext(ctx, "anthropic request sleep before retry", "sleep", sleep, "attempts", attempts)
 			time.Sleep(sleep)
 		}
-		if err := dumpToFile("request", payload); err != nil {
-			slog.WarnContext(ctx, "failed to dump request to file", "error", err)
+		if s.DumpAntCalls {
+			if err := dumpToFile("request", payload); err != nil {
+				slog.WarnContext(ctx, "failed to dump request to file", "error", err)
+			}
 		}
 		req, err := http.NewRequestWithContext(ctx, "POST", url, bytes.NewReader(payload))
 		if err != nil {
@@ -518,8 +516,10 @@
 
 		switch {
 		case resp.StatusCode == http.StatusOK:
-			if err := dumpToFile("response", buf); err != nil {
-				slog.WarnContext(ctx, "failed to dump response to file", "error", err)
+			if s.DumpAntCalls {
+				if err := dumpToFile("response", buf); err != nil {
+					slog.WarnContext(ctx, "failed to dump response to file", "error", err)
+				}
 			}
 			var response response
 			err = json.NewDecoder(bytes.NewReader(buf)).Decode(&response)