@agent-link/server 0.1.480 → 0.1.482

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.
Files changed (22) hide show
  1. package/package.json +1 -1
  2. package/web/dist/assets/{cssMode-tVxM_OWm.js → cssMode-CP0w4p0j.js} +1 -1
  3. package/web/dist/assets/{editor.main-CfIJ42Pc.js → editor.main-Bqi4V96Y.js} +3 -3
  4. package/web/dist/assets/{freemarker2-CB_jufLD.js → freemarker2-D-1smmKR.js} +1 -1
  5. package/web/dist/assets/{handlebars-DPhpkYGX.js → handlebars-BkvVaMm1.js} +1 -1
  6. package/web/dist/assets/{html-D7cVXE4i.js → html-DujTvSZt.js} +1 -1
  7. package/web/dist/assets/{htmlMode-Bkh8SNCW.js → htmlMode-uGQZpNr6.js} +1 -1
  8. package/web/dist/assets/{index-BmV7WyPa.js → index-DY1VorHg.js} +3 -3
  9. package/web/dist/assets/{javascript-DOfvI9Vy.js → javascript-BrSignCR.js} +1 -1
  10. package/web/dist/assets/{jsonMode-CL8MLBdW.js → jsonMode-bx-Oa7mN.js} +1 -1
  11. package/web/dist/assets/{liquid-yH5xCFmc.js → liquid-BP0WX82L.js} +1 -1
  12. package/web/dist/assets/{lspLanguageFeatures-qRBbAoIb.js → lspLanguageFeatures-BOdSm1bg.js} +1 -1
  13. package/web/dist/assets/{mdx-dimSuata.js → mdx-CgD0acQR.js} +1 -1
  14. package/web/dist/assets/{python-B4ko7-Xf.js → python-Dk1htDY-.js} +1 -1
  15. package/web/dist/assets/{razor-C2LVkAGZ.js → razor-DDSydfgg.js} +1 -1
  16. package/web/dist/assets/{tsMode-C8dubaaA.js → tsMode-Z8MLI243.js} +1 -1
  17. package/web/dist/assets/{typescript-BnPuLSfC.js → typescript-Dh8dVoWo.js} +1 -1
  18. package/web/dist/assets/{xml-DTV5UAWA.js → xml-FRrY4Fau.js} +1 -1
  19. package/web/dist/assets/{yaml-DLsgpW-Z.js → yaml-BcvIgHmy.js} +1 -1
  20. package/web/dist/index.html +1 -1
  21. package/web/dist/landing.html +386 -517
  22. package/web/dist/landing.zh.html +380 -520
@@ -3,26 +3,24 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>AgenticWorker — Claude Code 随时随地操控</title>
7
- <meta name="description" content="Claude Code 随时随地操控。对话、多 Agent 协作、定时任务三大模式,手机或任何浏览器即可操控,端到端加密,无需注册。">
8
- <meta name="keywords" content="Claude Code, Claude Code随时随地操控, 远程控制, 浏览器 IDE, AI 编程助手, AgenticWorker, 端到端加密, 自建部署, 移动编程, 多Agent协作, 定时任务">
6
+ <title>AgenticWorker — 随时随地操控你的 Coding Agent</title>
7
+ <meta name="description" content="AgenticWorker 为 Copilot、Claude Code 和更多 Coding Agent 提供简洁的远程工作台,支持多目录会话管理、文件预览/编辑、远程终端和端到端加密。">
8
+ <meta name="keywords" content="AgenticWorker, Copilot, Claude Code, Coding Agent, 远程工作台, 浏览器 IDE, 端到端加密, 远程终端, 文件编辑">
9
9
  <link rel="canonical" href="https://msclaude.ai/zh">
10
10
  <link rel="alternate" hreflang="en" href="https://msclaude.ai/">
11
11
  <link rel="alternate" hreflang="zh" href="https://msclaude.ai/zh">
12
12
  <link rel="alternate" hreflang="x-default" href="https://msclaude.ai/">
13
- <!-- Open Graph -->
14
13
  <meta property="og:type" content="website">
15
- <meta property="og:title" content="AgenticWorker — Claude Code 随时随地操控">
16
- <meta property="og:description" content="Claude Code 随时随地操控。对话、多 Agent 协作、定时任务三大模式,手机或任何浏览器即可操控,端到端加密,无需注册。">
14
+ <meta property="og:title" content="AgenticWorker — 随时随地操控你的 Coding Agent">
15
+ <meta property="og:description" content="为 Copilot、Claude Code 和更多 Coding Agent 准备的远程工作台。多目录会话、文件、终端、端到端加密。">
17
16
  <meta property="og:url" content="https://msclaude.ai/zh">
18
17
  <meta property="og:image" content="https://msclaude.ai/iPad.png">
19
18
  <meta property="og:site_name" content="AgenticWorker">
20
19
  <meta property="og:locale" content="zh_CN">
21
20
  <meta property="og:locale:alternate" content="en_US">
22
- <!-- Twitter Card -->
23
21
  <meta name="twitter:card" content="summary_large_image">
24
- <meta name="twitter:title" content="AgenticWorker — Claude Code 随时随地操控">
25
- <meta name="twitter:description" content="Claude Code 随时随地操控。对话、多 Agent 协作、定时任务三大模式,手机或任何浏览器即可操控,端到端加密,无需注册。">
22
+ <meta name="twitter:title" content="AgenticWorker — 随时随地操控你的 Coding Agent">
23
+ <meta name="twitter:description" content="为 Copilot、Claude Code 和更多 Coding Agent 准备的远程工作台。">
26
24
  <meta name="twitter:image" content="https://msclaude.ai/iPad.png">
27
25
  <link rel="icon" type="image/svg+xml" href="/favicon.svg">
