@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,180 @@
1
+ import * as vscode from "vscode";
2
+ import { exec, spawn } from "child_process";
3
+ import { promisify } from "util";
4
+ import { ProcessRegistry } from "./ProcessRegistry.js";
5
+ const execAsync = promisify(exec);
6
+ // Patterns that usually indicate an interactive or blocking command
7
+ const INTERACTIVE_PATTERNS = [
8
+ /\bnpm\s+init\b(?!.*-y)/,
9
+ /\bgit\s+commit\b(?!.*-m)/,
10
+ /\bgit\s+push\b/, // Might ask for credentials
11
+ /\bnanoid\b/,
12
+ /\bvi(m)?\b/,
13
+ /\bnano\b/,
14
+ /\bpython\b(?!.*-c)/,
15
+ /\bnode\b(?!.*-e)/,
16
+ ];
17
+ const MAX_OUTPUT_LENGTH = 10000; // ~10KB limit for context safety
18
+ /* eslint-disable no-control-regex */
19
+ /** Strip ANSI escape codes from terminal output (hoisted to avoid per-call allocation) */
20
+ const ANSI_REGEX = new RegExp("[\x1b\x9b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]", "g");
21
+ const stripAnsi = (t) => t.replace(ANSI_REGEX, "");
22
+ /* eslint-enable no-control-regex */
23
+ export class TerminalService {
24
+ static terminal;
25
+ static activeProcesses = new Set();
26
+ static getTerminal() {
27
+ if (this.terminal && !this.terminal.exitStatus) {
28
+ return this.terminal;
29
+ }
30
+ this.terminal = vscode.window.createTerminal("Marie's Workshop");
31
+ return this.terminal;
32
+ }
33
+ static async runCommand(command, signal) {
34
+ if (INTERACTIVE_PATTERNS.some((p) => p.test(command))) {
35
+ return `Error: Command '${command}' appears to be interactive or potentially blocking. Please use non-interactive flags (e.g., -y, -m) or run it manually.`;
36
+ }
37
+ // 2. Shell Injection Guard (Sub-Atomic Integrity)
38
+ const suspiciousChars = /[;&|`$(){}]/;
39
+ if (suspiciousChars.test(command)) {
40
+ // Check if it's a "known safe" complex command (e.g. npm run build -- --noEmit || npx tsc --noEmit)
41
+ const isSafeHeuristic = command.includes("--noEmit") || command.includes("npm run bloom");
42
+ if (!isSafeHeuristic) {
43
+ return `Security Error: Command '${command}' contains suspicious shell metacharacters. High-order tools reject unvetted complex logic for systemic safety. 🛑`;
44
+ }
45
+ }
46
+ if (signal?.aborted) {
47
+ return "Command aborted before execution.";
48
+ }
49
+ // 2. Show in terminal for user visibility
50
+ const terminal = this.getTerminal();
51
+ terminal.show();
52
+ terminal.sendText(command);
53
+ const rootPath = vscode.workspace.workspaceFolders?.[0].uri.fsPath;
54
+ const shell = process.env.SHELL || "/bin/sh";
55
+ let childProcess;
56
+ const spawnPromise = new Promise((resolve, reject) => {
57
+ try {
58
+ // Use shell: true to support command strings with pipes/redirects
59
+ childProcess = spawn(command, {
60
+ cwd: rootPath,
61
+ shell: shell,
62
+ stdio: ["ignore", "pipe", "pipe"],
63
+ detached: true, // Spectral Integrity: Detach to allow PGID killing
64
+ });
65
+ ProcessRegistry.register(childProcess);
66
+ let stdout = "";
67
+ let stderr = "";
68
+ childProcess.stdout?.on("data", (data) => {
69
+ stdout += data.toString();
70
+ if (stdout.length > MAX_OUTPUT_LENGTH * 2) {
71
+ stdout = stdout.substring(stdout.length - MAX_OUTPUT_LENGTH * 2);
72
+ }
73
+ });
74
+ childProcess.stderr?.on("data", (data) => {
75
+ stderr += data.toString();
76
+ if (stderr.length > MAX_OUTPUT_LENGTH * 2) {
77
+ stderr = stderr.substring(stderr.length - MAX_OUTPUT_LENGTH * 2);
78
+ }
79
+ });
80
+ childProcess.on("close", (code) => {
81
+ resolve({ stdout, stderr, code });
82
+ });
83
+ childProcess.on("error", (err) => {
84
+ reject(err);
85
+ });
86
+ }
87
+ catch (err) {
88
+ reject(err);
89
+ }
90
+ });
91
+ const onAbort = () => {
92
+ if (childProcess && childProcess.pid) {
93
+ console.log(`[Terminal] Killing process GROUP for command: ${command}`);
94
+ try {
95
+ // Kill the entire process group (PGID)
96
+ process.kill(-childProcess.pid, "SIGTERM");
97
+ }
98
+ catch (e) {
99
+ childProcess.kill("SIGTERM");
100
+ }
101
+ // Definitive Reap: Force kill PG if it doesn't shut down quickly
102
+ setTimeout(() => {
103
+ try {
104
+ if (childProcess.pid) {
105
+ process.kill(-childProcess.pid, "SIGKILL");
106
+ }
107
+ }
108
+ catch (e) {
109
+ try {
110
+ childProcess.kill("SIGKILL");
111
+ }
112
+ catch (e2) {
113
+ // Ignore further kill errors
114
+ }
115
+ }
116
+ }, 1000);
117
+ }
118
+ };
119
+ if (signal) {
120
+ signal.addEventListener("abort", onAbort);
121
+ }
122
+ try {
123
+ this.activeProcesses.add(childProcess);
124
+ const { stdout, stderr, code } = await spawnPromise;
125
+ this.activeProcesses.delete(childProcess);
126
+ if (signal?.aborted) {
127
+ return `Command aborted by user. Process cleanup initiated. 🛑`;
128
+ }
129
+ if (code !== 0 && code !== null) {
130
+ let cleanedStderr = stripAnsi(stderr);
131
+ if (cleanedStderr.length > MAX_OUTPUT_LENGTH) {
132
+ cleanedStderr =
133
+ `... [Truncated] ...\n` +
134
+ cleanedStderr.substring(cleanedStderr.length - MAX_OUTPUT_LENGTH);
135
+ }
136
+ return `Command failed (Exit Code: ${code}):\n${cleanedStderr ? `**Error Output:**\n\`\`\`\n${cleanedStderr}\n\`\`\`` : "No error output captured."}`;
137
+ }
138
+ let result = `Command executed successfully (Exit Code: 0). ✨\n\n`;
139
+ const formatOutput = (text, label) => {
140
+ if (!text)
141
+ return "";
142
+ let content = stripAnsi(text);
143
+ if (content.length > MAX_OUTPUT_LENGTH) {
144
+ content =
145
+ `... [Truncated for brevity] ...\n` +
146
+ content.substring(content.length - MAX_OUTPUT_LENGTH);
147
+ }
148
+ return `**${label}:**\n\`\`\`\n${content}\n\`\`\`\n`;
149
+ };
150
+ result += formatOutput(stdout, "Output");
151
+ result += formatOutput(stderr, "Errors/Warnings");
152
+ return result || "Command completed with no output.";
153
+ }
154
+ catch (error) {
155
+ if (signal?.aborted) {
156
+ return `Command aborted by user. Process cleanup initiated. 🛑`;
157
+ }
158
+ return `Command execution failed: ${error.message}`;
159
+ }
160
+ finally {
161
+ this.activeProcesses.delete(childProcess);
162
+ if (signal) {
163
+ signal.removeEventListener("abort", onAbort);
164
+ }
165
+ }
166
+ }
167
+ static cleanup() {
168
+ console.log(`[Terminal] Cleaning up ${this.activeProcesses.size} active processes...`);
169
+ for (const cp of this.activeProcesses) {
170
+ try {
171
+ cp.kill("SIGKILL");
172
+ }
173
+ catch (e) {
174
+ // Ignore errors during cleanup
175
+ }
176
+ }
177
+ this.activeProcesses.clear();
178
+ }
179
+ }
180
+ //# sourceMappingURL=TerminalService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TerminalService.js","sourceRoot":"","sources":["../../../../src/monolith/plumbing/terminal/TerminalService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import * as vscode from "vscode";
2
+ // Decoration for Creates (Blue/Cyan with Sparkle)
3
+ const createDecorationType = vscode.window.createTextEditorDecorationType({
4
+ backgroundColor: "rgba(0, 255, 255, 0.1)", // Light Cyan background
5
+ isWholeLine: false,
6
+ overviewRulerColor: "rgba(0, 255, 255, 0.8)",
7
+ overviewRulerLane: vscode.OverviewRulerLane.Right,
8
+ after: {
9
+ contentText: " ✨ Marie Created",
10
+ color: "rgba(0, 255, 255, 0.7)",
11
+ margin: "0 0 0 20px",
12
+ fontWeight: "bold",
13
+ },
14
+ gutterIconPath: vscode.Uri.parse("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDBmZmZmIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTggMEw5LjUgNi41TDE2IDhMOS41IDkuNUw4IDE2TDYuNSA5LjVMMCA4TDYuNSA2LjVMOCAwWiIgZmlsbD0idXJsKCNncmFkKSIvPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iZ3JhZCIgeDE9IjAiIHkxPSIwIiB4Mj0iMTYiIHkyPSIxNiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzAwZmZmZiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZmYjdjNSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjwvc3ZnPg=="), // Refined Sparkle with Sakura Gradient
15
+ gutterIconSize: "contain",
16
+ });
17
+ // Decoration for Modifications (Green with Pencil)
18
+ const modifyDecorationType = vscode.window.createTextEditorDecorationType({
19
+ backgroundColor: "rgba(100, 255, 100, 0.1)", // Light Green background
20
+ isWholeLine: false,
21
+ overviewRulerColor: "rgba(100, 255, 100, 0.8)",
22
+ overviewRulerLane: vscode.OverviewRulerLane.Right,
23
+ after: {
24
+ contentText: " ✏️ Marie Modified",
25
+ color: "rgba(100, 255, 100, 0.7)",
26
+ margin: "0 0 0 20px",
27
+ fontWeight: "bold",
28
+ },
29
+ gutterIconPath: vscode.Uri.parse("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNDJkZjc4IiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTMgMTNWNU0zIDExTDExIDNNMTEgNWwtMi0yTDMgMTFsMiAyIi8+PC9zdmc+"), // Refined Git-themed Pencil
30
+ gutterIconSize: "contain",
31
+ });
32
+ export const DecorationService = {
33
+ /**
34
+ * Highlights a range with the "Created by Marie" decoration.
35
+ */
36
+ decorateCreation(editor, range) {
37
+ editor.setDecorations(createDecorationType, [range]);
38
+ // Remove decoration after a short delay
39
+ setTimeout(() => {
40
+ editor.setDecorations(createDecorationType, []);
41
+ }, 2000);
42
+ },
43
+ /**
44
+ * Highlights a range with the "Modified by Marie" decoration.
45
+ */
46
+ decorateModification(editor, range) {
47
+ editor.setDecorations(modifyDecorationType, [range]);
48
+ // Remove decoration after a short delay
49
+ setTimeout(() => {
50
+ editor.setDecorations(modifyDecorationType, []);
51
+ }, 2000);
52
+ },
53
+ };
54
+ //# sourceMappingURL=DecorationService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DecorationService.js","sourceRoot":"","sources":["../../../../src/monolith/plumbing/ui/DecorationService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,kDAAkD;AAClD,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,8BAA8B,CAAC;IACxE,eAAe,EAAE,wBAAwB,EAAE,wBAAwB;IACnE,WAAW,EAAE,KAAK;IAClB,kBAAkB,EAAE,wBAAwB;IAC5C,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,CAAC,KAAK;IACjD,KAAK,EAAE;QACL,WAAW,EAAE,kBAAkB;QAC/B,KAAK,EAAE,wBAAwB;QAC/B,MAAM,EAAE,YAAY;QACpB,UAAU,EAAE,MAAM;KACnB;IACD,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAC9B,wmBAAwmB,CACzmB,EAAE,uCAAuC;IAC1C,cAAc,EAAE,SAAS;CAC1B,CAAC,CAAC;AAEH,mDAAmD;AACnD,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,8BAA8B,CAAC;IACxE,eAAe,EAAE,0BAA0B,EAAE,yBAAyB;IACtE,WAAW,EAAE,KAAK;IAClB,kBAAkB,EAAE,0BAA0B;IAC9C,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,CAAC,KAAK;IACjD,KAAK,EAAE;QACL,WAAW,EAAE,oBAAoB;QACjC,KAAK,EAAE,0BAA0B;QACjC,MAAM,EAAE,YAAY;QACpB,UAAU,EAAE,MAAM;KACnB;IACD,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAC9B,gTAAgT,CACjT,EAAE,4BAA4B;IAC/B,cAAc,EAAE,SAAS;CAC1B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B;;OAEG;IACH,gBAAgB,CAAC,MAAyB,EAAE,KAAmB;QAC7D,MAAM,CAAC,cAAc,CAAC,oBAAoB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAErD,wCAAwC;QACxC,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,cAAc,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;QAClD,CAAC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,MAAyB,EAAE,KAAmB;QACjE,MAAM,CAAC,cAAc,CAAC,oBAAoB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAErD,wCAAwC;QACxC,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,cAAc,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;QAClD,CAAC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC;CACF,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Safely extracts a descriptive error message from an unknown error object.
3
+ * Promotes type-safe error handling across the extension.
4
+ */
5
+ export function getErrorMessage(error) {
6
+ if (error instanceof Error) {
7
+ return error.message;
8
+ }
9
+ return String(error);
10
+ }
11
+ //# sourceMappingURL=ErrorUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorUtils.js","sourceRoot":"","sources":["../../../../src/monolith/plumbing/utils/ErrorUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,360 @@
1
+ /**
2
+ * Utilities for handling shaky AI-generated JSON and non-standard tool call formats.
3
+ */
4
+ export class JsonUtils {
5
+ /**
6
+ * Repairs truncated or unclosed JSON strings.
7
+ * Returns the repaired string and a flag indicating if any changes were made.
8
+ */
9
+ static repairJsonDetailed(json) {
10
+ if (typeof json !== "string")
11
+ return { repaired: "{}", wasFixed: false };
12
+ let repaired = json.trim();
13
+ if (!repaired)
14
+ return { repaired: "{}", wasFixed: false };
15
+ let wasFixed = false;
16
+ const original = repaired;
17
+ // Pre-processing: Fix unquoted keys or single quotes
18
+ repaired = repaired.replace(/'/g, '"');
19
+ let isInsideString = false;
20
+ const stack = [];
21
+ let i = 0;
22
+ while (i < repaired.length) {
23
+ const char = repaired[i];
24
+ const prevChar = i > 0 ? repaired[i - 1] : "";
25
+ const isEscaped = prevChar === "\\";
26
+ if (char === '"' && !isEscaped) {
27
+ isInsideString = !isInsideString;
28
+ }
29
+ else if (!isInsideString) {
30
+ if (char === "{" || char === "[") {
31
+ stack.push(char);
32
+ }
33
+ else if (char === "}" || char === "]") {
34
+ const expected = char === "}" ? "{" : "[";
35
+ if (stack.length > 0 && stack[stack.length - 1] === expected) {
36
+ stack.pop();
37
+ }
38
+ }
39
+ }
40
+ i++;
41
+ }
42
+ if (isInsideString) {
43
+ repaired += '"';
44
+ }
45
+ // Close unclosed structures
46
+ const hadUnclosed = stack.length > 0;
47
+ while (stack.length > 0) {
48
+ const last = stack.pop();
49
+ if (last === "{")
50
+ repaired += "}";
51
+ else if (last === "[")
52
+ repaired += "]";
53
+ }
54
+ // Extreme: Fix unquoted property names: { name: "val" } -> { "name": "val" }
55
+ repaired = repaired.replace(/([{,]\s*)([a-zA-Z0-9_$]+)(\s*):/g, '$1"$2"$3:');
56
+ // Trailing commas
57
+ const hadTrailing = /,\s*[}\]]/.test(repaired);
58
+ repaired = repaired.replace(/,\s*([}\]])/g, "$1");
59
+ wasFixed =
60
+ repaired !== original || hadUnclosed || hadTrailing || isInsideString;
61
+ return { repaired, wasFixed };
62
+ }
63
+ static repairJson(json) {
64
+ return this.repairJsonDetailed(json).repaired;
65
+ }
66
+ /**
67
+ * LRU cache for repairJson + JSON.parse combined operations.
68
+ * Prevents redundant string repair and parsing for identical inputs.
69
+ */
70
+ static parseCache = new Map();
71
+ static PARSE_CACHE_MAX = 100;
72
+ /**
73
+ * Combines repairJson + JSON.parse into a single cached operation.
74
+ * Returns the parsed object directly. Throws on unrecoverable parse errors.
75
+ */
76
+ static safeParseJson(json) {
77
+ const cached = this.parseCache.get(json);
78
+ if (cached)
79
+ return cached.result;
80
+ const { repaired, wasFixed } = this.repairJsonDetailed(json);
81
+ const result = JSON.parse(repaired);
82
+ // Cache the result with FIFO eviction
83
+ this.parseCache.set(json, { result, wasFixed });
84
+ if (this.parseCache.size > this.PARSE_CACHE_MAX) {
85
+ const firstKey = this.parseCache.keys().next().value;
86
+ if (firstKey)
87
+ this.parseCache.delete(firstKey);
88
+ }
89
+ return result;
90
+ }
91
+ /**
92
+ * Like safeParseJson but also returns whether repair was needed.
93
+ */
94
+ static safeParseJsonDetailed(json) {
95
+ const cached = this.parseCache.get(json);
96
+ if (cached)
97
+ return cached;
98
+ const { repaired, wasFixed } = this.repairJsonDetailed(json);
99
+ const result = JSON.parse(repaired);
100
+ const entry = { result, wasFixed };
101
+ this.parseCache.set(json, entry);
102
+ if (this.parseCache.size > this.PARSE_CACHE_MAX) {
103
+ const firstKey = this.parseCache.keys().next().value;
104
+ if (firstKey)
105
+ this.parseCache.delete(firstKey);
106
+ }
107
+ return entry;
108
+ }
109
+ /**
110
+ * Attempts to extract a tool call from a string that might be wrapped in tags,
111
+ * contains noise, or use non-standard formats.
112
+ */
113
+ static extractToolCall(text) {
114
+ if (typeof text !== "string")
115
+ return null;
116
+ // Guard: Empty or whitespace-only content
117
+ const trimmedText = text.trim();
118
+ if (!trimmedText || trimmedText.length < 5)
119
+ return null;
120
+ let contentToParse = text;
121
+ let isLlama = false;
122
+ let toolName = "";
123
+ // 0. Handle <thought> tags (some models emit reasoning before tools)
124
+ // We strip them to avoid regex confusion if they contain XML-like text
125
+ contentToParse = contentToParse.replace(/<thought>[\s\S]*?<\/thought>/g, "");
126
+ // 0b. Guard: Check if content is only section markers with nothing between them
127
+ const onlyMarkersPattern = /^\s*<\|tool_calls_section_begin\|>\s*<\|tool_calls_section_end\|>\s*$/;
128
+ if (onlyMarkersPattern.test(contentToParse)) {
129
+ console.warn("[Marie] JsonUtils: Empty tool section markers detected");
130
+ return null;
131
+ }
132
+ // 0c. NEW: Check for JSON tool_calls array format (e.g., from Claude)
133
+ // Format: { "tool_calls": [{ "id": "...", "type": "write_file", "arguments": {...} }] }
134
+ try {
135
+ const jsonStart = contentToParse.indexOf("{");
136
+ const jsonEnd = contentToParse.lastIndexOf("}");
137
+ if (jsonStart !== -1 && jsonEnd > jsonStart) {
138
+ const jsonCandidate = contentToParse.substring(jsonStart, jsonEnd + 1);
139
+ const parsed = JSON.parse(jsonCandidate);
140
+ if (parsed.tool_calls &&
141
+ Array.isArray(parsed.tool_calls) &&
142
+ parsed.tool_calls.length > 0) {
143
+ const firstCall = parsed.tool_calls[0];
144
+ if (firstCall.type && firstCall.arguments) {
145
+ console.log("[Marie] JsonUtils: Found JSON tool_calls format");
146
+ return {
147
+ name: firstCall.type,
148
+ input: firstCall.arguments,
149
+ id: firstCall.id,
150
+ repaired: true,
151
+ };
152
+ }
153
+ }
154
+ }
155
+ }
156
+ catch (e) {
157
+ // Not valid JSON or not the right format, continue with other parsers
158
+ }
159
+ // 1. Check for Llama 3 / DeepSeek style tags first (more specific)
160
+ const llamaMatch = contentToParse.match(/<(?:\|tool_call_begin\|>|\|tool_calls_section_begin\|>)\s*([\w.]+)(?::\d+)?(?:\s*<\|tool_call_arguments?_begin\|>)?\s*([\s\S]*?)(?:\s*(?:<\|tool_call_end\|>|<\|tool_calls_section_end\|>)|$)/);
161
+ // Guard: Check for empty content between markers
162
+ if (llamaMatch) {
163
+ const capturedContent = llamaMatch[2];
164
+ if (!capturedContent || !capturedContent.trim()) {
165
+ console.warn("[Marie] JsonUtils: Tool section markers found but no content between them");
166
+ return null;
167
+ }
168
+ toolName = llamaMatch[1].replace(/^functions\./, "");
169
+ contentToParse = capturedContent;
170
+ isLlama = true;
171
+ }
172
+ else {
173
+ // 1b. Check for compact Llama 3 / OpenRouter format: tool_name:id>JSON or tool_name>JSON
174
+ // This often appears in raw streams
175
+ const compactMatch = contentToParse.match(/([\w.]+)(?::(\d+))?>(\{[\s\S]*?)(?:$)/);
176
+ if (compactMatch) {
177
+ toolName = compactMatch[1].replace(/^functions\./, "");
178
+ const toolId = compactMatch[2] ? `call_${compactMatch[2]}` : undefined;
179
+ contentToParse = compactMatch[3];
180
+ const { repaired, wasFixed } = this.repairJsonDetailed(contentToParse);
181
+ try {
182
+ const parsed = JSON.parse(repaired);
183
+ return {
184
+ name: toolName,
185
+ input: parsed,
186
+ id: toolId,
187
+ repaired: wasFixed,
188
+ };
189
+ }
190
+ catch (e) {
191
+ // Fall through if not valid JSON yet
192
+ }
193
+ }
194
+ // 2. Check for DeepSeek style <tool_code>...</tool_code>
195
+ const toolCodeMatch = contentToParse.match(/<tool_code>([\s\S]*?)(?:<\/tool_code>|$)/);
196
+ if (toolCodeMatch) {
197
+ contentToParse = toolCodeMatch[1];
198
+ }
199
+ else {
200
+ // 3. Check for Qwen style <tool_call>...</tool_call>
201
+ const toolCallTagMatch = contentToParse.match(/<tool_call>([\s\S]*?)(?:<\/tool_call>|$)/);
202
+ if (toolCallTagMatch) {
203
+ contentToParse = toolCallTagMatch[1];
204
+ }
205
+ else {
206
+ // 4. Check for <tool>...</tool>
207
+ const toolTagMatch = contentToParse.match(/<tool>([\s\S]*?)(?:<\/tool>|$)/);
208
+ if (toolTagMatch) {
209
+ contentToParse = toolTagMatch[1];
210
+ }
211
+ else {
212
+ // 5. Check for XML style <invoke name="...">...</invoke>
213
+ const invokeStartMatch = contentToParse.match(/<invoke\s+([^>]*?name=["']?([^"'\s>]+)["']?[^>]*?)>/i);
214
+ if (invokeStartMatch) {
215
+ toolName = invokeStartMatch[2];
216
+ const invokeStartIdx = invokeStartMatch.index;
217
+ const contentAfterStart = contentToParse.substring(invokeStartIdx + invokeStartMatch[0].length);
218
+ // Find closing </invoke> (handling potential nesting)
219
+ const invokeEndIdx = contentAfterStart.lastIndexOf("</invoke>");
220
+ const innerContent = invokeEndIdx !== -1
221
+ ? contentAfterStart.substring(0, invokeEndIdx)
222
+ : contentAfterStart; // Auto-close if missing
223
+ // Robust Parameter Extraction (Nesting-Aware)
224
+ const params = {};
225
+ const paramStartRegex = /<parameter\s+[^>]*?name=["']?([^"'\s>]+)["']?[^>]*?>/gi;
226
+ let pMatch;
227
+ while ((pMatch = paramStartRegex.exec(innerContent)) !== null) {
228
+ const pName = pMatch[1];
229
+ const pStartIdx = pMatch.index + pMatch[0].length;
230
+ // Find corresponding </parameter>
231
+ const nextEndIdx = innerContent.indexOf("</parameter>", pStartIdx);
232
+ const pValueRaw = nextEndIdx !== -1
233
+ ? innerContent.substring(pStartIdx, nextEndIdx)
234
+ : innerContent.substring(pStartIdx); // Auto-close
235
+ const pValue = pValueRaw.trim();
236
+ // Basic level-1 JSON / Type parsing
237
+ if (pValue.startsWith("{") || pValue.startsWith("[")) {
238
+ try {
239
+ // Attempt to repair and parse any block starting with { or [
240
+ params[pName] = JSON.parse(this.repairJson(pValue));
241
+ }
242
+ catch (e) {
243
+ params[pName] = pValue;
244
+ }
245
+ }
246
+ else if (pValue.toLowerCase() === "true") {
247
+ params[pName] = true;
248
+ }
249
+ else if (pValue.toLowerCase() === "false") {
250
+ params[pName] = false;
251
+ }
252
+ else if (!isNaN(Number(pValue)) && pValue !== "") {
253
+ params[pName] = Number(pValue);
254
+ }
255
+ else {
256
+ params[pName] = pValue;
257
+ }
258
+ }
259
+ if (Object.keys(params).length > 0) {
260
+ return { name: toolName, input: params, repaired: true };
261
+ }
262
+ contentToParse = innerContent;
263
+ }
264
+ }
265
+ }
266
+ }
267
+ }
268
+ // 3. Clean markdown code blocks (handle truncated blocks too)
269
+ const hasMarkdown = /```/.test(contentToParse);
270
+ if (hasMarkdown) {
271
+ contentToParse = contentToParse
272
+ .replace(/```(?:json)?/g, "")
273
+ .replace(/```/g, "");
274
+ }
275
+ // 4. Clean preamble/postamble (text outside the first { and last })
276
+ const firstBrace = contentToParse.indexOf("{");
277
+ const lastBrace = contentToParse.lastIndexOf("}");
278
+ // NEW: Check for bracketed tool name format before the JSON: [Tool Use: name]
279
+ const bracketMatch = contentToParse.match(/\[Tool Use:\s*([\w.]+)\s*\]/i);
280
+ if (bracketMatch && !toolName) {
281
+ toolName = bracketMatch[1];
282
+ console.log(`[Marie] JsonUtils: Found bracketed tool name: ${toolName}`);
283
+ }
284
+ if (firstBrace === -1) {
285
+ // If we have a tool name but no JSON, return it with empty input (might be a parameterless tool)
286
+ if (toolName) {
287
+ return { name: toolName, input: {}, repaired: true };
288
+ }
289
+ return null;
290
+ }
291
+ const jsonCandidate = contentToParse.substring(firstBrace);
292
+ try {
293
+ const { repaired, wasFixed } = this.repairJsonDetailed(jsonCandidate);
294
+ const parsed = JSON.parse(repaired);
295
+ if (isLlama) {
296
+ return {
297
+ name: toolName,
298
+ input: parsed,
299
+ repaired: wasFixed || hasMarkdown,
300
+ };
301
+ }
302
+ const normalized = this.normalizeToolCall(parsed);
303
+ if (normalized) {
304
+ // Heuristic: if we had to strip markdown or prefix, it was "repaired"
305
+ normalized.repaired = wasFixed || hasMarkdown || firstBrace > 0;
306
+ return normalized;
307
+ }
308
+ else if (toolName) {
309
+ // Use the bracketed tool name if normalization failed (JSON is just arguments)
310
+ return {
311
+ name: toolName,
312
+ input: parsed,
313
+ repaired: wasFixed || hasMarkdown || firstBrace > 0,
314
+ };
315
+ }
316
+ }
317
+ catch (e) {
318
+ // console.error("Failed to parse tool content:", e);
319
+ }
320
+ return null;
321
+ }
322
+ static normalizeToolCall(parsed) {
323
+ // Handle different common formats
324
+ if (parsed.tool_name && parsed.tool_input) {
325
+ return {
326
+ name: parsed.tool_name,
327
+ input: parsed.tool_input,
328
+ id: parsed.tool_id,
329
+ };
330
+ }
331
+ if (parsed.name && parsed.arguments) {
332
+ return {
333
+ name: parsed.name,
334
+ input: typeof parsed.arguments === "string"
335
+ ? this.safeParseJson(parsed.arguments)
336
+ : parsed.arguments,
337
+ id: parsed.id,
338
+ };
339
+ }
340
+ if (parsed.name && parsed.input) {
341
+ return {
342
+ name: parsed.name,
343
+ input: parsed.input,
344
+ id: parsed.id,
345
+ };
346
+ }
347
+ // Literal format: { "write_file": { ... } }
348
+ const keys = Object.keys(parsed);
349
+ if (keys.length === 1 &&
350
+ typeof parsed[keys[0]] === "object" &&
351
+ !Array.isArray(parsed[keys[0]])) {
352
+ return {
353
+ name: keys[0],
354
+ input: parsed[keys[0]],
355
+ };
356
+ }
357
+ return null;
358
+ }
359
+ }
360
+ //# sourceMappingURL=JsonUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonUtils.js","sourceRoot":"","sources":["../../../../src/monolith/plumbing/utils/JsonUtils.ts"],"names":[],"mappings":"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"}