@agentteams/runner 0.0.46

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 (158) hide show
  1. package/dist/api-client.d.ts +22 -0
  2. package/dist/api-client.js +201 -0
  3. package/dist/api-client.js.map +1 -0
  4. package/dist/api-client.test.d.ts +1 -0
  5. package/dist/api-client.test.js +118 -0
  6. package/dist/api-client.test.js.map +1 -0
  7. package/dist/autostart.d.ts +19 -0
  8. package/dist/autostart.js +359 -0
  9. package/dist/autostart.js.map +1 -0
  10. package/dist/autostart.test.d.ts +1 -0
  11. package/dist/autostart.test.js +42 -0
  12. package/dist/autostart.test.js.map +1 -0
  13. package/dist/commands/cleanup.d.ts +1 -0
  14. package/dist/commands/cleanup.js +12 -0
  15. package/dist/commands/cleanup.js.map +1 -0
  16. package/dist/commands/init.d.ts +1 -0
  17. package/dist/commands/init.js +57 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/restart.d.ts +1 -0
  20. package/dist/commands/restart.js +7 -0
  21. package/dist/commands/restart.js.map +1 -0
  22. package/dist/commands/start.d.ts +1 -0
  23. package/dist/commands/start.js +34 -0
  24. package/dist/commands/start.js.map +1 -0
  25. package/dist/commands/status.d.ts +1 -0
  26. package/dist/commands/status.js +20 -0
  27. package/dist/commands/status.js.map +1 -0
  28. package/dist/commands/stop.d.ts +1 -0
  29. package/dist/commands/stop.js +21 -0
  30. package/dist/commands/stop.js.map +1 -0
  31. package/dist/commands/uninstall.d.ts +1 -0
  32. package/dist/commands/uninstall.js +21 -0
  33. package/dist/commands/uninstall.js.map +1 -0
  34. package/dist/commands/update.d.ts +10 -0
  35. package/dist/commands/update.js +58 -0
  36. package/dist/commands/update.js.map +1 -0
  37. package/dist/commands/update.test.d.ts +1 -0
  38. package/dist/commands/update.test.js +104 -0
  39. package/dist/commands/update.test.js.map +1 -0
  40. package/dist/config.d.ts +6 -0
  41. package/dist/config.js +69 -0
  42. package/dist/config.js.map +1 -0
  43. package/dist/config.test.d.ts +1 -0
  44. package/dist/config.test.js +133 -0
  45. package/dist/config.test.js.map +1 -0
  46. package/dist/daemon-control.d.ts +21 -0
  47. package/dist/daemon-control.js +58 -0
  48. package/dist/daemon-control.js.map +1 -0
  49. package/dist/daemon-control.test.d.ts +1 -0
  50. package/dist/daemon-control.test.js +48 -0
  51. package/dist/daemon-control.test.js.map +1 -0
  52. package/dist/executable.d.ts +25 -0
  53. package/dist/executable.js +141 -0
  54. package/dist/executable.js.map +1 -0
  55. package/dist/executable.test.d.ts +1 -0
  56. package/dist/executable.test.js +57 -0
  57. package/dist/executable.test.js.map +1 -0
  58. package/dist/handlers/trigger-handler.d.ts +25 -0
  59. package/dist/handlers/trigger-handler.js +308 -0
  60. package/dist/handlers/trigger-handler.js.map +1 -0
  61. package/dist/handlers/trigger-handler.test.d.ts +1 -0
  62. package/dist/handlers/trigger-handler.test.js +496 -0
  63. package/dist/handlers/trigger-handler.test.js.map +1 -0
  64. package/dist/index.d.ts +2 -0
  65. package/dist/index.js +82 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/logger.d.ts +5 -0
  68. package/dist/logger.js +25 -0
  69. package/dist/logger.js.map +1 -0
  70. package/dist/pid.d.ts +8 -0
  71. package/dist/pid.js +49 -0
  72. package/dist/pid.js.map +1 -0
  73. package/dist/poller.d.ts +20 -0
  74. package/dist/poller.js +214 -0
  75. package/dist/poller.js.map +1 -0
  76. package/dist/poller.test.d.ts +1 -0
  77. package/dist/poller.test.js +382 -0
  78. package/dist/poller.test.js.map +1 -0
  79. package/dist/runners/amp.d.ts +5 -0
  80. package/dist/runners/amp.js +316 -0
  81. package/dist/runners/amp.js.map +1 -0
  82. package/dist/runners/claude-code.d.ts +6 -0
  83. package/dist/runners/claude-code.js +340 -0
  84. package/dist/runners/claude-code.js.map +1 -0
  85. package/dist/runners/claude-code.test.d.ts +1 -0
  86. package/dist/runners/claude-code.test.js +39 -0
  87. package/dist/runners/claude-code.test.js.map +1 -0
  88. package/dist/runners/codex.d.ts +6 -0
  89. package/dist/runners/codex.js +324 -0
  90. package/dist/runners/codex.js.map +1 -0
  91. package/dist/runners/codex.test.d.ts +1 -0
  92. package/dist/runners/codex.test.js +66 -0
  93. package/dist/runners/codex.test.js.map +1 -0
  94. package/dist/runners/gemini.d.ts +5 -0
  95. package/dist/runners/gemini.js +304 -0
  96. package/dist/runners/gemini.js.map +1 -0
  97. package/dist/runners/gemini.test.d.ts +1 -0
  98. package/dist/runners/gemini.test.js +16 -0
  99. package/dist/runners/gemini.test.js.map +1 -0
  100. package/dist/runners/index.d.ts +2 -0
  101. package/dist/runners/index.js +27 -0
  102. package/dist/runners/index.js.map +1 -0
  103. package/dist/runners/index.test.d.ts +1 -0
  104. package/dist/runners/index.test.js +19 -0
  105. package/dist/runners/index.test.js.map +1 -0
  106. package/dist/runners/log-reporter.d.ts +18 -0
  107. package/dist/runners/log-reporter.js +127 -0
  108. package/dist/runners/log-reporter.js.map +1 -0
  109. package/dist/runners/log-reporter.test.d.ts +1 -0
  110. package/dist/runners/log-reporter.test.js +152 -0
  111. package/dist/runners/log-reporter.test.js.map +1 -0
  112. package/dist/runners/opencode.d.ts +6 -0
  113. package/dist/runners/opencode.js +304 -0
  114. package/dist/runners/opencode.js.map +1 -0
  115. package/dist/runners/stream-json-parser.d.ts +17 -0
  116. package/dist/runners/stream-json-parser.js +116 -0
  117. package/dist/runners/stream-json-parser.js.map +1 -0
  118. package/dist/runners/types.d.ts +26 -0
  119. package/dist/runners/types.js +2 -0
  120. package/dist/runners/types.js.map +1 -0
  121. package/dist/types.d.ts +69 -0
  122. package/dist/types.js +2 -0
  123. package/dist/types.js.map +1 -0
  124. package/dist/utils/auth-path-store.d.ts +3 -0
  125. package/dist/utils/auth-path-store.js +37 -0
  126. package/dist/utils/auth-path-store.js.map +1 -0
  127. package/dist/utils/auth-path-store.test.d.ts +1 -0
  128. package/dist/utils/auth-path-store.test.js +70 -0
  129. package/dist/utils/auth-path-store.test.js.map +1 -0
  130. package/dist/utils/convention-sync.d.ts +8 -0
  131. package/dist/utils/convention-sync.js +41 -0
  132. package/dist/utils/convention-sync.js.map +1 -0
  133. package/dist/utils/convention-sync.test.d.ts +1 -0
  134. package/dist/utils/convention-sync.test.js +75 -0
  135. package/dist/utils/convention-sync.test.js.map +1 -0
  136. package/dist/utils/git-worktree.d.ts +9 -0
  137. package/dist/utils/git-worktree.js +150 -0
  138. package/dist/utils/git-worktree.js.map +1 -0
  139. package/dist/utils/git-worktree.test.d.ts +1 -0
  140. package/dist/utils/git-worktree.test.js +294 -0
  141. package/dist/utils/git-worktree.test.js.map +1 -0
  142. package/dist/utils/origin-issue-safeguard.d.ts +16 -0
  143. package/dist/utils/origin-issue-safeguard.js +198 -0
  144. package/dist/utils/origin-issue-safeguard.js.map +1 -0
  145. package/dist/utils/runner-cleanup.d.ts +10 -0
  146. package/dist/utils/runner-cleanup.js +59 -0
  147. package/dist/utils/runner-cleanup.js.map +1 -0
  148. package/dist/utils/runner-cleanup.test.d.ts +1 -0
  149. package/dist/utils/runner-cleanup.test.js +93 -0
  150. package/dist/utils/runner-cleanup.test.js.map +1 -0
  151. package/dist/utils/runner-history.d.ts +6 -0
  152. package/dist/utils/runner-history.js +13 -0
  153. package/dist/utils/runner-history.js.map +1 -0
  154. package/dist/utils/runner-history.test.d.ts +1 -0
  155. package/dist/utils/runner-history.test.js +25 -0
  156. package/dist/utils/runner-history.test.js.map +1 -0
  157. package/package.json +50 -0
  158. package/readme.md +188 -0
