@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
package/dist/config.test.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import assert from
|
|
2
|
-
import { mkdtemp, readFile, rm } from
|
|
3
|
-
import { tmpdir } from
|
|
4
|
-
import { join } from
|
|
5
|
-
import test from
|
|
6
|
-
import { getDaemonConfigPath, readDaemonConfigFile, resolveApiUrlForInit, resolveRuntimeConfig, writeDaemonConfigFile } from
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { mkdtemp, readFile, rm } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import test from 'node:test';
|
|
6
|
+
import { getDaemonConfigPath, readDaemonConfigFile, resolveApiUrlForInit, resolveRuntimeConfig, writeDaemonConfigFile, } from './config.js';
|
|
7
7
|
const envKeys = [
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
8
|
+
'HOME',
|
|
9
|
+
'USERPROFILE',
|
|
10
|
+
'HOMEDRIVE',
|
|
11
|
+
'HOMEPATH',
|
|
12
|
+
'AGENTTEAMS_DAEMON_TOKEN',
|
|
13
|
+
'AGENTTEAMS_API_URL',
|
|
14
|
+
'POLLING_INTERVAL_MS',
|
|
15
|
+
'IDLE_TIMEOUT_MS',
|
|
16
|
+
'TIMEOUT_MS',
|
|
17
|
+
'RUNNER_CMD',
|
|
18
|
+
'DAEMON_PREVENT_SLEEP',
|
|
19
19
|
];
|
|
20
20
|
const withTempHome = async (run) => {
|
|
21
21
|
const previousEnv = new Map();
|
|
@@ -23,11 +23,11 @@ const withTempHome = async (run) => {
|
|
|
23
23
|
previousEnv.set(key, process.env[key]);
|
|
24
24
|
delete process.env[key];
|
|
25
25
|
}
|
|
26
|
-
const homeDir = await mkdtemp(join(tmpdir(),
|
|
26
|
+
const homeDir = await mkdtemp(join(tmpdir(), 'daemon-config-test-'));
|
|
27
27
|
process.env.HOME = homeDir;
|
|
28
28
|
process.env.USERPROFILE = homeDir;
|
|
29
|
-
process.env.HOMEDRIVE =
|
|
30
|
-
process.env.HOMEPATH =
|
|
29
|
+
process.env.HOMEDRIVE = '';
|
|
30
|
+
process.env.HOMEPATH = '';
|
|
31
31
|
try {
|
|
32
32
|
await run(homeDir);
|
|
33
33
|
}
|
|
@@ -44,100 +44,100 @@ const withTempHome = async (run) => {
|
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
};
|
|
47
|
-
test(
|
|
47
|
+
test('readDaemonConfigFile returns null when config file does not exist', async () => {
|
|
48
48
|
await withTempHome(async () => {
|
|
49
49
|
const result = await readDaemonConfigFile();
|
|
50
50
|
assert.equal(result, null);
|
|
51
51
|
});
|
|
52
52
|
});
|
|
53
|
-
test(
|
|
53
|
+
test('writeDaemonConfigFile creates the config directory and file', async () => {
|
|
54
54
|
await withTempHome(async () => {
|
|
55
55
|
const filePath = await writeDaemonConfigFile({
|
|
56
|
-
daemonToken:
|
|
57
|
-
apiUrl:
|
|
56
|
+
daemonToken: 'file-token',
|
|
57
|
+
apiUrl: 'https://file.example',
|
|
58
58
|
});
|
|
59
59
|
assert.equal(filePath, getDaemonConfigPath());
|
|
60
|
-
const content = await readFile(filePath,
|
|
60
|
+
const content = await readFile(filePath, 'utf8');
|
|
61
61
|
assert.deepEqual(JSON.parse(content), {
|
|
62
|
-
daemonToken:
|
|
63
|
-
apiUrl:
|
|
62
|
+
daemonToken: 'file-token',
|
|
63
|
+
apiUrl: 'https://file.example',
|
|
64
64
|
});
|
|
65
65
|
});
|
|
66
66
|
});
|
|
67
|
-
test(
|
|
67
|
+
test('readDaemonConfigFile returns null for invalid or incomplete JSON', async () => {
|
|
68
68
|
await withTempHome(async () => {
|
|
69
69
|
const filePath = getDaemonConfigPath();
|
|
70
70
|
await writeDaemonConfigFile({
|
|
71
|
-
daemonToken:
|
|
72
|
-
apiUrl:
|
|
71
|
+
daemonToken: 'file-token',
|
|
72
|
+
apiUrl: 'https://file.example',
|
|
73
73
|
});
|
|
74
|
-
await readFile(filePath,
|
|
75
|
-
await import(
|
|
74
|
+
await readFile(filePath, 'utf8');
|
|
75
|
+
await import('node:fs/promises').then(({ writeFile }) => writeFile(filePath, '{invalid', 'utf8'));
|
|
76
76
|
assert.equal(await readDaemonConfigFile(), null);
|
|
77
|
-
await import(
|
|
77
|
+
await import('node:fs/promises').then(({ writeFile }) => writeFile(filePath, JSON.stringify({ daemonToken: 'only-token' }), 'utf8'));
|
|
78
78
|
assert.equal(await readDaemonConfigFile(), null);
|
|
79
79
|
});
|
|
80
80
|
});
|
|
81
|
-
test(
|
|
81
|
+
test('resolveRuntimeConfig prefers environment variables and applies numeric parsing fallbacks', async () => {
|
|
82
82
|
await withTempHome(async () => {
|
|
83
83
|
await writeDaemonConfigFile({
|
|
84
|
-
daemonToken:
|
|
85
|
-
apiUrl:
|
|
84
|
+
daemonToken: 'file-token',
|
|
85
|
+
apiUrl: 'https://file.example',
|
|
86
86
|
});
|
|
87
|
-
process.env.AGENTTEAMS_DAEMON_TOKEN =
|
|
88
|
-
process.env.AGENTTEAMS_API_URL =
|
|
89
|
-
process.env.POLLING_INTERVAL_MS =
|
|
90
|
-
process.env.TIMEOUT_MS =
|
|
91
|
-
process.env.RUNNER_CMD =
|
|
87
|
+
process.env.AGENTTEAMS_DAEMON_TOKEN = 'env-token';
|
|
88
|
+
process.env.AGENTTEAMS_API_URL = 'https://env.example';
|
|
89
|
+
process.env.POLLING_INTERVAL_MS = '-10';
|
|
90
|
+
process.env.TIMEOUT_MS = '1234.7';
|
|
91
|
+
process.env.RUNNER_CMD = 'codex';
|
|
92
92
|
const result = await resolveRuntimeConfig();
|
|
93
93
|
assert.deepEqual(result, {
|
|
94
|
-
daemonToken:
|
|
95
|
-
apiUrl:
|
|
94
|
+
daemonToken: 'env-token',
|
|
95
|
+
apiUrl: 'https://env.example',
|
|
96
96
|
pollingIntervalMs: 30_000,
|
|
97
97
|
timeoutMs: 1234,
|
|
98
98
|
idleTimeoutMs: 600_000,
|
|
99
|
-
runnerCmd:
|
|
100
|
-
preventSleepWhileBusy: true
|
|
99
|
+
runnerCmd: 'codex',
|
|
100
|
+
preventSleepWhileBusy: true,
|
|
101
101
|
});
|
|
102
102
|
});
|
|
103
103
|
});
|
|
104
|
-
test(
|
|
104
|
+
test('resolveRuntimeConfig disables sleep prevention when DAEMON_PREVENT_SLEEP is falsy', async () => {
|
|
105
105
|
await withTempHome(async () => {
|
|
106
|
-
process.env.AGENTTEAMS_DAEMON_TOKEN =
|
|
107
|
-
process.env.DAEMON_PREVENT_SLEEP =
|
|
106
|
+
process.env.AGENTTEAMS_DAEMON_TOKEN = 'env-token';
|
|
107
|
+
process.env.DAEMON_PREVENT_SLEEP = 'false';
|
|
108
108
|
const result = await resolveRuntimeConfig();
|
|
109
109
|
assert.equal(result.preventSleepWhileBusy, false);
|
|
110
110
|
});
|
|
111
111
|
});
|
|
112
|
-
test(
|
|
112
|
+
test('resolveRuntimeConfig uses the 24-hour fail-safe timeout by default', async () => {
|
|
113
113
|
await withTempHome(async () => {
|
|
114
114
|
await writeDaemonConfigFile({
|
|
115
|
-
daemonToken:
|
|
116
|
-
apiUrl:
|
|
115
|
+
daemonToken: 'file-token',
|
|
116
|
+
apiUrl: 'https://file.example',
|
|
117
117
|
});
|
|
118
118
|
const result = await resolveRuntimeConfig();
|
|
119
119
|
assert.equal(result.timeoutMs, 86_400_000);
|
|
120
120
|
assert.equal(result.idleTimeoutMs, 600_000);
|
|
121
121
|
});
|
|
122
122
|
});
|
|
123
|
-
test(
|
|
123
|
+
test('resolveRuntimeConfig throws when daemon token is missing', async () => {
|
|
124
124
|
await withTempHome(async () => {
|
|
125
125
|
await assert.rejects(() => resolveRuntimeConfig(), /Daemon token is missing/);
|
|
126
126
|
});
|
|
127
127
|
});
|
|
128
|
-
test(
|
|
128
|
+
test('resolveApiUrlForInit resolves in argument, env, file, default order', async () => {
|
|
129
129
|
await withTempHome(async () => {
|
|
130
|
-
assert.equal(await resolveApiUrlForInit(
|
|
131
|
-
process.env.AGENTTEAMS_API_URL =
|
|
132
|
-
assert.equal(await resolveApiUrlForInit(),
|
|
130
|
+
assert.equal(await resolveApiUrlForInit(' https://arg.example '), 'https://arg.example');
|
|
131
|
+
process.env.AGENTTEAMS_API_URL = 'https://env.example';
|
|
132
|
+
assert.equal(await resolveApiUrlForInit(), 'https://env.example');
|
|
133
133
|
delete process.env.AGENTTEAMS_API_URL;
|
|
134
134
|
await writeDaemonConfigFile({
|
|
135
|
-
daemonToken:
|
|
136
|
-
apiUrl:
|
|
135
|
+
daemonToken: 'file-token',
|
|
136
|
+
apiUrl: 'https://file.example',
|
|
137
137
|
});
|
|
138
|
-
assert.equal(await resolveApiUrlForInit(),
|
|
139
|
-
await import(
|
|
140
|
-
assert.equal(await resolveApiUrlForInit(),
|
|
138
|
+
assert.equal(await resolveApiUrlForInit(), 'https://file.example');
|
|
139
|
+
await import('node:fs/promises').then(({ rm }) => rm(getDaemonConfigPath(), { force: true }));
|
|
140
|
+
assert.equal(await resolveApiUrlForInit(), 'https://api.agentteams.run');
|
|
141
141
|
});
|
|
142
142
|
});
|
|
143
143
|
//# sourceMappingURL=config.test.js.map
|
package/dist/config.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon-control.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { platform as getPlatform } from
|
|
2
|
-
import { getAutostartStatus, restartAutostartService } from
|
|
3
|
-
import { logger } from
|
|
1
|
+
import { platform as getPlatform } from 'node:os';
|
|
2
|
+
import { getAutostartStatus, restartAutostartService } from './autostart.js';
|
|
3
|
+
import { logger } from './logger.js';
|
|
4
4
|
type RunningDaemonStatus = {
|
|
5
5
|
running: boolean;
|
|
6
6
|
pid: number | null;
|
|
@@ -15,14 +15,14 @@ type RestartDeps = {
|
|
|
15
15
|
spawnDetachedDaemon?: () => DetachedChildProcess | void;
|
|
16
16
|
kill?: typeof process.kill;
|
|
17
17
|
sleep?: (milliseconds: number) => Promise<void>;
|
|
18
|
-
logger?: Pick<typeof logger,
|
|
18
|
+
logger?: Pick<typeof logger, 'info'>;
|
|
19
19
|
};
|
|
20
20
|
type ExecuteRestartDeps = {
|
|
21
21
|
getAutostartStatus?: typeof getAutostartStatus;
|
|
22
22
|
spawnDetachedDaemon?: () => DetachedChildProcess | void;
|
|
23
23
|
platform?: typeof getPlatform;
|
|
24
24
|
processExit?: (code: number) => never;
|
|
25
|
-
logger?: Pick<typeof logger,
|
|
25
|
+
logger?: Pick<typeof logger, 'info'>;
|
|
26
26
|
};
|
|
27
27
|
export declare const spawnDetachedDaemon: () => DetachedChildProcess | void;
|
|
28
28
|
export declare const executeRestartRequest: (deps?: ExecuteRestartDeps) => void;
|
package/dist/daemon-control.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { setTimeout as delay } from
|
|
2
|
-
import { platform as getPlatform } from
|
|
3
|
-
import { getAutostartStatus, launchWindowsHiddenDaemon, restartAutostartService } from
|
|
4
|
-
import { logger } from
|
|
5
|
-
import { getDaemonStatus } from
|
|
6
|
-
import { spawnExecutable } from
|
|
1
|
+
import { setTimeout as delay } from 'node:timers/promises';
|
|
2
|
+
import { platform as getPlatform } from 'node:os';
|
|
3
|
+
import { getAutostartStatus, launchWindowsHiddenDaemon, restartAutostartService } from './autostart.js';
|
|
4
|
+
import { logger } from './logger.js';
|
|
5
|
+
import { getDaemonStatus } from './pid.js';
|
|
6
|
+
import { spawnExecutable } from './executable.js';
|
|
7
7
|
const restartPollIntervalMs = 100;
|
|
8
8
|
const stopTimeoutMs = 10_000;
|
|
9
9
|
const waitForDaemonToStop = async (pid, deps) => {
|
|
10
|
-
deps.kill(pid,
|
|
10
|
+
deps.kill(pid, 'SIGTERM');
|
|
11
11
|
const deadline = Date.now() + stopTimeoutMs;
|
|
12
12
|
while (Date.now() < deadline) {
|
|
13
13
|
await deps.sleep(restartPollIntervalMs);
|
|
@@ -23,15 +23,15 @@ export const spawnDetachedDaemon = () => {
|
|
|
23
23
|
// which flashes a console window even with `windowsHide: true` because the
|
|
24
24
|
// `.cmd` shim creates its own console host. Use the hidden VBS launcher
|
|
25
25
|
// instead so users never see a terminal pop up.
|
|
26
|
-
if (getPlatform() ===
|
|
26
|
+
if (getPlatform() === 'win32') {
|
|
27
27
|
launchWindowsHiddenDaemon();
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
|
-
const child = spawnExecutable(
|
|
30
|
+
const child = spawnExecutable('agentrunner', ['start'], {
|
|
31
31
|
detached: true,
|
|
32
|
-
stdio:
|
|
32
|
+
stdio: 'ignore',
|
|
33
33
|
env: process.env,
|
|
34
|
-
cwd: process.cwd()
|
|
34
|
+
cwd: process.cwd(),
|
|
35
35
|
});
|
|
36
36
|
child.unref();
|
|
37
37
|
return child;
|
|
@@ -47,19 +47,18 @@ export const executeRestartRequest = (deps = {}) => {
|
|
|
47
47
|
const exitProcess = deps.processExit ?? ((code) => process.exit(code));
|
|
48
48
|
const resolvedLogger = deps.logger ?? logger;
|
|
49
49
|
const autostartStatus = resolvedGetAutostartStatus();
|
|
50
|
-
const supervisedRespawn = autostartStatus.registered &&
|
|
51
|
-
(autostartStatus.platform === "launchd" || autostartStatus.platform === "systemd");
|
|
50
|
+
const supervisedRespawn = autostartStatus.registered && (autostartStatus.platform === 'launchd' || autostartStatus.platform === 'systemd');
|
|
52
51
|
if (supervisedRespawn) {
|
|
53
|
-
resolvedLogger.info(
|
|
54
|
-
platform: autostartStatus.platform
|
|
52
|
+
resolvedLogger.info('Restart requested — exiting non-zero so the OS supervisor restarts the daemon', {
|
|
53
|
+
platform: autostartStatus.platform,
|
|
55
54
|
});
|
|
56
55
|
exitProcess(1);
|
|
57
56
|
return;
|
|
58
57
|
}
|
|
59
|
-
resolvedLogger.info(
|
|
58
|
+
resolvedLogger.info('Restart requested — spawning new daemon and exiting', {
|
|
60
59
|
platform: autostartStatus.platform,
|
|
61
60
|
registered: autostartStatus.registered,
|
|
62
|
-
osPlatform: resolvedPlatform
|
|
61
|
+
osPlatform: resolvedPlatform,
|
|
63
62
|
});
|
|
64
63
|
resolvedSpawnDetachedDaemon();
|
|
65
64
|
exitProcess(0);
|
|
@@ -74,22 +73,22 @@ export const restartDaemon = async (deps = {}) => {
|
|
|
74
73
|
const resolvedLogger = deps.logger ?? logger;
|
|
75
74
|
const daemonStatus = await resolvedGetDaemonStatus();
|
|
76
75
|
if (daemonStatus.running && daemonStatus.pid !== null) {
|
|
77
|
-
resolvedLogger.info(
|
|
76
|
+
resolvedLogger.info('Stopping AgentRunner before restart', { pid: daemonStatus.pid });
|
|
78
77
|
await waitForDaemonToStop(daemonStatus.pid, {
|
|
79
78
|
getDaemonStatus: resolvedGetDaemonStatus,
|
|
80
79
|
kill: resolvedKill,
|
|
81
|
-
sleep: resolvedSleep
|
|
80
|
+
sleep: resolvedSleep,
|
|
82
81
|
});
|
|
83
82
|
}
|
|
84
83
|
const autostartStatus = resolvedGetAutostartStatus();
|
|
85
84
|
if (autostartStatus.registered) {
|
|
86
|
-
resolvedLogger.info(
|
|
87
|
-
platform: autostartStatus.platform
|
|
85
|
+
resolvedLogger.info('Restarting AgentRunner via registered autostart service', {
|
|
86
|
+
platform: autostartStatus.platform,
|
|
88
87
|
});
|
|
89
88
|
await resolvedRestartAutostartService();
|
|
90
89
|
return;
|
|
91
90
|
}
|
|
92
|
-
resolvedLogger.info(
|
|
91
|
+
resolvedLogger.info('Starting AgentRunner in background without autostart registration');
|
|
93
92
|
resolvedSpawnDetachedDaemon();
|
|
94
93
|
};
|
|
95
94
|
//# sourceMappingURL=daemon-control.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-control.js","sourceRoot":"","sources":["../src/daemon-control.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACxG,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AA6BlD,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,aAAa,GAAG,MAAM,CAAC;AAE7B,MAAM,mBAAmB,GAAG,KAAK,EAC/B,GAAW,EACX,IAAuE,EACxD,EAAE;IACjB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAE1B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC;IAC5C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,6CAA6C,GAAG,WAAW,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAgC,EAAE;IACnE,2EAA2E;IAC3E,2EAA2E;IAC3E,wEAAwE;IACxE,gDAAgD;IAChD,IAAI,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;QAC9B,yBAAyB,EAAE,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,eAAe,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,EAAE;QACtD,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,QAAQ;QACf,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;KACnB,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,4EAA4E;AAC5E,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,OAA2B,EAAE,EAAQ,EAAE;IAC3E,MAAM,0BAA0B,GAAG,IAAI,CAAC,kBAAkB,IAAI,kBAAkB,CAAC;IACjF,MAAM,2BAA2B,GAAG,IAAI,CAAC,mBAAmB,IAAI,mBAAmB,CAAC;IACpF,MAAM,gBAAgB,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,WAAW,CAAC,EAAE,CAAC;IAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/E,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC;IAE7C,MAAM,eAAe,GAAG,0BAA0B,EAAE,CAAC;IACrD,MAAM,iBAAiB,GACrB,eAAe,CAAC,UAAU
|
|
1
|
+
{"version":3,"file":"daemon-control.js","sourceRoot":"","sources":["../src/daemon-control.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import assert from
|
|
2
|
-
import test from
|
|
3
|
-
import { executeRestartRequest, restartDaemon } from
|
|
4
|
-
test(
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test from 'node:test';
|
|
3
|
+
import { executeRestartRequest, restartDaemon } from './daemon-control.js';
|
|
4
|
+
test('restartDaemon stops running daemon and restarts via autostart when registered', async () => {
|
|
5
5
|
const signals = [];
|
|
6
6
|
let statusChecks = 0;
|
|
7
7
|
let restarted = false;
|
|
@@ -13,7 +13,7 @@ test("restartDaemon stops running daemon and restarts via autostart when registe
|
|
|
13
13
|
}
|
|
14
14
|
return { running: false, pid: null };
|
|
15
15
|
},
|
|
16
|
-
getAutostartStatus: () => ({ registered: true, platform:
|
|
16
|
+
getAutostartStatus: () => ({ registered: true, platform: 'systemd' }),
|
|
17
17
|
restartAutostartService: async () => {
|
|
18
18
|
restarted = true;
|
|
19
19
|
},
|
|
@@ -22,97 +22,97 @@ test("restartDaemon stops running daemon and restarts via autostart when registe
|
|
|
22
22
|
return true;
|
|
23
23
|
},
|
|
24
24
|
sleep: async () => undefined,
|
|
25
|
-
logger: { info: () => undefined }
|
|
25
|
+
logger: { info: () => undefined },
|
|
26
26
|
});
|
|
27
|
-
assert.deepEqual(signals, [{ pid: 4321, signal:
|
|
27
|
+
assert.deepEqual(signals, [{ pid: 4321, signal: 'SIGTERM' }]);
|
|
28
28
|
assert.equal(restarted, true);
|
|
29
29
|
});
|
|
30
|
-
test(
|
|
30
|
+
test('restartDaemon starts detached daemon when autostart is not registered', async () => {
|
|
31
31
|
let started = false;
|
|
32
32
|
await restartDaemon({
|
|
33
33
|
getDaemonStatus: async () => ({ running: false, pid: null }),
|
|
34
|
-
getAutostartStatus: () => ({ registered: false, platform:
|
|
34
|
+
getAutostartStatus: () => ({ registered: false, platform: 'manual' }),
|
|
35
35
|
restartAutostartService: async () => {
|
|
36
|
-
throw new Error(
|
|
36
|
+
throw new Error('should not restart autostart');
|
|
37
37
|
},
|
|
38
38
|
spawnDetachedDaemon: () => {
|
|
39
39
|
started = true;
|
|
40
40
|
return {
|
|
41
|
-
unref: () => undefined
|
|
41
|
+
unref: () => undefined,
|
|
42
42
|
};
|
|
43
43
|
},
|
|
44
|
-
logger: { info: () => undefined }
|
|
44
|
+
logger: { info: () => undefined },
|
|
45
45
|
});
|
|
46
46
|
assert.equal(started, true);
|
|
47
47
|
});
|
|
48
|
-
test(
|
|
48
|
+
test('executeRestartRequest exits non-zero when supervised by launchd', () => {
|
|
49
49
|
const exitCodes = [];
|
|
50
50
|
let spawned = false;
|
|
51
51
|
executeRestartRequest({
|
|
52
|
-
getAutostartStatus: () => ({ registered: true, platform:
|
|
52
|
+
getAutostartStatus: () => ({ registered: true, platform: 'launchd' }),
|
|
53
53
|
spawnDetachedDaemon: () => {
|
|
54
54
|
spawned = true;
|
|
55
55
|
},
|
|
56
|
-
platform: () =>
|
|
56
|
+
platform: () => 'darwin',
|
|
57
57
|
processExit: ((code) => {
|
|
58
58
|
exitCodes.push(code);
|
|
59
59
|
return undefined;
|
|
60
60
|
}),
|
|
61
|
-
logger: { info: () => undefined }
|
|
61
|
+
logger: { info: () => undefined },
|
|
62
62
|
});
|
|
63
63
|
assert.deepEqual(exitCodes, [1]);
|
|
64
64
|
assert.equal(spawned, false);
|
|
65
65
|
});
|
|
66
|
-
test(
|
|
66
|
+
test('executeRestartRequest exits non-zero when supervised by systemd', () => {
|
|
67
67
|
const exitCodes = [];
|
|
68
68
|
let spawned = false;
|
|
69
69
|
executeRestartRequest({
|
|
70
|
-
getAutostartStatus: () => ({ registered: true, platform:
|
|
70
|
+
getAutostartStatus: () => ({ registered: true, platform: 'systemd' }),
|
|
71
71
|
spawnDetachedDaemon: () => {
|
|
72
72
|
spawned = true;
|
|
73
73
|
},
|
|
74
|
-
platform: () =>
|
|
74
|
+
platform: () => 'linux',
|
|
75
75
|
processExit: ((code) => {
|
|
76
76
|
exitCodes.push(code);
|
|
77
77
|
return undefined;
|
|
78
78
|
}),
|
|
79
|
-
logger: { info: () => undefined }
|
|
79
|
+
logger: { info: () => undefined },
|
|
80
80
|
});
|
|
81
81
|
assert.deepEqual(exitCodes, [1]);
|
|
82
82
|
assert.equal(spawned, false);
|
|
83
83
|
});
|
|
84
|
-
test(
|
|
84
|
+
test('executeRestartRequest spawns a hidden Windows daemon even when startup-folder is registered', () => {
|
|
85
85
|
const exitCodes = [];
|
|
86
86
|
let spawned = false;
|
|
87
87
|
executeRestartRequest({
|
|
88
|
-
getAutostartStatus: () => ({ registered: true, platform:
|
|
88
|
+
getAutostartStatus: () => ({ registered: true, platform: 'startup-folder' }),
|
|
89
89
|
spawnDetachedDaemon: () => {
|
|
90
90
|
spawned = true;
|
|
91
91
|
},
|
|
92
|
-
platform: () =>
|
|
92
|
+
platform: () => 'win32',
|
|
93
93
|
processExit: ((code) => {
|
|
94
94
|
exitCodes.push(code);
|
|
95
95
|
return undefined;
|
|
96
96
|
}),
|
|
97
|
-
logger: { info: () => undefined }
|
|
97
|
+
logger: { info: () => undefined },
|
|
98
98
|
});
|
|
99
|
-
assert.equal(spawned, true,
|
|
99
|
+
assert.equal(spawned, true, 'Windows startup-folder is not a supervisor — must respawn');
|
|
100
100
|
assert.deepEqual(exitCodes, [0]);
|
|
101
101
|
});
|
|
102
|
-
test(
|
|
102
|
+
test('executeRestartRequest spawns a detached daemon when running manually on macOS', () => {
|
|
103
103
|
const exitCodes = [];
|
|
104
104
|
let spawned = false;
|
|
105
105
|
executeRestartRequest({
|
|
106
|
-
getAutostartStatus: () => ({ registered: false, platform:
|
|
106
|
+
getAutostartStatus: () => ({ registered: false, platform: 'launchd' }),
|
|
107
107
|
spawnDetachedDaemon: () => {
|
|
108
108
|
spawned = true;
|
|
109
109
|
},
|
|
110
|
-
platform: () =>
|
|
110
|
+
platform: () => 'darwin',
|
|
111
111
|
processExit: ((code) => {
|
|
112
112
|
exitCodes.push(code);
|
|
113
113
|
return undefined;
|
|
114
114
|
}),
|
|
115
|
-
logger: { info: () => undefined }
|
|
115
|
+
logger: { info: () => undefined },
|
|
116
116
|
});
|
|
117
117
|
assert.equal(spawned, true);
|
|
118
118
|
assert.deepEqual(exitCodes, [0]);
|
package/dist/executable.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { execFileSync, type ChildProcess, type SpawnOptions } from
|
|
2
|
-
import { existsSync } from
|
|
3
|
-
import { platform as getPlatform } from
|
|
1
|
+
import { execFileSync, type ChildProcess, type SpawnOptions } from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { platform as getPlatform } from 'node:os';
|
|
4
4
|
type ExecutableDeps = {
|
|
5
5
|
env?: NodeJS.ProcessEnv;
|
|
6
6
|
execFileSync?: typeof execFileSync;
|