From 510f4087d169fe56b8ce12a8cecd0c38a6d3a469 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 21 May 2026 10:32:11 +0000 Subject: [PATCH 1/3] Initial plan From 5160ac56ebabd81b1f05a3f7cd2faa1c8455f1c7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 21 May 2026 10:49:21 +0000 Subject: [PATCH 2/3] feat: add primary session cross-device resume flow Agent-Logs-Url: https://github.com/devartifex/copilot-unleashed/sessions/d16d9f1c-b9e8-4621-8531-aa508db3f7f8 --- .../chat/ContinueSessionBanner.svelte | 70 +++++++++++++++++ src/lib/server/chat-state-store.test.ts | 24 ++++++ src/lib/server/chat-state-store.ts | 40 +++++++++- src/lib/server/ws/handler.ts | 26 +++++++ src/lib/server/ws/message-handlers/chat.ts | 24 +++++- .../server/ws/message-handlers/mode-model.ts | 2 + .../server/ws/message-handlers/new-session.ts | 7 ++ .../ws/message-handlers/resume-session.ts | 11 +++ src/lib/server/ws/session-events.ts | 9 +++ src/lib/server/ws/session-pool.ts | 1 + src/lib/stores/chat.svelte.ts | 46 +++++++++++ src/lib/stores/chat.test.ts | 36 +++++++++ src/lib/types/server-messages.ts | 17 +++++ src/lib/types/state.ts | 9 +++ src/routes/+page.svelte | 76 ++++++++++++++++++- tests/chat-messaging.spec.ts | 61 +++++++++++++++ tests/helpers.ts | 6 ++ 17 files changed, 460 insertions(+), 5 deletions(-) create mode 100644 src/lib/components/chat/ContinueSessionBanner.svelte diff --git a/src/lib/components/chat/ContinueSessionBanner.svelte b/src/lib/components/chat/ContinueSessionBanner.svelte new file mode 100644 index 0000000..e49a503 --- /dev/null +++ b/src/lib/components/chat/ContinueSessionBanner.svelte @@ -0,0 +1,70 @@ + + +
+ + diff --git a/src/lib/server/chat-state-store.test.ts b/src/lib/server/chat-state-store.test.ts index 523961c..d68370e 100644 --- a/src/lib/server/chat-state-store.test.ts +++ b/src/lib/server/chat-state-store.test.ts @@ -254,4 +254,28 @@ describe('ChatStateStore', () => { spy.mockRestore(); }); }); + + describe('primary session metadata', () => { + it('saves and loads the primary session file', async () => { + const store = createChatStateStore(tempDir); + const session = { + tabId: 'tab-2', + sdkSessionId: 'sdk-abc', + model: 'gpt-4.1', + mode: 'interactive', + updatedAt: Date.now() + }; + + await store.setPrimarySession('user-1', session); + const loaded = await store.getPrimarySession('user-1'); + + expect(loaded).toEqual(session); + }); + + it('returns null when no primary session exists', async () => { + const store = createChatStateStore(tempDir); + const loaded = await store.getPrimarySession('missing-user'); + expect(loaded).toBeNull(); + }); + }); }); diff --git a/src/lib/server/chat-state-store.ts b/src/lib/server/chat-state-store.ts index 709924b..0de3b37 100644 --- a/src/lib/server/chat-state-store.ts +++ b/src/lib/server/chat-state-store.ts @@ -15,6 +15,14 @@ export interface PersistedChatState { updatedAt: number; } +export interface PrimarySessionState { + tabId: string; + sdkSessionId: string | null; + model: string; + mode: string; + updatedAt: number; +} + export interface ChatStateStore { save(userId: string, tabId: string, state: PersistedChatState): Promise