# 更新记录

## 1.54.0 — 2026-10-08

**加入我们：按任务加入**：AIDC 不按岗位招人，只放任务。官网 `/careers` 写清每个开放任务的交付物、里程碑、KPI、周期与报酬；在 Ask Adis 里上传一份文件（简历、作品集、项目报告都可以，不必照模板），Adis 给出你和每个任务的匹配度、依据与缺口，陪你把任务想清楚，再起草申请邮件；你改好点「发送」，邮件发给 AIDC 官方。

**新增**
- API：`GET /api/v1/public/careers/tasks`（开放任务、五种做事的方式、报酬规则与申请步骤，给智能体读）；`POST /api/v1/public/careers/applications`（上传一份文件：抽文字、匹配四个任务；同一个文件再传返回已有结果；文件解开后太大回 413 `file_too_large`，`details.reason` 是 `expanded`）；`POST /api/v1/public/careers/applications/{id}/draft`（起草申请邮件，没说过的项写成【待补充】；每段对话每天 15 次）；`POST /api/v1/public/careers/applications/{id}/send`（发送：dry-run；同一份申请只发一次；【待补充】没补完不发；同一份申请同时只有一个请求在发，另一个回 409 `idempotency_conflict`）。
- 页面：`/careers` 与四个任务页 `/careers/tasks/<id>`；Ask Adis 里的上传卡、匹配卡、申请邮件卡；上传过文件后，任务页显示你的匹配度。
- OpenAPI：文件上传登记为 `multipart/form-data`（文件是 `format: binary`）；返回文件的接口，成功响应登记为文件字节。

**变更**
- 旧的岗位页（FDE、全栈工程师、研究员）下线，跳到对应的任务页。
- Ask Adis 的一轮对话可以带 `application`（访客正在谈的那份申请）；申请邮件卡显示的就是那一份。

## 1.53.0 — 2026-10-07

**Space 用 Semantic 的界面；存储算上 Space**：Space 不再是单独的一套外壳，在 Semantic 的侧栏里（「我 › Space」），页头、标签、表格、按钮、菜单、对话框都和 Semantic 的其他页一样。「我的」与「组织用量」的存储 = 我的文件 + Space（回收站里的单列：照样占存储，清空才释放）；数字员工的存储 = 它名下的 Space。

**新增**
- API：`POST /api/v1/space/trash/empty`——清空回收站：永久删除我回收站里的每一项（与逐项永久删除同一套判定与留痕，Project 连里面的项）。`dryRun`（或请求头 `x-aidc-dry-run: true`）回 202，只算会删多少项、多少字节。重复调用安全。
- SDK：`semantic.space.emptyTrash({ dryRun })`。
- CLI：`aidc space empty-trash [--dry-run]`；`aidc me org --sort storage`（按存储排）。
- 「我的」：存储卡分四行（我的文件、其中分身的文件夹、Space、回收站）与「最大的 5 样」（文件名只给本人看）。
- 「组织用量」：存储列算上 Space，悬停看分项（我的文件 · Space · 回收站），可以按存储排序。
- Space 首页：类型分段（All、Pages、Sites、Images、Files、Projects）与标签（Suggested、Favorites、Your files、Shared with you）在同一页；Project 与回收站有面包屑；回收站页可以一键清空。

**变更**
- `GET /api/v1/auth/workbench`：`storage` 多 `space`（不在回收站里的页、文件、站点的字节与项数；回收站的字节与项数）、`totalBytes`（合计）、`largest`（最大的几样）；`aidc.storageGb` = 合计。
- `GET /api/v1/resourceManagement/usage`：每行的 `storageBytes` = 我的文件 + Space（含回收站），多一个 `storage` 分项（`filesBytes`、`spaceBytes`、`trashBytes`、`spaceItems`）；数字员工的行也有存储；配额池的 GB 算上 Space。
- `aidc me` 的存储一行改成合计，下面分我的文件、Space 与回收站。

## 1.52.2 — 2026-10-07

**工作流通知：AIDC 自己组织（`cell-aidc`）的工作流可以发给客户组织的成员**：`notify` 步骤的收件人，除了 AIDC 自己的账号和平台员工，还可以是持任何一家组织有效 License 的人。

**变更**
- `cell-aidc` 的工作流 `notify` 步骤：收件人可以是客户组织的成员（持有效 License、账号正常、邮箱已验证）；收回的、没兑换的、组织套餐已过期的 License 不算。收件人照旧写死在清单里；正文由写清单的人负责，只放可以给收件人看的内容。
- 不变：客户组织的工作流只发本组织的人，客户组织之间不互通；Action 通知、Automate、Data Health 的邮件照旧只发本组织的人。

## 1.52.1 — 2026-10-07

**Loop 报告的「全屏打开」就是预览的那份报告**：全屏链接（`/semantic/<公司>/objects/loopReport/<slug>?embedded=true`）打开的就是 Object View 里预览的这份报告，铺满整页，电视大屏直接用。

**变更**
- 撤销 1.41.0 的跳转：报告被已发布的应用替代（应用的 `replaces` 写了这个 slug）时，全屏链接不再跳去那个应用。实时应用用它自己的链接。
- Ontology MCP 的 `list_loops`：报告的 `url` 打开的就是报告本身，`loginRequired` 只看本组织的 Applications 开不开放；被应用替代的报告照旧带 `replacedBy`（应用的标题与链接）。

## 1.52.0 — 2026-10-07

**Engine：组织统一管理智能体的回复方式、模型与 skill**：组织管理员在 Engine（`www.ai-dc.ai/engine/<组织>`）里给本组织的智能体定回复规范（规范正文 + 回复模板，有版本）、模型、推理强度和要预载的 skill。先在试运行里用草稿和真智能体聊一轮，满意了再应用到这个、几个或全部智能体；每次应用都记一条变更，可以撤销。内置五个模板：ASD-STE100 简化技术语言、简单明了、结构化汇报、客服答复、数据回答。

**新增**
- API：`/api/v1/engine/{cell}/**`——`agents`（智能体与生效配置、每一项来自哪里、生效状态）、`agents/{agentId}`（加下一轮带给它的回复规范全文）、`apply`（应用：点名的智能体或组织默认；dry-run 回计划；同一个请求重复发结果相同；别人期间改过同一行回 409）、`prompts`、`prompts/{id}`、`prompts/{id}/versions`（保存新版本，过期的 baseVersion 回 409）、`prompts/{id}/versions/{n}`、`templates`、`skills`、`models`、`changes`、`changes/{id}`、`changes/{id}/revert`、`test`（试运行，事件流）。认网页登录与开发者 Key，要这家公司的 developer。
- CLI：`aidc engine`——`agents`、`show`、`test`、`apply`、`prompts`、`prompt create|save|rename|archive|unarchive`、`templates`、`skills`、`models`、`changes`、`change`、`revert`。
- 界面：Engine 六页——试运行、智能体、回复规范、Skills、模型、变更记录；组织切换器的「产品」一组加了 Engine。

**规则**
- 回复规范从下一条消息起生效，不重启智能体；模型、推理强度、skill 写进智能体的配置，下一条消息前它的沙箱重起一次（平台先预热）。
- 每一项按「这个智能体自己 → 组织默认 → 运行时原值」取；组织默认改了，没有自己设置的智能体都跟着变。
- 模型只能换到智能体现在通道里的模型（凭证已经在它的凭证包里）；通道不同的跳过，计划里写明。
- 试运行的草稿只对试运行的那一轮生效，不改配置；试运行是你自己的会话，不进智能体的 IM 与网页对话。
- 只管共享池上的智能体；箱子上原生运行的只列名字。

## 1.51.0 — 2026-10-07

**交互界面：在终端里直接敲 `aidc`，和智能体对话**：`aidc` 原来只有开发者命令（给智能体用：JSON、不交互）。现在人在自己的终端里直接敲 `aidc`（或 `aidc chat`）进入交互界面：首屏是 AIDC 标志与字标（按品牌标志的几何现算的方块字）、账号、运行时与目录；没登录先在界面里登录；说过的话按顺序留在终端自己的滚动历史里，底部只有正在生成的部分、输入框和一行状态。界面归 AIDC，干活的是运行时，五选一：**AIDH**（本机 Harness 引擎，经 ACP）、**Codex**（`codex app-server`）、**Pi**（`pi --mode rpc`）、**Engine**（AIDC 模型，只聊天）、**数字员工**（云端 Agent API）；`--runtime acp -- <命令>` 还能接任何 ACP 智能体。管道里、智能体调用时行为不变（打印用法）。

