@agent-link/agent 0.1.0

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.
@@ -0,0 +1,226 @@
1
+ import { execSync } from 'child_process';
2
+ import { existsSync, mkdirSync, writeFileSync, unlinkSync } from 'fs';
3
+ import { join, dirname, resolve } from 'path';
4
+ import { homedir } from 'os';
5
+ import { fileURLToPath } from 'url';
6
+ import { getLogDir, loadRuntimeState, clearRuntimeState, killProcess, isProcessAlive, } from './config.js';
7
+ const SERVICE_NAME = 'agentlink';
8
+ const LAUNCHD_LABEL = 'com.agentlink.agent';
9
+ function getCliPath() {
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ return resolve(dirname(__filename), 'cli.js');
12
+ }
13
+ function getNodePath() {
14
+ return process.execPath;
15
+ }
16
+ // ── Linux (systemd user unit) ──
17
+ function getSystemdUnitPath() {
18
+ return join(homedir(), '.config', 'systemd', 'user', `${SERVICE_NAME}.service`);
19
+ }
20
+ function generateSystemdUnit(config) {
21
+ const nodePath = getNodePath();
22
+ const cliPath = getCliPath();
23
+ const logDir = getLogDir();
24
+ const nodeBinDir = dirname(nodePath);
25
+ return `[Unit]
26
+ Description=AgentLink Agent
27
+ After=network-online.target
28
+ Wants=network-online.target
29
+
30
+ [Service]
31
+ Type=simple
32
+ ExecStart=${nodePath} ${cliPath} start --server ${config.server} --dir ${config.dir} --name ${config.name}
33
+ WorkingDirectory=${config.dir}
34
+ Restart=on-failure
35
+ RestartSec=10
36
+ Environment=PATH=${nodeBinDir}:${homedir()}/.local/bin:${homedir()}/.npm-global/bin:/usr/local/bin:/usr/bin:/bin
37
+ StandardOutput=append:${logDir}/agent.log
38
+ StandardError=append:${logDir}/agent.err
39
+
40
+ [Install]
41
+ WantedBy=default.target
42
+ `;
43
+ }
44
+ function linuxInstall(config) {
45
+ const unitPath = getSystemdUnitPath();
46
+ mkdirSync(dirname(unitPath), { recursive: true });
47
+ mkdirSync(getLogDir(), { recursive: true });
48
+ writeFileSync(unitPath, generateSystemdUnit(config));
49
+ execSync('systemctl --user daemon-reload');
50
+ execSync(`systemctl --user enable ${SERVICE_NAME}`);
51
+ execSync(`systemctl --user start ${SERVICE_NAME}`);
52
+ console.log('Service installed and started.');
53
+ console.log(`\nUnit file: ${unitPath}`);
54
+ console.log('\nUseful commands:');
55
+ console.log(` systemctl --user status ${SERVICE_NAME}`);
56
+ console.log(` journalctl --user -u ${SERVICE_NAME} -f`);
57
+ console.log('\nTo run when not logged in:');
58
+ console.log(' sudo loginctl enable-linger $(whoami)');
59
+ }
60
+ function linuxUninstall() {
61
+ try {
62
+ execSync(`systemctl --user stop ${SERVICE_NAME} 2>/dev/null`);
63
+ }
64
+ catch { }
65
+ try {
66
+ execSync(`systemctl --user disable ${SERVICE_NAME} 2>/dev/null`);
67
+ }
68
+ catch { }
69
+ const unitPath = getSystemdUnitPath();
70
+ if (existsSync(unitPath)) {
71
+ unlinkSync(unitPath);
72
+ }
73
+ try {
74
+ execSync('systemctl --user daemon-reload');
75
+ }
76
+ catch { }
77
+ console.log('Service uninstalled.');
78
+ }
79
+ // ── macOS (launchd plist) ──
80
+ function getLaunchdPlistPath() {
81
+ return join(homedir(), 'Library', 'LaunchAgents', `${LAUNCHD_LABEL}.plist`);
82
+ }
83
+ function generateLaunchdPlist(config) {
84
+ const nodePath = getNodePath();
85
+ const cliPath = getCliPath();
86
+ const logDir = getLogDir();
87
+ return `<?xml version="1.0" encoding="UTF-8"?>
88
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
89
+ <plist version="1.0">
90
+ <dict>
91
+ <key>Label</key>
92
+ <string>${LAUNCHD_LABEL}</string>
93
+ <key>ProgramArguments</key>
94
+ <array>
95
+ <string>${nodePath}</string>
96
+ <string>${cliPath}</string>
97
+ <string>start</string>
98
+ <string>--server</string>
99
+ <string>${config.server}</string>
100
+ <string>--dir</string>
101
+ <string>${config.dir}</string>
102
+ <string>--name</string>
103
+ <string>${config.name}</string>
104
+ </array>
105
+ <key>WorkingDirectory</key>
106
+ <string>${config.dir}</string>
107
+ <key>RunAtLoad</key>
108
+ <true/>
109
+ <key>KeepAlive</key>
110
+ <dict>
111
+ <key>SuccessfulExit</key>
112
+ <false/>
113
+ </dict>
114
+ <key>ThrottleInterval</key>
115
+ <integer>10</integer>
116
+ <key>StandardOutPath</key>
117
+ <string>${logDir}/agent.log</string>
118
+ <key>StandardErrorPath</key>
119
+ <string>${logDir}/agent.err</string>
120
+ </dict>
121
+ </plist>
122
+ `;
123
+ }
124
+ function macInstall(config) {
125
+ const plistPath = getLaunchdPlistPath();
126
+ mkdirSync(dirname(plistPath), { recursive: true });
127
+ mkdirSync(getLogDir(), { recursive: true });
128
+ if (existsSync(plistPath)) {
129
+ try {
130
+ execSync(`launchctl unload "${plistPath}" 2>/dev/null`);
131
+ }
132
+ catch { }
133
+ }
134
+ writeFileSync(plistPath, generateLaunchdPlist(config));
135
+ execSync(`launchctl load "${plistPath}"`);
136
+ console.log('Service installed and started.');
137
+ console.log(`\nPlist file: ${plistPath}`);
138
+ console.log('\nUseful commands:');
139
+ console.log(` launchctl list | grep ${LAUNCHD_LABEL}`);
140
+ }
141
+ function macUninstall() {
142
+ const plistPath = getLaunchdPlistPath();
143
+ if (existsSync(plistPath)) {
144
+ try {
145
+ execSync(`launchctl unload "${plistPath}"`);
146
+ }
147
+ catch { }
148
+ unlinkSync(plistPath);
149
+ }
150
+ console.log('Service uninstalled.');
151
+ }
152
+ // ── Windows (Startup folder .bat) ──
153
+ function getStartupBatPath() {
154
+ const startupDir = join(process.env.APPDATA || join(homedir(), 'AppData', 'Roaming'), 'Microsoft', 'Windows', 'Start Menu', 'Programs', 'Startup');
155
+ return join(startupDir, `${SERVICE_NAME}.bat`);
156
+ }
157
+ function generateStartupBat(config) {
158
+ const nodePath = getNodePath();
159
+ const cliPath = getCliPath();
160
+ return `@echo off\r\n"${nodePath}" "${cliPath}" start --daemon --server ${config.server} --dir "${config.dir}" --name ${config.name}\r\n`;
161
+ }
162
+ function winInstall(config) {
163
+ mkdirSync(getLogDir(), { recursive: true });
164
+ const batPath = getStartupBatPath();
165
+ writeFileSync(batPath, generateStartupBat(config));
166
+ console.log('Startup script installed.');
167
+ console.log(`\nStartup file: ${batPath}`);
168
+ // Start the agent now
169
+ console.log('\nStarting agent now...');
170
+ try {
171
+ execSync(`"${getNodePath()}" "${getCliPath()}" start --daemon --server ${config.server} --dir "${config.dir}" --name ${config.name}`, { stdio: 'inherit' });
172
+ }
173
+ catch {
174
+ console.error('Failed to start agent. Check logs in ~/.agentlink/logs/');
175
+ }
176
+ }
177
+ function winUninstall() {
178
+ const batPath = getStartupBatPath();
179
+ if (existsSync(batPath)) {
180
+ unlinkSync(batPath);
181
+ console.log(`Removed startup file: ${batPath}`);
182
+ }
183
+ // Stop running agent if any
184
+ const state = loadRuntimeState();
185
+ if (state && isProcessAlive(state.pid)) {
186
+ console.log(`Stopping agent (PID ${state.pid})...`);
187
+ killProcess(state.pid);
188
+ clearRuntimeState();
189
+ }
190
+ console.log('Service uninstalled.');
191
+ }
192
+ // ── Platform dispatch ──
193
+ export function serviceInstall(config) {
194
+ const p = process.platform;
195
+ console.log('Installing AgentLink service...');
196
+ console.log(` Server: ${config.server}`);
197
+ console.log(` Directory: ${config.dir}`);
198
+ console.log(` Name: ${config.name}`);
199
+ console.log('');
200
+ if (p === 'linux')
201
+ linuxInstall(config);
202
+ else if (p === 'darwin')
203
+ macInstall(config);
204
+ else if (p === 'win32')
205
+ winInstall(config);
206
+ else {
207
+ console.error(`Unsupported platform: ${p}`);
208
+ console.error('Run the agent directly: agentlink-client start --daemon');
209
+ process.exit(1);
210
+ }
211
+ }
212
+ export function serviceUninstall() {
213
+ const p = process.platform;
214
+ console.log('Uninstalling AgentLink service...');
215
+ if (p === 'linux')
216
+ linuxUninstall();
217
+ else if (p === 'darwin')
218
+ macUninstall();
219
+ else if (p === 'win32')
220
+ winUninstall();
221
+ else {
222
+ console.error(`Unsupported platform: ${p}`);
223
+ process.exit(1);
224
+ }
225
+ }
226
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Async message stream (producer-consumer queue).
3
+ * Used to feed user messages into the Claude subprocess stdin.
4
+ */
5
+ export declare class Stream<T> implements AsyncIterableIterator<T> {
6
+ private queue;
7
+ private readResolve?;
8
+ private readReject?;
9
+ private isDone;
10
+ private hasError?;
11
+ private started;
12
+ [Symbol.asyncIterator](): AsyncIterableIterator<T>;
13
+ next(): Promise<IteratorResult<T>>;
14
+ enqueue(value: T): void;
15
+ done(): void;
16
+ error(err: unknown): void;
17
+ return(): Promise<IteratorResult<T>>;
18
+ }
package/dist/stream.js ADDED
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Async message stream (producer-consumer queue).
3
+ * Used to feed user messages into the Claude subprocess stdin.
4
+ */
5
+ export class Stream {
6
+ queue = [];
7
+ readResolve;
8
+ readReject;
9
+ isDone = false;
10
+ hasError;
11
+ started = false;
12
+ [Symbol.asyncIterator]() {
13
+ if (this.started)
14
+ throw new Error('Stream can only be iterated once');
15
+ this.started = true;
16
+ return this;
17
+ }
18
+ async next() {
19
+ if (this.queue.length > 0) {
20
+ return { done: false, value: this.queue.shift() };
21
+ }
22
+ if (this.isDone)
23
+ return { done: true, value: undefined };
24
+ if (this.hasError)
25
+ throw this.hasError;
26
+ return new Promise((resolve, reject) => {
27
+ this.readResolve = resolve;
28
+ this.readReject = reject;
29
+ });
30
+ }
31
+ enqueue(value) {
32
+ if (this.readResolve) {
33
+ const resolve = this.readResolve;
34
+ this.readResolve = undefined;
35
+ this.readReject = undefined;
36
+ resolve({ done: false, value });
37
+ }
38
+ else {
39
+ this.queue.push(value);
40
+ }
41
+ }
42
+ done() {
43
+ this.isDone = true;
44
+ if (this.readResolve) {
45
+ const resolve = this.readResolve;
46
+ this.readResolve = undefined;
47
+ this.readReject = undefined;
48
+ resolve({ done: true, value: undefined });
49
+ }
50
+ }
51
+ error(err) {
52
+ this.hasError = err;
53
+ if (this.readReject) {
54
+ const reject = this.readReject;
55
+ this.readResolve = undefined;
56
+ this.readReject = undefined;
57
+ reject(err);
58
+ }
59
+ }
60
+ async return() {
61
+ this.isDone = true;
62
+ return { done: true, value: undefined };
63
+ }
64
+ }
65
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,MAAM;IACT,KAAK,GAAQ,EAAE,CAAC;IAChB,WAAW,CAAuC;IAClD,UAAU,CAA4B;IACtC,MAAM,GAAG,KAAK,CAAC;IACf,QAAQ,CAAW;IACnB,OAAO,GAAG,KAAK,CAAC;IAExB,CAAC,MAAM,CAAC,aAAa,CAAC;QACpB,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,EAAE,CAAC;QACrD,CAAC;QACD,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAyB,EAAE,CAAC;QACzE,IAAI,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,CAAC,QAAQ,CAAC;QAEvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;YAC3B,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,KAAQ;QACd,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;YACjC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;YAC7B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAC5B,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;YACjC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;YAC7B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAC5B,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAyB,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAY;QAChB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;YAC/B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;YAC7B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAyB,EAAE,CAAC;IAC1D,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@agent-link/agent",
3
+ "version": "0.1.0",
4
+ "description": "AgentLink local agent CLI",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": ["dist"],
9
+ "bin": {
10
+ "agentlink-client": "dist/cli.js"
11
+ },
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "prepublishOnly": "npm run build",
15
+ "dev": "tsx watch src/index.ts",
16
+ "start": "node dist/index.js"
17
+ },
18
+ "engines": {
19
+ "node": ">=18.0.0"
20
+ },
21
+ "dependencies": {
22
+ "commander": "^12.0.0",
23
+ "tweetnacl": "^1.0.3",
24
+ "tweetnacl-util": "^0.15.1",
25
+ "ws": "^8.16.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/ws": "^8.5.10",
29
+ "tsx": "^4.7.0"
30
+ }
31
+ }