@noorm/marie-cli 0.1.0

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 (193) hide show
  1. package/JOY_ZONING.md +200 -0
  2. package/LICENSE.md +190 -0
  3. package/README.md +94 -0
  4. package/dist/cli-new/components/App.js +138 -0
  5. package/dist/cli-new/components/App.js.map +1 -0
  6. package/dist/cli-new/components/ApprovalDialog.js +31 -0
  7. package/dist/cli-new/components/ApprovalDialog.js.map +1 -0
  8. package/dist/cli-new/components/Banner.js +23 -0
  9. package/dist/cli-new/components/Banner.js.map +1 -0
  10. package/dist/cli-new/components/ChatArea.js +49 -0
  11. package/dist/cli-new/components/ChatArea.js.map +1 -0
  12. package/dist/cli-new/components/Header.js +20 -0
  13. package/dist/cli-new/components/Header.js.map +1 -0
  14. package/dist/cli-new/components/InputArea.js +97 -0
  15. package/dist/cli-new/components/InputArea.js.map +1 -0
  16. package/dist/cli-new/components/MessageBubble.js +114 -0
  17. package/dist/cli-new/components/MessageBubble.js.map +1 -0
  18. package/dist/cli-new/components/SessionSwitcher.js +46 -0
  19. package/dist/cli-new/components/SessionSwitcher.js.map +1 -0
  20. package/dist/cli-new/components/SetupWizard.js +283 -0
  21. package/dist/cli-new/components/SetupWizard.js.map +1 -0
  22. package/dist/cli-new/components/ToolCallDisplay.js +45 -0
  23. package/dist/cli-new/components/ToolCallDisplay.js.map +1 -0
  24. package/dist/cli-new/hooks/useGit.js +99 -0
  25. package/dist/cli-new/hooks/useGit.js.map +1 -0
  26. package/dist/cli-new/hooks/useMarie.js +249 -0
  27. package/dist/cli-new/hooks/useMarie.js.map +1 -0
  28. package/dist/cli-new/hooks/useSessions.js +75 -0
  29. package/dist/cli-new/hooks/useSessions.js.map +1 -0
  30. package/dist/cli-new/index.js +52 -0
  31. package/dist/cli-new/index.js.map +1 -0
  32. package/dist/cli-new/styles/theme.js +68 -0
  33. package/dist/cli-new/styles/theme.js.map +1 -0
  34. package/dist/cli-new/types/cli.js +2 -0
  35. package/dist/cli-new/types/cli.js.map +1 -0
  36. package/dist/extension.cjs +655 -0
  37. package/dist/monolith/adapters/CliMarieAdapter.js +72 -0
  38. package/dist/monolith/adapters/CliMarieAdapter.js.map +1 -0
  39. package/dist/monolith/adapters/VscodeMarieAdapter.js +81 -0
  40. package/dist/monolith/adapters/VscodeMarieAdapter.js.map +1 -0
  41. package/dist/monolith/cli/CliFileSystemPort.js +83 -0
  42. package/dist/monolith/cli/CliFileSystemPort.js.map +1 -0
  43. package/dist/monolith/cli/MarieToolDefinitionsCLI.js +438 -0
  44. package/dist/monolith/cli/MarieToolDefinitionsCLI.js.map +1 -0
  45. package/dist/monolith/cli/index.js +272 -0
  46. package/dist/monolith/cli/index.js.map +1 -0
  47. package/dist/monolith/cli/services/JoyAutomationServiceCLI.js +80 -0
  48. package/dist/monolith/cli/services/JoyAutomationServiceCLI.js.map +1 -0
  49. package/dist/monolith/cli/services/JoyServiceCLI.js +63 -0
  50. package/dist/monolith/cli/services/JoyServiceCLI.js.map +1 -0
  51. package/dist/monolith/cli/storage.js +119 -0
  52. package/dist/monolith/cli/storage.js.map +1 -0
  53. package/dist/monolith/domain/joy/JoyTools.js +513 -0
  54. package/dist/monolith/domain/joy/JoyTools.js.map +1 -0
  55. package/dist/monolith/domain/joy/RitualService.js +51 -0
  56. package/dist/monolith/domain/joy/RitualService.js.map +1 -0
  57. package/dist/monolith/domain/marie/MarieTypes.js +2 -0
  58. package/dist/monolith/domain/marie/MarieTypes.js.map +1 -0
  59. package/dist/monolith/infrastructure/ai/agents/MarieAscendant.js +230 -0
  60. package/dist/monolith/infrastructure/ai/agents/MarieAscendant.js.map +1 -0
  61. package/dist/monolith/infrastructure/ai/agents/MarieYOLO.js +207 -0
  62. package/dist/monolith/infrastructure/ai/agents/MarieYOLO.js.map +1 -0
  63. package/dist/monolith/infrastructure/ai/context/ContextArchiveService.js +129 -0
  64. package/dist/monolith/infrastructure/ai/context/ContextArchiveService.js.map +1 -0
  65. package/dist/monolith/infrastructure/ai/context/ContextManager.js +118 -0
  66. package/dist/monolith/infrastructure/ai/context/ContextManager.js.map +1 -0
  67. package/dist/monolith/infrastructure/ai/core/FileSystemPort.js +2 -0
  68. package/dist/monolith/infrastructure/ai/core/FileSystemPort.js.map +1 -0
  69. package/dist/monolith/infrastructure/ai/core/GhostPort.js +2 -0
  70. package/dist/monolith/infrastructure/ai/core/GhostPort.js.map +1 -0
  71. package/dist/monolith/infrastructure/ai/core/MarieAscensionTypes.js +2 -0
  72. package/dist/monolith/infrastructure/ai/core/MarieAscensionTypes.js.map +1 -0
  73. package/dist/monolith/infrastructure/ai/core/MarieEngine.js +590 -0
  74. package/dist/monolith/infrastructure/ai/core/MarieEngine.js.map +1 -0
  75. package/dist/monolith/infrastructure/ai/core/MarieEventDispatcher.js +161 -0
  76. package/dist/monolith/infrastructure/ai/core/MarieEventDispatcher.js.map +1 -0
  77. package/dist/monolith/infrastructure/ai/core/MarieLockManager.js +121 -0
  78. package/dist/monolith/infrastructure/ai/core/MarieLockManager.js.map +1 -0
  79. package/dist/monolith/infrastructure/ai/core/MarieProgressTracker.js +256 -0
  80. package/dist/monolith/infrastructure/ai/core/MarieProgressTracker.js.map +1 -0
  81. package/dist/monolith/infrastructure/ai/core/MariePulseService.js +67 -0
  82. package/dist/monolith/infrastructure/ai/core/MariePulseService.js.map +1 -0
  83. package/dist/monolith/infrastructure/ai/core/MarieResponse.js +101 -0
  84. package/dist/monolith/infrastructure/ai/core/MarieResponse.js.map +1 -0
  85. package/dist/monolith/infrastructure/ai/core/MarieSanitizer.js +86 -0
  86. package/dist/monolith/infrastructure/ai/core/MarieSanitizer.js.map +1 -0
  87. package/dist/monolith/infrastructure/ai/core/MarieSession.js +202 -0
  88. package/dist/monolith/infrastructure/ai/core/MarieSession.js.map +1 -0
  89. package/dist/monolith/infrastructure/ai/core/MarieStabilityMonitor.js +58 -0
  90. package/dist/monolith/infrastructure/ai/core/MarieStabilityMonitor.js.map +1 -0
  91. package/dist/monolith/infrastructure/ai/core/MarieToolMender.js +127 -0
  92. package/dist/monolith/infrastructure/ai/core/MarieToolMender.js.map +1 -0
  93. package/dist/monolith/infrastructure/ai/core/MarieToolProcessor.js +548 -0
  94. package/dist/monolith/infrastructure/ai/core/MarieToolProcessor.js.map +1 -0
  95. package/dist/monolith/infrastructure/ai/core/MarieYOLOTypes.js +2 -0
  96. package/dist/monolith/infrastructure/ai/core/MarieYOLOTypes.js.map +1 -0
  97. package/dist/monolith/infrastructure/ai/core/ReasoningBudget.js +125 -0
  98. package/dist/monolith/infrastructure/ai/core/ReasoningBudget.js.map +1 -0
  99. package/dist/monolith/infrastructure/ai/core/VscodeFileSystemPort.js +30 -0
  100. package/dist/monolith/infrastructure/ai/core/VscodeFileSystemPort.js.map +1 -0
  101. package/dist/monolith/infrastructure/ai/providers/AIProvider.js +2 -0
  102. package/dist/monolith/infrastructure/ai/providers/AIProvider.js.map +1 -0
  103. package/dist/monolith/infrastructure/ai/providers/AnthropicProvider.js +148 -0
  104. package/dist/monolith/infrastructure/ai/providers/AnthropicProvider.js.map +1 -0
  105. package/dist/monolith/infrastructure/ai/providers/CerebrasProvider.js +208 -0
  106. package/dist/monolith/infrastructure/ai/providers/CerebrasProvider.js.map +1 -0
  107. package/dist/monolith/infrastructure/ai/providers/OpenRouterProvider.js +404 -0
  108. package/dist/monolith/infrastructure/ai/providers/OpenRouterProvider.js.map +1 -0
  109. package/dist/monolith/infrastructure/ai/providers/OpenRouterStreamParser.js +283 -0
  110. package/dist/monolith/infrastructure/ai/providers/OpenRouterStreamParser.js.map +1 -0
  111. package/dist/monolith/infrastructure/config/ConfigService.js +398 -0
  112. package/dist/monolith/infrastructure/config/ConfigService.js.map +1 -0
  113. package/dist/monolith/infrastructure/services/MarieMemoryStore.js +140 -0
  114. package/dist/monolith/infrastructure/services/MarieMemoryStore.js.map +1 -0
  115. package/dist/monolith/infrastructure/tools/MarieToolDefinitions.js +1568 -0
  116. package/dist/monolith/infrastructure/tools/MarieToolDefinitions.js.map +1 -0
  117. package/dist/monolith/infrastructure/tools/PureStreamParser.js +147 -0
  118. package/dist/monolith/infrastructure/tools/PureStreamParser.js.map +1 -0
  119. package/dist/monolith/infrastructure/tools/SharedToolDefinitions.js +223 -0
  120. package/dist/monolith/infrastructure/tools/SharedToolDefinitions.js.map +1 -0
  121. package/dist/monolith/infrastructure/tools/ToolRegistry.js +29 -0
  122. package/dist/monolith/infrastructure/tools/ToolRegistry.js.map +1 -0
  123. package/dist/monolith/infrastructure/tools/ToolUtils.js +59 -0
  124. package/dist/monolith/infrastructure/tools/ToolUtils.js.map +1 -0
  125. package/dist/monolith/plumbing/analysis/CodeHealthService.js +146 -0
  126. package/dist/monolith/plumbing/analysis/CodeHealthService.js.map +1 -0
  127. package/dist/monolith/plumbing/analysis/ComplexityService.js +43 -0
  128. package/dist/monolith/plumbing/analysis/ComplexityService.js.map +1 -0
  129. package/dist/monolith/plumbing/analysis/DependencyService.js +51 -0
  130. package/dist/monolith/plumbing/analysis/DependencyService.js.map +1 -0
  131. package/dist/monolith/plumbing/analysis/DiscoveryService.js +49 -0
  132. package/dist/monolith/plumbing/analysis/DiscoveryService.js.map +1 -0
  133. package/dist/monolith/plumbing/analysis/JoyMapService.js +66 -0
  134. package/dist/monolith/plumbing/analysis/JoyMapService.js.map +1 -0
  135. package/dist/monolith/plumbing/analysis/LintService.js +132 -0
  136. package/dist/monolith/plumbing/analysis/LintService.js.map +1 -0
  137. package/dist/monolith/plumbing/analysis/MarieSentinelService.js +276 -0
  138. package/dist/monolith/plumbing/analysis/MarieSentinelService.js.map +1 -0
  139. package/dist/monolith/plumbing/analysis/QualityGuardrailService.js +119 -0
  140. package/dist/monolith/plumbing/analysis/QualityGuardrailService.js.map +1 -0
  141. package/dist/monolith/plumbing/analysis/SurgicalMender.js +70 -0
  142. package/dist/monolith/plumbing/analysis/SurgicalMender.js.map +1 -0
  143. package/dist/monolith/plumbing/analysis/TestService.js +104 -0
  144. package/dist/monolith/plumbing/analysis/TestService.js.map +1 -0
  145. package/dist/monolith/plumbing/filesystem/FileService.js +406 -0
  146. package/dist/monolith/plumbing/filesystem/FileService.js.map +1 -0
  147. package/dist/monolith/plumbing/filesystem/PathResolver.js +26 -0
  148. package/dist/monolith/plumbing/filesystem/PathResolver.js.map +1 -0
  149. package/dist/monolith/plumbing/git/GitService.js +71 -0
  150. package/dist/monolith/plumbing/git/GitService.js.map +1 -0
  151. package/dist/monolith/plumbing/lsp/SymbolService.js +36 -0
  152. package/dist/monolith/plumbing/lsp/SymbolService.js.map +1 -0
  153. package/dist/monolith/plumbing/terminal/ProcessRegistry.js +31 -0
  154. package/dist/monolith/plumbing/terminal/ProcessRegistry.js.map +1 -0
  155. package/dist/monolith/plumbing/terminal/TerminalService.js +180 -0
  156. package/dist/monolith/plumbing/terminal/TerminalService.js.map +1 -0
  157. package/dist/monolith/plumbing/ui/DecorationService.js +54 -0
  158. package/dist/monolith/plumbing/ui/DecorationService.js.map +1 -0
  159. package/dist/monolith/plumbing/utils/ErrorUtils.js +11 -0
  160. package/dist/monolith/plumbing/utils/ErrorUtils.js.map +1 -0
  161. package/dist/monolith/plumbing/utils/JsonUtils.js +360 -0
  162. package/dist/monolith/plumbing/utils/JsonUtils.js.map +1 -0
  163. package/dist/monolith/plumbing/utils/PrefixTree.js +153 -0
  164. package/dist/monolith/plumbing/utils/PrefixTree.js.map +1 -0
  165. package/dist/monolith/plumbing/utils/RetryUtils.js +141 -0
  166. package/dist/monolith/plumbing/utils/RetryUtils.js.map +1 -0
  167. package/dist/monolith/plumbing/utils/StreamTagDetector.js +128 -0
  168. package/dist/monolith/plumbing/utils/StreamTagDetector.js.map +1 -0
  169. package/dist/monolith/plumbing/utils/StringUtils.js +97 -0
  170. package/dist/monolith/plumbing/utils/StringUtils.js.map +1 -0
  171. package/dist/monolith/plumbing/utils/TimeoutUtils.js +21 -0
  172. package/dist/monolith/plumbing/utils/TimeoutUtils.js.map +1 -0
  173. package/dist/monolith/runtime/MarieRuntime.js +354 -0
  174. package/dist/monolith/runtime/MarieRuntime.js.map +1 -0
  175. package/dist/monolith/runtime/RuntimeAdapterBase.js +59 -0
  176. package/dist/monolith/runtime/RuntimeAdapterBase.js.map +1 -0
  177. package/dist/monolith/runtime/providerFactory.js +11 -0
  178. package/dist/monolith/runtime/providerFactory.js.map +1 -0
  179. package/dist/monolith/runtime/types.js +2 -0
  180. package/dist/monolith/runtime/types.js.map +1 -0
  181. package/dist/monolith/services/HealthService.js +38 -0
  182. package/dist/monolith/services/HealthService.js.map +1 -0
  183. package/dist/monolith/services/JoyAutomationService.js +131 -0
  184. package/dist/monolith/services/JoyAutomationService.js.map +1 -0
  185. package/dist/monolith/services/JoyLogService.js +48 -0
  186. package/dist/monolith/services/JoyLogService.js.map +1 -0
  187. package/dist/monolith/services/JoyService.js +190 -0
  188. package/dist/monolith/services/JoyService.js.map +1 -0
  189. package/dist/monolith/services/MarieGhostService.js +168 -0
  190. package/dist/monolith/services/MarieGhostService.js.map +1 -0
  191. package/dist/monolith/services/MarieSCMProvider.js +41 -0
  192. package/dist/monolith/services/MarieSCMProvider.js.map +1 -0
  193. package/package.json +168 -0
