mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-05-13 05:12:55 -07:00
chore: improve error messages for --resume (#15360)
This commit is contained in:
@@ -10,6 +10,7 @@ import {
|
|||||||
extractFirstUserMessage,
|
extractFirstUserMessage,
|
||||||
formatRelativeTime,
|
formatRelativeTime,
|
||||||
hasUserOrAssistantMessage,
|
hasUserOrAssistantMessage,
|
||||||
|
SessionError,
|
||||||
} from './sessionUtils.js';
|
} from './sessionUtils.js';
|
||||||
import type { Config, MessageRecord } from '@google/gemini-cli-core';
|
import type { Config, MessageRecord } from '@google/gemini-cli-core';
|
||||||
import { SESSION_FILE_PREFIX } from '@google/gemini-cli-core';
|
import { SESSION_FILE_PREFIX } from '@google/gemini-cli-core';
|
||||||
@@ -333,10 +334,10 @@ describe('SessionSelector', () => {
|
|||||||
|
|
||||||
await expect(
|
await expect(
|
||||||
sessionSelector.resolveSession('invalid-uuid'),
|
sessionSelector.resolveSession('invalid-uuid'),
|
||||||
).rejects.toThrow('Invalid session identifier "invalid-uuid"');
|
).rejects.toThrow(SessionError);
|
||||||
|
|
||||||
await expect(sessionSelector.resolveSession('999')).rejects.toThrow(
|
await expect(sessionSelector.resolveSession('999')).rejects.toThrow(
|
||||||
'Invalid session identifier "999"',
|
SessionError,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,47 @@ import { stripUnsafeCharacters } from '../ui/utils/textUtils.js';
|
|||||||
*/
|
*/
|
||||||
export const RESUME_LATEST = 'latest';
|
export const RESUME_LATEST = 'latest';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error codes for session-related errors.
|
||||||
|
*/
|
||||||
|
export type SessionErrorCode =
|
||||||
|
| 'NO_SESSIONS_FOUND'
|
||||||
|
| 'INVALID_SESSION_IDENTIFIER';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error thrown for session-related failures.
|
||||||
|
* Uses a code field to differentiate between error types.
|
||||||
|
*/
|
||||||
|
export class SessionError extends Error {
|
||||||
|
constructor(
|
||||||
|
readonly code: SessionErrorCode,
|
||||||
|
message: string,
|
||||||
|
) {
|
||||||
|
super(message);
|
||||||
|
this.name = 'SessionError';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an error for when no sessions exist for the current project.
|
||||||
|
*/
|
||||||
|
static noSessionsFound(): SessionError {
|
||||||
|
return new SessionError(
|
||||||
|
'NO_SESSIONS_FOUND',
|
||||||
|
'No previous sessions found for this project.',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an error for when a session identifier is invalid.
|
||||||
|
*/
|
||||||
|
static invalidSessionIdentifier(identifier: string): SessionError {
|
||||||
|
return new SessionError(
|
||||||
|
'INVALID_SESSION_IDENTIFIER',
|
||||||
|
`Invalid session identifier "${identifier}".\n Use --list-sessions to see available sessions, then use --resume {number}, --resume {uuid}, or --resume latest.`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a text match found during search with surrounding context.
|
* Represents a text match found during search with surrounding context.
|
||||||
*/
|
*/
|
||||||
@@ -370,7 +411,7 @@ export class SessionSelector {
|
|||||||
const sessions = await this.listSessions();
|
const sessions = await this.listSessions();
|
||||||
|
|
||||||
if (sessions.length === 0) {
|
if (sessions.length === 0) {
|
||||||
throw new Error('No previous sessions found for this project.');
|
throw SessionError.noSessionsFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sort by startTime (oldest first, so newest sessions get highest numbers)
|
// Sort by startTime (oldest first, so newest sessions get highest numbers)
|
||||||
@@ -398,9 +439,7 @@ export class SessionSelector {
|
|||||||
return sortedSessions[index - 1];
|
return sortedSessions[index - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Error(
|
throw SessionError.invalidSessionIdentifier(identifier);
|
||||||
`Invalid session identifier "${identifier}". Use --list-sessions to see available sessions.`,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -430,9 +469,13 @@ export class SessionSelector {
|
|||||||
try {
|
try {
|
||||||
selectedSession = await this.findSession(resumeArg);
|
selectedSession = await this.findSession(resumeArg);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// Re-throw with more detailed message for resume command
|
// SessionError already has detailed messages - just rethrow
|
||||||
|
if (error instanceof SessionError) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
// Wrap unexpected errors with context
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Invalid session identifier "${resumeArg}". Use --list-sessions to see available sessions, then use --resume {number}, --resume {uuid}, or --resume latest. Error: ${error}`,
|
`Failed to find session "${resumeArg}": ${error instanceof Error ? error.message : String(error)}`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user