release v1.4.5
This commit is contained in:
@@ -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
@@ -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,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,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,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,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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,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",
|
||||||
|
|||||||
Reference in New Issue
Block a user