From 9dab4999c0fe3102cdd82d2a816694106fd5ae67 Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Fri, 2 Jan 2026 22:25:22 +0000 Subject: [PATCH] feat: add Nerd Mode IDE package with full functionality - Created package.json for Nerd Mode IDE with dependencies and exports. - Defined access permissions in roles.json for IDE functionalities. - Implemented file system and execution functions in functions.json. - Added SVG icon for the IDE in static_content/icon.svg. - Configured Storybook for the IDE with various components and examples. - Established design tokens in tokens.json for consistent styling. - Developed parameterized test data in metadata.params.json for testing. - Created metadata validation tests in metadata.test.json to ensure package integrity. --- .../app/codegen/CodegenStudioClient.test.tsx | 39 - .../src/app/codegen/CodegenStudioClient.tsx | 151 ---- .../src/app/codegen/components/Header.tsx | 21 - .../src/app/codegen/components/Sidebar.tsx | 56 -- .../src/app/codegen/hooks/useCodegenData.ts | 78 -- frontends/nextjs/src/app/codegen/page.tsx | 12 - .../components/ComponentHierarchyEditor.tsx | 1 - .../nextjs/src/components/CssClassManager.tsx | 1 - .../src/components/GodCredentialsSettings.tsx | 1 - frontends/nextjs/src/components/Level1.tsx | 1 - frontends/nextjs/src/components/Level2.tsx | 1 - frontends/nextjs/src/components/Level3.tsx | 1 - frontends/nextjs/src/components/Level4.tsx | 1 - frontends/nextjs/src/components/Level5.tsx | 1 - .../nextjs/src/components/QuickGuide.tsx | 1 - .../src/components/SMTPConfigEditor.tsx | 1 - .../src/components/SchemaEditorLevel4.tsx | 1 - .../nextjs/src/components/UnifiedLogin.tsx | 1 - .../nextjs/src/components/UserManagement.tsx | 1 - .../nextjs/src/components/WorkflowEditor.tsx | 1 - .../src/components/auth/AccessDenied.tsx | 38 - .../nextjs/src/components/auth/AuthGate.tsx | 83 -- .../nextjs/src/components/auth/PageLoader.tsx | 16 - .../components/auth/god-credentials/Form.tsx | 95 --- .../auth/god-credentials/Summary.tsx | 48 -- .../auth/unified-login/LoginForm.tsx | 54 -- .../auth/unified-login/ProviderList.tsx | 50 -- .../dialogs/PasswordChangeDialog.tsx | 133 ---- .../src/components/editors/CodeEditor.tsx | 160 ---- .../src/components/editors/JsonEditor.tsx | 201 ----- .../components/editors/json/SchemaSection.tsx | 25 - .../src/components/editors/json/Toolbar.tsx | 31 - .../editors/schema/SchemaEditor.tsx | 96 --- .../editors/schema/SchemaEditorLevel4.tsx | 97 --- .../src/components/level/ModeratorPanel.tsx | 1 - .../level/level1/CredentialsSection.tsx | 115 --- .../components/level/level1/Level1Tabs.tsx | 53 -- .../level/level2/ChatTabContent.tsx | 19 - .../level/level2/CommentsTabContent.tsx | 70 -- .../level/level2/ProfileTabContent.tsx | 38 - .../components/level/level3/CommentsTable.tsx | 76 -- .../level/level3/EditUserDialog.tsx | 62 -- .../components/level/level3/Level3Stats.tsx | 40 - .../src/components/level/level3/UserTable.tsx | 125 --- .../level/level5/CreateTenantDialog.tsx | 62 -- .../level/level5/Level5Navigator.tsx | 115 --- .../level/level5/TransferConfirmDialog.tsx | 59 -- .../src/components/level/levels/Level1.tsx | 29 - .../src/components/level/levels/Level2.tsx | 102 --- .../src/components/level/levels/Level3.tsx | 140 ---- .../src/components/level/levels/Level4.tsx | 77 -- .../src/components/level/levels/Level5.tsx | 96 --- .../level/levels/hooks/useLevel2State.ts | 94 --- .../level/levels/hooks/useLevel4AppState.ts | 133 ---- .../level/levels/hooks/useLevel5State.ts | 136 ---- .../level/panels/ModeratorPanel.tsx | 95 --- .../level/panels/ModeratorPanel/Actions.tsx | 69 -- .../level/panels/ModeratorPanel/Header.tsx | 12 - .../level/panels/ModeratorPanel/LogList.tsx | 102 --- .../level/sections/ChallengePanel.tsx | 25 - .../level/sections/IntroSection.tsx | 33 - .../components/level/sections/ResultsPane.tsx | 21 - .../src/components/level1/ContactSection.tsx | 42 - .../src/components/level1/FeaturesSection.tsx | 90 --- .../level1/GodCredentialsBanner.tsx | 98 --- .../src/components/level1/HeroSection.tsx | 29 - .../src/components/level1/NavigationBar.tsx | 103 --- .../src/components/level2/CommentsList.tsx | 85 -- .../src/components/level2/ProfileCard.tsx | 114 --- .../src/components/level4/Level4Header.tsx | 132 ---- .../src/components/level4/Level4Summary.tsx | 44 -- .../src/components/level4/Level4Tabs.tsx | 58 -- .../src/components/level4/tabs/TabContent.tsx | 145 ---- .../src/components/level4/tabs/config.ts | 59 -- .../components/level5/header/Level5Header.tsx | 60 -- .../components/level5/tabs/ErrorLogsTab.tsx | 85 -- .../components/level5/tabs/GodUsersTab.tsx | 44 -- .../level5/tabs/PowerTransferTab.tsx | 209 ----- .../src/components/level5/tabs/PreviewTab.tsx | 103 --- .../src/components/level5/tabs/TenantsTab.tsx | 84 -- .../tabs/__tests__/PowerTransferTab.test.tsx | 100 --- .../tabs/error-logs/ClearLogsDialog.tsx | 54 -- .../tabs/error-logs/ErrorLogControls.tsx | 122 --- .../tabs/error-logs/ErrorLogFilters.tsx | 42 - .../level5/tabs/error-logs/ErrorLogList.tsx | 146 ---- .../level5/tabs/error-logs/ErrorLogStats.tsx | 29 - .../tabs/error-logs/ErrorLogsErrorState.tsx | 26 - .../tabs/error-logs/ErrorLogsPagination.tsx | 38 - .../level5/tabs/error-logs/ErrorLogsTab.tsx | 158 ---- .../level5/tabs/error-logs/errorLogActions.ts | 43 -- .../tabs/error-logs/errorLogUtils.test.ts | 43 -- .../level5/tabs/error-logs/errorLogUtils.ts | 44 -- .../level5/tabs/error-logs/helpers/context.ts | 9 - .../tabs/error-logs/helpers/levelStyles.tsx | 27 - .../tabs/error-logs/modules/ErrorLogTable.tsx | 132 ---- .../tabs/error-logs/modules/StatsGrid.tsx | 36 - .../error-logs/modules/useErrorLogActions.ts | 70 -- .../error-logs/modules/useErrorLogData.ts | 57 -- .../error-logs/modules/useErrorLogFilters.ts | 21 - .../tabs/error-logs/useErrorLogFilters.ts | 40 - .../level5/tabs/error-logs/useErrorLogs.ts | 77 -- .../tabs/error-logs/useErrorLogsData.ts | 145 ---- .../power-transfer/PowerTransferTab.test.tsx | 100 --- .../tabs/power-transfer/PowerTransferTab.tsx | 114 --- .../level5/tabs/power-transfer/sections.tsx | 156 ---- .../components/managers/UserManagement.tsx | 343 --------- .../managers/css/CssClassBuilder.tsx | 158 ---- .../managers/css/CssClassManager.tsx | 329 -------- .../managers/css/class-builder/Preview.tsx | 24 - .../managers/css/class-builder/RuleEditor.tsx | 118 --- .../managers/css/class-builder/hooks.ts | 151 ---- .../managers/user-management/AuditTrail.tsx | 154 ---- .../managers/user-management/RoleEditor.tsx | 127 --- .../managers/user-management/UserList.tsx | 155 ---- .../src/components/misc/NerdModeIDE.tsx | 2 - .../misc/auth/GodCredentialsSettings.tsx | 129 ---- .../nextjs/src/components/misc/auth/Login.tsx | 89 --- .../src/components/misc/auth/UnifiedLogin.tsx | 205 ----- .../src/components/misc/data/GenericPage.tsx | 260 ------- .../src/components/misc/data/QuickGuide.tsx | 359 --------- .../src/components/misc/data/RecordForm.tsx | 110 --- .../components/misc/data/SMTPConfigEditor.tsx | 185 ----- .../misc/data/generic-page/Preview.tsx | 138 ---- .../misc/data/generic-page/SectionList.tsx | 125 --- .../misc/data/smtp/ConnectionForm.tsx | 126 --- .../components/misc/data/smtp/StatusCard.tsx | 58 -- .../GitHubActionsFetcher.refactored.tsx | 126 --- .../misc/github/GitHubActionsFetcher.tsx | 93 --- .../github/hooks/useWorkflowLogAnalysis.ts | 137 ---- .../src/components/misc/github/types.ts | 36 - .../misc/github/views/AnalysisPanel.tsx | 109 --- .../misc/github/views/RunDetails.tsx | 119 --- .../components/misc/github/views/RunList.tsx | 72 -- .../misc/github/views/run-list/Filters.tsx | 33 - .../github/views/run-list/RefreshControls.tsx | 64 -- .../github/views/run-list/RunListAlerts.tsx | 160 ---- .../views/run-list/RunListEmptyState.tsx | 13 - .../misc/github/views/run-list/RunRow.tsx | 110 --- .../misc/github/views/run-list/Table.tsx | 83 -- .../github/views/run-list/run-list.types.ts | 44 -- .../github/workflows/hooks/useWorkflowRuns.ts | 12 - .../workflows/hooks/useWorkflowRunsApi.ts | 105 --- .../hooks/useWorkflowRunsSelectors.ts | 101 --- .../github/workflows/useActionsFetcher.ts | 87 --- .../components/misc/viewers/ModelListView.tsx | 362 --------- .../misc/viewers/model-list/DetailsDrawer.tsx | 94 --- .../misc/viewers/model-list/ModelFilters.tsx | 110 --- .../misc/viewers/model-list/ModelTable.tsx | 166 ---- .../components/NerdModeEditorHeader.tsx | 43 -- .../components/NerdModeEmptyState.tsx | 12 - .../components/NerdModeIDEFileExplorer.tsx | 42 - .../components/NerdModeIDEHeader.tsx | 45 -- .../nerd-mode-ide/core/NerdModeIDE.tsx | 131 ---- .../core/NerdModeIDE/EditorPane.tsx | 28 - .../core/NerdModeIDE/Sidebar.tsx | 32 - .../core/NerdModeIDE/useNerdIdeState.ts | 277 ------- .../components/nerd-mode-ide/core/types.ts | 13 - .../nerd-mode-ide/dialogs/GitConfigDialog.tsx | 92 --- .../nerd-mode-ide/dialogs/NewItemDialog.tsx | 70 -- .../nerd-mode-ide/dialogs/TemplateDialog.tsx | 67 -- .../nerd-mode-ide/file-tree/FileTree.tsx | 38 - .../nerd-mode-ide/file-tree/FileTreeNode.tsx | 87 --- .../panels/NerdModeConsolePanel.tsx | 33 - .../panels/NerdModeEditorPanel.tsx | 114 --- .../nerd-mode-ide/panels/NerdModeGitPanel.tsx | 81 -- .../panels/NerdModeTestsPanel.tsx | 52 -- .../src/components/schema/level4/Tabs.tsx | 13 - .../schema/level4/Tabs/TabsUtils.ts | 23 - .../level4/Tabs/functions/field-card.tsx | 69 -- .../level4/Tabs/functions/schema-tabs.tsx | 82 -- .../level4/Tabs/functions/text-field.tsx | 19 - .../components/schema/level4/Tabs/index.ts | 5 - .../schema/level4/ValidationPanel.tsx | 100 --- .../schema/level4/useSchemaLevel4.ts | 127 --- .../src/components/shared/AppFooter.tsx | 17 - .../src/components/shared/AppHeader.tsx | 91 --- .../nextjs/src/components/shared/index.ts | 2 - .../components/status/ServerStatusPanel.tsx | 9 - .../components/workflow/WorkflowEditor.tsx | 110 --- .../components/workflow/WorkflowRunCard.tsx | 52 -- .../components/workflow/WorkflowRunStatus.tsx | 24 - .../workflow/editor/WorkflowDetailsPanel.tsx | 24 - .../workflow/editor/WorkflowNodeCard.tsx | 154 ---- .../workflow/editor/WorkflowNodesPanel.tsx | 57 -- .../workflow/editor/WorkflowSidebar.tsx | 66 -- .../workflow/editor/WorkflowTester.tsx | 79 -- .../components/workflow/editor/constants.tsx | 32 - .../workflow/editor/createActionHandlers.ts | 136 ---- .../src/components/workflow/editor/types.ts | 69 -- .../workflow/editor/useWorkflowState.ts | 35 - .../src/hooks/github/useGitHubFetcher.ts | 86 --- .../nextjs/src/lib/codegen/codegen-types.ts | 30 - .../codegen/create-project-template.test.ts | 31 - .../lib/codegen/create-project-template.ts | 90 --- .../lib/codegen/generate-codegen-zip.test.ts | 24 - .../src/lib/codegen/generate-codegen-zip.ts | 22 - frontends/nextjs/src/lib/compiler.ts | 537 ------------- .../src/lib/github/analyze-workflow-logs.ts | 1 - .../src/lib/github/analyze-workflow-runs.ts | 1 - .../lib/github/client/create-github-client.ts | 9 - .../lib/github/client/resolve-github-repo.ts | 15 - .../src/lib/github/create-github-client.ts | 1 - .../src/lib/github/fetch-workflow-run-logs.ts | 1 - .../github/parse-workflow-run-logs-options.ts | 1 - .../src/lib/github/resolve-github-repo.ts | 1 - .../analysis/logs/analyze-workflow-logs.ts | 30 - .../analysis/logs/fetch-workflow-run-logs.ts | 12 - .../logs/parse-workflow-run-logs-options.ts | 14 - .../analysis/runs/analyze-workflow-runs.ts | 18 - .../github/workflows/analysis/runs/parser.ts | 50 -- .../github/workflows/analysis/runs/stats.ts | 13 - .../analysis/runs/stats/StatsUtils.ts | 23 - .../functions/format-workflow-run-analysis.ts | 65 -- .../functions/summarize-workflow-runs.ts | 56 -- .../runs/stats/functions/to-top-counts.ts | 16 - .../workflows/analysis/runs/stats/index.ts | 5 - .../listing/list-workflow-run-jobs.ts | 17 - .../workflows/listing/list-workflow-runs.ts | 16 - .../builders/cli/build-cli-cpp.ts | 11 - .../builders/cli/build-cli-readme.ts | 10 - .../package/build-package-manifest-json.ts | 13 - .../package/build-package-metadata-json.ts | 22 - .../package/build-package-template.ts | 100 --- .../package/build-react-app-template.ts | 147 ---- .../package/build-zip-from-file-tree.ts | 15 - .../export/append-export-path.test.ts | 17 - .../export/append-export-path.ts | 7 - .../export/find-first-file.test.ts | 46 -- .../file-operations/export/find-first-file.ts | 12 - .../tree/collect-file-entries.test.ts | 52 -- .../tree/collect-file-entries.ts | 31 - .../tree/file-tree-operations.ts | 19 - .../get-language-from-filename.test.ts | 18 - .../get-language-from-filename.ts | 20 - .../nextjs/src/lib/nerd-mode-ide/index.ts | 25 - .../nodes/create/create-file-node.ts | 24 - .../nodes/create/create-folder-node.ts | 25 - .../nodes/create/create-node-id.ts | 9 - .../nerd-mode-ide/nodes/find-node-by-id.ts | 12 - .../nerd-mode-ide/nodes/modify/append-node.ts | 20 - .../nerd-mode-ide/nodes/modify/delete-node.ts | 10 - .../nerd-mode-ide/nodes/modify/update-node.ts | 13 - .../templates/configs/advanced.ts | 3 - .../nerd-mode-ide/templates/configs/base.ts | 281 ------- .../templates/configs/experimental.ts | 3 - .../templates/get-package-template-by-id.ts | 6 - .../templates/get-package-templates.ts | 10 - .../templates/template-configs.ts | 12 - .../nextjs/src/lib/nerd-mode-ide/types.ts | 54 -- .../lib/screenshot/capture-dom-snapshot.ts | 46 -- .../screenshot/request-screenshot-analysis.ts | 33 - .../screenshot-analysis-service.test.ts | 40 - .../screenshot/screenshot-analysis-service.ts | 109 --- frontends/nextjs/src/lib/screenshot/types.ts | 30 - frontends/nextjs/src/lib/workflow-engine.ts | 1 - .../__tests__/workflow-engine.errors.test.ts | 61 -- .../workflow-engine.execution.test.ts | 56 -- .../__tests__/workflow-engine.fixtures.ts | 22 - .../workflow-engine.persistence.test.ts | 73 -- .../workflow/engine/create-workflow-engine.ts | 8 - .../workflow/engine/workflow-engine-class.ts | 29 - .../lib/workflow/engine/workflow-engine.ts | 19 - .../lib/workflow/execution/execute-node.ts | 141 ---- .../execution/execute-workflow-instance.ts | 16 - .../workflow/execution/execute-workflow.ts | 64 -- frontends/nextjs/src/lib/workflow/index.ts | 25 - .../src/lib/workflow/log-to-workflow.ts | 8 - .../lib/workflow/nodes/execute-action-node.ts | 17 - .../workflow/nodes/execute-condition-node.ts | 27 - .../workflow/nodes/execute-transform-node.ts | 27 - .../workflow/workflow-execution-context.ts | 10 - .../lib/workflow/workflow-execution-result.ts | 10 - .../nextjs/src/lib/workflow/workflow-state.ts | 17 - packages/nerd_mode_ide/components/ui.json | 727 ++++++++++++++++++ packages/nerd_mode_ide/package.json | 40 + packages/nerd_mode_ide/permissions/roles.json | 53 ++ packages/nerd_mode_ide/scripts/functions.json | 138 ++++ .../nerd_mode_ide/static_content/icon.svg | 24 + packages/nerd_mode_ide/storybook/config.json | 85 ++ packages/nerd_mode_ide/styles/tokens.json | 20 + .../nerd_mode_ide/tests/metadata.params.json | 22 + .../nerd_mode_ide/tests/metadata.test.json | 93 +++ 282 files changed, 1202 insertions(+), 18264 deletions(-) delete mode 100644 frontends/nextjs/src/app/codegen/CodegenStudioClient.test.tsx delete mode 100644 frontends/nextjs/src/app/codegen/CodegenStudioClient.tsx delete mode 100644 frontends/nextjs/src/app/codegen/components/Header.tsx delete mode 100644 frontends/nextjs/src/app/codegen/components/Sidebar.tsx delete mode 100644 frontends/nextjs/src/app/codegen/hooks/useCodegenData.ts delete mode 100644 frontends/nextjs/src/app/codegen/page.tsx delete mode 100644 frontends/nextjs/src/components/ComponentHierarchyEditor.tsx delete mode 100644 frontends/nextjs/src/components/CssClassManager.tsx delete mode 100644 frontends/nextjs/src/components/GodCredentialsSettings.tsx delete mode 100644 frontends/nextjs/src/components/Level1.tsx delete mode 100644 frontends/nextjs/src/components/Level2.tsx delete mode 100644 frontends/nextjs/src/components/Level3.tsx delete mode 100644 frontends/nextjs/src/components/Level4.tsx delete mode 100644 frontends/nextjs/src/components/Level5.tsx delete mode 100644 frontends/nextjs/src/components/QuickGuide.tsx delete mode 100644 frontends/nextjs/src/components/SMTPConfigEditor.tsx delete mode 100644 frontends/nextjs/src/components/SchemaEditorLevel4.tsx delete mode 100644 frontends/nextjs/src/components/UnifiedLogin.tsx delete mode 100644 frontends/nextjs/src/components/UserManagement.tsx delete mode 100644 frontends/nextjs/src/components/WorkflowEditor.tsx delete mode 100644 frontends/nextjs/src/components/auth/AccessDenied.tsx delete mode 100644 frontends/nextjs/src/components/auth/AuthGate.tsx delete mode 100644 frontends/nextjs/src/components/auth/PageLoader.tsx delete mode 100644 frontends/nextjs/src/components/auth/god-credentials/Form.tsx delete mode 100644 frontends/nextjs/src/components/auth/god-credentials/Summary.tsx delete mode 100644 frontends/nextjs/src/components/auth/unified-login/LoginForm.tsx delete mode 100644 frontends/nextjs/src/components/auth/unified-login/ProviderList.tsx delete mode 100644 frontends/nextjs/src/components/dialogs/PasswordChangeDialog.tsx delete mode 100644 frontends/nextjs/src/components/editors/CodeEditor.tsx delete mode 100644 frontends/nextjs/src/components/editors/JsonEditor.tsx delete mode 100644 frontends/nextjs/src/components/editors/json/SchemaSection.tsx delete mode 100644 frontends/nextjs/src/components/editors/json/Toolbar.tsx delete mode 100644 frontends/nextjs/src/components/editors/schema/SchemaEditor.tsx delete mode 100644 frontends/nextjs/src/components/editors/schema/SchemaEditorLevel4.tsx delete mode 100644 frontends/nextjs/src/components/level/ModeratorPanel.tsx delete mode 100644 frontends/nextjs/src/components/level/level1/CredentialsSection.tsx delete mode 100644 frontends/nextjs/src/components/level/level1/Level1Tabs.tsx delete mode 100644 frontends/nextjs/src/components/level/level2/ChatTabContent.tsx delete mode 100644 frontends/nextjs/src/components/level/level2/CommentsTabContent.tsx delete mode 100644 frontends/nextjs/src/components/level/level2/ProfileTabContent.tsx delete mode 100644 frontends/nextjs/src/components/level/level3/CommentsTable.tsx delete mode 100644 frontends/nextjs/src/components/level/level3/EditUserDialog.tsx delete mode 100644 frontends/nextjs/src/components/level/level3/Level3Stats.tsx delete mode 100644 frontends/nextjs/src/components/level/level3/UserTable.tsx delete mode 100644 frontends/nextjs/src/components/level/level5/CreateTenantDialog.tsx delete mode 100644 frontends/nextjs/src/components/level/level5/Level5Navigator.tsx delete mode 100644 frontends/nextjs/src/components/level/level5/TransferConfirmDialog.tsx delete mode 100644 frontends/nextjs/src/components/level/levels/Level1.tsx delete mode 100644 frontends/nextjs/src/components/level/levels/Level2.tsx delete mode 100644 frontends/nextjs/src/components/level/levels/Level3.tsx delete mode 100644 frontends/nextjs/src/components/level/levels/Level4.tsx delete mode 100644 frontends/nextjs/src/components/level/levels/Level5.tsx delete mode 100644 frontends/nextjs/src/components/level/levels/hooks/useLevel2State.ts delete mode 100644 frontends/nextjs/src/components/level/levels/hooks/useLevel4AppState.ts delete mode 100644 frontends/nextjs/src/components/level/levels/hooks/useLevel5State.ts delete mode 100644 frontends/nextjs/src/components/level/panels/ModeratorPanel.tsx delete mode 100644 frontends/nextjs/src/components/level/panels/ModeratorPanel/Actions.tsx delete mode 100644 frontends/nextjs/src/components/level/panels/ModeratorPanel/Header.tsx delete mode 100644 frontends/nextjs/src/components/level/panels/ModeratorPanel/LogList.tsx delete mode 100644 frontends/nextjs/src/components/level/sections/ChallengePanel.tsx delete mode 100644 frontends/nextjs/src/components/level/sections/IntroSection.tsx delete mode 100644 frontends/nextjs/src/components/level/sections/ResultsPane.tsx delete mode 100644 frontends/nextjs/src/components/level1/ContactSection.tsx delete mode 100644 frontends/nextjs/src/components/level1/FeaturesSection.tsx delete mode 100644 frontends/nextjs/src/components/level1/GodCredentialsBanner.tsx delete mode 100644 frontends/nextjs/src/components/level1/HeroSection.tsx delete mode 100644 frontends/nextjs/src/components/level1/NavigationBar.tsx delete mode 100644 frontends/nextjs/src/components/level2/CommentsList.tsx delete mode 100644 frontends/nextjs/src/components/level2/ProfileCard.tsx delete mode 100644 frontends/nextjs/src/components/level4/Level4Header.tsx delete mode 100644 frontends/nextjs/src/components/level4/Level4Summary.tsx delete mode 100644 frontends/nextjs/src/components/level4/Level4Tabs.tsx delete mode 100644 frontends/nextjs/src/components/level4/tabs/TabContent.tsx delete mode 100644 frontends/nextjs/src/components/level4/tabs/config.ts delete mode 100644 frontends/nextjs/src/components/level5/header/Level5Header.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/ErrorLogsTab.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/GodUsersTab.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/PowerTransferTab.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/PreviewTab.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/TenantsTab.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/__tests__/PowerTransferTab.test.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/ClearLogsDialog.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/ErrorLogControls.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/ErrorLogFilters.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/ErrorLogList.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/ErrorLogStats.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/ErrorLogsErrorState.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/ErrorLogsPagination.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/ErrorLogsTab.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/errorLogActions.ts delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/errorLogUtils.test.ts delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/errorLogUtils.ts delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/helpers/context.ts delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/helpers/levelStyles.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/modules/ErrorLogTable.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/modules/StatsGrid.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/modules/useErrorLogActions.ts delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/modules/useErrorLogData.ts delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/modules/useErrorLogFilters.ts delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/useErrorLogFilters.ts delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/useErrorLogs.ts delete mode 100644 frontends/nextjs/src/components/level5/tabs/error-logs/useErrorLogsData.ts delete mode 100644 frontends/nextjs/src/components/level5/tabs/power-transfer/PowerTransferTab.test.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/power-transfer/PowerTransferTab.tsx delete mode 100644 frontends/nextjs/src/components/level5/tabs/power-transfer/sections.tsx delete mode 100644 frontends/nextjs/src/components/managers/UserManagement.tsx delete mode 100644 frontends/nextjs/src/components/managers/css/CssClassBuilder.tsx delete mode 100644 frontends/nextjs/src/components/managers/css/CssClassManager.tsx delete mode 100644 frontends/nextjs/src/components/managers/css/class-builder/Preview.tsx delete mode 100644 frontends/nextjs/src/components/managers/css/class-builder/RuleEditor.tsx delete mode 100644 frontends/nextjs/src/components/managers/css/class-builder/hooks.ts delete mode 100644 frontends/nextjs/src/components/managers/user-management/AuditTrail.tsx delete mode 100644 frontends/nextjs/src/components/managers/user-management/RoleEditor.tsx delete mode 100644 frontends/nextjs/src/components/managers/user-management/UserList.tsx delete mode 100644 frontends/nextjs/src/components/misc/NerdModeIDE.tsx delete mode 100644 frontends/nextjs/src/components/misc/auth/GodCredentialsSettings.tsx delete mode 100644 frontends/nextjs/src/components/misc/auth/Login.tsx delete mode 100644 frontends/nextjs/src/components/misc/auth/UnifiedLogin.tsx delete mode 100644 frontends/nextjs/src/components/misc/data/GenericPage.tsx delete mode 100644 frontends/nextjs/src/components/misc/data/QuickGuide.tsx delete mode 100644 frontends/nextjs/src/components/misc/data/RecordForm.tsx delete mode 100644 frontends/nextjs/src/components/misc/data/SMTPConfigEditor.tsx delete mode 100644 frontends/nextjs/src/components/misc/data/generic-page/Preview.tsx delete mode 100644 frontends/nextjs/src/components/misc/data/generic-page/SectionList.tsx delete mode 100644 frontends/nextjs/src/components/misc/data/smtp/ConnectionForm.tsx delete mode 100644 frontends/nextjs/src/components/misc/data/smtp/StatusCard.tsx delete mode 100644 frontends/nextjs/src/components/misc/github/GitHubActionsFetcher.refactored.tsx delete mode 100644 frontends/nextjs/src/components/misc/github/GitHubActionsFetcher.tsx delete mode 100644 frontends/nextjs/src/components/misc/github/hooks/useWorkflowLogAnalysis.ts delete mode 100644 frontends/nextjs/src/components/misc/github/types.ts delete mode 100644 frontends/nextjs/src/components/misc/github/views/AnalysisPanel.tsx delete mode 100644 frontends/nextjs/src/components/misc/github/views/RunDetails.tsx delete mode 100644 frontends/nextjs/src/components/misc/github/views/RunList.tsx delete mode 100644 frontends/nextjs/src/components/misc/github/views/run-list/Filters.tsx delete mode 100644 frontends/nextjs/src/components/misc/github/views/run-list/RefreshControls.tsx delete mode 100644 frontends/nextjs/src/components/misc/github/views/run-list/RunListAlerts.tsx delete mode 100644 frontends/nextjs/src/components/misc/github/views/run-list/RunListEmptyState.tsx delete mode 100644 frontends/nextjs/src/components/misc/github/views/run-list/RunRow.tsx delete mode 100644 frontends/nextjs/src/components/misc/github/views/run-list/Table.tsx delete mode 100644 frontends/nextjs/src/components/misc/github/views/run-list/run-list.types.ts delete mode 100644 frontends/nextjs/src/components/misc/github/workflows/hooks/useWorkflowRuns.ts delete mode 100644 frontends/nextjs/src/components/misc/github/workflows/hooks/useWorkflowRunsApi.ts delete mode 100644 frontends/nextjs/src/components/misc/github/workflows/hooks/useWorkflowRunsSelectors.ts delete mode 100644 frontends/nextjs/src/components/misc/github/workflows/useActionsFetcher.ts delete mode 100644 frontends/nextjs/src/components/misc/viewers/ModelListView.tsx delete mode 100644 frontends/nextjs/src/components/misc/viewers/model-list/DetailsDrawer.tsx delete mode 100644 frontends/nextjs/src/components/misc/viewers/model-list/ModelFilters.tsx delete mode 100644 frontends/nextjs/src/components/misc/viewers/model-list/ModelTable.tsx delete mode 100644 frontends/nextjs/src/components/nerd-mode-ide/components/NerdModeEditorHeader.tsx delete mode 100644 frontends/nextjs/src/components/nerd-mode-ide/components/NerdModeEmptyState.tsx delete mode 100644 frontends/nextjs/src/components/nerd-mode-ide/components/NerdModeIDEFileExplorer.tsx delete mode 100644 frontends/nextjs/src/components/nerd-mode-ide/components/NerdModeIDEHeader.tsx delete mode 100644 frontends/nextjs/src/components/nerd-mode-ide/core/NerdModeIDE.tsx delete mode 100644 frontends/nextjs/src/components/nerd-mode-ide/core/NerdModeIDE/EditorPane.tsx delete mode 100644 frontends/nextjs/src/components/nerd-mode-ide/core/NerdModeIDE/Sidebar.tsx delete mode 100644 frontends/nextjs/src/components/nerd-mode-ide/core/NerdModeIDE/useNerdIdeState.ts delete mode 100644 frontends/nextjs/src/components/nerd-mode-ide/core/types.ts delete mode 100644 frontends/nextjs/src/components/nerd-mode-ide/dialogs/GitConfigDialog.tsx delete mode 100644 frontends/nextjs/src/components/nerd-mode-ide/dialogs/NewItemDialog.tsx delete mode 100644 frontends/nextjs/src/components/nerd-mode-ide/dialogs/TemplateDialog.tsx delete mode 100644 frontends/nextjs/src/components/nerd-mode-ide/file-tree/FileTree.tsx delete mode 100644 frontends/nextjs/src/components/nerd-mode-ide/file-tree/FileTreeNode.tsx delete mode 100644 frontends/nextjs/src/components/nerd-mode-ide/panels/NerdModeConsolePanel.tsx delete mode 100644 frontends/nextjs/src/components/nerd-mode-ide/panels/NerdModeEditorPanel.tsx delete mode 100644 frontends/nextjs/src/components/nerd-mode-ide/panels/NerdModeGitPanel.tsx delete mode 100644 frontends/nextjs/src/components/nerd-mode-ide/panels/NerdModeTestsPanel.tsx delete mode 100644 frontends/nextjs/src/components/schema/level4/Tabs.tsx delete mode 100644 frontends/nextjs/src/components/schema/level4/Tabs/TabsUtils.ts delete mode 100644 frontends/nextjs/src/components/schema/level4/Tabs/functions/field-card.tsx delete mode 100644 frontends/nextjs/src/components/schema/level4/Tabs/functions/schema-tabs.tsx delete mode 100644 frontends/nextjs/src/components/schema/level4/Tabs/functions/text-field.tsx delete mode 100644 frontends/nextjs/src/components/schema/level4/Tabs/index.ts delete mode 100644 frontends/nextjs/src/components/schema/level4/ValidationPanel.tsx delete mode 100644 frontends/nextjs/src/components/schema/level4/useSchemaLevel4.ts delete mode 100644 frontends/nextjs/src/components/shared/AppFooter.tsx delete mode 100644 frontends/nextjs/src/components/shared/AppHeader.tsx delete mode 100644 frontends/nextjs/src/components/shared/index.ts delete mode 100644 frontends/nextjs/src/components/status/ServerStatusPanel.tsx delete mode 100644 frontends/nextjs/src/components/workflow/WorkflowEditor.tsx delete mode 100644 frontends/nextjs/src/components/workflow/WorkflowRunCard.tsx delete mode 100644 frontends/nextjs/src/components/workflow/WorkflowRunStatus.tsx delete mode 100644 frontends/nextjs/src/components/workflow/editor/WorkflowDetailsPanel.tsx delete mode 100644 frontends/nextjs/src/components/workflow/editor/WorkflowNodeCard.tsx delete mode 100644 frontends/nextjs/src/components/workflow/editor/WorkflowNodesPanel.tsx delete mode 100644 frontends/nextjs/src/components/workflow/editor/WorkflowSidebar.tsx delete mode 100644 frontends/nextjs/src/components/workflow/editor/WorkflowTester.tsx delete mode 100644 frontends/nextjs/src/components/workflow/editor/constants.tsx delete mode 100644 frontends/nextjs/src/components/workflow/editor/createActionHandlers.ts delete mode 100644 frontends/nextjs/src/components/workflow/editor/types.ts delete mode 100644 frontends/nextjs/src/components/workflow/editor/useWorkflowState.ts delete mode 100644 frontends/nextjs/src/hooks/github/useGitHubFetcher.ts delete mode 100644 frontends/nextjs/src/lib/codegen/codegen-types.ts delete mode 100644 frontends/nextjs/src/lib/codegen/create-project-template.test.ts delete mode 100644 frontends/nextjs/src/lib/codegen/create-project-template.ts delete mode 100644 frontends/nextjs/src/lib/codegen/generate-codegen-zip.test.ts delete mode 100644 frontends/nextjs/src/lib/codegen/generate-codegen-zip.ts delete mode 100644 frontends/nextjs/src/lib/compiler.ts delete mode 100644 frontends/nextjs/src/lib/github/analyze-workflow-logs.ts delete mode 100644 frontends/nextjs/src/lib/github/analyze-workflow-runs.ts delete mode 100644 frontends/nextjs/src/lib/github/client/create-github-client.ts delete mode 100644 frontends/nextjs/src/lib/github/client/resolve-github-repo.ts delete mode 100644 frontends/nextjs/src/lib/github/create-github-client.ts delete mode 100644 frontends/nextjs/src/lib/github/fetch-workflow-run-logs.ts delete mode 100644 frontends/nextjs/src/lib/github/parse-workflow-run-logs-options.ts delete mode 100644 frontends/nextjs/src/lib/github/resolve-github-repo.ts delete mode 100644 frontends/nextjs/src/lib/github/workflows/analysis/logs/analyze-workflow-logs.ts delete mode 100644 frontends/nextjs/src/lib/github/workflows/analysis/logs/fetch-workflow-run-logs.ts delete mode 100644 frontends/nextjs/src/lib/github/workflows/analysis/logs/parse-workflow-run-logs-options.ts delete mode 100644 frontends/nextjs/src/lib/github/workflows/analysis/runs/analyze-workflow-runs.ts delete mode 100644 frontends/nextjs/src/lib/github/workflows/analysis/runs/parser.ts delete mode 100644 frontends/nextjs/src/lib/github/workflows/analysis/runs/stats.ts delete mode 100644 frontends/nextjs/src/lib/github/workflows/analysis/runs/stats/StatsUtils.ts delete mode 100644 frontends/nextjs/src/lib/github/workflows/analysis/runs/stats/functions/format-workflow-run-analysis.ts delete mode 100644 frontends/nextjs/src/lib/github/workflows/analysis/runs/stats/functions/summarize-workflow-runs.ts delete mode 100644 frontends/nextjs/src/lib/github/workflows/analysis/runs/stats/functions/to-top-counts.ts delete mode 100644 frontends/nextjs/src/lib/github/workflows/analysis/runs/stats/index.ts delete mode 100644 frontends/nextjs/src/lib/github/workflows/listing/list-workflow-run-jobs.ts delete mode 100644 frontends/nextjs/src/lib/github/workflows/listing/list-workflow-runs.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/builders/cli/build-cli-cpp.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/builders/cli/build-cli-readme.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/builders/package/build-package-manifest-json.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/builders/package/build-package-metadata-json.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/builders/package/build-package-template.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/builders/package/build-react-app-template.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/builders/package/build-zip-from-file-tree.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/file-operations/export/append-export-path.test.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/file-operations/export/append-export-path.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/file-operations/export/find-first-file.test.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/file-operations/export/find-first-file.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/file-operations/tree/collect-file-entries.test.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/file-operations/tree/collect-file-entries.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/file-operations/tree/file-tree-operations.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/get-language-from-filename.test.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/get-language-from-filename.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/index.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/nodes/create/create-file-node.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/nodes/create/create-folder-node.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/nodes/create/create-node-id.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/nodes/find-node-by-id.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/nodes/modify/append-node.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/nodes/modify/delete-node.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/nodes/modify/update-node.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/templates/configs/advanced.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/templates/configs/base.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/templates/configs/experimental.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/templates/get-package-template-by-id.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/templates/get-package-templates.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/templates/template-configs.ts delete mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/types.ts delete mode 100644 frontends/nextjs/src/lib/screenshot/capture-dom-snapshot.ts delete mode 100644 frontends/nextjs/src/lib/screenshot/request-screenshot-analysis.ts delete mode 100644 frontends/nextjs/src/lib/screenshot/screenshot-analysis-service.test.ts delete mode 100644 frontends/nextjs/src/lib/screenshot/screenshot-analysis-service.ts delete mode 100644 frontends/nextjs/src/lib/screenshot/types.ts delete mode 100644 frontends/nextjs/src/lib/workflow-engine.ts delete mode 100644 frontends/nextjs/src/lib/workflow/engine/__tests__/workflow-engine.errors.test.ts delete mode 100644 frontends/nextjs/src/lib/workflow/engine/__tests__/workflow-engine.execution.test.ts delete mode 100644 frontends/nextjs/src/lib/workflow/engine/__tests__/workflow-engine.fixtures.ts delete mode 100644 frontends/nextjs/src/lib/workflow/engine/__tests__/workflow-engine.persistence.test.ts delete mode 100644 frontends/nextjs/src/lib/workflow/engine/create-workflow-engine.ts delete mode 100644 frontends/nextjs/src/lib/workflow/engine/workflow-engine-class.ts delete mode 100644 frontends/nextjs/src/lib/workflow/engine/workflow-engine.ts delete mode 100644 frontends/nextjs/src/lib/workflow/execution/execute-node.ts delete mode 100644 frontends/nextjs/src/lib/workflow/execution/execute-workflow-instance.ts delete mode 100644 frontends/nextjs/src/lib/workflow/execution/execute-workflow.ts delete mode 100644 frontends/nextjs/src/lib/workflow/index.ts delete mode 100644 frontends/nextjs/src/lib/workflow/log-to-workflow.ts delete mode 100644 frontends/nextjs/src/lib/workflow/nodes/execute-action-node.ts delete mode 100644 frontends/nextjs/src/lib/workflow/nodes/execute-condition-node.ts delete mode 100644 frontends/nextjs/src/lib/workflow/nodes/execute-transform-node.ts delete mode 100644 frontends/nextjs/src/lib/workflow/workflow-execution-context.ts delete mode 100644 frontends/nextjs/src/lib/workflow/workflow-execution-result.ts delete mode 100644 frontends/nextjs/src/lib/workflow/workflow-state.ts create mode 100644 packages/nerd_mode_ide/components/ui.json create mode 100644 packages/nerd_mode_ide/package.json create mode 100644 packages/nerd_mode_ide/permissions/roles.json create mode 100644 packages/nerd_mode_ide/scripts/functions.json create mode 100644 packages/nerd_mode_ide/static_content/icon.svg create mode 100644 packages/nerd_mode_ide/storybook/config.json create mode 100644 packages/nerd_mode_ide/styles/tokens.json create mode 100644 packages/nerd_mode_ide/tests/metadata.params.json create mode 100644 packages/nerd_mode_ide/tests/metadata.test.json diff --git a/frontends/nextjs/src/app/codegen/CodegenStudioClient.test.tsx b/frontends/nextjs/src/app/codegen/CodegenStudioClient.test.tsx deleted file mode 100644 index e771310b4..000000000 --- a/frontends/nextjs/src/app/codegen/CodegenStudioClient.test.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { fireEvent, render, screen, waitFor } from '@testing-library/react' -import { vi } from 'vitest' - -import CodegenStudioClient from './CodegenStudioClient' - -describe('CodegenStudioClient', () => { - const originalFetch = global.fetch - const originalCreateObjectURL = URL.createObjectURL - const originalRevokeObjectURL = URL.revokeObjectURL - - beforeEach(() => { - global.fetch = vi.fn().mockResolvedValue({ - ok: true, - blob: () => Promise.resolve(new Blob(['zip-binary'])), - headers: { get: () => 'attachment; filename="codegen-studio.zip"' }, - }) as unknown as typeof fetch - - URL.createObjectURL = vi.fn(() => 'blob://codegen') - URL.revokeObjectURL = vi.fn() - }) - - afterEach(() => { - global.fetch = originalFetch - URL.createObjectURL = originalCreateObjectURL - URL.revokeObjectURL = originalRevokeObjectURL - vi.clearAllMocks() - }) - - it('renders form and triggers ZIP download', async () => { - render() - - const button = screen.getByRole('button', { name: /generate zip/i }) - fireEvent.click(button) - - await waitFor(() => { - expect(global.fetch).toHaveBeenCalled() - }) - }) -}) diff --git a/frontends/nextjs/src/app/codegen/CodegenStudioClient.tsx b/frontends/nextjs/src/app/codegen/CodegenStudioClient.tsx deleted file mode 100644 index 4cf29988d..000000000 --- a/frontends/nextjs/src/app/codegen/CodegenStudioClient.tsx +++ /dev/null @@ -1,151 +0,0 @@ -'use client' - -import { type ChangeEvent, useMemo, useState } from 'react' - -import { - Alert, - Box, - Button, - CircularProgress, - Container, - MenuItem, - Paper, - Stack, - TextField, - Typography, -} from '@/fakemui' - -import Header from './components/Header' -import Sidebar from './components/Sidebar' -import { type CodegenRequest, useCodegenData } from './hooks/useCodegenData' - -const runtimeOptions = [ - { value: 'web', label: 'Next.js web' }, - { value: 'cli', label: 'Command line' }, - { value: 'desktop', label: 'Desktop shell' }, - { value: 'hybrid', label: 'Hybrid web + desktop' }, - { value: 'server', label: 'Server service' }, -] - -const initialFormState: CodegenRequest = { - projectName: 'nebula-launch', - packageId: 'codegen_studio', - runtime: 'web', - tone: 'newsroom', - brief: 'Modern web interface with CLI companions', -} - -type FormState = typeof initialFormState - -export default function CodegenStudioClient() { - const [form, setForm] = useState(initialFormState) - const { status, message, error, manifest, generate } = useCodegenData() - - const runtimeDescription = useMemo(() => { - switch (form.runtime) { - case 'cli': - return 'Generates a CLI entry point plus Next.js wrappers.' - case 'desktop': - return 'Includes desktop-ready shell + companion CLI.' - case 'hybrid': - return 'Bundles both web and desktop artifacts.' - case 'server': - return 'Prepares a backend service project.' - default: - return 'Focuses on a Next.js web experience.' - } - }, [form.runtime]) - - const previewFiles = useMemo(() => { - const root = - form.projectName - .toLowerCase() - .trim() - .replace(/[^a-z0-9_-]+/g, '-') - .replace(/^-+|-+$/g, '') || 'metabuilder-starter' - return [ - `${root}/README.md`, - `${root}/package.json`, - `${root}/src/app/page.tsx`, - `${root}/cli/main.cpp`, - `${root}/spec.json`, - ] - }, [form.projectName]) - - const handleChange = (key: keyof FormState) => (event: ChangeEvent) => { - setForm(prev => ({ ...prev, [key]: event.target.value })) - } - - const handleSubmit = () => generate(form) - - return ( - - - -
- - - - - - {runtimeOptions.map(option => ( - - {option.label} - - ))} - - - {runtimeDescription} - - - - - - - - {message && {message}} - {error && {error}} - - - - - - - - - ) -} diff --git a/frontends/nextjs/src/app/codegen/components/Header.tsx b/frontends/nextjs/src/app/codegen/components/Header.tsx deleted file mode 100644 index f248adadf..000000000 --- a/frontends/nextjs/src/app/codegen/components/Header.tsx +++ /dev/null @@ -1,21 +0,0 @@ -'use client' - -import { Stack, Typography } from '@/fakemui' - -interface HeaderProps { - title: string - subtitle: string -} - -export default function Header({ title, subtitle }: HeaderProps) { - return ( - - - {title} - - - {subtitle} - - - ) -} diff --git a/frontends/nextjs/src/app/codegen/components/Sidebar.tsx b/frontends/nextjs/src/app/codegen/components/Sidebar.tsx deleted file mode 100644 index 795322f19..000000000 --- a/frontends/nextjs/src/app/codegen/components/Sidebar.tsx +++ /dev/null @@ -1,56 +0,0 @@ -'use client' - -import { Paper, Stack, Typography } from '@/fakemui' -import type { CodegenManifest } from '@/lib/codegen/codegen-types' - -interface SidebarProps { - manifest: CodegenManifest | null - previewFiles: string[] -} - -export default function Sidebar({ manifest, previewFiles }: SidebarProps) { - return ( - - {manifest && ( - - - Manifest preview - - - - Project: {manifest.projectName} - - - Package: {manifest.packageId} - - - Runtime: {manifest.runtime} - - - Tone: {manifest.tone ?? 'adaptive'} - - - Generated at: {new Date(manifest.generatedAt).toLocaleString()} - - - - )} - - Bundle contents - {previewFiles.map(entry => ( - - • {entry} - - ))} - - - ) -} diff --git a/frontends/nextjs/src/app/codegen/hooks/useCodegenData.ts b/frontends/nextjs/src/app/codegen/hooks/useCodegenData.ts deleted file mode 100644 index fab2ad405..000000000 --- a/frontends/nextjs/src/app/codegen/hooks/useCodegenData.ts +++ /dev/null @@ -1,78 +0,0 @@ -'use client' - -import { useCallback, useState } from 'react' - -import type { CodegenManifest } from '@/lib/codegen/codegen-types' - -export type CodegenRequest = { - projectName: string - packageId: string - runtime: string - tone: string - brief: string -} - -export type FetchStatus = 'idle' | 'loading' | 'success' - -const createFilename = (header: string | null, fallback: string) => { - const match = header?.match(/filename="?([^"]+)"?/) ?? null - return match ? match[1] : fallback -} - -const downloadBlob = (blob: Blob, filename: string) => { - const url = URL.createObjectURL(blob) - const anchor = document.createElement('a') - anchor.href = url - anchor.download = filename - document.body.appendChild(anchor) - anchor.click() - anchor.remove() - URL.revokeObjectURL(url) -} - -const fetchZip = async (values: CodegenRequest) => { - const response = await fetch('/api/codegen/studio', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(values), - }) - if (!response.ok) { - throw new Error('Codegen Studio service returned an error') - } - const blob = await response.blob() - const filename = createFilename( - response.headers.get('content-disposition'), - `${values.projectName}.zip` - ) - downloadBlob(blob, filename) - const manifestHeader = response.headers.get('x-codegen-manifest') - const manifest = manifestHeader - ? (JSON.parse(decodeURIComponent(manifestHeader)) as CodegenManifest) - : null - return { filename, manifest } -} - -export function useCodegenData() { - const [status, setStatus] = useState('idle') - const [message, setMessage] = useState(null) - const [error, setError] = useState(null) - const [manifest, setManifest] = useState(null) - - const generate = useCallback(async (values: CodegenRequest) => { - setStatus('loading') - setError(null) - setMessage(null) - try { - const { filename, manifest: manifestResult } = await fetchZip(values) - setMessage(`Zip ${filename} created successfully.`) - setManifest(manifestResult) - setStatus('success') - } catch (err) { - setError(err instanceof Error ? err.message : 'Unable to generate the zip') - setManifest(null) - setStatus('idle') - } - }, []) - - return { status, message, error, manifest, generate } -} diff --git a/frontends/nextjs/src/app/codegen/page.tsx b/frontends/nextjs/src/app/codegen/page.tsx deleted file mode 100644 index 608a74376..000000000 --- a/frontends/nextjs/src/app/codegen/page.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import type { Metadata } from 'next' - -import CodegenStudioClient from './CodegenStudioClient' - -export const metadata: Metadata = { - title: 'Codegen Studio', - description: 'Generate and download custom starter bundles for MetaBuilder packages.', -} - -export default function CodegenStudioPage() { - return -} diff --git a/frontends/nextjs/src/components/ComponentHierarchyEditor.tsx b/frontends/nextjs/src/components/ComponentHierarchyEditor.tsx deleted file mode 100644 index c60ee79f3..000000000 --- a/frontends/nextjs/src/components/ComponentHierarchyEditor.tsx +++ /dev/null @@ -1 +0,0 @@ -export { ComponentHierarchyEditor } from './managers/component/ComponentHierarchyEditor' diff --git a/frontends/nextjs/src/components/CssClassManager.tsx b/frontends/nextjs/src/components/CssClassManager.tsx deleted file mode 100644 index 8f178573d..000000000 --- a/frontends/nextjs/src/components/CssClassManager.tsx +++ /dev/null @@ -1 +0,0 @@ -export { CssClassManager } from './managers/css/CssClassManager' diff --git a/frontends/nextjs/src/components/GodCredentialsSettings.tsx b/frontends/nextjs/src/components/GodCredentialsSettings.tsx deleted file mode 100644 index 6e4fd7a16..000000000 --- a/frontends/nextjs/src/components/GodCredentialsSettings.tsx +++ /dev/null @@ -1 +0,0 @@ -export { GodCredentialsSettings } from './misc/auth/GodCredentialsSettings' diff --git a/frontends/nextjs/src/components/Level1.tsx b/frontends/nextjs/src/components/Level1.tsx deleted file mode 100644 index 9ed4cb524..000000000 --- a/frontends/nextjs/src/components/Level1.tsx +++ /dev/null @@ -1 +0,0 @@ -export { Level1, type Level1Props } from './level/levels/Level1' diff --git a/frontends/nextjs/src/components/Level2.tsx b/frontends/nextjs/src/components/Level2.tsx deleted file mode 100644 index 0ebea34b8..000000000 --- a/frontends/nextjs/src/components/Level2.tsx +++ /dev/null @@ -1 +0,0 @@ -export { Level2, type Level2Props } from './level/levels/Level2' diff --git a/frontends/nextjs/src/components/Level3.tsx b/frontends/nextjs/src/components/Level3.tsx deleted file mode 100644 index 2c617a031..000000000 --- a/frontends/nextjs/src/components/Level3.tsx +++ /dev/null @@ -1 +0,0 @@ -export { Level3, type Level3Props } from './level/levels/Level3' diff --git a/frontends/nextjs/src/components/Level4.tsx b/frontends/nextjs/src/components/Level4.tsx deleted file mode 100644 index 2475b1e88..000000000 --- a/frontends/nextjs/src/components/Level4.tsx +++ /dev/null @@ -1 +0,0 @@ -export { Level4, type Level4Props } from './level/levels/Level4' diff --git a/frontends/nextjs/src/components/Level5.tsx b/frontends/nextjs/src/components/Level5.tsx deleted file mode 100644 index 8cc7c2161..000000000 --- a/frontends/nextjs/src/components/Level5.tsx +++ /dev/null @@ -1 +0,0 @@ -export { Level5, type Level5Props } from './level/levels/Level5' diff --git a/frontends/nextjs/src/components/QuickGuide.tsx b/frontends/nextjs/src/components/QuickGuide.tsx deleted file mode 100644 index 8f59591b9..000000000 --- a/frontends/nextjs/src/components/QuickGuide.tsx +++ /dev/null @@ -1 +0,0 @@ -export { QuickGuide } from './misc/data/QuickGuide' diff --git a/frontends/nextjs/src/components/SMTPConfigEditor.tsx b/frontends/nextjs/src/components/SMTPConfigEditor.tsx deleted file mode 100644 index 3490fa8ae..000000000 --- a/frontends/nextjs/src/components/SMTPConfigEditor.tsx +++ /dev/null @@ -1 +0,0 @@ -export { SMTPConfigEditor } from './misc/data/SMTPConfigEditor' diff --git a/frontends/nextjs/src/components/SchemaEditorLevel4.tsx b/frontends/nextjs/src/components/SchemaEditorLevel4.tsx deleted file mode 100644 index 92db14859..000000000 --- a/frontends/nextjs/src/components/SchemaEditorLevel4.tsx +++ /dev/null @@ -1 +0,0 @@ -export { SchemaEditorLevel4 } from './editors/schema/SchemaEditorLevel4' diff --git a/frontends/nextjs/src/components/UnifiedLogin.tsx b/frontends/nextjs/src/components/UnifiedLogin.tsx deleted file mode 100644 index 3dc9ec5ee..000000000 --- a/frontends/nextjs/src/components/UnifiedLogin.tsx +++ /dev/null @@ -1 +0,0 @@ -export { UnifiedLogin } from './misc/auth/UnifiedLogin' diff --git a/frontends/nextjs/src/components/UserManagement.tsx b/frontends/nextjs/src/components/UserManagement.tsx deleted file mode 100644 index 6687dcecc..000000000 --- a/frontends/nextjs/src/components/UserManagement.tsx +++ /dev/null @@ -1 +0,0 @@ -export { UserManagement } from './managers/UserManagement' diff --git a/frontends/nextjs/src/components/WorkflowEditor.tsx b/frontends/nextjs/src/components/WorkflowEditor.tsx deleted file mode 100644 index 2a6a900b5..000000000 --- a/frontends/nextjs/src/components/WorkflowEditor.tsx +++ /dev/null @@ -1 +0,0 @@ -export { WorkflowEditor } from './workflow/WorkflowEditor' diff --git a/frontends/nextjs/src/components/auth/AccessDenied.tsx b/frontends/nextjs/src/components/auth/AccessDenied.tsx deleted file mode 100644 index 5de0ec99c..000000000 --- a/frontends/nextjs/src/components/auth/AccessDenied.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { Button, Stack, Typography } from '@/fakemui' -import { LockRounded } from '@/fakemui/icons' - -interface AccessDeniedProps { - title?: string - description?: string - actionLabel?: string - onAction?: () => void -} - -export function AccessDenied({ - title = 'Access restricted', - description = 'You do not have permission to view this area.', - actionLabel, - onAction, -}: AccessDeniedProps) { - return ( - - - - {title} - - {description} - - - {actionLabel && onAction ? ( - - ) : null} - - ) -} diff --git a/frontends/nextjs/src/components/auth/AuthGate.tsx b/frontends/nextjs/src/components/auth/AuthGate.tsx deleted file mode 100644 index f62f03c5d..000000000 --- a/frontends/nextjs/src/components/auth/AuthGate.tsx +++ /dev/null @@ -1,83 +0,0 @@ -'use client' - -import { useRouter } from 'next/navigation' -import { useEffect } from 'react' - -import { CircularProgress, Stack, Typography } from '@/fakemui' -import { useAuth } from '@/hooks/useAuth' -import { getRoleLevel } from '@/lib/auth/get-role-level' -import { resolveAccessDecision } from '@/lib/auth/resolve-access-decision' -import type { AppLevel, UserRole } from '@/lib/level-types' - -import { AccessDenied } from './AccessDenied' - -interface AuthGateProps { - children: React.ReactNode - minLevel?: AppLevel - requiredRole?: UserRole - requiresAuth?: boolean - redirectTo?: string - fallback?: React.ReactNode -} - -export function AuthGate({ - children, - minLevel, - requiredRole, - requiresAuth, - redirectTo = '/login', - fallback, -}: AuthGateProps) { - const router = useRouter() - const { user, isAuthenticated, isLoading } = useAuth() - const mustAuthenticate = requiresAuth ?? Boolean(minLevel || requiredRole) - const requiredLevel = minLevel ?? (requiredRole ? getRoleLevel(requiredRole) : undefined) - - const decision = resolveAccessDecision({ - isAuthenticated, - isLoading, - requiresAuth: mustAuthenticate, - requiredLevel, - userRole: user?.role, - userLevel: user?.level, - }) - - useEffect(() => { - if (!decision.allowed && decision.reason !== 'loading' && redirectTo) { - router.replace(redirectTo) - } - }, [decision.allowed, decision.reason, redirectTo, router]) - - if (decision.reason === 'loading') { - return ( - - - - Checking access... - - - ) - } - - if (!decision.allowed) { - if (fallback) { - return <>{fallback} - } - - const description = - decision.reason === 'unauthenticated' - ? 'Please sign in to continue.' - : 'Your account does not have the required access level.' - - return ( - router.replace(redirectTo)} - /> - ) - } - - return <>{children} -} diff --git a/frontends/nextjs/src/components/auth/PageLoader.tsx b/frontends/nextjs/src/components/auth/PageLoader.tsx deleted file mode 100644 index becb4bbd7..000000000 --- a/frontends/nextjs/src/components/auth/PageLoader.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { CircularProgress, Stack, Typography } from '@/fakemui' - -interface PageLoaderProps { - message?: string -} - -export function PageLoader({ message = 'Loading...' }: PageLoaderProps) { - return ( - - - - {message} - - - ) -} diff --git a/frontends/nextjs/src/components/auth/god-credentials/Form.tsx b/frontends/nextjs/src/components/auth/god-credentials/Form.tsx deleted file mode 100644 index 27a1623df..000000000 --- a/frontends/nextjs/src/components/auth/god-credentials/Form.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import { - Button, - Input, - Label, - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from '@/components/ui' - -export interface GodCredentialsFormProps { - duration: number - unit: 'minutes' | 'hours' - onDurationChange: (value: number) => void - onUnitChange: (unit: 'minutes' | 'hours') => void - onSave: () => void - onResetExpiry: () => void - onClearExpiry: () => void -} - -export function GodCredentialsForm({ - duration, - unit, - onDurationChange, - onUnitChange, - onSave, - onResetExpiry, - onClearExpiry, -}: GodCredentialsFormProps) { - return ( -
-
-
- -
- onDurationChange(Number(e.target.value))} - className="flex-1" - /> - -
-