@@ -0,0 +1,406 @@
1
+ import * as vscode from "vscode";
2
+ import { ConfigService } from "../../infrastructure/config/ConfigService.js";
3
+ import { resolvePath } from "./PathResolver.js";
4
+ import { DecorationService } from "../ui/DecorationService.js";
5
+ const textDecoder = new TextDecoder();
6
+ const textEncoder = new TextEncoder();
7
+ // SPECTRAL INTEGRITY: Fine-Grained Path Locking (RWLock)
8
+ class PathLock {
9
+ readers = 0;
10
+ writer = false;
11
+ queue = [];
12
+ async acquireRead() {
13
+ while (this.writer)
14
+ await new Promise((res) => this.queue.push(res));
15
+ this.readers++;
16
+ }
17
+ releaseRead() {
18
+ this.readers--;
19
+ this._next();
20
+ }
21
+ async acquireWrite() {
22
+ while (this.writer || this.readers > 0)
23
+ await new Promise((res) => this.queue.push(res));
24
+ this.writer = true;
25
+ }
26
+ releaseWrite() {
27
+ this.writer = false;
28
+ this._next();
29
+ }
30
+ _next() {
31
+ const q = [...this.queue];
32
+ this.queue = [];
33
+ q.forEach((resolve) => resolve());
34
+ }
35
+ }
36
+ const pathLocks = new Map();
37
+ const backups = new Map();
38
+ const getLock = (path) => {
39
+ if (!pathLocks.has(path))
40
+ pathLocks.set(path, new PathLock());
41
+ return pathLocks.get(path);
42
+ };
43
+ export async function readFile(filePath, startLine, endLine, signal) {
44
+ if (signal?.aborted)
45
+ throw new Error(`AbortError: Read of ${filePath} aborted.`);
46
+ const uri = resolvePath(filePath);
47
+ const lock = getLock(uri.fsPath);
48
+ await lock.acquireRead();
49
+ try {
50
+ const workspaceFolders = vscode.workspace.workspaceFolders;
51
+ if (workspaceFolders && workspaceFolders.length > 0) {
52
+ const workspaceRoot = workspaceFolders[0].uri.fsPath;
53
+ if (!uri.fsPath.startsWith(workspaceRoot)) {
54
+ throw new Error(`Security Error: Path ${filePath} is outside the workspace boundary.`);
55
+ }
56
+ }
57
+ // INDUSTRIAL STABILITY: Prevent reading massive files that could crash the extension host
58
+ const MAX_READ_SIZE = 5 * 1024 * 1024; // 5MB
59
+ try {
60
+ const stat = await vscode.workspace.fs.stat(uri);
61
+ if (stat.size > MAX_READ_SIZE &&
62
+ startLine === undefined &&
63
+ endLine === undefined) {
64
+ return `Error: File ${filePath} is too large to read entirely (${(stat.size / 1024 / 1024).toFixed(1)} MB). Use line-based reading for large files.`;
65
+ }
66
+ }
67
+ catch (e) {
68
+ if (e.code !== "FileNotFound") {
69
+ console.warn(`[FileService] Stat failed for ${filePath}: ${e.message}`);
70
+ }
71
+ }
72
+ const uint8Array = await vscode.workspace.fs.readFile(uri);
73
+ if (signal?.aborted)
74
+ throw new Error(`AbortError: Read of ${filePath} aborted.`);
75
+ const text = textDecoder.decode(uint8Array);
76
+ if (startLine !== undefined || endLine !== undefined) {
77
+ const lines = text.split("\n");
78
+ const start = startLine !== undefined ? Math.max(0, startLine - 1) : 0;
79
+ const end = endLine !== undefined ? Math.min(lines.length, endLine) : lines.length;
80
+ return lines.slice(start, end).join("\n");
81
+ }
82
+ return text;
83
+ }
84
+ catch (error) {
85
+ throw new Error(`Failed to read file ${filePath}: ${error}`);
86
+ }
87
+ finally {
88
+ lock.releaseRead();
89
+ }
90
+ }
91
+ export async function writeFile(filePath, content, signal, expectedMtime) {
92
+ if (signal?.aborted)
93
+ throw new Error(`AbortError: Write to ${filePath} aborted.`);
94
+ const uri = resolvePath(filePath);
95
+ const lock = getLock(uri.fsPath);
96
+ await lock.acquireWrite();
97
+ try {
98
+ const workspaceFolders = vscode.workspace.workspaceFolders;
99
+ if (workspaceFolders && workspaceFolders.length > 0) {
100
+ const workspaceRoot = workspaceFolders[0].uri.fsPath;
101
+ if (!uri.fsPath.startsWith(workspaceRoot)) {
102
+ throw new Error(`Security Error: Path ${filePath} is outside the workspace boundary.`);
103
+ }
104
+ }
105
+ console.log(`[FileService] writeFile called with path: ${filePath}, resolved URI: ${uri.fsPath}`);
106
+ // Ensure the parent directory exists
107
+ const parentDir = vscode.Uri.file(uri.fsPath.substring(0, uri.fsPath.lastIndexOf("/")));
108
+ try {
109
+ await vscode.workspace.fs.stat(parentDir);
110
+ }
111
+ catch {
112
+ console.log(`[FileService] Parent directory doesn't exist, creating: ${parentDir.fsPath}`);
113
+ await vscode.workspace.fs.createDirectory(parentDir);
114
+ }
115
+ if (signal?.aborted)
116
+ throw new Error(`AbortError: Write to ${filePath} aborted.`);
117
+ // INTIMATE STABILITY: Check for external modifications
118
+ try {
119
+ const currentStat = await vscode.workspace.fs.stat(uri);
120
+ if (expectedMtime && currentStat.mtime > expectedMtime + 1000) {
121
+ // 1s tolerance
122
+ console.warn(`[FileService] EXTERNAL MODIFICATION DETECTED for ${filePath}. File mtime: ${currentStat.mtime}, Expected: ${expectedMtime}`);
123
+ }
124
+ }
125
+ catch (e) {
126
+ /* File doesn't exist, proceed */
127
+ }
128
+ // SUB-ATOMIC INTEGRITY: Atomic Write Pattern
129
+ // Write to a .tmp file first, then rename to ensure target is never corrupt
130
+ const tmpUri = vscode.Uri.file(`${uri.fsPath}.tmp.${Math.random().toString(36).substring(2, 9)}`);
131
+ console.log(`[FileService] Performing ATOMIC write to ${filePath} via ${tmpUri.fsPath}`);
132
+ await vscode.workspace.fs.writeFile(tmpUri, textEncoder.encode(content));
133
+ if (signal?.aborted) {
134
+ try {
135
+ await vscode.workspace.fs.delete(tmpUri);
136
+ }
137
+ catch (e) {
138
+ /* ignore cleanup error */
139
+ }
140
+ throw new Error(`AbortError: Write to ${filePath} aborted during commit.`);
141
+ }
142
+ // Apply atomic move (rename)
143
+ await vscode.workspace.fs.rename(tmpUri, uri, { overwrite: true });
144
+ console.log(`[FileService] Atomic write completed successfully for ${filePath}`);
145
+ // Verify and show the document
146
+ const doc = await vscode.workspace.openTextDocument(uri);
147
+ const editor = await vscode.window.showTextDocument(doc, {
148
+ preview: false,
149
+ viewColumn: vscode.ViewColumn.Active,
150
+ });
151
+ // Highlight the new content
152
+ const firstLine = doc.lineAt(0);
153
+ const lastLine = doc.lineAt(doc.lineCount - 1);
154
+ const range = new vscode.Range(firstLine.range.start, lastLine.range.end);
155
+ editor.revealRange(range, vscode.TextEditorRevealType.Default);
156
+ DecorationService.decorateCreation(editor, range);
157
+ }
158
+ catch (error) {
159
+ console.error(`[FileService] Error during atomic write: ${error}`);
160
+ throw new Error(`Failed to write file ${filePath}: ${error}`);
161
+ }
162
+ finally {
163
+ lock.releaseWrite();
164
+ }
165
+ }
166
+ export async function deleteFile(filePath) {
167
+ const uri = resolvePath(filePath);
168
+ const workspaceFolders = vscode.workspace.workspaceFolders;
169
+ if (workspaceFolders && workspaceFolders.length > 0) {
170
+ const workspaceRoot = workspaceFolders[0].uri.fsPath;
171
+ if (!uri.fsPath.startsWith(workspaceRoot)) {
172
+ throw new Error(`Security Error: Path ${filePath} is outside the workspace boundary.`);
173
+ }
174
+ }
175
+ try {
176
+ const edit = new vscode.WorkspaceEdit();
177
+ edit.deleteFile(uri, { ignoreIfNotExists: true, recursive: true });
178
+ const success = await vscode.workspace.applyEdit(edit);
179
+ if (!success) {
180
+ throw new Error(`VS Code failed to apply WorkspaceEdit (delete) for ${filePath}`);
181
+ }
182
+ }
183
+ catch (error) {
184
+ throw new Error(`Failed to delete file ${filePath}: ${error}`);
185
+ }
186
+ }
187
+ const MAX_SEARCH_MATCHES = 50;
188
+ /**
189
+ * Searches for a string within files in a given directory.
190
+ * NOTE: This implementation traverses the directory manually.
191
+ * For simple filename searches, vscode.workspace.findFiles is preferred.
192
+ */
193
+ export async function searchFiles(query, searchPath, signal) {
194
+ const startUri = resolvePath(searchPath);
195
+ const workspaceFolders = vscode.workspace.workspaceFolders;
196
+ if (workspaceFolders && workspaceFolders.length > 0) {
197
+ const workspaceRoot = workspaceFolders[0].uri.fsPath;
198
+ if (!startUri.fsPath.startsWith(workspaceRoot)) {
199
+ throw new Error(`Security Error: Path ${searchPath} is outside the workspace boundary.`);
200
+ }
201
+ }
202
+ const results = [];
203
+ const excludedDirs = new Set(ConfigService.getExcludedFiles());
204
+ const visitedUris = new Set();
205
+ async function searchDir(dirUri, depth) {
206
+ if (signal?.aborted)
207
+ return;
208
+ if (results.length >= MAX_SEARCH_MATCHES)
209
+ return;
210
+ if (depth > 25) {
211
+ console.warn(`[FileService] Max recursion depth reached at ${dirUri.fsPath}`);
212
+ return;
213
+ }
214
+ const dirKey = dirUri.toString();
215
+ if (visitedUris.has(dirKey)) {
216
+ console.warn(`[FileService] Circular symlink or redundant path ignored: ${dirKey}`);
217
+ return;
218
+ }
219
+ visitedUris.add(dirKey);
220
+ let entries;
221
+ try {
222
+ entries = await vscode.workspace.fs.readDirectory(dirUri);
223
+ }
224
+ catch (error) {
225
+ return;
226
+ }
227
+ for (const [name, type] of entries) {
228
+ if (signal?.aborted)
229
+ return;
230
+ if (results.length >= MAX_SEARCH_MATCHES)
231
+ return;
232
+ const fullUri = vscode.Uri.joinPath(dirUri, name);
233
+ if (type === vscode.FileType.Directory) {
234
+ if (excludedDirs.has(name))
235
+ continue;
236
+ await searchDir(fullUri, depth + 1);
237
+ }
238
+ else if (type === vscode.FileType.File) {
239
+ if (name.endsWith(".log") || name.endsWith(".lock"))
240
+ continue;
241
+ try {
242
+ const uint8Array = await vscode.workspace.fs.readFile(fullUri);
243
+ const content = textDecoder.decode(uint8Array);
244
+ if (content.includes(query)) {
245
+ const fileMatches = [];
246
+ const lines = content.split("\n");
247
+ lines.forEach((lineText, idx) => {
248
+ if (lineText.includes(query)) {
249
+ fileMatches.push({ line: idx + 1, content: lineText.trim() });
250
+ }
251
+ });
252
+ if (fileMatches.length > 0) {
253
+ results.push({ path: fullUri.fsPath, matches: fileMatches });
254
+ }
255
+ }
256
+ }
257
+ catch (error) {
258
+ // Ignore binary files or read errors
259
+ }
260
+ }
261
+ }
262
+ }
263
+ await searchDir(startUri, 0);
264
+ if (signal?.aborted)
265
+ return "Search aborted by user.";
266
+ if (results.length === 0)
267
+ return "No matches found.";
268
+ let output = "";
269
+ results.forEach((res) => {
270
+ output += `\n📄 ${res.path}\n`;
271
+ res.matches.forEach((m) => {
272
+ output += ` L${m.line}: ${m.content}\n`;
273
+ });
274
+ });
275
+ return results.length >= MAX_SEARCH_MATCHES
276
+ ? `${output}\n\n(Limit reached: showing first ${MAX_SEARCH_MATCHES} files with matches)`
277
+ : output;
278
+ }
279
+ export async function replaceInFile(filePath, search, replace) {
280
+ const uri = resolvePath(filePath);
281
+ const lock = getLock(uri.fsPath);
282
+ await lock.acquireWrite();
283
+ try {
284
+ const doc = await vscode.workspace.openTextDocument(uri);
285
+ const text = doc.getText();
286
+ const occurrences = text.split(search).length - 1;
287
+ if (occurrences === 0) {
288
+ throw new Error(`Search term not found in file ${filePath}`);
289
+ }
290
+ if (occurrences > 1) {
291
+ throw new Error(`Ambiguous replacement: Search term found ${occurrences} times in ${filePath}. Please provide more context (neighboring lines) to ensure surgical precision.`);
292
+ }
293
+ const index = text.indexOf(search);
294
+ const startPos = doc.positionAt(index);
295
+ const endPos = doc.positionAt(index + search.length);
296
+ const edit = new vscode.WorkspaceEdit();
297
+ const replaceRange = new vscode.Range(startPos, endPos);
298
+ edit.replace(uri, replaceRange, replace);
299
+ const success = await vscode.workspace.applyEdit(edit);
300
+ if (!success) {
301
+ throw new Error(`VS Code failed to apply WorkspaceEdit (replace) for ${filePath}`);
302
+ }
303
+ await doc.save();
304
+ const editor = await vscode.window.showTextDocument(doc, {
305
+ preview: false,
306
+ viewColumn: vscode.ViewColumn.Active,
307
+ });
308
+ const newEndPos = doc.positionAt(index + replace.length);
309
+ const newRange = new vscode.Range(startPos, newEndPos);
310
+ editor.revealRange(newRange, vscode.TextEditorRevealType.InCenter);
311
+ DecorationService.decorateModification(editor, newRange);
312
+ return `Successfully replaced content in ${filePath}. ✨`;
313
+ }
314
+ catch (error) {
315
+ throw new Error(`Failed to replace in file ${filePath}: ${error}`);
316
+ }
317
+ finally {
318
+ lock.releaseWrite();
319
+ }
320
+ }
321
+ export async function listFiles(dirPath, signal) {
322
+ if (signal?.aborted)
323
+ throw new Error(`AbortError: List directory ${dirPath} aborted.`);
324
+ const uri = resolvePath(dirPath);
325
+ const lock = getLock(uri.fsPath);
326
+ await lock.acquireRead();
327
+ try {
328
+ const workspaceFolders = vscode.workspace.workspaceFolders;
329
+ if (workspaceFolders && workspaceFolders.length > 0) {
330
+ const workspaceRoot = workspaceFolders[0].uri.fsPath;
331
+ if (!uri.fsPath.startsWith(workspaceRoot)) {
332
+ throw new Error(`Security Error: Path ${dirPath} is outside the workspace boundary.`);
333
+ }
334
+ }
335
+ const entries = await vscode.workspace.fs.readDirectory(uri);
336
+ const results = await Promise.all(entries.map(async ([name, type]) => {
337
+ const fullUri = vscode.Uri.joinPath(uri, name);
338
+ let size = 0;
339
+ if (type === vscode.FileType.File) {
340
+ try {
341
+ const stat = await vscode.workspace.fs.stat(fullUri);
342
+ size = stat.size;
343
+ }
344
+ catch {
345
+ // Ignore stat errors for individual files
346
+ }
347
+ }
348
+ const typeStr = type === vscode.FileType.Directory ? "DIR " : "FILE";
349
+ const sizeStr = type === vscode.FileType.File
350
+ ? ` (${(size / 1024).toFixed(1)} KB)`
351
+ : "";
352
+ return `${typeStr} ${name}${sizeStr}`;
353
+ }));
354
+ return results.join("\n") || "Directory is empty.";
355
+ }
356
+ catch (error) {
357
+ throw new Error(`Failed to list files in ${dirPath}: ${error}`);
358
+ }
359
+ finally {
360
+ lock.releaseRead();
361
+ }
362
+ }
363
+ /**
364
+ * Capture a file's content in memory before a destructive operation.
365
+ */
366
+ export async function backupFile(filePath) {
367
+ try {
368
+ const content = await readFile(filePath);
369
+ backups.set(filePath, content);
370
+ }
371
+ catch (e) {
372
+ // If file doesn't exist, we'll store null/empty to represent "delete on rollback"
373
+ backups.set(filePath, "__NON_EXISTENT__");
374
+ }
375
+ }
376
+ /**
377
+ * Restore a file from the memory backup.
378
+ */
379
+ export async function restoreFile(filePath) {
380
+ const content = backups.get(filePath);
381
+ if (content === undefined)
382
+ return;
383
+ if (content === "__NON_EXISTENT__") {
384
+ try {
385
+ await deleteFile(filePath);
386
+ }
387
+ catch {
388
+ // Ignore errors during restore-delete
389
+ }
390
+ }
391
+ else {
392
+ await writeFile(filePath, content);
393
+ }
394
+ backups.delete(filePath);
395
+ }
396
+ export async function rollbackAll() {
397
+ const paths = Array.from(backups.keys());
398
+ for (const p of paths) {
399
+ await restoreFile(p);
400
+ }
401
+ backups.clear();
402
+ }
403
+ export function clearBackups() {
404
+ backups.clear();
405
+ }
406
+ //# sourceMappingURL=FileService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileService.js","sourceRoot":"","sources":["../../../../src/monolith/plumbing/filesystem/FileService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import * as vscode from "vscode";
2
+ import * as path from "path";
3
+ import * as os from "os";
4
+ /**
5
+ * Resolves a file path to a VS Code URI.
6
+ * Handles absolute paths, workspace-relative paths, and home directory (~) expansion.
7
+ */
8
+ export function resolvePath(p) {
9
+ let resolvedPath = p;
10
+ // Handle home directory expansion
11
+ if (p.startsWith("~")) {
12
+ resolvedPath = path.join(os.homedir(), p.slice(1));
13
+ }
14
+ if (path.isAbsolute(resolvedPath)) {
15
+ // Normalize for cross-platform consistency
16
+ return vscode.Uri.file(path.normalize(resolvedPath));
17
+ }
18
+ const workspaceFolders = vscode.workspace.workspaceFolders;
19
+ if (workspaceFolders && workspaceFolders.length > 0) {
20
+ // joinPath handles normalization internally
21
+ return vscode.Uri.joinPath(workspaceFolders[0].uri, resolvedPath);
22
+ }
23
+ // Fallback if no workspace is open
24
+ return vscode.Uri.file(path.normalize(resolvedPath));
25
+ }
26
+ //# sourceMappingURL=PathResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PathResolver.js","sourceRoot":"","sources":["../../../../src/monolith/plumbing/filesystem/PathResolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,kCAAkC;IAClC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAClC,2CAA2C;QAC3C,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC;IAC3D,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,4CAA4C;QAC5C,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACpE,CAAC;IAED,mCAAmC;IACnC,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,71 @@
1
+ import * as vscode from "vscode";
2
+ import * as fs from "fs/promises";
3
+ import * as path from "path";
4
+ import { exec } from "child_process";
5
+ import { promisify } from "util";
6
+ import { getErrorMessage } from "../utils/ErrorUtils.js";
7
+ const execAsync = promisify(exec);
8
+ export async function gitStatus(cwd) {
9
+ try {
10
+ const { stdout } = await execAsync("git status --short", { cwd });
11
+ return stdout || "Clean workspace (no modifications).";
12
+ }
13
+ catch (error) {
14
+ return `Error getting git status: ${getErrorMessage(error)}`;
15
+ }
16
+ }
17
+ export async function getStagedDiff(cwd) {
18
+ try {
19
+ const { stdout } = await execAsync("git diff --cached", { cwd });
20
+ if (!stdout.trim()) {
21
+ return "No staged changes found. Use 'git add' to stage files.";
22
+ }
23
+ return stdout;
24
+ }
25
+ catch (error) {
26
+ return `Error getting staged diff: ${getErrorMessage(error)}`;
27
+ }
28
+ }
29
+ export async function getUnstagedDiff(cwd) {
30
+ try {
31
+ const { stdout } = await execAsync("git diff", { cwd });
32
+ if (!stdout.trim()) {
33
+ return "No unstaged changes found.";
34
+ }
35
+ return stdout;
36
+ }
37
+ catch (error) {
38
+ return `Error getting unstaged diff: ${getErrorMessage(error)}`;
39
+ }
40
+ }
41
+ export async function getFileHistory(cwd, filePath) {
42
+ try {
43
+ // Get last 5 commits for the file
44
+ const { stdout } = await execAsync(`git log -n 5 --pretty=format:"%h | %as | %an | %s" -- "${filePath}"`, { cwd });
45
+ if (!stdout.trim()) {
46
+ return "No git history found for this file.";
47
+ }
48
+ return `# File History: ${path.basename(filePath)}\n\n\`\`\`\n${stdout}\n\`\`\``;
49
+ }
50
+ catch (error) {
51
+ return `Error getting file history: ${getErrorMessage(error)}`;
52
+ }
53
+ }
54
+ export async function logReflection(message) {
55
+ const workspaceFolders = vscode.workspace.workspaceFolders;
56
+ if (!workspaceFolders)
57
+ return;
58
+ const journalPath = path.join(workspaceFolders[0].uri.fsPath, "JOURNAL.md");
59
+ const date = new Date().toISOString().split("T")[0];
60
+ const time = new Date().toLocaleTimeString();
61
+ const entry = `\n### ${date} ${time}\n${message}\n`;
62
+ try {
63
+ await fs.appendFile(journalPath, entry, "utf-8");
64
+ }
65
+ catch (e) {
66
+ // If file doesn't exist, create it with header
67
+ const header = "# Code Journal 📓\n\nA space for reflection, ideas, and mindfulness.\n";
68
+ await fs.writeFile(journalPath, header + entry, "utf-8");
69
+ }
70
+ }
71
+ //# sourceMappingURL=GitService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitService.js","sourceRoot":"","sources":["../../../../src/monolith/plumbing/git/GitService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import * as vscode from "vscode";
2
+ export class SymbolService {
3
+ /**
4
+ * Finds the definition(s) of a symbol at the specified position in a document.
5
+ */
6
+ static async getDefinitions(uri, position) {
7
+ const definitions = await vscode.commands.executeCommand("vscode.executeDefinitionProvider", uri, position);
8
+ if (!definitions || definitions.length === 0) {
9
+ return "No definitions found.";
10
+ }
11
+ let result = `Found ${definitions.length} definition(s):\n`;
12
+ for (const def of definitions) {
13
+ const range = "range" in def ? def.range : def.targetRange;
14
+ const targetUri = "uri" in def ? def.uri : def.targetUri;
15
+ result += `- ${targetUri.fsPath} [L${range.start.line + 1}:C${range.start.character + 1}]\n`;
16
+ }
17
+ return result;
18
+ }
19
+ /**
20
+ * Finds the type definition of a symbol at the specified position.
21
+ */
22
+ static async getTypeDefinitions(uri, position) {
23
+ const typeDefs = await vscode.commands.executeCommand("vscode.executeTypeDefinitionProvider", uri, position);
24
+ if (!typeDefs || typeDefs.length === 0) {
25
+ return "No type definitions found.";
26
+ }
27
+ let result = `Found ${typeDefs.length} type definition(s):\n`;
28
+ for (const def of typeDefs) {
29
+ const range = "range" in def ? def.range : def.targetRange;
30
+ const targetUri = "uri" in def ? def.uri : def.targetUri;
31
+ result += `- ${targetUri.fsPath} [L${range.start.line + 1}:C${range.start.character + 1}]\n`;
32
+ }
33
+ return result;
34
+ }
35
+ }
36
+ //# sourceMappingURL=SymbolService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SymbolService.js","sourceRoot":"","sources":["../../../../src/monolith/plumbing/lsp/SymbolService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,MAAM,OAAO,aAAa;IACxB;;OAEG;IACI,MAAM,CAAC,KAAK,CAAC,cAAc,CAChC,GAAe,EACf,QAAyB;QAEzB,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,CAEtD,kCAAkC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QAErD,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7C,OAAO,uBAAuB,CAAC;QACjC,CAAC;QAED,IAAI,MAAM,GAAG,SAAS,WAAW,CAAC,MAAM,mBAAmB,CAAC;QAC5D,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;YAC3D,MAAM,SAAS,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;YACzD,MAAM,IAAI,KAAK,SAAS,CAAC,MAAM,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC;QAC/F,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,KAAK,CAAC,kBAAkB,CACpC,GAAe,EACf,QAAyB;QAEzB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,CAEnD,sCAAsC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QAEzD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,OAAO,4BAA4B,CAAC;QACtC,CAAC;QAED,IAAI,MAAM,GAAG,SAAS,QAAQ,CAAC,MAAM,wBAAwB,CAAC;QAC9D,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;YAC3D,MAAM,SAAS,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;YACzD,MAAM,IAAI,KAAK,SAAS,CAAC,MAAM,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC;QAC/F,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * ZOMBIE LIFECYCLE GUARD: ProcessRegistry
3
+ * Tracks all active child processes and ensures they are killed when Marie is deactivated.
4
+ */
5
+ export class ProcessRegistry {
6
+ static activeProcesses = new Set();
7
+ static register(process) {
8
+ this.activeProcesses.add(process);
9
+ process.on("exit", () => {
10
+ this.activeProcesses.delete(process);
11
+ });
12
+ process.on("error", () => {
13
+ this.activeProcesses.delete(process);
14
+ });
15
+ }
16
+ static killAll() {
17
+ console.log(`[MarieRegistry] Killing ${this.activeProcesses.size} active child processes...`);
18
+ for (const process of this.activeProcesses) {
19
+ try {
20
+ if (!process.killed) {
21
+ process.kill("SIGKILL");
22
+ }
23
+ }
24
+ catch (e) {
25
+ console.error("[MarieRegistry] Failed to kill process:", e);
26
+ }
27
+ }
28
+ this.activeProcesses.clear();
29
+ }
30
+ }
31
+ //# sourceMappingURL=ProcessRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProcessRegistry.js","sourceRoot":"","sources":["../../../../src/monolith/plumbing/terminal/ProcessRegistry.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,eAAe;IAClB,MAAM,CAAC,eAAe,GAAG,IAAI,GAAG,EAAgB,CAAC;IAElD,MAAM,CAAC,QAAQ,CAAC,OAAqB;QAC1C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACtB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,MAAM,CAAC,OAAO;QACnB,OAAO,CAAC,GAAG,CACT,2BAA2B,IAAI,CAAC,eAAe,CAAC,IAAI,4BAA4B,CACjF,CAAC;QACF,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACH,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBACpB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,CAAC,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC"}