aiexecode 1.0.157

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 (188) hide show
  1. package/LICENSE +68 -0
  2. package/README.md +347 -0
  3. package/config_template/mcp_config.json +3 -0
  4. package/config_template/package_name_store.json +5 -0
  5. package/config_template/settings.json +5 -0
  6. package/index.js +879 -0
  7. package/mcp-agent-lib/example/01-basic-usage.js +82 -0
  8. package/mcp-agent-lib/example/02-quick-start.js +52 -0
  9. package/mcp-agent-lib/example/03-http-server.js +76 -0
  10. package/mcp-agent-lib/example/04-multiple-servers.js +117 -0
  11. package/mcp-agent-lib/example/05-error-handling.js +116 -0
  12. package/mcp-agent-lib/example/06-resources-and-prompts.js +174 -0
  13. package/mcp-agent-lib/example/07-advanced-configuration.js +191 -0
  14. package/mcp-agent-lib/example/08-real-world-chatbot.js +331 -0
  15. package/mcp-agent-lib/example/README.md +346 -0
  16. package/mcp-agent-lib/index.js +19 -0
  17. package/mcp-agent-lib/init.sh +3 -0
  18. package/mcp-agent-lib/package-lock.json +1216 -0
  19. package/mcp-agent-lib/package.json +53 -0
  20. package/mcp-agent-lib/sampleFastMCPClient/client.py +25 -0
  21. package/mcp-agent-lib/sampleFastMCPClient/run.sh +3 -0
  22. package/mcp-agent-lib/sampleFastMCPServer/run.sh +3 -0
  23. package/mcp-agent-lib/sampleFastMCPServer/server.py +12 -0
  24. package/mcp-agent-lib/sampleFastMCPServerElicitationRequest/run.sh +3 -0
  25. package/mcp-agent-lib/sampleFastMCPServerElicitationRequest/server.py +43 -0
  26. package/mcp-agent-lib/sampleFastMCPServerRootsRequest/server.py +63 -0
  27. package/mcp-agent-lib/sampleMCPHost/index.js +386 -0
  28. package/mcp-agent-lib/sampleMCPHost/mcp_config.json +24 -0
  29. package/mcp-agent-lib/sampleMCPHostFeatures/elicitation.js +151 -0
  30. package/mcp-agent-lib/sampleMCPHostFeatures/index.js +166 -0
  31. package/mcp-agent-lib/sampleMCPHostFeatures/roots.js +197 -0
  32. package/mcp-agent-lib/src/mcp_client.js +1860 -0
  33. package/mcp-agent-lib/src/mcp_message_logger.js +517 -0
  34. package/package.json +72 -0
  35. package/payload_viewer/out/404/index.html +1 -0
  36. package/payload_viewer/out/404.html +1 -0
  37. package/payload_viewer/out/_next/static/chunks/060f9a97930f3d04.js +1 -0
  38. package/payload_viewer/out/_next/static/chunks/103c802c8f4a5ea1.js +1 -0
  39. package/payload_viewer/out/_next/static/chunks/16474fd6c6910c45.js +1 -0
  40. package/payload_viewer/out/_next/static/chunks/17722e3ac4e00587.js +1 -0
  41. package/payload_viewer/out/_next/static/chunks/305b077a9873cf54.js +1 -0
  42. package/payload_viewer/out/_next/static/chunks/4c1d05c6741c2bdd.js +5 -0
  43. package/payload_viewer/out/_next/static/chunks/538cc02e54714b23.js +1 -0
  44. package/payload_viewer/out/_next/static/chunks/6251fa5907d2b226.js +5 -0
  45. package/payload_viewer/out/_next/static/chunks/a6dad97d9634a72d.js +1 -0
  46. package/payload_viewer/out/_next/static/chunks/b6c0459f3789d25c.js +1 -0
  47. package/payload_viewer/out/_next/static/chunks/b75131b58f8ca46a.css +3 -0
  48. package/payload_viewer/out/_next/static/chunks/bd2dcf98c9b362f6.js +1 -0
  49. package/payload_viewer/out/_next/static/chunks/c8a542ae21335479.js +1 -0
  50. package/payload_viewer/out/_next/static/chunks/cdd12d5c1a5a6064.js +1 -0
  51. package/payload_viewer/out/_next/static/chunks/e411019f55d87c42.js +1 -0
  52. package/payload_viewer/out/_next/static/chunks/e60ef129113f6e24.js +1 -0
  53. package/payload_viewer/out/_next/static/chunks/f1ac9047ac4a3fde.js +1 -0
  54. package/payload_viewer/out/_next/static/chunks/turbopack-0ac29803ce3c3c7a.js +3 -0
  55. package/payload_viewer/out/_next/static/chunks/turbopack-89db4c64206a73e4.js +3 -0
  56. package/payload_viewer/out/_next/static/chunks/turbopack-a5b8235fa59d7119.js +3 -0
  57. package/payload_viewer/out/_next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
  58. package/payload_viewer/out/_next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
  59. package/payload_viewer/out/_next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
  60. package/payload_viewer/out/_next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
  61. package/payload_viewer/out/_next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
  62. package/payload_viewer/out/_next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
  63. package/payload_viewer/out/_next/static/media/favicon.0b3bf435.ico +0 -0
  64. package/payload_viewer/out/_next/static/uqQYtKpKV7kCSkUbLgdfJ/_buildManifest.js +14 -0
  65. package/payload_viewer/out/_next/static/uqQYtKpKV7kCSkUbLgdfJ/_clientMiddlewareManifest.json +1 -0
  66. package/payload_viewer/out/_next/static/uqQYtKpKV7kCSkUbLgdfJ/_ssgManifest.js +1 -0
  67. package/payload_viewer/out/favicon.ico +0 -0
  68. package/payload_viewer/out/file.svg +1 -0
  69. package/payload_viewer/out/globe.svg +1 -0
  70. package/payload_viewer/out/index.html +1 -0
  71. package/payload_viewer/out/index.txt +23 -0
  72. package/payload_viewer/out/next.svg +1 -0
  73. package/payload_viewer/out/vercel.svg +1 -0
  74. package/payload_viewer/out/window.svg +1 -0
  75. package/payload_viewer/web_server.js +861 -0
  76. package/prompts/completion_judge.txt +128 -0
  77. package/prompts/orchestrator.txt +1213 -0
  78. package/src/LLMClient/client.js +1375 -0
  79. package/src/LLMClient/converters/input-normalizer.js +238 -0
  80. package/src/LLMClient/converters/responses-to-claude.js +503 -0
  81. package/src/LLMClient/converters/responses-to-gemini.js +648 -0
  82. package/src/LLMClient/converters/responses-to-ollama.js +348 -0
  83. package/src/LLMClient/converters/responses-to-zai.js +667 -0
  84. package/src/LLMClient/errors.js +398 -0
  85. package/src/LLMClient/index.js +36 -0
  86. package/src/ai_based/completion_judge.js +421 -0
  87. package/src/ai_based/orchestrator.js +527 -0
  88. package/src/ai_based/pip_package_installer.js +173 -0
  89. package/src/ai_based/pip_package_lookup.js +197 -0
  90. package/src/cli/mcp_cli.js +70 -0
  91. package/src/cli/mcp_commands.js +255 -0
  92. package/src/commands/agents.js +18 -0
  93. package/src/commands/apikey.js +55 -0
  94. package/src/commands/bg.js +140 -0
  95. package/src/commands/commands.js +56 -0
  96. package/src/commands/debug.js +54 -0
  97. package/src/commands/exit.js +19 -0
  98. package/src/commands/help.js +35 -0
  99. package/src/commands/mcp.js +128 -0
  100. package/src/commands/model.js +176 -0
  101. package/src/commands/setup.js +13 -0
  102. package/src/commands/skills.js +51 -0
  103. package/src/commands/tools.js +165 -0
  104. package/src/commands/viewer.js +147 -0
  105. package/src/config/ai_models.js +312 -0
  106. package/src/config/config.js +10 -0
  107. package/src/config/constants.js +71 -0
  108. package/src/config/feature_flags.js +15 -0
  109. package/src/frontend/App.js +1263 -0
  110. package/src/frontend/README.md +81 -0
  111. package/src/frontend/components/AutocompleteMenu.js +47 -0
  112. package/src/frontend/components/BackgroundProcessList.js +175 -0
  113. package/src/frontend/components/BlankLine.js +62 -0
  114. package/src/frontend/components/ConversationItem.js +893 -0
  115. package/src/frontend/components/CurrentModelView.js +43 -0
  116. package/src/frontend/components/FileDiffViewer.js +616 -0
  117. package/src/frontend/components/Footer.js +25 -0
  118. package/src/frontend/components/Header.js +42 -0
  119. package/src/frontend/components/HelpView.js +154 -0
  120. package/src/frontend/components/Input.js +344 -0
  121. package/src/frontend/components/LoadingIndicator.js +31 -0
  122. package/src/frontend/components/ModelListView.js +49 -0
  123. package/src/frontend/components/ModelUpdatedView.js +22 -0
  124. package/src/frontend/components/SessionSpinner.js +66 -0
  125. package/src/frontend/components/SetupWizard.js +242 -0
  126. package/src/frontend/components/StreamOutput.js +34 -0
  127. package/src/frontend/components/TodoList.js +56 -0
  128. package/src/frontend/components/ToolApprovalPrompt.js +452 -0
  129. package/src/frontend/design/themeColors.js +42 -0
  130. package/src/frontend/hooks/useCompletion.js +84 -0
  131. package/src/frontend/hooks/useFileCompletion.js +467 -0
  132. package/src/frontend/hooks/useKeypress.js +145 -0
  133. package/src/frontend/index.js +65 -0
  134. package/src/frontend/utils/GridRenderer.js +140 -0
  135. package/src/frontend/utils/InlineFormatter.js +156 -0
  136. package/src/frontend/utils/diffUtils.js +235 -0
  137. package/src/frontend/utils/inputBuffer.js +441 -0
  138. package/src/frontend/utils/markdownParser.js +377 -0
  139. package/src/frontend/utils/outputRedirector.js +47 -0
  140. package/src/frontend/utils/renderInkComponent.js +42 -0
  141. package/src/frontend/utils/syntaxHighlighter.js +149 -0
  142. package/src/frontend/utils/toolUIFormatter.js +261 -0
  143. package/src/system/agents_loader.js +170 -0
  144. package/src/system/ai_request.js +737 -0
  145. package/src/system/background_process.js +317 -0
  146. package/src/system/code_executer.js +1233 -0
  147. package/src/system/command_loader.js +40 -0
  148. package/src/system/command_parser.js +133 -0
  149. package/src/system/conversation_state.js +265 -0
  150. package/src/system/conversation_trimmer.js +265 -0
  151. package/src/system/custom_command_loader.js +395 -0
  152. package/src/system/file_integrity.js +466 -0
  153. package/src/system/import_analyzer.py +174 -0
  154. package/src/system/log.js +82 -0
  155. package/src/system/mcp_integration.js +304 -0
  156. package/src/system/output_helper.js +89 -0
  157. package/src/system/session.js +1393 -0
  158. package/src/system/session_memory.js +481 -0
  159. package/src/system/skill_loader.js +324 -0
  160. package/src/system/system_info.js +483 -0
  161. package/src/system/tool_approval.js +160 -0
  162. package/src/system/tool_registry.js +184 -0
  163. package/src/system/ui_events.js +279 -0
  164. package/src/tools/code_editor.js +792 -0
  165. package/src/tools/file_reader.js +385 -0
  166. package/src/tools/glob.js +263 -0
  167. package/src/tools/response_message.js +30 -0
  168. package/src/tools/ripgrep.js +554 -0
  169. package/src/tools/skill_tool.js +122 -0
  170. package/src/tools/todo_write.js +182 -0
  171. package/src/tools/web_download.py +74 -0
  172. package/src/tools/web_downloader.js +83 -0
  173. package/src/util/clone.js +174 -0
  174. package/src/util/config.js +203 -0
  175. package/src/util/config_migration.js +174 -0
  176. package/src/util/debug_log.js +49 -0
  177. package/src/util/exit_handler.js +53 -0
  178. package/src/util/file_reference_parser.js +132 -0
  179. package/src/util/mcp_config_manager.js +159 -0
  180. package/src/util/output_formatter.js +50 -0
  181. package/src/util/path_helper.js +27 -0
  182. package/src/util/path_validator.js +178 -0
  183. package/src/util/prompt_loader.js +184 -0
  184. package/src/util/rag_helper.js +101 -0
  185. package/src/util/safe_fs.js +645 -0
  186. package/src/util/setup_wizard.js +62 -0
  187. package/src/util/text_formatter.js +33 -0
  188. package/src/util/version_check.js +116 -0
