Skip to content

Commit a5b9ba6

Browse files
committed
feat(sessions): support gemini resume command copy
1 parent a078701 commit a5b9ba6

2 files changed

Lines changed: 15 additions & 2 deletions

File tree

tests/unit/session-resume-command.test.mjs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ test('isResumeCommandAvailable supports codex and codebuddy with sessionId', ()
1414
assert.strictEqual(methods.isResumeCommandAvailable({ source: 'codex', sessionId: 'sess-1' }), true);
1515
assert.strictEqual(methods.isResumeCommandAvailable({ source: 'codebuddy', sessionId: 'abc123' }), true);
1616
assert.strictEqual(methods.isResumeCommandAvailable({ source: 'gemini', sessionId: 'gm-123' }), true);
17+
assert.strictEqual(methods.isResumeCommandAvailable({ source: 'gemini', sessionId: '', filePath: '/home/user/.gemini/tmp/abc/chats/gm-456.json' }), true);
1718
assert.strictEqual(methods.isResumeCommandAvailable({ source: 'codebuddy', sessionId: '' }), false);
1819
assert.strictEqual(methods.isResumeCommandAvailable({ source: 'claude', sessionId: 'sess-2' }), true);
1920
assert.strictEqual(methods.isResumeCommandAvailable({ source: 'claude', sessionId: '', filePath: '/home/user/.claude/projects/demo/sess-3.jsonl' }), true);
@@ -55,4 +56,9 @@ test('buildResumeCommand generates codex resume with optional --yolo, codebuddy
5556
methods.buildResumeCommand.call({ ...contextBase, sessionResumeWithYolo: true }, { source: 'claude', sessionId: '', filePath: '/home/user/.claude/projects/demo/sess-3.jsonl' }),
5657
'claude -r sess-3'
5758
);
59+
60+
assert.strictEqual(
61+
methods.buildResumeCommand.call({ ...contextBase, sessionResumeWithYolo: true }, { source: 'gemini', sessionId: '', filePath: '/home/user/.gemini/tmp/abc/chats/gm-456.json' }),
62+
'gemini -r gm-456'
63+
);
5864
});

web-ui/modules/app.methods.session-actions.mjs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,11 @@ export function createSessionActionMethods(options = {}) {
117117
if (!session) return false;
118118
const source = String(session.source || '').trim().toLowerCase();
119119
const sessionId = typeof session.sessionId === 'string' ? session.sessionId.trim() : '';
120+
const filePath = typeof session.filePath === 'string' ? session.filePath.trim() : '';
120121
if (source === 'claude') {
121-
const filePath = typeof session.filePath === 'string' ? session.filePath.trim() : '';
122+
return !!sessionId || !!this.extractClaudeResumeKeyFromFilePath(filePath);
123+
}
124+
if (source === 'gemini') {
122125
return !!sessionId || !!this.extractClaudeResumeKeyFromFilePath(filePath);
123126
}
124127
return (source === 'codex' || source === 'codebuddy' || source === 'gemini') && !!sessionId;
@@ -170,7 +173,11 @@ export function createSessionActionMethods(options = {}) {
170173
const normalized = value.replace(/\\/g, '/');
171174
const base = normalized.split('/').pop() || '';
172175
if (!base) return '';
173-
if (base.toLowerCase().endsWith('.jsonl')) {
176+
const lower = base.toLowerCase();
177+
if (lower.endsWith('.jsonl')) {
178+
return base.slice(0, -5);
179+
}
180+
if (lower.endsWith('.json')) {
174181
return base.slice(0, -5);
175182
}
176183
return base;

0 commit comments

Comments
 (0)