🏗️ refactor(shared,sdk): 协议消息类型下沉单源,解除 shared↔sdk 包级循环依赖 - #469
Conversation
Review逐条实证完成:diff 全量通读 + 与 origin/main 原文机械比对 + PR 树上 grep 验证 + TS2488 探针实验。 结论LGTM,可合。 解环目标达成且实现干净:shared 内 发现P3-1 DOM.Iterable 连带修复的归因表述存疑(不阻塞)补 lib 本身必要性已实证: 但「此前能力来自 shared→sdk 类型链意外带入的全局类型增强」这一因果链未能独立复原:
建议:补充「去掉 DOM.Iterable 后 desktop typecheck 报错清单」佐证因果,或把描述弱化为「显式声明既有隐式能力,与 web/ui 对齐」。 交叉风险(vs PR #467)两 PR 均自 base blob
其余两个疑似交叉点经查无冲突:#467 动的是 shared 根 barrel( 建议 #469 先合:纯移动先行,让后续行为 diff 干净落在单源上。#467 后合适配成本低——其 SDKSessionStateChangedMessage 触点共 4 处且全部集中于 types.ts 单文件(无跨文件配套改动),rebase 时把三处语义(删联合成员、删接口、subtype 收窄)原样移植到 已核实
|
- SDKMessage 全部联合成员及其类型闭包(content block、压缩协议元数据、 usage 计量族、PermissionMode)从 sdk/types.ts 物理下沉至 shared/src/types/sdk-protocol.ts;CompactionFailureReason 随迁, utils/compact.ts 原地 re-export 保持深引兼容。 - ToolExecutionMetadata 族不再双份:sdk 删本地副本,统一引用 shared/runtime-event.ts 既有单源定义。 - sdk/types.ts 以全量 type re-export 壳保持对外导出面不变,sdk 内部 `from './types'` 引用与 src/index.ts 导出零改动。 - shared/types/agent.ts 的 SDKMessage import/re-export 改指本地新文件, 导出名不变;shared/package.json 删除对 @lume/agent-sdk 的依赖声明, 包级循环依赖解除(依赖方向收敛为 sdk→shared 单向)。 - desktop tsconfig 补声明 DOM.Iterable:此前 NodeList 迭代能力来自 shared→sdk 类型链意外带入的全局增强,解环后按真实使用显式声明。 Co-Authored-By: Claude Fable <noreply@anthropic.com>
bd0febc to
ea8668d
Compare
|
Rebase 完成:已基于最新 origin/main(#467 合入点 7704ccc)重放本分支单 commit,远端 tip 现为 ea8668d。 #467 三处语义已移植到新单源 packages/shared/src/types/sdk-protocol.ts:
冲突解决:packages/sdk/src/types.ts 以 #469 的 re-export 壳为准(#467 对该文件的全部改动均为删除性移植项,无独有新增)。 验证结论:
|
Fixes #286
问题
packages/shared 的 manifest 声明依赖
@lume/agent-sdk,代码上又通过 type-only import 从 sdk 取SDKMessage;而 sdk 运行时反向依赖 shared,形成包级循环,目前仅靠 type 擦除才不炸。方案
类型下沉(纯移动,字段与注释保持原文):
shared/src/types/sdk-protocol.ts作为 SDK 消息协议唯一来源,搬入:ToolResultContentBlock/ContentBlockParam/ContentBlockMessageRole/ConversationMessageSDKMessage全部 32 个联合成员接口及SDKAssistantMessageError、SDKPermissionDenial、SDKRateLimitInfoAgentContextCompactionTrigger/Stage/Metadata、CompactionFailureReason(自sdk/utils/compact.ts随迁)ProviderCallKind/UsageIdentity/NormalizedProviderUsage/ContextUsageSnapshot/BillingUsageRecord/BillingUsageSummary/AgentProgressUsage/TokenUsage/ModelUsage/SDKUsageRecordPermissionModeToolExecutionMetadata族不重复搬:shared/src/types/runtime-event.ts已有单源定义,新文件直接引用,sdk 删除本地副本消除双份漂移。兼容策略(下游零改动):
shared/src/types/agent.ts对SDKMessage的 import/re-export 名不变,仅来源改为本地./sdk-protocol。sdk/src/types.ts保留全部剩余类型 + 一段全量export type { ... } from '@lume/shared're-export 壳,sdk 对外导出面不变,内部所有from './types'引用与src/index.ts导出零改动。sdk/utils/compact.ts原地 re-exportCompactionFailureReason,既有深引写法不受影响。shared/package.json中对@lume/agent-sdk的依赖声明,依赖方向收敛为 sdk→shared 单向。连带修复: desktop tsconfig 补声明
DOM.Iterable。desktop 两处 NodeList 迭代在解环后报 TS2488(必要性已探针实证),按代码实际使用显式声明;至于此前为何能编译通过,未能在 sdk/shared/@types 源中定位到全局增强来源,归因存疑、不强下结论。验证
bun run typecheck六包(shared/ui/sdk/sidecar/web/desktop)全绿grep -rn "@lume/agent-sdk" packages/shared/src零命中(含测试)bun test src(shared):178 pass / 0 failbun run test:unit(sdk):696 pass / 2 skip / 0 fail🤖 Generated with Claude Code