28
26
  <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
@@ -33,7 +31,7 @@
33
31
  "@context": "https://schema.org",
34
32
  "@type": "SoftwareApplication",
35
33
  "name": "AgenticWorker",
36
- "description": "Claude Code 随时随地操控。对话、多 Agent 协作、定时任务三大模式,手机或任何浏览器即可操控,端到端加密,无需注册。",
34
+ "description": "为 Copilot、Claude Code 和更多 Coding Agent 准备的远程工作台,支持端到端加密。",
37
35
  "url": "https://msclaude.ai/zh",
38
36
  "applicationCategory": "DeveloperApplication",
39
37
  "operatingSystem": "Windows, macOS, Linux",
@@ -49,590 +47,524 @@
49
47
  font-display: swap;
50
48
  src: url('/vendor/SpaceGrotesk-latin.woff2') format('woff2');
51
49
  }
52
- @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;600;700&display=swap');
53
50
 
54
- * { margin: 0; padding: 0; box-sizing: border-box; }
51
+ * { box-sizing: border-box; margin: 0; padding: 0; }
55
52
 
56
53
  :root {
57
- --bg: #ffffff;
58
- --surface: #f7f8fa;
59
- --border: #e5e7eb;
60
- --text: #1a1a1a;
61
- --text-secondary: #6b7280;
62
- --accent: #2563eb;
63
- --accent-light: #eff4ff;
64
- --code-bg: #1e293b;
54
+ --bg: #fbfcff;
55
+ --card: #ffffff;
56
+ --surface: #f3f6fb;
57
+ --border: #e4e9f2;
58
+ --text: #111827;
59
+ --muted: #64748b;
60
+ --accent: #018B8D;
61
+ --accent-soft: #e6f7f7;
62
+ --green: #16a34a;
63
+ --code: #101827;
65
64
  }
66
65
 
