@vybestack/llxprt-code 0.3.4-nightly.250919.5e3f575d → 0.3.4-nightly.250921.fdbf3cd7

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 (203) hide show
  1. package/README.md +1 -0
  2. package/dist/package.json +7 -6
  3. package/dist/src/commands/extensions/examples/context/LLXPRT.md +8 -0
  4. package/dist/src/commands/extensions/examples/context/llxprt-extension.json +5 -0
  5. package/dist/src/commands/extensions/examples/custom-commands/commands/fs/grep-code.toml +6 -0
  6. package/dist/src/commands/extensions/examples/custom-commands/llxprt-extension.json +4 -0
  7. package/dist/src/commands/extensions/examples/exclude-tools/llxprt-extension.json +5 -0
  8. package/dist/src/commands/extensions/examples/mcp-server/example.d.ts +6 -0
  9. package/dist/src/commands/extensions/examples/mcp-server/example.js +46 -0
  10. package/dist/src/commands/extensions/examples/mcp-server/example.js.map +1 -0
  11. package/dist/src/commands/extensions/examples/mcp-server/example.ts +60 -0
  12. package/dist/src/commands/extensions/examples/mcp-server/llxprt-extension.json +10 -0
  13. package/dist/src/commands/extensions/install.js +35 -7
  14. package/dist/src/commands/extensions/install.js.map +1 -1
  15. package/dist/src/commands/extensions/install.test.js +20 -2
  16. package/dist/src/commands/extensions/install.test.js.map +1 -1
  17. package/dist/src/commands/extensions/link.d.ts +12 -0
  18. package/dist/src/commands/extensions/link.js +37 -0
  19. package/dist/src/commands/extensions/link.js.map +1 -0
  20. package/dist/src/commands/extensions/new.d.ts +7 -0
  21. package/dist/src/commands/extensions/new.js +70 -0
  22. package/dist/src/commands/extensions/new.js.map +1 -0
  23. package/dist/src/commands/extensions/new.test.d.ts +6 -0
  24. package/dist/src/commands/extensions/new.test.js +50 -0
  25. package/dist/src/commands/extensions/new.test.js.map +1 -0
  26. package/dist/src/commands/extensions/update.d.ts +2 -1
  27. package/dist/src/commands/extensions/update.js +40 -13
  28. package/dist/src/commands/extensions/update.js.map +1 -1
  29. package/dist/src/commands/extensions.js +4 -0
  30. package/dist/src/commands/extensions.js.map +1 -1
  31. package/dist/src/commands/mcp/add.js +1 -1
  32. package/dist/src/commands/mcp/add.js.map +1 -1
  33. package/dist/src/commands/mcp/list.js +2 -2
  34. package/dist/src/commands/mcp/list.js.map +1 -1
  35. package/dist/src/commands/mcp/remove.js +1 -1
  36. package/dist/src/commands/mcp/remove.js.map +1 -1
  37. package/dist/src/config/auth.d.ts +1 -1
  38. package/dist/src/config/auth.js +6 -13
  39. package/dist/src/config/auth.js.map +1 -1
  40. package/dist/src/config/auth.test.js +13 -7
  41. package/dist/src/config/auth.test.js.map +1 -1
  42. package/dist/src/config/config.d.ts +4 -1
  43. package/dist/src/config/config.js +47 -23
  44. package/dist/src/config/config.js.map +1 -1
  45. package/dist/src/config/extension.d.ts +8 -5
  46. package/dist/src/config/extension.js +76 -24
  47. package/dist/src/config/extension.js.map +1 -1
  48. package/dist/src/config/keyBindings.d.ts +1 -0
  49. package/dist/src/config/keyBindings.js +6 -25
  50. package/dist/src/config/keyBindings.js.map +1 -1
  51. package/dist/src/config/settings.d.ts +4 -4
  52. package/dist/src/config/settings.js +101 -68
  53. package/dist/src/config/settings.js.map +1 -1
  54. package/dist/src/config/settingsSchema.d.ts +252 -3
  55. package/dist/src/config/settingsSchema.js +248 -3
  56. package/dist/src/config/settingsSchema.js.map +1 -1
  57. package/dist/src/config/trustedFolders.d.ts +14 -3
  58. package/dist/src/config/trustedFolders.js +63 -37
  59. package/dist/src/config/trustedFolders.js.map +1 -1
  60. package/dist/src/config/trustedFolders.test.js +84 -9
  61. package/dist/src/config/trustedFolders.test.js.map +1 -1
  62. package/dist/src/gemini.js +74 -18
  63. package/dist/src/gemini.js.map +1 -1
  64. package/dist/src/gemini.test.js +7 -23
  65. package/dist/src/gemini.test.js.map +1 -1
  66. package/dist/src/generated/git-commit.d.ts +1 -1
  67. package/dist/src/generated/git-commit.js +1 -1
  68. package/dist/src/nonInteractiveCli.js +32 -2
  69. package/dist/src/nonInteractiveCli.js.map +1 -1
  70. package/dist/src/providers/providerManagerInstance.js +0 -1
  71. package/dist/src/providers/providerManagerInstance.js.map +1 -1
  72. package/dist/src/services/FileCommandLoader.d.ts +2 -0
  73. package/dist/src/services/FileCommandLoader.js +7 -0
  74. package/dist/src/services/FileCommandLoader.js.map +1 -1
  75. package/dist/src/ui/App.js +103 -51
  76. package/dist/src/ui/App.js.map +1 -1
  77. package/dist/src/ui/commands/directoryCommand.js +1 -1
  78. package/dist/src/ui/commands/directoryCommand.js.map +1 -1
  79. package/dist/src/ui/commands/memoryCommand.js +1 -1
  80. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  81. package/dist/src/ui/components/AuthDialog.test.js +13 -13
  82. package/dist/src/ui/components/AuthDialog.test.js.map +1 -1
  83. package/dist/src/ui/components/FolderTrustDialog.js +5 -3
  84. package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
  85. package/dist/src/ui/components/FolderTrustDialog.test.js +21 -6
  86. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  87. package/dist/src/ui/components/Footer.d.ts +3 -0
  88. package/dist/src/ui/components/Footer.js +4 -4
  89. package/dist/src/ui/components/Footer.js.map +1 -1
  90. package/dist/src/ui/components/GeminiRespondingSpinner.js +5 -3
  91. package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -1
  92. package/dist/src/ui/components/InputPrompt.d.ts +2 -2
  93. package/dist/src/ui/components/InputPrompt.js +35 -25
  94. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  95. package/dist/src/ui/components/MemoryUsageDisplay.js +1 -1
  96. package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
  97. package/dist/src/ui/components/ProQuotaDialog.d.ts +13 -0
  98. package/dist/src/ui/components/ProQuotaDialog.js +22 -0
  99. package/dist/src/ui/components/ProQuotaDialog.js.map +1 -0
  100. package/dist/src/ui/components/ProQuotaDialog.test.d.ts +6 -0
  101. package/dist/src/ui/components/ProQuotaDialog.test.js +57 -0
  102. package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -0
  103. package/dist/src/ui/components/SettingsDialog.test.js +2 -2
  104. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  105. package/dist/src/ui/components/messages/CompressionMessage.js +1 -1
  106. package/dist/src/ui/components/messages/CompressionMessage.js.map +1 -1
  107. package/dist/src/ui/components/messages/DiffRenderer.js +5 -1
  108. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  109. package/dist/src/ui/components/messages/GeminiMessage.js +1 -1
  110. package/dist/src/ui/components/messages/GeminiMessage.js.map +1 -1
  111. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +1 -1
  112. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  113. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +0 -8
  114. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
  115. package/dist/src/ui/components/messages/ToolMessage.js +2 -1
  116. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  117. package/dist/src/ui/components/messages/UserMessage.js +1 -1
  118. package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
  119. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  120. package/dist/src/ui/components/shared/RadioButtonSelect.js +1 -1
  121. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  122. package/dist/src/ui/components/shared/RadioButtonSelect.test.js +2 -2
  123. package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +1 -1
  124. package/dist/src/ui/components/shared/text-buffer.js +35 -51
  125. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  126. package/dist/src/ui/constants.d.ts +8 -2
  127. package/dist/src/ui/constants.js +9 -2
  128. package/dist/src/ui/constants.js.map +1 -1
  129. package/dist/src/ui/containers/SessionController.js +1 -1
  130. package/dist/src/ui/containers/SessionController.js.map +1 -1
  131. package/dist/src/ui/containers/SessionController.test.js +1 -0
  132. package/dist/src/ui/containers/SessionController.test.js.map +1 -1
  133. package/dist/src/ui/contexts/KeypressContext.js +255 -42
  134. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  135. package/dist/src/ui/contexts/KeypressContext.test.js +115 -1
  136. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  137. package/dist/src/ui/hooks/slashCommandProcessor.js +3 -1
  138. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  139. package/dist/src/ui/hooks/useFolderTrust.js +6 -3
  140. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
  141. package/dist/src/ui/hooks/useGeminiStream.d.ts +2 -1
  142. package/dist/src/ui/hooks/useGeminiStream.integration.test.js +1 -1
  143. package/dist/src/ui/hooks/useGeminiStream.integration.test.js.map +1 -1
  144. package/dist/src/ui/hooks/useGeminiStream.js +170 -35
  145. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  146. package/dist/src/ui/hooks/useIdeTrustListener.d.ts +15 -0
  147. package/dist/src/ui/hooks/useIdeTrustListener.js +37 -0
  148. package/dist/src/ui/hooks/useIdeTrustListener.js.map +1 -0
  149. package/dist/src/ui/hooks/useInputHistoryStore.d.ts +19 -0
  150. package/dist/src/ui/hooks/useInputHistoryStore.js +81 -0
  151. package/dist/src/ui/hooks/useInputHistoryStore.js.map +1 -0
  152. package/dist/src/ui/hooks/useInputHistoryStore.test.d.ts +6 -0
  153. package/dist/src/ui/hooks/useInputHistoryStore.test.js +234 -0
  154. package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +1 -0
  155. package/dist/src/ui/hooks/useLoadingIndicator.d.ts +1 -1
  156. package/dist/src/ui/hooks/useLoadingIndicator.js +2 -2
  157. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
  158. package/dist/src/ui/hooks/useLoadingIndicator.test.d.ts +6 -0
  159. package/dist/src/ui/hooks/useLoadingIndicator.test.js +102 -0
  160. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -0
  161. package/dist/src/ui/hooks/usePhraseCycler.d.ts +1 -1
  162. package/dist/src/ui/hooks/usePhraseCycler.js +12 -17
  163. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  164. package/dist/src/ui/hooks/usePrivacySettings.d.ts +1 -1
  165. package/dist/src/ui/hooks/usePrivacySettings.js +20 -13
  166. package/dist/src/ui/hooks/usePrivacySettings.js.map +1 -1
  167. package/dist/src/ui/hooks/usePrivacySettings.test.js +52 -105
  168. package/dist/src/ui/hooks/usePrivacySettings.test.js.map +1 -1
  169. package/dist/src/ui/hooks/useToolScheduler.test.js +57 -70
  170. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  171. package/dist/src/ui/keyMatchers.test.js +9 -0
  172. package/dist/src/ui/keyMatchers.test.js.map +1 -1
  173. package/dist/src/ui/textConstants.d.ts +9 -0
  174. package/dist/src/ui/textConstants.js +10 -0
  175. package/dist/src/ui/textConstants.js.map +1 -0
  176. package/dist/src/ui/utils/MarkdownDisplay.test.js +2 -2
  177. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
  178. package/dist/src/ui/utils/highlight.d.ts +10 -0
  179. package/dist/src/ui/utils/highlight.js +41 -0
  180. package/dist/src/ui/utils/highlight.js.map +1 -0
  181. package/dist/src/ui/utils/highlight.test.d.ts +6 -0
  182. package/dist/src/ui/utils/highlight.test.js +93 -0
  183. package/dist/src/ui/utils/highlight.test.js.map +1 -0
  184. package/dist/src/ui/utils/platformConstants.d.ts +24 -1
  185. package/dist/src/ui/utils/platformConstants.js +26 -1
  186. package/dist/src/ui/utils/platformConstants.js.map +1 -1
  187. package/dist/src/utils/envVarResolver.d.ts +39 -0
  188. package/dist/src/utils/envVarResolver.js +97 -0
  189. package/dist/src/utils/envVarResolver.js.map +1 -0
  190. package/dist/src/utils/envVarResolver.test.d.ts +6 -0
  191. package/dist/src/utils/envVarResolver.test.js +221 -0
  192. package/dist/src/utils/envVarResolver.test.js.map +1 -0
  193. package/dist/src/utils/errors.d.ts +9 -0
  194. package/dist/src/utils/errors.js +18 -0
  195. package/dist/src/utils/errors.js.map +1 -0
  196. package/dist/src/utils/userStartupWarnings.d.ts +1 -1
  197. package/dist/src/utils/userStartupWarnings.js +1 -1
  198. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  199. package/dist/src/zed-integration/schema.d.ts +398 -398
  200. package/dist/src/zed-integration/zedIntegration.js +11 -7
  201. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  202. package/dist/tsconfig.tsbuildinfo +1 -1
  203. package/package.json +7 -6
