My agentic slop goes here. Not intended for anyone else!
1open Eio.Std
2
3let src = Logs.Src.create "test_permissions" ~doc:"Permission callback test"
4module Log = (val Logs.src_log src : Logs.LOG)
5
6(* Simple auto-allow permission callback *)
7let auto_allow_callback ~tool_name ~input:_ ~context:_ =
8 Log.app (fun m -> m "✅ Auto-allowing tool: %s" tool_name);
9 Claude.Permissions.Result.allow ()
10
11let run_test ~sw ~env =
12 Log.app (fun m -> m "🧪 Testing Permission Callbacks");
13 Log.app (fun m -> m "================================");
14
15 (* Create options with custom permission callback *)
16 let options = Claude.Options.create
17 ~model:(Claude.Model.of_string "sonnet")
18 ~permission_callback:auto_allow_callback
19 () in
20
21 Log.app (fun m -> m "Creating client with permission callback...");
22 let client = Claude.Client.create ~options ~sw
23 ~process_mgr:env#process_mgr
24 () in
25
26 (* Simple query that will trigger tool use *)
27 Log.app (fun m -> m "\n📤 Sending test query...");
28 Claude.Client.query client
29 "What is 2 + 2? Just give me the number.";
30
31 (* Process response *)
32 let messages = Claude.Client.receive_all client in
33 Log.app (fun m -> m "\n📨 Received %d messages" (List.length messages));
34
35 List.iter (fun msg ->
36 match msg with
37 | Claude.Message.Assistant msg ->
38 List.iter (function
39 | Claude.Content_block.Text t ->
40 let text = Claude.Content_block.Text.text t in
41 Log.app (fun m -> m "Claude: %s" text)
42 | Claude.Content_block.Tool_use t ->
43 Log.app (fun m -> m "🔧 Tool use: %s"
44 (Claude.Content_block.Tool_use.name t))
45 | _ -> ()
46 ) (Claude.Message.Assistant.content msg)
47 | Claude.Message.Result msg ->
48 if Claude.Message.Result.is_error msg then
49 Log.err (fun m -> m "❌ Error occurred!")
50 else
51 Log.app (fun m -> m "✅ Success!");
52 Log.app (fun m -> m "Duration: %dms"
53 (Claude.Message.Result.duration_ms msg))
54 | _ -> ()
55 ) messages;
56
57 Log.app (fun m -> m "\n================================");
58 Log.app (fun m -> m "✨ Test complete!")
59
60let main ~env =
61 Switch.run @@ fun sw ->
62 run_test ~sw ~env
63
64(* Command-line interface *)
65open Cmdliner
66
67let main_term env =
68 let setup_log style_renderer level =
69 Fmt_tty.setup_std_outputs ?style_renderer ();
70 Logs.set_level level;
71 Logs.set_reporter (Logs_fmt.reporter ());
72 if level = None then Logs.set_level (Some Logs.App);
73 match level with
74 | Some Logs.Info | Some Logs.Debug ->
75 Logs.Src.set_level Claude.Client.src (Some Logs.Info)
76 | _ -> ()
77 in
78 let run style level =
79 setup_log style level;
80 main ~env
81 in
82 Term.(const run $ Fmt_cli.style_renderer () $ Logs_cli.level ())
83
84let cmd env =
85 let doc = "Test permission callback functionality" in
86 let info = Cmd.info "test_permissions" ~version:"1.0" ~doc in
87 Cmd.v info (main_term env)
88
89let () =
90 Eio_main.run @@ fun env ->
91 exit (Cmd.eval (cmd env))