Skip to content

Commit 6f5f379

Browse files
rajbosCopilot
andcommitted
Fix null safety in response array loops and OpenCode method reference
- Fix TypeError: getOpenCodeSessionData was called on tokenTracker directly instead of tokenTracker.openCode where the method actually lives; this caused 'tokenTracker.getOpenCodeSessionData is not a function' warnings during backend sync for every OpenCode session file. - Fix TypeError: Cannot read properties of undefined (reading 'value') in getModelUsageFromSession: response arrays reconstructed from VS Code delta-based JSONL can contain null/undefined entries; use optional chaining (responseItem?.value) instead of bare property access. - Fix TypeError: Cannot read properties of undefined (reading 'kind') in analyzeSessionUsage and trackEnhancedMetrics: add an explicit 'if (!responseItem) continue' guard at the top of every loop that iterates over request.response or event.v arrays, covering both the delta-path and JSON-path code branches. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 746979f commit 6f5f379

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)