@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.
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +148 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands/context.d.ts +8 -0
- package/dist/commands/context.js +2 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/doctor.d.ts +12 -0
- package/dist/commands/doctor.js +7 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +12 -0
- package/dist/commands/init.js +29 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/instance-interactive.d.ts +19 -0
- package/dist/commands/instance-interactive.js +259 -0
- package/dist/commands/instance-interactive.js.map +1 -0
- package/dist/commands/instance.d.ts +30 -0
- package/dist/commands/instance.js +36 -0
- package/dist/commands/instance.js.map +1 -0
- package/dist/commands/logs.d.ts +12 -0
- package/dist/commands/logs.js +23 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/package.d.ts +30 -0
- package/dist/commands/package.js +51 -0
- package/dist/commands/package.js.map +1 -0
- package/dist/commands/restart.d.ts +12 -0
- package/dist/commands/restart.js +14 -0
- package/dist/commands/restart.js.map +1 -0
- package/dist/commands/run.d.ts +12 -0
- package/dist/commands/run.js +33 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/validate.d.ts +12 -0
- package/dist/commands/validate.js +22 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.js +3 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors.d.ts +22 -0
- package/dist/errors.js +93 -0
- package/dist/errors.js.map +1 -0
- package/dist/formatter.d.ts +7 -0
- package/dist/formatter.js +141 -0
- package/dist/formatter.js.map +1 -0
- package/dist/help.d.ts +1 -0
- package/dist/help.js +25 -0
- package/dist/help.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/options.d.ts +13 -0
- package/dist/options.js +57 -0
- package/dist/options.js.map +1 -0
- package/dist/parser.d.ts +85 -0
- package/dist/parser.js +123 -0
- package/dist/parser.js.map +1 -0
- package/dist/router.d.ts +2 -0
- package/dist/router.js +130 -0
- package/dist/router.js.map +1 -0
- package/dist/services/config.d.ts +13 -0
- package/dist/services/config.js +141 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/conversation-state.d.ts +20 -0
- package/dist/services/conversation-state.js +198 -0
- package/dist/services/conversation-state.js.map +1 -0
- package/dist/services/defaults.d.ts +2 -0
- package/dist/services/defaults.js +92 -0
- package/dist/services/defaults.js.map +1 -0
- package/dist/services/doctor.d.ts +8 -0
- package/dist/services/doctor.js +160 -0
- package/dist/services/doctor.js.map +1 -0
- package/dist/services/env.d.ts +6 -0
- package/dist/services/env.js +76 -0
- package/dist/services/env.js.map +1 -0
- package/dist/services/init.d.ts +4 -0
- package/dist/services/init.js +174 -0
- package/dist/services/init.js.map +1 -0
- package/dist/services/instances.d.ts +7 -0
- package/dist/services/instances.js +393 -0
- package/dist/services/instances.js.map +1 -0
- package/dist/services/logs.d.ts +6 -0
- package/dist/services/logs.js +131 -0
- package/dist/services/logs.js.map +1 -0
- package/dist/services/package.d.ts +11 -0
- package/dist/services/package.js +630 -0
- package/dist/services/package.js.map +1 -0
- package/dist/services/path.d.ts +5 -0
- package/dist/services/path.js +25 -0
- package/dist/services/path.js.map +1 -0
- package/dist/services/registry.d.ts +12 -0
- package/dist/services/registry.js +219 -0
- package/dist/services/registry.js.map +1 -0
- package/dist/services/runtime-restart-signal.d.ts +5 -0
- package/dist/services/runtime-restart-signal.js +18 -0
- package/dist/services/runtime-restart-signal.js.map +1 -0
- package/dist/services/runtime-restart.d.ts +11 -0
- package/dist/services/runtime-restart.js +151 -0
- package/dist/services/runtime-restart.js.map +1 -0
- package/dist/services/runtime-routing.d.ts +40 -0
- package/dist/services/runtime-routing.js +154 -0
- package/dist/services/runtime-routing.js.map +1 -0
- package/dist/services/runtime-runner-connector-child.d.ts +1 -0
- package/dist/services/runtime-runner-connector-child.js +188 -0
- package/dist/services/runtime-runner-connector-child.js.map +1 -0
- package/dist/services/runtime-runner-protocol.d.ts +12 -0
- package/dist/services/runtime-runner-protocol.js +14 -0
- package/dist/services/runtime-runner-protocol.js.map +1 -0
- package/dist/services/runtime-runner.d.ts +1 -0
- package/dist/services/runtime-runner.js +2595 -0
- package/dist/services/runtime-runner.js.map +1 -0
- package/dist/services/runtime.d.ts +10 -0
- package/dist/services/runtime.js +569 -0
- package/dist/services/runtime.js.map +1 -0
- package/dist/services/turn-policy.d.ts +7 -0
- package/dist/services/turn-policy.js +13 -0
- package/dist/services/turn-policy.js.map +1 -0
- package/dist/services/validator.d.ts +6 -0
- package/dist/services/validator.js +126 -0
- package/dist/services/validator.js.map +1 -0
- package/dist/types.d.ts +243 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +7 -0
- package/dist/utils.js +72 -0
- package/dist/utils.js.map +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { mkdir, readdir, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { execFile } from 'node:child_process';
|
|
4
|
+
import { promisify } from 'node:util';
|
|
5
|
+
import { configError } from '../errors.js';
|
|
6
|
+
import { exists } from '../utils.js';
|
|
7
|
+
const execFileAsync = promisify(execFile);
|
|
8
|
+
function quoteYaml(value) {
|
|
9
|
+
return `"${value.replaceAll('"', '\\"')}"`;
|
|
10
|
+
}
|
|
11
|
+
function buildModelYaml() {
|
|
12
|
+
return [
|
|
13
|
+
'apiVersion: goondan.ai/v1',
|
|
14
|
+
'kind: Model',
|
|
15
|
+
'metadata:',
|
|
16
|
+
' name: claude',
|
|
17
|
+
'spec:',
|
|
18
|
+
' provider: anthropic',
|
|
19
|
+
' model: claude-sonnet-4-20250514',
|
|
20
|
+
' apiKey:',
|
|
21
|
+
' valueFrom:',
|
|
22
|
+
' env: ANTHROPIC_API_KEY',
|
|
23
|
+
].join('\n');
|
|
24
|
+
}
|
|
25
|
+
function buildAgentYaml(agentName, modelRef, systemPrompt) {
|
|
26
|
+
return [
|
|
27
|
+
'apiVersion: goondan.ai/v1',
|
|
28
|
+
'kind: Agent',
|
|
29
|
+
'metadata:',
|
|
30
|
+
` name: ${agentName}`,
|
|
31
|
+
'spec:',
|
|
32
|
+
' modelConfig:',
|
|
33
|
+
` modelRef: ${quoteYaml(modelRef)}`,
|
|
34
|
+
' prompts:',
|
|
35
|
+
' systemPrompt: |',
|
|
36
|
+
` ${systemPrompt}`,
|
|
37
|
+
].join('\n');
|
|
38
|
+
}
|
|
39
|
+
function buildSwarmYaml(agents, entryAgent) {
|
|
40
|
+
const agentRefs = agents.map((a) => ` - ref: ${quoteYaml(`Agent/${a}`)}`).join('\n');
|
|
41
|
+
return [
|
|
42
|
+
'apiVersion: goondan.ai/v1',
|
|
43
|
+
'kind: Swarm',
|
|
44
|
+
'metadata:',
|
|
45
|
+
' name: default',
|
|
46
|
+
'spec:',
|
|
47
|
+
` entryAgent: ${quoteYaml(`Agent/${entryAgent}`)}`,
|
|
48
|
+
' agents:',
|
|
49
|
+
agentRefs,
|
|
50
|
+
].join('\n');
|
|
51
|
+
}
|
|
52
|
+
function buildPackageYaml(name) {
|
|
53
|
+
return [
|
|
54
|
+
'apiVersion: goondan.ai/v1',
|
|
55
|
+
'kind: Package',
|
|
56
|
+
'metadata:',
|
|
57
|
+
` name: ${quoteYaml(name)}`,
|
|
58
|
+
'spec:',
|
|
59
|
+
' version: "0.1.0"',
|
|
60
|
+
].join('\n');
|
|
61
|
+
}
|
|
62
|
+
function defaultTemplate(name, asPackage) {
|
|
63
|
+
const model = buildModelYaml();
|
|
64
|
+
const agent = buildAgentYaml('assistant', 'Model/claude', 'You are a helpful assistant.');
|
|
65
|
+
const swarm = buildSwarmYaml(['assistant'], 'assistant');
|
|
66
|
+
const docs = [];
|
|
67
|
+
if (asPackage) {
|
|
68
|
+
docs.push(buildPackageYaml(name));
|
|
69
|
+
}
|
|
70
|
+
docs.push(model, agent, swarm);
|
|
71
|
+
return {
|
|
72
|
+
'goondan.yaml': docs.join('\n---\n') + '\n',
|
|
73
|
+
'prompts/default.system.md': 'You are a helpful assistant.\n',
|
|
74
|
+
'.env': '# ANTHROPIC_API_KEY=sk-ant-...\n',
|
|
75
|
+
'.gitignore': 'node_modules/\n.env.local\n',
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function multiAgentTemplate(name, asPackage) {
|
|
79
|
+
const model = buildModelYaml();
|
|
80
|
+
const planner = buildAgentYaml('planner', 'Model/claude', 'You are a planning agent. Break tasks into steps.');
|
|
81
|
+
const coder = buildAgentYaml('coder', 'Model/claude', 'You are a coding agent. Implement the plan.');
|
|
82
|
+
const reviewer = buildAgentYaml('reviewer', 'Model/claude', 'You are a code reviewer. Review code for correctness.');
|
|
83
|
+
const swarm = buildSwarmYaml(['planner', 'coder', 'reviewer'], 'planner');
|
|
84
|
+
const docs = [];
|
|
85
|
+
if (asPackage) {
|
|
86
|
+
docs.push(buildPackageYaml(name));
|
|
87
|
+
}
|
|
88
|
+
docs.push(model, planner, coder, reviewer, swarm);
|
|
89
|
+
return {
|
|
90
|
+
'goondan.yaml': docs.join('\n---\n') + '\n',
|
|
91
|
+
'prompts/planner.system.md': 'You are a planning agent. Break tasks into steps.\n',
|
|
92
|
+
'prompts/coder.system.md': 'You are a coding agent. Implement the plan.\n',
|
|
93
|
+
'prompts/reviewer.system.md': 'You are a code reviewer. Review code for correctness.\n',
|
|
94
|
+
'.env': '# ANTHROPIC_API_KEY=sk-ant-...\n',
|
|
95
|
+
'.gitignore': 'node_modules/\n.env.local\n',
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function packageTemplate(name) {
|
|
99
|
+
const pkg = buildPackageYaml(name);
|
|
100
|
+
const model = buildModelYaml();
|
|
101
|
+
const agent = buildAgentYaml('assistant', 'Model/claude', 'You are a helpful assistant.');
|
|
102
|
+
const swarm = buildSwarmYaml(['assistant'], 'assistant');
|
|
103
|
+
return {
|
|
104
|
+
'goondan.yaml': [pkg, model, agent, swarm].join('\n---\n') + '\n',
|
|
105
|
+
'.env': '# ANTHROPIC_API_KEY=sk-ant-...\n',
|
|
106
|
+
'.gitignore': 'node_modules/\n.env.local\ndist/\n',
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function minimalTemplate(name, asPackage) {
|
|
110
|
+
const model = buildModelYaml();
|
|
111
|
+
const agent = buildAgentYaml('assistant', 'Model/claude', 'You are a helpful assistant.');
|
|
112
|
+
const swarm = buildSwarmYaml(['assistant'], 'assistant');
|
|
113
|
+
const docs = [];
|
|
114
|
+
if (asPackage) {
|
|
115
|
+
docs.push(buildPackageYaml(name));
|
|
116
|
+
}
|
|
117
|
+
docs.push(model, agent, swarm);
|
|
118
|
+
return {
|
|
119
|
+
'goondan.yaml': docs.join('\n---\n') + '\n',
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function generateTemplateFiles(template, name, asPackage) {
|
|
123
|
+
switch (template) {
|
|
124
|
+
case 'default':
|
|
125
|
+
return defaultTemplate(name, asPackage);
|
|
126
|
+
case 'multi-agent':
|
|
127
|
+
return multiAgentTemplate(name, asPackage);
|
|
128
|
+
case 'package':
|
|
129
|
+
return packageTemplate(name);
|
|
130
|
+
case 'minimal':
|
|
131
|
+
return minimalTemplate(name, asPackage);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async function initGitRepo(targetDir) {
|
|
135
|
+
try {
|
|
136
|
+
await execFileAsync('git', ['init'], { cwd: targetDir });
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
export class DefaultInitService {
|
|
144
|
+
async init(request) {
|
|
145
|
+
const targetDir = request.targetDir;
|
|
146
|
+
if (!request.force && (await exists(targetDir))) {
|
|
147
|
+
const entries = await readdir(targetDir);
|
|
148
|
+
const hasGoondan = entries.includes('goondan.yaml') || entries.includes('goondan.yml');
|
|
149
|
+
if (hasGoondan) {
|
|
150
|
+
throw configError(`${targetDir}에 이미 goondan.yaml이 존재합니다.`, '--force 옵션으로 덮어쓸 수 있습니다.');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
await mkdir(targetDir, { recursive: true });
|
|
154
|
+
const files = generateTemplateFiles(request.template, request.name, request.asPackage);
|
|
155
|
+
const createdFiles = [];
|
|
156
|
+
for (const [relativePath, content] of Object.entries(files)) {
|
|
157
|
+
const fullPath = path.join(targetDir, relativePath);
|
|
158
|
+
await mkdir(path.dirname(fullPath), { recursive: true });
|
|
159
|
+
await writeFile(fullPath, content, 'utf8');
|
|
160
|
+
createdFiles.push(relativePath);
|
|
161
|
+
}
|
|
162
|
+
let gitInitialized = false;
|
|
163
|
+
if (request.git) {
|
|
164
|
+
gitInitialized = await initGitRepo(targetDir);
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
projectDir: targetDir,
|
|
168
|
+
template: request.template,
|
|
169
|
+
filesCreated: createdFiles,
|
|
170
|
+
gitInitialized,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/services/init.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC;AAC7C,CAAC;AAMD,SAAS,cAAc;IACrB,OAAO;QACL,2BAA2B;QAC3B,aAAa;QACb,WAAW;QACX,gBAAgB;QAChB,OAAO;QACP,uBAAuB;QACvB,mCAAmC;QACnC,WAAW;QACX,gBAAgB;QAChB,8BAA8B;KAC/B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB,EAAE,QAAgB,EAAE,YAAoB;IAC/E,OAAO;QACL,2BAA2B;QAC3B,aAAa;QACb,WAAW;QACX,WAAW,SAAS,EAAE;QACtB,OAAO;QACP,gBAAgB;QAChB,iBAAiB,SAAS,CAAC,QAAQ,CAAC,EAAE;QACtC,YAAY;QACZ,qBAAqB;QACrB,SAAS,YAAY,EAAE;KACxB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,MAAgB,EAAE,UAAkB;IAC1D,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxF,OAAO;QACL,2BAA2B;QAC3B,aAAa;QACb,WAAW;QACX,iBAAiB;QACjB,OAAO;QACP,iBAAiB,SAAS,CAAC,SAAS,UAAU,EAAE,CAAC,EAAE;QACnD,WAAW;QACX,SAAS;KACV,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO;QACL,2BAA2B;QAC3B,eAAe;QACf,WAAW;QACX,WAAW,SAAS,CAAC,IAAI,CAAC,EAAE;QAC5B,OAAO;QACP,oBAAoB;KACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,SAAkB;IACvD,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,cAAc,CAAC,WAAW,EAAE,cAAc,EAAE,8BAA8B,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;IAEzD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAE/B,OAAO;QACL,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI;QAC3C,2BAA2B,EAAE,gCAAgC;QAC7D,MAAM,EAAE,kCAAkC;QAC1C,YAAY,EAAE,6BAA6B;KAC5C,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,SAAkB;IAC1D,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,EAAE,cAAc,EAAE,mDAAmD,CAAC,CAAC;IAC/G,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,6CAA6C,CAAC,CAAC;IACrG,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,EAAE,cAAc,EAAE,uDAAuD,CAAC,CAAC;IACrH,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;IAE1E,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAElD,OAAO;QACL,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI;QAC3C,2BAA2B,EAAE,qDAAqD;QAClF,yBAAyB,EAAE,+CAA+C;QAC1E,4BAA4B,EAAE,yDAAyD;QACvF,MAAM,EAAE,kCAAkC;QAC1C,YAAY,EAAE,6BAA6B;KAC5C,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,cAAc,CAAC,WAAW,EAAE,cAAc,EAAE,8BAA8B,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;IAEzD,OAAO;QACL,cAAc,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI;QACjE,MAAM,EAAE,kCAAkC;QAC1C,YAAY,EAAE,oCAAoC;KACnD,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,SAAkB;IACvD,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,cAAc,CAAC,WAAW,EAAE,cAAc,EAAE,8BAA8B,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;IAEzD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAE/B,OAAO;QACL,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI;KAC5C,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAsB,EAAE,IAAY,EAAE,SAAkB;IACrF,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC1C,KAAK,aAAa;YAChB,OAAO,kBAAkB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC7C,KAAK,SAAS;YACZ,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/B,KAAK,SAAS;YACZ,OAAO,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,SAAiB;IAC1C,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,OAAO,kBAAkB;IAC7B,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAEpC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;YACzC,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YACvF,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,WAAW,CACf,GAAG,SAAS,2BAA2B,EACvC,0BAA0B,CAC3B,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5C,MAAM,KAAK,GAAG,qBAAqB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACvF,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,KAAK,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YACpD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAC3C,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,cAAc,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,CAAC;QAChD,CAAC;QAED,OAAO;YACL,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,YAAY,EAAE,YAAY;YAC1B,cAAc;SACf,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DeleteInstanceRequest, InstanceRecord, InstanceStore, ListInstancesRequest } from '../types.js';
|
|
2
|
+
export declare class FileInstanceStore implements InstanceStore {
|
|
3
|
+
private readonly env;
|
|
4
|
+
constructor(env: NodeJS.ProcessEnv);
|
|
5
|
+
list(request: ListInstancesRequest): Promise<InstanceRecord[]>;
|
|
6
|
+
delete(request: DeleteInstanceRequest): Promise<boolean>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { readdir, readFile, rm } from 'node:fs/promises';
|
|
3
|
+
import { execFile } from 'node:child_process';
|
|
4
|
+
import { promisify } from 'node:util';
|
|
5
|
+
import { configError } from '../errors.js';
|
|
6
|
+
import { exists, formatDate, isObjectRecord } from '../utils.js';
|
|
7
|
+
import { resolveStateRoot } from './config.js';
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
9
|
+
function parseActiveRuntimeState(raw) {
|
|
10
|
+
try {
|
|
11
|
+
const parsed = JSON.parse(raw);
|
|
12
|
+
if (!isObjectRecord(parsed)) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
const instanceKey = parsed['instanceKey'];
|
|
16
|
+
const bundlePath = parsed['bundlePath'];
|
|
17
|
+
const startedAt = parsed['startedAt'];
|
|
18
|
+
const watch = parsed['watch'];
|
|
19
|
+
const pidValue = parsed['pid'];
|
|
20
|
+
const pid = typeof pidValue === 'number' && Number.isInteger(pidValue) && pidValue > 0 ? pidValue : undefined;
|
|
21
|
+
if (typeof instanceKey !== 'string' ||
|
|
22
|
+
typeof bundlePath !== 'string' ||
|
|
23
|
+
typeof startedAt !== 'string' ||
|
|
24
|
+
typeof watch !== 'boolean') {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
instanceKey,
|
|
29
|
+
bundlePath,
|
|
30
|
+
startedAt,
|
|
31
|
+
watch,
|
|
32
|
+
pid,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function toDisplayDate(value) {
|
|
40
|
+
const parsed = new Date(value);
|
|
41
|
+
if (Number.isNaN(parsed.getTime())) {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
return formatDate(parsed);
|
|
45
|
+
}
|
|
46
|
+
function isProcessAlive(pid) {
|
|
47
|
+
try {
|
|
48
|
+
process.kill(pid, 0);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async function sleep(ms) {
|
|
56
|
+
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
57
|
+
}
|
|
58
|
+
async function readProcessCommand(pid) {
|
|
59
|
+
try {
|
|
60
|
+
const result = await execFileAsync('ps', ['-p', String(pid), '-o', 'command=']);
|
|
61
|
+
const text = typeof result.stdout === 'string' ? result.stdout.trim() : '';
|
|
62
|
+
return text.length > 0 ? text : undefined;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function isManagedRuntimeCommand(command, instanceKey) {
|
|
69
|
+
const hasRunnerName = command.includes('runtime-runner.js') || command.includes('runtime-runner.ts');
|
|
70
|
+
const hasInstanceFlag = command.includes('--instance-key');
|
|
71
|
+
const hasInstanceKey = command.includes(instanceKey);
|
|
72
|
+
return hasRunnerName && hasInstanceFlag && hasInstanceKey;
|
|
73
|
+
}
|
|
74
|
+
function tokenizeCommand(command) {
|
|
75
|
+
const tokens = [];
|
|
76
|
+
let current = '';
|
|
77
|
+
let quote;
|
|
78
|
+
let escaped = false;
|
|
79
|
+
for (const char of command) {
|
|
80
|
+
if (escaped) {
|
|
81
|
+
current += char;
|
|
82
|
+
escaped = false;
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (quote) {
|
|
86
|
+
if (char === '\\') {
|
|
87
|
+
escaped = true;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (char === quote) {
|
|
91
|
+
quote = undefined;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
current += char;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (char === '"' || char === '\'') {
|
|
98
|
+
quote = char;
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (/\s/u.test(char)) {
|
|
102
|
+
if (current.length > 0) {
|
|
103
|
+
tokens.push(current);
|
|
104
|
+
current = '';
|
|
105
|
+
}
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
current += char;
|
|
109
|
+
}
|
|
110
|
+
if (current.length > 0) {
|
|
111
|
+
tokens.push(current);
|
|
112
|
+
}
|
|
113
|
+
return tokens;
|
|
114
|
+
}
|
|
115
|
+
function readOptionFromTokens(tokens, option) {
|
|
116
|
+
for (let index = 0; index < tokens.length; index += 1) {
|
|
117
|
+
const token = tokens[index];
|
|
118
|
+
if (!token) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
if (token === option) {
|
|
122
|
+
const value = tokens[index + 1];
|
|
123
|
+
if (value && value.length > 0) {
|
|
124
|
+
return value;
|
|
125
|
+
}
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
const prefixed = `${option}=`;
|
|
129
|
+
if (token.startsWith(prefixed)) {
|
|
130
|
+
const value = token.slice(prefixed.length);
|
|
131
|
+
if (value.length > 0) {
|
|
132
|
+
return value;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
function parseManagedRuntimeProcess(line) {
|
|
139
|
+
const trimmed = line.trim();
|
|
140
|
+
if (trimmed.length === 0) {
|
|
141
|
+
return undefined;
|
|
142
|
+
}
|
|
143
|
+
const separator = trimmed.indexOf(' ');
|
|
144
|
+
if (separator < 0) {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
const pidRaw = trimmed.slice(0, separator).trim();
|
|
148
|
+
const command = trimmed.slice(separator + 1).trim();
|
|
149
|
+
const pid = Number.parseInt(pidRaw, 10);
|
|
150
|
+
if (!Number.isInteger(pid) || pid <= 0 || command.length === 0) {
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
const tokens = tokenizeCommand(command);
|
|
154
|
+
if (tokens.length < 2) {
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
const runtimeExec = tokens[0] ? path.basename(tokens[0]) : '';
|
|
158
|
+
const runnerEntry = tokens[1] ?? '';
|
|
159
|
+
const hasRuntimeExec = runtimeExec === 'node' || runtimeExec === 'bun';
|
|
160
|
+
const hasRunnerName = runnerEntry.endsWith('runtime-runner.js') || runnerEntry.endsWith('runtime-runner.ts');
|
|
161
|
+
if (!hasRuntimeExec || !hasRunnerName) {
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
const instanceKey = readOptionFromTokens(tokens, '--instance-key');
|
|
165
|
+
const stateRoot = readOptionFromTokens(tokens, '--state-root');
|
|
166
|
+
if (!instanceKey || !stateRoot) {
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
if (instanceKey.trim().length === 0 || stateRoot.trim().length === 0) {
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
pid,
|
|
174
|
+
instanceKey,
|
|
175
|
+
stateRoot: path.resolve(stateRoot),
|
|
176
|
+
command,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
async function listManagedRuntimeProcesses(stateRoot) {
|
|
180
|
+
let stdout = '';
|
|
181
|
+
try {
|
|
182
|
+
const result = await execFileAsync('ps', ['-ax', '-o', 'pid=,command=']);
|
|
183
|
+
stdout = typeof result.stdout === 'string' ? result.stdout : '';
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return [];
|
|
187
|
+
}
|
|
188
|
+
const normalizedStateRoot = path.resolve(stateRoot);
|
|
189
|
+
const lines = stdout.split('\n');
|
|
190
|
+
const result = [];
|
|
191
|
+
const seen = new Set();
|
|
192
|
+
for (const line of lines) {
|
|
193
|
+
const processInfo = parseManagedRuntimeProcess(line);
|
|
194
|
+
if (!processInfo) {
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
if (processInfo.stateRoot !== normalizedStateRoot) {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
const key = `${processInfo.instanceKey}:${String(processInfo.pid)}`;
|
|
201
|
+
if (seen.has(key)) {
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
seen.add(key);
|
|
205
|
+
result.push(processInfo);
|
|
206
|
+
}
|
|
207
|
+
return result;
|
|
208
|
+
}
|
|
209
|
+
async function terminateRuntimeProcess(pid, force, instanceKey) {
|
|
210
|
+
if (!isProcessAlive(pid)) {
|
|
211
|
+
return 'not_running';
|
|
212
|
+
}
|
|
213
|
+
const command = await readProcessCommand(pid);
|
|
214
|
+
if (!command || !isManagedRuntimeCommand(command, instanceKey)) {
|
|
215
|
+
return 'mismatch';
|
|
216
|
+
}
|
|
217
|
+
if (force) {
|
|
218
|
+
try {
|
|
219
|
+
process.kill(pid, 'SIGKILL');
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
// 프로세스 종료 경쟁 상태는 무시한다.
|
|
223
|
+
}
|
|
224
|
+
await sleep(20);
|
|
225
|
+
return isProcessAlive(pid) ? 'failed' : 'terminated';
|
|
226
|
+
}
|
|
227
|
+
try {
|
|
228
|
+
process.kill(pid, 'SIGTERM');
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
return 'failed';
|
|
232
|
+
}
|
|
233
|
+
for (let index = 0; index < 10; index += 1) {
|
|
234
|
+
await sleep(50);
|
|
235
|
+
if (!isProcessAlive(pid)) {
|
|
236
|
+
return 'terminated';
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
try {
|
|
240
|
+
process.kill(pid, 'SIGKILL');
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
// 이미 종료된 경우 무시한다.
|
|
244
|
+
}
|
|
245
|
+
await sleep(20);
|
|
246
|
+
return isProcessAlive(pid) ? 'failed' : 'terminated';
|
|
247
|
+
}
|
|
248
|
+
async function collectDeleteTargetsForKey(stateRoot, key) {
|
|
249
|
+
const targets = new Set();
|
|
250
|
+
targets.add(path.join(stateRoot, 'workspaces', key));
|
|
251
|
+
targets.add(path.join(stateRoot, 'instances', key));
|
|
252
|
+
const workspacesRoot = path.join(stateRoot, 'workspaces');
|
|
253
|
+
if (await exists(workspacesRoot)) {
|
|
254
|
+
const workspaces = await readdir(workspacesRoot, { withFileTypes: true });
|
|
255
|
+
for (const workspace of workspaces) {
|
|
256
|
+
if (!workspace.isDirectory()) {
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
targets.add(path.join(workspacesRoot, workspace.name, 'instances', key));
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
const instancesRoot = path.join(stateRoot, 'instances');
|
|
263
|
+
if (await exists(instancesRoot)) {
|
|
264
|
+
const workspaceCandidates = await readdir(instancesRoot, { withFileTypes: true });
|
|
265
|
+
for (const workspace of workspaceCandidates) {
|
|
266
|
+
if (!workspace.isDirectory()) {
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
targets.add(path.join(instancesRoot, workspace.name, key));
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return [...targets];
|
|
273
|
+
}
|
|
274
|
+
function buildActiveInstanceRecord(active) {
|
|
275
|
+
const startedAt = toDisplayDate(active.startedAt) ?? formatDate(new Date());
|
|
276
|
+
let status = 'running';
|
|
277
|
+
if (active.pid && !isProcessAlive(active.pid)) {
|
|
278
|
+
status = 'terminated';
|
|
279
|
+
}
|
|
280
|
+
return {
|
|
281
|
+
key: active.instanceKey,
|
|
282
|
+
agent: 'orchestrator',
|
|
283
|
+
status,
|
|
284
|
+
createdAt: startedAt,
|
|
285
|
+
updatedAt: startedAt,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
function buildProcessInstanceRecord(processInfo) {
|
|
289
|
+
const now = formatDate(new Date());
|
|
290
|
+
return {
|
|
291
|
+
key: processInfo.instanceKey,
|
|
292
|
+
agent: 'orchestrator',
|
|
293
|
+
status: isProcessAlive(processInfo.pid) ? 'running' : 'terminated',
|
|
294
|
+
createdAt: now,
|
|
295
|
+
updatedAt: now,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
export class FileInstanceStore {
|
|
299
|
+
env;
|
|
300
|
+
constructor(env) {
|
|
301
|
+
this.env = env;
|
|
302
|
+
}
|
|
303
|
+
async list(request) {
|
|
304
|
+
const stateRoot = resolveStateRoot(request.stateRoot, this.env);
|
|
305
|
+
const recordsByKey = new Map();
|
|
306
|
+
const activePath = path.join(stateRoot, 'runtime', 'active.json');
|
|
307
|
+
if (await exists(activePath)) {
|
|
308
|
+
const rawActive = await readFile(activePath, 'utf8');
|
|
309
|
+
const active = parseActiveRuntimeState(rawActive);
|
|
310
|
+
if (active) {
|
|
311
|
+
recordsByKey.set(active.instanceKey, buildActiveInstanceRecord(active));
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
const managedProcesses = await listManagedRuntimeProcesses(stateRoot);
|
|
315
|
+
for (const processInfo of managedProcesses) {
|
|
316
|
+
const candidate = buildProcessInstanceRecord(processInfo);
|
|
317
|
+
const existing = recordsByKey.get(processInfo.instanceKey);
|
|
318
|
+
if (!existing) {
|
|
319
|
+
recordsByKey.set(processInfo.instanceKey, candidate);
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
if (existing.status !== 'running' && candidate.status === 'running') {
|
|
323
|
+
existing.status = 'running';
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
let rows = [...recordsByKey.values()];
|
|
327
|
+
if (request.agent) {
|
|
328
|
+
const agent = request.agent.toLowerCase();
|
|
329
|
+
rows = rows.filter((row) => row.agent.toLowerCase() === agent);
|
|
330
|
+
}
|
|
331
|
+
if (request.all) {
|
|
332
|
+
return rows;
|
|
333
|
+
}
|
|
334
|
+
if (request.limit <= 0) {
|
|
335
|
+
return [];
|
|
336
|
+
}
|
|
337
|
+
return rows.slice(0, request.limit);
|
|
338
|
+
}
|
|
339
|
+
async delete(request) {
|
|
340
|
+
const stateRoot = resolveStateRoot(request.stateRoot, this.env);
|
|
341
|
+
let deleted = false;
|
|
342
|
+
let activePid;
|
|
343
|
+
const activePath = path.join(stateRoot, 'runtime', 'active.json');
|
|
344
|
+
if (await exists(activePath)) {
|
|
345
|
+
const rawActive = await readFile(activePath, 'utf8');
|
|
346
|
+
const active = parseActiveRuntimeState(rawActive);
|
|
347
|
+
if (active && active.instanceKey === request.key) {
|
|
348
|
+
activePid = active.pid;
|
|
349
|
+
if (active.pid) {
|
|
350
|
+
const termination = await terminateRuntimeProcess(active.pid, request.force, request.key);
|
|
351
|
+
if (termination === 'mismatch') {
|
|
352
|
+
throw configError(`PID ${active.pid} 프로세스가 대상 인스턴스(${request.key})와 일치하지 않아 삭제를 중단했습니다.`, `ps -p ${active.pid} -o pid,ppid,stat,etime,command 로 확인하세요.`);
|
|
353
|
+
}
|
|
354
|
+
if (termination === 'failed') {
|
|
355
|
+
throw configError(`PID ${active.pid} 프로세스를 종료하지 못해 삭제를 중단했습니다.`, '--force 옵션으로 재시도하거나 프로세스를 수동 종료 후 다시 실행하세요.');
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
await rm(activePath, { force: true });
|
|
359
|
+
await rm(path.join(stateRoot, 'runtime', 'logs', request.key), { recursive: true, force: true });
|
|
360
|
+
deleted = true;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
const managedProcesses = await listManagedRuntimeProcesses(stateRoot);
|
|
364
|
+
for (const processInfo of managedProcesses) {
|
|
365
|
+
if (processInfo.instanceKey !== request.key) {
|
|
366
|
+
continue;
|
|
367
|
+
}
|
|
368
|
+
if (activePid && processInfo.pid === activePid) {
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
const termination = await terminateRuntimeProcess(processInfo.pid, request.force, request.key);
|
|
372
|
+
if (termination === 'mismatch') {
|
|
373
|
+
throw configError(`PID ${processInfo.pid} 프로세스가 대상 인스턴스(${request.key})와 일치하지 않아 삭제를 중단했습니다.`, `ps -p ${processInfo.pid} -o pid,ppid,stat,etime,command 로 확인하세요.`);
|
|
374
|
+
}
|
|
375
|
+
if (termination === 'failed') {
|
|
376
|
+
throw configError(`PID ${processInfo.pid} 프로세스를 종료하지 못해 삭제를 중단했습니다.`, '--force 옵션으로 재시도하거나 프로세스를 수동 종료 후 다시 실행하세요.');
|
|
377
|
+
}
|
|
378
|
+
if (termination === 'terminated' || termination === 'not_running') {
|
|
379
|
+
deleted = true;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
const targets = await collectDeleteTargetsForKey(stateRoot, request.key);
|
|
383
|
+
for (const target of targets) {
|
|
384
|
+
if (!(await exists(target))) {
|
|
385
|
+
continue;
|
|
386
|
+
}
|
|
387
|
+
await rm(target, { recursive: true, force: true });
|
|
388
|
+
deleted = true;
|
|
389
|
+
}
|
|
390
|
+
return deleted;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=instances.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instances.js","sourceRoot":"","sources":["../../src/services/instances.ts"],"names":[],"mappings":"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"}
|