Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
206 changes: 206 additions & 0 deletions packages/cli/src/__tests__/pi-tui-runner.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3976,6 +3976,179 @@ describe('Maka Pi TUI runner', () => {
]);
});

test('/resume opens a picker containing only resumable sessions when none is attached', async () => {
const terminal = new FakeTerminal();
const resumable = fakeSessionSummary('resumable', '/repo');
const unavailable = fakeSessionSummary('unavailable', '');
const driver = new SlashCommandDriver([resumable, unavailable]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
const output = plainTerminalOutput(terminal.output());
assert.match(output, /resumabl/);
assert.doesNotMatch(output, /unavailable/);

terminal.input('\r');
await waitFor(() => driver.resumeCalls === 1);
terminal.input('/exit');
terminal.input('\r');
await run;
});

test('/resume does not resume after a stale selection fails to switch', async () => {
const terminal = new FakeTerminal();
const session = fakeSessionSummary('stale', '/repo');
const driver = new RejectingSwitchSessionDriver([session]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
terminal.input('\r');
await waitFor(() => driver.switchCalls === 1);
await delay(0);
assert.equal(driver.resumeCalls, 0);

exitMaka(terminal);
await run;
});

test('/resume bounds concurrent resumability checks for large session catalogs', async () => {
const terminal = new FakeTerminal();
const sessions = Array.from({ length: 24 }, (_, index) =>
fakeSessionSummary(`session-${index}`, '/repo'),
);
const driver = new BoundedResumeAvailabilityDriver(sessions);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
assert.ok(driver.availabilityCalls >= sessions.length);
assert.ok(driver.maxActiveCalls <= 8);

terminal.input('\x1b');
exitMaka(terminal);
await run;
});

test('/resume excludes foreign sessions when none is attached', async () => {
const terminal = new FakeTerminal();
const driver = new SlashCommandDriver([]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const foreignSession = {
source: 'claude-code' as const,
id: 'foreign-resume',
title: 'Foreign interrupted work',
cwd: '/repo',
updatedAtMs: Date.now(),
transcriptPath: '/home/u/.claude/projects/-repo/foreign-resume.jsonl',
};
let listSessionsCalls = 0;
let readDigestCalls = 0;
const foreignSessions = {
availableSources: async () => ['claude-code' as const],
listSessions: async () => {
listSessionsCalls += 1;
return [foreignSession];
},
readDigest: async () => {
readDigestCalls += 1;
throw new Error('foreign import must not run from /resume');
},
};
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
foreignSessions,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
const output = plainTerminalOutput(terminal.output());
assert.doesNotMatch(output, /Foreign interrupted work/);
assert.equal(listSessionsCalls, 0);

terminal.input('\x1b');
terminal.input('/exit');
terminal.input('\r');
await run;
assert.equal(readDigestCalls, 0);
assert.equal(driver.startNewSessionCalls, 0);
assert.equal(driver.prompts.length, 0);
});

test('/session keeps attachable rows when resume discovery fails for another session', async () => {
const terminal = new FakeTerminal();
const attachable = fakeSessionSummary('attachable', '/repo');
const archived = fakeSessionSummary('archived', '/repo');
const driver = new SlashCommandDriver([attachable, archived]);
driver.getSessionResumeAvailability = async (session) => {
if (session.id === archived.id) throw new Error('session archived');
return { available: false, reason: 'no resumable turn' };
};
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/session');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
assert.match(plainTerminalOutput(terminal.output()), /attachab/);

let switched = false;
try {
terminal.input('\r');
await waitFor(() => driver.sessionIds.includes(attachable.id));
switched = true;
} finally {
exitMaka(terminal);
await run;
}
assert.equal(switched, true);
});

test('surfaces a notice when the foreign-session scan fails', async () => {
const terminal = new FakeTerminal();
const driver = new SlashCommandDriver([]);
Expand DownExpand Up@@ -4588,6 +4761,7 @@ describe('Maka Pi TUI runner', () => {
driver.releaseList();
// The rendered picker is the observable arming signal for the Escape.
await waitFor(() => plainTerminalOutput(terminal.screenOutput()).includes('Existing chat'));
assert.equal(driver.listCalls, 1);

terminal.input('\x1b');
exitMaka(terminal);
Expand DownExpand Up@@ -8419,6 +8593,32 @@ class SlashCommandDriver extends FakeSessionDriver {
}
}

class RejectingSwitchSessionDriver extends SlashCommandDriver {
switchCalls = 0;

override async switchSession(_sessionId: string): Promise<MakaSessionSwitchResult> {
this.switchCalls += 1;
throw new Error('session became unavailable');
}
}

class BoundedResumeAvailabilityDriver extends SlashCommandDriver {
availabilityCalls = 0;
activeCalls = 0;
maxActiveCalls = 0;

async getSessionResumeCandidateAvailability(
_session: SessionSummary,
): Promise<SessionResumeAvailability> {
this.availabilityCalls += 1;
this.activeCalls += 1;
this.maxActiveCalls = Math.max(this.maxActiveCalls, this.activeCalls);
await delay(1);
this.activeCalls -= 1;
return { available: true };
}
}

class UserCommandDriver extends SlashCommandDriver {
readonly commands: string[] = [];

Expand DownExpand Up@@ -9133,6 +9333,12 @@ class DeferredListSessionsDriver extends SlashCommandDriver {
listCalls = 0;
private resolveList: (() => void) | null = null;

async getSessionResumeCandidateAvailability(
_session: SessionSummary,
): Promise<SessionResumeAvailability> {
return { available: true };
}

override async listSessions(): Promise<SessionSummary[]> {
this.listCalls += 1;
await new Promise<void>((resolve) => {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2636,6 +2636,15 @@ class FakeConnection {
goal: this.goalQueryResults.shift() ?? null,
} as OperationOutput<K>;
}
if (operation === 'turn.resume.query') {
return {
sessionId: (input as OperationInput<'turn.resume.query'>).sessionId,
disposition: 'ready',
sourceRunId: 'source-run-1',
sourceTurnId: 'source-turn-1',
sourceRuntimeEventHighWater: 1,
} as OperationOutput<K>;
}
if (operation === 'session.configuration.update') {
const update = input as OperationInput<'session.configuration.update'>;
const outcome = this.configurationOutcomes.shift();
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
fix(cli): discover resumable sessions from /resume by mikemikimike · Pull Request #3582 · apache/maka · GitHub
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
206 changes: 206 additions & 0 deletions packages/cli/src/__tests__/pi-tui-runner.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3976,6 +3976,179 @@ describe('Maka Pi TUI runner', () => {
]);
});

test('/resume opens a picker containing only resumable sessions when none is attached', async () => {
const terminal = new FakeTerminal();
const resumable = fakeSessionSummary('resumable', '/repo');
const unavailable = fakeSessionSummary('unavailable', '');
const driver = new SlashCommandDriver([resumable, unavailable]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
const output = plainTerminalOutput(terminal.output());
assert.match(output, /resumabl/);
assert.doesNotMatch(output, /unavailable/);

terminal.input('\r');
await waitFor(() => driver.resumeCalls === 1);
terminal.input('/exit');
terminal.input('\r');
await run;
});

test('/resume does not resume after a stale selection fails to switch', async () => {
const terminal = new FakeTerminal();
const session = fakeSessionSummary('stale', '/repo');
const driver = new RejectingSwitchSessionDriver([session]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
terminal.input('\r');
await waitFor(() => driver.switchCalls === 1);
await delay(0);
assert.equal(driver.resumeCalls, 0);

exitMaka(terminal);
await run;
});

test('/resume bounds concurrent resumability checks for large session catalogs', async () => {
const terminal = new FakeTerminal();
const sessions = Array.from({ length: 24 }, (_, index) =>
fakeSessionSummary(`session-${index}`, '/repo'),
);
const driver = new BoundedResumeAvailabilityDriver(sessions);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
assert.ok(driver.availabilityCalls >= sessions.length);
assert.ok(driver.maxActiveCalls <= 8);

terminal.input('\x1b');
exitMaka(terminal);
await run;
});

test('/resume excludes foreign sessions when none is attached', async () => {
const terminal = new FakeTerminal();
const driver = new SlashCommandDriver([]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const foreignSession = {
source: 'claude-code' as const,
id: 'foreign-resume',
title: 'Foreign interrupted work',
cwd: '/repo',
updatedAtMs: Date.now(),
transcriptPath: '/home/u/.claude/projects/-repo/foreign-resume.jsonl',
};
let listSessionsCalls = 0;
let readDigestCalls = 0;
const foreignSessions = {
availableSources: async () => ['claude-code' as const],
listSessions: async () => {
listSessionsCalls += 1;
return [foreignSession];
},
readDigest: async () => {
readDigestCalls += 1;
throw new Error('foreign import must not run from /resume');
},
};
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
foreignSessions,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
const output = plainTerminalOutput(terminal.output());
assert.doesNotMatch(output, /Foreign interrupted work/);
assert.equal(listSessionsCalls, 0);

terminal.input('\x1b');
terminal.input('/exit');
terminal.input('\r');
await run;
assert.equal(readDigestCalls, 0);
assert.equal(driver.startNewSessionCalls, 0);
assert.equal(driver.prompts.length, 0);
});

test('/session keeps attachable rows when resume discovery fails for another session', async () => {
const terminal = new FakeTerminal();
const attachable = fakeSessionSummary('attachable', '/repo');
const archived = fakeSessionSummary('archived', '/repo');
const driver = new SlashCommandDriver([attachable, archived]);
driver.getSessionResumeAvailability = async (session) => {
if (session.id === archived.id) throw new Error('session archived');
return { available: false, reason: 'no resumable turn' };
};
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/session');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
assert.match(plainTerminalOutput(terminal.output()), /attachab/);

let switched = false;
try {
terminal.input('\r');
await waitFor(() => driver.sessionIds.includes(attachable.id));
switched = true;
} finally {
exitMaka(terminal);
await run;
}
assert.equal(switched, true);
});

test('surfaces a notice when the foreign-session scan fails', async () => {
const terminal = new FakeTerminal();
const driver = new SlashCommandDriver([]);
Expand DownExpand Up@@ -4588,6 +4761,7 @@ describe('Maka Pi TUI runner', () => {
driver.releaseList();
// The rendered picker is the observable arming signal for the Escape.
await waitFor(() => plainTerminalOutput(terminal.screenOutput()).includes('Existing chat'));
assert.equal(driver.listCalls, 1);

terminal.input('\x1b');
exitMaka(terminal);
Expand DownExpand Up@@ -8419,6 +8593,32 @@ class SlashCommandDriver extends FakeSessionDriver {
}
}

class RejectingSwitchSessionDriver extends SlashCommandDriver {
switchCalls = 0;

override async switchSession(_sessionId: string): Promise<MakaSessionSwitchResult> {
this.switchCalls += 1;
throw new Error('session became unavailable');
}
}

class BoundedResumeAvailabilityDriver extends SlashCommandDriver {
availabilityCalls = 0;
activeCalls = 0;
maxActiveCalls = 0;

async getSessionResumeCandidateAvailability(
_session: SessionSummary,
): Promise<SessionResumeAvailability> {
this.availabilityCalls += 1;
this.activeCalls += 1;
this.maxActiveCalls = Math.max(this.maxActiveCalls, this.activeCalls);
await delay(1);
this.activeCalls -= 1;
return { available: true };
}
}

class UserCommandDriver extends SlashCommandDriver {
readonly commands: string[] = [];

Expand DownExpand Up@@ -9133,6 +9333,12 @@ class DeferredListSessionsDriver extends SlashCommandDriver {
listCalls = 0;
private resolveList: (() => void) | null = null;

async getSessionResumeCandidateAvailability(
_session: SessionSummary,
): Promise<SessionResumeAvailability> {
return { available: true };
}

override async listSessions(): Promise<SessionSummary[]> {
this.listCalls += 1;
await new Promise<void>((resolve) => {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2636,6 +2636,15 @@ class FakeConnection {
goal: this.goalQueryResults.shift() ?? null,
} as OperationOutput<K>;
}
if (operation === 'turn.resume.query') {
return {
sessionId: (input as OperationInput<'turn.resume.query'>).sessionId,
disposition: 'ready',
sourceRunId: 'source-run-1',
sourceTurnId: 'source-turn-1',
sourceRuntimeEventHighWater: 1,
} as OperationOutput<K>;
}
if (operation === 'session.configuration.update') {
const update = input as OperationInput<'session.configuration.update'>;
const outcome = this.configurationOutcomes.shift();
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(cli): discover resumable sessions from /resume by mikemikimike · Pull Request #3582 · apache/maka · GitHub
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
206 changes: 206 additions & 0 deletions packages/cli/src/__tests__/pi-tui-runner.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3976,6 +3976,179 @@ describe('Maka Pi TUI runner', () => {
]);
});

test('/resume opens a picker containing only resumable sessions when none is attached', async () => {
const terminal = new FakeTerminal();
const resumable = fakeSessionSummary('resumable', '/repo');
const unavailable = fakeSessionSummary('unavailable', '');
const driver = new SlashCommandDriver([resumable, unavailable]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
const output = plainTerminalOutput(terminal.output());
assert.match(output, /resumabl/);
assert.doesNotMatch(output, /unavailable/);

terminal.input('\r');
await waitFor(() => driver.resumeCalls === 1);
terminal.input('/exit');
terminal.input('\r');
await run;
});

test('/resume does not resume after a stale selection fails to switch', async () => {
const terminal = new FakeTerminal();
const session = fakeSessionSummary('stale', '/repo');
const driver = new RejectingSwitchSessionDriver([session]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
terminal.input('\r');
await waitFor(() => driver.switchCalls === 1);
await delay(0);
assert.equal(driver.resumeCalls, 0);

exitMaka(terminal);
await run;
});

test('/resume bounds concurrent resumability checks for large session catalogs', async () => {
const terminal = new FakeTerminal();
const sessions = Array.from({ length: 24 }, (_, index) =>
fakeSessionSummary(`session-${index}`, '/repo'),
);
const driver = new BoundedResumeAvailabilityDriver(sessions);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
assert.ok(driver.availabilityCalls >= sessions.length);
assert.ok(driver.maxActiveCalls <= 8);

terminal.input('\x1b');
exitMaka(terminal);
await run;
});

test('/resume excludes foreign sessions when none is attached', async () => {
const terminal = new FakeTerminal();
const driver = new SlashCommandDriver([]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const foreignSession = {
source: 'claude-code' as const,
id: 'foreign-resume',
title: 'Foreign interrupted work',
cwd: '/repo',
updatedAtMs: Date.now(),
transcriptPath: '/home/u/.claude/projects/-repo/foreign-resume.jsonl',
};
let listSessionsCalls = 0;
let readDigestCalls = 0;
const foreignSessions = {
availableSources: async () => ['claude-code' as const],
listSessions: async () => {
listSessionsCalls += 1;
return [foreignSession];
},
readDigest: async () => {
readDigestCalls += 1;
throw new Error('foreign import must not run from /resume');
},
};
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
foreignSessions,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
const output = plainTerminalOutput(terminal.output());
assert.doesNotMatch(output, /Foreign interrupted work/);
assert.equal(listSessionsCalls, 0);

terminal.input('\x1b');
terminal.input('/exit');
terminal.input('\r');
await run;
assert.equal(readDigestCalls, 0);
assert.equal(driver.startNewSessionCalls, 0);
assert.equal(driver.prompts.length, 0);
});

test('/session keeps attachable rows when resume discovery fails for another session', async () => {
const terminal = new FakeTerminal();
const attachable = fakeSessionSummary('attachable', '/repo');
const archived = fakeSessionSummary('archived', '/repo');
const driver = new SlashCommandDriver([attachable, archived]);
driver.getSessionResumeAvailability = async (session) => {
if (session.id === archived.id) throw new Error('session archived');
return { available: false, reason: 'no resumable turn' };
};
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/session');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
assert.match(plainTerminalOutput(terminal.output()), /attachab/);

let switched = false;
try {
terminal.input('\r');
await waitFor(() => driver.sessionIds.includes(attachable.id));
switched = true;
} finally {
exitMaka(terminal);
await run;
}
assert.equal(switched, true);
});

test('surfaces a notice when the foreign-session scan fails', async () => {
const terminal = new FakeTerminal();
const driver = new SlashCommandDriver([]);
Expand DownExpand Up@@ -4588,6 +4761,7 @@ describe('Maka Pi TUI runner', () => {
driver.releaseList();
// The rendered picker is the observable arming signal for the Escape.
await waitFor(() => plainTerminalOutput(terminal.screenOutput()).includes('Existing chat'));
assert.equal(driver.listCalls, 1);

terminal.input('\x1b');
exitMaka(terminal);
Expand DownExpand Up@@ -8419,6 +8593,32 @@ class SlashCommandDriver extends FakeSessionDriver {
}
}

class RejectingSwitchSessionDriver extends SlashCommandDriver {
switchCalls = 0;

override async switchSession(_sessionId: string): Promise<MakaSessionSwitchResult> {
this.switchCalls += 1;
throw new Error('session became unavailable');
}
}

class BoundedResumeAvailabilityDriver extends SlashCommandDriver {
availabilityCalls = 0;
activeCalls = 0;
maxActiveCalls = 0;

async getSessionResumeCandidateAvailability(
_session: SessionSummary,
): Promise<SessionResumeAvailability> {
this.availabilityCalls += 1;
this.activeCalls += 1;
this.maxActiveCalls = Math.max(this.maxActiveCalls, this.activeCalls);
await delay(1);
this.activeCalls -= 1;
return { available: true };
}
}

class UserCommandDriver extends SlashCommandDriver {
readonly commands: string[] = [];

Expand DownExpand Up@@ -9133,6 +9333,12 @@ class DeferredListSessionsDriver extends SlashCommandDriver {
listCalls = 0;
private resolveList: (() => void) | null = null;

async getSessionResumeCandidateAvailability(
_session: SessionSummary,
): Promise<SessionResumeAvailability> {
return { available: true };
}

override async listSessions(): Promise<SessionSummary[]> {
this.listCalls += 1;
await new Promise<void>((resolve) => {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2636,6 +2636,15 @@ class FakeConnection {
goal: this.goalQueryResults.shift() ?? null,
} as OperationOutput<K>;
}
if (operation === 'turn.resume.query') {
return {
sessionId: (input as OperationInput<'turn.resume.query'>).sessionId,
disposition: 'ready',
sourceRunId: 'source-run-1',
sourceTurnId: 'source-turn-1',
sourceRuntimeEventHighWater: 1,
} as OperationOutput<K>;
}
if (operation === 'session.configuration.update') {
const update = input as OperationInput<'session.configuration.update'>;
const outcome = this.configurationOutcomes.shift();
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(cli): discover resumable sessions from /resume by mikemikimike · Pull Request #3582 · apache/maka · GitHub
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
206 changes: 206 additions & 0 deletions packages/cli/src/__tests__/pi-tui-runner.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3976,6 +3976,179 @@ describe('Maka Pi TUI runner', () => {
]);
});

test('/resume opens a picker containing only resumable sessions when none is attached', async () => {
const terminal = new FakeTerminal();
const resumable = fakeSessionSummary('resumable', '/repo');
const unavailable = fakeSessionSummary('unavailable', '');
const driver = new SlashCommandDriver([resumable, unavailable]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
const output = plainTerminalOutput(terminal.output());
assert.match(output, /resumabl/);
assert.doesNotMatch(output, /unavailable/);

terminal.input('\r');
await waitFor(() => driver.resumeCalls === 1);
terminal.input('/exit');
terminal.input('\r');
await run;
});

test('/resume does not resume after a stale selection fails to switch', async () => {
const terminal = new FakeTerminal();
const session = fakeSessionSummary('stale', '/repo');
const driver = new RejectingSwitchSessionDriver([session]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
terminal.input('\r');
await waitFor(() => driver.switchCalls === 1);
await delay(0);
assert.equal(driver.resumeCalls, 0);

exitMaka(terminal);
await run;
});

test('/resume bounds concurrent resumability checks for large session catalogs', async () => {
const terminal = new FakeTerminal();
const sessions = Array.from({ length: 24 }, (_, index) =>
fakeSessionSummary(`session-${index}`, '/repo'),
);
const driver = new BoundedResumeAvailabilityDriver(sessions);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
assert.ok(driver.availabilityCalls >= sessions.length);
assert.ok(driver.maxActiveCalls <= 8);

terminal.input('\x1b');
exitMaka(terminal);
await run;
});

test('/resume excludes foreign sessions when none is attached', async () => {
const terminal = new FakeTerminal();
const driver = new SlashCommandDriver([]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const foreignSession = {
source: 'claude-code' as const,
id: 'foreign-resume',
title: 'Foreign interrupted work',
cwd: '/repo',
updatedAtMs: Date.now(),
transcriptPath: '/home/u/.claude/projects/-repo/foreign-resume.jsonl',
};
let listSessionsCalls = 0;
let readDigestCalls = 0;
const foreignSessions = {
availableSources: async () => ['claude-code' as const],
listSessions: async () => {
listSessionsCalls += 1;
return [foreignSession];
},
readDigest: async () => {
readDigestCalls += 1;
throw new Error('foreign import must not run from /resume');
},
};
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
foreignSessions,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
const output = plainTerminalOutput(terminal.output());
assert.doesNotMatch(output, /Foreign interrupted work/);
assert.equal(listSessionsCalls, 0);

terminal.input('\x1b');
terminal.input('/exit');
terminal.input('\r');
await run;
assert.equal(readDigestCalls, 0);
assert.equal(driver.startNewSessionCalls, 0);
assert.equal(driver.prompts.length, 0);
});

test('/session keeps attachable rows when resume discovery fails for another session', async () => {
const terminal = new FakeTerminal();
const attachable = fakeSessionSummary('attachable', '/repo');
const archived = fakeSessionSummary('archived', '/repo');
const driver = new SlashCommandDriver([attachable, archived]);
driver.getSessionResumeAvailability = async (session) => {
if (session.id === archived.id) throw new Error('session archived');
return { available: false, reason: 'no resumable turn' };
};
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/session');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
assert.match(plainTerminalOutput(terminal.output()), /attachab/);

let switched = false;
try {
terminal.input('\r');
await waitFor(() => driver.sessionIds.includes(attachable.id));
switched = true;
} finally {
exitMaka(terminal);
await run;
}
assert.equal(switched, true);
});

test('surfaces a notice when the foreign-session scan fails', async () => {
const terminal = new FakeTerminal();
const driver = new SlashCommandDriver([]);
Expand DownExpand Up@@ -4588,6 +4761,7 @@ describe('Maka Pi TUI runner', () => {
driver.releaseList();
// The rendered picker is the observable arming signal for the Escape.
await waitFor(() => plainTerminalOutput(terminal.screenOutput()).includes('Existing chat'));
assert.equal(driver.listCalls, 1);

terminal.input('\x1b');
exitMaka(terminal);
Expand DownExpand Up@@ -8419,6 +8593,32 @@ class SlashCommandDriver extends FakeSessionDriver {
}
}

class RejectingSwitchSessionDriver extends SlashCommandDriver {
switchCalls = 0;

override async switchSession(_sessionId: string): Promise<MakaSessionSwitchResult> {
this.switchCalls += 1;
throw new Error('session became unavailable');
}
}

class BoundedResumeAvailabilityDriver extends SlashCommandDriver {
availabilityCalls = 0;
activeCalls = 0;
maxActiveCalls = 0;

async getSessionResumeCandidateAvailability(
_session: SessionSummary,
): Promise<SessionResumeAvailability> {
this.availabilityCalls += 1;
this.activeCalls += 1;
this.maxActiveCalls = Math.max(this.maxActiveCalls, this.activeCalls);
await delay(1);
this.activeCalls -= 1;
return { available: true };
}
}

class UserCommandDriver extends SlashCommandDriver {
readonly commands: string[] = [];

Expand DownExpand Up@@ -9133,6 +9333,12 @@ class DeferredListSessionsDriver extends SlashCommandDriver {
listCalls = 0;
private resolveList: (() => void) | null = null;

async getSessionResumeCandidateAvailability(
_session: SessionSummary,
): Promise<SessionResumeAvailability> {
return { available: true };
}

override async listSessions(): Promise<SessionSummary[]> {
this.listCalls += 1;
await new Promise<void>((resolve) => {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2636,6 +2636,15 @@ class FakeConnection {
goal: this.goalQueryResults.shift() ?? null,
} as OperationOutput<K>;
}
if (operation === 'turn.resume.query') {
return {
sessionId: (input as OperationInput<'turn.resume.query'>).sessionId,
disposition: 'ready',
sourceRunId: 'source-run-1',
sourceTurnId: 'source-turn-1',
sourceRuntimeEventHighWater: 1,
} as OperationOutput<K>;
}
if (operation === 'session.configuration.update') {
const update = input as OperationInput<'session.configuration.update'>;
const outcome = this.configurationOutcomes.shift();
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' fix(cli): discover resumable sessions from /resume by mikemikimike · Pull Request #3582 · apache/maka · GitHub
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
206 changes: 206 additions & 0 deletions packages/cli/src/__tests__/pi-tui-runner.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3976,6 +3976,179 @@ describe('Maka Pi TUI runner', () => {
]);
});

test('/resume opens a picker containing only resumable sessions when none is attached', async () => {
const terminal = new FakeTerminal();
const resumable = fakeSessionSummary('resumable', '/repo');
const unavailable = fakeSessionSummary('unavailable', '');
const driver = new SlashCommandDriver([resumable, unavailable]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
const output = plainTerminalOutput(terminal.output());
assert.match(output, /resumabl/);
assert.doesNotMatch(output, /unavailable/);

terminal.input('\r');
await waitFor(() => driver.resumeCalls === 1);
terminal.input('/exit');
terminal.input('\r');
await run;
});

test('/resume does not resume after a stale selection fails to switch', async () => {
const terminal = new FakeTerminal();
const session = fakeSessionSummary('stale', '/repo');
const driver = new RejectingSwitchSessionDriver([session]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
terminal.input('\r');
await waitFor(() => driver.switchCalls === 1);
await delay(0);
assert.equal(driver.resumeCalls, 0);

exitMaka(terminal);
await run;
});

test('/resume bounds concurrent resumability checks for large session catalogs', async () => {
const terminal = new FakeTerminal();
const sessions = Array.from({ length: 24 }, (_, index) =>
fakeSessionSummary(`session-${index}`, '/repo'),
);
const driver = new BoundedResumeAvailabilityDriver(sessions);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
assert.ok(driver.availabilityCalls >= sessions.length);
assert.ok(driver.maxActiveCalls <= 8);

terminal.input('\x1b');
exitMaka(terminal);
await run;
});

test('/resume excludes foreign sessions when none is attached', async () => {
const terminal = new FakeTerminal();
const driver = new SlashCommandDriver([]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const foreignSession = {
source: 'claude-code' as const,
id: 'foreign-resume',
title: 'Foreign interrupted work',
cwd: '/repo',
updatedAtMs: Date.now(),
transcriptPath: '/home/u/.claude/projects/-repo/foreign-resume.jsonl',
};
let listSessionsCalls = 0;
let readDigestCalls = 0;
const foreignSessions = {
availableSources: async () => ['claude-code' as const],
listSessions: async () => {
listSessionsCalls += 1;
return [foreignSession];
},
readDigest: async () => {
readDigestCalls += 1;
throw new Error('foreign import must not run from /resume');
},
};
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
foreignSessions,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
const output = plainTerminalOutput(terminal.output());
assert.doesNotMatch(output, /Foreign interrupted work/);
assert.equal(listSessionsCalls, 0);

terminal.input('\x1b');
terminal.input('/exit');
terminal.input('\r');
await run;
assert.equal(readDigestCalls, 0);
assert.equal(driver.startNewSessionCalls, 0);
assert.equal(driver.prompts.length, 0);
});

test('/session keeps attachable rows when resume discovery fails for another session', async () => {
const terminal = new FakeTerminal();
const attachable = fakeSessionSummary('attachable', '/repo');
const archived = fakeSessionSummary('archived', '/repo');
const driver = new SlashCommandDriver([attachable, archived]);
driver.getSessionResumeAvailability = async (session) => {
if (session.id === archived.id) throw new Error('session archived');
return { available: false, reason: 'no resumable turn' };
};
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/session');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
assert.match(plainTerminalOutput(terminal.output()), /attachab/);

let switched = false;
try {
terminal.input('\r');
await waitFor(() => driver.sessionIds.includes(attachable.id));
switched = true;
} finally {
exitMaka(terminal);
await run;
}
assert.equal(switched, true);
});

test('surfaces a notice when the foreign-session scan fails', async () => {
const terminal = new FakeTerminal();
const driver = new SlashCommandDriver([]);
Expand DownExpand Up@@ -4588,6 +4761,7 @@ describe('Maka Pi TUI runner', () => {
driver.releaseList();
// The rendered picker is the observable arming signal for the Escape.
await waitFor(() => plainTerminalOutput(terminal.screenOutput()).includes('Existing chat'));
assert.equal(driver.listCalls, 1);

terminal.input('\x1b');
exitMaka(terminal);
Expand DownExpand Up@@ -8419,6 +8593,32 @@ class SlashCommandDriver extends FakeSessionDriver {
}
}

class RejectingSwitchSessionDriver extends SlashCommandDriver {
switchCalls = 0;

override async switchSession(_sessionId: string): Promise<MakaSessionSwitchResult> {
this.switchCalls += 1;
throw new Error('session became unavailable');
}
}

class BoundedResumeAvailabilityDriver extends SlashCommandDriver {
availabilityCalls = 0;
activeCalls = 0;
maxActiveCalls = 0;

async getSessionResumeCandidateAvailability(
_session: SessionSummary,
): Promise<SessionResumeAvailability> {
this.availabilityCalls += 1;
this.activeCalls += 1;
this.maxActiveCalls = Math.max(this.maxActiveCalls, this.activeCalls);
await delay(1);
this.activeCalls -= 1;
return { available: true };
}
}

class UserCommandDriver extends SlashCommandDriver {
readonly commands: string[] = [];

Expand DownExpand Up@@ -9133,6 +9333,12 @@ class DeferredListSessionsDriver extends SlashCommandDriver {
listCalls = 0;
private resolveList: (() => void) | null = null;

async getSessionResumeCandidateAvailability(
_session: SessionSummary,
): Promise<SessionResumeAvailability> {
return { available: true };
}

override async listSessions(): Promise<SessionSummary[]> {
this.listCalls += 1;
await new Promise<void>((resolve) => {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2636,6 +2636,15 @@ class FakeConnection {
goal: this.goalQueryResults.shift() ?? null,
} as OperationOutput<K>;
}
if (operation === 'turn.resume.query') {
return {
sessionId: (input as OperationInput<'turn.resume.query'>).sessionId,
disposition: 'ready',
sourceRunId: 'source-run-1',
sourceTurnId: 'source-turn-1',
sourceRuntimeEventHighWater: 1,
} as OperationOutput<K>;
}
if (operation === 'session.configuration.update') {
const update = input as OperationInput<'session.configuration.update'>;
const outcome = this.configurationOutcomes.shift();
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(cli): discover resumable sessions from /resume by mikemikimike · Pull Request #3582 · apache/maka · GitHub
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
206 changes: 206 additions & 0 deletions packages/cli/src/__tests__/pi-tui-runner.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3976,6 +3976,179 @@ describe('Maka Pi TUI runner', () => {
]);
});

test('/resume opens a picker containing only resumable sessions when none is attached', async () => {
const terminal = new FakeTerminal();
const resumable = fakeSessionSummary('resumable', '/repo');
const unavailable = fakeSessionSummary('unavailable', '');
const driver = new SlashCommandDriver([resumable, unavailable]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
const output = plainTerminalOutput(terminal.output());
assert.match(output, /resumabl/);
assert.doesNotMatch(output, /unavailable/);

terminal.input('\r');
await waitFor(() => driver.resumeCalls === 1);
terminal.input('/exit');
terminal.input('\r');
await run;
});

test('/resume does not resume after a stale selection fails to switch', async () => {
const terminal = new FakeTerminal();
const session = fakeSessionSummary('stale', '/repo');
const driver = new RejectingSwitchSessionDriver([session]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
terminal.input('\r');
await waitFor(() => driver.switchCalls === 1);
await delay(0);
assert.equal(driver.resumeCalls, 0);

exitMaka(terminal);
await run;
});

test('/resume bounds concurrent resumability checks for large session catalogs', async () => {
const terminal = new FakeTerminal();
const sessions = Array.from({ length: 24 }, (_, index) =>
fakeSessionSummary(`session-${index}`, '/repo'),
);
const driver = new BoundedResumeAvailabilityDriver(sessions);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
assert.ok(driver.availabilityCalls >= sessions.length);
assert.ok(driver.maxActiveCalls <= 8);

terminal.input('\x1b');
exitMaka(terminal);
await run;
});

test('/resume excludes foreign sessions when none is attached', async () => {
const terminal = new FakeTerminal();
const driver = new SlashCommandDriver([]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const foreignSession = {
source: 'claude-code' as const,
id: 'foreign-resume',
title: 'Foreign interrupted work',
cwd: '/repo',
updatedAtMs: Date.now(),
transcriptPath: '/home/u/.claude/projects/-repo/foreign-resume.jsonl',
};
let listSessionsCalls = 0;
let readDigestCalls = 0;
const foreignSessions = {
availableSources: async () => ['claude-code' as const],
listSessions: async () => {
listSessionsCalls += 1;
return [foreignSession];
},
readDigest: async () => {
readDigestCalls += 1;
throw new Error('foreign import must not run from /resume');
},
};
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
foreignSessions,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
const output = plainTerminalOutput(terminal.output());
assert.doesNotMatch(output, /Foreign interrupted work/);
assert.equal(listSessionsCalls, 0);

terminal.input('\x1b');
terminal.input('/exit');
terminal.input('\r');
await run;
assert.equal(readDigestCalls, 0);
assert.equal(driver.startNewSessionCalls, 0);
assert.equal(driver.prompts.length, 0);
});

test('/session keeps attachable rows when resume discovery fails for another session', async () => {
const terminal = new FakeTerminal();
const attachable = fakeSessionSummary('attachable', '/repo');
const archived = fakeSessionSummary('archived', '/repo');
const driver = new SlashCommandDriver([attachable, archived]);
driver.getSessionResumeAvailability = async (session) => {
if (session.id === archived.id) throw new Error('session archived');
return { available: false, reason: 'no resumable turn' };
};
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/session');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
assert.match(plainTerminalOutput(terminal.output()), /attachab/);

let switched = false;
try {
terminal.input('\r');
await waitFor(() => driver.sessionIds.includes(attachable.id));
switched = true;
} finally {
exitMaka(terminal);
await run;
}
assert.equal(switched, true);
});

test('surfaces a notice when the foreign-session scan fails', async () => {
const terminal = new FakeTerminal();
const driver = new SlashCommandDriver([]);
Expand DownExpand Up@@ -4588,6 +4761,7 @@ describe('Maka Pi TUI runner', () => {
driver.releaseList();
// The rendered picker is the observable arming signal for the Escape.
await waitFor(() => plainTerminalOutput(terminal.screenOutput()).includes('Existing chat'));
assert.equal(driver.listCalls, 1);

terminal.input('\x1b');
exitMaka(terminal);
Expand DownExpand Up@@ -8419,6 +8593,32 @@ class SlashCommandDriver extends FakeSessionDriver {
}
}

class RejectingSwitchSessionDriver extends SlashCommandDriver {
switchCalls = 0;

override async switchSession(_sessionId: string): Promise<MakaSessionSwitchResult> {
this.switchCalls += 1;
throw new Error('session became unavailable');
}
}

class BoundedResumeAvailabilityDriver extends SlashCommandDriver {
availabilityCalls = 0;
activeCalls = 0;
maxActiveCalls = 0;

async getSessionResumeCandidateAvailability(
_session: SessionSummary,
): Promise<SessionResumeAvailability> {
this.availabilityCalls += 1;
this.activeCalls += 1;
this.maxActiveCalls = Math.max(this.maxActiveCalls, this.activeCalls);
await delay(1);
this.activeCalls -= 1;
return { available: true };
}
}

class UserCommandDriver extends SlashCommandDriver {
readonly commands: string[] = [];

Expand DownExpand Up@@ -9133,6 +9333,12 @@ class DeferredListSessionsDriver extends SlashCommandDriver {
listCalls = 0;
private resolveList: (() => void) | null = null;

async getSessionResumeCandidateAvailability(
_session: SessionSummary,
): Promise<SessionResumeAvailability> {
return { available: true };
}

override async listSessions(): Promise<SessionSummary[]> {
this.listCalls += 1;
await new Promise<void>((resolve) => {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2636,6 +2636,15 @@ class FakeConnection {
goal: this.goalQueryResults.shift() ?? null,
} as OperationOutput<K>;
}
if (operation === 'turn.resume.query') {
return {
sessionId: (input as OperationInput<'turn.resume.query'>).sessionId,
disposition: 'ready',
sourceRunId: 'source-run-1',
sourceTurnId: 'source-turn-1',
sourceRuntimeEventHighWater: 1,
} as OperationOutput<K>;
}
if (operation === 'session.configuration.update') {
const update = input as OperationInput<'session.configuration.update'>;
const outcome = this.configurationOutcomes.shift();
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(cli): discover resumable sessions from /resume by mikemikimike · Pull Request #3582 · apache/maka · GitHub
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
206 changes: 206 additions & 0 deletions packages/cli/src/__tests__/pi-tui-runner.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3976,6 +3976,179 @@ describe('Maka Pi TUI runner', () => {
]);
});

test('/resume opens a picker containing only resumable sessions when none is attached', async () => {
const terminal = new FakeTerminal();
const resumable = fakeSessionSummary('resumable', '/repo');
const unavailable = fakeSessionSummary('unavailable', '');
const driver = new SlashCommandDriver([resumable, unavailable]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
const output = plainTerminalOutput(terminal.output());
assert.match(output, /resumabl/);
assert.doesNotMatch(output, /unavailable/);

terminal.input('\r');
await waitFor(() => driver.resumeCalls === 1);
terminal.input('/exit');
terminal.input('\r');
await run;
});

test('/resume does not resume after a stale selection fails to switch', async () => {
const terminal = new FakeTerminal();
const session = fakeSessionSummary('stale', '/repo');
const driver = new RejectingSwitchSessionDriver([session]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
terminal.input('\r');
await waitFor(() => driver.switchCalls === 1);
await delay(0);
assert.equal(driver.resumeCalls, 0);

exitMaka(terminal);
await run;
});

test('/resume bounds concurrent resumability checks for large session catalogs', async () => {
const terminal = new FakeTerminal();
const sessions = Array.from({ length: 24 }, (_, index) =>
fakeSessionSummary(`session-${index}`, '/repo'),
);
const driver = new BoundedResumeAvailabilityDriver(sessions);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
assert.ok(driver.availabilityCalls >= sessions.length);
assert.ok(driver.maxActiveCalls <= 8);

terminal.input('\x1b');
exitMaka(terminal);
await run;
});

test('/resume excludes foreign sessions when none is attached', async () => {
const terminal = new FakeTerminal();
const driver = new SlashCommandDriver([]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const foreignSession = {
source: 'claude-code' as const,
id: 'foreign-resume',
title: 'Foreign interrupted work',
cwd: '/repo',
updatedAtMs: Date.now(),
transcriptPath: '/home/u/.claude/projects/-repo/foreign-resume.jsonl',
};
let listSessionsCalls = 0;
let readDigestCalls = 0;
const foreignSessions = {
availableSources: async () => ['claude-code' as const],
listSessions: async () => {
listSessionsCalls += 1;
return [foreignSession];
},
readDigest: async () => {
readDigestCalls += 1;
throw new Error('foreign import must not run from /resume');
},
};
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
foreignSessions,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
const output = plainTerminalOutput(terminal.output());
assert.doesNotMatch(output, /Foreign interrupted work/);
assert.equal(listSessionsCalls, 0);

terminal.input('\x1b');
terminal.input('/exit');
terminal.input('\r');
await run;
assert.equal(readDigestCalls, 0);
assert.equal(driver.startNewSessionCalls, 0);
assert.equal(driver.prompts.length, 0);
});

test('/session keeps attachable rows when resume discovery fails for another session', async () => {
const terminal = new FakeTerminal();
const attachable = fakeSessionSummary('attachable', '/repo');
const archived = fakeSessionSummary('archived', '/repo');
const driver = new SlashCommandDriver([attachable, archived]);
driver.getSessionResumeAvailability = async (session) => {
if (session.id === archived.id) throw new Error('session archived');
return { available: false, reason: 'no resumable turn' };
};
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/session');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
assert.match(plainTerminalOutput(terminal.output()), /attachab/);

let switched = false;
try {
terminal.input('\r');
await waitFor(() => driver.sessionIds.includes(attachable.id));
switched = true;
} finally {
exitMaka(terminal);
await run;
}
assert.equal(switched, true);
});

test('surfaces a notice when the foreign-session scan fails', async () => {
const terminal = new FakeTerminal();
const driver = new SlashCommandDriver([]);
Expand DownExpand Up@@ -4588,6 +4761,7 @@ describe('Maka Pi TUI runner', () => {
driver.releaseList();
// The rendered picker is the observable arming signal for the Escape.
await waitFor(() => plainTerminalOutput(terminal.screenOutput()).includes('Existing chat'));
assert.equal(driver.listCalls, 1);

terminal.input('\x1b');
exitMaka(terminal);
Expand DownExpand Up@@ -8419,6 +8593,32 @@ class SlashCommandDriver extends FakeSessionDriver {
}
}

class RejectingSwitchSessionDriver extends SlashCommandDriver {
switchCalls = 0;

override async switchSession(_sessionId: string): Promise<MakaSessionSwitchResult> {
this.switchCalls += 1;
throw new Error('session became unavailable');
}
}

class BoundedResumeAvailabilityDriver extends SlashCommandDriver {
availabilityCalls = 0;
activeCalls = 0;
maxActiveCalls = 0;

async getSessionResumeCandidateAvailability(
_session: SessionSummary,
): Promise<SessionResumeAvailability> {
this.availabilityCalls += 1;
this.activeCalls += 1;
this.maxActiveCalls = Math.max(this.maxActiveCalls, this.activeCalls);
await delay(1);
this.activeCalls -= 1;
return { available: true };
}
}

class UserCommandDriver extends SlashCommandDriver {
readonly commands: string[] = [];

Expand DownExpand Up@@ -9133,6 +9333,12 @@ class DeferredListSessionsDriver extends SlashCommandDriver {
listCalls = 0;
private resolveList: (() => void) | null = null;

async getSessionResumeCandidateAvailability(
_session: SessionSummary,
): Promise<SessionResumeAvailability> {
return { available: true };
}

override async listSessions(): Promise<SessionSummary[]> {
this.listCalls += 1;
await new Promise<void>((resolve) => {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2636,6 +2636,15 @@ class FakeConnection {
goal: this.goalQueryResults.shift() ?? null,
} as OperationOutput<K>;
}
if (operation === 'turn.resume.query') {
return {
sessionId: (input as OperationInput<'turn.resume.query'>).sessionId,
disposition: 'ready',
sourceRunId: 'source-run-1',
sourceTurnId: 'source-turn-1',
sourceRuntimeEventHighWater: 1,
} as OperationOutput<K>;
}
if (operation === 'session.configuration.update') {
const update = input as OperationInput<'session.configuration.update'>;
const outcome = this.configurationOutcomes.shift();
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); fix(cli): discover resumable sessions from /resume by mikemikimike · Pull Request #3582 · apache/maka · GitHub
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
206 changes: 206 additions & 0 deletions packages/cli/src/__tests__/pi-tui-runner.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3976,6 +3976,179 @@ describe('Maka Pi TUI runner', () => {
]);
});

test('/resume opens a picker containing only resumable sessions when none is attached', async () => {
const terminal = new FakeTerminal();
const resumable = fakeSessionSummary('resumable', '/repo');
const unavailable = fakeSessionSummary('unavailable', '');
const driver = new SlashCommandDriver([resumable, unavailable]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
const output = plainTerminalOutput(terminal.output());
assert.match(output, /resumabl/);
assert.doesNotMatch(output, /unavailable/);

terminal.input('\r');
await waitFor(() => driver.resumeCalls === 1);
terminal.input('/exit');
terminal.input('\r');
await run;
});

test('/resume does not resume after a stale selection fails to switch', async () => {
const terminal = new FakeTerminal();
const session = fakeSessionSummary('stale', '/repo');
const driver = new RejectingSwitchSessionDriver([session]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
terminal.input('\r');
await waitFor(() => driver.switchCalls === 1);
await delay(0);
assert.equal(driver.resumeCalls, 0);

exitMaka(terminal);
await run;
});

test('/resume bounds concurrent resumability checks for large session catalogs', async () => {
const terminal = new FakeTerminal();
const sessions = Array.from({ length: 24 }, (_, index) =>
fakeSessionSummary(`session-${index}`, '/repo'),
);
const driver = new BoundedResumeAvailabilityDriver(sessions);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
assert.ok(driver.availabilityCalls >= sessions.length);
assert.ok(driver.maxActiveCalls <= 8);

terminal.input('\x1b');
exitMaka(terminal);
await run;
});

test('/resume excludes foreign sessions when none is attached', async () => {
const terminal = new FakeTerminal();
const driver = new SlashCommandDriver([]);
(driver as unknown as { sessionId: string | null }).sessionId = null;
const foreignSession = {
source: 'claude-code' as const,
id: 'foreign-resume',
title: 'Foreign interrupted work',
cwd: '/repo',
updatedAtMs: Date.now(),
transcriptPath: '/home/u/.claude/projects/-repo/foreign-resume.jsonl',
};
let listSessionsCalls = 0;
let readDigestCalls = 0;
const foreignSessions = {
availableSources: async () => ['claude-code' as const],
listSessions: async () => {
listSessionsCalls += 1;
return [foreignSession];
},
readDigest: async () => {
readDigestCalls += 1;
throw new Error('foreign import must not run from /resume');
},
};
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
foreignSessions,
});

terminal.input('/resume');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
const output = plainTerminalOutput(terminal.output());
assert.doesNotMatch(output, /Foreign interrupted work/);
assert.equal(listSessionsCalls, 0);

terminal.input('\x1b');
terminal.input('/exit');
terminal.input('\r');
await run;
assert.equal(readDigestCalls, 0);
assert.equal(driver.startNewSessionCalls, 0);
assert.equal(driver.prompts.length, 0);
});

test('/session keeps attachable rows when resume discovery fails for another session', async () => {
const terminal = new FakeTerminal();
const attachable = fakeSessionSummary('attachable', '/repo');
const archived = fakeSessionSummary('archived', '/repo');
const driver = new SlashCommandDriver([attachable, archived]);
driver.getSessionResumeAvailability = async (session) => {
if (session.id === archived.id) throw new Error('session archived');
return { available: false, reason: 'no resumable turn' };
};
const run = runMakaPiTui({
title: 'Maka',
driver,
cwd: '/repo',
model: 'm',
connectionSlug: 'c',
permissionMode: 'bypass',
terminal,
});

terminal.input('/session');
terminal.input('\r');
await waitFor(() => plainTerminalOutput(terminal.output()).includes('Resume Session Current'));
assert.match(plainTerminalOutput(terminal.output()), /attachab/);

let switched = false;
try {
terminal.input('\r');
await waitFor(() => driver.sessionIds.includes(attachable.id));
switched = true;
} finally {
exitMaka(terminal);
await run;
}
assert.equal(switched, true);
});

test('surfaces a notice when the foreign-session scan fails', async () => {
const terminal = new FakeTerminal();
const driver = new SlashCommandDriver([]);
Expand DownExpand Up@@ -4588,6 +4761,7 @@ describe('Maka Pi TUI runner', () => {
driver.releaseList();
// The rendered picker is the observable arming signal for the Escape.
await waitFor(() => plainTerminalOutput(terminal.screenOutput()).includes('Existing chat'));
assert.equal(driver.listCalls, 1);

terminal.input('\x1b');
exitMaka(terminal);
Expand DownExpand Up@@ -8419,6 +8593,32 @@ class SlashCommandDriver extends FakeSessionDriver {
}
}

class RejectingSwitchSessionDriver extends SlashCommandDriver {
switchCalls = 0;

override async switchSession(_sessionId: string): Promise<MakaSessionSwitchResult> {
this.switchCalls += 1;
throw new Error('session became unavailable');
}
}

class BoundedResumeAvailabilityDriver extends SlashCommandDriver {
availabilityCalls = 0;
activeCalls = 0;
maxActiveCalls = 0;

async getSessionResumeCandidateAvailability(
_session: SessionSummary,
): Promise<SessionResumeAvailability> {
this.availabilityCalls += 1;
this.activeCalls += 1;
this.maxActiveCalls = Math.max(this.maxActiveCalls, this.activeCalls);
await delay(1);
this.activeCalls -= 1;
return { available: true };
}
}

class UserCommandDriver extends SlashCommandDriver {
readonly commands: string[] = [];

Expand DownExpand Up@@ -9133,6 +9333,12 @@ class DeferredListSessionsDriver extends SlashCommandDriver {
listCalls = 0;
private resolveList: (() => void) | null = null;

async getSessionResumeCandidateAvailability(
_session: SessionSummary,
): Promise<SessionResumeAvailability> {
return { available: true };
}

override async listSessions(): Promise<SessionSummary[]> {
this.listCalls += 1;
await new Promise<void>((resolve) => {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2636,6 +2636,15 @@ class FakeConnection {
goal: this.goalQueryResults.shift() ?? null,
} as OperationOutput<K>;
}
if (operation === 'turn.resume.query') {
return {
sessionId: (input as OperationInput<'turn.resume.query'>).sessionId,
disposition: 'ready',
sourceRunId: 'source-run-1',
sourceTurnId: 'source-turn-1',
sourceRuntimeEventHighWater: 1,
} as OperationOutput<K>;
}
if (operation === 'session.configuration.update') {
const update = input as OperationInput<'session.configuration.update'>;
const outcome = this.configurationOutcomes.shift();
Expand Down
Loading