@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.
- package/dist/api-client.d.ts +22 -0
- package/dist/api-client.js +201 -0
- package/dist/api-client.js.map +1 -0
- package/dist/api-client.test.d.ts +1 -0
- package/dist/api-client.test.js +118 -0
- package/dist/api-client.test.js.map +1 -0
- package/dist/autostart.d.ts +19 -0
- package/dist/autostart.js +359 -0
- package/dist/autostart.js.map +1 -0
- package/dist/autostart.test.d.ts +1 -0
- package/dist/autostart.test.js +42 -0
- package/dist/autostart.test.js.map +1 -0
- package/dist/commands/cleanup.d.ts +1 -0
- package/dist/commands/cleanup.js +12 -0
- package/dist/commands/cleanup.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +57 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/restart.d.ts +1 -0
- package/dist/commands/restart.js +7 -0
- package/dist/commands/restart.js.map +1 -0
- package/dist/commands/start.d.ts +1 -0
- package/dist/commands/start.js +34 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +1 -0
- package/dist/commands/status.js +20 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +1 -0
- package/dist/commands/stop.js +21 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/uninstall.d.ts +1 -0
- package/dist/commands/uninstall.js +21 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +10 -0
- package/dist/commands/update.js +58 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/update.test.d.ts +1 -0
- package/dist/commands/update.test.js +104 -0
- package/dist/commands/update.test.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.js +69 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test.d.ts +1 -0
- package/dist/config.test.js +133 -0
- package/dist/config.test.js.map +1 -0
- package/dist/daemon-control.d.ts +21 -0
- package/dist/daemon-control.js +58 -0
- package/dist/daemon-control.js.map +1 -0
- package/dist/daemon-control.test.d.ts +1 -0
- package/dist/daemon-control.test.js +48 -0
- package/dist/daemon-control.test.js.map +1 -0
- package/dist/executable.d.ts +25 -0
- package/dist/executable.js +141 -0
- package/dist/executable.js.map +1 -0
- package/dist/executable.test.d.ts +1 -0
- package/dist/executable.test.js +57 -0
- package/dist/executable.test.js.map +1 -0
- package/dist/handlers/trigger-handler.d.ts +25 -0
- package/dist/handlers/trigger-handler.js +308 -0
- package/dist/handlers/trigger-handler.js.map +1 -0
- package/dist/handlers/trigger-handler.test.d.ts +1 -0
- package/dist/handlers/trigger-handler.test.js +496 -0
- package/dist/handlers/trigger-handler.test.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +5 -0
- package/dist/logger.js +25 -0
- package/dist/logger.js.map +1 -0
- package/dist/pid.d.ts +8 -0
- package/dist/pid.js +49 -0
- package/dist/pid.js.map +1 -0
- package/dist/poller.d.ts +20 -0
- package/dist/poller.js +214 -0
- package/dist/poller.js.map +1 -0
- package/dist/poller.test.d.ts +1 -0
- package/dist/poller.test.js +382 -0
- package/dist/poller.test.js.map +1 -0
- package/dist/runners/amp.d.ts +5 -0
- package/dist/runners/amp.js +316 -0
- package/dist/runners/amp.js.map +1 -0
- package/dist/runners/claude-code.d.ts +6 -0
- package/dist/runners/claude-code.js +340 -0
- package/dist/runners/claude-code.js.map +1 -0
- package/dist/runners/claude-code.test.d.ts +1 -0
- package/dist/runners/claude-code.test.js +39 -0
- package/dist/runners/claude-code.test.js.map +1 -0
- package/dist/runners/codex.d.ts +6 -0
- package/dist/runners/codex.js +324 -0
- package/dist/runners/codex.js.map +1 -0
- package/dist/runners/codex.test.d.ts +1 -0
- package/dist/runners/codex.test.js +66 -0
- package/dist/runners/codex.test.js.map +1 -0
- package/dist/runners/gemini.d.ts +5 -0
- package/dist/runners/gemini.js +304 -0
- package/dist/runners/gemini.js.map +1 -0
- package/dist/runners/gemini.test.d.ts +1 -0
- package/dist/runners/gemini.test.js +16 -0
- package/dist/runners/gemini.test.js.map +1 -0
- package/dist/runners/index.d.ts +2 -0
- package/dist/runners/index.js +27 -0
- package/dist/runners/index.js.map +1 -0
- package/dist/runners/index.test.d.ts +1 -0
- package/dist/runners/index.test.js +19 -0
- package/dist/runners/index.test.js.map +1 -0
- package/dist/runners/log-reporter.d.ts +18 -0
- package/dist/runners/log-reporter.js +127 -0
- package/dist/runners/log-reporter.js.map +1 -0
- package/dist/runners/log-reporter.test.d.ts +1 -0
- package/dist/runners/log-reporter.test.js +152 -0
- package/dist/runners/log-reporter.test.js.map +1 -0
- package/dist/runners/opencode.d.ts +6 -0
- package/dist/runners/opencode.js +304 -0
- package/dist/runners/opencode.js.map +1 -0
- package/dist/runners/stream-json-parser.d.ts +17 -0
- package/dist/runners/stream-json-parser.js +116 -0
- package/dist/runners/stream-json-parser.js.map +1 -0
- package/dist/runners/types.d.ts +26 -0
- package/dist/runners/types.js +2 -0
- package/dist/runners/types.js.map +1 -0
- package/dist/types.d.ts +69 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/auth-path-store.d.ts +3 -0
- package/dist/utils/auth-path-store.js +37 -0
- package/dist/utils/auth-path-store.js.map +1 -0
- package/dist/utils/auth-path-store.test.d.ts +1 -0
- package/dist/utils/auth-path-store.test.js +70 -0
- package/dist/utils/auth-path-store.test.js.map +1 -0
- package/dist/utils/convention-sync.d.ts +8 -0
- package/dist/utils/convention-sync.js +41 -0
- package/dist/utils/convention-sync.js.map +1 -0
- package/dist/utils/convention-sync.test.d.ts +1 -0
- package/dist/utils/convention-sync.test.js +75 -0
- package/dist/utils/convention-sync.test.js.map +1 -0
- package/dist/utils/git-worktree.d.ts +9 -0
- package/dist/utils/git-worktree.js +150 -0
- package/dist/utils/git-worktree.js.map +1 -0
- package/dist/utils/git-worktree.test.d.ts +1 -0
- package/dist/utils/git-worktree.test.js +294 -0
- package/dist/utils/git-worktree.test.js.map +1 -0
- package/dist/utils/origin-issue-safeguard.d.ts +16 -0
- package/dist/utils/origin-issue-safeguard.js +198 -0
- package/dist/utils/origin-issue-safeguard.js.map +1 -0
- package/dist/utils/runner-cleanup.d.ts +10 -0
- package/dist/utils/runner-cleanup.js +59 -0
- package/dist/utils/runner-cleanup.js.map +1 -0
- package/dist/utils/runner-cleanup.test.d.ts +1 -0
- package/dist/utils/runner-cleanup.test.js +93 -0
- package/dist/utils/runner-cleanup.test.js.map +1 -0
- package/dist/utils/runner-history.d.ts +6 -0
- package/dist/utils/runner-history.js +13 -0
- package/dist/utils/runner-history.js.map +1 -0
- package/dist/utils/runner-history.test.d.ts +1 -0
- package/dist/utils/runner-history.test.js +25 -0
- package/dist/utils/runner-history.test.js.map +1 -0
- package/package.json +50 -0
- 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,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
|
+
[](https://github.com/rlarua/AgentTeams-runner)
|
|
4
|
+
[](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
|