AI 驱动的跨平台即时应用平台。用户用自然语言描述需求,AI 自动生成迷你小程序并即刻运行在 iframe 沙箱中。
![]() |
![]() |
![]() |
![]() |
| AI 对话 | 服务浏览 | 服务运行 | 设置 |
Vue 3 + TypeScript + Vite + Tauri 2(Windows / macOS / Linux / Android)
npm install
npm run dev # 开发模式 → http://localhost:8484
npm run build # 生产构建
cargo tauri dev # Tauri 桌面应用(开发)
cargo tauri build # Tauri 桌面应用(打包 EXE/DMG/deb)- OpenAI 兼容的多轮流式对话,支持 DeepSeek / Qwen / 智谱等 API
- 记忆系统:AI 自动保存用户偏好和重要信息到 MEMORY.md / USER.md
- 人格系统:首次引导创建 AI 人格(名称、风格),可通过
soul_save工具调整 - 多 Session:输入区左侧 › 展开功能面板,🗂️ 会话列表切换历史会话,每个 session 独立存储
- 需求追踪:AI 自动记录服务功能需求和优化建议
- 无顶栏设计:左右滑动即可切换页面(iPhone 风格跟手手势),两侧玻璃竖条箭头提示也可点击切换
- 玉石玻璃风:玉青主色 + 半透明玻璃表面 + 全局辉光背景,流光隐约划过
- 悬浮输入框:无聊天记录时输入框垂直居中,对话开始后沉底,玻璃质感浮于背景之上
- 服务可自带系统桌面卡片:
desktop-widgets/{cardId}/目录(widget.json 界面配置 + logic.js 数据逻辑 + assets 图片),原生 RemoteViews 渲染 - 也支持全局卡片:AI 一句"在桌面放个 xx 卡片"即可创建,无需完整服务
- 长按安卓桌面,按卡片尺寸选"变形虫卡片·小(2x2)/中(4x2)/大(4x4)"小组件并选卡即用;卡片可定时刷新,点击跳转对应服务页
- 卡面可用 HTML/CSS 或 SVG 自由绘制(
renderHtml离屏渲染成图):进度环、图表、个性排版都能上桌面
- 自然语言描述 → 生成完整 HTML/CSS/JS 小程序
- 生成的服务运行在 iframe 沙箱中,通过 JSBridge (
window.__amiba__) 调用宿主能力(详见下方「服务 API」) - 服务界面遵循统一的玉石玻璃风:引入
/libs/jade.css基础样式表即可复用设计令牌与组件类(详见 服务界面风格指南) - 支持 Chart.js v4 图表
- 生成后可继续用 AI 编辑服务文件(
service_file_*工具)
- Agent 可自主创建/修补技能:当复杂任务成功或错误被克服后,AI 会记录为 SKILL.md
- 使用遥测:每个技能记录使用次数、查看次数、修补次数
- Curator 后台:自动将长期未使用的技能标记为 stale → archived
- LLM 智能合并(可选):定期对技能按前缀聚类,合并为 umbrella skill
- 所有数据本地存储在
{AppData}/amiba/ - 配置、记忆、对话历史、服务文件、技能、人格文件全部本地化
- CSS 变量体系:30 个
:root变量驱动全局外观,AI 可通过对话修改配色/圆角/字体/阴影 - 内置主题:出厂自带
default(玉石玻璃风)、dark(深色)、ocean(蓝色系)三套主题 - 主题管理:AI 可通过
ui_theme_*工具创建/切换/删除主题;设置页提供下拉切换 - 插槽系统:4 个预定义 UI 插槽(聊天页消息上方/输入框下方、设置页末尾、服务列表上方),AI 可注入自定义 HTML
- 完全 AI 驱动:用户说"把背景改深色"、"在输入框下方加一行快捷键说明",AI 自动完成
通过左右滑动或两侧箭头切换前 6 个页面(从左到右即表中顺序):
| 路由 | 页面 | 说明 |
|---|---|---|
/registry |
远程服务仓库 | 浏览/导入远程仓库中的服务 |
/services |
服务浏览 | 已安装服务列表、导入、分享 |
/ |
AI 对话 | 与 AI 多轮对话 |
/quick |
快捷页 | 可自定义的快捷页面(widget 宿主) |
/settings |
设置 | 配置管理(API Key、供应商、Agent、主题、日志) |
/memory |
记忆管理 | 查看/编辑 MEMORY.md 与 USER.md |
/service/:id |
服务容器 | iframe 沙箱中运行服务(左上角浮动返回按钮) |
首次启动时自动安装 3 个预置服务,展示 JSBridge 各模块的真实用法;更多服务可通过远程服务仓库安装。
| ID | 名称 | 说明 | 涉及 API |
|---|---|---|---|
user.music_player |
音乐播放器 | 本地音乐扫描播放、顺序/随机模式、后台播放、悬浮块控制 | storage notification widgets background fileAccess |
user.quick_note |
快速笔记 | 全局悬浮块随时速记,主界面管理/搜索笔记 | storage notification widgets |
user.rss_reader |
RSS 阅读器 | 订阅 RSS 源,聚合阅读最新文章 | storage notification fetch |
AI 生成的服务运行在 <iframe sandbox> 中,通过 window.__amiba__ 全局对象调用宿主能力。所有 API 均需在服务 manifest 中声明对应权限。
| 模块 | 权限 | 说明 |
|---|---|---|
storage |
storage |
服务专属键值存储 |
notification |
notification |
Toast 通知 |
ui |
— | 页面导航 |
widgets |
widgets |
悬浮块管理 |
network |
network |
局域网/蓝牙设备发现与对等通信 |
desktopWidget |
desktopWidgets |
安卓系统桌面卡片数据发布(仅卡片 logic.js 沙箱可用) |
服务拥有独立的 key-value 存储空间,数据持久化到本地磁盘。
await __amiba__.storage.set('count', 42)
const count = await __amiba__.storage.get('count')
await __amiba__.storage.remove('count')| 方法 | 参数 | 返回 |
|---|---|---|
set(key, data) |
key: string, data: any |
Promise<void> |
get(key) |
key: string |
Promise<any> |
remove(key) |
key: string |
Promise<void> |
await __amiba__.showToast('保存成功', 'success')| 方法 | 参数 | 返回 |
|---|---|---|
showToast(title, icon?) |
title: string, icon?: 'success' | 'error' | 'loading' | 'none' |
Promise<void> |
await __amiba__.navigateTo('/services')
await __amiba__.navigateBack()| 方法 | 参数 | 返回 |
|---|---|---|
navigateTo(url) |
url: string |
Promise<void> |
navigateBack(delta?) |
delta?: number |
Promise<void> |
编程式注册和控制浮动面板。也支持通过服务目录下 widget.json 声明式配置(详见 服务模型)。
await __amiba__.widgets.register({
id: 'my-widget',
icon: '🔔',
page: 'widgets/alert.html',
edge: 'right',
position: 200,
showOn: [],
trigger: 'manual'
})
await __amiba__.widgets.show('my-widget')
await __amiba__.widgets.hide('my-widget')
await __amiba__.widgets.remove('my-widget')| 方法 | 参数 | 返回 |
|---|---|---|
register(config) |
config: FloatingWidgetConfig |
Promise<void> |
remove(id) |
id: string |
Promise<void> |
show(id) |
id: string |
Promise<void> |
hide(id) |
id: string |
Promise<void> |
FloatingWidgetConfig 字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id |
string |
✅ | 唯一标识,kebab-case |
icon |
string |
✅ | emoji 图标,如 "📝" |
label |
string |
— | 悬停提示文字 |
page |
string |
✅ | Widget HTML 文件路径 |
edge |
'left' | 'right' |
✅ | 吸附边缘 |
position |
number |
✅ | 初始 y 位置(px,距顶部) |
showOn |
string[] |
✅ | 生命周期路由名,空数组 = 全局 |
trigger |
'manual' | 'page' |
✅ | manual = API 控制(默认),page = 进入 showOn 路由时自动显示 |
设备发现、对等连接和消息收发。详见 网络互联通信。
// 可见性与发现
await __amiba__.network.setVisibility({ lan: true, ble: false })
const vis = await __amiba__.network.getVisibility()
await __amiba__.network.startDiscovery('lan')
await __amiba__.network.stopDiscovery('lan')
const devices = await __amiba__.network.getVisibleDevices()
__amiba__.network.onPeerDiscovered((peer) => { /* { id, name, transport, address } */ })
// TCP 监听(按需启动,才能接收外来连接)
await __amiba__.network.startListening('my-service')
await __amiba__.network.stopListening('my-service')
// 主动连接(含服务匹配)
const session = await __amiba__.network.connect(peerId, 'my-service')
await session.send(JSON.stringify({ type: 'chat', text: 'hello' }))
session.on('message', (msg) => { const data = JSON.parse(msg); /* ... */ })
session.on('close', (reason) => { /* 对方断开 */ })
await session.close()
// 接受外来连接
__amiba__.network.onSession((session) => { /* 同上 */ })可见性与发现:
| 方法 | 参数 | 返回 |
|---|---|---|
setVisibility(opts) |
{ lan: boolean, ble: boolean } |
Promise<void> |
getVisibility() |
— | Promise<{ lan: boolean, ble: boolean }> |
startDiscovery(transport) |
'lan' | 'ble' | 'all' |
Promise<void> |
stopDiscovery(transport) |
'lan' | 'ble' | 'all' |
Promise<void> |
getVisibleDevices() |
— | DiscoveredPeer[] |
onPeerDiscovered(cb) |
(peer: DiscoveredPeer) => void |
void |
Session 管理:
| 方法 | 参数 | 返回 |
|---|---|---|
connect(peerId, serviceKey) |
peerId: string, serviceKey: string |
Promise<Session> |
onSession(cb) |
(session: Session) => void |
void |
startListening(serviceKey) |
serviceKey: string |
Promise<void> |
stopListening(serviceKey) |
serviceKey: string |
Promise<void> |
Session 对象属性/方法:
| 属性/方法 | 说明 |
|---|---|
.id |
Session UUID |
.peerId |
对端设备 ID |
.peerName |
对端设备名称 |
.send(message) |
发送 string 消息,返回 Promise<void> |
.close() |
关闭会话,返回 Promise<void> |
.on('message', cb) |
监听消息,cb(message: string) |
.on('close', cb) |
监听关闭,cb(reason?: string) |
| 权限 | 说明 |
|---|---|
storage |
服务专属键值存储 |
notification |
Toast 通知 |
widgets |
悬浮块功能 |
network |
局域网/蓝牙互联通信(设备发现、消息收发) |
background |
后台持续运行(隐藏 iframe),定时调度/事件驱动 |
fileAccess |
授权访问磁盘文件(选择文件夹、列出/读取) |
fetch |
HTTP 请求外部 API(Rust reqwest 代理,绕过 CORS) |
desktopWidgets |
安卓系统桌面卡片(服务自带 desktop-widgets/ 卡片目录) |
生成服务的 UI 必须遵循平台统一的玉石玻璃风:在 index.html 中引入 <link href="/libs/jade.css" rel="stylesheet"> 即可获得设计令牌(玉青色系、圆角、阴影)、玻璃辉光背景和卡片/按钮/输入框/模态等组件类。详见 服务界面风格指南。
# 1. 安装 Android SDK(Android Studio → SDK Manager → SDK 34 + NDK 27)
# 2. 设置环境变量
export ANDROID_HOME=~/Android/Sdk
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/27.0.xxxx
# 3. 添加 Rust Android targets
rustup target add aarch64-linux-android armv7-linux-androideabi
# 4. 初始化 Android 项目(生成 src-tauri/gen/android/)
cargo tauri android init
# 5. 构建
cargo tauri android build # release APK
cargo tauri android dev # debug 到连接的设备输出:src-tauri/gen/android/app/build/outputs/apk/universal/release/
注意:首次本地构建需要 .cargo/config.toml 指定 NDK 链接器(CI 自动生成,本地需手动添加)。
Release APK 需要签名才能安装到设备或上架 Google Play。
本地签名(自用测试):
# 1. 生成 keystore(仅首次)
"C:\Program Files\Java\jdk-23.0.1\bin\keytool" -genkey -v \
-keystore release.keystore -alias amiba \
-keyalg RSA -keysize 2048 -validity 10000 \
-dname "CN=belowthetree, OU=Dev, O=Unknown, L=Unknown, ST=Unknown, C=CN" \
-storepass 你的密码 -keypass 你的密码
# 2. 用 apksigner 签名 APK
%ANDROID_HOME%\build-tools\35.0.0\apksigner sign \
--ks release.keystore --ks-key-alias amiba \
--out app-release-signed.apk \
app-universal-release-unsigned.apk
# 3. 安装到设备
adb install -r app-release-signed.apk
⚠️ keystore 文件不要提交到 git,它包含你的私钥。只需将 base64 编码后存入 GitHub Secrets。
- 在 GitHub 仓库 → Settings → Secrets → Actions 添加:
| Secret 名称 | 说明 |
|---|---|
KEYSTORE_BASE64 |
keystore 文件的 base64 编码 |
KEYSTORE_PASSWORD |
keystore 密码 |
KEY_PASSWORD |
key 密码 |
package.json版本变更 push 到 main → CI 自动构建并签名 APK → 发布到 GitHub Releases。
┌──────────────────────────────────────────────┐
│ ChatPage │
│ ┌─────────────┐ ┌──────────────────────┐ │
│ │ AI 对话 │ │ iframe 沙箱(服务运行)│ │
│ │ · 多 session │ │ · JSBridge │ │
│ │ · 流式输出 │ │ · __amiba__ API │ │
│ │ · 技能/记忆 │ │ · Chart.js │ │
│ └──────┬───────┘ └──────────────────────┘ │
│ │ │
│ ┌──────▼──────────────────────────────────┐ │
│ │ AI Core (src/ai/) │ │
│ │ agent.ts → 多工具循环 + 流式对话 │ │
│ │ system-prompt.ts → 两层缓存 + nudge │ │
│ │ soul.ts → 人格管理 + 引导 │ │
│ │ session.ts → 多 session 管理 │ │
│ │ memory-store.ts → 实时记忆缓存 │ │
│ │ skill-curator.ts → 技能生命周期 │ │
│ │ requirement-store.ts → 需求追踪 │ │
│ └──────┬──────────────────────────────────┘ │
│ │ │
│ ┌──────▼──────────────────────────────────┐ │
│ │ ToolRegistry (src/tools/) │ │
│ │ 30+ 工具: memory, service_create, │ │
│ │ service_file_*, skill_manage_*, │ │
│ │ requirement_*, soul_save, ... │ │
│ └──────────────────────────────────────────┘ │
└──────────────────────────────────────────────┘
| 类别 | 工具 | 说明 |
|---|---|---|
| 记忆 | memory |
写入 MEMORY.md / USER.md |
| 人格 | soul_save |
创建/更新 AI 人格文件 |
| 服务 | service_create service_file_list/read/write/edit service_validate service_archive service_rollback |
创建服务骨架、文件级编辑、校验、版本快照/回滚 |
| 技能 | skill_view skills_list |
查看/列出技能 |
| 技能管理 | skill_manage_create/patch/edit/delete/write_file |
AI 自主创建和修改技能 |
| 需求 | requirement_view requirement_update requirements_summary |
需求追踪 |
| 文档 | doc_list doc_read doc_search |
平台文档库查询(含服务风格指南) |
| 会话 | session_search |
SQLite FTS5 搜索历史会话 |
| 网页 | web_fetch web_browse |
网页抓取与浏览器交互 |
| 界面 | ui_theme_view/list/set_variable/set_css/reset/create/delete/switch |
主题管理与外观定制 |
| 界面 | ui_slot_list/get/set/remove |
插槽/内嵌组件管理 |
| 桌面卡片 | desktop_widget_create/list/enable/refresh/delete |
系统桌面卡片管理(Android / 鸿蒙) |
每 10 轮对话,系统自动注入检查指令,要求 AI 在回复之前:
- 记忆检查:用户偏好、重要决策 → memory 工具
- 需求检查:服务功能需求、优化建议 → requirement_update 工具
/new 命令会在清空对话前捕获上下文,下一会话开始时提示 AI 保存重要信息。
src/
├── ai/ AI 核心(agent, system-prompt, soul, session, memory, skill, requirement, curator)
├── tools/ 30+ AI 工具(自动发现,含 ui_theme_*/ui_slot_* 界面定制)
├── host/ 服务运行时(沙箱、JSBridge、注册表)
├── pages/ 6 个导航页面(Chat, ServiceBrowse, Quick, RemoteServices, Settings, Memory)
├── components/ 可复用组件(GlassBackground 玻璃背景、EdgeNavHint 边缘翻页等)
├── config/ 配置、存储抽象、主题引擎(theme-store.ts)、polyfill
├── router/ 路由 + PAGE_ORDER 页面序列
└── types/ 类型定义
public/themes/ 内置主题文件(default/dark/ocean)
public/libs/ 服务可复用库(jade.css 玉石玻璃风样式、vue/chart 预置库)
public/docs/ AI 可读的内置文档(沙箱约束、服务风格指南等)
docs/ 详细设计文档
skills/ 技能文件目录
| 文档 | 内容 |
|---|---|
| 架构 | 系统总体设计 |
| Session | 多 session 管理 |
| System Prompt | 两层缓存结构 |
| 记忆系统 | 持久记忆机制 |
| 人格系统 | SOUL.md 管理 |
| 技能进化 | 四阶段技能演化 |
| 需求追踪 | 双层需求体系 |
| 工具系统 | 工具清单 |
| JSBridge | 沙箱通信协议 |
| 网络互联通信 | 局域网/蓝牙设备发现与对等通信 |
| 服务生成 | 服务生成与运行 |
| 开发指南 | 开发规范 |
| 界面定制 | CSS 选择器速查表 + 变量参考 + 插槽 |
| 服务界面风格 | 玉石玻璃风实现说明 + jade.css 用法 |
| 安卓桌面卡片 | 系统桌面小组件(AppWidget)设计与开发 |
修改 package.json 版本号并 push 到 main 自动:
- 检测版本是否已发布(tag 是否存在)
- 构建 Windows / macOS / Linux / Android
- 创建
v{version}tag → 发布到 GitHub Releases
npm version patch # 0.1.4 → 0.1.5
git push origin main # 触发构建也支持手动触发(Actions → workflow_dispatch)。
变形虫内置多主题系统,用户可通过对话让 AI 自由定制界面外观。
{AppData}/amiba/theme/
default/ ← 玉石玻璃风基准(玉青主色 + 半透明玻璃表面,只读)
dark/ ← 深色模式(只读)
ocean/ ← 蓝色系(只读)
我的主题/ ← 用户创建(可改可删)
slots/ ← 全局插槽 HTML
- CSS 变量驱动:30 个变量(颜色/圆角/阴影/字体/间距)定义在
App.vue :root,所有页面样式通过var(--*)引用 - 即改即生效:修改任意 CSS 变量,全局立即刷新
- AI 对话操作:用户说"换成深色"→ AI 调用
ui_theme_switch("dark");"所有按钮改圆角"→ui_theme_set_variable("--radius-sm", "12px") - 详细参考:界面定制指南 — CSS 选择器速查表 + 变量说明 + 插槽列表
MIT © 2026 belowthetree