**新增**
- `aidc` / `aidc chat ["开场"] [--runtime …] [--profile …] [--model …] [--resume [id] | --continue] [--cwd …]`：交互界面。流式回答按 Markdown 排版（表格、代码高亮、列表、引用），中日韩与 emoji 按两格；思考过程收成一行（`/thinking` 展开）；工具调用是卡片（动作、对象、用时、输出末尾几行或改动摘要）；计划、上下文用量、每轮用时与用量。
- 智能体要执行命令、改文件等有风险的操作时，输入框的位置换成确认面板（`1`–`9` 直接选、`esc` 拒绝）。
- 命令：`/help` `/new` `/resume` `/runtime` `/model` `/profile` `/status` `/copy` `/thinking` `/theme` `/clear` `/login` `/logout` `/exit`，运行时自己的命令（如 AIDH 的 `/compress`、`/steer`）接在后面；输入 `/` 补全命令、`@` 补全文件。
- 输入框：多行（`⌥⏎` / `⇧⏎` / `ctrl+j` / 行尾 `\`）、历史（`~/.aidc/history`）、按词移动与删除、剪切粘回、撤销、长粘贴折叠；`esc` 中断、`ctrl+c` 两次退出、`ctrl+z` 挂起。
- `aidc chat -p "<提示>" [--yes] [--json]`：同一能力的非交互形态，跑一轮就退出；stdout 不是终端时输出 `{runtime, model, sessionId, text, stopReason, usage, tools, denied}`；要确认的操作缺省拒绝，`--yes` 才允许；运行时出错退出码 8。
- `aidc runtimes`：本机能用哪些运行时、缺什么。
- `aidc update [--check] [--dry-run] [--force]`：把安装脚本装的 aidc 换成线上最新版（先跑一次 `--version` 核对再整体换上，旧的留成 `aidc.mjs.prev`）；`--check` 只看版本。与安装脚本一样不用登录。
- AIDH 档案（`--profile` / `/profile`）：引擎的命名档案，或这台电脑上开出来的数字员工（`<公司>/<智能体>`）。
- 浅色 / 深色按终端背景自动判断（`AIDC_THEME`、`/theme` 固定；`NO_COLOR`、`AIDC_REDUCED_MOTION=1` 照常生效）；颜色取自界面 SDK 的设计令牌。

**变更**
- `aidc` 不带参数、在交互终端里时进入交互界面（原来打印用法）；`aidc help` / `--help` 与非终端照旧打印用法。
- `~/.aidc/config.json` 多一个 `tui` 字段（运行时、档案、模型、配色、最近的会话），`aidc logout` 保留它。


**修复**
- 安装脚本：UTF-8 区域设置下，PATH 前面已有别的 aidc 时最后一句提示报 `unbound variable` 退出（文件已装好，提示没打全）；以前装的指向 `~/.aidc/bin/aidc` 的链接被当成「另一个 aidc」。

## 1.50.0 — 2026-10-07

**Space：每个人与智能体自己的空间**：本组织的每个人、每个智能体都有自己的 Space（`www.ai-dc.ai/semantic/<组织>/space`）。可以写页（Markdown）、上传文件、部署站点（HTML 自动部署成网页，有托管地址），用 Project 把相关的东西放在一起。人与智能体在分享里是一样的：可以分享给人、智能体、组，开放程度 Private / Group / Public / Open to Internet。

**新增**
- API：`/api/v1/space/**`——`items`（列表：Suggested / Favorites / Your files / Shared with you，页 / 站点 / 图片 / 文件 / Project / 回收站；建页、站点、Project；取、改名、移动、改页、换站点内容；放进回收站）、`items/{id}/content`、`items/{id}/share`（取：给了谁、哪个智能体因为 owner 看不到而读不到；分享：给人、智能体〈agentId〉、组，`tier` 一步设开放程度，`alsoOwner` 同时分享给智能体的 owner）、`items/{id}/favorite`、`items/{id}/restore`、`items/{id}/permanentlyDelete`、`uploads` 与 `uploads/{id}/complete`（直传到公司自己的 S3；`.html` 完成后自动部署成站点）、`recent`、`principals`（分享的候选：本组织的人、智能体、组）。认网页登录、开发者 Key 与 Agent Key。
- SDK：`semantic.space`（`list`、`recent`、`get`、`createPage`、`deploySite`、`createProject`、`update`、`upload`、`readPage`、`download`、`share`、`access`、`principals`、`favorite`、`trash`、`restore`、`permanentlyDelete`）。
- CLI：`aidc space`（同 `aidc semantic space`）：`ls`、`show`、`get`、`page`、`edit`、`deploy`、`upload`、`project`、`mv`、`rename`、`share`、`access`、`people`、`fav`、`trash`、`restore`、`rm`。
- Agent Key 的 restrictions 新 operation：`api:use-filesystem-read`、`api:use-filesystem-write`（受限 Key 用 Space 要点名；不受限的 Key 照常）。

**规则**
- 只有 Owner 能分享、放进回收站、恢复、永久删除；Editor 改名、改内容、移动；Viewer 查看。Your files 里的东西只有本人看得到，组织开发者也看不到，除非分享。
- 智能体读的不超过它的 owner：owner 看不到的，智能体也读不到。智能体建的东西，它的 owner（已核验）也是 Owner。智能体不能把东西开到 Public 或 Open to Internet。
- 站点放进回收站后托管页不再服务；永久删除只对回收站里的，字节、站点、分享一起删。
- 页按版本保存：带上次读到的版本，过期的保存回 409 `version_conflict`。

## 1.49.0 — 2026-10-07

**每个人有自己的工作台：身份、席位、分身、用量（计算秒）与存储；组织管理员看每个人、每个数字员工的用量**：组织里的每个人有一个「我的」，看自己在这家组织的身份核验、席位与配额、分身、这段时间的计算秒（模型费按厂商价 1 : 1 折算，不加价）与存储。每个被组织准入的人都有一个分身：他自己的智能体，身份就是他的账号，权限与他相同，不另占席位；它的文件夹是我的文件里的 `agent/`，槽位照 eve 的 agent 目录。席位只按人数：一个人一个席位（分身含在里面）；数字员工不占席位，它们的用量（计算秒）计入组织的配额池。组织开发者多一个「组织用量」：人与数字员工在同一张表里。

**新增**
- API：`GET /api/v1/auth/workbench?organization=cell-…&period=month|30d|YYYY-MM`（本人在这家组织的工作台：身份核验、席位与配额、分身的槽位与设备、用量按来源 / 模型 / 天、负责的智能体、我的文件的字节数；不是这家的人 403）；`GET /api/v1/resourceManagement/usage?organization=…&period=…`（组织用量：席位、配额池、每个人与每个数字员工一行；只给组织开发者）。
- Semantic：`/semantic/<cell>/me`「我的」（用量 · 分身 · 存储 · 我负责的智能体），`/semantic/<cell>/usage`「组织用量」；侧栏最上面一组「我」。页底写明组织管理员看得到什么、看不到什么。
- CLI：`aidc me [--period]`、`aidc me org [--period]`。
- 账号文件夹标准：会做事的账号（人的分身、数字员工）各有一个 `agent/` 目录，槽位与 eve 的 agent 目录同名（`agent.ts`、`instructions.md`、`skills/`、`tools/`、`connections/`、`channels/`、`memory/`、`schedules/`、`sandbox/`、`subagents/`，`evals/` 在旁边）；写了哪个槽位就换掉哪个缺省。

**变更**
- 一把 Key 的用量算谁的：设备 Key 算兑换 License 的人（分身 · Adis），挂在某人会话上的 Key 算拿着它的人，账号签的 Key 算这个人，平台签给智能体的 Key 算这个智能体；应用票据与数据流发布单列。没有价目的调用只记 token、标「未计价」，不当成 0。

## 1.48.0 — 2026-10-07

**智能体有负责的人（owner），能读的不超过他；云盘按 Project、文件夹、文件算访问，每人有自己的 Your files**：每个智能体可以指派一个负责的人（owner）。智能体用自己的凭证读数据时，能读的不超过 owner；owner 停用、邮箱未验证或不再是本组织的人时，智能体暂停读数据，直到指派新 owner。云盘与数据基座的访问沿 Project → 文件夹 → 文件逐级算；每人一个只有自己看得到的 Your files；数据基座里的路径可以挂 Marking。

**新增**
- API：`GET /api/v1/control-plane/companies/{cell}/agents/{agentId}/identity`（owner 与核验状态、谁能用、挂着的 Marking、它的服务用户与组、从 owner 继承的与没给的、Key 前缀；组织成员 403）；`PUT …/agents/{agentId}/owner`（`{ ownerId, reason }`，组织管理员；新 owner 要是本组织在用、邮箱已验证的人，否则 422 `owner_not_eligible`；本机智能体的 owner 是设备的主人，409 `local_agent_owner_fixed`）。
- Semantic：智能体对象类型多了 `ownerId`、`owner`、`identityStatus`；Action `set-agent-owner`（各组织里是 `aidc-set-agent-owner`）。改可见性、授予、收回、换 owner 这四个 Action 只能由人执行。
- 云盘：`POST …/shares` 收 `kind`（`file` | `folder` | `project`）；文件夹与 Project 有 RID（`ri.compass.aidc.folder.<id>`），可以用访问接口（`/api/v1/filesystem/resources/{rid}/roles/add|remove`）授予人与组；数据基座里的文件、文件夹、Project 可以挂 Marking（`…/addMarkings`、`…/removeMarkings`）。`GET …/drive?view=roots`：自己的 Your files 与分享给自己的入口。
- CLI：`aidc semantic filesystem list --type folder`。

**变更**
- 智能体的 Key 读 Semantic：有已核验的 owner 时，服务用户再继承 owner 的组织身份与组（只继承能用这个智能体的人都在的组），判定时 owner 也要通过（类型、对象行、属性、媒体集、Ontology SQL）；Marking 只给挂在智能体上、owner 是成员的。接了 IM 机器人的智能体不继承。人持有的 Key 也不超过 owner。没有 owner 的智能体与 1.46.0 相同。
- 云盘接口：组织成员（含持 member License 的账号）可以用，只看得到自己的 Your files 与分享给自己的；目录、平铺清单、搜索只列读得到的；读不到的路径回 404。Project 不继承公司云盘的缺省角色；Your files 只有本人看得到，组织开发者也看不到。
- 建、改、撤分享要这个路径的 Owner；挂着 Marking 的访问设置要先去掉 Marking 才能撤（409 `markings_present`）。`/s/` 链接的读判定算上级的访问设置与 Marking。
- 智能体导出媒体：有单独访问设置的路径不生成公开链接。
- 云盘的改名、移动、删除带着下面的全部东西：下面每个带访问设置的都要有角色（文件 Editor，文件夹与 Project Owner），否则 403；改名、移动到已经有访问设置的路径上回 409 `file_exists`（`details.reason = settings_at_destination`），不动盘。
- 数据基座不再造出同名的文件与文件夹（建文件夹、写、改名、移动、上传选名都算占用）；已经有的、带访问设置的，改名、移动、删除回 409（`details.reason = name_collision`）。
- 工作区的软链接：跟随会改变访问判定时不跟随——读回 404、写回 403；`/s/` 链接读工作区文件不跟随。`?agent=` 按它解析到的箱子与挂载根判访问设置。
- 改名、移动到已有的名字上（文件、目录、软链接）回 409 `file_exists`，不再搬进同名的目录；存储没有真的动成时不搬访问设置。改名、移动期间目标位置先挂上与源相同的限制。只完成了一部分（`details.reason` = `partial_copy` / `partial_move`）回 503：两处都留着、都受保护，原处的访问设置不动。
- 数据基座的直传上传：一片也走 multipart，完成时名字已被占回 409 `file_exists`（不覆盖）；完成时连落位的路径一起判权限。
- 访问面板往下调一档时，旧受众（公开链接、本组织、部门）改成只按授予，链接地址不变（以前回 409）。

**修复**
- FIX-0211：组织成员经云盘接口能列、读整个公司云盘。
- FIX-0212：建分享不看路径的 Owner；`/s/` 读判定不看上级与 Marking；本机节点的数据通道与媒体导出绕过访问设置。
- FIX-0213：同组织的人能续传、取消、完成别人的上传。
- FIX-0214：持 member License 的人在工作台看得到全部私有智能体。
- FIX-0215：成员能读写同一个智能体上别人的会话；全组织的会话记录对成员开放。
- FIX-0216：控制台的 Agent Keys 页对非管理员列出全部 Key。
- FIX-0217：云盘请求带任意 `?agent=` 就丢掉工作区的访问设置。
- FIX-0218：改名、移动、删除文件夹不看下面的访问设置；目标位置上的访问设置在动盘之后才处理。
- FIX-0219：数据基座里同名的文件与文件夹，删文件会连带删掉文件夹下面的访问设置。
- FIX-0220：工作区的软链接绕过路径判定。
- FIX-0222：改名、移动期间目标位置没有保护；对象存储复制、删除出错时报成功或留下没人管的副本。
- FIX-0223：数据基座直传：迟到的完成能盖掉开会话之后别人放在这个名字上的文件。
- FIX-0239：改名、移动落进已有的目录或被静默跳过，访问设置照样搬。

## 1.47.0 — 2026-10-06

**审批策略：review 与 yolo**：每个组织有一个审批策略，管 Ontology 提案的批准、合并与 Semantic 应用的发布。review（缺省，和以前一样）= 本组织开发者在网页上批准、合并、发布；yolo = 能改这个本体的 Key 也能做，作者能改这个本体时自己的批准就算数，检查通过自动合并。两种策略下 Marking 与 merge checks 照样是硬闸；每一次批准、驳回、合并、发布、改策略都记进审计日志（谁、经网页还是 Key、结果）。

**新增**
- API：`GET /api/v1/ontologies/{ns}/approval-policy`（看策略：`eligibleReviewers`、`approvalsRequired`、`contributorApproval`、`autoMerge`）；`PUT …/approval-policy` `{ "policy": "review" | "yolo" }`（只给本组织开发者本人：网页登录，或没有声明智能体身份的开发者 Key；同一策略再设不写；`x-aidc-dry-run: true` 只返回会被重新判定的提案）。改成 yolo 时打开的提案按作者重新判定（作者能改这个本体 = 批准，合并在下次改动或调用合并时发生）；改回 review 时智能体给的批准作废。
- CLI：`aidc semantic approval-policy [get] | set review|yolo [--dry-run]`；`aidc semantic proposal approve <id> [task …] [--note …] [--confirm-breaking]`（不写 task = 全部待审核的；有破坏性改动要 `--confirm-breaking`，先核对完再写）、`proposal reject <id> <task>`、`proposal merge <id>`。
- SDK：`semantic.ontology().approvalPolicy.get()` / `.set(policy, { dryRun })`；类型 `ApprovalPolicyView`。

**变更**
- `POST …/proposals/{id}/tasks/{apiName}/review` 与 `…/merge`：审批策略是 yolo 时也收 Bearer——开发者 Key（含 `x-aidc-author` 声明的智能体），或代表的主体在 Ontology 上是 Editor / Owner 的 Agent Key；只读的 Agent Key、受限 Key、运行令牌、应用票据回 403。审批策略是 review 时和以前一样只收网页登录。
- 开提案、改分支：yolo 下作者能改这个本体，就以作者的身份批准并在检查通过后合并（同一个请求里返回 `status: "MERGED"`）；破坏性改动自动确认资源名；安全策略的改动作者满足不了 Marking 时留给别的审核人（Changelog 记 `held`）。`aidc semantic branch propose` 的输出跟着变：合并了就直接报语义版本。
- 发布应用（`POST /api/v1/workshop/modules/{rid}/versions/{v}/publish`、保存时 `publish: true`）：yolo 下作者是智能体的版本，开发者 Key 也能发布。
- 贡献者只批自己改的资源：别人在同一个分支上改的资源，等它们自己的审核人。
- 批准绑在分支版本上：批准之后分支又改了，旧批准不算数（合并回 409，要重新批准）。合并先认领：认领期间审核、改分支、关闭提案、再合并都回 409，同一个提案同时合并两次只有一个成功；合并中断时认领 10 分钟后过期，重试时 main 上已经一样的定义不算冲突。
- 同一个分支同时开两个提案只有一个成功；改分支时打开提案的资源清单在同一步里对齐。
- 审核可以带 `branchVersion`（提案返回的分支版本）：分支在你看过之后又改了就回 409；网页与 `aidc semantic proposal approve` 都会带。
- 一个组织同一时间只合并一个提案：别的提案正在合并时回 409，稍后再合。
- 几个提案同时合并时，语义版本号冲突会重读重来，最新的语义版本包含全部已合并的定义。

## 1.46.0 — 2026-10-06

**智能体在 Semantic 上有自己的身份（服务用户）**：智能体的 Agent Key 代表这个智能体的服务用户（`svc.<组织>.<智能体>`）。服务用户不能登录、默认没有任何角色；组织管理员把它加进组、给组授予 Ontology（或某些 Object Type）上的 Viewer，它才读得到——和人用同一套授予、组、到期与 Markings。人持有的 Key（账号认领、桌面兑换的）按这个人自己的权限判。

**变化**
- 智能体的 Key 读 Semantic（Ontology MCP、Ontology API、Ontology SQL）：能读什么 = 服务用户（或持有人）的授予 ∩ Key 的 restrictions。没有任何角色时回 403，信息里写着是哪个服务用户。组成员可以带到期时间：到期后立刻读不到，续上立刻恢复。
- 只读的受限 Key（`api:use-ontologies-read`）能用读对象的全部接口：按类型查 / 聚合 / 计数、对象集取数 / 聚合 / 链接、列对象、链接、媒体与附件、时间序列、对象类型与 Action 类型的元数据——只读列出的类型（`*` = 全部公司级类型）。整个本体的元数据只给 `*`。临时对象集要读写两个 scope。
- 新 operation `api:use-sql-queries-execute`：受限 Key 查 Ontology SQL 要它和 `api:use-ontologies-read`，且只给 `*` 的 Key；只授予了部分类型的智能体不能用 SQL。
- `POST /api/v1/control-plane/companies/{cell}/agent-keys` 的响应多了 `serviceUser`（这把 Key 代表的服务用户；签发时建好，拿去加进组）。
- 箱上的 Python 库 `aidc_semantic`：读平台给系统用户发的 Key（`/etc/aidc/semantic/<用户>.key`，与 `aidc-semantic` 命令同一个文件），智能体不用配凭证；读不到时提示请管理员开通，不再让智能体去找 Key。

## 1.45.0 — 2026-10-06

**数据边界覆盖箱上还没迁的智能体，下发前先查依赖**：运维可以把箱子上还没迁进运行池的智能体也纳入数据边界——按注册表给它们所在的多路复用单元生成合并围栏。下发前先查这些智能体的脚本与定时任务有没有读写别的 private 智能体的数据：有就报出来、整次不下发，不让脚本静默失败。

**变更**
- API：`POST /api/v1/harness/fences` 收 `native`（`plan` | `apply`，可选）。`action=plan` 时多回每个多路复用单元的目标围栏、在跑的围栏、要不要重启与依赖（`native.<单元>.dependencies`：被拒的智能体 → 引用它的文件数）；`action=apply` 时 `native=plan` 只写单元配置、不重启，`native=apply` 同时重启跑着别的围栏的单元；`action=verify` 带 `native` 时再从每个单元里面核（回 `native.checked`、`passed`、`failed`）。有依赖 → 502 `fence_failed`，`details.detail` 里是 `native_dependency:<单元>:<智能体>`；扫不全（文件太多、读不了）→ 同样 502，`native_scan_incomplete:<单元>:<原因>`。

**修复**
- 生成的围栏放行根目录本身：原来在围栏里 `ls /`、`find /` 会被拒。

## 1.44.1 — 2026-10-06

**申请加入组织、组织管理员审批；License 席位不限**：账号登录后搜索组织，选 Developer 或 Member、写备注（必填）提交申请；组织管理员（本组织 Developer）在控制台「组织 › 加入申请」批准或拒绝，批准即成为成员，不用再逐个签发、发送 License 码。License 码照常可用。

**新增**
- API：`GET /api/v1/auth/organizations?q=`（搜索可加入的组织：至少 2 个字、最多 8 家、只列开通了 License 额度的组织，带调用者的成员关系与待审批的申请）；`GET|POST /api/v1/auth/intake-requests`（我的申请；提交，同一组织再提交 = 重新提交那一条，同时最多 5 条待审批）；`DELETE /api/v1/auth/intake-requests/{requestId}`（撤回）。
- API：`GET /api/v1/control-plane/companies/{cell}/intake-requests`（待审批 + 最近 100 条审批记录）；`POST …/intake-requests/{requestId}/approve`（`{ role?, comment? }`，审批人可以改角色）；`POST …/intake-requests/{requestId}/reject`（`{ comment? }`）。只给本组织的组织管理员与平台员工，不能审批自己的申请。
- `PATCH /api/v1/control-plane/companies/{cell}/licenses/{licenseId}` 收 `role`：把成员调成 Developer 或 Member（已兑换的码只能改角色）；不能改、不能收回自己的 License（409 `self_modification_forbidden`）；组织里最后一个 Developer 不能降级、不能收回（409 `last_admin_protected`）。
- 一家组织的批准、`aidc members import`、签发、改角色、收回在同一把锁里串行：并发时不会给同一个人建两张 License，也不会一起超过登记的席位数。

**变更**
- License 额度的席位数可以是 `null`（不限）：`PUT …/license-plan` 收 `seats: null`；`GET …/license-plan` 的 `seats`、`remaining` 不限时为 `null`；签发、批准申请、`aidc members import` 都不再数席位。`aidc members import` 的 `seats.limit` 不限时为 `null`，输出写「不限」。

**修复**
- FIX-0207：`PUT …/license-plan` 只给 AIDC 平台管理员。原来只看账号有没有挂公司，License developer 的账号不挂公司，所以客户能改自己组织的席位与到期日。

## 1.44.0 — 2026-10-06

**池上智能体的定时任务能发回 IM 了**：智能体在运行池里时，它的定时任务到点照样执行（有在排的任务就不冻结），结果经平台交给这个智能体的 IM 机器人主动发出（钉钉：群发或单聊）。智能体自己的 `send_message` 同样能用。

**变更**
- API：`POST /api/v1/gateway/messages/send` 有了出站后端：经这个智能体的接收器，用机器人的主动发送接口发出，成功回 `{ delivered, chatId, via, chat, parts }`。只认只能发消息的受限 Agent Key（`restrictions.operations` 含 `api:use-messages-write`）：普通 Agent Key → 403 `forbidden`；每把 Key 每分钟 30 条（`rate_limited`）。新字段 `chat_type`（`group` | `dm`）与 `user`（单聊发给谁）；附件（`/s` 分享链接）追加在正文后面。机器人不在共享入口上、或通道还不支持主动发送（企业微信）→ 503 `delivery_not_configured`（`details.reason` 说明原因）；通道拒了 → 502 `delivery_failed`。
- 受限 Agent Key 的 operation 新增 `api:use-messages-write`：只有它的 Key 不能用聊天网关，在 Semantic 上什么都读不到。

## 1.43.0 — 2026-10-06

**智能体读 Semantic 的 MCP 入口（Ontology MCP）**：每家公司的 Semantic 有一个只读的 MCP 服务器，智能体不用终端、不用写代码就能查对象类型、按条件查对象、聚合，并拿到本公司 Loop（应用与 Loop 报告）可以直接发给人的链接。

**新增**
- `POST /api/v1/ontologies/{ontology}/mcp`（Streamable HTTP，无状态、只回 JSON）：工具 `list_object_types`、`search_objects`、`aggregate_objects`、`get_object`、`list_loops`，全部只读。读之前按数据源的新鲜度要求按需同步（`fresh: true` 最多等 20 秒）。凭证：本公司的 Agent Key（含只读的受限 Key）或开发者 Key；网页会话与应用票据不认。
- 受限 Agent Key 的 `objectTypes` 可以写 `["*"]`：本组织全部公司级的类型，只读（只能单独出现，不能配 `api:use-ontologies-write`、不能列 Action）。

## 1.42.0 — 2026-10-06

**智能体注册表与数据边界**：一行一个智能体——可见性、哪些组能用、脑在哪、工具在哪台机器上执行、IM 机器人、数据边界是否核验通过。private 智能体的数据只归它自己：别的智能体在执行工具时读不到、写不到，由平台按注册表生成的围栏保证，并逐个核验。可见性与授权在 Semantic 里用 Action 改，改动写回注册表，数据边界随后重算并核验。

**新增**
- API：`GET /api/v1/harness/agents?cell=<组织>`（注册表视图，只读）。
- API：`POST /api/v1/harness/fences`（`{ cell, action: plan | apply | verify }`）：plan 只算、不改；apply 下发围栏（平台管理员，需要确认）；verify 以每个智能体自己的身份逐条核验，回传只有计数与状态。
- Semantic：各组织的平台对象类型新增 `aidcAgent`（只给本组织开发者）与三个 Action：`aidc-set-agent-visibility`、`aidc-grant-agent-access`、`aidc-revoke-agent-access`；数据源新增平台目录里的 `aidc`（注册表）与三个 webhook：`aidc/agent-set-visibility`、`aidc/agent-grant-access`、`aidc/agent-revoke-access`。只能改本组织的智能体。

## 1.41.0 — 2026-10-06

**应用与 Loop 报告可以对外公开（Open to Internet），看板默认实时**：应用（Workshop 模块）与本组织的 Applications 成了访问设置里的资源，可以设成 Open to Internet——拿到链接的人不用登录就能只读看应用的发布版，嵌在应用里的 widget set 一起放行（只读）；本组织的 Applications 设成 Open to Internet 时，Loop 报告的全屏链接也不用登录。改回 Group，同一个链接就要登录。所有应用缺省打开 Auto-refresh：开着的页面跟着数据走，不用再定时重算整页。

**新增**
- 访问资源：本组织的 Applications（`ri.workshop.aidc.applications.<公司>`，从 Ontology 继承）与应用（`ri.workshop.aidc.module.<id>`，从本组织的 Applications 继承）。都没有 Private 这一档；可以设 Public 或 Open to Internet（只有 Owner，界面二次确认）。应用页与 Applications 页有 Share 面板；CLI `aidc resources access <rid> --tier internet|public|group`。
- 不登录的访客：只看发布版，只读得到这个应用用到的、公司级的类型；不能执行 Action、不能直接写、不能查 SQL；挂了 Marking 的类型与对象看不见。按来源 IP 限流。
- Loop 报告的全屏链接（`/semantic/<公司>/objects/loopReport/<slug>?embedded=true`）：旧 Loop 已经迁成已发布的应用时，直接去那个应用（能对上页面就带 `?page=`）。
- `GET /api/v1/workshop/modules` 的每个应用多了 `access`（`internet` = 链接不用登录 · `public` = 登录的 AIDC 账号都能看 · `group` = 本组织的人与被分享的人）与 `accessRid`。

**变更**
- Auto-refresh 缺省打开：模块设置里 `settings.autoRefresh.enabled: false` 才关（原来要写 `enabled: true` 才开）。
- 访问判定：Public（Everyone）只匹配登录的账号，不匹配不登录的访客。

## 1.40.1 — 2026-10-06

**安全修复：经 SSM 就地装 agent proxy 只给平台运维**：平台是用自己的云凭证、以 root 在 agent 登记的主机上执行安装的，所以这一步与改 agent 的主机都只给平台运维；组织开发者照三步手动装 agent proxy（不受影响）。

**变更**
- `POST /api/v1/connectivity/agents/{agent}/upgrade`：只收平台运维的开发者 Key，其余 403；一次性登记码有效期 15 分钟 → 5 分钟；下发失败当场作废登记码、回 502；安装命令只走 https。
- `POST /api/v1/connectivity/agents`（旧版 agent 的登记）：组织开发者只能改显示名，改主机要平台运维（403）。
- `POST /api/v1/connectivity/agent/enroll`：过期判断与兑换在同一次更新里完成。
- agent proxy 1.1.1：安装脚本要求安装目录、`bin`、`etc` 归 root、别人写不了、不是软链；`configure` 先建好配置的临时文件再去换凭证，写不了盘就不换；平台返回非预期的错误体时不再抛异常回溯。
- SQL Server 的文本取值：列没有代码页信息时不再做 GBK 还原（此时按 UTF-8 解出的就是正确的字）。

## 1.40.0 — 2026-10-06

**平台管的箱子一条命令装上 agent proxy，凭证不经人手**：原来经平台叫醒执行的旧版 agent 所在的箱子，现在由平台直接装 agent proxy——平台给这台箱子发一个一次性登记码，箱子上的安装程序拿它向平台换 agent 凭证，凭证只写进箱子上的配置，不显示给任何人。装好后就能走迁移向导，把这台箱子上的连接换成平台执行。

**新增**
- API：`POST /api/v1/connectivity/agents/{agent}/upgrade`（`{ "via": "awsSsm" }`，本组织开发者；`?dryRun=true` 只回目标箱子）：只给登记了托管主机的旧版 agent；发一个一次性登记码（15 分钟内、只用一次，库里只存哈希）并下发固定的安装命令，返回命令 id 与登记码的有效期，不返回登记码与凭证。没有托管主机的 agent → 409（照三步手动装）。
- API：`POST /api/v1/connectivity/agent/enroll`（`{ agent, code }`）：箱子上的安装程序拿登记码换 agent 凭证，只换一次；换了之后这个 agent 原来的凭证作废；响应不缓存。登记码不对、用过或过期 → 401；按来源限流。
- agent proxy 1.1.0：`aidc-agent-proxy configure --enroll`（登记码从标准输入读，换来的凭证只写进本机配置、不打印）；`install-agent-proxy.sh --enroll`；重装时重启服务，让常驻的进程用上新凭证。
- CLI：`aidc semantic connectivity agent upgrade <agent RID|apiName> --ontology <cell-…> [--wait] [--dry-run]`（`--wait` 等它以新凭证连上平台，最多 3 分钟）。

## 1.39.0 — 2026-10-05

**指标从底层重算：加工层（Transforms）**：原始数据经同步进 dataset 只读一次，指标由 Transform 从 dataset 算成新的 dataset，再作对象的数据源。输入一有新数据就自动构建，增量时只重算受新数据影响的那些键；改了口径从已有的原始数据重算，不再回源系统。

**新增**
- Transform：输入（别名 → dataset 的名字或 RID）+ 一条 DuckDB 的 SELECT + 增量设置（`semanticVersion`、`snapshotInputs`、`requireIncremental`、`output: append | mergeAndReplace`、`key`），产出同名的 dataset。三种写法：非增量（整份）、`append`（只算新行、追加）、`mergeAndReplace`（受影响的键从输入的全部行重算，与上一份产出按键合并）。
- 自动构建：输入提交了新事务就构建（非增量看全部输入，增量只看非 snapshot 输入）；在跑时又被触发就跑完再跑一次；输入与定义都没变时不跑。Object Type 的 dataset 数据源可以是加工的产出：读的时候过期，执行的是上游的同步，跑完一路算到对象；新绑定整份索引一次产出现在的内容。
- 安全：只执行一条 SELECT，只能读这次构建的输入文件；不能读别的文件、连网、装扩展、改设置。一次构建读 ≤ 384 MB、产出 ≤ 500 万行、300 秒。
- API：`/api/v1/transforms`（列出、新建或整体替换，`?dryRun=true` 预演）、`/api/v1/transforms/{transform}`（读、删：还有 Object Type 用它的产出时 409，产出的 dataset 留着）；`POST /api/v2/orchestration/builds/create`（构建一个目标 dataset：加工的产出跑加工，同步的产出跑同步；`forceBuild` 无视「没变化不跑」）；`GET /api/v1/orchestration/builds/{rid}` 与 v2 `Builds.get` 也查得到加工的构建（增量还是整份、受影响的键、读写行数）。
- CLI：`aidc semantic transforms list|put|show|build|delete`（`build --force --wait`）。
- Data Health 的 `buildStatus` 检查也看加工的构建；同步不能再写加工的产出（409）。

## 1.38.0 — 2026-10-04

**建 sync 之前先探索源（Source exploration）**：在 source 页点 Explore，就能看到源里有哪些表和视图、每张表的列与主外键、表和表之间的关系，直连的源还能取几行样本；勾选要的表，一次建好 batch sync。

**新增**
- Explore 页：按表名搜索、浏览表与视图（最多 2,000 张）；一张表的列（类型、可空）、主键、外键与引用它的表（点关系跳过去）；直连的 source 取 1–50 行样本；右栏勾选的表一次建好 batch sync（每张一条 `SELECT *`、SNAPSHOT，名字自动避开已有的 sync），之后在 sync 页改增量、挑列。只给本组织开发者；只读会话；样本行不落库。
- 经 agent proxy 的 source 也能看表与结构：查询经 agent 的隧道在平台里执行，agent proxy 程序不用升级；样本行只在直连的 source 上取。
- API：`POST /api/v1/connectivity/connections/{connection}/explore`（`listTables` / `describeTable` / `previewTable`）；经 agent proxy 的最多等 20 秒，没等到回 202，用 `GET /api/v1/connectivity/explorations/{rid}` 取结果。
- CLI：`aidc semantic connectivity explore <connectionRid> [--search <字>] | --table <schema.表名> [--preview --rows 20]`（经 agent proxy 的自动等结果）。
- 建 batch sync 的接口加 `?createOnly=true`：只建新的——同名已存在（或同时被别人建了）回 409，不替换已有 sync 的查询。Explore 页用它，撞名自动换下一个名字。

## 1.37.0 — 2026-10-04

**Data Connection 改成平台执行：用 SQL 直接读业务库，不另开备份库**：新客户上了 Semantic 不用另开一个备份库——平台的 worker 用只读账号直接查 ERP / MES，客户内网里的库经装在客户网络里的 agent proxy（只出站、只转发字节）连；每次执行写成 dataset 的一个事务，再只把变了的行写成对象。外部通知改成 Action 的 side effect webhook，Loop 脚本改成函数；接口、命名与订阅按标准形状收齐。

**新增**
- **平台执行（Foundry worker）**：Connection 的 `configuration` 是 `jdbc`（`url`、`driverClass`：PostgreSQL / SQL Server、只读账号）或 `rest`（domains、认证、附加秘密），`worker` 是 `{ "type": "foundryWorker", "networkEgressPolicyRids": […] }`。口令写一次 `{ "type": "asPlaintextValue" }`，平台加密保存（AES-256-GCM），之后只回秘密名；`getConfiguration`、`updateSecrets`、`updateExportSettings`。
- **出口策略（Network egress policy）**：direct / agentProxy；域名（最左一段可通配）/ IP / CIDR + 端口；建了不能改，只能吊销。Console 新增 Network egress 页。
- **agent proxy**：装在客户网络里的 Python 标准库程序（`/developer/agent-proxy/aidc-agent-proxy` 与 `install-agent-proxy.sh`，装成 systemd 服务），只出站连平台；查询在平台里执行，它只为每次执行开一条隧道、只连这次的主机:端口（本机白名单文件可再收窄）。登记 `POST /api/v1/connectivity/agents/register`，凭证只给一次；装法三步：下载安装脚本 → `sudo sh` 运行（问凭证、不回显）→ `systemctl status`。
- **Dataset**：每个 TableImport 写一个同名 dataset；SNAPSHOT / APPEND 事务、Parquet 分片（snappy，每片 ≤ 50,000 行；一列的值都合它的类型就用对应的 Parquet 类型，null 与空串分开），字节在公司自己的桶里；`/api/v2/datasets/**`（getSchema、readTable（CSV）、transactions、branches、files（Parquet 原字节））。查询结果里有重名的列这次执行就失败。
- **增量导入每周对一次账**：APPEND + 增量列的导入，7 天没有快照、最近 7 天用过的，北京时间夜里（01:00–04:59）执行一次 SNAPSHOT：`?` 绑初始值读全部行，源头删掉的行标「源头已消失」，之后的视图从这个快照起、旧的增量文件按保留策略删掉。
- **Data Health**：`/api/v2/dataHealth/checks`（create、get、replace、delete）与 `…/checkReports`（get、getLatest）。检查挂在 dataset 的分支上，支持 `buildStatus`（最近一次执行成功与否，连续失败可升级 CRITICAL）、`timeSinceLastUpdated`（距上次有数据的更新多久，`timeBounds`）、`schemaComparison`（四种比法）、`primaryKey`（非空、不重复）；平台每 5 分钟评估，变成失败、升级、恢复时给建检查的人发邮件；每个检查留最近 200 份报告。dataset 页右侧显示每个检查的最近结果。
- **只写变了的对象**：与上一份行摘要比差，只写变了的行；SNAPSHOT 里没有的标「源头已消失」，APPEND 只增改；`allowSchemaChanges: false` 时列变了这次执行就失败。
- **迁移向导**：旧版 agent（客户箱上被叫醒、箱上比差）的连接换成平台执行：`POST …/connections/{rid}/migrate`（确认口令会存进平台；agent 把本机登记的口令交给平台加密保存），30 天内 `revertMigration` 退回。
- 标准接口：`/api/v2/connectivity/connections/**`（create、get、getConfiguration、getConfigurationBatch、updateSecrets、updateExportSettings；tableImports 的增删改查与 execute）、`/api/v2/orchestration/builds/{buildRid}`：裸响应体，错误是 Conjure 信封。
- Data Connection 应用：Sources / Agents、source 页、batch sync 页（Runs）、dataset 页（事务历史）、New source 向导（先 Validate 再建）、迁移与退回。
- CLI：`aidc semantic connectivity agent register`、`egress list|create|show|revoke`、`config`、`secret`（值从标准输入或 `--from-env` 读，不进命令行）、`migrate` / `revert-migration`、`dataset`、`health create|show|replace|delete|reports`。
- **webhook**（挂在 REST API 数据源上）：带类型的输入（Boolean、Integer、Long、Double、String（可限定取值）、Date、Timestamp、List、Record、Optional）；一个或多个请求（方法、domain、相对路径、查询参数、请求头、JSON / 表单 / 文本请求体）；模板 `{{名字}}`、`{{json 名字}}`、`{{secrets.名}}`，JSON pointer 抽取，后面的请求可以用前面请求的值；输出参数；时间缺省 20 秒、最多 180 秒，速率、并发、可重试状态码。数据源的认证自动加上，秘密只在发送时解开、回显里打码。API `/api/v1/connectivity/webhooks`、`/{webhookRid}`、`/{webhookRid}/execute`（`dryRun` 只渲染）；CLI `aidc semantic connectivity webhooks`、`webhook put|get|delete|test`。
- **Action 的 side effect webhook**（`webhooks.sideEffects`，≤ 10）：提交之后执行，可以多个、不保证顺序；失败不回滚、不报给执行人，结果记进执行记录。发钉钉 / 企业微信 = 一个配了 side effect webhook 的 Action。
- **Automate 的 Action 效果与 Function 效果**：Action（以 automation 拥有者的身份、按他现在的权限执行 Action Type）、Function（在平台的隔离运行时里执行已发布的函数版本，只记结果摘要，返回的 Ontology 编辑不生效）；效果输入 `$effectInput`（objects、object、primaryKey、`property:<属性>`、failureMessage、automationRid、eventId）；`executionMode`、`executionSettings.batchSize`；每个效果的重试 `retryConfig`（constantBackoff / exponentialBackoff，jitterFactor / jitterDurationMillis）；失败效果 `fallbackEffects`。函数发布 `POST|GET /api/v1/ontologies/{ns}/functions`，`aidc semantic functions publish | list`。
- **对象集订阅走 WebSocket**：`wss://<host>/api/v2/ontologySubscriptions/ontologies/<本体>/streamSubscriptions`（本体写 RID 或公司命名空间），子协议 `Bearer-<token>`；消息 subscribeResponses / objectSetChanged / refreshObjectSet / subscriptionClosed。约 280 秒以 1001 关闭（客户端重连、重新订阅），没有订阅满 60 秒以 1000 关闭；连接时长计入应用的计算分钟。

**变更**
- 新建 Connection 只收平台执行（jdbc / rest + 出口策略）；旧版 agent 的连接照常运行，只能改、不能新建，迁移向导换过来。
- Data Connection 的配置、查询与 dataset 只给本组织开发者看（成员 / Agent Key：v1 403，v2 NotFound）；其他人经 Object Type 读对象。
- `/api/v1/ontologies/**`、`/api/v1/ontologySubscriptions/**`、`/api/v1/connectivity/**`、`/api/v1/orchestration/**` 里在 `/api/v2` 有同名接口的请求带 `Deprecation: true` 与 `Link`（successor-version），OpenAPI 标 deprecated；v1 响应不变。
- Automate：保存时校验 Action / 函数、参数、效果输入与拥有者权限；新建 automation 用钉钉 / 企业微信通知或 `agentScript` 返回 422 `automate_legacy_effect`（已有的照常运行，替换时可原样保留；迁移表见「闭环」）。
- 命名：新建的 Object Type 恰好一个主键属性；新的属性与 Action 参数 API name 用 camelCase；Object Type 的 API name 用 PascalCase（保留字与只差大小写的新名字拒收，其余旧写法给警告）。不合规时 define 整批 422 `invalid_schema`，分支校验 `primary_keys` / `api_names` 失败、挡合并；已有的照收，返回警告。
- 工作流：调自动提取的 Action 能力时 `with` 收 camelCase 参数名；导出与计算步骤的 `sort` 收 camelCase 属性名。样板（报价演示、云费用监控）改 camelCase，`demo.bom_line` 改单主键 `lineKey`。
- Webhook：Action 的 `webhook` 引用可以写本组织的 `<数据源>/<webhook>` 或 webhook 的 RID；还有 Action 在用的 webhook 改输入 / 输出或删除返回 409。

**修复**
- 同一张 TableImport 几乎同时的两次执行会建出两个 Build；暂停的导入经手动执行照样会跑（FIX-0196）。
- 受限 Agent Key 在 `/api/v2/ontologies/**` 上与 v1 同一张白名单（函数与订阅不在里面）；经 `/api/v2` 读由数据集供数的类型，与 v1 一样按 maxAge 按需同步（FIX-0192）。
- 工作流与能力收 camelCase 的属性 / 参数名（FIX-0193）。
- `aidc semantic automations pause | resume` 原样带回 `fallbackEffects` 与 `expiresAt`（原来会丢到期时间）。

**破坏性变更**
- 新定义里的复合主键、snake_case 属性 / 参数、Object Type 的保留字名被拒收（存量不受影响）。
- 新建 Connection 不再收旧版 agent 的形状；新的 automation 不再收钉钉 / 企业微信通知与 `agentScript`。

## 1.36.0 — 2026-10-04

**Semantic 里的 Automate 应用**：automation 原来只有 API，Semantic 里只在 Data Connection 页列一张只读表。现在有完整的应用：Overview（能看到的、我拥有的、我是收件人的、暂停的；最近触发、近四周失败、最近改过）、Automations（左边筛选）、History（全组织的运行）；New automation 向导三步 Condition → Effect → Summary，每一步都能 Preview；每条 automation 有 Overview / History / Execute / Code 四个页签，能编辑、暂停 / 恢复、手动运行、删除。界面只调 `/api/v1/automate/**`，网页能做的智能体和 CLI 都能做。

**新增**
- 预演（`POST /api/v1/automate/automations?dryRun=true`、`PUT …/{rid}?dryRun=true`）多返回 `preview`：对象集里现在有几个对象（数到 100,000）、最新的几个对象、每个效果用这些对象渲染出的消息（与运行时同一个渲染函数）、时间条件接下来 5 次触发。不写任何表。
- `GET /api/v1/automate/runs?ontology=<组织>`：History，全组织所有 automation 的运行，新的在前，按 `automation`（rid 或 apiName）、`status`、`since`（日期或带时区的时刻）筛，`pageToken` 翻页；触发对象只给键（类型 + 主键）不给属性，受保护类型（Markings、安全策略）的连键也不给、只给个数；只给本组织的开发者、成员与不受限的 Agent Key。CLI：`aidc semantic automations runs --ontology <组织> [--automation …] [--status failed] [--since …]`。
- `POST /api/v1/automate/automations/{rid}/pause`、`…/resume`：只改状态（不整体替换定义、不接过所有权、到期时间不动），`?dryRun=true` 只说会怎样；到期的不能恢复。界面的 Pause / Resume 用它们。
- 预演对象集超过 100,000 个对象（新增 / 修改 / 移出要记成员的上限）时直接 422，不再等到保存时才失败。
- 样板 `developer/apps/dingtalk`：钉钉用户、钉钉群两个对象类型和「登记钉钉用户 / 登记钉钉群」两个 Action；`tools/recipients-from-automations.ts` 把现有 automation 里写死的收件人收集成登记参数（去重、编号稳定）。

**新建的效果只有标准的**：Notification（发给 AIDC 账号，邮件）；Action、Function 列出来，接入后可选。钉钉 / 企业微信当 Notification 的渠道、在客户箱上跑脚本（`agentScript`）是旧写法：已有的 automation 照常运行、在界面里能改能去掉，但不能再新建；发钉钉以后走 Action 效果（Action 的 side effect 调 webhook），脚本改成 Function 效果。

**变更**
- Data Connection 页不再列 automation，改为指向 Automate。

## 1.35.2 — 2026-10-01

**修复**：源查询改写器新增共享 AST 处理，将 SQL Server 的 `varchar(max)` / `nvarchar(max)` 转为 PostgreSQL `text`，保留有限长度、聚合 `MAX()`、字符串和注释。箱上改写器需按发布说明接入；不会自动修改已安装模块。

**修复**：Python Semantic 客户端的 `AIDC_SEMANTIC_CATALOG` 复用环境变量与 profile 配置优先级；切换目录路径后不再沿用上一次加载的目录。显式路径不可读时仍报错；未配置时固定读取 `/opt/aidc-semantic/state/erp-catalog.json`，避免 SDK 副本在自己的目录寻找不存在的文件。

## 1.35.1 — 2026-10-01

**文档与 CLI 帮助只写标准的构件名，不再注明出处（Owner 10-01）**：Object Type、Action、Workshop、OSDK、Media sets、Automate 这些构件名照旧；原来括号里写的出处、和外部产品的对照删掉了，句子的技术含义不变。没有接口、SDK 行为或数据结构上的变化。

**变更**
- 文档：语义、CLI、API、访问与账号、闭环、自动化、总览、样板、智能体各页，以及本页较早的版本记录。语义页的对照列改叫「标准名」；「组织、用户与组」「Ontology」「本体由智能体构建」几个标题变短，访问与账号页指向「组织、用户与组」的锚点跟着改。
- CLI 帮助：`aidc --help` 里 Ontology、Semantic 数据库、Media sets、Data Connection、Automations、Applications、组织与组几节的说明，以及 Ontology 命令的用法说明。
- 给客户智能体的 Skill（`/developer/skills/aidc-sdk/SKILL.md`）：描述与命名规则各一句。
- 新增守卫 `src/lib/public-brand.test.ts`：公开内容（`public/**`）里再写出外部产品的品牌对照，CI 会变红；没有例外（Owner 10-01：网站上不出现这个名字），首页的市场定位图与 `/pricing/compare` 的价格对比也已去掉这一家。

## 1.35.0 — 2026-10-01

**Developer Console：在网页上做应用、测试、发布到 Nexus**：Developer 负责做和测，Nexus 负责发布和使用。此前 Developer 只有 API、CLI 与一张 test 版本目录；现在登录后有一套完整的开发界面，应用可以按电脑、手机、智能体、后台四个端来做。界面只调现有接口（Creator 的会话入口、晋升接口、Key 接口），网页能做的智能体和 CLI 都能做。

**新增**
- **Developer Console**（`/developer/console` → `/developer/<公司>`，只给这家公司的 developer）：首页（应用数、在 Nexus 上、在测、7 天发布 / 打开 / 错误，四种做应用的路，最近的应用与发布记录，工具链）；**Applications**（按端筛选，Custom application 与 Semantic 里的 Workshop 模块一起列）；**New application**（新建向导：Basic information → Application type 与 device type → Resources（从公司 Ontology 里选 Object Type 与 Action）→ Review & create，第一版直接进 test 通道；另给一段「让智能体来做」的说明）；每个应用的 **Overview / Resources / API documentation / Web hosting / Metrics / MCP**；**Releases**（所有应用的发布记录）；**Tokens**（我的开发者 Key 与吊销）。
- **Web hosting 预览**：test 版本放进电脑（1440×900）/ 平板（820×1180）/ 手机（390×844）三种框里看；「发布到 Nexus」「回滚到这个版本」先给计划（从哪个版本到哪个版本）再确认。
- **清单 `deviceType`**（Workshop 的 device type）：`"mobile"` = 按手机设计；不写 = 电脑。不带默认值，存量应用的版本指纹不变。
- **Nexus 手机入口**（Mobile application launcher）：`/nexus/m` 登录后到 `/nexus/<公司>/m`，只列已发布的手机应用，大按钮、可搜索、点进去就是应用。
- `aidc app init` 加 `--device-type desktop|mobile`、`--object-type`、`--action-type`；Creator 的 `scaffold_app` 加同名参数 `deviceType`、`objectType`、`actionType`（semantic 模板绑定公司 Ontology 里真实的类型与 Action）。

**变更**
- `/developer/<公司>/ontology/proposals[/<id>]` 转到 Semantic 的提案页（`/semantic/<公司>/proposals[/<id>]`）：Ontology 的分支与提案属于 Semantic；CLI、SDK 给的 reviewUrl 照旧能用。
- 应用目录与应用页标出手机应用（目录每行「手机」、Information「设备」一行）。

## 1.34.0 — 2026-10-01

**Python 客户端照 OSDK：客户箱上的智能体自己就能用 Semantic**：Loop 迁进 Semantic 由各部门的智能体自己做（读数据、改脚本、发布看板），平台验收。为此把箱上已经在用的 `aidc_semantic.py` 收回仓库，并照 OSDK 补上对象集、聚合与 Action。写法与 JS SDK 的 `semantic.ontology()` 一一对应。

**新增**
- `aidc_semantic.ontology()`：`objects(类型).where({...})`（OSDK 的 WhereClause）、`pivot_to` / `union` / `intersect` / `subtract`、`fetch_page(page_size, order_by, select)`、`iterate()`、`fetch_one(主键)`、`aggregate({"$select", "$groupBy"})`（`exact`、`$exactWithLimit`、`$fixedWidth`、`$ranges`、`$duration`）、`count()`；`action(名).apply(参数, validate_only=…)` / `apply_batch`；`object_types()`、`action_types()`。
- `aidc_semantic.publish_loop_report(html, slug, title, …)`：整页看板发布进 Semantic（对象 `loopReport`，Action `publish-loop-report`；内容没变就不发）。
- 凭证：环境变量没有就读 `$HERMES_HOME/.env`（智能体自己的 profile；不读 `~/.env`、`./.env`）。读数据 `AIDC_API_KEY`（智能体的只读 Agent Key），发布另用受限 Key `AIDC_AGENT_KEY`。
- 仓库里的 `aidc_semantic.py` 与客户箱上运行的版本一致：`connect()`（DB-API 2.0，`source=库名` 时把原 T-SQL 改写到原表镜像、`shadow=原连接` 影子对照）、`sql()`、`objects()`。

**变更**
- Key 只发给 `https://www.ai-dc.ai`（调试可用 localhost），不跟随重定向（原来任意 `AIDC_SEMANTIC_API` 都会带 Key、会跟随 302）。

## 1.32.0 — 2026-10-01

**应用的 Auto-refresh：看着的看板实时跟着数据走（Workshop Auto-refresh）**：Loop 看板迁进 Semantic 之后，原来「每 5 分钟整页重算、整页上传」的 cron 不再需要，但页面打开着也不会自己更新。补上 Auto-refresh：应用设置里打开，打开着的页面注册它要看的对象集，Ontology 里的数据一变（上游同步、Action、数据 SDK 写入）就自己重新取数。设计：aidc-cloud `docs/semantic-applications.md` §8。

**新增**
- **Workshop Auto-refresh**：模块定义 `settings.autoRefresh: { enabled, minimumSecondsBetweenRefresh（≥ 10，照官方）, objectSets?（注册的 Object set 变量；缺省 = 当前页读到的全部类型） }`。页面右上角显示「自动刷新」；页面在后台时不刷新，后台超过 1 分钟断开，回到前台补一次。
- `GET /api/v1/workshop/modules/{module}/autoRefresh?page=&version=&after=`（text/event-stream）：`ready` → `refresh`（`{ seq, objectTypes: 变了的类型 }`，只推「要刷新」，不推对象内容）→ 约 280 秒 `reconnect`（带 `after` 续传）。没开 Auto-refresh 的应用回 409。
- **看着的页面算一直在读**：数据源是按需同步的（有人读、比 TableImport 的 `freshness.maxAgeSeconds` 旧才叫醒客户箱）。开着自动刷新的页面每 30 秒按同一条规则核一次——数据比 maxAge 旧才同步，同步带来了变化才刷新；页面关掉就不再同步（闲时为零）。对象集订阅（SDK `subscribe`）同样：订阅着就按 maxAge 同步它依赖的类型。
- **Custom widget**（Custom widgets 嵌进 Workshop）：组件 `{ type: "customWidget", widgetSet: "<应用 slug>", height }` 把本组织托管的应用（widget set）嵌进模块，显示它 production 的版本。应用照旧在沙箱里、凭应用票据按看的人的权限读本体。原样保留的 Loop 大屏用这个迁进 Semantic：页面代码不改，数据改从 Semantic 读、订阅变化实时重画。

**修复**
- 对象集 `in` 过滤带上千个值时很慢（1,000 个值 11 秒，FIX-0172）：值多时编成一次 `= ANY`，同一个查询 1 秒内。

## 1.31.0 — 2026-10-01

**组织、用户与组（Organization / User / Group，Owner 10-01）**：原来的「组织五层模型」（集团 › 公司 › 部门 › 岗位 › 场景，C-suite、≤10 个中枢部门、组织编码树、数字员工挂在部门 / 岗位上）是 AIDC 自己发明的，不是标准做法。标准的组织架构是平台预置的：组织 → 用户（带属性）→ 组（可以嵌套），访问授给组。旧的组织数据清空，按标准重做，先在 AIDC 自己的组织上试。设计与对照：aidc-cloud `docs/organizations.md`。

**新增**
- **组**：`/api/v1/admin/groups`（List / Create）、`/{groupId}`（Get / Replace / Delete）、`/getBatch`、`/search`、`/listCurrent`、`/{groupId}/groupMembers`（`transitive`、`includeExpirations`）、`/groupMembers/add | remove`、`/membershipExpirationPolicy`。成员是账号或组（嵌套、不能成环），可带到期时间；组可以规定新成员多久内到期。建组、改组、加减成员：组织管理员（本组织开发者）。
- **用户**：`/api/v1/admin/users`（List）、`/getCurrent`、`/{userId}`、`/getBatch`、`/search`、`/{userId}/groupMemberships`；主组织恰好一个（挂的公司，或最早兑换的 License），别家的 License = 访客；`multipass:` 开头的保留属性由平台从账号算出。AIDC 扩展 `PUT /{userId}/attributes`：身份源属性（`department`、`jobTitle`…），主组织的组织管理员维护。
- **组织**：`GET /api/v1/admin/organizations/{rid}`（RID = cellId）。
- **组接到访问判定上**：资源分享、Marking 成员与角色、Semantic 对象安全策略的 `group` 条件都认组（id 或组名）；用户属性进安全策略的用户属性。
- SDK：`semantic.admin.groups / group / searchGroups / currentGroups / createGroup / replaceGroup / deleteGroup / groupMembers / addGroupMembers / removeGroupMembers / groupMembershipExpirationPolicy / replaceGroupMembershipExpirationPolicy / users / user / searchUsers / groupMemberships / replaceUserAttributes / organization`。
- CLI：`aidc semantic admin groups …`、`aidc semantic admin users …`、`aidc semantic admin organization`。
- 控制台：组织 › 用户、组织 › 组（照 Platform Settings 的 Users / Groups）。
- 新错误码：`group_not_found`、`group_name_exists`、`principal_not_found`、`invalid_group_membership_expiration`、`attributes_not_editable`、`user_not_found`、`organization_not_found`。

**变更**
- 成员账号只要属于一家公司，不再需要部门；没有部门的成员在工作台看得见的智能体 = 公开的 + 授给本人或所在组的（访问判定）。还挂着旧部门的账号照旧按部门。
- 自助注册、新建智能体不再要求部门；`cell-x:dept:<部门>` 只剩旧部门的组织在用，新分享一律写组 id。

## 1.30.0 — 2026-10-01

**开发工作进 Semantic：AIDC 自己当 Semantic 的用户（Owner 10-01）**：需求、开发任务、指派、PR、智能体开发会话、文件都是 Ontology 里的对象；派任务、接受、提交验收、验收都是 Action（Action Log 记着谁在什么时候做的）；该让人知道的 Action 会发邮件，逾期和超过一天没接受的任务每天提醒；开发工作台看每个人的响应速度与交付。为此平台补上两块：Action 的通知、Automate 的 Run on all objects 与取自对象属性的收件人。设计与对照：aidc-cloud `docs/semantic-dev-work.md`。

**新增**
- **Action 的通知**（Action 的 Notification side effect）：Action 定义里的 `notifications`——收件人取自参数、对象参数的属性（对象上存的账号 ID）、执行人或固定账号；`subject` / `body` 模板写 `{{{参数}}}`、`{{{对象参数.属性}}}`、`{{{actionTriggerer}}}`，按改动之前渲染，渲染后超长截断（标题 250 字、正文 1,000 字）；`link` 指对象参数、这次新建的对象或一个 URL。所有改动提交之后每人一封，经平台唯一的外发出口（外发账 NotifyMessage，`app = action:<Action>`）。缺省有一个收件人不合格（不是本组织的人、账号停用、看不到这次引用的数据）整个 Action 不执行；`notificationSettings.renderingSettings: anyNotificationRenderingCanFail` 只发给合格的人。预演返回会发给谁与渲染后的内容。定义时校验收件人、模板引用与 link。
- **Automate · Run on all objects**：条件 `runOnAllObjects`（对象集 + 时间表 every / at / weekdays），到点对集合里现在的全部对象跑效果——「逾期」「超过一天没处理」这种因为时间过去才进集合的提醒（变化账里没有记录，Objects added 看不到）。
- **Automate · 取自对象属性的收件人与每个对象一次**：邮件通知的收件人 `{ type: "propertyBacked", property }`（触发对象上存的账号 ID 或账号邮箱）；`executionMode: { type: "perObject" }` 每个对象一封，标题也按这个对象渲染。
- **样板 `developer/apps/dev-work`**：六个 Object Type（员工、需求、开发任务、合并请求、开发会话、文件——文件本身是附件，用 1.28.0 的 Attachments）、十一个 Link Type、十八个 Action（九个带通知）、两条数据流、三个提醒（任务超过一天没接受、任务逾期、开发周报）、开发工作台（Workshop 模块：总览里每个人的响应时间与周期用 Ontology SQL 算、任务、需求、交付、会话与文件）、采集端（读 GitHub 的 PR 与智能体会话的导出，发到数据流）。

**修复**
- **date 属性的相对日期过滤在东八区早了一天**（FIX-0170）：`relativeDateRange` 把「北京的今天零点」那一刻的 UTC 日期拿去比 `date` 属性，「早于今天」实际成了「早于昨天」——逾期要晚一天才算。现在 `date` 属性比时区里的日历日，`timestamp` 属性照旧比那一刻；对象集、Automate 条件、Workshop 变量都走同一处。

## 1.29.0 — 2026-10-01

**发布车道：客户箱上的整页报表直接进 Semantic**：两家客户站点的 Loop 页面（每天上万次整页 HTML 上传、两万多次回读）是站点费用的大头。改成标准做法：报表 = 对象（`loopReport`，主键 slug），整页 HTML = 它的媒体引用属性（背后是公司自己 S3 里的「Loop reports」媒体集，同路径覆盖、有版本历史），发布 = 执行一个 Action；字节从箱子直传 S3，不经过平台，内容没变就不发，发完不回读。设计：aidc-cloud `docs/semantic-media.md` §11。

**新增**
- **受限 Agent Key**（Developer Console 的 application restrictions）：签发时带 `restrictions: { operations: ["api:use-ontologies-read", "api:use-ontologies-write"], objectTypes, actionTypes }`。只能读列出的类型、往它们的媒体属性直传、执行列出的 Action；别的 Semantic 接口一律 403，聊天网关、文件、设备、成员认领都不认它；没有媒体集角色（经本体的属性读写）。原来的 Agent Key 不变（只读）。
- **属性上传的直传会话**（Upload Media Content 的直传形态，AIDC 补充）：`POST /api/v1/ontologies/{o}/objectTypes/{t}/media/{p}/uploads` → 按预签名 URL 直传 → `…/uploads/{id}/complete`（带分片清单）拿 MediaReference（`DELETE …/uploads/{id}` 取消）。一律分片上传（哪怕一片），完成后 URL 作废；重试已成功的完成原样返回同一个引用。受限 Key 单项最大 64 MiB，只能上传整页 HTML 与图片、PDF、音视频这类不会执行的类型。
- SDK：`client.uploadMediaContent(类型, 属性, 文件, { mediaItemPath, contentType })`。CLI：`aidc semantic upload-media <类型> <属性> <文件>`。
- 箱上发布脚本 `developer/semantic-agent/publish_loop_report.py`（Python 标准库）：Key 只从环境变量或 `$HERMES_HOME/.env` 读、只发给 www.ai-dc.ai；内容按 sha256 去重（24 小时向服务端核对一次）；同一 slug 加锁；429 / 5xx 退避重试；输出与旧 helper 兼容。
- Object View：PROMINENT 的整页 HTML 媒体属性放进沙箱 iframe 显示（不带 allow-same-origin）；`?embedded=true` 全屏（链接、电视大屏用）；`/semantic/<组织>/…` 的深链先登录再回到原页。

**变更**
- Action 提交时，对象改引用与媒体项转 LIVE、附件关联在同一个写库事务里（之前在提交之后另做一步：并发或重试时对象可能指向一个被覆盖的版本）。引用这个属性媒体集里一个被覆盖的旧版本 = 回滚：拷成同路径的新版本。自己上传的媒体项总能被自己引用（重试同一个请求）。
- 同一个直传会话被并发完成两次，只有一个成功（之前第二个会 500）。
- 读内容：UTF-8 的 `text/*` 补 `charset=utf-8`（文件自己声明了别的字符集就不补）；浏览器在地址栏直接打开会执行的类型（白名单以外的一律算：HTML、SVG、各种 XML、脚本、没见过的类型）时，不在存储的源上顶层运行（本体属性去 Object View 全屏视图，媒体集接口按附件下载）；302 带 `Vary: Sec-Fetch-Dest`。
- 同一次提交里同一个源媒体项被引用多次只拷一份；临时媒体拷贝失败时还给调用方。直传会话多了 COMPLETING 状态（函数中途被杀的由清理任务收掉）；清理时 S3 没删成的键不标 PURGED、下轮再删。
- 上传时声明的类型只看 type/subtype（`text/html; charset=utf-8` 不再被当成 `application/octet-stream`）；没声明时按扩展名猜。
- 清理任务按公司批量删（一次最多 1,000 个键），PURGED 30 天后、结束的直传会话 7 天后连记录一起删；Agent Key 的 lastUsedAt 最多 5 分钟写一次。

**待 Owner 拍板**：直传会话这一类补充接口（docs/semantic-media.md §10 第 1 项扩到属性上传）；受限 Key 的签发与每个 box profile 一把的做法；报表对象类型与 Action 的名字（loopReport / publish-loop-report，经提案由人合并）。

## 1.28.0 — 2026-10-01

**非结构化数据：Media sets 与 Attachments**：Owner 要 Semantic 除了结构化数据，也管文件、图片、文档、音视频，文件放在客户自己的存储里、智能体读得到，设计用标准的媒体集与附件、存储用 S3。补上这一块：字节在这家公司自己的 S3 桶里，Semantic 只存元数据和媒体引用。设计与对照：aidc-cloud `docs/semantic-media.md`。

**新增**
- **Media sets**（MediaSetsV2）：schema（IMAGERY / DOCUMENT / AUDIO / VIDEO / SPREADSHEET / EMAIL / DICOM / MULTIMODAL…）、additional input formats、transactionless / transactional（一个分支一个事务、提交后可读、放弃全删、一个事务最多 10,000 项）、同路径覆盖与版本历史、软删、保留策略（缩短立即生效）、虚拟媒体集（登记公司存储里已有的文件，不拷贝）。按文件头认格式；第一次读时抽类型化元数据（尺寸、页数、时长、表名、邮件头）。API `/api/v1/mediasets/**`（Get Media Set、Put / Register / Info / Read / Metadata / Reference / Clear、Transactions、Transform、Upload Media）。
- **本体里的媒体**：媒体引用属性配 media source（定义的 `datasources` 里 `{ type: "media", mediaSourceRids, properties }`，对外报 `mediaSetView`）；Attachment 属性（单值 / 多值）；Action 参数用临时上传的媒体和附件，提交成功后才进属性的 Upload destination / 关联到对象；附件一小时内要用上、一生最多关联 10 个对象、最大 200MB。API：Upload Attachment、Get Attachment（Content）、List Property Attachments、Get Attachment Property（By Rid / Content）、Read Media Content、Get Media Metadata、Upload Media Content。
- **访问**：媒体集是统一访问模型里的资源（`ri.mio.aidc.media-set.<uuid>`），沿 Ontology 继承、可分享；把媒体集加进本体 = 访问控制交给本体（看得见对象属性就能读它的媒体）；Agent Key 只读。
- **智能体读文件**：`documentToText · extractAllText`（PDF 全文、TXT）。
- **大文件**：直传会话（预签名 URL，16 MiB 分片），单项最大 50 GB；读内容 302 到预签名 S3 地址，字节不经过平台。
- **/semantic 界面**：Media sets 列表与详情（上传、拖拽、预览、Metadata、Version history、Extract text、删除、保留策略、分享、虚拟同步）；Object View 直接预览媒体引用属性，附件可下载。
- SDK：`semantic.mediaSets.create / list / get / update / remove / upload / uploadLarge / register / sync / items / getRidByPath / info / metadata / reference / read / readOriginal / clear / transactions / transform / extractText / uploadMedia`；`client.media(类型, 主键, 属性).fetchMetadata() / fetchContents()`、`client.attachments(…)`、`client.uploadMedia(…)`、`client.uploadAttachment(…)`（照 OSDK）；请求可带文件字节（`body`），204 返回 undefined。
- CLI：`aidc semantic media-sets list | show | create | items | upload | sync | metadata | download | text | clear | retention | transaction`。
- 新错误码：`media_set_not_found`、`media_item_not_found`、`invalid_media_item_schema`、`missing_media_item_path`、`media_item_path_invalid`、`media_item_rid_already_exists`、`media_set_open_transaction_already_exists`、`conflicting_media_set_identifiers`、`transformation_unavailable`、`transformation_not_found`、`transformation_input_too_large`、`transformed_media_item_not_found`、`attachment_not_found`、`attachment_size_exceeded_limit`、`media_upload_destination_not_configured`。

