Skip to content

Commit 3128cd8

Browse files
committed
chore(release): refresh v1.0.3-beta.3
1 parent e76e64a commit 3128cd8

5 files changed

Lines changed: 20 additions & 90 deletions

File tree

CHANGELOG.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
# Changelog
22

3-
## v1.0.3-beta.3 (2026-04-17)
3+
## v1.0.3-beta.3 (2026-04-18)
44
- Added Anthropic temperature support in model capability controls
55
- Added `none` and `xhigh` reasoning effort options for supported models
66
- Improved sidebar session pin feedback and stabilized session group identity handling
77
- Refined app update installation by cleaning up floating windows before relaunch
8+
- Added Astraflow (ModelVerse) provider support and removed the deprecated Laoshi provider
9+
- Added project-based workspace directories with drag-and-drop setup support
10+
- Enhanced the floating agent widget to support all agents with more stable session handling
11+
- Improved Anthropic reasoning routing and capped derived max token defaults for safer model setup
812
- 为模型能力配置补充 Anthropic temperature 支持
913
- 为受支持模型新增 `none``xhigh` reasoning effort 选项
1014
- 优化侧栏会话 pin 反馈,并稳定会话分组标识处理
1115
- 在应用更新安装前清理悬浮窗口,提升升级流程稳定性
16+
- 新增 Astraflow(ModelVerse)Provider 支持,并移除已废弃的 Laoshi Provider
17+
- 新增基于项目目录的工作区管理能力,并支持拖拽接入工作区
18+
- 增强悬浮 Agent 按钮,支持全部 Agent 并提升会话管理稳定性
19+
- 优化 Anthropic reasoning 路由,并限制推导出的默认 max tokens,降低模型配置风险
1220

1321
## v1.0.3-beta.2 (2026-04-15)
1422
- Expanded remote control into a unified multi-channel setup with Discord, QQ Bot, and WeChat iLink support

test/main/presenter/configPresenter/anthropicProviderMigration.test.ts

Lines changed: 0 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
2-
import { eventBus } from '@/eventbus'
3-
import { CONFIG_EVENTS } from '../../../../src/main/events'
42

