desktop/src-tauri/crates/core/src/adapters/opencode_family.rs
第 1 条注释,第 1 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:1
//! opencode SQLite 家族共享解析件(OpenCode A17 / MiMo Code A14,M3)。第 2 条注释,第 2 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:2
//!(空行)第 3 条注释,第 3 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:3
//! OpenCode 内核家族产品保留独立身份、数据根、第 4 条注释,第 4 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:4
//! 实例与注册表,见 adapters.md。本模块与 kimi_wire.rs 类似,第 5 条注释,第 5 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:5
//! 只复用经两产品固定源码分别检查的序列化结构;第 6 条注释,第 6 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:6
//! 各产品提供命名空间、Agent 名、解析器版本与字段规则。第 7 条注释,第 7 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:7
//!(空行)第 8 条注释,第 8 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:8
//! - `part` 表逐 step usage:`data.type="step-finish"` 且 `cost`+`tokens`第 9 条注释,第 9 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:9
//! 在场时携带 `tokens{input, output, reasoning, cache{read, write}}`第 10 条注释,第 10 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:10
//! (+可选 `total`)。依据:OpenCode pinned 0027387第 11 条注释,第 11 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:11
//! `packages/core/src/session/projector.ts` 的 `usage()` 提取规则与第 12 条注释,第 12 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:12
//! `applyUsage` 计数维护、迁移 `20260510033149_session_usage.ts` 的第 13 条注释,第 13 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:13
//! json_extract 查询规则、以及 pinned 仓库内 vendored client第 14 条注释,第 14 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:14
//! 客户端归档 packages/app/vendor/opencode-ai-client-1.17.13-v2.tgz第 15 条注释,第 15 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:15
//! `StepFinishPart`/`AssistantMessage` 类型(tokens 同形,`total` 可选);第 16 条注释,第 16 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:16
//! MiMo pinned 456678b `packages/opencode/src/session/message-v2.ts` 的第 17 条注释,第 17 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:17
//! `StepFinishPart` zod schema(total 可选、五数字段必需)。第 18 条注释,第 18 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:18
//! - OpenCode 字段规则在其固定源码中独立核验:第 19 条注释,第 19 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:19
//! 源码 packages/core/src/session/runner/publish-llm-event.ts 的 tokens()第 20 条注释,第 20 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:20
//! 逐字映射:`input = usage.nonCachedInputTokens`(未缓存输入,不含缓存)、第 21 条注释,第 21 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:21
//! output=usage.visibleOutputTokens,reasoning/cache read/write 独立;第 22 条注释,第 22 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:22
//! 源码 packages/llm/src/protocols/anthropic-messages.ts 的 mapUsage第 23 条注释,第 23 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:23
//! 定义含缓存输入 inputTokens=nonCached+cacheRead+cacheWrite(sumTokens);第 24 条注释,第 24 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:24
//! 且 anthropic 的 reasoning 不拆分(计入 outputTokens、reasoning 保持第 25 条注释,第 25 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:25
//! undefined 经 safe() 默认成 0;源码 packages/llm/src/protocols/shared.ts第 26 条注释,第 26 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:26
//! 政策 = `inputTokens + outputTokens`(无 provider total 时)。⇒第 27 条注释,第 27 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:27
//! input_total = input+cache.read+cache.write(派生,上游自算 inclusive第 28 条注释,第 28 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:28
//! 字段语义)、output_total = output+reasoning(派生,两种 provider 模式均第 29 条注释,第 29 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:29
//! 成立:anthropic reasoning=0 已含于 output;拆分 provider 为补和)、第 30 条注释,第 30 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:30
//! total 是五分量之和;在场 total 作为 source_total 比较,第 31 条注释,第 31 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:31
//! 不一致记诊断。共享加法不能验证另一产品的字段含义。第 32 条注释,第 32 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:32
//! - 时间列 epoch 毫秒(两产品 `Timestamps` 均 `Date.now()` 默认)。第 33 条注释,第 33 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:33
//! - 表形状(两产品 pinned sql.ts 逐字列名):第 34 条注释,第 34 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:34
//! 部件表 part(id, message_id, session_id, time_created, time_updated, data)、第 35 条注释,第 35 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:35
//! 会话表 session(id, parent_id, version, …)、消息表 message(id, …, data);MiMo 有第 36 条注释,第 36 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:36
//! `message` 另有 `agent_id` 列、`session` 无 tokens_* 累计列,OpenCode第 37 条注释,第 37 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:37
//! 相反——探测指纹因此互斥,见各产品 common.rs。第 38 条注释,第 38 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:38
//!(空行)第 39 条注释,第 39 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:39
//! 家族约定(adapters.md A14/A17):第 40 条注释,第 40 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:40
//! - **step 与 message 汇总不双计**:assistant `message.data.tokens` 是 turn 级第 41 条注释,第 41 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:41
//! 聚合(OpenCode 迁移把 message.data 逐字段 SUM 进 session 累计列),本实现第 42 条注释,第 42 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:42
//! 只读 `part`(step-finish)逐次入账;message 仅取 `modelID`/`providerID`第 43 条注释,第 43 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:43
//! 归属,不读其 tokens/cost;第 44 条注释,第 44 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:44
//! - **不把 session 累计列逐次相加**:OpenCode `session.tokens_*` 五列只作对账第 45 条注释,第 45 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:45
//! (projector applyUsage = Σ 当前 step-finish 部件,含删行补偿);MiMo 无第 46 条注释,第 46 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:46
//! 该五列,不对账;第 47 条注释,第 47 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:47
//! - 模型归属:`message.data.modelID/providerID`(request_field;vendored第 48 条注释,第 48 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:48
//! client AssistantMessage + MiMo zod 均为必需字段);**逐调用的精确时间第 49 条注释,第 49 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:49
//! 这里没有逐调用完成时间:part 时间是派生数据库视图的写入时刻,第 50 条注释,第 50 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:50
//! 时间依据如实标 observed_at;第 51 条注释,第 51 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:51
//! - step-finish 部件无独立调用 ID:事件键 = `part.id`(两产品均为主键)。第 52 条注释,第 52 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:52
//!(空行)第 53 条注释,第 53 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:53
//! 真实样本覆盖 OpenCode 1.18.34 与 MiMo 0.1.15,保留各自已记录的接口限制。第 54 条注释,第 54 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:54
//! 各产品独立选择记录版本与零值规则,不能相互推定。第 55 条注释,第 71 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:71
/// 已处理时间的回看窗(毫秒):覆盖并发会话的同毫秒乱序写(同 kilo/kimi 约定)。第 56 条注释,第 73 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:73
/// 单轮行数上限;按时间戳与 ID 续读同一毫秒内的记录。第 57 条注释,第 76 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:76
/// opencode 家族 step-finish `tokens` 五数字段 + 可选 `total`。第 58 条注释,第 77 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:77
/// 语义(固定源码依据,见模块头):input 是**未缓存**输入(不含缓存),第 59 条注释,第 78 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:78
/// reasoning 与 output 是否拆分取决于 Provider;Anthropic 的 reasoning第 60 条注释,第 79 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:79
/// ⇒ reasoning=0 已含于 output)。派生计算:input_total = input+cr+cw、第 61 条注释,第 80 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:80
/// output_total = output+reasoning、total = 五字段之和;`total` 在场时按第 62 条注释,第 81 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:81
/// 作为 source_total 比较,不一致记诊断。各产品独立应用零值规则。第 63 条注释,第 89 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:89
/// 源直报总量(可选字段);缺失 = 未知,不补零。第 64 条注释,第 93 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:93
/// 桶间包含关系按固定源码推导(上游自算 inclusive 输入);溢出字段第 65 条注释,第 94 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:94
/// 保持 None,不 panic 或截断;类似计算不能验证另一产品的字段规则。第 66 条注释,第 151 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:151
/// MiMo 0.1.15 的 getUsage 减去其持久化的归一化缓存与 reasoning第 67 条注释,第 152 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:152
/// 分量。将其加回可恢复正值 SDK 合计,第 68 条注释,第 153 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:153
/// 即使子分量采用默认值。零值子分量本身第 69 条注释,第 154 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:154
/// 不代表报告了零;MiMo 的此规则与 OpenCode 独立。第 70 条注释,第 203 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:203
/// cost 浮点美元 → micro-USD(estimated;上游自行估算,与 cline/zoo 规则相同)。第 71 条注释,第 222 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:222
/// step-finish 部件 usage 提取(两产品 pinned 提取规则的共同内核):第 72 条注释,第 223 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:223
/// - 类型必须是 step-finish;第 73 条注释,第 224 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:224
/// - `cost` 与 `tokens` 同时在场(OpenCode projector `usage()` 规则);第 74 条注释,第 225 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:225
/// - `tokens{input, output, reasoning, cache{read, write}}` 五数字段必需第 75 条注释,第 226 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:226
/// (MiMo zod required;vendored client 同形),`total` 可选;第 76 条注释,第 227 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:227
/// - 数值非负有界,越界/类型错误返回 None(调用方计调用、token 未知)。第 77 条注释,第 252 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:252
/// 扫描时注入的产品身份(家族模块不持有产品状态)。第 78 条注释,第 254 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:254
/// 事件键命名空间(= adapter_id:opencode / mimo-code)。第 79 条注释,第 256 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:256
/// 统计归属 Agent 名。第 80 条注释,第 258 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:258
/// 本版本实现的解析器版本串。第 81 条注释,第 260 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:260
/// OpenCode:session.tokens_* 五列对账;MiMo 无累计列不对账。第 82 条注释,第 262 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:262
/// 各产品显式选择经独立核验的零值规则。第 83 条注释,第 266 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:266
/// 游标(持久化在 ingestion_checkpoints.cursor_value)。第 84 条注释,第 270 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:270
/// 恒为 0:WAL 活库不用字节偏移做无变化判定(同 kilo 约定)。第 85 条注释,第 273 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:273
/// 已处理到的 part.time_updated(含该值);None = 从头全量。第 86 条注释,第 281 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:281
/// 解析上下文:schema 指纹 + 版本分派结论快照。第 87 条注释,第 302 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:302
// 位置只存 part.id(稳定身份,非路径/正文)。第 88 条注释,第 308 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:308
/// 窗口行:step-finish 部件 + 会话/消息归属列。第 89 条注释,第 322 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:322
/// 按已处理时间窗口查询(两产品同形:part LEFT JOIN session/message;第 90 条注释,第 323 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:323
/// message.data 经 json_valid 检查后取 modelID/providerID,不加载消息正文。第 91 条注释,第 376 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:376
/// 库内数值最大 session.version(两产品 session 表均有该列;空表 → None)。第 92 条注释,第 386 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:386
// 语义最大按数值序比较(同 kilo version_max 约定)。第 93 条注释,第 392 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:392
/// 数值序版本比较(kilo versions::version_max 同语义,家族内复制)。第 94 条注释,第 407 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:407
/// OpenCode 对账:逐次 step-finish 五字段合计 vs session.tokens_* 五列合计第 95 条注释,第 408 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:408
/// (projector applyUsage 语义:五列 = Σ 当前部件,含删行补偿)。第 96 条注释,第 457 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:457
/// 家族共享扫描核心:step-finish 部件 → 逐次 model_call 事件 + 已处理位置游标。第 97 条注释,第 458 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:458
/// 调用方(各产品 versions 实现)负责打开只读连接、计算 schema 指纹与版本第 98 条注释,第 459 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:459
/// 分派结论后传入;本函数完成游标/指纹重置/窗口/事件/对账/更新已处理位置。第 99 条注释,第 460 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:460
/// 扫描上下文:探测/分派结论(产品身份、schema 指纹、原始版本与选择依据)。第 100 条注释,第 485 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:485
// 游标不做 generation 过滤:同一逻辑库 in-place 重写让框架标 Rescan,第 101 条注释,第 486 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:486
// 但 part.id/更新序号记录的已处理位置仍有效(同 kilo 约定)。第 102 条注释,第 503 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:503
// schema 指纹变化 ⇒ 旧的已处理位置不可信,全量重读(id 键 upsert 幂等)。第 103 条注释,第 546 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:546
// json_valid 已在 SQL 层过滤;此处防御游标期间被改写的行。第 104 条注释,第 557 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:557
// 行时间是派生视图写入时刻:不可信(早于 2000)时跳过不猜。第 105 条注释,第 595 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:595
// step-finish 在场即表明该 step 已运行:计调用、token 未知。第 106 条注释,第 640 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:640
// part 写入时刻作为 observed_at,不能确认上游精确调用时间(A17)。第 107 条注释,第 654 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:654
// 行级当前值即该 step 最终值;后续改写经 time_updated 修订替换。第 108 条注释,第 666 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:666
// 触顶按时间与稳定键续扫;同毫秒及高密度重叠窗不会反复读取首页。第 109 条注释,第 772 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:772
// 缺 cost 或 tokens(projector 规则)⇒ None。第 110 条注释,第 778 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:778
// 非 step-finish 类型 ⇒ None。第 111 条注释,第 785 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:785
// 五数字段缺一/越界 ⇒ None(按 MiMo zod required 定义)。第 112 条注释,第 810 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:810
// input 是未缓存输入(pinned publish-llm-event tokens()):inclusive 派生。第 113 条注释,第 822 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:822
// 缺 total:source_total None,派生总量仍在。第 114 条注释,第 834 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:834
// 直报 total 与派生值不一致时记诊断(包含关系成立才有可比性)。第 115 条注释,第 861 行
desktop/src-tauri/crates/core/src/adapters/opencode_family.rs:861
// 溢出的派生字段保持 None(未知),不 panic、不截断数值。