@@ -0,0 +1,93 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect } from 'vitest';
7
+ import { parseInputForHighlighting } from './highlight.js';
8
+ describe('parseInputForHighlighting', () => {
9
+ it('should handle an empty string', () => {
10
+ expect(parseInputForHighlighting('')).toEqual([
11
+ { text: '', type: 'default' },
12
+ ]);
13
+ });
14
+ it('should handle text with no commands or files', () => {
15
+ const text = 'this is a normal sentence';
16
+ expect(parseInputForHighlighting(text)).toEqual([
17
+ { text, type: 'default' },
18
+ ]);
19
+ });
20
+ it('should highlight a single command at the beginning', () => {
21
+ const text = '/help me';
22
+ expect(parseInputForHighlighting(text)).toEqual([
23
+ { text: '/help', type: 'command' },
24
+ { text: ' me', type: 'default' },
25
+ ]);
26
+ });
27
+ it('should highlight a single file path at the beginning', () => {
28
+ const text = '@path/to/file.txt please';
29
+ expect(parseInputForHighlighting(text)).toEqual([
30
+ { text: '@path/to/file.txt', type: 'file' },
31
+ { text: ' please', type: 'default' },
32
+ ]);
33
+ });
34
+ it('should highlight a command in the middle', () => {
35
+ const text = 'I need /help with this';
36
+ expect(parseInputForHighlighting(text)).toEqual([
37
+ { text: 'I need ', type: 'default' },
38
+ { text: '/help', type: 'command' },
39
+ { text: ' with this', type: 'default' },
40
+ ]);
41
+ });
42
+ it('should highlight a file path in the middle', () => {
43
+ const text = 'Please check @path/to/file.txt for details';
44
+ expect(parseInputForHighlighting(text)).toEqual([
45
+ { text: 'Please check ', type: 'default' },
46
+ { text: '@path/to/file.txt', type: 'file' },
47
+ { text: ' for details', type: 'default' },
48
+ ]);
49
+ });
50
+ it('should highlight multiple commands and files', () => {
51
+ const text = 'Use /run with @file.js and also /format @another/file.ts';
52
+ expect(parseInputForHighlighting(text)).toEqual([
53
+ { text: 'Use ', type: 'default' },
54
+ { text: '/run', type: 'command' },
55
+ { text: ' with ', type: 'default' },
56
+ { text: '@file.js', type: 'file' },
57
+ { text: ' and also ', type: 'default' },
58
+ { text: '/format', type: 'command' },
59
+ { text: ' ', type: 'default' },
60
+ { text: '@another/file.ts', type: 'file' },
61
+ ]);
62
+ });
63
+ it('should handle adjacent highlights', () => {
64
+ const text = '/run@file.js';
65
+ expect(parseInputForHighlighting(text)).toEqual([
66
+ { text: '/run', type: 'command' },
67
+ { text: '@file.js', type: 'file' },
68
+ ]);
69
+ });
70
+ it('should handle highlights at the end of the string', () => {
71
+ const text = 'Get help with /help';
72
+ expect(parseInputForHighlighting(text)).toEqual([
73
+ { text: 'Get help with ', type: 'default' },
74
+ { text: '/help', type: 'command' },
75
+ ]);
76
+ });
77
+ it('should handle file paths with dots and dashes', () => {
78
+ const text = 'Check @./path-to/file-name.v2.txt';
79
+ expect(parseInputForHighlighting(text)).toEqual([
80
+ { text: 'Check ', type: 'default' },
81
+ { text: '@./path-to/file-name.v2.txt', type: 'file' },
82
+ ]);
83
+ });
84
+ it('should handle commands with dashes and numbers', () => {
85
+ const text = 'Run /command-123 now';
86
+ expect(parseInputForHighlighting(text)).toEqual([
87
+ { text: 'Run ', type: 'default' },
88
+ { text: '/command-123', type: 'command' },
89
+ { text: ' now', type: 'default' },
90
+ ]);
91
+ });
92
+ });
93
+ //# sourceMappingURL=highlight.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlight.test.js","sourceRoot":"","sources":["../../../../src/ui/utils/highlight.test.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,29 @@ export declare const KITTY_KEYCODE_ENTER = 13;
21
21
  export declare const KITTY_KEYCODE_NUMPAD_ENTER = 57414;
