@google/gemini-cli-core 0.21.0-nightly.20251210.d90356e8a → 0.21.0-nightly.20251211.8c83e1ea9

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 (90) hide show
  1. package/dist/google-gemini-cli-core-0.21.0-nightly.20251209.ec9a8c7a7.tgz +0 -0
  2. package/dist/src/agents/delegate-to-agent-tool.d.ts +19 -0
  3. package/dist/src/agents/delegate-to-agent-tool.js +111 -0
  4. package/dist/src/agents/delegate-to-agent-tool.js.map +1 -0
  5. package/dist/src/agents/delegate-to-agent-tool.test.d.ts +6 -0
  6. package/dist/src/agents/delegate-to-agent-tool.test.js +133 -0
  7. package/dist/src/agents/delegate-to-agent-tool.test.js.map +1 -0
  8. package/dist/src/agents/registry.d.ts +15 -0
  9. package/dist/src/agents/registry.js +39 -0
  10. package/dist/src/agents/registry.js.map +1 -1
  11. package/dist/src/agents/registry.test.js +18 -0
  12. package/dist/src/agents/registry.test.js.map +1 -1
  13. package/dist/src/availability/modelAvailabilityService.d.ts +1 -0
  14. package/dist/src/availability/modelAvailabilityService.js +3 -0
  15. package/dist/src/availability/modelAvailabilityService.js.map +1 -1
  16. package/dist/src/code_assist/experiments/client_metadata.js +2 -1
  17. package/dist/src/code_assist/experiments/client_metadata.js.map +1 -1
  18. package/dist/src/code_assist/experiments/client_metadata.test.js +7 -10
  19. package/dist/src/code_assist/experiments/client_metadata.test.js.map +1 -1
  20. package/dist/src/config/config.js +28 -17
  21. package/dist/src/config/config.js.map +1 -1
  22. package/dist/src/config/config.test.js +49 -8
  23. package/dist/src/config/config.test.js.map +1 -1
  24. package/dist/src/config/defaultModelConfigs.js +10 -0
  25. package/dist/src/config/defaultModelConfigs.js.map +1 -1
  26. package/dist/src/core/contentGenerator.js +4 -2
  27. package/dist/src/core/contentGenerator.js.map +1 -1
  28. package/dist/src/core/contentGenerator.test.js +29 -2
  29. package/dist/src/core/contentGenerator.test.js.map +1 -1
  30. package/dist/src/core/prompts.js +8 -6
  31. package/dist/src/core/prompts.js.map +1 -1
  32. package/dist/src/core/prompts.test.js +9 -3
  33. package/dist/src/core/prompts.test.js.map +1 -1
  34. package/dist/src/generated/git-commit.d.ts +2 -2
  35. package/dist/src/generated/git-commit.js +2 -2
  36. package/dist/src/hooks/hookEventHandler.js +6 -1
  37. package/dist/src/hooks/hookEventHandler.js.map +1 -1
  38. package/dist/src/hooks/hookEventHandler.test.js +8 -1
  39. package/dist/src/hooks/hookEventHandler.test.js.map +1 -1
  40. package/dist/src/index.d.ts +1 -0
  41. package/dist/src/index.js +1 -0
  42. package/dist/src/index.js.map +1 -1
  43. package/dist/src/policy/policies/agent.toml +31 -0
  44. package/dist/src/services/chatRecordingService.d.ts +5 -0
  45. package/dist/src/services/chatRecordingService.js +7 -0
  46. package/dist/src/services/chatRecordingService.js.map +1 -1
  47. package/dist/src/services/fileSystemService.d.ts +0 -9
  48. package/dist/src/services/fileSystemService.js +0 -11
  49. package/dist/src/services/fileSystemService.js.map +1 -1
  50. package/dist/src/services/modelConfig.golden.test.js +32 -0
  51. package/dist/src/services/modelConfig.golden.test.js.map +1 -1
  52. package/dist/src/services/modelConfigService.d.ts +3 -0
  53. package/dist/src/services/modelConfigService.js +3 -2
  54. package/dist/src/services/modelConfigService.js.map +1 -1
  55. package/dist/src/services/modelConfigService.test.js +110 -0
  56. package/dist/src/services/modelConfigService.test.js.map +1 -1
  57. package/dist/src/services/sessionSummaryUtils.d.ts +8 -3
  58. package/dist/src/services/sessionSummaryUtils.js +106 -38
  59. package/dist/src/services/sessionSummaryUtils.js.map +1 -1
  60. package/dist/src/services/sessionSummaryUtils.test.js +83 -244
  61. package/dist/src/services/sessionSummaryUtils.test.js.map +1 -1
  62. package/dist/src/services/test-data/resolved-aliases-retry.golden.json +222 -0
  63. package/dist/src/tools/tool-names.d.ts +1 -0
  64. package/dist/src/tools/tool-names.js +1 -0
  65. package/dist/src/tools/tool-names.js.map +1 -1
  66. package/dist/src/utils/bfsFileSearch.d.ts +8 -0
  67. package/dist/src/utils/bfsFileSearch.js +63 -23
  68. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  69. package/dist/src/utils/bfsFileSearch.test.js +65 -1
  70. package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
  71. package/dist/src/utils/googleErrors.js +31 -18
  72. package/dist/src/utils/googleErrors.js.map +1 -1
  73. package/dist/src/utils/googleErrors.test.js +10 -2
  74. package/dist/src/utils/googleErrors.test.js.map +1 -1
  75. package/dist/src/utils/googleQuotaErrors.js +6 -3
  76. package/dist/src/utils/googleQuotaErrors.js.map +1 -1
  77. package/dist/src/utils/googleQuotaErrors.test.js +41 -0
  78. package/dist/src/utils/googleQuotaErrors.test.js.map +1 -1
  79. package/dist/src/utils/pathCorrector.js +12 -2
  80. package/dist/src/utils/pathCorrector.js.map +1 -1
  81. package/dist/src/utils/pathCorrector.test.js +6 -2
  82. package/dist/src/utils/pathCorrector.test.js.map +1 -1
  83. package/dist/src/utils/version.d.ts +6 -0
  84. package/dist/src/utils/version.js +15 -0
  85. package/dist/src/utils/version.js.map +1 -0
  86. package/dist/src/utils/version.test.d.ts +6 -0
  87. package/dist/src/utils/version.test.js +39 -0
  88. package/dist/src/utils/version.test.js.map +1 -0
  89. package/dist/tsconfig.tsbuildinfo +1 -1
  90. package/package.json +1 -1
