@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,93 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdir, mkdtemp, rm, utimes, writeFile } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import test, { mock } from "node:test";
6
+ import { logger } from "../logger.js";
7
+ import { runCleanup } from "./runner-cleanup.js";
8
+ const makeAuthDir = async () => {
9
+ return await mkdtemp(join(tmpdir(), "runner-cleanup-test-"));
10
+ };
11
+ const touchAge = async (filePath, ageMs) => {
12
+ const target = new Date(Date.now() - ageMs);
13
+ await utimes(filePath, target, target);
14
+ };
15
+ test.afterEach(() => {
16
+ mock.restoreAll();
17
+ });
18
+ test("runCleanup ignores missing log and history directories", async () => {
19
+ const authPath = await makeAuthDir();
20
+ try {
21
+ await runCleanup(authPath);
22
+ }
23
+ finally {
24
+ await rm(authPath, { recursive: true, force: true });
25
+ }
26
+ });
27
+ test("runCleanup deletes only files older than each directory TTL", async () => {
28
+ const authPath = await makeAuthDir();
29
+ const logDir = join(authPath, ".agentteams", "runner", "log");
30
+ const historyDir = join(authPath, ".agentteams", "runner", "history");
31
+ try {
32
+ await mkdir(logDir, { recursive: true });
33
+ await mkdir(historyDir, { recursive: true });
34
+ const oldLog = join(logDir, "old.log");
35
+ const freshLog = join(logDir, "fresh.log");
36
+ const oldHistory = join(historyDir, "old.md");
37
+ const freshHistory = join(historyDir, "fresh.md");
38
+ await writeFile(oldLog, "old");
39
+ await writeFile(freshLog, "fresh");
40
+ await writeFile(oldHistory, "old");
41
+ await writeFile(freshHistory, "fresh");
42
+ await touchAge(oldLog, 2 * 24 * 60 * 60 * 1000);
43
+ await touchAge(freshLog, 12 * 60 * 60 * 1000);
44
+ await touchAge(oldHistory, 4 * 24 * 60 * 60 * 1000);
45
+ await touchAge(freshHistory, 2 * 24 * 60 * 60 * 1000);
46
+ await runCleanup(authPath);
47
+ await assert.rejects(() => import("node:fs/promises").then(({ stat }) => stat(oldLog)));
48
+ await assert.rejects(() => import("node:fs/promises").then(({ stat }) => stat(oldHistory)));
49
+ await import("node:fs/promises").then(async ({ stat }) => {
50
+ await stat(freshLog);
51
+ await stat(freshHistory);
52
+ });
53
+ }
54
+ finally {
55
+ await rm(authPath, { recursive: true, force: true });
56
+ }
57
+ });
58
+ test("runCleanup logs a warning and continues when an expired file cannot be deleted", async () => {
59
+ const authPath = await makeAuthDir();
60
+ const logDir = join(authPath, ".agentteams", "runner", "log");
61
+ const historyDir = join(authPath, ".agentteams", "runner", "history");
62
+ const warnings = [];
63
+ mock.method(logger, "warn", (message, meta) => {
64
+ warnings.push({ message, meta });
65
+ });
66
+ try {
67
+ await mkdir(logDir, { recursive: true });
68
+ await mkdir(historyDir, { recursive: true });
69
+ const lockedFile = join(logDir, "locked.log");
70
+ const historyFile = join(historyDir, "history.md");
71
+ await writeFile(lockedFile, "locked");
72
+ await writeFile(historyFile, "history");
73
+ await touchAge(lockedFile, 2 * 24 * 60 * 60 * 1000);
74
+ await touchAge(historyFile, 4 * 24 * 60 * 60 * 1000);
75
+ await runCleanup(authPath, {
76
+ unlink: async (filePath) => {
77
+ if (filePath === lockedFile) {
78
+ throw new Error("file is locked");
79
+ }
80
+ await import("node:fs/promises").then(async ({ unlink }) => unlink(filePath));
81
+ }
82
+ });
83
+ assert.equal(warnings.length >= 1, true);
84
+ await import("node:fs/promises").then(async ({ stat }) => {
85
+ await stat(lockedFile);
86
+ await assert.rejects(() => stat(historyFile));
87
+ });
88
+ }
89
+ finally {
90
+ await rm(authPath, { recursive: true, force: true });
91
+ }
92
+ });
93
+ //# sourceMappingURL=runner-cleanup.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-cleanup.test.js","sourceRoot":"","sources":["../../src/utils/runner-cleanup.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ type RunnerHistoryPaths = {
2
+ currentHistoryPath: string | null;
3
+ parentHistoryPath: string | null;
4
+ };
5
+ export declare const resolveRunnerHistoryPaths: (authPath: string | null, triggerId: string, parentTriggerId: string | null) => RunnerHistoryPaths;
6
+ export {};
@@ -0,0 +1,13 @@
1
+ import { join } from "node:path";
2
+ const historyDirectory = (authPath) => join(authPath, ".agentteams", "runner", "history");
3
+ const historyFilePath = (authPath, triggerId) => join(historyDirectory(authPath), `${triggerId}.md`);
4
+ export const resolveRunnerHistoryPaths = (authPath, triggerId, parentTriggerId) => {
5
+ if (!authPath) {
6
+ return { currentHistoryPath: null, parentHistoryPath: null };
7
+ }
8
+ return {
9
+ currentHistoryPath: historyFilePath(authPath, triggerId),
10
+ parentHistoryPath: parentTriggerId ? historyFilePath(authPath, parentTriggerId) : null
11
+ };
12
+ };
13
+ //# sourceMappingURL=runner-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-history.js","sourceRoot":"","sources":["../../src/utils/runner-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOjC,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAElG,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAE,SAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,GAAG,SAAS,KAAK,CAAC,CAAC;AAErH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,QAAuB,EACvB,SAAiB,EACjB,eAA8B,EACV,EAAE;IACtB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC/D,CAAC;IAED,OAAO;QACL,kBAAkB,EAAE,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC;QACxD,iBAAiB,EAAE,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI;KACvF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,25 @@
1
+ import assert from "node:assert/strict";
2
+ import { join } from "node:path";
3
+ import test from "node:test";
4
+ import { resolveRunnerHistoryPaths } from "./runner-history.js";
5
+ test("resolveRunnerHistoryPaths returns null paths when authPath is missing", () => {
6
+ assert.deepEqual(resolveRunnerHistoryPaths(null, "trigger-1", "parent-1"), {
7
+ currentHistoryPath: null,
8
+ parentHistoryPath: null
9
+ });
10
+ });
11
+ test("resolveRunnerHistoryPaths returns current and parent history paths", () => {
12
+ const authPath = join("workspace", "auth");
13
+ assert.deepEqual(resolveRunnerHistoryPaths(authPath, "trigger-1", "parent-1"), {
14
+ currentHistoryPath: join(authPath, ".agentteams", "runner", "history", "trigger-1.md"),
15
+ parentHistoryPath: join(authPath, ".agentteams", "runner", "history", "parent-1.md")
16
+ });
17
+ });
18
+ test("resolveRunnerHistoryPaths omits parent path when parent trigger is absent", () => {
19
+ const authPath = join("workspace", "auth");
20
+ assert.deepEqual(resolveRunnerHistoryPaths(authPath, "trigger-1", null), {
21
+ currentHistoryPath: join(authPath, ".agentteams", "runner", "history", "trigger-1.md"),
22
+ parentHistoryPath: null
23
+ });
24
+ });
25
+ //# sourceMappingURL=runner-history.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-history.test.js","sourceRoot":"","sources":["../../src/utils/runner-history.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,IAAI,CAAC,uEAAuE,EAAE,GAAG,EAAE;IACjF,MAAM,CAAC,SAAS,CAAC,yBAAyB,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE;QACzE,kBAAkB,EAAE,IAAI;QACxB,iBAAiB,EAAE,IAAI;KACxB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oEAAoE,EAAE,GAAG,EAAE;IAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,CAAC,SAAS,CAAC,yBAAyB,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE;QAC7E,kBAAkB,EAAE,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,CAAC;QACtF,iBAAiB,EAAE,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC;KACrF,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2EAA2E,EAAE,GAAG,EAAE;IACrF,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,CAAC,SAAS,CAAC,yBAAyB,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE;QACvE,kBAAkB,EAAE,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,CAAC;QACtF,iBAAiB,EAAE,IAAI;KACxB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@agentteams/runner",
3
+ "version": "0.0.46",
4
+ "description": "AgentRunner - Background runner that polls and executes AI agent tasks",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "agentrunner": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist/**/*",
12
+ "readme.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "rm -rf dist && tsc",
16
+ "typecheck": "tsc --noEmit",
17
+ "dev": "tsx watch src/index.ts",
18
+ "test": "tsx --test \"src/**/*.test.ts\"",
19
+ "start": "node dist/index.js",
20
+ "init": "node dist/index.js init",
21
+ "prepublishOnly": "npm run build"
22
+ },
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "https://github.com/rlarua/AgentTeams-runner.git"
29
+ },
30
+ "bugs": {
31
+ "url": "https://github.com/rlarua/AgentTeams-runner/issues"
32
+ },
33
+ "homepage": "https://agentteams.run",
34
+ "engines": {
35
+ "node": ">=18"
36
+ },
37
+ "keywords": [
38
+ "agentteams",
39
+ "runner",
40
+ "ai-agent",
41
+ "automation"
42
+ ],
43
+ "license": "Apache-2.0",
44
+ "dependencies": {},
45
+ "devDependencies": {
46
+ "@types/node": "^24.3.0",
47
+ "tsx": "^4.20.5",
48
+ "typescript": "^5.9.2"
49
+ }
50
+ }
package/readme.md ADDED
@@ -0,0 +1,188 @@
1
+ # @agentteams/runner
2
+
3
+ [![GitHub](https://img.shields.io/badge/GitHub-rlarua%2FAgentTeams--runner-blue?logo=github)](https://github.com/rlarua/AgentTeams-runner)
4
+ [![Issues](https://img.shields.io/github/issues/rlarua/AgentTeams-runner)](https://github.com/rlarua/AgentTeams-runner/issues)
5
+
6
+ A background runner that polls and executes AI agent tasks from the AgentTeams platform.
7
+
8
+ ## Prerequisites
9
+
10
+ - Node.js `18` or later
11
+ - AgentTeams API server running
12
+ - A daemon token issued from the web UI (`x-daemon-token`)
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ npm install -g @agentteams/runner
18
+ ```
19
+
20
+ Verify the installation:
21
+
22
+ ```bash
23
+ agentrunner --help
24
+ ```
25
+
26
+ ## Quick Start
27
+
28
+ ### 1. Initialize
29
+
30
+ ```bash
31
+ agentrunner init --token <DAEMON_TOKEN>
32
+ ```
33
+
34
+ The `init` command:
35
+
36
+ 1. Saves the token to `~/.agentteams/daemon.json`
37
+ 2. Validates the token against the API server
38
+ 3. Registers an OS-level autostart service and starts the runner immediately
39
+ - **macOS**: `~/Library/LaunchAgents/run.agentteams.runner.plist` (launchd)
40
+ - **Linux**: `~/.config/systemd/user/agentrunner.service` (systemd)
41
+ - **Windows**: Startup folder `agentrunner-start.vbs`
42
+
43
+ ### Options
44
+
45
+ - `--token <token>` — **Required**. Daemon token issued from the web UI
46
+ - `--no-autostart` — Optional. Skip autostart registration (manual start only)
47
+
48
+ Examples:
49
+
50
+ ```bash
51
+ # Standard setup (with autostart)
52
+ agentrunner init --token daemon_xxxxx
53
+
54
+ # Token-only setup (no autostart)
55
+ agentrunner init --token daemon_xxxxx --no-autostart
56
+ ```
57
+
58
+ ### 2. Start (`start`)
59
+
60
+ ```bash
61
+ agentrunner start
62
+ ```
63
+
64
+ Running without a subcommand defaults to `start`:
65
+
66
+ ```bash
67
+ agentrunner
68
+ ```
69
+
70
+ > If autostart was registered via `init`, you do not need to run `start` manually.
71
+ > The OS will start the runner automatically on login/boot.
72
+
73
+ ### 3. Check Status (`status`)
74
+
75
+ ```bash
76
+ agentrunner status
77
+ ```
78
+
79
+ Shows whether the runner process is active and whether autostart is registered.
80
+
81
+ Example output:
82
+
83
+ ```
84
+ [...] INFO Daemon is running { pid: 12345 }
85
+ [...] INFO Autostart is enabled { platform: 'launchd' }
86
+ ```
87
+
88
+ ### 4. Stop (`stop`)
89
+
90
+ ```bash
91
+ agentrunner stop
92
+ ```
93
+
94
+ Sends SIGTERM to the running process for a graceful shutdown.
95
+
96
+ > If autostart is registered, the OS may restart the runner automatically.
97
+ > Use `uninstall` to stop completely.
98
+
99
+ ### 5. Restart (`restart`)
100
+
101
+ ```bash
102
+ agentrunner restart
103
+ ```
104
+
105
+ Restarts the runner using the current environment:
106
+
107
+ - If autostart is registered, AgentRunner restarts through the registered OS service.
108
+ - If autostart is not registered, AgentRunner starts a new detached background process.
109
+
110
+ ### 6. Update (`update`)
111
+
112
+ ```bash
113
+ agentrunner update
114
+ ```
115
+
116
+ Updates the globally installed `@agentteams/runner` package to the latest npm version and then restarts the runner.
117
+
118
+ ### 7. Uninstall (`uninstall`)
119
+
120
+ ```bash
121
+ agentrunner uninstall
122
+ ```
123
+
124
+ Performs the following:
125
+
126
+ 1. Stops the running process
127
+ 2. Removes the autostart service and deletes the service file
128
+ 3. Cleans up the PID file
129
+
130
+ ## Configuration
131
+
132
+ Settings are resolved in the following priority order at runtime.
133
+
134
+ ### Token
135
+
136
+ 1. `AGENTTEAMS_DAEMON_TOKEN` environment variable
137
+ 2. `daemonToken` in `~/.agentteams/daemon.json`
138
+
139
+ ### Environment Variables
140
+
141
+ | Variable | Default | Description |
142
+ |---|---|---|
143
+ | `POLLING_INTERVAL_MS` | `30000` (30s) | Polling interval for pending triggers |
144
+ | `IDLE_TIMEOUT_MS` | `600000` (10min) | Primary timeout. Stops a runner when it produces no stdout/stderr for the configured idle window |
145
+ | `TIMEOUT_MS` | `86400000` (24h) | Fail-safe timeout. Stops a runner only if it stays alive for the full wall-clock limit |
146
+ | `RUNNER_CMD` | `opencode` | Command used to execute agent tasks |
147
+ | `CODEX_SANDBOX_LEVEL` | `workspace-write` | Codex runner sandbox level. Allowed values: `workspace-write`, `off` |
148
+ | `LOG_LEVEL` | `info` | Log level: `debug`, `info`, `warn`, `error` |
149
+ | `DAEMON_VERBOSE_RUNNER_LOGS` | `true` | When `false`, reduces runner stdout/stderr to start/stop/error only |
150
+ | `DAEMON_PROMPT_LOG_MODE` | `preview` | Prompt logging: `off`, `length`, `preview`, `full` |
151
+
152
+ AgentRunner defaults to an idle-timeout-first policy. In normal operation, `IDLE_TIMEOUT_MS` is the control that ends stalled runs, while `TIMEOUT_MS` remains a 24-hour fail-safe for runaway processes.
153
+
154
+ If you set `CODEX_SANDBOX_LEVEL=off`, AgentRunner launches Codex with `--dangerously-bypass-approvals-and-sandbox`. Use this only when you explicitly want full git write access and accept the reduced safety boundary.
155
+
156
+ ## How It Works
157
+
158
+ After `start`, the runner operates in the following loop:
159
+
160
+ 1. Polls for pending triggers periodically
161
+ 2. Claims a trigger
162
+ 3. Fetches runtime info (working directory, API key)
163
+ 4. Executes `RUNNER_CMD run "<prompt>"`
164
+ 5. Updates trigger status based on exit code, idle timeout, or the 24-hour fail-safe timeout
165
+
166
+ If a process is already running for the same `agentConfigId`, new triggers are `REJECTED`.
167
+
168
+ ## Logs
169
+
170
+ - **Runner logs**: console output (forwarded to OS log system when autostarted)
171
+ - **macOS**: `/tmp/agentrunner.log`, `/tmp/agentrunner-error.log`
172
+ - **Linux**: `journalctl --user -u agentrunner -f`
173
+ - **Windows**: check the Startup folder script and the spawned background process
174
+ - **Task logs**: `<workdir>/.agentteams/daemonLog/daemon-<triggerId>.log`
175
+
176
+ ## Troubleshooting
177
+
178
+ ### `Missing token. Usage: agentrunner init --token <token> ...`
179
+
180
+ The `--token` flag was not provided to `init`.
181
+
182
+ ### `Daemon token is missing. Run 'agentrunner init --token <token>' first.`
183
+
184
+ No token found at runtime. Run `init` first or set the `AGENTTEAMS_DAEMON_TOKEN` environment variable.
185
+
186
+ ## License
187
+
188
+ Apache-2.0