@google/gemini-cli 0.1.9-nightly.250708.137ffec3 → 0.1.9-nightly.250708.a4097ae6

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 (64) hide show
  1. package/dist/google-gemini-cli-0.1.9.tgz +0 -0
  2. package/dist/package.json +2 -2
  3. package/dist/src/config/config.js +0 -2
  4. package/dist/src/config/config.js.map +1 -1
  5. package/dist/src/gemini.test.d.ts +6 -0
  6. package/dist/src/gemini.test.js +122 -0
  7. package/dist/src/gemini.test.js.map +1 -0
  8. package/dist/src/generated/git-commit.d.ts +1 -1
  9. package/dist/src/generated/git-commit.js +1 -1
  10. package/dist/src/test-utils/mockCommandContext.d.ts +18 -0
  11. package/dist/src/test-utils/mockCommandContext.js +75 -0
  12. package/dist/src/test-utils/mockCommandContext.js.map +1 -0
  13. package/dist/src/ui/App.test.d.ts +6 -0
  14. package/dist/src/ui/App.test.js +300 -0
  15. package/dist/src/ui/App.test.js.map +1 -0
  16. package/dist/src/ui/components/AuthDialog.test.d.ts +6 -0
  17. package/dist/src/ui/components/AuthDialog.test.js +86 -0
  18. package/dist/src/ui/components/AuthDialog.test.js.map +1 -0
  19. package/dist/src/ui/components/HistoryItemDisplay.test.d.ts +6 -0
  20. package/dist/src/ui/components/HistoryItemDisplay.test.js +81 -0
  21. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -0
  22. package/dist/src/ui/components/InputPrompt.test.d.ts +6 -0
  23. package/dist/src/ui/components/InputPrompt.test.js +334 -0
  24. package/dist/src/ui/components/InputPrompt.test.js.map +1 -0
  25. package/dist/src/ui/components/LoadingIndicator.js +1 -2
  26. package/dist/src/ui/components/LoadingIndicator.js.map +1 -1
  27. package/dist/src/ui/components/LoadingIndicator.test.d.ts +6 -0
  28. package/dist/src/ui/components/LoadingIndicator.test.js +141 -0
  29. package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -0
  30. package/dist/src/ui/components/ModelStatsDisplay.test.d.ts +6 -0
  31. package/dist/src/ui/components/ModelStatsDisplay.test.js +217 -0
  32. package/dist/src/ui/components/ModelStatsDisplay.test.js.map +1 -0
  33. package/dist/src/ui/components/SessionSummaryDisplay.test.d.ts +6 -0
  34. package/dist/src/ui/components/SessionSummaryDisplay.test.js +60 -0
  35. package/dist/src/ui/components/SessionSummaryDisplay.test.js.map +1 -0
  36. package/dist/src/ui/components/StatsDisplay.test.d.ts +6 -0
  37. package/dist/src/ui/components/StatsDisplay.test.js +275 -0
  38. package/dist/src/ui/components/StatsDisplay.test.js.map +1 -0
  39. package/dist/src/ui/components/ToolStatsDisplay.test.d.ts +6 -0
  40. package/dist/src/ui/components/ToolStatsDisplay.test.js +160 -0
  41. package/dist/src/ui/components/ToolStatsDisplay.test.js.map +1 -0
  42. package/dist/src/ui/components/messages/DiffRenderer.test.d.ts +6 -0
  43. package/dist/src/ui/components/messages/DiffRenderer.test.js +239 -0
  44. package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -0
  45. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.d.ts +6 -0
  46. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +37 -0
  47. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -0
  48. package/dist/src/ui/components/messages/ToolMessage.test.d.ts +6 -0
  49. package/dist/src/ui/components/messages/ToolMessage.test.js +116 -0
  50. package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -0
  51. package/dist/src/ui/components/shared/MaxSizedBox.test.d.ts +6 -0
  52. package/dist/src/ui/components/shared/MaxSizedBox.test.js +134 -0
  53. package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +1 -0
  54. package/dist/src/ui/contexts/SessionContext.test.d.ts +6 -0
  55. package/dist/src/ui/contexts/SessionContext.test.js +96 -0
  56. package/dist/src/ui/contexts/SessionContext.test.js.map +1 -0
  57. package/dist/src/ui/hooks/useGeminiStream.test.d.ts +6 -0
  58. package/dist/src/ui/hooks/useGeminiStream.test.js +838 -0
  59. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -0
  60. package/dist/src/ui/utils/MarkdownDisplay.test.d.ts +6 -0
  61. package/dist/src/ui/utils/MarkdownDisplay.test.js +211 -0
  62. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -0
  63. package/dist/tsconfig.tsbuildinfo +1 -1
  64. package/package.json +3 -3
