| 871 | * ══════════════════════════════════════════════════════════════════ */ |
| 872 | |
| 873 | static char *call_tool_timed(const char *tool, double *ms, const char *args_fmt, ...) { |
| 874 | char args[2048]; |
| 875 | va_list ap; |
| 876 | va_start(ap, args_fmt); |
| 877 | vsnprintf(args, sizeof(args), args_fmt, ap); |
| 878 | va_end(ap); |
| 879 | double t0 = now_ms(); |
| 880 | char *resp = cbm_mcp_handle_tool(g_srv, tool, args); |
| 881 | *ms = now_ms() - t0; |
| 882 | return resp; |
| 883 | } |
| 884 | |
| 885 | /* Check if ALL results have a specific label (validates label filter works) */ |
| 886 | static int all_results_have_label(const char *resp, const char *label) { |
no test coverage detected