**待 Owner 拍板**（docs/semantic-media.md §10）：补的 REST 接口（建 / 列 / 改 / 删媒体集、列媒体项）、大文件直传会话、302 读内容、Upload destination = 第一个 media source；虚拟媒体集的下一步源；下一批变换。

## 1.27.0 — 2026-10-01

**Applications：日历区间用 Date / Timestamp 变量（照 Workshop 的 Variable transformation）**：生产核对时发现，用 `relativeDateRange` 写的「当月」「本年度」「上月」只在月初碰巧对——官方语义是「相对今天前后几天 / 几个月」，不对齐日历。

**新增**
- Date / Timestamp 变量：`transformation: { startOf: day | week | month | quarter | year, offset, timeZoneId }`（周一起；按时区取零点）。
- 对象集过滤绑定变量：值写 `"{{变量}}"`，可加格式 `:date`（YYYY-MM-DD）/ `:month`（YYYY-MM）/ `:year` / `:timestamp`（UTC 时刻）；保存时校验绑定的变量存在且是 Date / Timestamp。
- SQL query 变量的参数也能绑 Date / Timestamp 变量。

## 1.26.0 — 2026-10-01

**Applications：用 Workshop 在 Semantic 上建应用（Owner 10-01）**：看板、报表不再写成一份 HTML 整页上传到客户站点——在 Semantic 里建一个 Application（Workshop 模块），只存定义（页面、分区、组件、变量），数据每次打开时按看的人的权限从 Ontology 现算，没人打开就不计算、不同步、不叫醒客户箱。设计与对照：aidc-cloud `docs/semantic-applications.md`。