53
vi.mock('@/eventbus', () => ({
64
eventBus: {
@@ -153,72 +151,3 @@ describe('getAnthropicModelSelectionKeysToClear', () => {
153151
expect(keysToClear).toEqual([])
154152
})
155153
})
156-
157-
describe('migrateLegacyDefaultVisionModelToBuiltinAgent', () => {
158-
beforeEach(() => {
159-
vi.clearAllMocks()
160-
})
161-
162-
it('migrates a valid legacy vision model with trimmed ids', () => {
163-
const store = {
164-
get: vi.fn().mockReturnValue({ providerId: ' openai ', modelId: ' gpt-4o ' }),
165-
delete: vi.fn()
166-
}
167-
const updateBuiltinDeepChatConfig = vi.fn()
168-
const presenter = Object.assign(Object.create(ConfigPresenter.prototype), {
169-
store,
170-
getBuiltinDeepChatConfig: vi.fn().mockReturnValue({}),
171-
updateBuiltinDeepChatConfig
172-
})
173-
174-
expect(() =>
175-
(
176-
presenter as ConfigPresenter & {
177-
migrateLegacyDefaultVisionModelToBuiltinAgent: () => void
178-
}
179-
).migrateLegacyDefaultVisionModelToBuiltinAgent()
180-
).not.toThrow()
181-
182-
expect(updateBuiltinDeepChatConfig).toHaveBeenCalledWith({
183-
visionModel: {
184-
providerId: 'openai',
185-
modelId: 'gpt-4o'
186-
}
187-
})
188-
expect(store.delete).toHaveBeenCalledWith('defaultVisionModel')
189-
expect(eventBus.sendToMain).toHaveBeenCalledWith(
190-
CONFIG_EVENTS.SETTING_CHANGED,
191-
'defaultVisionModel',
192-
undefined
193-
)
194-
})
195-
196-
it('cleans up malformed legacy vision model without throwing', () => {
197-
const store = {
198-
get: vi.fn().mockReturnValue({ providerId: { bad: true }, modelId: 'gpt-4o' }),
199-
delete: vi.fn()
200-
}
201-
const updateBuiltinDeepChatConfig = vi.fn()
202-
const presenter = Object.assign(Object.create(ConfigPresenter.prototype), {
203-
store,
204-
getBuiltinDeepChatConfig: vi.fn().mockReturnValue({}),
205-
updateBuiltinDeepChatConfig
206-
})
207-
208-
expect(() =>
209-
(
210-
presenter as ConfigPresenter & {
211-
migrateLegacyDefaultVisionModelToBuiltinAgent: () => void
212-
}
213-
).migrateLegacyDefaultVisionModelToBuiltinAgent()
214-
).not.toThrow()
215-
216-
expect(updateBuiltinDeepChatConfig).not.toHaveBeenCalled()
217-
expect(store.delete).toHaveBeenCalledWith('defaultVisionModel')
218-
expect(eventBus.sendToMain).toHaveBeenCalledWith(
219-
CONFIG_EVENTS.SETTING_CHANGED,
220-
'defaultVisionModel',
221-
undefined
222-
)
223-
})
224-
})

test/main/presenter/configPresenter/providerModelCapabilityMapping.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ describe('ConfigPresenter provider model capability mapping', () => {
125125
expect(supportsReasoning).toHaveBeenCalledWith('anthropic', 'claude-opus-4-7')
126126
})
127127

128-
it('maps anthropic transport relays to anthropic capability semantics', async () => {
128+
it('keeps anthropic transport relays on provider-local capability semantics', async () => {
129129
const { ConfigPresenter, modelCapabilities } = await loadConfigPresenter()
130130
const supportsReasoning = vi
131131
.spyOn(modelCapabilities, 'supportsReasoning')
@@ -161,10 +161,10 @@ describe('ConfigPresenter provider model capability mapping', () => {
161161
expect(models).toEqual([
162162
expect.objectContaining({
163163
id: 'claude-opus-4-7',
164-
reasoning: true
164+
reasoning: false
165165
})
166166
])
167-
expect(supportsReasoning).toHaveBeenCalledWith('anthropic', 'claude-opus-4-7')
167+
expect(supportsReasoning).not.toHaveBeenCalled()
168168
})
169169

170170
it('maps zenmux anthropic routes to anthropic capability semantics', async () => {

test/renderer/components/ModelConfigDialog.test.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ describe('ModelConfigDialog reasoning portraits', () => {
439439
expect(wrapper.text()).toContain('settings.model.modelConfig.reasoningVisibility.label')
440440
})
441441

442-
it('treats anthropic transport relays as editable anthropic toggles with conditional subsettings', async () => {
442+
it('keeps anthropic transport relays on provider-local reasoning controls', async () => {
443443
const { wrapper } = await setup({
444444
providerId: 'my-anthropic-proxy',
445445
modelId: 'claude-opus-4-7',
@@ -466,17 +466,12 @@ describe('ModelConfigDialog reasoning portraits', () => {
466466
}
467467
})
468468

469-
expect((wrapper.vm as any).reasoningToggleMode).toBe('toggle')
470-
expect((wrapper.vm as any).showReasoningEffort).toBe(false)
471-
expect((wrapper.vm as any).showReasoningVisibility).toBe(false)
472-
473-
;(wrapper.vm as any).config.reasoning = true
474-
await nextTick()
475-
469+
expect((wrapper.vm as any).reasoningToggleMode).toBe('indicator')
470+
expect((wrapper.vm as any).reasoningToggleDisabled).toBe(true)
471+
expect((wrapper.vm as any).reasoningToggleValue).toBe(true)
476472
expect((wrapper.vm as any).showReasoningEffort).toBe(true)
477-
expect((wrapper.vm as any).showReasoningVisibility).toBe(true)
478-
expect((wrapper.vm as any).config.reasoningVisibility).toBe('omitted')
479-
expect(wrapper.text()).toContain('settings.model.modelConfig.reasoningVisibility.label')
473+
expect((wrapper.vm as any).showReasoningVisibility).toBe(false)
474+
expect(wrapper.text()).not.toContain('settings.model.modelConfig.reasoningVisibility.label')
480475
})
481476

482477
it('hides effort and budget controls for level-based portraits', async () => {

test/renderer/components/WindowSideBarSessionItem.test.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ describe('WindowSideBarSessionItem', () => {
103103
expect(wrapper.find('[aria-label="thread.actions.pin"]').exists()).toBe(true)
104104
}, 10000)
105105

106-
it('exposes hero transition and pin feedback state on the rendered item', async () => {
106+
it('exposes hero transition class and pin feedback state on the rendered item', async () => {
107107
const wrapper = await mountComponent({
108108
isPinned: true,
109109
heroHidden: true,
@@ -114,9 +114,8 @@ describe('WindowSideBarSessionItem', () => {
114114

115115
expect(item.attributes('data-pin-fx')).toBe('pinning')
116116
expect(item.attributes('data-session-id')).toBe('session-1')
117-
expect(item.attributes('data-hero-hidden')).toBe('true')
117+
expect(item.classes()).toContain('is-hero-hidden')
118118
expect(item.attributes('data-pin-state')).toBe('docked')
119-
expect(item.attributes('data-pin-visual-state')).toBe('overlay')
120119
}, 10000)
121120

122121
it('keeps the pin layout docked while unpinning feedback is active', async () => {
@@ -126,7 +125,6 @@ describe('WindowSideBarSessionItem', () => {
126125
})
127126

128127
expect(wrapper.find('.session-item').attributes('data-pin-state')).toBe('docked')
129-
expect(wrapper.find('.session-item').attributes('data-pin-visual-state')).toBe('docked')
130128
}, 10000)
131129

132130
it('highlights matching title fragments when filtering the sidebar', async () => {

0 commit comments

Comments
 (0)