opencroc 1.8.0 → 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.
Files changed (71) hide show
  1. package/dist/cli/index.js +1107 -49
  2. package/dist/cli/index.js.map +1 -1
  3. package/dist/index.d.ts +128 -1
  4. package/dist/index.js +548 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/web/dist/assets/main-Ccg3eDNK.js +1 -0
  7. package/dist/web/dist/assets/office-runtime-B3iNctxE.css +1 -0
  8. package/dist/web/dist/assets/office-runtime-BsCh82Pj.js +183 -0
  9. package/dist/web/dist/assets/pixel-page-3BYGm7dH.js +470 -0
  10. package/dist/web/dist/assets/react-vendor-C8RhVn0h.js +49 -0
  11. package/dist/web/dist/assets/studio-page-BInoyoV2.css +1 -0
  12. package/dist/web/dist/assets/studio-page-o3SCvE_v.js +351 -0
  13. package/dist/web/dist/assets/three-addons-BdrPp04O.js +470 -0
  14. package/dist/web/dist/assets/three-core-CsxM1PCY.js +4057 -0
  15. package/dist/web/dist/index.html +15 -0
  16. package/dist/web/index.html +11 -572
  17. package/dist/web/public/botreview/char_0.png +0 -0
  18. package/dist/web/public/botreview/char_1.png +0 -0
  19. package/dist/web/public/botreview/char_2.png +0 -0
  20. package/dist/web/public/botreview/coffee-machine.gif +0 -0
  21. package/dist/web/public/botreview/server.gif +0 -0
  22. package/dist/web/public/botreview/walls.png +0 -0
  23. package/dist/web/public/star/desk-v3.webp +0 -0
  24. package/dist/web/public/star/office_bg_small.webp +0 -0
  25. package/dist/web/public/star/star-idle-v5.png +0 -0
  26. package/dist/web/public/star/star-working-spritesheet-grid.webp +0 -0
  27. package/dist/web/src/app/AppLayout.tsx +34 -0
  28. package/dist/web/src/app/AppRouter.tsx +46 -0
  29. package/dist/web/src/app/bootstrap.tsx +22 -0
  30. package/dist/web/src/app/routes.tsx +52 -0
  31. package/dist/web/src/features/office/runtime/index.ts +1 -0
  32. package/dist/web/src/features/office/runtime/mount.ts +809 -0
  33. package/dist/web/src/features/pixel/runtime/index.ts +1 -0
  34. package/dist/web/src/features/pixel/runtime/mount.ts +728 -0
  35. package/dist/web/src/features/studio/runtime/index.ts +1 -0
  36. package/dist/web/src/features/studio/runtime/mount.ts +664 -0
  37. package/dist/web/src/features/three/engine/index.ts +1 -0
  38. package/dist/web/src/main.tsx +7 -0
  39. package/dist/web/src/pages/office/index.ts +1 -0
  40. package/dist/web/src/pages/office/page.tsx +283 -0
  41. package/dist/web/src/pages/pixel/index.ts +1 -0
  42. package/dist/web/src/pages/pixel/page.tsx +564 -0
  43. package/dist/web/src/pages/studio/index.ts +1 -0
  44. package/dist/web/src/pages/studio/page.tsx +446 -0
  45. package/dist/web/{js/agents.js → src/runtime/agents.ts} +304 -31
  46. package/dist/web/{js/camera.js → src/runtime/camera.ts} +12 -5
  47. package/dist/web/{js/dataviz.js → src/runtime/dataviz.ts} +38 -14
  48. package/dist/web/{js/effects.js → src/runtime/effects.ts} +139 -2
  49. package/dist/web/{js/engine.js → src/runtime/engine.ts} +45 -6
  50. package/dist/web/{js/office.js → src/runtime/office.ts} +136 -20
  51. package/dist/web/{js/ui.js → src/runtime/ui.ts} +11 -7
  52. package/dist/web/src/shared/assets.ts +4 -0
  53. package/dist/web/src/shared/navigation.ts +47 -0
  54. package/dist/web/src/styles/app-layout.css +19 -0
  55. package/dist/web/src/styles/office.css +268 -0
  56. package/dist/web/tsconfig.json +28 -0
  57. package/dist/web/vite.config.ts +93 -0
  58. package/package.json +11 -2
  59. package/dist/web/index-studio.html +0 -804
  60. package/dist/web/index-v2-pixel.html +0 -1571
  61. /package/dist/web/{assets → dist}/botreview/char_0.png +0 -0
  62. /package/dist/web/{assets → dist}/botreview/char_1.png +0 -0
  63. /package/dist/web/{assets → dist}/botreview/char_2.png +0 -0
  64. /package/dist/web/{assets → dist}/botreview/coffee-machine.gif +0 -0
  65. /package/dist/web/{assets → dist}/botreview/server.gif +0 -0
  66. /package/dist/web/{assets → dist}/botreview/walls.png +0 -0
  67. /package/dist/web/{assets → dist}/star/desk-v3.webp +0 -0
  68. /package/dist/web/{assets → dist}/star/office_bg_small.webp +0 -0
  69. /package/dist/web/{assets → dist}/star/star-idle-v5.png +0 -0
  70. /package/dist/web/{assets → dist}/star/star-working-spritesheet-grid.webp +0 -0
  71. /package/dist/web/{js/state.js → src/runtime/state.ts} +0 -0
