Files
sundynix-agentix/sundynix-gateway/internal/store/redis_test.go
T
Blizzard f926f6fd41 feat(obs): exec 执行轨迹 Redis 回放 —— 连晚/重连不再丢轨迹事件
执行轨迹原本只走瞬时 core NATS(sundynix.exec.<id>),SSE 连晚或刷新重连就丢掉
已发生的节点点亮/工具调用/推理过程事件。本提交把它做成与 token 流同构的可回放流:

- store: Redis Stream 函数加 channel 维度(ChannelToken="stream" / ChannelExec="exec"),
  同一套 XADD/XREAD/TTL 复用;key 按 channel 分命名空间互不串扰。
- gateway: 提交即启 startExecRecorder 后台订阅轨迹落 Redis(与 SSE 是否在线无关,
  12min 兜底含 HITL 审批等待);StreamExec 改为优先 Redis 回放 + Last-Event-ID 断点续传,
  Redis 降级回退 live NATS(streamExecLive)。

单测 streamKey channel 隔离;live:任务 done 后再连 /exec,仍从 Redis 完整回放
全程轨迹(含推理过程),Redis XLEN 对账一致。

至此「可靠性细节」两项(优雅停机 + 轨迹回放)补齐。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 14:03:31 +08:00

19 lines
480 B
Go

package store
import "testing"
// streamKey 必须按 channel 分命名空间,token 与 exec 流互不串扰。
func TestStreamKey_ChannelIsolation(t *testing.T) {
tok := streamKey(ChannelToken, "task_1")
ex := streamKey(ChannelExec, "task_1")
if tok == ex {
t.Fatalf("同任务的 token/exec 流 key 不应相同: %q", tok)
}
if tok != "sundynix:stream:task_1" {
t.Errorf("token key=%q", tok)
}
if ex != "sundynix:exec:task_1" {
t.Errorf("exec key=%q", ex)
}
}