release v1.4.5

This commit is contained in:
Bohdan Triapitsyn
2026-01-09 00:01:22 +02:00
parent e134f0f14e
commit 2382c6e82a
11 changed files with 32 additions and 23 deletions
+2
View File
@@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file.
## [Unreleased] ## [Unreleased]
## [1.4.5] - 2026-01-08
- Chat: added support for model variants (thinking effort). - Chat: added support for model variants (thinking effort).
- Shortcuts: Switched agent cycling shortcut from TAB to Shift + TAB. - Shortcuts: Switched agent cycling shortcut from TAB to Shift + TAB.
- Skills: added autocomplete for skills on "/" when it is not the first character in input. - Skills: added autocomplete for skills on "/" when it is not the first character in input.
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "openchamber-monorepo", "name": "openchamber-monorepo",
"version": "1.4.4", "version": "1.4.5",
"description": "OpenChamber monorepo workspace for web, ui, and desktop runtimes", "description": "OpenChamber monorepo workspace for web, ui, and desktop runtimes",
"private": true, "private": true,
"type": "module", "type": "module",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@openchamber/desktop", "name": "@openchamber/desktop",
"version": "1.4.4", "version": "1.4.5",
"private": true, "private": true,
"type": "module", "type": "module",
"desktopPrerequisites": [ "desktopPrerequisites": [
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "openchamber-desktop" name = "openchamber-desktop"
version = "1.4.4" version = "1.4.5"
edition = "2021" edition = "2021"
publish = false publish = false
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"$schema": "../node_modules/@tauri-apps/cli/schema.json", "$schema": "../node_modules/@tauri-apps/cli/schema.json",
"productName": "OpenChamber", "productName": "OpenChamber",
"version": "1.4.4", "version": "1.4.5",
"identifier": "ai.opencode.openchamber", "identifier": "ai.opencode.openchamber",
"build": { "build": {
"beforeDevCommand": "bun run dev", "beforeDevCommand": "bun run dev",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@openchamber/ui", "name": "@openchamber/ui",
"version": "1.4.4", "version": "1.4.5",
"private": true, "private": true,
"type": "module", "type": "module",
"main": "src/main.tsx", "main": "src/main.tsx",
@@ -1,7 +1,7 @@
import React from 'react'; import React from 'react';
import { cn, fuzzyMatch } from '@/lib/utils'; import { cn, fuzzyMatch } from '@/lib/utils';
import { useConfigStore } from '@/stores/useConfigStore'; import { useConfigStore } from '@/stores/useConfigStore';
import { useAgentsStore } from '@/stores/useAgentsStore'; import { useAgentsStore, isAgentBuiltIn, type AgentWithExtras } from '@/stores/useAgentsStore';
import { ScrollableOverlay } from '@/components/ui/ScrollableOverlay'; import { ScrollableOverlay } from '@/components/ui/ScrollableOverlay';
interface AgentInfo { interface AgentInfo {
@@ -52,13 +52,13 @@ export const AgentMentionAutocomplete = React.forwardRef<AgentMentionAutocomplet
const filtered = visibleAgents const filtered = visibleAgents
.filter((agent) => isMentionable(agent.mode)) .filter((agent) => isMentionable(agent.mode))
.map((agent) => { .map((agent) => {
const metadata = agentsWithMetadata.find(a => a.name === agent.name); const metadata = agentsWithMetadata.find(a => a.name === agent.name) as (AgentWithExtras & { scope?: string }) | undefined;
return { return {
name: agent.name, name: agent.name,
description: agent.description, description: agent.description,
mode: agent.mode ?? undefined, mode: agent.mode ?? undefined,
scope: (metadata as any)?.scope, scope: metadata?.scope,
isBuiltIn: (metadata as any)?.native || (metadata as any)?.builtIn, isBuiltIn: metadata ? isAgentBuiltIn(metadata) : false,
}; };
}); });
@@ -71,7 +71,7 @@ export const AgentMentionAutocomplete = React.forwardRef<AgentMentionAutocomplet
setAgents(matches); setAgents(matches);
setSelectedIndex(0); setSelectedIndex(0);
}, [getVisibleAgents, searchQuery]); }, [getVisibleAgents, searchQuery, agentsWithMetadata]);
React.useEffect(() => { React.useEffect(() => {
itemRefs.current[selectedIndex]?.scrollIntoView({ itemRefs.current[selectedIndex]?.scrollIntoView({
@@ -84,12 +84,6 @@ export const McpDropdown: React.FC<McpDropdownProps> = ({ headerIconButtonClass
setTooltipOpen(isOpen); setTooltipOpen(isOpen);
}, []); }, []);
const directoryKey = React.useMemo(() => {
const normalized = typeof directory === 'string' ? directory.replace(/\\/g, '/').replace(/\/+$/, '') : '';
return normalized.length > 0 ? normalized : '__global__';
}, [directory]);
const isLoading = useMcpStore((state) => Boolean(state.loadingKeys[directoryKey]));
const [isSpinning, setIsSpinning] = React.useState(false); const [isSpinning, setIsSpinning] = React.useState(false);
const [busyName, setBusyName] = React.useState<string | null>(null); const [busyName, setBusyName] = React.useState<string | null>(null);
+18 -5
View File
@@ -65,6 +65,19 @@ export interface DiscoveredSkill {
description?: string; description?: string;
} }
// Raw skill response from API before transformation
interface RawSkillResponse {
name: string;
path: string;
scope?: SkillScope;
source?: SkillSource;
sources?: {
md?: {
description?: string;
};
};
}
export interface SkillConfig { export interface SkillConfig {
name: string; name: string;
description: string; description: string;
@@ -155,14 +168,14 @@ export const useSkillsStore = create<SkillsStore>()(
} }
const data = await response.json(); const data = await response.json();
const rawSkills = data.skills || []; const rawSkills: RawSkillResponse[] = data.skills || [];
const skills = rawSkills.map((s: any) => ({ const skills: DiscoveredSkill[] = rawSkills.map((s) => ({
name: s.name, name: s.name,
path: s.path, path: s.path,
scope: s.scope, scope: s.scope ?? 'user',
source: s.source, source: s.source ?? 'opencode',
description: s.sources?.md?.description || '', description: s.sources?.md?.description || '',
})) as DiscoveredSkill[]; }));
set({ skills, isLoading: false }); set({ skills, isLoading: false });
return true; return true;
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "openchamber", "name": "openchamber",
"displayName": "OpenChamber", "displayName": "OpenChamber",
"description": "AI coding assistant powered by OpenCode", "description": "AI coding assistant powered by OpenCode",
"version": "1.4.4", "version": "1.4.5",
"publisher": "fedaykindev", "publisher": "fedaykindev",
"private": true, "private": true,
"repository": { "repository": {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@openchamber/web", "name": "@openchamber/web",
"version": "1.4.4", "version": "1.4.5",
"private": false, "private": false,
"type": "module", "type": "module",
"main": "./server/index.js", "main": "./server/index.js",