clew-code 0.3.2 → 0.3.4

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 (49) hide show
  1. package/README.md +196 -114
  2. package/dist/generated/version.json +1 -1
  3. package/dist/main.js +2963 -3272
  4. package/package.json +5 -5
  5. package/scripts/bun-run.mjs +33 -0
  6. package/scripts/postbuild-inject-macro.mjs +36 -0
  7. package/docs/.nojekyll +0 -0
  8. package/docs/_config.yml +0 -3
  9. package/docs/architecture.html +0 -90
  10. package/docs/assets/clew-agent-loop.png +0 -0
  11. package/docs/assets/clew-general-architecture.png +0 -0
  12. package/docs/assets/clew-mcp-architecture.png +0 -0
  13. package/docs/assets/clew-p2p-swarm.png +0 -0
  14. package/docs/assets/clew.svg +0 -33
  15. package/docs/changelog.html +0 -141
  16. package/docs/cli-reference.html +0 -89
  17. package/docs/commands.html +0 -161
  18. package/docs/configuration.html +0 -85
  19. package/docs/contributing.html +0 -91
  20. package/docs/css/styles.css +0 -545
  21. package/docs/daemon.html +0 -62
  22. package/docs/features/bridge-mode.html +0 -62
  23. package/docs/features/evals.html +0 -58
  24. package/docs/features/searxng-search.html +0 -59
  25. package/docs/features/sentry-setup.html +0 -62
  26. package/docs/generated/providers.html +0 -625
  27. package/docs/generated/tools.html +0 -559
  28. package/docs/index.html +0 -182
  29. package/docs/installation.html +0 -77
  30. package/docs/internals/claude-ai-backend-dependencies.md +0 -278
  31. package/docs/internals/growthbook-ab-testing.html +0 -70
  32. package/docs/internals/hidden-features.html +0 -82
  33. package/docs/internals/long-term-memory-design.md +0 -173
  34. package/docs/js/main.js +0 -438
  35. package/docs/loop.html +0 -69
  36. package/docs/mcp.html +0 -99
  37. package/docs/models.html +0 -81
  38. package/docs/permission-model.html +0 -86
  39. package/docs/personal-profile.html +0 -113
  40. package/docs/plugins.html +0 -84
  41. package/docs/providers.html +0 -625
  42. package/docs/quick-start.html +0 -81
  43. package/docs/research-memory.html +0 -71
  44. package/docs/security.html +0 -71
  45. package/docs/skills.html +0 -67
  46. package/docs/swarm.html +0 -78
  47. package/docs/tools.html +0 -559
  48. package/docs/troubleshooting.html +0 -86
  49. package/docs/voice-mode.html +0 -79