- Set the duration for how long credentials are visible (1 minute to 24 hours) -

-
- -
- -
-
- -
-
- -

Reset or clear the current expiry timer

-
- -
- - -
- -

- Reset Timer: Restart the countdown using the configured duration -
- Clear Expiry: Remove expiry time (credentials will show on next page - load) -

-
-
- ) -} diff --git a/frontends/nextjs/src/components/auth/god-credentials/Summary.tsx b/frontends/nextjs/src/components/auth/god-credentials/Summary.tsx deleted file mode 100644 index 798a56dc5..000000000 --- a/frontends/nextjs/src/components/auth/god-credentials/Summary.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { Alert, AlertDescription, Badge } from '@/components/ui' -import { CheckCircle, WarningCircle } from '@/fakemui/icons' - -export interface GodCredentialsSummaryProps { - isActive: boolean - expiryTime: number - timeRemaining: string -} - -export function GodCredentialsSummary({ - isActive, - expiryTime, - timeRemaining, -}: GodCredentialsSummaryProps) { - if (isActive) { - return ( - - - -
-

- God credentials are currently visible - - Active - -

-

- Time remaining: {timeRemaining} -

-
-
-
- ) - } - - if (!isActive && expiryTime > 0) { - return ( - - - -

God credentials have expired or been hidden

-
-
- ) - } - - return null -} diff --git a/frontends/nextjs/src/components/auth/unified-login/LoginForm.tsx b/frontends/nextjs/src/components/auth/unified-login/LoginForm.tsx deleted file mode 100644 index 4b3614e7a..000000000 --- a/frontends/nextjs/src/components/auth/unified-login/LoginForm.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { Alert, AlertDescription, Button, Input, Label } from '@/components/ui' -import { SignIn } from '@/fakemui/icons' - -export interface LoginFormProps { - username: string - password: string - onUsernameChange: (value: string) => void - onPasswordChange: (value: string) => void - onSubmit: () => void -} - -export function LoginForm({ - username, - password, - onUsernameChange, - onPasswordChange, - onSubmit, -}: LoginFormProps) { - return ( -
-
- - onUsernameChange(e.target.value)} - placeholder="Enter username" - onKeyDown={e => e.key === 'Enter' && onSubmit()} - /> -
-
- - onPasswordChange(e.target.value)} - placeholder="Enter password" - onKeyDown={e => e.key === 'Enter' && onSubmit()} - /> -
- - - -

