opencroc 1.8.1 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +755 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +128 -1
- package/dist/index.js +548 -0
- package/dist/index.js.map +1 -1
- package/dist/web/dist/assets/main-Ccg3eDNK.js +1 -0
- package/dist/web/dist/assets/office-runtime-B3iNctxE.css +1 -0
- package/dist/web/dist/assets/office-runtime-BsCh82Pj.js +183 -0
- package/dist/web/dist/assets/pixel-page-3BYGm7dH.js +470 -0
- package/dist/web/dist/assets/react-vendor-C8RhVn0h.js +49 -0
- package/dist/web/dist/assets/studio-page-BInoyoV2.css +1 -0
- package/dist/web/dist/assets/studio-page-o3SCvE_v.js +351 -0
- package/dist/web/dist/assets/three-addons-BdrPp04O.js +470 -0
- package/dist/web/dist/assets/three-core-CsxM1PCY.js +4057 -0
- package/dist/web/dist/index.html +15 -0
- package/dist/web/index.html +11 -572
- package/dist/web/public/botreview/char_0.png +0 -0
- package/dist/web/public/botreview/char_1.png +0 -0
- package/dist/web/public/botreview/char_2.png +0 -0
- package/dist/web/public/botreview/coffee-machine.gif +0 -0
- package/dist/web/public/botreview/server.gif +0 -0
- package/dist/web/public/botreview/walls.png +0 -0
- package/dist/web/public/star/desk-v3.webp +0 -0
- package/dist/web/public/star/office_bg_small.webp +0 -0
- package/dist/web/public/star/star-idle-v5.png +0 -0
- package/dist/web/public/star/star-working-spritesheet-grid.webp +0 -0
- package/dist/web/src/app/AppLayout.tsx +34 -0
- package/dist/web/src/app/AppRouter.tsx +46 -0
- package/dist/web/src/app/bootstrap.tsx +22 -0
- package/dist/web/src/app/routes.tsx +52 -0
- package/dist/web/src/features/office/runtime/index.ts +1 -0
- package/dist/web/src/features/office/runtime/mount.ts +809 -0
- package/dist/web/src/features/pixel/runtime/index.ts +1 -0
- package/dist/web/src/features/pixel/runtime/mount.ts +728 -0
- package/dist/web/src/features/studio/runtime/index.ts +1 -0
- package/dist/web/src/features/studio/runtime/mount.ts +664 -0
- package/dist/web/src/features/three/engine/index.ts +1 -0
- package/dist/web/src/main.tsx +7 -0
- package/dist/web/src/pages/office/index.ts +1 -0
- package/dist/web/src/pages/office/page.tsx +283 -0
- package/dist/web/src/pages/pixel/index.ts +1 -0
- package/dist/web/src/pages/pixel/page.tsx +564 -0
- package/dist/web/src/pages/studio/index.ts +1 -0
- package/dist/web/src/pages/studio/page.tsx +446 -0
- package/dist/web/{js/agents.js → src/runtime/agents.ts} +304 -31
- package/dist/web/{js/camera.js → src/runtime/camera.ts} +12 -5
- package/dist/web/{js/dataviz.js → src/runtime/dataviz.ts} +38 -14
- package/dist/web/{js/effects.js → src/runtime/effects.ts} +139 -2
- package/dist/web/{js/engine.js → src/runtime/engine.ts} +45 -6
- package/dist/web/{js/office.js → src/runtime/office.ts} +136 -20
- package/dist/web/{js/ui.js → src/runtime/ui.ts} +11 -7
- package/dist/web/src/shared/assets.ts +4 -0
- package/dist/web/src/shared/navigation.ts +47 -0
- package/dist/web/src/styles/app-layout.css +19 -0
- package/dist/web/src/styles/office.css +268 -0
- package/dist/web/tsconfig.json +28 -0
- package/dist/web/vite.config.ts +93 -0
- package/package.json +11 -2
- package/dist/web/index-studio.html +0 -1644
- package/dist/web/index-v2-pixel.html +0 -1571
- /package/dist/web/{assets → dist}/botreview/char_0.png +0 -0
- /package/dist/web/{assets → dist}/botreview/char_1.png +0 -0
- /package/dist/web/{assets → dist}/botreview/char_2.png +0 -0
- /package/dist/web/{assets → dist}/botreview/coffee-machine.gif +0 -0
- /package/dist/web/{assets → dist}/botreview/server.gif +0 -0
- /package/dist/web/{assets → dist}/botreview/walls.png +0 -0
- /package/dist/web/{assets → dist}/star/desk-v3.webp +0 -0
- /package/dist/web/{assets → dist}/star/office_bg_small.webp +0 -0
- /package/dist/web/{assets → dist}/star/star-idle-v5.png +0 -0
- /package/dist/web/{assets → dist}/star/star-working-spritesheet-grid.webp +0 -0
- /package/dist/web/{js/state.js → src/runtime/state.ts} +0 -0
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
const studioStyles = `
|
|
4
|
+
:root {
|
|
5
|
+
--studio-bg: #08101d;
|
|
6
|
+
--studio-panel: rgba(11, 19, 34, 0.84);
|
|
7
|
+
--studio-card: rgba(17, 29, 52, 0.76);
|
|
8
|
+
--studio-hover: rgba(31, 48, 79, 0.82);
|
|
9
|
+
--studio-border: rgba(148, 163, 184, 0.16);
|
|
10
|
+
--studio-accent: #34d399;
|
|
11
|
+
--studio-red: #f87171;
|
|
12
|
+
--studio-orange: #fbbf24;
|
|
13
|
+
--studio-blue: #60a5fa;
|
|
14
|
+
--studio-purple: #a78bfa;
|
|
15
|
+
--studio-text: #e2e8f0;
|
|
16
|
+
--studio-dim: #94a3b8;
|
|
17
|
+
--studio-muted: #64748b;
|
|
18
|
+
--studio-shadow: 0 18px 48px rgba(0, 0, 0, 0.32);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
[data-theme="light"] {
|
|
22
|
+
--studio-bg: #eef4fb;
|
|
23
|
+
--studio-panel: rgba(255, 255, 255, 0.88);
|
|
24
|
+
--studio-card: rgba(248, 250, 252, 0.95);
|
|
25
|
+
--studio-hover: rgba(226, 232, 240, 0.95);
|
|
26
|
+
--studio-border: rgba(100, 116, 139, 0.18);
|
|
27
|
+
--studio-accent: #059669;
|
|
28
|
+
--studio-red: #dc2626;
|
|
29
|
+
--studio-orange: #d97706;
|
|
30
|
+
--studio-blue: #2563eb;
|
|
31
|
+
--studio-purple: #7c3aed;
|
|
32
|
+
--studio-text: #0f172a;
|
|
33
|
+
--studio-dim: #475569;
|
|
34
|
+
--studio-muted: #94a3b8;
|
|
35
|
+
--studio-shadow: 0 18px 48px rgba(15, 23, 42, 0.08);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
html, body, #root { width: 100%; height: 100%; }
|
|
39
|
+
body {
|
|
40
|
+
margin: 0;
|
|
41
|
+
overflow: hidden;
|
|
42
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
43
|
+
background:
|
|
44
|
+
radial-gradient(circle at top left, rgba(52, 211, 153, 0.08), transparent 32%),
|
|
45
|
+
radial-gradient(circle at top right, rgba(96, 165, 250, 0.08), transparent 30%),
|
|
46
|
+
var(--studio-bg);
|
|
47
|
+
color: var(--studio-text);
|
|
48
|
+
}
|
|
49
|
+
.studio-app {
|
|
50
|
+
display: grid;
|
|
51
|
+
grid-template-columns: 300px 1fr 360px;
|
|
52
|
+
height: 100%;
|
|
53
|
+
gap: 10px;
|
|
54
|
+
padding: 10px;
|
|
55
|
+
}
|
|
56
|
+
.studio-shell,
|
|
57
|
+
.studio-panel,
|
|
58
|
+
.studio-main,
|
|
59
|
+
.studio-header,
|
|
60
|
+
.studio-bar {
|
|
61
|
+
border: 1px solid var(--studio-border);
|
|
62
|
+
background: var(--studio-panel);
|
|
63
|
+
backdrop-filter: blur(18px);
|
|
64
|
+
box-shadow: var(--studio-shadow);
|
|
65
|
+
}
|
|
66
|
+
.studio-shell,
|
|
67
|
+
.studio-panel,
|
|
68
|
+
.studio-main { border-radius: 20px; overflow: hidden; }
|
|
69
|
+
.studio-sidebar { display: flex; flex-direction: column; }
|
|
70
|
+
.studio-section { padding: 16px; border-bottom: 1px solid var(--studio-border); }
|
|
71
|
+
.studio-section:last-child { border-bottom: none; }
|
|
72
|
+
.studio-section h3 {
|
|
73
|
+
margin: 0 0 10px;
|
|
74
|
+
font-size: 11px;
|
|
75
|
+
letter-spacing: 0.08em;
|
|
76
|
+
text-transform: uppercase;
|
|
77
|
+
color: var(--studio-dim);
|
|
78
|
+
}
|
|
79
|
+
.studio-input-row,
|
|
80
|
+
.studio-actions,
|
|
81
|
+
.studio-chip-row,
|
|
82
|
+
.studio-header-actions,
|
|
83
|
+
.studio-tabs { display: flex; gap: 8px; flex-wrap: wrap; }
|
|
84
|
+
.studio-input,
|
|
85
|
+
.studio-btn,
|
|
86
|
+
.studio-chip {
|
|
87
|
+
border-radius: 12px;
|
|
88
|
+
border: 1px solid var(--studio-border);
|
|
89
|
+
font: inherit;
|
|
90
|
+
}
|
|
91
|
+
.studio-input {
|
|
92
|
+
width: 100%;
|
|
93
|
+
padding: 10px 12px;
|
|
94
|
+
background: var(--studio-card);
|
|
95
|
+
color: var(--studio-text);
|
|
96
|
+
}
|
|
97
|
+
.studio-btn,
|
|
98
|
+
.studio-chip,
|
|
99
|
+
.studio-tab,
|
|
100
|
+
.snapshot-action {
|
|
101
|
+
cursor: pointer;
|
|
102
|
+
transition: 0.2s ease;
|
|
103
|
+
}
|
|
104
|
+
.studio-btn,
|
|
105
|
+
.studio-chip {
|
|
106
|
+
padding: 9px 14px;
|
|
107
|
+
background: var(--studio-card);
|
|
108
|
+
color: var(--studio-text);
|
|
109
|
+
}
|
|
110
|
+
.studio-btn:hover,
|
|
111
|
+
.studio-chip:hover,
|
|
112
|
+
.studio-list-item:hover,
|
|
113
|
+
.studio-tab:hover,
|
|
114
|
+
.snapshot-action:hover { background: var(--studio-hover); }
|
|
115
|
+
.studio-btn.primary {
|
|
116
|
+
background: color-mix(in srgb, var(--studio-accent) 22%, var(--studio-card));
|
|
117
|
+
border-color: color-mix(in srgb, var(--studio-accent) 42%, var(--studio-border));
|
|
118
|
+
}
|
|
119
|
+
.studio-stat-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
|
|
120
|
+
.studio-stat {
|
|
121
|
+
padding: 12px;
|
|
122
|
+
border-radius: 14px;
|
|
123
|
+
border: 1px solid var(--studio-border);
|
|
124
|
+
background: var(--studio-card);
|
|
125
|
+
}
|
|
126
|
+
.studio-stat-label { font-size: 10px; text-transform: uppercase; color: var(--studio-muted); }
|
|
127
|
+
.studio-stat-value { margin-top: 6px; font-size: 22px; font-weight: 700; color: var(--studio-accent); }
|
|
128
|
+
.studio-main { display: flex; flex-direction: column; }
|
|
129
|
+
.studio-header {
|
|
130
|
+
display: flex;
|
|
131
|
+
align-items: center;
|
|
132
|
+
justify-content: space-between;
|
|
133
|
+
gap: 12px;
|
|
134
|
+
margin: 10px;
|
|
135
|
+
padding: 10px;
|
|
136
|
+
border-radius: 18px;
|
|
137
|
+
}
|
|
138
|
+
.studio-tab {
|
|
139
|
+
padding: 8px 12px;
|
|
140
|
+
border-radius: 999px;
|
|
141
|
+
border: 1px solid var(--studio-border);
|
|
142
|
+
background: var(--studio-card);
|
|
143
|
+
color: var(--studio-dim);
|
|
144
|
+
font-size: 12px;
|
|
145
|
+
}
|
|
146
|
+
.studio-tab.active {
|
|
147
|
+
color: var(--studio-text);
|
|
148
|
+
border-color: color-mix(in srgb, var(--studio-accent) 38%, var(--studio-border));
|
|
149
|
+
background: color-mix(in srgb, var(--studio-accent) 14%, var(--studio-card));
|
|
150
|
+
}
|
|
151
|
+
.studio-graph-wrap {
|
|
152
|
+
position: relative;
|
|
153
|
+
flex: 1;
|
|
154
|
+
margin: 0 10px 10px;
|
|
155
|
+
border-radius: 18px;
|
|
156
|
+
overflow: hidden;
|
|
157
|
+
border: 1px solid var(--studio-border);
|
|
158
|
+
background:
|
|
159
|
+
radial-gradient(circle at top, rgba(52, 211, 153, 0.08), transparent 42%),
|
|
160
|
+
linear-gradient(180deg, rgba(15, 23, 42, 0.12), transparent),
|
|
161
|
+
var(--studio-card);
|
|
162
|
+
}
|
|
163
|
+
.studio-welcome,
|
|
164
|
+
.studio-loading,
|
|
165
|
+
.studio-report-view { position: absolute; inset: 0; }
|
|
166
|
+
.studio-welcome,
|
|
167
|
+
.studio-loading {
|
|
168
|
+
display: flex;
|
|
169
|
+
flex-direction: column;
|
|
170
|
+
align-items: center;
|
|
171
|
+
justify-content: center;
|
|
172
|
+
gap: 12px;
|
|
173
|
+
text-align: center;
|
|
174
|
+
padding: 24px;
|
|
175
|
+
}
|
|
176
|
+
.studio-loading.hidden,
|
|
177
|
+
.studio-welcome.hidden,
|
|
178
|
+
.studio-report-view.hidden,
|
|
179
|
+
.studio-empty.hidden { display: none; }
|
|
180
|
+
.studio-hero { font-size: 42px; }
|
|
181
|
+
.studio-empty {
|
|
182
|
+
position: absolute;
|
|
183
|
+
left: 50%;
|
|
184
|
+
top: 50%;
|
|
185
|
+
transform: translate(-50%, -50%);
|
|
186
|
+
padding: 12px 16px;
|
|
187
|
+
border-radius: 999px;
|
|
188
|
+
border: 1px dashed var(--studio-border);
|
|
189
|
+
background: rgba(15, 23, 42, 0.24);
|
|
190
|
+
color: var(--studio-dim);
|
|
191
|
+
}
|
|
192
|
+
.studio-graph-canvas { width: 100%; height: 100%; }
|
|
193
|
+
.studio-report-view {
|
|
194
|
+
overflow: auto;
|
|
195
|
+
padding: 22px 24px 28px;
|
|
196
|
+
background: color-mix(in srgb, var(--studio-bg) 86%, transparent);
|
|
197
|
+
}
|
|
198
|
+
.studio-report-toolbar {
|
|
199
|
+
display: flex;
|
|
200
|
+
align-items: center;
|
|
201
|
+
justify-content: space-between;
|
|
202
|
+
gap: 10px;
|
|
203
|
+
margin-bottom: 18px;
|
|
204
|
+
}
|
|
205
|
+
.studio-chip.active {
|
|
206
|
+
color: var(--studio-text);
|
|
207
|
+
border-color: color-mix(in srgb, var(--studio-accent) 36%, var(--studio-border));
|
|
208
|
+
}
|
|
209
|
+
.studio-bar {
|
|
210
|
+
display: flex;
|
|
211
|
+
gap: 8px;
|
|
212
|
+
padding: 10px;
|
|
213
|
+
margin: 0 10px 10px;
|
|
214
|
+
border-radius: 18px;
|
|
215
|
+
overflow-x: auto;
|
|
216
|
+
}
|
|
217
|
+
.agent-pill {
|
|
218
|
+
display: inline-flex;
|
|
219
|
+
align-items: center;
|
|
220
|
+
gap: 8px;
|
|
221
|
+
min-width: 120px;
|
|
222
|
+
padding: 8px 12px;
|
|
223
|
+
border-radius: 999px;
|
|
224
|
+
background: var(--studio-card);
|
|
225
|
+
border: 1px solid var(--studio-border);
|
|
226
|
+
font-size: 12px;
|
|
227
|
+
}
|
|
228
|
+
.agent-status-dot {
|
|
229
|
+
width: 9px;
|
|
230
|
+
height: 9px;
|
|
231
|
+
border-radius: 50%;
|
|
232
|
+
background: var(--studio-muted);
|
|
233
|
+
}
|
|
234
|
+
.agent-status-dot.working,
|
|
235
|
+
.agent-status-dot.testing { background: var(--studio-accent); }
|
|
236
|
+
.agent-status-dot.error,
|
|
237
|
+
.agent-status-dot.failed { background: var(--studio-red); }
|
|
238
|
+
.agent-status-dot.thinking { background: var(--studio-purple); }
|
|
239
|
+
.studio-panel { display: flex; flex-direction: column; }
|
|
240
|
+
.studio-panel-head {
|
|
241
|
+
display: flex;
|
|
242
|
+
align-items: center;
|
|
243
|
+
justify-content: space-between;
|
|
244
|
+
padding: 16px;
|
|
245
|
+
border-bottom: 1px solid var(--studio-border);
|
|
246
|
+
}
|
|
247
|
+
.studio-panel-body { flex: 1; overflow: auto; padding: 16px; }
|
|
248
|
+
.studio-list,
|
|
249
|
+
.snapshot-list { display: flex; flex-direction: column; gap: 8px; }
|
|
250
|
+
.studio-list-item,
|
|
251
|
+
.snapshot-item {
|
|
252
|
+
padding: 12px;
|
|
253
|
+
border-radius: 14px;
|
|
254
|
+
border: 1px solid var(--studio-border);
|
|
255
|
+
background: var(--studio-card);
|
|
256
|
+
}
|
|
257
|
+
.studio-list-item.active {
|
|
258
|
+
border-color: color-mix(in srgb, var(--studio-accent) 40%, var(--studio-border));
|
|
259
|
+
}
|
|
260
|
+
.snapshot-actions { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 10px; }
|
|
261
|
+
.snapshot-action {
|
|
262
|
+
padding: 5px 9px;
|
|
263
|
+
border-radius: 999px;
|
|
264
|
+
border: 1px solid var(--studio-border);
|
|
265
|
+
background: transparent;
|
|
266
|
+
color: var(--studio-dim);
|
|
267
|
+
font-size: 11px;
|
|
268
|
+
}
|
|
269
|
+
.snapshot-tags { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 8px; }
|
|
270
|
+
.snapshot-tag {
|
|
271
|
+
padding: 3px 8px;
|
|
272
|
+
border-radius: 999px;
|
|
273
|
+
background: color-mix(in srgb, var(--studio-accent) 14%, transparent);
|
|
274
|
+
color: var(--studio-accent);
|
|
275
|
+
font-size: 11px;
|
|
276
|
+
}
|
|
277
|
+
.studio-tooltip {
|
|
278
|
+
position: fixed;
|
|
279
|
+
z-index: 80;
|
|
280
|
+
display: none;
|
|
281
|
+
padding: 8px 10px;
|
|
282
|
+
border-radius: 12px;
|
|
283
|
+
border: 1px solid var(--studio-border);
|
|
284
|
+
background: rgba(10, 15, 26, 0.94);
|
|
285
|
+
color: #e2e8f0;
|
|
286
|
+
font-size: 12px;
|
|
287
|
+
pointer-events: none;
|
|
288
|
+
}
|
|
289
|
+
.studio-tooltip.visible { display: block; }
|
|
290
|
+
.studio-panel-body h1,
|
|
291
|
+
.studio-panel-body h2,
|
|
292
|
+
.studio-panel-body h3 { margin: 0 0 12px; }
|
|
293
|
+
.studio-panel-body p,
|
|
294
|
+
.studio-panel-body li,
|
|
295
|
+
.studio-panel-body code,
|
|
296
|
+
.studio-panel-body pre { color: var(--studio-dim); line-height: 1.7; }
|
|
297
|
+
.studio-panel-body pre,
|
|
298
|
+
.studio-report-block {
|
|
299
|
+
border-radius: 14px;
|
|
300
|
+
border: 1px solid var(--studio-border);
|
|
301
|
+
background: var(--studio-card);
|
|
302
|
+
padding: 12px;
|
|
303
|
+
overflow: auto;
|
|
304
|
+
}
|
|
305
|
+
@media (max-width: 1280px) {
|
|
306
|
+
.studio-app { grid-template-columns: 280px 1fr 320px; }
|
|
307
|
+
}
|
|
308
|
+
@media (max-width: 1080px) {
|
|
309
|
+
.studio-app { grid-template-columns: 1fr; }
|
|
310
|
+
}
|
|
311
|
+
`;
|
|
312
|
+
|
|
313
|
+
export default function StudioPage() {
|
|
314
|
+
useEffect(() => {
|
|
315
|
+
let dispose: (() => void) | undefined;
|
|
316
|
+
let cancelled = false;
|
|
317
|
+
|
|
318
|
+
void import('@features/studio/runtime')
|
|
319
|
+
.then(({ mountStudioRuntime }) => mountStudioRuntime())
|
|
320
|
+
.then((cleanup) => {
|
|
321
|
+
if (cancelled) {
|
|
322
|
+
cleanup();
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
dispose = cleanup;
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
return () => {
|
|
329
|
+
cancelled = true;
|
|
330
|
+
dispose?.();
|
|
331
|
+
};
|
|
332
|
+
}, []);
|
|
333
|
+
|
|
334
|
+
return (
|
|
335
|
+
<>
|
|
336
|
+
<style>{studioStyles}</style>
|
|
337
|
+
<div className="studio-app">
|
|
338
|
+
<aside className="studio-shell studio-sidebar">
|
|
339
|
+
<section className="studio-section">
|
|
340
|
+
<h3>Scan Target</h3>
|
|
341
|
+
<div className="studio-input-row">
|
|
342
|
+
<input id="scan-input" className="studio-input" placeholder="./backend or github.com/owner/repo" />
|
|
343
|
+
</div>
|
|
344
|
+
<div className="studio-actions" style={{ marginTop: 10 }}>
|
|
345
|
+
<button id="scan-btn" className="studio-btn primary" type="button">Start Scan</button>
|
|
346
|
+
</div>
|
|
347
|
+
</section>
|
|
348
|
+
<section className="studio-section" id="stats-section">
|
|
349
|
+
<h3>Project Summary</h3>
|
|
350
|
+
<div className="studio-stat-grid">
|
|
351
|
+
<div className="studio-stat"><div className="studio-stat-label">Modules</div><div className="studio-stat-value" id="stat-modules">0</div></div>
|
|
352
|
+
<div className="studio-stat"><div className="studio-stat-label">APIs</div><div className="studio-stat-value" id="stat-apis">0</div></div>
|
|
353
|
+
<div className="studio-stat"><div className="studio-stat-label">Models</div><div className="studio-stat-value" id="stat-models">0</div></div>
|
|
354
|
+
<div className="studio-stat"><div className="studio-stat-label">Risks</div><div className="studio-stat-value" id="stat-risks">0</div></div>
|
|
355
|
+
</div>
|
|
356
|
+
</section>
|
|
357
|
+
<section className="studio-section">
|
|
358
|
+
<h3>Node Types</h3>
|
|
359
|
+
<div id="node-type-list" className="studio-list" />
|
|
360
|
+
</section>
|
|
361
|
+
<section className="studio-section">
|
|
362
|
+
<h3>Snapshots</h3>
|
|
363
|
+
<input id="snapshot-search" className="studio-input" placeholder="Search snapshots" />
|
|
364
|
+
<div id="snapshot-tag-filters" className="studio-chip-row" style={{ marginTop: 10 }} />
|
|
365
|
+
<div id="snapshot-list" className="snapshot-list" style={{ marginTop: 10 }} />
|
|
366
|
+
</section>
|
|
367
|
+
<section className="studio-section" style={{ flex: 1, overflow: 'auto' }}>
|
|
368
|
+
<h3>Risks</h3>
|
|
369
|
+
<div id="risk-list" className="studio-list" />
|
|
370
|
+
</section>
|
|
371
|
+
</aside>
|
|
372
|
+
|
|
373
|
+
<main className="studio-main">
|
|
374
|
+
<div className="studio-header">
|
|
375
|
+
<div className="studio-tabs">
|
|
376
|
+
<button className="studio-tab" data-view="office" type="button">3D Office</button>
|
|
377
|
+
<button className="studio-tab active" data-view="graph" type="button">Knowledge Graph</button>
|
|
378
|
+
<button className="studio-tab" data-perspective="developer" type="button">Developer</button>
|
|
379
|
+
<button className="studio-tab" data-perspective="architect" type="button">Architect</button>
|
|
380
|
+
<button className="studio-tab" data-perspective="tester" type="button">Tester</button>
|
|
381
|
+
<button className="studio-tab" data-perspective="product" type="button">Product</button>
|
|
382
|
+
<button className="studio-tab" data-perspective="student" type="button">Student</button>
|
|
383
|
+
<button className="studio-tab" data-perspective="executive" type="button">Executive</button>
|
|
384
|
+
</div>
|
|
385
|
+
<div className="studio-header-actions">
|
|
386
|
+
<button id="focus-btn" className="studio-btn" type="button">Focus Node</button>
|
|
387
|
+
<button id="theme-btn" className="studio-btn" type="button">Theme</button>
|
|
388
|
+
<button id="panel-btn" className="studio-btn" type="button">Toggle Panel</button>
|
|
389
|
+
</div>
|
|
390
|
+
</div>
|
|
391
|
+
|
|
392
|
+
<div className="studio-graph-wrap">
|
|
393
|
+
<div id="welcome" className="studio-welcome">
|
|
394
|
+
<div className="studio-hero">OpenCroc</div>
|
|
395
|
+
<h1>Studio Graph Workspace</h1>
|
|
396
|
+
<p>Scan a codebase to populate the knowledge graph, risk list, and perspective reports.</p>
|
|
397
|
+
<div className="studio-input-row" style={{ maxWidth: 560 }}>
|
|
398
|
+
<input id="welcome-input" className="studio-input" placeholder="./backend or github.com/owner/repo" />
|
|
399
|
+
<button id="welcome-scan-btn" className="studio-btn primary" type="button">Analyze</button>
|
|
400
|
+
</div>
|
|
401
|
+
</div>
|
|
402
|
+
<div id="loading" className="studio-loading hidden">
|
|
403
|
+
<div className="studio-hero">Scanning</div>
|
|
404
|
+
<div id="loading-text">Preparing analysis...</div>
|
|
405
|
+
<div id="loading-detail" style={{ color: 'var(--studio-dim)' }} />
|
|
406
|
+
</div>
|
|
407
|
+
<svg id="graph-canvas" className="studio-graph-canvas" />
|
|
408
|
+
<div id="graph-empty" className="studio-empty hidden">No graph yet. Run a scan to begin.</div>
|
|
409
|
+
<div id="report-view" className="studio-report-view hidden">
|
|
410
|
+
<div id="report-toolbar" className="studio-report-toolbar">
|
|
411
|
+
<div className="studio-chip-row">
|
|
412
|
+
<button className="studio-chip active" data-mode="markdown" type="button">Markdown</button>
|
|
413
|
+
<button className="studio-chip" data-mode="mermaid" type="button">Mermaid</button>
|
|
414
|
+
<button className="studio-chip" data-mode="raw" type="button">Raw</button>
|
|
415
|
+
</div>
|
|
416
|
+
<button id="copy-report-btn" className="studio-btn" type="button">Copy</button>
|
|
417
|
+
</div>
|
|
418
|
+
<div id="report-content" />
|
|
419
|
+
</div>
|
|
420
|
+
</div>
|
|
421
|
+
|
|
422
|
+
<div className="studio-bar" id="agent-bar">
|
|
423
|
+
<div className="agent-pill"><span className="agent-status-dot idle" id="agent-parser" /><span>Parser</span></div>
|
|
424
|
+
<div className="agent-pill"><span className="agent-status-dot idle" id="agent-analyzer" /><span>Analyzer</span></div>
|
|
425
|
+
<div className="agent-pill"><span className="agent-status-dot idle" id="agent-planner" /><span>Planner</span></div>
|
|
426
|
+
<div className="agent-pill"><span className="agent-status-dot idle" id="agent-tester" /><span>Tester</span></div>
|
|
427
|
+
<div className="agent-pill"><span className="agent-status-dot idle" id="agent-healer" /><span>Healer</span></div>
|
|
428
|
+
<div className="agent-pill"><span className="agent-status-dot idle" id="agent-reporter" /><span>Reporter</span></div>
|
|
429
|
+
</div>
|
|
430
|
+
</main>
|
|
431
|
+
|
|
432
|
+
<aside className="studio-panel" id="panel">
|
|
433
|
+
<div className="studio-panel-head">
|
|
434
|
+
<h2 id="panel-title" style={{ margin: 0 }}>Details</h2>
|
|
435
|
+
<button id="panel-close-btn" className="studio-btn" type="button">Close</button>
|
|
436
|
+
</div>
|
|
437
|
+
<div id="panel-body" className="studio-panel-body">
|
|
438
|
+
<p>Select a node, risk, or perspective report to inspect more details.</p>
|
|
439
|
+
</div>
|
|
440
|
+
</aside>
|
|
441
|
+
</div>
|
|
442
|
+
|
|
443
|
+
<div id="tooltip" className="studio-tooltip" />
|
|
444
|
+
</>
|
|
445
|
+
);
|
|
446
|
+
}
|