feat(v0.2): Code Agent 默认 sessionStorage=persistent + eviction reset UX
PR D for #770:HWLAB Cloud Web Workbench 透传 session state 真正持久化
- code-agent-agentrun-adapter.ts:
* 新 ensureAgentRunSessionPersistent:默认 sessionStorage=persistent,
调 POST /api/v1/sessions 同步建 session + PVC
* submitAgentRunChatTurn 改两步尝试:ensureSession 或 runner-jobs POST
收到 session-store-evicted 时用新 sessionId(<base>-reset-<trace8>)
+ threadId=null 重试,trace 追加 agentrun:session-reset 事件
* 新 shouldResetSessionAfterEviction / newSessionIdAfterEviction 辅助函数
- code-agent-response-contract.mjs: session-store-evicted 归
session-blocked category
- code-agent-chat.ts: 新 userMessage
「Code Agent session 存储已失效(PVC 被回收或 TTL 到期),
HWLAB 已为你开新 sessionId,可继续发送下一条消息。」
- spec-v02-hwlab-cloud-web.md: 新增 'Session state 持久化与 eviction reset'
章节,含禁止路径与实现情况表
env 控制:HWLAB_CODE_AGENT_AGENTRUN_SESSION_STORAGE=ephemeral
可退回 metadata-only 模式(PR 前默认行为)。
This commit is contained in:
@@ -91,6 +91,32 @@ Cloud Web check 通过后仍需执行 bundle build 和 dist freshness 校验,
|
||||
|
||||
阅读 docs/reference/spec-v02-hwlab-cloud-web.md,然后用 cli 手动测试以下内容:确认 trace 渲染相关单测覆盖 request、setup、commandExecution、assistant markdown 和 completion row;该测试必须能在无浏览器、无 Playwright、无公网、无真实 provider 的环境中执行。
|
||||
|
||||
## Session state 持久化与 eviction reset
|
||||
|
||||
HWLAB v0.2 Code Agent chat turn 默认走 `sessionStorage=persistent`:每次 turn 由 `code-agent-agentrun-adapter.ts` 在创建 run 之前显式调 `POST /api/v1/sessions`,让 AgentRun v0.1 同步创建 RWO PVC(`agentrun-v01-session-<sessionId>`,1Gi,StorageClass 走 env `AGENTRUN_SESSION_STORAGE_CLASS` 默认 `local-path`)。runner Job manifest 渲染时多挂一个 `agentrun-sessions` volume + `AGENTRUN_SESSION_PVC_NAME` / `_NAMESPACE` / `_MOUNT_PATH` / `AGENTRUN_CODEX_ROLLOUT_SUBDIR` env,使 codex app-server 自己把 rollout JSONL 写进 PVC,跨 runner pod 重建天然 `thread/resume:completed`。
|
||||
|
||||
### Eviction reset UX
|
||||
|
||||
当 AgentRun v0.1 上报 `failureKind=session-store-evicted`(PVC 被删或 TTL 到期)时,HWLAB cloud-api 走 reset UX:
|
||||
|
||||
- 同 `conversationId`,发新 `sessionId`(`newSessionIdAfterEviction(baseSessionId, traceId)` = `<base>-reset-<trace8>`),`threadId=null` 强制走 `thread/start`。
|
||||
- 旧 session 的 `storageKind` 已被 AgentRun 标为 `evicted`,HWLAB adapter 不再 reuse 旧 mapping。
|
||||
- Workbench 把 `errorCode=session_storage_evicted` 归到 `session-blocked` category,UI 文案与 `session_failed` 区分:「Code Agent session 存储已失效(PVC 被回收 / TTL 到期),HWLAB 已为你开新 sessionId,可继续发送下一条消息。」
|
||||
|
||||
禁止路径:
|
||||
|
||||
- 不允许 fake `thread/resume:completed`(PR #78 已锁定的 v0.1 contract)。
|
||||
- 不允许 `idleTimeoutMs` 拉成永驻当成本特性。
|
||||
- 不允许 runner Job 启动后再做 copy/restore(本方案撤掉的路径,禁止复活)。
|
||||
|
||||
### 实现情况
|
||||
|
||||
| 规格项 | 状态 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| 调 POST /api/v1/sessions 同步建 session + PVC | 已实现 | `code-agent-agentrun-adapter.ts::ensureAgentRunSessionPersistent` 默认 `sessionStorage=persistent`;env `HWLAB_CODE_AGENT_AGENTRUN_SESSION_STORAGE=ephemeral` 可退回 metadata-only 模式。 |
|
||||
| runner Job 直接挂载 PVC | 已实现(agentrun-v01 侧 PR A/B/C 已上线) | HWLAB 侧无需额外代码,runner Job manifest 由 AgentRun v0.1 渲染。 |
|
||||
| eviction reset UX | 已实现 | submitAgentRunChatTurn 走两步尝试,第一步在 ensureSession 或 runner-jobs POST 收到 `session-store-evicted` 时用新 sessionId + `threadId=null` 重试。 |
|
||||
| UX 错误码 `session_storage_evicted` | 待 PR D 收口 | `code-agent-response-contract.mjs` 把 `session-store-evicted` 归 `session-blocked`;`code-agent-chat.ts` 加 userMessage。 |
|
||||
## 规格的实现情况
|
||||
|
||||
| 规格项 | 状态 | 说明 |
|
||||
|
||||
Reference in New Issue
Block a user