**新增**
- **Workshop 模块**：Header、Pages、Sections（columns / rows / flow / loop，Flex 比例）；组件 Metric Card、Object Table（翻页、点行进 Object View）、Chart: XY（柱 / 横向柱 / 折线，Segment by，按时区分桶）、Chart: Pie、Pivot Table（行 × 列、合计）、Filter List（输出 Object set filter，状态在 URL）、Markdown、Data Freshness、Object Set Title；变量 Object set（REST API v2 的 ObjectSet，可套筛选）、Numeric（Object set aggregation / SQL query / Static）、String、Object set filter、Struct array（SQL query：对象集绑成表、变量绑成参数，走 Ontology SQL，< 10,000 行），Loop layout 遍历 Struct array。
- **只算当前页**（lazy variable loading）；读前按数据源新鲜度按需同步（「立即同步」最多等 20 秒）；一个组件出错只影响它自己；读不到的类型组件显示无权限。
- **版本与发布**：保存 = 新版本（只增）；用户看到发布的版本；智能体可以保存版本，**发布只能由人**（作者是智能体的版本要在网页上发布）。
- API：`GET|POST /api/v1/workshop/modules?ontology=`（`?dryRun=true` 只校验）、`GET|DELETE /api/v1/workshop/modules/{rid}`、`GET …/versions`、`POST …/versions/{n}/publish`、`POST …/evaluate`（智能体用应用：每个组件一份数据）。
- CLI：`aidc semantic applications list | save [--dry-run] [--publish] [--as-agent] | show | versions | publish | evaluate`。
- 页面：`/semantic/<组织>/applications`（侧栏新增 Applications）。
- 新错误码：`workshop_module_not_found`、`workshop_version_not_found`。
- 聚合按时间分桶可按时区（内部参数；REST API 照官方仍按 UTC）。

## 1.25.0 — 2026-10-01

**Vercel 与 Supabase 的资源进了 Semantic：静态 + 动态 + 可省判定（Owner 10-01）**：以前 Semantic 里只有这两家的账单（`cloud.account` / `cloud.cost`，只有金额）。现在有哪些项目 / 库、什么规格、在做什么、能不能省钱，也是对象。设计：aidc-cloud `docs/semantic-cloud-resources.md`。

**新增**
- **样板 `developer/apps/cloud-resources`**：Object Type `vercelTeam` / `vercelProject` / `supabaseOrg` / `supabaseProject`（每个对象三层：静态、动态、判定），Interface `CloudSavingTarget`（三个类型实现它，一个查询看全部「每月可省多少」，AWS 以后实现同一个），四个 Link Type（团队 / 组织 → 项目；到 `cloud.account` 的 billing，本月实账沿链接读），两个只写语义层的 Action（`set-vercel-project-policy` / `set-supabase-project-policy`：负责人、用途、重要程度、先留着到哪天），四条数据流，边缘采集端（一次跑完，把每个资源的判定打印出来）。
- **判定是派生的、证据不够只到「待核实」**：`verdict`（ok / watch / verify / reduce / retire）、`savingKind`、`savingUsd`（每月可省的**上限**，口径写在 `savingBasis`）、`reasons`（带数字的依据）、`blockers`。Vercel：预览构建占大头、Fluid 内存占大头（长连接特征）、回源流量、闲置项目；Supabase：库放得进更小的规格（差额按组织账单算，已扣自带的 $10 额度）、内存吃紧、连接快满、付费套餐却没有项目在跑。没有 CPU 指标就不说「可省」。
- **动态层不多调 API**：Vercel 项目的用量（构建、Fluid 内存、回源流量、函数调用）从团队账单明细里派生——就是云账单采集每天已经取的那批行；Supabase 用管理 API 的 `analytics` 与库里三条固定的只读查询（`read_only: true`，只碰系统视图与 `auth.users` 的个数，不读业务表）。时序属性：`costSeries`（每日费用）、`apiRequestsSeries`、`dbSizeSeries`（逐日累积）。
- **云端采集接在每天一次的云账单采集后面**（`cloud-resources.collect.ts`），也随「立即同步」（`aidc semantic datasource sync`）在后台跑一次；不新增 cron、不轮询、不挂连接；没声明那四条流、没有令牌就什么也不做；一个团队 / 组织取不到就沿用上次的行，不让 mirror 当成消失。
- 测试：纯函数（`cloud-resources.normalize.test.ts`，形状取自真实盘点）、定义自检（引用闭合；流字段 = 属性映射 = 采集端的行）、带库的采集（只发只读请求；沿用上次的事务累计；失败的团队沿用旧行）、端到端流程（定义 → 灌流 → 对象 / 派生实账 / 时序 / 链接 / Interface 汇总 / Action 写回不被同步冲掉；`CLOUD_RESOURCES_EVENTS_DIR` 可改灌真实取数）。


## 1.24.0 — 2026-09-30

