moderado 0.3.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 (275) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +208 -0
  3. package/dist/args.d.ts +26 -0
  4. package/dist/args.d.ts.map +1 -0
  5. package/dist/args.js +108 -0
  6. package/dist/args.js.map +1 -0
  7. package/dist/commands/chat.d.ts +121 -0
  8. package/dist/commands/chat.d.ts.map +1 -0
  9. package/dist/commands/chat.js +1484 -0
  10. package/dist/commands/chat.js.map +1 -0
  11. package/dist/commands/doctor.d.ts +3 -0
  12. package/dist/commands/doctor.d.ts.map +1 -0
  13. package/dist/commands/doctor.js +61 -0
  14. package/dist/commands/doctor.js.map +1 -0
  15. package/dist/commands/init.d.ts +27 -0
  16. package/dist/commands/init.d.ts.map +1 -0
  17. package/dist/commands/init.js +172 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/interactive_menu.d.ts +3 -0
  20. package/dist/commands/interactive_menu.d.ts.map +1 -0
  21. package/dist/commands/interactive_menu.js +98 -0
  22. package/dist/commands/interactive_menu.js.map +1 -0
  23. package/dist/commands/models.d.ts +8 -0
  24. package/dist/commands/models.d.ts.map +1 -0
  25. package/dist/commands/models.js +81 -0
  26. package/dist/commands/models.js.map +1 -0
  27. package/dist/commands/run.d.ts +3 -0
  28. package/dist/commands/run.d.ts.map +1 -0
  29. package/dist/commands/run.js +140 -0
  30. package/dist/commands/run.js.map +1 -0
  31. package/dist/config.d.ts +44 -0
  32. package/dist/config.d.ts.map +1 -0
  33. package/dist/config.js +195 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/credentials.d.ts +14 -0
  36. package/dist/credentials.d.ts.map +1 -0
  37. package/dist/credentials.js +23 -0
  38. package/dist/credentials.js.map +1 -0
  39. package/dist/diagnostic_log.d.ts +2 -0
  40. package/dist/diagnostic_log.d.ts.map +1 -0
  41. package/dist/diagnostic_log.js +21 -0
  42. package/dist/diagnostic_log.js.map +1 -0
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +83 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/model_pricing.d.ts +4 -0
  48. package/dist/model_pricing.d.ts.map +1 -0
  49. package/dist/model_pricing.js +10 -0
  50. package/dist/model_pricing.js.map +1 -0
  51. package/dist/sessions.d.ts +203 -0
  52. package/dist/sessions.d.ts.map +1 -0
  53. package/dist/sessions.js +82 -0
  54. package/dist/sessions.js.map +1 -0
  55. package/dist/ui/box.d.ts +14 -0
  56. package/dist/ui/box.d.ts.map +1 -0
  57. package/dist/ui/box.js +52 -0
  58. package/dist/ui/box.js.map +1 -0
  59. package/dist/ui/file_mentions.d.ts +38 -0
  60. package/dist/ui/file_mentions.d.ts.map +1 -0
  61. package/dist/ui/file_mentions.js +119 -0
  62. package/dist/ui/file_mentions.js.map +1 -0
  63. package/dist/ui/help_modal.d.ts +2 -0
  64. package/dist/ui/help_modal.d.ts.map +1 -0
  65. package/dist/ui/help_modal.js +101 -0
  66. package/dist/ui/help_modal.js.map +1 -0
  67. package/dist/ui/model_selector.d.ts +48 -0
  68. package/dist/ui/model_selector.d.ts.map +1 -0
  69. package/dist/ui/model_selector.js +829 -0
  70. package/dist/ui/model_selector.js.map +1 -0
  71. package/dist/ui/popup.d.ts +78 -0
  72. package/dist/ui/popup.d.ts.map +1 -0
  73. package/dist/ui/popup.js +274 -0
  74. package/dist/ui/popup.js.map +1 -0
  75. package/dist/ui/prompt.d.ts +21 -0
  76. package/dist/ui/prompt.d.ts.map +1 -0
  77. package/dist/ui/prompt.js +128 -0
  78. package/dist/ui/prompt.js.map +1 -0
  79. package/dist/ui/provider_connect.d.ts +33 -0
  80. package/dist/ui/provider_connect.d.ts.map +1 -0
  81. package/dist/ui/provider_connect.js +175 -0
  82. package/dist/ui/provider_connect.js.map +1 -0
  83. package/dist/ui/renderer.d.ts +19 -0
  84. package/dist/ui/renderer.d.ts.map +1 -0
  85. package/dist/ui/renderer.js +147 -0
  86. package/dist/ui/renderer.js.map +1 -0
  87. package/dist/ui/session_screen.d.ts +32 -0
  88. package/dist/ui/session_screen.d.ts.map +1 -0
  89. package/dist/ui/session_screen.js +148 -0
  90. package/dist/ui/session_screen.js.map +1 -0
  91. package/dist/ui/session_terminal.d.ts +46 -0
  92. package/dist/ui/session_terminal.d.ts.map +1 -0
  93. package/dist/ui/session_terminal.js +342 -0
  94. package/dist/ui/session_terminal.js.map +1 -0
  95. package/dist/ui/terminal_approval.d.ts +14 -0
  96. package/dist/ui/terminal_approval.d.ts.map +1 -0
  97. package/dist/ui/terminal_approval.js +98 -0
  98. package/dist/ui/terminal_approval.js.map +1 -0
  99. package/dist/ui/welcome.d.ts +130 -0
  100. package/dist/ui/welcome.d.ts.map +1 -0
  101. package/dist/ui/welcome.js +990 -0
  102. package/dist/ui/welcome.js.map +1 -0
  103. package/dist/vendor/contracts/approvals.d.ts +91 -0
  104. package/dist/vendor/contracts/approvals.d.ts.map +1 -0
  105. package/dist/vendor/contracts/approvals.js +22 -0
  106. package/dist/vendor/contracts/approvals.js.map +1 -0
  107. package/dist/vendor/contracts/events.d.ts +1215 -0
  108. package/dist/vendor/contracts/events.d.ts.map +1 -0
  109. package/dist/vendor/contracts/events.js +94 -0
  110. package/dist/vendor/contracts/events.js.map +1 -0
  111. package/dist/vendor/contracts/index.d.ts +7 -0
  112. package/dist/vendor/contracts/index.d.ts.map +1 -0
  113. package/dist/vendor/contracts/index.js +7 -0
  114. package/dist/vendor/contracts/index.js.map +1 -0
  115. package/dist/vendor/contracts/messages.d.ts +181 -0
  116. package/dist/vendor/contracts/messages.d.ts.map +1 -0
  117. package/dist/vendor/contracts/messages.js +40 -0
  118. package/dist/vendor/contracts/messages.js.map +1 -0
  119. package/dist/vendor/contracts/models.d.ts +117 -0
  120. package/dist/vendor/contracts/models.d.ts.map +1 -0
  121. package/dist/vendor/contracts/models.js +37 -0
  122. package/dist/vendor/contracts/models.js.map +1 -0
  123. package/dist/vendor/contracts/provider.d.ts +121 -0
  124. package/dist/vendor/contracts/provider.d.ts.map +1 -0
  125. package/dist/vendor/contracts/provider.js +64 -0
  126. package/dist/vendor/contracts/provider.js.map +1 -0
  127. package/dist/vendor/contracts/tools.d.ts +305 -0
  128. package/dist/vendor/contracts/tools.d.ts.map +1 -0
  129. package/dist/vendor/contracts/tools.js +65 -0
  130. package/dist/vendor/contracts/tools.js.map +1 -0
  131. package/dist/vendor/core/agent.d.ts +39 -0
  132. package/dist/vendor/core/agent.d.ts.map +1 -0
  133. package/dist/vendor/core/agent.js +710 -0
  134. package/dist/vendor/core/agent.js.map +1 -0
  135. package/dist/vendor/core/host_event_stream.d.ts +9 -0
  136. package/dist/vendor/core/host_event_stream.d.ts.map +1 -0
  137. package/dist/vendor/core/host_event_stream.js +12 -0
  138. package/dist/vendor/core/host_event_stream.js.map +1 -0
  139. package/dist/vendor/core/index.d.ts +7 -0
  140. package/dist/vendor/core/index.d.ts.map +1 -0
  141. package/dist/vendor/core/index.js +7 -0
  142. package/dist/vendor/core/index.js.map +1 -0
  143. package/dist/vendor/core/policy.d.ts +19 -0
  144. package/dist/vendor/core/policy.d.ts.map +1 -0
  145. package/dist/vendor/core/policy.js +31 -0
  146. package/dist/vendor/core/policy.js.map +1 -0
  147. package/dist/vendor/core/router.d.ts +26 -0
  148. package/dist/vendor/core/router.d.ts.map +1 -0
  149. package/dist/vendor/core/router.js +222 -0
  150. package/dist/vendor/core/router.js.map +1 -0
  151. package/dist/vendor/core/subagent.d.ts +29 -0
  152. package/dist/vendor/core/subagent.d.ts.map +1 -0
  153. package/dist/vendor/core/subagent.js +66 -0
  154. package/dist/vendor/core/subagent.js.map +1 -0
  155. package/dist/vendor/core/think_filter.d.ts +14 -0
  156. package/dist/vendor/core/think_filter.d.ts.map +1 -0
  157. package/dist/vendor/core/think_filter.js +136 -0
  158. package/dist/vendor/core/think_filter.js.map +1 -0
  159. package/dist/vendor/providers/fake/fake_provider.d.ts +16 -0
  160. package/dist/vendor/providers/fake/fake_provider.d.ts.map +1 -0
  161. package/dist/vendor/providers/fake/fake_provider.js +89 -0
  162. package/dist/vendor/providers/fake/fake_provider.js.map +1 -0
  163. package/dist/vendor/providers/index.d.ts +6 -0
  164. package/dist/vendor/providers/index.d.ts.map +1 -0
  165. package/dist/vendor/providers/index.js +6 -0
  166. package/dist/vendor/providers/index.js.map +1 -0
  167. package/dist/vendor/providers/model_discovery.d.ts +28 -0
  168. package/dist/vendor/providers/model_discovery.d.ts.map +1 -0
  169. package/dist/vendor/providers/model_discovery.js +106 -0
  170. package/dist/vendor/providers/model_discovery.js.map +1 -0
  171. package/dist/vendor/providers/nvidia/nvidia_adapter.d.ts +23 -0
  172. package/dist/vendor/providers/nvidia/nvidia_adapter.d.ts.map +1 -0
  173. package/dist/vendor/providers/nvidia/nvidia_adapter.js +197 -0
  174. package/dist/vendor/providers/nvidia/nvidia_adapter.js.map +1 -0
  175. package/dist/vendor/providers/nvidia/sse_parser.d.ts +3 -0
  176. package/dist/vendor/providers/nvidia/sse_parser.d.ts.map +1 -0
  177. package/dist/vendor/providers/nvidia/sse_parser.js +84 -0
  178. package/dist/vendor/providers/nvidia/sse_parser.js.map +1 -0
  179. package/dist/vendor/providers/openai_compatible_adapter.d.ts +10 -0
  180. package/dist/vendor/providers/openai_compatible_adapter.d.ts.map +1 -0
  181. package/dist/vendor/providers/openai_compatible_adapter.js +8 -0
  182. package/dist/vendor/providers/openai_compatible_adapter.js.map +1 -0
  183. package/dist/vendor/tools/checkpoints.d.ts +27 -0
  184. package/dist/vendor/tools/checkpoints.d.ts.map +1 -0
  185. package/dist/vendor/tools/checkpoints.js +145 -0
  186. package/dist/vendor/tools/checkpoints.js.map +1 -0
  187. package/dist/vendor/tools/diagnostics.d.ts +11 -0
  188. package/dist/vendor/tools/diagnostics.d.ts.map +1 -0
  189. package/dist/vendor/tools/diagnostics.js +16 -0
  190. package/dist/vendor/tools/diagnostics.js.map +1 -0
  191. package/dist/vendor/tools/diff.d.ts +7 -0
  192. package/dist/vendor/tools/diff.d.ts.map +1 -0
  193. package/dist/vendor/tools/diff.js +48 -0
  194. package/dist/vendor/tools/diff.js.map +1 -0
  195. package/dist/vendor/tools/errors.d.ts +17 -0
  196. package/dist/vendor/tools/errors.d.ts.map +1 -0
  197. package/dist/vendor/tools/errors.js +33 -0
  198. package/dist/vendor/tools/errors.js.map +1 -0
  199. package/dist/vendor/tools/git_workspace.d.ts +14 -0
  200. package/dist/vendor/tools/git_workspace.d.ts.map +1 -0
  201. package/dist/vendor/tools/git_workspace.js +42 -0
  202. package/dist/vendor/tools/git_workspace.js.map +1 -0
  203. package/dist/vendor/tools/index.d.ts +22 -0
  204. package/dist/vendor/tools/index.d.ts.map +1 -0
  205. package/dist/vendor/tools/index.js +22 -0
  206. package/dist/vendor/tools/index.js.map +1 -0
  207. package/dist/vendor/tools/jail.d.ts +17 -0
  208. package/dist/vendor/tools/jail.d.ts.map +1 -0
  209. package/dist/vendor/tools/jail.js +221 -0
  210. package/dist/vendor/tools/jail.js.map +1 -0
  211. package/dist/vendor/tools/lsp.d.ts +3 -0
  212. package/dist/vendor/tools/lsp.d.ts.map +1 -0
  213. package/dist/vendor/tools/lsp.js +43 -0
  214. package/dist/vendor/tools/lsp.js.map +1 -0
  215. package/dist/vendor/tools/mcp.d.ts +9 -0
  216. package/dist/vendor/tools/mcp.d.ts.map +1 -0
  217. package/dist/vendor/tools/mcp.js +54 -0
  218. package/dist/vendor/tools/mcp.js.map +1 -0
  219. package/dist/vendor/tools/mcp_adapter.d.ts +15 -0
  220. package/dist/vendor/tools/mcp_adapter.d.ts.map +1 -0
  221. package/dist/vendor/tools/mcp_adapter.js +29 -0
  222. package/dist/vendor/tools/mcp_adapter.js.map +1 -0
  223. package/dist/vendor/tools/registry.d.ts +10 -0
  224. package/dist/vendor/tools/registry.d.ts.map +1 -0
  225. package/dist/vendor/tools/registry.js +126 -0
  226. package/dist/vendor/tools/registry.js.map +1 -0
  227. package/dist/vendor/tools/tools/apply_patch.d.ts +3 -0
  228. package/dist/vendor/tools/tools/apply_patch.d.ts.map +1 -0
  229. package/dist/vendor/tools/tools/apply_patch.js +49 -0
  230. package/dist/vendor/tools/tools/apply_patch.js.map +1 -0
  231. package/dist/vendor/tools/tools/edit_file.d.ts +3 -0
  232. package/dist/vendor/tools/tools/edit_file.d.ts.map +1 -0
  233. package/dist/vendor/tools/tools/edit_file.js +71 -0
  234. package/dist/vendor/tools/tools/edit_file.js.map +1 -0
  235. package/dist/vendor/tools/tools/git_diff.d.ts +3 -0
  236. package/dist/vendor/tools/tools/git_diff.d.ts.map +1 -0
  237. package/dist/vendor/tools/tools/git_diff.js +91 -0
  238. package/dist/vendor/tools/tools/git_diff.js.map +1 -0
  239. package/dist/vendor/tools/tools/language_intelligence.d.ts +4 -0
  240. package/dist/vendor/tools/tools/language_intelligence.d.ts.map +1 -0
  241. package/dist/vendor/tools/tools/language_intelligence.js +13 -0
  242. package/dist/vendor/tools/tools/language_intelligence.js.map +1 -0
  243. package/dist/vendor/tools/tools/list_files.d.ts +9 -0
  244. package/dist/vendor/tools/tools/list_files.d.ts.map +1 -0
  245. package/dist/vendor/tools/tools/list_files.js +165 -0
  246. package/dist/vendor/tools/tools/list_files.js.map +1 -0
  247. package/dist/vendor/tools/tools/read_file.d.ts +3 -0
  248. package/dist/vendor/tools/tools/read_file.d.ts.map +1 -0
  249. package/dist/vendor/tools/tools/read_file.js +72 -0
  250. package/dist/vendor/tools/tools/read_file.js.map +1 -0
  251. package/dist/vendor/tools/tools/run_command.d.ts +12 -0
  252. package/dist/vendor/tools/tools/run_command.d.ts.map +1 -0
  253. package/dist/vendor/tools/tools/run_command.js +421 -0
  254. package/dist/vendor/tools/tools/run_command.js.map +1 -0
  255. package/dist/vendor/tools/tools/run_diagnostics.d.ts +3 -0
  256. package/dist/vendor/tools/tools/run_diagnostics.d.ts.map +1 -0
  257. package/dist/vendor/tools/tools/run_diagnostics.js +11 -0
  258. package/dist/vendor/tools/tools/run_diagnostics.js.map +1 -0
  259. package/dist/vendor/tools/tools/search_files.d.ts +3 -0
  260. package/dist/vendor/tools/tools/search_files.d.ts.map +1 -0
  261. package/dist/vendor/tools/tools/search_files.js +120 -0
  262. package/dist/vendor/tools/tools/search_files.js.map +1 -0
  263. package/dist/vendor/tools/tools/web_search.d.ts +46 -0
  264. package/dist/vendor/tools/tools/web_search.d.ts.map +1 -0
  265. package/dist/vendor/tools/tools/web_search.js +187 -0
  266. package/dist/vendor/tools/tools/web_search.js.map +1 -0
  267. package/dist/vendor/tools/tools/write_file.d.ts +3 -0
  268. package/dist/vendor/tools/tools/write_file.d.ts.map +1 -0
  269. package/dist/vendor/tools/tools/write_file.js +52 -0
  270. package/dist/vendor/tools/tools/write_file.js.map +1 -0
  271. package/dist/windows_credentials.d.ts +15 -0
  272. package/dist/windows_credentials.d.ts.map +1 -0
  273. package/dist/windows_credentials.js +23 -0
  274. package/dist/windows_credentials.js.map +1 -0
  275. package/package.json +28 -0
