@steerable/agent-shell-web 0.6.16 → 0.6.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +9 -11
- package/src/brand.test.ts +22 -0
- package/src/components/AgentSidebar.test.tsx +791 -0
- package/src/components/AgentSidebar.tsx +5 -2
- package/src/components/ChatHeader.test.tsx +230 -0
- package/src/components/LocalLlmSettingsModal.test.tsx +372 -0
- package/src/components/chat/ApprovalModal.test.tsx +83 -0
- package/src/components/chat/AskUserModalHost.test.tsx +176 -0
- package/src/components/chat/AskUserQuestionMenu.test.tsx +190 -0
- package/src/components/chat/AssistantMessage.test.tsx +68 -0
- package/src/components/chat/ChatInput.test.tsx +609 -0
- package/src/components/chat/ExecPolicyPicker.test.tsx +26 -0
- package/src/components/chat/Markdown.test.tsx +170 -0
- package/src/components/chat/ModelPicker.test.tsx +149 -0
- package/src/components/chat/SessionTreeModal.test.tsx +161 -0
- package/src/components/chat/TaskOutcomeCards.test.tsx +97 -0
- package/src/components/chat/TaskPanelModal.test.tsx +198 -0
- package/src/components/chat/TaskProcessPanel.test.tsx +111 -0
- package/src/components/chat/TurnProcessGroup.test.tsx +161 -0
- package/src/components/chat/elapsed.test.ts +42 -0
- package/src/components/chat/executed-actions-model.test.ts +134 -0
- package/src/components/chat/orchestration-children-model.test.ts +115 -0
- package/src/components/chat/turn-timeline.test.ts +97 -0
- package/src/components/chat/useChatTasks.test.ts +136 -0
- package/src/components/settings/AgentsSettingsPanel.test.tsx +229 -0
- package/src/components/settings/InsightsSettingsPanel.test.tsx +132 -0
- package/src/components/settings/LlmSettingsPanel.test.tsx +461 -0
- package/src/components/settings/ModelIdCombobox.test.tsx +88 -0
- package/src/components/settings/SecuritySettingsPanel.test.tsx +122 -0
- package/src/components/settings/SkillsSettingsPanel.test.tsx +62 -0
- package/src/components/settings/WebSearchSettingsPanel.test.tsx +90 -0
- package/src/components/settings/compat-flags-model.test.ts +71 -0
- package/src/components/settings/llm-vendors.test.ts +171 -0
- package/src/components/settings/model-capabilities.test.ts +88 -0
- package/src/components/settings/preset-choice-model.test.ts +96 -0
- package/src/hooks/useChatsAndAgents.test.ts +165 -0
- package/src/lib/attachments.test.ts +127 -0
- package/src/lib/chat-title.test.ts +53 -0
- package/src/lib/chat-transport.test.ts +277 -0
- package/src/lib/date-groups.test.ts +62 -0
- package/src/lib/demo-flag.test.ts +17 -0
- package/src/lib/electron-bridge.test.ts +54 -0
- package/src/lib/exec-policy.test.ts +71 -0
- package/src/lib/http-bridge.test.ts +246 -0
- package/src/lib/insights.test.ts +56 -0
- package/src/lib/local-api.test.ts +353 -0
- package/src/lib/pending-first-message.test.ts +17 -0
- package/src/lib/slash-sources.test.ts +161 -0
- package/src/pages/AgentPage.test.tsx +627 -0
- package/src/pages/SettingsPage.test.tsx +102 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { cleanup, fireEvent, render, screen } from '@testing-library/react';
|
|
2
|
+
import { MemoryRouter } from 'react-router-dom';
|
|
3
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
4
|
+
|
|
5
|
+
const { save } = vi.hoisted(() => ({ save: vi.fn(async () => {}) }));
|
|
6
|
+
|
|
7
|
+
vi.mock('@/lib/electron-bridge', () => ({
|
|
8
|
+
isElectron: () => true,
|
|
9
|
+
}));
|
|
10
|
+
|
|
11
|
+
vi.mock('@/components/settings/LlmSettingsPanel', async () => {
|
|
12
|
+
const react = await import('react');
|
|
13
|
+
return {
|
|
14
|
+
LlmSettingsPanel: react.forwardRef(function MockLlm(
|
|
15
|
+
props: { onSaveUiChange?: (ui: { saving: boolean; savedOk: boolean; loading: boolean }) => void },
|
|
16
|
+
ref,
|
|
17
|
+
) {
|
|
18
|
+
react.useImperativeHandle(ref, () => ({ save }));
|
|
19
|
+
react.useEffect(() => {
|
|
20
|
+
props.onSaveUiChange?.({ saving: false, savedOk: false, loading: false });
|
|
21
|
+
}, [props.onSaveUiChange]);
|
|
22
|
+
return <div data-testid="llm-panel" />;
|
|
23
|
+
}),
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
vi.mock('@/components/settings/InsightsSettingsPanel', () => ({
|
|
28
|
+
InsightsSettingsPanel: () => null,
|
|
29
|
+
}));
|
|
30
|
+
vi.mock('@/components/settings/TelemetrySettingsPanel', () => ({
|
|
31
|
+
TelemetrySettingsPanel: () => null,
|
|
32
|
+
}));
|
|
33
|
+
vi.mock('@/components/settings/UsagePanel', () => ({
|
|
34
|
+
UsagePanel: () => null,
|
|
35
|
+
}));
|
|
36
|
+
vi.mock('@/components/settings/WebSearchSettingsPanel', () => ({
|
|
37
|
+
WebSearchSettingsPanel: () => null,
|
|
38
|
+
}));
|
|
39
|
+
vi.mock('@/components/settings/SecuritySettingsPanel', () => ({
|
|
40
|
+
SecuritySettingsPanel: () => null,
|
|
41
|
+
}));
|
|
42
|
+
vi.mock('@/components/settings/SkillsSettingsPanel', () => ({
|
|
43
|
+
SkillsSettingsPanel: () => null,
|
|
44
|
+
}));
|
|
45
|
+
vi.mock('@/components/settings/McpSettingsPanel', () => ({
|
|
46
|
+
McpSettingsPanel: () => null,
|
|
47
|
+
}));
|
|
48
|
+
vi.mock('@/components/settings/AgentsSettingsPanel', () => ({
|
|
49
|
+
AgentsSettingsPanel: () => null,
|
|
50
|
+
}));
|
|
51
|
+
|
|
52
|
+
const { SettingsPage } = await import('./SettingsPage');
|
|
53
|
+
|
|
54
|
+
function renderSettings(search = '') {
|
|
55
|
+
return render(
|
|
56
|
+
<MemoryRouter initialEntries={[`/settings${search}`]}>
|
|
57
|
+
<SettingsPage />
|
|
58
|
+
</MemoryRouter>,
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
afterEach(() => {
|
|
63
|
+
cleanup();
|
|
64
|
+
save.mockClear();
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
describe('SettingsPage header save', () => {
|
|
68
|
+
it('saves LLM settings from the general settings header', () => {
|
|
69
|
+
renderSettings();
|
|
70
|
+
fireEvent.click(screen.getByTestId('settings-header-save'));
|
|
71
|
+
expect(save).toHaveBeenCalledTimes(1);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('does not show the header save on skills, MCP, or agents pages', () => {
|
|
75
|
+
const skills = renderSettings('?section=skills');
|
|
76
|
+
expect(screen.queryByTestId('settings-header-save')).toBeNull();
|
|
77
|
+
skills.unmount();
|
|
78
|
+
const mcp = renderSettings('?section=mcp');
|
|
79
|
+
expect(screen.queryByTestId('settings-header-save')).toBeNull();
|
|
80
|
+
mcp.unmount();
|
|
81
|
+
renderSettings('?section=agents');
|
|
82
|
+
expect(screen.queryByTestId('settings-header-save')).toBeNull();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('orders general sections by how often they are used', () => {
|
|
86
|
+
renderSettings();
|
|
87
|
+
expect(screen.getByRole('heading', { name: '帮助改进产品' })).toBeTruthy();
|
|
88
|
+
expect(
|
|
89
|
+
[...document.querySelectorAll('[data-testid^="settings-section-"]')].map(
|
|
90
|
+
(el) => el.getAttribute('data-testid'),
|
|
91
|
+
),
|
|
92
|
+
).toEqual([
|
|
93
|
+
'settings-section-llm',
|
|
94
|
+
'settings-section-web-search',
|
|
95
|
+
'settings-section-usage',
|
|
96
|
+
'settings-section-diagnose',
|
|
97
|
+
'settings-section-security',
|
|
98
|
+
'settings-section-insights',
|
|
99
|
+
'settings-section-telemetry',
|
|
100
|
+
]);
|
|
101
|
+
});
|
|
102
|
+
});
|