# 打包与签名 <Badge type="warning" text="尚未发布" />

要登录用户的 Mini App（见[登录](https://docs.micromeet.ai/zh/miniapp-sdk/auth.md)）以**签名包**交付：文件打进一个 `app.asar`，加一个 `manifest.json`，再加上 Micromeet 对两者的签名。Cowork 打开 Mini App 时验签名，页面读每个文件时再按签名逐个比对；文件被改过就关闭这个 Mini App。没有签名或签名验不过的包，Cowork 不会打开，并告诉用户这个 Mini App 未经认证。

## 包的结构

```text
manifest.json         { appId, name, version, version_code, entry, asar, domains, asarHeaderSha256, signature }
app.asar              构建出的页面、脚本和样式，每个文件的 SHA-256 摘要记在它的文件头里
app.asar.unpacked/    大的媒体文件（视频、音频），放在 app.asar 外面；摘要仍在它的文件头里
INSTALL.md            可选：给安装它的 Agent 的步骤
```

| 字段 | 说明 |
|---|---|
| `appId` | 小写反向域名，如 `ai.example.app`；Micromeet 登记这个 Mini App 时给出 |
| `name` | 字符串，或 `{ zh, en }`；1–60 个字符 |
| `version` | 字母、数字、`.`、`+`、`-`；最多 32 个 |
| `version_code` | 12 位数字，构建时间 `YYMMDDHHmmss` |
| `entry` | `app.asar` 里的入口页面；默认 `index.html` |
| `domains` | 页面要请求的服务器域名；由插件的 `domains` 选项写入（见下面的「服务器域名」） |
| `asarHeaderSha256` · `signature` | 由下面的工具写入；不要手改 |

Cowork 从 `miniapp://<appId>/` 提供页面，内容策略是 `script-src 'self'`：脚本都要放在文件里（不能有内联 `<script>`），`/assets/app.js` 这样的绝对路径可以用。签名的 Mini App 在每个 Cowork 账号下各有一份存储，一个人看不到另一个人存的东西。

## 构建

`@micromeet-ai/miniapp-sdk`（在 Micromeet 的 GitLab 包仓库；访问权限请找 Micromeet）提供一个 Vite 插件，每次构建后写出包：

```js
// vite.config.js
import { defineConfig } from 'vite';
import { miniapp } from '@micromeet-ai/miniapp-sdk/vite';

export default defineConfig({
  plugins: [miniapp({ appId: 'ai.example.app', name: { en: 'Example', zh: '示例' }, unpackDir: 'media' })]
});
```

`vite build` 之后会写出 `miniapp-package/`，版本取自 `package.json`。名为 `.DS_Store`、`__MACOSX`、`.git`、`node_modules` 的文件不会打进去。不用 Vite 时，`micromeet-miniapp pack --src dist --out miniapp-package --app-id … --name … --version …` 做同样的事。

## 服务器域名

Mini App 要和它自己的后端一起完成登录：页面把一次性 code 发给后端（见[登录](https://docs.micromeet.ai/zh/miniapp-sdk/auth.md)）。后端的地址就是 Mini App 的**服务器域名**；没有验证过的服务器域名的版本，不能登录任何人。只有要用 Micromeet 登录的 Mini App 才需要服务器域名；页面请求别的接口不受它们限制。

1. 把后端的地址告诉 Micromeet，如 `https://api.example.com`：HTTPS、主机名、不带路径；每个 Mini App 最多 20 个。
2. Micromeet 给你一个文件：`https://api.example.com/micromeet-miniapp-<16 个字符>.txt`，内容是一串 token。把它放在这个地址，用 HTTPS 返回 200，不能跳转。
3. Micromeet 取回这个文件来验证域名。文件要一直留着：文件不在了，这个域名就不再算数，登录也会停止。
4. 在包里写上这些域名：

```js
miniapp({ appId: 'ai.example.app', name: { en: 'Example' }, domains: ['https://api.example.com'] })
```

不用 Vite 时：`micromeet-miniapp pack … --domain https://api.example.com`。域名随版本一起签名，所以改了域名就是一个新版本。开发时，`http://localhost:<端口>` 或 `http://127.0.0.1:<端口>` 在 Micromeet 允许的环境里不用放文件。

## 交给 Micromeet 签名

每个版本由 Micromeet 登记并签名：Micromeet 自己的 Core 读 `app.asar`，逐个文件核对摘要，再对文件头签名；签名写进 `manifest.json`。交出包之前，先按 Cowork 和 Micromeet 的规则自查：

```bash
micromeet-miniapp verify miniapp-package            # 检查包
micromeet-miniapp verify miniapp-package --signed   # 签名之后：签名能验过
```

同一个版本不能登记两次：每次交出新的构建都要改 `version`。

## 交付

```bash
micromeet-miniapp zip miniapp-package    # → ai.example.app-1.0.0.zip
```

用户在 Cowork 里让 Agent 安装这个 zip（`miniapp_install`）。Cowork 把每个版本放在自己的文件夹里，旧版本在它的标签页关掉后删除。签名的 Mini App 也可以放进扩展和技能的包里一起装；每次打开，Cowork 都同样验签名。

| 上限 | |
|---|---|
| `app.asar` | 512 MB；媒体放进 `app.asar.unpacked/`（`unpackDir` 或 `unpack`） |
| `app.asar.unpacked/` | 100,000 个文件，8 GB |

## 相关

- [开发登录 Mini App](https://docs.micromeet.ai/zh/miniapp-sdk/sign-in-guide.md): 从登记到登录跑通
- [包规范](https://docs.micromeet.ai/zh/miniapp-sdk/package-spec.md): 包必须满足的全部规则，以及谁检查
- [登录](https://docs.micromeet.ai/zh/miniapp-sdk/auth.md): 在 Mini App 里登录用户
- [概览](https://docs.micromeet.ai/zh/miniapp-sdk/overview.md): Mini App SDK 的全部模块
