鸿蒙PC开源移植:CodeLite原生IDE与Remote Agent适配

欢迎加入开源鸿蒙PC社区: https://harmonypc.csdn.net/

欢迎在PC社区平台申请新建项目: https://atomgit.com/OpenHarmonyPCDeveloper

本文以 ohos_CodeLite 为对象,按"迁移边界、三层架构、路径安全、开发工作流、Git 与调试、测试证据、部署方式"的顺序,记录 HarmonyOS PC IDE 的适配过程。重点不是把桌面端界面逐像素复刻,而是把打开工作区、编辑、构建、运行、Git 和调试组织成一条可验证的主线,并把 Remote Agent 的权限边界写清楚。

一、CodeLite 要迁移的不是 wxWidgets,而是开发工作流

CodeLite 原本依赖 wxWidgets、桌面文件系统、本机编译工具链和原生调试器。把源码直接交叉编译成 HarmonyOS 应用并不可行,项目因此选择保留开发者的工作流,而不是保留桌面实现的每一行代码。

ohos_CodeLite 是非官方迁移版本。它复用固定上游版本的 CodeLite 名称与部分图标,使用 ArkUI、ArkWeb 和 Remote Agent 重新实现编辑器、资源管理器、构建、终端、Git 与调试路径,不移植 wxWidgets 界面和插件 ABI。

CodeLite 能力 HarmonyOS PC 实现 关键约束
桌面工作台 ArkUI 原生菜单、工具栏、侧栏、标签和状态栏 面向键盘、鼠标和 PC 窗口
代码编辑器 ArkWeb 离线加载 Monaco Editor 不在运行时访问 CDN
文件工作区 Remote Agent 授权多根工作区 客户端只提交工作区相对路径
构建与语言智能 Agent 管理任务、工具链、CMake 与 LSP 只能选择管理员已发布配置
终端与 Git Agent 托管 PTY 和类型化 Git 操作 不接受客户端任意命令或凭据
调试 管理员配置的 LLDB-DAP 适配 调试输入经过 Agent 收敛

衡量适配结果的重点不是界面是否像素级复刻,而是开发者能否在 HarmonyOS PC 上连续完成"打开工作区、编辑、构建、运行、查看 Git、启动调试"这条主线。

二、原生客户端、离线 Web 运行时与 Remote Agent 的三层结构

项目最核心的取舍,是把客户端、Web 运行时和主机工具链拆成三层。ArkUI 处理窗口与工作台,ArkWeb 只承载离线 Monaco Editor 和 xterm.js,Remote Agent 承担所有文件、进程、语言服务和调试能力。任何一层都不需要假装拥有另外两层的权限。

模块 实现 离线与安全设计
原生工作台 ArkTS / ArkUI Stage 模型 面板状态使用 HarmonyOS Preferences,只保存非敏感会话元数据
编辑器 独立 Vite 工程构建 Monaco Editor 产物写入 rawfile/editor/,运行时无 CDN 依赖
终端 独立 Vite 工程构建 xterm.js 产物写入 rawfile/terminal/,前端不持有 Agent Token
主机能力 Node.js Remote Agent 工作区、任务、终端、Git、LSP 和 DAP 都由 Agent 管理
typescript 复制代码
export const REMOTE_PROTOCOL_VERSION: number = 1;

export interface RemoteAgentEnvelope {
  protocolVersion: number;
  requestId: string;
  ok: boolean;
  data?: object;
  error?: RemoteAgentErrorPayload;
}

ArkTS 客户端与 Agent 之间不是"传一段字符串让主机解释",而是通过请求 ID、协议版本、成功数据和类型化错误码组成信封。编辑器 Bridge 也使用版本校验和字段检查,避免 Web 页面与 ArkTS 在接口升级后静默错位。

三、从工作区到文件保存:类型化协议如何保护路径边界

Remote Agent 的第一条安全边界是工作区。客户端不会发送本机绝对路径,Agent 只接受工作区相对路径,并在每次读写和变更前解析真实路径,确认目标没有越过授权根目录。

