coding-tool-x 3.3.3 → 3.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -63,11 +63,22 @@ function extractSessionMeta(lines) {
63
63
  */
64
64
  function extractMessages(lines) {
65
65
  const messages = [];
66
+ let currentTurnModel = null;
67
+ let lastAssistantModel = null;
66
68
 
67
69
  lines.forEach(line => {
70
+ if (line.type === 'turn_context') {
71
+ const model = line.payload?.model;
72
+ if (typeof model === 'string' && model.trim()) {
73
+ currentTurnModel = model.trim();
74
+ }
75
+ return;
76
+ }
77
+
68
78
  if (line.type !== 'response_item') return;
69
79
 
70
80
  const payload = line.payload;
81
+ const resolvedModel = payload?.model || currentTurnModel || lastAssistantModel || null;
71
82
 
72
83
  // 用户/助手消息
73
84
  if (payload.type === 'message') {
@@ -81,8 +92,12 @@ function extractMessages(lines) {
81
92
  messages.push({
82
93
  role: payload.role,
83
94
  content: text,
84
- timestamp: line.timestamp
95
+ timestamp: line.timestamp,
96
+ model: payload.role === 'assistant' ? resolvedModel : null
85
97
  });
98
+ if (payload.role === 'assistant' && resolvedModel) {
99
+ lastAssistantModel = resolvedModel;
100
+ }
86
101
  }
87
102
  }
88
103
 
@@ -101,8 +116,12 @@ function extractMessages(lines) {
101
116
  name: payload.name,
102
117
  arguments: parsedArguments,
103
118
  callId: payload.call_id,
104
- timestamp: line.timestamp
119
+ timestamp: line.timestamp,
120
+ model: resolvedModel
105
121
  });
122
+ if (resolvedModel) {
123
+ lastAssistantModel = resolvedModel;
124
+ }
106
125
  }
107
126
 
108
127
  // 工具输出
@@ -119,8 +138,12 @@ function extractMessages(lines) {
119
138
  role: 'tool_output',
120
139
  callId: payload.call_id,
121
140
  output: parsedOutput,
122
- timestamp: line.timestamp
141
+ timestamp: line.timestamp,
142
+ model: resolvedModel
123
143
  });
144
+ if (resolvedModel) {
145
+ lastAssistantModel = resolvedModel;
146
+ }
124
147
  }
125
148
 
126
149
  // 推理内容
@@ -135,8 +158,12 @@ function extractMessages(lines) {
135
158
  messages.push({
136
159
  role: 'reasoning',
137
160
  content: text,
138
- timestamp: line.timestamp
161
+ timestamp: line.timestamp,
162
+ model: resolvedModel
139
163
  });
164
+ if (resolvedModel) {
165
+ lastAssistantModel = resolvedModel;
166
+ }
140
167
  }
141
168
  }
142
169
  });
@@ -359,7 +359,19 @@ function getSessionRowsByProjectId(projectId) {
359
359
  s.time_created,
360
360
  s.time_updated,
361
361
  s.time_compacting,
362
- s.time_archived
362
+ s.time_archived,
363
+ (
364
+ COALESCE((
365
+ SELECT SUM(length(CAST(COALESCE(m.data, '') AS BLOB)))
366
+ FROM message m
367
+ WHERE m.session_id = s.id
368
+ ), 0) +
369
+ COALESCE((
370
+ SELECT SUM(length(CAST(COALESCE(p.data, '') AS BLOB)))
371
+ FROM part p
372
+ WHERE p.session_id = s.id
373
+ ), 0)
374
+ ) AS size
363
375
  FROM session s
364
376
  WHERE s.project_id = ${sqlQuote(projectId)}
365
377
  AND s.time_archived IS NULL
@@ -387,7 +399,19 @@ function getSessionRowById(sessionId) {
387
399
  s.time_created,
388
400
  s.time_updated,
389
401
  s.time_compacting,
390
- s.time_archived
402
+ s.time_archived,
403
+ (
404
+ COALESCE((
405
+ SELECT SUM(length(CAST(COALESCE(m.data, '') AS BLOB)))
406
+ FROM message m
407
+ WHERE m.session_id = s.id
408
+ ), 0) +
409
+ COALESCE((
410
+ SELECT SUM(length(CAST(COALESCE(p.data, '') AS BLOB)))
411
+ FROM part p
412
+ WHERE p.session_id = s.id
413
+ ), 0)
414
+ ) AS size
391
415
  FROM session s
392
416
  WHERE s.id = ${sqlQuote(sessionId)}
393
417
  LIMIT 1
@@ -426,11 +450,12 @@ function getPartRowsBySessionId(sessionId) {
426
450
  }
427
451
 
428
452
  function normalizeSession(session, projectId = null) {
453
+ const size = Number(session?.size);
429
454
  return {
430
455
  sessionId: session.id,
431
456
  projectName: projectId || session.project_id,
432
457
  mtime: toIsoTime(session.time_updated) || new Date().toISOString(),
433
- size: 0,
458
+ size: Number.isFinite(size) && size > 0 ? size : 0,
434
459
  filePath: '',
435
460
  gitBranch: null,
436
461
  firstMessage: session.title || session.slug || null,