@vybestack/llxprt-code-core 0.1.23-nightly.250905.97906524 → 0.2.2

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.
Files changed (118) hide show
  1. package/dist/src/adapters/IStreamAdapter.d.ts +3 -3
  2. package/dist/src/auth/precedence.d.ts +1 -1
  3. package/dist/src/auth/precedence.js +9 -4
  4. package/dist/src/auth/precedence.js.map +1 -1
  5. package/dist/src/auth/types.d.ts +4 -4
  6. package/dist/src/code_assist/codeAssist.js +8 -6
  7. package/dist/src/code_assist/codeAssist.js.map +1 -1
  8. package/dist/src/code_assist/setup.js +9 -7
  9. package/dist/src/code_assist/setup.js.map +1 -1
  10. package/dist/src/config/index.d.ts +7 -0
  11. package/dist/src/config/index.js +8 -0
  12. package/dist/src/config/index.js.map +1 -0
  13. package/dist/src/core/client.d.ts +9 -21
  14. package/dist/src/core/client.js +55 -156
  15. package/dist/src/core/client.js.map +1 -1
  16. package/dist/src/core/compression-config.d.ts +1 -1
  17. package/dist/src/core/compression-config.js +4 -5
  18. package/dist/src/core/compression-config.js.map +1 -1
  19. package/dist/src/core/coreToolScheduler.js +50 -15
  20. package/dist/src/core/coreToolScheduler.js.map +1 -1
  21. package/dist/src/core/geminiChat.d.ts +51 -2
  22. package/dist/src/core/geminiChat.js +616 -106
  23. package/dist/src/core/geminiChat.js.map +1 -1
  24. package/dist/src/core/nonInteractiveToolExecutor.js +70 -19
  25. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  26. package/dist/src/core/prompts.js +34 -26
  27. package/dist/src/core/prompts.js.map +1 -1
  28. package/dist/src/core/turn.d.ts +1 -0
  29. package/dist/src/core/turn.js +8 -6
  30. package/dist/src/core/turn.js.map +1 -1
  31. package/dist/src/index.d.ts +1 -2
  32. package/dist/src/index.js +2 -2
  33. package/dist/src/index.js.map +1 -1
  34. package/dist/src/prompt-config/TemplateEngine.js +17 -0
  35. package/dist/src/prompt-config/TemplateEngine.js.map +1 -1
  36. package/dist/src/prompt-config/defaults/core-defaults.js +39 -32
  37. package/dist/src/prompt-config/defaults/core-defaults.js.map +1 -1
  38. package/dist/src/prompt-config/defaults/core.md +2 -0
  39. package/dist/src/prompt-config/defaults/provider-defaults.js +34 -27
  40. package/dist/src/prompt-config/defaults/provider-defaults.js.map +1 -1
  41. package/dist/src/prompt-config/defaults/providers/gemini/core.md +229 -43
  42. package/dist/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/core.md +12 -0
  43. package/dist/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/gemini-2-5-flash/core.md +12 -0
  44. package/dist/src/prompt-config/types.d.ts +2 -0
  45. package/dist/src/providers/BaseProvider.d.ts +32 -6
  46. package/dist/src/providers/BaseProvider.js +79 -22
  47. package/dist/src/providers/BaseProvider.js.map +1 -1
  48. package/dist/src/providers/IProvider.d.ts +9 -3
  49. package/dist/src/providers/LoggingProviderWrapper.d.ts +10 -3
  50. package/dist/src/providers/LoggingProviderWrapper.js +33 -27
  51. package/dist/src/providers/LoggingProviderWrapper.js.map +1 -1
  52. package/dist/src/providers/ProviderContentGenerator.d.ts +2 -2
  53. package/dist/src/providers/ProviderContentGenerator.js +9 -6
  54. package/dist/src/providers/ProviderContentGenerator.js.map +1 -1
  55. package/dist/src/providers/anthropic/AnthropicProvider.d.ts +27 -21
  56. package/dist/src/providers/anthropic/AnthropicProvider.js +473 -472
  57. package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -1
  58. package/dist/src/providers/gemini/GeminiProvider.d.ts +14 -9
  59. package/dist/src/providers/gemini/GeminiProvider.js +202 -486
  60. package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
  61. package/dist/src/providers/openai/ConversationCache.d.ts +3 -3
  62. package/dist/src/providers/openai/IChatGenerateParams.d.ts +9 -4
  63. package/dist/src/providers/openai/OpenAIProvider.d.ts +44 -115
  64. package/dist/src/providers/openai/OpenAIProvider.js +535 -948
  65. package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
  66. package/dist/src/providers/openai/buildResponsesRequest.d.ts +3 -3
  67. package/dist/src/providers/openai/buildResponsesRequest.js +67 -37
  68. package/dist/src/providers/openai/buildResponsesRequest.js.map +1 -1
  69. package/dist/src/providers/openai/estimateRemoteTokens.d.ts +2 -2
  70. package/dist/src/providers/openai/estimateRemoteTokens.js +21 -8
  71. package/dist/src/providers/openai/estimateRemoteTokens.js.map +1 -1
  72. package/dist/src/providers/openai/parseResponsesStream.d.ts +6 -2
  73. package/dist/src/providers/openai/parseResponsesStream.js +99 -391
  74. package/dist/src/providers/openai/parseResponsesStream.js.map +1 -1
  75. package/dist/src/providers/openai/syntheticToolResponses.d.ts +5 -5
  76. package/dist/src/providers/openai/syntheticToolResponses.js +102 -91
  77. package/dist/src/providers/openai/syntheticToolResponses.js.map +1 -1
  78. package/dist/src/providers/openai-responses/OpenAIResponsesProvider.d.ts +18 -20
  79. package/dist/src/providers/openai-responses/OpenAIResponsesProvider.js +250 -239
  80. package/dist/src/providers/openai-responses/OpenAIResponsesProvider.js.map +1 -1
  81. package/dist/src/providers/tokenizers/OpenAITokenizer.js +3 -3
  82. package/dist/src/providers/tokenizers/OpenAITokenizer.js.map +1 -1
  83. package/dist/src/providers/types.d.ts +1 -1
  84. package/dist/src/services/history/ContentConverters.d.ts +6 -1
  85. package/dist/src/services/history/ContentConverters.js +155 -18
  86. package/dist/src/services/history/ContentConverters.js.map +1 -1
  87. package/dist/src/services/history/HistoryService.d.ts +52 -0
  88. package/dist/src/services/history/HistoryService.js +245 -93
  89. package/dist/src/services/history/HistoryService.js.map +1 -1
  90. package/dist/src/services/history/IContent.d.ts +4 -0
  91. package/dist/src/services/history/IContent.js.map +1 -1
  92. package/dist/src/telemetry/types.d.ts +16 -4
  93. package/dist/src/telemetry/types.js.map +1 -1
  94. package/dist/src/tools/IToolFormatter.d.ts +2 -2
  95. package/dist/src/tools/ToolFormatter.d.ts +42 -4
  96. package/dist/src/tools/ToolFormatter.js +159 -37
  97. package/dist/src/tools/ToolFormatter.js.map +1 -1
  98. package/dist/src/tools/doubleEscapeUtils.d.ts +57 -0
  99. package/dist/src/tools/doubleEscapeUtils.js +241 -0
  100. package/dist/src/tools/doubleEscapeUtils.js.map +1 -0
  101. package/dist/src/tools/read-file.js +5 -2
  102. package/dist/src/tools/read-file.js.map +1 -1
  103. package/dist/src/tools/todo-schemas.d.ts +4 -4
  104. package/dist/src/tools/write-file.js +5 -2
  105. package/dist/src/tools/write-file.js.map +1 -1
  106. package/dist/src/types/modelParams.d.ts +8 -0
  107. package/dist/src/utils/bfsFileSearch.js +2 -6
  108. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  109. package/package.json +8 -7
  110. package/dist/src/core/ContentGeneratorAdapter.d.ts +0 -37
  111. package/dist/src/core/ContentGeneratorAdapter.js +0 -58
  112. package/dist/src/core/ContentGeneratorAdapter.js.map +0 -1
  113. package/dist/src/providers/IMessage.d.ts +0 -38
  114. package/dist/src/providers/IMessage.js +0 -17
  115. package/dist/src/providers/IMessage.js.map +0 -1
  116. package/dist/src/providers/adapters/GeminiCompatibleWrapper.d.ts +0 -69
  117. package/dist/src/providers/adapters/GeminiCompatibleWrapper.js +0 -577
  118. package/dist/src/providers/adapters/GeminiCompatibleWrapper.js.map +0 -1