@@ -6,56 +6,124 @@
6
6
  import { SessionSummaryService } from './sessionSummaryService.js';
7
7
  import { BaseLlmClient } from '../core/baseLlmClient.js';
8
8
  import { debugLogger } from '../utils/debugLogger.js';
9
+ import { SESSION_FILE_PREFIX, } from './chatRecordingService.js';
10
+ import fs from 'node:fs/promises';
11
+ import path from 'node:path';
12
+ const MIN_MESSAGES_FOR_SUMMARY = 1;
9
13
  /**
10
- * Generates and saves a summary for the current session.
11
- * This is called during session cleanup and is non-blocking - errors are logged but don't prevent exit.
14
+ * Generates and saves a summary for a session file.
12
15
  */
13
- export async function generateAndSaveSummary(config) {
16
+ async function generateAndSaveSummary(config, sessionPath) {
17
+ // Read session file
18
+ const content = await fs.readFile(sessionPath, 'utf-8');
19
+ const conversation = JSON.parse(content);
20
+ // Skip if summary already exists
21
+ if (conversation.summary) {
22
+ debugLogger.debug(`[SessionSummary] Summary already exists for ${sessionPath}, skipping`);
23
+ return;
24
+ }
25
+ // Skip if no messages
26
+ if (conversation.messages.length === 0) {
27
+ debugLogger.debug(`[SessionSummary] No messages to summarize in ${sessionPath}`);
28
+ return;
29
+ }
30
+ // Create summary service
31
+ const contentGenerator = config.getContentGenerator();
32
+ if (!contentGenerator) {
33
+ debugLogger.debug('[SessionSummary] Content generator not available, skipping summary generation');
34
+ return;
35
+ }
36
+ const baseLlmClient = new BaseLlmClient(contentGenerator, config);
37
+ const summaryService = new SessionSummaryService(baseLlmClient);
38
+ // Generate summary
39
+ const summary = await summaryService.generateSummary({
40
+ messages: conversation.messages,
41
+ });
42
+ if (!summary) {
43
+ debugLogger.warn(`[SessionSummary] Failed to generate summary for ${sessionPath}`);
44
+ return;
45
+ }
46
+ // Re-read the file before writing to handle race conditions
47
+ const freshContent = await fs.readFile(sessionPath, 'utf-8');
48
+ const freshConversation = JSON.parse(freshContent);
49
+ // Check if summary was added by another process
50
+ if (freshConversation.summary) {
51
+ debugLogger.debug(`[SessionSummary] Summary was added by another process for ${sessionPath}`);
52
+ return;
53
+ }
54
+ // Add summary and write back
55
+ freshConversation.summary = summary;
56
+ freshConversation.lastUpdated = new Date().toISOString();
57
+ await fs.writeFile(sessionPath, JSON.stringify(freshConversation, null, 2));
58
+ debugLogger.debug(`[SessionSummary] Saved summary for ${sessionPath}: "${summary}"`);
59
+ }
60
+ /**
61
+ * Finds the most recently created session that needs a summary.
62
+ * Returns the path if it needs a summary, null otherwise.
63
+ */
64
+ export async function getPreviousSession(config) {
14
65
  try {
15
- // Get the chat recording service from config
16
- const chatRecordingService = config
17
- .getGeminiClient()
18
- ?.getChatRecordingService();
19
- if (!chatRecordingService) {
20
- debugLogger.debug('[SessionSummary] No chat recording service available');
21
- return;
66
+ const chatsDir = path.join(config.storage.getProjectTempDir(), 'chats');
67
+ // Check if chats directory exists
68
+ try {
69
+ await fs.access(chatsDir);
22
70
  }
23
- // Get the current conversation
24
- const conversation = chatRecordingService.getConversation();
25
- if (!conversation) {
26
- debugLogger.debug('[SessionSummary] No conversation to summarize');
27
- return;
71
+ catch {
72
+ debugLogger.debug('[SessionSummary] No chats directory found');
73
+ return null;
28
74
  }
29
- // Skip if summary already exists (e.g., resumed session)
30
- if (conversation.summary) {
31
- debugLogger.debug('[SessionSummary] Summary already exists, skipping');
32
- return;
75
+ // List session files
76
+ const allFiles = await fs.readdir(chatsDir);
77
+ const sessionFiles = allFiles.filter((f) => f.startsWith(SESSION_FILE_PREFIX) && f.endsWith('.json'));
78
+ if (sessionFiles.length === 0) {
79
+ debugLogger.debug('[SessionSummary] No session files found');
80
+ return null;
33
81
  }
34
- // Skip if no messages
35
- if (conversation.messages.length === 0) {
36
- debugLogger.debug('[SessionSummary] No messages to summarize');
37
- return;
82
+ // Sort by filename descending (most recently created first)
83
+ // Filename format: session-YYYY-MM-DDTHH-MM-XXXXXXXX.json
84
+ sessionFiles.sort((a, b) => b.localeCompare(a));
85
+ // Check the most recently created session
86
+ const mostRecentFile = sessionFiles[0];
87
+ const filePath = path.join(chatsDir, mostRecentFile);
88
+ try {
89
+ const content = await fs.readFile(filePath, 'utf-8');
90
+ const conversation = JSON.parse(content);
91
+ if (conversation.summary) {
92
+ debugLogger.debug('[SessionSummary] Most recent session already has summary');
93
+ return null;
94
+ }
95
+ // Only generate summaries for sessions with more than 1 user message
96
+ const userMessageCount = conversation.messages.filter((m) => m.type === 'user').length;
97
+ if (userMessageCount <= MIN_MESSAGES_FOR_SUMMARY) {
98
+ debugLogger.debug(`[SessionSummary] Most recent session has ${userMessageCount} user message(s), skipping (need more than ${MIN_MESSAGES_FOR_SUMMARY})`);
99
+ return null;
100
+ }
101
+ return filePath;
38
102
  }
39
- // Create summary service
40
- const contentGenerator = config.getContentGenerator();
41
- const baseLlmClient = new BaseLlmClient(contentGenerator, config);
42
- const summaryService = new SessionSummaryService(baseLlmClient);
43
- // Generate summary
44
- const summary = await summaryService.generateSummary({
45
- messages: conversation.messages,
46
- });
47
- // Save summary if generated successfully
48
- if (summary) {
49
- chatRecordingService.saveSummary(summary);
50
- debugLogger.debug(`[SessionSummary] Saved summary: "${summary}"`);
103
+ catch {
104
+ debugLogger.debug('[SessionSummary] Could not read most recent session');
105
+ return null;
51
106
  }
52
- else {
53
- debugLogger.warn('[SessionSummary] Failed to generate summary');
107
+ }
108
+ catch (error) {
109
+ debugLogger.debug(`[SessionSummary] Error finding previous session: ${error instanceof Error ? error.message : String(error)}`);
110
+ return null;
111
+ }
112
+ }
113
+ /**
114
+ * Generates summary for the previous session if it lacks one.
115
+ * This is designed to be called fire-and-forget on startup.
116
+ */
117
+ export async function generateSummary(config) {
118
+ try {
119
+ const sessionPath = await getPreviousSession(config);
120
+ if (sessionPath) {
121
+ await generateAndSaveSummary(config, sessionPath);
54
122
  }
55
123
  }
56
124
  catch (error) {
57
125
  // Log but don't throw - we want graceful degradation
58
- debugLogger.warn(`[SessionSummary] Error in generateAndSaveSummary: ${error instanceof Error ? error.message : String(error)}`);
126
+ debugLogger.warn(`[SessionSummary] Error generating summary: ${error instanceof Error ? error.message : String(error)}`);
59
127
  }
60
128
  }
61
129
  //# sourceMappingURL=sessionSummaryUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sessionSummaryUtils.js","sourceRoot":"","sources":["../../../src/services/sessionSummaryUtils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,MAAc;IACzD,IAAI,CAAC;QACH,6CAA6C;QAC7C,MAAM,oBAAoB,GAAG,MAAM;aAChC,eAAe,EAAE;YAClB,EAAE,uBAAuB,EAAE,CAAC;QAC9B,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1B,WAAW,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;YAC1E,OAAO;QACT,CAAC;QAED,+BAA+B;QAC/B,MAAM,YAAY,GAAG,oBAAoB,CAAC,eAAe,EAAE,CAAC;QAC5D,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,WAAW,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,yDAAyD;QACzD,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACzB,WAAW,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QAED,sBAAsB;QACtB,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,WAAW,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QAED,yBAAyB;QACzB,MAAM,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,EAAE,CAAC;QACtD,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAClE,MAAM,cAAc,GAAG,IAAI,qBAAqB,CAAC,aAAa,CAAC,CAAC;QAEhE,mBAAmB;QACnB,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC;YACnD,QAAQ,EAAE,YAAY,CAAC,QAAQ;SAChC,CAAC,CAAC;QAEH,yCAAyC;QACzC,IAAI,OAAO,EAAE,CAAC;YACZ,oBAAoB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC1C,WAAW,CAAC,KAAK,CAAC,oCAAoC,OAAO,GAAG,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,qDAAqD;QACrD,WAAW,CAAC,IAAI,CACd,qDAAqD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC9G,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"sessionSummaryUtils.js","sourceRoot":"","sources":["../../../src/services/sessionSummaryUtils.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,12 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
- import { generateAndSaveSummary } from './sessionSummaryUtils.js';
7
+ import { generateSummary, getPreviousSession } from './sessionSummaryUtils.js';
8
+ import * as fs from 'node:fs/promises';
9
+ import * as path from 'node:path';
10
+ // Mock fs/promises
11
+ vi.mock('node:fs/promises');
12
+ const mockReaddir = fs.readdir;
8
13
  // Mock the SessionSummaryService module
9
14
  vi.mock('./sessionSummaryService.js', () => ({
10
15
  SessionSummaryService: vi.fn().mockImplementation(() => ({
@@ -15,31 +20,32 @@ vi.mock('./sessionSummaryService.js', () => ({
15
20
  vi.mock('../core/baseLlmClient.js', () => ({
16
21
  BaseLlmClient: vi.fn(),
17
22
  }));
23
+ // Helper to create a session with N user messages
24
+ function createSessionWithUserMessages(count, options = {}) {
25
+ return JSON.stringify({
26
+ sessionId: options.sessionId ?? 'session-id',
27
+ summary: options.summary,
28
+ messages: Array.from({ length: count }, (_, i) => ({
29
+ id: String(i + 1),
30
+ type: 'user',
31
+ content: [{ text: `Message ${i + 1}` }],
32
+ })),
33
+ });
34
+ }
18
35
  describe('sessionSummaryUtils', () => {
19
36
  let mockConfig;
20
- let mockChatRecordingService;
21
- let mockGeminiClient;
22
37
  let mockContentGenerator;
23
38
  let mockGenerateSummary;
24
39
  beforeEach(async () => {
25
40
  vi.clearAllMocks();
26
41
  // Setup mock content generator
27
42
  mockContentGenerator = {};
28
- // Setup mock chat recording service
29
- mockChatRecordingService = {
30
- getConversation: vi.fn(),
31
- saveSummary: vi.fn(),
32
- };
33
- // Setup mock gemini client
34
- mockGeminiClient = {
35
- getChatRecordingService: vi
36
- .fn()
37
- .mockReturnValue(mockChatRecordingService),
38
- };
39
43
  // Setup mock config
40
44
  mockConfig = {
41
45
  getContentGenerator: vi.fn().mockReturnValue(mockContentGenerator),
42
- getGeminiClient: vi.fn().mockReturnValue(mockGeminiClient),
46
+ storage: {
47
+ getProjectTempDir: vi.fn().mockReturnValue('/tmp/project'),
48
+ },
43
49
  };
44
50
  // Setup mock generateSummary function
45
51
  mockGenerateSummary = vi.fn().mockResolvedValue('Add dark mode to the app');
@@ -52,246 +58,79 @@ describe('sessionSummaryUtils', () => {
52
58
  afterEach(() => {
53
59
  vi.restoreAllMocks();
54
60
  });
55
- describe('Integration Tests', () => {
56
- it('should generate and save summary successfully', async () => {
57
- const mockConversation = {
58
- sessionId: 'test-session',
59
- projectHash: 'test-hash',
60
- startTime: '2025-12-03T00:00:00Z',
61
- lastUpdated: '2025-12-03T00:10:00Z',
62
- messages: [
63
- {
64
- id: '1',
65
- timestamp: '2025-12-03T00:00:00Z',
66
- type: 'user',
67
- content: [{ text: 'How do I add dark mode?' }],
68
- },
69
- {
70
- id: '2',
71
- timestamp: '2025-12-03T00:01:00Z',
72
- type: 'gemini',
73
- content: [{ text: 'To add dark mode...' }],
74
- },
75
- ],
76
- };
77
- mockChatRecordingService.getConversation.mockReturnValue(mockConversation);
78
- await generateAndSaveSummary(mockConfig);
79
- expect(mockChatRecordingService.getConversation).toHaveBeenCalledTimes(1);
80
- expect(mockGenerateSummary).toHaveBeenCalledTimes(1);
81
- expect(mockGenerateSummary).toHaveBeenCalledWith({
82
- messages: mockConversation.messages,
83
- });
84
- expect(mockChatRecordingService.saveSummary).toHaveBeenCalledTimes(1);
85
- expect(mockChatRecordingService.saveSummary).toHaveBeenCalledWith('Add dark mode to the app');
61
+ describe('getPreviousSession', () => {
62
+ it('should return null if chats directory does not exist', async () => {
63
+ vi.mocked(fs.access).mockRejectedValue(new Error('ENOENT'));
64
+ const result = await getPreviousSession(mockConfig);
65
+ expect(result).toBeNull();
86
66
  });
87
- it('should skip if no chat recording service is available', async () => {
88
- mockGeminiClient.getChatRecordingService.mockReturnValue(undefined);
89
- await generateAndSaveSummary(mockConfig);
90
- expect(mockGeminiClient.getChatRecordingService).toHaveBeenCalledTimes(1);
91
- expect(mockGenerateSummary).not.toHaveBeenCalled();
92
- expect(mockChatRecordingService.saveSummary).not.toHaveBeenCalled();
67
+ it('should return null if no session files exist', async () => {
68
+ vi.mocked(fs.access).mockResolvedValue(undefined);
69
+ mockReaddir.mockResolvedValue([]);
70
+ const result = await getPreviousSession(mockConfig);
71
+ expect(result).toBeNull();
93
72
  });
94
- it('should skip if no conversation exists', async () => {
95
- mockChatRecordingService.getConversation.mockReturnValue(null);
96
- await generateAndSaveSummary(mockConfig);
97
- expect(mockChatRecordingService.getConversation).toHaveBeenCalledTimes(1);
98
- expect(mockGenerateSummary).not.toHaveBeenCalled();
99
- expect(mockChatRecordingService.saveSummary).not.toHaveBeenCalled();
73
+ it('should return null if most recent session already has summary', async () => {
74
+ vi.mocked(fs.access).mockResolvedValue(undefined);
75
+ mockReaddir.mockResolvedValue(['session-2024-01-01T10-00-abc12345.json']);
76
+ vi.mocked(fs.readFile).mockResolvedValue(createSessionWithUserMessages(5, { summary: 'Existing summary' }));
77
+ const result = await getPreviousSession(mockConfig);
78
+ expect(result).toBeNull();
100
79
  });
101
- it('should skip if summary already exists', async () => {
102
- const mockConversation = {
103
- sessionId: 'test-session',
104
- projectHash: 'test-hash',
105
- startTime: '2025-12-03T00:00:00Z',
106
- lastUpdated: '2025-12-03T00:10:00Z',
107
- summary: 'Existing summary',
108
- messages: [
109
- {
110
- id: '1',
111
- timestamp: '2025-12-03T00:00:00Z',
112
- type: 'user',
113
- content: [{ text: 'Hello' }],
114
- },
115
- ],
116
- };
117
- mockChatRecordingService.getConversation.mockReturnValue(mockConversation);
118
- await generateAndSaveSummary(mockConfig);
119
- expect(mockChatRecordingService.getConversation).toHaveBeenCalledTimes(1);
120
- expect(mockGenerateSummary).not.toHaveBeenCalled();
121
- expect(mockChatRecordingService.saveSummary).not.toHaveBeenCalled();
80
+ it('should return null if most recent session has 1 or fewer user messages', async () => {
81
+ vi.mocked(fs.access).mockResolvedValue(undefined);
82
+ mockReaddir.mockResolvedValue(['session-2024-01-01T10-00-abc12345.json']);
83
+ vi.mocked(fs.readFile).mockResolvedValue(createSessionWithUserMessages(1));
84
+ const result = await getPreviousSession(mockConfig);
85
+ expect(result).toBeNull();
122
86
  });
123
- it('should skip if no messages present', async () => {
124
- const mockConversation = {
125
- sessionId: 'test-session',
126
- projectHash: 'test-hash',
127
- startTime: '2025-12-03T00:00:00Z',
128
- lastUpdated: '2025-12-03T00:10:00Z',
129
- messages: [],
130
- };
131
- mockChatRecordingService.getConversation.mockReturnValue(mockConversation);
132
- await generateAndSaveSummary(mockConfig);
133
- expect(mockChatRecordingService.getConversation).toHaveBeenCalledTimes(1);
134
- expect(mockGenerateSummary).not.toHaveBeenCalled();
135
- expect(mockChatRecordingService.saveSummary).not.toHaveBeenCalled();
87
+ it('should return path if most recent session has more than 1 user message and no summary', async () => {
88
+ vi.mocked(fs.access).mockResolvedValue(undefined);
89
+ mockReaddir.mockResolvedValue(['session-2024-01-01T10-00-abc12345.json']);
90
+ vi.mocked(fs.readFile).mockResolvedValue(createSessionWithUserMessages(2));
91
+ const result = await getPreviousSession(mockConfig);
92
+ expect(result).toBe(path.join('/tmp/project', 'chats', 'session-2024-01-01T10-00-abc12345.json'));
136
93
  });
137
- it('should handle generateSummary failure gracefully', async () => {
138
- const mockConversation = {
139
- sessionId: 'test-session',
140
- projectHash: 'test-hash',
141
- startTime: '2025-12-03T00:00:00Z',
142
- lastUpdated: '2025-12-03T00:10:00Z',
143
- messages: [
144
- {
145
- id: '1',
146
- timestamp: '2025-12-03T00:00:00Z',
147
- type: 'user',
148
- content: [{ text: 'Hello' }],
149
- },
150
- ],
151
- };
152
- mockChatRecordingService.getConversation.mockReturnValue(mockConversation);
153
- mockGenerateSummary.mockResolvedValue(null);
154
- await generateAndSaveSummary(mockConfig);
155
- expect(mockChatRecordingService.getConversation).toHaveBeenCalledTimes(1);
156
- expect(mockGenerateSummary).toHaveBeenCalledTimes(1);
157
- expect(mockChatRecordingService.saveSummary).not.toHaveBeenCalled();
94
+ it('should select most recently created session by filename', async () => {
95
+ vi.mocked(fs.access).mockResolvedValue(undefined);
96
+ mockReaddir.mockResolvedValue([
97
+ 'session-2024-01-01T10-00-older000.json',
98
+ 'session-2024-01-02T10-00-newer000.json',
99
+ ]);
100
+ vi.mocked(fs.readFile).mockResolvedValue(createSessionWithUserMessages(2));
101
+ const result = await getPreviousSession(mockConfig);
102
+ expect(result).toBe(path.join('/tmp/project', 'chats', 'session-2024-01-02T10-00-newer000.json'));
158
103
  });
159
- it('should catch and log errors without throwing', async () => {
160
- const mockConversation = {
161
- sessionId: 'test-session',
162
- projectHash: 'test-hash',
163
- startTime: '2025-12-03T00:00:00Z',
164
- lastUpdated: '2025-12-03T00:10:00Z',
165
- messages: [
166
- {
167
- id: '1',
168
- timestamp: '2025-12-03T00:00:00Z',
169
- type: 'user',
170
- content: [{ text: 'Hello' }],
171
- },
172
- ],
173
- };
174
- mockChatRecordingService.getConversation.mockReturnValue(mockConversation);
175
- mockGenerateSummary.mockRejectedValue(new Error('API Error'));
176
- // Should not throw
177
- await expect(generateAndSaveSummary(mockConfig)).resolves.not.toThrow();
178
- expect(mockChatRecordingService.getConversation).toHaveBeenCalledTimes(1);
179
- expect(mockGenerateSummary).toHaveBeenCalledTimes(1);
180
- expect(mockChatRecordingService.saveSummary).not.toHaveBeenCalled();
104
+ it('should return null if most recent session file is corrupted', async () => {
105
+ vi.mocked(fs.access).mockResolvedValue(undefined);
106
+ mockReaddir.mockResolvedValue(['session-2024-01-01T10-00-abc12345.json']);
107
+ vi.mocked(fs.readFile).mockResolvedValue('invalid json');
108
+ const result = await getPreviousSession(mockConfig);
109
+ expect(result).toBeNull();
181
110
  });
182
111
  });
183
- describe('Mock Verification Tests', () => {
184
- it('should call getConversation() once', async () => {
185
- const mockConversation = {
186
- sessionId: 'test-session',
187
- projectHash: 'test-hash',
188
- startTime: '2025-12-03T00:00:00Z',
189
- lastUpdated: '2025-12-03T00:10:00Z',
190
- messages: [
191
- {
192
- id: '1',
193
- timestamp: '2025-12-03T00:00:00Z',
194
- type: 'user',
195
- content: [{ text: 'Hello' }],
196
- },
197
- ],
198
- };
199
- mockChatRecordingService.getConversation.mockReturnValue(mockConversation);
200
- await generateAndSaveSummary(mockConfig);
201
- expect(mockChatRecordingService.getConversation).toHaveBeenCalledTimes(1);
202
- expect(mockChatRecordingService.getConversation).toHaveBeenCalledWith();
203
- });
204
- it('should call generateSummary() with correct messages', async () => {
205
- const mockMessages = [
206
- {
207
- id: '1',
208
- timestamp: '2025-12-03T00:00:00Z',
209
- type: 'user',
210
- content: [{ text: 'How do I add dark mode?' }],
211
- },
212
- {
213
- id: '2',
214
- timestamp: '2025-12-03T00:01:00Z',
215
- type: 'gemini',
216
- content: [{ text: 'To add dark mode...' }],
217
- },
218
- ];
219
- const mockConversation = {
220
- sessionId: 'test-session',
221
- projectHash: 'test-hash',
222
- startTime: '2025-12-03T00:00:00Z',
223
- lastUpdated: '2025-12-03T00:10:00Z',
224
- messages: mockMessages,
225
- };
226
- mockChatRecordingService.getConversation.mockReturnValue(mockConversation);
227
- await generateAndSaveSummary(mockConfig);
228
- expect(mockGenerateSummary).toHaveBeenCalledTimes(1);
229
- expect(mockGenerateSummary).toHaveBeenCalledWith({
230
- messages: mockMessages,
231
- });
112
+ describe('generateSummary', () => {
113
+ it('should not throw if getPreviousSession returns null', async () => {
114
+ vi.mocked(fs.access).mockRejectedValue(new Error('ENOENT'));
115
+ await expect(generateSummary(mockConfig)).resolves.not.toThrow();
232
116
  });
233
- it('should call saveSummary() with generated summary', async () => {
234
- const mockConversation = {
235
- sessionId: 'test-session',
236
- projectHash: 'test-hash',
237
- startTime: '2025-12-03T00:00:00Z',
238
- lastUpdated: '2025-12-03T00:10:00Z',
239
- messages: [
240
- {
241
- id: '1',
242
- timestamp: '2025-12-03T00:00:00Z',
243
- type: 'user',
244
- content: [{ text: 'Hello' }],
245
- },
246
- ],
247
- };
248
- mockChatRecordingService.getConversation.mockReturnValue(mockConversation);
249
- mockGenerateSummary.mockResolvedValue('Test summary');
250
- await generateAndSaveSummary(mockConfig);
251
- expect(mockChatRecordingService.saveSummary).toHaveBeenCalledTimes(1);
252
- expect(mockChatRecordingService.saveSummary).toHaveBeenCalledWith('Test summary');
253
- });
254
- it('should not call saveSummary() if generation fails', async () => {
255
- const mockConversation = {
256
- sessionId: 'test-session',
257
- projectHash: 'test-hash',
258
- startTime: '2025-12-03T00:00:00Z',
259
- lastUpdated: '2025-12-03T00:10:00Z',
260
- messages: [
261
- {
262
- id: '1',
263
- timestamp: '2025-12-03T00:00:00Z',
264
- type: 'user',
265
- content: [{ text: 'Hello' }],
266
- },
267
- ],
268
- };
269
- mockChatRecordingService.getConversation.mockReturnValue(mockConversation);
270
- mockGenerateSummary.mockResolvedValue(null);
271
- await generateAndSaveSummary(mockConfig);
117
+ it('should generate and save summary for session needing one', async () => {
118
+ const sessionPath = path.join('/tmp/project', 'chats', 'session-2024-01-01T10-00-abc12345.json');
119
+ vi.mocked(fs.access).mockResolvedValue(undefined);
120
+ mockReaddir.mockResolvedValue(['session-2024-01-01T10-00-abc12345.json']);
121
+ vi.mocked(fs.readFile).mockResolvedValue(createSessionWithUserMessages(2));
122
+ vi.mocked(fs.writeFile).mockResolvedValue(undefined);
123
+ await generateSummary(mockConfig);
272
124
  expect(mockGenerateSummary).toHaveBeenCalledTimes(1);
273
- expect(mockChatRecordingService.saveSummary).not.toHaveBeenCalled();
125
+ expect(fs.writeFile).toHaveBeenCalledTimes(1);
126
+ expect(fs.writeFile).toHaveBeenCalledWith(sessionPath, expect.stringContaining('Add dark mode to the app'));
274
127
  });
275
- it('should not call saveSummary() if generateSummary throws', async () => {
276
- const mockConversation = {
277
- sessionId: 'test-session',
278
- projectHash: 'test-hash',
279
- startTime: '2025-12-03T00:00:00Z',
280
- lastUpdated: '2025-12-03T00:10:00Z',
281
- messages: [
282
- {
283
- id: '1',
284
- timestamp: '2025-12-03T00:00:00Z',
285
- type: 'user',
286
- content: [{ text: 'Hello' }],
287
- },
288
- ],
289
- };
290
- mockChatRecordingService.getConversation.mockReturnValue(mockConversation);
291
- mockGenerateSummary.mockRejectedValue(new Error('Generation failed'));
292
- await generateAndSaveSummary(mockConfig);
293
- expect(mockGenerateSummary).toHaveBeenCalledTimes(1);
294
- expect(mockChatRecordingService.saveSummary).not.toHaveBeenCalled();
128
+ it('should handle errors gracefully without throwing', async () => {
129
+ vi.mocked(fs.access).mockResolvedValue(undefined);
130
+ mockReaddir.mockResolvedValue(['session-2024-01-01T10-00-abc12345.json']);
131
+ vi.mocked(fs.readFile).mockResolvedValue(createSessionWithUserMessages(2));
132
+ mockGenerateSummary.mockRejectedValue(new Error('API Error'));
133
+ await expect(generateSummary(mockConfig)).resolves.not.toThrow();
295
134
  });
296
135
  });
297
136
  });
@@ -1 +1 @@
1
- {"version":3,"file":"sessionSummaryUtils.test.js","sourceRoot":"","sources":["../../../src/services/sessionSummaryUtils.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sessionSummaryUtils.test.js","sourceRoot":"","sources":["../../../src/services/sessionSummaryUtils.test.ts"],"names":[],"mappings":"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"}