@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.
Files changed (68) hide show
  1. package/dist/api-client.d.ts +18 -0
  2. package/dist/api-client.js +133 -0
  3. package/dist/api-client.js.map +1 -0
  4. package/dist/autostart.d.ts +15 -0
  5. package/dist/autostart.js +280 -0
  6. package/dist/autostart.js.map +1 -0
  7. package/dist/commands/init.d.ts +1 -0
  8. package/dist/commands/init.js +56 -0
  9. package/dist/commands/init.js.map +1 -0
  10. package/dist/commands/start.d.ts +1 -0
  11. package/dist/commands/start.js +21 -0
  12. package/dist/commands/start.js.map +1 -0
  13. package/dist/commands/status.d.ts +1 -0
  14. package/dist/commands/status.js +20 -0
  15. package/dist/commands/status.js.map +1 -0
  16. package/dist/commands/stop.d.ts +1 -0
  17. package/dist/commands/stop.js +21 -0
  18. package/dist/commands/stop.js.map +1 -0
  19. package/dist/commands/uninstall.d.ts +1 -0
  20. package/dist/commands/uninstall.js +21 -0
  21. package/dist/commands/uninstall.js.map +1 -0
  22. package/dist/config.d.ts +6 -0
  23. package/dist/config.js +66 -0
  24. package/dist/config.js.map +1 -0
  25. package/dist/handlers/trigger-handler.d.ts +3 -0
  26. package/dist/handlers/trigger-handler.js +145 -0
  27. package/dist/handlers/trigger-handler.js.map +1 -0
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.js +64 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/logger.d.ts +5 -0
  32. package/dist/logger.js +25 -0
  33. package/dist/logger.js.map +1 -0
  34. package/dist/pid.d.ts +8 -0
  35. package/dist/pid.js +48 -0
  36. package/dist/pid.js.map +1 -0
  37. package/dist/poller.d.ts +4 -0
  38. package/dist/poller.js +62 -0
  39. package/dist/poller.js.map +1 -0
  40. package/dist/runners/claude-code.d.ts +4 -0
  41. package/dist/runners/claude-code.js +166 -0
  42. package/dist/runners/claude-code.js.map +1 -0
  43. package/dist/runners/codex.d.ts +4 -0
  44. package/dist/runners/codex.js +166 -0
  45. package/dist/runners/codex.js.map +1 -0
  46. package/dist/runners/gemini.d.ts +4 -0
  47. package/dist/runners/gemini.js +166 -0
  48. package/dist/runners/gemini.js.map +1 -0
  49. package/dist/runners/index.d.ts +2 -0
  50. package/dist/runners/index.js +25 -0
  51. package/dist/runners/index.js.map +1 -0
  52. package/dist/runners/log-reporter.d.ts +17 -0
  53. package/dist/runners/log-reporter.js +107 -0
  54. package/dist/runners/log-reporter.js.map +1 -0
  55. package/dist/runners/opencode.d.ts +6 -0
  56. package/dist/runners/opencode.js +170 -0
  57. package/dist/runners/opencode.js.map +1 -0
  58. package/dist/runners/types.d.ts +19 -0
  59. package/dist/runners/types.js +2 -0
  60. package/dist/runners/types.js.map +1 -0
  61. package/dist/types.d.ts +52 -0
  62. package/dist/types.js +2 -0
  63. package/dist/types.js.map +1 -0
  64. package/dist/utils/runner-history.d.ts +6 -0
  65. package/dist/utils/runner-history.js +13 -0
  66. package/dist/utils/runner-history.js.map +1 -0
  67. package/package.json +38 -0
  68. package/readme.md +160 -0