**数据安全：Markings + 对象 / 属性安全策略**：财务、薪资、采购价、技术配方这类数据也要进 Semantic，但要管住谁能看。补上这一块：Markings 管「这类数据只有谁能碰」，对象安全策略管行，属性安全策略管列，所有读写路径统一按读的人判定。设计与对照：aidc-cloud `docs/semantic-security.md`。

**新增**
- **Markings**（AdminV2 / FilesystemV2）：类别（CONJUNCTIVE / DISJUNCTIVE，Visible / Hidden）、Marking、成员（人或组，组里新来的人自动是成员）、角色 ADMINISTER / DECLASSIFY / USE；建了不能删。挂在 Ontology、Object Type、数据流、TableImport 上：满足全部才看得见，不看角色（Owner、开发者也一样），只限制、不授予，沿层级（Object Type ← Ontology）和数据依赖（数据流 / TableImport → 用它的类型的对象）传播。API `/api/v1/admin/markingCategories`、`/api/v1/admin/markings/**`、`/api/v1/admin/users/{userId}/getMarkings`、`/api/v1/filesystem/resources/{rid}/markings | addMarkings | removeMarkings`。
- **对象安全策略、属性安全策略、`marking` 类型的属性**（Object / Property security policies、mandatory control property）：写在 Object Type 定义里（`objectSecurityPolicy`、`propertySecurityGroups`、`dataSecurity.markingConstraint`）；条件支持 and / or / not、组、用户属性、属性比较（EQUAL / INTERSECTS / SUBSET_OF / SUPERSET_OF）、行上的 Marking、常量 Marking；照官方上限（10 个比较、权重 10,000、不能对组或 Marking 成员取反）。看不见的行不出现，看不见的属性读到 null，也不能拿来筛选、排序、聚合。
- **所有读写路径按读的人判定**：Ontology API（对象、对象集、聚合、计数、链接、时序）、对象集订阅（离开只通知原来看得见的人）、编辑历史、旧数据 API、/semantic 页面、自动化、工作流。Action 照官方四条：能新建自己看不见的对象；改属性要看得见它现在的值；删要看得见整个对象；链接两端都要看得见；Action Log 类型带着被改类型的全部 Marking。自动化按拥有者的权限，邮件通知按每个收件人过滤。Ontology SQL 不含受保护的类型。
- **改安全策略要有权限**（OMS 的规则）：改的人要满足改前改后涉及的全部 Marking，新加要 USE，去掉或停止继承要 DECLASSIFY + USE；智能体在分支上改、开提案，带安全改动的 task 在审核页标出来，由满足条件的人批准、合并。定义的 `--dry-run` 自测时权限不够照样给出结果，「要谁来批」写在 warnings 里。
- **试策略**：`POST /api/v1/ontologies/{ns}/objectTypes/{type}/security/test`（照 Ontology Manager 的 Test security policies；只给开发者，结果不带属性值）；读对象带 `loadPropertySecurities`（官方）拿属性的安全标记。
- SDK：`semantic.admin.markingCategories / createMarkingCategory / markings / createMarking / markingMembers / addMarkingMembers / markingRoleAssignments / addMarkingRoleAssignments / userMarkings …`、`semantic.filesystem.resourceMarkings / addMarkings / removeMarkings`、`client.testSecurity(类型, {…})`、`fetchPage({ $loadPropertySecurityMetadata: true })`（照 OSDK）。
- CLI：`aidc semantic admin marking-categories …`、`aidc semantic admin markings …`（成员、角色、`mine`）、`aidc semantic filesystem markings | mark | unmark <rid>`、`aidc semantic security test <类型>`。
- 新错误码：`marking_not_found`、`marking_category_not_found`、`marking_name_exists`、`last_admin_protected`（至少要留一个 ADMINISTER）。

**修复**
- **分支预览（`--branch`）能放宽读权限**（FIX-0162）：以前按分支上的定义判读权限，分支把部门级类型改成全公司、或放宽安全策略，预览就能读到 main 上读不到的数据。现在 main 上已有的类型按 main 与分支里更严的那份判定。

**待 Owner 拍板**（docs/semantic-security.md §8）：开发者与平台员工也受 Markings 约束；Ontology SQL 暂不含受保护类型；Action Log 取最严；服务用户；文件与数字员工的 Markings；平台后台只读 SQL 不走受保护视图。

## 1.23.1 — 2026-09-30

**修复**
- **定义列表（`aidc semantic types` / `GET /api/v1/developer/semantic/{ns}/types`）里用 `rules` 写的 Action 看不到规则、提交条件与 writeback webhook**（FIX-0159）：AWS 本体上生产后核对「关机」Action 时发现，列表只给旧写法的几项（`operation` 还缺省成 `modify`），护栏看起来像丢了（库里其实完整）。现在原样带出 `rules`、`submissionCriteria`、`webhooks`、`actionLog`、`toolDescription`，没有 operation 的报 `rules`。

## 1.23.0 — 2026-09-30

**Action 能真的改源系统了：writeback webhook；AIDC 的 AWS 服务器进了 Semantic（Owner 09-30）**：Owner 要在 AIDC 的 Semantic Ontology 里给 AWS 服务器建模，用 Semantic SDK 开发、边用边修，并把 Action 设好、实测能不能真的自动关机。设计与对照：aidc-cloud `docs/semantic-aws.md`。

**新增**
- **Action 的 writeback webhook**（Action 调 Data Connection 的 webhook）：定义里 `schema.webhooks.writeback: { webhook: "<数据源>/<名字>", inputs: { 输入: 取值表达式 } }`。校验通过之后、规则之前调用源系统；失败（源系统拒绝 / 超时 / 限流）整个 Action 不生效、语义层一条都不改，返回 `webhook_failed`（新错误码）；输出在规则里用 `$writeback.<输出>`；事件留痕里有 webhook 的输入、输出与耗时。只校验与预演不调用；有 writeback 的 Action 不收 applyBatch。定义时校验 webhook、必填输入、输出引用与数据源可用性（分支合并多一项 merge check `webhooks`）。
- **AIDC 平台的 AWS 数据源**（Data Connection · Source `aws`，只给 AIDC 组织）：只读同步 EC2 实例、EBS 卷、账号汇总到数据流 `aws-instances` / `aws-volumes` / `aws-accounts`（每小时一次、点「立即同步」、webhook 成功之后）；webhook `aws/ec2-stop-instances`（已经停了就不调用；同步之后重启过就不关）、`aws/ec2-start-instances`、`aws/ec2-set-tag`（只改 `aidc:` 开头的标签）。
- **样板 `developer/apps/aws-servers`**：本体 `awsAccount` / `ec2Instance` / `ebsVolume`（Value Type `ec2InstanceState`，派生属性沿链接读 Cost Explorer 实账）、四个 Action（关机、开机、设置自动关机、到时自动关机）、自动关机工作流 `aws-auto-stop`（实例一变就判断，到时执行 Action，再发通知）、边缘采集端。
- **CLI `aidc semantic datasource sync`**：平台数据源立即同步（与 /semantic 的「立即同步」同一个接口）；SDK `data.sync.platform()`。

**修复**
- **标准写法的 Action / Object Type 在工作流与应用 API 里调不到**（FIX-0158）：能力引用与应用 API 名收 camelCase / kebab-case（`aws-auto-stop/auto-stop-ec2-instance`、`…/apis/ec2Instance/execute`）。
- **只有清单的应用部署不了**（FIX-0158）：没有界面、能力与工作流都写在清单里的纯自动化应用不再被当成空包。
- **定义里拼错的字段被悄悄丢掉**：比如把 `submissionCriteria` 写成 `submissionCriterias`，以前照样定义成功、Action 却没了提交条件；现在直接拒收并给出路径（`schema.submissionCriterias`）。样板 `quote-demo` 三列一直写成 `description` 的说明改为 `comment`。
- **CLI 的输出接管道时在 64 KiB 处被截断**（`aidc semantic object-types | jq` 拿到半截 JSON）：退出前等输出写完。
- 定义时多一条设计提醒：Action 的规则改了从数据源同步来的属性（语义层的改动会一直盖住之后同步来的值；改源系统用 writeback webhook）。

## 1.22.0 — 2026-09-30

**自提升并进自进化，一个 SDK，名字叫自进化（`evolve`）**：自提升（`improve`，证据 → 提案）与自进化（`evolve`，用户在应用里直接改）本来就是同一件事的两半——界面改不了的改动就是一条应用类提案，用户在应用里做过的改进就是证据；文档里还专门写着一张「分工」表。现在是一个 SDK、一页文档、一个命令组。SDK 从十个变成九个（界面、视觉、语音、视频、模型、建模、语义、自进化、发布）。

**新增**
- 浏览器 SDK `evolve` 多了证据与提案那一半：`evidence` / `suggest` / `propose` / `proposals` / `decideProposal` / `apply`（应用里的改进的 `decide` 不变——`decide` 管应用里的改进，`decideProposal` 管提案）。
- CLI `aidc evolve` 多了 `evidence` / `suggest` / `proposals` / `propose --spec` / `accept` / `reject` / `apply`；`propose`、`reject` 两边都有：带 `<slug> <id>` 两个参数的是应用里的改进，其余是提案。
- API：提案那一半在 `/api/v1/developer/evolve/{命名空间}/evidence | suggest | proposals[/{id}[/apply]]`；应用里的改进挪到 `/api/v1/developer/evolve/{命名空间}/apps/{slug}/overlay | compile | improvements[/{id}]`——多的 `apps/` 一段让它们不会和名叫 `proposals` / `evidence` / `suggest` 的应用撞路径。
- OpenAPI 契约多了 `deprecated`：旧路径在 `openapi.json` 里标成已弃用，摘要里写着新路径。

**变更**
- `APP_SDKS` / `SDK_NAMES` 去掉 `improve`；`improve` 进 `LEGACY_EVOLVE_SDKS`，和 1.20.0 并进 Semantic 的六个旧名走同一套：清单 `sdk` 照收、解析时归一成 `evolve`，部署分析把 `import { improve }` 算作用了 `evolve`，登记表读存量版本时归一，显示「自提升 → 自进化」。
- 文档：`/developer/docs/evolve` 是合并后的一页（两半 + 旧名一节），`/developer/docs/improve` 永久重定向到它；总览、Skill、`llms.txt`、官网 /developer、Academy（四语）都改成九个 SDK。
- 服务端 `developer-improve.ts` 改名 `developer-proposals.ts`（`ImprovementProposal` / `AppImprovement` 两张表不动，没有迁移）。

**兼容（v1 不破坏）**
- `import { improve } from "/developer/sdk/v1/aidc.js"` 照旧：`improve.evidence / suggest / propose / proposals / apply` 就是 `evolve` 的同名函数，`improve.decide(id, "accept" | "reject")` 就是 `evolve.decideProposal(…)`。
- `aidc improve …` 照旧能用（子命令不变），stderr 提示改用 `aidc evolve …`，stdout 的 JSON 不受影响。
- `/api/v1/developer/improve/{命名空间}/…` 与 1.12–1.20 的 `/api/v1/developer/evolve/{命名空间}/{slug}/…` 原样转发到新路由，响应带 `Deprecation` 与指向新路径的 `Link`。
- 清单 `"sdk": ["improve"]` 照收；库里存量版本清单里的 `improve` 读出来当 `evolve`（入口页照样内联覆盖层）。

## 1.21.0 — 2026-09-30

**Semantic Data Connection 与 Automate：客户箱上的定时任务换成「ERP 只被读一次 + 数据一变 / 到点才做事」**（ConnectivityV2 / Orchestration / Automate，`docs/semantic-data-connection.md`）。

**新增**
- **Connection / TableImport / Build**（`/api/v1/connectivity/**`、`/api/v1/orchestration/builds/**`；`aidc semantic connectivity …`）：Connection 只写主机、端口、库名与客户箱上的凭证名（口令永不离开客户箱）；TableImport = 一条只读查询（SELECT / WITH，SNAPSHOT 窗口或 APPEND 增量）→ 一个 dataset。执行时云端经 AWS SSM 叫醒客户箱上的 agent（不常驻、不轮询），agent 与本机上次的行哈希比，只回传变了的行。
- **dataset 数据源**：Object Type 定义的 `datasources` 多一种 `{ "type": "dataset", "dataset": "<TableImport>", "propertyMapping": {…}, "mode": "mirror" }`（与 `stream` 并列；改它 = 改本体）。还被定义用着的 TableImport 删不掉（409）。
- **自动连接**：读由 TableImport 供数的类型（Ontology API、对象集、Ontology SQL）时，比 `freshness.maxAgeSeconds` 旧就按需同步一次；`?fresh=true` / SQL 的 `fresh: true` 等结果。没人读 = 不同步 = 不花钱。
- **Automations**（`/api/v1/automate/automations/**`；`aidc semantic automations …`）：条件 = Objects added / modified / removed（对象集，同步带来变化后评估）或时间条件（北京时间）；效果 = 通知（钉钉 / 企业微信经客户箱上对应数字员工的凭证发出；AIDC 账号发邮件；静默时段顺延）、Loop 脚本（`agentScript`）；`replaces` 记下替掉了哪些 cron；`expiresAt` 到期自动停（Automation expiration，最长 6 个月）。
- **Python 客户端 `aidc_semantic`**（随 agent 装在客户箱）：Loop 脚本用 `sql()` / `objects()` 从 Semantic 读，由 Automate 运行时自带一次性只读令牌。
- `/semantic/<组织>/connections`：agent、Connection、TableImport（新鲜度、上次执行、行数）、Automation（替掉的 cron、每天原来跑多少次）、最近的执行；开发者可立即执行。

## 1.20.3 — 2026-09-30

**Demo Company 的示例数据里，连虚构的「客户」也不再用像真实公司的名字（Owner 09-30）**：6 家示例客户改称 **Demo Customer A–F**，联系人改称 Contact A–E，智能体名跟着改（如「小采·A」），ID 随之改为 `cell-demo-a … f`、`demo-a-purchasing` 这样的形式。接口、SDK 行为与数据结构不变。

**变更**
- 示例种子数据（`developer/apps/ontology-demo-data`）、样板应用、文档与 Academy 里的命令示例同步；用到旧 ID 的地方（`aidc semantic apply adjust-seats --param customer=…`）改为 `cell-demo-a`。
- 生产里 Demo Company 已有的数据由迁移 `20260930030000_demo_customers_anonymous` 改名（只动 `cell-demo` 命名空间：语义层对象、变化账、Action 留痕；一一对应、不撞主键、重跑不改任何东西）。迁移在生产数据快照上验证过：结果与新种子数据逐字段一致。

## 1.20.2 — 2026-09-30

**修复**
- **还被 Object Type 用作数据源的数据流删不掉了**（FIX-0157）：原来删流会把同步进度一起删掉，定义里却留下接不上的数据源，之后重新定义这个类型被「流不存在」拒收。现在 `aidc stream delete`（`aidc semantic streams delete`）/ `DELETE /api/v1/developer/streams/{namespace}/{name}` 回 409 `stream_in_use`，列出在用的类型（dry-run 同样判）：先从定义里去掉数据源（改本体），再删流。

**文档**
- 「闭环」按 Semantic 重写：数据流 → Ontology → 数据源（写在定义里）→ 应用（对象集、订阅、Action）→ 访问 → 留痕 → 自提升 → 自动化。
- 智能体（`model.agent`）的说明搬到[模型 SDK](model.md)页；[API 参考](api.md)按 Semantic 分组，补上 Ontology、对象集订阅、数据流、Ontology SQL、访问（Filesystem）的端点；其他页面里指向连接 / 数据 / 权限 / 工作流 / 日志 / 账单 SDK 的链接改成 Semantic 的对应部分。
- 样板 `cloud-costs`：两个类型的数据源写进定义（与生产一致），部署步骤改成先建流、再定义。

## 1.20.1 — 2026-09-30

**对外公开的文档、示例、CLI 帮助、安装脚本与官网页面不再出现任何真实客户名（Owner 09-30）**：需要一家公司时只用 **Demo Company**；需要占位名时用中性的（`old-portal`、`example.com`、`ACME`）。没有接口、SDK 行为或数据结构上的变化。

**变更**
- 文档与示例：权限 SDK「导入成员」的示例来源与邮箱、闭环 / 语义 / 数据 / 日志 / 自提升 / 自进化文档里的示例应用（`production-live`）、数据流（`production-progress`）、工单与线体号，全部换成中性示例；应用卡片与工作流示例里的智能体团队名改为「营业智能体-报价」这类叫法。更新记录里的现场实测记录改称「某客户」。
- CLI 帮助：`aidc members import` 的来源名、`aidc stream` 发布端 `--label` 的示例文字改为中性说法。
- 官网 Harness 页、安装脚本（`install.sh` / `install.ps1`）与 `/pair` 输入框：示例公司码改为占位 `ACME`（不存在的公司码，照抄也不会绑到任何真实公司），与 Academy 的 Harness 课一致。
- 示例公司 `cell-demo` 的对外名字改为 **Demo Company**（中英文一致）：迁移 `20260930010000_demo_company_name` 只改显示名与 /semantic/public 目录里的资源名，数据与访问档位不变。Semantic · Ontology 示例应用只对登录的 AIDC 账号开放，清单里的 `auth.publicLink` 由 `open` 改为 `signin`（与 1.17.0 起的实际行为一致），不对互联网匿名开放。
- 新增守卫 `src/lib/public-names.test.ts`：公开文档、官网页面、安装脚本、CLI 与 SDK 产物里再出现客户名，CI 会变红。

## 1.20.0 — 2026-09-30

**Developer SDK 以 Semantic 为核心（Owner 09-30）**：Semantic 是 AIDC 的数据平台——数据从哪来、对象与 Action、谁能看、变了自动做什么、日志与用量都在 `semantic` 里。原来并列的**连接、数据、权限、工作流、日志、账单**六个 SDK 并进 Semantic，**SDK 从十六个变成十个**：界面、视觉、语音、视频、模型、建模、语义、自提升、自进化、发布。旧名照样能用（见「兼容」）。设计：aidc-cloud `docs/semantic-sdk.md`。

**新增**
- **数据源是 Object Type 定义的一部分**（Ontology Manager 的 Datasources 页）：定义里的 `schema.datasources: [{ type: "stream", stream, propertyMapping: { 属性: 列 }, mode: "mirror" | "upsert" }]`。定义时校验（流存在、列在流里、主键要映射、`writeback` / 派生属性不映射）；重新定义时没写 `datasources` 沿用现有的（去掉全部写 `[]`）；改数据源 = 改本体（智能体在分支上改、开提案，提案的 merge checks 多一项 `datasources`）；定义落了之后按定义建 / 改 / 删同步并全量同步一次。迁移 `20260930020000_object_type_datasources` 把已有的同步绑定写进对应类型的定义。CLI `aidc semantic datasource list | set | remove | resync`。
- **对象集订阅**（照 OSDK `objectSet.subscribe`）：`semantic.ontology().objects(t).where(…).subscribe({ onChange({ object, state }), onSuccessfulSubscription, onOutOfDate, onError }, { properties })`，`state` = `ADDED_OR_UPDATED` / `REMOVED`；断线带序号续传、页面隐藏 1 分钟断开、刚连上就断按失败退避。`POST /api/v1/ontologySubscriptions/ontologies/{ns}/streamSubscriptions`（SSE；消息 `subscribeResponses`、`objectSetChanged`、`refreshObjectSet`、`subscriptionClosed` 照官方）。CLI `aidc semantic subscribe <类型> [--where …]`。
- **Semantic 的子模块**（名字照 Platform SDK 的命名空间）：`semantic.stream()` / `semantic.streams`（Data Connection · Streams：`list`、`create`、`remove`、`issueKey`、`keys`、`revokeKey`）、`semantic.filesystem`（访问与应用分享）、`semantic.admin`（`getCurrentUser`、`viewer`、`signIn`、`can`、`members`、`importMembers`）、`semantic.automate`（工作流）、`semantic.observability`（应用日志）、`semantic.usage`（用量与账单）。智能体的客户端 `connect.agent` 搬到 `model.agent`。
- **CLI `aidc semantic <子命令>`**：`streams`、`datasource`、`subscribe`、`filesystem`、`admin`、`automate`、`observability`、`usage`；`aidc help` 按 Semantic 重排。
- **AIDC 平台对象类型**：`aidcApplication`、`aidcModelUsage`（按天 × 应用 / Key × 模型的用量台账）、`aidcAppEvent`（应用日志）、`aidcAutomationRun`（自动化运行）可以作为只读的 Object Type 进组织自己的 Ontology——本组织开发者打开 /semantic 时智能体（数据库小艾）开提案，审核合并后才出现（关掉的同一批定义不再提）；合并后、点同步、超过 1 小时有人看时按需同步；用量、日志、自动化运行只给本组织开发者（R-LEVEL group）。`POST /api/v1/ontologies/{ns}/datasources/platform/sync` 对所有组织开放（本组织开发者）。
- `aidc app init --template semantic | workflow` 生成的代码改用 `semantic.ontology()`、`subscribe`、`applyAction` 与 `semantic.automate`；清单只登记 `semantic`。

**变更**
- `SDK_NAMES` 只剩十个；清单 `sdk` 里的旧名（`data`、`connect`、`workflow`、`auth`、`log`、`billing`）照收、解析时归一成 `semantic`；部署时的静态分析把 `import { data }` 这类旧名算作用了 `semantic`。
- 工作流清单要求 `sdk` 登记 `semantic`（旧名 `workflow` 照收）。
- Ontology API 的 `datasources` 视图改读定义（带 `propertyMapping`、`mode` 与同步进度）；/semantic 的 Object Type 页的「Datasources」列出映射。
- 文档：语义 SDK 页按「Semantic 是数据平台」重写；连接、数据、权限、工作流、日志、账单六页地址不变，标题改为 Semantic 的对应部分。

**修复**
- `aidc resources …`（1.18.0 起）报「未知命令」：命令组没登记。现在 `aidc resources` 与新写法 `aidc semantic filesystem` 都能用；加了守卫（CLI 分发里的每个命令组都要登记）。
- 智能体作者经自提升 `aidc improve apply` 能把语义补丁直接写进 main（绕过分支与提案）：现在返回 409 `branch_required`，和别处一样走分支与提案。

**兼容**
- `/developer/sdk/v1/aidc.js` 照样导出 `data`、`connect`、`auth`、`log`、`billing`、`workflow`，和 `semantic.*` 是同一份实现（`auth.me === semantic.admin.getCurrentUser`、`workflow.run === semantic.automate.run`、`connect.stream === semantic.stream`…），已上线的应用不用改。
- 旧的 API 路径、CLI 命令组（`aidc data / stream / connect / resources / members / log / billing / workflow`）不变；旧的直接写对象（`data.table().create / update / remove`）只给开发者，文档不再推荐——改数据请用 Action。

## 1.19.0 — 2026-09-29

**权限系统定名并补全（Owner 09-29 定稿）**：开放程度四档 **Private / Group / Public / Open to Internet**，角色 **Owner / Editor / Viewer**，只有 Owner 能改分享。
组织是默认的边界，Group 里最常用的分享对象是「整个本组织」。1.18.0 的三档 Private / Organization / Public 改名：`organization` → `group`，数据库里的授予不变，不需要迁移。

**新增**
- **一步设档位**：`POST /api/v1/filesystem/resources/{rid}/access`（`{"tier":"private|group|public|internet"}`，Owner）；SDK `auth.setResourceAccess(rid, tier)`；CLI `aidc resources access <rid> --tier …`。
  `private` 撤掉所有分享，只剩 Owner；`group` 撤掉 Public 与 Internet，还没分享给任何人时加整个本组织 Viewer；`public` 加 Everyone Viewer；`internet` 加 Internet Viewer。
- **部门作为分享对象**：主体 `cell-<公司>:dept:<部门 ID>`；成员的部门取自账号的部门归属；分享面板里直接选部门。
- **Open to Internet**：新的授予主体 `internet`（任何人，不用登录，只读）。目前只有文件（`/s/<组织>/<slug>` 的匿名只读入口）；文件原有的 public 受众映射为这一档，行为不变；其他资源返回 422。它只管读：不登录不能调用 SDK、不能执行 Action、不能查 SQL。
- **Owner 可以有多个**：创建人是第一个，再加别人为 Owner 即「把所有权交给别人」。
- 界面：分享面板改成四档阶梯（`SharePanel`），加分享给谁的快捷项（整个本组织、开发者、各部门）、授予行上的角色下拉、Open to Internet 二次确认；Semantic 侧栏「Share」改叫「Access」。

**变更**
- **只有 Owner 能改分享**：授予、撤销、设档位、建邀请链接都要 Owner。原来的「只能授予同级或更低的角色」「扩大访问要 Owner」由这一条取代；Editor 与 Viewer 都不能改分享。
- **Public 与 Open to Internet 只能给 Viewer**（原来 Public 也允许 Discoverer）。
- **不再有 Discoverer**：角色只有 Owner / Editor / Viewer；接口不再接受 `discoverer`。
- **「共享链接」改叫「邀请链接」**（属于 Group；只给 Viewer）：`aidc resources link` 去掉 `--role`，SDK `auth.resourceLink` 去掉 `roleId`。
- `generalAccess` 的取值改为 `private | group | public | internet`；`GET /api/v1/filesystem/resources?scope=public` 也列出 Open to Internet 的资源。
- 文件的 `/s/` 读判定走统一的 `decideAccess`：授予给本组织、部门、具体账号、Public 都认；智能体自带的可见性、文件自带的受众是档位的下限，调得更窄返回 409。

## 1.18.0 — 2026-09-29

**AIDC Semantic 平台上线（www.ai-dc.ai/semantic）**：面向 AI 的企业数据平台，登录进去就是自己组织的 Ontology——图、Object Explorer、Action、SQL Console、提案审核、Share；用标准的 Ontology 构件与名字，底层是每个组织一个 Postgres schema。同时落下 AIDC Cloud 统一的 **Public / Private / Share**。

**新增**
- **Semantic 数据库（Ontology SQL）**：每个组织按需建一个 schema，每个 Object Type / 多对多 Link Type / Interface 一个只读视图（表名 = API name，列名 = 属性 API name）；两个只读登录角色（本组织 `reader`、只看 Public 类型的 `public`）；一条 SELECT、≤ 10,000 行、20 秒、位置参数、EXPLAIN。`POST /api/v1/sqlQueries/executeOntology`、`GET /api/v1/ontologies/{ns}/database`、`…/database/sync`、`…/database/credentials`（开发者轮换口令拿只读直连串）。SDK `semantic.sql()`、`semantic.database()`、`semantic.syncDatabase()`、`semantic.rotateDatabaseCredentials()`；CLI `aidc semantic sql`、`aidc semantic database [--sync | --rotate]`。
- **Public / Private / Share**（FilesystemV2 Resources / ResourceRoles）：Ontology、Object Type、数字员工、文件共用一套访问设置——一般访问 Private / Organization / Public（Everyone = 所有登录的 AIDC 账号）、角色 Owner / Editor / Viewer / Discoverer、只能授予同级或更低、扩大访问只有 Owner、Ontology → Object Type 继承、共享链接（登录后兑换）。`/api/v1/filesystem/resources[/{rid}[/roles[/add|remove]|/links]]`、`/api/v1/filesystem/links/redeem`、`/api/v1/filesystem/principals`。SDK `auth.resources()`、`auth.resourceRoles()`、`auth.addResourceRoles()` / `removeResourceRoles()`、`auth.shareResource()`、`auth.resourceLink()`；CLI `aidc resources list | show | roles | share | unshare | link`。
- **Ontology API 认网页会话**：`/api/v1/ontologies/**` 除了开发者 Key、Agent Key、应用票据，也认 /semantic 里登录的人；角色由 Public / Private / Share 决定（本组织开发者 = developer、成员 = member、别的组织按授予 editor / viewer）；会话的写要过同源守卫。
- **AIDC 自己的 Ontology**：组织、数字员工、应用、服务器、模型用量、客户跟进；公开目录（产品、方案、SDK、模型、课程，授予 Everyone）；客户成功的五个 Action。定义是代码，由智能体「数据库小艾」开分支与提案，人在 /semantic 审核合并；AIDC 平台数据源按需只读同步（合并后、开发者点同步、超过 1 小时有人看时）。`POST /api/v1/ontologies/cell-aidc/datasources/platform/sync`。
- Demo Company（`cell-demo`）的 Ontology 设为 Public（所有登录的 AIDC 账号，不含匿名）。

**变更**
- 公开文件：云盘文件在统一访问设置里授予了 Everyone / 某个账号后，经 `/s/<cell>/<slug>` 也能读（包括还没加入组织的账号）；原来的受众与指定账号不变。
- 提案审核页可以一次批准全部非破坏性的 task（仍是逐个提交审核）。

## 1.17.0 — 2026-09-29

**一律登录（Owner 定，照 Google）**：用 AIDC Developer SDK 或 AIDC 应用做任何事都要先登录 AIDC 账号，**member 起步**。文档、目录、应用页、`about.md`、Skill 原文谁都能看；每一次调用都带凭证，落到「人 · 公司 · 角色」上，计量记在这家公司名下。

**新增**
- **member 也能登录**：`aidc login`（终端账号 + 密码）、`aidc login --browser`、在 Codex / 聊天宿主里连接 AIDC 账号（OAuth）都向公司成员开放，拿到 member 的 Key（`aidc keys` 标 member）。member 能调用本公司已发布的应用（`aidc app call`、应用的 MCP），身份就是「这个人在浏览器里打开这个应用」：只到正式通道，清单 `auth.access=restricted` 的要先分享给他；能在本机开发（`app init / check / dev / export`）、看自己（`aidc whoami` 显示角色）。部署、发布、数据流 / 数据集 / 模型 / 语义层直连与管理接口仍只给 developer，member 的 Key 调这些回 403 并说明。
- SDK 找凭证照 Google ADC：`configure({ apiKey })` → 环境变量 `AIDC_API_KEY` → 本机 `aidc login` 留下的登录（Node）→ 平台注入的应用票据。

**破坏性变更**
- CLI：除 `aidc login / logout / help / --version` 外，每条命令都要先登录（没登录退出码 3）——包括只在本机跑的 `app init / check / export / dev`、`ui`、`data profile / group`、`modeling estimate`、`evolve slots`、`billing prices`、`models`。自带凭证的 `stream pipe`（发布 Key）与 `connect send`（Agent Key）照旧。
- SDK：找不到凭证不再发匿名请求，报 `not_logged_in`（401，提示 `aidc login`）；只有模型目录、价目这类公开目录接口不带凭证。
- 官方应用（`/nexus/apps/<slug>`、`/developer/apps/<slug>`）的界面要登录，且至少是一家公司的 member；说明页、`about.md`、`SKILL.md` 照旧公开。
- 公开链接（`/nexus/s/<令牌>`）要先登录：清单 `auth.publicLink` 缺省改为 `signin`，旧值 `open` 按 `signin` 执行，`members` 不变。
- 应用票据一律带访客账号；不带账号的旧票据（匿名票据）不再被接受、也不能续期——刷新页面、登录后重新拿。
- 应用的 MCP：没有凭证回 401 + `WWW-Authenticate`（宿主据此走 AIDC OAuth），官方应用也一样；登录后能读官方应用的工具与 Skills。AIDC Apps Creator 的 `scaffold_app`、`validate_app` 也要登录，`get_sdk_docs` 与 `show_creator`（登录入口）不用；`list_apps`、`deploy_app`、`publish_app` 要 developer。
- 建模 SDK：`public` 的世界也要带凭证读（没有匿名调用方了）。

**变更**
- 登录接口：`password-tokens`、`device-tokens` 返回 `role`；账号不属于任何公司时回 403「至少要是一家公司的 member」（原先是「还不是开发者」）。批准页（CLI 授权、连接 AIDC 账号）列出这个人至少是 member 的公司并标出角色。
- `GET /api/v1/developer/me`（`aidc whoami`）接受 member 的 Key，返回 `role`；member 的 `namespaces` 为空（不能发布）。`GET /api/v1/developer/keys` 每把 Key 带 `role`。

## 1.16.0 — 2026-09-29

- Apps 使用 Agent Plugins 1.0 标准包；CLI 新建、读取、检查、导出 ZIP；保留旧清单兼容。
- AIDC Apps Creator：SDK 文档、脚手架、校验、测试部署、指定版本发布与对话 UI。
- 默认 AIDC 账号登录；外部 MCP OAuth + PKCE 可选，AIDC 始终是身份与权限来源。
- MCP Apps UI、完整 Skills 资源与摘要、协议错误及工具名规范；发布权限继续走现有服务。


AIDC Developer 的 SDK、CLI 与 API 同步发版（SemVer）。版本号唯一真源：`developer/version.ts`。浏览器 SDK 的路径带大版本（`/developer/sdk/v1/`），破坏性变更才升大版本，旧版继续可用。

## 1.15.0 — 2026-09-29

**新增**
- **应用（Apps）标准**（`/developer/docs/apps`）：AIDC 的应用就是智能体时代的插件——照 OpenAI Plugin 的定义，**一组 Skills 加一组 APIs，界面可选**。智能体照 Skills 调 APIs，程序直接调 APIs，人要看和确认时才打开界面。四种形态（只有 Skills / 只有 APIs / Skills + APIs / APIs + 界面）、包结构、清单字段与 Plugin 的对应、Skill 写法与测法、上架前的检查清单。
- **Skills**：版本包根目录 `skills/<名字>/SKILL.md`（Agent Skills 格式，可附 `references/`）。部署时逐条校验：目录名、`name` 与目录一致、`description` ≤ 1024 字符（有「: 」要加引号）、正文不空、单个 ≤ 32 KB、最多 12 条；不合规整个版本拒收（`aidc app check` 本地同一份规则）。没写 Skill 的应用，平台按清单生成一条「使用这个应用」的 Skill。
- **清单**新字段 `description`（应用页「介绍」，≤ 2000 字）与 `examples`（示例说法，≤ 6 条）；`entry` 可以是 `null`——没有界面的应用只有 Skills 与 APIs，打开地址直接转到应用页。
- **应用页** `<应用地址>/about`（照 Codex Plugins 的详情页）：调用方法（示例说法点一下就复制；对智能体说 / CLI / HTTP / MCP）· 介绍（做什么、执行什么任务、输入输出、触发）· Skills & APIs（Skill 全文、API 参数与返回、依赖的能力、用到的 AIDC 能力、连接）· Information（应用卡片）。**复制给智能体**：一句「帮我用 AIDC 应用「…」：<应用地址>/about.md」，贴给 Adis、Claude Code、Codex 就能用，不用安装。
- **给智能体的说明** `<应用地址>/about.md`（公司应用要凭证：会话，或 `Authorization: Bearer` 开发者 Key）与线上版本的 Skill 原文 `<应用地址>/skills/<名字>/SKILL.md`。
- **应用目录**重做：`/nexus/apps`（AIDC 官方）、新增 `/nexus/<公司>/apps`（登录后：本公司的应用 + AIDC 官方，受限应用只给看得见的人）；每行 Skills 与 APIs 数、「复制给智能体」、打开。
- **一个调用口调应用的任何 API**：`POST /api/v1/developer/apps/{命名空间}/{slug}/apis/{名字}/execute`——显式导出、自动提取的类型查询与 Action、工作流的 `run` / `get_run` / `list_runs`；以「应用 × 调用人角色」执行，留痕记调用人；`preview` 预演写入，`x-aidc-dry-run` 只校验输入，`run` 带 `Idempotency-Key` 重放同一次运行。开发者 Key 调本公司任何应用，应用票据只能调它自己。
- `GET …/apis`（全部 API：名字、说明、输入 JSON Schema、返回、调用口、CLI；Skills；示例说法）与 `GET …/about`（说明 Markdown + 复制的那一句）。
- **每个公司应用一个 MCP 服务器** `POST …/apps/{命名空间}/{slug}/mcp`（Streamable HTTP，无状态、只回 JSON）：工具 = APIs（名字里的「.」换成「__」，写的工具带 `preview`），prompts = Skills；凭证是开发者 Key。
- CLI：`aidc app about`、`aidc app apis`、`aidc app call <应用> <API> [--param …] [--preview] [--dry-run]`；`aidc app init` 的每个模板都带一条 Skill 与示例说法，新增没有界面的 `--template skills`。
- 官方样板与 AIDC 自己的演示应用都补上了 Skills、示例说法与介绍（瑕疵检测、会议纪要、ERP 数据自动分析、世界模型、物体检测、实时监控、企业数据、报价演示六个应用、云计算费用监控）。

**变更**
- 快速开始改成做一个「只有一条 Skill 的应用」：写 Skill → 部署 → 复制给智能体试用 → 加 API 或界面 → 发布。
- 文档页右上角加「复制本页」（复制这一页的 Markdown，交给智能体）与「查看 Markdown」。

**修复**
- 09-27 以前发布的应用版本清单里没有 `cameras`（更早的还没有 `exports`），读出来按当前 schema 补默认值，应用页与 `about.md` 不再 500。

## 1.14.0 — 2026-09-29

**新增：语义层完全对齐标准 Ontology**（设计 `docs/semantic-ontology.md`，文档 [语义 SDK · Ontology](docs/semantic.md)）
- **建模语言**：语义部分（名词）Object Type、Property（全部 base types：long / decimal 编成字符串、geopoint 是 GeoJSON、struct、array、vector、timeseries…）、Derived Property（沿链接最多 3 跳）、Link Type（两端各有名字；1:N 用外键，N:M 每条链接单独存）、Interface（可继承）、Shared Property、Value Type（enum / range / length / regex… 约束，写入时校验）；动力部分（动词）Action Type（rules：createObject、modifyObject、createOrModifyObject、deleteObject、createLink、deleteLink；参数可以是对象、对象集、数组；submission criteria；Action Log）。旧写法（`object` / `link` / `enum` / `action`、`text` / `real` / `numeric`）原样可用，对外一律用标准的名字和形状。
- **API** `/api/v1/ontologies/**`（照 REST API v2）：Ontology 全貌、各类型的 List / Get、对象 List / Get / Search / Aggregate / Count、Linked Objects、Time Series、Object Set（filter、union、intersect、subtract、searchAround、interfaceBase、withProperties、nearestNeighbors…；临时对象集 24 小时）、Edits History、Apply Action（VALIDATE_ONLY / VALIDATE_AND_EXECUTE，returnEdits）与 applyBatch（最多 20 个、一个事务）。
- **SDK** `semantic.ontology()`（照 OSDK）：`objects(t).where({...}).pivotTo(link).fetchPage()`、`fetchOne`、`aggregate({ $select, $groupBy })`、`withProperties`、`interface("Billable")`、`action(a).applyAction(params, { $validateOnly, $returnEdits })`、`batchApplyAction`。
- **CLI** `aidc semantic ontology | object-types | objects | object | links | aggregate | object-set | apply | apply-batch | edits-history | branch … | proposals | proposal`。
- **本体由智能体构建**：智能体作者（Agent Key，或开发者 Key 加 `x-aidc-author: agent:<id>`；CLI 在 `AIDC_AGENT_ID` 存在时自动带上）不能直接改 main（409 `branch_required`），在分支上改（Global Branching：modify / validate / conflicts / rebase / discard / lock，读接口带 `?branch=` 预览）、开提案（Ontology proposal：按资源分 task，自动附上改动、校验、30 天影响面、破坏性改动）。批准、拒绝、合并只接受人的网页登录（`/developer/<公司>/ontology/proposals/<id>`），任何 Key 都不行；破坏性改动要输入资源名确认。分支 35 天无活动转 INACTIVE，再 7 天删除。
- **示例应用**：应用 `developer/apps/ontology-demo`，定义、示例数据与灌数脚本 `developer/apps/ontology-demo-data`，命名空间 `cell-demo`（Demo Company，数据全部虚构，不进任何真实公司）。

**修复**
- `aidc`：HTTP 422（定义不闭合、Action 参数校验不通过）的退出码从 1 改成文档写的 2（参数错误 / 校验不通过）。

**仍待补**（差距见 `docs/semantic-ontology.md` §7）：Function（需要隔离运行时）、Agent Key 执行 Action 的 restrictions、Writeback（数据源只读，默认关）、Attachment / Media / Cipher 服务、Markings 与安全策略。

## 1.13.1 — 2026-09-28

**新增**
- **给智能体的上手说明 `/developer/agent-ready.md`**（照 Fly.io 的 agent-ready 做法）：人只要把一句 `帮我接入 AIDC Developer：https://ai-dc.ai/developer/agent-ready.md` 交给 Adis 或任何能跑终端命令的智能体，它就照着装 `aidc`、按人的处境登录（人在终端前就请人自己运行 `aidc login`；否则 `aidc login --browser --no-wait` 把链接交给人批准，智能体不碰密码）、装 Skill、做出第一个应用，先给人看 Developer 预览，人同意了再发布到 Nexus。源文件 `developer/agent-ready.md`，`npm run developer:build` 原样发布；`llms.txt` 第一条指向它。
- 官网 `/developer` 首屏新增「Copy to Adis」：复制上面那句话（en / ja / de 各自的说法，链接相同）；「智能体接入」一节也列出 agent-ready.md。

