using System; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; namespace 成套报价软件 { /// AI助手设置:引擎状态/端口/令牌/开机自启(纯文件操作与 HTTP 探测, /// 引擎启停用 ai助手 目录里的 启动引擎.cmd/停止引擎.cmd)。模型与密钥在内嵌面板里配置。 public partial class AI助手设置 : Form { /// 用系统默认程序打开 URL(ShellExecute,不经 Process.Start)。 [DllImport("shell32.dll", CharSet = CharSet.Unicode)] private static extern int ShellExecuteW(IntPtr hWnd, string verb, string file, string parameters, string directory, int showCmd); public AI助手设置() { InitializeComponent(); this.BackColor = System.Drawing.Color.White; this.btn刷新.Click += btn刷新_Click; this.btn复制令牌.Click += btn复制令牌_Click; this.btn保存.Click += btn保存_Click; this.btn复制引擎目录.Click += btn复制引擎目录_Click; this.btn复制状态目录.Click += btn复制状态目录_Click; this.btn查看日志.Click += btn查看日志_Click; this.btn打开面板.Click += btn打开面板_Click; this.Load += AI助手设置_Load; } private void AI助手设置_Load(object sender, EventArgs e) { 刷新界面(); } private void 刷新界面() { bool 就绪 = OpenClawHost.网关就绪(); txt状态.Text = 就绪 ? "运行中(端口 " + OpenClawHost.端口 + ")" : (OpenClawHost.运行时已安装() ? "未启动 —— 请先双击 ai助手\\启动引擎.cmd(或重开软件自动拉起)" : "未安装引擎运行时(ai助手\\zcode 目录缺失)"); if (OpenClawHost.端口 >= num端口.Minimum && OpenClawHost.端口 <= num端口.Maximum) num端口.Value = OpenClawHost.端口; txt令牌.Text = OpenClawHost.令牌; chk自启.Checked = OpenClawHost.自启已登记(); } private void btn刷新_Click(object sender, EventArgs e) { 刷新界面(); } private void btn保存_Click(object sender, EventArgs e) { try { OpenClawHost.保存端口((int)num端口.Value); OpenClawHost.设置自启(chk自启.Checked); MessageBox.Show(this, "已保存。端口修改需重启引擎(停止引擎.cmd → 启动引擎.cmd)后生效。", "AI助手", MessageBoxButtons.OK, MessageBoxIcon.Information); 刷新界面(); } catch (Exception ex) { MessageBox.Show(this, "保存失败:" + ex.Message, "AI助手", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } private void btn复制令牌_Click(object sender, EventArgs e) { try { Clipboard.SetText(txt令牌.Text ?? ""); MessageBox.Show(this, "令牌已复制到剪贴板。", "AI助手", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { OpenClawHost.写日志("[AI助手设置] 复制令牌到剪贴板失败: " + ex.Message); } } /// 在系统默认浏览器中打开 AI助手面板(ZCode Web,自动带端口与令牌)。 private void btn打开面板_Click(object sender, EventArgs e) { try { if (!OpenClawHost.健康检查(OpenClawHost.端口)) { MessageBox.Show(this, "AI 引擎未运行。请先双击软件目录的「成套报价软件启动器.cmd」" + "(或 ai助手\\启动引擎.cmd)后再打开面板。", "AI助手", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } string url = "http://127.0.0.1:" + OpenClawHost.端口 + "/#token=" + Uri.EscapeDataString(OpenClawHost.令牌); ShellExecuteW(IntPtr.Zero, "open", url, null, null, 5); // 5=SW_SHOW OpenClawHost.写日志("[AI助手] 已在浏览器打开面板 http://127.0.0.1:" + OpenClawHost.端口); } catch (Exception ex) { MessageBox.Show(this, "打开失败:" + ex.Message, "AI助手", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } private void btn复制引擎目录_Click(object sender, EventArgs e) { try { Clipboard.SetText(OpenClawHost.引擎目录()); MessageBox.Show(this, "引擎目录路径已复制,粘贴到资源管理器地址栏即可打开。", "AI助手", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { OpenClawHost.写日志("[AI助手设置] 复制引擎目录失败: " + ex.Message); } } private void btn复制状态目录_Click(object sender, EventArgs e) { try { Clipboard.SetText(OpenClawHost.状态目录()); MessageBox.Show(this, "状态目录路径已复制,粘贴到资源管理器地址栏即可打开。", "AI助手", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { OpenClawHost.写日志("[AI助手设置] 复制状态目录失败: " + ex.Message); } } private void btn查看日志_Click(object sender, EventArgs e) { try { string f = OpenClawHost.网关日志路径(); string 内容 = "(暂无日志)"; if (System.IO.File.Exists(f)) { string[] 行 = System.IO.File.ReadAllLines(f, Encoding.UTF8); int 起 = Math.Max(0, 行.Length - 40); var sb = new StringBuilder(); for (int i = 起; i < 行.Length; i++) sb.AppendLine(行[i]); 内容 = sb.ToString(); } MessageBox.Show(this, 内容, "AI助手日志(末 40 行)", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { MessageBox.Show(this, "读取日志失败:" + ex.Message, "AI助手", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } } }