Commit 54515e1
feat: stream session manager + always show Claude Code built-in models, bump v0.17.4
Stream Session Manager — 切换会话不中断流:
- src/lib/stream-session-manager.ts(新建): 全局单例管理所有 SSE 流,
使用 globalThis 模式(同 conversation-registry.ts)保证 HMR 不丢状态。
管理 AbortController、idle timeout (330s)、tool timeout 自动重试、
5 分钟 GC,所有 SSE 回调写入 snapshot 并 emit 事件给订阅者。
导出 startStream / stopStream / subscribe / getSnapshot /
respondToPermission / clearSnapshot 等 API。
- src/types/index.ts: 新增 ToolUseInfo、ToolResultInfo(从 ChatView 提取)、
StreamPhase、SessionStreamSnapshot、StreamEvent、StreamEventListener 类型,
作为管理器与 ChatView 之间的数据契约。
- src/components/chat/ChatView.tsx(重构): 删除 abortControllerRef 及
unmount abort effect(此前切换会话的根因)、整个 fetch/SSE 逻辑约 280 行、
accumulatedRef/toolUsesRef/toolResultsRef/beforeunload handler。
改为 subscribe() + getSnapshot() 订阅模式,unmount 仅 unsubscribe
不 abort,mount 时通过 getSnapshot 恢复进行中的流状态。
sendMessage / stopStreaming / handlePermissionResponse 全部委托管理器。
- src/hooks/usePanel.ts: PanelContextValue 新增
activeStreamingSessions: Set<string> 和
pendingApprovalSessionIds: Set<string>,支持多会话并发流指示。
- src/components/layout/AppShell.tsx: 监听 stream-session-event 窗口事件
更新 activeStreamingSessions / pendingApprovalSessionIds Set 状态;
将 beforeunload handler 从 ChatView 移至此处(全局感知所有流)。
- src/components/layout/ChatListPanel.tsx: 侧栏流指示器改用
activeStreamingSessions.has() / pendingApprovalSessionIds.has(),
支持同时显示多个会话的流/审批状态。
模型选择器始终显示 Claude Code 内置模型:
- src/app/api/providers/models/route.ts: 移除 hasEnvKey 环境变量检测条件,
始终显示 "Claude Code" provider 组(Sonnet 4.6 / Opus 4.6 / Haiku 4.5)。
根因:Claude Code CLI 通过 `claude login` 存储凭证在 ~/.claude/ 下,
SDK 子进程可以读取,但 Next.js 进程的 process.env 中没有对应变量,
导致之前的 hasEnvKey 检测失败时模型选择器不显示内置模型。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>1 parent 0c379e5 commit 54515e1
File tree
9 files changed
+855
-436
lines changed- src
- app/api/providers/models
- components
- chat
- layout
- hooks
- lib
- types
9 files changed
+855
-436
lines changedSome generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
73 | 73 | | |
74 | 74 | | |
75 | 75 | | |
76 | | - | |
77 | | - | |
78 | | - | |
79 | | - | |
80 | | - | |
81 | | - | |
82 | | - | |
83 | | - | |
84 | | - | |
85 | | - | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
86 | 85 | | |
87 | 86 | | |
88 | 87 | | |
| |||
102 | 101 | | |
103 | 102 | | |
104 | 103 | | |
105 | | - | |
106 | | - | |
107 | | - | |
108 | | - | |
109 | | - | |
110 | | - | |
111 | | - | |
112 | | - | |
113 | | - | |
114 | | - | |
115 | 104 | | |
116 | 105 | | |
117 | 106 | | |
| |||
0 commit comments