**修复**
- Skill（`/developer/skills/aidc-sdk/SKILL.md`）不是合格的 Agent Skill：`description` 有 2,025 个字符（规范上限 1,024，Adis 装技能时直接拒绝），值里还有「冒号 + 空格」，按 YAML 读 frontmatter 的运行时解析失败。压缩到 877 个字符、改成合法的 YAML。新守卫 `developer/agent-ready.test.ts` 同时核对上手说明里写到的命令、旗标与地址。
- 官网 `/developer` 在手机上：不换行的安装命令把首屏撑到 587px，三个按钮右侧被裁掉。现在首屏等于屏幕宽，命令在行内横向滚动；桌面布局不变。

## 1.13.0 — 2026-09-28

**变更**
- **`aidc login` 改成在终端里输入 AIDC 账号和密码**：用户名或邮箱 + 密码（密码不回显），换一把开发者 Key 存进 `~/.aidc/config.json`（0600）。Key 只签给输入密码的这个账号——原来的浏览器批准，是浏览器里恰好登录着的那个账号替终端签发，还可以在下拉框里任选它能代表的公司。账号能代表几家公司（AIDC 平台员工）时在终端里选一家，或 `aidc login -n <cellId>` 直接指定；`--user` 预先给账号。开头打印注册入口：还没有账号，在 `https://www.ai-dc.ai/login` 点「注册」；开发公司应用还需要公司发的 developer 授权码（没有时登录会明确告诉你去哪里输入）。
- 密码核对与网页登录是同一套：同一个失败计数（连续 5 次锁 15 分钟，终端和网页互通）、同一组限流、锁定与密码错对外同一个回答；终端里输错可以再输，三次后放弃。临时密码、邮箱没验证时说明先去网页处理。
- 密码只在交互终端的提示处输入：不收命令行参数、环境变量或 stdin。stdin 不是终端（智能体、CI、管道）时 `aidc login` 立即以退出码 2 报错并说明该怎么做，绝不挂着等输入。
- 浏览器批准移到 `aidc login --browser`（`--no-wait` / `--continue` 照旧，只属于这一种），留给身边没有终端的智能体：把链接交给人批准。无人值守照旧用 `AIDC_API_KEY` 或 `aidc login --with-key`。

**新增**
- API `POST /api/v1/developer/password-tokens`：账号 + 密码（+ `cellId`）→ 开发者 Key（明文只出现在这一次响应里，形状与设备授权换 Key 相同）；支持 dry-run（只核对、返回将代表的公司）。错误码：`invalid_credentials`、`email_verification_required`、`password_change_required`、`company_required`（`details.companies` 列出可选公司）、`forbidden`（没有 developer 权限 / 不能代表指定的公司）。

## 1.12.2 — 2026-09-27

**修复**
- 视觉 SDK · 摄像头：忙的 NVR 上连得更快、更稳。某客户现场的 NVR 实测一次连接只有约 44% 能在 20 秒内拿到回应（其余连上不回话、或几秒后被关掉）。现在平台先不带凭证发 OPTIONS（不算登录尝试），3 秒没回话就错开再开一条（同时最多 3 条、总共最多 6 条），谁先回话用谁、其余立刻关掉；拿到的认证挑战只在胜出的那条上用——并发不会让 NVR 的失败登录计数变多。全都不回话时报 `camera_timeout` 并写明连了几次。
- `vision.live` 暂时故障的重连间隔封顶 30 → 15 秒。

## 1.12.1 — 2026-09-27

**修复**
- 视觉 SDK `vision.live`：摄像头暂时连不上（`camera_unreachable` / `camera_timeout` / 断流 / 满员）时，页面开着就一直自动重试（间隔封顶 30 秒），NVR 一恢复画面自己回来；原来试 6 次就停在「出错」要人点重试。页面隐藏 1 分钟照样断开，待重试也一并取消，不在后台空转。`onStatus` 多给 `attempt`（第几次重连）。
- 摄像头 TCP 建连超时 10 → 15 秒、每个 RTSP 请求等响应 12 → 20 秒：跨境链路上 SYN 丢包要等第 4 次重传（约 15 秒）；客户现场的 NVR 忙的时候建连 19 秒、OPTIONS 18 秒才回。截图接口时长上限 60 → 120 秒、探测 120 → 300 秒。
- 样板 `camera-live` 1.0.1：还没登记口令时写明「还没有登记摄像头口令」并告诉开发者去哪里填（原来显示成「摄像头拒绝了口令」）；重试中显示第几次与原因。

## 1.12.0 — 2026-09-27

**新增**
- **自进化 SDK（`evolve`，第十六个 SDK）**：应用的用户直接在应用里改进它。`evolve.mount()` 在右下角挂上「// 改进」面板：说一句「对话框变大」「隐藏侧边栏」「标题改成客服工作台」，页面马上变（预览只有自己看得到）；「只给我保留」立即对自己生效，「提交给所有人」由开发者采纳（开发者提交直接生效）；界面改不了的（加功能、改逻辑）一键交给开发者，成为自提升 SDK 的应用类提案。每一次改进是一个**改进工程**：对话、改进指令、作用范围、状态，可撤销、可审计。
- 改进落成白名单**改进指令**（`token` / `style` / `text` / `attr` / `reset`），不是代码：值走文法白名单、没有定位类属性、文字按纯文本写入；应用在页面上用 `data-evolve="名"` 标出能改的区域，在清单 `evolve` 里给它们起名字、声明带范围的可调参数（CSS 变量）。常见说法走**快速意图**（浏览器里 2 ms，不调模型），其余交给模型（缺省 DeepSeek Flash，约 1.6–2 秒，按应用计费、计入计算分钟）。
- 覆盖层由服务端**内联进入口页**（样式排在应用样式表之后，唯一槽位的文字直接写进 HTML）：打开页面首屏就是改进后的样子，不多一次请求；预览与保存后的结果由同一个折叠函数算出。
- **固化**：`aidc evolve bake` 把对所有人生效的改进写进源码（`evolve.css` + 静态 HTML 的文字 + 清单 `evolve.baked`，版本 patch +1），发新版本后这些改进不再叠加；改版去掉的槽位上的改进自动失效、不报错。每应用叠加的全员改进上限 40、每人个人改进 20。
- API `/api/v1/developer/evolve/{命名空间}/{slug}/overlay | compile | improvements[/{id}]`；CLI `aidc evolve slots | list | show | compile | save | propose | adopt | reject | revert | overlay | bake`。
- 新增官方样板 `evolve-demo`（智能问答台，cell-aidc）。

**修复**
- FIX-0151：Developer API 的 CORS 预检不放行 PATCH，沙箱里的应用调不了自提升的 `improve.decide()`（自进化的采纳 / 撤销同样用 PATCH）。

## 1.11.0 — 2026-09-27

**新增**
- **视觉 SDK · 网络摄像机 / NVR**：在浏览器里看公司 NVR（大华 / 海康 / 任意 RTSP）上各路摄像头的实时画面与高清截图。平台只在有人打开画面时去拉流（RTSP over TCP + Digest），码流原样转发（H.264 / H.265，不转码），浏览器用 WebCodecs 硬解；一条连接约 4 分 40 秒，提前开好下一条再切，画面不断；页面隐藏 1 分钟自动断开。
  - SDK：`vision.cameras()` / `camera()` / `saveCamera()` / `probeCamera()` / `removeCamera()`、`vision.live(canvas, { camera, channel, stream })`（`snapshot()`、`switchTo()`、`retry()`、`stop()`）、`vision.cameraSnapshot()`（主码流高清截图，直接喂给 `vision.detect`）、`vision.cameraKeyframe()`、`vision.liveSupport()`。
  - API：`GET /api/v1/developer/vision/{命名空间}/cameras`、`GET | PUT | DELETE …/cameras/{名字}`（登记幂等、dry-run）、`POST …/probe`、`GET …/live`（流式 `application/vnd.aidc.live`）、`GET …/keyframe`。
  - CLI：`aidc vision camera list | show | add | probe | snapshot | remove`；口令只从 `AIDC_CAMERA_PASSWORD` 或 `--password-stdin` 读；截图用本机 ffmpeg 转 JPEG。
  - 清单新字段 `cameras`：应用只看得到这里登记的摄像头。
  - 官方样板 `camera-live`（实时监控：通道切换、子 / 主码流、高清截图、一键识别；开发者在应用里登记摄像头）。
- 安全与成本：口令只存 AES-256-GCM 密文、任何接口都不回显；只给本公司 developer / member 看（分享与公开链接的访客看不了）；主机必须是公网地址；同一组凭证被拒一次就停并冷却 10 分钟（NVR 会按失败次数锁账号），没登记口令不去试；同一摄像头同时拉流 ≤ `maxViewers`（缺省 4）；画面时长计入应用计算分钟（新类别 `video`）；主码流实时缺省关闭。

**变更**
- `aidc app dev`：浏览器断开时一并断开上游的长连接（摄像头画面、SSE 不再白挂到服务端收尾）。
- `appUsage()` / `aidc app usage` 的计算分钟多一类 `video`（摄像头画面）。

## 1.10.0 — 2026-09-27

这一版来自一次可用性测试：让客户现场的智能体照着 Skill 从零做一个「治具验收拍照留证」应用，卡在哪里就改哪里。

**新增**
- 界面 SDK `ui.download(文件名, 内容, { type, bom })`：把字符串或 Blob 存成文件，类型按扩展名推断；**CSV 缺省在开头加 UTF-8 BOM**——Windows 上的 Excel 靠它认出中文。智能体自己写的导出没加，验收表在 Excel 里是乱码。

**变更**
- 安装脚本：`~/.aidc/bin` 不在 PATH 上时，在 PATH 里第一个 `$HOME` 下、可写的目录（`~/.local/bin`、`~/bin`、npm 全局 bin…）放一个 `aidc` 链接，装完就能直接敲；没有合适的目录就在最后一行给完整路径。不改 shell 配置文件；PATH 前面已经有别的 `aidc` 时不链接。三轮测试都卡在「`aidc` 找不到」。
- 版本包校验：包里带 SDK 副本（路径含 `developer/sdk/` 的文件）直接拒收，`aidc app check` 同一条规则。智能体没登录时照 `/developer/sdk/v1/` 伪造了一份 `aidc.js` 做本地预览，放在应用目录里，差一点跟着上线。
- Skill 与文档：安装输出的最后一行就是能用的命令；等人批准登录时先写代码、`aidc app check`，每做完一步查一次，一条终端命令里别循环超过一两分钟；给人看的预览 = `aidc app deploy` 返回的 Developer 预览链接（远程机器上的 localhost 人打不开），不要伪造 SDK 或起本地服务器；凭证只来自人批准的登录或人交给的 Key，不翻 `.env` 找别人的。数据 SDK「解析与导出」写明给 Excel 的导出 = `data.toCsv` + `ui.download`。
- 应用登记表与应用卡片：用了视觉 / 语音 / 视频的应用，登记的 `model` 不再标成「登记了没用到」——视觉文档一直让这样登记（`"sdk": ["vision", "model"]`），智能体照做后卡片上反而多一条提示。
- Academy：Developer 课改成十五个 SDK（「一张图」补上建模、账单两张卡片，ja / de 译文同步）；SDK 数的守卫测试管到 Academy。

## 1.9.0 — 2026-09-27

**新增**
- 应用卡片带上**花费**（`card.cost`，只给本公司开发者，与账单 SDK 同口径）：本月 / 今天 / 累计的模型花费（美元标价、次数、tokens）、月底预测、预算、各模型本月花费、未计价的调用数——来自账单 SDK 的台账，应用不用埋点。`appCard()`、`aidc app card`、应用顶栏「卡片」都显示；成员与公开应用的匿名读者看到的卡片不含花费。

**变更**
- 企业数据浏览器 1.1.1、工作流画布：卡片弹窗加「花费」一行。
- 新增官方样板 `object-detect`（物体检测 + 登录绑定，清单 `auth.publicLink: "members"`）。

**修复**
- 智能体轮询登录会把授权码等过期：`aidc login --continue` 会一直等到批准或过期（最长 10 分钟），而智能体的终端命令通常 2–3 分钟就超时（客户现场的智能体实测：每 15 秒一次的轮询变成了一次长等待，第一个授权码没人批准就过期了）。新增 `aidc login --continue --no-wait`：只查一次，没批准返回 `{"event":"authorization_pending"}`、退出码 3；Agent Skill、CLI 与智能体接入文档改成这种轮询。

## 1.8.1 — 2026-09-27

**变更**
- 数据变化触发：输入不取自对象（`trigger.change.input` 为空）的工作流，同一批变化只开一次运行——一次快照改了 N 个对象，不再跑 N 遍同样的检查。
- 《云计算费用监控》：云账单改在云端每天采一次（平台调度心跳，UTC 00:40 之后第一拍；不新增 cron）。凭证用平台已有的 AWS 部署凭证与 `AIDC_COST_VERCEL_TOKEN` / `AIDC_COST_SUPABASE_TOKEN`；没配的一家，以前绑定过的账号标「采集失败」并写明缺哪个变量。边缘采集端改为 `collector/collect.ts`（手动补采，同一份取数与归一）。

**修复**
- 看板 1.0.1：聚合接口返回 `{ rows }`，明细与月份读对了。

## 1.8.0 — 2026-09-27

**新增**
- **每个应用默认有资源上限**：清单 `limits` 新增 `computeMinutesPerMonth`（计算分钟，**缺省 2000 / 月**：实时连接挂着、工作流运行、模型 / 转写调用的时长，UTC 自然月）与 `notificationsPerDay`（缺省 20）。用满后这个应用的票据请求 `429 quota_exhausted`，数据变化 / 定时触发不再开跑，下月 1 日恢复。用量：`aidc app usage <slug>`、`GET /api/v1/developer/apps/{命名空间}/{slug}/usage`。
- **工作流触发条件**（触发都在工作流 SDK 里）：`trigger.change.cooldown`（同一对象多久内只跑一次）；`trigger.schedule`（`every` 5m–7d、按天的可写 `at` UTC 时刻）——只给「时间本身就是条件」的事，由平台已有的调度心跳执行，不新增 cron，停机不补跑。
- **通知步骤** `notify`：发邮件（标题 / 正文可用 `{{ }}`）；收件人必须是本公司账号、写死在清单里；去重键 + 冷却（缺省 6h）、每日上限；每一封都记外发账（发出 / 拦下 / 通道未配置 / 失败 + 原因）。`aidc notify test` / `POST /api/v1/developer/notify/test` 验证邮件通道。画布认识通知步骤。
- **部署成本告警**（不拦部署，`aidc app check` / `deploy` 打在 stderr，API 返回 `warnings`）：工作流定时 ≤ 1 小时一次（高频，带每月次数与预计计算分钟）、任何 `limits` 高于缺省、代码里 `setInterval` 拉数据（疑似轮询）。定时比每 5 分钟还密直接拒收。

**变更**
- 实时连接只在有人看的时候开：`data.live` / `data.watch` / `semantic` 订阅、`connect.stream().subscribe`、`workflow.watch` 在页面隐藏超过 1 分钟时自动断开（状态 `paused`），切回来带着序号续上，不丢不重。
- 订阅遇到 `quota_exhausted` 不再每 30 秒重连（与 401 / 403 / 404 一样视为终止）。
- 平台调度心跳上的保留期清理从每分钟改为每天一次（UTC 03:07）。
- [开发规范](standards.md)加「成本与资源」「触发优先于定时」「产品自提升」三节。

## 1.7.0 — 2026-09-27

**新增**
- **物体检测**（视觉 SDK）：`vision.detect(photo, { labels?, prompt?, maxObjects? })` → 每个物体的类别、把握与归一化位置框 `[x0,y0,x1,y1]`，缺省模型 `gpt-6-luna`；`vision.annotate` 直接画 `objects`。同一能力的 HTTP API `POST /api/v1/models/vision/detect`（开发者 Key 或应用票据，与 chat.completions 同一条模型通道：清单模型白名单、限流、每日额度、计费）；CLI `aidc vision detect <图片…> [--labels 人,叉车]`。平台统一清洗模型输出：坐标夹到 0–1、摆正、去掉退化框、按调用方的类别名归一。
- **登录绑定**（权限 SDK）：公开链接的访客用 AIDC 账号（邮箱验证码）登录后，票据带上账号与公司身份——本公司的人按 member / developer 权限，其他人仍只读。`auth.me()` 新增 `signedIn`、`member`；`auth.signIn()` 整页去登录并回到当前链接。清单 `auth.publicLink`：`open`（缺省）/ `signin`（先登录）/ `members`（只给本公司的人，平台在打开前把关）。
- **成员导入**（权限 SDK）：`aidc members import <名单.json|.csv> --source <来源> [--dry-run]`、`auth.importMembers()`、`POST /api/v1/developer/members/import`——把公司在别的系统里已注册的名单导入 AIDC：没有账号的建待激活账号（本人用这个邮箱收验证码登录即认领），都成为本公司 member；已经是 developer 的不动、不降级；占席位、整批事务、重复导入幂等。`aidc members list` / `auth.members()` / `GET /api/v1/developer/members` 看本公司成员与激活状态。

**修复**
- 自助注册（self_registered）账号从 Nexus / Developer 应用或公开链接被带去登录后，一律被送去 `/account`，回不到应用：现在应用路径（`/nexus/s/…`、`/nexus/…/apps/…`、`/developer/…/apps/…`）登录后回到应用，其他页面照旧（FIX-0150）。

## 1.6.0 — 2026-09-27

**新增**
- **账单 SDK**（`billing`）：每个应用、每把开发者 Key、每个模型花了多少——平台在模型通道里给每次调用自动记账，账单 SDK 把台账累计成**今日 / 本月 / 累计**，按应用、Key、模型、天（带累计）拆开，给出**月底预测**（最近 7 天日均 × 剩余天数）、**预算**、**未计价**的调用（写明原因，实时转写另给上限，绝不当成 0 元）。金额是美元标价、六位小数的字符串，各维度相加与总额逐位相等；账期是 UTC 自然月。`billing.summary / records / allRecords / check / prices / estimate / usd`，`aidc billing summary|records|check|prices|estimate`（`--fx` 同时显示人民币、`--csv` 导出明细），`GET /api/v1/developer/billing/{命名空间}/summary|records|check`、`GET /api/v1/developer/billing/prices`、`POST /api/v1/developer/billing/estimate`。文档 [账单](billing.md)。
- **对账**：账单的每个数都能从台账复核——按应用 + Key、按模型、按天相加 = 本月；另一条路（逐行读台账、精确求和）独立重算；成本列直接相加 = 本月金额；逐行按现行价目复算（按旧价记的行只提示）。`aidc billing check` 对不上退出码 1。
- **估算**（规划）：上线前按现行价目算每次 / 每天 / 每月多少钱、放不放得下预算；支持命中缓存的输入、DeepSeek 非峰时占比、按分钟计的转写与实时转写时长。
- **预算**：清单 `limits.monthlyBudgetUsd`（美元 / 月，可选）——本月已计价的成本到了就拒绝新的模型调用（`429 quota_exhausted`，`details.spentUsd`），下月 1 日（UTC）恢复；工作流的模型步骤同样受限。清单 `sdk` 可登记 `billing`。

**变更**
- **模型通道照厂商的计费规则记账**：命中缓存的输入按缓存价（OpenAI `prompt_tokens_details.cached_tokens`、DeepSeek `prompt_cache_hit_tokens`，流式从收尾 chunk 读）；DeepSeek 按调用时刻分峰时 / 非峰时（半价）；`gpt-transcribe` 按分钟价；实时转写只知道场次，成本记为空（未计价）而不是 0 元；价目里没有的模型记为空，不再落到「缺省价」上。原来一律按「全部未命中、按当时价目表」估，且实时转写记 0 元（FIX-0149）。
- **价目核对**（2026-09-27 读厂商价目页）：`deepseek-flash` = DeepSeek V4.1 Flash（峰时 输入 $0.30 / 命中缓存 $0.006 / 输出 $1.20 每百万 token，非峰时半价），原来按模型目录同步到的非峰时价 $0.15 / $0.60 计；`gpt-6-luna`、`gpt-5.4-mini`、`gpt-5.5`（≤272K 档）、`gpt-4o-mini-transcribe`、`jev-latest`（只收输入 $0.042）进厂商价表；`gpt-transcribe` $0.0045 / 分钟、`gpt-live-transcribe` $0.017 / 分钟（运营方可用 `AIDC_AUDIO_PRICING` 覆盖）。
- 账单把建模 SDK 的花费一起算进来：生成世界 / HQ 网格导出按上游实收 credits 记的行（计量方式「按次」），价目与估算复用建模价目（按最坏情况，与预留同口径）；结果还没定的预留单独列出、不进总额。

## 1.5.0 — 2026-09-27

