@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.
Files changed (50) hide show
  1. package/package.json +9 -11
  2. package/src/brand.test.ts +22 -0
  3. package/src/components/AgentSidebar.test.tsx +791 -0
  4. package/src/components/AgentSidebar.tsx +5 -2
  5. package/src/components/ChatHeader.test.tsx +230 -0
  6. package/src/components/LocalLlmSettingsModal.test.tsx +372 -0
  7. package/src/components/chat/ApprovalModal.test.tsx +83 -0
  8. package/src/components/chat/AskUserModalHost.test.tsx +176 -0
  9. package/src/components/chat/AskUserQuestionMenu.test.tsx +190 -0
  10. package/src/components/chat/AssistantMessage.test.tsx +68 -0
  11. package/src/components/chat/ChatInput.test.tsx +609 -0
  12. package/src/components/chat/ExecPolicyPicker.test.tsx +26 -0
  13. package/src/components/chat/Markdown.test.tsx +170 -0
  14. package/src/components/chat/ModelPicker.test.tsx +149 -0
  15. package/src/components/chat/SessionTreeModal.test.tsx +161 -0
  16. package/src/components/chat/TaskOutcomeCards.test.tsx +97 -0
  17. package/src/components/chat/TaskPanelModal.test.tsx +198 -0
  18. package/src/components/chat/TaskProcessPanel.test.tsx +111 -0
  19. package/src/components/chat/TurnProcessGroup.test.tsx +161 -0
  20. package/src/components/chat/elapsed.test.ts +42 -0
  21. package/src/components/chat/executed-actions-model.test.ts +134 -0
  22. package/src/components/chat/orchestration-children-model.test.ts +115 -0
  23. package/src/components/chat/turn-timeline.test.ts +97 -0
  24. package/src/components/chat/useChatTasks.test.ts +136 -0
  25. package/src/components/settings/AgentsSettingsPanel.test.tsx +229 -0
  26. package/src/components/settings/InsightsSettingsPanel.test.tsx +132 -0
  27. package/src/components/settings/LlmSettingsPanel.test.tsx +461 -0
  28. package/src/components/settings/ModelIdCombobox.test.tsx +88 -0
  29. package/src/components/settings/SecuritySettingsPanel.test.tsx +122 -0
  30. package/src/components/settings/SkillsSettingsPanel.test.tsx +62 -0
  31. package/src/components/settings/WebSearchSettingsPanel.test.tsx +90 -0
  32. package/src/components/settings/compat-flags-model.test.ts +71 -0
  33. package/src/components/settings/llm-vendors.test.ts +171 -0
  34. package/src/components/settings/model-capabilities.test.ts +88 -0
  35. package/src/components/settings/preset-choice-model.test.ts +96 -0
  36. package/src/hooks/useChatsAndAgents.test.ts +165 -0
  37. package/src/lib/attachments.test.ts +127 -0
  38. package/src/lib/chat-title.test.ts +53 -0
  39. package/src/lib/chat-transport.test.ts +277 -0
  40. package/src/lib/date-groups.test.ts +62 -0
  41. package/src/lib/demo-flag.test.ts +17 -0
  42. package/src/lib/electron-bridge.test.ts +54 -0
  43. package/src/lib/exec-policy.test.ts +71 -0
  44. package/src/lib/http-bridge.test.ts +246 -0
  45. package/src/lib/insights.test.ts +56 -0
  46. package/src/lib/local-api.test.ts +353 -0
  47. package/src/lib/pending-first-message.test.ts +17 -0
  48. package/src/lib/slash-sources.test.ts +161 -0
  49. package/src/pages/AgentPage.test.tsx +627 -0
  50. 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
+ });