@@ -0,0 +1,351 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/office-runtime-BsCh82Pj.js","assets/react-vendor-C8RhVn0h.js","assets/three-core-CsxM1PCY.js","assets/three-addons-BdrPp04O.js","assets/office-runtime-B3iNctxE.css","assets/pixel-page-3BYGm7dH.js"])))=>i.map(i=>d[i]);
2
+ import{r as S,j as s}from"./react-vendor-C8RhVn0h.js";const I="opencroc:route-change",kt={"/index.html":"/","/index-studio.html":"/studio","/index-v2-pixel.html":"/pixel"};function H(a){if(!a)return"/";const[n]=a.split("?"),d=n.startsWith("/")?n:`/${n}`,g=d.length>1&&d.endsWith("/")?d.slice(0,-1):d;return kt[g]||g}function it(){return H(window.location.pathname)}function ot(a,n){const d=H(a),g=it();if(d!==g){const y=n!=null&&n.replace?"replaceState":"pushState";window.history[y]({},"",d)}window.dispatchEvent(new Event(I))}function St(a){return window.addEventListener("popstate",a),window.addEventListener(I,a),()=>{window.removeEventListener("popstate",a),window.removeEventListener(I,a)}}function $t({route:a,children:n}){return S.useEffect(()=>(document.body.dataset.appRoute=a.id,document.body.dataset.routeVariant=a.variant,document.documentElement.dataset.appRoute=a.id,document.documentElement.dataset.routeVariant=a.variant,()=>{delete document.body.dataset.appRoute,delete document.body.dataset.routeVariant,delete document.documentElement.dataset.appRoute,delete document.documentElement.dataset.routeVariant}),[a.id,a.variant]),s.jsx("div",{className:"app-layout","data-route-id":a.id,"data-route-variant":a.variant,"aria-label":a.description,children:n})}const Et="modulepreload",Tt=function(a){return"/dist/"+a},et={},M=function(n,d,g){let y=Promise.resolve();if(d&&d.length>0){document.getElementsByTagName("link");const m=document.querySelector("meta[property=csp-nonce]"),x=(m==null?void 0:m.nonce)||(m==null?void 0:m.getAttribute("nonce"));y=Promise.allSettled(d.map(h=>{if(h=Tt(h),h in et)return;et[h]=!0;const f=h.endsWith(".css"),$=f?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${h}"]${$}`))return;const b=document.createElement("link");if(b.rel=f?"stylesheet":Et,f||(b.as="script"),b.crossOrigin="",b.href=h,x&&b.setAttribute("nonce",x),document.head.appendChild(b),f)return new Promise((w,P)=>{b.addEventListener("load",w),b.addEventListener("error",()=>P(new Error(`Unable to preload CSS for ${h}`)))})}))}function T(m){const x=new Event("vite:preloadError",{cancelable:!0});if(x.payload=m,window.dispatchEvent(x),!x.defaultPrevented)throw m}return y.then(m=>{for(const x of m||[])x.status==="rejected"&&T(x.reason);return n().catch(T)})},Lt=S.lazy(()=>M(()=>import("./office-runtime-BsCh82Pj.js"),__vite__mapDeps([0,1,2,3,4]))),Pt=S.lazy(()=>M(()=>Promise.resolve().then(()=>zt),void 0)),Rt=S.lazy(()=>M(()=>import("./pixel-page-3BYGm7dH.js"),__vite__mapDeps([5,1]))),st=[{id:"office",path:"/",title:"OpenCroc Studio",navLabel:"3D Office",description:"OpenCroc Studio office runtime view",variant:"office",component:Lt},{id:"studio",path:"/studio",title:"OpenCroc Studio Graph",navLabel:"Knowledge Graph",description:"OpenCroc Studio knowledge graph view",variant:"graph",component:Pt},{id:"pixel",path:"/pixel",title:"OpenCroc Studio Pixel",navLabel:"Pixel View",description:"OpenCroc Studio pixel operations view",variant:"pixel",component:Rt}];function _t(a){const n=H(a);return st.find(d=>d.path===n)||st[0]}function Ct(){return s.jsx("div",{style:{width:"100%",height:"100%",display:"grid",placeItems:"center",background:"#050510",color:"#f1f5f9",fontFamily:"system-ui, sans-serif"},children:"Loading OpenCroc Studio..."})}function Dt(){const a=S.useSyncExternalStore(St,it,()=>"/"),n=_t(a),d=n.component;return S.useEffect(()=>{document.title=n.title,n.path!==a&&ot(n.path,{replace:!0})},[a,n.path,n.title]),s.jsx(S.Suspense,{fallback:s.jsx(Ct,{}),children:s.jsx($t,{route:n,children:s.jsx(d,{})})})}const At=`
3
+ :root {
4
+ --studio-bg: #08101d;
5
+ --studio-panel: rgba(11, 19, 34, 0.84);
6
+ --studio-card: rgba(17, 29, 52, 0.76);
7
+ --studio-hover: rgba(31, 48, 79, 0.82);
8
+ --studio-border: rgba(148, 163, 184, 0.16);
9
+ --studio-accent: #34d399;
10
+ --studio-red: #f87171;
11
+ --studio-orange: #fbbf24;
12
+ --studio-blue: #60a5fa;
13
+ --studio-purple: #a78bfa;
14
+ --studio-text: #e2e8f0;
15
+ --studio-dim: #94a3b8;
16
+ --studio-muted: #64748b;
17
+ --studio-shadow: 0 18px 48px rgba(0, 0, 0, 0.32);
18
+ }
19
+
20
+ [data-theme="light"] {
21
+ --studio-bg: #eef4fb;
22
+ --studio-panel: rgba(255, 255, 255, 0.88);
23
+ --studio-card: rgba(248, 250, 252, 0.95);
24
+ --studio-hover: rgba(226, 232, 240, 0.95);
25
+ --studio-border: rgba(100, 116, 139, 0.18);
26
+ --studio-accent: #059669;
27
+ --studio-red: #dc2626;
28
+ --studio-orange: #d97706;
29
+ --studio-blue: #2563eb;
30
+ --studio-purple: #7c3aed;
31
+ --studio-text: #0f172a;
32
+ --studio-dim: #475569;
33
+ --studio-muted: #94a3b8;
34
+ --studio-shadow: 0 18px 48px rgba(15, 23, 42, 0.08);
35
+ }
36
+
37
+ html, body, #root { width: 100%; height: 100%; }
38
+ body {
39
+ margin: 0;
40
+ overflow: hidden;
41
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
42
+ background:
43
+ radial-gradient(circle at top left, rgba(52, 211, 153, 0.08), transparent 32%),
44
+ radial-gradient(circle at top right, rgba(96, 165, 250, 0.08), transparent 30%),
45
+ var(--studio-bg);
46
+ color: var(--studio-text);
47
+ }
48
+ .studio-app {
49
+ display: grid;
50
+ grid-template-columns: 300px 1fr 360px;
51
+ height: 100%;
52
+ gap: 10px;
53
+ padding: 10px;
54
+ }
55
+ .studio-shell,
56
+ .studio-panel,
57
+ .studio-main,
58
+ .studio-header,
59
+ .studio-bar {
60
+ border: 1px solid var(--studio-border);
61
+ background: var(--studio-panel);
62
+ backdrop-filter: blur(18px);
63
+ box-shadow: var(--studio-shadow);
64
+ }
65
+ .studio-shell,
66
+ .studio-panel,
67
+ .studio-main { border-radius: 20px; overflow: hidden; }
68
+ .studio-sidebar { display: flex; flex-direction: column; }
69
+ .studio-section { padding: 16px; border-bottom: 1px solid var(--studio-border); }
70
+ .studio-section:last-child { border-bottom: none; }
71
+ .studio-section h3 {
72
+ margin: 0 0 10px;
73
+ font-size: 11px;
74
+ letter-spacing: 0.08em;
75
+ text-transform: uppercase;
76
+ color: var(--studio-dim);
77
+ }
78
+ .studio-input-row,
79
+ .studio-actions,
80
+ .studio-chip-row,
81
+ .studio-header-actions,
82
+ .studio-tabs { display: flex; gap: 8px; flex-wrap: wrap; }
83
+ .studio-input,
84
+ .studio-btn,
85
+ .studio-chip {
86
+ border-radius: 12px;
87
+ border: 1px solid var(--studio-border);
88
+ font: inherit;
89
+ }
90
+ .studio-input {
91
+ width: 100%;
92
+ padding: 10px 12px;
93
+ background: var(--studio-card);
94
+ color: var(--studio-text);
95
+ }
96
+ .studio-btn,
97
+ .studio-chip,
98
+ .studio-tab,
99
+ .snapshot-action {
100
+ cursor: pointer;
101
+ transition: 0.2s ease;
102
+ }
103
+ .studio-btn,
104
+ .studio-chip {
105
+ padding: 9px 14px;
106
+ background: var(--studio-card);
107
+ color: var(--studio-text);
108
+ }
109
+ .studio-btn:hover,
110
+ .studio-chip:hover,
111
+ .studio-list-item:hover,
112
+ .studio-tab:hover,
113
+ .snapshot-action:hover { background: var(--studio-hover); }
114
+ .studio-btn.primary {
115
+ background: color-mix(in srgb, var(--studio-accent) 22%, var(--studio-card));
116
+ border-color: color-mix(in srgb, var(--studio-accent) 42%, var(--studio-border));
117
+ }
118
+ .studio-stat-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
119
+ .studio-stat {
120
+ padding: 12px;
121
+ border-radius: 14px;
122
+ border: 1px solid var(--studio-border);
123
+ background: var(--studio-card);
124
+ }
125
+ .studio-stat-label { font-size: 10px; text-transform: uppercase; color: var(--studio-muted); }
126
+ .studio-stat-value { margin-top: 6px; font-size: 22px; font-weight: 700; color: var(--studio-accent); }
127
+ .studio-main { display: flex; flex-direction: column; }
128
+ .studio-header {
129
+ display: flex;
130
+ align-items: center;
131
+ justify-content: space-between;
132
+ gap: 12px;
133
+ margin: 10px;
134
+ padding: 10px;
135
+ border-radius: 18px;
136
+ }
137
+ .studio-tab {
138
+ padding: 8px 12px;
139
+ border-radius: 999px;
140
+ border: 1px solid var(--studio-border);
141
+ background: var(--studio-card);
142
+ color: var(--studio-dim);
143
+ font-size: 12px;
144
+ }
145
+ .studio-tab.active {
146
+ color: var(--studio-text);
147
+ border-color: color-mix(in srgb, var(--studio-accent) 38%, var(--studio-border));
148
+ background: color-mix(in srgb, var(--studio-accent) 14%, var(--studio-card));
149
+ }
150
+ .studio-graph-wrap {
151
+ position: relative;
152
+ flex: 1;
153
+ margin: 0 10px 10px;
154
+ border-radius: 18px;
155
+ overflow: hidden;
156
+ border: 1px solid var(--studio-border);
157
+ background:
158
+ radial-gradient(circle at top, rgba(52, 211, 153, 0.08), transparent 42%),
159
+ linear-gradient(180deg, rgba(15, 23, 42, 0.12), transparent),
160
+ var(--studio-card);
161
+ }
162
+ .studio-welcome,
163
+ .studio-loading,
164
+ .studio-report-view { position: absolute; inset: 0; }
165
+ .studio-welcome,
166
+ .studio-loading {
167
+ display: flex;
168
+ flex-direction: column;
169
+ align-items: center;
170
+ justify-content: center;
171
+ gap: 12px;
172
+ text-align: center;
173
+ padding: 24px;
174
+ }
175
+ .studio-loading.hidden,
176
+ .studio-welcome.hidden,
177
+ .studio-report-view.hidden,
178
+ .studio-empty.hidden { display: none; }
179
+ .studio-hero { font-size: 42px; }
180
+ .studio-empty {
181
+ position: absolute;
182
+ left: 50%;
183
+ top: 50%;
184
+ transform: translate(-50%, -50%);
185
+ padding: 12px 16px;
186
+ border-radius: 999px;
187
+ border: 1px dashed var(--studio-border);
188
+ background: rgba(15, 23, 42, 0.24);
189
+ color: var(--studio-dim);
190
+ }
191
+ .studio-graph-canvas { width: 100%; height: 100%; }
192
+ .studio-report-view {
193
+ overflow: auto;
194
+ padding: 22px 24px 28px;
195
+ background: color-mix(in srgb, var(--studio-bg) 86%, transparent);
196
+ }
197
+ .studio-report-toolbar {
198
+ display: flex;
199
+ align-items: center;
200
+ justify-content: space-between;
201
+ gap: 10px;
202
+ margin-bottom: 18px;
203
+ }
204
+ .studio-chip.active {
205
+ color: var(--studio-text);
206
+ border-color: color-mix(in srgb, var(--studio-accent) 36%, var(--studio-border));
207
+ }
208
+ .studio-bar {
209
+ display: flex;
210
+ gap: 8px;
211
+ padding: 10px;
212
+ margin: 0 10px 10px;
213
+ border-radius: 18px;
214
+ overflow-x: auto;
215
+ }
216
+ .agent-pill {
217
+ display: inline-flex;
218
+ align-items: center;
219
+ gap: 8px;
220
+ min-width: 120px;
221
+ padding: 8px 12px;
222
+ border-radius: 999px;
223
+ background: var(--studio-card);
224
+ border: 1px solid var(--studio-border);
225
+ font-size: 12px;
226
+ }
227
+ .agent-status-dot {
228
+ width: 9px;
229
+ height: 9px;
230
+ border-radius: 50%;
231
+ background: var(--studio-muted);
232
+ }
233
+ .agent-status-dot.working,
234
+ .agent-status-dot.testing { background: var(--studio-accent); }
235
+ .agent-status-dot.error,
236
+ .agent-status-dot.failed { background: var(--studio-red); }
237
+ .agent-status-dot.thinking { background: var(--studio-purple); }
238
+ .studio-panel { display: flex; flex-direction: column; }
239
+ .studio-panel-head {
240
+ display: flex;
241
+ align-items: center;
242
+ justify-content: space-between;
243
+ padding: 16px;
244
+ border-bottom: 1px solid var(--studio-border);
245
+ }
246
+ .studio-panel-body { flex: 1; overflow: auto; padding: 16px; }
247
+ .studio-list,
248
+ .snapshot-list { display: flex; flex-direction: column; gap: 8px; }
249
+ .studio-list-item,
250
+ .snapshot-item {
251
+ padding: 12px;
252
+ border-radius: 14px;
253
+ border: 1px solid var(--studio-border);
254
+ background: var(--studio-card);
255
+ }
256
+ .studio-list-item.active {
257
+ border-color: color-mix(in srgb, var(--studio-accent) 40%, var(--studio-border));
258
+ }
259
+ .snapshot-actions { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 10px; }
260
+ .snapshot-action {
261
+ padding: 5px 9px;
262
+ border-radius: 999px;
263
+ border: 1px solid var(--studio-border);
264
+ background: transparent;
265
+ color: var(--studio-dim);
266
+ font-size: 11px;
267
+ }
268
+ .snapshot-tags { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 8px; }
269
+ .snapshot-tag {
270
+ padding: 3px 8px;
271
+ border-radius: 999px;
272
+ background: color-mix(in srgb, var(--studio-accent) 14%, transparent);
273
+ color: var(--studio-accent);
274
+ font-size: 11px;
275
+ }
276
+ .studio-tooltip {
277
+ position: fixed;
278
+ z-index: 80;
279
+ display: none;
280
+ padding: 8px 10px;
281
+ border-radius: 12px;
282
+ border: 1px solid var(--studio-border);
283
+ background: rgba(10, 15, 26, 0.94);
284
+ color: #e2e8f0;
285
+ font-size: 12px;
286
+ pointer-events: none;
287
+ }
288
+ .studio-tooltip.visible { display: block; }
289
+ .studio-panel-body h1,
290
+ .studio-panel-body h2,
291
+ .studio-panel-body h3 { margin: 0 0 12px; }
292
+ .studio-panel-body p,
293
+ .studio-panel-body li,
294
+ .studio-panel-body code,
295
+ .studio-panel-body pre { color: var(--studio-dim); line-height: 1.7; }
296
+ .studio-panel-body pre,
297
+ .studio-report-block {
298
+ border-radius: 14px;
299
+ border: 1px solid var(--studio-border);
300
+ background: var(--studio-card);
301
+ padding: 12px;
302
+ overflow: auto;
303
+ }
304
+ @media (max-width: 1280px) {
305
+ .studio-app { grid-template-columns: 280px 1fr 320px; }
306
+ }
307
+ @media (max-width: 1080px) {
308
+ .studio-app { grid-template-columns: 1fr; }
309
+ }
310
+ `;function Mt(){return S.useEffect(()=>{let a,n=!1;return M(async()=>{const{mountStudioRuntime:d}=await Promise.resolve().then(()=>It);return{mountStudioRuntime:d}},void 0).then(({mountStudioRuntime:d})=>d()).then(d=>{if(n){d();return}a=d}),()=>{n=!0,a==null||a()}},[]),s.jsxs(s.Fragment,{children:[s.jsx("style",{children:At}),s.jsxs("div",{className:"studio-app",children:[s.jsxs("aside",{className:"studio-shell studio-sidebar",children:[s.jsxs("section",{className:"studio-section",children:[s.jsx("h3",{children:"Scan Target"}),s.jsx("div",{className:"studio-input-row",children:s.jsx("input",{id:"scan-input",className:"studio-input",placeholder:"./backend or github.com/owner/repo"})}),s.jsx("div",{className:"studio-actions",style:{marginTop:10},children:s.jsx("button",{id:"scan-btn",className:"studio-btn primary",type:"button",children:"Start Scan"})})]}),s.jsxs("section",{className:"studio-section",id:"stats-section",children:[s.jsx("h3",{children:"Project Summary"}),s.jsxs("div",{className:"studio-stat-grid",children:[s.jsxs("div",{className:"studio-stat",children:[s.jsx("div",{className:"studio-stat-label",children:"Modules"}),s.jsx("div",{className:"studio-stat-value",id:"stat-modules",children:"0"})]}),s.jsxs("div",{className:"studio-stat",children:[s.jsx("div",{className:"studio-stat-label",children:"APIs"}),s.jsx("div",{className:"studio-stat-value",id:"stat-apis",children:"0"})]}),s.jsxs("div",{className:"studio-stat",children:[s.jsx("div",{className:"studio-stat-label",children:"Models"}),s.jsx("div",{className:"studio-stat-value",id:"stat-models",children:"0"})]}),s.jsxs("div",{className:"studio-stat",children:[s.jsx("div",{className:"studio-stat-label",children:"Risks"}),s.jsx("div",{className:"studio-stat-value",id:"stat-risks",children:"0"})]})]})]}),s.jsxs("section",{className:"studio-section",children:[s.jsx("h3",{children:"Node Types"}),s.jsx("div",{id:"node-type-list",className:"studio-list"})]}),s.jsxs("section",{className:"studio-section",children:[s.jsx("h3",{children:"Snapshots"}),s.jsx("input",{id:"snapshot-search",className:"studio-input",placeholder:"Search snapshots"}),s.jsx("div",{id:"snapshot-tag-filters",className:"studio-chip-row",style:{marginTop:10}}),s.jsx("div",{id:"snapshot-list",className:"snapshot-list",style:{marginTop:10}})]}),s.jsxs("section",{className:"studio-section",style:{flex:1,overflow:"auto"},children:[s.jsx("h3",{children:"Risks"}),s.jsx("div",{id:"risk-list",className:"studio-list"})]})]}),s.jsxs("main",{className:"studio-main",children:[s.jsxs("div",{className:"studio-header",children:[s.jsxs("div",{className:"studio-tabs",children:[s.jsx("button",{className:"studio-tab","data-view":"office",type:"button",children:"3D Office"}),s.jsx("button",{className:"studio-tab active","data-view":"graph",type:"button",children:"Knowledge Graph"}),s.jsx("button",{className:"studio-tab","data-perspective":"developer",type:"button",children:"Developer"}),s.jsx("button",{className:"studio-tab","data-perspective":"architect",type:"button",children:"Architect"}),s.jsx("button",{className:"studio-tab","data-perspective":"tester",type:"button",children:"Tester"}),s.jsx("button",{className:"studio-tab","data-perspective":"product",type:"button",children:"Product"}),s.jsx("button",{className:"studio-tab","data-perspective":"student",type:"button",children:"Student"}),s.jsx("button",{className:"studio-tab","data-perspective":"executive",type:"button",children:"Executive"})]}),s.jsxs("div",{className:"studio-header-actions",children:[s.jsx("button",{id:"focus-btn",className:"studio-btn",type:"button",children:"Focus Node"}),s.jsx("button",{id:"theme-btn",className:"studio-btn",type:"button",children:"Theme"}),s.jsx("button",{id:"panel-btn",className:"studio-btn",type:"button",children:"Toggle Panel"})]})]}),s.jsxs("div",{className:"studio-graph-wrap",children:[s.jsxs("div",{id:"welcome",className:"studio-welcome",children:[s.jsx("div",{className:"studio-hero",children:"OpenCroc"}),s.jsx("h1",{children:"Studio Graph Workspace"}),s.jsx("p",{children:"Scan a codebase to populate the knowledge graph, risk list, and perspective reports."}),s.jsxs("div",{className:"studio-input-row",style:{maxWidth:560},children:[s.jsx("input",{id:"welcome-input",className:"studio-input",placeholder:"./backend or github.com/owner/repo"}),s.jsx("button",{id:"welcome-scan-btn",className:"studio-btn primary",type:"button",children:"Analyze"})]})]}),s.jsxs("div",{id:"loading",className:"studio-loading hidden",children:[s.jsx("div",{className:"studio-hero",children:"Scanning"}),s.jsx("div",{id:"loading-text",children:"Preparing analysis..."}),s.jsx("div",{id:"loading-detail",style:{color:"var(--studio-dim)"}})]}),s.jsx("svg",{id:"graph-canvas",className:"studio-graph-canvas"}),s.jsx("div",{id:"graph-empty",className:"studio-empty hidden",children:"No graph yet. Run a scan to begin."}),s.jsxs("div",{id:"report-view",className:"studio-report-view hidden",children:[s.jsxs("div",{id:"report-toolbar",className:"studio-report-toolbar",children:[s.jsxs("div",{className:"studio-chip-row",children:[s.jsx("button",{className:"studio-chip active","data-mode":"markdown",type:"button",children:"Markdown"}),s.jsx("button",{className:"studio-chip","data-mode":"mermaid",type:"button",children:"Mermaid"}),s.jsx("button",{className:"studio-chip","data-mode":"raw",type:"button",children:"Raw"})]}),s.jsx("button",{id:"copy-report-btn",className:"studio-btn",type:"button",children:"Copy"})]}),s.jsx("div",{id:"report-content"})]})]}),s.jsxs("div",{className:"studio-bar",id:"agent-bar",children:[s.jsxs("div",{className:"agent-pill",children:[s.jsx("span",{className:"agent-status-dot idle",id:"agent-parser"}),s.jsx("span",{children:"Parser"})]}),s.jsxs("div",{className:"agent-pill",children:[s.jsx("span",{className:"agent-status-dot idle",id:"agent-analyzer"}),s.jsx("span",{children:"Analyzer"})]}),s.jsxs("div",{className:"agent-pill",children:[s.jsx("span",{className:"agent-status-dot idle",id:"agent-planner"}),s.jsx("span",{children:"Planner"})]}),s.jsxs("div",{className:"agent-pill",children:[s.jsx("span",{className:"agent-status-dot idle",id:"agent-tester"}),s.jsx("span",{children:"Tester"})]}),s.jsxs("div",{className:"agent-pill",children:[s.jsx("span",{className:"agent-status-dot idle",id:"agent-healer"}),s.jsx("span",{children:"Healer"})]}),s.jsxs("div",{className:"agent-pill",children:[s.jsx("span",{className:"agent-status-dot idle",id:"agent-reporter"}),s.jsx("span",{children:"Reporter"})]})]})]}),s.jsxs("aside",{className:"studio-panel",id:"panel",children:[s.jsxs("div",{className:"studio-panel-head",children:[s.jsx("h2",{id:"panel-title",style:{margin:0},children:"Details"}),s.jsx("button",{id:"panel-close-btn",className:"studio-btn",type:"button",children:"Close"})]}),s.jsx("div",{id:"panel-body",className:"studio-panel-body",children:s.jsx("p",{children:"Select a node, risk, or perspective report to inspect more details."})})]})]}),s.jsx("div",{id:"tooltip",className:"studio-tooltip"})]})}const zt=Object.freeze(Object.defineProperty({__proto__:null,default:Mt},Symbol.toStringTag,{value:"Module"}));function r(a){const n=document.getElementById(a);if(!n)throw new Error(`Missing element #${a}`);return n}function l(a){return String(a??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}async function v(a,n){const d=await fetch(a,n);if(!d.ok)throw new Error(`${d.status} ${d.statusText}`);return d.json()}async function Ot(){const a=[],n=new Map;let d={nodes:[],edges:[]},g=null,y=[],T=[],m="",x="",h=null,f="",$=null,b=0,w=null,P="markdown",D="";const G=new Map,N=r("graph-canvas"),L=r("panel"),R=r("tooltip");function u(t,e,i){t.addEventListener(e,i),a.push(()=>t.removeEventListener(e,i))}function U(t){document.documentElement.setAttribute("data-theme",t),localStorage.setItem("opencroc-studio-theme",t)}function V(t,e=""){r("loading").classList.remove("hidden"),r("loading-text").textContent=t,r("loading-detail").textContent=e}function at(){r("loading").classList.add("hidden")}function nt(){var t;r("report-view").classList.add("hidden"),N.style.display="",r("graph-empty").classList.toggle("hidden",!!((t=d.nodes)!=null&&t.length)),document.querySelectorAll(".studio-tab").forEach(e=>{e.classList.toggle("active",e.dataset.view==="graph")})}function rt(){r("report-view").classList.remove("hidden"),N.style.display="none",r("graph-empty").classList.add("hidden")}function dt(){const t=(g==null?void 0:g.stats)||{};r("stat-modules").textContent=String(t.moduleCount||0),r("stat-apis").textContent=String(t.functionCount||0),r("stat-models").textContent=String(t.classCount||0),r("stat-risks").textContent=String((g==null?void 0:g.risks)||0)}function z(){const t=r("node-type-list"),e=new Map;for(const i of d.nodes||[]){const o=String(i.type||"unknown");e.set(o,(e.get(o)||0)+1)}t.innerHTML=Array.from(e.entries()).sort((i,o)=>o[1]-i[1]).map(([i,o])=>`<button class="studio-list-item${f===i?" active":""}" data-type="${l(i)}" type="button"><strong>${l(i)}</strong><div style="margin-top:6px;color:var(--studio-dim);font-size:12px">${o} nodes</div></button>`).join("")}function lt(){const t=r("risk-list");if(!y.length){t.innerHTML='<div class="studio-list-item">No risks detected yet.</div>';return}t.innerHTML=y.map((e,i)=>{const o=String(e.severity||"info");return`<button class="studio-list-item" data-risk-index="${i}" type="button"><strong style="color:${o==="critical"||o==="high"?"var(--studio-red)":o==="medium"?"var(--studio-orange)":"var(--studio-blue)"}">${l(e.title||e.message||`Risk ${i+1}`)}</strong><div style="margin-top:6px;color:var(--studio-dim);font-size:12px">${l(e.filePath||e.module||o)}</div></button>`}).join("")}function ct(){return T.filter(t=>{var c;const e=!m||((c=t.tags)==null?void 0:c.includes(m)),i=`${t.name||""} ${t.source||""}`.toLowerCase(),o=!x||i.includes(x.toLowerCase());return e&&o})}function q(){const t=r("snapshot-tag-filters"),i=["all",...Array.from(new Set(T.flatMap(o=>o.tags||[]))).sort()];t.innerHTML=i.map(o=>`<button class="studio-chip${!m&&o==="all"||m===o?" active":""}" data-snapshot-filter="${l(o)}" type="button">${o==="all"?"All":l(o)}</button>`).join("")}function O(){const t=r("snapshot-list"),e=ct();if(!e.length){t.innerHTML='<div class="snapshot-item">No snapshots found.</div>';return}t.innerHTML=e.map(i=>{const o=i.tags||[];return`
311
+ <div class="snapshot-item">
312
+ <strong>${l(i.name||i.id)}</strong>
313
+ <div style="margin-top:6px;color:var(--studio-dim);font-size:12px">${l(i.createdAt||"")}</div>
314
+ <div style="margin-top:4px;color:var(--studio-dim);font-size:12px">${l(i.source||"")}</div>
315
+ <div class="snapshot-tags">${o.map(c=>`<span class="snapshot-tag">${l(c)}</span>`).join("")}</div>
316
+ <div class="snapshot-actions">
317
+ <button class="snapshot-action" data-snapshot-action="restore" data-snapshot-id="${l(i.id)}" type="button">Restore</button>
318
+ <button class="snapshot-action" data-snapshot-action="pin" data-snapshot-id="${l(i.id)}" data-pinned="${i.pinned?"1":"0"}" type="button">${i.pinned?"Unpin":"Pin"}</button>
319
+ <button class="snapshot-action" data-snapshot-action="rename" data-snapshot-id="${l(i.id)}" type="button">Rename</button>
320
+ <button class="snapshot-action" data-snapshot-action="delete" data-snapshot-id="${l(i.id)}" type="button">Delete</button>
321
+ </div>
322
+ </div>
323
+ `}).join("")}function F(t,e){r("panel-title").textContent=t,r("panel-body").innerHTML=e,L.style.display=""}async function J(t){h=t;let e=t;try{e=await v(`/api/studio/node/${encodeURIComponent(String(t.id))}`)}catch{}F(String(e.label||e.id||"Node Detail"),`
324
+ <h3>${l(e.label||e.id||"Node")}</h3>
325
+ <p><strong>Type:</strong> ${l(e.type||"unknown")}</p>
326
+ <p><strong>Module:</strong> ${l(e.module||"-")}</p>
327
+ <p><strong>Status:</strong> ${l(e.status||"-")}</p>
328
+ <div class="studio-report-block"><pre>${l(JSON.stringify(e,null,2))}</pre></div>
329
+ `)}function ut(t){const e=y[t];e&&F(String(e.title||`Risk ${t+1}`),`
330
+ <p><strong>Severity:</strong> ${l(e.severity||"unknown")}</p>
331
+ <p><strong>Location:</strong> ${l(e.filePath||e.module||"-")}</p>
332
+ <div class="studio-report-block"><pre>${l(JSON.stringify(e,null,2))}</pre></div>
333
+ `)}function pt(t,e){R.innerHTML=`<strong>${l(e.label||e.id)}</strong><div style="margin-top:4px">${l(e.type||"unknown")}</div>`,R.classList.add("visible"),R.style.left=`${t.clientX+12}px`,R.style.top=`${t.clientY+12}px`}function W(){R.classList.remove("visible")}function mt(){n.clear();const t=N.getBoundingClientRect(),e=t.width||960,i=t.height||720,o=(d.nodes||[]).filter(p=>!f||p.type===f),c=o.filter(p=>p.type==="module"),k=o.filter(p=>p.type!=="module");c.forEach((p,E)=>{const _=E/Math.max(c.length,1)*Math.PI*2,j=e/2+Math.cos(_)*Math.min(e,i)*.28,A=i/2+Math.sin(_)*Math.min(e,i)*.28;n.set(String(p.id),{x:j,y:A,node:p})}),k.forEach((p,E)=>{const _=c.find(tt=>tt.label===p.module||tt.id===p.module),j=_?n.get(String(_.id)):void 0,A=E/Math.max(k.length,1)*Math.PI*2,Z=j?84+E%5*16:Math.min(e,i)*.16,jt=((j==null?void 0:j.x)||e/2)+Math.cos(A)*Z,Nt=((j==null?void 0:j.y)||i/2)+Math.sin(A)*Z;n.set(String(p.id),{x:jt,y:Nt,node:p})})}function C(){mt();const t=(d.edges||[]).filter(e=>n.has(String(e.source))&&n.has(String(e.target)));N.setAttribute("viewBox",`0 0 ${N.clientWidth||960} ${N.clientHeight||720}`),N.innerHTML=`
334
+ <defs>
335
+ <linearGradient id="studio-edge" x1="0" y1="0" x2="1" y2="1">
336
+ <stop offset="0%" stop-color="rgba(96,165,250,0.45)" />
337
+ <stop offset="100%" stop-color="rgba(52,211,153,0.22)" />
338
+ </linearGradient>
339
+ </defs>
340
+ ${t.map(e=>{const i=n.get(String(e.source)),o=n.get(String(e.target));return`<line x1="${i==null?void 0:i.x}" y1="${i==null?void 0:i.y}" x2="${o==null?void 0:o.x}" y2="${o==null?void 0:o.y}" stroke="url(#studio-edge)" stroke-width="1.4" opacity="0.8" />`}).join("")}
341
+ ${Array.from(n.entries()).map(([e,i])=>{const o=i.node,c=o.type==="module"?"var(--studio-purple)":o.type==="api"?"var(--studio-orange)":o.type==="model"?"var(--studio-accent)":"var(--studio-blue)",k=o.type==="module"?16:10,p=(h==null?void 0:h.id)===o.id?"var(--studio-accent)":"rgba(255,255,255,0.16)";return`
342
+ <g class="studio-node" data-node-id="${l(e)}" style="cursor:pointer">
343
+ <circle cx="${i.x}" cy="${i.y}" r="${k}" fill="${c}" stroke="${p}" stroke-width="2" opacity="0.92" />
344
+ <text x="${i.x}" y="${i.y+k+16}" text-anchor="middle" font-size="${o.type==="module"?12:10}" fill="var(--studio-text)">${l(o.label||o.id)}</text>
345
+ </g>
346
+ `}).join("")}
347
+ `,r("graph-empty").classList.toggle("hidden",n.size>0),r("welcome").classList.toggle("hidden",n.size>0),N.querySelectorAll(".studio-node").forEach(e=>{const i=e.dataset.nodeId||"",o=n.get(i);o&&(u(e,"click",()=>void J(o.node)),u(e,"mouseenter",c=>pt(c,o.node)),u(e,"mouseleave",W))})}async function ht(){d=await v("/api/studio/graph"),z(),C()}async function gt(){y=await v("/api/studio/risks"),lt()}async function xt(){g=await v("/api/studio/summary"),dt()}async function B(){T=await v("/api/studio/snapshots"),q(),O()}async function K(){await Promise.all([ht(),gt(),xt(),B()])}async function Y(t){V("Scanning project...",t);try{await v("/api/studio/scan",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({target:t})}),await K()}finally{at()}}async function bt(t){const e=G.get(t);if(e)return e;const i=await v(`/api/studio/report/${t}`);return G.set(t,i),i}async function vt(){const t=window;return t.mermaid?t.mermaid:(t.__mermaidPromise||(t.__mermaidPromise=new Promise((e,i)=>{const o=document.createElement("script");o.src="https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js",o.onload=()=>e(window.mermaid),o.onerror=()=>i(new Error("Failed to load Mermaid")),document.head.appendChild(o)})),t.__mermaidPromise)}async function ft(){if(!r("report-content").querySelector(".mermaid"))return;const t=await vt();t.initialize({startOnLoad:!1,securityLevel:"loose",theme:"default"}),await t.run({querySelector:".mermaid"})}function yt(t){return l(t||"").replace(/^### (.+)$/gm,"<h3>$1</h3>").replace(/^## (.+)$/gm,"<h2>$1</h2>").replace(/^# (.+)$/gm,"<h1>$1</h1>").replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>").replace(/`([^`]+)`/g,"<code>$1</code>").replace(/^- (.+)$/gm,"<li>$1</li>").replace(/(<li>.*<\/li>)/gs,"<ul>$1</ul>").replace(/\n/g,"<br />")}async function Q(){if(!w)return;const t=r("report-content");if(P==="raw"){t.innerHTML=`<div class="studio-report-block"><pre>${l(JSON.stringify(w,null,2))}</pre></div>`;return}if(P==="mermaid"){const e=(w.sections||[]).filter(i=>{var o,c;return((o=i.visualization)==null?void 0:o.type)==="mermaid"&&((c=i.visualization)==null?void 0:c.data)}).map(i=>`<h3>${l(i.heading)}</h3><div class="studio-report-block"><pre class="mermaid">${l(i.visualization.data)}</pre></div>`).join("");t.innerHTML=e||"<p>No Mermaid sections available for this perspective.</p>",await ft();return}t.innerHTML=`
348
+ <h1>${l(w.title||D)}</h1>
349
+ <p>${l(w.summary||"")}</p>
350
+ ${(w.sections||[]).map(e=>{var o;const i=(o=e.visualization)!=null&&o.data?`<div class="studio-report-block"><pre>${l(e.visualization.data)}</pre></div>`:"";return`<section style="margin-top:24px"><h2>${l(e.heading)}</h2><div>${yt(e.content||"")}</div>${i}</section>`}).join("")}
351
+ `}function X(){const t=location.protocol==="https:"?"wss:":"ws:";$=new WebSocket(`${t}//${location.host}/ws`),$.onmessage=e=>{var i,o;try{const c=JSON.parse(e.data);if(c.type==="graph:update"&&(d=c.payload,z(),C()),c.type==="agent:update"){const k={"parser-croc":"agent-parser","analyzer-croc":"agent-analyzer","planner-croc":"agent-planner","tester-croc":"agent-tester","healer-croc":"agent-healer","reporter-croc":"agent-reporter"};for(const p of c.payload||[]){const E=k[p.id]?document.getElementById(k[p.id]):null;E&&(E.className=`agent-status-dot ${p.status||"idle"}`)}}c.type==="scan:progress"&&V(((i=c.payload)==null?void 0:i.phase)||"Scanning...",((o=c.payload)==null?void 0:o.detail)||"")}catch{}},$.onclose=()=>{b=window.setTimeout(X,3e3)}}async function wt(t,e,i){if(t==="restore"&&await v(`/api/studio/snapshots/${encodeURIComponent(e)}/load`,{method:"POST"}),t==="pin"&&await v(`/api/studio/snapshots/${encodeURIComponent(e)}/pin`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({pinned:!i})}),t==="rename"){const o=window.prompt("Snapshot name");if(!o)return;await v(`/api/studio/snapshots/${encodeURIComponent(e)}/rename`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:o})})}t==="delete"&&await v(`/api/studio/snapshots/${encodeURIComponent(e)}/delete`,{method:"POST"}),await B()}u(r("scan-btn"),"click",()=>{const t=r("scan-input").value.trim();t&&Y(t)}),u(r("welcome-scan-btn"),"click",()=>{const t=r("welcome-input").value.trim();t&&Y(t)}),u(r("theme-btn"),"click",()=>{const t=document.documentElement.getAttribute("data-theme")==="light"?"dark":"light";U(t)}),u(r("panel-btn"),"click",()=>{L.style.display=L.style.display==="none"?"":"none"}),u(r("panel-close-btn"),"click",()=>{L.style.display="none"}),u(r("focus-btn"),"click",()=>{h&&J(h)}),u(r("snapshot-search"),"input",t=>{x=t.target.value,O()}),u(r("snapshot-tag-filters"),"click",t=>{const e=t.target.closest("[data-snapshot-filter]");if(!e)return;const i=e.dataset.snapshotFilter||"";m=i==="all"?"":i,q(),O()}),u(r("snapshot-list"),"click",t=>{const e=t.target.closest("[data-snapshot-action]");e&&wt(e.dataset.snapshotAction||"",e.dataset.snapshotId||"",e.dataset.pinned==="1")}),u(r("node-type-list"),"click",t=>{const e=t.target.closest("[data-type]");if(!e)return;const i=e.dataset.type||"";f=f===i?"":i,z(),C()}),u(r("risk-list"),"click",t=>{const e=t.target.closest("[data-risk-index]");e&&ut(Number(e.dataset.riskIndex))}),document.querySelectorAll(".studio-tab").forEach(t=>{u(t,"click",async()=>{if(t.dataset.view==="office"){ot("/");return}if(t.dataset.view==="graph"){nt();return}const e=t.dataset.perspective;e&&(D=e,w=await bt(e),document.querySelectorAll(".studio-tab").forEach(i=>{i.classList.toggle("active",i===t)}),rt(),await Q())})}),document.querySelectorAll("[data-mode]").forEach(t=>{u(t,"click",async()=>{P=t.dataset.mode||"markdown",document.querySelectorAll("[data-mode]").forEach(e=>{e.classList.toggle("active",e===t)}),await Q()})}),u(r("copy-report-btn"),"click",async()=>{const t=r("report-content").innerText;await navigator.clipboard.writeText(t)}),u(window,"resize",C),u(document,"keydown",t=>{t.key==="Escape"&&(W(),L.style.display="none")}),U(localStorage.getItem("opencroc-studio-theme")||"dark"),L.style.display="";try{await K()}catch{r("welcome").classList.remove("hidden"),r("graph-empty").classList.remove("hidden")}return X(),()=>{a.forEach(t=>t()),a.length=0,$&&$.close(),window.clearTimeout(b)}}const It=Object.freeze(Object.defineProperty({__proto__:null,mountStudioRuntime:Ot},Symbol.toStringTag,{value:"Module"}));export{Dt as A,M as _,ot as n};