Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion cli/src/agent/sessionFactory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ export type SessionBootstrapOptions = {
startedBy?: SessionStartedBy
workingDirectory?: string
tag?: string
model?: string
agentState?: AgentState | null
}

Expand Down Expand Up @@ -49,6 +50,7 @@ export function buildSessionMetadata(options: {
startedBy: SessionStartedBy
workingDirectory: string
machineId: string
model?: string
now?: number
}): Metadata {
const happyLibDir = runtimePath()
Expand All @@ -58,6 +60,7 @@ export function buildSessionMetadata(options: {
return {
path: options.workingDirectory,
host: os.hostname(),
model: options.model?.trim() || undefined,
version: packageJson.version,
os: os.platform(),
machineId: options.machineId,
Expand Down Expand Up @@ -118,7 +121,8 @@ export async function bootstrapSession(options: SessionBootstrapOptions): Promis
flavor: options.flavor,
startedBy,
workingDirectory,
machineId
machineId,
model: options.model
})

const sessionInfo = await api.getOrCreateSession({
Expand Down
1 change: 1 addition & 0 deletions cli/src/codex/runCodex.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ export async function runCodex(opts: {
flavor: 'codex',
startedBy,
workingDirectory,
model: opts.model,
agentState: state
});

Expand Down
1 change: 1 addition & 0 deletions shared/src/schemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ export type WorktreeMetadata = z.infer<typeof WorktreeMetadataSchema>
export const MetadataSchema = z.object({
path: z.string(),
host: z.string(),
model: z.string().optional(),
version: z.string().optional(),
name: z.string().optional(),
os: z.string().optional(),
Expand Down
2 changes: 2 additions & 0 deletions shared/src/sessionSummary.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export type SessionSummaryMetadata = {
name?: string
path: string
machineId?: string
model?: string
summary?: { text: string }
flavor?: string | null
worktree?: WorktreeMetadata
Expand All @@ -29,6 +30,7 @@ export function toSessionSummary(session: Session): SessionSummary {
name: session.metadata.name,
path: session.metadata.path,
machineId: session.metadata.machineId ?? undefined,
model: session.metadata.model ?? undefined,
summary: session.metadata.summary ? { text: session.metadata.summary.text } : undefined,
flavor: session.metadata.flavor ?? null,
worktree: session.metadata.worktree
Expand Down
3 changes: 2 additions & 1 deletion web/src/components/SessionHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { useSessionActions } from '@/hooks/mutations/useSessionActions'
import { SessionActionMenu } from '@/components/SessionActionMenu'
import { RenameSessionDialog } from '@/components/RenameSessionDialog'
import { ConfirmDialog } from '@/components/ui/ConfirmDialog'
import { getSessionModelLabel } from '@/lib/sessionModelLabel'
import { useTranslation } from '@/lib/use-translation'

function getSessionTitle(session: Session): string {
Expand Down Expand Up @@ -139,7 +140,7 @@ export function SessionHeader(props: {
{session.metadata?.flavor?.trim() || 'unknown'}
</span>
<span>
{t('session.item.modelMode')}: {session.modelMode || 'default'}
{t('session.item.modelMode')}: {getSessionModelLabel(session)}
</span>
{worktreeBranch ? (
<span>{t('session.item.worktree')}: {worktreeBranch}</span>
Expand Down
3 changes: 2 additions & 1 deletion web/src/components/SessionList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { useSessionActions } from '@/hooks/mutations/useSessionActions'
import { SessionActionMenu } from '@/components/SessionActionMenu'
import { RenameSessionDialog } from '@/components/RenameSessionDialog'
import { ConfirmDialog } from '@/components/ui/ConfirmDialog'
import { getSessionModelLabel } from '@/lib/sessionModelLabel'
import { useTranslation } from '@/lib/use-translation'

type SessionGroup = {
Expand Down Expand Up @@ -259,7 +260,7 @@ function SessionItem(props: {
</span>
{getAgentLabel(s)}
</span>
<span>{t('session.item.modelMode')}: {s.modelMode || 'default'}</span>
<span>{t('session.item.modelMode')}: {getSessionModelLabel(s)}</span>
{s.metadata?.worktree?.branch ? (
<span>{t('session.item.worktree')}: {s.metadata.worktree.branch}</span>
) : null}
Expand Down
2 changes: 1 addition & 1 deletion web/src/lib/locales/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export default {
'session.item.path': 'path',
'session.item.agent': 'agent',
'session.item.model': 'model',
'session.item.modelMode': 'mode',
'session.item.modelMode': 'model',
'session.item.worktree': 'worktree',
'session.item.pending': 'pending',
'session.item.thinking': 'thinking',
Expand Down
35 changes: 35 additions & 0 deletions web/src/lib/sessionModelLabel.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { describe, expect, it } from 'vitest'
import { getSessionModelLabel } from './sessionModelLabel'

describe('getSessionModelLabel', () => {
it('prefers the actual model name stored in session metadata', () => {
expect(getSessionModelLabel({
metadata: {
path: '/Users/test/project',
host: 'test-host',
model: 'gpt-5.4'
},
modelMode: 'default'
})).toBe('gpt-5.4')
})

it('falls back to modelMode when no actual model is stored', () => {
expect(getSessionModelLabel({
metadata: {
path: '/Users/test/project',
host: 'test-host'
},
modelMode: 'opus'
})).toBe('opus')
})

it('falls back to default when neither actual model nor model mode is available', () => {
expect(getSessionModelLabel({
metadata: {
path: '/Users/test/project',
host: 'test-host'
},
modelMode: undefined
})).toBe('default')
})
})
13 changes: 13 additions & 0 deletions web/src/lib/sessionModelLabel.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import type { Session, SessionSummary } from '@/types/api'

type SessionWithModelMetadata =
| Pick<Session, 'metadata' | 'modelMode'>
| Pick<SessionSummary, 'metadata' | 'modelMode'>

export function getSessionModelLabel(session: SessionWithModelMetadata): string {
const actualModel = session.metadata?.model?.trim()
if (actualModel) {
return actualModel
}
return session.modelMode || 'default'
}
1 change: 1 addition & 0 deletions web/src/types/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export type {
export type SessionMetadataSummary = {
path: string
host: string
model?: string
version?: string
name?: string
os?: string
Expand Down