@goondan/cli 0.0.3-alpha1

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 (124) hide show
  1. package/dist/bin.d.ts +2 -0
  2. package/dist/bin.js +148 -0
  3. package/dist/bin.js.map +1 -0
  4. package/dist/commands/context.d.ts +8 -0
  5. package/dist/commands/context.js +2 -0
  6. package/dist/commands/context.js.map +1 -0
  7. package/dist/commands/doctor.d.ts +12 -0
  8. package/dist/commands/doctor.js +7 -0
  9. package/dist/commands/doctor.js.map +1 -0
  10. package/dist/commands/init.d.ts +12 -0
  11. package/dist/commands/init.js +29 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/commands/instance-interactive.d.ts +19 -0
  14. package/dist/commands/instance-interactive.js +259 -0
  15. package/dist/commands/instance-interactive.js.map +1 -0
  16. package/dist/commands/instance.d.ts +30 -0
  17. package/dist/commands/instance.js +36 -0
  18. package/dist/commands/instance.js.map +1 -0
  19. package/dist/commands/logs.d.ts +12 -0
  20. package/dist/commands/logs.js +23 -0
  21. package/dist/commands/logs.js.map +1 -0
  22. package/dist/commands/package.d.ts +30 -0
  23. package/dist/commands/package.js +51 -0
  24. package/dist/commands/package.js.map +1 -0
  25. package/dist/commands/restart.d.ts +12 -0
  26. package/dist/commands/restart.js +14 -0
  27. package/dist/commands/restart.js.map +1 -0
  28. package/dist/commands/run.d.ts +12 -0
  29. package/dist/commands/run.js +33 -0
  30. package/dist/commands/run.js.map +1 -0
  31. package/dist/commands/validate.d.ts +12 -0
  32. package/dist/commands/validate.js +22 -0
  33. package/dist/commands/validate.js.map +1 -0
  34. package/dist/constants.d.ts +2 -0
  35. package/dist/constants.js +3 -0
  36. package/dist/constants.js.map +1 -0
  37. package/dist/errors.d.ts +22 -0
  38. package/dist/errors.js +93 -0
  39. package/dist/errors.js.map +1 -0
  40. package/dist/formatter.d.ts +7 -0
  41. package/dist/formatter.js +141 -0
  42. package/dist/formatter.js.map +1 -0
  43. package/dist/help.d.ts +1 -0
  44. package/dist/help.js +25 -0
  45. package/dist/help.js.map +1 -0
  46. package/dist/index.d.ts +6 -0
  47. package/dist/index.js +9 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/options.d.ts +13 -0
  50. package/dist/options.js +57 -0
  51. package/dist/options.js.map +1 -0
  52. package/dist/parser.d.ts +85 -0
  53. package/dist/parser.js +123 -0
  54. package/dist/parser.js.map +1 -0
  55. package/dist/router.d.ts +2 -0
  56. package/dist/router.js +130 -0
  57. package/dist/router.js.map +1 -0
  58. package/dist/services/config.d.ts +13 -0
  59. package/dist/services/config.js +141 -0
  60. package/dist/services/config.js.map +1 -0
  61. package/dist/services/conversation-state.d.ts +20 -0
  62. package/dist/services/conversation-state.js +198 -0
  63. package/dist/services/conversation-state.js.map +1 -0
  64. package/dist/services/defaults.d.ts +2 -0
  65. package/dist/services/defaults.js +92 -0
  66. package/dist/services/defaults.js.map +1 -0
  67. package/dist/services/doctor.d.ts +8 -0
  68. package/dist/services/doctor.js +160 -0
  69. package/dist/services/doctor.js.map +1 -0
  70. package/dist/services/env.d.ts +6 -0
  71. package/dist/services/env.js +76 -0
  72. package/dist/services/env.js.map +1 -0
  73. package/dist/services/init.d.ts +4 -0
  74. package/dist/services/init.js +174 -0
  75. package/dist/services/init.js.map +1 -0
  76. package/dist/services/instances.d.ts +7 -0
  77. package/dist/services/instances.js +393 -0
  78. package/dist/services/instances.js.map +1 -0
  79. package/dist/services/logs.d.ts +6 -0
  80. package/dist/services/logs.js +131 -0
  81. package/dist/services/logs.js.map +1 -0
  82. package/dist/services/package.d.ts +11 -0
  83. package/dist/services/package.js +630 -0
  84. package/dist/services/package.js.map +1 -0
  85. package/dist/services/path.d.ts +5 -0
  86. package/dist/services/path.js +25 -0
  87. package/dist/services/path.js.map +1 -0
  88. package/dist/services/registry.d.ts +12 -0
  89. package/dist/services/registry.js +219 -0
  90. package/dist/services/registry.js.map +1 -0
  91. package/dist/services/runtime-restart-signal.d.ts +5 -0
  92. package/dist/services/runtime-restart-signal.js +18 -0
  93. package/dist/services/runtime-restart-signal.js.map +1 -0
  94. package/dist/services/runtime-restart.d.ts +11 -0
  95. package/dist/services/runtime-restart.js +151 -0
  96. package/dist/services/runtime-restart.js.map +1 -0
  97. package/dist/services/runtime-routing.d.ts +40 -0
  98. package/dist/services/runtime-routing.js +154 -0
  99. package/dist/services/runtime-routing.js.map +1 -0
  100. package/dist/services/runtime-runner-connector-child.d.ts +1 -0
  101. package/dist/services/runtime-runner-connector-child.js +188 -0
  102. package/dist/services/runtime-runner-connector-child.js.map +1 -0
  103. package/dist/services/runtime-runner-protocol.d.ts +12 -0
  104. package/dist/services/runtime-runner-protocol.js +14 -0
  105. package/dist/services/runtime-runner-protocol.js.map +1 -0
  106. package/dist/services/runtime-runner.d.ts +1 -0
  107. package/dist/services/runtime-runner.js +2595 -0
  108. package/dist/services/runtime-runner.js.map +1 -0
  109. package/dist/services/runtime.d.ts +10 -0
  110. package/dist/services/runtime.js +569 -0
  111. package/dist/services/runtime.js.map +1 -0
  112. package/dist/services/turn-policy.d.ts +7 -0
  113. package/dist/services/turn-policy.js +13 -0
  114. package/dist/services/turn-policy.js.map +1 -0
  115. package/dist/services/validator.d.ts +6 -0
  116. package/dist/services/validator.js +126 -0
  117. package/dist/services/validator.js.map +1 -0
  118. package/dist/types.d.ts +243 -0
  119. package/dist/types.js +2 -0
  120. package/dist/types.js.map +1 -0
  121. package/dist/utils.d.ts +7 -0
  122. package/dist/utils.js +72 -0
  123. package/dist/utils.js.map +1 -0
  124. package/package.json +30 -0
@@ -0,0 +1,569 @@
1
+ import path from 'node:path';
2
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
3
+ import { closeSync, existsSync, openSync } from 'node:fs';
4
+ import { fork } from 'node:child_process';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { parseYamlDocuments, WorkspacePaths } from '@goondan/runtime';
7
+ import { configError } from '../errors.js';
8
+ import { loadRuntimeEnv } from './env.js';
9
+ import { exists, isObjectRecord } from '../utils.js';
10
+ import { resolveStateRoot } from './config.js';
11
+ import { resolveManifestPath } from './path.js';
12
+ function isRunnerReadyMessage(message) {
13
+ if (!isObjectRecord(message)) {
14
+ return false;
15
+ }
16
+ return message.type === 'ready' && typeof message.instanceKey === 'string' && typeof message.pid === 'number';
17
+ }
18
+ function isRunnerStartErrorMessage(message) {
19
+ if (!isObjectRecord(message)) {
20
+ return false;
21
+ }
22
+ return message.type === 'start_error' && typeof message.message === 'string';
23
+ }
24
+ function parseRuntimeState(raw) {
25
+ try {
26
+ const parsed = JSON.parse(raw);
27
+ if (!isObjectRecord(parsed)) {
28
+ return undefined;
29
+ }
30
+ const instanceKey = parsed['instanceKey'];
31
+ const bundlePath = parsed['bundlePath'];
32
+ const startedAt = parsed['startedAt'];
33
+ const watch = parsed['watch'];
34
+ const swarmValue = parsed['swarm'];
35
+ const swarm = typeof swarmValue === 'string' && swarmValue.length > 0 ? swarmValue : undefined;
36
+ const pid = parsed['pid'];
37
+ const logs = parseProcessLogs(parsed['logs']);
38
+ const normalizedPid = typeof pid === 'number' && Number.isInteger(pid) && pid > 0 ? pid : undefined;
39
+ if (typeof instanceKey === 'string' &&
40
+ typeof bundlePath === 'string' &&
41
+ typeof startedAt === 'string' &&
42
+ typeof watch === 'boolean') {
43
+ return {
44
+ instanceKey,
45
+ bundlePath,
46
+ startedAt,
47
+ watch,
48
+ swarm,
49
+ pid: normalizedPid,
50
+ logs,
51
+ };
52
+ }
53
+ return undefined;
54
+ }
55
+ catch {
56
+ return undefined;
57
+ }
58
+ }
59
+ function parseProcessLogs(value) {
60
+ if (!Array.isArray(value)) {
61
+ return undefined;
62
+ }
63
+ const logs = [];
64
+ for (const item of value) {
65
+ if (!isObjectRecord(item)) {
66
+ continue;
67
+ }
68
+ const processName = item['process'];
69
+ const stdout = item['stdout'];
70
+ const stderr = item['stderr'];
71
+ if (typeof processName !== 'string' || typeof stdout !== 'string' || typeof stderr !== 'string') {
72
+ continue;
73
+ }
74
+ if (processName.length === 0 || stdout.length === 0 || stderr.length === 0) {
75
+ continue;
76
+ }
77
+ logs.push({
78
+ process: processName,
79
+ stdout,
80
+ stderr,
81
+ });
82
+ }
83
+ return logs.length > 0 ? logs : undefined;
84
+ }
85
+ const STARTUP_TIMEOUT_MS = 5000;
86
+ const ORCHESTRATOR_PROCESS_NAME = 'orchestrator';
87
+ function runtimeRunnerPath() {
88
+ const sourceDir = path.dirname(fileURLToPath(import.meta.url));
89
+ const candidateRoots = [
90
+ path.resolve(sourceDir, '..', '..', 'node_modules', '@goondan', 'runtime'),
91
+ path.resolve(sourceDir, '..', '..', '..', 'node_modules', '@goondan', 'runtime'),
92
+ ];
93
+ let runtimePackageRoot;
94
+ for (const candidate of candidateRoots) {
95
+ if (existsSync(candidate)) {
96
+ runtimePackageRoot = candidate;
97
+ break;
98
+ }
99
+ }
100
+ if (!runtimePackageRoot) {
101
+ throw new Error(`@goondan/runtime 패키지 경로를 찾을 수 없습니다. candidates=${candidateRoots.join(',')}`);
102
+ }
103
+ const distRunnerPath = path.join(runtimePackageRoot, 'dist', 'runner', 'runtime-runner.js');
104
+ if (existsSync(distRunnerPath)) {
105
+ return distRunnerPath;
106
+ }
107
+ const sourceRunnerPath = path.join(runtimePackageRoot, 'src', 'runner', 'runtime-runner.ts');
108
+ if (existsSync(sourceRunnerPath)) {
109
+ return sourceRunnerPath;
110
+ }
111
+ throw new Error(`@goondan/runtime runner 경로를 찾을 수 없습니다: ${runtimePackageRoot}`);
112
+ }
113
+ function resolveProcessLogPaths(stateRoot, instanceKey, processName) {
114
+ const logDir = path.join(stateRoot, 'runtime', 'logs', instanceKey);
115
+ return {
116
+ stdoutPath: path.join(logDir, `${processName}.stdout.log`),
117
+ stderrPath: path.join(logDir, `${processName}.stderr.log`),
118
+ };
119
+ }
120
+ function isProcessAlive(pid) {
121
+ if (!pid || pid <= 0) {
122
+ return false;
123
+ }
124
+ try {
125
+ process.kill(pid, 0);
126
+ return true;
127
+ }
128
+ catch {
129
+ return false;
130
+ }
131
+ }
132
+ async function sleep(ms) {
133
+ await new Promise((resolve) => setTimeout(resolve, ms));
134
+ }
135
+ async function terminatePreviousProcess(previousPid, replacementPid) {
136
+ if (!previousPid || previousPid <= 0) {
137
+ return;
138
+ }
139
+ if (replacementPid && previousPid === replacementPid) {
140
+ return;
141
+ }
142
+ if (!isProcessAlive(previousPid)) {
143
+ return;
144
+ }
145
+ try {
146
+ process.kill(previousPid, 'SIGTERM');
147
+ }
148
+ catch {
149
+ return;
150
+ }
151
+ for (let attempt = 0; attempt < 20; attempt += 1) {
152
+ await sleep(50);
153
+ if (!isProcessAlive(previousPid)) {
154
+ return;
155
+ }
156
+ }
157
+ try {
158
+ process.kill(previousPid, 'SIGKILL');
159
+ }
160
+ catch {
161
+ // 이미 종료된 경우 무시한다.
162
+ }
163
+ }
164
+ async function readPackageNameFromManifest(manifestPath) {
165
+ try {
166
+ const raw = await readFile(manifestPath, 'utf8');
167
+ const docs = parseYamlDocuments(raw);
168
+ for (const doc of docs) {
169
+ if (!isObjectRecord(doc)) {
170
+ continue;
171
+ }
172
+ if (doc['kind'] !== 'Package') {
173
+ continue;
174
+ }
175
+ const metadata = doc['metadata'];
176
+ if (!isObjectRecord(metadata)) {
177
+ continue;
178
+ }
179
+ const name = metadata['name'];
180
+ if (typeof name === 'string' && name.trim().length > 0) {
181
+ return name.trim();
182
+ }
183
+ }
184
+ return undefined;
185
+ }
186
+ catch {
187
+ return undefined;
188
+ }
189
+ }
190
+ async function resolveDefaultInstanceKey(manifestPath, stateRoot) {
191
+ const packageName = await readPackageNameFromManifest(manifestPath);
192
+ const projectRoot = path.dirname(manifestPath);
193
+ const workspace = new WorkspacePaths({
194
+ stateRoot,
195
+ projectRoot,
196
+ packageName,
197
+ });
198
+ return workspace.workspaceId;
199
+ }
200
+ function buildRunnerArgs(input) {
201
+ const args = [
202
+ '--bundle-path',
203
+ input.manifestPath,
204
+ '--instance-key',
205
+ input.instanceKey,
206
+ '--state-root',
207
+ input.stateRoot,
208
+ ];
209
+ if (input.swarm && input.swarm.length > 0) {
210
+ args.push('--swarm', input.swarm);
211
+ }
212
+ if (input.watch) {
213
+ args.push('--watch');
214
+ }
215
+ return args;
216
+ }
217
+ function killIfRunning(pid) {
218
+ if (!pid || pid <= 0) {
219
+ return;
220
+ }
221
+ try {
222
+ process.kill(pid, 'SIGKILL');
223
+ }
224
+ catch {
225
+ // 프로세스가 이미 내려간 경우 무시한다.
226
+ }
227
+ }
228
+ function closeFd(fd) {
229
+ try {
230
+ closeSync(fd);
231
+ }
232
+ catch {
233
+ // 이미 닫힌 경우 무시한다.
234
+ }
235
+ }
236
+ function normalizeExitCode(code, signal) {
237
+ if (signal === 'SIGINT') {
238
+ return 130;
239
+ }
240
+ if (code === 0 || code === 1 || code === 2 || code === 3 || code === 4 || code === 5 || code === 6 || code === 130) {
241
+ return code;
242
+ }
243
+ return 1;
244
+ }
245
+ export class LocalRuntimeController {
246
+ cwd;
247
+ env;
248
+ constructor(cwd, env) {
249
+ this.cwd = cwd;
250
+ this.env = env;
251
+ }
252
+ async startOrchestrator(request) {
253
+ const manifestPath = resolveManifestPath(this.cwd, request.bundlePath);
254
+ const hasManifest = await exists(manifestPath);
255
+ if (!hasManifest) {
256
+ throw configError(`Bundle 파일을 찾을 수 없습니다: ${manifestPath}`, '올바른 bundle 경로를 지정하세요.');
257
+ }
258
+ const runtimeEnv = await loadRuntimeEnv(this.env, {
259
+ projectRoot: path.dirname(manifestPath),
260
+ envFile: request.envFile,
261
+ });
262
+ const stateRoot = resolveStateRoot(request.stateRoot, runtimeEnv);
263
+ const runtimeDir = path.join(stateRoot, 'runtime');
264
+ await mkdir(runtimeDir, { recursive: true });
265
+ const foreground = request.foreground ?? false;
266
+ const instanceKey = request.instanceKey ?? (await resolveDefaultInstanceKey(manifestPath, stateRoot));
267
+ const activePath = path.join(runtimeDir, 'active.json');
268
+ if (await exists(activePath)) {
269
+ const rawActive = await readFile(activePath, 'utf8');
270
+ const active = parseRuntimeState(rawActive);
271
+ if (active && active.instanceKey === instanceKey && isProcessAlive(active.pid)) {
272
+ if (foreground) {
273
+ throw configError(`이미 실행 중인 Orchestrator 인스턴스가 있습니다: ${instanceKey}`, 'foreground 모드는 기존 실행 중인 인스턴스에 attach할 수 없습니다. 기존 프로세스를 종료하거나 --instance-key를 변경하세요.');
274
+ }
275
+ return {
276
+ instanceKey,
277
+ pid: active.pid,
278
+ };
279
+ }
280
+ }
281
+ const runner = foreground
282
+ ? await this.startForegroundRunner({
283
+ manifestPath,
284
+ stateRoot,
285
+ env: runtimeEnv,
286
+ instanceKey,
287
+ swarm: request.swarm,
288
+ watch: request.watch,
289
+ })
290
+ : await this.startDetachedRunner({
291
+ manifestPath,
292
+ stateRoot,
293
+ env: runtimeEnv,
294
+ instanceKey,
295
+ swarm: request.swarm,
296
+ watch: request.watch,
297
+ });
298
+ const state = {
299
+ instanceKey,
300
+ bundlePath: manifestPath,
301
+ startedAt: new Date().toISOString(),
302
+ watch: request.watch,
303
+ swarm: request.swarm,
304
+ pid: runner.pid,
305
+ logs: [
306
+ {
307
+ process: runner.process,
308
+ stdout: runner.stdoutLogPath,
309
+ stderr: runner.stderrLogPath,
310
+ },
311
+ ],
312
+ };
313
+ await writeFile(activePath, JSON.stringify(state, null, 2), 'utf8');
314
+ return {
315
+ instanceKey,
316
+ pid: runner.pid,
317
+ completion: runner.completion,
318
+ };
319
+ }
320
+ async restart(request) {
321
+ const stateRoot = resolveStateRoot(request.stateRoot, this.env);
322
+ const activePath = path.join(stateRoot, 'runtime', 'active.json');
323
+ const hasActive = await exists(activePath);
324
+ if (!hasActive) {
325
+ throw configError('실행 중인 Orchestrator를 찾지 못했습니다.', '먼저 gdn run으로 Orchestrator를 시작하세요.');
326
+ }
327
+ const raw = await readFile(activePath, 'utf8');
328
+ const state = parseRuntimeState(raw);
329
+ if (!state) {
330
+ throw configError('런타임 상태 파일이 손상되었습니다.', 'state-root/runtime/active.json을 정리한 뒤 다시 실행하세요.');
331
+ }
332
+ if (request.instanceKey && request.instanceKey !== state.instanceKey) {
333
+ throw configError(`활성 오케스트레이터 인스턴스와 일치하지 않습니다: ${request.instanceKey}`, `현재 활성 인스턴스(${state.instanceKey})를 확인하고 다시 시도하세요.`);
334
+ }
335
+ const manifestPath = state.bundlePath;
336
+ const runtimeEnv = await loadRuntimeEnv(this.env, {
337
+ projectRoot: path.dirname(manifestPath),
338
+ });
339
+ await terminatePreviousProcess(state.pid);
340
+ const runner = await this.startDetachedRunner({
341
+ manifestPath,
342
+ stateRoot,
343
+ env: runtimeEnv,
344
+ instanceKey: state.instanceKey,
345
+ swarm: state.swarm,
346
+ watch: state.watch,
347
+ });
348
+ const refreshedState = {
349
+ instanceKey: state.instanceKey,
350
+ bundlePath: state.bundlePath,
351
+ startedAt: new Date().toISOString(),
352
+ watch: state.watch,
353
+ swarm: state.swarm,
354
+ pid: runner.pid,
355
+ logs: [
356
+ {
357
+ process: runner.process,
358
+ stdout: runner.stdoutLogPath,
359
+ stderr: runner.stderrLogPath,
360
+ },
361
+ ],
362
+ };
363
+ await writeFile(activePath, JSON.stringify(refreshedState, null, 2), 'utf8');
364
+ const restarted = request.instanceKey
365
+ ? [request.instanceKey]
366
+ : request.agent
367
+ ? [request.agent]
368
+ : [state.instanceKey];
369
+ return {
370
+ restarted,
371
+ instanceKey: state.instanceKey,
372
+ pid: runner.pid,
373
+ };
374
+ }
375
+ async startDetachedRunner(input) {
376
+ const logPaths = resolveProcessLogPaths(input.stateRoot, input.instanceKey, ORCHESTRATOR_PROCESS_NAME);
377
+ await mkdir(path.dirname(logPaths.stdoutPath), { recursive: true });
378
+ const stdoutFd = openSync(logPaths.stdoutPath, 'a');
379
+ const stderrFd = openSync(logPaths.stderrPath, 'a');
380
+ const runnerModulePath = runtimeRunnerPath();
381
+ const args = buildRunnerArgs(input);
382
+ let child;
383
+ try {
384
+ child = fork(runnerModulePath, args, {
385
+ cwd: path.dirname(input.manifestPath),
386
+ detached: true,
387
+ env: {
388
+ ...input.env,
389
+ GOONDAN_STATE_ROOT: input.stateRoot,
390
+ },
391
+ stdio: ['ignore', stdoutFd, stderrFd, 'ipc'],
392
+ });
393
+ }
394
+ finally {
395
+ closeFd(stdoutFd);
396
+ closeFd(stderrFd);
397
+ }
398
+ if (!child.pid || child.pid <= 0) {
399
+ throw configError('Orchestrator 프로세스를 시작하지 못했습니다.', 'Node 실행 환경과 권한을 확인하세요.');
400
+ }
401
+ const startup = await new Promise((resolve, reject) => {
402
+ let settled = false;
403
+ const timeout = setTimeout(() => {
404
+ if (settled) {
405
+ return;
406
+ }
407
+ settled = true;
408
+ killIfRunning(child.pid);
409
+ cleanup();
410
+ reject(configError('Orchestrator 시작 확인이 시간 내에 완료되지 않았습니다.', `설정/환경 변수를 확인하고 다시 실행하세요. (logs: ${logPaths.stdoutPath}, ${logPaths.stderrPath})`));
411
+ }, STARTUP_TIMEOUT_MS);
412
+ const fail = (message) => {
413
+ if (settled) {
414
+ return;
415
+ }
416
+ settled = true;
417
+ cleanup();
418
+ reject(configError(message, `gdn validate로 설정을 점검하고, 필요한 환경 변수를 설정한 뒤 다시 실행하세요. (logs: ${logPaths.stdoutPath}, ${logPaths.stderrPath})`));
419
+ };
420
+ const succeed = (pid) => {
421
+ if (settled) {
422
+ return;
423
+ }
424
+ settled = true;
425
+ cleanup();
426
+ resolve({
427
+ pid,
428
+ process: ORCHESTRATOR_PROCESS_NAME,
429
+ stdoutLogPath: logPaths.stdoutPath,
430
+ stderrLogPath: logPaths.stderrPath,
431
+ });
432
+ };
433
+ const onMessage = (message) => {
434
+ if (isRunnerReadyMessage(message)) {
435
+ if (message.instanceKey !== input.instanceKey) {
436
+ fail(`Orchestrator instanceKey 불일치: expected=${input.instanceKey}, actual=${message.instanceKey}`);
437
+ return;
438
+ }
439
+ succeed(message.pid);
440
+ return;
441
+ }
442
+ if (isRunnerStartErrorMessage(message)) {
443
+ fail(`Orchestrator 시작 실패: ${message.message}`);
444
+ }
445
+ };
446
+ const onError = (error) => {
447
+ fail(`Orchestrator 프로세스 오류: ${error.message}`);
448
+ };
449
+ const onExit = (code, signal) => {
450
+ const cause = code !== null ? `exit code ${code}` : signal ? `signal ${signal}` : 'unknown reason';
451
+ fail(`Orchestrator가 초기화 중 종료되었습니다 (${cause}).`);
452
+ };
453
+ const cleanup = () => {
454
+ clearTimeout(timeout);
455
+ child.off('message', onMessage);
456
+ child.off('error', onError);
457
+ child.off('exit', onExit);
458
+ };
459
+ child.on('message', onMessage);
460
+ child.on('error', onError);
461
+ child.on('exit', onExit);
462
+ }).catch((error) => {
463
+ if (child.pid) {
464
+ killIfRunning(child.pid);
465
+ }
466
+ throw error;
467
+ });
468
+ if (child.connected) {
469
+ child.disconnect();
470
+ }
471
+ child.unref();
472
+ return startup;
473
+ }
474
+ async startForegroundRunner(input) {
475
+ const logPaths = resolveProcessLogPaths(input.stateRoot, input.instanceKey, ORCHESTRATOR_PROCESS_NAME);
476
+ const runnerModulePath = runtimeRunnerPath();
477
+ const args = buildRunnerArgs(input);
478
+ const child = fork(runnerModulePath, args, {
479
+ cwd: path.dirname(input.manifestPath),
480
+ detached: false,
481
+ env: {
482
+ ...input.env,
483
+ GOONDAN_STATE_ROOT: input.stateRoot,
484
+ },
485
+ stdio: ['inherit', 'inherit', 'inherit', 'ipc'],
486
+ });
487
+ if (!child.pid || child.pid <= 0) {
488
+ throw configError('Orchestrator 프로세스를 시작하지 못했습니다.', 'Node 실행 환경과 권한을 확인하세요.');
489
+ }
490
+ const completion = new Promise((resolve) => {
491
+ child.once('exit', (code, signal) => {
492
+ resolve(normalizeExitCode(code, signal));
493
+ });
494
+ });
495
+ const startup = await new Promise((resolve, reject) => {
496
+ let settled = false;
497
+ const timeout = setTimeout(() => {
498
+ if (settled) {
499
+ return;
500
+ }
501
+ settled = true;
502
+ killIfRunning(child.pid);
503
+ cleanup();
504
+ reject(configError('Orchestrator 시작 확인이 시간 내에 완료되지 않았습니다.', '설정/환경 변수를 확인한 뒤 다시 실행하세요.'));
505
+ }, STARTUP_TIMEOUT_MS);
506
+ const fail = (message) => {
507
+ if (settled) {
508
+ return;
509
+ }
510
+ settled = true;
511
+ cleanup();
512
+ reject(configError(message, 'gdn validate로 설정을 점검하고, 필요한 환경 변수를 설정한 뒤 다시 실행하세요.'));
513
+ };
514
+ const succeed = (pid) => {
515
+ if (settled) {
516
+ return;
517
+ }
518
+ settled = true;
519
+ cleanup();
520
+ resolve({
521
+ pid,
522
+ process: ORCHESTRATOR_PROCESS_NAME,
523
+ stdoutLogPath: logPaths.stdoutPath,
524
+ stderrLogPath: logPaths.stderrPath,
525
+ completion,
526
+ });
527
+ };
528
+ const onMessage = (message) => {
529
+ if (isRunnerReadyMessage(message)) {
530
+ if (message.instanceKey !== input.instanceKey) {
531
+ fail(`Orchestrator instanceKey 불일치: expected=${input.instanceKey}, actual=${message.instanceKey}`);
532
+ return;
533
+ }
534
+ succeed(message.pid);
535
+ return;
536
+ }
537
+ if (isRunnerStartErrorMessage(message)) {
538
+ fail(`Orchestrator 시작 실패: ${message.message}`);
539
+ }
540
+ };
541
+ const onError = (error) => {
542
+ fail(`Orchestrator 프로세스 오류: ${error.message}`);
543
+ };
544
+ const onExit = (code, signal) => {
545
+ const cause = code !== null ? `exit code ${code}` : signal ? `signal ${signal}` : 'unknown reason';
546
+ fail(`Orchestrator가 초기화 중 종료되었습니다 (${cause}).`);
547
+ };
548
+ const cleanup = () => {
549
+ clearTimeout(timeout);
550
+ child.off('message', onMessage);
551
+ child.off('error', onError);
552
+ child.off('exit', onExit);
553
+ };
554
+ child.on('message', onMessage);
555
+ child.on('error', onError);
556
+ child.on('exit', onExit);
557
+ }).catch((error) => {
558
+ if (child.pid) {
559
+ killIfRunning(child.pid);
560
+ }
561
+ throw error;
562
+ });
563
+ if (child.connected) {
564
+ child.disconnect();
565
+ }
566
+ return startup;
567
+ }
568
+ }
569
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/services/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAS1C,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AA6BhD,SAAS,oBAAoB,CAAC,OAAgB;IAC5C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC;AAChH,CAAC;AAED,SAAS,yBAAyB,CAAC,OAAgB;IACjD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC;AAC/E,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/F,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,MAAM,aAAa,GAAG,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;QAEpG,IACE,OAAO,WAAW,KAAK,QAAQ;YAC/B,OAAO,UAAU,KAAK,QAAQ;YAC9B,OAAO,SAAS,KAAK,QAAQ;YAC7B,OAAO,KAAK,KAAK,SAAS,EAC1B,CAAC;YACD,OAAO;gBACL,WAAW;gBACX,UAAU;gBACV,SAAS;gBACT,KAAK;gBACL,KAAK;gBACL,GAAG,EAAE,aAAa;gBAClB,IAAI;aACL,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAqB,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAChG,SAAS;QACX,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3E,SAAS;QACX,CAAC;QAED,IAAI,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,WAAW;YACpB,MAAM;YACN,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5C,CAAC;AAmBD,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,yBAAyB,GAAG,cAAc,CAAC;AAEjD,SAAS,iBAAiB;IACxB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAG;QACrB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,CAAC;QAC1E,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,CAAC;KACjF,CAAC;IAEF,IAAI,kBAAsC,CAAC;IAC3C,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;QACvC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,kBAAkB,GAAG,SAAS,CAAC;YAC/B,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,kDAAkD,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAC5F,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/B,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAC7F,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,0CAA0C,kBAAkB,EAAE,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,sBAAsB,CAAC,SAAiB,EAAE,WAAmB,EAAE,WAAmB;IACzF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACpE,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,WAAW,aAAa,CAAC;QAC1D,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,WAAW,aAAa,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,GAAuB;IAC7C,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,EAAU;IAC7B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,WAA+B,EAAE,cAAuB;IAC9F,IAAI,CAAC,WAAW,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACrC,OAAO;IACT,CAAC;IAED,IAAI,cAAc,IAAI,WAAW,KAAK,cAAc,EAAE,CAAC;QACrD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;QACjC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,EAAE,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QACjD,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,kBAAkB;IACpB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,2BAA2B,CAAC,YAAoB;IAC7D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACrC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,SAAS;YACX,CAAC;YAED,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC9B,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;YACjC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9B,SAAS;YACX,CAAC;YAED,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC9B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,YAAoB,EACpB,SAAiB;IAEjB,MAAM,WAAW,GAAG,MAAM,2BAA2B,CAAC,YAAY,CAAC,CAAC;IACpE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC;QACnC,SAAS;QACT,WAAW;QACX,WAAW;KACZ,CAAC,CAAC;IACH,OAAO,SAAS,CAAC,WAAW,CAAC;AAC/B,CAAC;AAED,SAAS,eAAe,CAAC,KAAuB;IAC9C,MAAM,IAAI,GAAG;QACX,eAAe;QACf,KAAK,CAAC,YAAY;QAClB,gBAAgB;QAChB,KAAK,CAAC,WAAW;QACjB,cAAc;QACd,KAAK,CAAC,SAAS;KAChB,CAAC;IAEF,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,GAAuB;IAC5C,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB;IAC1B,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,EAAU;IACzB,IAAI,CAAC;QACH,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAmB,EAAE,MAA6B;IAC3E,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QACnH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,OAAO,sBAAsB;IAChB,GAAG,CAAS;IAEZ,GAAG,CAAoB;IAExC,YAAY,GAAW,EAAE,GAAsB;QAC7C,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,OAA4B;QAClD,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QAC/C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,WAAW,CAAC,yBAAyB,YAAY,EAAE,EAAE,uBAAuB,CAAC,CAAC;QACtF,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE;YAChD,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;YACvC,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACnD,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC;QAE/C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,MAAM,yBAAyB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;QACtG,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QACxD,IAAI,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC5C,IAAI,MAAM,IAAI,MAAM,CAAC,WAAW,KAAK,WAAW,IAAI,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/E,IAAI,UAAU,EAAE,CAAC;oBACf,MAAM,WAAW,CACf,qCAAqC,WAAW,EAAE,EAClD,qFAAqF,CACtF,CAAC;gBACJ,CAAC;gBACD,OAAO;oBACL,WAAW;oBACX,GAAG,EAAE,MAAM,CAAC,GAAG;iBAChB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,UAAU;YACvB,CAAC,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC;gBAC/B,YAAY;gBACZ,SAAS;gBACT,GAAG,EAAE,UAAU;gBACf,WAAW;gBACX,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC;YACJ,CAAC,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC;gBAC7B,YAAY;gBACZ,SAAS;gBACT,GAAG,EAAE,UAAU;gBACf,WAAW;gBACX,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC,CAAC;QACP,MAAM,KAAK,GAAqB;YAC9B,WAAW;YACX,UAAU,EAAE,YAAY;YACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,IAAI,EAAE;gBACJ;oBACE,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,MAAM,EAAE,MAAM,CAAC,aAAa;oBAC5B,MAAM,EAAE,MAAM,CAAC,aAAa;iBAC7B;aACF;SACF,CAAC;QAEF,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAEpE,OAAO;YACL,WAAW;YACX,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAA8B;QAC1C,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;QAClE,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,WAAW,CAAC,+BAA+B,EAAE,mCAAmC,CAAC,CAAC;QAC1F,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAErC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,WAAW,CAAC,qBAAqB,EAAE,iDAAiD,CAAC,CAAC;QAC9F,CAAC;QAED,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;YACrE,MAAM,WAAW,CACf,+BAA+B,OAAO,CAAC,WAAW,EAAE,EACpD,cAAc,KAAK,CAAC,WAAW,mBAAmB,CACnD,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAC;QACtC,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE;YAChD,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;SACxC,CAAC,CAAC;QAEH,MAAM,wBAAwB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC;YAC5C,YAAY;YACZ,SAAS;YACT,GAAG,EAAE,UAAU;YACf,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAC;QAEH,MAAM,cAAc,GAAqB;YACvC,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,IAAI,EAAE;gBACJ;oBACE,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,MAAM,EAAE,MAAM,CAAC,aAAa;oBAC5B,MAAM,EAAE,MAAM,CAAC,aAAa;iBAC7B;aACF;SACF,CAAC;QAEF,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAE7E,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW;YACnC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;YACvB,CAAC,CAAC,OAAO,CAAC,KAAK;gBACb,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;gBACjB,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAE1B,OAAO;YACL,SAAS;YACT,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,GAAG,EAAE,MAAM,CAAC,GAAG;SAChB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,KAAuB;QACvD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC;QACvG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAEpD,MAAM,gBAAgB,GAAG,iBAAiB,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,KAAmB,CAAC;QACxB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE;gBACnC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;gBACrC,QAAQ,EAAE,IAAI;gBACd,GAAG,EAAE;oBACH,GAAG,KAAK,CAAC,GAAG;oBACZ,kBAAkB,EAAE,KAAK,CAAC,SAAS;iBACpC;gBACD,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC;aAC7C,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClB,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;YACjC,MAAM,WAAW,CAAC,gCAAgC,EAAE,wBAAwB,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,OAAO,CAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACvE,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO;gBACT,CAAC;gBACD,OAAO,GAAG,IAAI,CAAC;gBACf,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACzB,OAAO,EAAE,CAAC;gBACV,MAAM,CACJ,WAAW,CACT,uCAAuC,EACvC,mCAAmC,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,GAAG,CAClF,CACF,CAAC;YACJ,CAAC,EAAE,kBAAkB,CAAC,CAAC;YAEvB,MAAM,IAAI,GAAG,CAAC,OAAe,EAAQ,EAAE;gBACrC,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO;gBACT,CAAC;gBACD,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,MAAM,CACJ,WAAW,CACT,OAAO,EACP,6DAA6D,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,GAAG,CAC5G,CACF,CAAC;YACJ,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,CAAC,GAAW,EAAQ,EAAE;gBACpC,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO;gBACT,CAAC;gBACD,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC;oBACN,GAAG;oBACH,OAAO,EAAE,yBAAyB;oBAClC,aAAa,EAAE,QAAQ,CAAC,UAAU;oBAClC,aAAa,EAAE,QAAQ,CAAC,UAAU;iBACnC,CAAC,CAAC;YACL,CAAC,CAAC;YAEF,MAAM,SAAS,GAAG,CAAC,OAAgB,EAAQ,EAAE;gBAC3C,IAAI,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC;oBAClC,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;wBAC9C,IAAI,CAAC,0CAA0C,KAAK,CAAC,WAAW,YAAY,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;wBACnG,OAAO;oBACT,CAAC;oBACD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBACrB,OAAO;gBACT,CAAC;gBAED,IAAI,yBAAyB,CAAC,OAAO,CAAC,EAAE,CAAC;oBACvC,IAAI,CAAC,uBAAuB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,CAAC,KAAY,EAAQ,EAAE;gBACrC,IAAI,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACjD,CAAC,CAAC;YAEF,MAAM,MAAM,GAAG,CAAC,IAAmB,EAAE,MAA6B,EAAQ,EAAE;gBAC1E,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;gBACnG,IAAI,CAAC,gCAAgC,KAAK,IAAI,CAAC,CAAC;YAClD,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,GAAS,EAAE;gBACzB,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBAChC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC5B,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC5B,CAAC,CAAC;YAEF,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAC/B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC3B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAC1B,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;gBACd,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,CAAC;QACD,KAAK,CAAC,KAAK,EAAE,CAAC;QAEd,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,KAAuB;QACzD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC;QACvG,MAAM,gBAAgB,GAAG,iBAAiB,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE;YACzC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;YACrC,QAAQ,EAAE,KAAK;YACf,GAAG,EAAE;gBACH,GAAG,KAAK,CAAC,GAAG;gBACZ,kBAAkB,EAAE,KAAK,CAAC,SAAS;aACpC;YACD,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC;SAChD,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;YACjC,MAAM,WAAW,CAAC,gCAAgC,EAAE,wBAAwB,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,OAAO,CAAW,CAAC,OAAO,EAAE,EAAE;YACnD,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAmB,EAAE,MAA6B,EAAE,EAAE;gBACxE,OAAO,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,IAAI,OAAO,CAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACvE,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO;gBACT,CAAC;gBACD,OAAO,GAAG,IAAI,CAAC;gBACf,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACzB,OAAO,EAAE,CAAC;gBACV,MAAM,CACJ,WAAW,CACT,uCAAuC,EACvC,2BAA2B,CAC5B,CACF,CAAC;YACJ,CAAC,EAAE,kBAAkB,CAAC,CAAC;YAEvB,MAAM,IAAI,GAAG,CAAC,OAAe,EAAQ,EAAE;gBACrC,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO;gBACT,CAAC;gBACD,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,MAAM,CACJ,WAAW,CACT,OAAO,EACP,oDAAoD,CACrD,CACF,CAAC;YACJ,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,CAAC,GAAW,EAAQ,EAAE;gBACpC,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO;gBACT,CAAC;gBACD,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC;oBACN,GAAG;oBACH,OAAO,EAAE,yBAAyB;oBAClC,aAAa,EAAE,QAAQ,CAAC,UAAU;oBAClC,aAAa,EAAE,QAAQ,CAAC,UAAU;oBAClC,UAAU;iBACX,CAAC,CAAC;YACL,CAAC,CAAC;YAEF,MAAM,SAAS,GAAG,CAAC,OAAgB,EAAQ,EAAE;gBAC3C,IAAI,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC;oBAClC,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;wBAC9C,IAAI,CAAC,0CAA0C,KAAK,CAAC,WAAW,YAAY,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;wBACnG,OAAO;oBACT,CAAC;oBACD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBACrB,OAAO;gBACT,CAAC;gBAED,IAAI,yBAAyB,CAAC,OAAO,CAAC,EAAE,CAAC;oBACvC,IAAI,CAAC,uBAAuB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,CAAC,KAAY,EAAQ,EAAE;gBACrC,IAAI,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACjD,CAAC,CAAC;YAEF,MAAM,MAAM,GAAG,CAAC,IAAmB,EAAE,MAA6B,EAAQ,EAAE;gBAC1E,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;gBACnG,IAAI,CAAC,gCAAgC,KAAK,IAAI,CAAC,CAAC;YAClD,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,GAAS,EAAE;gBACzB,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBAChC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC5B,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC5B,CAAC,CAAC;YAEF,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAC/B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC3B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAC1B,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;gBACd,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ export interface StepLimitResponseInput {
2
+ maxSteps: number;
3
+ requiredToolNames: string[];
4
+ calledToolNames: ReadonlySet<string>;
5
+ lastText: string;
6
+ }
7
+ export declare function buildStepLimitResponse(input: StepLimitResponseInput): string;
@@ -0,0 +1,13 @@
1
+ export function buildStepLimitResponse(input) {
2
+ const trimmedLastText = input.lastText.trim();
3
+ const missingRequiredTools = input.requiredToolNames.filter((name) => !input.calledToolNames.has(name));
4
+ if (missingRequiredTools.length === 0) {
5
+ return trimmedLastText.length > 0 ? trimmedLastText : '최대 step에 도달하여 응답을 마무리했습니다.';
6
+ }
7
+ const summary = `maxStepsPerTurn(${input.maxSteps})에 도달하여 종료했습니다. requiredTools 미충족: ${missingRequiredTools.join(', ')}`;
8
+ if (trimmedLastText.length === 0) {
9
+ return summary;
10
+ }
11
+ return `${trimmedLastText}\n\n${summary}`;
12
+ }
13
+ //# sourceMappingURL=turn-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-policy.js","sourceRoot":"","sources":["../../src/services/turn-policy.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,sBAAsB,CAAC,KAA6B;IAClE,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,oBAAoB,GAAG,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACxG,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,4BAA4B,CAAC;IACrF,CAAC;IAED,MAAM,OAAO,GAAG,mBAAmB,KAAK,CAAC,QAAQ,sCAAsC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACzH,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,GAAG,eAAe,OAAO,OAAO,EAAE,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { BundleValidator, ValidationResult } from '../types.js';
2
+ export declare class DefaultBundleValidator implements BundleValidator {
3
+ private readonly cwd;
4
+ constructor(cwd: string);
5
+ validate(pathOrFile: string, strict: boolean, fix: boolean): Promise<ValidationResult>;
6
+ }