neural-loom 0.2.67 → 0.2.69
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/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/cache/.previewinfo +1 -1
- package/.next/cache/.rscinfo +1 -1
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/diagnostics/route-bundle-stats.json +1 -1
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/configs/route.js.nft.json +1 -1
- package/.next/server/app/api/context/aider/route.js.nft.json +1 -1
- package/.next/server/app/api/context/claude/route.js.nft.json +1 -1
- package/.next/server/app/api/context/route.js.nft.json +1 -1
- package/.next/server/app/api/context/ssh/route.js.nft.json +1 -1
- package/.next/server/app/api/recents/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/inject/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/input/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/launch/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/scope/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/start/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/stats/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/stop/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/upload-image/route.js.nft.json +1 -1
- package/.next/server/app/api/sql/connections/route.js.nft.json +1 -1
- package/.next/server/app/api/sql/mcp/route.js.nft.json +1 -1
- package/.next/server/app/api/sql/query/route.js.nft.json +1 -1
- package/.next/server/app/api/sql/schema/route.js.nft.json +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +2 -2
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/page/react-loadable-manifest.json +3 -3
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0tq0maq._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0tq0maq._.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{16rky3981raz5.js → 008bf~h8rh5_3.js} +3 -3
- package/.next/static/chunks/{15_baizhaiq8c.js → 00pgauqedvo01.js} +2 -2
- package/.next/static/chunks/0ii_nb0g40rmj.js +4 -0
- package/.next/trace +1 -1
- package/.next/trace-build +1 -1
- package/README.md +5 -5
- package/package.json +1 -1
- package/public/feature-guide.html +1443 -0
- package/src/app/components/IdeLayout.tsx +1 -1
- package/src/app/components/MarkdownPreview.tsx +28 -1
- package/src/app/components/TerminalConsole.tsx +67 -2
- package/.next/static/chunks/0sr3d9iqny2rf.js +0 -4
- /package/.next/static/{oWEeFdgDSIDLRom42Fn3s → EglcK14vXeSWIjxjJCP9A}/_buildManifest.js +0 -0
- /package/.next/static/{oWEeFdgDSIDLRom42Fn3s → EglcK14vXeSWIjxjJCP9A}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{oWEeFdgDSIDLRom42Fn3s → EglcK14vXeSWIjxjJCP9A}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,1443 @@
|
|
|
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>NeuralLoom - Feature Guide & Orchestrator Manual</title>
|
|
7
|
+
|
|
8
|
+
<!-- Modern Typography -->
|
|
9
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
10
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
11
|
+
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700;800&family=Plus+Jakarta+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,400&family=Fira+Code:wght@400;500;600&display=swap" rel="stylesheet">
|
|
12
|
+
|
|
13
|
+
<style>
|
|
14
|
+
/* Premium Slate Dark Design Tokens */
|
|
15
|
+
:root {
|
|
16
|
+
--bg: #05070a;
|
|
17
|
+
--card-bg: rgba(13, 20, 35, 0.65);
|
|
18
|
+
--card-hover: rgba(23, 33, 56, 0.85);
|
|
19
|
+
--border: rgba(255, 255, 255, 0.08);
|
|
20
|
+
--border-focus: rgba(139, 92, 246, 0.4);
|
|
21
|
+
--text: #e2e8f0;
|
|
22
|
+
--text-muted: #94a3b8;
|
|
23
|
+
|
|
24
|
+
/* Vibrant Tailored Accents */
|
|
25
|
+
--primary: #8b5cf6;
|
|
26
|
+
--primary-glow: rgba(139, 92, 246, 0.2);
|
|
27
|
+
--secondary: #06b6d4;
|
|
28
|
+
--success: #10b981;
|
|
29
|
+
--warning: #f59e0b;
|
|
30
|
+
--danger: #ef4444;
|
|
31
|
+
|
|
32
|
+
--gradient-purple: linear-gradient(135deg, #a78bfa 0%, #8b5cf6 100%);
|
|
33
|
+
--gradient-cyan: linear-gradient(135deg, #22d3ee 0%, #06b6d4 100%);
|
|
34
|
+
--gradient-emerald: linear-gradient(135deg, #34d399 0%, #10b981 100%);
|
|
35
|
+
--gradient-orange: linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%);
|
|
36
|
+
--gradient-red: linear-gradient(135deg, #f87171 0%, #ef4444 100%);
|
|
37
|
+
|
|
38
|
+
--gradient-hero: linear-gradient(185deg, #0f172a 0%, #05070a 100%);
|
|
39
|
+
--sidebar-width: 280px;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
* {
|
|
43
|
+
box-sizing: border-box;
|
|
44
|
+
margin: 0;
|
|
45
|
+
padding: 0;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
html {
|
|
49
|
+
scroll-behavior: smooth;
|
|
50
|
+
font-family: 'Plus Jakarta Sans', sans-serif;
|
|
51
|
+
background-color: var(--bg);
|
|
52
|
+
color: var(--text);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
body {
|
|
56
|
+
display: flex;
|
|
57
|
+
min-height: 100vh;
|
|
58
|
+
overflow-x: hidden;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* Scrollbar Styling */
|
|
62
|
+
::-webkit-scrollbar {
|
|
63
|
+
width: 8px;
|
|
64
|
+
height: 8px;
|
|
65
|
+
}
|
|
66
|
+
::-webkit-scrollbar-track {
|
|
67
|
+
background: var(--bg);
|
|
68
|
+
}
|
|
69
|
+
::-webkit-scrollbar-thumb {
|
|
70
|
+
background: rgba(255, 255, 255, 0.1);
|
|
71
|
+
border-radius: 4px;
|
|
72
|
+
}
|
|
73
|
+
::-webkit-scrollbar-thumb:hover {
|
|
74
|
+
background: var(--primary);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/* Sidebar Navigation */
|
|
78
|
+
.sidebar {
|
|
79
|
+
width: var(--sidebar-width);
|
|
80
|
+
background-color: #080c14;
|
|
81
|
+
border-right: 1px solid var(--border);
|
|
82
|
+
position: fixed;
|
|
83
|
+
top: 0;
|
|
84
|
+
left: 0;
|
|
85
|
+
bottom: 0;
|
|
86
|
+
z-index: 100;
|
|
87
|
+
padding: 1.75rem;
|
|
88
|
+
display: flex;
|
|
89
|
+
flex-direction: column;
|
|
90
|
+
gap: 1.5rem;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.sidebar-header {
|
|
94
|
+
display: flex;
|
|
95
|
+
align-items: center;
|
|
96
|
+
gap: 0.75rem;
|
|
97
|
+
padding-bottom: 1.25rem;
|
|
98
|
+
border-bottom: 1px solid var(--border);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.logo-img {
|
|
102
|
+
width: 32px;
|
|
103
|
+
height: 32px;
|
|
104
|
+
background: var(--gradient-purple);
|
|
105
|
+
border-radius: 8px;
|
|
106
|
+
display: flex;
|
|
107
|
+
align-items: center;
|
|
108
|
+
justify-content: center;
|
|
109
|
+
font-weight: 800;
|
|
110
|
+
color: #fff;
|
|
111
|
+
font-family: 'Outfit', sans-serif;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.logo-text {
|
|
115
|
+
font-family: 'Outfit', sans-serif;
|
|
116
|
+
font-size: 1.25rem;
|
|
117
|
+
font-weight: 700;
|
|
118
|
+
background: linear-gradient(to right, #fff, #a78bfa);
|
|
119
|
+
-webkit-background-clip: text;
|
|
120
|
+
-webkit-text-fill-color: transparent;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.search-box {
|
|
124
|
+
position: relative;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.search-input {
|
|
128
|
+
width: 100%;
|
|
129
|
+
background-color: rgba(255, 255, 255, 0.03);
|
|
130
|
+
border: 1px solid var(--border);
|
|
131
|
+
border-radius: 8px;
|
|
132
|
+
padding: 0.6rem 0.75rem 0.6rem 2rem;
|
|
133
|
+
color: var(--text);
|
|
134
|
+
font-family: inherit;
|
|
135
|
+
font-size: 0.85rem;
|
|
136
|
+
transition: all 0.2s ease;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.search-input:focus {
|
|
140
|
+
outline: none;
|
|
141
|
+
border-color: var(--primary);
|
|
142
|
+
background-color: rgba(255, 255, 255, 0.05);
|
|
143
|
+
box-shadow: 0 0 12px var(--primary-glow);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.search-icon {
|
|
147
|
+
position: absolute;
|
|
148
|
+
left: 0.75rem;
|
|
149
|
+
top: 50%;
|
|
150
|
+
transform: translateY(-50%);
|
|
151
|
+
color: var(--text-muted);
|
|
152
|
+
font-size: 0.85rem;
|
|
153
|
+
pointer-events: none;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.nav-list {
|
|
157
|
+
list-style: none;
|
|
158
|
+
display: flex;
|
|
159
|
+
flex-direction: column;
|
|
160
|
+
gap: 0.35rem;
|
|
161
|
+
overflow-y: auto;
|
|
162
|
+
flex: 1;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.nav-item a {
|
|
166
|
+
display: flex;
|
|
167
|
+
align-items: center;
|
|
168
|
+
gap: 0.75rem;
|
|
169
|
+
padding: 0.6rem 0.75rem;
|
|
170
|
+
color: var(--text-muted);
|
|
171
|
+
text-decoration: none;
|
|
172
|
+
font-size: 0.9rem;
|
|
173
|
+
font-weight: 500;
|
|
174
|
+
border-radius: 6px;
|
|
175
|
+
transition: all 0.25s ease;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.nav-item a:hover {
|
|
179
|
+
color: #fff;
|
|
180
|
+
background-color: rgba(255, 255, 255, 0.03);
|
|
181
|
+
transform: translateX(3px);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.nav-item.active a {
|
|
185
|
+
color: #fff;
|
|
186
|
+
background-color: var(--primary-glow);
|
|
187
|
+
border-left: 3px solid var(--primary);
|
|
188
|
+
padding-left: 0.65rem;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.sidebar-footer {
|
|
192
|
+
font-size: 0.72rem;
|
|
193
|
+
color: var(--text-muted);
|
|
194
|
+
text-align: center;
|
|
195
|
+
padding-top: 1rem;
|
|
196
|
+
border-top: 1px solid var(--border);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/* Main Content Area */
|
|
200
|
+
.main-content {
|
|
201
|
+
margin-left: var(--sidebar-width);
|
|
202
|
+
flex: 1;
|
|
203
|
+
padding: 3rem 4rem;
|
|
204
|
+
max-width: 1200px;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/* Hero Section */
|
|
208
|
+
.hero {
|
|
209
|
+
position: relative;
|
|
210
|
+
background: var(--gradient-hero);
|
|
211
|
+
border: 1px solid var(--border);
|
|
212
|
+
border-radius: 16px;
|
|
213
|
+
padding: 3rem;
|
|
214
|
+
margin-bottom: 3rem;
|
|
215
|
+
overflow: hidden;
|
|
216
|
+
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
.hero-glow {
|
|
220
|
+
position: absolute;
|
|
221
|
+
top: -50%;
|
|
222
|
+
right: -20%;
|
|
223
|
+
width: 450px;
|
|
224
|
+
height: 450px;
|
|
225
|
+
background: radial-gradient(circle, rgba(139, 92, 246, 0.15) 0%, rgba(139, 92, 246, 0) 70%);
|
|
226
|
+
pointer-events: none;
|
|
227
|
+
z-index: 1;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.hero-content {
|
|
231
|
+
position: relative;
|
|
232
|
+
z-index: 2;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
.badge-wrapper {
|
|
236
|
+
display: inline-flex;
|
|
237
|
+
gap: 0.5rem;
|
|
238
|
+
margin-bottom: 1rem;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
.badge {
|
|
242
|
+
font-size: 0.75rem;
|
|
243
|
+
font-weight: 600;
|
|
244
|
+
text-transform: uppercase;
|
|
245
|
+
padding: 0.25rem 0.6rem;
|
|
246
|
+
border-radius: 9999px;
|
|
247
|
+
letter-spacing: 0.05em;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.badge-primary {
|
|
251
|
+
background-color: var(--primary-glow);
|
|
252
|
+
color: #a78bfa;
|
|
253
|
+
border: 1px solid rgba(139, 92, 246, 0.3);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.badge-status {
|
|
257
|
+
background-color: rgba(16, 185, 129, 0.1);
|
|
258
|
+
color: #34d399;
|
|
259
|
+
border: 1px solid rgba(16, 185, 129, 0.2);
|
|
260
|
+
display: flex;
|
|
261
|
+
align-items: center;
|
|
262
|
+
gap: 0.35rem;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
.pulse-dot {
|
|
266
|
+
width: 6px;
|
|
267
|
+
height: 6px;
|
|
268
|
+
background-color: var(--success);
|
|
269
|
+
border-radius: 50%;
|
|
270
|
+
box-shadow: 0 0 8px var(--success);
|
|
271
|
+
animation: pulse 1.8s infinite;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
@keyframes pulse {
|
|
275
|
+
0% { transform: scale(0.9); opacity: 0.6; }
|
|
276
|
+
50% { transform: scale(1.15); opacity: 1; box-shadow: 0 0 12px var(--success); }
|
|
277
|
+
100% { transform: scale(0.9); opacity: 0.6; }
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
.hero-title {
|
|
281
|
+
font-family: 'Outfit', sans-serif;
|
|
282
|
+
font-size: 2.75rem;
|
|
283
|
+
font-weight: 800;
|
|
284
|
+
letter-spacing: -0.02em;
|
|
285
|
+
margin-bottom: 0.75rem;
|
|
286
|
+
line-height: 1.15;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
.hero-title span {
|
|
290
|
+
background: linear-gradient(to right, #c084fc, #6366f1, #38bdf8);
|
|
291
|
+
-webkit-background-clip: text;
|
|
292
|
+
-webkit-text-fill-color: transparent;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.hero-desc {
|
|
296
|
+
color: var(--text-muted);
|
|
297
|
+
font-size: 1.1rem;
|
|
298
|
+
line-height: 1.6;
|
|
299
|
+
max-width: 720px;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/* Section Cards */
|
|
303
|
+
section {
|
|
304
|
+
margin-bottom: 3.5rem;
|
|
305
|
+
scroll-margin-top: 2rem;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.section-header {
|
|
309
|
+
margin-bottom: 1.5rem;
|
|
310
|
+
border-bottom: 1px solid var(--border);
|
|
311
|
+
padding-bottom: 0.75rem;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
.section-title {
|
|
315
|
+
font-family: 'Outfit', sans-serif;
|
|
316
|
+
font-size: 1.75rem;
|
|
317
|
+
font-weight: 700;
|
|
318
|
+
color: #fff;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
.section-subtitle {
|
|
322
|
+
font-size: 0.95rem;
|
|
323
|
+
color: var(--text-muted);
|
|
324
|
+
margin-top: 0.25rem;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
.grid-2 {
|
|
328
|
+
display: grid;
|
|
329
|
+
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
|
|
330
|
+
gap: 1.5rem;
|
|
331
|
+
margin-bottom: 2rem;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
.card {
|
|
335
|
+
background-color: var(--card-bg);
|
|
336
|
+
border: 1px solid var(--border);
|
|
337
|
+
border-radius: 12px;
|
|
338
|
+
padding: 1.5rem;
|
|
339
|
+
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
340
|
+
position: relative;
|
|
341
|
+
overflow: hidden;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
.card:hover {
|
|
345
|
+
background-color: var(--card-hover);
|
|
346
|
+
border-color: var(--border-focus);
|
|
347
|
+
transform: translateY(-4px);
|
|
348
|
+
box-shadow: 0 12px 24px -10px rgba(0, 0, 0, 0.4);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
.card-icon {
|
|
352
|
+
font-size: 1.75rem;
|
|
353
|
+
margin-bottom: 1rem;
|
|
354
|
+
width: 44px;
|
|
355
|
+
height: 44px;
|
|
356
|
+
background: rgba(255, 255, 255, 0.03);
|
|
357
|
+
border-radius: 8px;
|
|
358
|
+
display: flex;
|
|
359
|
+
align-items: center;
|
|
360
|
+
justify-content: center;
|
|
361
|
+
border: 1px solid var(--border);
|
|
362
|
+
color: var(--primary);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
.card-title {
|
|
366
|
+
font-family: 'Outfit', sans-serif;
|
|
367
|
+
font-size: 1.15rem;
|
|
368
|
+
font-weight: 600;
|
|
369
|
+
color: #fff;
|
|
370
|
+
margin-bottom: 0.5rem;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
.card-desc {
|
|
374
|
+
color: var(--text-muted);
|
|
375
|
+
font-size: 0.88rem;
|
|
376
|
+
line-height: 1.55;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/* IDE Layout UI Preview */
|
|
380
|
+
.ide-mockup {
|
|
381
|
+
background-color: #06090e;
|
|
382
|
+
border: 1px solid var(--border);
|
|
383
|
+
border-radius: 10px;
|
|
384
|
+
overflow: hidden;
|
|
385
|
+
margin: 1.5rem 0;
|
|
386
|
+
box-shadow: 0 10px 30px rgba(0,0,0,0.5);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
.ide-header {
|
|
390
|
+
background-color: #0d1117;
|
|
391
|
+
border-bottom: 1px solid var(--border);
|
|
392
|
+
padding: 0.5rem 1rem;
|
|
393
|
+
display: flex;
|
|
394
|
+
align-items: center;
|
|
395
|
+
justify-content: space-between;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
.ide-dots {
|
|
399
|
+
display: flex;
|
|
400
|
+
gap: 0.35rem;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
.ide-dot {
|
|
404
|
+
width: 10px;
|
|
405
|
+
height: 10px;
|
|
406
|
+
border-radius: 50%;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
.ide-dot-red { background-color: #ff5f56; }
|
|
410
|
+
.ide-dot-yellow { background-color: #ffbd2e; }
|
|
411
|
+
.ide-dot-green { background-color: #27c93f; }
|
|
412
|
+
|
|
413
|
+
.ide-tabs {
|
|
414
|
+
display: flex;
|
|
415
|
+
gap: 0.25rem;
|
|
416
|
+
margin-left: 2rem;
|
|
417
|
+
flex: 1;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
.ide-tab {
|
|
421
|
+
background-color: #161b22;
|
|
422
|
+
border: 1px solid var(--border);
|
|
423
|
+
border-bottom: none;
|
|
424
|
+
padding: 0.3rem 0.75rem;
|
|
425
|
+
border-top-left-radius: 4px;
|
|
426
|
+
border-top-right-radius: 4px;
|
|
427
|
+
font-size: 0.75rem;
|
|
428
|
+
font-family: 'Fira Code', monospace;
|
|
429
|
+
color: var(--text-muted);
|
|
430
|
+
cursor: pointer;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
.ide-tab.active {
|
|
434
|
+
background-color: #06090e;
|
|
435
|
+
color: #fff;
|
|
436
|
+
border-top: 2px solid var(--primary);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
.ide-body {
|
|
440
|
+
display: flex;
|
|
441
|
+
height: 250px;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
.ide-sidebar-mock {
|
|
445
|
+
width: 50px;
|
|
446
|
+
background-color: #0c1015;
|
|
447
|
+
border-right: 1px solid var(--border);
|
|
448
|
+
display: flex;
|
|
449
|
+
flex-direction: column;
|
|
450
|
+
align-items: center;
|
|
451
|
+
padding-top: 0.75rem;
|
|
452
|
+
gap: 1rem;
|
|
453
|
+
font-size: 1.1rem;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
.ide-editor-mock {
|
|
457
|
+
flex: 1;
|
|
458
|
+
padding: 1rem;
|
|
459
|
+
font-family: 'Fira Code', monospace;
|
|
460
|
+
font-size: 0.75rem;
|
|
461
|
+
color: #7ee787;
|
|
462
|
+
overflow-y: auto;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
.ide-terminal-mock {
|
|
466
|
+
width: 40%;
|
|
467
|
+
background-color: #010409;
|
|
468
|
+
border-left: 1px solid var(--border);
|
|
469
|
+
padding: 1rem;
|
|
470
|
+
font-family: 'Fira Code', monospace;
|
|
471
|
+
font-size: 0.75rem;
|
|
472
|
+
color: #58a6ff;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/* Comparison Table / Matrix */
|
|
476
|
+
.table-container {
|
|
477
|
+
overflow-x: auto;
|
|
478
|
+
margin: 1.5rem 0;
|
|
479
|
+
border-radius: 12px;
|
|
480
|
+
border: 1px solid var(--border);
|
|
481
|
+
box-shadow: 0 4px 20px rgba(0,0,0,0.25);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
table {
|
|
485
|
+
width: 100%;
|
|
486
|
+
border-collapse: collapse;
|
|
487
|
+
background-color: var(--card-bg);
|
|
488
|
+
text-align: left;
|
|
489
|
+
font-size: 0.88rem;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
th {
|
|
493
|
+
background-color: #0c1017;
|
|
494
|
+
color: #fff;
|
|
495
|
+
font-weight: 600;
|
|
496
|
+
padding: 1rem;
|
|
497
|
+
border-bottom: 2px solid var(--border);
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
td {
|
|
501
|
+
padding: 1rem;
|
|
502
|
+
border-bottom: 1px solid var(--border);
|
|
503
|
+
color: var(--text-muted);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
tr:last-child td {
|
|
507
|
+
border-bottom: none;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
tr:hover td {
|
|
511
|
+
color: #fff;
|
|
512
|
+
background-color: rgba(255, 255, 255, 0.015);
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
.feature-supported {
|
|
516
|
+
color: var(--success);
|
|
517
|
+
font-weight: 600;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
.feature-partial {
|
|
521
|
+
color: var(--warning);
|
|
522
|
+
font-weight: 600;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
.feature-unsupported {
|
|
526
|
+
color: var(--danger);
|
|
527
|
+
font-weight: 500;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
/* Interactive Filterable Section */
|
|
531
|
+
.filter-bar {
|
|
532
|
+
display: flex;
|
|
533
|
+
gap: 0.5rem;
|
|
534
|
+
margin-bottom: 1.5rem;
|
|
535
|
+
flex-wrap: wrap;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
.filter-btn {
|
|
539
|
+
background-color: rgba(255, 255, 255, 0.03);
|
|
540
|
+
border: 1px solid var(--border);
|
|
541
|
+
color: var(--text-muted);
|
|
542
|
+
padding: 0.45rem 1rem;
|
|
543
|
+
border-radius: 6px;
|
|
544
|
+
font-size: 0.8rem;
|
|
545
|
+
font-weight: 500;
|
|
546
|
+
cursor: pointer;
|
|
547
|
+
transition: all 0.2s ease;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
.filter-btn:hover {
|
|
551
|
+
background-color: rgba(255, 255, 255, 0.08);
|
|
552
|
+
color: #fff;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
.filter-btn.active {
|
|
556
|
+
background-color: var(--primary);
|
|
557
|
+
border-color: var(--primary);
|
|
558
|
+
color: #fff;
|
|
559
|
+
box-shadow: 0 0 10px rgba(139, 92, 246, 0.3);
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
.feature-matrix-grid {
|
|
563
|
+
display: grid;
|
|
564
|
+
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
|
|
565
|
+
gap: 1rem;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
.matrix-item {
|
|
569
|
+
background-color: var(--card-bg);
|
|
570
|
+
border: 1px solid var(--border);
|
|
571
|
+
border-radius: 8px;
|
|
572
|
+
padding: 1.25rem;
|
|
573
|
+
transition: all 0.25s ease;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
.matrix-item:hover {
|
|
577
|
+
border-color: var(--border-focus);
|
|
578
|
+
background-color: var(--card-hover);
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
.matrix-item-tags {
|
|
582
|
+
display: flex;
|
|
583
|
+
gap: 0.35rem;
|
|
584
|
+
margin-bottom: 0.6rem;
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
.matrix-tag {
|
|
588
|
+
font-size: 0.68rem;
|
|
589
|
+
padding: 0.15rem 0.4rem;
|
|
590
|
+
border-radius: 4px;
|
|
591
|
+
font-weight: 600;
|
|
592
|
+
text-transform: uppercase;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
.tag-local { background-color: rgba(6, 182, 212, 0.1); color: #22d3ee; }
|
|
596
|
+
.tag-docker { background-color: rgba(59, 130, 246, 0.1); color: #60a5fa; }
|
|
597
|
+
.tag-ssh { background-color: rgba(139, 92, 246, 0.1); color: #c084fc; }
|
|
598
|
+
.tag-db { background-color: rgba(16, 185, 129, 0.1); color: #34d399; }
|
|
599
|
+
|
|
600
|
+
.matrix-item-title {
|
|
601
|
+
font-size: 0.95rem;
|
|
602
|
+
font-weight: 600;
|
|
603
|
+
color: #fff;
|
|
604
|
+
margin-bottom: 0.35rem;
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
.matrix-item-desc {
|
|
608
|
+
font-size: 0.8rem;
|
|
609
|
+
color: var(--text-muted);
|
|
610
|
+
line-height: 1.45;
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
/* Token Cost Calculator Widget */
|
|
614
|
+
.calculator-card {
|
|
615
|
+
background: linear-gradient(145deg, #0e1525 0%, #06090f 100%);
|
|
616
|
+
border: 1px solid var(--border-focus);
|
|
617
|
+
border-radius: 16px;
|
|
618
|
+
padding: 2rem;
|
|
619
|
+
box-shadow: 0 10px 40px rgba(0,0,0,0.5);
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
.calc-row {
|
|
623
|
+
display: grid;
|
|
624
|
+
grid-template-columns: 1fr 1fr;
|
|
625
|
+
gap: 1.5rem;
|
|
626
|
+
margin-bottom: 1.5rem;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
@media (max-width: 768px) {
|
|
630
|
+
.calc-row {
|
|
631
|
+
grid-template-columns: 1fr;
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
.input-group {
|
|
636
|
+
display: flex;
|
|
637
|
+
flex-direction: column;
|
|
638
|
+
gap: 0.5rem;
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
.input-label {
|
|
642
|
+
font-size: 0.85rem;
|
|
643
|
+
font-weight: 600;
|
|
644
|
+
color: #fff;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
.input-field {
|
|
648
|
+
background-color: rgba(255, 255, 255, 0.03);
|
|
649
|
+
border: 1px solid var(--border);
|
|
650
|
+
border-radius: 8px;
|
|
651
|
+
padding: 0.65rem 0.85rem;
|
|
652
|
+
color: var(--text);
|
|
653
|
+
font-family: inherit;
|
|
654
|
+
font-size: 0.9rem;
|
|
655
|
+
transition: all 0.2s ease;
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
.input-field:focus {
|
|
659
|
+
outline: none;
|
|
660
|
+
border-color: var(--primary);
|
|
661
|
+
background-color: rgba(255, 255, 255, 0.05);
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
.select-field {
|
|
665
|
+
background-color: #0b0f19;
|
|
666
|
+
border: 1px solid var(--border);
|
|
667
|
+
border-radius: 8px;
|
|
668
|
+
padding: 0.65rem 0.85rem;
|
|
669
|
+
color: var(--text);
|
|
670
|
+
font-family: inherit;
|
|
671
|
+
font-size: 0.9rem;
|
|
672
|
+
cursor: pointer;
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
.calc-results {
|
|
676
|
+
background-color: rgba(139, 92, 246, 0.03);
|
|
677
|
+
border: 1px dashed var(--border-focus);
|
|
678
|
+
border-radius: 12px;
|
|
679
|
+
padding: 1.5rem;
|
|
680
|
+
display: flex;
|
|
681
|
+
flex-direction: column;
|
|
682
|
+
gap: 1rem;
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
.results-grid {
|
|
686
|
+
display: grid;
|
|
687
|
+
grid-template-columns: repeat(3, 1fr);
|
|
688
|
+
gap: 1rem;
|
|
689
|
+
text-align: center;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
.result-box {
|
|
693
|
+
background-color: rgba(0, 0, 0, 0.2);
|
|
694
|
+
border: 1px solid var(--border);
|
|
695
|
+
border-radius: 8px;
|
|
696
|
+
padding: 0.75rem;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
.result-val {
|
|
700
|
+
font-family: 'Outfit', sans-serif;
|
|
701
|
+
font-size: 1.35rem;
|
|
702
|
+
font-weight: 700;
|
|
703
|
+
color: #fff;
|
|
704
|
+
margin-top: 0.25rem;
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
.val-highlight {
|
|
708
|
+
color: var(--secondary);
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
.val-emerald {
|
|
712
|
+
color: var(--success);
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
.comparison-bar-container {
|
|
716
|
+
width: 100%;
|
|
717
|
+
height: 8px;
|
|
718
|
+
background-color: rgba(255, 255, 255, 0.05);
|
|
719
|
+
border-radius: 4px;
|
|
720
|
+
overflow: hidden;
|
|
721
|
+
margin-top: 0.5rem;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
.comparison-bar {
|
|
725
|
+
height: 100%;
|
|
726
|
+
background: var(--gradient-emerald);
|
|
727
|
+
width: 0%;
|
|
728
|
+
transition: width 0.4s ease;
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
/* FAQ Collapsible */
|
|
732
|
+
.faq-list {
|
|
733
|
+
display: flex;
|
|
734
|
+
flex-direction: column;
|
|
735
|
+
gap: 0.75rem;
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
.faq-item {
|
|
739
|
+
background-color: var(--card-bg);
|
|
740
|
+
border: 1px solid var(--border);
|
|
741
|
+
border-radius: 8px;
|
|
742
|
+
overflow: hidden;
|
|
743
|
+
transition: all 0.2s ease;
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
.faq-question {
|
|
747
|
+
padding: 1rem 1.25rem;
|
|
748
|
+
font-weight: 600;
|
|
749
|
+
color: #fff;
|
|
750
|
+
cursor: pointer;
|
|
751
|
+
display: flex;
|
|
752
|
+
justify-content: space-between;
|
|
753
|
+
align-items: center;
|
|
754
|
+
user-select: none;
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
.faq-question:hover {
|
|
758
|
+
background-color: rgba(255, 255, 255, 0.02);
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
.faq-icon {
|
|
762
|
+
font-size: 0.8rem;
|
|
763
|
+
transition: transform 0.2s ease;
|
|
764
|
+
color: var(--primary);
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
.faq-answer {
|
|
768
|
+
max-height: 0;
|
|
769
|
+
overflow: hidden;
|
|
770
|
+
padding: 0 1.25rem;
|
|
771
|
+
color: var(--text-muted);
|
|
772
|
+
font-size: 0.88rem;
|
|
773
|
+
line-height: 1.5;
|
|
774
|
+
transition: all 0.25s ease-out;
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
.faq-item.open .faq-answer {
|
|
778
|
+
padding: 0 1.25rem 1.25rem 1.25rem;
|
|
779
|
+
max-height: 200px;
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
.faq-item.open .faq-icon {
|
|
783
|
+
transform: rotate(90deg);
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
/* Code Block Styling */
|
|
787
|
+
pre {
|
|
788
|
+
background-color: #06090e;
|
|
789
|
+
border: 1px solid var(--border);
|
|
790
|
+
padding: 1rem;
|
|
791
|
+
border-radius: 8px;
|
|
792
|
+
font-family: 'Fira Code', monospace;
|
|
793
|
+
font-size: 0.8rem;
|
|
794
|
+
overflow-x: auto;
|
|
795
|
+
color: #e6edf3;
|
|
796
|
+
margin: 1rem 0;
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
code {
|
|
800
|
+
font-family: 'Fira Code', monospace;
|
|
801
|
+
background-color: rgba(255,255,255,0.06);
|
|
802
|
+
padding: 0.15rem 0.35rem;
|
|
803
|
+
border-radius: 4px;
|
|
804
|
+
font-size: 0.85em;
|
|
805
|
+
color: #ff7b72;
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
pre code {
|
|
809
|
+
background-color: transparent;
|
|
810
|
+
padding: 0;
|
|
811
|
+
font-size: inherit;
|
|
812
|
+
color: inherit;
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
.info-alert {
|
|
816
|
+
background-color: rgba(56, 189, 248, 0.05);
|
|
817
|
+
border-left: 4px solid var(--secondary);
|
|
818
|
+
padding: 1rem;
|
|
819
|
+
border-radius: 6px;
|
|
820
|
+
margin: 1.25rem 0;
|
|
821
|
+
font-size: 0.88rem;
|
|
822
|
+
line-height: 1.5;
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
.info-alert-title {
|
|
826
|
+
font-weight: 700;
|
|
827
|
+
color: #fff;
|
|
828
|
+
margin-bottom: 0.25rem;
|
|
829
|
+
display: flex;
|
|
830
|
+
align-items: center;
|
|
831
|
+
gap: 0.5rem;
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
/* Floating CTA */
|
|
835
|
+
.cta-container {
|
|
836
|
+
margin-top: 4rem;
|
|
837
|
+
text-align: center;
|
|
838
|
+
padding: 2.5rem;
|
|
839
|
+
background: linear-gradient(135deg, rgba(139, 92, 246, 0.1) 0%, rgba(6, 182, 212, 0.05) 100%);
|
|
840
|
+
border: 1px solid var(--border-focus);
|
|
841
|
+
border-radius: 16px;
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
.cta-title {
|
|
845
|
+
font-family: 'Outfit', sans-serif;
|
|
846
|
+
font-size: 1.5rem;
|
|
847
|
+
font-weight: 700;
|
|
848
|
+
margin-bottom: 0.5rem;
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
.cta-desc {
|
|
852
|
+
color: var(--text-muted);
|
|
853
|
+
font-size: 0.9rem;
|
|
854
|
+
margin-bottom: 1.25rem;
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
.cta-btn {
|
|
858
|
+
background: var(--gradient-purple);
|
|
859
|
+
border: none;
|
|
860
|
+
color: #fff;
|
|
861
|
+
padding: 0.65rem 1.5rem;
|
|
862
|
+
border-radius: 8px;
|
|
863
|
+
font-size: 0.9rem;
|
|
864
|
+
font-weight: 600;
|
|
865
|
+
cursor: pointer;
|
|
866
|
+
box-shadow: 0 4px 15px rgba(139, 92, 246, 0.4);
|
|
867
|
+
transition: all 0.2s ease;
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
.cta-btn:hover {
|
|
871
|
+
transform: translateY(-2px);
|
|
872
|
+
box-shadow: 0 6px 20px rgba(139, 92, 246, 0.5);
|
|
873
|
+
}
|
|
874
|
+
</style>
|
|
875
|
+
</head>
|
|
876
|
+
<body>
|
|
877
|
+
|
|
878
|
+
<!-- Sidebar Navigation -->
|
|
879
|
+
<aside class="sidebar">
|
|
880
|
+
<div class="sidebar-header">
|
|
881
|
+
<div class="logo-img">NL</div>
|
|
882
|
+
<div class="logo-text">NeuralLoom</div>
|
|
883
|
+
</div>
|
|
884
|
+
|
|
885
|
+
<div class="search-box">
|
|
886
|
+
<span class="search-icon">🔍</span>
|
|
887
|
+
<input type="text" class="search-input" id="sidebarSearch" placeholder="Search features...">
|
|
888
|
+
</div>
|
|
889
|
+
|
|
890
|
+
<nav class="nav-list" id="navLinks">
|
|
891
|
+
<li class="nav-item active"><a href="#overview">🔍 Overview</a></li>
|
|
892
|
+
<li class="nav-item"><a href="#workspaces">🗂️ Multi-Workspaces</a></li>
|
|
893
|
+
<li class="nav-item"><a href="#runtimes">🐳 Environments & Runtimes</a></li>
|
|
894
|
+
<li class="nav-item"><a href="#agents">🤖 Claude & Aider Wizards</a></li>
|
|
895
|
+
<li class="nav-item"><a href="#telemetry">📊 Telemetry & Cost</a></li>
|
|
896
|
+
<li class="nav-item"><a href="#database">🗄️ SQL & DB Explorer</a></li>
|
|
897
|
+
<li class="nav-item"><a href="#git">🌿 Source Control</a></li>
|
|
898
|
+
<li class="nav-item"><a href="#toolbar">⚡ Command Toolbar</a></li>
|
|
899
|
+
<li class="nav-item"><a href="#calculator">🧮 Interactive Calculator</a></li>
|
|
900
|
+
<li class="nav-item"><a href="#faq">❓ Frequently Asked Questions</a></li>
|
|
901
|
+
</nav>
|
|
902
|
+
|
|
903
|
+
<div class="sidebar-footer">
|
|
904
|
+
<div>NeuralLoom Cockpit v0.2.19</div>
|
|
905
|
+
<div style="margin-top: 0.25rem;">Orchestration Interface</div>
|
|
906
|
+
</div>
|
|
907
|
+
</aside>
|
|
908
|
+
|
|
909
|
+
<!-- Main Content Body -->
|
|
910
|
+
<main class="main-content">
|
|
911
|
+
|
|
912
|
+
<!-- Hero Banner -->
|
|
913
|
+
<header class="hero">
|
|
914
|
+
<div class="hero-glow"></div>
|
|
915
|
+
<div class="hero-content">
|
|
916
|
+
<div class="badge-wrapper">
|
|
917
|
+
<span class="badge badge-primary">v0.2.19 Release</span>
|
|
918
|
+
<span class="badge badge-status">
|
|
919
|
+
<span class="pulse-dot"></span>
|
|
920
|
+
Orchestrator System Online
|
|
921
|
+
</span>
|
|
922
|
+
</div>
|
|
923
|
+
<h1 class="hero-title">Unified AI Orchestration <span>Feature Guide</span></h1>
|
|
924
|
+
<p class="hero-desc">
|
|
925
|
+
NeuralLoom is a local, persistent Next.js cockpit and WS WebSocket terminal bridge designed to spawn, control, and audit concurrent AI agent sessions (Claude Code, Aider) across host environments, Docker sandboxes, and remote VMs.
|
|
926
|
+
</p>
|
|
927
|
+
</div>
|
|
928
|
+
</header>
|
|
929
|
+
|
|
930
|
+
<!-- Overview Section -->
|
|
931
|
+
<section id="overview">
|
|
932
|
+
<div class="section-header">
|
|
933
|
+
<h2 class="section-title">Overview & Architecture</h2>
|
|
934
|
+
<p class="section-subtitle">How NeuralLoom manages processes and sockets</p>
|
|
935
|
+
</div>
|
|
936
|
+
|
|
937
|
+
<p style="line-height: 1.6; color: var(--text-muted); margin-bottom: 1.5rem;">
|
|
938
|
+
Unlike serverless applications, NeuralLoom relies on a local Node.js backend. It leverages the raw capabilities of <code>node-pty</code> to spawn full interactive shells on the server host machine. Keystrokes are intercepted in the web client, wrapped, and forwarded over WebSocket channels (port 3001) in real-time. System output streams back to client terminal buffers instantly.
|
|
939
|
+
</p>
|
|
940
|
+
|
|
941
|
+
<div class="grid-2">
|
|
942
|
+
<div class="card">
|
|
943
|
+
<div class="card-icon">⚡</div>
|
|
944
|
+
<h3 class="card-title">WebSocket Gateway (Port 3001)</h3>
|
|
945
|
+
<p class="card-desc">Bridges terminal interactive input (keystrokes) and stdout buffer lines using a customized protocol. Minimizes keystroke latency down to sub-5ms.</p>
|
|
946
|
+
</div>
|
|
947
|
+
<div class="card">
|
|
948
|
+
<div class="card-icon">📁</div>
|
|
949
|
+
<h3 class="card-title">Staged Context Bridge</h3>
|
|
950
|
+
<p class="card-desc">Automatically compiles global system rules (<code>AGENTS.md</code>) and directories mappings to stage commands for immediate injection into agent consoles.</p>
|
|
951
|
+
</div>
|
|
952
|
+
</div>
|
|
953
|
+
</section>
|
|
954
|
+
|
|
955
|
+
<!-- Multi-Workspaces -->
|
|
956
|
+
<section id="workspaces">
|
|
957
|
+
<div class="section-header">
|
|
958
|
+
<h2 class="section-title">Multi-Session Workspace Switcher</h2>
|
|
959
|
+
<p class="section-subtitle">Manage concurrent agent sessions within a single cockpit</p>
|
|
960
|
+
</div>
|
|
961
|
+
|
|
962
|
+
<p style="line-height: 1.6; color: var(--text-muted); margin-bottom: 1.5rem;">
|
|
963
|
+
NeuralLoom caches the active editor tabs, open folder file trees, unstaged git diff lines, and standard PTY command states independently per session. Switching between workspaces takes less than a fraction of a second, without interrupting background agent operations.
|
|
964
|
+
</p>
|
|
965
|
+
|
|
966
|
+
<div class="ide-mockup">
|
|
967
|
+
<div class="ide-header">
|
|
968
|
+
<div class="ide-dots">
|
|
969
|
+
<span class="ide-dot ide-dot-red"></span>
|
|
970
|
+
<span class="ide-dot ide-dot-yellow"></span>
|
|
971
|
+
<span class="ide-dot ide-dot-green"></span>
|
|
972
|
+
</div>
|
|
973
|
+
<div class="ide-tabs">
|
|
974
|
+
<span class="ide-tab active">💻 Project Alpha (Claude)</span>
|
|
975
|
+
<span class="ide-tab">🐳 Docker Sandbox (Aider)</span>
|
|
976
|
+
<span class="ide-tab">🌐 Remote VM (SSH)</span>
|
|
977
|
+
</div>
|
|
978
|
+
<span style="font-size: 0.7rem; color: var(--text-muted);">Split screen mode [On]</span>
|
|
979
|
+
</div>
|
|
980
|
+
<div class="ide-body">
|
|
981
|
+
<div class="ide-sidebar-mock">
|
|
982
|
+
<span>📁</span>
|
|
983
|
+
<span>🌿</span>
|
|
984
|
+
<span>🗄️</span>
|
|
985
|
+
<span>📊</span>
|
|
986
|
+
</div>
|
|
987
|
+
<div class="ide-editor-mock">
|
|
988
|
+
<span style="color: #6a737d;">// Active workspace editor for Project Alpha</span><br>
|
|
989
|
+
<span style="color: #f97583;">const</span> runner = <span style="color: #f97583;">new</span> ClaudeRunner();<br>
|
|
990
|
+
runner.initializeWorkspace(CWD);<br>
|
|
991
|
+
console.log(<span style="color: #9ecbff;">"Orchestrator session booted"</span>);
|
|
992
|
+
</div>
|
|
993
|
+
<div class="ide-terminal-mock">
|
|
994
|
+
<span style="color: #85e89d;">[Claude Local]</span> Spawning node-pty...<br>
|
|
995
|
+
<span style="color: #ffab70;">$ claude</span><br>
|
|
996
|
+
<span style="color: #e1e4e8;">How can I help you build today?</span><br>
|
|
997
|
+
<span style="color: #c8e1ff;">█</span>
|
|
998
|
+
</div>
|
|
999
|
+
</div>
|
|
1000
|
+
</div>
|
|
1001
|
+
|
|
1002
|
+
<div class="info-alert">
|
|
1003
|
+
<div class="info-alert-title">💡 Horizontal Split Consoles</div>
|
|
1004
|
+
Select a second active session from the terminal console header dropdown. The terminal view instantly divides into a 50/50 split console, enabling side-by-side commands monitoring.
|
|
1005
|
+
</div>
|
|
1006
|
+
</section>
|
|
1007
|
+
|
|
1008
|
+
<!-- Environments & Runtimes -->
|
|
1009
|
+
<section id="runtimes">
|
|
1010
|
+
<div class="section-header">
|
|
1011
|
+
<h2 class="section-title">Execution Environments & Runtimes</h2>
|
|
1012
|
+
<p class="section-subtitle">Sandboxing, isolation, and remote virtual machines</p>
|
|
1013
|
+
</div>
|
|
1014
|
+
|
|
1015
|
+
<p style="line-height: 1.6; color: var(--text-muted); margin-bottom: 1rem;">
|
|
1016
|
+
NeuralLoom supports running interactive terminal agents in three isolated sandbox environments:
|
|
1017
|
+
</p>
|
|
1018
|
+
|
|
1019
|
+
<div class="table-container">
|
|
1020
|
+
<table>
|
|
1021
|
+
<thead>
|
|
1022
|
+
<tr>
|
|
1023
|
+
<th>Runtime Type</th>
|
|
1024
|
+
<th>Isolation Level</th>
|
|
1025
|
+
<th>Prerequisites</th>
|
|
1026
|
+
<th>Telemetry Source</th>
|
|
1027
|
+
<th>Workspace Mapping</th>
|
|
1028
|
+
</tr>
|
|
1029
|
+
</thead>
|
|
1030
|
+
<tbody>
|
|
1031
|
+
<tr>
|
|
1032
|
+
<td><strong>💻 Local Host OS</strong></td>
|
|
1033
|
+
<td class="feature-unsupported">Process Isolation Only</td>
|
|
1034
|
+
<td>Git Bash (Windows), node-pty</td>
|
|
1035
|
+
<td>Process RSS / OS Memory</td>
|
|
1036
|
+
<td>Direct local directories access</td>
|
|
1037
|
+
</tr>
|
|
1038
|
+
<tr>
|
|
1039
|
+
<td><strong>🐳 Docker Sandbox</strong></td>
|
|
1040
|
+
<td class="feature-supported">Container Sandbox</td>
|
|
1041
|
+
<td>Docker Desktop running locally</td>
|
|
1042
|
+
<td><code>docker stats --no-stream</code></td>
|
|
1043
|
+
<td>Mounts workspace volume folder</td>
|
|
1044
|
+
</tr>
|
|
1045
|
+
<tr>
|
|
1046
|
+
<td><strong>🌐 Remote VM (SSH)</strong></td>
|
|
1047
|
+
<td class="feature-supported">Full Virtual Machine</td>
|
|
1048
|
+
<td>SSH Keys / VM Credentials</td>
|
|
1049
|
+
<td>Native OS commands over SSH</td>
|
|
1050
|
+
<td>SSH mounting or workspace clone</td>
|
|
1051
|
+
</tr>
|
|
1052
|
+
</tbody>
|
|
1053
|
+
</table>
|
|
1054
|
+
</div>
|
|
1055
|
+
</section>
|
|
1056
|
+
|
|
1057
|
+
<!-- Claude & Aider Wizards -->
|
|
1058
|
+
<section id="agents">
|
|
1059
|
+
<div class="section-header">
|
|
1060
|
+
<h2 class="section-title">Claude Code & Aider Launch Wizards</h2>
|
|
1061
|
+
<p class="section-subtitle">Tailored setup wizards and templates saving</p>
|
|
1062
|
+
</div>
|
|
1063
|
+
|
|
1064
|
+
<div class="grid-2">
|
|
1065
|
+
<div class="card">
|
|
1066
|
+
<div class="card-icon">🤖</div>
|
|
1067
|
+
<h3 class="card-title">Claude Wizard Configuration</h3>
|
|
1068
|
+
<p class="card-desc">
|
|
1069
|
+
Define custom display names, project root targets, and supplementary scoped directory paths. Integrates local PTY instances or maps folders directly to container images.
|
|
1070
|
+
</p>
|
|
1071
|
+
</div>
|
|
1072
|
+
<div class="card">
|
|
1073
|
+
<div class="card-icon">🐍</div>
|
|
1074
|
+
<h3 class="card-title">Aider Settings Wizard</h3>
|
|
1075
|
+
<p class="card-desc">
|
|
1076
|
+
Securely configure OpenAI or Anthropic API keys (keys are stored locally in masked configuration structures), choose models (e.g. <code>gpt-4o</code>, <code>claude-3-5-sonnet</code>), and append custom CLI argument strings.
|
|
1077
|
+
</p>
|
|
1078
|
+
</div>
|
|
1079
|
+
</div>
|
|
1080
|
+
|
|
1081
|
+
<div class="info-alert">
|
|
1082
|
+
<div class="info-alert-title">💾 Saved Configurations</div>
|
|
1083
|
+
You can save any wizard layout configuration as a template. Templates appear on the dashboard side panel for instant quick-launching with a single click.
|
|
1084
|
+
</div>
|
|
1085
|
+
</section>
|
|
1086
|
+
|
|
1087
|
+
<!-- Telemetry & Cost -->
|
|
1088
|
+
<section id="telemetry">
|
|
1089
|
+
<div class="section-header">
|
|
1090
|
+
<h2 class="section-title">Telemetry & Token Cost Analytics</h2>
|
|
1091
|
+
<p class="section-subtitle">Real-time resource tracking and cost auditing</p>
|
|
1092
|
+
</div>
|
|
1093
|
+
|
|
1094
|
+
<p style="line-height: 1.6; color: var(--text-muted); margin-bottom: 1.5rem;">
|
|
1095
|
+
As the stdout streams from agent subprocesses, NeuralLoom executes regex parser rules on each line buffer. This reads out input tokens, output tokens, and estimated dollar costs, compiling them live into tracking widgets.
|
|
1096
|
+
</p>
|
|
1097
|
+
|
|
1098
|
+
<div class="grid-2">
|
|
1099
|
+
<div class="card">
|
|
1100
|
+
<div class="card-icon">📈</div>
|
|
1101
|
+
<h3 class="card-title">Resource Telemetry</h3>
|
|
1102
|
+
<p class="card-desc">
|
|
1103
|
+
Tracks CPU utilization and memory consumption. Docker sandboxes are audited via container statistics, whereas local processes fall back to resident set size (RSS) scanning.
|
|
1104
|
+
</p>
|
|
1105
|
+
</div>
|
|
1106
|
+
<div class="card">
|
|
1107
|
+
<div class="card-icon">💸</div>
|
|
1108
|
+
<h3 class="card-title">Cost Calculations</h3>
|
|
1109
|
+
<p class="card-desc">
|
|
1110
|
+
Parses Claude and Aider token diagnostics outputs. Translates token consumption into actual dollar costs based on active LLM API rates.
|
|
1111
|
+
</p>
|
|
1112
|
+
</div>
|
|
1113
|
+
</div>
|
|
1114
|
+
</section>
|
|
1115
|
+
|
|
1116
|
+
<!-- SQL & DB Explorer -->
|
|
1117
|
+
<section id="database">
|
|
1118
|
+
<div class="section-header">
|
|
1119
|
+
<h2 class="section-title">Built-in Database Explorer & SQL Client</h2>
|
|
1120
|
+
<p class="section-subtitle">Expose SQL engines to agent tools and developers</p>
|
|
1121
|
+
</div>
|
|
1122
|
+
|
|
1123
|
+
<p style="line-height: 1.6; color: var(--text-muted); margin-bottom: 1.5rem;">
|
|
1124
|
+
NeuralLoom features an integrated SQL client supporting SQLite, PostgreSQL, MySQL, and MSSQL. It acts as both a developer playground and a Model Context Protocol (MCP) server stdio bridge.
|
|
1125
|
+
</p>
|
|
1126
|
+
|
|
1127
|
+
<div class="grid-2">
|
|
1128
|
+
<div class="card">
|
|
1129
|
+
<div class="card-icon">🗄️</div>
|
|
1130
|
+
<h3 class="card-title">Interactive UI Explorer</h3>
|
|
1131
|
+
<p class="card-desc">
|
|
1132
|
+
Inspect table definitions, browse columns structure, edit queries in a dedicated query runner, and view results in structured data tables.
|
|
1133
|
+
</p>
|
|
1134
|
+
</div>
|
|
1135
|
+
<div class="card">
|
|
1136
|
+
<div class="card-icon">🔒</div>
|
|
1137
|
+
<h3 class="card-title">Read-Only Safety Guard</h3>
|
|
1138
|
+
<p class="card-desc">
|
|
1139
|
+
Verifies query parameters to reject mutations (like <code>INSERT</code>, <code>DROP</code>, or <code>ALTER</code>) automatically when read-only mode is active, preventing accidental agent destruction.
|
|
1140
|
+
</p>
|
|
1141
|
+
</div>
|
|
1142
|
+
</div>
|
|
1143
|
+
|
|
1144
|
+
<pre><code>// Example of connecting agents via MCP Server stdio
|
|
1145
|
+
$ neural-loom mcp [workspace]
|
|
1146
|
+
Exposing database tools to stdio...
|
|
1147
|
+
[MCP-RPC] Method call received: sql_list_tables
|
|
1148
|
+
[MCP-RPC] Resolved connection "Database A" -> Returning schema summary</code></pre>
|
|
1149
|
+
</section>
|
|
1150
|
+
|
|
1151
|
+
<!-- Source Control -->
|
|
1152
|
+
<section id="git">
|
|
1153
|
+
<div class="section-header">
|
|
1154
|
+
<h2 class="section-title">Source Control & Git Diff Viewer</h2>
|
|
1155
|
+
<p class="section-subtitle">Real-time status lists and colored code diff highlighting</p>
|
|
1156
|
+
</div>
|
|
1157
|
+
|
|
1158
|
+
<p style="line-height: 1.6; color: var(--text-muted); margin-bottom: 1.5rem;">
|
|
1159
|
+
No need to jump back to terminal commands for git. NeuralLoom lists file changes by executing <code>git status --porcelain</code>. Select any file inside the source control side pane to open a virtual editor view displaying a complete line-by-line diff.
|
|
1160
|
+
</p>
|
|
1161
|
+
|
|
1162
|
+
<div class="grid-2">
|
|
1163
|
+
<div class="card">
|
|
1164
|
+
<div class="card-icon">🌿</div>
|
|
1165
|
+
<h3 class="card-title">Branch Switching</h3>
|
|
1166
|
+
<p class="card-desc">Switch branches, view history commits, and run stash/pop scripts in the current directory.</p>
|
|
1167
|
+
</div>
|
|
1168
|
+
<div class="card">
|
|
1169
|
+
<div class="card-icon">🟢</div>
|
|
1170
|
+
<h3 class="card-title">Read-Only Diff Highlight</h3>
|
|
1171
|
+
<p class="card-desc">
|
|
1172
|
+
Insertions (<code>+</code>) are highlighted in translucent green, deletions (<code>-</code>) in red, and diff block locations in blue.
|
|
1173
|
+
</p>
|
|
1174
|
+
</div>
|
|
1175
|
+
</div>
|
|
1176
|
+
</section>
|
|
1177
|
+
|
|
1178
|
+
<!-- Command Toolbar -->
|
|
1179
|
+
<section id="toolbar">
|
|
1180
|
+
<div class="section-header">
|
|
1181
|
+
<h2 class="section-title">Command Toolbar & Custom Triggers</h2>
|
|
1182
|
+
<p class="section-subtitle">Direct CLI shortcuts injection at one click</p>
|
|
1183
|
+
</div>
|
|
1184
|
+
|
|
1185
|
+
<p style="line-height: 1.6; color: var(--text-muted); margin-bottom: 1.5rem;">
|
|
1186
|
+
NeuralLoom inserts an inject-toolbar directly under the active editor window. It offers context-specific shortcuts that execute immediately inside the current PTY shell stream:
|
|
1187
|
+
</p>
|
|
1188
|
+
|
|
1189
|
+
<div class="grid-2">
|
|
1190
|
+
<div class="card">
|
|
1191
|
+
<div class="card-icon">💡</div>
|
|
1192
|
+
<h3 class="card-title">Predefined Shortcuts</h3>
|
|
1193
|
+
<p class="card-desc">
|
|
1194
|
+
Injects <code>/undo</code>, <code>/diff</code>, or <code>/commit</code> for active Aider runners; and <code>/compact</code>, <code>/history</code>, or <code>/reset</code> for Claude Code sessions.
|
|
1195
|
+
</p>
|
|
1196
|
+
</div>
|
|
1197
|
+
<div class="card">
|
|
1198
|
+
<div class="card-icon">💜</div>
|
|
1199
|
+
<h3 class="card-title">Custom Action Buttons</h3>
|
|
1200
|
+
<p class="card-desc">
|
|
1201
|
+
Define custom commands inside the system dashboard (saved in browser's local storage) and trigger them as styled purple injection shortcuts dynamically.
|
|
1202
|
+
</p>
|
|
1203
|
+
</div>
|
|
1204
|
+
</div>
|
|
1205
|
+
</section>
|
|
1206
|
+
|
|
1207
|
+
<!-- Interactive Calculator -->
|
|
1208
|
+
<section id="calculator">
|
|
1209
|
+
<div class="section-header">
|
|
1210
|
+
<h2 class="section-title">Interactive Token Cost Estimator</h2>
|
|
1211
|
+
<p class="section-subtitle">Calculate and compare estimated agent session costs</p>
|
|
1212
|
+
</div>
|
|
1213
|
+
|
|
1214
|
+
<div class="calculator-card">
|
|
1215
|
+
<div class="calc-row">
|
|
1216
|
+
<div class="input-group">
|
|
1217
|
+
<label class="input-label" for="calcModel">Select AI Model Pricing Profile</label>
|
|
1218
|
+
<select class="select-field" id="calcModel">
|
|
1219
|
+
<option value="claude-3-5-sonnet">Claude 3.5 Sonnet (In: $3.00/M, Out: $15.00/M)</option>
|
|
1220
|
+
<option value="claude-3-opus">Claude 3 Opus (In: $15.00/M, Out: $75.00/M)</option>
|
|
1221
|
+
<option value="gpt-4o">GPT-4o (In: $5.00/M, Out: $15.00/M)</option>
|
|
1222
|
+
<option value="gpt-4-turbo">GPT-4 Turbo (In: $10.00/M, Out: $30.00/M)</option>
|
|
1223
|
+
</select>
|
|
1224
|
+
</div>
|
|
1225
|
+
<div class="input-group">
|
|
1226
|
+
<label class="input-label" for="calcInteractions">Estimated Agent Iterations (Turns)</label>
|
|
1227
|
+
<input type="number" class="input-field" id="calcInteractions" value="10" min="1">
|
|
1228
|
+
</div>
|
|
1229
|
+
</div>
|
|
1230
|
+
|
|
1231
|
+
<div class="calc-row">
|
|
1232
|
+
<div class="input-group">
|
|
1233
|
+
<label class="input-label" for="calcInputTokens">Input Tokens (Per Turn average)</label>
|
|
1234
|
+
<input type="number" class="input-field" id="calcInputTokens" value="12000" min="0">
|
|
1235
|
+
</div>
|
|
1236
|
+
<div class="input-group">
|
|
1237
|
+
<label class="input-label" for="calcOutputTokens">Output Tokens (Per Turn average)</label>
|
|
1238
|
+
<input type="number" class="input-field" id="calcOutputTokens" value="1500" min="0">
|
|
1239
|
+
</div>
|
|
1240
|
+
</div>
|
|
1241
|
+
|
|
1242
|
+
<div class="calc-results">
|
|
1243
|
+
<div class="results-grid">
|
|
1244
|
+
<div class="result-box">
|
|
1245
|
+
<div class="input-label">Total Input Tokens</div>
|
|
1246
|
+
<div class="result-val" id="totalInputVal">120,000</div>
|
|
1247
|
+
</div>
|
|
1248
|
+
<div class="result-box">
|
|
1249
|
+
<div class="input-label">Total Output Tokens</div>
|
|
1250
|
+
<div class="result-val" id="totalOutputVal">15,000</div>
|
|
1251
|
+
</div>
|
|
1252
|
+
<div class="result-box" style="border-color: var(--primary);">
|
|
1253
|
+
<div class="input-label" style="color: var(--primary);">Total Session Cost</div>
|
|
1254
|
+
<div class="result-val val-emerald" id="totalCostVal">$0.58</div>
|
|
1255
|
+
</div>
|
|
1256
|
+
</div>
|
|
1257
|
+
|
|
1258
|
+
<div style="margin-top: 0.5rem;">
|
|
1259
|
+
<div style="display: flex; justify-content: space-between; font-size: 0.78rem; color: var(--text-muted);">
|
|
1260
|
+
<span>Comparison against average session cost cap ($25.00 budget limit)</span>
|
|
1261
|
+
<span id="budgetPct">2.3%</span>
|
|
1262
|
+
</div>
|
|
1263
|
+
<div class="comparison-bar-container">
|
|
1264
|
+
<div class="comparison-bar" id="comparisonBar"></div>
|
|
1265
|
+
</div>
|
|
1266
|
+
</div>
|
|
1267
|
+
</div>
|
|
1268
|
+
</div>
|
|
1269
|
+
</section>
|
|
1270
|
+
|
|
1271
|
+
<!-- FAQ Section -->
|
|
1272
|
+
<section id="faq">
|
|
1273
|
+
<div class="section-header">
|
|
1274
|
+
<h2 class="section-title">Frequently Asked Questions</h2>
|
|
1275
|
+
<p class="section-subtitle">Common configurations and troubleshooting</p>
|
|
1276
|
+
</div>
|
|
1277
|
+
|
|
1278
|
+
<div class="faq-list">
|
|
1279
|
+
<div class="faq-item">
|
|
1280
|
+
<div class="faq-question">
|
|
1281
|
+
<span>Can NeuralLoom run outside local host systems (e.g. Vercel deployment)?</span>
|
|
1282
|
+
<span class="faq-icon">▶</span>
|
|
1283
|
+
</div>
|
|
1284
|
+
<div class="faq-answer">
|
|
1285
|
+
No. NeuralLoom requires a persistent server workspace environment because it handles file reads/writes, invokes background terminal subprocesses via <code>node-pty</code>, manages local SQLite files, and binds system WebSockets. It cannot be run on standard serverless architectures.
|
|
1286
|
+
</div>
|
|
1287
|
+
</div>
|
|
1288
|
+
|
|
1289
|
+
<div class="faq-item">
|
|
1290
|
+
<div class="faq-question">
|
|
1291
|
+
<span>How do I configure Git Bash path if located in a custom directory?</span>
|
|
1292
|
+
<span class="faq-icon">▶</span>
|
|
1293
|
+
</div>
|
|
1294
|
+
<div class="faq-answer">
|
|
1295
|
+
On Windows, if Git Bash is not in standard paths, define the path explicitly inside your machine's environment variables before running the application:
|
|
1296
|
+
<code>$env:WINGMAN_BASH_PATH = "C:\Your\Custom\Path\To\bash.exe"</code>.
|
|
1297
|
+
</div>
|
|
1298
|
+
</div>
|
|
1299
|
+
|
|
1300
|
+
<div class="faq-item">
|
|
1301
|
+
<div class="faq-question">
|
|
1302
|
+
<span>Are database operations secure when agents run queries?</span>
|
|
1303
|
+
<span class="faq-icon">▶</span>
|
|
1304
|
+
</div>
|
|
1305
|
+
<div class="faq-answer">
|
|
1306
|
+
Yes, you can check/uncheck Read-Only flags inside Database Explorer configurations. When checked, the backend enforces structural query inspection to immediately intercept and block mutating SQL expressions.
|
|
1307
|
+
</div>
|
|
1308
|
+
</div>
|
|
1309
|
+
</div>
|
|
1310
|
+
</section>
|
|
1311
|
+
|
|
1312
|
+
<!-- CTA Footer -->
|
|
1313
|
+
<div class="cta-container">
|
|
1314
|
+
<h3 class="cta-title">Need UI Diagnostics?</h3>
|
|
1315
|
+
<p class="cta-desc">Explore visual components layout and inspect database/terminal consoles live inside the Audit Dashboard.</p>
|
|
1316
|
+
<button class="cta-btn" onclick="window.open('/ui-audit.html', '_blank')">Launch UI Audit Dashboard</button>
|
|
1317
|
+
</div>
|
|
1318
|
+
|
|
1319
|
+
</main>
|
|
1320
|
+
|
|
1321
|
+
<!-- Interactive JavaScript -->
|
|
1322
|
+
<script>
|
|
1323
|
+
// FAQ toggling
|
|
1324
|
+
document.querySelectorAll('.faq-question').forEach(q => {
|
|
1325
|
+
q.addEventListener('click', () => {
|
|
1326
|
+
const item = q.parentElement;
|
|
1327
|
+
const isOpen = item.classList.contains('open');
|
|
1328
|
+
|
|
1329
|
+
// Close all first
|
|
1330
|
+
document.querySelectorAll('.faq-item').forEach(el => el.classList.remove('open'));
|
|
1331
|
+
|
|
1332
|
+
if (!isOpen) {
|
|
1333
|
+
item.classList.add('open');
|
|
1334
|
+
}
|
|
1335
|
+
});
|
|
1336
|
+
});
|
|
1337
|
+
|
|
1338
|
+
// Sidebar search filtering
|
|
1339
|
+
const searchInput = document.getElementById('sidebarSearch');
|
|
1340
|
+
const sections = document.querySelectorAll('section');
|
|
1341
|
+
const navLinks = document.querySelectorAll('.nav-item');
|
|
1342
|
+
|
|
1343
|
+
searchInput.addEventListener('input', () => {
|
|
1344
|
+
const query = searchInput.value.toLowerCase().trim();
|
|
1345
|
+
|
|
1346
|
+
sections.forEach(section => {
|
|
1347
|
+
const text = section.innerText.toLowerCase();
|
|
1348
|
+
const navItem = Array.from(navLinks).find(item => {
|
|
1349
|
+
const href = item.querySelector('a').getAttribute('href');
|
|
1350
|
+
return href === '#' + section.id;
|
|
1351
|
+
});
|
|
1352
|
+
|
|
1353
|
+
if (text.includes(query)) {
|
|
1354
|
+
section.style.display = 'block';
|
|
1355
|
+
if (navItem) navItem.style.display = 'block';
|
|
1356
|
+
} else {
|
|
1357
|
+
section.style.display = 'none';
|
|
1358
|
+
if (navItem) navItem.style.display = 'none';
|
|
1359
|
+
}
|
|
1360
|
+
});
|
|
1361
|
+
});
|
|
1362
|
+
|
|
1363
|
+
// Token calculator calculations
|
|
1364
|
+
const calcModel = document.getElementById('calcModel');
|
|
1365
|
+
const calcInteractions = document.getElementById('calcInteractions');
|
|
1366
|
+
const calcInputTokens = document.getElementById('calcInputTokens');
|
|
1367
|
+
const calcOutputTokens = document.getElementById('calcOutputTokens');
|
|
1368
|
+
|
|
1369
|
+
const totalInputVal = document.getElementById('totalInputVal');
|
|
1370
|
+
const totalOutputVal = document.getElementById('totalOutputVal');
|
|
1371
|
+
const totalCostVal = document.getElementById('totalCostVal');
|
|
1372
|
+
const budgetPct = document.getElementById('budgetPct');
|
|
1373
|
+
const comparisonBar = document.getElementById('comparisonBar');
|
|
1374
|
+
|
|
1375
|
+
const rates = {
|
|
1376
|
+
'claude-3-5-sonnet': { in: 3.00, out: 15.00 },
|
|
1377
|
+
'claude-3-opus': { in: 15.00, out: 75.00 },
|
|
1378
|
+
'gpt-4o': { in: 5.00, out: 15.00 },
|
|
1379
|
+
'gpt-4-turbo': { in: 10.00, out: 30.00 }
|
|
1380
|
+
};
|
|
1381
|
+
|
|
1382
|
+
function recalculate() {
|
|
1383
|
+
const model = calcModel.value;
|
|
1384
|
+
const turns = parseInt(calcInteractions.value) || 0;
|
|
1385
|
+
const inputAvg = parseInt(calcInputTokens.value) || 0;
|
|
1386
|
+
const outputAvg = parseInt(calcOutputTokens.value) || 0;
|
|
1387
|
+
|
|
1388
|
+
const totalIn = turns * inputAvg;
|
|
1389
|
+
const totalOut = turns * outputAvg;
|
|
1390
|
+
|
|
1391
|
+
totalInputVal.innerText = totalIn.toLocaleString();
|
|
1392
|
+
totalOutputVal.innerText = totalOut.toLocaleString();
|
|
1393
|
+
|
|
1394
|
+
const rate = rates[model] || { in: 0, out: 0 };
|
|
1395
|
+
const inCost = (totalIn / 1000000) * rate.in;
|
|
1396
|
+
const outCost = (totalOut / 1000000) * rate.out;
|
|
1397
|
+
const totalCost = inCost + outCost;
|
|
1398
|
+
|
|
1399
|
+
totalCostVal.innerText = '$' + totalCost.toFixed(2);
|
|
1400
|
+
|
|
1401
|
+
const budgetLimit = 25.00;
|
|
1402
|
+
const pct = Math.min((totalCost / budgetLimit) * 100, 100);
|
|
1403
|
+
budgetPct.innerText = pct.toFixed(1) + '%';
|
|
1404
|
+
comparisonBar.style.width = pct + '%';
|
|
1405
|
+
|
|
1406
|
+
if (pct > 75) {
|
|
1407
|
+
comparisonBar.style.background = 'var(--gradient-red)';
|
|
1408
|
+
} else if (pct > 40) {
|
|
1409
|
+
comparisonBar.style.background = 'var(--gradient-orange)';
|
|
1410
|
+
} else {
|
|
1411
|
+
comparisonBar.style.background = 'var(--gradient-emerald)';
|
|
1412
|
+
}
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
[calcModel, calcInteractions, calcInputTokens, calcOutputTokens].forEach(el => {
|
|
1416
|
+
el.addEventListener('input', recalculate);
|
|
1417
|
+
});
|
|
1418
|
+
|
|
1419
|
+
// Run on startup
|
|
1420
|
+
recalculate();
|
|
1421
|
+
|
|
1422
|
+
// Scroll active link styling
|
|
1423
|
+
window.addEventListener('scroll', () => {
|
|
1424
|
+
let current = '';
|
|
1425
|
+
sections.forEach(section => {
|
|
1426
|
+
const sectionTop = section.offsetTop;
|
|
1427
|
+
const sectionHeight = section.clientHeight;
|
|
1428
|
+
if (pageYOffset >= (sectionTop - 250)) {
|
|
1429
|
+
current = section.getAttribute('id');
|
|
1430
|
+
}
|
|
1431
|
+
});
|
|
1432
|
+
|
|
1433
|
+
navLinks.forEach(item => {
|
|
1434
|
+
item.classList.remove('active');
|
|
1435
|
+
const href = item.querySelector('a').getAttribute('href');
|
|
1436
|
+
if (href === '#' + current) {
|
|
1437
|
+
item.classList.add('active');
|
|
1438
|
+
}
|
|
1439
|
+
});
|
|
1440
|
+
});
|
|
1441
|
+
</script>
|
|
1442
|
+
</body>
|
|
1443
|
+
</html>
|