@agentteams/runner 0.0.114 → 0.0.116
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/api-client.d.ts +1 -0
- package/dist/api-client.js +13 -0
- package/dist/api-client.js.map +1 -1
- package/dist/commands/update.js +1 -7
- package/dist/commands/update.js.map +1 -1
- package/dist/poller.d.ts +2 -1
- package/dist/poller.js +22 -2
- package/dist/poller.js.map +1 -1
- package/dist/poller.test.js +70 -1
- package/dist/poller.test.js.map +1 -1
- package/dist/utils/auto-update.d.ts +17 -2
- package/dist/utils/auto-update.js +165 -52
- package/dist/utils/auto-update.js.map +1 -1
- package/dist/utils/auto-update.test.js +357 -7
- package/dist/utils/auto-update.test.js.map +1 -1
- package/dist/utils/model-enumerator.d.ts +7 -0
- package/dist/utils/model-enumerator.js +72 -12
- package/dist/utils/model-enumerator.js.map +1 -1
- package/dist/utils/model-enumerator.test.js +72 -1
- package/dist/utils/model-enumerator.test.js.map +1 -1
- package/dist/utils/npm-global-permission.d.ts +18 -0
- package/dist/utils/npm-global-permission.js +41 -0
- package/dist/utils/npm-global-permission.js.map +1 -0
- package/dist/utils/npm-global-permission.test.d.ts +1 -0
- package/dist/utils/npm-global-permission.test.js +75 -0
- package/dist/utils/npm-global-permission.test.js.map +1 -0
- package/dist/utils/npm-install-error.d.ts +12 -0
- package/dist/utils/npm-install-error.js +19 -0
- package/dist/utils/npm-install-error.js.map +1 -0
- package/dist/utils/npm-install-error.test.d.ts +1 -0
- package/dist/utils/npm-install-error.test.js +28 -0
- package/dist/utils/npm-install-error.test.js.map +1 -0
- package/native/bin/win32-x64/agentrunner-launcher.exe +0 -0
- package/native/bin/win32-x64/manifest.json +2 -2
- package/package.json +1 -1
|
@@ -1,15 +1,33 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';
|
|
2
2
|
import { runExecutableSync } from '../executable.js';
|
|
3
3
|
import { logger } from '../logger.js';
|
|
4
|
+
import { classifyInstallError, describeInstallError } from './npm-install-error.js';
|
|
5
|
+
import { canWriteGlobalNpmRoot as canWriteGlobalNpmRootDefault } from './npm-global-permission.js';
|
|
4
6
|
const require = createRequire(import.meta.url);
|
|
5
7
|
const packageJson = require('../../package.json');
|
|
6
8
|
const CLI_PACKAGE = '@agentteams/cli';
|
|
7
9
|
const RUNNER_PACKAGE = '@agentteams/runner';
|
|
8
10
|
const COOLDOWN_MS = 60 * 60 * 1000; // 1시간
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
/**
|
|
12
|
+
* 권한 차단은 사용자가 직접 고치기 전에는 절대 풀리지 않는다. 1시간마다 같은 EACCES를 반복해도
|
|
13
|
+
* 얻는 것이 없으므로 대상 버전이 바뀔 때까지 24시간 대기한다.
|
|
14
|
+
*/
|
|
15
|
+
const PERMISSION_BLOCKED_COOLDOWN_MS = 24 * 60 * 60 * 1000;
|
|
16
|
+
const PERMISSION_BLOCKED_HINT = 'AgentRunner cannot write to the global npm directory, so auto-update is blocked. ' +
|
|
17
|
+
'Install the update manually with elevated permissions, or switch npm to a user-level prefix.';
|
|
11
18
|
let lastSuccessfulRunnerVersion = null;
|
|
12
|
-
|
|
19
|
+
/** 패키지별 마지막 설치 시도. 대상 버전이 바뀌면 쿨다운과 무관하게 즉시 다시 시도한다. */
|
|
20
|
+
const lastUpdateAttempts = new Map();
|
|
21
|
+
/** 권한 차단으로 판정된 (package, version). 대상 버전이 바뀌면 즉시 재시도할 수 있게 버전을 함께 들고 있는다. */
|
|
22
|
+
const permissionBlockedVersions = new Map();
|
|
23
|
+
/** 아직 서버에 전달하지 못한 실패 보고. 설치 백오프와 무관하게 매 폴링마다 재시도한다. */
|
|
24
|
+
const pendingFailureReports = new Map();
|
|
25
|
+
/** 보고가 성공한 실패 식별자. 서버 중복 계약과 같은 (version, reason) 조합만 억제한다. */
|
|
26
|
+
const reportedFailures = new Map();
|
|
27
|
+
/** 아직 서버에 전달하지 못한 설치 성공 (package → version). 매 폴링마다 재시도한다. */
|
|
28
|
+
const pendingSuccessReports = new Map();
|
|
29
|
+
/** 서버의 중복 억제 계약과 동일하게 (version, reason)까지 봐야 사유 전환이 다시 보고된다. */
|
|
30
|
+
const failureIdentity = (input) => `${input.version}::${input.reason}`;
|
|
13
31
|
const getCurrentRunnerVersion = () => packageJson.version ?? '0.0.0';
|
|
14
32
|
const getInstalledCliVersion = (deps) => {
|
|
15
33
|
try {
|
|
@@ -29,6 +47,31 @@ const needsUpdate = (currentVersion, latestVersion) => {
|
|
|
29
47
|
const installPackage = (packageName, version, deps) => {
|
|
30
48
|
deps.runExecutableSync('npm', ['install', '-g', `${packageName}@${version}`]);
|
|
31
49
|
};
|
|
50
|
+
/** 권한 차단으로 백오프 중인지 판정한다. 대상 버전이 바뀌었으면 백오프를 해제한다. */
|
|
51
|
+
const isPermissionBlocked = (pkg, targetVersion) => permissionBlockedVersions.get(pkg) === targetVersion;
|
|
52
|
+
/**
|
|
53
|
+
* 설치를 시도해도 되는 시점인지 판정한다.
|
|
54
|
+
*
|
|
55
|
+
* 대상 버전이 직전 시도와 다르면 쿨다운(권한 차단 24시간 포함)을 무시하고 즉시 시도한다.
|
|
56
|
+
* 권한·패키징 문제를 고친 새 버전이 나왔는데 최대 1시간을 기다리는 일을 막는다.
|
|
57
|
+
*/
|
|
58
|
+
const shouldAttemptInstall = (pkg, targetVersion, now) => {
|
|
59
|
+
const lastAttempt = lastUpdateAttempts.get(pkg);
|
|
60
|
+
if (!lastAttempt || lastAttempt.targetVersion !== targetVersion)
|
|
61
|
+
return true;
|
|
62
|
+
const cooldown = isPermissionBlocked(pkg, targetVersion) ? PERMISSION_BLOCKED_COOLDOWN_MS : COOLDOWN_MS;
|
|
63
|
+
return now - lastAttempt.at >= cooldown;
|
|
64
|
+
};
|
|
65
|
+
/** 프리플라이트가 판정 불가로 throw하면 fail-open — 기존처럼 설치를 시도한다. */
|
|
66
|
+
const resolveCanWriteGlobalNpmRoot = (deps) => {
|
|
67
|
+
const check = deps.canWriteGlobalNpmRoot ?? canWriteGlobalNpmRootDefault;
|
|
68
|
+
try {
|
|
69
|
+
return check();
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
32
75
|
export const maybeAutoUpdate = async (meta, deps = {}) => {
|
|
33
76
|
if (!meta)
|
|
34
77
|
return { cliUpdated: false, runnerUpdated: false };
|
|
@@ -37,83 +80,153 @@ export const maybeAutoUpdate = async (meta, deps = {}) => {
|
|
|
37
80
|
const now = (deps.now ?? Date.now)();
|
|
38
81
|
let cliUpdated = false;
|
|
39
82
|
let runnerUpdated = false;
|
|
83
|
+
/**
|
|
84
|
+
* 실패를 미보고 큐에 넣는다. 전송은 설치 백오프와 분리된 `flushPendingReports`가 담당하므로,
|
|
85
|
+
* 24시간 권한 백오프에 걸린 뒤에도 다음 폴링마다 보고만 재시도된다.
|
|
86
|
+
*/
|
|
87
|
+
const recordFailure = (input) => {
|
|
88
|
+
if (input.reason === 'PERMISSION_DENIED') {
|
|
89
|
+
const alreadyBlocked = permissionBlockedVersions.get(input.package) === input.version;
|
|
90
|
+
permissionBlockedVersions.set(input.package, input.version);
|
|
91
|
+
if (!alreadyBlocked) {
|
|
92
|
+
// 로그 폭주를 막기 위해 버전당 1회만 조치 안내를 남긴다.
|
|
93
|
+
resolvedLogger.warn(PERMISSION_BLOCKED_HINT, {
|
|
94
|
+
package: input.package,
|
|
95
|
+
targetVersion: input.version,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// 이미 보고에 성공한 것과 완전히 같은 (version, reason)이면 다시 보내지 않는다.
|
|
100
|
+
if (reportedFailures.get(input.package) === failureIdentity(input))
|
|
101
|
+
return;
|
|
102
|
+
pendingFailureReports.set(input.package, input);
|
|
103
|
+
};
|
|
104
|
+
/** 설치 성공을 미보고 큐에 넣는다. 서버는 이 보고로 해당 패키지의 실패 상태를 해제한다. */
|
|
105
|
+
const recordSuccess = (pkg, version) => {
|
|
106
|
+
permissionBlockedVersions.delete(pkg);
|
|
107
|
+
pendingFailureReports.delete(pkg);
|
|
108
|
+
reportedFailures.delete(pkg);
|
|
109
|
+
pendingSuccessReports.set(pkg, version);
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* 미보고 상태를 서버로 흘려보낸다. 설치 쿨다운과 무관하게 폴링마다 1회씩 재시도하고,
|
|
113
|
+
* 전송에 성공한 것만 큐에서 지워 수렴시킨다.
|
|
114
|
+
*/
|
|
115
|
+
const flushPendingReports = async () => {
|
|
116
|
+
if (deps.onUpdateFailed) {
|
|
117
|
+
for (const [pkg, input] of [...pendingFailureReports.entries()]) {
|
|
118
|
+
try {
|
|
119
|
+
await deps.onUpdateFailed(input);
|
|
120
|
+
pendingFailureReports.delete(pkg);
|
|
121
|
+
reportedFailures.set(pkg, failureIdentity(input));
|
|
122
|
+
}
|
|
123
|
+
catch (reportError) {
|
|
124
|
+
resolvedLogger.error('Failed to report auto-update failure', {
|
|
125
|
+
error: reportError instanceof Error ? reportError.message : String(reportError),
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (deps.onUpdateSucceeded) {
|
|
131
|
+
for (const [pkg, version] of [...pendingSuccessReports.entries()]) {
|
|
132
|
+
try {
|
|
133
|
+
await deps.onUpdateSucceeded({ package: pkg, version });
|
|
134
|
+
pendingSuccessReports.delete(pkg);
|
|
135
|
+
}
|
|
136
|
+
catch (notifyError) {
|
|
137
|
+
resolvedLogger.error('Failed to notify update success', {
|
|
138
|
+
package: pkg,
|
|
139
|
+
error: notifyError instanceof Error ? notifyError.message : String(notifyError),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* 설치 직전 프리플라이트 → 설치 → 실패 분류를 한 곳에서 처리한다.
|
|
147
|
+
* 반환값은 설치 성공 여부다.
|
|
148
|
+
*/
|
|
149
|
+
const tryInstall = (pkg, packageName, version) => {
|
|
150
|
+
if (!resolveCanWriteGlobalNpmRoot(deps)) {
|
|
151
|
+
// 실행해봐야 EACCES로 죽는다. `npm install -g`를 아예 실행하지 않는다.
|
|
152
|
+
recordFailure({
|
|
153
|
+
package: pkg,
|
|
154
|
+
version,
|
|
155
|
+
reason: 'PERMISSION_DENIED',
|
|
156
|
+
message: PERMISSION_BLOCKED_HINT,
|
|
157
|
+
});
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
try {
|
|
161
|
+
installPackage(packageName, version, { runExecutableSync: resolvedRunExecutableSync });
|
|
162
|
+
recordSuccess(pkg, version);
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
const reason = classifyInstallError(error);
|
|
167
|
+
resolvedLogger.error(pkg === 'cli' ? 'CLI auto-update failed' : 'Runner auto-update failed', {
|
|
168
|
+
error: error instanceof Error ? error.message : String(error),
|
|
169
|
+
reason,
|
|
170
|
+
});
|
|
171
|
+
recordFailure({
|
|
172
|
+
package: pkg,
|
|
173
|
+
version,
|
|
174
|
+
reason,
|
|
175
|
+
message: describeInstallError(error),
|
|
176
|
+
});
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
};
|
|
40
180
|
// CLI 업데이트
|
|
41
|
-
if (meta.cliLatestVersion &&
|
|
42
|
-
|
|
181
|
+
if (meta.cliLatestVersion && shouldAttemptInstall('cli', meta.cliLatestVersion, now)) {
|
|
182
|
+
lastUpdateAttempts.set('cli', { at: now, targetVersion: meta.cliLatestVersion });
|
|
43
183
|
const currentCliVersion = getInstalledCliVersion({
|
|
44
184
|
runExecutableSync: resolvedRunExecutableSync,
|
|
45
185
|
logger: resolvedLogger,
|
|
46
186
|
});
|
|
47
187
|
if (needsUpdate(currentCliVersion, meta.cliLatestVersion)) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
installPackage(CLI_PACKAGE, meta.cliLatestVersion, {
|
|
54
|
-
runExecutableSync: resolvedRunExecutableSync,
|
|
55
|
-
});
|
|
188
|
+
resolvedLogger.info('Auto-updating CLI', {
|
|
189
|
+
currentVersion: currentCliVersion,
|
|
190
|
+
targetVersion: meta.cliLatestVersion,
|
|
191
|
+
});
|
|
192
|
+
if (tryInstall('cli', CLI_PACKAGE, meta.cliLatestVersion)) {
|
|
56
193
|
cliUpdated = true;
|
|
57
194
|
resolvedLogger.info('CLI auto-update completed', {
|
|
58
195
|
version: meta.cliLatestVersion,
|
|
59
196
|
});
|
|
60
197
|
}
|
|
61
|
-
catch (error) {
|
|
62
|
-
resolvedLogger.error('CLI auto-update failed', {
|
|
63
|
-
error: error instanceof Error ? error.message : String(error),
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
198
|
}
|
|
67
199
|
}
|
|
68
200
|
// Runner 업데이트
|
|
69
|
-
if (meta.runnerLatestVersion &&
|
|
70
|
-
|
|
201
|
+
if (meta.runnerLatestVersion && shouldAttemptInstall('runner', meta.runnerLatestVersion, now)) {
|
|
202
|
+
lastUpdateAttempts.set('runner', { at: now, targetVersion: meta.runnerLatestVersion });
|
|
71
203
|
const currentRunnerVersion = getCurrentRunnerVersion();
|
|
72
204
|
const isAlreadyInstalled = lastSuccessfulRunnerVersion === meta.runnerLatestVersion;
|
|
73
205
|
if (!isAlreadyInstalled && needsUpdate(currentRunnerVersion, meta.runnerLatestVersion)) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
installPackage(RUNNER_PACKAGE, meta.runnerLatestVersion, {
|
|
80
|
-
runExecutableSync: resolvedRunExecutableSync,
|
|
81
|
-
});
|
|
206
|
+
resolvedLogger.info('Auto-updating Runner', {
|
|
207
|
+
currentVersion: currentRunnerVersion,
|
|
208
|
+
targetVersion: meta.runnerLatestVersion,
|
|
209
|
+
});
|
|
210
|
+
if (tryInstall('runner', RUNNER_PACKAGE, meta.runnerLatestVersion)) {
|
|
82
211
|
runnerUpdated = true;
|
|
83
212
|
lastSuccessfulRunnerVersion = meta.runnerLatestVersion;
|
|
84
213
|
resolvedLogger.info('Runner auto-update completed — restart required', {
|
|
85
214
|
version: meta.runnerLatestVersion,
|
|
86
215
|
});
|
|
87
216
|
}
|
|
88
|
-
catch (error) {
|
|
89
|
-
resolvedLogger.error('Runner auto-update failed', {
|
|
90
|
-
error: error instanceof Error ? error.message : String(error),
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
// Runner 알림: 설치 성공 후 알림 미완료 시 매 폴링마다 재시도
|
|
96
|
-
if (meta.runnerLatestVersion &&
|
|
97
|
-
lastSuccessfulRunnerVersion === meta.runnerLatestVersion &&
|
|
98
|
-
lastNotifiedRunnerVersion !== meta.runnerLatestVersion &&
|
|
99
|
-
deps.onRunnerUpdated) {
|
|
100
|
-
try {
|
|
101
|
-
await deps.onRunnerUpdated(meta.runnerLatestVersion);
|
|
102
|
-
lastNotifiedRunnerVersion = meta.runnerLatestVersion;
|
|
103
|
-
}
|
|
104
|
-
catch (notifyError) {
|
|
105
|
-
resolvedLogger.error('Failed to notify runner update', {
|
|
106
|
-
error: notifyError instanceof Error ? notifyError.message : String(notifyError),
|
|
107
|
-
});
|
|
108
217
|
}
|
|
109
218
|
}
|
|
219
|
+
// 성공·실패 보고는 설치 시도와 분리해 매 폴링마다 재시도한다.
|
|
220
|
+
await flushPendingReports();
|
|
110
221
|
return { cliUpdated, runnerUpdated };
|
|
111
222
|
};
|
|
112
|
-
/** 테스트용: 쿨다운
|
|
223
|
+
/** 테스트용: 쿨다운 타이머와 실패 상태 리셋 */
|
|
113
224
|
export const resetAutoUpdateState = () => {
|
|
114
|
-
lastCliUpdateAttempt = 0;
|
|
115
|
-
lastRunnerUpdateAttempt = 0;
|
|
116
225
|
lastSuccessfulRunnerVersion = null;
|
|
117
|
-
|
|
226
|
+
lastUpdateAttempts.clear();
|
|
227
|
+
permissionBlockedVersions.clear();
|
|
228
|
+
pendingFailureReports.clear();
|
|
229
|
+
reportedFailures.clear();
|
|
230
|
+
pendingSuccessReports.clear();
|
|
118
231
|
};
|
|
119
232
|
//# sourceMappingURL=auto-update.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../../src/utils/auto-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../../src/utils/auto-update.ts"],"names":[],"mappings":"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"}
|