Test Credentials:

-

Check browser console for default user passwords (they are scrambled on first run)

-
-
-
- ) -} diff --git a/frontends/nextjs/src/components/auth/unified-login/ProviderList.tsx b/frontends/nextjs/src/components/auth/unified-login/ProviderList.tsx deleted file mode 100644 index b48beea25..000000000 --- a/frontends/nextjs/src/components/auth/unified-login/ProviderList.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { Button, Separator } from '@/components/ui' -import { GithubLogo, GoogleLogo, type IconProps } from '@/fakemui/icons' - -export interface Provider { - name: string - description?: string - icon?: React.ComponentType -} - -export interface ProviderListProps { - providers: Provider[] - onSelect?: (provider: Provider) => void -} - -const FALLBACK_PROVIDERS: Provider[] = [ - { name: 'Google', description: 'Use your Google Workspace account', icon: GoogleLogo }, - { name: 'GitHub', description: 'Developer SSO via GitHub', icon: GithubLogo }, -] - -export function ProviderList({ providers, onSelect }: ProviderListProps) { - const entries = providers.length > 0 ? providers : FALLBACK_PROVIDERS - - return ( -
- -

Or continue with

-
- {entries.map(provider => { - const Icon = provider.icon - return ( - - ) - })} -
-
- ) -} diff --git a/frontends/nextjs/src/components/dialogs/PasswordChangeDialog.tsx b/frontends/nextjs/src/components/dialogs/PasswordChangeDialog.tsx deleted file mode 100644 index 0e5282e13..000000000 --- a/frontends/nextjs/src/components/dialogs/PasswordChangeDialog.tsx +++ /dev/null @@ -1,133 +0,0 @@ -import { useState } from 'react' - -import { - Dialog, - DialogContent, - DialogDescription, - DialogFooter, - DialogHeader, - DialogTitle, -} from '@/components/ui' -import { Button } from '@/components/ui' -import { Input } from '@/components/ui' -import { Label } from '@/components/ui' -import { Alert, AlertDescription } from '@/components/ui' -import { Eye, EyeSlash, Warning } from '@/fakemui/icons' - -interface PasswordChangeDialogProps { - open: boolean - username: string - onPasswordChanged: (newPassword: string) => void - isFirstLogin?: boolean -} - -export function PasswordChangeDialog({ - open, - username, - onPasswordChanged, - isFirstLogin = false, -}: PasswordChangeDialogProps) { - const [newPassword, setNewPassword] = useState('') - const [confirmPassword, setConfirmPassword] = useState('') - const [error, setError] = useState('') - const [showPassword, setShowPassword] = useState(false) - - const handleSubmit = () => { - setError('') - - if (!newPassword) { - setError('Password is required') - return - } - - if (newPassword.length < 6) { - setError('Password must be at least 6 characters') - return - } - - if (newPassword !== confirmPassword) { - setError('Passwords do not match') - return - } - - onPasswordChanged(newPassword) - } - - return ( - {}} disableEscapeKeyDown> - - - - {isFirstLogin && } - {isFirstLogin ? 'Change Your Password' : 'Update Password'} - - - {isFirstLogin - ? 'For security reasons, you must change your password on first login.' - : `Change password for user: ${username}`} - - - - {isFirstLogin && ( - - - - Your account is using default credentials. Please choose a strong, unique password. - - - )} - -
-
- -
- setNewPassword(e.target.value)} - placeholder="Enter new password" - className="pr-10" - /> - -
-
- -
- - setConfirmPassword(e.target.value)} - placeholder="Confirm new password" - onKeyDown={e => { - if (e.key === 'Enter') { - handleSubmit() - } - }} - /> -
- - {error && ( - - {error} - - )} -
- - - - -
-
- ) -} diff --git a/frontends/nextjs/src/components/editors/CodeEditor.tsx b/frontends/nextjs/src/components/editors/CodeEditor.tsx deleted file mode 100644 index cb71fec51..000000000 --- a/frontends/nextjs/src/components/editors/CodeEditor.tsx +++ /dev/null @@ -1,160 +0,0 @@ -import Editor from '@monaco-editor/react' -import { useState } from 'react' -import { toast } from 'sonner' - -import { SecurityWarningDialog } from '@/components/organisms/security/SecurityWarningDialog' -import { - Dialog, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, -} from '@/components/ui' -import { Button } from '@/components/ui' -import { Alert, AlertDescription } from '@/components/ui' -import { FloppyDisk, ShieldCheck, Warning, X } from '@/fakemui/icons' -import { securityScanner, type SecurityScanResult } from '@/lib/security-scanner' - -interface CodeEditorProps { - open: boolean - onClose: () => void - code: string - onSave: (code: string) => void - componentName: string -} - -export function CodeEditor({ open, onClose, code, onSave, componentName }: CodeEditorProps) { - const [editorCode, setEditorCode] = useState(code || '// Write your custom code here\n') - const [securityScanResult, setSecurityScanResult] = useState(null) - const [showSecurityDialog, setShowSecurityDialog] = useState(false) - const [pendingSave, setPendingSave] = useState(false) - - const handleSave = () => { - const scanResult = securityScanner.scanJavaScript(editorCode) - setSecurityScanResult(scanResult) - - if (scanResult.severity === 'critical') { - setShowSecurityDialog(true) - toast.error('Critical security issues detected - save blocked') - return - } - - if (scanResult.severity === 'high' || scanResult.severity === 'medium') { - setPendingSave(true) - setShowSecurityDialog(true) - toast.warning('Security issues detected - review before saving') - return - } - - if (scanResult.issues.length > 0) { - toast.warning(`${scanResult.issues.length} minor security warning(s)`) - } - - onSave(editorCode) - onClose() - } - - const handleForceSave = () => { - setPendingSave(false) - setShowSecurityDialog(false) - onSave(editorCode) - onClose() - } - - const handleScan = () => { - const scanResult = securityScanner.scanJavaScript(editorCode) - setSecurityScanResult(scanResult) - setShowSecurityDialog(true) - - if (scanResult.safe) { - toast.success('No security issues detected') - } else { - toast.warning(`${scanResult.issues.length} security issue(s) detected`) - } - } - - const handleEditorChange = (value: string | undefined) => { - setEditorCode(value || '') - } - - return ( - <> - - - - Code Editor - {componentName} - - Write custom JavaScript code for this component. Access component props via{' '} - props. - - - - {securityScanResult && - securityScanResult.severity !== 'safe' && - securityScanResult.severity !== 'low' && - !showSecurityDialog && ( - - - - {securityScanResult.issues.length} security{' '} - {securityScanResult.issues.length === 1 ? 'issue' : 'issues'} detected. Click - Security Scan to review. - - - )} - -
- -
- -
- -
- - -
-
-
-
- - {securityScanResult && ( - { - setShowSecurityDialog(false) - setPendingSave(false) - }} - codeType="JavaScript code" - showProceedButton={pendingSave} - /> - )} - - ) -} diff --git a/frontends/nextjs/src/components/editors/JsonEditor.tsx b/frontends/nextjs/src/components/editors/JsonEditor.tsx deleted file mode 100644 index 38cc69c10..000000000 --- a/frontends/nextjs/src/components/editors/JsonEditor.tsx +++ /dev/null @@ -1,201 +0,0 @@ -import Editor from '@monaco-editor/react' -import { useEffect, useState } from 'react' -import { toast } from 'sonner' - -import { SecurityWarningDialog } from '@/components/organisms/security/SecurityWarningDialog' -import { - Alert, - AlertDescription, - Dialog, - DialogContent, - DialogHeader, - DialogTitle, -} from '@/components/ui' -import { Warning } from '@/fakemui/icons' -import { securityScanner, type SecurityScanResult } from '@/lib/security-scanner' -import type { JsonValue } from '@/types/utility-types' - -import { SchemaSection } from './json/SchemaSection' -import { Toolbar } from './json/Toolbar' - -interface JsonEditorProps { - open: boolean - onClose: () => void - title: string - value: JsonValue - onSave: (value: JsonValue) => void - schema?: JsonValue -} - -export function JsonEditor({ open, onClose, title, value, onSave, schema }: JsonEditorProps) { - const [jsonText, setJsonText] = useState('') - const [error, setError] = useState(null) - const [securityScanResult, setSecurityScanResult] = useState(null) - const [showSecurityDialog, setShowSecurityDialog] = useState(false) - const [pendingSave, setPendingSave] = useState(false) - - useEffect(() => { - if (open) { - setJsonText(JSON.stringify(value, null, 2)) - setError(null) - setSecurityScanResult(null) - } - }, [open, value]) - - const parseJson = (): JsonValue => JSON.parse(jsonText) as JsonValue - - const handleSave = () => { - try { - const parsed = parseJson() - - const scanResult = securityScanner.scanJSON(jsonText) - setSecurityScanResult(scanResult) - - if (scanResult.severity === 'critical') { - setShowSecurityDialog(true) - toast.error('Critical security issues detected - save blocked') - return - } - - if (scanResult.severity === 'high' || scanResult.severity === 'medium') { - setPendingSave(true) - setShowSecurityDialog(true) - toast.warning('Security issues detected - review before saving') - return - } - - if (scanResult.issues.length > 0) { - toast.warning(`${scanResult.issues.length} minor security warning(s)`) - } - - onSave(parsed) - setError(null) - onClose() - } catch (err) { - setError(err instanceof Error ? err.message : 'Invalid JSON') - } - } - - const handleForceSave = () => { - try { - onSave(parseJson()) - setError(null) - setPendingSave(false) - setShowSecurityDialog(false) - onClose() - } catch (err) { - setError(err instanceof Error ? err.message : 'Invalid JSON') - } - } - - const handleScan = () => { - const scanResult = securityScanner.scanJSON(jsonText) - setSecurityScanResult(scanResult) - setShowSecurityDialog(true) - - if (scanResult.safe) { - toast.success('No security issues detected') - } else { - toast.warning(`${scanResult.issues.length} security issue(s) detected`) - } - } - - const handleFormat = () => { - try { - setJsonText(JSON.stringify(parseJson(), null, 2)) - setError(null) - } catch (err) { - setError(err instanceof Error ? err.message : 'Invalid JSON - cannot format') - } - } - - return ( - <> - - - - {title} - - -
- {error && ( - - - {error} - - )} - - {securityScanResult && - securityScanResult.severity !== 'safe' && - securityScanResult.severity !== 'low' && - !showSecurityDialog && ( - - - - {securityScanResult.issues.length} security{' '} - {securityScanResult.issues.length === 1 ? 'issue' : 'issues'} - detected. Click Security Scan to review. - - - )} - - - -
- { - setJsonText(value || '') - setError(null) - }} - theme="vs-dark" - options={{ - minimap: { enabled: true }, - fontSize: 14, - fontFamily: 'JetBrains Mono, monospace', - lineNumbers: 'on', - roundedSelection: true, - scrollBeyondLastLine: false, - automaticLayout: true, - tabSize: 2, - wordWrap: 'on', - formatOnPaste: true, - formatOnType: true, - bracketPairColorization: { - enabled: true, - }, - folding: true, - foldingStrategy: 'indentation', - }} - /> -
-
- - -
-
- - {securityScanResult && ( - { - setShowSecurityDialog(false) - setPendingSave(false) - }} - codeType="JSON data" - showProceedButton={pendingSave} - /> - )} - - ) -} diff --git a/frontends/nextjs/src/components/editors/json/SchemaSection.tsx b/frontends/nextjs/src/components/editors/json/SchemaSection.tsx deleted file mode 100644 index 3c1b367ba..000000000 --- a/frontends/nextjs/src/components/editors/json/SchemaSection.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui' - -interface SchemaSectionProps { - schema?: unknown -} - -export function SchemaSection({ schema }: SchemaSectionProps) { - if (!schema) return null - - const formattedSchema = typeof schema === 'string' ? schema : JSON.stringify(schema, null, 2) - - return ( - - - Schema - Reference for the expected JSON structure - - -
-          {formattedSchema}
-        
-
-
- ) -} diff --git a/frontends/nextjs/src/components/editors/json/Toolbar.tsx b/frontends/nextjs/src/components/editors/json/Toolbar.tsx deleted file mode 100644 index c69bda7f4..000000000 --- a/frontends/nextjs/src/components/editors/json/Toolbar.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { Button, DialogFooter } from '@/components/ui' -import { FloppyDisk, ShieldCheck, X } from '@/fakemui/icons' - -interface ToolbarProps { - onScan: () => void - onFormat: () => void - onCancel: () => void - onSave: () => void -} - -export function Toolbar({ onScan, onFormat, onCancel, onSave }: ToolbarProps) { - return ( - - - - - - - ) -} diff --git a/frontends/nextjs/src/components/editors/schema/SchemaEditor.tsx b/frontends/nextjs/src/components/editors/schema/SchemaEditor.tsx deleted file mode 100644 index 865905481..000000000 --- a/frontends/nextjs/src/components/editors/schema/SchemaEditor.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import Editor from '@monaco-editor/react' -import { useState } from 'react' - -import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui' -import { Button } from '@/components/ui' -import { Alert, AlertDescription } from '@/components/ui' -import { FloppyDisk, Warning, X } from '@/fakemui/icons' -import type { SchemaConfig } from '@/lib/schema-types' - -interface SchemaEditorProps { - open: boolean - onClose: () => void - schema: SchemaConfig - onSave: (schema: SchemaConfig) => void -} - -export function SchemaEditor({ open, onClose, schema, onSave }: SchemaEditorProps) { - const [schemaText, setSchemaText] = useState(JSON.stringify(schema, null, 2)) - const [error, setError] = useState(null) - - const handleSave = () => { - try { - const parsed = JSON.parse(schemaText) - - if (!parsed.apps || !Array.isArray(parsed.apps)) { - setError('Schema must have an "apps" array') - return - } - - onSave(parsed) - setError(null) - onClose() - } catch (err) { - setError(err instanceof Error ? err.message : 'Invalid JSON') - } - } - - return ( - - - - Edit Schema Configuration - - -
- {error && ( - - - {error} - - )} - -
- { - setSchemaText(value || '') - setError(null) - }} - theme="vs-dark" - options={{ - minimap: { enabled: true }, - fontSize: 14, - fontFamily: 'JetBrains Mono, monospace', - lineNumbers: 'on', - roundedSelection: true, - scrollBeyondLastLine: false, - automaticLayout: true, - tabSize: 2, - wordWrap: 'on', - formatOnPaste: true, - formatOnType: true, - }} - /> -
-
- - - - - -
-
- ) -} diff --git a/frontends/nextjs/src/components/editors/schema/SchemaEditorLevel4.tsx b/frontends/nextjs/src/components/editors/schema/SchemaEditorLevel4.tsx deleted file mode 100644 index 4a6dc4468..000000000 --- a/frontends/nextjs/src/components/editors/schema/SchemaEditorLevel4.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import { SchemaTabs } from '@/components/schema/level4/Tabs' -import { useSchemaLevel4 } from '@/components/schema/level4/useSchemaLevel4' -import { Button } from '@/components/ui' -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui' -import { Plus, Trash } from '@/fakemui/icons' -import type { ModelSchema } from '@/lib/schema-types' - -interface SchemaEditorLevel4Props { - schemas: ModelSchema[] - onSchemasChange: (schemas: ModelSchema[]) => void -} - -export function SchemaEditorLevel4({ schemas, onSchemasChange }: SchemaEditorLevel4Props) { - const { - currentModel, - selectedModel, - selectModel, - handleAddField, - handleAddModel, - handleDeleteField, - handleDeleteModel, - handleUpdateField, - handleUpdateModel, - } = useSchemaLevel4({ schemas, onSchemasChange }) - - return ( -
- - -
- Models - -
- Data model definitions -
- -
- {schemas.length === 0 ? ( -

- No models yet. Create one to start. -

- ) : ( - schemas.map(schema => ( -
selectModel(schema.name)} - > -
-
{schema.label || schema.name}
-
- {schema.fields.length} fields -
-
- -
- )) - )} -
-
-
- - - {!currentModel ? ( - -
-

Select or create a model to edit

-
-
- ) : ( - - )} -
-
- ) -} diff --git a/frontends/nextjs/src/components/level/ModeratorPanel.tsx b/frontends/nextjs/src/components/level/ModeratorPanel.tsx deleted file mode 100644 index a46f33c57..000000000 --- a/frontends/nextjs/src/components/level/ModeratorPanel.tsx +++ /dev/null @@ -1 +0,0 @@ -export { ModeratorPanel, type ModeratorPanelProps } from './panels/ModeratorPanel' diff --git a/frontends/nextjs/src/components/level/level1/CredentialsSection.tsx b/frontends/nextjs/src/components/level/level1/CredentialsSection.tsx deleted file mode 100644 index a4ffde684..000000000 --- a/frontends/nextjs/src/components/level/level1/CredentialsSection.tsx +++ /dev/null @@ -1,115 +0,0 @@ -'use client' - -import { useEffect, useState } from 'react' - -import { GodCredentialsBanner } from '@/components/level1/GodCredentialsBanner' -import { getScrambledPassword } from '@/lib/auth' - -import { ChallengePanel } from '../sections/ChallengePanel' - -export function CredentialsSection() { - const [showGodCredentials, setShowGodCredentials] = useState(false) - const [showSuperGodCredentials, setShowSuperGodCredentials] = useState(false) - const [showPassword, setShowPassword] = useState(false) - const [showSuperGodPassword, setShowSuperGodPassword] = useState(false) - const [copied, setCopied] = useState(false) - const [copiedSuper, setCopiedSuper] = useState(false) - const [timeRemaining, setTimeRemaining] = useState('') - - useEffect(() => { - let interval: ReturnType | undefined - - const checkCredentials = async () => { - try { - const { Database } = await import('@/lib/database') - - const shouldShow = await Database.shouldShowGodCredentials() - setShowGodCredentials(shouldShow) - - const superGod = await Database.getSuperGod() - const firstLoginFlags = await Database.getFirstLoginFlags() - setShowSuperGodCredentials(superGod !== null && firstLoginFlags['supergod'] === true) - - if (shouldShow) { - const expiry = await Database.getGodCredentialsExpiry() - const updateTimer = () => { - const now = Date.now() - const diff = expiry - now - - if (diff <= 0) { - setShowGodCredentials(false) - setTimeRemaining('') - return - } - - const minutes = Math.floor(diff / 60000) - const seconds = Math.floor((diff % 60000) / 1000) - setTimeRemaining(`${minutes}m ${seconds}s`) - } - - updateTimer() - interval = setInterval(updateTimer, 1000) - } - } catch { - setShowGodCredentials(false) - setShowSuperGodCredentials(false) - setTimeRemaining('') - } - } - - void checkCredentials() - - return () => { - if (interval) clearInterval(interval) - } - }, []) - - const handleCopyPassword = async () => { - await navigator.clipboard.writeText(getScrambledPassword('god')) - setCopied(true) - setTimeout(() => setCopied(false), 2000) - } - - const handleCopySuperGodPassword = async () => { - await navigator.clipboard.writeText(getScrambledPassword('supergod')) - setCopiedSuper(true) - setTimeout(() => setCopiedSuper(false), 2000) - } - - if (!showGodCredentials && !showSuperGodCredentials) return null - - return ( - -
- {showSuperGodCredentials && ( - setShowSuperGodPassword(!showSuperGodPassword)} - copied={copiedSuper} - onCopy={handleCopySuperGodPassword} - timeRemaining="" - variant="supergod" - /> - )} - - {showGodCredentials && ( - setShowPassword(!showPassword)} - copied={copied} - onCopy={handleCopyPassword} - timeRemaining={timeRemaining} - variant="god" - /> - )} -
-
- ) -} diff --git a/frontends/nextjs/src/components/level/level1/Level1Tabs.tsx b/frontends/nextjs/src/components/level/level1/Level1Tabs.tsx deleted file mode 100644 index 2611f5443..000000000 --- a/frontends/nextjs/src/components/level/level1/Level1Tabs.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui' - -import { ContactSection } from '../../level1/ContactSection' -import { FeaturesSection } from '../../level1/FeaturesSection' -import { HeroSection } from '../../level1/HeroSection' -import { GitHubActionsFetcher } from '../../misc/github/GitHubActionsFetcher' -import { ServerStatusPanel } from '../../status/ServerStatusPanel' -import { IntroSection } from '../sections/IntroSection' - -interface Level1TabsProps { - onNavigate: (level: number) => void -} - -export function Level1Tabs({ onNavigate }: Level1TabsProps) { - return ( - - - Home - GitHub Actions - Server Status - - - - - - -

