@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,18 @@
1
+ import type { ClaimResult, DaemonInfo, DaemonTrigger, TriggerFinalStatus, TriggerLogInput, TriggerRuntime } from "./types.js";
2
+ export declare class DaemonApiClient {
3
+ private readonly apiUrl;
4
+ private readonly daemonToken;
5
+ constructor(apiUrl: string, daemonToken: string);
6
+ private daemonHeaders;
7
+ private requestWithRetry;
8
+ validateDaemonToken(): Promise<DaemonInfo>;
9
+ fetchPendingTrigger(): Promise<DaemonTrigger | null>;
10
+ claimTrigger(triggerId: string): Promise<ClaimResult>;
11
+ updateTriggerStatus(triggerId: string, status: TriggerFinalStatus, errorMessage?: string): Promise<void>;
12
+ updateTriggerHistory(triggerId: string, historyMarkdown: string): Promise<void>;
13
+ fetchTriggerRuntime(triggerId: string): Promise<TriggerRuntime>;
14
+ appendTriggerLogs(triggerId: string, input: {
15
+ logs?: TriggerLogInput[];
16
+ heartbeat?: boolean;
17
+ }): Promise<void>;
18
+ }
@@ -0,0 +1,133 @@
1
+ import { logger } from "./logger.js";
2
+ const MAX_NETWORK_RETRIES = 3;
3
+ const BASE_BACKOFF_MS = 1000;
4
+ const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
5
+ const isNetworkError = (error) => {
6
+ return error instanceof Error;
7
+ };
8
+ export class DaemonApiClient {
9
+ apiUrl;
10
+ daemonToken;
11
+ constructor(apiUrl, daemonToken) {
12
+ this.apiUrl = apiUrl;
13
+ this.daemonToken = daemonToken;
14
+ }
15
+ daemonHeaders() {
16
+ return {
17
+ "x-daemon-token": this.daemonToken
18
+ };
19
+ }
20
+ async requestWithRetry(path, options) {
21
+ const url = `${this.apiUrl}${path}`;
22
+ for (let attempt = 0; attempt <= MAX_NETWORK_RETRIES; attempt += 1) {
23
+ try {
24
+ return await fetch(url, options);
25
+ }
26
+ catch (error) {
27
+ if (!isNetworkError(error) || attempt >= MAX_NETWORK_RETRIES) {
28
+ throw error;
29
+ }
30
+ const retryNumber = attempt + 1;
31
+ const delayMs = BASE_BACKOFF_MS * (2 ** attempt);
32
+ logger.warn(`Retry ${retryNumber}/${MAX_NETWORK_RETRIES}: network error while requesting daemon API`, {
33
+ path,
34
+ delayMs,
35
+ error: error instanceof Error ? error.message : String(error)
36
+ });
37
+ await wait(delayMs);
38
+ }
39
+ }
40
+ throw new Error("Unexpected retry loop exit");
41
+ }
42
+ async validateDaemonToken() {
43
+ const response = await this.requestWithRetry("/api/daemons/me", {
44
+ method: "GET",
45
+ headers: this.daemonHeaders()
46
+ });
47
+ if (!response.ok) {
48
+ throw new Error(`Daemon token validation failed (${response.status})`);
49
+ }
50
+ const payload = await response.json();
51
+ return payload.data;
52
+ }
53
+ async fetchPendingTrigger() {
54
+ const response = await this.requestWithRetry("/api/daemon-triggers/pending", {
55
+ method: "GET",
56
+ headers: this.daemonHeaders()
57
+ });
58
+ if (!response.ok) {
59
+ throw new Error(`Failed to fetch pending trigger (${response.status})`);
60
+ }
61
+ const payload = await response.json();
62
+ return payload.data;
63
+ }
64
+ async claimTrigger(triggerId) {
65
+ const response = await this.requestWithRetry(`/api/daemon-triggers/${triggerId}/claim`, {
66
+ method: "PATCH",
67
+ headers: this.daemonHeaders()
68
+ });
69
+ if (response.status === 409) {
70
+ return { ok: false, conflict: true };
71
+ }
72
+ if (!response.ok) {
73
+ throw new Error(`Failed to claim trigger (${response.status})`);
74
+ }
75
+ return { ok: true, conflict: false };
76
+ }
77
+ async updateTriggerStatus(triggerId, status, errorMessage) {
78
+ const response = await this.requestWithRetry(`/api/daemon-triggers/${triggerId}/status`, {
79
+ method: "PATCH",
80
+ headers: {
81
+ ...this.daemonHeaders(),
82
+ "Content-Type": "application/json"
83
+ },
84
+ body: JSON.stringify({
85
+ status,
86
+ ...(errorMessage ? { errorMessage } : {})
87
+ })
88
+ });
89
+ if (!response.ok) {
90
+ throw new Error(`Failed to update trigger status (${response.status})`);
91
+ }
92
+ }
93
+ async updateTriggerHistory(triggerId, historyMarkdown) {
94
+ const response = await this.requestWithRetry(`/api/daemon-triggers/${triggerId}/history`, {
95
+ method: "PATCH",
96
+ headers: {
97
+ ...this.daemonHeaders(),
98
+ "Content-Type": "application/json"
99
+ },
100
+ body: JSON.stringify({
101
+ historyMarkdown
102
+ })
103
+ });
104
+ if (!response.ok) {
105
+ throw new Error(`Failed to update trigger history (${response.status})`);
106
+ }
107
+ }
108
+ async fetchTriggerRuntime(triggerId) {
109
+ const response = await this.requestWithRetry(`/api/daemon-triggers/${triggerId}/runtime`, {
110
+ method: "GET",
111
+ headers: this.daemonHeaders()
112
+ });
113
+ if (!response.ok) {
114
+ throw new Error(`Failed to fetch trigger runtime (${response.status})`);
115
+ }
116
+ const payload = await response.json();
117
+ return payload.data;
118
+ }
119
+ async appendTriggerLogs(triggerId, input) {
120
+ const response = await this.requestWithRetry(`/api/daemon-triggers/${triggerId}/logs`, {
121
+ method: "POST",
122
+ headers: {
123
+ ...this.daemonHeaders(),
124
+ "Content-Type": "application/json"
125
+ },
126
+ body: JSON.stringify(input)
127
+ });
128
+ if (!response.ok) {
129
+ throw new Error(`Failed to append trigger logs (${response.status})`);
130
+ }
131
+ }
132
+ }
133
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export type AutostartConfig = {
2
+ token: string;
3
+ apiUrl: string;
4
+ };
5
+ export type AutostartResult = {
6
+ registered: boolean;
7
+ servicePath: string;
8
+ platform: string;
9
+ };
10
+ export declare const registerAutostart: (config: AutostartConfig) => Promise<AutostartResult>;
11
+ export declare const unregisterAutostart: () => Promise<void>;
12
+ export declare const getAutostartStatus: () => {
13
+ registered: boolean;
14
+ platform: string;
15
+ };
@@ -0,0 +1,280 @@
1
+ import { execSync } from "node:child_process";
2
+ import { promises as fs } from "node:fs";
3
+ import { homedir, platform } from "node:os";
4
+ import { join } from "node:path";
5
+ import { logger } from "./logger.js";
6
+ const SERVICE_LABEL = "run.agentteams.runner";
7
+ const TASK_NAME = "AgentRunner";
8
+ // --- Path helpers ---
9
+ const getLaunchdPlistPath = () => join(homedir(), "Library", "LaunchAgents", `${SERVICE_LABEL}.plist`);
10
+ const getSystemdServicePath = () => join(homedir(), ".config", "systemd", "user", "agentrunner.service");
11
+ const getWindowsBatPath = () => join(homedir(), ".agentteams", "agentrunner-start.bat");
12
+ const resolveExecutablePath = (name) => {
13
+ const os = platform();
14
+ const cmd = os === "win32" ? `where ${name}` : `which ${name}`;
15
+ try {
16
+ const output = execSync(cmd, { encoding: "utf8" }).trim();
17
+ // `where` on Windows can return multiple lines — take the first.
18
+ return output.split(/\r?\n/)[0];
19
+ }
20
+ catch {
21
+ throw new Error(`Cannot find '${name}' in PATH. Ensure it is installed and available globally.`);
22
+ }
23
+ };
24
+ // --- plist (macOS) ---
25
+ const buildPlistContent = (config) => {
26
+ const nodePath = resolveExecutablePath("node");
27
+ const daemonPath = resolveExecutablePath("agentrunner");
28
+ const envEntries = [
29
+ ` <key>AGENTTEAMS_DAEMON_TOKEN</key>\n <string>${config.token}</string>`,
30
+ ` <key>AGENTTEAMS_API_URL</key>\n <string>${config.apiUrl}</string>`,
31
+ ].join("\n");
32
+ return `<?xml version="1.0" encoding="UTF-8"?>
33
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
34
+ "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
35
+ <plist version="1.0">
36
+ <dict>
37
+ <key>Label</key>
38
+ <string>${SERVICE_LABEL}</string>
39
+
40
+ <key>ProgramArguments</key>
41
+ <array>
42
+ <string>${nodePath}</string>
43
+ <string>${daemonPath}</string>
44
+ <string>start</string>
45
+ </array>
46
+
47
+ <key>EnvironmentVariables</key>
48
+ <dict>
49
+ ${envEntries}
50
+ </dict>
51
+
52
+ <key>RunAtLoad</key>
53
+ <true/>
54
+
55
+ <key>KeepAlive</key>
56
+ <dict>
57
+ <key>SuccessfulExit</key>
58
+ <false/>
59
+ </dict>
60
+
61
+ <key>ThrottleInterval</key>
62
+ <integer>10</integer>
63
+
64
+ <key>StandardOutPath</key>
65
+ <string>/tmp/agentrunner.log</string>
66
+
67
+ <key>StandardErrorPath</key>
68
+ <string>/tmp/agentrunner-error.log</string>
69
+ </dict>
70
+ </plist>`;
71
+ };
72
+ // --- systemd (Linux) ---
73
+ const buildSystemdContent = (config) => {
74
+ const daemonPath = resolveExecutablePath("agentrunner");
75
+ return `[Unit]
76
+ Description=AgentRunner
77
+ After=network-online.target
78
+ Wants=network-online.target
79
+
80
+ [Service]
81
+ Type=simple
82
+ ExecStart=${daemonPath} start
83
+ Environment="AGENTTEAMS_DAEMON_TOKEN=${config.token}"
84
+ Environment="AGENTTEAMS_API_URL=${config.apiUrl}"
85
+ Restart=on-failure
86
+ RestartSec=10s
87
+ StandardOutput=journal
88
+ StandardError=journal
89
+ SyslogIdentifier=agentrunner
90
+
91
+ [Install]
92
+ WantedBy=default.target`;
93
+ };
94
+ // --- bat (Windows) ---
95
+ const buildWindowsBatContent = (config) => {
96
+ const daemonPath = resolveExecutablePath("agentrunner");
97
+ return `@echo off
98
+ set AGENTTEAMS_DAEMON_TOKEN=${config.token}
99
+ set AGENTTEAMS_API_URL=${config.apiUrl}
100
+ "${daemonPath}" start
101
+ `;
102
+ };
103
+ export const registerAutostart = async (config) => {
104
+ const os = platform();
105
+ if (os === "darwin") {
106
+ return registerLaunchd(config);
107
+ }
108
+ if (os === "linux") {
109
+ return registerSystemd(config);
110
+ }
111
+ if (os === "win32") {
112
+ return registerWindowsTask(config);
113
+ }
114
+ logger.warn(`Autostart is not supported on '${os}'. Skipping service registration.`);
115
+ return { registered: false, servicePath: "", platform: os };
116
+ };
117
+ export const unregisterAutostart = async () => {
118
+ const os = platform();
119
+ if (os === "darwin") {
120
+ await unregisterLaunchd();
121
+ return;
122
+ }
123
+ if (os === "linux") {
124
+ await unregisterSystemd();
125
+ return;
126
+ }
127
+ if (os === "win32") {
128
+ await unregisterWindowsTask();
129
+ return;
130
+ }
131
+ logger.warn(`Autostart is not supported on '${os}'. Nothing to unregister.`);
132
+ };
133
+ export const getAutostartStatus = () => {
134
+ const os = platform();
135
+ if (os === "darwin") {
136
+ try {
137
+ const output = execSync(`launchctl list ${SERVICE_LABEL} 2>/dev/null`, {
138
+ encoding: "utf8",
139
+ });
140
+ return { registered: output.includes(SERVICE_LABEL), platform: "launchd" };
141
+ }
142
+ catch {
143
+ return { registered: false, platform: "launchd" };
144
+ }
145
+ }
146
+ if (os === "linux") {
147
+ try {
148
+ const output = execSync("systemctl --user is-enabled agentrunner 2>/dev/null", {
149
+ encoding: "utf8",
150
+ });
151
+ return { registered: output.trim() === "enabled", platform: "systemd" };
152
+ }
153
+ catch {
154
+ return { registered: false, platform: "systemd" };
155
+ }
156
+ }
157
+ if (os === "win32") {
158
+ try {
159
+ const output = execSync(`schtasks /Query /TN "${TASK_NAME}" 2>nul`, {
160
+ encoding: "utf8",
161
+ });
162
+ return { registered: output.includes(TASK_NAME), platform: "task-scheduler" };
163
+ }
164
+ catch {
165
+ return { registered: false, platform: "task-scheduler" };
166
+ }
167
+ }
168
+ return { registered: false, platform: os };
169
+ };
170
+ // --- macOS launchd ---
171
+ const registerLaunchd = async (config) => {
172
+ const plistPath = getLaunchdPlistPath();
173
+ // Unload if already registered (ignore errors).
174
+ try {
175
+ execSync(`launchctl unload "${plistPath}" 2>/dev/null`);
176
+ }
177
+ catch {
178
+ // Not loaded — that's fine.
179
+ }
180
+ const content = buildPlistContent(config);
181
+ await fs.mkdir(join(homedir(), "Library", "LaunchAgents"), { recursive: true });
182
+ await fs.writeFile(plistPath, content, "utf8");
183
+ execSync(`launchctl load "${plistPath}"`);
184
+ logger.info("Registered launchd service", { plistPath });
185
+ return { registered: true, servicePath: plistPath, platform: "launchd" };
186
+ };
187
+ const unregisterLaunchd = async () => {
188
+ const plistPath = getLaunchdPlistPath();
189
+ try {
190
+ execSync(`launchctl unload "${plistPath}" 2>/dev/null`);
191
+ }
192
+ catch {
193
+ // Not loaded — that's fine.
194
+ }
195
+ try {
196
+ await fs.unlink(plistPath);
197
+ logger.info("Removed launchd plist", { plistPath });
198
+ }
199
+ catch {
200
+ // File may not exist.
201
+ }
202
+ };
203
+ // --- Linux systemd ---
204
+ const registerSystemd = async (config) => {
205
+ const servicePath = getSystemdServicePath();
206
+ const content = buildSystemdContent(config);
207
+ await fs.mkdir(join(homedir(), ".config", "systemd", "user"), { recursive: true });
208
+ await fs.writeFile(servicePath, content, "utf8");
209
+ execSync("systemctl --user daemon-reload");
210
+ execSync("systemctl --user enable agentrunner");
211
+ execSync("systemctl --user start agentrunner");
212
+ logger.info("Registered systemd user service", { servicePath });
213
+ return { registered: true, servicePath, platform: "systemd" };
214
+ };
215
+ const unregisterSystemd = async () => {
216
+ const servicePath = getSystemdServicePath();
217
+ try {
218
+ execSync("systemctl --user stop agentrunner 2>/dev/null");
219
+ }
220
+ catch {
221
+ // Not running — that's fine.
222
+ }
223
+ try {
224
+ execSync("systemctl --user disable agentrunner 2>/dev/null");
225
+ }
226
+ catch {
227
+ // Not enabled — that's fine.
228
+ }
229
+ execSync("systemctl --user daemon-reload");
230
+ try {
231
+ await fs.unlink(servicePath);
232
+ logger.info("Removed systemd service file", { servicePath });
233
+ }
234
+ catch {
235
+ // File may not exist.
236
+ }
237
+ };
238
+ // --- Windows Task Scheduler ---
239
+ const registerWindowsTask = async (config) => {
240
+ const batPath = getWindowsBatPath();
241
+ // Remove existing task if any.
242
+ try {
243
+ execSync(`schtasks /Delete /TN "${TASK_NAME}" /F 2>nul`);
244
+ }
245
+ catch {
246
+ // Not registered — that's fine.
247
+ }
248
+ const content = buildWindowsBatContent(config);
249
+ await fs.mkdir(join(homedir(), ".agentteams"), { recursive: true });
250
+ await fs.writeFile(batPath, content, "utf8");
251
+ // Register task to run at user logon.
252
+ execSync(`schtasks /Create /TN "${TASK_NAME}" /TR "\\"${batPath}\\"" /SC ONLOGON /RL HIGHEST /F`);
253
+ // Start the task immediately.
254
+ try {
255
+ execSync(`schtasks /Run /TN "${TASK_NAME}"`);
256
+ }
257
+ catch {
258
+ logger.warn("Task registered but immediate start failed. It will start at next logon.");
259
+ }
260
+ logger.info("Registered Windows Task Scheduler task", { batPath });
261
+ return { registered: true, servicePath: batPath, platform: "task-scheduler" };
262
+ };
263
+ const unregisterWindowsTask = async () => {
264
+ const batPath = getWindowsBatPath();
265
+ try {
266
+ execSync(`schtasks /Delete /TN "${TASK_NAME}" /F 2>nul`);
267
+ logger.info("Removed Windows scheduled task");
268
+ }
269
+ catch {
270
+ // Not registered — that's fine.
271
+ }
272
+ try {
273
+ await fs.unlink(batPath);
274
+ logger.info("Removed daemon start script", { batPath });
275
+ }
276
+ catch {
277
+ // File may not exist.
278
+ }
279
+ };
280
+ //# sourceMappingURL=autostart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autostart.js","sourceRoot":"","sources":["../src/autostart.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const runInitCommand: (argv: string[]) => Promise<void>;
@@ -0,0 +1,56 @@
1
+ import { DaemonApiClient } from "../api-client.js";
2
+ import { logger } from "../logger.js";
3
+ import { resolveApiUrlForInit, writeDaemonConfigFile } from "../config.js";
4
+ import { registerAutostart } from "../autostart.js";
5
+ const parseInitArgs = (argv) => {
6
+ const options = { noAutostart: false };
7
+ for (let i = 0; i < argv.length; i += 1) {
8
+ const arg = argv[i];
9
+ if (arg === "--token") {
10
+ options.token = argv[i + 1];
11
+ i += 1;
12
+ continue;
13
+ }
14
+ if (arg === "--api-url") {
15
+ options.apiUrl = argv[i + 1];
16
+ i += 1;
17
+ continue;
18
+ }
19
+ if (arg === "--no-autostart") {
20
+ options.noAutostart = true;
21
+ }
22
+ }
23
+ return options;
24
+ };
25
+ export const runInitCommand = async (argv) => {
26
+ const options = parseInitArgs(argv);
27
+ if (!options.token || options.token.trim().length === 0) {
28
+ throw new Error("Missing token. Usage: agentrunner init --token <token> [--api-url <url>] [--no-autostart]");
29
+ }
30
+ const apiUrl = await resolveApiUrlForInit(options.apiUrl);
31
+ const daemonToken = options.token.trim();
32
+ const client = new DaemonApiClient(apiUrl, daemonToken);
33
+ const daemon = await client.validateDaemonToken();
34
+ const configPath = await writeDaemonConfigFile({
35
+ daemonToken,
36
+ apiUrl
37
+ });
38
+ logger.info("Daemon init completed", {
39
+ daemonId: daemon.id,
40
+ memberId: daemon.memberId,
41
+ configPath
42
+ });
43
+ if (!options.noAutostart) {
44
+ const result = await registerAutostart({ token: daemonToken, apiUrl });
45
+ if (result.registered) {
46
+ logger.info("Autostart registered", {
47
+ platform: result.platform,
48
+ servicePath: result.servicePath
49
+ });
50
+ }
51
+ }
52
+ else {
53
+ logger.info("Autostart skipped (--no-autostart)");
54
+ }
55
+ };
56
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAQpD,MAAM,aAAa,GAAG,CAAC,IAAc,EAAe,EAAE;IACpD,MAAM,OAAO,GAAgB,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAEpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5B,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;YAC7B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,IAAc,EAAiB,EAAE;IACpE,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAEpC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,2FAA2F,CAAC,CAAC;IAC/G,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAEzC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mBAAmB,EAAE,CAAC;IAElD,MAAM,UAAU,GAAG,MAAM,qBAAqB,CAAC;QAC7C,WAAW;QACX,MAAM;KACP,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;QACnC,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,UAAU;KACX,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QAEvE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;gBAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,WAAW,EAAE,MAAM,CAAC,WAAW;aAChC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const runStartCommand: () => Promise<void>;
@@ -0,0 +1,21 @@
1
+ import { resolveRuntimeConfig } from "../config.js";
2
+ import { startPolling } from "../poller.js";
3
+ import { DaemonApiClient } from "../api-client.js";
4
+ import { createTriggerHandler } from "../handlers/trigger-handler.js";
5
+ import { writePidFile, removePidFile } from "../pid.js";
6
+ export const runStartCommand = async () => {
7
+ await writePidFile();
8
+ const cleanup = async () => {
9
+ await removePidFile();
10
+ };
11
+ process.on("SIGINT", () => void cleanup());
12
+ process.on("SIGTERM", () => void cleanup());
13
+ process.on("exit", () => {
14
+ // Synchronous best-effort — PID file may already be removed by signal handler.
15
+ });
16
+ const config = await resolveRuntimeConfig();
17
+ const client = new DaemonApiClient(config.apiUrl, config.daemonToken);
18
+ const triggerHandler = createTriggerHandler(config, client);
19
+ await startPolling(config, triggerHandler);
20
+ };
21
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAExD,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,IAAmB,EAAE;IACvD,MAAM,YAAY,EAAE,CAAC;IAErB,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;QACtB,+EAA+E;IACjF,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACtE,MAAM,cAAc,GAAG,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAC7C,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const runStatusCommand: () => Promise<void>;
@@ -0,0 +1,20 @@
1
+ import { logger } from "../logger.js";
2
+ import { getDaemonStatus } from "../pid.js";
3
+ import { getAutostartStatus } from "../autostart.js";
4
+ export const runStatusCommand = async () => {
5
+ const daemonStatus = await getDaemonStatus();
6
+ const autostartStatus = getAutostartStatus();
7
+ if (daemonStatus.running) {
8
+ logger.info("Daemon is running", { pid: daemonStatus.pid });
9
+ }
10
+ else {
11
+ logger.info("Daemon is not running");
12
+ }
13
+ if (autostartStatus.registered) {
14
+ logger.info("Autostart is enabled", { platform: autostartStatus.platform });
15
+ }
16
+ else {
17
+ logger.info("Autostart is not registered", { platform: autostartStatus.platform });
18
+ }
19
+ };
20
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,IAAmB,EAAE;IACxD,MAAM,YAAY,GAAG,MAAM,eAAe,EAAE,CAAC;IAC7C,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;IAE7C,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,eAAe,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrF,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const runStopCommand: () => Promise<void>;
@@ -0,0 +1,21 @@
1
+ import { logger } from "../logger.js";
2
+ import { getDaemonStatus, removePidFile } from "../pid.js";
3
+ export const runStopCommand = async () => {
4
+ const { running, pid } = await getDaemonStatus();
5
+ if (!running || pid === null) {
6
+ logger.info("Daemon is not running");
7
+ return;
8
+ }
9
+ try {
10
+ process.kill(pid, "SIGTERM");
11
+ logger.info("Sent SIGTERM to daemon", { pid });
12
+ }
13
+ catch (error) {
14
+ logger.error("Failed to stop daemon", {
15
+ pid,
16
+ error: error instanceof Error ? error.message : String(error)
17
+ });
18
+ }
19
+ await removePidFile();
20
+ };
21
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE3D,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,IAAmB,EAAE;IACtD,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;IAEjD,IAAI,CAAC,OAAO,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;YACpC,GAAG;YACH,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,MAAM,aAAa,EAAE,CAAC;AACxB,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const runUninstallCommand: () => Promise<void>;
@@ -0,0 +1,21 @@
1
+ import { logger } from "../logger.js";
2
+ import { getDaemonStatus, removePidFile } from "../pid.js";
3
+ import { unregisterAutostart } from "../autostart.js";
4
+ export const runUninstallCommand = async () => {
5
+ // 1. Stop running daemon if any.
6
+ const { running, pid } = await getDaemonStatus();
7
+ if (running && pid !== null) {
8
+ try {
9
+ process.kill(pid, "SIGTERM");
10
+ logger.info("Stopped running daemon", { pid });
11
+ }
12
+ catch {
13
+ // Process may have exited between check and kill.
14
+ }
15
+ await removePidFile();
16
+ }
17
+ // 2. Unregister autostart service.
18
+ await unregisterAutostart();
19
+ logger.info("Uninstall completed. Daemon service removed and autostart unregistered.");
20
+ };
21
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,IAAmB,EAAE;IAC3D,iCAAiC;IACjC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;IAEjD,IAAI,OAAO,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;QACD,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC;IAED,mCAAmC;IACnC,MAAM,mBAAmB,EAAE,CAAC;IAE5B,MAAM,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;AACzF,CAAC,CAAC"}