@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,5 @@
1
+ export declare function resolveManifestPath(cwd: string, inputPath: string): string;
2
+ export declare function packagePathParts(packageName: string): {
3
+ scope?: string;
4
+ name: string;
5
+ };
@@ -0,0 +1,25 @@
1
+ import path from 'node:path';
2
+ import { DEFAULT_BUNDLE_FILE } from '../constants.js';
3
+ export function resolveManifestPath(cwd, inputPath) {
4
+ const resolved = path.resolve(cwd, inputPath);
5
+ const isYaml = resolved.endsWith('.yaml') || resolved.endsWith('.yml');
6
+ if (isYaml) {
7
+ return resolved;
8
+ }
9
+ return path.join(resolved, DEFAULT_BUNDLE_FILE);
10
+ }
11
+ export function packagePathParts(packageName) {
12
+ if (packageName.startsWith('@')) {
13
+ const slash = packageName.indexOf('/');
14
+ if (slash > 1 && slash < packageName.length - 1) {
15
+ return {
16
+ scope: packageName.slice(1, slash),
17
+ name: packageName.slice(slash + 1),
18
+ };
19
+ }
20
+ }
21
+ return {
22
+ name: packageName,
23
+ };
24
+ }
25
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/services/path.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,SAAiB;IAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvE,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,OAAO;gBACL,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;gBAClC,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;aACnC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,WAAW;KAClB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { RegistryClient, RegistryPackageMetadata, RegistryPackageVersionMetadata, RegistryPublishPayload, RegistryPublishResult } from '../types.js';
2
+ interface PackageRefInfo {
3
+ name: string;
4
+ version?: string;
5
+ }
6
+ export declare function parsePackageRef(ref: string): PackageRefInfo;
7
+ export declare class HttpRegistryClient implements RegistryClient {
8
+ resolvePackage(ref: string, registryUrl: string, token?: string): Promise<RegistryPackageMetadata>;
9
+ getPackageVersion(packageName: string, version: string, registryUrl: string, token?: string): Promise<RegistryPackageVersionMetadata>;
10
+ publishPackage(payload: RegistryPublishPayload, registryUrl: string, token?: string): Promise<RegistryPublishResult>;
11
+ }
12
+ export {};
@@ -0,0 +1,219 @@
1
+ import { authError, networkError } from '../errors.js';
2
+ import { isObjectRecord } from '../utils.js';
3
+ function isExactSemver(value) {
4
+ return /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(value);
5
+ }
6
+ export function parsePackageRef(ref) {
7
+ if (ref.length === 0) {
8
+ throw networkError('빈 package ref는 해석할 수 없습니다.');
9
+ }
10
+ if (ref.startsWith('@')) {
11
+ const slash = ref.indexOf('/');
12
+ if (slash <= 1) {
13
+ throw networkError(`잘못된 scoped package ref 입니다: ${ref}`);
14
+ }
15
+ const versionDelimiter = ref.indexOf('@', slash + 1);
16
+ if (versionDelimiter < 0) {
17
+ return { name: ref };
18
+ }
19
+ const version = ref.slice(versionDelimiter + 1);
20
+ return {
21
+ name: ref.slice(0, versionDelimiter),
22
+ version,
23
+ };
24
+ }
25
+ const atIndex = ref.lastIndexOf('@');
26
+ if (atIndex > 0) {
27
+ return {
28
+ name: ref.slice(0, atIndex),
29
+ version: ref.slice(atIndex + 1),
30
+ };
31
+ }
32
+ return { name: ref };
33
+ }
34
+ function normalizeRegistryUrl(registryUrl) {
35
+ return registryUrl.endsWith('/') ? registryUrl.slice(0, -1) : registryUrl;
36
+ }
37
+ function encodedPackageName(name) {
38
+ if (name.startsWith('@')) {
39
+ const slash = name.indexOf('/');
40
+ if (slash > 1 && slash < name.length - 1) {
41
+ const scope = name.slice(0, slash);
42
+ const pkg = name.slice(slash + 1);
43
+ return `${encodeURIComponent(scope)}/${encodeURIComponent(pkg)}`;
44
+ }
45
+ }
46
+ return encodeURIComponent(name);
47
+ }
48
+ function parseLatestVersion(metadata) {
49
+ if (!isObjectRecord(metadata)) {
50
+ return undefined;
51
+ }
52
+ const distTags = metadata['dist-tags'];
53
+ if (isObjectRecord(distTags)) {
54
+ const latest = distTags['latest'];
55
+ if (typeof latest === 'string') {
56
+ return latest;
57
+ }
58
+ }
59
+ const version = metadata['version'];
60
+ if (typeof version === 'string') {
61
+ return version;
62
+ }
63
+ return undefined;
64
+ }
65
+ function createRegistryHeaders(token) {
66
+ const headers = {
67
+ Accept: 'application/json',
68
+ };
69
+ if (token && token.length > 0) {
70
+ headers['Authorization'] = `Bearer ${token}`;
71
+ }
72
+ return headers;
73
+ }
74
+ function parseStringRecord(value) {
75
+ if (!isObjectRecord(value)) {
76
+ return undefined;
77
+ }
78
+ const result = {};
79
+ for (const [key, entry] of Object.entries(value)) {
80
+ if (typeof entry !== 'string') {
81
+ return undefined;
82
+ }
83
+ result[key] = entry;
84
+ }
85
+ return result;
86
+ }
87
+ function parsePackageVersionMetadata(value) {
88
+ if (!isObjectRecord(value)) {
89
+ return undefined;
90
+ }
91
+ const version = value['version'];
92
+ if (typeof version !== 'string') {
93
+ return undefined;
94
+ }
95
+ const access = value['access'];
96
+ if (access !== 'public' && access !== 'restricted') {
97
+ return undefined;
98
+ }
99
+ const deprecatedRaw = value['deprecated'];
100
+ if (typeof deprecatedRaw !== 'string') {
101
+ return undefined;
102
+ }
103
+ const dependencies = parseStringRecord(value['dependencies']);
104
+ if (!dependencies) {
105
+ return undefined;
106
+ }
107
+ const dist = value['dist'];
108
+ if (!isObjectRecord(dist)) {
109
+ return undefined;
110
+ }
111
+ const tarball = dist['tarball'];
112
+ const shasum = dist['shasum'];
113
+ const integrity = dist['integrity'];
114
+ if (typeof tarball !== 'string' || typeof shasum !== 'string' || typeof integrity !== 'string') {
115
+ return undefined;
116
+ }
117
+ return {
118
+ version,
119
+ dependencies,
120
+ deprecated: deprecatedRaw,
121
+ access,
122
+ dist: {
123
+ tarball,
124
+ shasum,
125
+ integrity,
126
+ },
127
+ };
128
+ }
129
+ function readFetchFailureMessage(error) {
130
+ if (error instanceof Error && error.message.length > 0) {
131
+ return error.message;
132
+ }
133
+ return String(error);
134
+ }
135
+ async function requestRegistry(endpoint, init, action) {
136
+ try {
137
+ return await fetch(endpoint, init);
138
+ }
139
+ catch (error) {
140
+ const detail = readFetchFailureMessage(error);
141
+ throw networkError(`${action} 네트워크 요청에 실패했습니다: ${endpoint}`, `--registry 또는 GOONDAN_REGISTRY를 확인하세요. 원인: ${detail}`);
142
+ }
143
+ }
144
+ export class HttpRegistryClient {
145
+ async resolvePackage(ref, registryUrl, token) {
146
+ const parsed = parsePackageRef(ref);
147
+ if (parsed.version && isExactSemver(parsed.version)) {
148
+ return {
149
+ name: parsed.name,
150
+ latestVersion: parsed.version,
151
+ };
152
+ }
153
+ const normalized = normalizeRegistryUrl(registryUrl);
154
+ const endpoint = `${normalized}/${encodedPackageName(parsed.name)}`;
155
+ const headers = createRegistryHeaders(token);
156
+ const response = await requestRegistry(endpoint, {
157
+ method: 'GET',
158
+ headers,
159
+ }, '패키지 메타데이터 조회');
160
+ if (response.status === 401 || response.status === 403) {
161
+ throw authError('레지스트리 인증이 필요합니다.', 'GOONDAN_REGISTRY_TOKEN 또는 config.json token 설정을 확인하세요.');
162
+ }
163
+ if (!response.ok) {
164
+ throw networkError(`패키지 메타데이터 조회 실패: ${response.status} ${response.statusText}`);
165
+ }
166
+ const json = await response.json();
167
+ const latest = parseLatestVersion(json);
168
+ if (!latest) {
169
+ throw networkError('레지스트리 응답에서 최신 버전을 확인할 수 없습니다.');
170
+ }
171
+ return {
172
+ name: parsed.name,
173
+ latestVersion: latest,
174
+ };
175
+ }
176
+ async getPackageVersion(packageName, version, registryUrl, token) {
177
+ const normalized = normalizeRegistryUrl(registryUrl);
178
+ const endpoint = `${normalized}/${encodedPackageName(packageName)}/${encodeURIComponent(version)}`;
179
+ const headers = createRegistryHeaders(token);
180
+ const response = await requestRegistry(endpoint, {
181
+ method: 'GET',
182
+ headers,
183
+ }, '패키지 버전 조회');
184
+ if (response.status === 401 || response.status === 403) {
185
+ throw authError('레지스트리 인증이 필요합니다.', 'GOONDAN_REGISTRY_TOKEN 또는 config.json token 설정을 확인하세요.');
186
+ }
187
+ if (!response.ok) {
188
+ throw networkError(`패키지 버전 조회 실패: ${response.status} ${response.statusText}`);
189
+ }
190
+ const json = await response.json();
191
+ const parsed = parsePackageVersionMetadata(json);
192
+ if (!parsed) {
193
+ throw networkError('레지스트리 응답에서 패키지 버전 메타데이터를 확인할 수 없습니다.');
194
+ }
195
+ return parsed;
196
+ }
197
+ async publishPackage(payload, registryUrl, token) {
198
+ const normalized = normalizeRegistryUrl(registryUrl);
199
+ const endpoint = `${normalized}/${encodedPackageName(payload.name)}`;
200
+ const headers = createRegistryHeaders(token);
201
+ headers['Content-Type'] = 'application/json';
202
+ const response = await requestRegistry(endpoint, {
203
+ method: 'PUT',
204
+ headers,
205
+ body: JSON.stringify(payload),
206
+ }, '패키지 publish');
207
+ if (response.status === 401 || response.status === 403) {
208
+ throw authError('패키지 publish 인증에 실패했습니다.', '레지스트리 토큰 권한을 확인하세요.');
209
+ }
210
+ if (!response.ok) {
211
+ throw networkError(`패키지 publish 실패: ${response.status} ${response.statusText}`);
212
+ }
213
+ return {
214
+ ok: true,
215
+ registryUrl: normalized,
216
+ };
217
+ }
218
+ }
219
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/services/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface RuntimeRestartSignal {
2
+ requested: boolean;
3
+ reason?: string;
4
+ }
5
+ export declare function readRuntimeRestartSignal(value: unknown): RuntimeRestartSignal | undefined;
@@ -0,0 +1,18 @@
1
+ import { isObjectRecord } from '../utils.js';
2
+ const RESTART_FLAG_KEYS = ['restartRequested', 'runtimeRestart', '__goondanRestart'];
3
+ export function readRuntimeRestartSignal(value) {
4
+ if (!isObjectRecord(value)) {
5
+ return undefined;
6
+ }
7
+ for (const key of RESTART_FLAG_KEYS) {
8
+ if (value[key] === true) {
9
+ const reasonValue = value['restartReason'];
10
+ return {
11
+ requested: true,
12
+ reason: typeof reasonValue === 'string' && reasonValue.trim().length > 0 ? reasonValue.trim() : undefined,
13
+ };
14
+ }
15
+ }
16
+ return undefined;
17
+ }
18
+ //# sourceMappingURL=runtime-restart-signal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-restart-signal.js","sourceRoot":"","sources":["../../src/services/runtime-restart-signal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAO7C,MAAM,iBAAiB,GAAG,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,CAAU,CAAC;AAE9F,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YACxB,MAAM,WAAW,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;YAC3C,OAAO;gBACL,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;aAC1G,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface ReplacementRunnerInput {
2
+ runnerModulePath: string;
3
+ runnerArgs: string[];
4
+ stateRoot: string;
5
+ instanceKey: string;
6
+ bundlePath: string;
7
+ watch: boolean;
8
+ env: NodeJS.ProcessEnv;
9
+ startupTimeoutMs?: number;
10
+ }
11
+ export declare function spawnReplacementRunner(input: ReplacementRunnerInput): Promise<number>;
@@ -0,0 +1,151 @@
1
+ import path from 'node:path';
2
+ import { fork } from 'node:child_process';
3
+ import { closeSync, openSync } from 'node:fs';
4
+ import { mkdir, writeFile } from 'node:fs/promises';
5
+ import { isRunnerReadyMessage, isRunnerStartErrorMessage } from './runtime-runner-protocol.js';
6
+ const STARTUP_TIMEOUT_MS = 5_000;
7
+ const ORCHESTRATOR_PROCESS_NAME = 'orchestrator';
8
+ function resolveProcessLogPaths(stateRoot, instanceKey, processName) {
9
+ const logDir = path.join(stateRoot, 'runtime', 'logs', instanceKey);
10
+ return {
11
+ stdoutPath: path.join(logDir, `${processName}.stdout.log`),
12
+ stderrPath: path.join(logDir, `${processName}.stderr.log`),
13
+ };
14
+ }
15
+ function closeFd(fd) {
16
+ try {
17
+ closeSync(fd);
18
+ }
19
+ catch {
20
+ // 이미 닫힌 fd는 무시
21
+ }
22
+ }
23
+ function killIfRunning(pid) {
24
+ if (!pid || pid <= 0) {
25
+ return;
26
+ }
27
+ try {
28
+ process.kill(pid, 'SIGKILL');
29
+ }
30
+ catch {
31
+ // 이미 종료된 경우 무시
32
+ }
33
+ }
34
+ async function waitForRunnerReady(child, instanceKey, startupTimeoutMs, logPaths) {
35
+ return new Promise((resolve, reject) => {
36
+ let settled = false;
37
+ const cleanup = () => {
38
+ clearTimeout(timeout);
39
+ child.off('message', onMessage);
40
+ child.off('error', onError);
41
+ child.off('exit', onExit);
42
+ };
43
+ const fail = (message) => {
44
+ if (settled) {
45
+ return;
46
+ }
47
+ settled = true;
48
+ cleanup();
49
+ reject(new Error(`${message} (logs: ${logPaths.stdoutPath}, ${logPaths.stderrPath})`));
50
+ };
51
+ const succeed = (pid) => {
52
+ if (settled) {
53
+ return;
54
+ }
55
+ settled = true;
56
+ cleanup();
57
+ resolve(pid);
58
+ };
59
+ const timeout = setTimeout(() => {
60
+ killIfRunning(child.pid);
61
+ fail('replacement Orchestrator 시작 확인이 시간 내에 완료되지 않았습니다.');
62
+ }, startupTimeoutMs);
63
+ const onMessage = (message) => {
64
+ if (isRunnerReadyMessage(message)) {
65
+ if (message.instanceKey !== instanceKey) {
66
+ fail(`replacement Orchestrator instanceKey 불일치: expected=${instanceKey}, actual=${message.instanceKey}`);
67
+ return;
68
+ }
69
+ succeed(message.pid);
70
+ return;
71
+ }
72
+ if (isRunnerStartErrorMessage(message)) {
73
+ fail(`replacement Orchestrator 시작 실패: ${message.message}`);
74
+ }
75
+ };
76
+ const onError = (error) => {
77
+ fail(`replacement Orchestrator 프로세스 오류: ${error.message}`);
78
+ };
79
+ const onExit = (code, signal) => {
80
+ const cause = code !== null ? `exit code ${code}` : signal ? `signal ${signal}` : 'unknown reason';
81
+ fail(`replacement Orchestrator가 초기화 중 종료되었습니다 (${cause}).`);
82
+ };
83
+ child.on('message', onMessage);
84
+ child.on('error', onError);
85
+ child.on('exit', onExit);
86
+ });
87
+ }
88
+ async function writeRuntimeState(input) {
89
+ const runtimeDir = path.join(input.stateRoot, 'runtime');
90
+ await mkdir(runtimeDir, { recursive: true });
91
+ const state = {
92
+ instanceKey: input.instanceKey,
93
+ bundlePath: input.bundlePath,
94
+ startedAt: new Date().toISOString(),
95
+ watch: input.watch,
96
+ pid: input.pid,
97
+ logs: [
98
+ {
99
+ process: ORCHESTRATOR_PROCESS_NAME,
100
+ stdout: input.logPaths.stdoutPath,
101
+ stderr: input.logPaths.stderrPath,
102
+ },
103
+ ],
104
+ };
105
+ const activePath = path.join(runtimeDir, 'active.json');
106
+ await writeFile(activePath, JSON.stringify(state, null, 2), 'utf8');
107
+ }
108
+ export async function spawnReplacementRunner(input) {
109
+ const logPaths = resolveProcessLogPaths(input.stateRoot, input.instanceKey, ORCHESTRATOR_PROCESS_NAME);
110
+ await mkdir(path.dirname(logPaths.stdoutPath), { recursive: true });
111
+ const stdoutFd = openSync(logPaths.stdoutPath, 'a');
112
+ const stderrFd = openSync(logPaths.stderrPath, 'a');
113
+ let child;
114
+ try {
115
+ child = fork(input.runnerModulePath, input.runnerArgs, {
116
+ cwd: path.dirname(input.bundlePath),
117
+ detached: true,
118
+ env: {
119
+ ...input.env,
120
+ GOONDAN_STATE_ROOT: input.stateRoot,
121
+ },
122
+ stdio: ['ignore', stdoutFd, stderrFd, 'ipc'],
123
+ });
124
+ }
125
+ finally {
126
+ closeFd(stdoutFd);
127
+ closeFd(stderrFd);
128
+ }
129
+ if (!child.pid || child.pid <= 0) {
130
+ throw new Error('replacement Orchestrator 프로세스를 시작하지 못했습니다.');
131
+ }
132
+ const pid = await waitForRunnerReady(child, input.instanceKey, input.startupTimeoutMs ?? STARTUP_TIMEOUT_MS, logPaths)
133
+ .catch((error) => {
134
+ killIfRunning(child.pid);
135
+ throw error;
136
+ });
137
+ if (child.connected) {
138
+ child.disconnect();
139
+ }
140
+ child.unref();
141
+ await writeRuntimeState({
142
+ stateRoot: input.stateRoot,
143
+ instanceKey: input.instanceKey,
144
+ bundlePath: input.bundlePath,
145
+ watch: input.watch,
146
+ pid,
147
+ logPaths,
148
+ });
149
+ return pid;
150
+ }
151
+ //# sourceMappingURL=runtime-restart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-restart.js","sourceRoot":"","sources":["../../src/services/runtime-restart.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { type JsonObject } from '@goondan/runtime';
2
+ export interface ParsedConnectorEvent {
3
+ name: string;
4
+ instanceKey: string;
5
+ messageText: string;
6
+ properties: Record<string, string>;
7
+ }
8
+ export interface ParsedAgentToolEvent {
9
+ id: string;
10
+ type: string;
11
+ instanceKey: string;
12
+ messageText: string;
13
+ sourceName: string;
14
+ metadata?: JsonObject;
15
+ correlationId?: string;
16
+ }
17
+ export interface IngressRouteRule {
18
+ eventName?: string;
19
+ properties?: Record<string, string>;
20
+ agentName?: string;
21
+ instanceKey?: string;
22
+ instanceKeyProperty?: string;
23
+ instanceKeyPrefix?: string;
24
+ }
25
+ export interface RuntimeInboundContext {
26
+ sourceKind: 'connector' | 'agent';
27
+ sourceName: string;
28
+ eventName: string;
29
+ instanceKey: string;
30
+ messageText: string;
31
+ properties?: Record<string, string>;
32
+ metadata?: JsonObject;
33
+ }
34
+ export declare function parseConnectorEventPayload(event: unknown): ParsedConnectorEvent | undefined;
35
+ export declare function parseAgentToolEventPayload(event: unknown, fallbackInstanceKey: string, fallbackSourceName: string): ParsedAgentToolEvent | undefined;
36
+ export declare function formatRuntimeInboundUserText(input: RuntimeInboundContext): string;
37
+ export declare function resolveRuntimeWorkdir(baseWorkdir: string, cwd?: string): string;
38
+ export declare function selectTargetAgentName(rules: IngressRouteRule[], defaultAgentName: string, event: ParsedConnectorEvent): string;
39
+ export declare function selectMatchingIngressRule(rules: IngressRouteRule[], event: ParsedConnectorEvent): IngressRouteRule | undefined;
40
+ export declare function resolveInboundInstanceKey(rule: IngressRouteRule | undefined, event: ParsedConnectorEvent): string;