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

1""" 

2HART OS Glass Desktop Shell — Panel Manifest. 

3 

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.) 

8 

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""" 

13 

14# ═══════════════════════════════════════════════════════════════ 

15# Static Panels — Nunba SPA pages shown in Start Menu 

16# ═══════════════════════════════════════════════════════════════ 

17 

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 }, 

35 

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 }, 

62 

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 }, 

99 

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 }, 

131 

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 }, 

188 

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 }, 

196 

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} 

204 

205 

206# ═══════════════════════════════════════════════════════════════ 

207# Dynamic Panels — Opened from context (links, agent actions) 

208# ═══════════════════════════════════════════════════════════════ 

209 

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} 

282 

283 

284# ═══════════════════════════════════════════════════════════════ 

285# System Panels — Native OS management (rendered directly, no iframe) 

286# ═══════════════════════════════════════════════════════════════ 

287 

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 }, 

407 

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 }, 

454 

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} 

633 

634 

635# ═══════════════════════════════════════════════════════════════ 

636# Panel Groups (order matters — this is the start menu order) 

637# ═══════════════════════════════════════════════════════════════ 

638 

639PANEL_GROUPS = ['Discover', 'Create', 'You', 'Explore', 'Manage', 'System'] 

640 

641 

642# ═══════════════════════════════════════════════════════════════ 

643# Helpers 

644# ═══════════════════════════════════════════════════════════════ 

645 

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} 

649 

650 

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 

656 

657 

658def resolve_dynamic_panel(panel_type, **params): 

659 """Resolve a dynamic panel template with parameters. 

660 

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 

667 

668 resolved = dict(template) 

669 resolved['title'] = resolved['title'].format(**params) 

670 resolved['route'] = resolved['route'].format(**params) 

671 return resolved