@agentteams/runner 0.0.109 → 0.0.110
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.js +6 -0
- package/dist/api-client.js.map +1 -1
- package/dist/api-client.test.js +21 -12
- package/dist/api-client.test.js.map +1 -1
- package/dist/handlers/trigger-handler.js +20 -0
- package/dist/handlers/trigger-handler.js.map +1 -1
- package/dist/handlers/trigger-handler.test.js +290 -7
- package/dist/handlers/trigger-handler.test.js.map +1 -1
- package/dist/utils/machine-id.d.ts +32 -0
- package/dist/utils/machine-id.js +88 -0
- package/dist/utils/machine-id.js.map +1 -0
- package/dist/utils/machine-id.test.d.ts +1 -0
- package/dist/utils/machine-id.test.js +97 -0
- package/dist/utils/machine-id.test.js.map +1 -0
- package/dist/utils/working-directory.d.ts +27 -0
- package/dist/utils/working-directory.js +96 -0
- package/dist/utils/working-directory.js.map +1 -0
- package/dist/utils/working-directory.test.d.ts +1 -0
- package/dist/utils/working-directory.test.js +145 -0
- package/dist/utils/working-directory.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
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { isGitRepo } from './git-worktree.js';
|
|
4
|
+
/**
|
|
5
|
+
* 러너가 실행 cwd로 쓰는 경로가 "그 머신에 실제로 존재하는 프로젝트"인지 판정한다.
|
|
6
|
+
*
|
|
7
|
+
* 러너는 실행 시작과 동시에 `<cwd>/.agentteams/runner/log`를 `mkdir(recursive)`로 만들기 때문에,
|
|
8
|
+
* 다른 머신에 등록된 에이전트의 authPath를 집어가면 빈 디렉터리를 새로 만들고 그 안에서 실행된다.
|
|
9
|
+
* 판정은 러너 진입 이전 단계에서 수행해야 하며(디렉터리 생성 전), 8종 러너 공통 경로인
|
|
10
|
+
* trigger handler 한 곳에서만 호출한다.
|
|
11
|
+
*/
|
|
12
|
+
export const PROJECT_MARKER_RELATIVE_PATH = join('.agentteams', 'config.json');
|
|
13
|
+
const defaultReadProjectMarker = (path) => {
|
|
14
|
+
try {
|
|
15
|
+
return readFileSync(path, 'utf8');
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
// 마커에서 projectId만 뽑는다. 형식이 깨졌거나 값이 없으면 null(=판정 불가).
|
|
22
|
+
const readMarkerProjectId = (raw) => {
|
|
23
|
+
if (!raw) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const parsed = JSON.parse(raw);
|
|
28
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const projectId = parsed.projectId;
|
|
32
|
+
return typeof projectId === 'string' && projectId.trim().length > 0 ? projectId.trim() : null;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
const WRONG_MACHINE_HINT = 'Request the run on the runner installed on the machine where this agent was registered, ' +
|
|
39
|
+
'or re-register the agent on this machine.';
|
|
40
|
+
/**
|
|
41
|
+
* 실행 직전 작업 디렉터리 검증. 부수 효과가 없는 순수 판정 함수다(디렉터리를 만들지 않는다).
|
|
42
|
+
*/
|
|
43
|
+
export function checkRunnerWorkingDirectory(authPath, dependencies = {}) {
|
|
44
|
+
const pathExists = dependencies.pathExists ?? existsSync;
|
|
45
|
+
const checkIsGitRepo = dependencies.isGitRepo ?? isGitRepo;
|
|
46
|
+
const readProjectMarker = dependencies.readProjectMarker ?? defaultReadProjectMarker;
|
|
47
|
+
const expectedProjectId = dependencies.expectedProjectId?.trim() || null;
|
|
48
|
+
const normalizedAuthPath = typeof authPath === 'string' ? authPath.trim() : '';
|
|
49
|
+
if (normalizedAuthPath.length === 0) {
|
|
50
|
+
return {
|
|
51
|
+
valid: false,
|
|
52
|
+
code: 'MISSING_AUTH_PATH',
|
|
53
|
+
reason: 'Runner workspace path is not configured for this agent; run aborted before start. ' +
|
|
54
|
+
`Set the agent's workspace path first. ${WRONG_MACHINE_HINT}`,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (!pathExists(normalizedAuthPath)) {
|
|
58
|
+
return {
|
|
59
|
+
valid: false,
|
|
60
|
+
code: 'DIRECTORY_NOT_FOUND',
|
|
61
|
+
reason: `Runner workspace ${normalizedAuthPath} does not exist on this runner, ` +
|
|
62
|
+
`so the run was aborted before start and the directory was not created. ${WRONG_MACHINE_HINT}`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const markerPath = join(normalizedAuthPath, PROJECT_MARKER_RELATIVE_PATH);
|
|
66
|
+
const hasProjectMarker = pathExists(markerPath);
|
|
67
|
+
// 마커가 있고 양쪽 projectId를 모두 아는 경우에만 프로젝트 동일성을 판정한다. "존재하는 어떤 git
|
|
68
|
+
// 저장소"라도 통과시키면, 같은 사용자명·같은 디렉터리 배치를 쓰는 흔한 환경에서 다른 머신의
|
|
69
|
+
// 트리거가 무관한 저장소에 그대로 맞아떨어져 이 검증이 없애려던 조용한 오실행이 남는다.
|
|
70
|
+
if (hasProjectMarker && expectedProjectId) {
|
|
71
|
+
const markerProjectId = readMarkerProjectId(readProjectMarker(markerPath));
|
|
72
|
+
if (markerProjectId && markerProjectId !== expectedProjectId) {
|
|
73
|
+
return {
|
|
74
|
+
valid: false,
|
|
75
|
+
code: 'PROJECT_MISMATCH',
|
|
76
|
+
reason: `Runner workspace ${normalizedAuthPath} belongs to a different AgentTeams project ` +
|
|
77
|
+
`(${PROJECT_MARKER_RELATIVE_PATH} projectId ${markerProjectId} != ${expectedProjectId}); ` +
|
|
78
|
+
`run aborted before start. ${WRONG_MACHINE_HINT}`,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
if (markerProjectId) {
|
|
82
|
+
return { valid: true };
|
|
83
|
+
}
|
|
84
|
+
// 마커를 읽지 못했거나 projectId가 없으면 판정 불가로 보고 아래 폴백으로 내려간다.
|
|
85
|
+
}
|
|
86
|
+
if (hasProjectMarker || checkIsGitRepo(normalizedAuthPath)) {
|
|
87
|
+
return { valid: true };
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
valid: false,
|
|
91
|
+
code: 'NOT_A_PROJECT_DIRECTORY',
|
|
92
|
+
reason: `Runner workspace ${normalizedAuthPath} exists on this runner but is neither a git repository nor an ` +
|
|
93
|
+
`AgentTeams project (no ${PROJECT_MARKER_RELATIVE_PATH}); run aborted before start. ${WRONG_MACHINE_HINT}`,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=working-directory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"working-directory.js","sourceRoot":"","sources":["../../src/utils/working-directory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test from 'node:test';
|
|
3
|
+
import { execFileSync } from 'node:child_process';
|
|
4
|
+
import { existsSync } from 'node:fs';
|
|
5
|
+
import { mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises';
|
|
6
|
+
import { tmpdir } from 'node:os';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { checkRunnerWorkingDirectory } from './working-directory.js';
|
|
9
|
+
const withTempDir = async (run) => {
|
|
10
|
+
const dir = await mkdtemp(join(tmpdir(), 'working-directory-test-'));
|
|
11
|
+
try {
|
|
12
|
+
await run(dir);
|
|
13
|
+
}
|
|
14
|
+
finally {
|
|
15
|
+
await rm(dir, { recursive: true, force: true });
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
test('checkRunnerWorkingDirectory rejects a missing authPath', () => {
|
|
19
|
+
for (const value of [null, undefined, '', ' ']) {
|
|
20
|
+
const result = checkRunnerWorkingDirectory(value);
|
|
21
|
+
assert.equal(result.valid, false);
|
|
22
|
+
assert.equal(result.valid === false && result.code, 'MISSING_AUTH_PATH');
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
test('checkRunnerWorkingDirectory rejects a path that does not exist on this runner', () => {
|
|
26
|
+
const result = checkRunnerWorkingDirectory('/missing/workspace', {
|
|
27
|
+
pathExists: () => false,
|
|
28
|
+
isGitRepo: () => true,
|
|
29
|
+
});
|
|
30
|
+
assert.equal(result.valid, false);
|
|
31
|
+
assert.equal(result.valid === false && result.code, 'DIRECTORY_NOT_FOUND');
|
|
32
|
+
assert.match(result.valid === false ? result.reason : '', /does not exist on this runner/);
|
|
33
|
+
assert.match(result.valid === false ? result.reason : '', /machine where this agent was registered/);
|
|
34
|
+
});
|
|
35
|
+
test('checkRunnerWorkingDirectory accepts a directory that has the AgentTeams project marker', () => {
|
|
36
|
+
const checkedPaths = [];
|
|
37
|
+
const result = checkRunnerWorkingDirectory('/workspace', {
|
|
38
|
+
pathExists: (path) => {
|
|
39
|
+
checkedPaths.push(path);
|
|
40
|
+
return true;
|
|
41
|
+
},
|
|
42
|
+
isGitRepo: () => {
|
|
43
|
+
throw new Error('isGitRepo should not run once the project marker is found');
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
assert.deepEqual(result, { valid: true });
|
|
47
|
+
assert.deepEqual(checkedPaths, ['/workspace', join('/workspace', '.agentteams', 'config.json')]);
|
|
48
|
+
});
|
|
49
|
+
test('checkRunnerWorkingDirectory accepts a git repository without the project marker', () => {
|
|
50
|
+
const result = checkRunnerWorkingDirectory('/workspace', {
|
|
51
|
+
pathExists: (path) => path === '/workspace',
|
|
52
|
+
isGitRepo: () => true,
|
|
53
|
+
});
|
|
54
|
+
assert.deepEqual(result, { valid: true });
|
|
55
|
+
});
|
|
56
|
+
test('checkRunnerWorkingDirectory rejects a directory that is neither a git repo nor a project', () => {
|
|
57
|
+
const result = checkRunnerWorkingDirectory('/workspace', {
|
|
58
|
+
pathExists: (path) => path === '/workspace',
|
|
59
|
+
isGitRepo: () => false,
|
|
60
|
+
});
|
|
61
|
+
assert.equal(result.valid, false);
|
|
62
|
+
assert.equal(result.valid === false && result.code, 'NOT_A_PROJECT_DIRECTORY');
|
|
63
|
+
assert.match(result.valid === false ? result.reason : '', /\.agentteams[\\/]config\.json/);
|
|
64
|
+
});
|
|
65
|
+
test('checkRunnerWorkingDirectory rejects a marker that belongs to a different project', () => {
|
|
66
|
+
const result = checkRunnerWorkingDirectory('/workspace', {
|
|
67
|
+
pathExists: () => true,
|
|
68
|
+
isGitRepo: () => {
|
|
69
|
+
throw new Error('the git fallback must not rescue a project mismatch');
|
|
70
|
+
},
|
|
71
|
+
readProjectMarker: () => JSON.stringify({ projectId: 'other-project' }),
|
|
72
|
+
expectedProjectId: 'this-project',
|
|
73
|
+
});
|
|
74
|
+
assert.equal(result.valid, false);
|
|
75
|
+
assert.equal(result.valid === false && result.code, 'PROJECT_MISMATCH');
|
|
76
|
+
assert.match(result.valid === false ? result.reason : '', /other-project/);
|
|
77
|
+
assert.match(result.valid === false ? result.reason : '', /this-project/);
|
|
78
|
+
});
|
|
79
|
+
test('checkRunnerWorkingDirectory accepts a marker whose projectId matches the trigger', () => {
|
|
80
|
+
const result = checkRunnerWorkingDirectory('/workspace', {
|
|
81
|
+
pathExists: () => true,
|
|
82
|
+
isGitRepo: () => {
|
|
83
|
+
throw new Error('isGitRepo should not run once the project marker matches');
|
|
84
|
+
},
|
|
85
|
+
readProjectMarker: () => JSON.stringify({ projectId: 'this-project' }),
|
|
86
|
+
expectedProjectId: 'this-project',
|
|
87
|
+
});
|
|
88
|
+
assert.deepEqual(result, { valid: true });
|
|
89
|
+
});
|
|
90
|
+
test('checkRunnerWorkingDirectory falls back to the git check when the marker is unreadable', () => {
|
|
91
|
+
// 마커를 읽지 못하거나 projectId가 없으면 "다른 프로젝트"라고 단정할 수 없으므로 기존 판정으로 내려간다.
|
|
92
|
+
for (const marker of [null, 'not json', JSON.stringify({ teamId: 'team-1' })]) {
|
|
93
|
+
const result = checkRunnerWorkingDirectory('/workspace', {
|
|
94
|
+
pathExists: () => true,
|
|
95
|
+
isGitRepo: () => false,
|
|
96
|
+
readProjectMarker: () => marker,
|
|
97
|
+
expectedProjectId: 'this-project',
|
|
98
|
+
});
|
|
99
|
+
assert.deepEqual(result, { valid: true }, `marker=${String(marker)}`);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
test('checkRunnerWorkingDirectory skips the project check when the trigger has no projectId', () => {
|
|
103
|
+
const result = checkRunnerWorkingDirectory('/workspace', {
|
|
104
|
+
pathExists: () => true,
|
|
105
|
+
isGitRepo: () => false,
|
|
106
|
+
readProjectMarker: () => JSON.stringify({ projectId: 'other-project' }),
|
|
107
|
+
expectedProjectId: null,
|
|
108
|
+
});
|
|
109
|
+
assert.deepEqual(result, { valid: true });
|
|
110
|
+
});
|
|
111
|
+
test('checkRunnerWorkingDirectory judges real directories without creating anything', async () => {
|
|
112
|
+
await withTempDir(async (dir) => {
|
|
113
|
+
const missing = join(dir, 'not-created');
|
|
114
|
+
const missingResult = checkRunnerWorkingDirectory(missing);
|
|
115
|
+
assert.equal(missingResult.valid, false);
|
|
116
|
+
assert.equal(missingResult.valid === false && missingResult.code, 'DIRECTORY_NOT_FOUND');
|
|
117
|
+
assert.equal(existsSync(missing), false);
|
|
118
|
+
const emptyDir = join(dir, 'empty');
|
|
119
|
+
await mkdir(emptyDir);
|
|
120
|
+
const emptyResult = checkRunnerWorkingDirectory(emptyDir);
|
|
121
|
+
assert.equal(emptyResult.valid, false);
|
|
122
|
+
assert.equal(emptyResult.valid === false && emptyResult.code, 'NOT_A_PROJECT_DIRECTORY');
|
|
123
|
+
const markerDir = join(dir, 'marker');
|
|
124
|
+
await mkdir(join(markerDir, '.agentteams'), { recursive: true });
|
|
125
|
+
await writeFile(join(markerDir, '.agentteams', 'config.json'), '{}\n', 'utf8');
|
|
126
|
+
assert.deepEqual(checkRunnerWorkingDirectory(markerDir), { valid: true });
|
|
127
|
+
const otherProjectDir = join(dir, 'other-project');
|
|
128
|
+
await mkdir(join(otherProjectDir, '.agentteams'), { recursive: true });
|
|
129
|
+
await writeFile(join(otherProjectDir, '.agentteams', 'config.json'), `${JSON.stringify({ projectId: 'project-b' })}\n`, 'utf8');
|
|
130
|
+
const mismatchResult = checkRunnerWorkingDirectory(otherProjectDir, { expectedProjectId: 'project-a' });
|
|
131
|
+
assert.equal(mismatchResult.valid, false);
|
|
132
|
+
assert.equal(mismatchResult.valid === false && mismatchResult.code, 'PROJECT_MISMATCH');
|
|
133
|
+
assert.deepEqual(checkRunnerWorkingDirectory(otherProjectDir, { expectedProjectId: 'project-b' }), {
|
|
134
|
+
valid: true,
|
|
135
|
+
});
|
|
136
|
+
const repoDir = join(dir, 'repo');
|
|
137
|
+
await mkdir(repoDir);
|
|
138
|
+
execFileSync('git', ['init'], { cwd: repoDir, stdio: 'ignore' });
|
|
139
|
+
assert.deepEqual(checkRunnerWorkingDirectory(repoDir), { valid: true });
|
|
140
|
+
const worktreeParent = join(repoDir, 'nested');
|
|
141
|
+
await mkdir(worktreeParent);
|
|
142
|
+
assert.deepEqual(checkRunnerWorkingDirectory(worktreeParent), { valid: true });
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
//# sourceMappingURL=working-directory.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"working-directory.test.js","sourceRoot":"","sources":["../../src/utils/working-directory.test.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.110",
|
|
4
4
|
"platform": "win32",
|
|
5
5
|
"arch": "x64",
|
|
6
6
|
"fileName": "agentrunner-launcher.exe",
|
|
7
|
-
"sha256": "
|
|
7
|
+
"sha256": "f7ca6584f5f6184dfd3c73106b5f5dd420a4397ccd99e51f6c9c5851db5b4888"
|
|
8
8
|
}
|