7,916
社区成员
发帖
与我相关
我的任务
分享将AI-Harness做成面向 Windows ARM64、免安装、开箱即用 的桌面应用。
桌面应用是网关的托管外壳,不重新实现网关功能:
openclaw.json。AI-Harness.exe Electron 35(内嵌 Node + Chromium)= 桌面外壳
resources\
app.asar(或 app\) 外壳代码:dist/**、assets/**、package.json
runtime\node.exe 便携 Node 22(官方 win-arm64 构建),只用来跑网关
harness\ AI-Harness npm 包 + 生产依赖 + 全部插件
┌──────────────── Electron 主进程(内嵌 Node)────────────────┐
│ 单实例锁 · 托盘 · 菜单 · 窗口 · GatewayManager · 配置读写 │
│ │ spawn / taskkill ▲ IPC(仅 file: 页)│
│ ▼ │ │
│ runtime\node.exe harness\openclaw.mjs │ 渲染进程 │
│ gateway run --port <p> ◄── HTTP ──► │ assets/*.html │
│ (网关 + 插件,独立进程) │ http://127.0.0.1 │
└────────────────────────────────────────────┴──────────────────┘
src/main/gateway.ts)node openclaw.mjs gateway run --allow-unconfigured --port <p>,端口默认 18789,被占用时寻找空闲端口。/healthz;若已有网关在运行则直接接管,此时不持有子进程,因此拒绝重启,状态里显示"非本应用启动"。/healthz(进程存活)判定可显示界面;不用 /readyz,因为后者要等所有 sidecar 就绪,冷启动 25–55 秒甚至更久。只要子进程仍存活就持续等待,不设固定超时。crashed 状态并显示加载页。taskkill /pid <pid> /T /F 杀整个进程树,避免遗留 node / geniex 孤儿进程。%APPDATA%\ai-harness-desktop\logs\gateway.log;外壳诊断写入 desktop.log(5 MB 滚动)。OPENCLAW_CONFIG_PATH → OPENCLAW_STATE_DIR → ~/.openclaw/openclaw.json。checkConfig() 分三种结果:setup-window.ts / onboarding.ts)openclaw onboard --non-interactive --auth-choice custom-api-key 完成(API key 经环境变量传入,不出现在命令行);onboard 会改写 gateway.*,因此把原有 token / port / bind / tailscale 传回去,遇到 remote / password / SecretRef token 则拒绝,避免破坏。dt-* agent(见 §5)。| 菜单项 | 作用 | 要点 |
|---|---|---|
| Add Provider… | 追加 provider/model | 同向导;追加时需选择 primary |
| Agent Settings… | 编辑 agents.list | 可改 id、systemPromptOverride、model、skills、tools(profile/allow/deny);dt-* 只读;删除 agent 时同步清理 agentDescriptions,删除 Orchestrator 默认 agent 须先指定替代;保留未知字段 |
| Orchestrator Settings… | 配置 dragon-task-orchestrator | 同时写 plugins.entries.<id>.enabled 与 config.enabled;各字段按 schema 范围校验;agentDescriptions 编辑器;高级限制;allow-list / 默认 agent 告警 |
| Local Model Settings… | 配置 GenieX 本地模型 | 单个开关同时控制 geniex 与 geniex-manager,显式写 true/false(因 GenieX 在 Windows ARM64 且 PATH 有 geniex 时会自动启用,不能靠"不写"表示关闭);列出 agents.defaults.models 中所有 geniex/…;可编辑 compute、contextSize、gpuLayers 与投机解码参数(spec* 仅在设置 draft model 时保留) |
before-quit)。contextIsolation: true、nodeIntegration: false、sandbox: true。senderFrame.url 必须是对应的本地 file: 页面。window.harness 桥。http(s) 链接一律交给系统浏览器,窗口内不打开。pnpm dist = pnpm build && pnpm prepare-stage && electron-builder --win --arm64
tsc 把 src/ 编译到 dist/(入口 dist/main/index.js)。scripts/stage.mjs(pnpm prepare-stage)生成 stage/:node.exe 到 stage/runtime;npm pack 仓库根目录(遵循根 package.json 的 files),解包为 stage/harness;npm install --omit=dev --legacy-peer-deps,并显式安装对等依赖 @napi-rs/canvas。electron-builder 按 electron-builder.yml 打包:files 含 dist/**、assets/**、package.json;extraResources 把 stage/ 复制到 resources/。release\AI-Harness-<version>-win-arm64.zip,另有未压缩目录 release\win-arm64-unpacked。AI-Harness.exe。pnpm build && pnpm ui:build。allowBuilds,pnpm 10 使用 onlyBuiltDependencies,二者都写在 apps/desktop/pnpm-workspace.yaml。