@agent-link/server 0.1.1 → 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/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":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAE9E,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AAEtD,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AACtB,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;AACjC,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AAE5C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAEzC,gCAAgC;AAChC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;AAEhC,+EAA+E;AAC/E,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IACrC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEH,eAAe;AACf,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IACnC,GAAG,CAAC,IAAI,CAAC;QACP,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,MAAM,CAAC,IAAI;QACnB,UAAU,EAAE,UAAU,CAAC,IAAI;QAC3B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,mEAAmE;AACnE,GAAG,CAAC,GAAG,CAAC,yBAAyB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAC9C,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;IACjC,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAClC,GAAG,CAAC,IAAI,CAAC;gBACP,SAAS;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,WAAW,EAAE,KAAK,CAAC,WAAW;iBAC/B;aACF,CAAC,CAAC;YACH,OAAO;QACT,CAAC;IACH,CAAC;IACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,yCAAyC;AACzC,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE;IAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAE1C,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,qBAAqB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC;SAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QAC1B,mBAAmB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,4CAA4C,EAAE,CAAC,CAAC,CAAC;QAClG,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,iDAAiD;AACjD,WAAW,CAAC,GAAG,EAAE;IACf,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,IAAI,YAAY,CAAC,CAAC;YACzD,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QACD,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;QACtB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IAClB,CAAC;IAED,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;YACtB,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IACnB,CAAC;AACH,CAAC,EAAE,MAAM,CAAC,CAAC;AAEX,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IACvB,OAAO,CAAC,GAAG,CAAC,oDAAoD,IAAI,EAAE,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAC;IAE7C,kDAAkD;IAClD,sBAAsB,CAAC;QACrB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iCAAiC;AACjC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;AAC5C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,uBAAuB,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5E,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,uBAAuB,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-link/server",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "AgentLink relay server",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -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">&#9889;</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">&#128274;</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">&#127760;</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">&#128196;</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">&#128260;</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">&#128679;</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">&harr;</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">&harr;</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">&harr;</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 &mdash; <a href="https://www.npmjs.com/package/@agent-link/agent">@agent-link/agent</a> &middot; <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>