@@ -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,3 @@
1
+ import type { DaemonTrigger, RuntimeConfig } from "../types.js";
2
+ import { DaemonApiClient } from "../api-client.js";
3
+ export declare const createTriggerHandler: (config: RuntimeConfig, client: DaemonApiClient) => (trigger: DaemonTrigger) => Promise<void>;
@@ -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":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,MAAqB,EACrB,MAAuB,EACvB,EAAE;IACF,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3D,MAAM,gBAAgB,GAAG,MAAM,CAAC;IAEhC,MAAM,uBAAuB,GAAG,KAAK,EACnC,SAAiB,EACjB,WAA0B,EACX,EAAE;QACjB,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YAChC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO;YACT,CAAC;YACD,MAAM,MAAM,CAAC,oBAAoB,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACpF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,yCAAyC,EAAE;gBACrD,SAAS;gBACT,WAAW;gBACX,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,MAA+B,EAAU,EAAE;QACjE,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,OAAsB,EAAE,kBAAiC,EAAE,iBAAgC,EAAU,EAAE;QAChI,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAExD,MAAM,YAAY,GAAG;YACnB,EAAE;YACF,MAAM;YACN,cAAc,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,6BAA6B;YACnF,GAAG,CAAC,cAAc;gBAChB,CAAC,CAAC;oBACE,sBAAsB,OAAO,CAAC,eAAe,EAAE;oBAC/C,4BAA4B,iBAAiB,IAAI,wCAAwC,EAAE;oBAC3F,uFAAuF;iBACxF;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,mBAAmB,kBAAkB,IAAI,wCAAwC,EAAE;YACnF,8DAA8D;YAC9D,0EAA0E;YAC1E,kCAAkC;YAClC,kBAAkB;YAClB,kBAAkB;YAClB,uBAAuB;YACvB,qBAAqB;YACrB,6BAA6B;YAC7B,0FAA0F;YAC1F,6DAA6D;YAC7D,yFAAyF;YACzF,yEAAyE;YACzE,kEAAkE;YAClE,8FAA8F;YAC9F,oEAAoE;YACpE,MAAM;SACP,CAAC;QAEF,OAAO,GAAG,UAAU,KAAK,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACrD,CAAC,CAAC;IAEF,OAAO,KAAK,EAAE,OAAsB,EAAiB,EAAE;QACrD,IAAI,WAAW,GAA8B,IAAI,CAAC;QAClD,IAAI,kBAAkB,GAAkB,IAAI,CAAC;QAE7C,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;gBACvC,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,UAAU,EAAE,OAAO,CAAC,UAAU;aAC/B,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC7D,WAAW,GAAG,IAAI,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YACzD,WAAW,CAAC,KAAK,EAAE,CAAC;YACpB,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,+BAA+B,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC;YAEjF,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBACrC,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;aACvC,CAAC,CAAC;YACH,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,kCAAkC,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC;YAExF,MAAM,YAAY,GAAG,yBAAyB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;YACtG,kBAAkB,GAAG,YAAY,CAAC,kBAAkB,CAAC;YACrD,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,EAAE,YAAY,CAAC,kBAAkB,EAAE,YAAY,CAAC,iBAAiB,CAAC,CAAC;YAEjH,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAChD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC;gBACjC,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,MAAM,EAAE,YAAY;gBACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBACrC,CAAC;gBACD,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBACrC,CAAC;aACF,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBACrC,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,QAAQ,EAAE,SAAS,CAAC,QAAQ;aAC7B,CAAC,CAAC;YACH,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,iCAAiC,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC;YACnF,MAAM,uBAAuB,CAAC,OAAO,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;YAC9D,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;YAEzB,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC5D,MAAM,YAAY,GAAG,MAAM,KAAK,QAAQ;gBACtC,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,IAAI,SAAS,CAAC,UAAU,IAAI,2BAA2B,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACrG,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,MAAM,CAAC,mBAAmB,CAC9B,OAAO,CAAC,EAAE,EACV,MAAM,EACN,YAAY,CACb,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE;gBAC/B,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,MAAM;aACP,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;gBACtC,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrF,MAAM,uBAAuB,CAAC,OAAO,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;gBAC9D,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;gBAC3B,CAAC;gBACD,MAAM,MAAM,CAAC,mBAAmB,CAC9B,OAAO,CAAC,EAAE,EACV,QAAQ,EACR,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;YACJ,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBACrB,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE;oBACjD,SAAS,EAAE,OAAO,CAAC,EAAE;oBACrB,KAAK,EAAE,WAAW,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;iBAChF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
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"}
@@ -0,0 +1,5 @@
1
+ export declare const logger: {
2
+ info: (message: string, meta?: Record<string, unknown>) => void;
3
+ warn: (message: string, meta?: Record<string, unknown>) => void;
4
+ error: (message: string, meta?: Record<string, unknown>) => void;
5
+ };
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
@@ -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"}
@@ -0,0 +1,4 @@
1
+ import type { DaemonTrigger, RuntimeConfig } from "./types.js";
2
+ type TriggerHandler = (trigger: DaemonTrigger) => Promise<void>;
3
+ export declare const startPolling: (config: RuntimeConfig, onTrigger: TriggerHandler) => Promise<void>;
4
+ export {};
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":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Runner, RunnerOptions, RunResult } from "./types.js";
2
+ export declare class ClaudeCodeRunner implements Runner {
3
+ run(opts: RunnerOptions): Promise<RunResult>;
4
+ }