67
66
  body {
68
- font-family: 'Noto Sans SC', 'Space Grotesk', system-ui, sans-serif;
69
- background: var(--bg);
67
+ min-height: 100vh;
68
+ background:
69
+ radial-gradient(circle at top left, rgba(1, 139, 141, 0.12), transparent 32rem),
70
+ linear-gradient(180deg, #ffffff 0%, var(--bg) 55%, #ffffff 100%);
70
71
  color: var(--text);
71
- line-height: 1.6;
72
+ font-family: 'Space Grotesk', system-ui, -apple-system, BlinkMacSystemFont, 'Microsoft YaHei', sans-serif;
73
+ line-height: 1.65;
72
74
  -webkit-font-smoothing: antialiased;
73
75
  }
74
76
 
75
- /* -- Nav -- */
77
+ a { color: inherit; text-decoration: none; }
78
+
79
+ nav, main, footer {
80
+ width: min(1120px, calc(100% - 32px));
81
+ margin: 0 auto;
82
+ }
83
+
76
84
  nav {
77
85
  display: flex;
78
86
  align-items: center;
79
87
  justify-content: space-between;
80
- padding: 1.25rem 2rem;
81
- max-width: 1080px;
82
- margin: 0 auto;
88
+ padding: 24px 0;
83
89
  }
84
90
 
85
91
  .logo {
86
- display: flex;
92
+ display: inline-flex;
87
93
  align-items: center;
88
- gap: 0.5rem;
89
- font-size: 1.1rem;
94
+ gap: 10px;
90
95
  font-weight: 700;
91
- color: var(--text);
92
- letter-spacing: -0.02em;
96
+ letter-spacing: -0.03em;
93
97
  }
94
98
 
95
- .logo img { width: 26px; height: 26px; border-radius: 6px; }
99
+ .logo img { width: 28px; height: 28px; border-radius: 8px; }
96
100
 
97
- .nav-links {
98
- display: flex;
101
+ .nav-actions {
99
102
  align-items: center;
100
- gap: 1.5rem;
103
+ display: flex;
104
+ gap: 10px;
101
105
  }
102
106
 
103
- .nav-links a {
104
- color: var(--text-secondary);
105
- text-decoration: none;
106
- font-size: 0.875rem;
107
- font-weight: 500;
107
+ .repo-link,
108
+ .nav-lang {
109
+ border: 1px solid var(--border);
110
+ border-radius: 999px;
111
+ color: var(--muted);
112
+ font-size: 0.86rem;
113
+ font-weight: 600;
114
+ padding: 8px 13px;
108
115
  }
109
116
 
110
- .nav-links a:hover { color: var(--text); }
117
+ .repo-link:hover,
118
+ .nav-lang:hover { color: var(--text); background: #fff; }
111
119
 
112
- .nav-gh {
113
- display: inline-flex;
120
+ .hero {
121
+ display: grid;
122
+ grid-template-columns: minmax(0, 1.1fr) minmax(320px, 0.9fr);
123
+ gap: 56px;
114
124
  align-items: center;
115
- gap: 0.35rem;
116
- border: 1px solid var(--border);
117
- border-radius: 8px;
118
- padding: 0.4rem 0.75rem;
125
+ padding: 70px 0 42px;
119
126
  }
120
127
 
121
- .nav-gh svg { width: 16px; height: 16px; fill: currentColor; }
128
+ .eyebrow {
129
+ display: inline-flex;
130
+ align-items: center;
131
+ gap: 8px;
132
+ background: var(--accent-soft);
133
+ border: 1px solid #c8eeee;
134
+ border-radius: 999px;
135
+ color: var(--accent);
136
+ font-size: 0.82rem;
137
+ font-weight: 700;
138
+ margin-bottom: 22px;
139
+ padding: 7px 13px;
140
+ }
122
141
 
123
- .nav-lang {
124
- border: 1px solid var(--border);
125
- border-radius: 6px;
126
- padding: 0.3rem 0.6rem;
127
- font-size: 0.8rem;
142
+ .eyebrow::before {
143
+ content: "";
144
+ width: 7px;
145
+ height: 7px;
146
+ background: var(--green);
147
+ border-radius: 999px;
148
+ box-shadow: 0 0 0 4px rgba(22, 163, 74, 0.12);
128
149
  }
129
150
 
130
- /* -- Hero -- */
131
- .hero {
132
- text-align: center;
133
- padding: 5rem 2rem 3rem;
151
+ h1 {
134
152
  max-width: 720px;
135
- margin: 0 auto;
153
+ font-size: clamp(2.65rem, 5.8vw, 5.25rem);
154
+ letter-spacing: -0.07em;
155
+ line-height: 1;
136
156
  }
137
157
 
138
- .hero-badge {
139
- display: inline-flex;
140
- align-items: center;
141
- gap: 0.5rem;
142
- background: var(--accent-light);
143
- border: 1px solid #dbeafe;
144
- border-radius: 100px;
145
- padding: 0.35rem 1rem;
146
- font-size: 0.8rem;
147
- color: var(--accent);
148
- font-weight: 500;
149
- margin-bottom: 2rem;
158
+ h1 span { color: var(--accent); }
159
+
160
+ .lead {
161
+ max-width: 640px;
162
+ color: var(--muted);
163
+ font-size: clamp(1rem, 2vw, 1.18rem);
164
+ margin: 24px 0 30px;
150
165
  }
151
166
 
152
- .hero-badge-dot {
153
- width: 7px; height: 7px;
154
- border-radius: 50%;
155
- background: #22c55e;
167
+ .agent-row {
168
+ display: flex;
169
+ flex-wrap: wrap;
170
+ gap: 10px;
171
+ margin-bottom: 32px;
156
172
  }
157
173
 
158
- .hero h1 {
159
- font-size: clamp(2.4rem, 5vw, 3.5rem);
160
- font-weight: 700;
161
- letter-spacing: -0.03em;
162
- line-height: 1.15;
163
- margin-bottom: 1.5rem;
164
- color: var(--text);
174
+ .agent-pill {
175
+ align-items: center;
176
+ background: rgba(255, 255, 255, 0.78);
177
+ border: 1px solid var(--border);
178
+ border-radius: 999px;
179
+ color: #334155;
180
+ display: inline-flex;
181
+ font-size: 0.92rem;
182
+ font-weight: 650;
183
+ gap: 8px;
184
+ padding: 9px 14px;
165
185
  }
166
186
 
167
- .hero h1 em {
168
- font-style: normal;
169
- color: var(--accent);
187
+ .agent-pill::before {
188
+ content: "";
189
+ width: 8px;
190
+ height: 8px;
191
+ border-radius: 99px;
192
+ background: var(--accent);
170
193
  }
171
194
 
172
- /* -- CTA -- */
173
- .cta-group {
195
+ .cta-row {
174
196
  display: flex;
175
- align-items: center;
176
- justify-content: center;
177
- gap: 0.75rem;
178
- margin-bottom: 2rem;
197
+ align-items: flex-start;
198
+ flex-direction: column;
199
+ gap: 14px;
179
200
  }
180
201
 
181
202
  .cta-primary {
182
- display: inline-flex;
183
203
  align-items: center;
184
- gap: 0.4rem;
185
- background: var(--accent);
204
+ background: var(--text);
205
+ border: 0;
206
+ border-radius: 14px;
186
207
  color: #fff;
187
- font-weight: 600;
188
- font-size: 0.9rem;
189
- padding: 0.7rem 1.5rem;
190
- border-radius: 10px;
191
- border: none;
192
208
  cursor: pointer;
193
- font-family: inherit;
209
+ display: inline-flex;
210
+ font: inherit;
211
+ font-size: 0.95rem;
212
+ font-weight: 700;
213
+ gap: 8px;
214
+ padding: 13px 18px;
194
215
  }
195
216
 
196
- .cta-primary:hover { background: #1d4ed8; }
197
-
198
- .cta-secondary {
199
- display: inline-flex;
200
- align-items: center;
201
- gap: 0.4rem;
202
- background: var(--bg);
217
+ .install-command {
218
+ background: #fff;
203
219
  border: 1px solid var(--border);
204
- color: var(--text);
205
- font-weight: 500;
206
- font-size: 0.9rem;
207
- padding: 0.7rem 1.5rem;
208
- border-radius: 10px;
209
- text-decoration: none;
220
+ border-radius: 14px;
221
+ color: #334155;
210
222
  cursor: pointer;
211
- font-family: inherit;
212
- }
213
-
214
- .cta-secondary:hover { background: var(--surface); }
215
- .cta-secondary svg { width: 16px; height: 16px; fill: currentColor; }
216
-
217
- /* -- Terminal -- */
218
- .terminal {
219
- max-width: 500px;
220
- margin: 0 auto;
221
- background: var(--code-bg);
222
- border-radius: 12px;
223
- overflow: hidden;
224
- box-shadow: 0 4px 24px rgba(0,0,0,0.08);
225
- }
226
-
227
- .terminal-bar {
228
- display: flex;
229
- align-items: center;
230
- gap: 6px;
231
- padding: 0.7rem 1rem;
232
- background: rgba(255,255,255,0.06);
223
+ font-family: Consolas, 'Courier New', monospace;
224
+ font-size: 0.9rem;
225
+ overflow-x: auto;
226
+ padding: 12px 14px;
227
+ width: min(100%, 560px);
233
228
  }
234
229
 
235
- .terminal-dot { width: 10px; height: 10px; border-radius: 50%; }
236
- .terminal-dot:nth-child(1) { background: #ff5f57; }
237
- .terminal-dot:nth-child(2) { background: #ffbd2e; }
238
- .terminal-dot:nth-child(3) { background: #28c840; }
230
+ .install-command span { display: block; white-space: nowrap; }
239
231
 
240
- .terminal-title {
241
- flex: 1;
242
- text-align: center;
243
- font-size: 0.7rem;
244
- color: rgba(255,255,255,0.4);
245
- font-weight: 500;
232
+ .panel {
233
+ background: rgba(255, 255, 255, 0.82);
234
+ border: 1px solid var(--border);
235
+ border-radius: 28px;
236
+ box-shadow: 0 24px 80px rgba(15, 23, 42, 0.10);
237
+ padding: 18px;
246
238
  }
247
239
 
248
- .terminal-body {
249
- padding: 1rem 1.25rem;
250
- font-family: Consolas, 'Courier New', monospace;
251
- font-size: 0.82rem;
252
- line-height: 1.8;
253
- color: #e2e8f0;
240
+ .workspace {
241
+ background: #fff;
242
+ border: 1px solid var(--border);
243
+ border-radius: 22px;
244
+ overflow: hidden;
254
245
  }
255
246
 
256
- .terminal-line {
257
- display: flex;
247
+ .workspace-top {
258
248
  align-items: center;
259
- gap: 0.5rem;
260
- cursor: pointer;
261
- padding: 0.1rem 0.3rem;
262
- margin: 0 -0.3rem;
263
- border-radius: 4px;
264
- }
265
-
266
- .terminal-line:hover { background: rgba(255,255,255,0.05); }
267
-
268
- .terminal-prompt { color: #60a5fa; user-select: none; }
269
- .terminal-cmd { color: #86efac; }
270
-
271
- .terminal-output {
272
- color: rgba(255,255,255,0.45);
249
+ background: var(--surface);
250
+ border-bottom: 1px solid var(--border);
251
+ color: var(--muted);
252
+ display: flex;
273
253
  font-size: 0.78rem;
274
- padding-left: 1rem;
275
- margin-top: 0.1rem;
254
+ font-weight: 700;
255
+ justify-content: space-between;
256
+ padding: 13px 16px;
276
257
  }
277
258
 
278
- .terminal-output a { color: #67e8f9; text-decoration: none; }
279
-
280
- .terminal-copy-toast {
281
- position: fixed;
282
- bottom: 2rem;
283
- left: 50%;
284
- transform: translateX(-50%) translateY(20px);
285
- background: var(--text);
286
- color: #fff;
287
- padding: 0.5rem 1.25rem;
288
- border-radius: 8px;
289
- font-size: 0.8rem;
290
- font-weight: 500;
291
- opacity: 0;
292
- transition: all 0.3s;
293
- pointer-events: none;
294
- z-index: 100;
295
- font-family: 'Noto Sans SC', 'Space Grotesk', system-ui, sans-serif;
259
+ .workspace-body {
260
+ display: grid;
261
+ grid-template-columns: 0.95fr 1.4fr;
262
+ min-height: 330px;
296
263
  }
297
264
 
298
- .terminal-copy-toast.show {
299
- opacity: 1;
300
- transform: translateX(-50%) translateY(0);
265
+ .sidebar {
266
+ background: #f8fafc;
267
+ border-right: 1px solid var(--border);
268
+ padding: 16px;
301
269
  }
302
270
 
303
- /* -- Showcase -- */
304
- .showcase {
305
- max-width: 960px;
306
- margin: 4rem auto 0;
307
- padding: 0 2rem;
308
- display: grid;
309
- grid-template-columns: 5fr 2fr;
310
- align-items: end;
311
- gap: 1.5rem;
271
+ .session {
272
+ border: 1px solid transparent;
273
+ border-radius: 14px;
274
+ color: var(--muted);
275
+ font-size: 0.82rem;
276
+ margin-bottom: 10px;
277
+ padding: 10px;
312
278
  }
313
279
 
314
- .device img { display: block; width: 100%; height: auto; }
280
+ .session strong { color: var(--text); display: block; font-size: 0.9rem; }
281
+ .session.active { background: #fff; border-color: var(--border); box-shadow: 0 8px 24px rgba(15, 23, 42, 0.05); }
315
282
 
316
- .device-ipad { z-index: 1; }
283
+ .content { display: flex; flex-direction: column; padding: 16px; gap: 12px; }
317
284
 
318
- .ipad-carousel {
319
- position: relative;
320
- width: 100%;
321
- overflow: hidden;
322
- border-radius: 4.2%;
323
- box-shadow: 0 8px 40px rgba(0,0,0,0.1);
285
+ .chat-card, .file-card, .terminal {
324
286
  border: 1px solid var(--border);
287
+ border-radius: 16px;
288
+ padding: 14px;
325
289
  }
326
290
 
327
- .carousel-track { position: relative; width: 100%; }
328
-
329
- .carousel-slide {
330
- position: absolute;
331
- top: 0; left: 0;
332
- width: 100%;
333
- opacity: 0;
334
- transition: opacity 0.5s ease;
335
- pointer-events: none;
336
- }
291
+ .chat-card { background: linear-gradient(135deg, #eef4ff, #ffffff); }
292
+ .chat-card b, .file-card b { display: block; font-size: 0.86rem; margin-bottom: 4px; }
293
+ .chat-card p, .file-card p { color: var(--muted); font-size: 0.82rem; }
337
294
 
338
- .carousel-slide.active {
339
- position: relative;
340
- opacity: 1;
341
- pointer-events: auto;
342
- }
343
-
344
- .carousel-slide img { display: block; width: 100%; height: auto; }
345
-
346
- .carousel-dots {
347
- position: absolute;
348
- bottom: 10px;
349
- left: 50%;
350
- transform: translateX(-50%);
351
- display: flex;
352
- gap: 6px;
353
- z-index: 5;
354
- }
355
-
356
- .carousel-dot {
357
- width: 7px; height: 7px;
358
- border-radius: 50%;
359
- border: none;
360
- background: rgba(255,255,255,0.45);
295
+ .terminal {
296
+ background: var(--code);
297
+ color: #dbeafe;
361
298
  cursor: pointer;
362
- padding: 0;
363
- }
364
-
365
- .carousel-dot.active { background: rgba(255,255,255,0.9); }
366
-
367
- .carousel-label {
368
- position: absolute;
369
- top: 12px; left: 12px;
370
- display: flex;
371
- flex-direction: column;
372
- gap: 1px;
373
- background: rgba(0,0,0,0.65);
374
- padding: 6px 12px;
375
- border-radius: 8px;
376
- z-index: 4;
377
- pointer-events: none;
299
+ font-family: Consolas, 'Courier New', monospace;
300
+ font-size: 0.78rem;
301
+ line-height: 1.8;
378
302
  }
379
303
 
380
- .carousel-label-title { font-size: 0.85rem; font-weight: 700; color: #fff; }
381
- .carousel-label-desc { font-size: 0.65rem; color: rgba(255,255,255,0.7); }
304
+ .terminal span { color: #86efac; }
382
305
 
383
- .device-iphone {
384
- width: 90%;
385
- z-index: 2;
386
- justify-self: center;
387
- align-self: center;
306
+ .section-head {
307
+ margin: 72px auto 26px;
308
+ max-width: 680px;
309
+ text-align: center;
388
310
  }
389
311
 
390
- .device-iphone img {
391
- border-radius: 12%;
392
- box-shadow: 0 8px 40px rgba(0,0,0,0.12);
312
+ .section-head h2 {
313
+ font-size: clamp(1.8rem, 3.6vw, 3rem);
314
+ letter-spacing: -0.05em;
315
+ line-height: 1.12;
393
316
  }
394
317
 
395
- /* -- Divider -- */
396
- .divider {
397
- max-width: 80px;
398
- margin: 5rem auto;
399
- height: 1px;
400
- background: var(--border);
318
+ .section-head p {
319
+ color: var(--muted);
320
+ margin-top: 12px;
401
321
  }
402
322
 
403
- /* -- Features -- */
404
323
  .features {
405
- max-width: 960px;
406
- margin: 0 auto;
407
- padding: 0 2rem;
408
324
  display: grid;
409
- grid-template-columns: repeat(3, 1fr);
410
- gap: 1.5rem;
325
+ gap: 16px;
326
+ grid-template-columns: repeat(4, 1fr);
411
327
  }
412
328
 
413
329
  .feature-card {
414
- background: var(--surface);
330
+ background: var(--card);
415
331
  border: 1px solid var(--border);
416
- border-radius: 14px;
417
- padding: 1.75rem;
418
- }
419
-
420
- .feature-card.wide { grid-column: span 2; }
421
-
422
- .feature-icon {
423
- width: 40px; height: 40px;
424
- border-radius: 10px;
425
- display: flex;
426
- align-items: center;
427
- justify-content: center;
428
- margin-bottom: 1rem;
429
- background: var(--accent-light);
430
- color: var(--accent);
332
+ border-radius: 22px;
333
+ padding: 22px;
431
334
  }
432
335
 
433
- .feature-icon svg { width: 20px; height: 20px; stroke: currentColor; fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
434
-
435
- .feature-icon.green { background: #f0fdf4; color: #16a34a; }
436
- .feature-icon.cyan { background: #ecfeff; color: #0891b2; }
437
- .feature-icon.amber { background: #fffbeb; color: #d97706; }
438
-
439
336
  .feature-card h3 {
440
- font-size: 0.95rem;
441
- font-weight: 600;
442
- margin-bottom: 0.3rem;
337
+ font-size: 1rem;
338
+ letter-spacing: -0.02em;
339
+ margin: 14px 0 7px;
443
340
  }
444
341
 
445
342
  .feature-card p {
446
- font-size: 0.85rem;
447
- color: var(--text-secondary);
448
- line-height: 1.55;
343
+ color: var(--muted);
344
+ font-size: 0.9rem;
449
345
  }
450
346
 
451
- /* Mode visual for wide card */
452
- .mode-pills {
347
+ .feature-icon {
348
+ align-items: center;
349
+ background: var(--accent-soft);
350
+ border-radius: 14px;
351
+ color: var(--accent);
453
352
  display: flex;
454
- gap: 0.5rem;
455
- margin-bottom: 1rem;
353
+ height: 42px;
354
+ justify-content: center;
355
+ width: 42px;
456
356
  }
457
357
 
458
- .mode-pill {
459
- display: flex;
358
+ .feature-icon svg {
359
+ fill: none;
360
+ height: 21px;
361
+ stroke: currentColor;
362
+ stroke-linecap: round;
363
+ stroke-linejoin: round;
364
+ stroke-width: 2;
365
+ width: 21px;
366
+ }
367
+
368
+ .security {
460
369
  align-items: center;
461
- gap: 0.35rem;
462
- padding: 0.4rem 0.75rem;
463
- border-radius: 8px;
464
- font-size: 0.78rem;
465
- font-weight: 500;
466
- background: #fff;
467
- border: 1px solid var(--border);
468
- color: var(--text);
370
+ background: #0f172a;
371
+ border-radius: 28px;
372
+ color: #fff;
373
+ display: grid;
374
+ gap: 28px;
375
+ grid-template-columns: 1.1fr 0.9fr;
376
+ margin-top: 18px;
377
+ padding: 30px;
469
378
  }
470
379
 
471
- .mode-pill svg { width: 14px; height: 14px; stroke: currentColor; fill: none; stroke-width: 2; }
472
- .mode-pill.active { background: var(--accent-light); border-color: #bfdbfe; color: var(--accent); }
380
+ .security h2 { font-size: clamp(1.6rem, 3vw, 2.5rem); letter-spacing: -0.05em; line-height: 1.12; }
381
+ .security p { color: #b6c3d7; margin-top: 12px; }
473
382
 
474
- /* Encrypt visual */
475
- .encrypt-visual {
476
- display: flex;
477
- align-items: center;
478
- gap: 0.5rem;
383
+ .encrypt-flow {
384
+ background: rgba(255, 255, 255, 0.06);
385
+ border: 1px solid rgba(255, 255, 255, 0.12);
386
+ border-radius: 20px;
387
+ color: #cbd5e1;
388
+ display: grid;
479
389
  font-family: Consolas, 'Courier New', monospace;
480
- font-size: 0.72rem;
481
- color: var(--text-secondary);
482
- margin-bottom: 1rem;
390
+ gap: 10px;
391
+ padding: 16px;
483
392
  }
484
393
 
485
- .encrypt-block {
486
- padding: 0.3rem 0.6rem;
487
- border-radius: 6px;
488
- background: #fff;
489
- border: 1px solid var(--border);
394
+ .encrypt-flow div {
395
+ align-items: center;
396
+ display: flex;
397
+ justify-content: space-between;
398
+ gap: 14px;
490
399
  }
491
400
 
492
- .encrypt-arrow { color: var(--accent); }
493
- .encrypt-block.locked { color: #16a34a; border-color: #bbf7d0; background: #f0fdf4; }
401
+ .encrypt-flow span:last-child { color: #86efac; }
494
402
 
495
- /* -- Footer -- */
496
403
  footer {
497
- text-align: center;
498
- padding: 3rem 2rem;
499
- color: var(--text-secondary);
500
- font-size: 0.8rem;
501
404
  border-top: 1px solid var(--border);
502
- margin-top: 5rem;
405
+ color: var(--muted);
406
+ display: flex;
407
+ font-size: 0.86rem;
408
+ justify-content: space-between;
409
+ margin-top: 76px;
410
+ padding: 28px 0;
503
411
  }
504
412
 
505
- .footer-links {
506
- display: flex;
507
- align-items: center;
508
- justify-content: center;
509
- gap: 1.5rem;
510
- margin-bottom: 0.75rem;
413
+ .toast {
414
+ background: var(--text);
415
+ border-radius: 999px;
416
+ bottom: 24px;
417
+ color: #fff;
418
+ font-size: 0.84rem;
419
+ font-weight: 700;
420
+ left: 50%;
421
+ opacity: 0;
422
+ padding: 10px 18px;
423
+ pointer-events: none;
424
+ position: fixed;
425
+ transform: translate(-50%, 16px);
426
+ transition: opacity 0.22s, transform 0.22s;
511
427
  }
512
428
 
513
- .footer-brand { font-weight: 600; color: var(--text); }
429
+ .toast.show { opacity: 1; transform: translate(-50%, 0); }
514
430
 
515
- footer a {
516
- color: var(--text-secondary);
517
- text-decoration: none;
431
+ @media (max-width: 900px) {
432
+ .hero, .security { grid-template-columns: 1fr; }
433
+ .hero { padding-top: 44px; }
434
+ .features { grid-template-columns: repeat(2, 1fr); }
518
435
  }
519
436
 
520
- footer a:hover { color: var(--text); }
521
-
522
- /* -- Responsive -- */
523
- @media (max-width: 768px) {
437
+ @media (max-width: 620px) {
438
+ nav, main, footer { width: min(100% - 24px, 1120px); }
439
+ h1 { font-size: clamp(2.35rem, 15vw, 4rem); }
440
+ .workspace-body { grid-template-columns: 1fr; }
441
+ .sidebar { border-right: 0; border-bottom: 1px solid var(--border); }
524
442
  .features { grid-template-columns: 1fr; }
525
- .feature-card.wide { grid-column: span 1; }
526
- .hero { padding: 4rem 1.5rem 2rem; }
527
- .cta-group { flex-direction: column; }
528
- .nav-links { gap: 0.75rem; }
529
- .nav-links a:not(.nav-gh):not(.nav-lang) { display: none; }
530
- .encrypt-visual { flex-wrap: wrap; justify-content: flex-start; gap: 0.4rem; }
531
- .encrypt-visual .encrypt-arrow { display: none; }
532
- .mode-pills { flex-wrap: wrap; }
533
- }
534
-
535
- @media (max-width: 640px) {
536
- nav { padding: 1rem 1.25rem; }
537
- .showcase {
538
- display: flex;
539
- justify-content: center;
540
- align-items: flex-end;
541
- gap: 0;
542
- margin-top: 3rem;
543
- }
544
- .device-ipad { width: 78%; flex-shrink: 0; }
545
- .device-iphone {
546
- width: 28%;
547
- transform: translateY(5%);
548
- margin-left: -12%;
549
- flex-shrink: 0;
550
- }
551
- .carousel-dots { bottom: 6px; gap: 5px; }
552
- .carousel-dot { width: 6px; height: 6px; }
553
- .carousel-label { top: 8px; left: 8px; padding: 4px 8px; }
554
- .carousel-label-title { font-size: 0.75rem; }
555
- .carousel-label-desc { font-size: 0.58rem; }
556
- .terminal { margin: 0 1rem; }
557
- .terminal-body { padding: 0.75rem 1rem; font-size: 0.75rem; overflow-x: auto; }
558
- .features { padding: 0 1rem; }
559
- .feature-card { padding: 1.25rem; }
560
- .divider { margin: 3.5rem auto; }
561
- }
562
-
563
- .sr-only {
564
- position: absolute;
565
- width: 1px; height: 1px;
566
- padding: 0; margin: -1px;
567
- overflow: hidden;
568
- clip: rect(0,0,0,0);
569
- white-space: nowrap;
570
- border: 0;
443
+ .security { padding: 22px; }
444
+ footer { flex-direction: column; gap: 8px; }
571
445
  }
572
446
  </style>
573
447
  </head>
574
448
  <body>
575
-
576
449
  <header>
577
- <nav>
578
- <div class="logo">
579
- <img src="/favicon.svg" alt="AgenticWorker">
580
- <span>AgenticWorker</span>
581
- </div>
582
- <div class="nav-links">
583
- <a href="/" class="nav-lang">EN</a>
584
- </div>
585
- </nav>
450
+ <nav>
451
+ <a class="logo" href="/zh">
452
+ <img src="/favicon.svg" alt="AgenticWorker">
453
+ <span>AgenticWorker</span>
454
+ </a>
455
+ <div class="nav-actions">
456
+ <a href="https://github.com/kailunshi_microsoft/AgenticWorker" class="repo-link" rel="noopener">GitHub</a>
457
+ <a href="/" class="nav-lang">EN</a>
458
+ </div>
459
+ </nav>
586
460
  </header>
587
461
 
588
462
  <main>
589
-
590
- <!-- Hero -->
591
- <section class="hero">
592
- <h1>Claude Code<br><em>随时随地操控。</em></h1>
593
- <div class="cta-group">
594
- <button class="cta-primary" onclick="copyInstall()">
595
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 17 10 11 4 5"></polyline><line x1="12" y1="19" x2="20" y2="19"></line></svg>
596
- 一键安装
597
- </button>
598
- </div>
599
-
600
- <div class="terminal">
601
- <div class="terminal-bar">
602
- <div class="terminal-dot"></div>
603
- <div class="terminal-dot"></div>
604
- <div class="terminal-dot"></div>
605
- <div class="terminal-title">终端</div>
606
- </div>
607
- <div class="terminal-body">
608
- <div class="terminal-line" onclick="copyCmd('npm install -g @agent-link/agent')">
609
- <span class="terminal-prompt">$</span>
610
- <span class="terminal-cmd">npm install -g @agent-link/agent</span>
463
+ <section class="hero">
464
+ <div>
465
+ <div class="eyebrow">Coding Agent 的远程工作台</div>
466
+ <h1>你的 Agent,<br><span>随时打开。</span></h1>
467
+ <p class="lead">AgenticWorker 把本地项目连接到私有 Web 工作台,让你可以在任何设备上操控 Copilot、Claude Code 和更多 Agent。</p>
468
+ <div class="agent-row" aria-label="支持的 Agent">
469
+ <span class="agent-pill">GitHub Copilot</span>
470
+ <span class="agent-pill">Claude Code</span>
471
+ <span class="agent-pill">更多 Agent 后端</span>
611
472
  </div>
612
- <div class="terminal-line" onclick="copyCmd('agentlink-client start -D')">
613
- <span class="terminal-prompt">$</span>
614
- <span class="terminal-cmd">agentlink-client start -D</span>
473
+ <div class="cta-row">
474
+ <button class="cta-primary" onclick="copyInstall()">
475
+ <svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="4 17 10 11 4 5"></polyline><line x1="12" y1="19" x2="20" y2="19"></line></svg>
476
+ 复制安装命令
477
+ </button>
478
+ <code class="install-command" onclick="copyInstall()">
479
+ <span>npm install -g @agent-link/agent</span>
480
+ <span>agentlink-client start -D --entra</span>
481
+ </code>
615
482
  </div>
616
- <div class="terminal-output">
617
- 会话就绪 &rarr; <a>https://msclaude.ai/s/abc123</a>
483
+ </div>
484
+
485
+ <div class="panel" aria-label="AgenticWorker 工作台预览">
486
+ <div class="workspace">
487
+ <div class="workspace-top">
488
+ <span>msclaude.ai/s/abc123</span>
489
+ <span>端到端加密</span>
490
+ </div>
491
+ <div class="workspace-body">
492
+ <div class="sidebar">
493
+ <div class="session active"><strong>Q:\src\agentlink</strong>Copilot 修改 UI 文案</div>
494
+ <div class="session"><strong>D:\work\api</strong>Claude Code Review Diff</div>
495
+ <div class="session"><strong>C:\repo\mobile</strong>终端与文件编辑</div>
496
+ </div>
497
+ <div class="content">
498
+ <div class="chat-card">
499
+ <b>Agent 对话</b>
500
+ <p>发起改动、Review 方案,并让每个目录保留独立上下文。</p>
501
+ </div>
502
+ <div class="file-card">
503
+ <b>文件预览 / 编辑</b>
504
+ <p>浏览项目文件、查看内容,并在 Web UI 中完成精准修改。</p>
505
+ </div>
506
+ <div class="terminal" onclick="copyCmd('agentlink-client start -D --entra')">
507
+ $ <span>agentlink-client start -D --entra</span>
508
+ </div>
509
+ </div>
510
+ </div>
618
511
  </div>
619
512
  </div>
620
- </div>
621
- </section>
513
+ </section>
622
514
 
515
+ <section aria-labelledby="features-title">
516
+ <div class="section-head">
517
+ <h2 id="features-title">远程使用 Agent 需要的能力,都在这里。</h2>
518
+ <p>界面保持克制,只保留让 Agent 真正处理项目所需的关键工具。</p>
519
+ </div>
623
520
 
624
- <div class="divider"></div>
521
+ <div class="features">
522
+ <article class="feature-card">
523
+ <div class="feature-icon"><svg viewBox="0 0 24 24"><path d="M4 6h16M4 12h16M4 18h10"></path></svg></div>
524
+ <h3>多目录会话管理</h3>
525
+ <p>为多个本地工作目录维护独立会话、上下文和 Agent 状态。</p>
526
+ </article>
527
+ <article class="feature-card">
528
+ <div class="feature-icon"><svg viewBox="0 0 24 24"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path></svg></div>
529
+ <h3>文件预览 / 编辑</h3>
530
+ <p>浏览项目文件、预览内容,并直接在浏览器里进行修改。</p>
531
+ </article>
532
+ <article class="feature-card">
533
+ <div class="feature-icon"><svg viewBox="0 0 24 24"><path d="m4 17 6-6-6-6"></path><path d="M12 19h8"></path></svg></div>
534
+ <h3>远程终端</h3>
535
+ <p>执行项目命令、查看输出,不用 SSH 或远程桌面也能排查问题。</p>
536
+ </article>
537
+ <article class="feature-card">
538
+ <div class="feature-icon"><svg viewBox="0 0 24 24"><rect x="3" y="11" width="18" height="10" rx="2"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4"></path></svg></div>
539
+ <h3>端到端加密</h3>
540
+ <p>浏览器和本地 Agent 之间端到端加密,中继服务只转发密文。</p>
541
+ </article>
542
+ </div>
543
+ </section>
625
544
 
545
+ <section class="security" aria-label="安全">
546
+ <div>
547
+ <h2>默认保护你的代码。</h2>
548
+ <p>代码仍然留在本机。AgenticWorker 只建立安全的浏览器访问通道,项目文件、命令执行和凭据都由本地 Agent 控制。</p>
549
+ </div>
550
+ <div class="encrypt-flow">
551
+ <div><span>browser</span><span>sealed message</span></div>
552
+ <div><span>relay</span><span>ciphertext only</span></div>
553
+ <div><span>local agent</span><span>decrypted locally</span></div>
554
+ </div>
555
+ </section>
626
556
  </main>
627
557
 
628
558
  <footer>
629
- <div class="footer-links">
630
- <span class="footer-brand">AgenticWorker</span>
559
+ <span><strong>AgenticWorker</strong></span>
560
+ <span>
561
+ <a href="https://github.com/kailunshi_microsoft/AgenticWorker" rel="noopener">GitHub</a>
562
+ ·
631
563
  <a href="https://www.linkedin.com/in/shikailun/" rel="noopener">LinkedIn</a>
632
- </div>
564
+ </span>
633
565
  </footer>
634
566
 
635
- <div class="terminal-copy-toast" id="copyToast">已复制到剪贴板</div>
567
+ <div class="toast" id="copyToast">已复制到剪贴板</div>
636
568
 
637
569
  <script>
638
570
  function copyCmd(text) {
@@ -641,8 +573,7 @@ function copyCmd(text) {
641
573
  }
642
574
 
643
575
  function copyInstall() {
644
- navigator.clipboard.writeText('npm install -g @agent-link/agent && agentlink-client start -D');
645
- showToast();
576
+ copyCmd('npm install -g @agent-link/agent && agentlink-client start -D --entra');
646
577
  }
647
578
 
648
579
  function showToast() {
@@ -650,77 +581,6 @@ function showToast() {
650
581
  toast.classList.add('show');
651
582
  setTimeout(() => toast.classList.remove('show'), 1800);
652
583
  }
653
-
654
- // iPad carousel
655
- (function() {
656
- const slides = document.querySelectorAll('.carousel-slide');
657
- const dots = document.querySelectorAll('.carousel-dot');
658
- if (!slides.length) return;
659
- let current = 0;
660
- let interval;
661
-
662
- function goTo(i) {
663
- slides[current].classList.remove('active');
664
- dots[current].classList.remove('active');
665
- current = (i + slides.length) % slides.length;
666
- slides[current].classList.add('active');
667
- dots[current].classList.add('active');
668
- }
669
-
670
- function startAuto() {
671
- interval = setInterval(() => goTo(current + 1), 4000);
672
- }
673
-
674
- function resetAuto() {
675
- clearInterval(interval);
676
- startAuto();
677
- }
678
-
679
- dots.forEach(dot => {
680
- dot.addEventListener('click', () => {
681
- goTo(Number(dot.dataset.index));
682
- resetAuto();
683
- });
684
- });
685
-
686
- const track = document.querySelector('.ipad-carousel');
687
- let startX = 0, dragging = false;
688
-
689
- track.addEventListener('touchstart', e => {
690
- startX = e.touches[0].clientX;
691
- dragging = true;
692
- }, { passive: true });
693
-
694
- track.addEventListener('touchend', e => {
695
- if (!dragging) return;
696
- dragging = false;
697
- const dx = e.changedTouches[0].clientX - startX;
698
- if (Math.abs(dx) > 50) {
699
- goTo(dx < 0 ? current + 1 : current - 1);
700
- resetAuto();
701
- }
702
- }, { passive: true });
703
-
704
- track.addEventListener('mousedown', e => {
705
- startX = e.clientX;
706
- dragging = true;
707
- track.style.cursor = 'grabbing';
708
- });
709
-
710
- document.addEventListener('mouseup', e => {
711
- if (!dragging) return;
712
- dragging = false;
713
- track.style.cursor = '';
714
- const dx = e.clientX - startX;
715
- if (Math.abs(dx) > 50) {
716
- goTo(dx < 0 ? current + 1 : current - 1);
717
- resetAuto();
718
- }
719
- });
720
-
721
- startAuto();
722
- })();
723
584
  </script>
724
-
725
585
  </body>
726
586
  </html>