# MiniAPP Javet Node Runtime 技术方案
> 目标:把 MobileClaw MiniAPP 从“单 HTML 页面”升级为“可源码编辑、可编译、可导入导出、可运行 Vue/TS 等现代前端框架”的项目级应用,并在 Android 内通过 Javet 运行受控 Node 构建器。
本文档记录当前确定的技术路线、ChatAI 需要新增的方法、AI 创建/修改 MiniAPP 的执行流程、Node/Javet 版本方案、MiniAPP 包格式、导入导出策略和原生桥约束。
## 1. 背景
当前 MiniAPP 的底层模型仍是单文件 HTML:
- `MiniApp` 元数据中保存 `htmlPath`。
- `AppManagerSkill` 的 `create/update` 主要接收完整 `html` 字符串。
- `MiniAppStore` 将内容保存为 `{id}.html` 和 `{id}.json`。
- WebView 使用 `loadDataWithBaseURL(file://...)` 注入 HTML 字符串运行。
- Claw 原生桥通过向 HTML 中插入 `
```
原因:
- Vue/Vite 的 module script 可能很早执行。
- `onPageFinished` 后补注入可能晚于业务代码。
- 固定 runtime 文件更容易版本化和调试。
### 8.4 TypeScript SDK
每个项目包含:
```text
src/mobileclaw.ts
```
只暴露类型安全 SDK:
```ts
export const Claw = {
fetch,
sql,
python,
files,
ai,
log,
toast,
device,
clipboard,
close,
setTitle,
}
```
业务代码禁止直接访问:
```ts
window.Android
```
### 8.5 Capabilities 权限
`miniapp.json` 声明权限:
```json
{
"capabilities": ["network", "files", "sqlite", "python", "ai"]
}
```
原生桥按权限判断是否允许调用:
| capability | 允许能力 |
| --- | --- |
| `network` | `Claw.fetch` |
| `files` | `Claw.files` |
| `sqlite` | `Claw.sql` |
| `python` | `Claw.python` |
| `shell` | `Claw.shell` |
| `ai` | `Claw.ai.chat` |
| `clipboard` | `Claw.clipboard` |
| `native_intent` | `openUrl`, `shareText`, `launchApp` |
默认不开放 `shell`。
## 9. 验证体系
### 9.1 构建验证
`miniapp_project.build` 至少检查:
- Node/Javet 可用。
- builder 版本匹配。
- `vite.config.ts` 可解析。
- `src/main.ts` 存在。
- TypeScript/Vue 编译通过。
- `dist/index.html` 生成。
- `dist/assets/*` 资源存在。
### 9.2 静态验证
`miniapp_project.validate` 静态检查:
- 禁止 `window.Android`。
- 禁止原生 `fetch(` 和 `XMLHttpRequest`,除非 bridge polyfill 内部。
- 禁止外部 CDN,除非 manifest 允许。
- 检查 `Claw` 调用是否 `await`。
- 检查 `dist/index.html` 是否加载 `/_claw/bridge.js`。
### 9.3 运行验证
隐藏 WebView 加载:
```text
https://appassets.androidplatform.net/miniapps/{id}/dist/index.html
```
探针检查:
- `window.Claw` 是否存在。
- body 是否可见。
- 页面尺寸是否合理。
- DOM 是否挂载。
- 控件或视觉内容是否存在。
- console error / unhandled rejection。
- runtime logs 是否有 error。
## 10. 实施阶段
### 阶段 1:Javet 可行性验证
目标:确认 Android 内 Node 可运行。
任务:
- 添加 `javet-node-android` 依赖。
- 新增 `NodeRuntimeManager`。
- 实现 `node_runtime.status`。
- 实现 `node_runtime.prepare`。
- 跑 hello-world Node script。
- 输出 Node 版本、ABI、运行日志。
完成标准:
- 真机可返回 Node 版本。
- 多次调用不崩溃。
- 出错时能返回结构化错误。
### 阶段 2:受控 Vite Builder
目标:在 Android 内将一个固定 Vue/TS 模板编译成 `dist/`。
任务:
- 准备 `node_builder` 资产。
- 新增 `build-miniapp.mjs`。
- 新增 `MiniAppBuildService`。
- 构建 `vue3-vite-ts` 示例项目。
- 解析 Vite/TS 错误为结构化 JSON。
完成标准:
- `src/App.vue` 可编译成 `dist/index.html`。
- 编译失败能定位文件行号。
### 阶段 3:MiniAPP v2 存储
目标:让 MiniAPP 支持项目目录。
任务:
- 扩展或新增 `MiniAppProjectStore`。
- 支持 `filesDir/apps/{id}/`。
- 保留 v1 `{id}.html` 兼容。
- 支持源码文件读写、搜索、patch。
- 支持 build logs。
完成标准:
- 旧 MiniAPP 不受影响。
- 新 MiniAPP 可保存多文件项目。
### 阶段 4:ChatAI 工具升级
目标:AI 能按项目流程创建和修改 MiniAPP。
任务:
- 升级 `AppManagerSkill`。
- 增加项目级 actions。
- 更新 `get_guide`。
- 更新 AgentRuntime 对 validate/build 错误的自动修复提示。
完成标准:
- AI 创建项目时会 build/validate/open。
- AI 修改项目时会 search/read/patch/build/validate。
### 阶段 5:WebView v2 Runtime
目标:运行 `dist/` 多文件应用。
任务:
- 接入 `WebViewAssetLoader`。
- 加载 v2 `dist/index.html`。
- 提供 `/_claw/bridge.js`。
- 根据 capabilities 限制桥能力。
- 关闭不必要 file 权限。
完成标准:
- Vue/Vite 产物可在 WebView 正常运行。
- Bridge 在业务代码前可用。
- v1 仍可打开。
### 阶段 6:导入导出
目标:完整迁移 MiniAPP 项目。
任务:
- 导出 v2 包:manifest、miniapp、src、dist、backend、data。
- 导入 v2 包。
- 导入无 dist 的源码包时触发 build。
- 支持 v1 包导入。
- 支持冲突策略。
完成标准:
- 导出的 v2 包在另一台设备导入后可直接运行。
- 缺 dist 时可在设备上重建。
## 11. 风险与处理
| 风险 | 处理 |
| --- | --- |
| Javet 包体积增加 | 只保留 `arm64-v8a` 和 `x86_64`;后续按渠道拆分 |
| Node/Vite 内存占用高 | 单构建队列,限制并发,设置超时 |
| npm 生态 Android 兼容问题 | 不跑任意 npm;预置 builder;必要时走依赖白名单 |
| esbuild/Rollup ABI 不匹配 | `node_runtime.diagnose` 检查;builder 包按 ABI 准备 |
| AI 乱改 dist | 工具层禁止 patch `dist/`,只允许 build 生成 |
| 原生桥安全风险 | WebViewAssetLoader origin + capabilities + 禁止外部不可信内容 |
| 旧 MiniAPP 兼容 | v1/v2 双路径,迁移显式触发 |
## 12. 当前代码落点
| 当前文件 | 后续改动 |
| --- | --- |
| `app/build.gradle.kts` | 添加 Javet 依赖,确认 ABI/packaging |
| `MiniAppStore.kt` | 扩展 v2 项目目录、导入导出、v1 兼容 |
| `MiniAppActivity.kt` | v2 使用 WebViewAssetLoader 加载 dist |
| `AppLauncherPage.kt` | 工作台预览同步支持 v2 runtime |
| `MiniAppPreflightValidator.kt` | 从 HTML 字符串验证升级为项目/dist 验证 |
| `AppManagerSkill.kt` | 增加项目级 actions 和 v2 guide |
| `AppJsBridge.kt` | 增加 capabilities 和 origin 校验 |
| `ClawApplication.kt` | 初始化 NodeRuntimeManager / MiniAppBuildService |
## 13. 第一版验收标准
第一版完成后,至少要满足:
1. Android 真机内能通过 Javet 返回 Node 版本。
2. AI 可以创建一个 `vue3-vite-ts` MiniAPP 项目。
3. 项目可在 Android 内 build 成 `dist/`。
4. 编译失败时 AI 能读取报错文件并修复。
5. WebView 能运行 `dist/index.html`。
6. Claw bridge 在 Vue 应用启动前可用。
7. MiniAPP v2 可以导出和导入。
8. 旧版 HTML MiniAPP 不受影响。