Skip to content

feat: Copilot Chat MVP#25

Merged
ianphil merged 11 commits intomainfrom
feature/copilot-chat-mvp
Feb 7, 2026
Merged

feat: Copilot Chat MVP#25
ianphil merged 11 commits intomainfrom
feature/copilot-chat-mvp

Conversation

@ianphil
Copy link
Copy Markdown
Contributor

@ianphil ianphil commented Feb 7, 2026

Summary

Adds integrated GitHub Copilot chat to Vibe Playground using @github/copilot-sdk.

Features

  • Chat interface — Copilot Chat button in left pane, streamed responses in center pane
  • Multiple conversations — create, switch, rename, delete conversations in the right pane
  • Persistence — conversations saved as JSON files, restored on restart
  • Model picker — per-conversation model selection with dropdown below textarea
  • Send/Stop button — toggles between send and stop icons; stop cancels in-flight SDK requests
  • CI workflow — PR validation with lint, build, and test checks

Technical Details

  • Copilot SDK runs in Electron main process, streams to renderer via IPC
  • Each conversation gets its own SDK session (clean AI context)
  • Session recreation on model change; last-used model remembered via localStorage
  • session.abort() used for cancellation with AbortController gating callbacks
  • SessionService migrated to v3 with activeConversationId

Ian Philpot added 11 commits February 6, 2026 22:34
- Add persistent Chat button in left pane (below agents header)
- ChatView component with streaming message display
- CenterPane/RightPane switch based on viewMode (agents vs chat)
- CopilotService wrapping @github/copilot-sdk in main process
- IPC bridge for streaming chat (copilot:send/chunk/done/error)
- New state: viewMode, chatMessages, chatLoading with reducer actions
- All 189 tests passing across 16 suites
Webpack's CJS bundle can't require() an ESM-only package.
Use new Function('return import(...)') to bypass webpack's
module resolution and let Node.js handle the ESM import at runtime.
- Replace send() + session.idle listener with sendAndWait()
- Properly unsubscribe delta handler after response completes
- Fallback to full response content if no streaming deltas received
- Await sendMessage in IPC handler for proper error propagation
- Add ConversationService for CRUD on individual JSON files in userData/conversations/
- Refactor CopilotService to support multiple SDK sessions (one per conversation)
- Add conversation IPC handlers (list/load/save/delete/rename)
- Extend AppState with conversations list, activeConversationId, and new reducer actions
- Update ChatView to auto-create conversations on first message and save on completion
- Replace RightPane placeholder with full conversation list UI (new/switch/rename/delete)
- Restore conversation list and active conversation on app restart
- Migrate SessionService to v3 with activeConversationId
- Update README with Copilot Chat feature documentation
- Add model picker dropdown below chat textarea (shows 'ModelName ▾')
- Fetch available models from Copilot SDK via new listModels() API
- Per-conversation model selection, persisted in conversation JSON files
- Recreate SDK session when model changes mid-conversation
- New conversations default to last-used model (stored in localStorage)
- Restore model selection when switching conversations or on app restart
- Disable picker during streaming to prevent race conditions
- Toggle between send icon (idle) and stop-circle icon (streaming)
- Stop button cancels in-flight SDK request via session.abort()
- Textarea stays enabled during streaming for type-ahead
- Stop button has red accent hover styling
- Add copilot:stop IPC channel and preload API
- Add Copilot Chat screenshot to README
- Downgrade no-empty-function and no-inferrable-types to warnings
- Fix invalid eslint-disable-line rule reference in ChatView
@ianphil ianphil merged commit 6ffbcf1 into main Feb 7, 2026
1 check passed
@ianphil ianphil deleted the feature/copilot-chat-mvp branch February 7, 2026 17:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant