# 智能体能力说明：生成、发布与灌数

一类专用智能体：先选定**模块**，再生成页面并发布到建站平台，最后导入业务数据。  
接口细节见：[智能体-生成发布-API.md](./智能体-生成发布-API.md)

> 业务用语称「**模块**」（API 路径仍为 `/apps`，字段仍为 `app_slugs`）。  
> **管理账号**可查看本租户全部模块（含在建）。  
> **智能体**：启用并赋予「生成发布」后即可**自由发布自建模块**；`app_slugs` 留空表示不限制，无需后台逐个授权。

---

## 1. 一句话定位

| 项目 | 说明 |
|------|------|
| 做什么 | 登记账号 → 选模块 → **生成页面** → **向建站平台发布** → 导入数据 |
| 得到什么 | 发布回执含模块名、加密访问路径、状态；控制台「打开模块」见多页业务后台 |
| 管理侧 | 管理账号在「模块管理」看到全部模块（在建 / 已发布 / 失败） |
| 不做什么 | 查业务库用户表；角色 / 邀请 / 组织管理；行级增删改（仅允许 import + 只读抽查） |

---

## 2. 核心规则（必读）

### 2.1 绑定宇恒 ID（首次必做）

智能体账号**不在**已发布模块的业务表里。禁止在业务库翻用户 / 权限。

| 宿主侧 | API 字段 | 说明 |
|--------|----------|------|
| **宇恒 ID** | `host_key` | 稳定唯一标识；**必传** |
| **名称** | `name` | 控制台显示名；**必传** |

`POST /api/v1/auth/agent/register` → `pending` → 管理员赋「生成发布」并**启用** → 换票。  
**不要求**再填写「可访问模块」才能发布。

### 2.2 管理账号与模块可见范围

| 账号类型 | `GET /api/v1/apps` 可见范围 |
|----------|------------------------------|
| **管理账号**（如 demo/`owner`，非 agent） | 本租户**全部**模块，含 **在建** 与已发布、失败 |
| **智能体（`app_slugs` 为空或含 `*`）** | 不限制（`scope=open`），可列本租户模块并自由发布自建 slug |
| **智能体（配置了白名单）** | 仅白名单内（`scope=granted`）——可选限制，非默认 |

状态展示：

| status | 中文 | 说明 |
|--------|------|------|
| `draft` / `validating` / `provisioning` | **在建** | 已生成蓝图或正在发布，尚未成功上线 |
| `published` | 已发布 | 可打开业务页、可灌数 |
| `failed` | 失败 | 发布失败，可继续编辑后重发 |

生成蓝图成功后可 `PUT /api/v1/apps/{slug}/draft` 登记为在建。

### 2.3 先选模块，再生成

发布前建议 `GET /api/v1/apps` 查看已有模块：

| 选择 | 含义 |
|------|------|
| **已有模块** | 为该模块 **生成新的页面**，再发布到该模块 |
| **没有合适模块** | **生成完整多页蓝图**，再 **新建模块**（自定 slug，无需后台预授权） |

### 2.4 页面必须多页

一次生成应产出多个 `pages`（至少列表 + 新建表单；建议再加编辑 / 看板）。  
页面数量**不设上限**。列表页建议带 `import`。

### 2.5 发布 = 向建站平台送建站数据

宿主侧点击「发布」时，应把蓝图与展示元数据 **POST 到本建站平台**（不是只在宿主本地落库）。

平台会：

1. 校验并落库模块蓝图（新建或向已有模块发布新页面）  
2. **按当前用户 / 智能体 ID 加密生成访问文件路径**（`access_path`）  
3. 回执模块名称、发布方式、访问地址、发布时间、状态，供宿主「AI 表格数据」展示  

### 2.6 发布后必须灌数

发布只建结构，**不会自动灌 Excel**。成功后必须 `import`，并建议抽查 `total > 0`。  
宿主提示「下一步：灌数 → 打开模块」与此一致。

---

## 3. 首次接入流程

```text
宇恒 ID + 名称
  → POST /api/v1/auth/agent/register
  → pending
  → 管理员：角色「生成发布」+ 启用（可访问模块可留空）
  → 换票后即可自定 slug 生成/发布
```

`app_slugs` **默认留空即可自由发布**；仅在需要收紧范围时再配白名单。

---

## 4. 能力边界

### 允许

1. 首次登记（宇恒 ID + 名称）  
2. 换票  
3. 列出本账号可访问模块、读取已发布蓝图  
4. 生成蓝图 / 生成新页面（可带 Excel / 截图 / HTML）  
5. 发布到建站平台（新建模块或向已有模块发布新页面；拿加密路径回执）  
6. 导入数据 + 只读抽查列表  

### 禁止

- 业务库查用户 / 权限表  
- `row.create` / `row.update` / `row.delete`（除 import）  
- admin / audit 等管理接口  
- 对已有模块默认 `mode=replace` 整站覆盖  
- 访问未授权模块（仅当管理员配置了 `app_slugs` 白名单时才受限）  

---

## 5. 角色与模块授权

推荐角色：**生成发布（`publisher`）**

| 权限 | 用途 |
|------|------|
| 「发布模块」 | 发布模块 |
| `app.read` | 列模块 / 读蓝图 |
| `row.import` | 灌数 |
| `row.read` | 抽查 |
| `storage.write` / `storage.read` | 素材（建议） |

`app_slugs`：**可选**。留空 = 不限制，智能体可随意发布自建模块；填写后才按白名单限制。

---

## 6. 宿主发布回执（需求）

宿主「AI 表格数据」应展示建站平台发布回执，而不是本地假数据：

| 表格项 | 含义 | 来自发布响应 |
|--------|------|----------------|
| 模块名称 | 业务显示名 | `module_name` |
| 发布方式 | 如立即发布上线 | `publish_style`（`immediate`） |
| 访问地址 | 可打开的地址 | `access_url`（或宿主域名 + `access_path`） |
| 发布时间 | 平台落库时间 | `published_at` |
| 状态 | 已发布 | `status` = `published` |

加密路径规则：

- 输入：租户 ID + 用户/智能体 ID + 模块 slug  
- 输出：`access_path`（如 `m/ajzm1_...`），路径中**无明文用户 id / slug**  
- 公开读蓝图：`GET /api/v1/public/m/{token}/blueprint`  

---

## 7. 标准工作流

```text
宇恒ID + 名称
  → register → 管理员启用（publisher；模块白名单可选）
  → 换票
  → GET /apps                         【先选模块】
       ├─ 已有 → GET blueprint → generate【生成新页面】→ publish(add_pages|auto)
       └─ 没有 → generate【完整蓝图】→ publish(create|auto)【新建模块】
  → 宿主用回执展示「AI 表格数据」（含加密访问路径）
  → import → 抽查 total > 0 → 打开模块
```

---

## 8. 验收清单

- [ ] 管理账号可在「模块管理」看到全部模块（含在建）  
- [ ] register 传了宇恒 ID + 名称  
- [ ] 角色为「生成发布」  
- [ ] 发布前 `GET /api/v1/apps` 选目标（仅见本账号模块）  
- [ ] 已有模块：generate **生成新页面**再发布；无模块才新建  
- [ ] 新页面 `id` / `route` 不与已有冲突  
- [ ] `pages` ≥ 2（含 list，建议带 import）  
- [ ] publish 回执含 `access_path` / `access_url` / `published_at` / `status`  
- [ ] 宿主表格用回执字段，不写死假地址  
- [ ] generate → publish → import 成功，列表 `total > 0`  
- [ ] 「打开模块」可见多页导航  
- [ ] 不会去业务库查用户表  
