Commit Graph

2188 Commits

Author SHA1 Message Date
lyon 69d5264360 fix: make workbench trace migration idempotent 2026-06-20 20:24:48 +08:00
Lyon 4bd7ef5c96 Merge pull request #1761 from pikasTech/fix/1753-terminal-outbox
fix: recover Workbench terminal outbox projection
2026-06-20 20:15:31 +08:00
lyon bad5a478bd fix: recover Workbench terminal outbox projection 2026-06-20 20:12:01 +08:00
Lyon c4e44e1db8 Merge pull request #1760 from pikasTech/fix/1753-terminal-recovery
fix: 恢复 AgentRun terminal 投影
2026-06-20 20:06:09 +08:00
lyon 800f674d5c fix: recover AgentRun terminal projection 2026-06-20 20:05:13 +08:00
Lyon 49c6fad495 Merge pull request #1755 from pikasTech/fix/1745-workbench-trace-diagnostics
修复 Workbench trace events 误报与错误诊断卡片
2026-06-20 19:46:18 +08:00
lyon 6ab94f23c8 fix: clarify workbench trace event diagnostics 2026-06-20 19:43:54 +08:00
Lyon 4f7e55e2d8 fix: PJ2026-0104010803 P5 残余 events.at(-1) 读侧推理清理 + code-agent metric status (#1759)
useTraceSubscription.ts:
- mergeTraceResults: lastEventLabel 不 fallback 到 events.at(-1)
- mergeTraceSnapshots: lastEventLabel 不 fallback 到 events.at(-1)
- traceSnapshotSignalKey: 不从 events.at(-1) 推导 signal key

server-code-agent-http.ts:
- recordCodeAgentProjectionMetric: status 只读 projection.status
- source 固定为 workbench_read_model

负向源码扫描确认:
- result?.status ?? trace?.status: 消除
- events.at(-1) lifecycle 推断: 消除
- .catch(() => {}) 静默吞错: 消除
- traceStore.subscribe: 仅作为 outbox 不可用时的兼容降级

Closes #1751
Refs #1742
2026-06-20 19:42:19 +08:00
Lyon 44019f229e feat: PJ2026-0104010803 P4 前端/CLI 单读源收敛 - 删除 events.at(-1) 读侧推理 (#1758)
workbench.ts (stores):
- applyTraceHydrationResult: activityLabel 只读 result.lastEventLabel,不读 events.at(-1)
- lastEventLabel: 只读 result.lastEventLabel,不 fallback 到 events.at(-1)
- normalizeTraceSnapshot: lastEventLabel 只读 source.lastEventLabel
- mergeRunnerTrace: lastEventLabel 不从 events.at(-1) 推断

useTraceSubscription.ts:
- lastEventLabel 只读 snapshot.lastEventLabel,不读 events.at(-1)

trace-renderer.ts (CLI):
- traceNoiseSummaryRow: status 只读 trace.status/traceStatus,不 fallback 到 lastEvent.status
- 保持 lastLabel 用于展示,但不参与 lifecycle 推断

api/workbench.ts:
- 添加注释标记 observedAt/lastEventAgeMs 为 diagnostic-only,不作用户可见相对时间权威

Closes #1750
Refs #1742
2026-06-20 19:37:35 +08:00
Lyon 9574e2b514 feat: PJ2026-0104010803 P3 后端读侧推理清零 - session list + metric status 只读 projection (#1757)
server-workbench-http.ts:
- sessionListProjectionOptions: 当 session snapshot 已有 durable projection 字段
  (projectionStatus/terminal/sealedAt) 时,直接使用 projection 字段构建 turn projection,
  不再从 compactSessionTraceResult/compactSessionTraceSnapshot 多来源混合
- recordWorkbenchProjectionMetric: status 只读 projection.status,不再 fallback 到
  result?.status ?? trace?.status;source 固定为 workbench_read_model
- SPEC header 更新到 draft-2026-06-20-p3-read-side-zero

workbench-turn-projection.ts:
- SPEC header 更新到 draft-2026-06-20-p1-zero-split-durable-realtime

Closes #1749
Refs #1742
2026-06-20 19:34:52 +08:00
Lyon 7c5a1f8c5b feat: PJ2026-0104010803 P2 SSE/realtime 无状态化 - durable outbox cursor replay (#1756)
server-workbench-http.ts:
- handleWorkbenchRealtimeHttp 优先从 durable outbox 读取 (readWorkbenchProjectionOutbox)
- 当 runtimeStore 支持 outbox 时,SSE 用 polling cursor replay 代替 traceStore.subscribe
- outbox 不支持时保留内存 traceStore.subscribe 作为兼容降级
- terminal commit 从 outbox terminal 行触发 snapshot + trace realtime
- 新增 HWLAB_WORKBENCH_SSE_OUTBOX_POLL_MS 环境变量控制 poll 间隔

workbench-facts-store.ts:
- 新增 subscribeDurableProjection 方法,从 durable outbox polling 读取
- subscribeTrace 保留兼容(内存 trace),新增 durable projection subscription 入口
- SPEC header 更新到 draft-2026-06-20-p1-zero-split-durable-realtime

cloud-api 重启后 SSE 从 DB outbox cursor 继续输出,不依赖内存 listener

Closes #1748
Refs #1742
2026-06-20 19:31:49 +08:00
Lyon b254c1875e feat: PJ2026-0104010803 P1 durable projection outbox + DB constraints + error visibility (#1754)
DB migration (0001_cloud_core_skeleton.sql):
- Add (trace_id, source_event_id) unique index on workbench_trace_events
- Add (trace_id, projected_seq) unique index on workbench_trace_events
- Add workbench_projection_outbox table with BIGSERIAL outbox_seq

Schema (schema.ts):
- Bump CLOUD_RUNTIME_DURABLE_ADAPTER_SCHEMA_VERSION to v5
- Add workbench_projection_outbox to CLOUD_RUNTIME_DURABLE_TABLE_COLUMNS

Runtime store (runtime-store.ts):
- Add persistWorkbenchProjectionOutbox method
- Add readWorkbenchProjectionOutbox method for SSE cursor replay
- Write outbox rows in writeWorkbenchFacts for trace events and terminal turns
- Outbox write errors are logged, not silently swallowed

Trace store (code-agent-trace-store.ts):
- persistTraceEvent no longer uses .catch(() => {}) to swallow errors
- Projection write errors are logged with traceId/sourceEventId for diagnostics
- Sync errors also logged instead of empty catch block

SPEC headers updated to draft-2026-06-20-p1-zero-split-durable-realtime

Closes #1747
Refs #1742
2026-06-20 19:29:44 +08:00
Lyon e54a0001c0 Merge pull request #1741 from pikasTech/fix/1740-user-billing-integration
test: 收敛 user-billing AgentRun 异步覆盖
2026-06-20 18:18:11 +08:00
lyon 062df3bf49 test: align user billing async agentrun coverage 2026-06-20 18:17:30 +08:00
Lyon 1aea44d897 Merge pull request #1739 from pikasTech/fix/1737-workbench-projection
fix: persist manual Workbench sessions
2026-06-20 17:00:06 +08:00
lyon 3718b5d77d fix: persist manual workbench sessions 2026-06-20 16:58:31 +08:00
Lyon 69d07eb109 Merge pull request #1738 from pikasTech/feat/1708-p6-validation
test(web): 补齐用户可见错误诊断矩阵
2026-06-20 16:56:01 +08:00
lyon ff60ff853b test(web): cover user-visible error diagnostics matrix 2026-06-20 16:54:59 +08:00
Lyon eaacdafe33 Merge pull request #1736 from pikasTech/feat/1708-p5-trace-explorer
feat(web): 配置 Trace Explorer 打开入口
2026-06-20 16:28:46 +08:00
lyon c73b19fcaa feat(web): configure trace explorer links 2026-06-20 16:26:54 +08:00
Lyon c5f51f2b1b Merge pull request #1734 from pikasTech/fix/1730-workbench-timing-ticker
fix(web): 推进 Workbench 运行中 timing 文案
2026-06-20 16:14:23 +08:00
lyon 241366b264 fix(web): advance workbench timing labels with browser ticker 2026-06-20 16:10:36 +08:00
Lyon 6d014f1bd8 Merge pull request #1733 from pikasTech/feat/1708-p4-workbench-diagnostics
feat(web): 展示 Workbench 诊断信封
2026-06-20 16:04:10 +08:00
lyon d947b9e4e8 feat(web): surface Workbench diagnostics 2026-06-20 16:03:05 +08:00
Lyon cf219821f0 Merge pull request #1732 from pikasTech/feat/1708-p3-api-error
feat(web): surface API error diagnostics
2026-06-20 15:39:57 +08:00
Lyon b181cccde2 Merge pull request #1731 from pikasTech/fix/1729-workbench-session-order
修复 Workbench session list 默认排序
2026-06-20 15:38:17 +08:00
lyon 98b94b7fd1 feat(web): surface api error diagnostics 2026-06-20 15:38:11 +08:00
lyon 11e2f08e70 fix: order workbench sessions by updated desc 2026-06-20 15:36:41 +08:00
Lyon ef8765828a Merge pull request #1727 from pikasTech/feat/1708-p2-error-envelope
[1708-P2] 统一 Cloud API 错误诊断 envelope
2026-06-20 15:09:50 +08:00
lyon b139ffd8e4 feat: normalize cloud api error diagnostics 2026-06-20 15:08:33 +08:00
Lyon 199ee18b58 Merge pull request #1718 from pikasTech/feat/1708-p1-trace-context
[1708-P1] 贯通 Cloud API OTel trace 响应头
2026-06-20 14:55:53 +08:00
Lyon 7a1a8af1d2 Merge pull request #1717 from pikasTech/codex/hwlab-1697-timing-header-followup
fix: 收敛 Workbench 消息头 timing 投影
2026-06-20 14:55:31 +08:00
lyon efafeccfb9 feat: attach cloud api otel trace headers 2026-06-20 14:54:51 +08:00
lyon 03942afc5c fix: 收敛 workbench 消息头 timing 投影 2026-06-20 14:54:04 +08:00
Lyon 0d91fe117f Merge pull request #1707 from pikasTech/codex/1706-upstream-unavailable-copy
统一 Cloud Web 上游不可达错误文案
2026-06-20 14:27:46 +08:00
lyon 32a66f18b3 fix: 统一上游不可达错误文案 2026-06-20 14:26:44 +08:00
Lyon bcd90daf9c Merge pull request #1705 from pikasTech/fix/1698-trace-display-time
修复 Workbench trace 行首时间按显示时区渲染
2026-06-20 14:08:07 +08:00
lyon 766f41d415 fix: render workbench trace clocks with display timezone 2026-06-20 14:07:16 +08:00
Lyon 5124713374 Merge pull request #1704 from pikasTech/codex/hwlab-1697-timing-header
fix(workbench): Code Agent 消息头显示 timing
2026-06-20 13:57:52 +08:00
lyon 4a9498d720 fix(workbench): expose code agent timing metadata 2026-06-20 13:55:57 +08:00
Lyon d2e147c019 fix: align performance summary problem counts (#1703) 2026-06-20 13:49:10 +08:00
Lyon bd4bc1fa36 Merge pull request #1702 from pikasTech/fix/1698-workbench-time-label
补充 Workbench 北京时间标签可见性
2026-06-20 13:46:16 +08:00
lyon f2a54532a2 fix: show configured workbench time label 2026-06-20 13:44:47 +08:00
Lyon 028df20e39 Merge pull request #1700 from pikasTech/fix/1698-web-timezone
修复 D601 v0.3 Workbench 时间渲染配置
2026-06-20 13:32:24 +08:00
lyon 01f72df333 fix: render workbench time from yaml config 2026-06-20 13:29:55 +08:00
Lyon 0346295ac4 Merge pull request #1699 from pikasTech/codex/hwlab-1691-thin-session-list
fix: thin workbench session list projection
2026-06-20 13:26:30 +08:00
lyon 6468263672 fix: thin workbench session list projection 2026-06-20 13:24:49 +08:00
Lyon 96704ea1d7 Merge pull request #1695 from pikasTech/codex/hwlab-1691-problem-rows
fix: separate performance problems from sample health
2026-06-20 12:47:57 +08:00
Lyon acd9831149 Fix workbench trace projection authority (#1696) 2026-06-20 12:47:18 +08:00
lyon 7448803c9d fix: separate performance problems from sample health 2026-06-20 12:46:29 +08:00