typescript 复制代码
function isInside(rootPath: string, candidate: string): boolean {
  const relativePath = relative(rootPath, candidate);
  return relativePath === '' || (relativePath !== '..' &&
    !relativePath.startsWith(`..${sep}`) &&
    !isAbsolute(relativePath));
}

export async function resolveWorkspacePath(
  workspace: WorkspaceConfig, value: string
): Promise<string> {
  const segments = validateRelativePath(value);
  const lexicalPath = resolve(workspace.rootPath, ...segments);
  if (!isInside(workspace.rootPath, lexicalPath)) {
    throw new AgentRequestError(
      AgentErrorCode.PATH_OUTSIDE_WORKSPACE, 403,
      'Path is outside the workspace');
  }
  return realpath(lexicalPath);
}

文件保存又增加了修订号。客户端提交打开文件时看到的 SHA-256 修订,Agent 在写前重新读取当前内容;如果外部程序已经修改文件,就返回冲突,而不是直接覆盖。创建、重命名、移动和删除还会检查符号链接、目录状态和跨根移动,这些错误都有独立的类型化代码。

边界 拒绝或处理方式
绝对路径、反斜杠、空字符 返回 INVALID_PATH
解析后位于工作区之外 返回 PATH_OUTSIDE_WORKSPACE
符号链接变更 返回 SYMBOLIC_LINK_MUTATION
文件在编辑期间被外部修改 返回 REVISION_CONFLICT
二进制或超出上限 返回 BINARY_FILE / FILE_TOO_LARGE

这类设计让 ArkTS 侧不需要理解主机路径规范,也让错误能够回到编辑器和资源管理器的正确上下文。路径、修订和符号链接不是"错误提示细节",而是保证远程 IDE 不误改主机文件的协议基础。

四、编辑、语言服务、构建和终端怎样接到主线

编辑器、语言服务、构建和终端分别解决不同问题,但共享同一条工作区主线。编辑器负责交互和文本状态,语言服务提供诊断、补全、符号和重命名,任务系统执行管理员配置文件中的构建命令,终端则保留开发者熟悉的交互式环境。

能力 实现方式 关键配置
C/C++ clangd 编译数据库、Clang 工具链
JavaScript / TypeScript TypeScript Language Server 工作区 Node.js 环境
PHP Phpactor 可选的 PHP 运行时
Python Pyright Language Server Python 解释器与包环境
Rust rust-analyzer Rust 工具链

Monaco 和 xterm.js 不通过运行时下载,而是在开发电脑上先构建成静态资源。这样 HAP 安装后就没有 CDN、外网包源或网页脚本版本漂移问题:

bash 复制代码
cd tools/editor-web
npm ci
npm run typecheck
npm test
npm run build

cd ../terminal-web
npm ci
npm run typecheck
npm test
npm run build

构建任务只能来自 Agent 管理员配置。子进程启动时显式使用 shell: false,参数以数组传递,并从环境变量中删除 Agent Token。终端同样是 Agent 托管的 PTY,客户端只能创建、连接、输入、改变尺寸和终止已有会话,不能指定任意 shell、工作目录或附加环境变量。

typescript 复制代码
delete environment['OHOS_CODELITE_TOKEN'];
child = spawn(task.executable, task.args, {
  cwd: task.resolvedWorkingDirectory,
  env: environment,
  shell: false,
  stdio: ['ignore', 'pipe', 'pipe']
});

终端最多同时保留四个编号 PTY 标签,并处理重连、回放缺口和输出订阅。这样即使网络短暂波动,编辑器仍能区分"会话已经结束"和"客户端暂时失去订阅",不会把两者混成同一种错误。

五、Git 与调试:把高权限能力收回 Agent

Git 和调试直接操作源码、历史、进程和内存,是 IDE 中权限最高的部分。ArkTS 客户端没有把这些能力换成任意 Shell,而是继续沿用类型化路由:Git 只接受工作区限定的操作,调试只接受管理员已发布的配置和受控输入。

