feat(v0.1): add per-session RWO PVC foundation for true session state persistence
PR A for #770: docs + migration 007 + RBAC + types foundation. - 新增 failureKind session-store-evicted,用于区分 PVC 缺失与真协议错误 - 新增 migration 007_v01_session_state_storage:sessions 表增加 storage_* 列 + 索引 - mgr SA RBAC 增量:persistentvolumeclaims: [create, get, list, watch, delete] - 6 份 SPEC 升级(runtime-assembly / hwlab-manual-dispatch / backend-codex T7b / agentrun-runner / agentrun-mgr / services) - 显式禁止:fake app-server mock、replacement threadId、runner 启动后 copy/restore、idleTimeoutMs 拉永驻 - selftest 断言更新到 007_v01_session_state_storage 后续 PR B/C 在此基础上接入 mgr 端 PVC 生命周期 + runner 端 mount + backend 端 observability。
This commit is contained in:
@@ -32,6 +32,38 @@ Kubernetes Job runner 必须把 credential source 与 runtime home 分开:Secr
|
||||
|
||||
RuntimeAssembly P0 中 `SessionRef` 可以显式为 `null`,runner 不得把完整 `CODEX_HOME`、Secret projection 或节点 host path 当作 session store。`ResourceBundleRef` P0 收敛为 Git-only;runner 已支持把 `repoUrl + full commitId` checkout 到 `AGENTRUN_WORKSPACE_ROOT` 下的隔离目录,并记录 commit/tree 摘要,不能把用户上传文件或 env dump 混入 Git-only bundle。`toolAliases`、`promptRefs` 和 `skillRefs` 都属于该 Git-only bundle 的非敏感子资源:runner 必须在同一 checkout 中解析、校验和装配,不能从镜像默认目录、host path、旧 prompt 常量或用户长 prompt 中补齐。
|
||||
|
||||
### v0.1.1 Session state 持久化(per-session RWO PVC 直接挂载)
|
||||
|
||||
Runner 启动时若 run 携带 `storage_kind='pvc'` 的 session 引用,必须在 Job manifest 渲染阶段加一个 `agentrun-sessions` volume,把 `agentrun-v01-session-<sessionId>` PVC 直接挂到 `${CODEX_HOME}/<codex_rollout_subdir>`,并把以下 env 透传给 backend:
|
||||
|
||||
- `AGENTRUN_SESSION_PVC_NAME`:PVC 名(`agentrun-v01-session-<sessionId>`)。
|
||||
- `AGENTRUN_SESSION_PVC_NAMESPACE`:默认 `agentrun-v01`。
|
||||
- `AGENTRUN_SESSION_PVC_MOUNT_PATH`:默认 `${CODEX_HOME}/<codex_rollout_subdir>`。
|
||||
- `AGENTRUN_CODEX_ROLLOUT_SUBDIR`:默认 `sessions`。
|
||||
|
||||
边界:
|
||||
|
||||
- PVC 与 `runner-home` emptyDir 父目录共存;`auth.json` / `config.toml` / `state_*.sqlite` / `memories/` / `tmp/` / `skills/` 仍走 emptyDir;codex rollout JSONL 走 PVC。
|
||||
- `automountServiceAccountToken=false` 不变;runner 不通过 k8s API 读 PVC 内容,只把 PVC 摘要通过 `POST /api/v1/sessions/:id/storage/refresh` 写回 manager。
|
||||
- PVC 不存在 + `storage_kind='pvc'` 时 runner 启动前 manager 端短路返回 `session-store-evicted`;runner 不知道该 session。
|
||||
- 禁止 runner 启动后做 copy/restore(PR #78 已回退的 replacement 逻辑同源,禁止任何变体)。
|
||||
|
||||
Runner K8s manifest 增量(spec 形态参考):
|
||||
|
||||
```yaml
|
||||
volumes:
|
||||
- name: runner-home # emptyDir(auth.json, config.toml, state_*.sqlite...)
|
||||
emptyDir: {}
|
||||
- name: agentrun-sessions # 新增 PVC RWO
|
||||
persistentVolumeClaim:
|
||||
claimName: agentrun-v01-session-<sessionId>
|
||||
volumeMounts:
|
||||
- name: runner-home
|
||||
mountPath: /home/agentrun
|
||||
- name: agentrun-sessions
|
||||
mountPath: /home/agentrun/.codex-<profile>/<codex_rollout_subdir> # <-- 唯一改这一行
|
||||
```
|
||||
|
||||
### ResourceBundle 子资源装配
|
||||
|
||||
Runner materialize `ResourceBundleRef` 后必须按固定顺序处理子资源:先创建 `toolAliases` wrapper,再装配 `skillRefs` registry,最后读取 `promptRefs` 并生成当前 command 的 assembled initial prompt 摘要。任何子资源缺失或非法都必须按对应 failureKind 阻塞当前 command,不得继续运行后让模型自行猜测。
|
||||
|
||||
Reference in New Issue
Block a user