Coverage for integrations / agent_engine / shell_manifest.py: 100.0%
18 statements
« prev ^ index » next coverage.py v7.14.0, created at 2026-05-12 04:49 +0000
« prev ^ index » next coverage.py v7.14.0, created at 2026-05-12 04:49 +0000
1"""
2HART OS Glass Desktop Shell — Panel Manifest.
4Defines all panels available in the glass desktop shell:
5- PANEL_MANIFEST: Static panels from Nunba SPA (start menu items)
6- DYNAMIC_PANELS: Context-opened panels (profile, post detail, etc.)
7- SYSTEM_PANELS: Native system management panels (hardware, security, etc.)
9Each panel can float as a draggable/resizable frosted glass window.
10Nunba panels render via iframe to /app/#/<route>.
11System panels render natively from backend API data.
12"""
14# ═══════════════════════════════════════════════════════════════
15# Static Panels — Nunba SPA pages shown in Start Menu
16# ═══════════════════════════════════════════════════════════════
18PANEL_MANIFEST = {
19 # ─── Discover ───
20 'feed': {
21 'title': 'Feed', 'icon': 'rss_feed',
22 'route': '/social', 'group': 'Discover',
23 'default_size': [800, 600],
24 },
25 'search': {
26 'title': 'Search', 'icon': 'search',
27 'route': '/social/search', 'group': 'Discover',
28 'default_size': [600, 500],
29 },
30 'agents_browse': {
31 'title': 'Agents', 'icon': 'smart_toy',
32 'route': '/agents', 'group': 'Discover',
33 'default_size': [900, 700],
34 },
36 # ─── Create ───
37 'communities': {
38 'title': 'Communities', 'icon': 'groups',
39 'route': '/social/communities', 'group': 'Create',
40 'default_size': [800, 600],
41 },
42 'campaigns': {
43 'title': 'Campaigns', 'icon': 'campaign',
44 'route': '/social/campaigns', 'group': 'Create',
45 'default_size': [800, 600],
46 },
47 'coding': {
48 'title': 'Coding Agent', 'icon': 'code',
49 'route': '/social/coding', 'group': 'Create',
50 'default_size': [900, 700],
51 },
52 'tracker': {
53 'title': 'Tracker', 'icon': 'science',
54 'route': '/social/tracker', 'group': 'Create',
55 'default_size': [800, 600],
56 },
57 'agent_audit': {
58 'title': 'Agent Audit', 'icon': 'fact_check',
59 'route': '/social/agents', 'group': 'Create',
60 'default_size': [900, 600],
61 },
63 # ─── You ───
64 'resonance': {
65 'title': 'Resonance', 'icon': 'auto_awesome',
66 'route': '/social/resonance', 'group': 'You',
67 'default_size': [700, 500],
68 },
69 'regions': {
70 'title': 'Regions', 'icon': 'public',
71 'route': '/social/regions', 'group': 'You',
72 'default_size': [800, 600],
73 },
74 'encounters': {
75 'title': 'Encounters', 'icon': 'handshake',
76 'route': '/social/encounters', 'group': 'You',
77 'default_size': [700, 500],
78 },
79 'autopilot': {
80 'title': 'Autopilot', 'icon': 'rocket_launch',
81 'route': '/social/autopilot', 'group': 'You',
82 'default_size': [800, 600],
83 },
84 'notifications': {
85 'title': 'Notifications', 'icon': 'notifications',
86 'route': '/social/notifications', 'group': 'You',
87 'default_size': [500, 600],
88 },
89 'backup': {
90 'title': 'Backup & Sync', 'icon': 'cloud_sync',
91 'route': '/social/settings/backup', 'group': 'You',
92 'default_size': [600, 500],
93 },
94 'appearance': {
95 'title': 'Appearance', 'icon': 'palette',
96 'route': '/social/settings/appearance', 'group': 'You',
97 'default_size': [700, 600],
98 },
100 # ─── Explore ───
101 'recipes': {
102 'title': 'Recipes', 'icon': 'menu_book',
103 'route': '/social/recipes', 'group': 'Explore',
104 'default_size': [800, 600],
105 },
106 'achievements': {
107 'title': 'Achievements', 'icon': 'emoji_events',
108 'route': '/social/achievements', 'group': 'Explore',
109 'default_size': [700, 500],
110 },
111 'challenges': {
112 'title': 'Challenges', 'icon': 'bolt',
113 'route': '/social/challenges', 'group': 'Explore',
114 'default_size': [700, 500],
115 },
116 'hive_contest': {
117 'title': 'Hive Contest', 'icon': 'leaderboard',
118 'route': '/hive-contest', 'group': 'Explore',
119 'default_size': [1000, 760],
120 },
121 'kids': {
122 'title': 'Kids Learning', 'icon': 'child_care',
123 'route': '/social/kids', 'group': 'Explore',
124 'default_size': [900, 700],
125 },
126 'seasons': {
127 'title': 'Seasons', 'icon': 'park',
128 'route': '/social/seasons', 'group': 'Explore',
129 'default_size': [700, 500],
130 },
132 # ─── Manage (Admin) ───
133 'admin': {
134 'title': 'Admin Dashboard', 'icon': 'dashboard',
135 'route': '/admin', 'group': 'Manage',
136 'default_size': [900, 600],
137 },
138 'admin_users': {
139 'title': 'Users', 'icon': 'person',
140 'route': '/admin/users', 'group': 'Manage',
141 'default_size': [800, 600],
142 },
143 'admin_mod': {
144 'title': 'Moderation', 'icon': 'shield',
145 'route': '/admin/moderation', 'group': 'Manage',
146 'default_size': [800, 600],
147 },
148 'admin_agents': {
149 'title': 'Agent Sync', 'icon': 'sync',
150 'route': '/admin/agents', 'group': 'Manage',
151 'default_size': [800, 600],
152 },
153 'admin_channels': {
154 'title': 'Channels', 'icon': 'cell_tower',
155 'route': '/admin/channels', 'group': 'Manage',
156 'default_size': [800, 600],
157 },
158 'admin_workflows': {
159 'title': 'Workflows', 'icon': 'build',
160 'route': '/admin/workflows', 'group': 'Manage',
161 'default_size': [800, 600],
162 },
163 'admin_settings': {
164 'title': 'Settings', 'icon': 'settings',
165 'route': '/admin/settings', 'group': 'Manage',
166 'default_size': [700, 600],
167 },
168 'admin_identity': {
169 'title': 'Identity', 'icon': 'vpn_key',
170 'route': '/admin/identity', 'group': 'Manage',
171 'default_size': [700, 500],
172 },
173 'admin_dashboard': {
174 'title': 'Agent Dashboard', 'icon': 'monitoring',
175 'route': '/admin/agent-dashboard', 'group': 'Manage',
176 'default_size': [900, 700],
177 },
178 'admin_revenue': {
179 'title': 'Revenue', 'icon': 'payments',
180 'route': '/admin/revenue', 'group': 'Manage',
181 'default_size': [800, 600],
182 },
183 'admin_tasks': {
184 'title': 'Content Tasks', 'icon': 'task',
185 'route': '/admin/content-tasks', 'group': 'Manage',
186 'default_size': [800, 600],
187 },
189 # ─── Assistant (floating chat bubble) ───
190 'assistant': {
191 'title': 'Assistant', 'icon': 'chat_bubble',
192 'route': '/social/assistant', 'group': 'Discover',
193 'default_size': [400, 600],
194 'floating': True,
195 },
197 # ─── OpenClaw Skills ───
198 'openclaw_skills': {
199 'title': 'OpenClaw Skills', 'icon': 'extension',
200 'route': '/social/openclaw', 'group': 'Create',
201 'default_size': [800, 600],
202 },
203}
206# ═══════════════════════════════════════════════════════════════
207# Dynamic Panels — Opened from context (links, agent actions)
208# ═══════════════════════════════════════════════════════════════
210DYNAMIC_PANELS = {
211 'profile': {
212 'title': 'Profile: {name}',
213 'route': '/social/profile/{userId}',
214 'default_size': [700, 600],
215 },
216 'post': {
217 'title': 'Post',
218 'route': '/social/post/{postId}',
219 'default_size': [600, 700],
220 },
221 'community': {
222 'title': '{name}',
223 'route': '/social/h/{communityId}',
224 'default_size': [800, 600],
225 },
226 'agent_profile': {
227 'title': 'Agent: {name}',
228 'route': '/social/agent/{agentId}',
229 'default_size': [700, 600],
230 },
231 'agent_chat': {
232 'title': 'Chat: {name}',
233 'route': '/social/agent/{agentId}/chat',
234 'default_size': [500, 700],
235 },
236 'agent_evolution': {
237 'title': 'Evolution: {name}',
238 'route': '/social/agents/{agentId}/evolution',
239 'default_size': [800, 600],
240 },
241 'campaign_detail': {
242 'title': 'Campaign: {name}',
243 'route': '/social/campaigns/{campaignId}',
244 'default_size': [800, 600],
245 },
246 'challenge_detail': {
247 'title': 'Challenge: {name}',
248 'route': '/social/challenges/{challengeId}',
249 'default_size': [700, 500],
250 },
251 'region_detail': {
252 'title': 'Region: {name}',
253 'route': '/social/regions/{regionId}',
254 'default_size': [800, 600],
255 },
256 'encounter_detail': {
257 'title': 'Encounter',
258 'route': '/social/encounters/{encounterId}',
259 'default_size': [600, 500],
260 },
261 'kids_game': {
262 'title': 'Game: {name}',
263 'route': '/social/kids/game/{gameId}',
264 'default_size': [900, 700],
265 },
266 'kids_progress': {
267 'title': 'Kids Progress',
268 'route': '/social/kids/progress',
269 'default_size': [700, 500],
270 },
271 'kids_create': {
272 'title': 'Game Creator',
273 'route': '/social/kids/create',
274 'default_size': [900, 700],
275 },
276 'campaign_studio': {
277 'title': 'Campaign Studio',
278 'route': '/social/campaigns/create',
279 'default_size': [900, 700],
280 },
281}
284# ═══════════════════════════════════════════════════════════════
285# System Panels — Native OS management (rendered directly, no iframe)
286# ═══════════════════════════════════════════════════════════════
288SYSTEM_PANELS = {
289 'hw_monitor': {
290 'title': 'Hardware Monitor', 'icon': 'monitor_heart',
291 'group': 'System', 'default_size': [700, 500],
292 'apis': [
293 '/api/social/dashboard/system',
294 '/api/social/node/capabilities',
295 ],
296 },
297 'security': {
298 'title': 'Security Center', 'icon': 'shield',
299 'group': 'System', 'default_size': [700, 500],
300 'apis': [
301 '/api/social/dashboard/health',
302 '/api/social/integrity/guardrail-hash',
303 ],
304 },
305 'event_log': {
306 'title': 'Event Log', 'icon': 'list_alt',
307 'group': 'System', 'default_size': [800, 500],
308 'apis': ['/api/shell/events'],
309 },
310 'drivers': {
311 'title': 'Drivers & Devices', 'icon': 'devices',
312 'group': 'System', 'default_size': [700, 500],
313 'apis': ['/api/shell/drivers'],
314 },
315 'network': {
316 'title': 'Network', 'icon': 'wifi',
317 'group': 'System', 'default_size': [700, 500],
318 'apis': [
319 '/api/social/dashboard/topology',
320 '/api/shell/network/wifi',
321 ],
322 },
323 'audio': {
324 'title': 'Audio', 'icon': 'volume_up',
325 'group': 'System', 'default_size': [500, 400],
326 'apis': ['/api/shell/audio'],
327 },
328 'bluetooth': {
329 'title': 'Bluetooth', 'icon': 'bluetooth',
330 'group': 'System', 'default_size': [500, 400],
331 'apis': ['/api/shell/bluetooth'],
332 },
333 'power': {
334 'title': 'Power', 'icon': 'battery_full',
335 'group': 'System', 'default_size': [500, 400],
336 'apis': ['/api/shell/power'],
337 },
338 'display': {
339 'title': 'Display', 'icon': 'desktop_windows',
340 'group': 'System', 'default_size': [600, 400],
341 'apis': ['/api/shell/display'],
342 },
343 'remote_desktop': {
344 'title': 'Remote Desktop', 'icon': 'connected_tv',
345 'group': 'System', 'default_size': [800, 600],
346 'apis': [
347 '/api/remote-desktop/status',
348 '/api/remote-desktop/engines',
349 '/api/remote-desktop/sessions',
350 ],
351 },
352 'file_manager': {
353 'title': 'Files', 'icon': 'folder',
354 'group': 'System', 'default_size': [800, 600],
355 'apis': ['/api/shell/files/browse', '/api/shell/files/recent'],
356 },
357 'terminal': {
358 'title': 'Terminal', 'icon': 'terminal',
359 'group': 'System', 'default_size': [800, 500],
360 'apis': ['/api/shell/terminal/exec', '/api/shell/terminal/sessions'],
361 },
362 'user_accounts': {
363 'title': 'User Accounts', 'icon': 'group',
364 'group': 'System', 'default_size': [600, 500],
365 'apis': ['/api/shell/users'],
366 },
367 'notification_center': {
368 'title': 'Notification Center', 'icon': 'notifications_active',
369 'group': 'System', 'default_size': [500, 600],
370 'apis': ['/api/shell/notifications'],
371 },
372 'updates': {
373 'title': 'Updates', 'icon': 'system_update',
374 'group': 'System', 'default_size': [600, 400],
375 'apis': ['/api/upgrades/status'],
376 },
377 'backup_restore': {
378 'title': 'Backup & Restore', 'icon': 'backup',
379 'group': 'System', 'default_size': [600, 500],
380 'apis': ['/api/shell/backup/list', '/api/shell/backup/restore'],
381 },
382 'devices': {
383 'title': 'Devices & Mesh', 'icon': 'devices_other',
384 'group': 'System', 'default_size': [700, 500],
385 'apis': ['/api/shell/devices'],
386 },
387 'i18n': {
388 'title': 'Language & Region', 'icon': 'language',
389 'group': 'System', 'default_size': [500, 400],
390 'apis': ['/api/shell/i18n/locales', '/api/shell/i18n/strings'],
391 },
392 'accessibility': {
393 'title': 'Accessibility', 'icon': 'accessibility',
394 'group': 'System', 'default_size': [500, 500],
395 'apis': ['/api/shell/accessibility'],
396 },
397 'screenshot': {
398 'title': 'Screenshot & Recording', 'icon': 'screenshot_monitor',
399 'group': 'System', 'default_size': [500, 400],
400 'apis': ['/api/shell/screenshot', '/api/shell/recording/start'],
401 },
402 'firewall': {
403 'title': 'Firewall & Firmware', 'icon': 'security',
404 'group': 'System', 'default_size': [600, 500],
405 'apis': ['/api/shell/power/profiles'], # Uses power API for system status
406 },
408 # ─── Desktop Experience ───
409 'default_apps': {
410 'title': 'Default Apps', 'icon': 'open_in_browser',
411 'group': 'System', 'default_size': [600, 500],
412 'apis': ['/api/shell/default-apps'],
413 },
414 'font_manager': {
415 'title': 'Fonts', 'icon': 'font_download',
416 'group': 'System', 'default_size': [700, 500],
417 'apis': ['/api/shell/fonts'],
418 },
419 'sound_manager': {
420 'title': 'Sounds', 'icon': 'music_note',
421 'group': 'System', 'default_size': [600, 500],
422 'apis': ['/api/shell/sounds/themes', '/api/shell/sounds/events'],
423 },
424 'clipboard_manager': {
425 'title': 'Clipboard', 'icon': 'content_paste',
426 'group': 'System', 'default_size': [500, 600],
427 'apis': ['/api/shell/clipboard/history'],
428 },
429 'datetime': {
430 'title': 'Date & Time', 'icon': 'schedule',
431 'group': 'System', 'default_size': [500, 400],
432 'apis': ['/api/shell/datetime'],
433 },
434 'wallpaper_manager': {
435 'title': 'Wallpaper', 'icon': 'wallpaper',
436 'group': 'System', 'default_size': [800, 600],
437 'apis': ['/api/shell/wallpaper', '/api/shell/wallpaper/collection'],
438 },
439 'input_methods': {
440 'title': 'Keyboard & Input', 'icon': 'keyboard',
441 'group': 'System', 'default_size': [600, 500],
442 'apis': ['/api/shell/input-methods'],
443 },
444 'nightlight': {
445 'title': 'Night Light', 'icon': 'nightlight',
446 'group': 'System', 'default_size': [500, 400],
447 'apis': ['/api/shell/nightlight'],
448 },
449 'workspaces': {
450 'title': 'Workspaces', 'icon': 'view_carousel',
451 'group': 'System', 'default_size': [700, 500],
452 'apis': ['/api/shell/workspaces'],
453 },
455 # ─── System Management ───
456 'task_manager': {
457 'title': 'Task Manager', 'icon': 'monitoring',
458 'group': 'System', 'default_size': [800, 600],
459 'apis': ['/api/shell/tasks/processes', '/api/shell/tasks/resources'],
460 },
461 'storage_manager': {
462 'title': 'Storage', 'icon': 'storage',
463 'group': 'System', 'default_size': [700, 500],
464 'apis': ['/api/shell/storage', '/api/shell/storage/cleanup'],
465 },
466 'startup_apps': {
467 'title': 'Startup Apps', 'icon': 'play_circle',
468 'group': 'System', 'default_size': [600, 500],
469 'apis': ['/api/shell/startup'],
470 },
471 'bluetooth_manager': {
472 'title': 'Bluetooth Manager', 'icon': 'bluetooth_connected',
473 'group': 'System', 'default_size': [600, 500],
474 'apis': ['/api/shell/bluetooth/status'],
475 },
476 'print_manager': {
477 'title': 'Printers', 'icon': 'print',
478 'group': 'System', 'default_size': [700, 500],
479 'apis': ['/api/shell/printers'],
480 },
481 'media_library': {
482 'title': 'Media Library', 'icon': 'perm_media',
483 'group': 'System', 'default_size': [800, 600],
484 'apis': ['/api/shell/media/status', '/api/shell/media/photos',
485 '/api/shell/media/music', '/api/shell/media/videos',
486 '/api/shell/media/play', '/api/shell/media/stop',
487 '/api/shell/media/player-status'],
488 },
489 # ─── OS Feature Panels ───
490 'calculator': {
491 'title': 'Calculator', 'icon': 'calculate',
492 'group': 'System', 'default_size': [350, 500],
493 'apis': [],
494 },
495 'image_viewer': {
496 'title': 'Image Viewer', 'icon': 'photo',
497 'group': 'System', 'default_size': [800, 600],
498 'apis': ['/api/shell/files/browse'],
499 },
500 'notes_app': {
501 'title': 'Notes', 'icon': 'sticky_note_2',
502 'group': 'System', 'default_size': [600, 500],
503 'apis': ['/api/shell/notes'],
504 },
505 'cloud_sync': {
506 'title': 'Cloud Sync', 'icon': 'cloud_sync',
507 'group': 'System', 'default_size': [700, 500],
508 'apis': ['/api/shell/cloud-sync/remotes', '/api/shell/cloud-sync/pairs',
509 '/api/shell/cloud-sync/run', '/api/shell/cloud-sync/status'],
510 },
511 'app_store': {
512 'title': 'App Store', 'icon': 'storefront',
513 'group': 'System', 'default_size': [900, 700],
514 'apis': ['/api/apps/search', '/api/apps/installed',
515 '/api/apps/install', '/api/apps/uninstall'],
516 },
517 'app_permissions': {
518 'title': 'App Permissions', 'icon': 'admin_panel_settings',
519 'group': 'System', 'default_size': [700, 500],
520 'apis': ['/api/apps/installed',
521 '/api/apps/{app_id}/permissions',
522 '/api/apps/{app_id}/permission/{type}',
523 '/api/apps/{app_id}/permissions/reset'],
524 },
525 'battery_monitor': {
526 'title': 'Battery', 'icon': 'battery_full',
527 'group': 'System', 'default_size': [400, 300],
528 'apis': ['/api/shell/battery', '/api/shell/battery/profile'],
529 },
530 'wifi_manager': {
531 'title': 'WiFi', 'icon': 'wifi',
532 'group': 'System', 'default_size': [500, 400],
533 'apis': ['/api/shell/wifi/networks', '/api/shell/wifi/status',
534 '/api/shell/wifi/connect', '/api/shell/wifi/disconnect',
535 '/api/shell/wifi/saved', '/api/shell/wifi/forget',
536 '/api/shell/wifi/toggle'],
537 },
538 'vpn_manager': {
539 'title': 'VPN', 'icon': 'vpn_key',
540 'group': 'System', 'default_size': [500, 400],
541 'apis': ['/api/shell/vpn/list', '/api/shell/vpn/status',
542 '/api/shell/vpn/connect', '/api/shell/vpn/disconnect',
543 '/api/shell/vpn/import'],
544 },
545 'trash_bin': {
546 'title': 'Trash', 'icon': 'delete',
547 'group': 'System', 'default_size': [600, 500],
548 'apis': ['/api/shell/trash', '/api/shell/trash/move',
549 '/api/shell/trash/restore', '/api/shell/trash/empty'],
550 },
551 'webcam_viewer': {
552 'title': 'Camera', 'icon': 'videocam',
553 'group': 'System', 'default_size': [640, 520],
554 'apis': ['/api/shell/webcam/list'],
555 },
556 'scanner': {
557 'title': 'Scanner', 'icon': 'scanner',
558 'group': 'System', 'default_size': [600, 500],
559 'apis': ['/api/shell/scanner/list', '/api/shell/scanner/scan'],
560 },
561 'weather_widget': {
562 'title': 'Weather', 'icon': 'cloud',
563 'group': 'System', 'default_size': [400, 350],
564 'apis': ['/api/shell/weather'],
565 },
566 'file_tags': {
567 'title': 'File Tags', 'icon': 'label',
568 'group': 'System', 'default_size': [600, 500],
569 'apis': ['/api/shell/files/tags', '/api/shell/files/search-by-tag'],
570 },
571 'hotspot': {
572 'title': 'Hotspot', 'icon': 'wifi_tethering',
573 'group': 'System', 'default_size': [400, 350],
574 'apis': ['/api/shell/hotspot/status', '/api/shell/hotspot/start',
575 '/api/shell/hotspot/stop'],
576 },
577 'dns_settings': {
578 'title': 'DNS Settings', 'icon': 'dns',
579 'group': 'System', 'default_size': [500, 400],
580 'apis': ['/api/shell/dns/status', '/api/shell/dns/set'],
581 },
582 'auto_update': {
583 'title': 'Auto Update', 'icon': 'system_update',
584 'group': 'System', 'default_size': [500, 400],
585 'apis': ['/api/shell/auto-update/status', '/api/shell/auto-update/run'],
586 },
587 'sso_ldap': {
588 'title': 'Enterprise Login', 'icon': 'domain',
589 'group': 'System', 'default_size': [600, 500],
590 'apis': ['/api/shell/sso/status', '/api/shell/sso/join',
591 '/api/shell/sso/leave', '/api/shell/sso/test'],
592 },
593 'email': {
594 'title': 'Email', 'icon': 'email',
595 'group': 'System', 'default_size': [800, 600],
596 'apis': ['/api/shell/email/status', '/api/shell/email/launch'],
597 },
598 'voice_control': {
599 'title': 'Voice Control', 'icon': 'mic',
600 'group': 'System', 'default_size': [500, 400],
601 'apis': ['/api/shell/voice/status', '/api/shell/voice/start',
602 '/api/shell/voice/stop', '/api/shell/voice/process'],
603 },
604 'screen_rotation': {
605 'title': 'Screen Rotation', 'icon': 'screen_rotation',
606 'group': 'System', 'default_size': [400, 350],
607 'apis': ['/api/shell/display/rotation', '/api/shell/display/auto-rotate'],
608 },
609 'keyboard_shortcuts': {
610 'title': 'Keyboard Shortcuts', 'icon': 'keyboard_command_key',
611 'group': 'System', 'default_size': [700, 600],
612 'apis': ['/api/shell/shortcuts'],
613 },
614 'hart_identity': {
615 'title': 'My HART', 'icon': 'badge',
616 'group': 'You', 'default_size': [500, 450],
617 'apis': ['/api/onboarding/profile', '/api/onboarding/status'],
618 },
619 'self_build': {
620 'title': 'Self-Build', 'icon': 'build',
621 'group': 'System', 'default_size': [700, 550],
622 'apis': [
623 '/api/system/self-build/status',
624 '/api/system/self-build/packages',
625 '/api/system/self-build/install',
626 '/api/system/self-build/remove',
627 '/api/system/self-build/trigger',
628 '/api/system/generations',
629 '/api/system/rollback',
630 ],
631 },
632}
635# ═══════════════════════════════════════════════════════════════
636# Panel Groups (order matters — this is the start menu order)
637# ═══════════════════════════════════════════════════════════════
639PANEL_GROUPS = ['Discover', 'Create', 'You', 'Explore', 'Manage', 'System']
642# ═══════════════════════════════════════════════════════════════
643# Helpers
644# ═══════════════════════════════════════════════════════════════
646def get_panels_by_group(group):
647 """Get all static panels in a group."""
648 return {k: v for k, v in PANEL_MANIFEST.items() if v.get('group') == group}
651def get_all_panels():
652 """Get combined dict of all panels (static + system)."""
653 combined = dict(PANEL_MANIFEST)
654 combined.update(SYSTEM_PANELS)
655 return combined
658def resolve_dynamic_panel(panel_type, **params):
659 """Resolve a dynamic panel template with parameters.
661 Example: resolve_dynamic_panel('agent_chat', agentId='123', name='Marketing')
662 Returns: {'title': 'Chat: Marketing', 'route': '/social/agent/123/chat', ...}
663 """
664 template = DYNAMIC_PANELS.get(panel_type)
665 if not template:
666 return None
668 resolved = dict(template)
669 resolved['title'] = resolved['title'].format(**params)
670 resolved['route'] = resolved['route'].format(**params)
671 return resolved