Skip to content
This repository was archived by the owner on May 15, 2026. It is now read-only.

Commit ca6a3e7

Browse files
author
James Mtendamema
committed
feat: added log requests to backend for observability
1 parent 2e3ec13 commit ca6a3e7

12 files changed

Lines changed: 887 additions & 5 deletions

File tree

packages/types/src/vscode-extension-host.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,10 @@ export type ExtensionState = Pick<
372372
mdmCompliant?: boolean
373373
taskSyncEnabled: boolean
374374
openAiCodexIsAuthenticated?: boolean
375+
zooCodeIsAuthenticated?: boolean
376+
zooCodeUserName?: string
377+
zooCodeUserEmail?: string
378+
zooCodeUserImage?: string
375379
debug?: boolean
376380

377381
/**
@@ -505,6 +509,7 @@ export interface WebviewMessage {
505509
| "rooCloudManualUrl"
506510
| "openAiCodexSignIn"
507511
| "openAiCodexSignOut"
512+
| "zooCodeSignOut"
508513
| "switchOrganization"
509514
| "condenseTaskContextRequest"
510515
| "requestIndexingStatus"

src/activate/handleUri.ts

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,24 @@ import * as vscode from "vscode"
22

33
import { getRouterUnavailableSignInMessage } from "../core/config/routerRemoval"
44
import { ClineProvider } from "../core/webview/ClineProvider"
5+
import { handleAuthCallback as handleZooCodeAuthCallback, setZooCodeUserInfo } from "../services/zoo-code-auth"
56

67
export const handleUri = async (uri: vscode.Uri) => {
78
const path = uri.path
89
const query = new URLSearchParams(uri.query.replace(/\+/g, "%2B"))
910
const visibleProvider = ClineProvider.getVisibleInstance()
1011

11-
if (!visibleProvider) {
12-
return
13-
}
14-
1512
switch (path) {
1613
case "/openrouter": {
14+
if (!visibleProvider) return
1715
const code = query.get("code")
1816
if (code) {
1917
await visibleProvider.handleOpenRouterCallback(code)
2018
}
2119
break
2220
}
2321
case "/requesty": {
22+
if (!visibleProvider) return
2423
const code = query.get("code")
2524
const baseUrl = query.get("baseUrl")
2625
if (code) {
@@ -32,6 +31,33 @@ export const handleUri = async (uri: vscode.Uri) => {
3231
vscode.window.showInformationMessage(getRouterUnavailableSignInMessage())
3332
break
3433
}
34+
case "/auth-callback": {
35+
const token = query.get("token")
36+
if (token) {
37+
// Extract user info from callback URL params with proper URL decoding
38+
const name = query.get("name") ? decodeURIComponent(query.get("name")!.replace(/\+/g, " ")) : undefined
39+
const email = query.get("email")
40+
? decodeURIComponent(query.get("email")!.replace(/\+/g, " "))
41+
: undefined
42+
const image = query.get("image") ? decodeURIComponent(query.get("image")!) : undefined
43+
44+
// Store user info if provided
45+
if (name || email || image) {
46+
await setZooCodeUserInfo({
47+
name,
48+
email,
49+
image,
50+
})
51+
}
52+
53+
const success = await handleZooCodeAuthCallback(token)
54+
if (success && visibleProvider) {
55+
// Update the active API configuration to use zoo-code with the new token
56+
await visibleProvider.handleZooCodeCallback(token)
57+
}
58+
}
59+
break
60+
}
3561
default:
3662
break
3763
}

src/core/task/Task.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3155,6 +3155,25 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
31553155
cacheReadTokens: tokens.cacheRead,
31563156
cost: tokens.total ?? costResult.totalCost,
31573157
})
3158+
3159+
// Zoo Code observability telemetry
3160+
import("../../services/zoo-telemetry")
3161+
.then(({ sendLlmTelemetry }) =>
3162+
sendLlmTelemetry({
3163+
taskId: this.taskId,
3164+
provider: this.apiConfiguration?.apiProvider ?? "unknown",
3165+
model: this.apiConfiguration
3166+
? (getModelId(this.apiConfiguration) ?? "unknown")
3167+
: "unknown",
3168+
mode: this.taskMode,
3169+
inputTokens: costResult.totalInputTokens,
3170+
outputTokens: costResult.totalOutputTokens,
3171+
cacheReadTokens: tokens.cacheRead ?? 0,
3172+
cacheWriteTokens: tokens.cacheWrite ?? 0,
3173+
totalCost: tokens.total ?? costResult.totalCost,
3174+
}).catch(() => {}),
3175+
)
3176+
.catch(() => {})
31583177
}
31593178
}
31603179

src/core/webview/ClineProvider.ts

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,8 +240,9 @@ export class ClineProvider
240240

241241
// Create named listener functions so we can remove them later.
242242
const onTaskStarted = () => this.emit(RooCodeEventName.TaskStarted, instance.taskId)
243-
const onTaskCompleted = (taskId: string, tokenUsage: TokenUsage, toolUsage: ToolUsage) =>
243+
const onTaskCompleted = (taskId: string, tokenUsage: TokenUsage, toolUsage: ToolUsage) => {
244244
this.emit(RooCodeEventName.TaskCompleted, taskId, tokenUsage, toolUsage)
245+
}
245246
const onTaskAborted = async () => {
246247
this.emit(RooCodeEventName.TaskAborted, instance.taskId)
247248

@@ -1681,6 +1682,15 @@ export class ClineProvider
16811682
await this.upsertProviderProfile(currentApiConfigName, newConfiguration)
16821683
}
16831684

1685+
// Zoo Code Auth (for observability telemetry)
1686+
1687+
async handleZooCodeCallback(token: string) {
1688+
const { handleAuthCallback } = await import("../../services/zoo-code-auth")
1689+
await handleAuthCallback(token)
1690+
// Refresh webview state to show updated auth status
1691+
await this.postStateToWebview()
1692+
}
1693+
16841694
// Requesty
16851695

16861696
async handleRequestyCallback(code: string, baseUrl: string | null) {
@@ -2279,6 +2289,31 @@ export class ClineProvider
22792289
return false
22802290
}
22812291
})(),
2292+
zooCodeIsAuthenticated: await (async () => {
2293+
try {
2294+
const { isZooCodeAuthenticated } = await import("../../services/zoo-code-auth")
2295+
return await isZooCodeAuthenticated()
2296+
} catch {
2297+
return false
2298+
}
2299+
})(),
2300+
...(() => {
2301+
try {
2302+
const { getCachedZooCodeUserInfo } = require("../../services/zoo-code-auth")
2303+
const userInfo = getCachedZooCodeUserInfo()
2304+
return {
2305+
zooCodeUserName: userInfo.name,
2306+
zooCodeUserEmail: userInfo.email,
2307+
zooCodeUserImage: userInfo.image,
2308+
}
2309+
} catch {
2310+
return {
2311+
zooCodeUserName: undefined,
2312+
zooCodeUserEmail: undefined,
2313+
zooCodeUserImage: undefined,
2314+
}
2315+
}
2316+
})(),
22822317
debug: vscode.workspace.getConfiguration(Package.name).get<boolean>("debug", false),
22832318
}
22842319
}

src/core/webview/webviewMessageHandler.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2405,6 +2405,18 @@ export const webviewMessageHandler = async (
24052405
await provider.postStateToWebview()
24062406
break
24072407
}
2408+
case "zooCodeSignOut": {
2409+
try {
2410+
const { clearZooCodeToken } = await import("../../services/zoo-code-auth")
2411+
await clearZooCodeToken()
2412+
await provider.postStateToWebview()
2413+
} catch (error) {
2414+
provider.log(
2415+
`Failed to sign out of Zoo Code: ${error instanceof Error ? error.message : String(error)}`,
2416+
)
2417+
}
2418+
break
2419+
}
24082420
case "switchOrganization": {
24092421
try {
24102422
const organizationId = message.organizationId ?? null

src/extension.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import {
4949
} from "./activate"
5050
import { initializeI18n } from "./i18n"
5151
import { initializeModelCacheRefresh } from "./api/providers/fetchers/modelCache"
52+
import { initZooCodeAuth } from "./services/zoo-code-auth"
5253

5354
/**
5455
* Built using https://github.com/microsoft/vscode-webview-ui-toolkit
@@ -158,6 +159,9 @@ export async function activate(context: vscode.ExtensionContext) {
158159
// Initialize OpenAI Codex OAuth manager for ChatGPT subscription-based access.
159160
openAiCodexOAuthManager.initialize(context, (message) => outputChannel.appendLine(message))
160161

162+
// Initialize Zoo Code auth service for extension session token management.
163+
initZooCodeAuth(context)
164+
161165
// Get default commands from configuration.
162166
const defaultCommands = vscode.workspace.getConfiguration(Package.name).get<string[]>("allowedCommands") || []
163167

0 commit comments

Comments
 (0)