Skip to content

Commit 8643f33

Browse files
committed
refactor: remove hardcoded 'kees' name, use 'wingman' consistently
'kees' was a personal name for the AI assistant. Replace all non-migration references with the generic 'wingman' identifier. Config migration code preserved for backward compatibility.
1 parent 92d71c0 commit 8643f33

12 files changed

Lines changed: 25 additions & 25 deletions

File tree

shell/chat/claude-activity-backend.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ class ClaudeActivityBackend {
112112
if (m.id > this._lastSeenId) {
113113
this._lastSeenId = m.id;
114114
// Only emit Claude messages (not our own robin messages) during polling
115-
if (m.from === 'claude' || m.from === 'kees') {
115+
if (m.from === 'claude' || m.from === 'wingman') {
116116
this._emit('message', {
117117
id: m.id.toString(),
118118
role: 'assistant',

shell/js/wingman.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,8 @@
190190
else if (event.data.title) text = `${event.type}: ${event.data.title}`;
191191

192192
const rawSource = event.data.source || 'robin';
193-
const source = ['kees', 'robin'].includes(rawSource) ? rawSource : 'robin';
194-
const sourceEmoji = source === 'kees' ? '🤖' : '👤';
193+
const source = ['wingman', 'robin'].includes(rawSource) ? rawSource : 'robin';
194+
const sourceEmoji = source === 'wingman' ? '🤖' : '👤';
195195
const item = document.createElement('div');
196196
item.className = 'activity-item';
197197
item.innerHTML = `<span class="a-icon">${icon}</span><span class="a-source ${source}">${sourceEmoji}</span><span class="a-text">${escapeHtml(text)}</span><span class="a-time">${time}</span>`;
@@ -207,7 +207,7 @@
207207
if (id === data.tabId) {
208208
const sourceEl = entry.tabEl.querySelector('.tab-source');
209209
if (sourceEl) {
210-
if (data.source === 'kees') {
210+
if (data.source === 'wingman') {
211211
sourceEl.textContent = '🤖';
212212
sourceEl.title = 'AI controlled — click to take over';
213213
sourceEl.style.display = '';
@@ -218,7 +218,7 @@
218218
}
219219
}
220220
// Visual indicator: purple bottom border for AI tabs
221-
if (data.source === 'kees') {
221+
if (data.source === 'wingman') {
222222
entry.tabEl.style.borderBottom = '2px solid #7c3aed';
223223
} else {
224224
entry.tabEl.style.borderBottom = '';
@@ -1019,7 +1019,7 @@
10191019
// msg: {id, from, text, timestamp, image}
10201020
// Skip robin messages — already shown optimistically in the UI
10211021
if (msg.from === 'robin') return;
1022-
const source = msg.from; // 'kees' or 'claude'
1022+
const source = msg.from; // 'wingman' or 'claude'
10231023
appendMessage('assistant', msg.text, msg.timestamp, source, msg.image);
10241024
if (messagesEl) messagesEl.scrollTop = messagesEl.scrollHeight;
10251025
});

src/api/routes/media.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ export function registerMediaRoutes(router: Router, ctx: RouteContext): void {
8080
router.post('/chat', (req: Request, res: Response) => {
8181
const { text, from, image } = req.body;
8282
if (!text && !image) { res.status(400).json({ error: 'text or image required' }); return; }
83-
const sender: 'robin' | 'wingman' | 'kees' | 'claude' = (from === 'robin') ? 'robin' : (from === 'claude') ? 'claude' : 'wingman';
83+
const sender: 'robin' | 'wingman' | 'claude' = (from === 'robin') ? 'robin' : (from === 'claude') ? 'claude' : 'wingman';
8484
try {
8585
let savedImage: string | undefined;
8686
if (image) {

src/api/routes/tabs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export function registerTabRoutes(router: Router, ctx: RouteContext): void {
3131
return;
3232
}
3333
try {
34-
const tabSource = source === 'kees' || source === 'wingman' ? 'wingman' as const : 'robin' as const;
34+
const tabSource = source === 'wingman' ? 'wingman' as const : 'robin' as const;
3535
const tab = await ctx.tabManager.openTab(
3636
url,
3737
groupId,

src/api/tests/routes/tabs.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,15 +85,15 @@ describe('Tab Routes', () => {
8585
);
8686
});
8787

88-
it('maps "kees" source to wingman', async () => {
88+
it('maps unknown source to robin', async () => {
8989
await request(app)
9090
.post('/tabs/open')
91-
.send({ source: 'kees' });
91+
.send({ source: 'unknown' });
9292

9393
expect(ctx.tabManager.openTab).toHaveBeenCalledWith(
9494
'about:blank',
9595
undefined,
96-
'wingman',
96+
'robin',
9797
'persist:tandem',
9898
true,
9999
undefined,

src/context-menu/menu-builder.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -621,9 +621,9 @@ export class ContextMenuBuilder {
621621
}));
622622
const currentSource = this.deps.tabManager.getTabSource(tabId);
623623
menu.append(new MenuItem({
624-
label: currentSource === 'kees' ? 'Take back from Wingman' : 'Let Wingman handle this tab',
624+
label: currentSource === 'wingman' ? 'Take back from Wingman' : 'Let Wingman handle this tab',
625625
click: () => {
626-
const newSource = this.deps.tabManager.getTabSource(tabId) === 'kees' ? 'robin' : 'kees';
626+
const newSource = this.deps.tabManager.getTabSource(tabId) === 'wingman' ? 'robin' : 'wingman';
627627
this.deps.tabManager.setTabSource(tabId, newSource);
628628
},
629629
}));

src/context-menu/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export interface ContextMenuParams {
3434
};
3535
// Tandem-specific
3636
tabId?: string;
37-
tabSource?: 'robin' | 'kees' | 'wingman';
37+
tabSource?: 'robin' | 'wingman';
3838
}
3939

4040
/**

src/ipc/handlers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ export function registerIpcHandlers(deps: IpcDeps): void {
153153
});
154154

155155
ipcMain.handle(IpcChannels.CHAT_PERSIST_MESSAGE, async (_event, data: {
156-
from: 'robin' | 'wingman' | 'kees' | 'claude';
156+
from: 'robin' | 'wingman' | 'claude';
157157
text?: string;
158158
image?: string;
159159
notifyWebhook?: boolean;

src/panel/manager.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export interface ActivityEvent {
2020

2121
export interface ChatMessage {
2222
id: number;
23-
from: 'robin' | 'wingman' | 'kees' | 'claude';
23+
from: 'robin' | 'wingman' | 'claude';
2424
text: string;
2525
timestamp: number;
2626
image?: string; // relative filename in ~/.tandem/chat-images/
@@ -114,7 +114,7 @@ export class PanelManager {
114114

115115
/** Add a chat message */
116116
addChatMessage(
117-
from: 'robin' | 'wingman' | 'kees' | 'claude',
117+
from: 'robin' | 'wingman' | 'claude',
118118
text: string,
119119
image?: string,
120120
opts: AddChatMessageOptions = {},
@@ -132,7 +132,7 @@ export class PanelManager {
132132
this.win.webContents.send(IpcChannels.CHAT_MESSAGE, msg);
133133
}
134134
// Clear typing indicator when wingman sends a message
135-
if ((from === 'wingman' || from === 'kees') && this.wingmanTyping) {
135+
if (from === 'wingman' && this.wingmanTyping) {
136136
this.setWingmanTyping(false);
137137
}
138138

src/preload/panel.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export function createPanelApi() {
2828
},
2929
sendChatImage: (text: string, image: string) => ipcRenderer.invoke(IpcChannels.CHAT_SEND_IMAGE, { text, image }),
3030
persistChatMessage: (data: {
31-
from: 'robin' | 'wingman' | 'kees' | 'claude';
31+
from: 'robin' | 'wingman' | 'claude';
3232
text?: string;
3333
image?: string;
3434
notifyWebhook?: boolean;

0 commit comments

Comments
 (0)