Skip to content

Commit 7bdfe49

Browse files
authored
Merge pull request #532 from rajbos/fix/session-jsonl-null-safety
Fix null safety in response array loops and OpenCode method reference
2 parents 746979f + 6f5f379 commit 7bdfe49

File tree

2 files changed

+9
-3
lines changed

2 files changed

+9
-3
lines changed

vscode-extension/src/extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7041,7 +7041,7 @@ export function activate(context: vscode.ExtensionContext) {
70417041
isOpenCodeSession: (sessionFile: string) =>
70427042
(tokenTracker as any).openCode.isOpenCodeSessionFile(sessionFile),
70437043
getOpenCodeSessionData: (sessionFile: string) =>
7044-
(tokenTracker as any).getOpenCodeSessionData(sessionFile),
7044+
(tokenTracker as any).openCode.getOpenCodeSessionData(sessionFile),
70457045
});
70467046

70477047
const backendHandler = new BackendCommandHandler({

vscode-extension/src/usageAnalysis.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -811,6 +811,7 @@ export async function trackEnhancedMetrics(deps: Pick<UsageAnalysisDeps, 'warn'>
811811
// Track edit scope and apply usage
812812
if (request.response && Array.isArray(request.response)) {
813813
for (const resp of request.response) {
814+
if (!resp) { continue; }
814815
if (resp.kind === 'textEditGroup' && resp.uri) {
815816
const filePath = resp.uri.path || JSON.stringify(resp.uri);
816817
editedFiles.add(filePath);
@@ -866,6 +867,7 @@ export async function trackEnhancedMetrics(deps: Pick<UsageAnalysisDeps, 'warn'>
866867
// Track edit scope and apply usage
867868
if (request.response && Array.isArray(request.response)) {
868869
for (const resp of request.response) {
870+
if (!resp) { continue; }
869871
if (resp.kind === 'textEditGroup' && resp.uri) {
870872
const filePath = resp.uri.path || JSON.stringify(resp.uri);
871873
editedFiles.add(filePath);
@@ -1258,6 +1260,7 @@ export async function analyzeSessionUsage(deps: UsageAnalysisDeps, sessionFile:
12581260
// Extract tool calls and MCP tools from request.response array
12591261
if (request.response && Array.isArray(request.response)) {
12601262
for (const responseItem of request.response) {
1263+
if (!responseItem) { continue; }
12611264
if (responseItem.kind === 'toolInvocationSerialized' || responseItem.kind === 'prepareToolInvocation') {
12621265
const toolName = responseItem.toolId || responseItem.toolName || responseItem.invocationMessage?.toolName || responseItem.toolSpecificData?.kind || 'unknown';
12631266

@@ -1365,6 +1368,7 @@ export async function analyzeSessionUsage(deps: UsageAnalysisDeps, sessionFile:
13651368
// Extract tool calls from request.response array (when full request is added)
13661369
if (request.response && Array.isArray(request.response)) {
13671370
for (const responseItem of request.response) {
1371+
if (!responseItem) { continue; }
13681372
if (responseItem.kind === 'toolInvocationSerialized' || responseItem.kind === 'prepareToolInvocation') {
13691373
analysis.toolCalls.total++;
13701374
const toolName = responseItem.toolId || responseItem.toolName || responseItem.invocationMessage?.toolName || responseItem.toolSpecificData?.kind || 'unknown';
@@ -1378,6 +1382,7 @@ export async function analyzeSessionUsage(deps: UsageAnalysisDeps, sessionFile:
13781382
// Handle VS Code incremental format - tool invocations in responses
13791383
if (event.kind === 2 && event.k?.includes('response') && Array.isArray(event.v)) {
13801384
for (const responseItem of event.v) {
1385+
if (!responseItem) { continue; }
13811386
if (responseItem.kind === 'toolInvocationSerialized') {
13821387
analysis.toolCalls.total++;
13831388
const toolName = responseItem.toolId || responseItem.toolName || responseItem.invocationMessage?.toolName || responseItem.toolSpecificData?.kind || 'unknown';
@@ -1485,6 +1490,7 @@ export async function analyzeSessionUsage(deps: UsageAnalysisDeps, sessionFile:
14851490
// Analyze response for tool calls and MCP tools
14861491
if (request.response && Array.isArray(request.response)) {
14871492
for (const responseItem of request.response) {
1493+
if (!responseItem) { continue; }
14881494
// Detect tool invocations
14891495
if (responseItem.kind === 'toolInvocationSerialized' ||
14901496
responseItem.kind === 'prepareToolInvocation') {
@@ -1698,7 +1704,7 @@ export async function getModelUsageFromSession(deps: Pick<UsageAnalysisDeps, 'wa
16981704
}
16991705
if (request.response && Array.isArray(request.response)) {
17001706
for (const responseItem of request.response) {
1701-
if (responseItem.value) {
1707+
if (responseItem?.value) {
17021708
modelUsage[requestModel].outputTokens += estimateTokensFromText(responseItem.value, requestModel, deps.tokenEstimators);
17031709
}
17041710
}
@@ -1766,7 +1772,7 @@ export async function getModelUsageFromSession(deps: Pick<UsageAnalysisDeps, 'wa
17661772
// Estimate tokens from assistant response (output)
17671773
if (request.response && Array.isArray(request.response)) {
17681774
for (const responseItem of request.response) {
1769-
if (responseItem.value) {
1775+
if (responseItem?.value) {
17701776
const tokens = estimateTokensFromText(responseItem.value, model, deps.tokenEstimators);
17711777
modelUsage[model].outputTokens += tokens;
17721778
}

0 commit comments

Comments
 (0)