@agent-link/server 0.1.0 → 0.1.2
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 +44 -0
- package/dist/cli.js +21 -0
- package/dist/cli.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/service.d.ts +2 -0
- package/dist/service.js +217 -0
- package/dist/service.js.map +1 -0
- package/package.json +5 -2
- package/web/landing.html +392 -0
package/README.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# AgentLink Server
|
|
2
|
+
|
|
3
|
+
Relay server for [AgentLink](https://github.com/anthropics/agentlink) — use Claude Code from any browser.
|
|
4
|
+
|
|
5
|
+
AgentLink lets you run Claude Code on your local machine and access it through a web interface. The server acts as a WebSocket relay between your browser and the local agent.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install -g @agent-link/server
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Start server (foreground)
|
|
17
|
+
agentlink-server start --port 3456
|
|
18
|
+
|
|
19
|
+
# Start server (background)
|
|
20
|
+
agentlink-server start --daemon --port 3456
|
|
21
|
+
|
|
22
|
+
# Stop server
|
|
23
|
+
agentlink-server stop
|
|
24
|
+
|
|
25
|
+
# Check status
|
|
26
|
+
agentlink-server status
|
|
27
|
+
|
|
28
|
+
# Auto-start on boot
|
|
29
|
+
agentlink-server service install --port 3456
|
|
30
|
+
agentlink-server service uninstall
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## How it works
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
Browser ↔ AgentLink Server ↔ AgentLink Client ↔ Claude Code
|
|
37
|
+
(web) (relay) (your machine) (CLI)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
The server is a lightweight Express + WebSocket relay. It serves the web UI and forwards messages between the browser and the agent. No data is stored on the server.
|
|
41
|
+
|
|
42
|
+
## Related
|
|
43
|
+
|
|
44
|
+
- **[@agent-link/agent](https://www.npmjs.com/package/@agent-link/agent)** — Local agent CLI (install this on your dev machine)
|
package/dist/cli.js
CHANGED
|
@@ -5,6 +5,7 @@ import { openSync } from 'fs';
|
|
|
5
5
|
import { join, dirname, resolve } from 'path';
|
|
6
6
|
import { fileURLToPath } from 'url';
|
|
7
7
|
import { loadServerRuntimeState, clearServerRuntimeState, getLogDir, killProcess, isProcessAlive, } from './config.js';
|
|
8
|
+
import { serverServiceInstall, serverServiceUninstall } from './service.js';
|
|
8
9
|
const program = new Command();
|
|
9
10
|
program
|
|
10
11
|
.name('agentlink-server')
|
|
@@ -121,5 +122,25 @@ program
|
|
|
121
122
|
console.log(` Started: ${state.startedAt}`);
|
|
122
123
|
}
|
|
123
124
|
});
|
|
125
|
+
// ── Service management ──
|
|
126
|
+
const serviceCmd = program
|
|
127
|
+
.command('service')
|
|
128
|
+
.description('Manage auto-start service');
|
|
129
|
+
serviceCmd
|
|
130
|
+
.command('install')
|
|
131
|
+
.description('Register server as an auto-start service and start it now')
|
|
132
|
+
.option('-p, --port <port>', 'Server port', '3456')
|
|
133
|
+
.action((options) => {
|
|
134
|
+
serverServiceInstall(parseInt(options.port, 10));
|
|
135
|
+
});
|
|
136
|
+
serviceCmd
|
|
137
|
+
.command('uninstall')
|
|
138
|
+
.description('Remove auto-start service and stop the server')
|
|
139
|
+
.action(() => {
|
|
140
|
+
serverServiceUninstall();
|
|
141
|
+
});
|
|
142
|
+
serviceCmd.action(() => {
|
|
143
|
+
serviceCmd.help();
|
|
144
|
+
});
|
|
124
145
|
program.parse();
|
|
125
146
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EACL,sBAAsB,EAAE,uBAAuB,EAAE,SAAS,EAC1D,WAAW,EAAE,cAAc,GAC5B,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -13,6 +13,10 @@ const app = express();
|
|
|
13
13
|
const server = createServer(app);
|
|
14
14
|
const wss = new WebSocketServer({ server });
|
|
15
15
|
const webDir = join(__dirname, '../web');
|
|
16
|
+
// Landing page at root
|
|
17
|
+
app.get('/', (_req, res) => {
|
|
18
|
+
res.sendFile(join(webDir, 'landing.html'));
|
|
19
|
+
});
|
|
16
20
|
// Serve static assets from web/
|
|
17
21
|
app.use(express.static(webDir));
|
|
18
22
|
// SPA fallback: /s/:sessionId → serve index.html (Vue router handles the rest)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/service.js
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
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, loadServerRuntimeState, clearServerRuntimeState, killProcess, isProcessAlive, } from './config.js';
|
|
7
|
+
const SERVICE_NAME = 'agentlink-server';
|
|
8
|
+
const LAUNCHD_LABEL = 'com.agentlink.server';
|
|
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(port) {
|
|
21
|
+
const nodePath = getNodePath();
|
|
22
|
+
const cliPath = getCliPath();
|
|
23
|
+
const logDir = getLogDir();
|
|
24
|
+
const nodeBinDir = dirname(nodePath);
|
|
25
|
+
return `[Unit]
|
|
26
|
+
Description=AgentLink Relay Server
|
|
27
|
+
After=network-online.target
|
|
28
|
+
Wants=network-online.target
|
|
29
|
+
|
|
30
|
+
[Service]
|
|
31
|
+
Type=simple
|
|
32
|
+
ExecStart=${nodePath} ${cliPath} start --port ${port}
|
|
33
|
+
Restart=on-failure
|
|
34
|
+
RestartSec=10
|
|
35
|
+
Environment=PATH=${nodeBinDir}:${homedir()}/.local/bin:${homedir()}/.npm-global/bin:/usr/local/bin:/usr/bin:/bin
|
|
36
|
+
StandardOutput=append:${logDir}/server.log
|
|
37
|
+
StandardError=append:${logDir}/server.err
|
|
38
|
+
|
|
39
|
+
[Install]
|
|
40
|
+
WantedBy=default.target
|
|
41
|
+
`;
|
|
42
|
+
}
|
|
43
|
+
function linuxInstall(port) {
|
|
44
|
+
const unitPath = getSystemdUnitPath();
|
|
45
|
+
mkdirSync(dirname(unitPath), { recursive: true });
|
|
46
|
+
mkdirSync(getLogDir(), { recursive: true });
|
|
47
|
+
writeFileSync(unitPath, generateSystemdUnit(port));
|
|
48
|
+
execSync('systemctl --user daemon-reload');
|
|
49
|
+
execSync(`systemctl --user enable ${SERVICE_NAME}`);
|
|
50
|
+
execSync(`systemctl --user start ${SERVICE_NAME}`);
|
|
51
|
+
console.log('Service installed and started.');
|
|
52
|
+
console.log(`\nUnit file: ${unitPath}`);
|
|
53
|
+
console.log('\nUseful commands:');
|
|
54
|
+
console.log(` systemctl --user status ${SERVICE_NAME}`);
|
|
55
|
+
console.log(` journalctl --user -u ${SERVICE_NAME} -f`);
|
|
56
|
+
console.log('\nTo run when not logged in:');
|
|
57
|
+
console.log(' sudo loginctl enable-linger $(whoami)');
|
|
58
|
+
}
|
|
59
|
+
function linuxUninstall() {
|
|
60
|
+
try {
|
|
61
|
+
execSync(`systemctl --user stop ${SERVICE_NAME} 2>/dev/null`);
|
|
62
|
+
}
|
|
63
|
+
catch { }
|
|
64
|
+
try {
|
|
65
|
+
execSync(`systemctl --user disable ${SERVICE_NAME} 2>/dev/null`);
|
|
66
|
+
}
|
|
67
|
+
catch { }
|
|
68
|
+
const unitPath = getSystemdUnitPath();
|
|
69
|
+
if (existsSync(unitPath)) {
|
|
70
|
+
unlinkSync(unitPath);
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
execSync('systemctl --user daemon-reload');
|
|
74
|
+
}
|
|
75
|
+
catch { }
|
|
76
|
+
console.log('Service uninstalled.');
|
|
77
|
+
}
|
|
78
|
+
// ── macOS (launchd plist) ──
|
|
79
|
+
function getLaunchdPlistPath() {
|
|
80
|
+
return join(homedir(), 'Library', 'LaunchAgents', `${LAUNCHD_LABEL}.plist`);
|
|
81
|
+
}
|
|
82
|
+
function generateLaunchdPlist(port) {
|
|
83
|
+
const nodePath = getNodePath();
|
|
84
|
+
const cliPath = getCliPath();
|
|
85
|
+
const logDir = getLogDir();
|
|
86
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
87
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
88
|
+
<plist version="1.0">
|
|
89
|
+
<dict>
|
|
90
|
+
<key>Label</key>
|
|
91
|
+
<string>${LAUNCHD_LABEL}</string>
|
|
92
|
+
<key>ProgramArguments</key>
|
|
93
|
+
<array>
|
|
94
|
+
<string>${nodePath}</string>
|
|
95
|
+
<string>${cliPath}</string>
|
|
96
|
+
<string>start</string>
|
|
97
|
+
<string>--port</string>
|
|
98
|
+
<string>${port}</string>
|
|
99
|
+
</array>
|
|
100
|
+
<key>RunAtLoad</key>
|
|
101
|
+
<true/>
|
|
102
|
+
<key>KeepAlive</key>
|
|
103
|
+
<dict>
|
|
104
|
+
<key>SuccessfulExit</key>
|
|
105
|
+
<false/>
|
|
106
|
+
</dict>
|
|
107
|
+
<key>ThrottleInterval</key>
|
|
108
|
+
<integer>10</integer>
|
|
109
|
+
<key>StandardOutPath</key>
|
|
110
|
+
<string>${logDir}/server.log</string>
|
|
111
|
+
<key>StandardErrorPath</key>
|
|
112
|
+
<string>${logDir}/server.err</string>
|
|
113
|
+
</dict>
|
|
114
|
+
</plist>
|
|
115
|
+
`;
|
|
116
|
+
}
|
|
117
|
+
function macInstall(port) {
|
|
118
|
+
const plistPath = getLaunchdPlistPath();
|
|
119
|
+
mkdirSync(dirname(plistPath), { recursive: true });
|
|
120
|
+
mkdirSync(getLogDir(), { recursive: true });
|
|
121
|
+
if (existsSync(plistPath)) {
|
|
122
|
+
try {
|
|
123
|
+
execSync(`launchctl unload "${plistPath}" 2>/dev/null`);
|
|
124
|
+
}
|
|
125
|
+
catch { }
|
|
126
|
+
}
|
|
127
|
+
writeFileSync(plistPath, generateLaunchdPlist(port));
|
|
128
|
+
execSync(`launchctl load "${plistPath}"`);
|
|
129
|
+
console.log('Service installed and started.');
|
|
130
|
+
console.log(`\nPlist file: ${plistPath}`);
|
|
131
|
+
console.log('\nUseful commands:');
|
|
132
|
+
console.log(` launchctl list | grep ${LAUNCHD_LABEL}`);
|
|
133
|
+
}
|
|
134
|
+
function macUninstall() {
|
|
135
|
+
const plistPath = getLaunchdPlistPath();
|
|
136
|
+
if (existsSync(plistPath)) {
|
|
137
|
+
try {
|
|
138
|
+
execSync(`launchctl unload "${plistPath}"`);
|
|
139
|
+
}
|
|
140
|
+
catch { }
|
|
141
|
+
unlinkSync(plistPath);
|
|
142
|
+
}
|
|
143
|
+
console.log('Service uninstalled.');
|
|
144
|
+
}
|
|
145
|
+
// ── Windows (Startup folder .bat) ──
|
|
146
|
+
function getStartupBatPath() {
|
|
147
|
+
const startupDir = join(process.env.APPDATA || join(homedir(), 'AppData', 'Roaming'), 'Microsoft', 'Windows', 'Start Menu', 'Programs', 'Startup');
|
|
148
|
+
return join(startupDir, `${SERVICE_NAME}.bat`);
|
|
149
|
+
}
|
|
150
|
+
function generateStartupBat(port) {
|
|
151
|
+
const nodePath = getNodePath();
|
|
152
|
+
const cliPath = getCliPath();
|
|
153
|
+
return `@echo off\r\n"${nodePath}" "${cliPath}" start --daemon --port ${port}\r\n`;
|
|
154
|
+
}
|
|
155
|
+
function winInstall(port) {
|
|
156
|
+
mkdirSync(getLogDir(), { recursive: true });
|
|
157
|
+
const batPath = getStartupBatPath();
|
|
158
|
+
writeFileSync(batPath, generateStartupBat(port));
|
|
159
|
+
console.log('Startup script installed.');
|
|
160
|
+
console.log(`\nStartup file: ${batPath}`);
|
|
161
|
+
// Start the server now
|
|
162
|
+
console.log('\nStarting server now...');
|
|
163
|
+
try {
|
|
164
|
+
execSync(`"${getNodePath()}" "${getCliPath()}" start --daemon --port ${port}`, { stdio: 'inherit' });
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
console.error('Failed to start server. Check logs in ~/.agentlink/logs/');
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
function winUninstall() {
|
|
171
|
+
const batPath = getStartupBatPath();
|
|
172
|
+
if (existsSync(batPath)) {
|
|
173
|
+
unlinkSync(batPath);
|
|
174
|
+
console.log(`Removed startup file: ${batPath}`);
|
|
175
|
+
}
|
|
176
|
+
// Stop running server if any
|
|
177
|
+
const state = loadServerRuntimeState();
|
|
178
|
+
if (state && isProcessAlive(state.pid)) {
|
|
179
|
+
console.log(`Stopping server (PID ${state.pid})...`);
|
|
180
|
+
killProcess(state.pid);
|
|
181
|
+
clearServerRuntimeState();
|
|
182
|
+
}
|
|
183
|
+
console.log('Service uninstalled.');
|
|
184
|
+
}
|
|
185
|
+
// ── Platform dispatch ──
|
|
186
|
+
export function serverServiceInstall(port) {
|
|
187
|
+
const p = process.platform;
|
|
188
|
+
console.log('Installing AgentLink server service...');
|
|
189
|
+
console.log(` Port: ${port}`);
|
|
190
|
+
console.log('');
|
|
191
|
+
if (p === 'linux')
|
|
192
|
+
linuxInstall(port);
|
|
193
|
+
else if (p === 'darwin')
|
|
194
|
+
macInstall(port);
|
|
195
|
+
else if (p === 'win32')
|
|
196
|
+
winInstall(port);
|
|
197
|
+
else {
|
|
198
|
+
console.error(`Unsupported platform: ${p}`);
|
|
199
|
+
console.error('Run the server directly: agentlink-server start --daemon');
|
|
200
|
+
process.exit(1);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
export function serverServiceUninstall() {
|
|
204
|
+
const p = process.platform;
|
|
205
|
+
console.log('Uninstalling AgentLink server service...');
|
|
206
|
+
if (p === 'linux')
|
|
207
|
+
linuxUninstall();
|
|
208
|
+
else if (p === 'darwin')
|
|
209
|
+
macUninstall();
|
|
210
|
+
else if (p === 'win32')
|
|
211
|
+
winUninstall();
|
|
212
|
+
else {
|
|
213
|
+
console.error(`Unsupported platform: ${p}`);
|
|
214
|
+
process.exit(1);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-link/server",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "AgentLink relay server",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
|
-
"files": [
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"web"
|
|
11
|
+
],
|
|
9
12
|
"bin": {
|
|
10
13
|
"agentlink-server": "dist/cli.js"
|
|
11
14
|
},
|
package/web/landing.html
ADDED
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>AgentLink — Claude Code in Your Browser</title>
|
|
7
|
+
<style>
|
|
8
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
9
|
+
|
|
10
|
+
:root {
|
|
11
|
+
--bg: #0a0a0a;
|
|
12
|
+
--surface: #141414;
|
|
13
|
+
--border: #252525;
|
|
14
|
+
--text: #e8e8e8;
|
|
15
|
+
--text-dim: #888;
|
|
16
|
+
--accent: #6c63ff;
|
|
17
|
+
--accent-hover: #7c74ff;
|
|
18
|
+
--green: #22c55e;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
body {
|
|
22
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
23
|
+
background: var(--bg);
|
|
24
|
+
color: var(--text);
|
|
25
|
+
line-height: 1.6;
|
|
26
|
+
min-height: 100vh;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* ── Nav ── */
|
|
30
|
+
nav {
|
|
31
|
+
display: flex;
|
|
32
|
+
align-items: center;
|
|
33
|
+
justify-content: space-between;
|
|
34
|
+
padding: 1rem 2rem;
|
|
35
|
+
max-width: 1100px;
|
|
36
|
+
margin: 0 auto;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.logo {
|
|
40
|
+
font-size: 1.25rem;
|
|
41
|
+
font-weight: 700;
|
|
42
|
+
letter-spacing: -0.02em;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.logo span { color: var(--accent); }
|
|
46
|
+
|
|
47
|
+
nav a {
|
|
48
|
+
color: var(--text-dim);
|
|
49
|
+
text-decoration: none;
|
|
50
|
+
font-size: 0.9rem;
|
|
51
|
+
transition: color 0.2s;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
nav a:hover { color: var(--text); }
|
|
55
|
+
|
|
56
|
+
/* ── Hero ── */
|
|
57
|
+
.hero {
|
|
58
|
+
text-align: center;
|
|
59
|
+
padding: 6rem 2rem 4rem;
|
|
60
|
+
max-width: 800px;
|
|
61
|
+
margin: 0 auto;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.hero h1 {
|
|
65
|
+
font-size: clamp(2.2rem, 5vw, 3.5rem);
|
|
66
|
+
font-weight: 800;
|
|
67
|
+
letter-spacing: -0.03em;
|
|
68
|
+
line-height: 1.15;
|
|
69
|
+
margin-bottom: 1.5rem;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.hero h1 em {
|
|
73
|
+
font-style: normal;
|
|
74
|
+
background: linear-gradient(135deg, var(--accent), #a78bfa);
|
|
75
|
+
-webkit-background-clip: text;
|
|
76
|
+
-webkit-text-fill-color: transparent;
|
|
77
|
+
background-clip: text;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.hero p {
|
|
81
|
+
font-size: 1.15rem;
|
|
82
|
+
color: var(--text-dim);
|
|
83
|
+
max-width: 550px;
|
|
84
|
+
margin: 0 auto 1.5rem;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.hero-trust {
|
|
88
|
+
font-size: 0.95rem !important;
|
|
89
|
+
color: var(--green) !important;
|
|
90
|
+
font-weight: 500;
|
|
91
|
+
margin-bottom: 3rem !important;
|
|
92
|
+
letter-spacing: 0.01em;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* ── Install box ── */
|
|
96
|
+
.install {
|
|
97
|
+
background: var(--surface);
|
|
98
|
+
border: 1px solid var(--border);
|
|
99
|
+
border-radius: 12px;
|
|
100
|
+
padding: 2rem 2.5rem;
|
|
101
|
+
max-width: 600px;
|
|
102
|
+
margin: 0 auto 4rem;
|
|
103
|
+
text-align: left;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.install-label {
|
|
107
|
+
font-size: 0.8rem;
|
|
108
|
+
color: var(--text-dim);
|
|
109
|
+
text-transform: uppercase;
|
|
110
|
+
letter-spacing: 0.08em;
|
|
111
|
+
margin-bottom: 1rem;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.install-step {
|
|
115
|
+
display: flex;
|
|
116
|
+
align-items: center;
|
|
117
|
+
gap: 0.75rem;
|
|
118
|
+
margin-bottom: 0.75rem;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.step-num {
|
|
122
|
+
width: 24px;
|
|
123
|
+
height: 24px;
|
|
124
|
+
border-radius: 50%;
|
|
125
|
+
background: var(--accent);
|
|
126
|
+
color: #fff;
|
|
127
|
+
font-size: 0.75rem;
|
|
128
|
+
font-weight: 700;
|
|
129
|
+
display: flex;
|
|
130
|
+
align-items: center;
|
|
131
|
+
justify-content: center;
|
|
132
|
+
flex-shrink: 0;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.install-cmd {
|
|
136
|
+
background: #1a1a2e;
|
|
137
|
+
border: 1px solid #2a2a4a;
|
|
138
|
+
border-radius: 8px;
|
|
139
|
+
padding: 0.6rem 1rem;
|
|
140
|
+
font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
|
|
141
|
+
font-size: 0.9rem;
|
|
142
|
+
color: var(--green);
|
|
143
|
+
flex: 1;
|
|
144
|
+
cursor: pointer;
|
|
145
|
+
position: relative;
|
|
146
|
+
transition: border-color 0.2s;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.install-cmd:hover {
|
|
150
|
+
border-color: var(--accent);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.install-cmd .copy-hint {
|
|
154
|
+
position: absolute;
|
|
155
|
+
right: 0.75rem;
|
|
156
|
+
top: 50%;
|
|
157
|
+
transform: translateY(-50%);
|
|
158
|
+
font-size: 0.7rem;
|
|
159
|
+
color: var(--text-dim);
|
|
160
|
+
opacity: 0;
|
|
161
|
+
transition: opacity 0.2s;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.install-cmd:hover .copy-hint { opacity: 1; }
|
|
165
|
+
|
|
166
|
+
.install-note {
|
|
167
|
+
font-size: 0.8rem;
|
|
168
|
+
color: var(--text-dim);
|
|
169
|
+
margin-top: 1rem;
|
|
170
|
+
text-align: center;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/* ── Features ── */
|
|
174
|
+
.features {
|
|
175
|
+
display: grid;
|
|
176
|
+
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
|
177
|
+
gap: 1.5rem;
|
|
178
|
+
max-width: 1000px;
|
|
179
|
+
margin: 0 auto 5rem;
|
|
180
|
+
padding: 0 2rem;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.feature {
|
|
184
|
+
background: var(--surface);
|
|
185
|
+
border: 1px solid var(--border);
|
|
186
|
+
border-radius: 12px;
|
|
187
|
+
padding: 1.5rem;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.feature-icon {
|
|
191
|
+
font-size: 1.5rem;
|
|
192
|
+
margin-bottom: 0.75rem;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.feature h3 {
|
|
196
|
+
font-size: 1rem;
|
|
197
|
+
font-weight: 600;
|
|
198
|
+
margin-bottom: 0.5rem;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.feature p {
|
|
202
|
+
font-size: 0.9rem;
|
|
203
|
+
color: var(--text-dim);
|
|
204
|
+
line-height: 1.5;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/* ── How it works ── */
|
|
208
|
+
.how {
|
|
209
|
+
text-align: center;
|
|
210
|
+
max-width: 800px;
|
|
211
|
+
margin: 0 auto 5rem;
|
|
212
|
+
padding: 0 2rem;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.how h2 {
|
|
216
|
+
font-size: 1.8rem;
|
|
217
|
+
font-weight: 700;
|
|
218
|
+
margin-bottom: 2rem;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.diagram {
|
|
222
|
+
display: flex;
|
|
223
|
+
align-items: center;
|
|
224
|
+
justify-content: center;
|
|
225
|
+
gap: 0;
|
|
226
|
+
flex-wrap: wrap;
|
|
227
|
+
margin-bottom: 1.5rem;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.diagram-node {
|
|
231
|
+
background: var(--surface);
|
|
232
|
+
border: 1px solid var(--border);
|
|
233
|
+
border-radius: 10px;
|
|
234
|
+
padding: 1rem 1.5rem;
|
|
235
|
+
text-align: center;
|
|
236
|
+
min-width: 140px;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.diagram-node .node-label {
|
|
240
|
+
font-size: 0.75rem;
|
|
241
|
+
color: var(--text-dim);
|
|
242
|
+
text-transform: uppercase;
|
|
243
|
+
letter-spacing: 0.05em;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.diagram-node .node-name {
|
|
247
|
+
font-weight: 700;
|
|
248
|
+
font-size: 1rem;
|
|
249
|
+
margin-top: 0.25rem;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
.diagram-arrow {
|
|
253
|
+
color: var(--accent);
|
|
254
|
+
font-size: 1.5rem;
|
|
255
|
+
padding: 0 0.5rem;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
.how p {
|
|
259
|
+
color: var(--text-dim);
|
|
260
|
+
font-size: 0.95rem;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/* ── Footer ── */
|
|
264
|
+
footer {
|
|
265
|
+
text-align: center;
|
|
266
|
+
padding: 2rem;
|
|
267
|
+
color: var(--text-dim);
|
|
268
|
+
font-size: 0.85rem;
|
|
269
|
+
border-top: 1px solid var(--border);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
footer a { color: var(--accent); text-decoration: none; }
|
|
273
|
+
footer a:hover { text-decoration: underline; }
|
|
274
|
+
|
|
275
|
+
@media (max-width: 640px) {
|
|
276
|
+
.hero { padding: 4rem 1.5rem 3rem; }
|
|
277
|
+
.install { padding: 1.5rem; margin: 0 1rem 3rem; }
|
|
278
|
+
.diagram { flex-direction: column; }
|
|
279
|
+
.diagram-arrow { transform: rotate(90deg); padding: 0.25rem 0; }
|
|
280
|
+
}
|
|
281
|
+
</style>
|
|
282
|
+
</head>
|
|
283
|
+
<body>
|
|
284
|
+
|
|
285
|
+
<nav>
|
|
286
|
+
<div class="logo">Agent<span>Link</span></div>
|
|
287
|
+
<div>
|
|
288
|
+
<a href="https://www.npmjs.com/package/@agent-link/agent" target="_blank">npm</a>
|
|
289
|
+
</div>
|
|
290
|
+
</nav>
|
|
291
|
+
|
|
292
|
+
<section class="hero">
|
|
293
|
+
<h1>Claude Code,<br><em>in your browser</em></h1>
|
|
294
|
+
<p>Run Claude Code on your machine, use it from any browser. Two commands to get started.</p>
|
|
295
|
+
<p class="hero-trust">End-to-end encrypted. The server is a relay — it never sees, stores, or logs your data.</p>
|
|
296
|
+
</section>
|
|
297
|
+
|
|
298
|
+
<section class="install">
|
|
299
|
+
<div class="install-label">Get started</div>
|
|
300
|
+
<div class="install-step">
|
|
301
|
+
<div class="step-num">1</div>
|
|
302
|
+
<div class="install-cmd" onclick="copyCmd(this)">
|
|
303
|
+
npm install -g @agent-link/agent
|
|
304
|
+
<span class="copy-hint">click to copy</span>
|
|
305
|
+
</div>
|
|
306
|
+
</div>
|
|
307
|
+
<div class="install-step">
|
|
308
|
+
<div class="step-num">2</div>
|
|
309
|
+
<div class="install-cmd" onclick="copyCmd(this)">
|
|
310
|
+
agentlink-client start
|
|
311
|
+
<span class="copy-hint">click to copy</span>
|
|
312
|
+
</div>
|
|
313
|
+
</div>
|
|
314
|
+
<div class="install-note">Open the URL it prints. That's it.</div>
|
|
315
|
+
</section>
|
|
316
|
+
|
|
317
|
+
<section class="features">
|
|
318
|
+
<div class="feature">
|
|
319
|
+
<div class="feature-icon">⚡</div>
|
|
320
|
+
<h3>Zero config</h3>
|
|
321
|
+
<p>Install, start, open the URL. No accounts, no setup, no configuration files needed.</p>
|
|
322
|
+
</div>
|
|
323
|
+
<div class="feature">
|
|
324
|
+
<div class="feature-icon">🔒</div>
|
|
325
|
+
<h3>Privacy first</h3>
|
|
326
|
+
<p>All messages are end-to-end encrypted. The relay server cannot read, store, or log any of your conversations or code. It's a blind forwarder.</p>
|
|
327
|
+
</div>
|
|
328
|
+
<div class="feature">
|
|
329
|
+
<div class="feature-icon">🌐</div>
|
|
330
|
+
<h3>Access anywhere</h3>
|
|
331
|
+
<p>Use Claude Code from your phone, tablet, or any device with a browser. Share the URL with teammates.</p>
|
|
332
|
+
</div>
|
|
333
|
+
<div class="feature">
|
|
334
|
+
<div class="feature-icon">📄</div>
|
|
335
|
+
<h3>Full Claude Code</h3>
|
|
336
|
+
<p>File editing, bash commands, search, multi-turn conversations, session history — everything Claude Code can do.</p>
|
|
337
|
+
</div>
|
|
338
|
+
<div class="feature">
|
|
339
|
+
<div class="feature-icon">🔄</div>
|
|
340
|
+
<h3>Session history</h3>
|
|
341
|
+
<p>Browse and resume any past conversation from any working directory. Switch projects without losing context.</p>
|
|
342
|
+
</div>
|
|
343
|
+
<div class="feature">
|
|
344
|
+
<div class="feature-icon">🚧</div>
|
|
345
|
+
<h3>Self-hostable</h3>
|
|
346
|
+
<p>Run your own relay server with <code style="color:var(--green)">@agent-link/server</code>. Full control over your infrastructure.</p>
|
|
347
|
+
</div>
|
|
348
|
+
</section>
|
|
349
|
+
|
|
350
|
+
<section class="how">
|
|
351
|
+
<h2>How it works</h2>
|
|
352
|
+
<div class="diagram">
|
|
353
|
+
<div class="diagram-node">
|
|
354
|
+
<div class="node-label">Your browser</div>
|
|
355
|
+
<div class="node-name">Web UI</div>
|
|
356
|
+
</div>
|
|
357
|
+
<div class="diagram-arrow">↔</div>
|
|
358
|
+
<div class="diagram-node">
|
|
359
|
+
<div class="node-label">Encrypted relay</div>
|
|
360
|
+
<div class="node-name">Server</div>
|
|
361
|
+
</div>
|
|
362
|
+
<div class="diagram-arrow">↔</div>
|
|
363
|
+
<div class="diagram-node">
|
|
364
|
+
<div class="node-label">Your machine</div>
|
|
365
|
+
<div class="node-name">Agent</div>
|
|
366
|
+
</div>
|
|
367
|
+
<div class="diagram-arrow">↔</div>
|
|
368
|
+
<div class="diagram-node">
|
|
369
|
+
<div class="node-label">Local CLI</div>
|
|
370
|
+
<div class="node-name">Claude Code</div>
|
|
371
|
+
</div>
|
|
372
|
+
</div>
|
|
373
|
+
<p>The agent on your machine spawns Claude Code, streams output through the relay server to your browser, and sends your messages back. All tool execution happens locally. <strong>All traffic is end-to-end encrypted — the server is a stateless relay that never decrypts, stores, or logs your data.</strong></p>
|
|
374
|
+
</section>
|
|
375
|
+
|
|
376
|
+
<footer>
|
|
377
|
+
AgentLink — <a href="https://www.npmjs.com/package/@agent-link/agent">@agent-link/agent</a> · <a href="https://www.npmjs.com/package/@agent-link/server">@agent-link/server</a>
|
|
378
|
+
</footer>
|
|
379
|
+
|
|
380
|
+
<script>
|
|
381
|
+
function copyCmd(el) {
|
|
382
|
+
const text = el.childNodes[0].textContent.trim();
|
|
383
|
+
navigator.clipboard.writeText(text);
|
|
384
|
+
const hint = el.querySelector('.copy-hint');
|
|
385
|
+
hint.textContent = 'copied!';
|
|
386
|
+
hint.style.opacity = '1';
|
|
387
|
+
setTimeout(() => { hint.textContent = 'click to copy'; hint.style.opacity = ''; }, 1500);
|
|
388
|
+
}
|
|
389
|
+
</script>
|
|
390
|
+
|
|
391
|
+
</body>
|
|
392
|
+
</html>
|