22
22
  export declare const KITTY_KEYCODE_TAB = 9;
23
23
  export declare const KITTY_KEYCODE_BACKSPACE = 127;
24
+ /**
25
+ * Kitty modifier decoding constants
26
+ *
27
+ * In Kitty/Ghostty, the modifier parameter is encoded as (1 + bitmask).
28
+ * Some terminals also set bit 7 (i.e., add 128) when reporting event types.
29
+ */
30
+ export declare const KITTY_MODIFIER_BASE = 1;
31
+ export declare const KITTY_MODIFIER_EVENT_TYPES_OFFSET = 128;
32
+ /**
33
+ * Modifier bit flags for Kitty/Xterm-style parameters.
34
+ *
35
+ * Per spec, the modifiers parameter encodes (1 + bitmask) where:
36
+ * - 1: no modifiers
37
+ * - bit 0 (1): Shift
38
+ * - bit 1 (2): Alt/Option (reported as "alt" in spec; we map to meta)
39
+ * - bit 2 (4): Ctrl
40
+ *
41
+ * Some terminals add 128 to the entire modifiers field when reporting event types.
42
+ * See: https://sw.kovidgoyal.net/kitty/keyboard-protocol/#modifiers
43
+ */
44
+ export declare const MODIFIER_SHIFT_BIT = 1;
45
+ export declare const MODIFIER_ALT_BIT = 2;
46
+ export declare const MODIFIER_CTRL_BIT = 4;
24
47
  /**
25
48
  * Timing constants for terminal interactions
26
49
  */
