# Pengemasan dan Tanda Tangan <Badge type="warning" text="Belum dirilis" />

Mini App yang memasukkan pengguna (lihat [Masuk](https://docs.micromeet.ai/id/miniapp-sdk/auth.md)) dikirim sebagai **paket bertanda tangan**: file-filenya dikemas dalam satu `app.asar`, ditambah sebuah `manifest.json`, dan tanda tangan Micromeet atas keduanya. Cowork memeriksa tanda tangan saat membuka Mini App, lalu mencocokkan setiap file dengan tanda tangan itu saat halaman membacanya; file yang berubah membuat Mini App ditutup. Cowork tidak membuka paket yang tidak bertanda tangan atau tanda tangannya tidak valid; Cowork memberi tahu pengguna bahwa Mini App itu belum tersertifikasi.

## Isi paket

```text
manifest.json         { appId, name, version, version_code, entry, asar, domains, asarHeaderSha256, signature }
app.asar              halaman, skrip, dan style hasil build; digest SHA-256 setiap file ada di header-nya
app.asar.unpacked/    media besar (video, audio), di luar app.asar; digest-nya tetap ada di header-nya
INSTALL.md            opsional: langkah-langkah untuk agent yang memasangnya
```

| Field | Deskripsi |
|---|---|
| `appId` | Domain terbalik huruf kecil, misalnya `ai.example.app`; diberikan saat Micromeet mendaftarkan Mini App |
| `name` | String, atau `{ zh, en }`; 1–60 karakter |
| `version` | Huruf, angka, `.`, `+`, `-`; maksimal 32 |
| `version_code` | 12 digit, waktu build `YYMMDDHHmmss` |
| `entry` | Halaman awal di dalam `app.asar`; bawaan `index.html` |
| `domains` | Domain server yang dituju request halaman; ditulis dari opsi `domains` plugin (lihat Domain server di bawah) |
| `asarHeaderSha256` · `signature` | Ditulis oleh alat di bawah; jangan diubah manual |

Cowork menyajikan halaman dari `miniapp://<appId>/` dengan kebijakan konten `script-src 'self'`: taruh setiap skrip di file (tanpa `<script>` inline), dan path absolut seperti `/assets/app.js` bisa dipakai. Mini App bertanda tangan punya penyimpanan terpisah untuk setiap akun Cowork, sehingga seseorang tidak pernah melihat apa yang disimpan orang lain.

## Build

Paket `@micromeet-ai/miniapp-sdk` (di registry paket GitLab Micromeet; minta akses ke Micromeet) menambahkan plugin Vite yang menulis paket setelah setiap build:

```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' })]
});
```

Setelah `vite build`, folder `miniapp-package/` ditulis; versinya diambil dari `package.json`. File bernama `.DS_Store`, `__MACOSX`, `.git`, atau `node_modules` tidak ikut dikemas. Tanpa Vite, `micromeet-miniapp pack --src dist --out miniapp-package --app-id … --name … --version …` melakukan hal yang sama.

## Domain server

Mini App memasukkan pengguna bersama backend-nya sendiri: halaman mengirim code sekali pakai ke sana (lihat [Masuk](https://docs.micromeet.ai/id/miniapp-sdk/auth.md)). Alamat backend itulah **domain server** Mini App, dan versi tanpa domain yang sudah diverifikasi tidak bisa memasukkan siapa pun. Hanya Mini App yang memasukkan pengguna dengan Micromeet yang memerlukannya; domain ini tidak membatasi request lain dari halaman.

1. Beri tahu Micromeet alamat backend Anda, misalnya `https://api.example.com`: HTTPS, nama host, tanpa path; paling banyak 20 per Mini App.
2. Micromeet memberi Anda sebuah file, `https://api.example.com/micromeet-miniapp-<16 karakter>.txt`, berisi sebuah token. Sajikan di alamat itu lewat HTTPS dengan status 200 dan tanpa redirect.
3. Micromeet memverifikasi domain dengan mengambil file itu. Biarkan file tetap di sana: jika file hilang, domain tidak lagi dihitung dan proses masuk berhenti.
4. Cantumkan domainnya di paket:

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

Tanpa Vite: `micromeet-miniapp pack … --domain https://api.example.com`. Domain ditandatangani bersama versinya, jadi daftar yang berubah berarti versi baru. Untuk pengembangan, `http://localhost:<port>` atau `http://127.0.0.1:<port>` tidak perlu file di lingkungan yang diizinkan Micromeet.

## Minta Micromeet menandatanganinya

Micromeet mendaftarkan dan menandatangani setiap versi: Core milik Micromeet membaca `app.asar`, memeriksa setiap file terhadap digest-nya, lalu menandatangani header-nya; tanda tangan ditulis ke `manifest.json`. Sebelum menyerahkan paket, periksa dengan cara yang sama seperti Cowork dan Micromeet:

```bash
micromeet-miniapp verify miniapp-package            # paketnya
micromeet-miniapp verify miniapp-package --signed   # setelah ditandatangani: tanda tangannya valid
```

Satu versi tidak bisa didaftarkan dua kali: ubah `version` untuk setiap build baru yang Anda serahkan.

## Kirim

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

Pengguna memasang zip itu di Cowork dengan meminta agent (`miniapp_install`). Cowork menyimpan setiap versi di foldernya sendiri dan menghapus versi lama setelah tab-nya ditutup. Mini App bertanda tangan juga bisa dimasukkan ke paket ekstensi dan skill; Cowork memeriksanya dengan cara yang sama setiap kali dibuka.

| Batas | |
|---|---|
| `app.asar` | 512 MB; taruh media di `app.asar.unpacked/` (`unpackDir` atau `unpack`) |
| `app.asar.unpacked/` | 100.000 file, 8 GB |

## Terkait

- [Membuat Mini App dengan Masuk](https://docs.micromeet.ai/id/miniapp-sdk/sign-in-guide.md): Dari pendaftaran sampai proses masuk berjalan
- [Spesifikasi Paket](https://docs.micromeet.ai/id/miniapp-sdk/package-spec.md): Semua aturan yang harus dipenuhi paket, dan siapa yang memeriksanya
- [Masuk](https://docs.micromeet.ai/id/miniapp-sdk/auth.md): Memasukkan pengguna dari Mini App
- [Ikhtisar](https://docs.micromeet.ai/id/miniapp-sdk/overview.md): Semua modul Mini App SDK