@@ -0,0 +1,421 @@
1
+ import fs from 'node:fs';
2
+ import { spawn, execSync } from 'node:child_process';
3
+ import { RunCommandParamsSchema, } from '../../contracts/index.js';
4
+ import { resolveInJail } from '../jail.js';
5
+ const SENSITIVE_ENV_VARS = [
6
+ 'NVIDIA_API_KEY',
7
+ 'OPENAI_API_KEY',
8
+ 'ANTHROPIC_API_KEY',
9
+ 'GEMINI_API_KEY',
10
+ 'GITHUB_TOKEN',
11
+ 'GH_TOKEN',
12
+ 'AWS_SECRET_ACCESS_KEY',
13
+ 'AWS_ACCESS_KEY_ID',
14
+ 'MODERADO_TOKEN',
15
+ ];
16
+ const MAX_BUFFER_BYTES = 64 * 1024; // 64KB limit per stream
17
+ export function getSanitizedEnv() {
18
+ const cleanEnv = { ...process.env };
19
+ for (const key of SENSITIVE_ENV_VARS) {
20
+ delete cleanEnv[key];
21
+ }
22
+ return cleanEnv;
23
+ }
24
+ export function stripAnsi(text) {
25
+ // eslint-disable-next-line no-control-regex
26
+ return text.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, '').replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, '');
27
+ }
28
+ export function isLongRunningDevCommand(executable, args = []) {
29
+ const fullCmd = [executable, ...args].join(' ').toLowerCase();
30
+ const devPatterns = [
31
+ /\bvite\b/,
32
+ /\bwebpack-dev-server\b/,
33
+ /\bwebpack\s+serve\b/,
34
+ /\bhttp-server\b/,
35
+ /\blive-server\b/,
36
+ /\bserv(e|ing)\b/,
37
+ /\bnodemon\b/,
38
+ /\bconcurrently\b/,
39
+ /\b(npm|pnpm|yarn|bun)\s+(run\s+)?(dev|start|serve|watch)\b/,
40
+ /\b(next|remix|astro|nuxt|gatsby)\s+dev\b/,
41
+ /\bnode\s+--watch\b/,
42
+ /\btsx?\s+watch\b/,
43
+ /\b(fastapi|uvicorn)\b.*--reload/,
44
+ /\bflask\s+run\b/,
45
+ /\bpython\b.*-m\s+http\.server/,
46
+ ];
47
+ return devPatterns.some((pattern) => pattern.test(fullCmd));
48
+ }
49
+ export function detectServerReadiness(output) {
50
+ const clean = stripAnsi(output);
51
+ // Common URL patterns (localhost, 127.0.0.1, 0.0.0.0, [::1])
52
+ const urlMatch = clean.match(/(https?:\/\/(?:localhost|127\.0\.0\.1|0\.0\.0\.0|\[::1\]):\d+[\w/-]*)/i);
53
+ // Readiness indicators
54
+ const readyKeywords = [
55
+ /ready in\s+\d+/i,
56
+ /local:\s+https?:\/\//i,
57
+ /network:\s+https?:\/\//i,
58
+ /listening on/i,
59
+ /server running/i,
60
+ /serving http on/i,
61
+ /available on/i,
62
+ /compiled successfully/i,
63
+ /started server on/i,
64
+ /dev server running/i,
65
+ /application is running at/i,
66
+ ];
67
+ const hasIndicator = readyKeywords.some((re) => re.test(clean));
68
+ if (urlMatch && hasIndicator) {
69
+ return urlMatch[1];
70
+ }
71
+ // Fallback: if "Local:" is printed followed by a URL
72
+ const localMatch = clean.match(/Local:\s+(https?:\/\/[^\s]+)/i);
73
+ if (localMatch) {
74
+ return localMatch[1];
75
+ }
76
+ return null;
77
+ }
78
+ export function splitCommandString(str) {
79
+ const tokens = [];
80
+ let current = '';
81
+ let inSingleQuote = false;
82
+ let inDoubleQuote = false;
83
+ for (let i = 0; i < str.length; i++) {
84
+ const char = str[i];
85
+ if (char === '\\') {
86
+ if (process.platform === 'win32') {
87
+ // On Windows, backslash is a directory separator unless immediately escaping a quote
88
+ const nextChar = str[i + 1];
89
+ if (nextChar === '"' || nextChar === "'") {
90
+ current += nextChar;
91
+ i++;
92
+ continue;
93
+ }
94
+ current += char;
95
+ continue;
96
+ }
97
+ else {
98
+ // On POSIX, backslash escapes the next character
99
+ if (i + 1 < str.length) {
100
+ current += str[++i];
101
+ continue;
102
+ }
103
+ current += char;
104
+ continue;
105
+ }
106
+ }
107
+ if (char === "'" && !inDoubleQuote) {
108
+ inSingleQuote = !inSingleQuote;
109
+ continue;
110
+ }
111
+ if (char === '"' && !inSingleQuote) {
112
+ inDoubleQuote = !inDoubleQuote;
113
+ continue;
114
+ }
115
+ if (/\s/.test(char) && !inSingleQuote && !inDoubleQuote) {
116
+ if (current.length > 0) {
117
+ tokens.push(current);
118
+ current = '';
119
+ }
120
+ continue;
121
+ }
122
+ current += char;
123
+ }
124
+ if (current.length > 0) {
125
+ tokens.push(current);
126
+ }
127
+ return tokens;
128
+ }
129
+ export function parseCommandLine(command, args = []) {
130
+ const trimmed = command.trim();
131
+ if (!trimmed) {
132
+ return { executable: '', args: [] };
133
+ }
134
+ if (args.length > 0) {
135
+ if (fs.existsSync(trimmed)) {
136
+ return { executable: trimmed, args };
137
+ }
138
+ if (trimmed.includes(' ')) {
139
+ const parts = splitCommandString(trimmed);
140
+ return {
141
+ executable: parts[0] || trimmed,
142
+ args: [...parts.slice(1), ...args],
143
+ };
144
+ }
145
+ return { executable: trimmed, args };
146
+ }
147
+ if (fs.existsSync(trimmed)) {
148
+ return { executable: trimmed, args: [] };
149
+ }
150
+ // Check if command starts with an existing executable path (e.g. unquoted C:\Program Files\nodejs\node.exe)
151
+ const lower = trimmed.toLowerCase();
152
+ for (const ext of ['.exe', '.cmd', '.bat']) {
153
+ const idx = lower.indexOf(ext);
154
+ if (idx !== -1 && (idx + ext.length === trimmed.length || /\s/.test(trimmed[idx + ext.length]))) {
155
+ const candidate = trimmed.slice(0, idx + ext.length);
156
+ if (fs.existsSync(candidate)) {
157
+ const rest = trimmed.slice(idx + ext.length).trim();
158
+ return {
159
+ executable: candidate,
160
+ args: rest ? splitCommandString(rest) : [],
161
+ };
162
+ }
163
+ }
164
+ }
165
+ const parts = splitCommandString(trimmed);
166
+ return {
167
+ executable: parts[0] || trimmed,
168
+ args: parts.slice(1),
169
+ };
170
+ }
171
+ export const RunCommandTool = {
172
+ name: 'run_command',
173
+ description: 'shell alias: execute an external command and argument array with shell: false; shell syntax is not interpreted.',
174
+ requiresApproval: true,
175
+ parametersSchema: RunCommandParamsSchema,
176
+ async execute(params, context) {
177
+ const cwd = resolveInJail(context.workspaceRoot, '.');
178
+ const { executable, args } = parseCommandLine(params.command, params.args);
179
+ let spawnExec = executable;
180
+ let spawnArgs = args;
181
+ if (process.platform === 'win32') {
182
+ const lower = executable.toLowerCase();
183
+ const isBatch = lower.endsWith('.cmd') || lower.endsWith('.bat');
184
+ const isCmdBuiltin = ['dir', 'del', 'copy', 'move', 'type', 'mkdir', 'rmdir', 'cls', 'ver', 'vol'].includes(lower);
185
+ const isCommonNodeCmd = ['npm', 'npx', 'pnpm', 'yarn', 'tsc', 'corepack'].includes(lower);
186
+ if (isBatch || isCmdBuiltin || isCommonNodeCmd) {
187
+ spawnExec = process.env.COMSPEC || 'cmd.exe';
188
+ spawnArgs = ['/d', '/s', '/c', executable, ...args];
189
+ }
190
+ }
191
+ return new Promise((resolve) => {
192
+ const sanitizedEnv = getSanitizedEnv();
193
+ let stdoutBuffer = '';
194
+ let stderrBuffer = '';
195
+ let stdoutTruncated = false;
196
+ let stderrTruncated = false;
197
+ let timedOut = false;
198
+ let settled = false;
199
+ let serverDetected = false;
200
+ let serverUrl = null;
201
+ let readinessTimer = null;
202
+ let exitSafetyTimer = null;
203
+ let child;
204
+ try {
205
+ child = spawn(spawnExec, spawnArgs, {
206
+ cwd,
207
+ env: sanitizedEnv,
208
+ shell: false,
209
+ windowsHide: true,
210
+ });
211
+ }
212
+ catch (err) {
213
+ return resolve({
214
+ toolName: 'run_command',
215
+ status: 'error',
216
+ output: `Failed to spawn process '${params.command}': ${err.message}`,
217
+ });
218
+ }
219
+ function checkReadiness() {
220
+ if (settled || serverDetected)
221
+ return;
222
+ const combined = stdoutBuffer + '\n' + stderrBuffer;
223
+ const detected = detectServerReadiness(combined);
224
+ if (detected) {
225
+ serverDetected = true;
226
+ serverUrl = detected;
227
+ // Wait 800ms stabilization window to make sure the process doesn't immediately crash
228
+ readinessTimer = setTimeout(() => {
229
+ if (settled)
230
+ return;
231
+ if (child.exitCode === null && !child.killed) {
232
+ cleanup();
233
+ try {
234
+ child.stdout?.removeAllListeners('data');
235
+ child.stderr?.removeAllListeners('data');
236
+ child.stdout?.resume();
237
+ child.stderr?.resume();
238
+ child.unref();
239
+ }
240
+ catch {
241
+ // ignore
242
+ }
243
+ return resolve({
244
+ toolName: 'run_command',
245
+ status: 'success',
246
+ output: `Dev server started and running in background at ${serverUrl}.\n${stripAnsi(stdoutBuffer).trim()}`,
247
+ metadata: {
248
+ backgrounded: true,
249
+ serverUrl,
250
+ pid: child.pid,
251
+ },
252
+ });
253
+ }
254
+ }, 800);
255
+ }
256
+ }
257
+ // Output buffer capture with size capping
258
+ child.stdout?.on('data', (chunk) => {
259
+ if (stdoutBuffer.length + chunk.length > MAX_BUFFER_BYTES) {
260
+ const allowed = Math.max(0, MAX_BUFFER_BYTES - stdoutBuffer.length);
261
+ stdoutBuffer += chunk.toString('utf8', 0, allowed);
262
+ stdoutTruncated = true;
263
+ }
264
+ else {
265
+ stdoutBuffer += chunk.toString('utf8');
266
+ }
267
+ checkReadiness();
268
+ });
269
+ child.stderr?.on('data', (chunk) => {
270
+ if (stderrBuffer.length + chunk.length > MAX_BUFFER_BYTES) {
271
+ const allowed = Math.max(0, MAX_BUFFER_BYTES - stderrBuffer.length);
272
+ stderrBuffer += chunk.toString('utf8', 0, allowed);
273
+ stderrTruncated = true;
274
+ }
275
+ else {
276
+ stderrBuffer += chunk.toString('utf8');
277
+ }
278
+ checkReadiness();
279
+ });
280
+ const timeoutSecs = typeof params.timeoutSeconds === 'number' && !isNaN(params.timeoutSeconds) ? params.timeoutSeconds : 60;
281
+ // Timeout timer
282
+ const timeoutTimer = setTimeout(() => {
283
+ if (settled)
284
+ return;
285
+ timedOut = true;
286
+ killProcess();
287
+ }, timeoutSecs * 1000);
288
+ // Hard fallback watchdog: force settlement if 'close' never emits (e.g. child leaked pipe handles)
289
+ const forceSettleTimer = setTimeout(() => {
290
+ if (settled)
291
+ return;
292
+ cleanup();
293
+ killProcess();
294
+ let output = stdoutBuffer;
295
+ if (stderrBuffer)
296
+ output += `\n[stderr]\n${stderrBuffer}`;
297
+ resolve({
298
+ toolName: 'run_command',
299
+ status: 'error',
300
+ output: `Command timed out after ${timeoutSecs} seconds.\n${output.trim()}`,
301
+ metadata: { timedOut: true },
302
+ });
303
+ }, (timeoutSecs + 2) * 1000);
304
+ // Abort signal listener
305
+ const onAbort = () => {
306
+ if (settled)
307
+ return;
308
+ killProcess();
309
+ };
310
+ if (context.abortSignal) {
311
+ context.abortSignal.addEventListener('abort', onAbort, { once: true });
312
+ }
313
+ function killProcess() {
314
+ if (process.platform === 'win32' && child.pid) {
315
+ try {
316
+ execSync(`taskkill /pid ${child.pid} /T /F`, { stdio: 'ignore' });
317
+ return;
318
+ }
319
+ catch {
320
+ // Process may already be dead
321
+ }
322
+ }
323
+ try {
324
+ child.kill('SIGTERM');
325
+ setTimeout(() => {
326
+ try {
327
+ child.kill('SIGKILL');
328
+ }
329
+ catch {
330
+ // ignore
331
+ }
332
+ }, 1500);
333
+ }
334
+ catch {
335
+ // ignore
336
+ }
337
+ }
338
+ function cleanup() {
339
+ settled = true;
340
+ clearTimeout(timeoutTimer);
341
+ clearTimeout(forceSettleTimer);
342
+ if (readinessTimer)
343
+ clearTimeout(readinessTimer);
344
+ if (exitSafetyTimer)
345
+ clearTimeout(exitSafetyTimer);
346
+ if (context.abortSignal) {
347
+ context.abortSignal.removeEventListener('abort', onAbort);
348
+ }
349
+ }
350
+ function handleClose(code, signal) {
351
+ if (settled)
352
+ return;
353
+ cleanup();
354
+ let output = '';
355
+ if (stdoutBuffer) {
356
+ output += stdoutBuffer;
357
+ if (stdoutTruncated) {
358
+ output += '\n... [stdout truncated at 64KB]';
359
+ }
360
+ }
361
+ if (stderrBuffer) {
362
+ if (output)
363
+ output += '\n';
364
+ output += `[stderr]\n${stderrBuffer}`;
365
+ if (stderrTruncated) {
366
+ output += '\n... [stderr truncated at 64KB]';
367
+ }
368
+ }
369
+ if (timedOut) {
370
+ return resolve({
371
+ toolName: 'run_command',
372
+ status: 'error',
373
+ output: `Command timed out after ${timeoutSecs} seconds.\n${output}`,
374
+ metadata: { timedOut: true },
375
+ });
376
+ }
377
+ if (signal) {
378
+ return resolve({
379
+ toolName: 'run_command',
380
+ status: 'error',
381
+ output: `Command terminated by signal ${signal}.\n${output}`,
382
+ metadata: { signal },
383
+ });
384
+ }
385
+ const isSuccess = code === 0;
386
+ return resolve({
387
+ toolName: 'run_command',
388
+ status: isSuccess ? 'success' : 'error',
389
+ output: output.trim() || `(Process exited with code ${code})`,
390
+ metadata: {
391
+ exitCode: code,
392
+ stdoutTruncated,
393
+ stderrTruncated,
394
+ },
395
+ });
396
+ }
397
+ child.on('error', (err) => {
398
+ cleanup();
399
+ resolve({
400
+ toolName: 'run_command',
401
+ status: 'error',
402
+ output: `Process error while executing '${params.command}': ${err.message}`,
403
+ });
404
+ });
405
+ child.on('exit', (code, signal) => {
406
+ // If stdio 'close' does not fire within 500ms after exit (e.g. grandchild holding pipes), force settle
407
+ if (!settled) {
408
+ exitSafetyTimer = setTimeout(() => {
409
+ if (settled)
410
+ return;
411
+ handleClose(code ?? 0, signal);
412
+ }, 500);
413
+ }
414
+ });
415
+ child.on('close', (code, signal) => {
416
+ handleClose(code, signal);
417
+ });
418
+ });
419
+ },
420
+ };
421
+ //# sourceMappingURL=run_command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run_command.js","sourceRoot":"","sources":["../../src/tools/run_command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { IToolDefinition, RunDiagnosticsParams } from '@moderado/contracts';
2
+ export declare const RunDiagnosticsTool: IToolDefinition<RunDiagnosticsParams>;
3
+ //# sourceMappingURL=run_diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run_diagnostics.d.ts","sourceRoot":"","sources":["../../src/tools/run_diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAgE,MAAM,qBAAqB,CAAC;AAE1I,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAAC,oBAAoB,CAA0pB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { RunDiagnosticsParamsSchema } from '../../contracts/index.js';
2
+ import { parseTypeScriptDiagnostics, runDiagnosticScript } from '../diagnostics.js';
3
+ export const RunDiagnosticsTool = { name: 'run_diagnostics', description: 'Run an approved TypeScript/JavaScript diagnostic script.', requiresApproval: true, parametersSchema: RunDiagnosticsParamsSchema, async execute(params, context) { try {
4
+ const run = await runDiagnosticScript(context.workspaceRoot, params.script);
5
+ const diagnostics = parseTypeScriptDiagnostics(run.output);
6
+ return { toolName: 'run_diagnostics', status: 'success', output: run.output || `npm run ${params.script} exited with code ${run.exitCode}`, metadata: { diagnostics, exitCode: run.exitCode } };
7
+ }
8
+ catch (err) {
9
+ return { toolName: 'run_diagnostics', status: 'error', output: err.message };
10
+ } } };
11
+ //# sourceMappingURL=run_diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run_diagnostics.js","sourceRoot":"","sources":["../../src/tools/run_diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,0BAA0B,EAAoC,MAAM,qBAAqB,CAAC;AAC1I,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACpF,MAAM,CAAC,MAAM,kBAAkB,GAA0C,EAAE,IAAI,EAAC,iBAAiB,EAAE,WAAW,EAAC,0DAA0D,EAAE,gBAAgB,EAAC,IAAI,EAAE,gBAAgB,EAAC,0BAA0B,EAAE,KAAK,CAAC,OAAO,CAAC,MAA2B,EAAE,OAA4B,IAAsB,IAAG,CAAC;QAAA,MAAM,GAAG,GAAC,MAAM,mBAAmB,CAAC,OAAO,CAAC,aAAa,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAAC,MAAM,WAAW,GAAC,0BAA0B,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAAC,OAAO,EAAC,QAAQ,EAAC,iBAAiB,EAAC,MAAM,EAAC,SAAS,EAAC,MAAM,EAAC,GAAG,CAAC,MAAM,IAAE,WAAW,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,QAAQ,EAAE,EAAC,QAAQ,EAAC,EAAC,WAAW,EAAC,QAAQ,EAAC,GAAG,CAAC,QAAQ,EAAC,EAAC,CAAC;IAAA,CAAC;IAAA,OAAM,GAAO,EAAC,CAAC;QAAA,OAAO,EAAC,QAAQ,EAAC,iBAAiB,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,GAAG,CAAC,OAAO,EAAC,CAAC;IAAA,CAAC,CAAA,CAAC,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { IToolDefinition, SearchFilesParams } from '@moderado/contracts';
2
+ export declare const SearchFilesTool: IToolDefinition<SearchFilesParams>;
3
+ //# sourceMappingURL=search_files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search_files.d.ts","sourceRoot":"","sources":["../../src/tools/search_files.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,eAAe,EACf,iBAAiB,EAIlB,MAAM,qBAAqB,CAAC;AAc7B,eAAO,MAAM,eAAe,EAAE,eAAe,CAAC,iBAAiB,CA+G9D,CAAC"}
@@ -0,0 +1,120 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { SearchFilesParamsSchema, } from '../../contracts/index.js';
4
+ import { isProtectedPath, resolveInJail } from '../jail.js';
5
+ const DEFAULT_IGNORED_DIRS = new Set([
6
+ 'node_modules',
7
+ '.git',
8
+ 'dist',
9
+ 'build',
10
+ '.turbo',
11
+ '.next',
12
+ '.nuxt',
13
+ 'coverage',
14
+ ]);
15
+ export const SearchFilesTool = {
16
+ name: 'search_files',
17
+ description: 'grep alias: search workspace file contents with literal strings or regex patterns. Results use grep-style path:line:content output.',
18
+ requiresApproval: false,
19
+ parametersSchema: SearchFilesParamsSchema,
20
+ async execute(params, context) {
21
+ const root = resolveInJail(context.workspaceRoot, '.');
22
+ let matcher;
23
+ try {
24
+ if (params.isRegex) {
25
+ matcher = new RegExp(params.query, params.caseSensitive ? 'g' : 'gi');
26
+ }
27
+ else {
28
+ const escaped = params.query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
29
+ matcher = new RegExp(escaped, params.caseSensitive ? 'g' : 'gi');
30
+ }
31
+ }
32
+ catch (err) {
33
+ return {
34
+ toolName: 'search_files',
35
+ status: 'error',
36
+ output: `Invalid search pattern: ${err.message}`,
37
+ };
38
+ }
39
+ const matches = [];
40
+ let hitLimit = false;
41
+ function searchDir(currentDir) {
42
+ if (hitLimit)
43
+ return;
44
+ let entries;
45
+ try {
46
+ entries = fs.readdirSync(currentDir, { withFileTypes: true });
47
+ }
48
+ catch {
49
+ return;
50
+ }
51
+ for (const entry of entries) {
52
+ if (hitLimit)
53
+ return;
54
+ const fullPath = path.join(currentDir, entry.name);
55
+ const relPath = path.relative(root, fullPath);
56
+ if (isProtectedPath(relPath)) {
57
+ continue;
58
+ }
59
+ if (entry.isDirectory()) {
60
+ if (!DEFAULT_IGNORED_DIRS.has(entry.name)) {
61
+ searchDir(fullPath);
62
+ }
63
+ }
64
+ else if (entry.isFile()) {
65
+ if (params.includes && params.includes.length > 0) {
66
+ const matchesIncludes = params.includes.some((ext) => relPath.endsWith(ext) || relPath.includes(ext));
67
+ if (!matchesIncludes) {
68
+ continue;
69
+ }
70
+ }
71
+ // Skip large files (> 2MB)
72
+ try {
73
+ const stat = fs.statSync(fullPath);
74
+ if (stat.size > 2 * 1024 * 1024) {
75
+ continue;
76
+ }
77
+ const content = fs.readFileSync(fullPath, 'utf8');
78
+ // Check for binary
79
+ if (content.includes('\0')) {
80
+ continue;
81
+ }
82
+ const lines = content.split(/\r?\n/);
83
+ for (let i = 0; i < lines.length; i++) {
84
+ const line = lines[i];
85
+ matcher.lastIndex = 0;
86
+ if (matcher.test(line)) {
87
+ matches.push(`${relPath}:${i + 1}:${line.trim()}`);
88
+ if (matches.length >= params.maxResults) {
89
+ hitLimit = true;
90
+ return;
91
+ }
92
+ }
93
+ }
94
+ }
95
+ catch {
96
+ // ignore read error on individual files
97
+ }
98
+ }
99
+ }
100
+ }
101
+ searchDir(root);
102
+ let output = matches.join('\n');
103
+ if (hitLimit) {
104
+ output += `\n... [Limit of ${params.maxResults} matches reached]`;
105
+ }
106
+ else if (matches.length === 0) {
107
+ output = `No matches found for '${params.query}'.`;
108
+ }
109
+ return {
110
+ toolName: 'search_files',
111
+ status: 'success',
112
+ output,
113
+ truncated: hitLimit,
114
+ metadata: {
115
+ matchesCount: matches.length,
116
+ },
117
+ };
118
+ },
119
+ };
120
+ //# sourceMappingURL=search_files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search_files.js","sourceRoot":"","sources":["../../src/tools/search_files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { IToolDefinition, WebSearchParams } from '@moderado/contracts';
2
+ /** Hosted MCP search services. No credential is required; an API key only raises provider limits. */
3
+ export declare const EXA_SEARCH_URL = "https://mcp.exa.ai/mcp";
4
+ export declare const PARALLEL_SEARCH_URL = "https://search.parallel.ai/mcp";
5
+ export declare const DEFAULT_SEARCH_TIMEOUT_MS = 20000;
6
+ export declare const MAX_SEARCH_OUTPUT_CHARS = 8000;
7
+ export type WebSearchProviderName = 'exa' | 'parallel' | 'custom';
8
+ export interface WebSearchTarget {
9
+ provider: WebSearchProviderName;
10
+ url: string;
11
+ tool: string;
12
+ }
13
+ export interface WebSearchToolOptions {
14
+ /** Explicit HTTPS (or localhost) endpoint returning `{ results: [{ title, url, snippet? }] }`. */
15
+ endpoint?: string;
16
+ /** Pin the search provider instead of the default Exa-then-Parallel order. */
17
+ provider?: WebSearchProviderName;
18
+ timeoutMs?: number;
19
+ fetchImpl?: typeof fetch;
20
+ }
21
+ export declare function isAllowedSearchEndpoint(endpoint: string): boolean;
22
+ /**
23
+ * Order the search sites deterministically: an explicit endpoint wins, then Exa (best current-events
24
+ * context in live probes), then Parallel. A pinned provider moves to the front and keeps the rest as fallback.
25
+ */
26
+ export declare function resolveWebSearchTargets(options?: WebSearchToolOptions, env?: NodeJS.ProcessEnv): WebSearchTarget[];
27
+ /** Accept both a direct JSON-RPC body and a server-sent-events stream. */
28
+ export declare function parseMcpSearchText(body: string): string | undefined;
29
+ export declare function extractSearchSources(text: string, limit?: number): Array<{
30
+ title: string;
31
+ url: string;
32
+ }>;
33
+ export declare function boundSearchOutput(text: string, maxChars?: number): {
34
+ output: string;
35
+ truncated: boolean;
36
+ };
37
+ /** Build a search tool bound to operator configuration so the model only supplies the query. */
38
+ export declare function createWebSearchTool(options?: WebSearchToolOptions): IToolDefinition<WebSearchParams>;
39
+ /** Default registration used when the CLI does not supply operator configuration. */
40
+ export declare const WebSearchTool: IToolDefinition<{
41
+ query: string;
42
+ maxResults: number;
43
+ objective?: string | undefined;
44
+ endpoint?: string | undefined;
45
+ }>;
46
+ //# sourceMappingURL=web_search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web_search.d.ts","sourceRoot":"","sources":["../../src/tools/web_search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAoC,eAAe,EAAyB,MAAM,qBAAqB,CAAC;AAEhI,qGAAqG;AACrG,eAAO,MAAM,cAAc,2BAA2B,CAAC;AACvD,eAAO,MAAM,mBAAmB,mCAAmC,CAAC;AACpE,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAChD,eAAO,MAAM,uBAAuB,OAAQ,CAAC;AAI7C,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,qBAAqB,CAAC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,kGAAkG;IAClG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAaD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAOjE;AAOD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,oBAAyB,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,eAAe,EAAE,CAWnI;AAaD,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQnE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAc,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAoB7G;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAA0B,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAG1H;AAsCD,gGAAgG;AAChG,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,eAAe,CAAC,eAAe,CAAC,CAiCxG;AAED,qFAAqF;AACrF,eAAO,MAAM,aAAa;;;;;EAAwB,CAAC"}