@@ -0,0 +1,21 @@
1
+ import { logger } from "../logger.js";
2
+ import { getDaemonStatus, removePidFile } from "../pid.js";
3
+ import { unregisterAutostart } from "../autostart.js";
4
+ export const runUninstallCommand = async () => {
5
+ // 1. Stop running daemon if any.
6
+ const { running, pid } = await getDaemonStatus();
7
+ if (running && pid !== null) {
8
+ try {
9
+ process.kill(pid, "SIGTERM");
10
+ logger.info("Stopped running daemon", { pid });
11
+ }
12
+ catch {
13
+ // Process may have exited between check and kill.
14
+ }
15
+ await removePidFile();
16
+ }
17
+ // 2. Unregister autostart service.
18
+ await unregisterAutostart();
19
+ logger.info("Uninstall completed. Daemon service removed and autostart unregistered.");
20
+ };
21
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,IAAmB,EAAE;IAC3D,iCAAiC;IACjC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;IAEjD,IAAI,OAAO,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;QACD,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC;IAED,mCAAmC;IACnC,MAAM,mBAAmB,EAAE,CAAC;IAE5B,MAAM,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;AACzF,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { restartDaemon } from "../daemon-control.js";
2
+ import { runExecutableSync } from "../executable.js";
3
+ import { logger } from "../logger.js";
4
+ type UpdateDeps = {
5
+ runExecutableSync?: typeof runExecutableSync;
6
+ restartDaemon?: typeof restartDaemon;
7
+ logger?: Pick<typeof logger, "info" | "warn">;
8
+ };
9
+ export declare const runUpdateCommand: (deps?: UpdateDeps) => Promise<void>;
10
+ export {};
@@ -0,0 +1,58 @@
1
+ import { createRequire } from "node:module";
2
+ import { restartDaemon } from "../daemon-control.js";
3
+ import { runExecutableSync } from "../executable.js";
4
+ import { logger } from "../logger.js";
5
+ const require = createRequire(import.meta.url);
6
+ const packageJson = require("../../package.json");
7
+ const packageName = "@agentteams/runner";
8
+ const getCurrentVersion = () => packageJson.version ?? "0.0.0";
9
+ const readLatestVersion = (deps) => {
10
+ try {
11
+ const latestVersion = deps.runExecutableSync("npm", ["view", packageName, "version"]).trim();
12
+ return latestVersion.length > 0 ? latestVersion : null;
13
+ }
14
+ catch (error) {
15
+ deps.logger.warn("Failed to resolve latest AgentRunner version before update", {
16
+ error: error instanceof Error ? error.message : String(error)
17
+ });
18
+ return null;
19
+ }
20
+ };
21
+ const normalizeInstallError = (error) => {
22
+ const message = error instanceof Error ? error.message : String(error);
23
+ if (message.includes("EACCES")
24
+ || message.includes("EPERM")
25
+ || message.toLowerCase().includes("permission denied")) {
26
+ return new Error("Global npm install requires elevated permissions. Configure a user-level npm prefix or rerun the update with appropriate permissions.");
27
+ }
28
+ return new Error(`Failed to install the latest AgentRunner package: ${message}`);
29
+ };
30
+ export const runUpdateCommand = async (deps = {}) => {
31
+ const resolvedRunExecutableSync = deps.runExecutableSync ?? runExecutableSync;
32
+ const resolvedRestartDaemon = deps.restartDaemon ?? restartDaemon;
33
+ const resolvedLogger = deps.logger ?? logger;
34
+ const currentVersion = getCurrentVersion();
35
+ const latestVersion = readLatestVersion({
36
+ runExecutableSync: resolvedRunExecutableSync,
37
+ logger: resolvedLogger
38
+ });
39
+ resolvedLogger.info("Updating AgentRunner package", {
40
+ currentVersion,
41
+ targetVersion: latestVersion ?? "latest"
42
+ });
43
+ try {
44
+ resolvedRunExecutableSync("npm", ["install", "-g", `${packageName}@latest`]);
45
+ }
46
+ catch (error) {
47
+ throw normalizeInstallError(error);
48
+ }
49
+ resolvedLogger.info("Package update completed", {
50
+ version: latestVersion ?? "latest"
51
+ });
52
+ await resolvedRestartDaemon();
53
+ resolvedLogger.info("AgentRunner update completed", {
54
+ currentVersion,
55
+ targetVersion: latestVersion ?? "latest"
56
+ });
57
+ };
58
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,104 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import { runUpdateCommand } from "./update.js";
4
+ test("runUpdateCommand installs latest package and restarts daemon", async () => {
5
+ const commandCalls = [];
6
+ const logs = [];
7
+ let restarted = false;
8
+ await runUpdateCommand({
9
+ runExecutableSync: (name, args) => {
10
+ commandCalls.push({ name, args });
11
+ if (args[0] === "view") {
12
+ return "0.0.13\n";
13
+ }
14
+ return "";
15
+ },
16
+ restartDaemon: async () => {
17
+ restarted = true;
18
+ },
19
+ logger: {
20
+ info: (message) => {
21
+ logs.push(message);
22
+ },
23
+ warn: () => undefined
24
+ }
25
+ });
26
+ assert.deepEqual(commandCalls, [
27
+ {
28
+ name: "npm",
29
+ args: ["view", "@agentteams/runner", "version"]
30
+ },
31
+ {
32
+ name: "npm",
33
+ args: ["install", "-g", "@agentteams/runner@latest"]
34
+ }
35
+ ]);
36
+ assert.equal(restarted, true);
37
+ assert.deepEqual(logs, [
38
+ "Updating AgentRunner package",
39
+ "Package update completed",
40
+ "AgentRunner update completed"
41
+ ]);
42
+ });
43
+ test("runUpdateCommand continues update when latest version lookup fails", async () => {
44
+ const commandCalls = [];
45
+ const warnings = [];
46
+ await runUpdateCommand({
47
+ runExecutableSync: (name, args) => {
48
+ commandCalls.push({ name, args });
49
+ if (args[0] === "view") {
50
+ throw new Error("network unavailable");
51
+ }
52
+ return "";
53
+ },
54
+ restartDaemon: async () => undefined,
55
+ logger: {
56
+ info: () => undefined,
57
+ warn: (message) => {
58
+ warnings.push(message);
59
+ }
60
+ }
61
+ });
62
+ assert.equal(warnings.length, 1);
63
+ assert.deepEqual(commandCalls, [
64
+ {
65
+ name: "npm",
66
+ args: ["view", "@agentteams/runner", "version"]
67
+ },
68
+ {
69
+ name: "npm",
70
+ args: ["install", "-g", "@agentteams/runner@latest"]
71
+ }
72
+ ]);
73
+ });
74
+ test("runUpdateCommand surfaces a friendly message when global npm install needs permissions", async () => {
75
+ await assert.rejects(() => runUpdateCommand({
76
+ runExecutableSync: (_name, args) => {
77
+ if (args[0] === "view") {
78
+ return "0.0.13\n";
79
+ }
80
+ throw new Error("npm ERR! code EACCES");
81
+ },
82
+ restartDaemon: async () => undefined,
83
+ logger: {
84
+ info: () => undefined,
85
+ warn: () => undefined
86
+ }
87
+ }), /Global npm install requires elevated permissions/u);
88
+ });
89
+ test("runUpdateCommand surfaces install failures with command context", async () => {
90
+ await assert.rejects(() => runUpdateCommand({
91
+ runExecutableSync: (_name, args) => {
92
+ if (args[0] === "view") {
93
+ return "0.0.13\n";
94
+ }
95
+ throw new Error("registry unavailable");
96
+ },
97
+ restartDaemon: async () => undefined,
98
+ logger: {
99
+ info: () => undefined,
100
+ warn: () => undefined
101
+ }
102
+ }), /Failed to install the latest AgentRunner package: registry unavailable/u);
103
+ });
104
+ //# sourceMappingURL=update.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.test.js","sourceRoot":"","sources":["../../src/commands/update.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { DaemonConfigFile, RuntimeConfig } from "./types.js";
2
+ export declare const getDaemonConfigPath: () => string;
3
+ export declare const readDaemonConfigFile: () => Promise<DaemonConfigFile | null>;
4
+ export declare const writeDaemonConfigFile: (config: DaemonConfigFile) => Promise<string>;
5
+ export declare const resolveRuntimeConfig: () => Promise<RuntimeConfig>;
6
+ export declare const resolveApiUrlForInit: (apiUrlArg?: string) => Promise<string>;
package/dist/config.js ADDED
@@ -0,0 +1,69 @@
1
+ import { chmodSync, promises as fs } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ const DEFAULT_POLLING_INTERVAL_MS = 30_000;
5
+ const DEFAULT_TIMEOUT_MS = 24 * 60 * 60 * 1000;
6
+ const DEFAULT_IDLE_TIMEOUT_MS = 600_000;
7
+ const DEFAULT_RUNNER_CMD = "opencode";
8
+ const DEFAULT_API_URL = "https://api.agentteams.run";
9
+ export const getDaemonConfigPath = () => {
10
+ return join(homedir(), ".agentteams", "daemon.json");
11
+ };
12
+ const parsePositiveInteger = (rawValue, fallback) => {
13
+ if (!rawValue) {
14
+ return fallback;
15
+ }
16
+ const parsed = Number(rawValue);
17
+ if (!Number.isFinite(parsed) || parsed <= 0) {
18
+ return fallback;
19
+ }
20
+ return Math.floor(parsed);
21
+ };
22
+ export const readDaemonConfigFile = async () => {
23
+ const path = getDaemonConfigPath();
24
+ try {
25
+ const content = await fs.readFile(path, "utf8");
26
+ const parsed = JSON.parse(content);
27
+ if (!parsed.daemonToken || !parsed.apiUrl) {
28
+ return null;
29
+ }
30
+ return {
31
+ daemonToken: parsed.daemonToken,
32
+ apiUrl: parsed.apiUrl
33
+ };
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ };
39
+ export const writeDaemonConfigFile = async (config) => {
40
+ const path = getDaemonConfigPath();
41
+ await fs.mkdir(dirname(path), { recursive: true });
42
+ await fs.writeFile(path, JSON.stringify(config, null, 2), "utf8");
43
+ chmodSync(path, 0o600);
44
+ return path;
45
+ };
46
+ export const resolveRuntimeConfig = async () => {
47
+ const fileConfig = await readDaemonConfigFile();
48
+ const daemonToken = process.env.AGENTTEAMS_DAEMON_TOKEN ?? fileConfig?.daemonToken;
49
+ const apiUrl = process.env.AGENTTEAMS_API_URL ?? fileConfig?.apiUrl ?? DEFAULT_API_URL;
50
+ if (!daemonToken || daemonToken.trim().length === 0) {
51
+ throw new Error("Daemon token is missing. Run 'agentrunner init --token <token>' first.");
52
+ }
53
+ return {
54
+ daemonToken,
55
+ apiUrl,
56
+ pollingIntervalMs: parsePositiveInteger(process.env.POLLING_INTERVAL_MS, DEFAULT_POLLING_INTERVAL_MS),
57
+ timeoutMs: parsePositiveInteger(process.env.TIMEOUT_MS, DEFAULT_TIMEOUT_MS),
58
+ idleTimeoutMs: parsePositiveInteger(process.env.IDLE_TIMEOUT_MS, DEFAULT_IDLE_TIMEOUT_MS),
59
+ runnerCmd: process.env.RUNNER_CMD?.trim() || DEFAULT_RUNNER_CMD
60
+ };
61
+ };
62
+ export const resolveApiUrlForInit = async (apiUrlArg) => {
63
+ if (apiUrlArg && apiUrlArg.trim().length > 0) {
64
+ return apiUrlArg.trim();
65
+ }
66
+ const fileConfig = await readDaemonConfigFile();
67
+ return process.env.AGENTTEAMS_API_URL ?? fileConfig?.apiUrl ?? DEFAULT_API_URL;
68
+ };
69
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,133 @@
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
+ const envKeys = [
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
+ ];
19
+ const withTempHome = async (run) => {
20
+ const previousEnv = new Map();
21
+ for (const key of envKeys) {
22
+ previousEnv.set(key, process.env[key]);
23
+ delete process.env[key];
24
+ }
25
+ const homeDir = await mkdtemp(join(tmpdir(), "daemon-config-test-"));
26
+ process.env.HOME = homeDir;
27
+ process.env.USERPROFILE = homeDir;
28
+ process.env.HOMEDRIVE = "";
29
+ process.env.HOMEPATH = "";
30
+ try {
31
+ await run(homeDir);
32
+ }
33
+ finally {
34
+ await rm(homeDir, { recursive: true, force: true });
35
+ for (const key of envKeys) {
36
+ const value = previousEnv.get(key);
37
+ if (value === undefined) {
38
+ delete process.env[key];
39
+ }
40
+ else {
41
+ process.env[key] = value;
42
+ }
43
+ }
44
+ }
45
+ };
46
+ test("readDaemonConfigFile returns null when config file does not exist", async () => {
47
+ await withTempHome(async () => {
48
+ const result = await readDaemonConfigFile();
49
+ assert.equal(result, null);
50
+ });
51
+ });
52
+ test("writeDaemonConfigFile creates the config directory and file", async () => {
53
+ await withTempHome(async () => {
54
+ const filePath = await writeDaemonConfigFile({
55
+ daemonToken: "file-token",
56
+ apiUrl: "https://file.example"
57
+ });
58
+ assert.equal(filePath, getDaemonConfigPath());
59
+ const content = await readFile(filePath, "utf8");
60
+ assert.deepEqual(JSON.parse(content), {
61
+ daemonToken: "file-token",
62
+ apiUrl: "https://file.example"
63
+ });
64
+ });
65
+ });
66
+ test("readDaemonConfigFile returns null for invalid or incomplete JSON", async () => {
67
+ await withTempHome(async () => {
68
+ const filePath = getDaemonConfigPath();
69
+ await writeDaemonConfigFile({
70
+ daemonToken: "file-token",
71
+ apiUrl: "https://file.example"
72
+ });
73
+ await readFile(filePath, "utf8");
74
+ await import("node:fs/promises").then(({ writeFile }) => writeFile(filePath, "{invalid", "utf8"));
75
+ assert.equal(await readDaemonConfigFile(), null);
76
+ await import("node:fs/promises").then(({ writeFile }) => writeFile(filePath, JSON.stringify({ daemonToken: "only-token" }), "utf8"));
77
+ assert.equal(await readDaemonConfigFile(), null);
78
+ });
79
+ });
80
+ test("resolveRuntimeConfig prefers environment variables and applies numeric parsing fallbacks", async () => {
81
+ await withTempHome(async () => {
82
+ await writeDaemonConfigFile({
83
+ daemonToken: "file-token",
84
+ apiUrl: "https://file.example"
85
+ });
86
+ process.env.AGENTTEAMS_DAEMON_TOKEN = "env-token";
87
+ process.env.AGENTTEAMS_API_URL = "https://env.example";
88
+ process.env.POLLING_INTERVAL_MS = "-10";
89
+ process.env.TIMEOUT_MS = "1234.7";
90
+ process.env.RUNNER_CMD = "codex";
91
+ const result = await resolveRuntimeConfig();
92
+ assert.deepEqual(result, {
93
+ daemonToken: "env-token",
94
+ apiUrl: "https://env.example",
95
+ pollingIntervalMs: 30_000,
96
+ timeoutMs: 1234,
97
+ idleTimeoutMs: 600_000,
98
+ runnerCmd: "codex"
99
+ });
100
+ });
101
+ });
102
+ test("resolveRuntimeConfig uses the 24-hour fail-safe timeout by default", async () => {
103
+ await withTempHome(async () => {
104
+ await writeDaemonConfigFile({
105
+ daemonToken: "file-token",
106
+ apiUrl: "https://file.example"
107
+ });
108
+ const result = await resolveRuntimeConfig();
109
+ assert.equal(result.timeoutMs, 86_400_000);
110
+ assert.equal(result.idleTimeoutMs, 600_000);
111
+ });
112
+ });
113
+ test("resolveRuntimeConfig throws when daemon token is missing", async () => {
114
+ await withTempHome(async () => {
115
+ await assert.rejects(() => resolveRuntimeConfig(), /Daemon token is missing/);
116
+ });
117
+ });
118
+ test("resolveApiUrlForInit resolves in argument, env, file, default order", async () => {
119
+ await withTempHome(async () => {
120
+ assert.equal(await resolveApiUrlForInit(" https://arg.example "), "https://arg.example");
121
+ process.env.AGENTTEAMS_API_URL = "https://env.example";
122
+ assert.equal(await resolveApiUrlForInit(), "https://env.example");
123
+ delete process.env.AGENTTEAMS_API_URL;
124
+ await writeDaemonConfigFile({
125
+ daemonToken: "file-token",
126
+ apiUrl: "https://file.example"
127
+ });
128
+ assert.equal(await resolveApiUrlForInit(), "https://file.example");
129
+ await import("node:fs/promises").then(({ rm }) => rm(getDaemonConfigPath(), { force: true }));
130
+ assert.equal(await resolveApiUrlForInit(), "https://api.agentteams.run");
131
+ });
132
+ });
133
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { getAutostartStatus, restartAutostartService } from "./autostart.js";
2
+ import { logger } from "./logger.js";
3
+ type RunningDaemonStatus = {
4
+ running: boolean;
5
+ pid: number | null;
6
+ };
7
+ type DetachedChildProcess = {
8
+ unref: () => void;
9
+ };
10
+ type RestartDeps = {
11
+ getDaemonStatus?: () => Promise<RunningDaemonStatus>;
12
+ getAutostartStatus?: typeof getAutostartStatus;
13
+ restartAutostartService?: typeof restartAutostartService;
14
+ spawnDetachedDaemon?: () => DetachedChildProcess;
15
+ kill?: typeof process.kill;
16
+ sleep?: (milliseconds: number) => Promise<void>;
17
+ logger?: Pick<typeof logger, "info">;
18
+ };
19
+ export declare const spawnDetachedDaemon: () => DetachedChildProcess;
20
+ export declare const restartDaemon: (deps?: RestartDeps) => Promise<void>;
21
+ export {};
@@ -0,0 +1,58 @@
1
+ import { setTimeout as delay } from "node:timers/promises";
2
+ import { getAutostartStatus, restartAutostartService } from "./autostart.js";
3
+ import { logger } from "./logger.js";
4
+ import { getDaemonStatus } from "./pid.js";
5
+ import { spawnExecutable } from "./executable.js";
6
+ const restartPollIntervalMs = 100;
7
+ const stopTimeoutMs = 10_000;
8
+ const waitForDaemonToStop = async (pid, deps) => {
9
+ deps.kill(pid, "SIGTERM");
10
+ const deadline = Date.now() + stopTimeoutMs;
11
+ while (Date.now() < deadline) {
12
+ await deps.sleep(restartPollIntervalMs);
13
+ const status = await deps.getDaemonStatus();
14
+ if (!status.running) {
15
+ return;
16
+ }
17
+ }
18
+ throw new Error(`Timed out waiting for AgentRunner process ${pid} to stop.`);
19
+ };
20
+ export const spawnDetachedDaemon = () => {
21
+ const child = spawnExecutable("agentrunner", ["start"], {
22
+ detached: true,
23
+ stdio: "ignore",
24
+ env: process.env,
25
+ cwd: process.cwd()
26
+ });
27
+ child.unref();
28
+ return child;
29
+ };
30
+ export const restartDaemon = async (deps = {}) => {
31
+ const resolvedGetDaemonStatus = deps.getDaemonStatus ?? getDaemonStatus;
32
+ const resolvedGetAutostartStatus = deps.getAutostartStatus ?? getAutostartStatus;
33
+ const resolvedRestartAutostartService = deps.restartAutostartService ?? restartAutostartService;
34
+ const resolvedSpawnDetachedDaemon = deps.spawnDetachedDaemon ?? spawnDetachedDaemon;
35
+ const resolvedKill = deps.kill ?? process.kill.bind(process);
36
+ const resolvedSleep = deps.sleep ?? ((milliseconds) => delay(milliseconds));
37
+ const resolvedLogger = deps.logger ?? logger;
38
+ const daemonStatus = await resolvedGetDaemonStatus();
39
+ if (daemonStatus.running && daemonStatus.pid !== null) {
40
+ resolvedLogger.info("Stopping AgentRunner before restart", { pid: daemonStatus.pid });
41
+ await waitForDaemonToStop(daemonStatus.pid, {
42
+ getDaemonStatus: resolvedGetDaemonStatus,
43
+ kill: resolvedKill,
44
+ sleep: resolvedSleep
45
+ });
46
+ }
47
+ const autostartStatus = resolvedGetAutostartStatus();
48
+ if (autostartStatus.registered) {
49
+ resolvedLogger.info("Restarting AgentRunner via registered autostart service", {
50
+ platform: autostartStatus.platform
51
+ });
52
+ await resolvedRestartAutostartService();
53
+ return;
54
+ }
55
+ resolvedLogger.info("Starting AgentRunner in background without autostart registration");
56
+ resolvedSpawnDetachedDaemon();
57
+ };
58
+ //# sourceMappingURL=daemon-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-control.js","sourceRoot":"","sources":["../src/daemon-control.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,48 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import { restartDaemon } from "./daemon-control.js";
4
+ test("restartDaemon stops running daemon and restarts via autostart when registered", async () => {
5
+ const signals = [];
6
+ let statusChecks = 0;
7
+ let restarted = false;
8
+ await restartDaemon({
9
+ getDaemonStatus: async () => {
10
+ statusChecks += 1;
11
+ if (statusChecks === 1) {
12
+ return { running: true, pid: 4321 };
13
+ }
14
+ return { running: false, pid: null };
15
+ },
16
+ getAutostartStatus: () => ({ registered: true, platform: "systemd" }),
17
+ restartAutostartService: async () => {
18
+ restarted = true;
19
+ },
20
+ kill: (pid, signal) => {
21
+ signals.push({ pid, signal });
22
+ return true;
23
+ },
24
+ sleep: async () => undefined,
25
+ logger: { info: () => undefined }
26
+ });
27
+ assert.deepEqual(signals, [{ pid: 4321, signal: "SIGTERM" }]);
28
+ assert.equal(restarted, true);
29
+ });
30
+ test("restartDaemon starts detached daemon when autostart is not registered", async () => {
31
+ let started = false;
32
+ await restartDaemon({
33
+ getDaemonStatus: async () => ({ running: false, pid: null }),
34
+ getAutostartStatus: () => ({ registered: false, platform: "manual" }),
35
+ restartAutostartService: async () => {
36
+ throw new Error("should not restart autostart");
37
+ },
38
+ spawnDetachedDaemon: () => {
39
+ started = true;
40
+ return {
41
+ unref: () => undefined
42
+ };
43
+ },
44
+ logger: { info: () => undefined }
45
+ });
46
+ assert.equal(started, true);
47
+ });
48
+ //# sourceMappingURL=daemon-control.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-control.test.js","sourceRoot":"","sources":["../src/daemon-control.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,IAAI,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;IAC/F,MAAM,OAAO,GAAgE,EAAE,CAAC;IAChF,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,MAAM,aAAa,CAAC;QAClB,eAAe,EAAE,KAAK,IAAI,EAAE;YAC1B,YAAY,IAAI,CAAC,CAAC;YAClB,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;YACtC,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QACvC,CAAC;QACD,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;QACrE,uBAAuB,EAAE,KAAK,IAAI,EAAE;YAClC,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;YACpB,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS;QAC5B,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE;KAClC,CAAC,CAAC;IAEH,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAC9D,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;IACvF,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,aAAa,CAAC;QAClB,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QAC5D,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QACrE,uBAAuB,EAAE,KAAK,IAAI,EAAE;YAClC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QACD,mBAAmB,EAAE,GAAG,EAAE;YACxB,OAAO,GAAG,IAAI,CAAC;YACf,OAAO;gBACL,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;aACvB,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE;KAClC,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,25 @@
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
+ type ExecutableDeps = {
5
+ env?: NodeJS.ProcessEnv;
6
+ execFileSync?: typeof execFileSync;
7
+ existsSync?: typeof existsSync;
8
+ platform?: typeof getPlatform;
9
+ };
10
+ type SpawnExecutableOptions = SpawnOptions & ExecutableDeps;
11
+ type RunExecutableSyncOptions = ExecutableDeps & {
12
+ cwd?: string;
13
+ };
14
+ export declare const buildPowerShellCommand: (executablePath: string, args: string[]) => string;
15
+ export declare const resolveExecutablePath: (name: string, deps?: ExecutableDeps) => string;
16
+ export declare const resolveExecutablePathWithPreference: (name: string, preferredNames: string[], deps?: ExecutableDeps) => string;
17
+ export declare const describeExecutableResolution: (name: string, deps?: ExecutableDeps) => {
18
+ requestedCommand: string;
19
+ resolvedExecutablePath: string;
20
+ platform: string;
21
+ shell: boolean;
22
+ };
23
+ export declare const spawnExecutable: (name: string, args: string[], options: SpawnExecutableOptions) => ChildProcess;
24
+ export declare const runExecutableSync: (name: string, args: string[], options?: RunExecutableSyncOptions) => string;
25
+ export {};