@@ -42,7 +65,7 @@ export declare const BACKSLASH_ENTER_DETECTION_WINDOW_MS = 5;
42
65
  * Longest reasonable: \x1b[127;15~ = 11 chars (Del with all modifiers)
43
66
  * We use 12 to provide a small buffer.
44
67
  */
45
- export declare const MAX_KITTY_SEQUENCE_LENGTH = 12;
68
+ export declare const MAX_KITTY_SEQUENCE_LENGTH = 32;
46
69
  /**
47
70
  * Character codes for common escape sequences
48
71
  */
@@ -21,6 +21,29 @@ export const KITTY_KEYCODE_ENTER = 13;
21
21
  export const KITTY_KEYCODE_NUMPAD_ENTER = 57414;
22
22
  export const KITTY_KEYCODE_TAB = 9;
23
23
  export const KITTY_KEYCODE_BACKSPACE = 127;
24
+ /**
25
+ * Kitty modifier decoding constants
26
+ *
27
+ * In Kitty/Ghostty, the modifier parameter is encoded as (1 + bitmask).
28
+ * Some terminals also set bit 7 (i.e., add 128) when reporting event types.
29
+ */
30
+ export const KITTY_MODIFIER_BASE = 1; // Base value per spec before bitmask decode
31
+ export const KITTY_MODIFIER_EVENT_TYPES_OFFSET = 128; // Added when event types are included
32
+ /**
33
+ * Modifier bit flags for Kitty/Xterm-style parameters.
34
+ *
35
+ * Per spec, the modifiers parameter encodes (1 + bitmask) where:
36
+ * - 1: no modifiers
37
+ * - bit 0 (1): Shift
38
+ * - bit 1 (2): Alt/Option (reported as "alt" in spec; we map to meta)
39
+ * - bit 2 (4): Ctrl
40
+ *
41
+ * Some terminals add 128 to the entire modifiers field when reporting event types.
42
+ * See: https://sw.kovidgoyal.net/kitty/keyboard-protocol/#modifiers
43
+ */
44
+ export const MODIFIER_SHIFT_BIT = 1;
45
+ export const MODIFIER_ALT_BIT = 2;
46
+ export const MODIFIER_CTRL_BIT = 4;
24
47
  /**
25
48
  * Timing constants for terminal interactions
26
49
  */
@@ -42,7 +65,9 @@ export const BACKSLASH_ENTER_DETECTION_WINDOW_MS = 5;
42
65
  * Longest reasonable: \x1b[127;15~ = 11 chars (Del with all modifiers)
43
66
  * We use 12 to provide a small buffer.
44
67
  */
45
- export const MAX_KITTY_SEQUENCE_LENGTH = 12;
68
+ // Increased to accommodate parameterized forms and occasional colon subfields
69
+ // while still being small enough to avoid pathological buffering.
70
+ export const MAX_KITTY_SEQUENCE_LENGTH = 32;
46
71
  /**
47
72
  * Character codes for common escape sequences
48
73
  */
@@ -1 +1 @@
1
- {"version":3,"file":"platformConstants.js","sourceRoot":"","sources":["../../../../src/ui/utils/platformConstants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AACtC,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,CAAC;AAChD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C;;GAEG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,CAAC;AAEjD;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,QAAQ,CAAC;AAEpD;;;;GAIG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAC,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAChC,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AACzC,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAC9B,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC"}
1
+ {"version":3,"file":"platformConstants.js","sourceRoot":"","sources":["../../../../src/ui/utils/platformConstants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AACtC,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,CAAC;AAChD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,CAAC,4CAA4C;AAClF,MAAM,CAAC,MAAM,iCAAiC,GAAG,GAAG,CAAC,CAAC,sCAAsC;AAE5F;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AACpC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC;;GAEG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,CAAC;AAEjD;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,QAAQ,CAAC;AAEpD;;;;GAIG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAC,CAAC;AAErD;;;;;;GAMG;AACH,8EAA8E;AAC9E,kEAAkE;AAClE,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAChC,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AACzC,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAC9B,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Resolves environment variables in a string.
8
+ * Replaces $VAR_NAME and ${VAR_NAME} with their corresponding environment variable values.
9
+ * If the environment variable is not defined, the original placeholder is preserved.
10
+ *
11
+ * @param value - The string that may contain environment variable placeholders
12
+ * @returns The string with environment variables resolved
13
+ *
14
+ * @example
15
+ * resolveEnvVarsInString("Token: $API_KEY") // Returns "Token: secret-123"
16
+ * resolveEnvVarsInString("URL: ${BASE_URL}/api") // Returns "URL: https://api.example.com/api"
17
+ * resolveEnvVarsInString("Missing: $UNDEFINED_VAR") // Returns "Missing: $UNDEFINED_VAR"
18
+ */
19
+ export declare function resolveEnvVarsInString(value: string): string;
20
+ /**
21
+ * Recursively resolves environment variables in an object of any type.
22
+ * Handles strings, arrays, nested objects, and preserves other primitive types.
23
+ * Protected against circular references using a WeakSet to track visited objects.
24
+ *
25
+ * @param obj - The object to process for environment variable resolution
26
+ * @returns A new object with environment variables resolved
27
+ *
28
+ * @example
29
+ * const config = {
30
+ * server: {
31
+ * host: "$HOST",
32
+ * port: "${PORT}",
33
+ * enabled: true,
34
+ * tags: ["$ENV", "api"]
35
+ * }
36
+ * };
37
+ * const resolved = resolveEnvVarsInObject(config);
38
+ */
39
+ export declare function resolveEnvVarsInObject<T>(obj: T): T;
@@ -0,0 +1,97 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Resolves environment variables in a string.
8
+ * Replaces $VAR_NAME and ${VAR_NAME} with their corresponding environment variable values.
9
+ * If the environment variable is not defined, the original placeholder is preserved.
10
+ *
11
+ * @param value - The string that may contain environment variable placeholders
12
+ * @returns The string with environment variables resolved
13
+ *
14
+ * @example
15
+ * resolveEnvVarsInString("Token: $API_KEY") // Returns "Token: secret-123"
16
+ * resolveEnvVarsInString("URL: ${BASE_URL}/api") // Returns "URL: https://api.example.com/api"
17
+ * resolveEnvVarsInString("Missing: $UNDEFINED_VAR") // Returns "Missing: $UNDEFINED_VAR"
18
+ */
19
+ export function resolveEnvVarsInString(value) {
20
+ const envVarRegex = /\$(?:(\w+)|{([^}]+)})/g; // Find $VAR_NAME or ${VAR_NAME}
21
+ return value.replace(envVarRegex, (match, varName1, varName2) => {
22
+ const varName = varName1 || varName2;
23
+ if (process && process.env && typeof process.env[varName] === 'string') {
24
+ return process.env[varName];
25
+ }
26
+ return match;
27
+ });
28
+ }
29
+ /**
30
+ * Recursively resolves environment variables in an object of any type.
31
+ * Handles strings, arrays, nested objects, and preserves other primitive types.
32
+ * Protected against circular references using a WeakSet to track visited objects.
33
+ *
34
+ * @param obj - The object to process for environment variable resolution
35
+ * @returns A new object with environment variables resolved
36
+ *
37
+ * @example
38
+ * const config = {
39
+ * server: {
40
+ * host: "$HOST",
41
+ * port: "${PORT}",
42
+ * enabled: true,
43
+ * tags: ["$ENV", "api"]
44
+ * }
45
+ * };
46
+ * const resolved = resolveEnvVarsInObject(config);
47
+ */
48
+ export function resolveEnvVarsInObject(obj) {
49
+ return resolveEnvVarsInObjectInternal(obj, new WeakSet());
50
+ }
51
+ /**
52
+ * Internal implementation of resolveEnvVarsInObject with circular reference protection.
53
+ *
54
+ * @param obj - The object to process
55
+ * @param visited - WeakSet to track visited objects and prevent circular references
56
+ * @returns A new object with environment variables resolved
57
+ */
58
+ function resolveEnvVarsInObjectInternal(obj, visited) {
59
+ if (obj === null ||
60
+ obj === undefined ||
61
+ typeof obj === 'boolean' ||
62
+ typeof obj === 'number') {
63
+ return obj;
64
+ }
65
+ if (typeof obj === 'string') {
66
+ return resolveEnvVarsInString(obj);
67
+ }
68
+ if (Array.isArray(obj)) {
69
+ // Check for circular reference
70
+ if (visited.has(obj)) {
71
+ // Return a shallow copy to break the cycle
72
+ return [...obj];
73
+ }
74
+ visited.add(obj);
75
+ const result = obj.map((item) => resolveEnvVarsInObjectInternal(item, visited));
76
+ visited.delete(obj);
77
+ return result;
78
+ }
79
+ if (typeof obj === 'object') {
80
+ // Check for circular reference
81
+ if (visited.has(obj)) {
82
+ // Return a shallow copy to break the cycle
83
+ return { ...obj };
84
+ }
85
+ visited.add(obj);
86
+ const newObj = { ...obj };
87
+ for (const key in newObj) {
88
+ if (Object.prototype.hasOwnProperty.call(newObj, key)) {
89
+ newObj[key] = resolveEnvVarsInObjectInternal(newObj[key], visited);
90
+ }
91
+ }
92
+ visited.delete(obj);
93
+ return newObj;
94
+ }
95
+ return obj;
96
+ }
97
+ //# sourceMappingURL=envVarResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envVarResolver.js","sourceRoot":"","sources":["../../../src/utils/envVarResolver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,MAAM,WAAW,GAAG,wBAAwB,CAAC,CAAC,gCAAgC;IAC9E,OAAO,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;QAC9D,MAAM,OAAO,GAAG,QAAQ,IAAI,QAAQ,CAAC;QACrC,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YACvE,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;QAC/B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,sBAAsB,CAAI,GAAM;IAC9C,OAAO,8BAA8B,CAAC,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;GAMG;AACH,SAAS,8BAA8B,CACrC,GAAM,EACN,OAAwB;IAExB,IACE,GAAG,KAAK,IAAI;QACZ,GAAG,KAAK,SAAS;QACjB,OAAO,GAAG,KAAK,SAAS;QACxB,OAAO,GAAG,KAAK,QAAQ,EACvB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,sBAAsB,CAAC,GAAG,CAAiB,CAAC;IACrD,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,+BAA+B;QAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,2CAA2C;YAC3C,OAAO,CAAC,GAAG,GAAG,CAAiB,CAAC;QAClC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC9B,8BAA8B,CAAC,IAAI,EAAE,OAAO,CAAC,CAC9B,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,+BAA+B;QAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,GAAa,CAAC,EAAE,CAAC;YAC/B,2CAA2C;YAC3C,OAAO,EAAE,GAAG,GAAG,EAAO,CAAC;QACzB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,GAAa,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,EAAE,GAAG,GAAG,EAAO,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;gBACtD,MAAM,CAAC,GAAG,CAAC,GAAG,8BAA8B,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,GAAa,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -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,221 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
7
+ import { resolveEnvVarsInString, resolveEnvVarsInObject, } from './envVarResolver.js';
8
+ describe('resolveEnvVarsInString', () => {
9
+ let originalEnv;
10
+ beforeEach(() => {
11
+ originalEnv = { ...process.env };
12
+ });
13
+ afterEach(() => {
14
+ process.env = originalEnv;
15
+ });
16
+ it('should resolve $VAR_NAME format', () => {
17
+ process.env['TEST_VAR'] = 'test-value';
18
+ const result = resolveEnvVarsInString('Value is $TEST_VAR');
19
+ expect(result).toBe('Value is test-value');
20
+ });
21
+ it('should resolve ${VAR_NAME} format', () => {
22
+ process.env['TEST_VAR'] = 'test-value';
23
+ const result = resolveEnvVarsInString('Value is ${TEST_VAR}');
24
+ expect(result).toBe('Value is test-value');
25
+ });
26
+ it('should resolve multiple variables in the same string', () => {
27
+ process.env['HOST'] = 'localhost';
28
+ process.env['PORT'] = '3000';
29
+ const result = resolveEnvVarsInString('URL: http://$HOST:${PORT}/api');
30
+ expect(result).toBe('URL: http://localhost:3000/api');
31
+ });
32
+ it('should leave undefined variables unchanged', () => {
33
+ const result = resolveEnvVarsInString('Value is $UNDEFINED_VAR');
34
+ expect(result).toBe('Value is $UNDEFINED_VAR');
35
+ });
36
+ it('should leave undefined variables with braces unchanged', () => {
37
+ const result = resolveEnvVarsInString('Value is ${UNDEFINED_VAR}');
38
+ expect(result).toBe('Value is ${UNDEFINED_VAR}');
39
+ });
40
+ it('should handle empty string', () => {
41
+ const result = resolveEnvVarsInString('');
42
+ expect(result).toBe('');
43
+ });
44
+ it('should handle string without variables', () => {
45
+ const result = resolveEnvVarsInString('No variables here');
46
+ expect(result).toBe('No variables here');
47
+ });
48
+ it('should handle mixed defined and undefined variables', () => {
49
+ process.env['DEFINED'] = 'value';
50
+ const result = resolveEnvVarsInString('$DEFINED and $UNDEFINED mixed');
51
+ expect(result).toBe('value and $UNDEFINED mixed');
52
+ });
53
+ });
54
+ describe('resolveEnvVarsInObject', () => {
55
+ let originalEnv;
56
+ beforeEach(() => {
57
+ originalEnv = { ...process.env };
58
+ });
59
+ afterEach(() => {
60
+ process.env = originalEnv;
61
+ });
62
+ it('should resolve variables in nested objects', () => {
63
+ process.env['API_KEY'] = 'secret-123';
64
+ process.env['DB_URL'] = 'postgresql://localhost/test';
65
+ const config = {
66
+ server: {
67
+ auth: {
68
+ key: '$API_KEY',
69
+ },
70
+ database: '${DB_URL}',
71
+ },
72
+ port: 3000,
73
+ };
74
+ const result = resolveEnvVarsInObject(config);
75
+ expect(result).toEqual({
76
+ server: {
77
+ auth: {
78
+ key: 'secret-123',
79
+ },
80
+ database: 'postgresql://localhost/test',
81
+ },
82
+ port: 3000,
83
+ });
84
+ });
85
+ it('should resolve variables in arrays', () => {
86
+ process.env['ENV'] = 'production';
87
+ process.env['VERSION'] = '1.0.0';
88
+ const config = {
89
+ tags: ['$ENV', 'app', '${VERSION}'],
90
+ metadata: {
91
+ env: '$ENV',
92
+ },
93
+ };
94
+ const result = resolveEnvVarsInObject(config);
95
+ expect(result).toEqual({
96
+ tags: ['production', 'app', '1.0.0'],
97
+ metadata: {
98
+ env: 'production',
99
+ },
100
+ });
101
+ });
102
+ it('should preserve non-string types', () => {
103
+ const config = {
104
+ enabled: true,
105
+ count: 42,
106
+ value: null,
107
+ data: undefined,
108
+ tags: ['item1', 'item2'],
109
+ };
110
+ const result = resolveEnvVarsInObject(config);
111
+ expect(result).toEqual(config);
112
+ });
113
+ it('should handle MCP server config structure', () => {
114
+ process.env['API_TOKEN'] = 'token-123';
115
+ process.env['SERVER_PORT'] = '8080';
116
+ const extensionConfig = {
117
+ name: 'test-extension',
118
+ version: '1.0.0',
119
+ mcpServers: {
120
+ 'test-server': {
121
+ command: 'node',
122
+ args: ['server.js', '--port', '${SERVER_PORT}'],
123
+ env: {
124
+ API_KEY: '$API_TOKEN',
125
+ STATIC_VALUE: 'unchanged',
126
+ },
127
+ timeout: 5000,
128
+ },
129
+ },
130
+ };
131
+ const result = resolveEnvVarsInObject(extensionConfig);
132
+ expect(result).toEqual({
133
+ name: 'test-extension',
134
+ version: '1.0.0',
135
+ mcpServers: {
136
+ 'test-server': {
137
+ command: 'node',
138
+ args: ['server.js', '--port', '8080'],
139
+ env: {
140
+ API_KEY: 'token-123',
141
+ STATIC_VALUE: 'unchanged',
142
+ },
143
+ timeout: 5000,
144
+ },
145
+ },
146
+ });
147
+ });
148
+ it('should handle empty and null values', () => {
149
+ const config = {
150
+ empty: '',
151
+ nullValue: null,
152
+ undefinedValue: undefined,
153
+ zero: 0,
154
+ false: false,
155
+ };
156
+ const result = resolveEnvVarsInObject(config);
157
+ expect(result).toEqual(config);
158
+ });
159
+ it('should handle circular references in objects without infinite recursion', () => {
160
+ process.env['TEST_VAR'] = 'resolved-value';
161
+ const config = {
162
+ name: '$TEST_VAR',
163
+ value: 42,
164
+ };
165
+ // Create circular reference
166
+ config.self = config;
167
+ const result = resolveEnvVarsInObject(config);
168
+ expect(result.name).toBe('resolved-value');
169
+ expect(result.value).toBe(42);
170
+ expect(result.self).toBeDefined();
171
+ expect(result.self?.name).toBe('$TEST_VAR'); // Circular reference should be shallow copied
172
+ expect(result.self?.value).toBe(42);
173
+ // Verify it doesn't create infinite recursion by checking it's not the same object
174
+ expect(result.self).not.toBe(result);
175
+ });
176
+ it('should handle circular references in arrays without infinite recursion', () => {
177
+ process.env['ARRAY_VAR'] = 'array-value';
178
+ const arr = ['$ARRAY_VAR', 123];
179
+ // Create circular reference
180
+ arr.push(arr);
181
+ const result = resolveEnvVarsInObject(arr);
182
+ expect(result[0]).toBe('array-value');
183
+ expect(result[1]).toBe(123);
184
+ expect(Array.isArray(result[2])).toBe(true);
185
+ const subArray = result[2];
186
+ expect(subArray[0]).toBe('$ARRAY_VAR'); // Circular reference should be shallow copied
187
+ expect(subArray[1]).toBe(123);
188
+ // Verify it doesn't create infinite recursion
189
+ expect(result[2]).not.toBe(result);
190
+ });
191
+ it('should handle complex nested circular references', () => {
192
+ process.env['NESTED_VAR'] = 'nested-resolved';
193
+ const obj1 = { name: '$NESTED_VAR', id: 1 };
194
+ const obj2 = { name: 'static', id: 2 };
195
+ // Create cross-references
196
+ obj1.ref = obj2;
197
+ obj2.ref = obj1;
198
+ const config = {
199
+ primary: obj1,
200
+ secondary: obj2,
201
+ value: '$NESTED_VAR',
202
+ };
203
+ const result = resolveEnvVarsInObject(config);
204
+ expect(result.value).toBe('nested-resolved');
205
+ expect(result.primary.name).toBe('nested-resolved');
206
+ expect(result.primary.id).toBe(1);
207
+ expect(result.secondary.name).toBe('static');
208
+ expect(result.secondary.id).toBe(2);
209
+ // Check that circular references are handled (shallow copied)
210
+ expect(result.primary.ref).toBeDefined();
211
+ expect(result.secondary.ref).toBeDefined();
212
+ expect(result.primary.ref?.name).toBe('static'); // Should be shallow copy
213
+ expect(result.secondary.ref?.name).toBe('nested-resolved'); // The shallow copy still gets processed
214
+ // Most importantly: verify no infinite recursion by checking objects are different
215
+ expect(result.primary.ref).not.toBe(result.secondary);
216
+ expect(result.secondary.ref).not.toBe(result.primary);
217
+ expect(result.primary).not.toBe(obj1); // New object created
218
+ expect(result.secondary).not.toBe(obj2); // New object created
219
+ });
220
+ });
221
+ //# sourceMappingURL=envVarResolver.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envVarResolver.test.js","sourceRoot":"","sources":["../../../src/utils/envVarResolver.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAE7B,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAI,WAA8B,CAAC;IAEnC,UAAU,CAAC,GAAG,EAAE;QACd,WAAW,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC;QAEvC,MAAM,MAAM,GAAG,sBAAsB,CAAC,oBAAoB,CAAC,CAAC;QAE5D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC;QAEvC,MAAM,MAAM,GAAG,sBAAsB,CAAC,sBAAsB,CAAC,CAAC;QAE9D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;QAE7B,MAAM,MAAM,GAAG,sBAAsB,CAAC,+BAA+B,CAAC,CAAC;QAEvE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,MAAM,GAAG,sBAAsB,CAAC,yBAAyB,CAAC,CAAC;QAEjE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,MAAM,GAAG,sBAAsB,CAAC,2BAA2B,CAAC,CAAC;QAEnE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,MAAM,GAAG,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAE1C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG,sBAAsB,CAAC,mBAAmB,CAAC,CAAC;QAE3D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;QAEjC,MAAM,MAAM,GAAG,sBAAsB,CAAC,+BAA+B,CAAC,CAAC;QAEvE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAI,WAA8B,CAAC;IAEnC,UAAU,CAAC,GAAG,EAAE;QACd,WAAW,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,6BAA6B,CAAC;QAEtD,MAAM,MAAM,GAAG;YACb,MAAM,EAAE;gBACN,IAAI,EAAE;oBACJ,GAAG,EAAE,UAAU;iBAChB;gBACD,QAAQ,EAAE,WAAW;aACtB;YACD,IAAI,EAAE,IAAI;SACX,CAAC;QAEF,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAE9C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,MAAM,EAAE;gBACN,IAAI,EAAE;oBACJ,GAAG,EAAE,YAAY;iBAClB;gBACD,QAAQ,EAAE,6BAA6B;aACxC;YACD,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;QAEjC,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC;YACnC,QAAQ,EAAE;gBACR,GAAG,EAAE,MAAM;aACZ;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAE9C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,IAAI,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,OAAO,CAAC;YACpC,QAAQ,EAAE;gBACR,GAAG,EAAE,YAAY;aAClB;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,MAAM,GAAG;YACb,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;SACzB,CAAC;QAEF,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAE9C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC;QAEpC,MAAM,eAAe,GAAG;YACtB,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,OAAO;YAChB,UAAU,EAAE;gBACV,aAAa,EAAE;oBACb,OAAO,EAAE,MAAM;oBACf,IAAI,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,gBAAgB,CAAC;oBAC/C,GAAG,EAAE;wBACH,OAAO,EAAE,YAAY;wBACrB,YAAY,EAAE,WAAW;qBAC1B;oBACD,OAAO,EAAE,IAAI;iBACd;aACF;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,sBAAsB,CAAC,eAAe,CAAC,CAAC;QAEvD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,OAAO;YAChB,UAAU,EAAE;gBACV,aAAa,EAAE;oBACb,OAAO,EAAE,MAAM;oBACf,IAAI,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC;oBACrC,GAAG,EAAE;wBACH,OAAO,EAAE,WAAW;wBACpB,YAAY,EAAE,WAAW;qBAC1B;oBACD,OAAO,EAAE,IAAI;iBACd;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG;YACb,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,SAAS;YACzB,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,KAAK;SACb,CAAC;QAEF,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAE9C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,gBAAgB,CAAC;QAQ3C,MAAM,MAAM,GAA0B;YACpC,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,EAAE;SACV,CAAC;QACF,4BAA4B;QAC5B,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC;QAErB,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAE9C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,8CAA8C;QAC3F,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpC,mFAAmF;QACnF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,aAAa,CAAC;QAGzC,MAAM,GAAG,GAAyB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QACtD,4BAA4B;QAC5B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEd,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,CAAyB,CAAC;QAEnE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAyB,CAAC;QACnD,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,8CAA8C;QACtF,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,8CAA8C;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,iBAAiB,CAAC;QAQ9C,MAAM,IAAI,GAAe,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,GAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QAEnD,0BAA0B;QAC1B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;QAEhB,MAAM,MAAM,GAAG;YACb,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,aAAa;SACrB,CAAC;QAEF,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAE9C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpC,8DAA8D;QAC9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,yBAAyB;QAC1E,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,wCAAwC;QAEpG,mFAAmF;QACnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB;QAC5D,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB;IAChE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Extracts a string error message from an unknown error type
8
+ */
9
+ export declare function getErrorMessage(error: unknown): string;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Extracts a string error message from an unknown error type
8
+ */
9
+ export function getErrorMessage(error) {
10
+ if (error instanceof Error) {
11
+ return error.message;
12
+ }
13
+ if (typeof error === 'string') {
14
+ return error;
15
+ }
16
+ return String(error);
17
+ }
18
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
@@ -3,4 +3,4 @@
3
3
  * Copyright 2025 Vybestack LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- export declare function getUserStartupWarnings(workspaceRoot: string): Promise<string[]>;
6
+ export declare function getUserStartupWarnings(workspaceRoot?: string): Promise<string[]>;
@@ -47,7 +47,7 @@ const WARNING_CHECKS = [
47
47
  homeDirectoryCheck,
48
48
  rootDirectoryCheck,
49
49
  ];
50
- export async function getUserStartupWarnings(workspaceRoot) {
50
+ export async function getUserStartupWarnings(workspaceRoot = process.cwd()) {
51
51
  const results = await Promise.all(WARNING_CHECKS.map((check) => check.check(workspaceRoot)));
52
52
  return results.filter((msg) => msg !== null);
53
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"userStartupWarnings.js","sourceRoot":"","sources":["../../../src/utils/userStartupWarnings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,IAAI,MAAM,MAAM,CAAC;AAOxB,4BAA4B;AAC5B,MAAM,kBAAkB,GAAiB;IACvC,EAAE,EAAE,gBAAgB;IACpB,KAAK,EAAE,KAAK,EAAE,aAAqB,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,CAAC,iBAAiB,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC1D,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;gBAC1B,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;aAC1B,CAAC,CAAC;YAEH,IAAI,iBAAiB,KAAK,YAAY,EAAE,CAAC;gBACvC,OAAO,8GAA8G,CAAC;YACxH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,IAAa,EAAE,CAAC;YACvB,OAAO,oEAAoE,CAAC;QAC9E,CAAC;IACH,CAAC;CACF,CAAC;AAEF,MAAM,kBAAkB,GAAiB;IACvC,EAAE,EAAE,gBAAgB;IACpB,KAAK,EAAE,KAAK,EAAE,aAAqB,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,iBAAiB,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC3D,MAAM,YAAY,GAChB,sLAAsL,CAAC;YAEzL,gCAAgC;YAChC,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,iBAAiB,EAAE,CAAC;gBAC1D,OAAO,YAAY,CAAC;YACtB,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,IAAa,EAAE,CAAC;YACvB,OAAO,oEAAoE,CAAC;QAC9E,CAAC;IACH,CAAC;CACF,CAAC;AAEF,qBAAqB;AACrB,MAAM,cAAc,GAA4B;IAC9C,kBAAkB;IAClB,kBAAkB;CACnB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,aAAqB;IAErB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAC1D,CAAC;IACF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"userStartupWarnings.js","sourceRoot":"","sources":["../../../src/utils/userStartupWarnings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,IAAI,MAAM,MAAM,CAAC;AAOxB,4BAA4B;AAC5B,MAAM,kBAAkB,GAAiB;IACvC,EAAE,EAAE,gBAAgB;IACpB,KAAK,EAAE,KAAK,EAAE,aAAqB,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,CAAC,iBAAiB,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC1D,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;gBAC1B,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;aAC1B,CAAC,CAAC;YAEH,IAAI,iBAAiB,KAAK,YAAY,EAAE,CAAC;gBACvC,OAAO,8GAA8G,CAAC;YACxH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,IAAa,EAAE,CAAC;YACvB,OAAO,oEAAoE,CAAC;QAC9E,CAAC;IACH,CAAC;CACF,CAAC;AAEF,MAAM,kBAAkB,GAAiB;IACvC,EAAE,EAAE,gBAAgB;IACpB,KAAK,EAAE,KAAK,EAAE,aAAqB,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,iBAAiB,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC3D,MAAM,YAAY,GAChB,sLAAsL,CAAC;YAEzL,gCAAgC;YAChC,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,iBAAiB,EAAE,CAAC;gBAC1D,OAAO,YAAY,CAAC;YACtB,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,IAAa,EAAE,CAAC;YACvB,OAAO,oEAAoE,CAAC;QAC9E,CAAC;IACH,CAAC;CACF,CAAC;AAEF,qBAAqB;AACrB,MAAM,cAAc,GAA4B;IAC9C,kBAAkB;IAClB,kBAAkB;CACnB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,gBAAwB,OAAO,CAAC,GAAG,EAAE;IAErC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAC1D,CAAC;IACF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;AAC/C,CAAC"}