@agentteams/runner 0.0.84 → 0.0.85-dev.209
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 +2 -2
- package/dist/api-client.js +66 -66
- package/dist/api-client.js.map +1 -1
- package/dist/api-client.test.js +63 -54
- package/dist/api-client.test.js.map +1 -1
- package/dist/autostart.js +81 -81
- package/dist/autostart.js.map +1 -1
- package/dist/autostart.test.js +35 -35
- package/dist/autostart.test.js.map +1 -1
- package/dist/commands/cleanup.js +4 -4
- package/dist/commands/init.js +14 -14
- package/dist/commands/restart.js +3 -3
- package/dist/commands/start.js +10 -10
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.js +7 -7
- package/dist/commands/stop.js +7 -7
- package/dist/commands/uninstall.js +6 -6
- package/dist/commands/update.d.ts +4 -4
- package/dist/commands/update.js +20 -22
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/update.test.js +38 -42
- package/dist/commands/update.test.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +12 -12
- package/dist/config.test.js +61 -61
- package/dist/config.test.js.map +1 -1
- package/dist/daemon-control.d.ts +5 -5
- package/dist/daemon-control.js +21 -22
- package/dist/daemon-control.js.map +1 -1
- package/dist/daemon-control.test.js +29 -29
- package/dist/executable.d.ts +3 -3
- package/dist/executable.js +46 -49
- package/dist/executable.js.map +1 -1
- package/dist/executable.test.js +62 -62
- package/dist/executable.test.js.map +1 -1
- package/dist/handlers/trigger-handler.d.ts +6 -6
- package/dist/handlers/trigger-handler.js +172 -134
- package/dist/handlers/trigger-handler.js.map +1 -1
- package/dist/handlers/trigger-handler.test.js +442 -328
- package/dist/handlers/trigger-handler.test.js.map +1 -1
- package/dist/index.js +25 -25
- package/dist/logger.js +1 -1
- package/dist/pid.js +6 -6
- package/dist/poller.d.ts +7 -7
- package/dist/poller.js +54 -53
- package/dist/poller.js.map +1 -1
- package/dist/poller.test.js +209 -181
- package/dist/poller.test.js.map +1 -1
- package/dist/runners/amp.d.ts +1 -1
- package/dist/runners/amp.js +74 -81
- package/dist/runners/amp.js.map +1 -1
- package/dist/runners/antigravity.d.ts +3 -3
- package/dist/runners/antigravity.js +116 -127
- package/dist/runners/antigravity.js.map +1 -1
- package/dist/runners/antigravity.replay.test.js +25 -25
- package/dist/runners/antigravity.replay.test.js.map +1 -1
- package/dist/runners/antigravity.test.js +98 -98
- package/dist/runners/antigravity.test.js.map +1 -1
- package/dist/runners/claude-code.d.ts +1 -1
- package/dist/runners/claude-code.js +85 -84
- package/dist/runners/claude-code.js.map +1 -1
- package/dist/runners/claude-code.test.js +37 -40
- package/dist/runners/claude-code.test.js.map +1 -1
- package/dist/runners/codex.d.ts +1 -1
- package/dist/runners/codex.js +87 -96
- package/dist/runners/codex.js.map +1 -1
- package/dist/runners/codex.test.js +68 -68
- package/dist/runners/codex.test.js.map +1 -1
- package/dist/runners/index.d.ts +1 -1
- package/dist/runners/index.js +10 -10
- package/dist/runners/index.test.js +16 -16
- package/dist/runners/log-reporter.d.ts +2 -2
- package/dist/runners/log-reporter.js +12 -10
- package/dist/runners/log-reporter.js.map +1 -1
- package/dist/runners/log-reporter.test.js +70 -70
- package/dist/runners/log-reporter.test.js.map +1 -1
- package/dist/runners/opencode.d.ts +1 -1
- package/dist/runners/opencode.js +68 -75
- package/dist/runners/opencode.js.map +1 -1
- package/dist/runners/process-control.d.ts +1 -1
- package/dist/runners/process-control.js +13 -11
- package/dist/runners/process-control.js.map +1 -1
- package/dist/runners/stream-json-parser.d.ts +1 -1
- package/dist/runners/stream-json-parser.js +70 -67
- package/dist/runners/stream-json-parser.js.map +1 -1
- package/dist/runners/stream-json-parser.replay.test.js +17 -17
- package/dist/runners/stream-json-parser.replay.test.js.map +1 -1
- package/dist/runners/stream-json-parser.test.js +76 -78
- package/dist/runners/stream-json-parser.test.js.map +1 -1
- package/dist/types.d.ts +4 -4
- package/dist/utils/auth-path-store.js +7 -7
- package/dist/utils/auth-path-store.test.js +24 -29
- package/dist/utils/auth-path-store.test.js.map +1 -1
- package/dist/utils/auto-update.d.ts +4 -4
- package/dist/utils/auto-update.js +30 -28
- package/dist/utils/auto-update.js.map +1 -1
- package/dist/utils/auto-update.test.js +30 -30
- package/dist/utils/convention-evaluator.d.ts +1 -1
- package/dist/utils/convention-evaluator.js +22 -21
- package/dist/utils/convention-evaluator.js.map +1 -1
- package/dist/utils/convention-evaluator.test.js +120 -110
- package/dist/utils/convention-evaluator.test.js.map +1 -1
- package/dist/utils/convention-sync.d.ts +3 -3
- package/dist/utils/convention-sync.js +10 -10
- package/dist/utils/convention-sync.test.js +43 -25
- package/dist/utils/convention-sync.test.js.map +1 -1
- package/dist/utils/git-worktree.js +20 -18
- package/dist/utils/git-worktree.js.map +1 -1
- package/dist/utils/git-worktree.test.js +98 -98
- package/dist/utils/git-worktree.test.js.map +1 -1
- package/dist/utils/origin-issue-safeguard.js +35 -30
- package/dist/utils/origin-issue-safeguard.js.map +1 -1
- package/dist/utils/power-save-blocker.d.ts +4 -4
- package/dist/utils/power-save-blocker.js +33 -33
- package/dist/utils/power-save-blocker.test.js +37 -37
- package/dist/utils/power-save-blocker.test.js.map +1 -1
- package/dist/utils/runner-cleanup.d.ts +3 -3
- package/dist/utils/runner-cleanup.js +13 -13
- package/dist/utils/runner-cleanup.test.js +35 -35
- package/dist/utils/runner-history.js +3 -3
- package/dist/utils/runner-history.test.js +17 -17
- package/package.json +9 -2
- package/readme.md +10 -10
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
* 러너 히스토리에서 플랜 생성이 감지되면,
|
|
6
6
|
* `agentteams plan issue` CLI를 실행하여 이슈를 연결합니다.
|
|
7
7
|
*/
|
|
8
|
-
import { execFile } from
|
|
9
|
-
import { readFile } from
|
|
10
|
-
import { logger } from
|
|
8
|
+
import { execFile } from 'node:child_process';
|
|
9
|
+
import { readFile } from 'node:fs/promises';
|
|
10
|
+
import { logger } from '../logger.js';
|
|
11
11
|
const ENTITY_TYPE_TO_PROVIDER = {
|
|
12
|
-
GITHUB_ISSUE:
|
|
13
|
-
GITLAB_ISSUE:
|
|
14
|
-
LINEAR_ISSUE:
|
|
12
|
+
GITHUB_ISSUE: 'GITHUB',
|
|
13
|
+
GITLAB_ISSUE: 'GITLAB',
|
|
14
|
+
LINEAR_ISSUE: 'LINEAR',
|
|
15
15
|
};
|
|
16
16
|
const ISSUE_ENTITY_TYPES = new Set(Object.keys(ENTITY_TYPE_TO_PROVIDER));
|
|
17
17
|
/**
|
|
@@ -30,7 +30,7 @@ function extractIssueRefsFromText(text) {
|
|
|
30
30
|
continue;
|
|
31
31
|
const provider = ENTITY_TYPE_TO_PROVIDER[entityType];
|
|
32
32
|
// rest may be "id" or "id:url" — for LINEAR_ISSUE it's typically a UUID
|
|
33
|
-
const entityId = rest.split(
|
|
33
|
+
const entityId = rest.split(':')[0];
|
|
34
34
|
if (!entityId)
|
|
35
35
|
continue;
|
|
36
36
|
const key = `${provider}:${entityId}`;
|
|
@@ -40,7 +40,7 @@ function extractIssueRefsFromText(text) {
|
|
|
40
40
|
results.push({
|
|
41
41
|
provider,
|
|
42
42
|
externalId: entityId,
|
|
43
|
-
externalUrl:
|
|
43
|
+
externalUrl: '', // URL not available from text format
|
|
44
44
|
externalTitle: label || undefined,
|
|
45
45
|
});
|
|
46
46
|
}
|
|
@@ -53,14 +53,14 @@ function extractIssueRefsFromTiptap(content) {
|
|
|
53
53
|
const results = [];
|
|
54
54
|
const seen = new Set();
|
|
55
55
|
function walk(node) {
|
|
56
|
-
if (node.type ===
|
|
56
|
+
if (node.type === 'entityReference' && node.attrs) {
|
|
57
57
|
const attrs = node.attrs;
|
|
58
58
|
const entityType = attrs.entityType;
|
|
59
59
|
const provider = ENTITY_TYPE_TO_PROVIDER[entityType];
|
|
60
60
|
if (provider) {
|
|
61
|
-
const entityId = attrs.entityId ??
|
|
62
|
-
const htmlUrl = attrs.htmlUrl ??
|
|
63
|
-
const label = attrs.label ??
|
|
61
|
+
const entityId = attrs.entityId ?? '';
|
|
62
|
+
const htmlUrl = attrs.htmlUrl ?? '';
|
|
63
|
+
const label = attrs.label ?? '';
|
|
64
64
|
if (entityId) {
|
|
65
65
|
const key = `${provider}:${entityId}`;
|
|
66
66
|
if (!seen.has(key)) {
|
|
@@ -88,7 +88,7 @@ function extractIssueRefsFromTiptap(content) {
|
|
|
88
88
|
* 프롬프트에서 이슈 참조를 추출합니다 (문자열 / Tiptap JSON 모두 지원).
|
|
89
89
|
*/
|
|
90
90
|
export function extractIssueRefsFromPrompt(prompt) {
|
|
91
|
-
if (typeof prompt ===
|
|
91
|
+
if (typeof prompt === 'string') {
|
|
92
92
|
return extractIssueRefsFromText(prompt);
|
|
93
93
|
}
|
|
94
94
|
return extractIssueRefsFromTiptap(prompt);
|
|
@@ -105,14 +105,14 @@ function extractCreatedPlanIds(historyMarkdown) {
|
|
|
105
105
|
// Pattern 3: UUID-like strings after "plan create" or "Plan created" context
|
|
106
106
|
const uuidPattern = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi;
|
|
107
107
|
// Look for lines that suggest plan creation
|
|
108
|
-
const lines = historyMarkdown.split(
|
|
108
|
+
const lines = historyMarkdown.split('\n');
|
|
109
109
|
for (const line of lines) {
|
|
110
110
|
const lower = line.toLowerCase();
|
|
111
|
-
if (lower.includes(
|
|
112
|
-
lower.includes(
|
|
113
|
-
lower.includes(
|
|
114
|
-
lower.includes(
|
|
115
|
-
lower.includes(
|
|
111
|
+
if (lower.includes('plan create') ||
|
|
112
|
+
lower.includes('plan created') ||
|
|
113
|
+
lower.includes('creating plan') ||
|
|
114
|
+
lower.includes('plan-id') ||
|
|
115
|
+
lower.includes('planid')) {
|
|
116
116
|
const matches = line.match(uuidPattern);
|
|
117
117
|
if (matches) {
|
|
118
118
|
for (const id of matches) {
|
|
@@ -132,19 +132,24 @@ function extractCreatedPlanIds(historyMarkdown) {
|
|
|
132
132
|
function execPlanIssue(cwd, planId, issue) {
|
|
133
133
|
return new Promise((resolve) => {
|
|
134
134
|
const args = [
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
135
|
+
'plan',
|
|
136
|
+
'issue',
|
|
137
|
+
'--id',
|
|
138
|
+
planId,
|
|
139
|
+
'--provider',
|
|
140
|
+
issue.provider,
|
|
141
|
+
'--external-id',
|
|
142
|
+
issue.externalId,
|
|
143
|
+
'--external-url',
|
|
144
|
+
issue.externalUrl || 'unknown',
|
|
140
145
|
];
|
|
141
146
|
if (issue.externalTitle) {
|
|
142
|
-
args.push(
|
|
147
|
+
args.push('--title', issue.externalTitle);
|
|
143
148
|
}
|
|
144
|
-
execFile(
|
|
149
|
+
execFile('agentteams', args, { cwd, timeout: 15000, windowsHide: true }, (error) => {
|
|
145
150
|
if (error) {
|
|
146
151
|
// 409 or other failure — skip silently
|
|
147
|
-
logger.warn(
|
|
152
|
+
logger.warn('Origin issue safeguard: plan issue command failed', {
|
|
148
153
|
planId,
|
|
149
154
|
provider: issue.provider,
|
|
150
155
|
externalId: issue.externalId,
|
|
@@ -170,7 +175,7 @@ export async function runOriginIssueSafeguard(prompt, historyPath, authPath) {
|
|
|
170
175
|
// 2. 히스토리에서 플랜 생성 감지
|
|
171
176
|
let historyContent;
|
|
172
177
|
try {
|
|
173
|
-
historyContent = await readFile(historyPath,
|
|
178
|
+
historyContent = await readFile(historyPath, 'utf8');
|
|
174
179
|
}
|
|
175
180
|
catch {
|
|
176
181
|
return; // 히스토리 파일 없으면 중단
|
|
@@ -179,7 +184,7 @@ export async function runOriginIssueSafeguard(prompt, historyPath, authPath) {
|
|
|
179
184
|
if (planIds.length === 0)
|
|
180
185
|
return;
|
|
181
186
|
// 3. 각 플랜 × 이슈 조합에 대해 CLI 실행
|
|
182
|
-
logger.info(
|
|
187
|
+
logger.info('Origin issue safeguard: linking issues to plans', {
|
|
183
188
|
planIds,
|
|
184
189
|
issueCount: issueRefs.length,
|
|
185
190
|
});
|
|
@@ -190,7 +195,7 @@ export async function runOriginIssueSafeguard(prompt, historyPath, authPath) {
|
|
|
190
195
|
}
|
|
191
196
|
}
|
|
192
197
|
catch (error) {
|
|
193
|
-
logger.warn(
|
|
198
|
+
logger.warn('Origin issue safeguard failed (non-blocking)', {
|
|
194
199
|
error: error instanceof Error ? error.message : String(error),
|
|
195
200
|
});
|
|
196
201
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"origin-issue-safeguard.js","sourceRoot":"","sources":["../../src/utils/origin-issue-safeguard.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"origin-issue-safeguard.js","sourceRoot":"","sources":["../../src/utils/origin-issue-safeguard.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { execFileSync, spawn } from
|
|
2
|
-
import { logger } from
|
|
3
|
-
export type PowerSource =
|
|
1
|
+
import { execFileSync, spawn } from 'node:child_process';
|
|
2
|
+
import { logger } from '../logger.js';
|
|
3
|
+
export type PowerSource = 'AC' | 'BATTERY' | 'UNKNOWN';
|
|
4
4
|
export type PowerSaveBlocker = {
|
|
5
5
|
acquire: (label?: string) => () => void;
|
|
6
6
|
};
|
|
@@ -8,7 +8,7 @@ type PowerSaveBlockerDeps = {
|
|
|
8
8
|
platform?: () => NodeJS.Platform;
|
|
9
9
|
spawn?: typeof spawn;
|
|
10
10
|
execFileSync?: typeof execFileSync;
|
|
11
|
-
logger?: Pick<typeof logger,
|
|
11
|
+
logger?: Pick<typeof logger, 'info' | 'warn'>;
|
|
12
12
|
setInterval?: typeof global.setInterval;
|
|
13
13
|
clearInterval?: typeof global.clearInterval;
|
|
14
14
|
recheckIntervalMs?: number;
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import { execFileSync, spawn } from
|
|
2
|
-
import { platform as osPlatform } from
|
|
3
|
-
import { logger } from
|
|
1
|
+
import { execFileSync, spawn } from 'node:child_process';
|
|
2
|
+
import { platform as osPlatform } from 'node:os';
|
|
3
|
+
import { logger } from '../logger.js';
|
|
4
4
|
// launchd 환경에서는 PATH가 비어 있을 수 있으므로 macOS 시스템 바이너리는 절대 경로로 호출한다.
|
|
5
|
-
const CAFFEINATE_PATH =
|
|
6
|
-
const PMSET_PATH =
|
|
5
|
+
const CAFFEINATE_PATH = '/usr/bin/caffeinate';
|
|
6
|
+
const PMSET_PATH = '/usr/bin/pmset';
|
|
7
7
|
// -i: 시스템 idle 절전 방지, -m: 디스크 idle 절전 방지, -s: 시스템 절전 방지(AC 전원에서만 유효)
|
|
8
|
-
const DEFAULT_CAFFEINATE_ARGS = [
|
|
8
|
+
const DEFAULT_CAFFEINATE_ARGS = ['-i', '-m', '-s'];
|
|
9
9
|
// 실행 도중 배터리로 전환되는 경우를 감지하기 위한 전원 상태 재확인 주기
|
|
10
10
|
const DEFAULT_POWER_RECHECK_INTERVAL_MS = 30_000;
|
|
11
11
|
// `pmset -g batt`의 첫 줄은 "Now drawing from 'AC Power'" 또는 "Now drawing from 'Battery Power'" 형태다.
|
|
12
12
|
export const parsePowerSource = (output) => {
|
|
13
13
|
const match = output.match(/Now drawing from '([^']+)'/i);
|
|
14
14
|
if (!match) {
|
|
15
|
-
return
|
|
15
|
+
return 'UNKNOWN';
|
|
16
16
|
}
|
|
17
17
|
const source = match[1].toLowerCase();
|
|
18
|
-
if (source.includes(
|
|
19
|
-
return
|
|
18
|
+
if (source.includes('ac')) {
|
|
19
|
+
return 'AC';
|
|
20
20
|
}
|
|
21
|
-
if (source.includes(
|
|
22
|
-
return
|
|
21
|
+
if (source.includes('battery')) {
|
|
22
|
+
return 'BATTERY';
|
|
23
23
|
}
|
|
24
|
-
return
|
|
24
|
+
return 'UNKNOWN';
|
|
25
25
|
};
|
|
26
26
|
const noopRelease = () => { };
|
|
27
27
|
export const createPowerSaveBlocker = (deps = {}) => {
|
|
@@ -34,20 +34,20 @@ export const createPowerSaveBlocker = (deps = {}) => {
|
|
|
34
34
|
const recheckIntervalMs = deps.recheckIntervalMs ?? DEFAULT_POWER_RECHECK_INTERVAL_MS;
|
|
35
35
|
const caffeinateArgs = deps.caffeinateArgs ?? DEFAULT_CAFFEINATE_ARGS;
|
|
36
36
|
// 기능 토글이 꺼져 있거나 macOS가 아니면 전부 no-op으로 동작한다.
|
|
37
|
-
const supported = (deps.enabled ?? true) && platform() ===
|
|
37
|
+
const supported = (deps.enabled ?? true) && platform() === 'darwin';
|
|
38
38
|
let activeSessions = 0;
|
|
39
39
|
let caffeinate = null;
|
|
40
40
|
let monitorInterval = null;
|
|
41
41
|
const readPowerSource = () => {
|
|
42
42
|
try {
|
|
43
|
-
const output = String(execFileSyncFn(PMSET_PATH, [
|
|
43
|
+
const output = String(execFileSyncFn(PMSET_PATH, ['-g', 'batt'], { encoding: 'utf8' }));
|
|
44
44
|
return parsePowerSource(output);
|
|
45
45
|
}
|
|
46
46
|
catch (error) {
|
|
47
|
-
log.warn(
|
|
48
|
-
error: error instanceof Error ? error.message : String(error)
|
|
47
|
+
log.warn('Failed to read power source via pmset', {
|
|
48
|
+
error: error instanceof Error ? error.message : String(error),
|
|
49
49
|
});
|
|
50
|
-
return
|
|
50
|
+
return 'UNKNOWN';
|
|
51
51
|
}
|
|
52
52
|
};
|
|
53
53
|
const startCaffeinate = () => {
|
|
@@ -55,26 +55,26 @@ export const createPowerSaveBlocker = (deps = {}) => {
|
|
|
55
55
|
return;
|
|
56
56
|
}
|
|
57
57
|
try {
|
|
58
|
-
const child = spawnFn(CAFFEINATE_PATH, caffeinateArgs, { stdio:
|
|
59
|
-
child.on(
|
|
60
|
-
log.warn(
|
|
61
|
-
error: error instanceof Error ? error.message : String(error)
|
|
58
|
+
const child = spawnFn(CAFFEINATE_PATH, caffeinateArgs, { stdio: 'ignore' });
|
|
59
|
+
child.on('error', (error) => {
|
|
60
|
+
log.warn('caffeinate process failed', {
|
|
61
|
+
error: error instanceof Error ? error.message : String(error),
|
|
62
62
|
});
|
|
63
63
|
if (caffeinate === child) {
|
|
64
64
|
caffeinate = null;
|
|
65
65
|
}
|
|
66
66
|
});
|
|
67
|
-
child.on(
|
|
67
|
+
child.on('exit', () => {
|
|
68
68
|
if (caffeinate === child) {
|
|
69
69
|
caffeinate = null;
|
|
70
70
|
}
|
|
71
71
|
});
|
|
72
72
|
caffeinate = child;
|
|
73
|
-
log.info(
|
|
73
|
+
log.info('Sleep prevention started', { pid: child.pid ?? null, args: caffeinateArgs });
|
|
74
74
|
}
|
|
75
75
|
catch (error) {
|
|
76
|
-
log.warn(
|
|
77
|
-
error: error instanceof Error ? error.message : String(error)
|
|
76
|
+
log.warn('Failed to start caffeinate', {
|
|
77
|
+
error: error instanceof Error ? error.message : String(error),
|
|
78
78
|
});
|
|
79
79
|
}
|
|
80
80
|
};
|
|
@@ -85,12 +85,12 @@ export const createPowerSaveBlocker = (deps = {}) => {
|
|
|
85
85
|
const child = caffeinate;
|
|
86
86
|
caffeinate = null;
|
|
87
87
|
try {
|
|
88
|
-
child.kill(
|
|
88
|
+
child.kill('SIGTERM');
|
|
89
89
|
}
|
|
90
90
|
catch {
|
|
91
91
|
// 이미 종료되었거나 종료할 수 없는 경우 무시한다.
|
|
92
92
|
}
|
|
93
|
-
log.info(
|
|
93
|
+
log.info('Sleep prevention stopped', { reason });
|
|
94
94
|
};
|
|
95
95
|
// 의도한 상태(세션 존재 && AC 전원)와 실제 caffeinate 실행 여부를 일치시킨다.
|
|
96
96
|
const reconcile = () => {
|
|
@@ -98,15 +98,15 @@ export const createPowerSaveBlocker = (deps = {}) => {
|
|
|
98
98
|
return;
|
|
99
99
|
}
|
|
100
100
|
if (activeSessions <= 0) {
|
|
101
|
-
stopCaffeinate(
|
|
101
|
+
stopCaffeinate('no-active-sessions');
|
|
102
102
|
return;
|
|
103
103
|
}
|
|
104
104
|
const source = readPowerSource();
|
|
105
|
-
if (source ===
|
|
105
|
+
if (source === 'AC') {
|
|
106
106
|
startCaffeinate();
|
|
107
107
|
}
|
|
108
108
|
else {
|
|
109
|
-
stopCaffeinate(source ===
|
|
109
|
+
stopCaffeinate(source === 'BATTERY' ? 'on-battery' : 'power-source-unknown');
|
|
110
110
|
}
|
|
111
111
|
};
|
|
112
112
|
const startMonitor = () => {
|
|
@@ -115,7 +115,7 @@ export const createPowerSaveBlocker = (deps = {}) => {
|
|
|
115
115
|
}
|
|
116
116
|
monitorInterval = setIntervalFn(() => reconcile(), recheckIntervalMs);
|
|
117
117
|
// 절전 방지 모니터가 데몬 종료를 막지 않도록 unref 처리한다.
|
|
118
|
-
if (typeof monitorInterval.unref ===
|
|
118
|
+
if (typeof monitorInterval.unref === 'function') {
|
|
119
119
|
monitorInterval.unref();
|
|
120
120
|
}
|
|
121
121
|
};
|
|
@@ -132,8 +132,8 @@ export const createPowerSaveBlocker = (deps = {}) => {
|
|
|
132
132
|
}
|
|
133
133
|
activeSessions += 1;
|
|
134
134
|
const source = readPowerSource();
|
|
135
|
-
if (source !==
|
|
136
|
-
log.info(
|
|
135
|
+
if (source !== 'AC') {
|
|
136
|
+
log.info('Sleep prevention skipped while on battery or unknown power', { source, label: label ?? null });
|
|
137
137
|
}
|
|
138
138
|
reconcile();
|
|
139
139
|
startMonitor();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import assert from
|
|
2
|
-
import { EventEmitter } from
|
|
3
|
-
import test from
|
|
4
|
-
import { createPowerSaveBlocker, parsePowerSource } from
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { EventEmitter } from 'node:events';
|
|
3
|
+
import test from 'node:test';
|
|
4
|
+
import { createPowerSaveBlocker, parsePowerSource } from './power-save-blocker.js';
|
|
5
5
|
const AC_OUTPUT = "Now drawing from 'AC Power'\n -InternalBattery-0 (id=123)\t100%; charged; 0:00 remaining present: true";
|
|
6
6
|
const BATTERY_OUTPUT = "Now drawing from 'Battery Power'\n -InternalBattery-0 (id=123)\t80%; discharging; 3:20 remaining present: true";
|
|
7
7
|
const createFakeChild = (pid) => {
|
|
@@ -16,59 +16,59 @@ const createFakeChild = (pid) => {
|
|
|
16
16
|
};
|
|
17
17
|
const silentLogger = {
|
|
18
18
|
info: () => undefined,
|
|
19
|
-
warn: () => undefined
|
|
19
|
+
warn: () => undefined,
|
|
20
20
|
};
|
|
21
21
|
// setInterval/clearInterval를 주입해 모니터 루프가 실제 타이머를 만들지 않게 한다.
|
|
22
22
|
const noopTimers = {
|
|
23
23
|
setInterval: (() => ({ unref: () => undefined })),
|
|
24
|
-
clearInterval: (() => undefined)
|
|
24
|
+
clearInterval: (() => undefined),
|
|
25
25
|
};
|
|
26
|
-
test(
|
|
27
|
-
assert.equal(parsePowerSource(AC_OUTPUT),
|
|
28
|
-
assert.equal(parsePowerSource(BATTERY_OUTPUT),
|
|
29
|
-
assert.equal(parsePowerSource(
|
|
26
|
+
test('parsePowerSource detects AC, battery, and unknown sources', () => {
|
|
27
|
+
assert.equal(parsePowerSource(AC_OUTPUT), 'AC');
|
|
28
|
+
assert.equal(parsePowerSource(BATTERY_OUTPUT), 'BATTERY');
|
|
29
|
+
assert.equal(parsePowerSource('garbage output'), 'UNKNOWN');
|
|
30
30
|
});
|
|
31
|
-
test(
|
|
31
|
+
test('acquire spawns caffeinate on macOS while on AC power', () => {
|
|
32
32
|
const spawned = [];
|
|
33
33
|
const child = createFakeChild(4242);
|
|
34
34
|
const blocker = createPowerSaveBlocker({
|
|
35
|
-
platform: () =>
|
|
35
|
+
platform: () => 'darwin',
|
|
36
36
|
execFileSync: (() => AC_OUTPUT),
|
|
37
37
|
spawn: ((command, args) => {
|
|
38
38
|
spawned.push({ command, args });
|
|
39
39
|
return child;
|
|
40
40
|
}),
|
|
41
41
|
logger: silentLogger,
|
|
42
|
-
...noopTimers
|
|
42
|
+
...noopTimers,
|
|
43
43
|
});
|
|
44
|
-
const release = blocker.acquire(
|
|
44
|
+
const release = blocker.acquire('trigger-1');
|
|
45
45
|
assert.equal(spawned.length, 1);
|
|
46
|
-
assert.equal(spawned[0]?.command,
|
|
47
|
-
assert.deepEqual(spawned[0]?.args, [
|
|
46
|
+
assert.equal(spawned[0]?.command, '/usr/bin/caffeinate');
|
|
47
|
+
assert.deepEqual(spawned[0]?.args, ['-i', '-m', '-s']);
|
|
48
48
|
release();
|
|
49
49
|
assert.equal(child.killed, true);
|
|
50
50
|
});
|
|
51
|
-
test(
|
|
51
|
+
test('acquire is a no-op while on battery power', () => {
|
|
52
52
|
let spawnCalls = 0;
|
|
53
53
|
const blocker = createPowerSaveBlocker({
|
|
54
|
-
platform: () =>
|
|
54
|
+
platform: () => 'darwin',
|
|
55
55
|
execFileSync: (() => BATTERY_OUTPUT),
|
|
56
56
|
spawn: (() => {
|
|
57
57
|
spawnCalls += 1;
|
|
58
58
|
return createFakeChild(1);
|
|
59
59
|
}),
|
|
60
60
|
logger: silentLogger,
|
|
61
|
-
...noopTimers
|
|
61
|
+
...noopTimers,
|
|
62
62
|
});
|
|
63
63
|
const release = blocker.acquire();
|
|
64
64
|
assert.equal(spawnCalls, 0);
|
|
65
65
|
release();
|
|
66
66
|
});
|
|
67
|
-
test(
|
|
67
|
+
test('acquire is a no-op on non-macOS platforms', () => {
|
|
68
68
|
let spawnCalls = 0;
|
|
69
69
|
let pmsetCalls = 0;
|
|
70
70
|
const blocker = createPowerSaveBlocker({
|
|
71
|
-
platform: () =>
|
|
71
|
+
platform: () => 'linux',
|
|
72
72
|
execFileSync: (() => {
|
|
73
73
|
pmsetCalls += 1;
|
|
74
74
|
return AC_OUTPUT;
|
|
@@ -78,17 +78,17 @@ test("acquire is a no-op on non-macOS platforms", () => {
|
|
|
78
78
|
return createFakeChild(1);
|
|
79
79
|
}),
|
|
80
80
|
logger: silentLogger,
|
|
81
|
-
...noopTimers
|
|
81
|
+
...noopTimers,
|
|
82
82
|
});
|
|
83
83
|
const release = blocker.acquire();
|
|
84
84
|
assert.equal(spawnCalls, 0);
|
|
85
85
|
assert.equal(pmsetCalls, 0);
|
|
86
86
|
release();
|
|
87
87
|
});
|
|
88
|
-
test(
|
|
88
|
+
test('acquire is a no-op when the feature is disabled', () => {
|
|
89
89
|
let spawnCalls = 0;
|
|
90
90
|
const blocker = createPowerSaveBlocker({
|
|
91
|
-
platform: () =>
|
|
91
|
+
platform: () => 'darwin',
|
|
92
92
|
enabled: false,
|
|
93
93
|
execFileSync: (() => AC_OUTPUT),
|
|
94
94
|
spawn: (() => {
|
|
@@ -96,12 +96,12 @@ test("acquire is a no-op when the feature is disabled", () => {
|
|
|
96
96
|
return createFakeChild(1);
|
|
97
97
|
}),
|
|
98
98
|
logger: silentLogger,
|
|
99
|
-
...noopTimers
|
|
99
|
+
...noopTimers,
|
|
100
100
|
});
|
|
101
101
|
blocker.acquire()();
|
|
102
102
|
assert.equal(spawnCalls, 0);
|
|
103
103
|
});
|
|
104
|
-
test(
|
|
104
|
+
test('release can be called multiple times without killing twice', () => {
|
|
105
105
|
let killCount = 0;
|
|
106
106
|
const child = createFakeChild(7);
|
|
107
107
|
child.kill = () => {
|
|
@@ -110,11 +110,11 @@ test("release can be called multiple times without killing twice", () => {
|
|
|
110
110
|
return true;
|
|
111
111
|
};
|
|
112
112
|
const blocker = createPowerSaveBlocker({
|
|
113
|
-
platform: () =>
|
|
113
|
+
platform: () => 'darwin',
|
|
114
114
|
execFileSync: (() => AC_OUTPUT),
|
|
115
115
|
spawn: (() => child),
|
|
116
116
|
logger: silentLogger,
|
|
117
|
-
...noopTimers
|
|
117
|
+
...noopTimers,
|
|
118
118
|
});
|
|
119
119
|
const release = blocker.acquire();
|
|
120
120
|
release();
|
|
@@ -122,21 +122,21 @@ test("release can be called multiple times without killing twice", () => {
|
|
|
122
122
|
release();
|
|
123
123
|
assert.equal(killCount, 1);
|
|
124
124
|
});
|
|
125
|
-
test(
|
|
125
|
+
test('concurrent sessions keep caffeinate alive until the last release', () => {
|
|
126
126
|
let spawnCalls = 0;
|
|
127
127
|
const child = createFakeChild(9);
|
|
128
128
|
const blocker = createPowerSaveBlocker({
|
|
129
|
-
platform: () =>
|
|
129
|
+
platform: () => 'darwin',
|
|
130
130
|
execFileSync: (() => AC_OUTPUT),
|
|
131
131
|
spawn: (() => {
|
|
132
132
|
spawnCalls += 1;
|
|
133
133
|
return child;
|
|
134
134
|
}),
|
|
135
135
|
logger: silentLogger,
|
|
136
|
-
...noopTimers
|
|
136
|
+
...noopTimers,
|
|
137
137
|
});
|
|
138
|
-
const releaseA = blocker.acquire(
|
|
139
|
-
const releaseB = blocker.acquire(
|
|
138
|
+
const releaseA = blocker.acquire('a');
|
|
139
|
+
const releaseB = blocker.acquire('b');
|
|
140
140
|
// 두 세션이 동일한 caffeinate 프로세스를 공유한다.
|
|
141
141
|
assert.equal(spawnCalls, 1);
|
|
142
142
|
releaseA();
|
|
@@ -144,12 +144,12 @@ test("concurrent sessions keep caffeinate alive until the last release", () => {
|
|
|
144
144
|
releaseB();
|
|
145
145
|
assert.equal(child.killed, true);
|
|
146
146
|
});
|
|
147
|
-
test(
|
|
147
|
+
test('monitor releases caffeinate when power switches to battery mid-run', () => {
|
|
148
148
|
let powerOutput = AC_OUTPUT;
|
|
149
149
|
const monitorTicks = [];
|
|
150
150
|
const child = createFakeChild(11);
|
|
151
151
|
const blocker = createPowerSaveBlocker({
|
|
152
|
-
platform: () =>
|
|
152
|
+
platform: () => 'darwin',
|
|
153
153
|
execFileSync: (() => powerOutput),
|
|
154
154
|
spawn: (() => child),
|
|
155
155
|
logger: silentLogger,
|
|
@@ -157,13 +157,13 @@ test("monitor releases caffeinate when power switches to battery mid-run", () =>
|
|
|
157
157
|
monitorTicks.push(handler);
|
|
158
158
|
return { unref: () => undefined };
|
|
159
159
|
}),
|
|
160
|
-
clearInterval: (() => undefined)
|
|
160
|
+
clearInterval: (() => undefined),
|
|
161
161
|
});
|
|
162
162
|
blocker.acquire();
|
|
163
163
|
assert.equal(child.killed, false);
|
|
164
164
|
// 배터리로 전환된 뒤 모니터가 동작하면 caffeinate가 종료되어야 한다.
|
|
165
165
|
powerOutput = BATTERY_OUTPUT;
|
|
166
|
-
assert.equal(monitorTicks.length, 1,
|
|
166
|
+
assert.equal(monitorTicks.length, 1, 'monitor interval should be registered');
|
|
167
167
|
monitorTicks[0]?.();
|
|
168
168
|
assert.equal(child.killed, true);
|
|
169
169
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"power-save-blocker.test.js","sourceRoot":"","sources":["../../src/utils/power-save-blocker.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEnF,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"power-save-blocker.test.js","sourceRoot":"","sources":["../../src/utils/power-save-blocker.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { readdir, stat, unlink } from
|
|
2
|
-
import { logger } from
|
|
1
|
+
import { readdir, stat, unlink } from 'node:fs/promises';
|
|
2
|
+
import { logger } from '../logger.js';
|
|
3
3
|
type CleanupDeps = {
|
|
4
4
|
readdir?: typeof readdir;
|
|
5
5
|
stat?: typeof stat;
|
|
6
6
|
unlink?: typeof unlink;
|
|
7
|
-
logger?: Pick<typeof logger,
|
|
7
|
+
logger?: Pick<typeof logger, 'info' | 'warn'>;
|
|
8
8
|
};
|
|
9
9
|
export declare const runCleanup: (authPath: string, deps?: CleanupDeps) => Promise<void>;
|
|
10
10
|
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { readdir, stat, unlink } from
|
|
2
|
-
import { join } from
|
|
3
|
-
import { logger } from
|
|
1
|
+
import { readdir, stat, unlink } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { logger } from '../logger.js';
|
|
4
4
|
const LOG_TTL_MS = 6 * 60 * 60 * 1000;
|
|
5
5
|
const HISTORY_TTL_MS = 3 * 24 * 60 * 60 * 1000;
|
|
6
6
|
const purgeExpiredFiles = async (directory, ttlMs, deps) => {
|
|
@@ -10,7 +10,7 @@ const purgeExpiredFiles = async (directory, ttlMs, deps) => {
|
|
|
10
10
|
entries = await deps.readdir(directory);
|
|
11
11
|
}
|
|
12
12
|
catch (error) {
|
|
13
|
-
if (error.code ===
|
|
13
|
+
if (error.code === 'ENOENT') {
|
|
14
14
|
return 0;
|
|
15
15
|
}
|
|
16
16
|
throw error;
|
|
@@ -26,12 +26,12 @@ const purgeExpiredFiles = async (directory, ttlMs, deps) => {
|
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
catch (error) {
|
|
29
|
-
if (error.code ===
|
|
29
|
+
if (error.code === 'ENOENT') {
|
|
30
30
|
continue;
|
|
31
31
|
}
|
|
32
|
-
deps.logger.warn(
|
|
32
|
+
deps.logger.warn('Failed to delete expired file', {
|
|
33
33
|
filePath,
|
|
34
|
-
error: error instanceof Error ? error.message : String(error)
|
|
34
|
+
error: error instanceof Error ? error.message : String(error),
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
37
|
}
|
|
@@ -42,18 +42,18 @@ export const runCleanup = async (authPath, deps = {}) => {
|
|
|
42
42
|
readdir: deps.readdir ?? readdir,
|
|
43
43
|
stat: deps.stat ?? stat,
|
|
44
44
|
unlink: deps.unlink ?? unlink,
|
|
45
|
-
logger: deps.logger ?? logger
|
|
45
|
+
logger: deps.logger ?? logger,
|
|
46
46
|
};
|
|
47
|
-
const logDir = join(authPath,
|
|
48
|
-
const historyDir = join(authPath,
|
|
47
|
+
const logDir = join(authPath, '.agentteams', 'runner', 'log');
|
|
48
|
+
const historyDir = join(authPath, '.agentteams', 'runner', 'history');
|
|
49
49
|
const [logDeleted, historyDeleted] = await Promise.all([
|
|
50
50
|
purgeExpiredFiles(logDir, LOG_TTL_MS, resolvedDeps),
|
|
51
|
-
purgeExpiredFiles(historyDir, HISTORY_TTL_MS, resolvedDeps)
|
|
51
|
+
purgeExpiredFiles(historyDir, HISTORY_TTL_MS, resolvedDeps),
|
|
52
52
|
]);
|
|
53
|
-
resolvedDeps.logger.info(
|
|
53
|
+
resolvedDeps.logger.info('Runner cleanup completed', {
|
|
54
54
|
authPath,
|
|
55
55
|
logDeleted,
|
|
56
|
-
historyDeleted
|
|
56
|
+
historyDeleted,
|
|
57
57
|
});
|
|
58
58
|
};
|
|
59
59
|
//# sourceMappingURL=runner-cleanup.js.map
|