Feat/devtools#6
Merged
Merged
Conversation
- 新建 @stello-ai/devtools 包 - Server: startDevtools() 入口、REST 路由(sessions/config/turn/fork/archive)、WS 事件流 - 前端: React + Vite + Tailwind CSS + 侧边栏路由(5 个占位页面) - 原木橙色配色(#C4793D 主色) - 6 个 REST 路由测试全部通过 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Settings 页面覆盖 AgentConfig 全量配置: - Agent Connection / Storage Mode / Scheduling Policy - Runtime & Orchestration / Split Guard - Tools & Skills 列表 / Hooks & Session Adapter Inspector 页面双列数据卡片: - L3 对话记录 / L2 Memory / Insights / System Prompt / Session Meta Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Conversation 页面三栏布局: - 左侧 Session 列表(搜索过滤 + 状态指示) - 中间对话区(气泡消息 + 工具调用卡片 + 输入栏) - 右侧上下文面板(L3/L2/Insights/Prompt 四 Tab 切换) Events 页面: - Live 指示灯 + 过滤器药丸按钮 - 颜色编码事件行(turn/consolidate/integrate/fork/error) - 错误事件行高亮背景 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
手写 Canvas 渲染引擎: - 同心环布局算法(BFS 分层 + 随机抖动) - 节点大小按 turn 数映射,颜色按状态区分 - 父子实线连接 + 跨分支引用虚线 - 节点/连线发光效果 - 鼠标 hover tooltip + 点击选中信息面板 - 信息面板显示 Status/Turns/L2/Children/LastActive + Fork/Archive 操作 - 底部图例(Main/Active/Leaf/Archived/Cross-ref) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
交互优化: - 页面切换淡入动画 + 侧边栏 hover/active 缩放过渡 - Topology 节点呼吸脉冲 + hover 邻接高亮(非相邻节点变暗) - Topology 选中面板滑入动画 + tooltip 弹出动画 - Conversation 消息逐条淡入 + 工具调用卡片 hover 效果 - 输入栏 focus 高亮 + 发送按钮状态感知 - Events 行 hover 高亮 + 过滤切换淡入 数据层: - api.ts: REST 客户端(fetchSessions/fetchConfig/sendTurn/forkSession/archiveSession) - use-api.ts: 通用 loading/error/refetch hook - ws.ts: WebSocket 客户端(自动重连 + 订阅发布) - Settings 页接入真实 fetchConfig API - App 启动时初始化 WS 连接 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 面板用 CSS transition width 300ms 平滑展开/收起,替代条件渲染的突兀弹出 - 面板背景从半透明改为实色 #2A2520,字体亮度从 #E5E4E1 提升到 #F0EDE8 - 属性值字体加粗(font-semibold),label 字号从 11px 提到 12px - 新增 OPEN IN 区域:Conversation / Inspector 跳转按钮 - 新增关闭按钮(X),点击空白区域也可关闭 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- startDevtools() 自动定位 dist/web/ 并 serve 静态文件 - SPA fallback(未匹配路径返回 index.html) - build 流程:先 vite build 前端,再 tsup 打包 server - 兼容 ESM/CJS 的 webDir 定位(import.meta.url + __dirname fallback) - 未构建前端时控制台提示警告 - 自动打开浏览器(仅前端已构建时) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- api.ts 类型化:SessionNode / AgentConfig 接口 - Topology: 从 /api/sessions 拉取节点数据,失败 fallback mock - Conversation: session 列表 + skills/tools 数量从 API 拉取 - Settings: 已在前序 commit 接入 fetchConfig - 所有页面 API 不可用时保持 mock 数据,不白屏 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Conversation: - 输入框回车/点击发送,调用 sendTurn API - 用户消息即时追加到对话流 - API 响应追加为 assistant 消息 - 发送中 loading 旋转图标 + 按钮禁用 - 错误消息展示(API 不可用时) Events: - 订阅 WS 消息流,实时追加新事件到列表顶部 - WS 消息类型映射为 EventType(turn/fork/error) - Live/Offline 指示灯根据 WS 连接状态切换 - mock 数据作为初始值,WS 事件追加在前面 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Conversation 流式响应: - 优先 WS session.stream 发送,逐字追加到消息气泡 - 监听 stream.delta(增量)+ stream.end(完整结果) - turn.complete 兼容非流式回退 - WS 不可用时 fallback REST sendTurn - 30s 超时保护 Inspector 真实数据: - 新增 GET /api/sessions/:id/detail 端点(返回 L3 records + L2 memory + scope) - Inspector 页面从 API 拉取数据,loading 状态 + 空数据提示 - Session 选择器下拉菜单(弹出动画) - L3 记录滚动区域(max-h-80) - L2 显示 consolidated/pending 状态 - Meta 卡片显示真实 children 列表 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
切换 session 时调用 fetchSessionDetail 拉取该 session 的 L3 records, 转换为消息列表替换当前对话。API 不可用时清空消息(首个 session 保留 mock)。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Camera 系统: - 拖拽空白区域平移画布 - 滚轮缩放(以鼠标为中心,0.3x ~ 3x) - 拖拽节点移动位置(不平移画布) - 点击节点打开面板(区分点击和拖拽:3px 阈值) 物理惯性: - 释放拖拽后画布按最后速度惯性滑动 - 摩擦系数 0.92 指数衰减 - 速度 < 0.1 时停止 屏幕↔世界坐标变换: - screenToWorld / worldToScreen 工具函数 - hover/click 命中测试经过逆变换 - 渲染经过 camera 正变换 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Topology 双击跳转: - 双击节点直接跳转 /conversation?session=<id> - Conversation 页面读取 URL 参数自动选中对应 session Settings 配置可写回: - Select/NumberInput 组件改为真正可交互(原生 select + input) - 所有配置项绑定 state:Trigger/EveryN/idleTtlMs/Strategy/SplitGuard - Save Changes 按钮调用 PATCH /api/config - 保存成功/失败状态反馈(Saved 绿色 / Error 红色,2s 后恢复) - Server 端新增 PATCH /config 端点接收配置更新 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
在 demo server 启动时自动启动 DevTools(端口 4800)。 设置 DEVTOOLS=0 可禁用,DEVTOOLS_PORT=xxx 可改端口。 使用方式: export OPENAI_API_KEY=your_key cd demo/stello-agent-chat && npx tsx server.ts # Demo: http://localhost:3477 # DevTools: http://localhost:4800 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
tsx 直接运行源码时 import.meta.url 指向 src/ 目录, 需要额外查找 ../../dist/web/ 和 ../dist/web/ 路径。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
tsup 的 clean: true 会清空 dist/,如果先 build:web 再 build:server 会导致 dist/web/ 被删除。改为先 server(clean)再 web。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
问题:routes 使用了不存在的 getChildren() 方法,导致 500。 修复: - GET /sessions 改用 agent.sessions.listAll()(返回 SessionMeta[]) - GET /sessions/tree 新增,调用 agent.sessions.getTree()(递归 SessionTreeNode) - GET /sessions/:id/node 新增,调用 agent.sessions.getNode()(TopologyNode) - GET /sessions/:id/enter 和 /leave 新增 - 全局 onError 处理,500 时输出详细错误日志 - 前端 api.ts 类型对齐:SessionMeta/TopologyNode/SessionTreeNode/TurnResult - Topology 用 fetchSessionTree 获取完整拓扑关系 - Conversation REST fallback 先 enterSession 再 turn - Inspector 用 SessionMeta 替代 SessionNode - 测试用例更新(7 个,全部通过) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
所有页面不再 fallback 到 mock 数据: - Topology: 空数组起步,API 失败显示红色错误卡片 - Conversation: 空列表起步,加载失败显示错误页面,切换 session 失败显示内联错误 - Events: 空列表起步,仅从 WS 实时接收事件 - Settings: tools/skills 未加载时显示 Loading 而非假数据 - Inspector: 已经是纯 API 驱动(无变动) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
SessionTreeNode 实际格式是 {id, label, status, children[]},
不是前端之前假设的 {node: TopologyNode, meta: SessionMeta, children[]}。
修复:
- api.ts: SessionTreeNode 类型改为 {id, label, status, children}
- 移除不存在的 TopologyNode 前端类型和 fetchNode
- Topology: 从 tree 递归展平时自行推导 parentId
- Conversation/Inspector: 清理无效的类型引用
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
白屏原因:右侧上下文面板引用了已删除的 mockL3Records 变量。 修复: - L3 tab 改为显示当前 messages 列表(从 API 获取的真实数据) - L2/Insights/Prompt tab 显示指引文字(完整数据在 Inspector/Settings 查看) - 移除 ArrowDownRight import(不再需要) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Error Boundary:
- 全局 ErrorBoundary 包裹所有页面路由
- 渲染崩溃时显示错误信息 + Try Again 按钮,不再白屏
- 路由切换时重置 error 状态(key={location.pathname})
删除旧 demo 前端:
- 移除 demo/stello-agent-chat/src/, index.html, vite.config.ts, dist/, public/
- server.ts 去掉 3477 端口 HTTP server 和静态文件 serve
- 唯一 UI 入口改为 DevTools(localhost:4800)
- 启动时自动打开浏览器
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
修复: - 右侧面板不再硬编码,全部从 fetchSessionDetail 读取 - L3 tab: 优先显示 API records,无 records 时显示本地消息 - L2 tab: 显示真实 L2 memory(consolidated 状态 badge) - Insights tab: 显示真实 scope 数据 - Prompt tab: 改为 Session Info,显示真实 meta(ID/label/status/turns/created) - 发送消息后自动刷新 detail(更新 L2/records) - 简化发送逻辑:移除复杂的 WS stream 尝试,直接用 REST enterSession + turn Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
输入框: - Enter 加 preventDefault 防止默认行为 - 加 isComposing 检查避免中文输入法误触 对话记录持久化: - demo 的 onRoundEnd hook 调用 lifecycle.afterTurn 写入 MemoryEngine - turn 后 records 和 turnCount 正确更新 - 刷新页面后 fetchSessionDetail 能拿到历史对话 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Demo 文件持久化: - MemoryEngine 从内存改为 NodeFileSystemAdapter 文件存储 - records/memory/scope/core 全部持久化到 tmp/stello-agent-chat/memory/ - 重启后对话记录和 turnCount 完整恢复 - 启动时恢复所有已有子 session 运行时实例 - 复用已有 root session,不重复创建 Topology 面板: - Children 显示 label 而非 UUID,truncate 防换行 - L2 Memory 从 fetchSessionDetail 读取真实状态 - 有 L2 内容时展开预览卡片 - Turns 从 detail.meta.turnCount 读取 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Session 列表同步: - turn 完成后 500ms 延迟刷新(等 afterTurn hook 完成) - WS 监听 session.forked/left 事件即时刷新 - 5s 轮询兜底 文件持久化(demo): - MemoryEngine 改为 NodeFileSystemAdapter 文件存储 - 启动时恢复已有子 session 运行时实例 - 复用已有 root session Topology 面板真实数据: - Children 显示 label(非 UUID) - L2 从 fetchSessionDetail 读取,有内容展开预览 浏览器端到端验证: - 发消息创建子 session → 列表自动出现 test-sync - turns 计数实时更新 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
GET /api/config: - 新增 runtime.idleTtlMs 真实值 - 返回 immutable 列表标记不可运行时修改的配置 PATCH /api/config: - 区分 applied(动态生效)和 needsRestart(需重启) - 返回 note 说明哪些配置需要重启 - idleTtlMs 可动态修改 - scheduling/splitGuard/strategy 标记为 immutable 前端 Settings: - Save 后如果有 needsRestart,显示警告文字 5s - 纯动态修改显示 Saved 2s Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
从 server 包移植到 core 包: - createDefaultConsolidateFn / createDefaultIntegrateFn - DEFAULT_CONSOLIDATE_PROMPT / DEFAULT_INTEGRATE_PROMPT - LLMCallFn 类型 server 包改为从 core 重新导出。demo 启用 LLM 驱动的 consolidation/integration。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
新增 POST /api/sessions/:id/consolidate 端点: - 读取 L3 records + 当前 L2 - 调用 agent.config.session.consolidateFn 生成新 L2 - 写入 MemoryEngine Conversation L2 tab: - Generate L2 / Regenerate 按钮 - 生成中 loading 状态 - 生成后立即显示结果 Settings Scheduling Policy: - 策略说明文字(什么是 consolidation / integration) - manual 模式提示手动触发方式 - everyNTurns 选中时才显示 N 输入框(条件渲染) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
架构:
- EventBus: 事件收集器,支持 on/emit
- wrapAgentWithEvents: Proxy 包装 agent 方法,拦截 turn/enter/leave/fork/archive 自动广播
- 事件广播到所有 WS 客户端
捕获的事件:
- turn.start / turn.end(含 toolCalls 数和内容摘要)
- session.enter / session.entered / session.leave / session.left
- fork.start / fork.created(含 childId 和 label)
- session.archived
- consolidate.start / consolidate.done(含 l2Length)
前端 Events 页面:
- 正确解析 EventBus 格式 {type, sessionId, timestamp, data}
- 事件描述从 data 字段提取关键信息
- 时间戳从 server 端获取
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ws.ts 已无任何引用(Conversation/Events/Topology 都用组件自管理 WS),安全删除。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
EditableNumber/EditableSelect 未编辑态显示铅笔图标 + 高亮边框,明确可点击编辑。 Scheduling 无 Scheduler 和 SplitGuard 为 null 时显示 Info 提示框,说明需要在代码中配置。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
buildSession/buildMainSession 中 llm 从闭包常量改为惰性读取 options.llm, 新增 setLLM(adapter) 方法修改 options.llm 引用,立即对后续 send/stream 生效。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
DevtoolsOptions 新增 llm: LLMConfigProvider(getter/setter 回调)。 后端 GET /llm 返回当前配置,PATCH /llm 切换 model/baseURL/apiKey。 前端 Settings 页面新增 LLM Provider 卡片,支持编辑态表单 + API Key 遮罩。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
llm adapter 改为 mutable ref(currentLlm),llmCall 实时读取。 startDevtools 传入 llm getter/setter,切换时遍历所有 session 调用 setLLM。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ion/Integration 提示词编辑 三个新 DevtoolsOptions provider: - sessionAccess: 读写 session 的 system prompt(Inspector 页面可编辑) - prompts: Consolidation/Integration 提示词 getter/setter(Settings 页面可编辑) - LLM config 扩展 temperature/maxTokens 字段 后端新增 GET/PATCH /prompts、GET/PUT /sessions/:id/system-prompt 端点。 Inspector System Prompt 卡片改为可编辑文本区(hover 显示编辑按钮)。 Settings 新增 Prompts 卡片,LLM 卡片增加 Temperature/Max Tokens 字段。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
session system prompt 通过 sessionAccess provider 暴露读写。 consolidation/integration prompt 改为 mutable ref,通过 prompts provider 暴露。 LLM config 扩展 temperature/maxTokens,llmCall 实时读取。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…注入 + Turn 统计 六个新功能: - Settings: Tools/Skills 列表支持 toggle 开关(禁用后不传给 LLM) - Inspector: Scope/Insights 可编辑(hover 显示编辑按钮) - Inspector: Integrate 按钮手动触发 integration cycle - Inspector: Inject Record 向 L3 注入自定义消息 - Conversation: 每条 assistant 消息显示 tool rounds / tool calls 统计 新增 DevtoolsOptions provider: ToolsProvider, SkillsProvider, IntegrationProvider 扩展 SessionAccessProvider: getScope/setScope/injectRecord Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ration) tools: 通过 disabledTools Set 过滤 getToolDefinitions 输出 skills: 通过 disabledSkills Set 过滤 sessionAccess: 扩展 getScope/setScope/injectRecord integration: 手动触发收集所有子 session L2 → integrateFn → 写入 synthesis + insights Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
新增 lib/i18n.ts:230+ 条中英翻译字典,LanguageContext + useI18n hook,localStorage 持久化语言偏好。 App.tsx:I18nContext.Provider 包裹,侧边栏底部新增语言切换按钮(Globe 图标)。 所有 6 个页面接入 t() 函数:Topology / Conversation / Inspector / Events / Settings。 默认语言为中文,点击切换按钮切换英文。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
globals.css 重构为 CSS 变量驱动:light/dark 两套色值通过 [data-theme] 属性切换。 暗色主题复用 Topology 星空图色系(#1A1815 背景、#F0EDE8 文字、#D89575 主色)。 新增 lib/theme.ts:useTheme hook + localStorage 持久化。 App.tsx 侧边栏底部新增月亮/太阳切换按钮。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Canvas renderFrame 接受 CanvasTheme 参数,light/dark 两套色值: - 浅色:背景 #F5F4F1,连线/引用线用暖棕色低透明度,节点色更饱和 - 深色:保持原有星空暗色 Topology 面板/tooltip/右键菜单的硬编码暗色全部改为 CSS 变量类(bg-card/text-text/border-border), 跟随主题自动切换。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
useTheme 从独立 state 改为 ThemeContext,App 顶层 useThemeProvider 创建唯一状态源。 修复切换主题时 Topology Canvas 不刷新的 bug(之前各组件各自持有独立 state)。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
场景:留学总顾问(Main Session)+ 各地区专家(子 Session),跨区域知识共享。 核心改动: - 留学咨询 system prompts:主顾问引导 fork,地区专家深入分析 - 启用 Scheduler:everyNTurns=3 自动 consolidate,afterConsolidate 自动 integrate - 启用 SplitGuard:minTurns=2, cooldownTurns=3 - 新增 save_note 工具:保存调研结论到 scope,供 integration 参考 - LLM 主动 fork:prompt 引导在出现新地区时自动创建子会话 - Consolidation/Integration 提示词针对留学场景定制 - maxTokens 提升到 2048 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
根因:session.consolidate() 把 L2 写入 InMemoryStorageAdapter, 但 DevTools 从 MemoryEngine(文件系统)读取,两个不同存储导致读不到。 修复:wrapSession.consolidate 完成后,读取 session.memory() 同步写入 MemoryEngine。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
新增 e2e-test.ts:自动走完留学咨询全流程(fork → 3轮对话 → consolidation → integration),20 个断言。 修复 createDefaultConsolidateFn:清除 <think> 标签后再存 L2,避免思考过程泄露到摘要。 修复 createDefaultIntegrateFn:清除 think 标签 + 正则提取 JSON 块,解析失败时 fallback。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ng_split OpenAICompatibleOptions 新增 extraBody 字段,请求时透传给 API。 Demo 启用 reasoning_split: true,thinking 内容分离到 reasoning_details 字段, content 字段直接是干净的回复,不再需要手动解析 <think> 标签。 保留 defaults.ts 中的 think 清除逻辑作为通用 fallback(非 MiniMax 模型仍需要)。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Conversation 的 sending 从 boolean 改为 Set<sessionId>,每个 session 独立追踪发送状态。 切换 session 时不再被其他正在响应的 session 阻塞。 session 列表给正在发送的 session 显示闪烁指示器。 E2E 测试加长 fetch 超时到 120s 适配 reasoning 模型。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
新增 EditDialog 通用组件:支持 text/number/textarea/password/select 字段类型, backdrop 点击关闭,Enter 快捷保存,loading 状态。 Settings 页面:删除 EditableNumber/EditableSelect 内联组件, 所有编辑操作改为 ClickToEdit 按钮触发 Dialog(LLM / Prompts / Scheduling / SplitGuard / Runtime)。 Inspector 页面:System Prompt 和 Scope 编辑也改为 Dialog。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
在会话树节点中新增 turnCount 字段用于记录对话轮次 更新默认摘要提示词使其更简洁精炼 修复拓扑图节点尺寸计算和动画问题 优化会话界面滚动区域高度
uchouT
added a commit
that referenced
this pull request
Apr 18, 2026
bump to 0.5.2. 修复 Engine.forkSession 无条件读取 sessions.getConfig 导致 main 的 systemPrompt/skills 通过四层合成链泄漏到子 session(违反 fork-design invariant #6)。 实现思路: - 新增常量 MAIN_SESSION_ID = 'main',SessionTreeImpl.createRoot 使用固定 ID 并在 main 已存在时幂等返回现有节点、不覆写数据 - forkSession 在 sourceSessionId === MAIN_SESSION_ID 时跳过 getConfig 读取 - 导出 MAIN_SESSION_ID,自行实现 SessionTree 的宿主需同步 Closes #55
4 tasks
uchouT
added a commit
that referenced
this pull request
Apr 18, 2026
bump to 0.5.2. 修复 Engine.forkSession 无条件读取 sessions.getConfig 导致 main 的 systemPrompt/skills 通过四层合成链泄漏到子 session(违反 fork-design invariant #6)。 实现思路: - 新增常量 MAIN_SESSION_ID = 'main',SessionTreeImpl.createRoot 使用固定 ID 并在 main 已存在时幂等返回现有节点、不覆写数据 - forkSession 在 sourceSessionId === MAIN_SESSION_ID 时跳过 getConfig 读取 - 导出 MAIN_SESSION_ID,自行实现 SessionTree 的宿主需同步 Closes #55
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.