Skip to content
Open
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
4 changes: 2 additions & 2 deletions apps/desktop/electron/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9272,8 +9272,8 @@ ipcMain.handle('hermes:window:openInstance', async () => {
// shortcuts and the View menu. Reads and writes target the asking window.
ipcMain.handle('hermes:zoom:get', event => {
const window = BrowserWindow.fromWebContents(event.sender)
const level =
window && !window.isDestroyed() ? window.webContents.getZoomLevel() : DEFAULT_ZOOM_LEVEL

const level = window && !window.isDestroyed() ? window.webContents.getZoomLevel() : DEFAULT_ZOOM_LEVEL

return { level, percent: zoomLevelToPercent(level) }
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -558,6 +558,7 @@ export function useSessionActions({
resetViewSync()
setSelectedStoredSessionId(storedSessionId)
selectedStoredSessionIdRef.current = storedSessionId

// A session is EITHER the main thread OR a tile — never both. openSessionTile
// enforces this from the tile side (it refuses to tile the selected session);
// this enforces it from the main side. Loading an existing session into main
Expand All @@ -570,6 +571,7 @@ export function useSessionActions({
if ($sessionTiles.get().some(t => t.storedSessionId === storedSessionId)) {
closeSessionTile(storedSessionId)
}

// Optimistically clear any prior resume-failure latch for this session:
// we're attempting a fresh resume, so the self-heal in use-route-resume
// must not keep treating it as stranded. It's re-armed below only if THIS
Expand Down
6 changes: 5 additions & 1 deletion apps/desktop/src/app/shell/model-menu-panel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,11 @@ export function ModelMenuPanel({ gateway, onSelectModel, profile = 'default', re
textValue=""
>
<span className="truncate">{group.provider.name}</span>
<DisclosureCaret className="shrink-0 text-(--ui-text-tertiary) opacity-0 transition group-hover/label:opacity-100" open={!collapsed} size="0.625rem" />
<DisclosureCaret
className="shrink-0 text-(--ui-text-tertiary) opacity-0 transition group-hover/label:opacity-100"
open={!collapsed}
size="0.625rem"
/>
</DropdownMenuItem>
{!collapsed &&
group.families.map(family => {
Expand Down
13 changes: 8 additions & 5 deletions apps/desktop/src/components/model-visibility-dialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -108,9 +108,11 @@ export function ModelVisibilityDialog({
}

const allFamilies = collapseModelFamilies(provider.models ?? [])

const onCount = allFamilies.filter(family =>
visible.has(modelVisibilityKey(provider.slug, family.id))
).length

const checkState = onCount === 0 ? false : onCount === allFamilies.length ? true : 'indeterminate'

const collapsed = collapsedProviders.includes(provider.slug) && !q
Expand Down Expand Up @@ -138,15 +140,16 @@ export function ModelVisibilityDialog({
const key = modelVisibilityKey(provider.slug, family.id)

return (
<label
className="flex cursor-pointer items-center gap-2 px-3 py-1 text-xs"
key={key}
>
<label className="flex cursor-pointer items-center gap-2 px-3 py-1 text-xs" key={key}>
<span className="min-w-0 flex-1 truncate">
{name}
{tag ? <span className="text-(--ui-text-tertiary)"> {tag}</span> : null}
</span>
<Switch checked={visible.has(key)} onCheckedChange={() => toggle(provider, family.id)} size="xs" />
<Switch
checked={visible.has(key)}
onCheckedChange={() => toggle(provider, family.id)}
size="xs"
/>
</label>
)
})}
Expand Down
1 change: 1 addition & 0 deletions apps/desktop/src/store/model-visibility.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ function expandProviderDefaults(provider: ModelOptionProvider, target: Set<strin
const families = collapseModelFamilies(provider.models ?? [])

const featured = provider.featured_models ?? []

const defaults = featured.length
? families.filter(family => featured.includes(family.id))
: families.slice(0, DEFAULT_VISIBLE_PER_PROVIDER)
Expand Down
1 change: 1 addition & 0 deletions ui-tui/src/__tests__/createSlashHandler.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -845,6 +845,7 @@ describe('createSlashHandler', () => {
await vi.waitFor(() => {
expect(ctx.transcript.send).toHaveBeenCalledWith(skillMessage, true, '/hermes-agent-dev')
})

// The expanded skill body is model-facing: no transcript line may carry it.
for (const [line] of ctx.transcript.sys.mock.calls) {
expect(line).not.toContain('Use this skill to do X')
Expand Down