@@ -0,0 +1,317 @@
1
+ /**
2
+ * 백그라운드 프로세스 관리 모듈
3
+ *
4
+ * AI Agent가 백그라운드로 명령어를 실행하고 관리할 수 있도록 지원
5
+ */
6
+
7
+ import { spawn } from 'child_process';
8
+ import { EventEmitter } from 'events';
9
+ import { createDebugLogger } from '../util/debug_log.js';
10
+ import { whichCommand } from './code_executer.js';
11
+
12
+ const debugLog = createDebugLogger('background_process.log', 'background_process');
13
+
14
+ /**
15
+ * 백그라운드 프로세스 정보
16
+ * @typedef {Object} BackgroundProcess
17
+ * @property {string} id - 고유 ID
18
+ * @property {string} command - 실행된 명령어
19
+ * @property {number} pid - 프로세스 ID
20
+ * @property {string} status - 상태 (running, completed, failed, killed)
21
+ * @property {Date} startedAt - 시작 시간
22
+ * @property {Date|null} endedAt - 종료 시간
23
+ * @property {string} stdout - 표준 출력
24
+ * @property {string} stderr - 표준 에러
25
+ * @property {number|null} exitCode - 종료 코드
26
+ */
27
+
28
+ class BackgroundProcessManager extends EventEmitter {
29
+ constructor() {
30
+ super();
31
+ /** @type {Map<string, BackgroundProcess>} */
32
+ this.processes = new Map();
33
+ this.nextId = 1;
34
+ }
35
+
36
+ /**
37
+ * 고유 ID 생성
38
+ */
39
+ _generateId() {
40
+ return `bg_${this.nextId++}`;
41
+ }
42
+
43
+ /**
44
+ * 백그라운드로 명령어 실행
45
+ * @param {string} script - 실행할 스크립트
46
+ * @param {Object} options - 옵션
47
+ * @returns {Promise<{id: string, pid: number}>}
48
+ */
49
+ async run(script, options = {}) {
50
+ const shellPath = await whichCommand("bash") || await whichCommand("sh");
51
+ if (!shellPath) {
52
+ throw new Error('No shell found');
53
+ }
54
+
55
+ const id = this._generateId();
56
+ const startedAt = new Date();
57
+
58
+ debugLog(`[BackgroundProcess] Starting: id=${id}, script="${script.substring(0, 50)}..."`);
59
+
60
+ const child = spawn(shellPath, ['-c', script], {
61
+ stdio: ['ignore', 'pipe', 'pipe'],
62
+ env: {
63
+ ...process.env,
64
+ DEBIAN_FRONTEND: 'noninteractive',
65
+ CI: 'true',
66
+ BATCH: '1',
67
+ },
68
+ cwd: options.cwd || process.cwd(),
69
+ detached: true,
70
+ });
71
+
72
+ const processInfo = {
73
+ id,
74
+ command: script,
75
+ pid: child.pid,
76
+ status: 'running',
77
+ startedAt,
78
+ endedAt: null,
79
+ stdout: '',
80
+ stderr: '',
81
+ exitCode: null,
82
+ _process: child, // 내부용
83
+ };
84
+
85
+ this.processes.set(id, processInfo);
86
+
87
+ // stdout 수집
88
+ child.stdout.on('data', (data) => {
89
+ processInfo.stdout += data.toString();
90
+ this.emit('output', { id, type: 'stdout', data: data.toString() });
91
+ });
92
+
93
+ // stderr 수집
94
+ child.stderr.on('data', (data) => {
95
+ processInfo.stderr += data.toString();
96
+ this.emit('output', { id, type: 'stderr', data: data.toString() });
97
+ });
98
+
99
+ // 프로세스 종료 처리
100
+ child.on('close', (code) => {
101
+ processInfo.status = code === 0 ? 'completed' : 'failed';
102
+ processInfo.exitCode = code;
103
+ processInfo.endedAt = new Date();
104
+ delete processInfo._process;
105
+
106
+ debugLog(`[BackgroundProcess] Closed: id=${id}, code=${code}`);
107
+ this.emit('close', { id, code, status: processInfo.status });
108
+ });
109
+
110
+ child.on('error', (err) => {
111
+ processInfo.status = 'failed';
112
+ processInfo.stderr += `\nError: ${err.message}`;
113
+ processInfo.endedAt = new Date();
114
+ delete processInfo._process;
115
+
116
+ debugLog(`[BackgroundProcess] Error: id=${id}, error=${err.message}`);
117
+ this.emit('error', { id, error: err });
118
+ });
119
+
120
+ this.emit('started', { id, pid: child.pid, command: script });
121
+
122
+ return { id, pid: child.pid };
123
+ }
124
+
125
+ /**
126
+ * 프로세스 종료
127
+ * @param {string} id - 프로세스 ID
128
+ * @param {string} signal - 시그널 (기본: SIGTERM)
129
+ * @returns {boolean} 성공 여부
130
+ */
131
+ kill(id, signal = 'SIGTERM') {
132
+ const processInfo = this.processes.get(id);
133
+ if (!processInfo) {
134
+ debugLog(`[BackgroundProcess] Kill failed: id=${id} not found`);
135
+ return false;
136
+ }
137
+
138
+ if (processInfo.status !== 'running') {
139
+ debugLog(`[BackgroundProcess] Kill skipped: id=${id} already ${processInfo.status}`);
140
+ return false;
141
+ }
142
+
143
+ const child = processInfo._process;
144
+ if (!child) {
145
+ return false;
146
+ }
147
+
148
+ try {
149
+ // 프로세스 그룹 전체 종료
150
+ process.kill(-child.pid, signal);
151
+ processInfo.status = 'killed';
152
+ processInfo.endedAt = new Date();
153
+ debugLog(`[BackgroundProcess] Killed: id=${id}, signal=${signal}`);
154
+ this.emit('killed', { id, signal });
155
+ return true;
156
+ } catch (err) {
157
+ try {
158
+ child.kill(signal);
159
+ processInfo.status = 'killed';
160
+ processInfo.endedAt = new Date();
161
+ debugLog(`[BackgroundProcess] Killed (fallback): id=${id}`);
162
+ this.emit('killed', { id, signal });
163
+ return true;
164
+ } catch (err2) {
165
+ debugLog(`[BackgroundProcess] Kill error: id=${id}, error=${err2.message}`);
166
+ return false;
167
+ }
168
+ }
169
+ }
170
+
171
+ /**
172
+ * 프로세스 정보 조회
173
+ * @param {string} id - 프로세스 ID
174
+ * @returns {BackgroundProcess|null}
175
+ */
176
+ get(id) {
177
+ const info = this.processes.get(id);
178
+ if (!info) return null;
179
+
180
+ // _process 필드 제외하고 반환
181
+ const { _process, ...publicInfo } = info;
182
+ return publicInfo;
183
+ }
184
+
185
+ /**
186
+ * 모든 프로세스 목록 조회
187
+ * @param {Object} filter - 필터 옵션
188
+ * @returns {BackgroundProcess[]}
189
+ */
190
+ list(filter = {}) {
191
+ let result = [];
192
+
193
+ for (const [id, info] of this.processes) {
194
+ const { _process, ...publicInfo } = info;
195
+
196
+ // 필터 적용
197
+ if (filter.status && publicInfo.status !== filter.status) continue;
198
+ if (filter.running && publicInfo.status !== 'running') continue;
199
+
200
+ result.push(publicInfo);
201
+ }
202
+
203
+ // 시작 시간순 정렬
204
+ result.sort((a, b) => b.startedAt - a.startedAt);
205
+
206
+ return result;
207
+ }
208
+
209
+ /**
210
+ * 실행 중인 프로세스 수
211
+ */
212
+ get runningCount() {
213
+ let count = 0;
214
+ for (const info of this.processes.values()) {
215
+ if (info.status === 'running') count++;
216
+ }
217
+ return count;
218
+ }
219
+
220
+ /**
221
+ * 완료된 프로세스 정리
222
+ * @param {number} maxAge - 최대 보관 시간 (ms)
223
+ */
224
+ cleanup(maxAge = 3600000) {
225
+ const now = Date.now();
226
+ const toDelete = [];
227
+
228
+ for (const [id, info] of this.processes) {
229
+ if (info.status !== 'running' && info.endedAt) {
230
+ if (now - info.endedAt.getTime() > maxAge) {
231
+ toDelete.push(id);
232
+ }
233
+ }
234
+ }
235
+
236
+ for (const id of toDelete) {
237
+ this.processes.delete(id);
238
+ debugLog(`[BackgroundProcess] Cleaned up: id=${id}`);
239
+ }
240
+
241
+ return toDelete.length;
242
+ }
243
+
244
+ /**
245
+ * 모든 실행 중인 프로세스 종료
246
+ */
247
+ async killAll() {
248
+ const killed = [];
249
+ for (const [id, info] of this.processes) {
250
+ if (info.status === 'running') {
251
+ if (this.kill(id)) {
252
+ killed.push(id);
253
+ }
254
+ }
255
+ }
256
+ return killed;
257
+ }
258
+ }
259
+
260
+ // 싱글톤 인스턴스
261
+ let instance = null;
262
+
263
+ /**
264
+ * BackgroundProcessManager 싱글톤 인스턴스 가져오기
265
+ */
266
+ export function getBackgroundProcessManager() {
267
+ if (!instance) {
268
+ instance = new BackgroundProcessManager();
269
+ }
270
+ return instance;
271
+ }
272
+
273
+ /**
274
+ * 백그라운드로 명령어 실행
275
+ * @param {string} script - 실행할 스크립트
276
+ * @param {Object} options - 옵션
277
+ * @returns {Promise<{id: string, pid: number}>}
278
+ */
279
+ export async function runInBackground(script, options = {}) {
280
+ const manager = getBackgroundProcessManager();
281
+ return await manager.run(script, options);
282
+ }
283
+
284
+ /**
285
+ * 백그라운드 프로세스 종료
286
+ * @param {string} id - 프로세스 ID
287
+ */
288
+ export function killBackgroundProcess(id) {
289
+ const manager = getBackgroundProcessManager();
290
+ return manager.kill(id);
291
+ }
292
+
293
+ /**
294
+ * 백그라운드 프로세스 목록 조회
295
+ */
296
+ export function listBackgroundProcesses(filter = {}) {
297
+ const manager = getBackgroundProcessManager();
298
+ return manager.list(filter);
299
+ }
300
+
301
+ /**
302
+ * 백그라운드 프로세스 정보 조회
303
+ */
304
+ export function getBackgroundProcess(id) {
305
+ const manager = getBackgroundProcessManager();
306
+ return manager.get(id);
307
+ }
308
+
309
+ /**
310
+ * 모든 백그라운드 프로세스 종료 (앱 종료 시)
311
+ */
312
+ export async function killAllBackgroundProcesses() {
313
+ const manager = getBackgroundProcessManager();
314
+ return await manager.killAll();
315
+ }
316
+
317
+ export { BackgroundProcessManager };