# 更新记录

## 1.24.0 — 2026-09-30

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

**新增**
- **Markings**（照 Palantir 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` 类型的属性**（照 Palantir：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 不含受保护的类型。
- **改安全策略要有权限**（照 Palantir 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`）里 Palantir 写法的 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（照 Palantir）；AIDC 的 AWS 服务器进了 Semantic（Owner 09-30）**：Owner 要在 AIDC 的 Semantic Ontology 里给 AWS 服务器建模，用 Semantic SDK 开发、边用边修，并把 Action 设好、实测能不能真的自动关机。设计与对照：aidc-cloud `docs/semantic-aws.md`。

**新增**
- **Action 的 writeback webhook**（照 Palantir：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()`。

**修复**
- **Palantir 写法的 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 只被读一次 + 数据一变 / 到点才做事」**（照 Palantir 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` 到期自动停（Palantir 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 的数据平台（照 Palantir Foundry）——数据从哪来、对象与 Action、谁能看、变了自动做什么、日志与用量都在 `semantic` 里。原来并列的**连接、数据、权限、工作流、日志、账单**六个 SDK 并进 Semantic，**SDK 从十六个变成十个**：界面、视觉、语音、视频、模型、建模、语义、自提升、自进化、发布。旧名照样能用（见「兼容」）。设计与和 Palantir 的对照：aidc-cloud `docs/semantic-sdk.md`。

**新增**
- **数据源是 Object Type 定义的一部分**（照 Palantir：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 的子模块**（名字照 Palantir 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；照 Palantir Ontology 的构件与名字，底层是每个组织一个 Postgres schema。同时落下 AIDC Cloud 统一的 **Public / Private / Share**。

**新增**
- **Semantic 数据库（照 Palantir 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**（照 Palantir 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

**新增：语义层完全对表 Palantir 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`）原样可用，对外一律用 Palantir 的名字和形状。
- **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`。
- **本体由智能体构建**（唯一和 Palantir 不同的地方）：智能体作者（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（参数错误 / 校验不通过）。

**仍待补**（与 Palantir 的差距，见 `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`）：参照 Palantir 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`（虚构数据）。
