@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 +188 -0
- package/bin/buildify-cursor-agent +2 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +266 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +21 -0
- package/dist/config.js +161 -0
- package/dist/config.js.map +1 -0
- package/dist/runner.d.ts +63 -0
- package/dist/runner.js +714 -0
- package/dist/runner.js.map +1 -0
- package/dist/service/macos.d.ts +8 -0
- package/dist/service/macos.js +118 -0
- package/dist/service/macos.js.map +1 -0
- package/dist/types.d.ts +62 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +40 -0
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
|
package/dist/cli.d.ts
ADDED
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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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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"}
|