跳转到内容

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、不截断数值。