feat: release Dever 0.1.5 with direct workers and long transactions

This commit is contained in:
Codex committed 2026-10-11 11:17:33 +00:00
1 parent 89629c2197
commit a900d7e8db
153 files changed
+3676 -3708

No files matched your search

+5 -5
View File
@@ -433,7 +433,7 @@ TLS 使用 tokio-rustls 0.26.5、rustls 0.23.44 的 ring 后端和 webpki-roots
模块 API 的站点归属由检查器把 API 物理父目录与 `setting.json` 的 `sites.path` 做分段前缀匹配,文件名不参与匹配,站点也不改写 URL。配置引用的 verify 必须解析为一个只读 App 根;它和其数据库读依赖进入生产可达图及原生初始化,不能在运行时按字符串反射调用。
原生路由先由 runtime 校验站点绑定的 Bearer 或 Secret Cookie,再把结构化 Claims 交给该静态 verify。verify 输出的 App-owned record 经生成桥接转换为 runtime Identity,随后使用 Tokio task-local 包住真实 handler。源码只能通过 `dever.auth`、`dever.site` 读取复制值,不能构造或保存上下文本体。JWT 固定 HS256,并校验 algorithm、issuer/provider、audience/site、时间边界及签名;public 路由忽略浏览器自动附带的 Cookie,但显式错误 Authorization 仍拒绝。Cookie 写入和 Cookie 认证的非安全方法要求 Origin 与 Host 精确匹配站点配置的外部 HTTP/HTTPS origin,不根据内部监听协议推断,也不信任转发 Header。响应 Header/Cookie 先暂存,只在 handler、wire 编码与事务提交全部成功后发布。含密码 hash/verify 的 HTTP 调用链不生成覆盖整个 handler 的事务;检查器要求全部写入位于显式短 transaction 中,并禁止 transaction 到达密码计算,避免 SQLite writer 锁和 WAL 读快照升级错误。
原生路由先由 runtime 校验站点绑定的 Bearer 或 Secret Cookie,再把结构化 Claims 交给该静态 verify。verify 输出的 App-owned record 经生成桥接转换为 runtime Identity,随后使用 Tokio task-local 包住真实 handler。源码只能通过 `dever.auth`、`dever.site` 读取复制值,不能构造或保存上下文本体。JWT 固定 HS256,并校验 algorithm、issuer/provider、audience/site、时间边界及签名;public 路由忽略浏览器自动附带的 Cookie,但显式错误 Authorization 仍拒绝。Cookie 写入和 Cookie 认证的非安全方法要求 Origin 与 Host 精确匹配站点配置的外部 HTTP/HTTPS origin,不根据内部监听协议推断,也不信任转发 Header。响应 Header/Cookie 先暂存,只在 handler、wire 编码与事务提交全部成功后发布。普通写 API/CMD/Job 恢复入口级事务;显式 `long` 入口不生成外层事务,其 Model 写入及 Job 入队必须位于 transaction 函数中。两种事务都禁止外部 Worker、密码计算、文件/网络 I/O、等待和并发。入口策略由源码声明固定,检查器不推断切换;`public long` 仍只由 public 控制匿名访问。
权限目录由编译后的 API 自动生成并同步到核心 RBAC 表,受保护入口按站点、租户、用户和角色校验精确权限,不由 verify 返回权限字符串,也不要求逐个调用 `auth.require`。verify 只提供经验证的用户/租户/会话身份,public 声明显式允许匿名;业务数据所有权是独立边界。官方 `dever.api.Error` 由后端按确切类型与变体映射为固定响应,未知业务失败只记录调用元数据并返回脱敏 500。日志在 runtime 追加站点和已验证身份字段,不记录 token、Cookie 或 JWT payload。
@@ -441,7 +441,7 @@ TLS 使用 tokio-rustls 0.26.5、rustls 0.23.44 的 ring 后端和 webpki-roots
runtime `component` 是唯一 Worker owner。它从当前可执行程序目录解析编译器规范化的相对 entry,以清空环境、固定 `--dever-component` 参数和专用管道直接启动子进程,不使用 shell 或 `PATH`。协议帧为四字节大端长度加 UTF-8 JSON,继续使用 16 MiB、64 层、65536 值以及重复字段拒绝规则。`hello/ready` 绑定版本、Port、Adapter、schema hash、操作、capability 和 setting;随后使用严格递增 request id 的 `call/result/error/cancel`,并以 `health` admission 和 `shutdown` 收口。业务 `error` 必须属于 Port 已声明 variant;协议、超时、崩溃和非法 payload 都是运行 fault,不伪造业务错误,也不自动重放请求。
每个 Worker 的有界命令队列、进程、stderr drain 和 supervisor 都注册到现有结构化 Scope。超时或调用任务取消会发送 `cancel`,随后必须消费同一 id 的一个 `result` 或 `error` 才能继续;错误 id、未知 kind、截断/超限 frame 会终止该 Worker 并关闭 pending 调用。崩溃后的下一次新调用可以在固定启动频率内重建,但失败中的调用不重放。生成入口在应用成功、业务失败和运行 fault 后都走同一 cleanup,先完成 Component shutdown,再关闭数据库,并保留主错误及 cleanup cause。allow 集合参与编译期 effect 和握手精确匹配;Linux 启动还统一进入 `dever-sandbox` 的 namespace/seccomp/只读运行树与显式文件授权边界。GPU、其他 OS 和不允许 namespace 的宿主明确失败,不绕过隔离。
每个 Worker 的有界命令队列、进程、stderr drain 和 supervisor 都注册到现有结构化 Scope。当前源码改为 `dever-process` 直接执行与 pidfd/进程组回收,不再建立内层 namespace/seccomp/AppArmor 沙箱;权限继承容器,allow 只保留编译及握手效果契约。超时或调用任务取消会发送 `cancel`,随后必须消费同一 id 的一个 `result` 或 `error` 才能继续;错误 id、未知 kind、截断/超限 frame 会终止该 Worker 并关闭 pending 调用。崩溃后的下一次新调用可以在固定启动频率内重建,但失败中的调用不重放。生成入口在应用成功、业务失败和运行 fault 后都走同一 cleanup,先完成 Component shutdown,再关闭数据库,并保留主错误及 cleanup cause。allow 集合参与编译期 effect 和握手精确匹配;Linux 启动还统一进入 `dever-process` 的 namespace/seccomp/只读运行树与显式文件授权边界。Linux NVIDIA GPU 由 `adapter.<port>.gpu` 显式授权具体设备和只读驱动文件;guard 在执行 Worker 前核对设备 inode/device/rdev,驱动挂载采用原有 descriptor pinning。没有声明、配置、父容器权限或 namespace 支持时明确失败。其他 OS 仍不支持,不绕过隔离。C ABI SDK 与 exec 原生动态库闭包打包复用同一 Worker owner,未新增 Rust unsafe 或进程内用户 FFI。
External Lib 的项目边界由 `dever-cli::libs` 统一拥有:`config/setting.json` 根 `lib` 数组保存显式请求,canonical v5 `dever.lock` 保存精确版本、传递依赖、runtime/schema/artifact 摘要、源码构建收据和每个 checked Worker 的绑定。每个 Worker 独立校验环境闭包与版本冲突,打包精确比对整份 provider 元数据,不允许锁中多写未嵌入资源。`dever lib add/update` 才能解析,`run/build` 只离线消费锁。全部 exec 候选与锁资源形成嵌入清单,bundle identity 包含路径、SHA-256、长度、可执行位;runtime 原子提取到私有 `data/cache/lib/<digest>`,每次 Worker 启动重新核对清单、字节与 Unix 所有权/权限,不扫描别的 bundle。
@@ -467,7 +467,7 @@ File 的 create_new/open/read/write/close 与共享别名、同步 Stream 的共
`llvm::emit_application` 已接通独立 CMD 与 HTTP/REST 应用入口。CMD 保持完整名称和单个 JSON 对象输入;混合 HTTP/CMD 项目执行 CMD 时不绑定监听器。`llvm/api.rs`、`api_context.rs`、`rest.rs` 与 `application_commands.rs` 生成静态路由、具体输入/输出、Claims/Identity 及权限描述符,复用已有 JWT/业务 verify、站点、RBAC、database-only 租户、Cookie/Header、Upload 与日志实现,不另建协议栈或向业务传入动态 Value。非 public 路由缺少认证或精确权限时,源码与私有 ABI 两处均拒绝;权限 key 仍不含 HTTP method。
完整应用和可达日志的 CMD 共用 invocation-owned `application::Session`,只读取一次 `config/setting.json`。数据库、迁移临时池、租户 manager 和 lifecycle 均由该 owner 持有;子任务先排空,再在同一 runtime 中关闭连接池、刷新日志。POST/PUT/DELETE 输入解码后开始事务,输出编码后提交,成功才发布响应 metadata。租户管理入口沿用 migrate/owner/component 合同,缺少 ready marker、租户身份或启用组件不能回退平台库。Upload 经 Port/Adapter 消费到存储,部分解码失败清理 affine owner。私有 CLI 和 Linux managed daemon 编译已接 LLVM;签名发行包提供 Linux x86_64 编译资源,Linux ARM64 应用资源通过显式 target 扩展准备。
完整应用和可达日志的 CMD 共用 invocation-owned `application::Session`,只读取一次 `config/setting.json`。数据库、迁移临时池、租户 manager 和 lifecycle 均由该 owner 持有;子任务先排空,再在同一 runtime 中关闭连接池、刷新日志。普通写 API/CMD/Job 持有入口级事务,响应编码成功后提交;`long` 入口中的最外层 transaction 正常返回即提交,后续阶段或响应编码失败不撤销此前提交。自动 REST 保留自己短事务;响应 metadata 仍仅在 handler 与 wire 编码成功后发布。租户管理入口沿用 migrate/owner/component 合同,缺少 ready marker、租户身份或启用组件不能回退平台库。Upload 经 Port/Adapter 消费到存储,部分解码失败清理 affine owner。私有 CLI 和 Linux managed daemon 编译已接 LLVM;签名发行包提供 Linux x86_64 编译资源,Linux ARM64 应用资源通过显式 target 扩展准备。
`llvm/external.rs` 接通 checked external Adapter;选中的 Setting 成功解码后才启动 Worker,具名输入/输出和声明业务错误复用 typed wire codec。缺失可空输出字段、额外字段、错类型和未声明错误均为运行故障。`llvm::emit_application_with_resources` 消费原打包器的 `EmbeddedResource`,与 Rust backend 共用摘要/去重,运行时复用安全提取和受管 launch;不查找宿主解释器。`runtime-external` 与编译器 SDK 分离。`component::Session` 由每次 task 根持有,传播到子任务、blocking 和 API;supervisor 挂在根 Scope,短命调用者退出不关闭共享 Worker。根退出先停止接收和关闭 Worker,再排空 Scope,typed 原始错误保留并附加清理原因。显式 shutdown 被取消时仍保留 Task owner,根可继续排空;普通 Test 仍只有 fake。
@@ -477,7 +477,7 @@ File 的 create_new/open/read/write/close 与共享别名、同步 Stream 的共
`llvm/database.rs`、`database_rows.rs`、`orm*.rs`、`database_schema.rs` 和 `transaction.rs` 接通 Model;API 应用通过 Session 同时支持平台库与租户物理库。SQL/DDL 与关联查询复用 `native/orm.rs` 的纯构造函数,不生成 Rust、不复制数据库驱动。持久化固定标量在 ABI 边界转换为既有 `orm::Value`,业务记录和错误仍保持具体类型。Row/Rows/RowStream/Related 是不透明所有者;ToOne 保留可空关联,ToMany 按 998 个父键分块并使用既有 per-parent 限额 SQL。启动按实际数据库分组先迁移全部 Model,再建立外键;数据迁移与 Seed 复用原历史校验、事务和顺序规则。
`database::Session` 持有本次入口的 Settings 和连接池,复用原配置校验和驱动初始化,不写入全局 OnceLock。`task::run_entry_with_typed_cleanup` 先排空 root Scope,再在同一个 Tokio runtime 内停止所有连接池、等待驱动关闭,最后销毁 runtime。需要租户的应用使用上述 application Session 与 tenant owner,不能回退到平台库。写入 CMD 在输入解码后开事务,普通调用和顺序 handler 继承隐藏事务,Task/parallel 回调使用 detached 上下文;嵌套 transaction 复用外层、不制造 savepoint。输出编码成功后才提交,提交后才发布 stdout;失败/取消清理 typed 输出并回滚或丢弃状态未知的连接。rollback 保留原始 fault,可附加 cleanup cause;DbError 十个变体使用静态 typed 回调,不按消息猜类别。PostgreSQL 的 SQL 约束失败会使当前事务失败,不能承诺捕获后继续使用该事务;NotFound 等非 SQL 失败仍可正常捕获。
`database::Session` 持有本次入口的 Settings 和连接池,复用原配置校验和驱动初始化,不写入全局 OnceLock。`task::run_entry_with_typed_cleanup` 先排空 root Scope,再在同一个 Tokio runtime 内停止所有连接池、等待驱动关闭,最后销毁 runtime。需要租户的应用使用上述 application Session 与 tenant owner,不能回退到平台库。普通写 API/CMD/Job 建立入口事务上下文;`long` 入口初始上下文为空,由显式 transaction 建立局部事务。普通调用继承上下文,嵌套 transaction 复用外层、不制造 savepoint;只有拥有事务的最外层边界提交。失败或取消清理当前未提交事务,保留原始 fault 和 cleanup cause。编码成功后才发布 stdout;普通入口编码失败回滚,`long` 的编码失败不撤销此前提交的阶段。DbError 十个变体使用静态 typed 回调,不按消息猜类别。PostgreSQL 的 SQL 约束失败会使当前事务失败,不能承诺捕获后继续使用该事务;NotFound 等非 SQL 失败仍可正常捕获。
`llvm/failures.rs` 接通业务 `fail`、默认传播和 `result(named_call)`,直接复用 `specialize::failures` 与 `capture::targets`。fault 原前五字段不变,末尾追加 nominal type(编译期 ID+1,0 表示无载荷)、variant 与按可达错误类型最大布局对齐的内联 Choice;Business code 为 4。载荷用具体类型 store/load 和静态 drop,不是动态 Value 或序列化消息。捕获支持零/单/多输出、直接 error 与一层 error-only Choice 包装;显式 raised outer variant 保留身份。匹配后移交载荷并清空 fault,未匹配的数值/RuntimeAbi 故障继续追加调用帧传播。BytesToText/BytesFromInts/BytesSlice 复用既有 C ABI:status 1 的原始消息转换为标准 Failed(Text),status 2 保持 RuntimeAbi fault;成功句柄与错误 Buffer 各自准确转交/释放。真实执行覆盖捕获后重失败、非零 variant 根释放、受管 COW 与精确源调用链。
@@ -491,7 +491,7 @@ Linux `deverd` 已接可信编译 IPC。managed core 提交逻辑源码、无秘
原生发行包作者入口 `sdk/native-release.rs` 从独立作者根的 `config/setting.json` 读取显式输入及摘要,复用既有 runtime manifest、验证器和 Ed25519 发行协议。制作器复制并复核四 profile、CRT 和核心/LLVM 文件,在私有 staging 中签名,再以不覆盖方式原子发布;私钥不进入产物。`runtime-pack` Cargo profile 为 base/sqlite/postgres/both 分别生成保留链接符号的优化 archive,共享一个构建缓存。相同输入和密钥的重复打包一致,不等同于跨机器源码构建一致。
作者配置的可选 `runtimes` 已接 Python/Node/Go 完整运行/构建输入,制作器与 Worker 共用 manifest 和文件闭包校验。排序且固定元数据的 gzip/tar、registry 描述统一进入顶层发行签名;Go SDK、Adapter 和依赖的编译共用 `-trimpath`,避免随机临时目录改变 Worker 与共享缓存身份。LLVM 的二进制资源附件复用既有摘要去重,在 verify 前初始化常量,IR 仍限8 MiB;附件最多4096项、单项128 MiB/总256 MiB,共享编译请求384 MiB、产物320 MiB,不透明 artifact 仍64 MiB。Linux x86_64 三生态签名安装、受管 `check/run/build`、三条共享缓存及移除源码/机器安装后无系统语言环境的独立执行已通过,包含Python/Node源码构建原生依赖与离线收据重放。Linux签名首装、旧签名模板升级、篡改拒绝、双项目及真实双UID共享核心亦已通过自有完整验收。Linux root 沙箱、真实第三方高级依赖、双 CMS/PG 和 LLVM 容量报告已补齐;受限 AppArmor 非 root 入口和定向 CI 质量门也已完成。公开 Linux x86_64 v0.1.3 发行包的匿名下载、在线首装和更新已验收;Linux ARM64 应用交叉构建已支持,其他宿主平台的产品代码及完整发行资产仍待适配。长时间压力测试不能由这些定向结果替代。
作者配置的可选 `runtimes` 已接 Python/Node/Go 完整运行/构建输入,制作器与 Worker 共用 manifest 和文件闭包校验。排序且固定元数据的 gzip/tar、registry 描述统一进入顶层发行签名;Go SDK、Adapter 和依赖的编译共用 `-trimpath`,避免随机临时目录改变 Worker 与共享缓存身份。LLVM 的二进制资源附件复用既有摘要去重,在 verify 前初始化常量,IR 仍限8 MiB;附件最多4096项、单项128 MiB/总256 MiB,共享编译请求384 MiB、产物320 MiB,不透明 artifact 仍64 MiB。Linux x86_64 三生态签名安装、受管 `check/run/build`、三条共享缓存及移除源码/机器安装后无系统语言环境的独立执行已通过,包含Python/Node源码构建原生依赖与离线收据重放。Linux签名首装、旧签名模板升级、篡改拒绝、双项目及真实双UID共享核心亦已通过自有完整验收。历史发行曾验证 Linux root 沙箱及受限 AppArmor 非 root 入口;当前源码已移除该执行机制,历史沙箱结果不能作为新版直执行链的验收。真实第三方高级依赖、双 CMS/PG 和 LLVM 容量报告属于原有验收范围。公开 Linux x86_64 v0.1.3 发行包的匿名下载、在线首装和更新已验收;Linux ARM64 应用交叉构建已支持,其他宿主平台的产品代码及完整发行资产仍待适配。长时间压力测试不能由这些定向结果替代。
database 租户模式把 verify 返回的内部 tenant ModelId 放入同一 task-local 调用域。`global type` 继续使用平台连接,其他 Model、自动 REST 与 Job 通过 `StorageBinding` 选择已显式迁移且 fingerprint 匹配的租户物理库;缺少上下文或 ready marker 直接失败。runtime tenant manager 对 `(connection, tenant_id)` 池设置总量与 idle 回收,生成的 `tenant migrate` 入口按稳定顺序迁移全部 tenant Model/Job 后才写本地和 control marker;PostgreSQL 先通过控制库幂等建租户库。User Job 持久化 Provider/站点/session/租户声明和已通过的能力名,Worker 重新调用静态 verify 并使用最新权限复核,不能把历史任务降级为 System。table/field 模式尚未实现,不能在固定表 SQL 上只补一个配置分支。