create-zleap-app 0.10.3 → 0.10.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/package.json +1 -1
  2. package/skills/zleap-cloud-app/SKILL.md +7 -7
  3. package/skills/zleap-cloud-app/references/app-runtime.md +3 -3
  4. package/skills/zleap-cloud-app/references/cloud-functions.md +28 -24
  5. package/skills/zleap-cloud-app/references/console-members.md +7 -17
  6. package/skills/zleap-cloud-app/references/limits.md +27 -36
  7. package/skills/zleap-cloud-app/references/manifest.md +24 -58
  8. package/skills/zleap-cloud-app/references/permissions.md +21 -21
  9. package/skills/zleap-cloud-app/references/sdk-database-files.md +9 -9
  10. package/skills/zleap-cloud-app/references/status-codes.md +123 -138
  11. package/skills/zleap-cloud-app/references/triggers.md +5 -5
  12. package/skills/zleap-cloud-app-release/SKILL.md +46 -80
  13. package/skills/zleap-cloud-app-release/references/app-center-install.md +24 -23
  14. package/skills/zleap-cloud-app-release/references/app-center-publish.md +66 -146
  15. package/skills/zleap-cloud-app-release/references/console-functions.md +18 -22
  16. package/skills/zleap-cloud-app-release/references/console-members.md +7 -17
  17. package/skills/zleap-cloud-app-release/references/console-release.md +37 -33
  18. package/skills/zleap-cloud-app-release/references/console-workspace.md +28 -83
  19. package/skills/zleap-cloud-app-release/references/dev-to-production.md +104 -361
  20. package/skills/zleap-cloud-app-release/references/permissions.md +21 -21
  21. package/skills/zleap-cloud-app-release/references/status-codes.md +123 -138
  22. package/templates/react-ts/scripts/zleap.mjs +16 -2
  23. package/templates/react-ts/src/cloud/client.ts +3 -3
  24. package/skills/zleap-cloud-app-release/references/console-legacy-release.md +0 -411
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-zleap-app",
3
- "version": "0.10.3",
3
+ "version": "0.10.5",
4
4
  "description": "一条命令创建 zleapOS 云开发应用(React + TypeScript + Vite),并为 Codex / Claude Code / Pi / OpenCode / Cursor 等 AI 编程工具配好 skills",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -29,9 +29,9 @@ npm create zleap-app@latest <目录> -- --appid <appid> --name "<应用名>" -y
29
29
 
30
30
  `appid` 由平台生成,**不能自己编**:请用户先在云开发控制台侧栏顶部的应用切换下拉里点「创建应用」(填名称),复制生成的 `appid`
31
31
  (`zl` + 16 位小写十六进制,如 `zl3f9a2c7e1b0d4a68`),创建者自动成为管理员。没有 `appid` 时非交互脚手架会报错并提示先创建应用——问用户要,不要猜。
32
- manifest 里写 `"appid": "<appid>"`,**不需要** `app_key` 和 `publisher`。旧项目的 `app_key`(如 `com.example.todo`)只为已有应用保留;`--app-key` 是 `--appid` 的旧别名。
32
+ manifest 里写 `"appid": "<appid>"`,不要写 `app_key` 和 `publisher`。CLI 登录参数名是 `--app-key`,填的就是 appid;CLI 输出里的 `app_key` 字段也是 appid。
33
33
  同事要一起开发,请管理员在控制台「团队」→「成员」里把他加为开发者。每个成员的每次上传都是一个开发版本,在控制台「版本管理」里可见;
34
- 成员可以用「我也用这个」运行同事上传、未发布的版本(非成员看不到开发版本)。给全企业用 = 在「版本管理」里「发布为线上版本」,见 skill `zleap-cloud-app-release`。
34
+ 成员可以在「版本管理」用「切换到此版本」运行同事上传、未发布的版本(只切自己的安装;非成员看不到开发版本)。带云函数的版本上传时平台自动签名、安装 / 切换 / 允许后台运行时自动绑定,appid 应用不需要签名激活操作。给全企业用 = 在「版本管理」里「发布为线上版本」,见 skill `zleap-cloud-app-release`。
35
35
 
36
36
  ## 2. 硬性约束(违反就会在运行时失败)
37
37
 
@@ -51,7 +51,7 @@ manifest 里写 `"appid": "<appid>"`,**不需要** `app_key` 和 `publisher`
51
51
  2. **权限**:需要的能力加进 `requires`(`cloud.database.read/write`、`cloud.storage.read/write`、`os.agent.complete` 等,白名单外的非可选能力会让应用「暂不可用」)。`reason` 会展示给用户,写具体用途。
52
52
  3. **数据层**:React 模板在 `src/cloud/` 下按集合写一个模块(参照 `src/cloud/todos.ts`),组件只调用这些函数;错误用 `describeError()` 展示。
53
53
  4. **本地验证**:`npm run typecheck && npm run check`(`check` 通过只代表静态契约,`runtime_test=not_checked`)。
54
- 5. **部署到自己桌面**:`npm run deploy`(构建 → 检查 → 上传 private → 安装/切换本人安装;内容变化时自动递增补丁号)。
54
+ 5. **部署到自己桌面**:`npm run deploy`(构建 → 检查 → 上传开发版本(appid 应用仅成员可见)→ 安装/切换本人安装;内容变化时自动递增补丁号)。
55
55
  - 报未登录/会话过期 → 请用户运行 `npm run login -- --target <OS 地址>` 并在浏览器核对确认码。
56
56
  - 报 `DATA_MIGRATION_REQUIRED` → 新版本改了 data/storage 声明,见第 5 节。
57
57
  6. **请用户验收**:安装时平台会自动创建开发环境、开通数据库并按声明建集合,`npm run deploy` 结束时会打印状态;显示未就绪时,请用户在「云开发控制台」选中应用 →「概览」按提示处理。然后从启动台打开应用(已打开的点「重新加载应用」)。
@@ -67,8 +67,8 @@ manifest 里写 `"appid": "<appid>"`,**不需要** `app_key` 和 `publisher`
67
67
  再在**按钮点击事件里**调用 `zl.auth.authorize({ scopes: ['profile' | 'phone' | 'email'], reason: '用途说明' })`(不在点击里调用 `AUTH_GESTURE_REQUIRED`),
68
68
  返回 `{ openid, scopes, profile?, phone?, email? }`——用户可以只勾选一部分、没绑定的不返回,**以 `scopes` 判断拿到了什么**;
69
69
  拒绝时 `AUTH_DENIED`(拒绝过的项 24 小时内不再弹框,直接 `AUTH_DENIED`)。`zl.auth.getIdentity()` 静默拿 `openid`(每个应用不同、开发与线上一致)。
70
- 云函数里用 `zl.cloud.auth.getOpenId()` / `getUserInfo()`;不要用 `getContext().userId`(平台内部 ID,已废弃)。
71
- 不要自己做登录页或索要账号;云函数里目前读不到授权信息。
70
+ 云函数里**没有** `zl.cloud.auth`(`getOpenId()` / `getUserInfo()` 都不可用):需要 openid 时由页面 `getIdentity()` 取到后作为输入传给函数,或用文档自带的 `_openid`;不要用 `getContext().userId`(平台内部 ID,已废弃)。
71
+ 不要自己做登录页或索要账号;云函数里读不到授权信息。
72
72
  - 都从 `@zleap-ai/app-sdk` 导入(`import { zl, AppError } from '@zleap-ai/app-sdk'`),完整说明见 references/app-runtime.md。
