feat(electrobun): session continuity — Claude JSONL listing, resume/continue sidecar support, session picker UI

This commit is contained in:
Hibryda 2026-03-27 02:43:54 +01:00
parent 0e217b9dae
commit 485abb4774
9 changed files with 626 additions and 4 deletions

View file

@ -41,7 +41,10 @@ interface QueryMessage {
cwd?: string;
maxTurns?: number;
maxBudgetUsd?: number;
/** @deprecated Use resumeMode='resume' + resumeSessionId instead. */
resumeSessionId?: string;
/** Session continuity: 'new' (default), 'continue' (most recent), 'resume' (specific). */
resumeMode?: 'new' | 'continue' | 'resume';
permissionMode?: string;
settingSources?: string[];
systemPrompt?: string;
@ -74,7 +77,7 @@ async function handleMessage(msg: Record<string, unknown>) {
}
async function handleQuery(msg: QueryMessage) {
const { sessionId, prompt, cwd, maxTurns, maxBudgetUsd, resumeSessionId, permissionMode, settingSources, systemPrompt, model, claudeConfigDir, additionalDirectories, worktreeName, extraEnv } = msg;
const { sessionId, prompt, cwd, maxTurns, maxBudgetUsd, resumeSessionId, resumeMode, permissionMode, settingSources, systemPrompt, model, claudeConfigDir, additionalDirectories, worktreeName, extraEnv } = msg;
if (sessions.has(sessionId)) {
send({ type: 'error', sessionId, message: 'Session already running' });
@ -112,6 +115,20 @@ async function handleQuery(msg: QueryMessage) {
return;
}
// Build resume/continue options based on resumeMode
let resumeOpt: string | undefined;
let continueOpt: boolean | undefined;
if (resumeMode === 'continue') {
continueOpt = true;
log(`Session ${sessionId}: continuing most recent session`);
} else if (resumeMode === 'resume' && resumeSessionId) {
resumeOpt = resumeSessionId;
log(`Session ${sessionId}: resuming SDK session ${resumeSessionId}`);
} else if (resumeSessionId && !resumeMode) {
// Legacy: direct resumeSessionId without resumeMode
resumeOpt = resumeSessionId;
}
const q = query({
prompt,
options: {
@ -121,7 +138,8 @@ async function handleQuery(msg: QueryMessage) {
env: cleanEnv,
maxTurns: maxTurns ?? undefined,
maxBudgetUsd: maxBudgetUsd ?? undefined,
resume: resumeSessionId ?? undefined,
resume: resumeOpt,
continue: continueOpt,
allowedTools: [
'Bash', 'Read', 'Write', 'Edit', 'Glob', 'Grep',
'WebSearch', 'WebFetch', 'TodoWrite', 'NotebookEdit',