Revert to v2.18.10 - Remove session persistence (v2.19.0-v2.19.5) (#322)

After 5 consecutive hotfix attempts, session persistence has proven
architecturally incompatible with the MCP SDK. Rolling back to last
known stable version.

## Removed
- 16 new files (session types, docs, tests, planning docs)
- 1,100+ lines of session persistence code
- Session restoration hooks and lifecycle events
- Retry policy and warm-start implementations

## Restored
- Stable v2.18.10 codebase
- Library export fields (from PR #310)
- All core MCP functionality

## Breaking Changes
- Session persistence APIs removed
- onSessionNotFound hook removed
- Session lifecycle events removed

This reverts commits fe13091 through 1d34ad8.
Restores commit 4566253 (v2.18.10, PR #310).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Romuald Członkowski
2025-10-14 10:13:43 +02:00
committed by GitHub
parent fe1309151a
commit 8d20c64f5c
25 changed files with 97 additions and 13086 deletions

View File

@@ -631,16 +631,15 @@ describe('HTTP Server Session Management', () => {
describe('Transport Management', () => {
it('should handle transport cleanup on close', async () => {
server = new SingleSessionHTTPServer();
// Test the transport cleanup mechanism by calling removeSession directly
// Test the transport cleanup mechanism by setting up a transport with onclose
const sessionId = 'test-session-id-1234-5678-9012-345678901234';
const mockTransport = {
close: vi.fn().mockResolvedValue(undefined),
sessionId,
onclose: undefined as (() => void) | undefined,
onerror: undefined as ((error: Error) => void) | undefined
onclose: null as (() => void) | null
};
(server as any).transports[sessionId] = mockTransport;
(server as any).servers[sessionId] = {};
(server as any).sessionMetadata[sessionId] = {
@@ -648,16 +647,18 @@ describe('HTTP Server Session Management', () => {
createdAt: new Date()
};
// Directly call removeSession to test cleanup behavior
await (server as any).removeSession(sessionId, 'transport_closed');
// Set up the onclose handler like the real implementation would
mockTransport.onclose = () => {
(server as any).removeSession(sessionId, 'transport_closed');
};
// Verify cleanup completed
// Simulate transport close
if (mockTransport.onclose) {
await mockTransport.onclose();
}
// Verify cleanup was triggered
expect((server as any).transports[sessionId]).toBeUndefined();
expect((server as any).servers[sessionId]).toBeUndefined();
expect((server as any).sessionMetadata[sessionId]).toBeUndefined();
expect(mockTransport.close).toHaveBeenCalled();
expect(mockTransport.onclose).toBeUndefined();
expect(mockTransport.onerror).toBeUndefined();
});
it('should handle multiple concurrent sessions', async () => {