73
73
 
74
74
  ## 4. 只有用户能做的事(明确告诉用户,不要假装已完成)
@@ -97,8 +97,8 @@ manifest 里写 `"appid": "<appid>"`,**不需要** `app_key` 和 `publisher`
97
97
  | 连接超时 `CALL_TIMEOUT`、独立预览 | 不在 zleapOS 窗口里运行;部署后从启动台打开 |
98
98
  | `RESOURCE_NOT_READY` / SDK 没协商到 `document-core/1` | 当前数据域没有环境或数据库未就绪 → 等 1 分钟后重开应用;仍不行请用户在控制台概览检查开发环境与数据库 |
99
99
  | `SCOPE_FORBIDDEN` | 没授权(服务端原因 `CONSENT_REQUIRED` 等)→ 请用户点窗口顶部「权限」勾选保存;或 `requires` 没声明 |
100
- | `ENV_FORBIDDEN` | 部署已开放生产、应用还没有生产环境,非发布者打不开 → 发布者激活到生产(见 release skill) |
101
- | `COLLECTION_NOT_FOUND`(上生产后) | 生产环境建了但没开通集合 → 控制台生产环境「数据库」开通,或 `npx zleap-app prepare` |
100
+ | `ENV_FORBIDDEN` | 部署已开放生产、应用还没有生产环境,非成员打不开 → 任一成员「发布为线上版本」(平台自动准备生产) |
101
+ | `COLLECTION_NOT_FOUND`(上生产后) | 生产环境建了但没开通集合 → 重新「发布为线上版本」(生产库未就绪时发布会报 `PROD_DATABASE_NOT_READY`,稍后重试) |
102
102
  | `PUBLISHER_REQUIRED` | 非发布者访问开发数据域(默认只给发布者) |
103
103
  | `SCHEMA_INVALID` | 写入字段与集合结构不符(缺必填、类型错、多了字段) |
104
104
  | `VERSION_CONFLICT` | 别处先改过,重读后再改 |
@@ -10,8 +10,8 @@
10
10
  > **适用范围**(提示)
11
11
  >
12
12
  >
