open Nock_lib let rec find_project_root dir = let pills_dir = Filename.concat dir "pills" in if Sys.file_exists pills_dir && Sys.is_directory pills_dir then dir else let parent = Filename.dirname dir in if String.equal parent dir then failwith "unable to locate project root containing pills/" else find_project_root parent let project_root = match Sys.getenv_opt "NEOVERE_ROOT" with | Some root -> root | None -> let exe_dir = Filename.dirname Sys.executable_name in find_project_root exe_dir (* Helper to show noun structure *) let rec noun_shape ?(depth=0) ?(max_depth=5) noun = if depth >= max_depth then "..." else match noun with | Noun.Atom z -> if Z.equal z Z.zero then "0" else if Z.numbits z <= 32 then Printf.sprintf "%Ld" (Z.to_int64 z) else Printf.sprintf "atom(%d bits)" (Z.numbits z) | Noun.Cell (h, t) -> Printf.sprintf "[%s %s]" (noun_shape ~depth:(depth+1) ~max_depth h) (noun_shape ~depth:(depth+1) ~max_depth t) (* Convert list to OCaml list *) let rec list_to_ocaml_list noun = match noun with | Noun.Atom z when Z.equal z Z.zero -> [] | Noun.Cell (h, t) -> h :: list_to_ocaml_list t | _ -> failwith "malformed list" let () = Printf.printf "\n╔═══════════════════════════════════════════════════════╗\n"; Printf.printf "║ Bot Events Inspector ║\n"; Printf.printf "╚═══════════════════════════════════════════════════════╝\n\n"; let solid_path = Filename.concat project_root "pills/solid.pill" in Printf.printf "Loading solid.pill...\n%!"; let pill = Boot.cue_file solid_path in Printf.printf "Parsing solid pill structure...\n%!"; match Boot.parse_solid pill with | Error e -> Printf.printf "Failed to parse: %s\n" (match e with | Boot.Invalid_pill msg -> msg | Boot.Unsupported msg -> msg) | Ok (bot, _mod_, _use_) -> Printf.printf "✓ Solid pill parsed\n\n"; let bot_list = list_to_ocaml_list bot in Printf.printf "Bot events: %d\n\n" (List.length bot_list); List.iteri (fun i event -> Printf.printf "Bot Event %d:\n" (i + 1); Printf.printf " Shape: %s\n" (noun_shape ~max_depth:3 event); Printf.printf " Is atom: %b\n" (Noun.is_atom event); Printf.printf " Is cell: %b\n" (Noun.is_cell event); if Noun.is_cell event then begin let head = Noun.head event in let tail = Noun.tail event in Printf.printf " Head shape: %s\n" (noun_shape ~max_depth:2 head); Printf.printf " Tail shape: %s\n" (noun_shape ~max_depth:2 tail); (* Check if it could be a formula (common formula patterns) *) match head with | Noun.Atom z -> let n = Z.to_int z in if n >= 0 && n <= 11 then Printf.printf " Head is opcode %d!\n" n | _ -> () end; Printf.printf "\n"; ) bot_list; Printf.printf "\n╔═══════════════════════════════════════════════════════╗\n"; Printf.printf "║ Analysis Complete ║\n"; Printf.printf "╚═══════════════════════════════════════════════════════╝\n"