工作流 Agent 提供的能力 收紧后的输入
源代码管理 状态、Diff、暂存、提交、分支、历史和同步 工作区相对路径、提交信息和固定操作
历史修复 受控 Revert、Apply Patch、Reset 到当前 HEAD 一次性事务 ID、预览与状态复核
调试控制 LLDB-DAP 启动、附加、继续、暂停和停止 Agent 已公布的配置 ID 或进程 PID
断点 源码、函数、地址和日志点 规范化位置、条件和命中次数
变量与内存 Watch、求值、变量修改、反汇编和内存窗口 默认关闭的管理员策略与不透明 ID

协议为失败预留了细粒度错误码。下面只摘出与 Git 和调试相关的部分,它们让客户端能区分"没有仓库""工作树不干净""能力未授权"和"适配器不可用",而不是统一显示一条未知错误。

typescript 复制代码
GIT_NOT_REPOSITORY
GIT_WORKTREE_DIRTY
GIT_NON_FAST_FORWARD
DEBUG_ADAPTER_UNAVAILABLE
DEBUG_ATTACH_NOT_ALLOWED
DEBUG_EVALUATION_NOT_ALLOWED
DEBUG_MEMORY_WRITE_NOT_ALLOWED
DEBUG_BREAKPOINT_FEATURE_UNAVAILABLE

默认开放

  • 只读状态与历史

  • 安全范围内的文件与搜索

  • 已配置任务的启动

  • 普通断点与栈查看

需要显式策略

  • 变量与寄存器修改

  • 内存写入

  • 调试控制台求值

  • 协议日志和部分数据断点

调试能力依赖目标主机的 LLDB-DAP、程序权限和 Agent 配置。客户端支持某项界面,不代表任意主机和任意程序都能直接调试。

六、测试数字和真机证据说明了什么

项目提供的验证数字覆盖了客户端、离线 Web 资源、Remote Agent 和 HAP 构建。文中的三张图分别对应工作台调试界面、源代码管理界面和本地目录隔离探针;它们不是把所有功能都跑到真机,而是把"界面证据"和"生命周期证据"分开呈现。读者应结合测试报告判断哪些层已经通过自动化检查,哪些仍处于"代码已实现、设备待验收"。

验证项 结果 说明
Remote Agent 157/157 通过 TypeScript 类型检查和构建通过
ArkTS 本地单元测试 272/272 通过 客户端状态、协议和领域逻辑
Editor Web 16/16 通过 构建与生产资源生成通过
Terminal Web 5/5 通过 构建与生产资源生成通过
HarmonyOS HAP 通过 签名 debug HAP 构建、安装和启动通过
本地目录真机证据 7/7 通过 HAD-W32 / OpenHarmony-6.1.1.130
双语资源 934 / 934 base 与 zh_CN 键集合一致
Node.js 依赖审计 0 漏洞 三个运行时工程生产依赖

其中"本地目录真机证据"验证的是隔离探针中的目录选择、可逆文件操作、应用重启、设备重启、外部修改、清理和撤销策略七个检查点,并不等同于完整 IDE 验收。图 3 的作用是证明授权目录的生命周期边界,而不是证明编辑器已经可以直接打开该目录。正常工作台尚未开放本地目录模式,网络连接、窗口缩放、键盘与输入法、终端、Git、LSP 和 LLDB-DAP 仍需在实际部署环境中完成端到端验证。

**证据结论:**工程、协议、离线资源和 HAP 已经有稳定的自动化基线;真机证据证明关键生命周期方向可行,但还没有到"所有 IDE 工作流均已在 PC 上长期验证"的阶段。

七、编译、部署与连接工作区

工程包含三个 Node.js 构建工程和一个 HarmonyOS HAP。正确顺序是先构建离线 Web 资源和 Remote Agent,再构建客户端,最后部署到 PC 或 2-in-1 设备。

bash 复制代码
cd tools/editor-web && npm ci && npm run build && cd ../..
cd tools/terminal-web && npm ci && npm run build && cd ../..
cd remote-agent && npm ci && npm run typecheck && npm test && npm run build