@@ -0,0 +1,141 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * @license
4
+ * Copyright 2025 Google LLC
5
+ * SPDX-License-Identifier: Apache-2.0
6
+ */
7
+ import React from 'react';
8
+ import { render } from 'ink-testing-library';
9
+ import { Text } from 'ink';
10
+ import { LoadingIndicator } from './LoadingIndicator.js';
11
+ import { StreamingContext } from '../contexts/StreamingContext.js';
12
+ import { StreamingState } from '../types.js';
13
+ import { vi } from 'vitest';
14
+ // Mock GeminiRespondingSpinner
15
+ vi.mock('./GeminiRespondingSpinner.js', () => ({
16
+ GeminiRespondingSpinner: ({ nonRespondingDisplay, }) => {
17
+ const streamingState = React.useContext(StreamingContext);
18
+ if (streamingState === StreamingState.Responding) {
19
+ return _jsx(Text, { children: "MockRespondingSpinner" });
20
+ }
21
+ else if (nonRespondingDisplay) {
22
+ return _jsx(Text, { children: nonRespondingDisplay });
23
+ }
24
+ return null;
25
+ },
26
+ }));
27
+ const renderWithContext = (ui, streamingStateValue) => {
28
+ const contextValue = streamingStateValue;
29
+ return render(_jsx(StreamingContext.Provider, { value: contextValue, children: ui }));
30
+ };
31
+ describe('<LoadingIndicator />', () => {
32
+ const defaultProps = {
33
+ currentLoadingPhrase: 'Loading...',
34
+ elapsedTime: 5,
35
+ };
36
+ it('should not render when streamingState is Idle', () => {
37
+ const { lastFrame } = renderWithContext(_jsx(LoadingIndicator, { ...defaultProps }), StreamingState.Idle);
38
+ expect(lastFrame()).toBe('');
39
+ });
40
+ it('should render spinner, phrase, and time when streamingState is Responding', () => {
41
+ const { lastFrame } = renderWithContext(_jsx(LoadingIndicator, { ...defaultProps }), StreamingState.Responding);
42
+ const output = lastFrame();
43
+ expect(output).toContain('MockRespondingSpinner');
44
+ expect(output).toContain('Loading...');
45
+ expect(output).toContain('(esc to cancel, 5s)');
46
+ });
47
+ it('should render spinner (static), phrase but no time/cancel when streamingState is WaitingForConfirmation', () => {
48
+ const props = {
49
+ currentLoadingPhrase: 'Confirm action',
50
+ elapsedTime: 10,
51
+ };
52
+ const { lastFrame } = renderWithContext(_jsx(LoadingIndicator, { ...props }), StreamingState.WaitingForConfirmation);
53
+ const output = lastFrame();
54
+ expect(output).toContain('⠏'); // Static char for WaitingForConfirmation
55
+ expect(output).toContain('Confirm action');
56
+ expect(output).not.toContain('(esc to cancel)');
57
+ expect(output).not.toContain(', 10s');
58
+ });
59
+ it('should display the currentLoadingPhrase correctly', () => {
60
+ const props = {
61
+ currentLoadingPhrase: 'Processing data...',
62
+ elapsedTime: 3,
63
+ };
64
+ const { lastFrame } = renderWithContext(_jsx(LoadingIndicator, { ...props }), StreamingState.Responding);
65
+ expect(lastFrame()).toContain('Processing data...');
66
+ });
67
+ it('should display the elapsedTime correctly when Responding', () => {
68
+ const props = {
69
+ currentLoadingPhrase: 'Working...',
70
+ elapsedTime: 8,
71
+ };
72
+ const { lastFrame } = renderWithContext(_jsx(LoadingIndicator, { ...props }), StreamingState.Responding);
73
+ expect(lastFrame()).toContain('(esc to cancel, 8s)');
74
+ });
75
+ it('should render rightContent when provided', () => {
76
+ const rightContent = _jsx(Text, { children: "Extra Info" });
77
+ const { lastFrame } = renderWithContext(_jsx(LoadingIndicator, { ...defaultProps, rightContent: rightContent }), StreamingState.Responding);
78
+ expect(lastFrame()).toContain('Extra Info');
79
+ });
80
+ it('should transition correctly between states using rerender', () => {
81
+ const { lastFrame, rerender } = renderWithContext(_jsx(LoadingIndicator, { ...defaultProps }), StreamingState.Idle);
82
+ expect(lastFrame()).toBe(''); // Initial: Idle
83
+ // Transition to Responding
84
+ rerender(_jsx(StreamingContext.Provider, { value: StreamingState.Responding, children: _jsx(LoadingIndicator, { currentLoadingPhrase: "Now Responding", elapsedTime: 2 }) }));
85
+ let output = lastFrame();
86
+ expect(output).toContain('MockRespondingSpinner');
87
+ expect(output).toContain('Now Responding');
88
+ expect(output).toContain('(esc to cancel, 2s)');
89
+ // Transition to WaitingForConfirmation
90
+ rerender(_jsx(StreamingContext.Provider, { value: StreamingState.WaitingForConfirmation, children: _jsx(LoadingIndicator, { currentLoadingPhrase: "Please Confirm", elapsedTime: 15 }) }));
91
+ output = lastFrame();
92
+ expect(output).toContain('⠏');
93
+ expect(output).toContain('Please Confirm');
94
+ expect(output).not.toContain('(esc to cancel)');
95
+ expect(output).not.toContain(', 15s');
96
+ // Transition back to Idle
97
+ rerender(_jsx(StreamingContext.Provider, { value: StreamingState.Idle, children: _jsx(LoadingIndicator, { ...defaultProps }) }));
98
+ expect(lastFrame()).toBe('');
99
+ });
100
+ it('should display fallback phrase if thought is empty', () => {
101
+ const props = {
102
+ thought: null,
103
+ currentLoadingPhrase: 'Loading...',
104
+ elapsedTime: 5,
105
+ };
106
+ const { lastFrame } = renderWithContext(_jsx(LoadingIndicator, { ...props }), StreamingState.Responding);
107
+ const output = lastFrame();
108
+ expect(output).toContain('Loading...');
109
+ });
110
+ it('should display the subject of a thought', () => {
111
+ const props = {
112
+ thought: {
113
+ subject: 'Thinking about something...',
114
+ description: 'and other stuff.',
115
+ },
116
+ elapsedTime: 5,
117
+ };
118
+ const { lastFrame } = renderWithContext(_jsx(LoadingIndicator, { ...props }), StreamingState.Responding);
119
+ const output = lastFrame();
120
+ expect(output).toBeDefined();
121
+ if (output) {
122
+ expect(output).toContain('Thinking about something...');
123
+ expect(output).not.toContain('and other stuff.');
124
+ }
125
+ });
126
+ it('should prioritize thought.subject over currentLoadingPhrase', () => {
127
+ const props = {
128
+ thought: {
129
+ subject: 'This should be displayed',
130
+ description: 'A description',
131
+ },
132
+ currentLoadingPhrase: 'This should not be displayed',
133
+ elapsedTime: 5,
134
+ };
135
+ const { lastFrame } = renderWithContext(_jsx(LoadingIndicator, { ...props }), StreamingState.Responding);
136
+ const output = lastFrame();
137
+ expect(output).toContain('This should be displayed');
138
+ expect(output).not.toContain('This should not be displayed');
139
+ });
140
+ });
141
+ //# sourceMappingURL=LoadingIndicator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoadingIndicator.test.js","sourceRoot":"","sources":["../../../../src/ui/components/LoadingIndicator.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,217 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * @license
4
+ * Copyright 2025 Google LLC
5
+ * SPDX-License-Identifier: Apache-2.0
6
+ */
7
+ import { render } from 'ink-testing-library';
8
+ import { describe, it, expect, vi } from 'vitest';
9
+ import { ModelStatsDisplay } from './ModelStatsDisplay.js';
10
+ import * as SessionContext from '../contexts/SessionContext.js';
11
+ // Mock the context to provide controlled data for testing
12
+ vi.mock('../contexts/SessionContext.js', async (importOriginal) => {
13
+ const actual = await importOriginal();
14
+ return {
15
+ ...actual,
16
+ useSessionStats: vi.fn(),
17
+ };
18
+ });
19
+ const useSessionStatsMock = vi.mocked(SessionContext.useSessionStats);
20
+ const renderWithMockedStats = (metrics) => {
21
+ useSessionStatsMock.mockReturnValue({
22
+ stats: {
23
+ sessionStartTime: new Date(),
24
+ metrics,
25
+ lastPromptTokenCount: 0,
26
+ },
27
+ });
28
+ return render(_jsx(ModelStatsDisplay, {}));
29
+ };
30
+ describe('<ModelStatsDisplay />', () => {
31
+ it('should render "no API calls" message when there are no active models', () => {
32
+ const { lastFrame } = renderWithMockedStats({
33
+ models: {},
34
+ tools: {
35
+ totalCalls: 0,
36
+ totalSuccess: 0,
37
+ totalFail: 0,
38
+ totalDurationMs: 0,
39
+ totalDecisions: { accept: 0, reject: 0, modify: 0 },
40
+ byName: {},
41
+ },
42
+ });
43
+ expect(lastFrame()).toContain('No API calls have been made in this session.');
44
+ expect(lastFrame()).toMatchSnapshot();
45
+ });
46
+ it('should not display conditional rows if no model has data for them', () => {
47
+ const { lastFrame } = renderWithMockedStats({
48
+ models: {
49
+ 'gemini-2.5-pro': {
50
+ api: { totalRequests: 1, totalErrors: 0, totalLatencyMs: 100 },
51
+ tokens: {
52
+ prompt: 10,
53
+ candidates: 20,
54
+ total: 30,
55
+ cached: 0,
56
+ thoughts: 0,
57
+ tool: 0,
58
+ },
59
+ },
60
+ },
61
+ tools: {
62
+ totalCalls: 0,
63
+ totalSuccess: 0,
64
+ totalFail: 0,
65
+ totalDurationMs: 0,
66
+ totalDecisions: { accept: 0, reject: 0, modify: 0 },
67
+ byName: {},
68
+ },
69
+ });
70
+ const output = lastFrame();
71
+ expect(output).not.toContain('Cached');
72
+ expect(output).not.toContain('Thoughts');
73
+ expect(output).not.toContain('Tool');
74
+ expect(output).toMatchSnapshot();
75
+ });
76
+ it('should display conditional rows if at least one model has data', () => {
77
+ const { lastFrame } = renderWithMockedStats({
78
+ models: {
79
+ 'gemini-2.5-pro': {
80
+ api: { totalRequests: 1, totalErrors: 0, totalLatencyMs: 100 },
81
+ tokens: {
82
+ prompt: 10,
83
+ candidates: 20,
84
+ total: 30,
85
+ cached: 5,
86
+ thoughts: 2,
87
+ tool: 0,
88
+ },
89
+ },
90
+ 'gemini-2.5-flash': {
91
+ api: { totalRequests: 1, totalErrors: 0, totalLatencyMs: 50 },
92
+ tokens: {
93
+ prompt: 5,
94
+ candidates: 10,
95
+ total: 15,
96
+ cached: 0,
97
+ thoughts: 0,
98
+ tool: 3,
99
+ },
100
+ },
101
+ },
102
+ tools: {
103
+ totalCalls: 0,
104
+ totalSuccess: 0,
105
+ totalFail: 0,
106
+ totalDurationMs: 0,
107
+ totalDecisions: { accept: 0, reject: 0, modify: 0 },
108
+ byName: {},
109
+ },
110
+ });
111
+ const output = lastFrame();
112
+ expect(output).toContain('Cached');
113
+ expect(output).toContain('Thoughts');
114
+ expect(output).toContain('Tool');
115
+ expect(output).toMatchSnapshot();
116
+ });
117
+ it('should display stats for multiple models correctly', () => {
118
+ const { lastFrame } = renderWithMockedStats({
119
+ models: {
120
+ 'gemini-2.5-pro': {
121
+ api: { totalRequests: 10, totalErrors: 1, totalLatencyMs: 1000 },
122
+ tokens: {
123
+ prompt: 100,
124
+ candidates: 200,
125
+ total: 300,
126
+ cached: 50,
127
+ thoughts: 10,
128
+ tool: 5,
129
+ },
130
+ },
131
+ 'gemini-2.5-flash': {
132
+ api: { totalRequests: 20, totalErrors: 2, totalLatencyMs: 500 },
133
+ tokens: {
134
+ prompt: 200,
135
+ candidates: 400,
136
+ total: 600,
137
+ cached: 100,
138
+ thoughts: 20,
139
+ tool: 10,
140
+ },
141
+ },
142
+ },
143
+ tools: {
144
+ totalCalls: 0,
145
+ totalSuccess: 0,
146
+ totalFail: 0,
147
+ totalDurationMs: 0,
148
+ totalDecisions: { accept: 0, reject: 0, modify: 0 },
149
+ byName: {},
150
+ },
151
+ });
152
+ const output = lastFrame();
153
+ expect(output).toContain('gemini-2.5-pro');
154
+ expect(output).toContain('gemini-2.5-flash');
155
+ expect(output).toMatchSnapshot();
156
+ });
157
+ it('should handle large values without wrapping or overlapping', () => {
158
+ const { lastFrame } = renderWithMockedStats({
159
+ models: {
160
+ 'gemini-2.5-pro': {
161
+ api: {
162
+ totalRequests: 999999999,
163
+ totalErrors: 123456789,
164
+ totalLatencyMs: 9876,
165
+ },
166
+ tokens: {
167
+ prompt: 987654321,
168
+ candidates: 123456789,
169
+ total: 999999999,
170
+ cached: 123456789,
171
+ thoughts: 111111111,
172
+ tool: 222222222,
173
+ },
174
+ },
175
+ },
176
+ tools: {
177
+ totalCalls: 0,
178
+ totalSuccess: 0,
179
+ totalFail: 0,
180
+ totalDurationMs: 0,
181
+ totalDecisions: { accept: 0, reject: 0, modify: 0 },
182
+ byName: {},
183
+ },
184
+ });
185
+ expect(lastFrame()).toMatchSnapshot();
186
+ });
187
+ it('should display a single model correctly', () => {
188
+ const { lastFrame } = renderWithMockedStats({
189
+ models: {
190
+ 'gemini-2.5-pro': {
191
+ api: { totalRequests: 1, totalErrors: 0, totalLatencyMs: 100 },
192
+ tokens: {
193
+ prompt: 10,
194
+ candidates: 20,
195
+ total: 30,
196
+ cached: 5,
197
+ thoughts: 2,
198
+ tool: 1,
199
+ },
200
+ },
201
+ },
202
+ tools: {
203
+ totalCalls: 0,
204
+ totalSuccess: 0,
205
+ totalFail: 0,
206
+ totalDurationMs: 0,
207
+ totalDecisions: { accept: 0, reject: 0, modify: 0 },
208
+ byName: {},
209
+ },
210
+ });
211
+ const output = lastFrame();
212
+ expect(output).toContain('gemini-2.5-pro');
213
+ expect(output).not.toContain('gemini-2.5-flash');
214
+ expect(output).toMatchSnapshot();
215
+ });
216
+ });
217
+ //# sourceMappingURL=ModelStatsDisplay.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelStatsDisplay.test.js","sourceRoot":"","sources":["../../../../src/ui/components/ModelStatsDisplay.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,60 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * @license
4
+ * Copyright 2025 Google LLC
5
+ * SPDX-License-Identifier: Apache-2.0
6
+ */
7
+ import { render } from 'ink-testing-library';
8
+ import { describe, it, expect, vi } from 'vitest';
9
+ import { SessionSummaryDisplay } from './SessionSummaryDisplay.js';
10
+ import * as SessionContext from '../contexts/SessionContext.js';
11
+ vi.mock('../contexts/SessionContext.js', async (importOriginal) => {
12
+ const actual = await importOriginal();
13
+ return {
14
+ ...actual,
15
+ useSessionStats: vi.fn(),
16
+ };
17
+ });
18
+ const useSessionStatsMock = vi.mocked(SessionContext.useSessionStats);
19
+ const renderWithMockedStats = (metrics) => {
20
+ useSessionStatsMock.mockReturnValue({
21
+ stats: {
22
+ sessionStartTime: new Date(),
23
+ metrics,
24
+ lastPromptTokenCount: 0,
25
+ },
26
+ });
27
+ return render(_jsx(SessionSummaryDisplay, { duration: "1h 23m 45s" }));
28
+ };
29
+ describe('<SessionSummaryDisplay />', () => {
30
+ it('renders the summary display with a title', () => {
31
+ const metrics = {
32
+ models: {
33
+ 'gemini-2.5-pro': {
34
+ api: { totalRequests: 10, totalErrors: 1, totalLatencyMs: 50234 },
35
+ tokens: {
36
+ prompt: 1000,
37
+ candidates: 2000,
38
+ total: 3500,
39
+ cached: 500,
40
+ thoughts: 300,
41
+ tool: 200,
42
+ },
43
+ },
44
+ },
45
+ tools: {
46
+ totalCalls: 0,
47
+ totalSuccess: 0,
48
+ totalFail: 0,
49
+ totalDurationMs: 0,
50
+ totalDecisions: { accept: 0, reject: 0, modify: 0 },
51
+ byName: {},
52
+ },
53
+ };
54
+ const { lastFrame } = renderWithMockedStats(metrics);
55
+ const output = lastFrame();
56
+ expect(output).toContain('Agent powering down. Goodbye!');
57
+ expect(output).toMatchSnapshot();
58
+ });
59
+ });
60
+ //# sourceMappingURL=SessionSummaryDisplay.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionSummaryDisplay.test.js","sourceRoot":"","sources":["../../../../src/ui/components/SessionSummaryDisplay.test.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,cAAc,MAAM,+BAA+B,CAAC;AAGhE,EAAE,CAAC,IAAI,CAAC,+BAA+B,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IAChE,MAAM,MAAM,GAAG,MAAM,cAAc,EAAyB,CAAC;IAC7D,OAAO;QACL,GAAG,MAAM;QACT,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;KACzB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AAEtE,MAAM,qBAAqB,GAAG,CAAC,OAAuB,EAAE,EAAE;IACxD,mBAAmB,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE;YACL,gBAAgB,EAAE,IAAI,IAAI,EAAE;YAC5B,OAAO;YACP,oBAAoB,EAAE,CAAC;SACxB;KACF,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,KAAC,qBAAqB,IAAC,QAAQ,EAAC,YAAY,GAAG,CAAC,CAAC;AACjE,CAAC,CAAC;AAEF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,OAAO,GAAmB;YAC9B,MAAM,EAAE;gBACN,gBAAgB,EAAE;oBAChB,GAAG,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE;oBACjE,MAAM,EAAE;wBACN,MAAM,EAAE,IAAI;wBACZ,UAAU,EAAE,IAAI;wBAChB,KAAK,EAAE,IAAI;wBACX,MAAM,EAAE,GAAG;wBACX,QAAQ,EAAE,GAAG;wBACb,IAAI,EAAE,GAAG;qBACV;iBACF;aACF;YACD,KAAK,EAAE;gBACL,UAAU,EAAE,CAAC;gBACb,YAAY,EAAE,CAAC;gBACf,SAAS,EAAE,CAAC;gBACZ,eAAe,EAAE,CAAC;gBAClB,cAAc,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;gBACnD,MAAM,EAAE,EAAE;aACX;SACF,CAAC;QAEF,MAAM,EAAE,SAAS,EAAE,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAE3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};