23std::string AiPanel::nowStamp() {
24 using clock = std::chrono::system_clock;
25 const auto t = clock::to_time_t(clock::now());
33 std::strftime(buf,
sizeof(buf),
"%H:%M:%S", &tm);
38 std::lock_guard<std::mutex> lock(mu_);
43 std::lock_guard<std::mutex> lock(mu_);
50 std::lock_guard<std::mutex> lock(mu_);
55 std::lock_guard<std::mutex> lock(mu_);
60 std::lock_guard<std::mutex> lock(mu_);
65 std::lock_guard<std::mutex> lock(mu_);
70 std::lock_guard<std::mutex> lock(mu_);
71 clientName_ = std::move(
name);
75 std::lock_guard<std::mutex> lock(mu_);
80 std::lock_guard<std::mutex> lock(mu_);
85 std::lock_guard<std::mutex> lock(mu_);
90 e.
detail = std::move(detail);
91 log_.push_back(std::move(e));
92 while (log_.size() > maxEntries_) log_.pop_front();
98 std::lock_guard<std::mutex> lock(mu_);
99 std::vector<AiLogEntry> out;
100 if (log_.empty() || max == 0)
return out;
101 const size_t start = log_.size() > max ? log_.size() - max : 0;
102 out.assign(log_.begin() +
static_cast<std::ptrdiff_t
>(start), log_.end());
108 std::ostringstream oss;
109 for (
const auto& e : entries) {
110 oss <<
'[' << e.timestamp <<
"] " << e.kind <<
" | " << e.title;
111 if (!e.detail.empty()) oss <<
" — " << e.detail;
118 std::lock_guard<std::mutex> lock(mu_);
119 std::ostringstream oss;
122 oss <<
"127.0.0.1:" << mcpPort_;
123 oss << (mcpConnected_ ?
" connected" :
" listening");
124 if (!clientName_.empty()) oss <<
" (" << clientName_ <<
")";
128 oss <<
" | log " << log_.size();
133 std::lock_guard<std::mutex> lock(mu_);
134 maxEntries_ =
n == 0 ? 1 :
n;
135 while (log_.size() > maxEntries_) log_.pop_front();
143 if (g_imguiDrawer) g_imguiDrawer(*
this);
SettlementPipeline::Stage fn
In-engine AI / MCP session surface for DevTools.
void addNote(std::string text)
std::string statusLine() const
Compact status line for overlays / MCP resources.
std::string formatLog(size_t max=64) const
std::string clientName() const
std::vector< AiLogEntry > recentLog(size_t max=64) const
void setMcpPort(int port)
void addLog(std::string kind, std::string title, std::string detail={})
bool mcpConnected() const
static AiPanel & instance()
void setMcpConnected(bool on)
void setMaxEntries(size_t n)
void(*)(AiPanel &panel) ImGuiDrawer
static void setImGuiDrawer(ImGuiDrawer fn)
void drawImGui()
Optional ImGui draw hook. Default no-op: in-engine AI status is exposed via MCP / eve....
void setClientName(std::string name)
static T & get()
Returns the process-lifetime instance.