Remote Agent 默认监听 http://127.0.0.1:8736。最小启动方式只需要一个工作区和至少 24 个字符的 Token;跨设备访问应优先使用 SSH 隧道或 TLS,只有隔离的可信开发网络才考虑显式监听局域网地址。

bash 复制代码
export OHOS_CODELITE_TOKEN='replace-with-at-least-24-characters'
npm start -- \
  --workspace sample=/absolute/path/to/project

客户端在 DevEco Studio 中配置签名后构建 HAP,也可以使用 HDC 安装已签名产物。启动应用后,在"远程"视图输入 Agent 地址和 Token,连接后选择已授权工作区,再从资源管理器打开文件。

bash 复制代码
hdc install -r /absolute/path/to/entry-default-signed.hap
    • 离线 Monaco 与 xterm.js 随 HAP 打包
    • Remote Agent 可独立构建和测试
    • 签名 debug HAP 已完成构建、安装和启动
    • 真实部署环境中的网络、键盘、输入法和完整 IDE 流程验收

八、T0 / T1 / T2 与当前限制

按证据强度划分,CodeLite 项目已经越过"仅能编译界面"的阶段,但还没有把完整 IDE 的所有真实设备路径一起关闭。T0 关注能构建、能启动,T1 关注核心开发工作流,T2 关注真实部署和长期运行。

层级 当前范围 仍需完成
T0 ArkUI 工作台、离线 Monaco/xterm、双语资源、HAP 构建 真实设备上的缩放、输入法和焦点复核
T1 远程工作区、文件、搜索、替换、LSP、任务、终端、Git 和 LLDB-DAP 真实工具链与完整用户流程验收
T2 本地目录隔离探针七项门禁通过 接入正常工作台,完成 PC/2in1 长期运行验证
    • ArkTS 客户端、离线编辑器和终端资源随 HAP 构建
    • Remote Agent 协议、工作区、语言服务、终端、Git 和调试主路径实现
    • 本地目录隔离探针在 HAD-W32 真机通过七项检查
    • 本地目录模式接入正常工作台
    • 网络、输入法、缩放、终端、Git、LSP 和调试完成完整设备验收
    • B17.3 后续工作启动

**本文结论:**ohos_CodeLite 的核心价值是把 CodeLite 的开发工作流拆成可构建、可测试、可审计的 HarmonyOS 原生客户端与 Remote Agent 组合。当前最需要继续补的是正常工作站中的真机全流程,而不是再增加没有真实后端语义的界面控件。

参考资料与源码入口

项目内主要资料包括 README.OpenHarmony_CN.mdremote-agent/README.md、总体架构设计、CodeLite 功能与 UI 对标矩阵、剩余功能路线图和第三方许可证说明。

条目
应用版本 1.0.0
Remote Agent 0.48.0,协议 v1
目标 SDK HarmonyOS 6.1.1 (API 24)
项目许可证 GPL-2.0
真机证据 HAD-W32 / OpenHarmony-6.1.1.130
相关推荐
终端安全笔记2 小时前
iOS 27 给了租赁一个新工具,但它只认受监督的设备
android·网络·安全·ios
爱笑鱼2 小时前
Android 系统启动机制(八):系统服务怎样从创建走到可用?SystemServiceManager 和 Boot Phase 各管什么?
android
hai_android2 小时前
Android 组件化开发实践
android·java·kotlin
mmsx2 小时前
Android 几何构造器的双栈机:链式 API 底层是怎么装配几何的
android
mmsx2 小时前
Android 地图卡成 PPT 之后:双渲染管线与空间网格渐进加载怎么救
android·app
光影少年2 小时前
setImmediate 和 setTimeout(0) 的区别
android·前端·react.js·ios·前端框架
池央3 小时前
通勤听书不想来回切 App?用 Audiobookshelf 搭一个自己的有声书库
智能手机·cpolar
Android-Flutter17 小时前
android compose 知识点
android·compose
其实防守也摸鱼18 小时前
Codex 下载与本地部署实战:从安装到运行全指南
android·大数据·运维·安全·自动化