**新增**
- **建模 SDK**（`modeling`）：用世界模型（World Labs Marble · World API）把文字、单张照片、360° 全景、同一空间的多张照片或一段视频变成可以走进去的 3D 世界（高斯溅射 SPZ 100k / 150k / 500k / 完整精度、碰撞网格 GLB、全景、缩略图），数字孪生的地基。
  - **费用控制在平台这一侧**（World Labs 不按单次成本拦截、超额月底补扣）：最坏情况估价 → 策略（开放的模型、单次上限、调用方 `maxCredits`）→ 同样的请求复用已有世界（不花钱）→ `Idempotency-Key` 必填 → 每公司每小时次数 → 同时在跑上限 → 月度额度（全平台总闸 + 公司额度 + 应用每日额度）在同一把事务锁里判完并按最坏情况预留 → 上游明确失败释放、结果不明不释放 → 按上游实收结账并记进用量台账。缺省只开试稿与 1.1、单次 1,600 credits、全平台每月 US$5、只有 AIDC 有额度；env `AIDC_MODELING_POLICY` 写坏了就停止一切花费。**官方公开应用永远不能生成、上传、导出或改锚点。**
  - **AIDC 空间坐标系**：米、Y 向上、地面 y = 0（按每个世界的尺度信息换算）；`frameOf / toMetric / fromMetric / distance`。碰撞网格与 SPZ 同一套原始坐标。
  - **锚点**：世界里的位置（米）+ 名称 / 类型 / 静态属性，可绑本公司语义层对象（`object: { type, pk }`，类型必须存在）；整组替换、`ifRev` 乐观并发、`verified` 标明是否人工核验。
  - **查看器** `modeling.viewer(el, world)`：Spark 2.2.0（World Labs 维护的高斯溅射渲染器）+ three.js 0.180.0，钉版本、从 jsDelivr 加载（`modeling.importMap()`）；预设视角、飞到锚点、碰撞网格拾取 `pick()`（屏幕 → 米）、换精度、截图；滚轮缩放要先点一下画面，页面滚动不被吃掉。
  - 输入媒体 `modeling.upload()`：换 World Labs 签名地址、字节直传（不经过 AIDC），`mediaId` 按命名空间隔离；导出 PLY（免费）/ HQ 网格（3,500 credits，缺省关闭）；登记已有世界（AIDC 平台账号）；删除（`purge` 同时删 World Labs 原件）。
  - API `/api/v1/developer/modeling/**`（目录、额度、世界、锚点、导出、媒体、登记）；CLI `aidc modeling models|estimate|budget|generate|list|get|wait|upload|anchors|export|download|import|delete`（`estimate` 本机算、不用登录）；模板 `aidc app init --template modeling`。
  - 清单：`sdk` 可登记 `modeling`（平台据此给应用的 CSP 放行 World Labs 资产 CDN 与 WebAssembly 编译）；`limits.worldCreditsPerDay`（应用每天最多花多少世界模型 credits，不写 = 0 = 只看）。
  - 公开展示 [`/nexus/apps/world-model`](https://www.ai-dc.ai/nexus/apps/world-model)：已生成的世界、坐标系、锚点（模拟读数）、按当前策略的报价——只看，不接受生成请求。

**变更**
- 界面 SDK：顶栏标题在窄屏上不再被右侧徽标挤成一字一行（单行省略）。

## 1.4.1 — 2026-09-26

**修复**（1.4.0 上线后用匿名浏览器核对公开演示时发现）
- 工作流运行的实时进度（SSE）没带 CORS 头：Nexus 沙箱里的画布收不到进度，点「预演」一直显示「排队中」（运行其实两秒就跑完了）。路由补上 CORS；`workflow.watch` 在实时流连不上时用一次普通请求补上当前状态，运行已结束就直接收尾（FIX-0148）。

**变更**
- 报价演示工作流 1.0.3：与客户目标价的比较（高还是低、差多少）由核价步骤算成文字交给 AI，AI 照抄，不再自己判断方向（1.0.2 在一次正式运行里把「比目标价低 6.7%」写成了「高于目标价」）。
- 官网 `/developer` 的样板区加上「跨部门报价工作流」公开演示；[开发规范](standards.md)加「每个应用一张应用卡片」。
- 应用卡片：AIDC 官方公开样板（`public` 命名空间）的访问范围报 `public`（原来照清单报成 `company`）。

## 1.4.0 — 2026-09-26

**新增**
- **工作流 SDK**（`workflow`）：把已发布应用的能力组合成完整流程。
  - **能力**：应用清单 `exports` 显式导出（query / get / aggregate / action，带参数与说明）；已发布应用登记的语义类型、Action **自动提取**成能力，不用改一行。能力以提供方应用 × 成员身份执行，不越权。`workflow.capabilities()`、`aidc workflow capabilities`、`GET /api/v1/developer/capabilities/{命名空间}`。
  - **工作流**：清单 `workflow`——`use`（调能力）/ `compute`（逐行 + 关联 + 汇总）/ `model`（AI 分析，按声明字段返回）三种步骤，`when` 条件、`lane` 泳道；依赖从表达式自动推出，按层并发；`=` 开头的安全表达式（白名单函数、无副作用、计算量有上限）。部署时对照公司能力目录校验。
  - **运行**：手动运行、预演（Action 只给计划）、**语义层数据一变自动运行**（`trigger.change`，发布即生效、每条变化只触发一次、可链式）；每一步的状态 / 耗时 / 输出实时推送（SSE）。`workflow.run / watch / wait / runs / getRun`，`aidc workflow run|runs|status|watch`，`aidc app init --template workflow`。
  - **画布**：官方样板 `workflow-canvas`——部门泳道、数据流连线（线上是传过去的参数）、点开看能力 / 公式 / 输出 / 提供方卡片、实时运行与回放；部门比步骤层数少时竖排。
  - **公开演示**：跨部门报价（营业询价 → 设计 BOM → 采购行情与物流 → 制造工艺 → 财务核价 → AI 分析 → 营业报价草稿），五个部门应用 + 报价工作流，公开分享链接可预演。
- **应用卡片（App Card）**：每个应用一张，平台按清单与部署分析自动生成——负责部门、版本、SDK（登记 / 实际）、是否连数据库与读写哪些数据、数据流状态、对外能力与依赖、访问范围、近 7 天使用。`appCard()`、`aidc app card`、`GET /api/v1/developer/apps/{命名空间}/{slug}/card`；企业数据浏览器 / 部门看板 / 画布都有「卡片」按钮。
- 清单新字段：`owner`（部门 / 岗位 / 负责人）、`exports`、`workflow`；`sdk` 可登记 `workflow`。应用登记表每行带负责部门、对外能力、依赖与工作流摘要。

**变更**
- 企业数据浏览器 1.1.0：标题取应用自己的（同一份代码做部门看板），加「卡片」。
- 公开分享的访客看运行记录时不显示是谁跑的（显示「公司成员 / 访客 / 数据变化」）；文档写明公开分享一个工作流会让访客看到每一步的输出。

## 1.3.1 — 2026-09-26

**修复**（1.3.0 上线后在生产核对时发现）
- 界面 SDK 的加载动效示例只列了五种，补齐八种（`/developer/ui`、`ui.json`、`aidc ui components loader`）；测试核对示例与 `loaderHtml()` 逐字一致。
- 组件样例页 `/developer/ui` 发版后几分钟内交互报错（`does not provide an export named 'ui'`）：浏览器缓存里还是上一版 `aidc.js`（缓存 5 分钟）。样例页自己引用 SDK 时带上版本号。

## 1.3.0 — 2026-09-26

**新增**
- **界面 SDK**（`ui`）：所有应用共用一套 AIDC 界面。样式表 `/developer/sdk/v1/ui.css`：顶栏、页面容器、按钮（六种样式、三种尺寸）、输入框、多行输入、下拉、复选、单选、开关、字段、卡片、徽标、提示条、表格、标签页、对话框、消息提示、加载动效、标识、骨架、分隔线、键帽、头像、进度条、空状态，类名 `aidc-<组件>[__<部分>][--<变体>]`，放在 CSS 层 `aidc.components`，应用自己的样式永远盖得住。`aidc.js` 的 `ui`：`toast`、`confirm`、`prompt`、`tabs`、`loader`、`logo`、`theme`、`ensureStyles`，基于原生 `<dialog>` 与 `aria-live`，没有依赖。主题 `aidc`（主按钮实心黑，缺省）/ `signal`（信号橙），浅色 / 深色 / 跟随系统；八种 `//` 加载动效（含刻度轮）。
- 机器可读登记表 `/developer/sdk/v1/ui.json`（组件、类名、示例标记、令牌、主题、加载动效），样例页 [`/developer/ui`](https://www.ai-dc.ai/developer/ui)，文档 [界面](ui.md)。React 项目用 [AIDC UI](https://www.ai-dc.ai/asset/ui) 的 `@aidc` 注册表，令牌同一套。
- CLI：`aidc ui components [组件]`、`aidc ui tokens [--mode light|dark] [--theme aidc|signal] [--css]`、`aidc ui add [目录] [--dry-run]`（给已有应用接上界面 SDK：插入样式表链接、清单登记 `ui`；幂等）。本机完成，不需要登录。
- 清单 `sdk` 可登记 `ui`；部署时静态分析同时认 `import { ui }` 与页面 / CSS 里对 `ui.css` 的引用，用了没登记的拒收。

**变更**
- `aidc app init` 的所有模板默认接好界面 SDK（顶栏、页面容器、卡片、按钮；拍照模板用消息提示给结论，数据模板用加载动效，语义模板用 `ui.prompt` / `ui.toast` 与表格样式）；`style.css` 只留应用自己的东西。
- 文档新增「界面」分组；[开发规范](standards.md)加「界面」与「一个 SDK 由什么组成」两节；总览、Agent Skill、CLI、智能体接入、发布、快速开始同步。

**修复**
- 官网 `/developer` 数字带写着「7 个 SDK」、`llms.txt` 写着「七个 SDK」（1.2.0 起实际已十一个）：SDK 的个数与名单现在由同一份登记生成，文档、官网三种外语、`llms.txt` 都有测试核对。
- `aidc app dev --sdk-dir <相对路径>` 从 1.0 起没有生效：请求被静默转给了 API，用的还是线上 SDK。现在相对路径按当前目录解析；SDK 目录里的文件按扩展名给类型（原来一律按 JavaScript 返回，浏览器的严格 MIME 检查会拒用 `ui.css`）。

## 1.2.1 — 2026-09-26

**修复**（在两家客户生产上线语义层时发现）
- **`aidc semantic define <目录> --dry-run` 误报「定义引用不闭合」**：原来逐个文件 dry-run，前面的定义没真建，后面引用它的就报不闭合（真跑没问题）。现在一个目录整批提交（`POST /api/v1/developer/semantic/{命名空间}/types`、SDK `semantic.defineAll()`）：在整批改完之后的全体定义上一次校验，批内互相引用算数，dry-run 也一样；不闭合一条都不写。FIX-0147。
- **dry-run 不判 `ifRev`**：Action / 数据修改 / 删除带了过期的 `ifRev`，真调用 409，dry-run 却报成功；现在 dry-run 同样返回 `rev_mismatch`。FIX-0147。
- **`aidc app publish|rollback --version 1.1.0` 从 1.1.0 起没有生效**：`version` 被登记成了布尔旗标，子命令里的 `--version 1.1.0` 被当成「打印 CLI 版本号」，以退出码 0 结束——回滚静默没做（发布端只发测试版时不带 `--version`，所以一直没暴露）。现在只有不带子命令的 `aidc --version` / `-v` 打印版本号；子命令里 `--version` 取值，只写 `--version` 不带值是用法错误（退出码 2）。`aidc improve apply --version` 同理。
- 企业数据浏览器 1.0.2：表格补基础样式（表头、间距、数字右对齐），单元格不再重复单位（表头已写）。

## 1.2.0 — 2026-09-26

**新增**
- **语义 SDK**（`semantic`）：参照 Ontology 的语义层——对象类型（显示名、单位、同义词、`writeback` 语义层属性）、链接、**Action**（受控写：参数校验、`roles`、`$参数` / `$now` / `$userName` 取值、一句话摘要）、语义版本；`describe()` 给应用与智能体的说明书（含给大模型的 markdown），`search()` 按业务说法找属性，`objects()` 链式查询 / 链接 / 聚合 / 实时，`action().apply()`，`define / publish / releases`。数据源（ERP / MES）永远只读。
- **数据 SDK 升级**：数据层 `table()`——查询（条件 / 排序 / 分页）、取全、读（链接、变化记录）、新建 / 修改（`set` `revert` `ifRev`）/ 删除、批量导入（`layer` `mode`）、聚合、`live()`（查询 + 实时合并）；`watch()` 语义层变化订阅（SSE，序号续传、`reset`）；`sync` 把连接 SDK 的数据流绑定到对象类型（ERP → 数据层）。原有分析小工具不变。
- **权限 SDK**（`auth`）：`viewer()` / `me()` / `can()`、角色（developer / member / editor / viewer / anonymous）、`login()`、分享 `share / shares / revoke`（全公司 / 指定账号 / 公开只读链接 `/nexus/s/…`）；清单 `auth.access: restricted`。
- **日志 SDK**（`log`）：`track / feedback / error / captureErrors`；开发者 `summary / events / setFeedbackStatus / versions`。平台自动记打开、Action、数据写入、分享。
- **自提升 SDK**（`improve`）：`evidence / suggest（模型起草，整合文件 / 技能 / 对话）/ propose / proposals / decide / apply`；语义补丁一键应用成新语义版本，被采纳的反馈自动标记已处理。
- **应用登记表**：清单 `sdk` 可登记 `semantic` `auth` `log` `improve`；部署时静态分析包里对 `aidc.js` 的 import，**用了没登记的 SDK 拒收**；`aidc app registry` / `GET /api/v1/developer/registry` 列出每个应用的 SDK、语义类型 / Action / 数据流 / 模型、访问范围、近 7 天使用。
- CLI：`aidc semantic`、`aidc data query|get|create|update|delete|import|aggregate|watch|bind|bindings|resync|unbind`、`aidc share`、`aidc log`、`aidc improve`、`aidc app registry`。
- 清单新字段：`semantic`（types / actions / write）、`auth`（access）。

**变更**
- 应用票据带访客（账号、显示名、角色、分享）；入口页 `aidc-app` 元信息多了 `viewer`。
- 文档分组：感知与智能 / 数据与语义 / 治理与迭代；新增「闭环」入门页。

**修复**
- 沙箱里的客户应用续不了票据，实时看板开满 8 小时就断：SDK 续期时带上当前票据，服务端按账号 / 分享复核后换新（过期 24 小时内），FIX-0146。
- 语义版本：定义没变再发布不再占一个新版本号。

## 1.1.1 — 2026-09-26

### 修复

- **安装脚本在 Node 18 上装出来的 `aidc` 跑不起来**：CLI 是 ES 模块，原来存成没有扩展名的 `aidc`，Node 20.19+ 会按内容识别、Node 18 不会（`SyntaxError: Cannot use import statement outside a module`）。现在存成 `aidc.mjs`、`aidc` 指向它；重装即修复。在客户机器（Node 18.19）装发布端时发现。
- **`aidc stream pipe` 常驻时的监听器泄漏**：发布循环每次空闲等待都在停止信号上挂一个监听器、被唤醒后不摘（心跳每 30 秒一次，一天近 3,000 个；客户机器 Node 20 上 6 分钟报 `MaxListenersExceededWarning`）。改为只挂一个；退避等待结束即摘掉监听器。已在跑的发布端重装 CLI、重启服务即可。
- **`aidc app status / history / publish / rollback` 支持 `<命名空间>/<slug>`**（如 `cell-demo/production-live`），与 `aidc stream` 的写法一致；原来只能用 `-n`。

## 1.1.0 — 2026-09-26

### 新增

- **连接 SDK · 实时数据流**：数据源一变，源头旁边的发布端推给 AIDC，AIDC 按序落账、保存最新状态，几秒内推给所有订阅端——不用 cron、不轮询 ERP、数据源断了订阅端看得见。
  - SDK：`connect.stream(name).subscribe({ onUpdate, onNotice, onStatus })`（先全量、后增量，断线带序号续传）、`get()`、`publish()`、`publisher()`（全表自动算差）。
  - CLI：`aidc stream create / list / status / get / key / keys / revoke / publish / tail / pipe / delete`；`aidc stream pipe <流> -- <适配器>` 是边缘发布端（算差、幂等重试、心跳、全量校准、适配器崩溃重启并上报「连不上数据源」）。
  - API：`/api/v1/developer/streams/**`（声明带字段白名单、SSE 订阅 `?after=N` 续传、批量发布、发布 Key `aidc-pk-`）。
  - 应用清单新增 `streams`：应用只能订阅声明过的、同一命名空间的数据流。
- **版本号与更新状态**：应用清单新增必填的 `version`（语义化版本号）。测试与发布都用版本号称呼一个版本（Developer 预览显示「Developer 预览 · v1.2.0」，Nexus 显示「v1.2.0」）；每个版本有更新状态（已上线 / 测试中 / 已测未发 / 已被替换 / 已回滚 / 未测试）；每次进测试、发布、回滚都记一条发布记录（谁、何时、从哪个版本到哪个版本、说明）。`aidc app status` 看版本与状态，`aidc app history` 看记录；`publish` / `rollback` 的 `--version` 可写版本号，另可带 `--notes`。

### 变更

- **版本号一号一内容**：内容变了但 `version` 没升，部署返回 409 `version_conflict`。
- **清单进内容指纹**：只改清单（额度、模型、数据流…）也算新内容。此前这种改动再部署会被当成「内容未变」、新清单不生效——已修。存量版本的版本号按 `1.0.<构建序号-1>` 回填。
- `app()` 返回的 `version` 改为版本号字符串（如 `"1.2.0"`），构建序号在新增的 `build` 里。
- `aidc app init` 生成的清单从 `0.1.0` 起。

## 1.0.1 — 2026-09-26

### 修复

- **语音 SDK `voice.translate`**：数额按「万 / 亿」换算，不再把「预算 120 万」译成「120 千」（埃及阿拉伯语、孟加拉语：同一句翻 6 次，24 条译文错 5 条）；非中文、日语的译文不再残留原文汉字（孟加拉语「…এটি负责।」：同一句翻 50 次，9 次残留）；人名、地名改为按目标语言音译。改后两项在同样的测试里都是 0 次。会议纪要样板直接加载 `/developer/sdk/v1/aidc.js`，随官网部署生效，不用重发应用。
- **会议纪要样板（v2）**：去掉写死的转写关键词 `AIDC / Nexus / Developer`——转写会偏向关键词，实测把会上说的「SAP」听成了「Nexus」；去掉后同一段录音 4 处「SAP」全部听对。文档补充：`keywords` 只放会上真会出现的词。
- **CLI `aidc --version`**：管道里也只打印版本号（此前非终端输出 JSON，安装脚本的「已安装」提示里会夹一段 JSON）；要 JSON 用 `aidc --version --json`。

## 1.0.0 — 2026-09-26

首个版本。

### 新增

- **七个 SDK**：视觉（摄像头、拍照、选图、结构化质检、画框标注）、语音（实时转写、录音、音量、文件转写、多语翻译、会议纪要）、视频（带声录像、定时抽帧、视频分析）、模型（OpenAI 兼容：LLM / 视觉 / 转写 / 实时转写 / Jev，账单记调用方公司）、数据（解析、画像、聚合、透视、时间序列、异常、格式化、图表）、发布（清单、版本、双通道、回滚）、连接（数据集固定报告、智能体 Agent API）。
- **aidc CLI**：设备授权登录；`models` / `model` / `vision` / `voice` / `video`（ffmpeg）/ `data` / `connect` / `app` 全套命令；`--json`、`--dry-run`、稳定退出码。
- **API**：`/api/v1/developer/**`（登录、Key、应用、版本、通道、票据、数据集）与 `/api/v1/models/**`（目录、chat.completions、audio.transcriptions、实时转写票据、Jev）。
- **托管**：Developer 预览 `/developer/apps/<slug>`、Nexus 正式 `/nexus/apps/<slug>`；客户应用挂在 `/developer/<cellId>/apps/<slug>` 与 `/nexus/<cellId>/apps/<slug>`。
- **智能体接入**：`/developer/llms.txt`、每页 Markdown 原文、`/developer/skills/aidc-sdk/SKILL.md`、`/developer/openapi.json`、应用清单 JSON Schema。
- **样板应用**：瑕疵检测、会议纪要、ERP 数据自动分析（公开）。
- **合成 ERP 演示库** `demo_erp`（虚构数据）。