@@ -1,545 +0,0 @@
1
- /* ============================================================
2
- Clew Docs — Modern Purple Theme v2
3
- ============================================================ */
4
- *,*::before,*::after{margin:0;padding:0;box-sizing:border-box}
5
-
6
- :root {
7
- --bg: #fafbfc;
8
- --bg-card: #ffffff;
9
- --bg-code: #f7f6fa;
10
- --bg-hover: #f0edfa;
11
- --text: #0f0f1a;
12
- --text-dim: #5a5678;
13
- --text-faint:#9b97b3;
14
- --accent: #7c3aed;
15
- --accent2: #a78bfa;
16
- --accent3: #c4b5fd;
17
- --border: #e8e5f0;
18
- --border2: #ddd8ec;
19
- --shadow: rgba(124,58,237,.08);
20
- --shadow-lg: rgba(124,58,237,.15);
21
- --success: #10b981;
22
- --warning: #f59e0b;
23
- --error: #ef4444;
24
-
25
- --font: 'DM Sans', system-ui, -apple-system, sans-serif;
26
- --mono: 'JetBrains Mono', 'SF Mono', monospace;
27
-
28
- --header-h: 56px;
29
- --max-w: 900px;
30
- --sidebar-w: 240px;
31
- --radius: 10px;
32
- --radius-sm: 6px;
33
- }
34
-
35
- @media(prefers-color-scheme:dark){
36
- :root {
37
- --bg: #0c0c14;
38
- --bg-card: #12121e;
39
- --bg-code: #181828;
40
- --bg-hover: #222238;
41
- --text: #e8e6f0;
42
- --text-dim: #9a96b0;
43
- --text-faint:#6b6880;
44
- --accent: #a78bfa;
45
- --accent2: #7c3aed;
46
- --accent3: #5b4db0;
47
- --border: #2a2a3e;
48
- --border2: #3a3a54;
49
- --shadow: rgba(0,0,0,.3);
50
- --shadow-lg: rgba(0,0,0,.5);
51
- }
52
- .header{background:rgba(12,12,20,.92)}
53
- .term{box-shadow:0 12px 40px rgba(0,0,0,.25),0 0 0 1px rgba(124,58,237,.1)}
54
- img{opacity:.9}
55
- }
56
-
57
- /* ── Scrollbar ── */
58
- ::-webkit-scrollbar{width:8px;height:8px}
59
- ::-webkit-scrollbar-track{background:transparent}
60
- ::-webkit-scrollbar-thumb{background:var(--border2);border-radius:4px}
61
- ::-webkit-scrollbar-thumb:hover{background:var(--accent3)}
62
-
63
- html{scroll-behavior:smooth}
64
- body{
65
- font-family:var(--font);
66
- font-size:15px;
67
- line-height:1.7;
68
- color:var(--text);
69
- background:var(--bg);
70
- -webkit-font-smoothing:antialiased;
71
- -moz-osx-font-smoothing:grayscale;
72
- }
73
- ::selection{background:var(--accent);color:#fff}
74
-
75
- a{color:var(--accent);text-decoration:none;transition:all .15s ease}
76
- a:hover{color:#6d28d9;text-decoration:none}
77
- @media(prefers-color-scheme:dark){a:hover{color:#c4b5fd}}
78
-
79
- /* ── code ── */
80
- code{
81
- font-family:var(--mono);
82
- font-size:.85em;
83
- background:var(--bg-code);
84
- color:var(--accent);
85
- padding:.2em .45em;
86
- border-radius:5px;
87
- border:1px solid var(--border);
88
- font-weight:500;
89
- }
90
- pre code{background:none;padding:0;color:inherit;border:none;font-weight:400}
91
-
92
- /* ── header ── */
93
- .header{
94
- position:fixed;top:0;left:0;right:0;height:var(--header-h);
95
- background:rgba(250,251,252,.92);backdrop-filter:blur(20px) saturate(180%);
96
- -webkit-backdrop-filter:blur(20px) saturate(180%);
97
- border-bottom:1px solid var(--border);z-index:100;
98
- box-shadow:0 1px 3px rgba(0,0,0,.03);
99
- transition:background .2s;
100
- }
101
- @media(prefers-color-scheme:dark){
102
- .header{
103
- background:rgba(12,12,20,.92);
104
- box-shadow:0 1px 3px rgba(0,0,0,.2);
105
- }
106
- }
107
- .header-inner{
108
- max-width:calc(var(--max-w) + var(--sidebar-w));margin:0 auto;padding:0 28px;
109
- height:100%;display:flex;align-items:center;gap:12px;
110
- }
111
- .logo{
112
- font-family:var(--mono);font-weight:700;font-size:14px;
113
- color:var(--text);display:flex;align-items:center;gap:8px;
114
- white-space:nowrap;flex-shrink:0;
115
- }
116
- .logo:hover{opacity:.85;text-decoration:none}
117
- .logo-mark{
118
- width:28px;height:28px;border-radius:8px;
119
- background:linear-gradient(135deg,#7c3aed,#a78bfa);
120
- color:#fff;display:flex;align-items:center;justify-content:center;
121
- font-size:13px;font-weight:700;box-shadow:0 2px 10px rgba(124,58,237,.3);
122
- transition:transform .2s,box-shadow .2s;
123
- }
124
- .logo:hover .logo-mark{transform:translateY(-2px);box-shadow:0 4px 16px rgba(124,58,237,.4)}
125
-
126
- /* ── breadcrumbs ── */
127
- .header-breadcrumbs{
128
- display:flex;align-items:center;gap:4px;font-size:12px;
129
- color:var(--text-faint);margin-left:4px;overflow:hidden;
130
- white-space:nowrap;text-overflow:ellipsis;flex-shrink:1;min-width:0;
131
- }
132
- .header-breadcrumbs a{color:var(--text-faint)}
133
- .header-breadcrumbs a:hover{color:var(--accent);text-decoration:none}
134
- .header-breadcrumbs .sep{color:var(--border2);margin:0 2px}
135
- .header-breadcrumbs .current{color:var(--text-dim);font-weight:500}
136
-
137
- /* ── search ── */
138
- .header-search{
139
- position:relative;margin-left:auto;flex-shrink:0;
140
- }
141
- .header-search input{
142
- width:200px;height:32px;padding:0 32px 0 12px;
143
- border:1px solid var(--border);border-radius:8px;
144
- background:var(--bg);color:var(--text);
145
- font-family:var(--font);font-size:13px;
146
- outline:none;transition:all .2s;
147
- }
148
- .header-search input:focus{
149
- border-color:var(--accent2);box-shadow:0 0 0 3px rgba(124,58,237,.12);
150
- width:240px;
151
- }
152
- .header-search input::placeholder{color:var(--text-faint)}
153
- .header-search .search-icon{
154
- position:absolute;right:10px;top:50%;transform:translateY(-50%);
155
- font-size:12px;color:var(--text-faint);pointer-events:none;
156
- }
157
- .header-search .search-results{
158
- display:none;position:absolute;top:100%;right:0;width:340px;max-height:300px;
159
- overflow-y:auto;margin-top:8px;background:var(--bg-card);
160
- border:1px solid var(--border);border-radius:10px;
161
- box-shadow:0 12px 32px rgba(0,0,0,.1);z-index:300;
162
- }
163
- .header-search .search-results.open{display:block}
164
- .header-search .search-result{
165
- display:block;padding:10px 14px;font-size:13px;color:var(--text-dim);
166
- border-bottom:1px solid var(--border);
167
- transition:.08s;
168
- }
169
- .header-search .search-result:last-child{border:none}
170
- .header-search .search-result:hover{background:var(--bg-hover);color:var(--text);text-decoration:none}
171
- .header-search .search-result mark{background:rgba(124,58,237,.15);color:var(--accent);border-radius:2px;padding:0 2px}
172
- .header-search .search-empty{
173
- padding:14px;font-size:13px;color:var(--text-faint);text-align:center;
174
- }
175
-
176
- /* ── header nav ── */
177
- .header-nav{display:flex;gap:2px;align-items:center;flex-shrink:0}
178
- .header-nav a{
179
- padding:6px 12px;border-radius:6px;font-size:12px;font-weight:500;
180
- color:var(--text-dim);white-space:nowrap;
181
- transition:all .15s;
182
- }
183
- .header-nav a:hover{background:var(--bg-hover);color:var(--text);text-decoration:none}
184
- .header-nav a.active{color:var(--accent);background:var(--bg-code);font-weight:600}
185
-
186
- /* ── language toggle ── */
187
- .lang-toggle{
188
- display:flex;align-items:center;padding:4px 10px;border-radius:6px;
189
- background:none;border:1px solid var(--border);cursor:pointer;
190
- font-size:12px;color:var(--text-dim);font-family:var(--font);gap:4px;
191
- transition:all .15s;flex-shrink:0;
192
- }
193
- .lang-toggle:hover{background:var(--bg-hover);border-color:var(--border2);color:var(--accent)}
194
-
195
- .menu-btn{display:none;width:32px;height:32px;border:1px solid var(--border);border-radius:6px;background:none;cursor:pointer;flex-direction:column;justify-content:center;align-items:center;gap:4px;flex-shrink:0;transition:all .15s}
196
- .menu-btn:hover{background:var(--bg-hover);border-color:var(--border2)}
197
- .menu-btn span{display:block;width:16px;height:2px;background:var(--text-dim);border-radius:2px;transition:.15s}
198
- .menu-btn.open span:nth-child(1){transform:rotate(45deg) translate(4px,4px)}
199
- .menu-btn.open span:nth-child(2){opacity:0}
200
- .menu-btn.open span:nth-child(3){transform:rotate(-45deg) translate(4px,-4px)}
201
- .sidebar-overlay{display:none}
202
-
203
- /* ── page layout (index) ── */
204
- .page{
205
- max-width:var(--max-w);margin:calc(var(--header-h) + 40px) auto 60px;
206
- padding:0 28px;
207
- }
208
-
209
- /* ── doc layout (sub-pages) ── */
210
- .app{display:flex;max-width:calc(var(--max-w) + var(--sidebar-w));margin:0 auto;padding:0 28px;gap:0}
211
- .sidebar{
212
- position:fixed;top:var(--header-h);left:0;bottom:0;
213
- width:var(--sidebar-w);overflow-y:auto;padding:28px 16px 40px;
214
- border-right:1px solid var(--border);
215
- background:var(--bg);
216
- z-index:50;
217
- }
218
- .sidebar-section{margin-bottom:28px}
219
- .sidebar-label{
220
- font-family:var(--mono);font-size:11px;font-weight:600;text-transform:uppercase;
221
- color:var(--text-faint);letter-spacing:.06em;margin-bottom:8px;padding:0 10px;
222
- }
223
- .sidebar-link{
224
- display:block;padding:4px 10px;border-radius:6px;
225
- font-size:13px;color:var(--text-dim);transition:all .12s;
226
- margin-bottom:2px;
227
- }
228
- .sidebar-link:hover{background:var(--bg-hover);color:var(--text);text-decoration:none;transform:translateX(2px)}
229
- .sidebar-link.active{color:var(--accent);background:var(--bg-code);font-weight:600}
230
- .sidebar-link .link-icon{display:inline-block;width:4px;height:4px;border-radius:50%;background:var(--border2);margin-right:6px;vertical-align:middle;transition:.1s}
231
- .sidebar-link:hover .link-icon{background:var(--accent2)}
232
- .sidebar-link.active .link-icon{background:var(--accent)}
233
-
234
- .content-wrap{flex:1;margin-left:var(--sidebar-w);min-width:0}
235
- .content{
236
- max-width:var(--max-w);padding:calc(var(--header-h) + 28px) 36px 60px;
237
- }
238
-
239
- /* ── TOC sidebar ── */
240
- .toc-sidebar{display:none}
241
- @media(min-width:1200px){
242
- .toc-sidebar{
243
- display:block;position:sticky;top:calc(var(--header-h) + 28px);
244
- width:200px;min-width:200px;max-height:calc(100vh - var(--header-h) - 56px);
245
- overflow-y:auto;padding:calc(var(--header-h) + 28px) 0 40px 20px;
246
- margin-left:24px;border-left:1px solid var(--border);
247
- }
248
- .content-wrap{display:flex;flex-direction:row}
249
- .content{flex:1;min-width:0}
250
- }
251
- .toc-label{
252
- font-family:var(--mono);font-size:11px;font-weight:600;text-transform:uppercase;
253
- color:var(--text-faint);letter-spacing:.06em;margin-bottom:8px;
254
- }
255
- .toc-link{
256
- display:block;padding:3px 0 3px 14px;border-left:2px solid transparent;
257
- font-size:12px;color:var(--text-faint);line-height:1.6;transition:all .12s;
258
- }
259
- .toc-link:hover{color:var(--accent);border-color:var(--accent2);text-decoration:none;transform:translateX(2px)}
260
- .toc-link.active{color:var(--accent);border-color:var(--accent);font-weight:500}
261
- .toc-h3{padding-left:24px;font-size:11px}
262
-
263
- /* ── breadcrumbs ── */
264
- .breadcrumbs{
265
- font-size:13px;color:var(--text-faint);margin-bottom:28px;
266
- padding:8px 0;
267
- }
268
- .breadcrumbs a{color:var(--text-faint);transition:all .12s}
269
- .breadcrumbs a:hover{color:var(--accent)}
270
- .breadcrumbs .sep{margin:0 6px;opacity:.6}
271
-
272
- /* ── headings ── */
273
- h1{
274
- font-family:var(--mono);font-size:30px;font-weight:700;
275
- margin-bottom:10px;color:var(--text);
276
- letter-spacing:-0.02em;
277
- }
278
- h2{
279
- font-family:var(--mono);font-size:20px;font-weight:600;
280
- margin:48px 0 18px;color:var(--text);
281
- padding-bottom:8px;border-bottom:1px solid var(--border);
282
- letter-spacing:-0.01em;
283
- }
284
- h3{font-size:16px;font-weight:600;margin:28px 0 10px;color:var(--text)}
285
- p{color:var(--text-dim);margin-bottom:14px;line-height:1.8}
286
- .sub{color:var(--text-dim);margin-bottom:28px;font-size:16px}
287
-
288
- /* ── hero ── */
289
- .hero{
290
- padding:56px 0 40px;
291
- text-align:center;
292
- position:relative;
293
- overflow:hidden;
294
- }
295
- .hero::before{
296
- content:'';
297
- position:absolute;
298
- top:-50%;left:-50%;right:-50%;bottom:-50%;
299
- background:radial-gradient(ellipse at 50% 0%,rgba(124,58,237,.08) 0%,transparent 60%),
300
- radial-gradient(ellipse at 80% 20%,rgba(167,139,250,.06) 0%,transparent 50%);
301
- pointer-events:none;
302
- z-index:0;
303
- }
304
- .hero > *{position:relative;z-index:1}
305
- .hero h1{font-size:40px;margin-bottom:14px;letter-spacing:-0.03em}
306
- .hero .hl{
307
- background:linear-gradient(135deg,#7c3aed,#a78bfa);
308
- -webkit-background-clip:text;
309
- -webkit-text-fill-color:transparent;
310
- background-clip:text;
311
- }
312
- .hero p{max-width:580px;margin:0 auto 24px;font-size:17px;line-height:1.7}
313
- .hero-actions{display:flex;gap:12px;justify-content:center;flex-wrap:wrap}
314
-
315
- .badge{
316
- display:inline-flex;align-items:center;gap:6px;
317
- padding:4px 14px;border-radius:100px;
318
- font-family:var(--mono);font-size:12px;font-weight:500;
319
- color:var(--accent);background:var(--bg-code);
320
- border:1px solid var(--border2);margin-bottom:24px;
321
- box-shadow:0 2px 8px rgba(124,58,237,.06);
322
- }
323
- .badge .dot{width:6px;height:6px;border-radius:50%;background:var(--accent);animation:pulse 2s infinite}
324
-
325
- @keyframes pulse{
326
- 0%,100%{opacity:1}
327
- 50%{opacity:.5}
328
- }
329
-
330
- .btn{
331
- display:inline-flex;align-items:center;gap:6px;
332
- padding:10px 20px;border-radius:var(--radius-sm);
333
- font-family:var(--mono);font-size:13px;font-weight:600;
334
- border:1px solid var(--border);
335
- background:var(--bg-card);color:var(--text);
336
- cursor:pointer;transition:all .2s;
337
- position:relative;
338
- overflow:hidden;
339
- }
340
- .btn:hover{text-decoration:none;transform:translateY(-2px);box-shadow:0 4px 12px var(--shadow)}
341
- .btn-p{
342
- background:var(--accent);color:#fff;border-color:var(--accent);
343
- box-shadow:0 3px 14px rgba(124,58,237,.25);
344
- }
345
- .btn-p:hover{background:#6d28d9;color:#fff;border-color:#6d28d9;box-shadow:0 6px 20px rgba(124,58,237,.35);transform:translateY(-2px)}
346
- .btn-ghost{color:var(--text-dim);border-color:var(--border)}
347
- .btn-ghost:hover{color:var(--accent);border-color:var(--border2);background:var(--bg-hover);transform:translateY(-2px)}
348
-
349
- /* ── stat cards ── */
350
- .stats{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin:36px 0}
351
- .stat{
352
- text-align:center;padding:20px 10px;border-radius:var(--radius);
353
- background:var(--bg-card);border:1px solid var(--border);
354
- transition:all .2s;
355
- position:relative;
356
- overflow:hidden;
357
- }
358
- .stat::before{
359
- content:'';
360
- position:absolute;top:0;left:0;right:0;height:2px;
361
- background:linear-gradient(90deg,var(--accent),var(--accent2));
362
- opacity:0;transition:opacity .2s;
363
- }
364
- .stat:hover{border-color:var(--border2);box-shadow:0 6px 20px var(--shadow);transform:translateY(-3px)}
365
- .stat:hover::before{opacity:1}
366
- .stat-num{
367
- font-family:var(--mono);font-size:28px;font-weight:700;
368
- background:linear-gradient(135deg,#7c3aed,#a78bfa);
369
- -webkit-background-clip:text;
370
- -webkit-text-fill-color:transparent;
371
- background-clip:text;
372
- line-height:1.2;
373
- }
374
- .stat-lbl{font-size:13px;color:var(--text-faint);font-weight:500;margin-top:4px}
375
-
376
- /* ── grid cards ── */
377
- .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:14px;margin:28px 0}
378
- .card{
379
- padding:24px;border-radius:var(--radius);
380
- background:var(--bg-card);border:1px solid var(--border);
381
- transition:all .2s;
382
- position:relative;
383
- overflow:hidden;
384
- }
385
- .card::before{
386
- content:'';
387
- position:absolute;top:0;left:0;right:0;height:2px;
388
- background:linear-gradient(90deg,var(--accent),var(--accent2));
389
- opacity:0;transition:opacity .2s;
390
- }
391
- .card:hover{border-color:var(--border2);box-shadow:0 6px 24px var(--shadow);transform:translateY(-3px)}
392
- .card:hover::before{opacity:1}
393
- .card h3{font-family:var(--mono);font-size:14px;margin-bottom:8px;color:var(--accent);display:flex;align-items:center;gap:8px}
394
- .card p{font-size:13px;line-height:1.6}
395
- .card .tag{
396
- display:inline-block;font-family:var(--mono);font-size:11px;
397
- padding:2px 8px;border-radius:4px;
398
- background:var(--bg-code);color:var(--accent);
399
- border:1px solid var(--border2);margin:8px 4px 0 0;
400
- font-weight:500;
401
- }
402
-
403
- /* ── card icons ── */
404
- .card-icon{
405
- width:32px;height:32px;border-radius:8px;
406
- background:linear-gradient(135deg,rgba(124,58,237,.1),rgba(167,139,250,.1));
407
- display:flex;align-items:center;justify-content:center;
408
- font-size:16px;flex-shrink:0;
409
- }
410
-
411
- /* ── terminal mock ── */
412
- .term{
413
- background:var(--bg-code);border:1px solid var(--border2);
414
- border-radius:var(--radius);overflow:hidden;margin:36px auto;
415
- max-width:680px;box-shadow:0 12px 40px var(--shadow),0 0 0 1px rgba(124,58,237,.05);
416
- position:relative;
417
- }
418
- .term::after{
419
- content:'';
420
- position:absolute;bottom:0;left:0;right:0;height:40px;
421
- background:linear-gradient(to bottom,transparent,var(--bg-code));
422
- pointer-events:none;
423
- }
424
- .term-bar{
425
- display:flex;align-items:center;gap:8px;
426
- padding:12px 16px;background:rgba(124,58,237,.04);
427
- border-bottom:1px solid var(--border2);
428
- }
429
- .term-dot{width:10px;height:10px;border-radius:50%;box-shadow:0 0 6px rgba(0,0,0,.1)}
430
- .term-dot:nth-child(1){background:#ff5f56}
431
- .term-dot:nth-child(2){background:#ffbd2e}
432
- .term-dot:nth-child(3){background:#27c93f}
433
- .term-title{font-family:var(--mono);font-size:12px;color:var(--text-faint);margin-left:6px;font-weight:500}
434
- .term-body{
435
- padding:16px;font-family:var(--mono);font-size:13px;line-height:1.8;
436
- color:var(--text);overflow-x:auto;white-space:pre;
437
- min-height:200px;
438
- }
439
- .term-body .p{color:var(--accent);font-weight:600}
440
- .term-body .d{color:var(--text-faint)}
441
- .term-body .h{color:var(--accent)}
442
- .term-cursor{display:inline-block;width:8px;height:16px;background:var(--accent);animation:cursor-blink 1s infinite;vertical-align:middle;margin-left:2px}
443
- @keyframes cursor-blink{
444
- 0%,100%{opacity:1}
445
- 50%{opacity:0}
446
- }
447
-
448
- /* ── table ── */
449
- .table-wrap{overflow-x:auto;margin:20px 0;border-radius:var(--radius-sm);border:1px solid var(--border);box-shadow:0 2px 8px rgba(0,0,0,.03)}
450
- table{width:100%;border-collapse:collapse;font-size:13px}
451
- th{
452
- font-family:var(--mono);font-size:11px;font-weight:600;text-transform:uppercase;
453
- text-align:left;padding:10px 14px;letter-spacing:.06em;
454
- color:var(--accent);background:var(--bg-code);
455
- border-bottom:1px solid var(--border);
456
- white-space:nowrap;
457
- }
458
- td{padding:10px 14px;border-bottom:1px solid var(--border);color:var(--text-dim);vertical-align:top;line-height:1.6}
459
- tr:last-child td{border:none}
460
- tr:hover td{background:rgba(124,58,237,.03)}
461
-
462
- /* ── code blocks ── */
463
- .code-block-wrap{margin:20px 0;border-radius:var(--radius-sm);border:1px solid var(--border);overflow:hidden;box-shadow:0 2px 8px rgba(0,0,0,.03)}
464
- .code-block-header{
465
- display:flex;justify-content:space-between;align-items:center;
466
- padding:8px 12px;background:var(--bg-card);
467
- border-bottom:1px solid var(--border);font-size:12px;color:var(--text-faint);
468
- font-family:var(--mono);font-weight:500;
469
- }
470
- .code-block-wrap pre{margin:0;border:none;border-radius:0;padding:14px 16px;font-size:13px;line-height:1.7}
471
- .copy-btn{
472
- background:none;border:1px solid var(--border);border-radius:4px;
473
- color:var(--text-faint);font-size:11px;padding:3px 10px;cursor:pointer;font-family:var(--mono);transition:all .15s;
474
- }
475
- .copy-btn:hover{background:var(--bg-hover);color:var(--accent);border-color:var(--accent2)}
476
- .copy-btn.copied{background:var(--bg-code);color:var(--accent);border-color:var(--accent)}
477
-
478
- /* ── back to top ── */
479
- .back-to-top{
480
- position:fixed;bottom:24px;right:24px;
481
- width:40px;height:40px;border-radius:50%;
482
- background:var(--accent);color:#fff;border:none;
483
- cursor:pointer;opacity:0;visibility:hidden;
484
- transition:all .3s;z-index:80;
485
- display:flex;align-items:center;justify-content:center;
486
- font-size:18px;box-shadow:0 4px 12px rgba(124,58,237,.3);
487
- }
488
- .back-to-top.visible{opacity:1;visibility:visible}
489
- .back-to-top:hover{background:#6d28d9;transform:translateY(-2px);box-shadow:0 6px 16px rgba(124,58,237,.4)}
490
-
491
- /* ── language toggle (kept for backward compat) ── */
492
- .lang-select{display:none}
493
-
494
- /* ── misc ── */
495
- hr{border:none;border-top:1px solid var(--border);margin:48px 0}
496
- .footer{
497
- margin-top:60px;padding-top:24px;border-top:1px solid var(--border);
498
- display:flex;justify-content:space-between;align-items:center;gap:16px;
499
- font-size:13px;color:var(--text-faint);flex-wrap:wrap;
500
- }
501
- .footer-links{display:flex;gap:16px}
502
- .footer-links a{color:var(--text-faint);transition:all .12s}
503
- .footer-links a:hover{color:var(--accent)}
504
-
505
- /* ── responsive ── */
506
- @media(max-width:900px){
507
- .sidebar{display:none}
508
- .content-wrap{margin-left:0}
509
- .content{padding:calc(var(--header-h) + 16px) 20px 40px}
510
- .header-nav,.header-search,.header-breadcrumbs,.lang-toggle{display:none}
511
- .menu-btn{display:flex}
512
- .stats{grid-template-columns:repeat(2,1fr)}
513
- .grid{grid-template-columns:1fr}
514
- .hero h1{font-size:28px}
515
- .hero{padding:36px 0 28px}
516
- .hero p{font-size:15px}
517
-
518
- .sidebar.open{
519
- display:block;position:fixed;top:var(--header-h);left:0;right:0;bottom:0;
520
- width:auto;z-index:200;background:var(--bg);padding:24px;
521
- border-right:none;animation:slideIn .2s ease-out;
522
- }
523
- .sidebar.open .header-search{
524
- display:block;margin:0 0 16px;position:static;
525
- }
526
- .sidebar.open .header-search input{width:100%}
527
- .sidebar.open .header-nav{display:flex;flex-direction:column;gap:2px}
528
- .sidebar-overlay.open{display:block;position:fixed;inset:0;background:rgba(0,0,0,.3);z-index:199}
529
- }
530
-
531
- @media(max-width:1200px){
532
- .toc-sidebar{display:none !important}
533
- }
534
-
535
- @keyframes slideIn{
536
- from{transform:translateX(-100%);opacity:0}
537
- to{transform:translateX(0);opacity:1}
538
- }
539
-
540
- /* ── print ── */
541
- @media print{
542
- .header,.sidebar,.toc-sidebar,.back-to-top{display:none}
543
- .content-wrap{margin-left:0}
544
- .content{padding:0}
545
- }
package/docs/daemon.html DELETED
@@ -1,62 +0,0 @@
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>Daemon Mode — Clew Code</title>
7
- <meta name="description" content="Run Clew Code as a background daemon for autonomous operations.">
8
- <link rel="icon" type="image/svg+xml" href="assets/clew.svg">
9
- <link rel="preconnect" href="https://fonts.googleapis.com">
10
- <link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet">
11
- <link rel="stylesheet" href="css/styles.css">
12
- </head>
13
- <body>
14
- <header class="header"></header>
15
- <div id="sidebarOverlay" class="sidebar-overlay"></div>
16
- <aside id="sidebar" class="sidebar"></aside>
17
-
18
- <div class="content-wrap">
19
- <div class="content">
20
-
21
- <div class="breadcrumbs"><a href="index.html">Home</a><span class="sep">/</span><span class="current">Daemon Mode</span></div>
22
-
23
- <h1>Daemon Mode</h1>
24
- <p class="sub">Run Clew Code as a persistent background process for autonomous task execution, scheduled jobs, and continuous monitoring.</p>
25
-
26
- <h2 id="overview">Overview</h2>
27
- <p>Daemon mode keeps Clew Code running in the background, processing tasks from a persistent queue, executing scheduled jobs via cron, and coordinating with other peers — all without an active terminal session.</p>
28
-
29
- <h2 id="daemon-commands">Daemon Commands</h2>
30
- <pre><code class="language-bash">❯ /daemon # Open daemon dashboard
31
- ❯ /daemon status # Check daemon status
32
- </code></pre>
33
-
34
- <h2 id="task-queue">Task Queue</h2>
35
- <p>The daemon uses a file-backed persistent task queue with:</p>
36
- <ul>
37
- <li><strong>Lease-based concurrency</strong> — max 3 concurrent workers</li>
38
- <li><strong>Exponential backoff retry</strong> — failed tasks are retried with increasing delays</li>
39
- <li><strong>Dead-letter management</strong> — tasks that exceed retry limits are moved to dead-letter storage</li>
40
- </ul>
41
-
42
- <h2 id="scheduling">Scheduling</h2>
43
- <p>Use cron syntax to schedule recurring tasks:</p>
44
- <pre><code class="language-bash">❯ /task add "0 9 * * *" "daily standup summary"
45
- ❯ /task list # list scheduled tasks
46
- ❯ /task remove &lt;id&gt; # remove a task
47
- </code></pre>
48
-
49
- <h2 id="loop">Agent Loop</h2>
50
- <p>The daemon integrates with the autonomous agent loop for 24/7 operation:</p>
51
- <pre><code class="language-bash">❯ /loop start # start the autonomous loop
52
- ❯ /loop stop # stop the loop
53
- ❯ /loop status # check loop status
54
- </code></pre>
55
-
56
- <p>See <a href="loop.html">Agent Loop</a> for details.</p>
57
- </div>
58
- </div>
59
-
60
- <script src="js/main.js"></script>
61
- </body>
62
- </html>
@@ -1,62 +0,0 @@
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>Bridge Mode — Clew Code</title>
7
- <meta name="description" content="Remote control and bridge mode for Clew Code.">
8
- <link rel="icon" type="image/svg+xml" href="../assets/clew.svg">
9
- <link rel="preconnect" href="https://fonts.googleapis.com">
10
- <link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet">
11
- <link rel="stylesheet" href="../css/styles.css">
12
- </head>
13
- <body>
14
- <header class="header"></header>
15
- <div id="sidebarOverlay" class="sidebar-overlay"></div>
16
- <aside id="sidebar" class="sidebar"></aside>
17
-
18
- <div class="content-wrap">
19
- <div class="content">
20
-
21
- <div class="breadcrumbs"><a href="../index.html">Home</a><span class="sep">/</span><span class="current">Bridge Mode</span></div>
22
-
23
- <h1>Bridge Mode</h1>
24
- <p class="sub">Remote control Clew Code from anywhere via WebSocket bridge.</p>
25
-
26
- <h2 id="overview">Overview</h2>
27
- <p>Bridge mode allows you to connect to a running Clew Code instance remotely. There are two systems:</p>
28
- <ul>
29
- <li><strong>Bridge v1 (Legacy CCR)</strong> — The original Claude Code Remote system, tied to claude.ai OAuth</li>
30
- <li><strong>Bridge v2 (Provider-Agnostic)</strong> — A standalone WebSocket server that works without claude.ai</li>
31
- </ul>
32
-
33
- <h2 id="v2">Bridge v2 — Provider-Agnostic Remote Control</h2>
34
- <p>The new bridge v2 runs a local WebSocket server with:</p>
35
- <ul>
36
- <li>One-time auth tokens (SHA-256 hashed)</li>
37
- <li>Session management</li>
38
- <li>Optional NAT-traversal relay</li>
39
- <li>No dependency on any provider's backend</li>
40
- </ul>
41
-
42
- <h3>Commands</h3>
43
- <pre><code class="language-bash">❯ /remote listen # start the WebSocket server
44
- ❯ /remote connect &lt;url&gt; # connect to a remote instance
45
- ❯ /remote token # generate a one-time auth token
46
- </code></pre>
47
-
48
- <h2 id="relay">Relay Mode</h2>
49
- <p>For NAT traversal, use the optional relay server:</p>
50
- <pre><code class="language-bash">bun run relay # start the relay server
51
- </code></pre>
52
-
53
- <h2 id="bridge-commands">Bridge v1 Commands</h2>
54
- <pre><code class="language-bash">❯ /bridge # configure bridge mode
55
- </code></pre>
56
- <p>Note: Bridge v1 requires a claude.ai subscription.</p>
57
- </div>
58
- </div>
59
-
60
- <script src="../js/main.js"></script>
61
- </body>
62
- </html>