#pragma once #include #include #include #include #include #include "search/search.h" #include "grid/grid.h" #include namespace polymech { std::string json_escape(const std::string &s); struct AreaDef { std::string gid; std::string name; int level; }; struct AccumulatedResult { search::MapResult result; std::string grid_area; std::string grid_gid; }; struct PipelineOptions { std::vector areas; grid::GridOptions grid_opts; std::string search_query; std::string search_domain = "google.com"; std::string search_language = "en"; std::string search_country; int search_limit = 20; int search_zoom = 13; bool dry_run = false; bool enrich = false; std::string config_path = "config/postgres.toml"; std::string cache_dir = "cache/gadm"; bool persistence_postgres = false; bool daemon_mode = false; std::string job_id; std::string default_user_id = "3bb4cfbf-318b-44d3-a9d3-35680e738421"; search::SystemTuningOptions tuning; std::shared_ptr> cancel_token; std::vector filter_types; // if non-empty, only locations matching ≥1 type pass std::vector exclude_types; // if non-empty, drop locations matching any bool no_cache = false; // skip pre-enrich dedup — force re-enrichment std::string parent_id; // if set, this run is an "expand" child of another run }; std::string json_escape(const std::string &s); /// Optional callbacks for streaming progress events (used in IPC mode). /// When nullptr / empty, the pipeline runs silently (CLI mode). struct GridsearchCallbacks { /// Emit a progress event. `type` is one of: /// grid-ready, waypoint-start, area, location, /// enrich-start, node, node-error, nodePage /// `json` is the raw JSON payload string. std::function onEvent; }; CLI::App* setup_cmd_gridsearch(CLI::App& app); /// CLI entry point (standalone mode — reads static vars set by CLI11). int run_cmd_gridsearch(); /// IPC entry point — parse `payload` JSON, run the pipeline, emit events via `cb`. /// Returns 0 on success. int run_cmd_gridsearch_ipc(const std::string& payload, const std::string& jobId, const GridsearchCallbacks& cb, bool daemon_mode = false, const std::string& daemon_uid = ""); /// Core Pipeline int run_pipeline(const PipelineOptions &opts, std::ostream *file_out, const GridsearchCallbacks &cb); /// UDS entry point — starts a persistent AF_UNIX / Named Pipe server that processes /// concurrent jobs using Moodycamel ConcurrentQueue and Taskflow executor. int run_cmd_gridsearch_uds(const std::string& pipe_path, bool daemon_mode, const std::string& daemon_uid); } // namespace polymech