From d4cbeec282c7400618e98b4278d6fdc547f055d2 Mon Sep 17 00:00:00 2001 From: Adam Weidman Date: Thu, 19 Feb 2026 14:48:35 -0500 Subject: [PATCH] chore: improve core encapsulation and remove unused exports --- package-lock.json | 26 ++++++++++++++++++- packages/core/src/agents/a2aUtils.ts | 2 +- packages/core/src/config/storage.ts | 7 +++-- packages/core/src/ide/detect-ide.ts | 2 +- packages/core/src/mcp/oauth-provider.ts | 2 -- packages/core/src/scheduler/confirmation.ts | 2 +- .../src/services/chatCompressionService.ts | 6 ++--- packages/core/src/telemetry/loggers.ts | 18 ------------- packages/core/src/telemetry/metrics.ts | 4 +-- packages/core/src/telemetry/semantic.ts | 16 ++++++------ packages/core/src/utils/toolCallContext.ts | 2 +- 11 files changed, 47 insertions(+), 40 deletions(-) diff --git a/package-lock.json b/package-lock.json index e8417cc3e58..2a0a4eb5af4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2241,6 +2241,7 @@ "integrity": "sha512-t54CUOsFMappY1Jbzb7fetWeO0n6K0k/4+/ZpkS+3Joz8I4VcvY9OiEBFRYISqaI2fq5sCiPtAjRDOzVYG8m+Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.2", @@ -2421,6 +2422,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -2470,6 +2472,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.5.0.tgz", "integrity": "sha512-ka4H8OM6+DlUhSAZpONu0cPBtPPTQKxbxVzC4CzVx5+K4JnroJVBtDzLAMx4/3CDTJXRvVFhpFjtl4SaiTNoyQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -2844,6 +2847,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.5.0.tgz", "integrity": "sha512-F8W52ApePshpoSrfsSk1H2yJn9aKjCrbpQF1M9Qii0GHzbfVeFUB+rc3X4aggyZD8x9Gu3Slua+s6krmq6Dt8g==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/core": "2.5.0", "@opentelemetry/semantic-conventions": "^1.29.0" @@ -2877,6 +2881,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.5.0.tgz", "integrity": "sha512-BeJLtU+f5Gf905cJX9vXFQorAr6TAfK3SPvTFqP+scfIpDQEJfRaGJWta7sJgP+m4dNtBf9y3yvBKVAZZtJQVA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/core": "2.5.0", "@opentelemetry/resources": "2.5.0" @@ -2931,6 +2936,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.5.0.tgz", "integrity": "sha512-VzRf8LzotASEyNDUxTdaJ9IRJ1/h692WyArDBInf5puLCjxbICD6XkHgpuudis56EndyS7LYFmtTMny6UABNdQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/core": "2.5.0", "@opentelemetry/resources": "2.5.0", @@ -4104,6 +4110,7 @@ "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -4378,6 +4385,7 @@ "integrity": "sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.35.0", "@typescript-eslint/types": "8.35.0", @@ -5370,6 +5378,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -7909,6 +7918,7 @@ "integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -8429,6 +8439,7 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", + "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -9725,6 +9736,7 @@ "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.9.tgz", "integrity": "sha512-Eaw2YTGM6WOxA6CXbckaEvslr2Ne4NFsKrvc0v97JD5awbmeBLO5w9Ho9L9kmKonrwF9RJlW6BxT1PVv/agBHQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=16.9.0" } @@ -10025,6 +10037,7 @@ "resolved": "https://registry.npmjs.org/@jrichman/ink/-/ink-6.4.11.tgz", "integrity": "sha512-93LQlzT7vvZ1XJcmOMwN4s+6W334QegendeHOMnEJBlhnpIzr8bws6/aOEHG8ZCuVD/vNeeea5m1msHIdAY6ig==", "license": "MIT", + "peer": true, "dependencies": { "@alcalzone/ansi-tokenize": "^0.2.1", "ansi-escapes": "^7.0.0", @@ -13686,6 +13699,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -13696,6 +13710,7 @@ "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -15878,6 +15893,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -16101,7 +16117,8 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tsx": { "version": "4.20.3", @@ -16109,6 +16126,7 @@ "integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" @@ -16269,6 +16287,7 @@ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -16476,6 +16495,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.2.tgz", "integrity": "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==", "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -16589,6 +16609,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -16601,6 +16622,7 @@ "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "license": "MIT", + "peer": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", @@ -17232,6 +17254,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -17547,6 +17570,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, diff --git a/packages/core/src/agents/a2aUtils.ts b/packages/core/src/agents/a2aUtils.ts index 311658118b0..f1e66309d66 100644 --- a/packages/core/src/agents/a2aUtils.ts +++ b/packages/core/src/agents/a2aUtils.ts @@ -28,7 +28,7 @@ export function extractMessageText(message: Message | undefined): string { /** * Extracts text from a single Part. */ -export function extractPartText(part: Part): string { +function extractPartText(part: Part): string { if (isTextPart(part)) { return part.text; } diff --git a/packages/core/src/config/storage.ts b/packages/core/src/config/storage.ts index bd0fec1c8ed..2d7f5d8c2a2 100644 --- a/packages/core/src/config/storage.ts +++ b/packages/core/src/config/storage.ts @@ -8,11 +8,14 @@ import * as path from 'node:path'; import * as os from 'node:os'; import * as crypto from 'node:crypto'; import * as fs from 'node:fs'; -import { GEMINI_DIR, homedir } from '../utils/paths.js'; +import { + GEMINI_DIR, + homedir, + GOOGLE_ACCOUNTS_FILENAME, +} from '../utils/paths.js'; import { ProjectRegistry } from './projectRegistry.js'; import { StorageMigration } from './storageMigration.js'; -export const GOOGLE_ACCOUNTS_FILENAME = 'google_accounts.json'; export const OAUTH_FILE = 'oauth_creds.json'; const TMP_DIR_NAME = 'tmp'; const BIN_DIR_NAME = 'bin'; diff --git a/packages/core/src/ide/detect-ide.ts b/packages/core/src/ide/detect-ide.ts index 40aae11b7f2..c07ef8254cf 100644 --- a/packages/core/src/ide/detect-ide.ts +++ b/packages/core/src/ide/detect-ide.ts @@ -38,7 +38,7 @@ export function isCloudShell(): boolean { return !!(process.env['EDITOR_IN_CLOUD_SHELL'] || process.env['CLOUD_SHELL']); } -export function isJetBrains(): boolean { +function isJetBrains(): boolean { return !!process.env['TERMINAL_EMULATOR'] ?.toLowerCase() .includes('jetbrains'); diff --git a/packages/core/src/mcp/oauth-provider.ts b/packages/core/src/mcp/oauth-provider.ts index d0c8987d4aa..95cec40f50e 100644 --- a/packages/core/src/mcp/oauth-provider.ts +++ b/packages/core/src/mcp/oauth-provider.ts @@ -17,8 +17,6 @@ import { coreEvents } from '../utils/events.js'; import { debugLogger } from '../utils/debugLogger.js'; import { getConsentForOauth } from '../utils/authConsent.js'; -export const OAUTH_DISPLAY_MESSAGE_EVENT = 'oauth-display-message' as const; - /** * OAuth configuration for an MCP server. */ diff --git a/packages/core/src/scheduler/confirmation.ts b/packages/core/src/scheduler/confirmation.ts index 5d98dd526e3..67ae26d2eb0 100644 --- a/packages/core/src/scheduler/confirmation.ts +++ b/packages/core/src/scheduler/confirmation.ts @@ -59,7 +59,7 @@ export interface ResolutionResult { * @param correlationId The correlationId to match. * @param signal An AbortSignal to cancel the wait and cleanup listeners. */ -export async function awaitConfirmation( +async function awaitConfirmation( messageBus: MessageBus, correlationId: string, signal: AbortSignal, diff --git a/packages/core/src/services/chatCompressionService.ts b/packages/core/src/services/chatCompressionService.ts index 6f5366aad5f..21ba912b92d 100644 --- a/packages/core/src/services/chatCompressionService.ts +++ b/packages/core/src/services/chatCompressionService.ts @@ -37,18 +37,18 @@ import { LlmRole } from '../telemetry/types.js'; * Default threshold for compression token count as a fraction of the model's * token limit. If the chat history exceeds this threshold, it will be compressed. */ -export const DEFAULT_COMPRESSION_TOKEN_THRESHOLD = 0.5; +const DEFAULT_COMPRESSION_TOKEN_THRESHOLD = 0.5; /** * The fraction of the latest chat history to keep. A value of 0.3 * means that only the last 30% of the chat history will be kept after compression. */ -export const COMPRESSION_PRESERVE_THRESHOLD = 0.3; +const COMPRESSION_PRESERVE_THRESHOLD = 0.3; /** * The budget for function response tokens in the preserved history. */ -export const COMPRESSION_FUNCTION_RESPONSE_TOKEN_BUDGET = 50_000; +const COMPRESSION_FUNCTION_RESPONSE_TOKEN_BUDGET = 50_000; /** * Returns the index of the oldest item to keep when compressing. May return diff --git a/packages/core/src/telemetry/loggers.ts b/packages/core/src/telemetry/loggers.ts index bbc47cfac86..54bec22a651 100644 --- a/packages/core/src/telemetry/loggers.ts +++ b/packages/core/src/telemetry/loggers.ts @@ -32,7 +32,6 @@ import type { ConversationFinishedEvent, ChatCompressionEvent, MalformedJsonResponseEvent, - InvalidChunkEvent, ContentRetryEvent, ContentRetryFailureEvent, RipgrepFallbackEvent, @@ -65,7 +64,6 @@ import { recordToolCallMetrics, recordChatCompressionMetrics, recordFileOperationMetric, - recordInvalidChunk, recordContentRetry, recordContentRetryFailure, recordModelRoutingMetrics, @@ -470,22 +468,6 @@ export function logMalformedJsonResponse( }); } -export function logInvalidChunk( - config: Config, - event: InvalidChunkEvent, -): void { - ClearcutLogger.getInstance(config)?.logInvalidChunkEvent(event); - bufferTelemetryEvent(() => { - const logger = logs.getLogger(SERVICE_NAME); - const logRecord: LogRecord = { - body: event.toLogBody(), - attributes: event.toOpenTelemetryAttributes(config), - }; - logger.emit(logRecord); - recordInvalidChunk(config); - }); -} - export function logContentRetry( config: Config, event: ContentRetryEvent, diff --git a/packages/core/src/telemetry/metrics.ts b/packages/core/src/telemetry/metrics.ts index 5d8dd90bd12..f7869cb9801 100644 --- a/packages/core/src/telemetry/metrics.ts +++ b/packages/core/src/telemetry/metrics.ts @@ -617,7 +617,7 @@ let baselineComparisonHistogram: Histogram | undefined; let isMetricsInitialized = false; let isPerformanceMonitoringEnabled = false; -export function getMeter(): Meter | undefined { +function getMeter(): Meter | undefined { if (!cliMeter) { cliMeter = metrics.getMeter(SERVICE_NAME); } @@ -1019,7 +1019,7 @@ function getGenAiOperationName(): GenAiOperationName { // Performance Monitoring Functions -export function initializePerformanceMonitoring(config: Config): void { +function initializePerformanceMonitoring(config: Config): void { const meter = getMeter(); if (!meter) return; diff --git a/packages/core/src/telemetry/semantic.ts b/packages/core/src/telemetry/semantic.ts index 23623b5b3ee..c05d110e9f0 100644 --- a/packages/core/src/telemetry/semantic.ts +++ b/packages/core/src/telemetry/semantic.ts @@ -240,7 +240,7 @@ export function toChatMessage(content?: Content): ChatMessage { return message; } -export function toOTelPart(part: Part): AnyPart { +function toOTelPart(part: Part): AnyPart { if (part.thought) { if (part.text) { return new ReasoningPart(part.text); @@ -287,7 +287,7 @@ export enum OTelRole { TOOL = 'tool', } -export function toOTelRole(role?: string): OTelRole { +function toOTelRole(role?: string): OTelRole { switch (role?.toLowerCase()) { case 'system': return OTelRole.SYSTEM; @@ -322,7 +322,7 @@ export enum OTelFinishReason { ERROR = 'error', } -export function toOTelFinishReason(finishReason?: string): OTelFinishReason { +function toOTelFinishReason(finishReason?: string): OTelFinishReason { switch (finishReason) { // we have significantly more finish reasons than the spec case FinishReason.FINISH_REASON_UNSPECIFIED: @@ -376,7 +376,7 @@ export interface ChatMessage { parts: AnyPart[]; } -export class TextPart { +class TextPart { readonly type = 'text'; content: string; @@ -385,7 +385,7 @@ export class TextPart { } } -export class ToolCallRequestPart { +class ToolCallRequestPart { readonly type = 'tool_call'; name?: string; id?: string; @@ -398,7 +398,7 @@ export class ToolCallRequestPart { } } -export class ToolCallResponsePart { +class ToolCallResponsePart { readonly type = 'tool_call_response'; response?: string; id?: string; @@ -409,7 +409,7 @@ export class ToolCallResponsePart { } } -export class ReasoningPart { +class ReasoningPart { readonly type = 'reasoning'; content: string; @@ -418,7 +418,7 @@ export class ReasoningPart { } } -export class GenericPart { +class GenericPart { type: string; [key: string]: unknown; diff --git a/packages/core/src/utils/toolCallContext.ts b/packages/core/src/utils/toolCallContext.ts index c371d237831..e89d20ddef9 100644 --- a/packages/core/src/utils/toolCallContext.ts +++ b/packages/core/src/utils/toolCallContext.ts @@ -21,7 +21,7 @@ export interface ToolCallContext { /** * AsyncLocalStorage instance for tool call context. */ -export const toolCallContext = new AsyncLocalStorage(); +const toolCallContext = new AsyncLocalStorage(); /** * Runs a function within a tool call context.