@buildify-cli/cursor-agent 0.1.1

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/README.md ADDED
@@ -0,0 +1,188 @@
1
+ # @buildify/cursor-agent
2
+
3
+ Node.js client runner for the Buildify **Cursor Broker** bundle. It connects to `CursorBrokerTriggerNode`, receives submitted tasks over SSE/HTTP, and executes them locally with [`@cursor/sdk`](https://cursor.com/docs/sdk/typescript).
4
+
5
+ ## Architecture
6
+
7
+ ```
8
+ Buildify Workflow
9
+ └── CursorBrokerTriggerNode (Java Netty HTTP server)
10
+ └── CursorSubmitTaskNode (submit task)
11
+ └── CursorCancelTaskNode (cancel task)
12
+ ↕ HTTP + SSE
13
+ @buildify/cursor-agent (this package)
14
+ └── @cursor/sdk Agent.create() + agent.send()
15
+ ```
16
+
17
+ ## Requirements
18
+
19
+ - Node.js 18+
20
+ - macOS (for `install-service`; foreground/daemon mode works on any OS)
21
+ - Buildify workflow with `CursorBrokerTriggerNode` running and reachable
22
+
23
+ ## Install
24
+
25
+ From this repository:
26
+
27
+ ```bash
28
+ cd buildify-cursor-agent
29
+ npm install
30
+ npm run build
31
+ npm link
32
+ ```
33
+
34
+ Or after publishing:
35
+
36
+ ```bash
37
+ npm install -g @buildify/cursor-agent
38
+ ```
39
+
40
+ ## Configuration
41
+
42
+ Initialize defaults:
43
+
44
+ ```bash
45
+ buildify-cursor-agent config init
46
+ ```
47
+
48
+ Edit `~/.buildify/cursor-agent.json`:
49
+
50
+ ```json
51
+ {
52
+ "server": "http://localhost:8080",
53
+ "clientId": "my-macbook",
54
+ "defaultCwd": "/Users/you/projects",
55
+ "maxConcurrent": 2,
56
+ "token": "",
57
+ "logLevel": "info",
58
+ "streamLogs": false,
59
+ "requestTimeoutMs": 30000,
60
+ "reconnectMinDelayMs": 1000,
61
+ "reconnectMaxDelayMs": 30000
62
+ }
63
+ ```
64
+
65
+ Or set values via CLI:
66
+
67
+ ```bash
68
+ buildify-cursor-agent config set \
69
+ server=http://192.168.1.10:9001 \
70
+ clientId=my-macbook \
71
+ defaultCwd=/Users/you/projects \
72
+ token=broker_server_key
73
+ ```
74
+
75
+ | Key | Description |
76
+ |-----|-------------|
77
+ | `server` | Base URL of the Java Cursor Broker (from `CursorBrokerTriggerNode` status) |
78
+ | `clientId` | Unique agent identifier; must match `CursorSubmitTaskNode.clientId` |
79
+ | `defaultCwd` | Default working directory when a task has no `cwd` |
80
+ | `maxConcurrent` | Max parallel Cursor SDK runs (reported at connect) |
81
+ | `token` | Bearer token when Buildify auth is enabled (`Authorization: Bearer <serverKey>`) |
82
+ | `logLevel` | `error`, `warn`, `info`, or `debug` |
83
+ | `streamLogs` | Print Cursor SDK stream messages to stdout for debugging |
84
+ | `requestTimeoutMs` | HTTP timeout for broker calls |
85
+ | `reconnectMinDelayMs` | Minimum reconnect backoff |
86
+ | `reconnectMaxDelayMs` | Maximum reconnect backoff |
87
+
88
+ Show current config (secrets masked):
89
+
90
+ ```bash
91
+ buildify-cursor-agent config show
92
+ ```
93
+
94
+ ## Usage
95
+
96
+ ### Foreground
97
+
98
+ ```bash
99
+ buildify-cursor-agent start
100
+ ```
101
+
102
+ Press `Ctrl+C` to disconnect cleanly (`DELETE /disconnect`).
103
+
104
+ ### Debug logs
105
+
106
+ ```bash
107
+ buildify-cursor-agent start --log-level debug --stream-logs
108
+ ```
109
+
110
+ `--stream-logs` prints Cursor SDK stream events such as status, assistant text, thinking, and tool calls. The runner also reports task progress events back to `CursorBrokerTriggerNode`.
111
+
112
+ When a task provides `cwd`, the runner resolves it on the agent machine and creates the directory recursively if it does not already exist. If the path exists but is not a directory, the task fails.
113
+
114
+ ### Background daemon
115
+
116
+ ```bash
117
+ buildify-cursor-agent start --daemon
118
+ buildify-cursor-agent status
119
+ buildify-cursor-agent stop
120
+ ```
121
+
122
+ PID file: `~/.buildify/cursor-agent.pid`
123
+
124
+ ### macOS launchd service (like Docker Desktop auto-start)
125
+
126
+ Install a user LaunchAgent that starts on login and restarts on failure:
127
+
128
+ ```bash
129
+ buildify-cursor-agent install-service
130
+ buildify-cursor-agent status
131
+ ```
132
+
133
+ Logs:
134
+
135
+ - `~/.buildify/cursor-agent.log`
136
+ - `~/.buildify/cursor-agent.log.err`
137
+
138
+ Uninstall:
139
+
140
+ ```bash
141
+ buildify-cursor-agent uninstall-service
142
+ ```
143
+
144
+ ## Protocol
145
+
146
+ Implements the client side of the Cursor Broker HTTP API:
147
+
148
+ | Method | Path | Purpose |
149
+ |--------|------|---------|
150
+ | `POST` | `/connect` | Register client, get `sessionId` |
151
+ | `GET` | `/events` | SSE stream (`newTask` and `cancelled` events) |
152
+ | `GET` | `/tasks/next` | Pull next queued task |
153
+ | `POST` | `/tasks/{taskId}/events` | Report received / progress / completed / failed / cancelled |
154
+ | `POST` | `/heartbeat` | Keep-alive with `runningCount` |
155
+ | `DELETE` | `/disconnect` | Clean shutdown |
156
+
157
+ Headers:
158
+
159
+ - `Agent-Client-Id` — agent identifier
160
+ - `Agent-Session-Id` — session from `/connect`
161
+
162
+ Model discovery:
163
+
164
+ - The runner sends its cached model list in `/connect` and `/heartbeat`.
165
+ - The model cache is refreshed from Cursor with the task-scoped `cursorApiKey` when a task starts.
166
+ - `CursorSubmitTaskNode.model` loads options from the selected `clientId`; if the agent has not reported models yet, it falls back to `composer-2.5`.
167
+
168
+ ## Buildify workflow setup
169
+
170
+ 1. Add **Cursor Broker Trigger** node; note the listening port in node status.
171
+ 2. Enable auth if needed and configure **Cursor Broker Credential** (`serverKey`).
172
+ 3. Set `token` in client config to the same `serverKey`.
173
+ 4. Add **Submit Cursor Task** node with matching `clientId` and task-scoped `cursorApiKey`.
174
+ 5. Optionally add **Cancel Cursor Task** node and pass `taskId` to cancel queued or running tasks.
175
+ 6. Start this runner on the target machine.
176
+
177
+ ## Development
178
+
179
+ ```bash
180
+ npm install
181
+ npm run dev -- config show
182
+ npm run dev -- start
183
+ npm run build
184
+ ```
185
+
186
+ ## License
187
+
188
+ MIT
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import "../dist/cli.js";
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,266 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "node:child_process";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { Command } from "commander";
6
+ import { clearPid, getDefaultConfig, isProcessRunning, loadConfig, readPid, updateConfig, validateConfig, writePid, } from "./config.js";
7
+ import { runAgent } from "./runner.js";
8
+ import { getServiceInfo, installService, resolveCliEntrypoint, uninstallService, } from "./service/macos.js";
9
+ const program = new Command();
10
+ program
11
+ .name("buildify-cursor-agent")
12
+ .description("Buildify Cursor Agent runner — executes Cursor SDK tasks from Buildify Cursor Broker")
13
+ .version("0.1.0");
14
+ program
15
+ .command("start")
16
+ .description("Connect to Buildify Cursor Broker and wait for tasks")
17
+ .option("--daemon", "Run in background and write PID file")
18
+ .option("--foreground", "Run in foreground (default)")
19
+ .option("--log-level <level>", "Log level: error, warn, info, debug")
20
+ .option("--stream-logs", "Print Cursor SDK stream messages for task debugging")
21
+ .option("--no-stream-logs", "Disable Cursor SDK stream messages")
22
+ .option("--request-timeout-ms <ms>", "HTTP request timeout in milliseconds")
23
+ .action(async (options) => {
24
+ if (options.daemon) {
25
+ startDaemon();
26
+ return;
27
+ }
28
+ const config = applyStartOptions(loadConfig(), options);
29
+ const errors = validateConfig(config);
30
+ if (errors.length > 0) {
31
+ console.error("Invalid configuration:");
32
+ for (const error of errors) {
33
+ console.error(` - ${error}`);
34
+ }
35
+ console.error(`\nEdit ${path.join(process.env.HOME ?? "~", ".buildify/cursor-agent.json")} or run:`);
36
+ console.error(" buildify-cursor-agent config set server=... clientId=... token=...");
37
+ process.exit(1);
38
+ }
39
+ await runAgent(config);
40
+ });
41
+ program
42
+ .command("stop")
43
+ .description("Stop a background daemon started with start --daemon")
44
+ .action(() => {
45
+ const pid = readPid();
46
+ if (!pid) {
47
+ console.error("No PID file found. Is the daemon running?");
48
+ process.exit(1);
49
+ }
50
+ if (!isProcessRunning(pid)) {
51
+ clearPid();
52
+ console.error(`Stale PID file removed (${pid} not running)`);
53
+ process.exit(1);
54
+ }
55
+ try {
56
+ process.kill(pid, "SIGTERM");
57
+ clearPid();
58
+ console.log(`Stopped daemon (pid=${pid})`);
59
+ }
60
+ catch (error) {
61
+ console.error(`Failed to stop daemon (pid=${pid}):`, error);
62
+ process.exit(1);
63
+ }
64
+ });
65
+ program
66
+ .command("status")
67
+ .description("Show daemon and macOS service status")
68
+ .action(() => {
69
+ const pid = readPid();
70
+ const config = loadConfig();
71
+ if (pid && isProcessRunning(pid)) {
72
+ console.log(`Daemon: running (pid=${pid})`);
73
+ }
74
+ else if (pid) {
75
+ console.log(`Daemon: not running (stale pid=${pid})`);
76
+ }
77
+ else {
78
+ console.log("Daemon: not running");
79
+ }
80
+ console.log(`Client ID: ${config.clientId}`);
81
+ console.log(`Server: ${config.server}`);
82
+ console.log(`Default CWD: ${config.defaultCwd}`);
83
+ console.log(`Max concurrent: ${config.maxConcurrent}`);
84
+ if (process.platform === "darwin") {
85
+ const service = getServiceInfo();
86
+ console.log(`macOS service: ${service.loaded ? "loaded" : service.installed ? "installed (not loaded)" : "not installed"}`);
87
+ if (service.installed) {
88
+ console.log(`Plist: ${service.plistPath}`);
89
+ }
90
+ }
91
+ });
92
+ program
93
+ .command("install-service")
94
+ .description("Install and load a macOS launchd background service")
95
+ .option("--bin <path>", "Path to buildify-cursor-agent executable (defaults to current binary)")
96
+ .action((options) => {
97
+ try {
98
+ const info = installService(options.bin ?? resolveCliEntrypoint());
99
+ console.log("macOS service installed and loaded");
100
+ console.log(`Plist: ${info.plistPath}`);
101
+ console.log(`Label: ${info.label}`);
102
+ }
103
+ catch (error) {
104
+ console.error(error instanceof Error ? error.message : error);
105
+ process.exit(1);
106
+ }
107
+ });
108
+ program
109
+ .command("uninstall-service")
110
+ .description("Unload and remove the macOS launchd service")
111
+ .action(() => {
112
+ try {
113
+ uninstallService();
114
+ console.log("macOS service uninstalled");
115
+ }
116
+ catch (error) {
117
+ console.error(error instanceof Error ? error.message : error);
118
+ process.exit(1);
119
+ }
120
+ });
121
+ const configCmd = program
122
+ .command("config")
123
+ .description("Manage ~/.buildify/cursor-agent.json");
124
+ configCmd
125
+ .command("show")
126
+ .description("Print current configuration")
127
+ .action(() => {
128
+ const config = loadConfig();
129
+ console.log(JSON.stringify(redactConfig(config), null, 2));
130
+ });
131
+ configCmd
132
+ .command("set")
133
+ .description("Set configuration values (key=value ...)")
134
+ .argument("[pairs...]", "Configuration pairs such as server=http://host:8080")
135
+ .action((pairs) => {
136
+ if (pairs.length === 0) {
137
+ console.error("Usage: buildify-cursor-agent config set key=value [key=value ...]");
138
+ console.error("\nAvailable keys:");
139
+ console.error(" server, clientId, defaultCwd, maxConcurrent, token");
140
+ console.error(" logLevel, streamLogs, requestTimeoutMs, reconnectMinDelayMs, reconnectMaxDelayMs");
141
+ process.exit(1);
142
+ }
143
+ const partial = {};
144
+ for (const pair of pairs) {
145
+ const index = pair.indexOf("=");
146
+ if (index <= 0) {
147
+ console.error(`Invalid pair: ${pair}`);
148
+ process.exit(1);
149
+ }
150
+ const key = pair.slice(0, index).trim();
151
+ const value = pair.slice(index + 1).trim();
152
+ if (!isConfigKey(key)) {
153
+ console.error(`Unknown config key: ${key}`);
154
+ process.exit(1);
155
+ }
156
+ assignConfigValue(partial, key, value);
157
+ }
158
+ const next = updateConfig(partial);
159
+ console.log("Configuration updated:");
160
+ console.log(JSON.stringify(redactConfig(next), null, 2));
161
+ });
162
+ configCmd
163
+ .command("init")
164
+ .description("Create default configuration file if missing")
165
+ .action(() => {
166
+ const config = getDefaultConfig();
167
+ updateConfig(config);
168
+ console.log(`Created default config at ~/.buildify/cursor-agent.json`);
169
+ console.log(JSON.stringify(redactConfig(config), null, 2));
170
+ });
171
+ program.parse(process.argv);
172
+ function startDaemon() {
173
+ const existingPid = readPid();
174
+ if (existingPid && isProcessRunning(existingPid)) {
175
+ console.error(`Already running with pid=${existingPid}`);
176
+ process.exit(1);
177
+ }
178
+ if (existingPid) {
179
+ clearPid();
180
+ }
181
+ const cliPath = resolveDaemonEntrypoint();
182
+ const child = spawn(process.execPath, [cliPath, "start"], {
183
+ detached: true,
184
+ stdio: "ignore",
185
+ env: process.env,
186
+ });
187
+ child.unref();
188
+ if (!child.pid) {
189
+ console.error("Failed to start daemon");
190
+ process.exit(1);
191
+ }
192
+ writePid(child.pid);
193
+ console.log(`Started daemon with pid=${child.pid}`);
194
+ }
195
+ function resolveDaemonEntrypoint() {
196
+ if (process.argv[1]) {
197
+ return path.resolve(process.argv[1]);
198
+ }
199
+ return fileURLToPath(import.meta.url);
200
+ }
201
+ function isConfigKey(key) {
202
+ return [
203
+ "server",
204
+ "clientId",
205
+ "defaultCwd",
206
+ "maxConcurrent",
207
+ "token",
208
+ "logLevel",
209
+ "streamLogs",
210
+ "requestTimeoutMs",
211
+ "reconnectMinDelayMs",
212
+ "reconnectMaxDelayMs",
213
+ ].includes(key);
214
+ }
215
+ function assignConfigValue(partial, key, value) {
216
+ if (key === "maxConcurrent" ||
217
+ key === "requestTimeoutMs" ||
218
+ key === "reconnectMinDelayMs" ||
219
+ key === "reconnectMaxDelayMs") {
220
+ partial[key] = Number.parseInt(value, 10);
221
+ return;
222
+ }
223
+ if (key === "streamLogs") {
224
+ partial.streamLogs = ["true", "1", "yes", "on"].includes(value.trim().toLowerCase());
225
+ return;
226
+ }
227
+ if (key === "logLevel") {
228
+ partial.logLevel = isLogLevel(value) ? value : undefined;
229
+ return;
230
+ }
231
+ if (key === "server" ||
232
+ key === "clientId" ||
233
+ key === "defaultCwd" ||
234
+ key === "token") {
235
+ partial[key] = value;
236
+ }
237
+ }
238
+ function redactConfig(config) {
239
+ return {
240
+ ...config,
241
+ token: maskSecret(config.token),
242
+ };
243
+ }
244
+ function applyStartOptions(config, options) {
245
+ return {
246
+ ...config,
247
+ logLevel: isLogLevel(options.logLevel) ? options.logLevel : config.logLevel,
248
+ streamLogs: typeof options.streamLogs === "boolean" ? options.streamLogs : config.streamLogs,
249
+ requestTimeoutMs: options.requestTimeoutMs
250
+ ? Number.parseInt(options.requestTimeoutMs, 10)
251
+ : config.requestTimeoutMs,
252
+ };
253
+ }
254
+ function isLogLevel(value) {
255
+ return value === "error" || value === "warn" || value === "info" || value === "debug";
256
+ }
257
+ function maskSecret(value) {
258
+ if (!value) {
259
+ return "";
260
+ }
261
+ if (value.length <= 8) {
262
+ return "***";
263
+ }
264
+ return `${value.slice(0, 4)}...${value.slice(-4)}`;
265
+ }
266
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { AgentConfig, PartialAgentConfig } from "./types.js";
2
+ export declare const CONFIG_DIR: string;
3
+ export declare const CONFIG_FILE: string;
4
+ export declare const LEGACY_CONFIG_FILE: string;
5
+ export declare const PID_FILE: string;
6
+ export declare const LOG_FILE: string;
7
+ export declare function getDefaultConfig(): AgentConfig;
8
+ export declare function getConfigDir(): string;
9
+ export declare function getPidFilePath(): string;
10
+ export declare function getLogFilePath(): string;
11
+ export declare function ensureConfigDir(): void;
12
+ export declare function loadConfig(): AgentConfig;
13
+ export declare function saveConfig(config: AgentConfig): void;
14
+ export declare function updateConfig(partial: PartialAgentConfig): AgentConfig;
15
+ export declare function normalizeConfig(partial: PartialAgentConfig): AgentConfig;
16
+ export declare function validateConfig(config: AgentConfig): string[];
17
+ export declare function expandHome(value: string): string;
18
+ export declare function readPid(): number | null;
19
+ export declare function writePid(pid: number): void;
20
+ export declare function clearPid(): void;
21
+ export declare function isProcessRunning(pid: number): boolean;
package/dist/config.js ADDED
@@ -0,0 +1,161 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ export const CONFIG_DIR = path.join(os.homedir(), ".buildify");
5
+ export const CONFIG_FILE = path.join(CONFIG_DIR, "cursor-agent.json");
6
+ export const LEGACY_CONFIG_FILE = path.join(CONFIG_DIR, "agent-server.json");
7
+ export const PID_FILE = path.join(CONFIG_DIR, "cursor-agent.pid");
8
+ export const LOG_FILE = path.join(CONFIG_DIR, "cursor-agent.log");
9
+ const DEFAULT_CONFIG = {
10
+ server: "http://localhost:8080",
11
+ clientId: os.hostname(),
12
+ defaultCwd: path.join(os.homedir(), "projects"),
13
+ maxConcurrent: 2,
14
+ token: "",
15
+ logLevel: "info",
16
+ streamLogs: false,
17
+ requestTimeoutMs: 30_000,
18
+ reconnectMinDelayMs: 1_000,
19
+ reconnectMaxDelayMs: 30_000,
20
+ };
21
+ export function getDefaultConfig() {
22
+ return { ...DEFAULT_CONFIG };
23
+ }
24
+ export function getConfigDir() {
25
+ return CONFIG_DIR;
26
+ }
27
+ export function getPidFilePath() {
28
+ return PID_FILE;
29
+ }
30
+ export function getLogFilePath() {
31
+ return LOG_FILE;
32
+ }
33
+ export function ensureConfigDir() {
34
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
35
+ }
36
+ export function loadConfig() {
37
+ ensureConfigDir();
38
+ const configFile = fs.existsSync(CONFIG_FILE) ? CONFIG_FILE : LEGACY_CONFIG_FILE;
39
+ if (!fs.existsSync(configFile)) {
40
+ const config = getDefaultConfig();
41
+ saveConfig(config);
42
+ return config;
43
+ }
44
+ const raw = fs.readFileSync(configFile, "utf8");
45
+ const parsed = JSON.parse(raw);
46
+ return normalizeConfig(parsed);
47
+ }
48
+ export function saveConfig(config) {
49
+ ensureConfigDir();
50
+ fs.writeFileSync(CONFIG_FILE, `${JSON.stringify(config, null, 2)}\n`, "utf8");
51
+ }
52
+ export function updateConfig(partial) {
53
+ const current = loadConfig();
54
+ const next = normalizeConfig({ ...current, ...partial });
55
+ saveConfig(next);
56
+ return next;
57
+ }
58
+ export function normalizeConfig(partial) {
59
+ const defaults = getDefaultConfig();
60
+ return {
61
+ server: trimString(partial.server ?? partial.serverUrl, defaults.server),
62
+ clientId: trimString(partial.clientId, defaults.clientId),
63
+ defaultCwd: expandHome(trimString(partial.defaultCwd, defaults.defaultCwd)),
64
+ maxConcurrent: clampInt(partial.maxConcurrent, defaults.maxConcurrent, 1, 32),
65
+ token: trimString(partial.token ?? partial.authToken, defaults.token),
66
+ logLevel: normalizeLogLevel(partial.logLevel, defaults.logLevel),
67
+ streamLogs: normalizeBoolean(partial.streamLogs, defaults.streamLogs),
68
+ requestTimeoutMs: clampInt(partial.requestTimeoutMs, defaults.requestTimeoutMs, 5_000, 300_000),
69
+ reconnectMinDelayMs: clampInt(partial.reconnectMinDelayMs, defaults.reconnectMinDelayMs, 250, 60_000),
70
+ reconnectMaxDelayMs: clampInt(partial.reconnectMaxDelayMs, defaults.reconnectMaxDelayMs, 1_000, 300_000),
71
+ };
72
+ }
73
+ export function validateConfig(config) {
74
+ const errors = [];
75
+ if (!config.server) {
76
+ errors.push("server is required");
77
+ }
78
+ else {
79
+ try {
80
+ new URL(config.server);
81
+ }
82
+ catch {
83
+ errors.push("server must be a valid URL");
84
+ }
85
+ }
86
+ if (!config.clientId) {
87
+ errors.push("clientId is required");
88
+ }
89
+ if (!config.defaultCwd) {
90
+ errors.push("defaultCwd is required");
91
+ }
92
+ return errors;
93
+ }
94
+ export function expandHome(value) {
95
+ if (value.startsWith("~/")) {
96
+ return path.join(os.homedir(), value.slice(2));
97
+ }
98
+ if (value === "~") {
99
+ return os.homedir();
100
+ }
101
+ return value;
102
+ }
103
+ function trimString(value, fallback) {
104
+ if (typeof value !== "string") {
105
+ return fallback;
106
+ }
107
+ const trimmed = value.trim();
108
+ return trimmed.length > 0 ? trimmed : fallback;
109
+ }
110
+ function clampInt(value, fallback, min, max) {
111
+ const parsed = typeof value === "number" ? value : Number(value);
112
+ if (!Number.isFinite(parsed)) {
113
+ return fallback;
114
+ }
115
+ return Math.min(max, Math.max(min, Math.trunc(parsed)));
116
+ }
117
+ function normalizeBoolean(value, fallback) {
118
+ if (typeof value === "boolean") {
119
+ return value;
120
+ }
121
+ if (typeof value === "string") {
122
+ const lower = value.trim().toLowerCase();
123
+ if (["true", "1", "yes", "on"].includes(lower))
124
+ return true;
125
+ if (["false", "0", "no", "off"].includes(lower))
126
+ return false;
127
+ }
128
+ return fallback;
129
+ }
130
+ function normalizeLogLevel(value, fallback) {
131
+ return value === "error" || value === "warn" || value === "info" || value === "debug"
132
+ ? value
133
+ : fallback;
134
+ }
135
+ export function readPid() {
136
+ if (!fs.existsSync(PID_FILE)) {
137
+ return null;
138
+ }
139
+ const raw = fs.readFileSync(PID_FILE, "utf8").trim();
140
+ const pid = Number.parseInt(raw, 10);
141
+ return Number.isFinite(pid) && pid > 0 ? pid : null;
142
+ }
143
+ export function writePid(pid) {
144
+ ensureConfigDir();
145
+ fs.writeFileSync(PID_FILE, `${pid}\n`, "utf8");
146
+ }
147
+ export function clearPid() {
148
+ if (fs.existsSync(PID_FILE)) {
149
+ fs.unlinkSync(PID_FILE);
150
+ }
151
+ }
152
+ export function isProcessRunning(pid) {
153
+ try {
154
+ process.kill(pid, 0);
155
+ return true;
156
+ }
157
+ catch {
158
+ return false;
159
+ }
160
+ }
161
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}