@@ -3,7 +3,7 @@
3
3
  * Copyright 2025 Vybestack LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { IMessage } from '../providers/IMessage.js';
6
+ import { IContent } from '../services/history/IContent.js';
7
7
  import { ServerGeminiStreamEvent } from '../core/turn.js';
8
8
  /**
9
9
  * Interface for adapting provider-specific streams to Gemini event format
@@ -11,8 +11,8 @@ import { ServerGeminiStreamEvent } from '../core/turn.js';
11
11
  export interface IStreamAdapter {
12
12
  /**
13
13
  * Adapts a provider's stream format to Gemini's event stream format
14
- * @param providerStream The provider-specific stream of messages
14
+ * @param providerStream The provider-specific stream of content
15
15
  * @returns An async iterator of Gemini events
16
16
  */
17
- adaptStream(providerStream: AsyncIterableIterator<IMessage>): AsyncIterableIterator<ServerGeminiStreamEvent>;
17
+ adaptStream(providerStream: AsyncIterableIterator<IContent>): AsyncIterableIterator<ServerGeminiStreamEvent>;
18
18
  }
@@ -37,7 +37,7 @@ export declare class AuthPrecedenceResolver {
37
37
  */
38
38
  getAuthMethodName(): Promise<string | null>;
39
39
  /**
40
- * Reads API key from a file path, handling both absolute and relative paths
40
+ * Reads API key from a file path, handling tilde expansion, absolute and relative paths
41
41
  */
42
42
  private readKeyFile;
43
43
  /**
@@ -16,6 +16,7 @@
16
16
  */
17
17
  import * as fs from 'node:fs/promises';
18
18
  import * as path from 'node:path';
19
+ import * as os from 'node:os';
19
20
  import { getSettingsService } from '../settings/settingsServiceInstance.js';
20
21
  export class AuthPrecedenceResolver {
21
22
  config;
@@ -145,14 +146,18 @@ export class AuthPrecedenceResolver {
145
146
  return null;
146
147
  }
147
148
  /**
148
- * Reads API key from a file path, handling both absolute and relative paths
149
+ * Reads API key from a file path, handling tilde expansion, absolute and relative paths
149
150
  */
150
151
  async readKeyFile(filePath) {
151
152
  try {
153
+ // Handle tilde expansion for home directory
154
+ const expandedPath = filePath.startsWith('~')
155
+ ? path.join(os.homedir(), filePath.slice(1))
156
+ : filePath;
152
157
  // Handle relative paths from current working directory
153
- const resolvedPath = path.isAbsolute(filePath)
154
- ? filePath
155
- : path.resolve(process.cwd(), filePath);
158
+ const resolvedPath = path.isAbsolute(expandedPath)
159
+ ? expandedPath
160
+ : path.resolve(process.cwd(), expandedPath);
156
161
  const content = await fs.readFile(resolvedPath, 'utf-8');
157
162
  const key = content.trim();
158
163
  if (key === '') {
@@ -1 +1 @@
1
- {"version":3,"file":"precedence.js","sourceRoot":"","sources":["../../../src/auth/precedence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"precedence.js","sourceRoot":"","sources":["../../../src/auth/precedence.ts"],"names":[],"mappings":"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"}
@@ -40,13 +40,13 @@ export declare const ProviderOAuthConfigSchema: z.ZodObject<{
40
40
  scopes: z.ZodArray<z.ZodString, "many">;
41
41
  }, "strip", z.ZodTypeAny, {
42
42
  clientId: string;
43
- provider: "gemini" | "qwen";
43
+ provider: "qwen" | "gemini";
44
44
  scopes: string[];
45
45
  authorizationEndpoint: string;
46
46
  tokenEndpoint: string;
47
47
  }, {
48
48
  clientId: string;
49
- provider: "gemini" | "qwen";
49
+ provider: "qwen" | "gemini";
50
50
  scopes: string[];
51
51
  authorizationEndpoint: string;
52
52
  tokenEndpoint: string;
@@ -111,14 +111,14 @@ export declare const AuthStatusSchema: z.ZodObject<{
111
111
  expiresIn: z.ZodOptional<z.ZodNumber>;
112
112
  oauthEnabled: z.ZodOptional<z.ZodBoolean>;
113
113
  }, "strip", z.ZodTypeAny, {
114
- authType: "none" | "oauth" | "api-key";
115
114
  provider: string;
115
+ authType: "none" | "oauth" | "api-key";
116
116
  authenticated: boolean;
117
117
  expiresIn?: number | undefined;
118
118
  oauthEnabled?: boolean | undefined;
119
119
  }, {
120
- authType: "none" | "oauth" | "api-key";
121
120
  provider: string;
121
+ authType: "none" | "oauth" | "api-key";
122
122
  authenticated: boolean;
123
123
  expiresIn?: number | undefined;
124
124
  oauthEnabled?: boolean | undefined;
@@ -7,25 +7,27 @@ import { AuthType } from '../core/contentGenerator.js';
7
7
  import { getOauthClient } from './oauth2.js';
8
8
  import { setupUser } from './setup.js';
9
9
  import { CodeAssistServer } from './server.js';
10
+ import { DebugLogger } from '../debug/index.js';
10
11
  export async function createCodeAssistContentGenerator(httpOptions, authType, config, baseURL, // Add baseURL parameter
11
12
  _sessionId) {
12
- console.log(`createCodeAssistContentGenerator: authType=${authType}, config=${!!config}, baseURL=${baseURL}`);
13
+ const logger = new DebugLogger('llxprt:code:assist');
14
+ logger.debug(() => `createCodeAssistContentGenerator: authType=${authType}, config=${!!config}, baseURL=${baseURL}`);
13
15
  if (authType === AuthType.LOGIN_WITH_GOOGLE ||
14
16
  authType === AuthType.CLOUD_SHELL) {
15
17
  try {
16
- console.log(`createCodeAssistContentGenerator: calling getOauthClient for authType ${authType}`);
18
+ logger.debug(() => `createCodeAssistContentGenerator: calling getOauthClient for authType ${authType}`);
17
19
  const authClient = await getOauthClient(authType, config);
18
- console.log(`createCodeAssistContentGenerator: OAuth client created, calling setupUser`);
20
+ logger.debug(() => `createCodeAssistContentGenerator: OAuth client created, calling setupUser`);
19
21
  const userData = await setupUser(authClient);
20
- console.log(`createCodeAssistContentGenerator: setupUser completed, projectId=${userData.projectId}, userTier=${userData.userTier}`);
22
+ logger.debug(() => `createCodeAssistContentGenerator: setupUser completed, projectId=${userData.projectId}, userTier=${userData.userTier}`);
21
23
  return new CodeAssistServer(authClient, userData.projectId, httpOptions,
22
24
  // PRIVACY FIX: sessionId removed to prevent transmission to Google servers
23
25
  // sessionId, // removed
24
26
  userData.userTier, baseURL);
25
27
  }
26
28
  catch (error) {
27
- console.log(`createCodeAssistContentGenerator: ERROR during OAuth setup: ${error}`);
28
- console.log(`createCodeAssistContentGenerator: Error details:`, error);
29
+ logger.debug(() => `createCodeAssistContentGenerator: ERROR during OAuth setup: ${error}`);
30
+ logger.debug(() => `createCodeAssistContentGenerator: Error details: ${error}`);
29
31
  throw error;
30
32
  }
31
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"codeAssist.js","sourceRoot":"","sources":["../../../src/code_assist/codeAssist.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAoB,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAe,MAAM,aAAa,CAAC;AAG5D,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,WAAwB,EACxB,QAAkB,EAClB,MAAc,EACd,OAAgB,EAAE,wBAAwB;AAC1C,UAAmB;IAEnB,OAAO,CAAC,GAAG,CACT,8CAA8C,QAAQ,YAAY,CAAC,CAAC,MAAM,aAAa,OAAO,EAAE,CACjG,CAAC;IAEF,IACE,QAAQ,KAAK,QAAQ,CAAC,iBAAiB;QACvC,QAAQ,KAAK,QAAQ,CAAC,WAAW,EACjC,CAAC;QACD,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CACT,yEAAyE,QAAQ,EAAE,CACpF,CAAC;YACF,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CACT,2EAA2E,CAC5E,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CACT,oEAAoE,QAAQ,CAAC,SAAS,cAAc,QAAQ,CAAC,QAAQ,EAAE,CACxH,CAAC;YACF,OAAO,IAAI,gBAAgB,CACzB,UAAU,EACV,QAAQ,CAAC,SAAS,EAClB,WAAW;YACX,2EAA2E;YAC3E,wBAAwB;YACxB,QAAQ,CAAC,QAAQ,EACjB,OAAO,CACR,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CACT,+DAA+D,KAAK,EAAE,CACvE,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAC;YACvE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;AACvD,CAAC"}
1
+ {"version":3,"file":"codeAssist.js","sourceRoot":"","sources":["../../../src/code_assist/codeAssist.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAoB,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAe,MAAM,aAAa,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,WAAwB,EACxB,QAAkB,EAClB,MAAc,EACd,OAAgB,EAAE,wBAAwB;AAC1C,UAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAErD,MAAM,CAAC,KAAK,CACV,GAAG,EAAE,CACH,8CAA8C,QAAQ,YAAY,CAAC,CAAC,MAAM,aAAa,OAAO,EAAE,CACnG,CAAC;IAEF,IACE,QAAQ,KAAK,QAAQ,CAAC,iBAAiB;QACvC,QAAQ,KAAK,QAAQ,CAAC,WAAW,EACjC,CAAC;QACD,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,CACV,GAAG,EAAE,CACH,yEAAyE,QAAQ,EAAE,CACtF,CAAC;YACF,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,CACV,GAAG,EAAE,CACH,2EAA2E,CAC9E,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,CACV,GAAG,EAAE,CACH,oEAAoE,QAAQ,CAAC,SAAS,cAAc,QAAQ,CAAC,QAAQ,EAAE,CAC1H,CAAC;YACF,OAAO,IAAI,gBAAgB,CACzB,UAAU,EACV,QAAQ,CAAC,SAAS,EAClB,WAAW;YACX,2EAA2E;YAC3E,wBAAwB;YACxB,QAAQ,CAAC,QAAQ,EACjB,OAAO,CACR,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CACV,GAAG,EAAE,CACH,+DAA+D,KAAK,EAAE,CACzE,CAAC;YACF,MAAM,CAAC,KAAK,CACV,GAAG,EAAE,CAAC,oDAAoD,KAAK,EAAE,CAClE,CAAC;YACF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;AACvD,CAAC"}
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { UserTierId, } from './types.js';
7
7
  import { CodeAssistServer } from './server.js';
8
+ import { DebugLogger } from '../debug/index.js';
8
9
  export class ProjectIdRequiredError extends Error {
9
10
  constructor() {
10
11
  super('This account requires setting the GOOGLE_CLOUD_PROJECT env var. See https://goo.gle/gemini-cli-auth-docs#workspace-gca');
@@ -16,7 +17,8 @@ export class ProjectIdRequiredError extends Error {
16
17
  * @returns the user's actual project id
17
18
  */
18
19
  export async function setupUser(client) {
19
- console.log(`setupUser: starting setup, GOOGLE_CLOUD_PROJECT=${process.env.GOOGLE_CLOUD_PROJECT || 'undefined'}`);
20
+ const logger = new DebugLogger('llxprt:code:setup');
21
+ logger.debug(() => `setupUser: starting setup, GOOGLE_CLOUD_PROJECT=${process.env.GOOGLE_CLOUD_PROJECT || 'undefined'}`);
20
22
  const projectId = process.env.GOOGLE_CLOUD_PROJECT || undefined;
21
23
  // PRIVACY FIX: sessionId parameter removed from CodeAssistServer constructor
22
24
  const caServer = new CodeAssistServer(client, projectId, {}, undefined);
@@ -25,7 +27,7 @@ export async function setupUser(client) {
25
27
  platform: 'PLATFORM_UNSPECIFIED',
26
28
  pluginType: 'GEMINI',
27
29
  };
28
- console.log(`setupUser: created CodeAssistServer, calling loadCodeAssist`);
30
+ logger.debug(() => `setupUser: created CodeAssistServer, calling loadCodeAssist`);
29
31
  const loadRes = await caServer.loadCodeAssist({
30
32
  cloudaicompanionProject: projectId,
31
33
  metadata: {
@@ -33,21 +35,21 @@ export async function setupUser(client) {
33
35
  duetProject: projectId,
34
36
  },
35
37
  });
36
- console.log(`setupUser: loadCodeAssist completed, currentTier=${!!loadRes.currentTier}, cloudaicompanionProject=${loadRes.cloudaicompanionProject}`);
38
+ logger.debug(() => `setupUser: loadCodeAssist completed, currentTier=${!!loadRes.currentTier}, cloudaicompanionProject=${loadRes.cloudaicompanionProject}`);
37
39
  if (loadRes.currentTier) {
38
- console.log(`setupUser: user has current tier: ${loadRes.currentTier.id}`);
40
+ logger.debug(() => `setupUser: user has current tier: ${loadRes.currentTier.id}`);
39
41
  if (!loadRes.cloudaicompanionProject) {
40
42
  if (projectId) {
41
- console.log(`setupUser: returning with project ID from env: ${projectId}`);
43
+ logger.debug(() => `setupUser: returning with project ID from env: ${projectId}`);
42
44
  return {
43
45
  projectId,
44
46
  userTier: loadRes.currentTier.id,
45
47
  };
46
48
  }
47
- console.log(`setupUser: throwing ProjectIdRequiredError - no project ID available`);
49
+ logger.debug(() => `setupUser: throwing ProjectIdRequiredError - no project ID available`);
48
50
  throw new ProjectIdRequiredError();
49
51
  }
50
- console.log(`setupUser: returning with project ID from response: ${loadRes.cloudaicompanionProject}`);
52
+ logger.debug(() => `setupUser: returning with project ID from response: ${loadRes.cloudaicompanionProject}`);
51
53
  return {
52
54
  projectId: loadRes.cloudaicompanionProject,
53
55
  userTier: loadRes.currentTier.id,
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/code_assist/setup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAKL,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C;QACE,KAAK,CACH,wHAAwH,CACzH,CAAC;IACJ,CAAC;CACF;AAOD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAoB;IAClD,OAAO,CAAC,GAAG,CACT,mDAAmD,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,WAAW,EAAE,CACrG,CAAC;IACF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,SAAS,CAAC;IAChE,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;IACxE,MAAM,kBAAkB,GAAmB;QACzC,OAAO,EAAE,iBAAiB;QAC1B,QAAQ,EAAE,sBAAsB;QAChC,UAAU,EAAE,QAAQ;KACrB,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAE3E,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC;QAC5C,uBAAuB,EAAE,SAAS;QAClC,QAAQ,EAAE;YACR,GAAG,kBAAkB;YACrB,WAAW,EAAE,SAAS;SACvB;KACF,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CACT,oDAAoD,CAAC,CAAC,OAAO,CAAC,WAAW,6BAA6B,OAAO,CAAC,uBAAuB,EAAE,CACxI,CAAC;IAEF,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,qCAAqC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC;YACrC,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CACT,kDAAkD,SAAS,EAAE,CAC9D,CAAC;gBACF,OAAO;oBACL,SAAS;oBACT,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE;iBACjC,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,GAAG,CACT,sEAAsE,CACvE,CAAC;YACF,MAAM,IAAI,sBAAsB,EAAE,CAAC;QACrC,CAAC;QACD,OAAO,CAAC,GAAG,CACT,uDAAuD,OAAO,CAAC,uBAAuB,EAAE,CACzF,CAAC;QACF,OAAO;YACL,SAAS,EAAE,OAAO,CAAC,uBAAuB;YAC1C,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE;SACjC,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,kCAAkC,IAAI,CAAC,SAAS,EAAE,CAAC;QAC1D,MAAM,IAAI,sBAAsB,EAAE,CAAC;IACrC,CAAC;IAED,IAAI,UAA8B,CAAC;IACnC,IAAI,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC;QAChC,0IAA0I;QAC1I,UAAU,GAAG;YACX,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,uBAAuB,EAAE,SAAS;YAClC,QAAQ,EAAE,kBAAkB;SAC7B,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,UAAU,GAAG;YACX,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,uBAAuB,EAAE,SAAS;YAClC,QAAQ,EAAE;gBACR,GAAG,kBAAkB;gBACrB,WAAW,EAAE,SAAS;aACvB;SACF,CAAC;IACJ,CAAC;IAED,6DAA6D;IAC7D,IAAI,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACpD,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9C,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,uBAAuB,EAAE,EAAE,EAAE,CAAC;QAClD,IAAI,SAAS,EAAE,CAAC;YACd,OAAO;gBACL,SAAS;gBACT,QAAQ,EAAE,IAAI,CAAC,EAAE;aAClB,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,sBAAsB,EAAE,CAAC;IACrC,CAAC;IAED,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE;QACrD,QAAQ,EAAE,IAAI,CAAC,EAAE;KAClB,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,GAA2B;IACjD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO;QACL,IAAI,EAAE,EAAE;QACR,WAAW,EAAE,EAAE;QACf,EAAE,EAAE,UAAU,CAAC,MAAM;QACrB,kCAAkC,EAAE,IAAI;KACzC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/code_assist/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export { Config, type ConfigParameters, type RedactionConfig, ApprovalMode, type AccessibilitySettings, type BugCommandSettings, type ChatCompressionSettings, type SummarizeToolOutputSettings, type ComplexityAnalyzerSettings, type TelemetrySettings, MCPServerConfig, AuthProviderType, type SandboxConfig, type FlashFallbackHandler, type ActiveExtension, type GeminiCLIExtension, type FileFilteringOptions, DEFAULT_MEMORY_FILE_FILTERING_OPTIONS, DEFAULT_FILE_FILTERING_OPTIONS, type MCPOAuthConfig, DEFAULT_GEMINI_FLASH_MODEL, } from './config.js';
7
+ export { DEFAULT_GEMINI_FLASH_MODEL as DEFAULT_FLASH_MODEL } from './models.js';
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export { Config, ApprovalMode, MCPServerConfig, AuthProviderType, DEFAULT_MEMORY_FILE_FILTERING_OPTIONS, DEFAULT_FILE_FILTERING_OPTIONS, DEFAULT_GEMINI_FLASH_MODEL, } from './config.js';
7
+ export { DEFAULT_GEMINI_FLASH_MODEL as DEFAULT_FLASH_MODEL } from './models.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,MAAM,EAGN,YAAY,EAOZ,eAAe,EACf,gBAAgB,EAMhB,qCAAqC,EACrC,8BAA8B,EAE9B,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,0BAA0B,IAAI,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { GenerateContentConfig, PartListUnion, Content, GenerateContentResponse } from '@google/genai';
7
- import { Turn, ServerGeminiStreamEvent, ChatCompressionInfo } from './turn.js';
7
+ import { Turn, ServerGeminiStreamEvent } from './turn.js';
8
8
  import { Config } from '../config/config.js';
9
9
  import { UserTierId } from '../code_assist/types.js';
10
10
  import { GeminiChat } from './geminiChat.js';
@@ -26,20 +26,6 @@ export declare class GeminiClient {
26
26
  private readonly MAX_TURNS;
27
27
  private _pendingConfig?;
28
28
  private _previousHistory?;
29
- /**
30
- * Threshold for compression token count as a fraction of the model's token limit.
31
- * If the chat history exceeds this threshold, it will be compressed.
32
- */
33
- private COMPRESSION_TOKEN_THRESHOLD;
34
- /**
35
- * The fraction of the latest chat history to keep. A value of 0.5
36
- * means that only the last 50% of the chat history will be kept after compression.
37
- */
38
- private readonly COMPRESSION_PRESERVE_THRESHOLD;
39
- /**
40
- * User-defined context limit override
41
- */
42
- private userContextLimit?;
43
29
  private readonly loopDetector;
44
30
  private lastPromptId?;
45
31
  private readonly complexityAnalyzer;
@@ -48,12 +34,7 @@ export declare class GeminiClient {
48
34
  private readonly complexitySuggestionCooldown;
49
35
  private lastSentIdeContext;
50
36
  private forceFullIdeContext;
51
- private logger;
52
37
  constructor(config: Config);
53
- /**
54
- * Set the compression threshold and context limit overrides
55
- */
56
- setCompressionSettings(compressionThreshold?: number, contextLimit?: number): void;
57
38
  initialize(contentGeneratorConfig: ContentGeneratorConfig): Promise<void>;
58
39
  private lazyInitialize;
59
40
  getContentGenerator(): ContentGenerator;
@@ -86,7 +67,14 @@ export declare class GeminiClient {
86
67
  generateJson(contents: Content[], schema: Record<string, unknown>, abortSignal: AbortSignal, model?: string, config?: GenerateContentConfig): Promise<Record<string, unknown>>;
87
68
  generateContent(contents: Content[], generationConfig: GenerateContentConfig, abortSignal: AbortSignal, model?: string): Promise<GenerateContentResponse>;
88
69
  generateEmbedding(texts: string[]): Promise<number[][]>;
89
- tryCompressChat(prompt_id: string, force?: boolean): Promise<ChatCompressionInfo | null>;
70
+ /**
71
+ * Manually trigger chat compression
72
+ * Returns compression info if successful, null if not needed
73
+ */
74
+ tryCompressChat(prompt_id: string, _force?: boolean): Promise<{
75
+ originalTokenCount: number;
76
+ newTokenCount: number;
77
+ } | null>;
90
78
  /**
91
79
  * Handles falling back to Flash model when persistent 429 errors occur for OAuth users.
92
80
  * Uses a fallback handler if provided by the config; otherwise, returns null.
@@ -4,18 +4,16 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { getDirectoryContextString, getEnvironmentContext, } from '../utils/environmentContext.js';
7
- import { Turn, GeminiEventType, } from './turn.js';
8
- import { getCoreSystemPromptAsync, getCompressionPrompt } from './prompts.js';
7
+ import { Turn, GeminiEventType } from './turn.js';
8
+ import { getCoreSystemPromptAsync } from './prompts.js';
9
9
  import { getResponseText } from '../utils/generateContentResponseUtilities.js';
10
10
  import { reportError } from '../utils/errorReporting.js';
11
11
  import { GeminiChat } from './geminiChat.js';
12
+ import { DebugLogger } from '../debug/index.js';
12
13
  import { HistoryService } from '../services/history/HistoryService.js';
13
14
  import { ContentConverters } from '../services/history/ContentConverters.js';
14
15
  import { retryWithBackoff } from '../utils/retry.js';
15
16
  import { getErrorMessage } from '../utils/errors.js';
16
- import { isFunctionResponse } from '../utils/messageInspectors.js';
17
- import { tokenLimit } from './tokenLimits.js';
18
- import { COMPRESSION_TOKEN_THRESHOLD, COMPRESSION_PRESERVE_THRESHOLD, } from './compression-config.js';
19
17
  import { AuthType, createContentGenerator, } from './contentGenerator.js';
20
18
  import { ProxyAgent, setGlobalDispatcher } from 'undici';
21
19
  import { DEFAULT_GEMINI_FLASH_MODEL } from '../config/models.js';
@@ -23,7 +21,6 @@ import { LoopDetectionService } from '../services/loopDetectionService.js';
23
21
  import { ideContext } from '../ide/ideContext.js';
24
22
  import { ComplexityAnalyzer } from '../services/complexity-analyzer.js';
25
23
  import { TodoReminderService } from '../services/todo-reminder-service.js';
26
- import { DebugLogger } from '../debug/index.js';
27
24
  function isThinkingSupported(model) {
28
25
  if (model.startsWith('gemini-2.5'))
29
26
  return true;
@@ -77,20 +74,6 @@ export class GeminiClient {
77
74
  MAX_TURNS = 100;
78
75
  _pendingConfig;
79
76
  _previousHistory;
80
- /**
81
- * Threshold for compression token count as a fraction of the model's token limit.
82
- * If the chat history exceeds this threshold, it will be compressed.
83
- */
84
- COMPRESSION_TOKEN_THRESHOLD = COMPRESSION_TOKEN_THRESHOLD;
85
- /**
86
- * The fraction of the latest chat history to keep. A value of 0.5
87
- * means that only the last 50% of the chat history will be kept after compression.
88
- */
89
- COMPRESSION_PRESERVE_THRESHOLD = COMPRESSION_PRESERVE_THRESHOLD;
90
- /**
91
- * User-defined context limit override
92
- */
93
- userContextLimit;
94
77
  loopDetector;
95
78
  lastPromptId;
96
79
  complexityAnalyzer;
@@ -99,10 +82,8 @@ export class GeminiClient {
99
82
  complexitySuggestionCooldown;
100
83
  lastSentIdeContext;
101
84
  forceFullIdeContext = true;
102
- logger;
103
85
  constructor(config) {
104
86
  this.config = config;
105
- this.logger = new DebugLogger('llxprt:core:client');
106
87
  if (config.getProxy()) {
107
88
  setGlobalDispatcher(new ProxyAgent(config.getProxy()));
108
89
  }
@@ -119,19 +100,6 @@ export class GeminiClient {
119
100
  complexitySettings.suggestionCooldownMs ?? 300000;
120
101
  this.todoReminderService = new TodoReminderService();
121
102
  }
122
- /**
123
- * Set the compression threshold and context limit overrides
124
- */
125
- setCompressionSettings(compressionThreshold, contextLimit) {
126
- if (compressionThreshold !== undefined &&
127
- compressionThreshold > 0 &&
128
- compressionThreshold <= 1) {
129
- this.COMPRESSION_TOKEN_THRESHOLD = compressionThreshold;
130
- }
131
- if (contextLimit !== undefined && contextLimit > 0) {
132
- this.userContextLimit = contextLimit;
133
- }
134
- }
135
103
  async initialize(contentGeneratorConfig) {
136
104
  // Preserve chat history before resetting
137
105
  const previousHistory = this.chat?.getHistory();
@@ -259,8 +227,26 @@ export class GeminiClient {
259
227
  this.getChat().setTools(tools);
260
228
  }
261
229
  async resetChat() {
262
- // Pass the stored history to startChat so it's preserved
263
- this.chat = await this.startChat(this._previousHistory);
230
+ // If chat exists, clear its history service
231
+ if (this.chat) {
232
+ const historyService = this.chat.getHistoryService();
233
+ if (historyService) {
234
+ // Clear the history service directly
235
+ historyService.clear();
236
+ }
237
+ else {
238
+ // Fallback to chat's clearHistory if no history service
239
+ this.chat.clearHistory();
240
+ }
241
+ // Reset the chat's internal state
242
+ this.forceFullIdeContext = true;
243
+ }
244
+ else {
245
+ // No chat exists yet, create one with empty history
246
+ this.chat = await this.startChat([]);
247
+ }
248
+ // Clear the stored history as well
249
+ this._previousHistory = [];
264
250
  }
265
251
  async addDirectoryContext() {
266
252
  if (!this.chat) {
@@ -291,9 +277,8 @@ export class GeminiClient {
291
277
  try {
292
278
  const userMemory = this.config.getUserMemory();
293
279
  const model = this.config.getModel();
294
- if (process.env.DEBUG) {
295
- console.log('DEBUG [client.startChat]: Model from config:', model);
296
- }
280
+ const logger = new DebugLogger('llxprt:client:start');
281
+ logger.debug(() => `DEBUG [client.startChat]: Model from config: ${model}`);
297
282
  let systemInstruction = await getCoreSystemPromptAsync(userMemory, model);
298
283
  // Add environment context to system instruction
299
284
  const envContextText = envParts
@@ -302,9 +287,7 @@ export class GeminiClient {
302
287
  if (envContextText) {
303
288
  systemInstruction = `${envContextText}\n\n${systemInstruction}`;
304
289
  }
305
- if (process.env.DEBUG) {
306
- console.log('DEBUG [client.startChat]: System instruction includes Flash instructions:', systemInstruction.includes('IMPORTANT: You MUST use the provided tools'));
307
- }
290
+ logger.debug(() => `DEBUG [client.startChat]: System instruction includes Flash instructions: ${systemInstruction.includes('IMPORTANT: You MUST use the provided tools')}`);
308
291
  const generateContentConfigWithThinking = isThinkingSupported(this.config.getModel())
309
292
  ? {
310
293
  ...this.generateContentConfig,
@@ -465,12 +448,11 @@ export class GeminiClient {
465
448
  }
466
449
  }
467
450
  async *sendMessageStream(request, signal, prompt_id, turns = this.MAX_TURNS, originalModel) {
468
- if (process.env.DEBUG) {
469
- console.log('DEBUG: GeminiClient.sendMessageStream called');
470
- console.log('DEBUG: GeminiClient.sendMessageStream request:', JSON.stringify(request, null, 2));
471
- console.log('DEBUG: GeminiClient.sendMessageStream typeof request:', typeof request);
472
- console.log('DEBUG: GeminiClient.sendMessageStream Array.isArray(request):', Array.isArray(request));
473
- }
451
+ const logger = new DebugLogger('llxprt:client:stream');
452
+ logger.debug(() => 'DEBUG: GeminiClient.sendMessageStream called');
453
+ logger.debug(() => `DEBUG: GeminiClient.sendMessageStream request: ${JSON.stringify(request, null, 2)}`);
454
+ logger.debug(() => `DEBUG: GeminiClient.sendMessageStream typeof request: ${typeof request}`);
455
+ logger.debug(() => `DEBUG: GeminiClient.sendMessageStream Array.isArray(request): ${Array.isArray(request)}`);
474
456
  await this.lazyInitialize();
475
457
  // Ensure chat is initialized after lazyInitialize
476
458
  if (!this.chat) {
@@ -507,10 +489,6 @@ export class GeminiClient {
507
489
  }
508
490
  // Track the original model from the first call to detect model switching
509
491
  const initialModel = originalModel || this.config.getModel();
510
- const compressed = await this.tryCompressChat(prompt_id);
511
- if (compressed) {
512
- yield { type: GeminiEventType.ChatCompressed, value: compressed };
513
- }
514
492
  // Prevent context updates from being sent while a tool call is
515
493
  // waiting for a response. The Gemini API requires that a functionResponse
516
494
  // part from the user immediately follows a functionCall part from the model
@@ -728,118 +706,39 @@ export class GeminiClient {
728
706
  return values;
729
707
  });
730
708
  }
731
- async tryCompressChat(prompt_id, force = false) {
709
+ /**
710
+ * Manually trigger chat compression
711
+ * Returns compression info if successful, null if not needed
712
+ */
713
+ async tryCompressChat(prompt_id, _force = false) {
732
714
  await this.lazyInitialize();
733
- const curatedHistory = this.getChat().getHistory(true);
734
- // Regardless of `force`, don't do anything if the history is empty.
735
- if (curatedHistory.length === 0) {
715
+ if (!this.hasChatInitialized()) {
736
716
  return null;
737
717
  }
738
- const model = this.config.getModel();
739
- // Use HistoryService's token count for consistency
740
- const historyService = this.getHistoryService();
741
- let originalTokenCount = 0;
742
- if (historyService) {
743
- // Wait for any pending token calculations to complete
744
- await historyService.recalculateTokens(model);
745
- originalTokenCount = historyService.getTotalTokens();
746
- }
747
- else {
748
- // Fallback to content generator if history service not available
749
- const countResult = await this.getContentGenerator().countTokens({
750
- model,
751
- contents: curatedHistory,
752
- });
753
- originalTokenCount = countResult.totalTokens || 0;
754
- }
718
+ const chat = this.getChat();
719
+ const historyService = chat.getHistoryService();
720
+ // Get current token count
721
+ const originalTokenCount = historyService.getTotalTokens();
755
722
  if (originalTokenCount === 0) {
756
- this.logger.log(() => `[Warning] Could not determine token count for model ${model}.`);
757
723
  return null;
758
724
  }
759
- const contextPercentageThreshold = this.config.getChatCompression()?.contextPercentageThreshold;
760
- // Don't compress if not forced and we are under the limit.
761
- if (!force) {
762
- const threshold = contextPercentageThreshold ?? this.COMPRESSION_TOKEN_THRESHOLD;
763
- const contextLimit = tokenLimit(model, this.userContextLimit);
764
- if (originalTokenCount < threshold * contextLimit) {
765
- return null;
766
- }
767
- }
768
- // Find the split point based on keeping the most recent 50% of messages
769
- // Use a simpler approach: keep the last half of the messages
770
- let compressBeforeIndex = Math.floor(curatedHistory.length * (1 - this.COMPRESSION_PRESERVE_THRESHOLD));
771
- // Ensure we don't compress everything - keep at least the last 2 turns
772
- if (compressBeforeIndex >= curatedHistory.length - 4) {
773
- compressBeforeIndex = Math.max(0, curatedHistory.length - 4);
774
- }
775
- // Find the first user message after the index to ensure we don't split mid-turn
776
- while (compressBeforeIndex < curatedHistory.length &&
777
- (curatedHistory[compressBeforeIndex]?.role === 'model' ||
778
- isFunctionResponse(curatedHistory[compressBeforeIndex]))) {
779
- compressBeforeIndex++;
780
- }
781
- const historyToCompress = curatedHistory.slice(0, compressBeforeIndex);
782
- const historyToKeep = curatedHistory.slice(compressBeforeIndex);
783
- // Debug logging
784
- this.logger.debug(() => `[Compression] Compressing ${historyToCompress.length} messages, keeping ${historyToKeep.length} messages`);
785
- this.logger.debug(() => `[Compression] Original token count: ${originalTokenCount}`);
786
- this.getChat().setHistory(historyToCompress);
787
- const response = await this.getChat().sendMessage({
788
- message: {
789
- text: 'First, reason in your scratchpad. Then, generate the <state_snapshot>.',
790
- },
791
- config: {
792
- systemInstruction: { text: getCompressionPrompt() },
793
- },
794
- }, prompt_id);
795
- // Extract text from the response using the utility function
796
- const summary = getResponseText(response);
797
- // Debug: log the summary length
798
- if (summary) {
799
- this.logger.debug(() => `[Compression] Summary length: ${summary.length} characters`);
800
- this.logger.debug(() => `[Compression] Summary preview: ${summary.substring(0, 200)}...`);
801
- // Ensure the summary is meaningful (not just empty XML tags)
802
- if (summary.length < 100) {
803
- this.logger.log(() => '[Warning] [Compression] Summary appears too short, may be incomplete');
725
+ // Perform compression
726
+ try {
727
+ await chat.performCompression(prompt_id);
728
+ // Get new token count after compression
729
+ const newTokenCount = historyService.getTotalTokens();
730
+ // Check if compression actually happened
731
+ if (newTokenCount < originalTokenCount) {
732
+ return {
733
+ originalTokenCount,
734
+ newTokenCount,
735
+ };
804
736
  }
805
737
  }
806
- else {
807
- this.logger.log(() => '[Warning] [Compression] No summary generated');
808
- return null;
809
- }
810
- this.chat = await this.startChat([
811
- {
812
- role: 'user',
813
- parts: [{ text: summary }],
814
- },
815
- {
816
- role: 'model',
817
- parts: [{ text: 'Got it. Thanks for the additional context!' }],
818
- },
819
- ...historyToKeep,
820
- ]);
821
- this.forceFullIdeContext = true;
822
- // Get new token count from the new HistoryService
823
- const newHistoryService = this.getHistoryService();
824
- let newTokenCount = 0;
825
- if (newHistoryService) {
826
- // Wait for recalculation to complete
827
- await newHistoryService.recalculateTokens(model);
828
- newTokenCount = newHistoryService.getTotalTokens();
829
- }
830
- else {
831
- // Fallback
832
- const countResult = await this.getContentGenerator().countTokens({
833
- model: this.config.getModel(),
834
- contents: this.getChat().getHistory(),
835
- });
836
- newTokenCount = countResult.totalTokens || 0;
738
+ catch (error) {
739
+ console.error('Compression failed:', error);
837
740
  }
838
- this.logger.debug(() => `[Compression] New token count: ${newTokenCount}`);
839
- return {
840
- originalTokenCount,
841
- newTokenCount,
842
- };
741
+ return null;
843
742
  }
844
743
  /**
845
744
  * Handles falling back to Flash model when persistent 429 errors occur for OAuth users.