- Whether you're a designer who wants to create without code, or a developer who wants to - work at a higher level of abstraction, MetaBuilder adapts to your needs. -

-
- -
- - - - - - - - - - -
- ) -} diff --git a/frontends/nextjs/src/components/level/level2/ChatTabContent.tsx b/frontends/nextjs/src/components/level/level2/ChatTabContent.tsx deleted file mode 100644 index 1bd8b337e..000000000 --- a/frontends/nextjs/src/components/level/level2/ChatTabContent.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { Box, Typography } from '@/fakemui' - -import { ResultsPane } from '../sections/ResultsPane' - -export function ChatTabContent() { - return ( - - - IRC Webchat - - This component is now a Lua package. See packages/irc_webchat/ - - - - ) -} diff --git a/frontends/nextjs/src/components/level/level2/CommentsTabContent.tsx b/frontends/nextjs/src/components/level/level2/CommentsTabContent.tsx deleted file mode 100644 index 43eee0913..000000000 --- a/frontends/nextjs/src/components/level/level2/CommentsTabContent.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { useMemo } from 'react' - -import { Button } from '@/components/ui' -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui' -import { Textarea } from '@/components/ui' -import type { Comment, User } from '@/lib/level-types' - -import { CommentsList } from '../../level2/CommentsList' -import { ChallengePanel } from '../sections/ChallengePanel' - -interface CommentsTabContentProps { - comments: Comment[] - users: User[] - currentUserId: string - newComment: string - onChangeComment: (value: string) => void - onPostComment: () => void - onDeleteComment: (commentId: string) => void -} - -export function CommentsTabContent({ - comments, - users, - currentUserId, - newComment, - onChangeComment, - onPostComment, - onDeleteComment, -}: CommentsTabContentProps) { - const userComments = useMemo( - () => comments.filter(c => c.userId === currentUserId), - [comments, currentUserId] - ) - - return ( - - - - Post a Comment - Share your thoughts with the community - - -