@rlarua/agentrunner 0.0.3
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 +18 -0
- package/dist/api-client.js +133 -0
- package/dist/api-client.js.map +1 -0
- package/dist/autostart.d.ts +15 -0
- package/dist/autostart.js +280 -0
- package/dist/autostart.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +56 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/start.d.ts +1 -0
- package/dist/commands/start.js +21 -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/config.d.ts +6 -0
- package/dist/config.js +66 -0
- package/dist/config.js.map +1 -0
- package/dist/handlers/trigger-handler.d.ts +3 -0
- package/dist/handlers/trigger-handler.js +145 -0
- package/dist/handlers/trigger-handler.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +64 -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 +48 -0
- package/dist/pid.js.map +1 -0
- package/dist/poller.d.ts +4 -0
- package/dist/poller.js +62 -0
- package/dist/poller.js.map +1 -0
- package/dist/runners/claude-code.d.ts +4 -0
- package/dist/runners/claude-code.js +166 -0
- package/dist/runners/claude-code.js.map +1 -0
- package/dist/runners/codex.d.ts +4 -0
- package/dist/runners/codex.js +166 -0
- package/dist/runners/codex.js.map +1 -0
- package/dist/runners/gemini.d.ts +4 -0
- package/dist/runners/gemini.js +166 -0
- package/dist/runners/gemini.js.map +1 -0
- package/dist/runners/index.d.ts +2 -0
- package/dist/runners/index.js +25 -0
- package/dist/runners/index.js.map +1 -0
- package/dist/runners/log-reporter.d.ts +17 -0
- package/dist/runners/log-reporter.js +107 -0
- package/dist/runners/log-reporter.js.map +1 -0
- package/dist/runners/opencode.d.ts +6 -0
- package/dist/runners/opencode.js +170 -0
- package/dist/runners/opencode.js.map +1 -0
- package/dist/runners/types.d.ts +19 -0
- package/dist/runners/types.js +2 -0
- package/dist/runners/types.js.map +1 -0
- package/dist/types.d.ts +52 -0
- package/dist/types.js +2 -0
- package/dist/types.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/package.json +38 -0
- package/readme.md +160 -0
package/dist/config.d.ts
ADDED
|
@@ -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,66 @@
|
|
|
1
|
+
import { 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 = 1_800_000;
|
|
6
|
+
const DEFAULT_RUNNER_CMD = "opencode";
|
|
7
|
+
const DEFAULT_API_URL = "https://api.agentteams.run";
|
|
8
|
+
export const getDaemonConfigPath = () => {
|
|
9
|
+
return join(homedir(), ".agentteams", "daemon.json");
|
|
10
|
+
};
|
|
11
|
+
const parsePositiveInteger = (rawValue, fallback) => {
|
|
12
|
+
if (!rawValue) {
|
|
13
|
+
return fallback;
|
|
14
|
+
}
|
|
15
|
+
const parsed = Number(rawValue);
|
|
16
|
+
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
17
|
+
return fallback;
|
|
18
|
+
}
|
|
19
|
+
return Math.floor(parsed);
|
|
20
|
+
};
|
|
21
|
+
export const readDaemonConfigFile = async () => {
|
|
22
|
+
const path = getDaemonConfigPath();
|
|
23
|
+
try {
|
|
24
|
+
const content = await fs.readFile(path, "utf8");
|
|
25
|
+
const parsed = JSON.parse(content);
|
|
26
|
+
if (!parsed.daemonToken || !parsed.apiUrl) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
daemonToken: parsed.daemonToken,
|
|
31
|
+
apiUrl: parsed.apiUrl
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
export const writeDaemonConfigFile = async (config) => {
|
|
39
|
+
const path = getDaemonConfigPath();
|
|
40
|
+
await fs.mkdir(dirname(path), { recursive: true });
|
|
41
|
+
await fs.writeFile(path, JSON.stringify(config, null, 2), "utf8");
|
|
42
|
+
return path;
|
|
43
|
+
};
|
|
44
|
+
export const resolveRuntimeConfig = async () => {
|
|
45
|
+
const fileConfig = await readDaemonConfigFile();
|
|
46
|
+
const daemonToken = process.env.AGENTTEAMS_DAEMON_TOKEN ?? fileConfig?.daemonToken;
|
|
47
|
+
const apiUrl = process.env.AGENTTEAMS_API_URL ?? fileConfig?.apiUrl ?? DEFAULT_API_URL;
|
|
48
|
+
if (!daemonToken || daemonToken.trim().length === 0) {
|
|
49
|
+
throw new Error("Daemon token is missing. Run 'agentrunner init --token <token>' first.");
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
daemonToken,
|
|
53
|
+
apiUrl,
|
|
54
|
+
pollingIntervalMs: parsePositiveInteger(process.env.POLLING_INTERVAL_MS, DEFAULT_POLLING_INTERVAL_MS),
|
|
55
|
+
timeoutMs: parsePositiveInteger(process.env.TIMEOUT_MS, DEFAULT_TIMEOUT_MS),
|
|
56
|
+
runnerCmd: process.env.RUNNER_CMD?.trim() || DEFAULT_RUNNER_CMD
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
export const resolveApiUrlForInit = async (apiUrlArg) => {
|
|
60
|
+
if (apiUrlArg && apiUrlArg.trim().length > 0) {
|
|
61
|
+
return apiUrlArg.trim();
|
|
62
|
+
}
|
|
63
|
+
const fileConfig = await readDaemonConfigFile();
|
|
64
|
+
return process.env.AGENTTEAMS_API_URL ?? fileConfig?.apiUrl ?? DEFAULT_API_URL;
|
|
65
|
+
};
|
|
66
|
+
//# 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,145 @@
|
|
|
1
|
+
import { createRunnerFactory } from "../runners/index.js";
|
|
2
|
+
import { TriggerLogReporter } from "../runners/log-reporter.js";
|
|
3
|
+
import { logger } from "../logger.js";
|
|
4
|
+
import { readFile } from "node:fs/promises";
|
|
5
|
+
import { resolveRunnerHistoryPaths } from "../utils/runner-history.js";
|
|
6
|
+
export const createTriggerHandler = (config, client) => {
|
|
7
|
+
const createRunner = createRunnerFactory(config.runnerCmd);
|
|
8
|
+
const maxHistoryLength = 200000;
|
|
9
|
+
const reportHistoryToDatabase = async (triggerId, historyPath) => {
|
|
10
|
+
if (!historyPath) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
const content = await readFile(historyPath, "utf8");
|
|
15
|
+
const markdown = content.trim();
|
|
16
|
+
if (markdown.length === 0) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
await client.updateTriggerHistory(triggerId, markdown.slice(0, maxHistoryLength));
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
logger.warn("Failed to load or update runner history", {
|
|
23
|
+
triggerId,
|
|
24
|
+
historyPath,
|
|
25
|
+
error: error instanceof Error ? error.message : String(error)
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const toPromptString = (prompt) => {
|
|
30
|
+
if (typeof prompt === "string") {
|
|
31
|
+
return prompt;
|
|
32
|
+
}
|
|
33
|
+
return JSON.stringify(prompt);
|
|
34
|
+
};
|
|
35
|
+
const buildRunnerPrompt = (trigger, currentHistoryPath, parentHistoryPath) => {
|
|
36
|
+
const basePrompt = toPromptString(trigger.prompt);
|
|
37
|
+
const isContinuation = Boolean(trigger.parentTriggerId);
|
|
38
|
+
const historyLines = [
|
|
39
|
+
"",
|
|
40
|
+
"----",
|
|
41
|
+
isContinuation ? "Continuation context (required):" : "History context (required):",
|
|
42
|
+
...(isContinuation
|
|
43
|
+
? [
|
|
44
|
+
`- parentTriggerId: ${trigger.parentTriggerId}`,
|
|
45
|
+
`- Previous history path: ${parentHistoryPath ?? "(unavailable: authPath not configured)"}`,
|
|
46
|
+
"- Read the previous history file first and continue without repeating completed work.",
|
|
47
|
+
]
|
|
48
|
+
: []),
|
|
49
|
+
`- History path: ${currentHistoryPath ?? "(unavailable: authPath not configured)"}`,
|
|
50
|
+
"- Save history as a Markdown file (.md) at the history path.",
|
|
51
|
+
"- Overwrite the markdown file with the latest full summary for this run.",
|
|
52
|
+
"- Required sections in the file:",
|
|
53
|
+
" 1) ### Summary",
|
|
54
|
+
" 2) ### Changes",
|
|
55
|
+
" 3) ### Verification",
|
|
56
|
+
" 4) ### Next Steps",
|
|
57
|
+
" 5) ### Questions for User",
|
|
58
|
+
"- Do not add a top-level title (e.g., # Runner History). Start directly with ## Summary.",
|
|
59
|
+
"- In ### Summary, write 3-5 bullet points of what was done.",
|
|
60
|
+
"- In ### Changes, include changed files (absolute or workspace-relative paths) and why.",
|
|
61
|
+
"- In ### Verification, include executed commands and pass/fail results.",
|
|
62
|
+
"- In ### Next Steps, include up to 3 concrete follow-up actions.",
|
|
63
|
+
"- In ### Questions for User, include only blocking or decision-required questions (up to 3).",
|
|
64
|
+
"- Do not truncate or abbreviate the ## Summary content in history.",
|
|
65
|
+
"----"
|
|
66
|
+
];
|
|
67
|
+
return `${basePrompt}\n${historyLines.join("\n")}`;
|
|
68
|
+
};
|
|
69
|
+
return async (trigger) => {
|
|
70
|
+
let logReporter = null;
|
|
71
|
+
let currentHistoryPath = null;
|
|
72
|
+
try {
|
|
73
|
+
logger.info("Trigger execution started", {
|
|
74
|
+
triggerId: trigger.id,
|
|
75
|
+
runnerType: trigger.runnerType
|
|
76
|
+
});
|
|
77
|
+
const runtime = await client.fetchTriggerRuntime(trigger.id);
|
|
78
|
+
logReporter = new TriggerLogReporter(client, trigger.id);
|
|
79
|
+
logReporter.start();
|
|
80
|
+
logReporter.append("INFO", `Trigger started with runner ${trigger.runnerType}.`);
|
|
81
|
+
logger.info("Trigger runtime fetched", {
|
|
82
|
+
triggerId: trigger.id,
|
|
83
|
+
agentConfigId: runtime.agentConfigId,
|
|
84
|
+
hasAuthPath: Boolean(runtime.authPath)
|
|
85
|
+
});
|
|
86
|
+
logReporter.append("INFO", `Runtime fetched (agentConfigId=${runtime.agentConfigId}).`);
|
|
87
|
+
const historyPaths = resolveRunnerHistoryPaths(runtime.authPath, trigger.id, trigger.parentTriggerId);
|
|
88
|
+
currentHistoryPath = historyPaths.currentHistoryPath;
|
|
89
|
+
const runnerPrompt = buildRunnerPrompt(trigger, historyPaths.currentHistoryPath, historyPaths.parentHistoryPath);
|
|
90
|
+
const runner = createRunner(trigger.runnerType);
|
|
91
|
+
const runResult = await runner.run({
|
|
92
|
+
triggerId: trigger.id,
|
|
93
|
+
prompt: runnerPrompt,
|
|
94
|
+
authPath: runtime.authPath,
|
|
95
|
+
apiKey: runtime.apiKey,
|
|
96
|
+
apiUrl: config.apiUrl,
|
|
97
|
+
timeoutMs: config.timeoutMs,
|
|
98
|
+
agentConfigId: runtime.agentConfigId,
|
|
99
|
+
onStdoutChunk: (chunk) => {
|
|
100
|
+
logReporter?.append("INFO", chunk);
|
|
101
|
+
},
|
|
102
|
+
onStderrChunk: (chunk) => {
|
|
103
|
+
logReporter?.append("WARN", chunk);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
logger.info("Trigger runner finished", {
|
|
107
|
+
triggerId: trigger.id,
|
|
108
|
+
exitCode: runResult.exitCode
|
|
109
|
+
});
|
|
110
|
+
logReporter.append("INFO", `Runner finished with exitCode=${runResult.exitCode}.`);
|
|
111
|
+
await reportHistoryToDatabase(trigger.id, currentHistoryPath);
|
|
112
|
+
await logReporter.stop();
|
|
113
|
+
const status = runResult.exitCode === 0 ? "DONE" : "FAILED";
|
|
114
|
+
const errorMessage = status === "FAILED"
|
|
115
|
+
? (runResult.errorMessage || runResult.lastOutput || `Runner exited with code ${runResult.exitCode}`)
|
|
116
|
+
: undefined;
|
|
117
|
+
await client.updateTriggerStatus(trigger.id, status, errorMessage);
|
|
118
|
+
logger.info("Trigger completed", {
|
|
119
|
+
triggerId: trigger.id,
|
|
120
|
+
status
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
logger.error("Trigger handling failed", {
|
|
125
|
+
triggerId: trigger.id,
|
|
126
|
+
error: error instanceof Error ? error.message : String(error)
|
|
127
|
+
});
|
|
128
|
+
try {
|
|
129
|
+
logReporter?.append("ERROR", error instanceof Error ? error.message : String(error));
|
|
130
|
+
await reportHistoryToDatabase(trigger.id, currentHistoryPath);
|
|
131
|
+
if (logReporter) {
|
|
132
|
+
await logReporter.stop();
|
|
133
|
+
}
|
|
134
|
+
await client.updateTriggerStatus(trigger.id, "FAILED", error instanceof Error ? error.message : String(error));
|
|
135
|
+
}
|
|
136
|
+
catch (statusError) {
|
|
137
|
+
logger.error("Failed to report trigger as FAILED", {
|
|
138
|
+
triggerId: trigger.id,
|
|
139
|
+
error: statusError instanceof Error ? statusError.message : String(statusError)
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=trigger-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-handler.js","sourceRoot":"","sources":["../../src/handlers/trigger-handler.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { runInitCommand } from "./commands/init.js";
|
|
4
|
+
import { runStartCommand } from "./commands/start.js";
|
|
5
|
+
import { runStatusCommand } from "./commands/status.js";
|
|
6
|
+
import { runStopCommand } from "./commands/stop.js";
|
|
7
|
+
import { runUninstallCommand } from "./commands/uninstall.js";
|
|
8
|
+
import { logger } from "./logger.js";
|
|
9
|
+
const require = createRequire(import.meta.url);
|
|
10
|
+
const packageJson = require("../package.json");
|
|
11
|
+
const daemonVersion = packageJson.version ?? "0.0.0";
|
|
12
|
+
const helpText = `Usage: agentrunner [command] [options]
|
|
13
|
+
|
|
14
|
+
Commands:
|
|
15
|
+
start Start daemon polling (default)
|
|
16
|
+
init --token <token> Initialize daemon config and register autostart
|
|
17
|
+
status Show daemon and autostart status
|
|
18
|
+
stop Stop running daemon
|
|
19
|
+
uninstall Stop daemon, remove autostart, clean up
|
|
20
|
+
|
|
21
|
+
Options:
|
|
22
|
+
--no-autostart Skip autostart registration (init only)
|
|
23
|
+
-h, --help Show help
|
|
24
|
+
-v, --version Show version
|
|
25
|
+
`;
|
|
26
|
+
const main = async () => {
|
|
27
|
+
const [, , command, ...args] = process.argv;
|
|
28
|
+
if (command === "-h" || command === "--help" || command === "help") {
|
|
29
|
+
process.stdout.write(helpText);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (command === "-v" || command === "--version" || command === "version") {
|
|
33
|
+
process.stdout.write(`${daemonVersion}\n`);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (!command || command === "start") {
|
|
37
|
+
await runStartCommand();
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (command === "init") {
|
|
41
|
+
await runInitCommand(args);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (command === "status") {
|
|
45
|
+
await runStatusCommand();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (command === "stop") {
|
|
49
|
+
await runStopCommand();
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (command === "uninstall") {
|
|
53
|
+
await runUninstallCommand();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
throw new Error(`Unknown command: ${command}`);
|
|
57
|
+
};
|
|
58
|
+
main().catch((error) => {
|
|
59
|
+
logger.error("Daemon exited with error", {
|
|
60
|
+
error: error instanceof Error ? error.message : String(error)
|
|
61
|
+
});
|
|
62
|
+
process.exit(1);
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAyB,CAAC;AACvE,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,IAAI,OAAO,CAAC;AAErD,MAAM,QAAQ,GAAG;;;;;;;;;;;;;CAahB,CAAC;AAEF,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;IACtB,MAAM,CAAC,EAAE,AAAD,EAAG,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAE5C,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACzE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,aAAa,IAAI,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACpC,MAAM,eAAe,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,MAAM,gBAAgB,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,cAAc,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;QAC5B,MAAM,mBAAmB,EAAE,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;AACjD,CAAC,CAAC;AAEF,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE;QACvC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;KAC9D,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/logger.d.ts
ADDED
package/dist/logger.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
const timestamp = () => new Date().toISOString();
|
|
2
|
+
export const logger = {
|
|
3
|
+
info: (message, meta) => {
|
|
4
|
+
if (meta) {
|
|
5
|
+
console.log(`[${timestamp()}] INFO ${message}`, meta);
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
console.log(`[${timestamp()}] INFO ${message}`);
|
|
9
|
+
},
|
|
10
|
+
warn: (message, meta) => {
|
|
11
|
+
if (meta) {
|
|
12
|
+
console.warn(`[${timestamp()}] WARN ${message}`, meta);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
console.warn(`[${timestamp()}] WARN ${message}`);
|
|
16
|
+
},
|
|
17
|
+
error: (message, meta) => {
|
|
18
|
+
if (meta) {
|
|
19
|
+
console.error(`[${timestamp()}] ERROR ${message}`, meta);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
console.error(`[${timestamp()}] ERROR ${message}`);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAEjD,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,CAAC,OAAe,EAAE,IAA8B,EAAE,EAAE;QACxD,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,UAAU,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,UAAU,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,EAAE,CAAC,OAAe,EAAE,IAA8B,EAAE,EAAE;QACxD,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,UAAU,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,UAAU,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,IAA8B,EAAE,EAAE;QACzD,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,EAAE,WAAW,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;YACzD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,EAAE,WAAW,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC;CACF,CAAC"}
|
package/dist/pid.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const writePidFile: () => Promise<void>;
|
|
2
|
+
export declare const readPidFile: () => Promise<number | null>;
|
|
3
|
+
export declare const removePidFile: () => Promise<void>;
|
|
4
|
+
export declare const isProcessRunning: (pid: number) => boolean;
|
|
5
|
+
export declare const getDaemonStatus: () => Promise<{
|
|
6
|
+
running: boolean;
|
|
7
|
+
pid: number | null;
|
|
8
|
+
}>;
|
package/dist/pid.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
const PID_FILE_PATH = join(homedir(), ".agentteams", "daemon.pid");
|
|
5
|
+
export const writePidFile = async () => {
|
|
6
|
+
await fs.mkdir(dirname(PID_FILE_PATH), { recursive: true });
|
|
7
|
+
await fs.writeFile(PID_FILE_PATH, String(process.pid), "utf8");
|
|
8
|
+
};
|
|
9
|
+
export const readPidFile = async () => {
|
|
10
|
+
try {
|
|
11
|
+
const content = await fs.readFile(PID_FILE_PATH, "utf8");
|
|
12
|
+
const pid = Number(content.trim());
|
|
13
|
+
return Number.isFinite(pid) && pid > 0 ? pid : null;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
export const removePidFile = async () => {
|
|
20
|
+
try {
|
|
21
|
+
await fs.unlink(PID_FILE_PATH);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// File may not exist — that's fine.
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
export const isProcessRunning = (pid) => {
|
|
28
|
+
try {
|
|
29
|
+
process.kill(pid, 0);
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
export const getDaemonStatus = async () => {
|
|
37
|
+
const pid = await readPidFile();
|
|
38
|
+
if (pid === null) {
|
|
39
|
+
return { running: false, pid: null };
|
|
40
|
+
}
|
|
41
|
+
if (isProcessRunning(pid)) {
|
|
42
|
+
return { running: true, pid };
|
|
43
|
+
}
|
|
44
|
+
// Stale PID file — process no longer exists.
|
|
45
|
+
await removePidFile();
|
|
46
|
+
return { running: false, pid: null };
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=pid.js.map
|
package/dist/pid.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pid.js","sourceRoot":"","sources":["../src/pid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;AAEnE,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,IAAmB,EAAE;IACpD,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;AACjE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAA4B,EAAE;IAC5D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,IAAmB,EAAE;IACrD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAW,EAAE;IACvD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,IAAuD,EAAE;IAC3F,MAAM,GAAG,GAAG,MAAM,WAAW,EAAE,CAAC;IAEhC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACvC,CAAC;IAED,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAChC,CAAC;IAED,6CAA6C;IAC7C,MAAM,aAAa,EAAE,CAAC;IACtB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACvC,CAAC,CAAC"}
|
package/dist/poller.d.ts
ADDED
package/dist/poller.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { logger } from "./logger.js";
|
|
2
|
+
import { DaemonApiClient } from "./api-client.js";
|
|
3
|
+
export const startPolling = async (config, onTrigger) => {
|
|
4
|
+
const client = new DaemonApiClient(config.apiUrl, config.daemonToken);
|
|
5
|
+
let isPolling = false;
|
|
6
|
+
const pollOnce = async () => {
|
|
7
|
+
if (isPolling) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
isPolling = true;
|
|
11
|
+
try {
|
|
12
|
+
const pending = await client.fetchPendingTrigger();
|
|
13
|
+
if (!pending) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const claim = await client.claimTrigger(pending.id);
|
|
17
|
+
if (claim.conflict) {
|
|
18
|
+
logger.info("Trigger already claimed by another daemon", { triggerId: pending.id });
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (!claim.ok) {
|
|
22
|
+
logger.warn("Claim was rejected", { triggerId: pending.id });
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
void onTrigger(pending).catch((error) => {
|
|
26
|
+
logger.error("Trigger handler execution failed", {
|
|
27
|
+
triggerId: pending.id,
|
|
28
|
+
error: error instanceof Error ? error.message : String(error)
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
logger.error("Polling cycle failed", {
|
|
34
|
+
error: error instanceof Error ? error.message : String(error)
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
isPolling = false;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const interval = setInterval(() => {
|
|
42
|
+
void pollOnce();
|
|
43
|
+
}, config.pollingIntervalMs);
|
|
44
|
+
logger.info("Daemon polling started", {
|
|
45
|
+
apiUrl: config.apiUrl,
|
|
46
|
+
pollingIntervalMs: config.pollingIntervalMs,
|
|
47
|
+
timeoutMs: config.timeoutMs,
|
|
48
|
+
runnerCmd: config.runnerCmd
|
|
49
|
+
});
|
|
50
|
+
await pollOnce();
|
|
51
|
+
const shutdown = () => {
|
|
52
|
+
clearInterval(interval);
|
|
53
|
+
logger.info("Daemon stopped");
|
|
54
|
+
process.exit(0);
|
|
55
|
+
};
|
|
56
|
+
process.on("SIGINT", shutdown);
|
|
57
|
+
process.on("SIGTERM", shutdown);
|
|
58
|
+
await new Promise(() => {
|
|
59
|
+
// Keep process alive until shutdown signal.
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=poller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poller.js","sourceRoot":"","sources":["../src/poller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAKlD,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,MAAqB,EAAE,SAAyB,EAAiB,EAAE;IACpG,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACtE,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,IAAI,SAAS,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,SAAS,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,mBAAmB,EAAE,CAAC;YACnD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACpD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,MAAM,CAAC,IAAI,CAAC,2CAA2C,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpF,OAAO;YACT,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7D,OAAO;YACT,CAAC;YAED,KAAK,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACtC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE;oBAC/C,SAAS,EAAE,OAAO,CAAC,EAAE;oBACrB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;gBACnC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,KAAK,QAAQ,EAAE,CAAC;IAClB,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAE7B,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;QACpC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAC;IAEH,MAAM,QAAQ,EAAE,CAAC;IAEjB,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,MAAM,IAAI,OAAO,CAAO,GAAG,EAAE;QAC3B,4CAA4C;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
|