13
- > - 「线上版本」只属于用平台 `appid`(`zl…`)创建的应用,见 版本管理(文档站 /console/release#版本管理)。
14
- > 旧 `app_key` 命名空间应用调用更新管理器不会报错,但永远没有更新、也不会自动跟随。
13
+ > - 「线上版本」由应用成员在控制台「版本管理」里「发布为线上版本」产生,见 版本管理(文档站 /console/release#版本管理)。
14
+ > 每次上传都是开发版本,还没发布时只有应用成员能用。
15
15
  > - **不需要开通任何云资源**:没有数据库、云函数的纯前端应用也能用,也不需要在 Manifest 里声明权限。
16
16
  > - 和 Cloud SDK 一样,只能在 zleapOS 窗口里用;浏览器直接打开页面时以 `OPEN_IN_ZLEAP_OS` 失败。
17
17
  >
@@ -37,7 +37,7 @@ import { zl, AppError } from '@zleap-ai/app-sdk';
37
37
  | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
38
38
  | 普通使用者(不是应用成员) | **下次打开应用时自动跟随**:宿主先把安装切到线上版本,显示「**正在更新到最新版本…**」,再加载应用。回退同样会跟随 |
39
39
  | 已经开着应用的**非成员** | **不会立刻被打断**,继续用当前版本;应用可以用下面的更新管理器提示用户,调用 `applyUpdate()` 立即切换。新版本发布 **24 小时**后,宿主会把还开着旧版本的窗口强制切到线上版本并重新加载(显示「这个版本已超过 24 小时的使用期限,正在更新到最新版本…」) |
40
- | 应用成员(管理员 / 开发者) | **从不自动切换**,在控制台版本管理里用「我也用这个」自己选 |
40
+ | 应用成员(管理员 / 开发者) | **从不自动切换**,在控制台版本管理里用「切换到此版本」自己选(只影响自己,包括同事还没发布的版本) |
41
41
 
42
42
  所以不写任何代码,使用者也会在下次打开时用上新版本。更新管理器只是让「正开着的窗口」也能及时换到新版本。
43
43
 
@@ -351,7 +351,7 @@ await zl.cloud.os.database.mutate({
351
351
  > - 私有集合里读到的文档自带 `_openid`(写入者标识),可以直接用(`examples/moments` 的 `stats` 就是这么做的)。
352
352
  >
353
353
  > 由页面传入的 `openid` 只是业务参数,函数无法再向平台核验;手机号 / 邮箱同理,函数拿不到授权登录的信息。
354
- > `getContext().userId` 是平台内部用户 ID,只为兼容旧应用保留,新应用不要存它、也不要返回给前端。
354
+ > `getContext().userId` 是平台内部用户 ID,不要用它区分业务用户,也不要存它、返回给前端。
355
355
 
356
356
  ### 读写失败时拿到什么
357
357
 
@@ -560,50 +560,51 @@ npx zleap-app publish dist
560
560
 
561
561
  示例项目已经把这些串成脚本:`npm run deploy`(构建 → 检查 → 上传开发版本 → 装到自己桌面)、`npm run release -- --notes "…"`(发布为线上版本)。
562
562
 
563
- 包上传后还差平台侧两步:在应用窗口「权限」里勾选「统计我的互动」这项后台能力;再到控制台「版本管理」页下方「开发环境:云函数激活」把该版本激活到开发。定时触发器 `stats_refresh` 还要在控制台「触发器」里启用,否则只会手动调用时运行。
563
+ 上传时平台已自动签名,装到桌面时自动绑定,包上传后只差使用者本人一步:在应用窗口「权限」里勾选「统计我的互动」这项后台能力。定时触发器 `stats_refresh` 还要在控制台「触发器」里启用,否则只会手动调用时运行。
564
564
 
565
- ## 第三步:上传、签名、激活、授权
565
+ ## 第三步:上传、安装、授权
566
566
 
567
567
  函数代码写好后,要走完下面这条链才会真正执行。缺任何一步,调用都不会进入函数沙箱:
568
568
 
569
569
  ```
570
- ① 上传:zleap-app publish 或应用中心「上传应用包」
570
+ ① 上传:npm run deploy / zleap-app publish 或应用中心「上传应用包」
571
+ 声明了后台能力的版本,平台在上传时自动签名,得到就绪发布
571
572
  ② 安装(安装即授予声明的 cloud.* 权限;后台能力为「停用」)
573
+ 安装、切换版本时平台自动把安装绑定到该版本的就绪发布;还没有就绪发布的版本会当场补签再绑定
572
574
  ③ 开发环境与数据库:声明了集合的应用安装时自动创建并开通(集合按声明自动创建);否则在控制台「创建开发环境」
573
- ④ 激活开发:控制台「版本管理」页下方的「开发环境:云函数激活」(新建候选 → 签名验证 → 激活开发),
574
- 或在项目里运行 `npx zleap-app prepare <app_id> --version-id <id>`(只准备开发环境)
575
- 概览开通清单里对应「去签名」/「升级安装并激活」;这里只列出你本人上传的版本
576
- ⑤ 应用窗口「权限」→「后台能力(定时任务 / 云函数)」勾选该能力 →「保存并重新加载」
575
+ ④ 应用窗口「权限」→「后台能力(定时任务 / 云函数)」勾选该能力 →「保存并重新加载」
577
576
  (或在控制台「后台能力」里点「允许后台运行」)
578
577
  ```
579
578
 
579
+ 带后台能力的版本在上传时由平台自动签名;安装、切换版本、在「权限」里允许后台运行时会自动绑定,没有单独的签名或绑定步骤。
580
+
580
581
  详细界面见 版本管理(文档站 /console/release)、云函数与后台能力(文档站 /console/functions)、安装与卸载(文档站 /app-center/install),
581
582
  端到端顺序见 从开发到上线(文档站 /guide/dev-to-production)。
582
583
 
583
- | 少了哪一步 | 现象 |
584
- | ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
585
- | 没有任何已启用的后台能力 | 会话里没有 `app-execution/1`,前端 `callFunction` / `capabilities.invoke` **在发请求前**就抛 `BACKGROUND_CAPABILITY_UNAVAILABLE`(旧 SDK 为 `UNSUPPORTED_OPERATION`) |
586
- | 这项能力没被授权 | 403「此能力尚未由用户授权」 |
587
- | 没有「激活开发」(`managed_function` 没绑定就绪发布) | `FUNCTION_RELEASE_REQUIRED`;「权限」对话框里该项下方提示「该版本尚未激活发布版本,暂时无法执行。请到「发布版本」页完成「激活开发」。」 |
588
- | 部署没接入函数计算节点 / 调度服务 | `FUNCTION_RUNTIME_UNAVAILABLE`(平台未开放,不是你写错了) |
584
+ | 少了哪一步 | 现象 |
585
+ | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
586
+ | 没有任何已启用的后台能力 | 会话里没有 `app-execution/1`,前端 `callFunction` / `capabilities.invoke` **在发请求前**就抛 `BACKGROUND_CAPABILITY_UNAVAILABLE`(旧 SDK 为 `UNSUPPORTED_OPERATION`) |
587
+ | 这项能力没被授权 | 403「此能力尚未由用户授权」 |
588
+ | `managed_function` 没绑定就绪发布(正常不会出现) | `FUNCTION_RELEASE_REQUIRED`;「权限」对话框里该项下方提示「该版本还没有可用的签名发布,暂时无法执行。重新保存一次权限会自动补签。」。到「权限」里重新保存一次,或在「版本管理」切换一次版本,平台会自动补签并绑定 |
589
+ | 部署没接入函数计算节点 / 调度服务 | `FUNCTION_RUNTIME_UNAVAILABLE`(平台未开放,不是你写错了) |
589
590
 
590
- ### 开发环境激活 ≠ 生产发布
591
+ ### 开发环境 ≠ 生产发布
591
592
 
592
- 上面第 ④ 步只让云函数在**开发环境**运行。要让其他使用者在生产环境用上它:
593
+ 上面这条链只让云函数在**开发环境**运行。要让其他使用者在生产环境用上它:
593
594
 
594
- - **appid 应用**:把版本「发布为线上版本」(控制台「版本管理」,或 `zleap-app release`)。带云资源的版本**第一次**发布时,平台以上传者身份自动准备生产(生产环境、生产授权、签名、激活、生产集合);上传者当前必须安装的就是这个版本,否则返回 40900(`UPLOADER_NOT_ON_VERSION`)。已经发布过的版本再次发布直接复用,不再要求。只用宿主能力的应用直接发布,不需要签名激活。
595
- - **旧 `app_key` 应用**:继续在「版本与激活」里走发布候选 / 签名 / 激活。
595
+ 把版本「发布为线上版本」(控制台「版本管理」,或 `zleap-app release`)。任一成员都可以发布任一版本,不要求上传者正在使用这个版本。带云资源的版本**第一次**发布时,平台自动完成**应用级**生产准备:生产环境 → 签发生产发布(归属上传者)→ 生产门禁(签名、审批窗口、信任策略核对)→ 生产库与生产集合,不依赖任何人的安装。生产库还没就绪时返回 40900(`PROD_DATABASE_NOT_READY`),通常 1 分钟内就绪,稍后重新发布即可;上传者账号已停用时返回 40900(`UPLOADER_INACTIVE`),请其他成员重新上传这个版本后再发布。已经发布过的版本再次发布(包括回退)直接复用当时的就绪发布。只用宿主能力的应用直接发布,没有额外的签名步骤。
596
596
 
597
- `zleap-app prepare` 对两类应用都可用:**appid 应用**只准备开发环境(等价于上面的「开发环境:云函数激活」,不会碰生产),
598
- 准备完成后用 `zleap-app invoke <app_id> --capability <id> --environment dev` 测试;**旧 `app_key` 应用**只接受本人 private 包,一路准备到生产。
597
+ `zleap-app prepare` 只准备开发环境,不会碰生产;因为上传、安装 / 切换版本时平台会自动签名并绑定,通常不需要,
598
+ 只在 `zleap-app diagnose` 提示 `next_action: app_prepare` 时兜底使用。准备完成后用
599
+ `zleap-app invoke <app_id> --capability <id> --environment dev` 测试。
599
600
 
600
601
  `logic_unit` 和 `builtin` provider 不进函数沙箱,**不需要**签名发布,授权后台能力即可执行。
601
602
 
602
603
  > **授权后要重新加载**(提示)
603
604
  >
604
605
  > 后台能力的启用状态在打开 Cloud 会话时就算好了。「保存并重新加载」会自动重开;
605
- > 在控制台里改了授权或激活了新发布后,请点应用窗口的「重新加载应用」。
606
- > 激活新发布后旧会话会失效(`RELEASE_UNAVAILABLE`),宿主桥会重开会话并重试一次。
606
+ > 在控制台里改了授权或切换了新版本后,请点应用窗口的「重新加载应用」。
607
+ > 切换版本并绑定新发布后旧会话会失效(`RELEASE_UNAVAILABLE`),宿主桥会重开会话并重试一次。
607
608
 
608
609
  ## 调用后台能力(前端 SDK)
609
610
 
@@ -830,8 +831,11 @@ const job = await zl.cloud.os.capabilities.invoke({
830
831
 
831
832
  ### `FUNCTION_RELEASE_REQUIRED`
832
833
 
833
- `managed_function` 必须绑定**就绪且已激活**的发布。appid 应用到控制台「版本管理」页下方的「开发环境:云函数激活」完成激活,
834
- 然后重新打开应用窗口「权限」确认该能力下没有「尚未激活发布版本」的提示,再重新加载应用。
834
+ `managed_function` 必须绑定**就绪**的发布。
835
+
836
+ - 正常不会出现:带后台能力的版本上传时由平台自动签名,安装 / 切换版本 / 保存权限时自动绑定,缺签随用随签。如果出现,在应用窗口「权限」里允许后台运行(重新保存一次),或在控制台「版本管理」切换一次版本,平台会自动补签并绑定;仍然出现,说明部署的发布签名不可用(联系平台管理员检查签名密钥 / 信任配置),或重新上传。
837
+
838
+ 处理后重新打开应用窗口「权限」确认该能力下没有「还没有可用的签名发布」的提示,再重新加载应用。
835
839
 
836
840
  ### `RUNTIME_GATEWAY_UNAVAILABLE` / 其他 `RUNTIME_GATEWAY_*`
837
841
 
@@ -8,7 +8,7 @@
8
8
  > **一句话流程**(提示)
9
9
  >
10
10
  > 控制台「创建应用」→ 复制 `appid` → 脚手架带上 `appid` 或写进 `manifest.json` → `npm run deploy` 上传 →
11
- > (需要协作时)「团队」→「成员」里添加开发者 →(给全企业用时)「版本管理」里发布为线上版本(这一步只适用于 `appid` 应用)。
11
+ > (需要协作时)「团队」→「成员」里添加开发者 →(给全企业用时)「版本管理」里发布为线上版本。
12
12
 
13
13
  ## 创建应用
14
14
 
@@ -46,7 +46,7 @@
46
46
  npm create zleap-app@latest my-app -- --appid zl3f9a2c7e1b0d4a68
47
47
  ```
48
48
 
49
- 2. **已有项目:把 appid 写进 manifest.json(不再需要 app_key 和 publisher)**
49
+ 2. **已有项目:把 appid 写进 manifest.json**
50
50
 
51
51
  ```json
52
52
  {
@@ -96,22 +96,16 @@
96
96
 
97
97
  - **修改角色**(管理员):在成员行的角色下拉里切换「管理员 / 开发者」;
98
98
  - **移除**(管理员):点成员行的「**移除**」,确认「移除 {名字}?——移除后对方不能再上传或管理这个应用,已上传的版本保留。」;
99
- - **退出**(自己,且不是旧应用的上传者成员):在自己那一行点「**退出**」,确认「退出「{应用}」?——退出后你不能再上传或管理这个应用,需要管理员重新添加。」
99
+ - **退出**(自己):在自己那一行点「**退出**」,确认「退出「{应用}」?——退出后你不能再上传或管理这个应用,需要管理员重新添加。」
100
100
 
101
101
  应用**至少要保留一位管理员**。移除、退出或降级会让应用没有管理员时,操作被拒绝:
102
102
  40900「应用至少要保留一位管理员」,处理方式是先把另一位成员设为管理员,再做这个操作。
103
103
 
104
104
  非管理员调用成员管理会得到 40300「只有应用管理员可以管理成员」。
105
105
 
106
- ### 旧应用(`app_key`)
106
+ ### 上传时的成员校验
107
107
 
108
- 用旧 `app_key` 命名空间上传的已有应用,**上传过应用包的人视为管理员**,在成员列表里显示为管理员,
109
- 但那一行只有角色标签:没有角色下拉,也没有「移除」/「退出」按钮,不能在这里修改角色或退出。
110
- (其他通过邀请加入的成员仍按上面的规则管理。)
111
-
112
- ## 上传时的成员校验
113
-
114
- 用 `appid` 的应用,谁能上传由成员决定,Manifest 里的 `publisher` 不再起作用:
108
+ 谁能上传由成员决定:
115
109
 
116
110
  | 情况 | 结果 |
117
111
  | ------------------ | ------------------------------------------------------------------------------------------------------------------------------ |
@@ -123,8 +117,8 @@
123
117
 
124
118
  用 `appid` 的应用里,每个成员上传的都是一个**开发版本**,全部列在侧栏「发布」组的「版本管理(文档站 /console/release#版本管理)」里,标出上传者和上传时间:
125
119
 
126
- - 任何成员(管理员或开发者)都可以把其中一个「发布为线上版本」,或「回退到此版本」;
127
- - 「我也用这个」把你本人的安装切到任一成员上传的版本,包括同事还没发布的版本(方便联调);
120
+ - 任何成员(管理员或开发者)都可以把任一成员上传的版本「发布为线上版本」,或「回退到此版本」,不要求上传者正在使用这个版本;
121
+ - 「切换到此版本」只把你本人桌面上的应用切到任一成员上传的版本,包括同事还没发布的版本(方便联调),不影响其他人,也不改变线上版本;成员从不被自动切换;
128
122
  - 开发版本只对成员可见,不是成员的人看不到、也切不到。
129
123
 
130
124
  ## 用户授权
@@ -146,10 +140,6 @@
146
140
 
147
141
  用户授权页:只展示人数统计,不展示具体用户(图为还没有人授权时的空状态)。
148
142
 
149
- ## 目前的限制
150
-
151
- - 旧 `app_key` 应用仍走「版本与激活」,那里看不到其他成员的发布。
152
-
153
143
  ## 相关
154
144
 
155
145
  - 快速开始(文档站 /guide/quickstart) — 从创建应用到第一次上传
@@ -14,25 +14,22 @@
14
14
 
15
15
  ## 能力开放状态
16
16
 
17
- | 能力 | 状态 | 说明 |
18
- | -------------------------------------------- | ------------- | -------------------------------------------------------------------------------------------------------------------------- |
19
- | 云数据库 | ✅ 开放 | 集合按 Manifest 自动创建;文档、索引、备份恢复 |
20
- | 文件存储 | ✅ 开放 | 分块上传、下载、条件覆盖、软删除 |
21
- | 日志 | ✅ 开放 | 查询 + 追尾;生产环境只读,发布者可见全部调用日志 |
22
- | 云函数 / 后台能力 | ⚠️ 视部署而定 | 需要部署了函数运行环境;还需签名发布、激活并授权 |
23
- | 控制台版本页 · 发布候选、签名验证 | ✅ 开放 | `appid` 应用在「版本管理」,旧 `app_key` 应用在「版本与激活」;签名需部署配置发布信任策略,否则报「发布信任策略尚未配置…」 |
24
- | 控制台版本页 · 激活开发 | ✅ 开放 | 把已就绪候选绑定到当前安装的开发环境 |
25
- | 控制台版本页 · 激活到生产 | ⚠️ 视部署而定 | `appid` 应用首次「发布为线上版本」会自动准备生产;发布信任配置未就绪时控制台没有生产入口,开放后需通过生产门禁 |
26
- | 生产环境数据 / 文件管理(控制台) | ⚠️ 视部署而定 | 生产开放后可在控制台查看和修改(页面有影响范围提示) |
27
- | 应用中心 · 更新 / 回滚 | ✅ 开放 | 有升级预检;只切换当前用户自己的安装 |
28
- | 应用中心 · 企业目录上架(旧应用) | ✅ 开放 | 仅旧 `app_key` 应用;无审核步骤,见 上传与发布(文档站 /app-center/publish) |
29
- | 控制台 · 发布为线上版本(`appid`) | ✅ 开放 | 控制台「发布 → 版本管理」;发布后全企业可见,无审核步骤 |
30
- | 应用成员(管理员 / 开发者) | ✅ 开放 | 控制台「团队」→「成员」,见 [成员管理](console-members.md) |
31
- | 使用其他成员上传的开发版本(`appid`) | ✅ 开放 | 版本可见性为 `members`;成员在「版本管理」里用「我也用这个」切换 |
32
- | 旧 `app_key` 应用使用别人上传的 private 版本 | ❌ 未开放 | private 版本只有上传者本人能安装;其他人只能安装企业可见版本 |
33
- | 纯后台(`headless`)应用 | ❌ 基本不可用 | 声明云函数等即「运行环境未开放」,请用 `both` |
34
- | `agent.interaction` | ❌ 未开放 | 声明会导致应用无法安装 |
35
- | 集合分区 `app` | ❌ 未开放 | Manifest 写 `partition: "app"` 会被拒绝 |
17
+ | 能力 | 状态 | 说明 |
18
+ | ---------------------------------- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
19
+ | 云数据库 | ✅ 开放 | 集合按 Manifest 自动创建;文档、索引、备份恢复 |
20
+ | 文件存储 | ✅ 开放 | 分块上传、下载、条件覆盖、软删除 |
21
+ | 日志 | ✅ 开放 | 查询 + 追尾;生产环境只读,发布者可见全部调用日志 |
22
+ | 云函数 / 后台能力 | ⚠️ 视部署而定 | 需要部署了函数运行环境;还需就绪的签名发布(带后台能力的版本上传时由平台自动签名,安装 / 切换版本 / 授权时自动绑定)并授权 |
23
+ | 发布候选与签名 | ✅ 自动 | 平台在上传时自动签发开发版本、首次发布时自动签发生产发布,没有手动步骤。签名需部署配置发布信任策略,未配置时发布报「发布信任策略尚未配置…」 |
24
+ | 生产环境数据 / 文件管理(控制台) | ⚠️ 视部署而定 | 生产开放后可在控制台查看和修改(页面有影响范围提示) |
25
+ | 应用中心 · 更新 / 回滚 | ✅ 开放 | 有升级预检;只切换当前用户自己的安装 |
26
+ | 控制台 · 发布为线上版本 | ✅ 开放 | 控制台「发布 → 版本管理」;发布后全企业可见,无审核步骤;回退 = 把旧版本再发布一次 |
27
+ | 生产准备(首次发布带云资源的版本) | ⚠️ 视部署而定 | 平台自动完成生产环境、生产发布、生产门禁、生产库与集合;发布信任配置未就绪时没有生产入口 |
28
+ | 应用成员(管理员 / 开发者) | ✅ 开放 | 控制台「团队」→「成员」,见 [成员管理](console-members.md) |
29
+ | 使用其他成员上传的开发版本 | ✅ 开放 | 版本可见性为 `members`;成员在「版本管理」里用「切换到此版本」切换(只影响自己) |
30
+ | 纯后台(`headless`)应用 | ❌ 基本不可用 | 声明云函数等即「运行环境未开放」,请用 `both` |
31
+ | `agent.interaction` | ❌ 未开放 | 声明会导致应用无法安装 |
32
+ | 集合分区 `app` | ❌ 未开放 | Manifest 写 `partition: "app"` 会被拒绝 |
36
33
 
37
34
  ## 未实现的 SDK 功能
38
35
 
@@ -67,15 +64,15 @@
67
64
 
68
65
  ### Manifest
69
66
 
70
- | 项 | 限制 |
71
- | ------------- | ------------------------------------------------------------------------- |
72
- | 嵌套深度 | ≤ **24** |
73
- | 节点总数 | ≤ **16384** |
74
- | `appid` | `zl` + 16 位小写十六进制,由平台生成;旧 `app_key` 为 2–64 位命名空间形式 |
75
- | `name` | 1–128 位 |
76
- | `description` | ≤ 2000 位 |
77
- | `icon` | ≤ 512 位 |
78
- | `version` | ≤ 32 位(语义化版本) |
67
+ | 项 | 限制 |
68
+ | ------------- | ------------------------------------ |
69
+ | 嵌套深度 | ≤ **24** |
70
+ | 节点总数 | ≤ **16384** |
71
+ | `appid` | `zl` + 16 位小写十六进制,由平台生成 |
72
+ | `name` | 1–128 位 |
73
+ | `description` | ≤ 2000 位 |
74
+ | `icon` | ≤ 512 位 |
75
+ | `version` | ≤ 32 位(语义化版本) |
79
76
 
80
77
  ### 云函数与 Provider
81
78
 
@@ -190,12 +187,6 @@
190
187
  输入长度以你在能力 `input_schema` 里声明的为准;`copilot-studio` 示例用的是 `input` ≤ 16000、`system` ≤ 4000,
191
188
  平台侧的输入上限**未验证**。
192
189
 
193
- ### 发布
194
-
195
- | 项 | 限制 |
196
- | ------------ | ----------- |
197
- | 签名证明文件 | ≤ **2 MiB** |
198
-
199
190
  ### 日志
200
191
 
201
192
  | 项 | 限制 |
@@ -265,8 +256,8 @@
265
256
  | 项目 | 未配置时的表现 |
266
257
  | ------------ | ------------------------------------------------------------------------------------- |
267
258
  | 函数运行环境 | 控制台云函数显示 `RUNTIME_UNAVAILABLE · 函数执行 Provider 尚未开放。` |
268
- | 发布信任策略 | 签名验证报「发布信任策略尚未配置,或发布者密钥不可用、已撤销或已过期。」 |
269
- | 生产激活 | 发布信任配置未就绪时控制台不出现生产入口;激活接口报 `PRODUCTION_RELEASE_UNAVAILABLE` |
259
+ | 发布信任策略 | 发布签名失败,报「发布信任策略尚未配置,或发布者密钥不可用、已撤销或已过期。」 |
260
+ | 生产发布 | 发布信任配置未就绪时控制台不出现生产入口;发布接口报 `PRODUCTION_RELEASE_UNAVAILABLE` |
270
261
  | 数据服务 | `RESOURCE_NOT_READY` / `DATA_SERVICE_UNAVAILABLE` |
271
262
 
272
263
  > **关于「能跑」的判断标准**(注意)
@@ -64,28 +64,26 @@ ZIP 根目录还必须有 `index.html`(入口)和**非空的 `LICENSE` 文
64
64
 
65
65
  ## 顶层字段
66
66
 
67
- | 字段 | 必填 | 类型 | 说明 |
68
- | --------------- | ---- | ------ | -------------------------------------------------------------------------- |
69
- | `schema` | ✅ | 字符串 | 固定为 `"zleap.app/2"`,其他值会直接被拒绝 |
70
- | `appid` | ✅ | 字符串 | 应用唯一标识,在云开发控制台「创建应用」后由平台生成,见下方说明 |
71
- | `app_key` | | 字符串 | **旧写法**,仅已有应用继续使用,见下方 [旧写法 `app_key`](#旧写法-app-key) |
72
- | `name` | ✅ | 字符串 | 显示名,1–128 位,**必须有可见字符** |
73
- | `version` | ✅ | 字符串 | 语义化版本(SemVer),≤32 位,如 `1.0.0`、`1.2.0-beta.1` |
74
- | `publisher` | | 对象 | 不再需要;`appid` 应用会忽略它,见下方说明 |
75
- | `description` | | 字符串 | ≤2000 位 |
76
- | `icon` | | 字符串 | ≤512 位 |
77
- | `execution` | ✅ | 枚举 | `foreground` / `headless` / `both`,必须与 `runtime` 一致 |
78
- | `runtime` | ✅ | 对象 | 运行环境声明(见下) |
79
- | `background` | | 对象 | 后台运行模式,默认 `{ "on_install": "disabled", "modes": [] }` |
80
- | `triggers` | | 对象 | 触发器声明,默认 `{ "scheduled": [], "events": [] }` |
81
- | `events` | | 对象 | 事件发布与订阅,默认 `{ "publishes": [], "subscribes": [] }` |
82
- | `data` | | 对象 | 数据集合、集合 Schema 与访问规则(见下) |
83
- | `resources` | | 对象 | 资源限制,默认 `{ "max_concurrency": 1 }` |
84
- | `host_api` | | 对象 | 宿主能力声明,默认 `{ "profile": "app-runtime/2", "requires": [] }` |
85
- | `agent` | | 对象 | Agent 交互声明 |
86
- | `capabilities` | | 数组 | 只能是 `["notify.send"]`(应用通知,见下) |
87
- | `notifications` | | 对象 | 通知频道声明(见下) |
88
- | `storage` | | 对象 | 宿主 KV / 数据空间声明(见下) |
67
+ | 字段 | 必填 | 类型 | 说明 |
68
+ | --------------- | ---- | ------ | ------------------------------------------------------------------- |
69
+ | `schema` | ✅ | 字符串 | 固定为 `"zleap.app/2"`,其他值会直接被拒绝 |
70
+ | `appid` | ✅ | 字符串 | 应用唯一标识,在云开发控制台「创建应用」后由平台生成,见下方说明 |
71
+ | `name` | ✅ | 字符串 | 显示名,1–128 位,**必须有可见字符** |
72
+ | `version` | ✅ | 字符串 | 语义化版本(SemVer),≤32 位,如 `1.0.0`、`1.2.0-beta.1` |
73
+ | `description` | | 字符串 | ≤2000 位 |
74
+ | `icon` | | 字符串 | ≤512 位 |
75
+ | `execution` | ✅ | 枚举 | `foreground` / `headless` / `both`,必须与 `runtime` 一致 |
76
+ | `runtime` | ✅ | 对象 | 运行环境声明(见下) |
77
+ | `background` | | 对象 | 后台运行模式,默认 `{ "on_install": "disabled", "modes": [] }` |
78
+ | `triggers` | | 对象 | 触发器声明,默认 `{ "scheduled": [], "events": [] }` |
79
+ | `events` | | 对象 | 事件发布与订阅,默认 `{ "publishes": [], "subscribes": [] }` |
80
+ | `data` | | 对象 | 数据集合、集合 Schema 与访问规则(见下) |
81
+ | `resources` | | 对象 | 资源限制,默认 `{ "max_concurrency": 1 }` |
82
+ | `host_api` | | 对象 | 宿主能力声明,默认 `{ "profile": "app-runtime/2", "requires": [] }` |
83
+ | `agent` | | 对象 | Agent 交互声明 |
84
+ | `capabilities` | | 数组 | 只能是 `["notify.send"]`(应用通知,见下) |
85
+ | `notifications` | | 对象 | 通知频道声明(见下) |
86
+ | `storage` | | 对象 | 宿主 KV / 数据空间声明(见下) |
89
87
 
90
88
  ### `appid`
91
89
 
@@ -102,37 +100,12 @@ ZIP 根目录还必须有 `index.html`(入口)和**非空的 `LICENSE` 文
102
100
  - `appid` 必须已在控制台创建,否则 40400「appid 不存在」(`detail.reason` 为 `APP_NOT_FOUND`,处理:先在云开发控制台「创建应用」);
103
101
  - 上传者必须是应用成员(管理员或开发者),否则 40300「你不是这个应用的开发者」(`detail.reason` 为 `NOT_APP_MEMBER`,
104
102
  处理:请联系应用管理员在云开发控制台「成员」里把你加为开发者),见 [成员管理](console-members.md);
105
- - 同时写了 `appid` 和 `app_key` 且两者不同,报 42200「manifest 的 appid 与 app_key 不一致」——只保留 `appid`;
106
- - 用 `zleap-app` 登录时,开发会话只限定一个 `appid`(`auth login --app-key <appid>`),包里的 `appid` 必须与登录时的一致;
103
+ - 用 `zleap-app` 登录时,开发会话只限定一个 `appid`(`auth login --app-key <appid>`,参数名是 `--app-key`,填的是 `appid`),包里的 `appid` 必须与登录时的一致;
107
104
  - 应用被删除后,原 `appid` **不能**再用于上传。
108
105
 
109
- ### 旧写法 `app_key`
110
-
111
- > **已弃用**(注意)
106
+ > **CLI / 接口回执里的 `app_key`**(提示)
112
107
  >
113
- > `app_key` 命名空间(如 `com.example.todo`)只为**已有应用**保留,新应用请一律用控制台生成的 `appid`。
114
-
115
- 校验器本身接受 `^[a-z][a-z0-9_.-]*$`,但**上传和运行**还要求它是「发布者命名空间」形式:
116
-
117
- - 至少两段,用 `.` 分隔;
118
- - 每段以小写字母开头,只含小写字母和数字,`-`、`_` 只能夹在字母数字之间;
119
- - 总长 ≤64。
120
-
121
- | 正例 | 反例 |
122
- | -------------------- | ------------------------------------ |
123
- | `com.example.todo` | `mytodo`(没有点) |
124
- | `com.example.my-app` | `Com.Example.Todo`(大写) |
125
- | `com.example.my_app` | `com.example.-app`(`-` 不能打头) |
126
- | `org.acme.notes2` | `com.example.2notes`(段以数字开头) |
127
-
128
- 不满足时报「manifest app_key 必须使用包含发布者前缀的小写命名空间」或
129
- 「第三方应用 app_key 必须包含发布者命名空间」。
130
-
131
- 旧 `app_key` 应用一经上传就归属第一个上传者(上传过包的人视为该应用的管理员):
132
-
133
- - 其他用户再用同一个 `app_key` 上传会被拒绝(「不能覆盖其他发布者的应用标识」);
134
- - 应用被删除后,原 `app_key` **不能**再用于上传;
135
- - 用 `zleap-app` 登录时,开发会话只限定一个 `app_key`,包里的 `app_key` 必须与登录时的一致。
108
+ > `zleap-app check`、`publish` 等命令与接口回执 JSON 里的 `app_key` 字段就是这里的 `appid`,只是沿用了旧字段名。
136
109
 
137
110
  ### `version` 与重复上传
138
111
 
@@ -143,13 +116,6 @@ ZIP 根目录还必须有 `index.html`(入口)和**非空的 `LICENSE` 文
143
116
 
144
117
  改了任何文件都要升版本号再上传。
145
118
 
146
- ### `publisher` 发布者
147
-
148
- 用 `appid` 的应用**不需要** `publisher`,写了也会被忽略——谁能上传由应用成员决定。
149
-
150
- 只有旧 `app_key` 应用还会核对它:写了就必须等于上传者本人的用户 ID(字符串),
151
- 否则上传被拒:「发布者声明不属于当前登录用户」。
152
-
153
119
  ### `execution` 必须与运行形态一致
154
120
 
155
121
  `execution` 不是自由填写的标签,而是由 `runtime` 里**实际声明了哪些部分**决定的:
@@ -541,7 +507,7 @@ Manifest 校验器接受 `^[a-zA-Z][a-zA-Z0-9_.-]*$`(≤128),但**数据
541
507
  | `on_install` | 只能是 `"disabled"`(默认) |
542
508
  | `modes` | 从 `on_demand` / `scheduled` / `events` 中选,最多 3 个 |
543
509
 
544
- 安装应用**不会**自动启动后台任务。后台能力要在发布并激活后,由用户在应用窗口「权限」或控制台里单独允许。
510
+ 安装应用**不会**自动启动后台任务。后台能力要在安装后由用户在应用窗口「权限」或控制台里单独允许。
545
511
  **要用定时触发器,`modes` 必须含 `"scheduled"`;事件触发器要含 `"events"`**,否则启用时报 `TRIGGER_MODE_NOT_DECLARED`。
546
512
 
547
513
  ## `triggers` — 触发器
@@ -138,17 +138,17 @@
138
138
 
139
139
  对话框里**没有环境选择**。数据域(dev「调试」/ prod「生产」)由宿主根据部署决定,对话框只显示当前是哪个:
140
140
 
141
- | 部署状态 | 数据域 | 谁能用 |
142
- | ---------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
143
- | 未开放生产 | dev | 默认只有开发团队:`appid` 应用的全部成员;旧 `app_key` 应用只有该版本的上传者本人(其他人报 `PUBLISHER_REQUIRED`,对话框显示「当前安装未申请此能力,或你无权访问应用云空间。」) |
144
- | 已开放生产 | prod | 其他安装者一律走生产(应用没有生产环境时报 `ENV_FORBIDDEN`);发布者本人在应用有生产环境后走生产,否则仍走 dev |
141
+ | 部署状态 | 数据域 | 谁能用 |
142
+ | ---------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------- |
143
+ | 未开放生产 | dev | 默认只有开发团队:这个应用的全部成员(其他人报 `PUBLISHER_REQUIRED`,对话框显示「当前安装未申请此能力,或你无权访问应用云空间。」) |
144
+ | 已开放生产 | prod | 其他安装者一律走生产(应用没有生产环境时报 `ENV_FORBIDDEN`);发布者本人在应用有生产环境后走生产,否则仍走 dev |
145
145
 
146
146
  生产是否开放取决于部署:发布信任配置就绪即开放(由运维自动配置),不由应用决定。
147
147
  应用代码里只写 `zl.cloud.init({ env: zl.cloud.DYNAMIC_CURRENT_ENV })`,**不要写死 `'dev'` / `'prod'`**。
148
148
 
149
149
  > **生产未开放时,同事用不了 Cloud 数据**(注意)
150
150
  >
151
- > 此时所有人都走 dev,而 dev 默认只对开发团队(`appid` 应用成员 / 旧应用上传者)开放(部署可另行放开)。你把应用发布到企业目录后,
151
+ > 此时所有人都走 dev,而 dev 默认只对开发团队(这个应用的全部成员)开放(部署可另行放开)。你把应用发布为线上版本后,
152
152
  > 同事能安装、能打开,但云数据读写会被拒绝。这属于「平台未开放」,不是代码写错了。
153
153
 
154
154
  ### 授权与会话的关系
@@ -196,7 +196,7 @@ Cloud 授权的键形如 `cloud.database.dev.read`,记录在**这个安装的
196
196
  > 授权后,本应用可在关窗后按你勾选的能力运行(如定时巡检),只作用于你本人的数据,其他使用者看不到。
197
197
 
198
198
  - 授权限定在**这个安装 + 这个版本 + 这个环境**;每一步执行前都会重新检查;
199
- - `managed_function`(云函数)还要求绑定**就绪并已激活**的发布,否则提示「该版本尚未激活发布版本,暂时无法执行。请到「发布版本」页完成「激活开发」。」,调用返回 `FUNCTION_RELEASE_REQUIRED`。appid 应用到控制台「版本管理」页下方的「开发环境:云函数激活」完成这一步;
199
+ - `managed_function`(云函数)还要求绑定**就绪**的签名发布,否则该项下方提示「该版本还没有可用的签名发布,暂时无法执行。重新保存一次权限会自动补签。」,调用返回 `FUNCTION_RELEASE_REQUIRED`。带后台能力的版本上传时由平台自动签名;在这里保存(或允许 / 撤销后台运行)时自动绑定,缺签时当场补签,正常不会看到这条提示;
200
200
  - `logic_unit` / `builtin` provider 不需要发布;
201
201
  - `os.agent.complete` 等内置动作同样是一项后台能力,要在这里启用后才能调用。
202
202
 
@@ -328,21 +328,21 @@ Cloud 授权的键形如 `cloud.database.dev.read`,记录在**这个安装的
328
328
 
329
329
  ## 排查「没权限」
330
330
 
331
- | 症状 | 检查项 |
332
- | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
333
- | 应用显示「暂不可用」,装不上 | `requires` 里有白名单外的非可选能力?声明了 `agent.interaction`、前台 provider / 前台 provides?`host_api` 写错? |
334
- | 上传就失败 | `appid` 是否已在控制台创建、你是否是应用成员、provider `permissions` 是否 ⊆ `requires`、集合是否已声明 |
335
- | 打开应用报 `CONSENT_REQUIRED` | 「权限」里的四项全被取消且没有已启用的后台能力——勾选后保存 |
336
- | `PUBLISHER_REQUIRED` | 当前数据域是 dev,而你不是该版本的发布者。等部署开放生产,或用发布者账号验证 |
337
- | `ENV_FORBIDDEN` | 当前数据域的环境未创建 / 不可用,或部署未开放生产 |
338
- | 数据库调用 `UNSUPPORTED_OPERATION` | 环境、数据库是否就绪?是否授权了数据库读写?改完后重新加载应用了吗? |
339
- | `SCOPE_FORBIDDEN` / `RULE_DENIED` | 授权是否被取消?集合是否在 `data.collections` 里?记录规则是否允许?详见 [状态与错误码](status-codes.md) |
340
- | 云函数访问不到字段 | provider 的 `permissions.data[].fields` 写了且包含该字段吗?`actions` 允许这个操作吗? |
341
- | 用户之间看不到彼此数据 | 集合是私有的(默认)。需要共享就在**创建集合之前**声明 `shared_collections` / `partition: "shared"` |
342
- | 前端调用后台能力 `BACKGROUND_CAPABILITY_UNAVAILABLE` | 没有任何已启用的后台能力——在应用窗口「权限」里勾选并重新加载(旧 SDK 报 `UNSUPPORTED_OPERATION`) |
343
- | 云函数 `FUNCTION_RELEASE_REQUIRED` | 到「版本管理」页下方「开发环境:云函数激活」(或概览的「去签名」)完成签发与「激活开发」 |
344
- | 更新版本后后台任务不跑了 | 应用中心更新时权限变宽的能力需重新确认;CLI `update` 会停用全部后台能力 |
345
- | 跨应用调用失败 | 普通 SDK 不支持跨应用调用 |
331
+ | 症状 | 检查项 |
332
+ | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
333
+ | 应用显示「暂不可用」,装不上 | `requires` 里有白名单外的非可选能力?声明了 `agent.interaction`、前台 provider / 前台 provides?`host_api` 写错? |
334
+ | 上传就失败 | `appid` 是否已在控制台创建、你是否是应用成员、provider `permissions` 是否 ⊆ `requires`、集合是否已声明 |
335
+ | 打开应用报 `CONSENT_REQUIRED` | 「权限」里的四项全被取消且没有已启用的后台能力——勾选后保存 |
336
+ | `PUBLISHER_REQUIRED` | 当前数据域是 dev,而你不是该版本的发布者。等部署开放生产,或用发布者账号验证 |
337
+ | `ENV_FORBIDDEN` | 当前数据域的环境未创建 / 不可用,或部署未开放生产 |
338
+ | 数据库调用 `UNSUPPORTED_OPERATION` | 环境、数据库是否就绪?是否授权了数据库读写?改完后重新加载应用了吗? |
339
+ | `SCOPE_FORBIDDEN` / `RULE_DENIED` | 授权是否被取消?集合是否在 `data.collections` 里?记录规则是否允许?详见 [状态与错误码](status-codes.md) |
340
+ | 云函数访问不到字段 | provider 的 `permissions.data[].fields` 写了且包含该字段吗?`actions` 允许这个操作吗? |
341
+ | 用户之间看不到彼此数据 | 集合是私有的(默认)。需要共享就在**创建集合之前**声明 `shared_collections` / `partition: "shared"` |
342
+ | 前端调用后台能力 `BACKGROUND_CAPABILITY_UNAVAILABLE` | 没有任何已启用的后台能力——在应用窗口「权限」里勾选并重新加载(旧 SDK 报 `UNSUPPORTED_OPERATION`) |
343
+ | 云函数 `FUNCTION_RELEASE_REQUIRED` | 在应用窗口「权限」里允许后台运行(重新保存一次),或在「版本管理」切换一次版本,平台自动补签并绑定;仍出现请联系平台管理员检查签名密钥 / 信任配置,或重新上传 |
344
+ | 更新版本后后台任务不跑了 | 应用中心更新时权限变宽的能力需重新确认;CLI `update` 会停用全部后台能力 |
345
+ | 跨应用调用失败 | 普通 SDK 不支持跨应用调用 |
346
346
 
347
347
  ## 相关
348
348
 
@@ -79,7 +79,7 @@ const db = zl.cloud.database();
79
79
 
80
80
  > **为什么用 `DYNAMIC_CURRENT_ENV`**(提示)
81
81
  >
82
- > 数据域(dev / prod)是「部署 + 当前用户 + 应用有没有生产环境」决定的:开发数据域默认只对开发团队(`appid` 应用成员 / 旧应用上传者)开放;
82
+ > 数据域(dev / prod)是「部署 + 当前用户 + 应用有没有生产环境」决定的:开发数据域默认只对开发团队(应用成员)开放;
83
83
  > 部署开放生产后其他使用者都用 prod,发布者本人在应用有了生产环境后也用 prod。
84
84
  > 应用自己判断不了,所以传哨兵 `DYNAMIC_CURRENT_ENV`,由宿主在握手时替你解析成具体值。
85
85
  > 写死 `'dev'` 或 `'prod'` 时,如果那不是当前对你开放的数据域,打开会话会被拒绝。
@@ -113,12 +113,12 @@ const caps = await zl.cloud.os.ready();
113
113
  数据库 / 文件相关的 profile 或操作符缺失抛 `UNSUPPORTED_OPERATION`;后台执行(`app-execution/1`)缺失抛 `BACKGROUND_CAPABILITY_UNAVAILABLE`(旧 SDK 才是 `UNSUPPORTED_OPERATION`)。
114
114
  服务端只在条件满足时下发 profile(`zleap-service/internal/services/cloudauthority/runtime_session.go`):
115
115
 
116
- | Profile | 解锁的 API | 服务端下发条件 |
117
- | ------------------ | ------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- |
118
- | `document-core/1` | `get` / `count` / `add` / `set` / `update` / `remove` / `operations.get` | 数据库已就绪、Manifest 的 `data.collections` 非空、已授予 `cloud.database.read` 或 `write`(`data.schemas` 可选,不写就是灵活集合) |
119
- | `watch-snapshot/1` | `watch()` | 在上一条基础上,声明并授予了 `cloud.database.read` |
120
- | `storage-object/1` | `uploadFile` / `downloadFile` / `deleteFile` / `os.files.*` | 部署启用了对象存储、授予了 `cloud.storage.read` 或 `write`;生产数据域还要求当前安装绑定了已就绪的签名发布 |
121
- | `app-execution/1` | `callFunction` / `os.capabilities` / `os.jobs` | 当前安装有已激活的后台能力授权(发布并「激活开发」,且在应用窗口「权限」里勾选了后台能力);缺失时抛 `BACKGROUND_CAPABILITY_UNAVAILABLE` |
116
+ | Profile | 解锁的 API | 服务端下发条件 |
117
+ | ------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------ |
118
+ | `document-core/1` | `get` / `count` / `add` / `set` / `update` / `remove` / `operations.get` | 数据库已就绪、Manifest 的 `data.collections` 非空、已授予 `cloud.database.read` 或 `write`(`data.schemas` 可选,不写就是灵活集合) |
119
+ | `watch-snapshot/1` | `watch()` | 在上一条基础上,声明并授予了 `cloud.database.read` |
120
+ | `storage-object/1` | `uploadFile` / `downloadFile` / `deleteFile` / `os.files.*` | 部署启用了对象存储、授予了 `cloud.storage.read` 或 `write`;生产数据域还要求当前安装绑定了已就绪的签名发布 |
121
+ | `app-execution/1` | `callFunction` / `os.capabilities` / `os.jobs` | 当前安装有已启用的后台能力授权(在应用窗口「权限」里勾选了后台能力;发布绑定由平台自动完成);缺失时抛 `BACKGROUND_CAPABILITY_UNAVAILABLE` |
122
122
 
123
123
  ```js
124
124
  const { profiles } = await zl.cloud.os.ready();
@@ -612,9 +612,9 @@ async function saveTodo(data) {
612
612
  }
613
613
  ```
614
614
 
615
- > **激活新发布后的会话失效**(提示)
615
+ > **绑定新发布后的会话失效**(提示)
616
616
  >
617
- > 开发者「激活」新的发布候选后,旧会话会收到 `RELEASE_UNAVAILABLE`。宿主会自动重开会话并**重试一次**,
617
+ > 安装切换到另一个版本并绑定新的发布后,旧会话会收到 `RELEASE_UNAVAILABLE`。宿主会自动重开会话并**重试一次**,
618
618
  > 多数情况下应用无感。若仍失败,请用户重新打开应用。
619
619
 
620
620
  ## 后台执行与能力调用