From e4b51b4683399cff7398c13d879c493f69f20137 Mon Sep 17 00:00:00 2001 From: Jan Burzinski <156842394+janburzinski@users.noreply.github.com> Date: Wed, 24 Jun 2026 07:02:52 +0200 Subject: [PATCH 1/6] fix(agents): refresh provider metadata --- .../conversations/conversation-title-utils.ts | 18 ++++++-- .../tests/conversation-title-utils.test.ts | 7 ++++ .../agents/agent-provider-registry.test.ts | 31 ++++++++++++++ .../core/agents/agent-provider-registry.ts | 18 ++++---- .../plugins/src/agents/impl/index.test.ts | 41 +++++++++++++++++++ .../plugins/src/agents/impl/kimi/index.ts | 12 +++--- .../plugins/src/agents/impl/rovo/index.ts | 13 +++--- 7 files changed, 117 insertions(+), 23 deletions(-) diff --git a/apps/emdash-desktop/src/renderer/features/tasks/conversations/conversation-title-utils.ts b/apps/emdash-desktop/src/renderer/features/tasks/conversations/conversation-title-utils.ts index e4d24999f4..d9d2153661 100644 --- a/apps/emdash-desktop/src/renderer/features/tasks/conversations/conversation-title-utils.ts +++ b/apps/emdash-desktop/src/renderer/features/tasks/conversations/conversation-title-utils.ts @@ -1,4 +1,4 @@ -import { type AgentProviderId } from '@shared/core/agents/agent-provider-registry'; +import { getProvider, type AgentProviderId } from '@shared/core/agents/agent-provider-registry'; type ConversationTitleInput = { providerId: AgentProviderId; @@ -9,8 +9,18 @@ function capitalizeProviderId(providerId: AgentProviderId): string { return `${providerId.charAt(0).toUpperCase()}${providerId.slice(1)}`; } +function escapeRegExp(value: string): string { + return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +function getDefaultTitlePrefix(providerId: AgentProviderId): string { + return getProvider(providerId)?.name ?? capitalizeProviderId(providerId); +} + function parseDefaultTitleIndex(title: string, providerId: AgentProviderId): number | null { - const match = title.match(new RegExp(`^${providerId} \\(([1-9]\\d*)\\)$`, 'i')); + const prefixes = [providerId, capitalizeProviderId(providerId), getDefaultTitlePrefix(providerId)]; + const pattern = prefixes.map(escapeRegExp).join('|'); + const match = title.match(new RegExp(`^(?:${pattern}) \\(([1-9]\\d*)\\)$`, 'i')); if (!match) return null; const rawIndex = match[1]; @@ -26,7 +36,7 @@ export function formatConversationTitleForDisplay( ): string { const index = parseDefaultTitleIndex(title, providerId); if (index === null) return title; - return `${capitalizeProviderId(providerId)} (${index})`; + return `${getDefaultTitlePrefix(providerId)} (${index})`; } export function nextDefaultConversationTitle( @@ -44,5 +54,5 @@ export function nextDefaultConversationTitle( let next = 1; while (used.has(next)) next += 1; - return `${capitalizeProviderId(providerId)} (${next})`; + return `${getDefaultTitlePrefix(providerId)} (${next})`; } diff --git a/apps/emdash-desktop/src/renderer/tests/conversation-title-utils.test.ts b/apps/emdash-desktop/src/renderer/tests/conversation-title-utils.test.ts index b0ac8d1e61..e2f99c8b2c 100644 --- a/apps/emdash-desktop/src/renderer/tests/conversation-title-utils.test.ts +++ b/apps/emdash-desktop/src/renderer/tests/conversation-title-utils.test.ts @@ -39,6 +39,13 @@ describe('nextDefaultConversationTitle', () => { expect(formatConversationTitleForDisplay('gemini', 'gemini (1)')).toBe('Gemini (1)'); }); + it('uses provider display names for default titles', () => { + expect(formatConversationTitleForDisplay('kimi', 'Kimi (1)')).toBe('Kimi Code (1)'); + expect(nextDefaultConversationTitle('kimi', [{ providerId: 'kimi', title: 'Kimi (1)' }])).toBe( + 'Kimi Code (2)' + ); + }); + it('leaves custom conversation titles unchanged', () => { expect(formatConversationTitleForDisplay('codex', 'release-triage')).toBe('release-triage'); }); diff --git a/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.test.ts b/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.test.ts index 99556ae9a3..6a97d3efb9 100644 --- a/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.test.ts +++ b/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.test.ts @@ -19,6 +19,37 @@ describe('AGENT_PROVIDERS', () => { }); }); + it('uses current Kimi Code install metadata', () => { + const kimi = AGENT_PROVIDERS.find((provider) => provider.id === 'kimi'); + + expect(kimi).toMatchObject({ + name: 'Kimi Code', + docUrl: 'https://moonshotai.github.io/kimi-code/en/guides/getting-started.html', + installCommand: 'curl -fsSL https://code.kimi.com/kimi-code/install.sh | bash', + }); + }); + + it('uses current Rovo Dev ACLI install and launch metadata', () => { + const rovo = AGENT_PROVIDERS.find((provider) => provider.id === 'rovo'); + + expect(rovo).toMatchObject({ + installCommand: 'brew tap atlassian/homebrew-acli && brew install acli', + commands: ['acli'], + cli: 'acli', + defaultArgs: ['rovodev', 'run'], + autoApproveFlag: '--yolo', + }); + }); + + it('uses current Junie install metadata', () => { + const junie = AGENT_PROVIDERS.find((provider) => provider.id === 'junie'); + + expect(junie).toMatchObject({ + docUrl: 'https://junie.jetbrains.com/docs/junie-cli.html', + installCommand: 'curl -fsSL https://junie.jetbrains.com/install.sh | bash', + }); + }); + it('validates Amp provider session ids as thread ids', () => { expect(isValidProviderSessionId('amp', 'T-d2fc4acc-dd1d-497f-9609-ed0da22a7c95')).toBe(true); expect(isValidProviderSessionId('amp', 'not-a-thread')).toBe(false); diff --git a/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.ts b/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.ts index 0ccd250192..f53be25dd2 100644 --- a/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.ts +++ b/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.ts @@ -437,11 +437,11 @@ export const AGENT_PROVIDERS: AgentProviderDefinition[] = [ }, { id: 'kimi', - name: 'Kimi', + name: 'Kimi Code', description: - 'Kimi CLI by Moonshot AI, with shell execution, Zsh integration, ACP, and MCP support.', - docUrl: 'https://moonshotai.github.io/kimi-cli/en/guides/getting-started.html', - installCommand: 'curl -LsSf https://code.kimi.com/install.sh | bash', + 'Kimi Code CLI by Moonshot AI, with shell execution, ACP, MCP, plugins, subagents, and lifecycle hooks.', + docUrl: 'https://moonshotai.github.io/kimi-code/en/guides/getting-started.html', + installCommand: 'curl -fsSL https://code.kimi.com/kimi-code/install.sh | bash', commands: ['kimi'], versionArgs: ['--version'], cli: 'kimi', @@ -452,7 +452,7 @@ export const AGENT_PROVIDERS: AgentProviderDefinition[] = [ sessionIdOnResumeOnly: true, resumeWithoutSessionFlag: '-C', icon: 'kimi.svg', - alt: 'Kimi CLI', + alt: 'Kimi Code CLI', terminalOnly: true, supportsHooks: true, }, @@ -502,11 +502,13 @@ export const AGENT_PROVIDERS: AgentProviderDefinition[] = [ description: 'Atlassian Rovo Dev CLI integrates terminal assistance with Jira, Confluence, and Bitbucket workflows.', docUrl: 'https://support.atlassian.com/rovo/docs/install-and-run-rovo-dev-cli-on-your-device/', - installCommand: 'acli rovodev auth login', - commands: ['rovodev', 'acli'], + installCommand: 'brew tap atlassian/homebrew-acli && brew install acli', + commands: ['acli'], versionArgs: ['--version'], + cli: 'acli', + defaultArgs: ['rovodev', 'run'], autoApproveFlag: '--yolo', - autoStartCommand: 'acli rovodev run', + initialPromptFlag: '', icon: 'atlassian.png', alt: 'Rovo Dev CLI', terminalOnly: true, diff --git a/packages/plugins/src/agents/impl/index.test.ts b/packages/plugins/src/agents/impl/index.test.ts index 414172432d..b8384ac7d0 100644 --- a/packages/plugins/src/agents/impl/index.test.ts +++ b/packages/plugins/src/agents/impl/index.test.ts @@ -154,4 +154,45 @@ describe('pluginRegistry', () => { releaseSource: { kind: 'npm', package: '@ampcode/cli' }, }); }); + + it('uses current Kimi Code install and update metadata', () => { + const kimi = pluginRegistry.get('kimi')!; + + expect(kimi.metadata.name).toBe('Kimi Code'); + expect(kimi.metadata.websiteUrl).toBe( + 'https://moonshotai.github.io/kimi-code/en/guides/getting-started.html' + ); + expect(kimi.capabilities.hostDependency.installCommands.macos?.[0]?.command).toBe( + 'curl -fsSL https://code.kimi.com/kimi-code/install.sh | bash' + ); + expect(kimi.capabilities.hostDependency.updates).toMatchObject({ + kind: 'supported', + releaseSource: { kind: 'github', repo: 'moonshotai/kimi-code' }, + }); + }); + + it('uses current Rovo Dev ACLI install and launch metadata', () => { + const rovo = pluginRegistry.get('rovo')!; + + expect(rovo.capabilities.hostDependency.binaryNames).toEqual(['acli']); + expect(rovo.capabilities.hostDependency.installCommands.macos?.[0]).toMatchObject({ + method: 'homebrew', + command: 'brew tap atlassian/homebrew-acli && brew install acli', + }); + + const command = rovo.behavior.prompt!.buildCommand({ + cli: 'acli', + autoApprove: true, + initialPrompt: 'Fix the bug', + sessionId: '', + isResuming: false, + model: '', + }); + + expect(command).toEqual({ + command: 'acli', + args: ['rovodev', 'run', '--yolo', 'Fix the bug'], + env: {}, + }); + }); }); diff --git a/packages/plugins/src/agents/impl/kimi/index.ts b/packages/plugins/src/agents/impl/kimi/index.ts index 9245595c88..2e45c141d1 100644 --- a/packages/plugins/src/agents/impl/kimi/index.ts +++ b/packages/plugins/src/agents/impl/kimi/index.ts @@ -29,10 +29,10 @@ import { icon } from './icon'; export const plugin = definePlugin( { id: 'kimi', - name: 'Kimi', + name: 'Kimi Code', description: - 'Kimi CLI by Moonshot AI, with shell execution, Zsh integration, ACP, and MCP support.', - websiteUrl: 'https://moonshotai.github.io/kimi-cli/en/guides/getting-started.html', + 'Kimi Code CLI by Moonshot AI, with shell execution, ACP, MCP, plugins, subagents, and lifecycle hooks.', + websiteUrl: 'https://moonshotai.github.io/kimi-code/en/guides/getting-started.html', }, { autoApprove: { @@ -50,13 +50,13 @@ export const plugin = definePlugin( macos: [ { method: 'curl', - command: 'curl -LsSf https://code.kimi.com/install.sh | bash', + command: 'curl -fsSL https://code.kimi.com/kimi-code/install.sh | bash', }, ], linux: [ { method: 'curl', - command: 'curl -LsSf https://code.kimi.com/install.sh | bash', + command: 'curl -fsSL https://code.kimi.com/kimi-code/install.sh | bash', }, ], }, @@ -64,7 +64,7 @@ export const plugin = definePlugin( kind: 'supported', releaseSource: { kind: 'github', - repo: 'moonshotai/kimi-cli', + repo: 'moonshotai/kimi-code', }, update: { kind: 'package-manager', diff --git a/packages/plugins/src/agents/impl/rovo/index.ts b/packages/plugins/src/agents/impl/rovo/index.ts index 77850bcf11..06f1d54837 100644 --- a/packages/plugins/src/agents/impl/rovo/index.ts +++ b/packages/plugins/src/agents/impl/rovo/index.ts @@ -17,18 +17,19 @@ export const plugin = definePlugin( }, hostDependency: { id: 'rovo', - binaryNames: ['rovodev', 'acli'], + binaryNames: ['acli'], installCommands: { macos: [ { - method: 'other', - command: 'acli rovodev auth login', + method: 'homebrew', + command: 'brew tap atlassian/homebrew-acli && brew install acli', }, ], linux: [ { - method: 'other', - command: 'acli rovodev auth login', + method: 'apt', + command: + 'sudo apt-get install -y wget gnupg2 && sudo mkdir -p -m 755 /etc/apt/keyrings && wget -nv -O- https://acli.atlassian.com/gpg/public-key.asc | sudo gpg --dearmor -o /etc/apt/keyrings/acli-archive-keyring.gpg && sudo chmod go+r /etc/apt/keyrings/acli-archive-keyring.gpg && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/acli-archive-keyring.gpg] https://acli.atlassian.com/linux/deb stable main" | sudo tee /etc/apt/sources.list.d/acli.list > /dev/null && sudo apt update && sudo apt install -y acli', }, ], }, @@ -51,7 +52,9 @@ export const provider = registerPluginBehavior(plugin, { prompt: { buildCommand: (ctx) => buildStandardCommand(ctx, { + defaultArgs: ['rovodev', 'run'], autoApproveFlag: '--yolo', + initialPromptFlag: '', }), }, }); From 848feae0652403db33a659537040a4c82e454695 Mon Sep 17 00:00:00 2001 From: Jan Burzinski <156842394+janburzinski@users.noreply.github.com> Date: Wed, 24 Jun 2026 07:48:55 +0200 Subject: [PATCH 2/6] test(agents): remove outdated provider metadata assertions --- .../agents/agent-provider-registry.test.ts | 30 ------------------- .../plugins/src/agents/impl/index.test.ts | 15 ---------- 2 files changed, 45 deletions(-) diff --git a/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.test.ts b/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.test.ts index 6a97d3efb9..b2df759412 100644 --- a/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.test.ts +++ b/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.test.ts @@ -19,36 +19,6 @@ describe('AGENT_PROVIDERS', () => { }); }); - it('uses current Kimi Code install metadata', () => { - const kimi = AGENT_PROVIDERS.find((provider) => provider.id === 'kimi'); - - expect(kimi).toMatchObject({ - name: 'Kimi Code', - docUrl: 'https://moonshotai.github.io/kimi-code/en/guides/getting-started.html', - installCommand: 'curl -fsSL https://code.kimi.com/kimi-code/install.sh | bash', - }); - }); - - it('uses current Rovo Dev ACLI install and launch metadata', () => { - const rovo = AGENT_PROVIDERS.find((provider) => provider.id === 'rovo'); - - expect(rovo).toMatchObject({ - installCommand: 'brew tap atlassian/homebrew-acli && brew install acli', - commands: ['acli'], - cli: 'acli', - defaultArgs: ['rovodev', 'run'], - autoApproveFlag: '--yolo', - }); - }); - - it('uses current Junie install metadata', () => { - const junie = AGENT_PROVIDERS.find((provider) => provider.id === 'junie'); - - expect(junie).toMatchObject({ - docUrl: 'https://junie.jetbrains.com/docs/junie-cli.html', - installCommand: 'curl -fsSL https://junie.jetbrains.com/install.sh | bash', - }); - }); it('validates Amp provider session ids as thread ids', () => { expect(isValidProviderSessionId('amp', 'T-d2fc4acc-dd1d-497f-9609-ed0da22a7c95')).toBe(true); diff --git a/packages/plugins/src/agents/impl/index.test.ts b/packages/plugins/src/agents/impl/index.test.ts index b8384ac7d0..f911013858 100644 --- a/packages/plugins/src/agents/impl/index.test.ts +++ b/packages/plugins/src/agents/impl/index.test.ts @@ -155,21 +155,6 @@ describe('pluginRegistry', () => { }); }); - it('uses current Kimi Code install and update metadata', () => { - const kimi = pluginRegistry.get('kimi')!; - - expect(kimi.metadata.name).toBe('Kimi Code'); - expect(kimi.metadata.websiteUrl).toBe( - 'https://moonshotai.github.io/kimi-code/en/guides/getting-started.html' - ); - expect(kimi.capabilities.hostDependency.installCommands.macos?.[0]?.command).toBe( - 'curl -fsSL https://code.kimi.com/kimi-code/install.sh | bash' - ); - expect(kimi.capabilities.hostDependency.updates).toMatchObject({ - kind: 'supported', - releaseSource: { kind: 'github', repo: 'moonshotai/kimi-code' }, - }); - }); it('uses current Rovo Dev ACLI install and launch metadata', () => { const rovo = pluginRegistry.get('rovo')!; From 30edf55d38ae8ab99d37e7a996382bee2a037353 Mon Sep 17 00:00:00 2001 From: Jan Burzinski <156842394+janburzinski@users.noreply.github.com> Date: Wed, 24 Jun 2026 07:57:08 +0200 Subject: [PATCH 3/6] fix(rovo): use keystroke prompt injection --- .../src/shared/core/agents/agent-provider-registry.ts | 2 +- packages/plugins/src/agents/impl/index.test.ts | 6 +++--- packages/plugins/src/agents/impl/rovo/index.ts | 4 +--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.ts b/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.ts index f53be25dd2..85b5c6310a 100644 --- a/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.ts +++ b/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.ts @@ -508,7 +508,7 @@ export const AGENT_PROVIDERS: AgentProviderDefinition[] = [ cli: 'acli', defaultArgs: ['rovodev', 'run'], autoApproveFlag: '--yolo', - initialPromptFlag: '', + useKeystrokeInjection: true, icon: 'atlassian.png', alt: 'Rovo Dev CLI', terminalOnly: true, diff --git a/packages/plugins/src/agents/impl/index.test.ts b/packages/plugins/src/agents/impl/index.test.ts index f911013858..357da1453d 100644 --- a/packages/plugins/src/agents/impl/index.test.ts +++ b/packages/plugins/src/agents/impl/index.test.ts @@ -155,8 +155,7 @@ describe('pluginRegistry', () => { }); }); - - it('uses current Rovo Dev ACLI install and launch metadata', () => { + it('uses current Rovo Dev ACLI install and interactive launch metadata', () => { const rovo = pluginRegistry.get('rovo')!; expect(rovo.capabilities.hostDependency.binaryNames).toEqual(['acli']); @@ -164,6 +163,7 @@ describe('pluginRegistry', () => { method: 'homebrew', command: 'brew tap atlassian/homebrew-acli && brew install acli', }); + expect(rovo.capabilities.prompt.kind).toBe('keystroke'); const command = rovo.behavior.prompt!.buildCommand({ cli: 'acli', @@ -176,7 +176,7 @@ describe('pluginRegistry', () => { expect(command).toEqual({ command: 'acli', - args: ['rovodev', 'run', '--yolo', 'Fix the bug'], + args: ['rovodev', 'run', '--yolo'], env: {}, }); }); diff --git a/packages/plugins/src/agents/impl/rovo/index.ts b/packages/plugins/src/agents/impl/rovo/index.ts index 06f1d54837..94e2810f64 100644 --- a/packages/plugins/src/agents/impl/rovo/index.ts +++ b/packages/plugins/src/agents/impl/rovo/index.ts @@ -38,8 +38,7 @@ export const plugin = definePlugin( }, }, prompt: { - kind: 'argv', - flag: '', + kind: 'keystroke', }, sessions: { kind: 'stateless', @@ -54,7 +53,6 @@ export const provider = registerPluginBehavior(plugin, { buildStandardCommand(ctx, { defaultArgs: ['rovodev', 'run'], autoApproveFlag: '--yolo', - initialPromptFlag: '', }), }, }); From f6a7ea4c78c1866545e91aec43e283ebf6816ac5 Mon Sep 17 00:00:00 2001 From: Jan Burzinski <156842394+janburzinski@users.noreply.github.com> Date: Wed, 24 Jun 2026 08:00:29 +0200 Subject: [PATCH 4/6] chore(format): fix desktop formatting --- .../tasks/conversations/conversation-title-utils.ts | 6 +++++- .../src/shared/core/agents/agent-provider-registry.test.ts | 1 - 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/emdash-desktop/src/renderer/features/tasks/conversations/conversation-title-utils.ts b/apps/emdash-desktop/src/renderer/features/tasks/conversations/conversation-title-utils.ts index d9d2153661..d07272b4e6 100644 --- a/apps/emdash-desktop/src/renderer/features/tasks/conversations/conversation-title-utils.ts +++ b/apps/emdash-desktop/src/renderer/features/tasks/conversations/conversation-title-utils.ts @@ -18,7 +18,11 @@ function getDefaultTitlePrefix(providerId: AgentProviderId): string { } function parseDefaultTitleIndex(title: string, providerId: AgentProviderId): number | null { - const prefixes = [providerId, capitalizeProviderId(providerId), getDefaultTitlePrefix(providerId)]; + const prefixes = [ + providerId, + capitalizeProviderId(providerId), + getDefaultTitlePrefix(providerId), + ]; const pattern = prefixes.map(escapeRegExp).join('|'); const match = title.match(new RegExp(`^(?:${pattern}) \\(([1-9]\\d*)\\)$`, 'i')); if (!match) return null; diff --git a/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.test.ts b/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.test.ts index b2df759412..99556ae9a3 100644 --- a/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.test.ts +++ b/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.test.ts @@ -19,7 +19,6 @@ describe('AGENT_PROVIDERS', () => { }); }); - it('validates Amp provider session ids as thread ids', () => { expect(isValidProviderSessionId('amp', 'T-d2fc4acc-dd1d-497f-9609-ed0da22a7c95')).toBe(true); expect(isValidProviderSessionId('amp', 'not-a-thread')).toBe(false); From 1fff34f1a0dbde7753e0d9479cdba8b46d3f0d04 Mon Sep 17 00:00:00 2001 From: Jan Burzinski <156842394+janburzinski@users.noreply.github.com> Date: Wed, 24 Jun 2026 08:03:13 +0200 Subject: [PATCH 5/6] fix(tasks): remove redundant title prefix alternative --- .../tasks/conversations/conversation-title-utils.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/emdash-desktop/src/renderer/features/tasks/conversations/conversation-title-utils.ts b/apps/emdash-desktop/src/renderer/features/tasks/conversations/conversation-title-utils.ts index d07272b4e6..87b90d4129 100644 --- a/apps/emdash-desktop/src/renderer/features/tasks/conversations/conversation-title-utils.ts +++ b/apps/emdash-desktop/src/renderer/features/tasks/conversations/conversation-title-utils.ts @@ -18,11 +18,11 @@ function getDefaultTitlePrefix(providerId: AgentProviderId): string { } function parseDefaultTitleIndex(title: string, providerId: AgentProviderId): number | null { - const prefixes = [ - providerId, - capitalizeProviderId(providerId), - getDefaultTitlePrefix(providerId), - ]; + const defaultTitlePrefix = getDefaultTitlePrefix(providerId); + const prefixes = + defaultTitlePrefix.toLowerCase() === providerId.toLowerCase() + ? [providerId] + : [providerId, defaultTitlePrefix]; const pattern = prefixes.map(escapeRegExp).join('|'); const match = title.match(new RegExp(`^(?:${pattern}) \\(([1-9]\\d*)\\)$`, 'i')); if (!match) return null; From 2c16f61fb45549512061bcb4288c2251166cbe1c Mon Sep 17 00:00:00 2001 From: Jan Burzinski <156842394+janburzinski@users.noreply.github.com> Date: Thu, 25 Jun 2026 07:03:19 +0200 Subject: [PATCH 6/6] fix(tasks): use provider names for chat titles --- .../tasks/conversations/conversation-title-utils.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/emdash-desktop/src/renderer/features/tasks/conversations/conversation-title-utils.ts b/apps/emdash-desktop/src/renderer/features/tasks/conversations/conversation-title-utils.ts index 87b90d4129..91df9771ac 100644 --- a/apps/emdash-desktop/src/renderer/features/tasks/conversations/conversation-title-utils.ts +++ b/apps/emdash-desktop/src/renderer/features/tasks/conversations/conversation-title-utils.ts @@ -5,16 +5,16 @@ type ConversationTitleInput = { title: string; }; -function capitalizeProviderId(providerId: AgentProviderId): string { - return `${providerId.charAt(0).toUpperCase()}${providerId.slice(1)}`; -} - function escapeRegExp(value: string): string { return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } function getDefaultTitlePrefix(providerId: AgentProviderId): string { - return getProvider(providerId)?.name ?? capitalizeProviderId(providerId); + const provider = getProvider(providerId); + if (!provider) { + throw new Error(`Missing provider definition for "${providerId}"`); + } + return provider.name; } function parseDefaultTitleIndex(title: string, providerId: AgentProviderId): number | null {