machinaos 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.template +71 -0
- package/LICENSE +21 -0
- package/README.md +87 -0
- package/bin/cli.js +159 -0
- package/client/.dockerignore +45 -0
- package/client/Dockerfile +68 -0
- package/client/eslint.config.js +29 -0
- package/client/index.html +13 -0
- package/client/nginx.conf +66 -0
- package/client/package.json +48 -0
- package/client/src/App.tsx +27 -0
- package/client/src/Dashboard.tsx +1173 -0
- package/client/src/ParameterPanel.tsx +301 -0
- package/client/src/components/AIAgentNode.tsx +321 -0
- package/client/src/components/APIKeyValidator.tsx +118 -0
- package/client/src/components/ClaudeChatModelNode.tsx +18 -0
- package/client/src/components/ConditionalEdge.tsx +189 -0
- package/client/src/components/CredentialsModal.tsx +306 -0
- package/client/src/components/EdgeConditionEditor.tsx +443 -0
- package/client/src/components/GeminiChatModelNode.tsx +18 -0
- package/client/src/components/GenericNode.tsx +357 -0
- package/client/src/components/LocationParameterPanel.tsx +154 -0
- package/client/src/components/ModelNode.tsx +286 -0
- package/client/src/components/OpenAIChatModelNode.tsx +18 -0
- package/client/src/components/OutputPanel.tsx +471 -0
- package/client/src/components/ParameterRenderer.tsx +1874 -0
- package/client/src/components/SkillEditorModal.tsx +417 -0
- package/client/src/components/SquareNode.tsx +797 -0
- package/client/src/components/StartNode.tsx +250 -0
- package/client/src/components/ToolkitNode.tsx +365 -0
- package/client/src/components/TriggerNode.tsx +463 -0
- package/client/src/components/auth/LoginPage.tsx +247 -0
- package/client/src/components/auth/ProtectedRoute.tsx +59 -0
- package/client/src/components/base/BaseChatModelNode.tsx +271 -0
- package/client/src/components/icons/AIProviderIcons.tsx +50 -0
- package/client/src/components/maps/GoogleMapsPicker.tsx +137 -0
- package/client/src/components/maps/MapsPreviewPanel.tsx +110 -0
- package/client/src/components/maps/index.ts +26 -0
- package/client/src/components/parameterPanel/InputSection.tsx +1094 -0
- package/client/src/components/parameterPanel/LocationPanelLayout.tsx +65 -0
- package/client/src/components/parameterPanel/MapsSection.tsx +92 -0
- package/client/src/components/parameterPanel/MiddleSection.tsx +571 -0
- package/client/src/components/parameterPanel/OutputSection.tsx +81 -0
- package/client/src/components/parameterPanel/ParameterPanelLayout.tsx +82 -0
- package/client/src/components/parameterPanel/ToolSchemaEditor.tsx +436 -0
- package/client/src/components/parameterPanel/index.ts +42 -0
- package/client/src/components/shared/DataPanel.tsx +142 -0
- package/client/src/components/shared/JSONTreeRenderer.tsx +106 -0
- package/client/src/components/ui/AIResultModal.tsx +204 -0
- package/client/src/components/ui/AndroidSettingsPanel.tsx +401 -0
- package/client/src/components/ui/CodeEditor.tsx +81 -0
- package/client/src/components/ui/CollapsibleSection.tsx +88 -0
- package/client/src/components/ui/ComponentItem.tsx +154 -0
- package/client/src/components/ui/ComponentPalette.tsx +321 -0
- package/client/src/components/ui/ConsolePanel.tsx +1074 -0
- package/client/src/components/ui/ErrorBoundary.tsx +196 -0
- package/client/src/components/ui/InputNodesPanel.tsx +204 -0
- package/client/src/components/ui/MapSelector.tsx +314 -0
- package/client/src/components/ui/Modal.tsx +149 -0
- package/client/src/components/ui/NodeContextMenu.tsx +192 -0
- package/client/src/components/ui/NodeOutputPanel.tsx +1150 -0
- package/client/src/components/ui/OutputDisplayPanel.tsx +381 -0
- package/client/src/components/ui/SettingsPanel.tsx +243 -0
- package/client/src/components/ui/TopToolbar.tsx +736 -0
- package/client/src/components/ui/WhatsAppSettingsPanel.tsx +345 -0
- package/client/src/components/ui/WorkflowSidebar.tsx +294 -0
- package/client/src/config/antdTheme.ts +186 -0
- package/client/src/config/api.ts +54 -0
- package/client/src/contexts/AuthContext.tsx +221 -0
- package/client/src/contexts/ThemeContext.tsx +42 -0
- package/client/src/contexts/WebSocketContext.tsx +1971 -0
- package/client/src/factories/baseChatModelFactory.ts +256 -0
- package/client/src/hooks/useAndroidOperations.ts +164 -0
- package/client/src/hooks/useApiKeyValidation.ts +107 -0
- package/client/src/hooks/useApiKeys.ts +238 -0
- package/client/src/hooks/useAppTheme.ts +17 -0
- package/client/src/hooks/useComponentPalette.ts +51 -0
- package/client/src/hooks/useCopyPaste.ts +155 -0
- package/client/src/hooks/useDragAndDrop.ts +124 -0
- package/client/src/hooks/useDragVariable.ts +88 -0
- package/client/src/hooks/useExecution.ts +313 -0
- package/client/src/hooks/useParameterPanel.ts +176 -0
- package/client/src/hooks/useReactFlowNodes.ts +189 -0
- package/client/src/hooks/useToolSchema.ts +209 -0
- package/client/src/hooks/useWhatsApp.ts +196 -0
- package/client/src/hooks/useWorkflowManagement.ts +46 -0
- package/client/src/index.css +315 -0
- package/client/src/main.tsx +19 -0
- package/client/src/nodeDefinitions/aiAgentNodes.ts +336 -0
- package/client/src/nodeDefinitions/aiModelNodes.ts +340 -0
- package/client/src/nodeDefinitions/androidDeviceNodes.ts +140 -0
- package/client/src/nodeDefinitions/androidServiceNodes.ts +383 -0
- package/client/src/nodeDefinitions/chatNodes.ts +135 -0
- package/client/src/nodeDefinitions/codeNodes.ts +54 -0
- package/client/src/nodeDefinitions/documentNodes.ts +379 -0
- package/client/src/nodeDefinitions/index.ts +15 -0
- package/client/src/nodeDefinitions/locationNodes.ts +463 -0
- package/client/src/nodeDefinitions/schedulerNodes.ts +220 -0
- package/client/src/nodeDefinitions/skillNodes.ts +211 -0
- package/client/src/nodeDefinitions/toolNodes.ts +198 -0
- package/client/src/nodeDefinitions/utilityNodes.ts +284 -0
- package/client/src/nodeDefinitions/whatsappNodes.ts +865 -0
- package/client/src/nodeDefinitions/workflowNodes.ts +41 -0
- package/client/src/nodeDefinitions.ts +104 -0
- package/client/src/schemas/workflowSchema.ts +264 -0
- package/client/src/services/dynamicParameterService.ts +96 -0
- package/client/src/services/execution/aiAgentExecutionService.ts +35 -0
- package/client/src/services/executionService.ts +232 -0
- package/client/src/services/workflowApi.ts +91 -0
- package/client/src/store/useAppStore.ts +582 -0
- package/client/src/styles/theme.ts +508 -0
- package/client/src/styles/zIndex.ts +17 -0
- package/client/src/types/ComponentTypes.ts +39 -0
- package/client/src/types/EdgeCondition.ts +231 -0
- package/client/src/types/INodeProperties.ts +288 -0
- package/client/src/types/NodeTypes.ts +28 -0
- package/client/src/utils/formatters.ts +33 -0
- package/client/src/utils/googleMapsLoader.ts +140 -0
- package/client/src/utils/locationUtils.ts +85 -0
- package/client/src/utils/nodeUtils.ts +31 -0
- package/client/src/utils/workflow.ts +30 -0
- package/client/src/utils/workflowExport.ts +120 -0
- package/client/src/vite-env.d.ts +12 -0
- package/client/tailwind.config.js +60 -0
- package/client/tsconfig.json +25 -0
- package/client/tsconfig.node.json +11 -0
- package/client/vite.config.js +35 -0
- package/docker-compose.prod.yml +107 -0
- package/docker-compose.yml +104 -0
- package/docs-MachinaOs/README.md +85 -0
- package/docs-MachinaOs/deployment/docker.mdx +228 -0
- package/docs-MachinaOs/deployment/production.mdx +345 -0
- package/docs-MachinaOs/docs.json +75 -0
- package/docs-MachinaOs/faq.mdx +309 -0
- package/docs-MachinaOs/favicon.svg +5 -0
- package/docs-MachinaOs/installation.mdx +160 -0
- package/docs-MachinaOs/introduction.mdx +114 -0
- package/docs-MachinaOs/logo/dark.svg +6 -0
- package/docs-MachinaOs/logo/light.svg +6 -0
- package/docs-MachinaOs/nodes/ai-agent.mdx +216 -0
- package/docs-MachinaOs/nodes/ai-models.mdx +240 -0
- package/docs-MachinaOs/nodes/android.mdx +411 -0
- package/docs-MachinaOs/nodes/overview.mdx +181 -0
- package/docs-MachinaOs/nodes/schedulers.mdx +316 -0
- package/docs-MachinaOs/nodes/webhooks.mdx +330 -0
- package/docs-MachinaOs/nodes/whatsapp.mdx +305 -0
- package/docs-MachinaOs/quickstart.mdx +119 -0
- package/docs-MachinaOs/tutorials/ai-agent-workflow.mdx +177 -0
- package/docs-MachinaOs/tutorials/android-automation.mdx +242 -0
- package/docs-MachinaOs/tutorials/first-workflow.mdx +134 -0
- package/docs-MachinaOs/tutorials/whatsapp-automation.mdx +185 -0
- package/nul +0 -0
- package/package.json +70 -0
- package/scripts/build.js +158 -0
- package/scripts/check-ports.ps1 +33 -0
- package/scripts/clean.js +40 -0
- package/scripts/docker.js +93 -0
- package/scripts/kill-port.ps1 +154 -0
- package/scripts/start.js +210 -0
- package/scripts/stop.js +325 -0
- package/server/.dockerignore +44 -0
- package/server/Dockerfile +45 -0
- package/server/constants.py +249 -0
- package/server/core/__init__.py +1 -0
- package/server/core/cache.py +461 -0
- package/server/core/config.py +128 -0
- package/server/core/container.py +99 -0
- package/server/core/database.py +1211 -0
- package/server/core/logging.py +314 -0
- package/server/main.py +289 -0
- package/server/middleware/__init__.py +5 -0
- package/server/middleware/auth.py +89 -0
- package/server/models/__init__.py +1 -0
- package/server/models/auth.py +52 -0
- package/server/models/cache.py +24 -0
- package/server/models/database.py +211 -0
- package/server/models/nodes.py +455 -0
- package/server/package.json +9 -0
- package/server/pyproject.toml +72 -0
- package/server/requirements.txt +83 -0
- package/server/routers/__init__.py +1 -0
- package/server/routers/android.py +294 -0
- package/server/routers/auth.py +203 -0
- package/server/routers/database.py +151 -0
- package/server/routers/maps.py +142 -0
- package/server/routers/nodejs_compat.py +289 -0
- package/server/routers/webhook.py +90 -0
- package/server/routers/websocket.py +2127 -0
- package/server/routers/whatsapp.py +761 -0
- package/server/routers/workflow.py +200 -0
- package/server/services/__init__.py +1 -0
- package/server/services/ai.py +2415 -0
- package/server/services/android/__init__.py +27 -0
- package/server/services/android/broadcaster.py +114 -0
- package/server/services/android/client.py +608 -0
- package/server/services/android/manager.py +78 -0
- package/server/services/android/protocol.py +165 -0
- package/server/services/android_service.py +588 -0
- package/server/services/auth.py +131 -0
- package/server/services/chat_client.py +160 -0
- package/server/services/deployment/__init__.py +12 -0
- package/server/services/deployment/manager.py +706 -0
- package/server/services/deployment/state.py +47 -0
- package/server/services/deployment/triggers.py +275 -0
- package/server/services/event_waiter.py +785 -0
- package/server/services/execution/__init__.py +77 -0
- package/server/services/execution/cache.py +769 -0
- package/server/services/execution/conditions.py +373 -0
- package/server/services/execution/dlq.py +132 -0
- package/server/services/execution/executor.py +1351 -0
- package/server/services/execution/models.py +531 -0
- package/server/services/execution/recovery.py +235 -0
- package/server/services/handlers/__init__.py +126 -0
- package/server/services/handlers/ai.py +355 -0
- package/server/services/handlers/android.py +260 -0
- package/server/services/handlers/code.py +278 -0
- package/server/services/handlers/document.py +598 -0
- package/server/services/handlers/http.py +193 -0
- package/server/services/handlers/polyglot.py +105 -0
- package/server/services/handlers/tools.py +845 -0
- package/server/services/handlers/triggers.py +107 -0
- package/server/services/handlers/utility.py +822 -0
- package/server/services/handlers/whatsapp.py +476 -0
- package/server/services/maps.py +289 -0
- package/server/services/memory_store.py +103 -0
- package/server/services/node_executor.py +375 -0
- package/server/services/parameter_resolver.py +218 -0
- package/server/services/polyglot_client.py +169 -0
- package/server/services/scheduler.py +155 -0
- package/server/services/skill_loader.py +417 -0
- package/server/services/status_broadcaster.py +826 -0
- package/server/services/temporal/__init__.py +23 -0
- package/server/services/temporal/activities.py +344 -0
- package/server/services/temporal/client.py +76 -0
- package/server/services/temporal/executor.py +147 -0
- package/server/services/temporal/worker.py +251 -0
- package/server/services/temporal/workflow.py +355 -0
- package/server/services/temporal/ws_client.py +236 -0
- package/server/services/text.py +111 -0
- package/server/services/user_auth.py +172 -0
- package/server/services/websocket_client.py +29 -0
- package/server/services/workflow.py +597 -0
- package/server/skills/android-skill/SKILL.md +82 -0
- package/server/skills/assistant-personality/SKILL.md +45 -0
- package/server/skills/code-skill/SKILL.md +140 -0
- package/server/skills/http-skill/SKILL.md +161 -0
- package/server/skills/maps-skill/SKILL.md +170 -0
- package/server/skills/memory-skill/SKILL.md +154 -0
- package/server/skills/scheduler-skill/SKILL.md +84 -0
- package/server/skills/whatsapp-skill/SKILL.md +283 -0
- package/server/uv.lock +2916 -0
- package/server/whatsapp-rpc/.dockerignore +30 -0
- package/server/whatsapp-rpc/Dockerfile +44 -0
- package/server/whatsapp-rpc/Dockerfile.web +17 -0
- package/server/whatsapp-rpc/README.md +139 -0
- package/server/whatsapp-rpc/cli.js +95 -0
- package/server/whatsapp-rpc/configs/config.yaml +7 -0
- package/server/whatsapp-rpc/docker-compose.yml +35 -0
- package/server/whatsapp-rpc/docs/API.md +410 -0
- package/server/whatsapp-rpc/go.mod +67 -0
- package/server/whatsapp-rpc/go.sum +203 -0
- package/server/whatsapp-rpc/package.json +30 -0
- package/server/whatsapp-rpc/schema.json +1294 -0
- package/server/whatsapp-rpc/scripts/clean.cjs +66 -0
- package/server/whatsapp-rpc/scripts/cli.js +162 -0
- package/server/whatsapp-rpc/src/go/cmd/server/main.go +91 -0
- package/server/whatsapp-rpc/src/go/config/config.go +49 -0
- package/server/whatsapp-rpc/src/go/rpc/rpc.go +446 -0
- package/server/whatsapp-rpc/src/go/rpc/server.go +112 -0
- package/server/whatsapp-rpc/src/go/whatsapp/history.go +166 -0
- package/server/whatsapp-rpc/src/go/whatsapp/messages.go +390 -0
- package/server/whatsapp-rpc/src/go/whatsapp/service.go +2130 -0
- package/server/whatsapp-rpc/src/go/whatsapp/types.go +261 -0
- package/server/whatsapp-rpc/src/python/pyproject.toml +15 -0
- package/server/whatsapp-rpc/src/python/whatsapp_rpc/__init__.py +4 -0
- package/server/whatsapp-rpc/src/python/whatsapp_rpc/client.py +427 -0
- package/server/whatsapp-rpc/web/app.py +609 -0
- package/server/whatsapp-rpc/web/requirements.txt +6 -0
- package/server/whatsapp-rpc/web/rpc_client.py +427 -0
- package/server/whatsapp-rpc/web/static/openapi.yaml +59 -0
- package/server/whatsapp-rpc/web/templates/base.html +150 -0
- package/server/whatsapp-rpc/web/templates/contacts.html +240 -0
- package/server/whatsapp-rpc/web/templates/dashboard.html +320 -0
- package/server/whatsapp-rpc/web/templates/groups.html +328 -0
- package/server/whatsapp-rpc/web/templates/messages.html +465 -0
- package/server/whatsapp-rpc/web/templates/messaging.html +681 -0
- package/server/whatsapp-rpc/web/templates/send.html +259 -0
- package/server/whatsapp-rpc/web/templates/settings.html +459 -0
package/.env.template
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Service Ports (used by start.js, vite, and docker-compose)
|
|
2
|
+
VITE_CLIENT_PORT=3000
|
|
3
|
+
PYTHON_BACKEND_PORT=3010
|
|
4
|
+
WHATSAPP_RPC_PORT=9400
|
|
5
|
+
REDIS_PORT=6379
|
|
6
|
+
|
|
7
|
+
# Server Configuration
|
|
8
|
+
HOST=127.0.0.1
|
|
9
|
+
PORT=3010
|
|
10
|
+
DEBUG=false
|
|
11
|
+
WORKERS=1
|
|
12
|
+
|
|
13
|
+
# Security (Development keys - MUST CHANGE FOR PRODUCTION)
|
|
14
|
+
SECRET_KEY=dev-secret-key-12345678901234567890123456789012
|
|
15
|
+
API_KEY_ENCRYPTION_KEY=dev-encryption-key-12345678901234567890123456
|
|
16
|
+
|
|
17
|
+
# Authentication
|
|
18
|
+
# VITE_AUTH_ENABLED: "true" (require login) or "false" (bypass authentication)
|
|
19
|
+
VITE_AUTH_ENABLED=false
|
|
20
|
+
# AUTH_MODE: "single" (local deploy - first user is owner) or "multi" (cloud - open registration)
|
|
21
|
+
AUTH_MODE=single
|
|
22
|
+
JWT_SECRET_KEY=dev-jwt-secret-key-12345678901234567890
|
|
23
|
+
JWT_EXPIRE_MINUTES=10080
|
|
24
|
+
JWT_COOKIE_NAME=machina_token
|
|
25
|
+
JWT_COOKIE_SECURE=false
|
|
26
|
+
JWT_COOKIE_SAMESITE=lax
|
|
27
|
+
|
|
28
|
+
# CORS Configuration - Allow all common dev ports
|
|
29
|
+
CORS_ORIGINS=["http://localhost:3000","http://localhost:3001","http://localhost:3002","http://localhost:3003","http://localhost:3004","http://localhost:3005","http://localhost:3006","http://127.0.0.1:3000","http://127.0.0.1:3001","http://127.0.0.1:3002","http://127.0.0.1:3003","http://127.0.0.1:3004","http://127.0.0.1:3005","http://127.0.0.1:3006","http://localhost:5173"]
|
|
30
|
+
|
|
31
|
+
# Database Configuration
|
|
32
|
+
DATABASE_URL=sqlite+aiosqlite:///./data/workflow.db
|
|
33
|
+
DATABASE_ECHO=false
|
|
34
|
+
DATABASE_POOL_SIZE=5
|
|
35
|
+
DATABASE_MAX_OVERFLOW=10
|
|
36
|
+
|
|
37
|
+
# Cache Configuration (Disabled for development)
|
|
38
|
+
REDIS_ENABLED=false
|
|
39
|
+
CACHE_TTL=300
|
|
40
|
+
|
|
41
|
+
# Logging
|
|
42
|
+
LOG_LEVEL=INFO
|
|
43
|
+
LOG_FORMAT=text
|
|
44
|
+
|
|
45
|
+
# Rate Limiting (Relaxed for development)
|
|
46
|
+
RATE_LIMIT_ENABLED=false
|
|
47
|
+
RATE_LIMIT_REQUESTS=1000
|
|
48
|
+
RATE_LIMIT_WINDOW=60
|
|
49
|
+
|
|
50
|
+
# Service Timeouts (Extended for debugging)
|
|
51
|
+
AI_TIMEOUT=60
|
|
52
|
+
AI_MAX_RETRIES=1
|
|
53
|
+
AI_RETRY_DELAY=0.5
|
|
54
|
+
|
|
55
|
+
MAPS_TIMEOUT=30
|
|
56
|
+
|
|
57
|
+
# Health Check
|
|
58
|
+
HEALTH_CHECK_INTERVAL=60
|
|
59
|
+
|
|
60
|
+
# WebSocket Configuration (For remote Android device connections)
|
|
61
|
+
WEBSOCKET_URL=
|
|
62
|
+
WEBSOCKET_API_KEY=
|
|
63
|
+
|
|
64
|
+
# WhatsApp Service URL
|
|
65
|
+
WHATSAPP_SERVICE_URL=http://localhost:5000
|
|
66
|
+
|
|
67
|
+
# External API Keys (managed through UI, these are optional defaults)
|
|
68
|
+
OPENAI_API_KEY=
|
|
69
|
+
GOOGLE_MAPS_API_KEY=
|
|
70
|
+
ANTHROPIC_API_KEY=
|
|
71
|
+
GOOGLE_AI_API_KEY=
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 MachinaOs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# MachinaOs
|
|
2
|
+
|
|
3
|
+
Platform to Build Personal AI Assistants for Yourself that Perform Human Like Tasks.
|
|
4
|
+
mashup of N8N + Clawdbot
|
|
5
|
+
|
|
6
|
+
## Quick Start
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
git clone https://github.com/trohitg/MachinaOS.git
|
|
10
|
+
cd MachinaOs
|
|
11
|
+
npm run docker:build
|
|
12
|
+
npm run docker:up
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Open http://localhost:3000
|
|
16
|
+
|
|
17
|
+
## Local Development
|
|
18
|
+
|
|
19
|
+
**Prerequisites:** Node.js 18+, Python 3.10+, Go 1.21+
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm run build
|
|
23
|
+
npm run start
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Features
|
|
29
|
+
|
|
30
|
+
- **AI Workflows** - OpenAI, Claude, Gemini models with tool calling
|
|
31
|
+
- **Android Automation** - Control your phone via 17 service nodes
|
|
32
|
+
- **WhatsApp Bots** - Send/receive messages with filters
|
|
33
|
+
- **HTTP/Webhooks** - API integrations
|
|
34
|
+
- **Tool Schema Editor** - Customize AI tool schemas per service
|
|
35
|
+
|
|
36
|
+
## Docker Commands
|
|
37
|
+
|
|
38
|
+
### Development (hot reload, larger images)
|
|
39
|
+
| Command | Description |
|
|
40
|
+
|---------|-------------|
|
|
41
|
+
| `npm run docker:build` | Build dev images |
|
|
42
|
+
| `npm run docker:up` | Start dev containers |
|
|
43
|
+
| `npm run docker:down` | Stop containers |
|
|
44
|
+
| `npm run docker:logs` | View logs |
|
|
45
|
+
|
|
46
|
+
### Production (optimized, smaller images)
|
|
47
|
+
| Command | Description |
|
|
48
|
+
|---------|-------------|
|
|
49
|
+
| `npm run docker:prod:build` | Build prod images |
|
|
50
|
+
| `npm run docker:prod:up` | Start prod containers |
|
|
51
|
+
| `npm run docker:prod:logs` | View logs |
|
|
52
|
+
|
|
53
|
+
**Redis (optional):** Set `REDIS_ENABLED=true` in `.env`
|
|
54
|
+
|
|
55
|
+
## Local Commands
|
|
56
|
+
|
|
57
|
+
| Command | Description |
|
|
58
|
+
|---------|-------------|
|
|
59
|
+
| `npm run start` | Start all services |
|
|
60
|
+
| `npm run stop` | Stop all services |
|
|
61
|
+
| `npm run build` | Install dependencies |
|
|
62
|
+
|
|
63
|
+
## Configuration
|
|
64
|
+
|
|
65
|
+
**API Keys:** Click **Credentials** button in toolbar to add API keys for OpenAI, Claude, Google Maps, etc.
|
|
66
|
+
|
|
67
|
+
**Environment:** Edit `.env` for auth settings, ports, and database location.
|
|
68
|
+
|
|
69
|
+
## Project Structure
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
MachinaOs/
|
|
73
|
+
├── client/ # React frontend (localhost:3000)
|
|
74
|
+
├── server/ # Python backend (localhost:3010)
|
|
75
|
+
│ └── whatsapp-rpc/ # WhatsApp service
|
|
76
|
+
└── package.json
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Tech Stack
|
|
80
|
+
|
|
81
|
+
- **Frontend:** React, TypeScript, React Flow
|
|
82
|
+
- **Backend:** Python, FastAPI, SQLite
|
|
83
|
+
- **Services:** WhatsApp (Go), WebSocket relay
|
|
84
|
+
|
|
85
|
+
## License
|
|
86
|
+
|
|
87
|
+
MIT
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { spawn, execSync } from 'child_process';
|
|
4
|
+
import { existsSync, copyFileSync } from 'fs';
|
|
5
|
+
import { resolve, dirname } from 'path';
|
|
6
|
+
import { fileURLToPath } from 'url';
|
|
7
|
+
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = dirname(__filename);
|
|
10
|
+
const ROOT_DIR = resolve(__dirname, '..');
|
|
11
|
+
|
|
12
|
+
const COMMANDS = {
|
|
13
|
+
start: 'Start the development server',
|
|
14
|
+
stop: 'Stop all running services',
|
|
15
|
+
build: 'Build the project for production',
|
|
16
|
+
'docker:up': 'Start with Docker Compose',
|
|
17
|
+
'docker:down': 'Stop Docker Compose services',
|
|
18
|
+
'docker:logs': 'View Docker logs',
|
|
19
|
+
init: 'Initialize environment file from template',
|
|
20
|
+
help: 'Show this help message',
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
function printHelp() {
|
|
24
|
+
console.log(`
|
|
25
|
+
MachinaOS - Workflow Automation Platform
|
|
26
|
+
|
|
27
|
+
Usage: machinaos <command>
|
|
28
|
+
|
|
29
|
+
Commands:
|
|
30
|
+
${Object.entries(COMMANDS)
|
|
31
|
+
.map(([cmd, desc]) => ` ${cmd.padEnd(14)} ${desc}`)
|
|
32
|
+
.join('\n')}
|
|
33
|
+
|
|
34
|
+
Examples:
|
|
35
|
+
machinaos init # Create .env from template
|
|
36
|
+
machinaos start # Start development server
|
|
37
|
+
machinaos docker:up # Start with Docker
|
|
38
|
+
|
|
39
|
+
Documentation: https://github.com/trohitg/MachinaOS
|
|
40
|
+
`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function checkDependencies() {
|
|
44
|
+
const missing = [];
|
|
45
|
+
|
|
46
|
+
// Check Node.js version
|
|
47
|
+
const nodeVersion = process.version.slice(1).split('.')[0];
|
|
48
|
+
if (parseInt(nodeVersion) < 18) {
|
|
49
|
+
console.error(`Error: Node.js 18+ required (found ${process.version})`);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Check Python
|
|
54
|
+
try {
|
|
55
|
+
execSync('python --version', { stdio: 'pipe' });
|
|
56
|
+
} catch {
|
|
57
|
+
missing.push('Python 3.11+');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Check uv (Python package manager)
|
|
61
|
+
try {
|
|
62
|
+
execSync('uv --version', { stdio: 'pipe' });
|
|
63
|
+
} catch {
|
|
64
|
+
missing.push('uv (install: curl -LsSf https://astral.sh/uv/install.sh | sh)');
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (missing.length > 0) {
|
|
68
|
+
console.error('Missing dependencies:');
|
|
69
|
+
missing.forEach((dep) => console.error(` - ${dep}`));
|
|
70
|
+
console.error('\nPlease install the missing dependencies and try again.');
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function initEnv() {
|
|
76
|
+
const envPath = resolve(ROOT_DIR, 'server', '.env');
|
|
77
|
+
const templatePath = resolve(ROOT_DIR, '.env.template');
|
|
78
|
+
|
|
79
|
+
if (existsSync(envPath)) {
|
|
80
|
+
console.log('.env file already exists at server/.env');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (!existsSync(templatePath)) {
|
|
85
|
+
console.error('Error: .env.template not found');
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
copyFileSync(templatePath, envPath);
|
|
90
|
+
console.log('Created server/.env from template');
|
|
91
|
+
console.log('Edit server/.env to configure your API keys and settings');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function runNpmScript(script) {
|
|
95
|
+
const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
96
|
+
const child = spawn(npm, ['run', script], {
|
|
97
|
+
cwd: ROOT_DIR,
|
|
98
|
+
stdio: 'inherit',
|
|
99
|
+
shell: true,
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
child.on('error', (err) => {
|
|
103
|
+
console.error(`Failed to run: ${err.message}`);
|
|
104
|
+
process.exit(1);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
child.on('close', (code) => {
|
|
108
|
+
process.exit(code || 0);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Main
|
|
113
|
+
const [, , command = 'help'] = process.argv;
|
|
114
|
+
|
|
115
|
+
switch (command) {
|
|
116
|
+
case 'help':
|
|
117
|
+
case '--help':
|
|
118
|
+
case '-h':
|
|
119
|
+
printHelp();
|
|
120
|
+
break;
|
|
121
|
+
|
|
122
|
+
case 'init':
|
|
123
|
+
initEnv();
|
|
124
|
+
break;
|
|
125
|
+
|
|
126
|
+
case 'start':
|
|
127
|
+
checkDependencies();
|
|
128
|
+
if (!existsSync(resolve(ROOT_DIR, 'server', '.env'))) {
|
|
129
|
+
console.log('No .env found. Running init first...');
|
|
130
|
+
initEnv();
|
|
131
|
+
}
|
|
132
|
+
runNpmScript('start');
|
|
133
|
+
break;
|
|
134
|
+
|
|
135
|
+
case 'stop':
|
|
136
|
+
runNpmScript('stop');
|
|
137
|
+
break;
|
|
138
|
+
|
|
139
|
+
case 'build':
|
|
140
|
+
runNpmScript('build');
|
|
141
|
+
break;
|
|
142
|
+
|
|
143
|
+
case 'docker:up':
|
|
144
|
+
runNpmScript('docker:up');
|
|
145
|
+
break;
|
|
146
|
+
|
|
147
|
+
case 'docker:down':
|
|
148
|
+
runNpmScript('docker:down');
|
|
149
|
+
break;
|
|
150
|
+
|
|
151
|
+
case 'docker:logs':
|
|
152
|
+
runNpmScript('docker:logs');
|
|
153
|
+
break;
|
|
154
|
+
|
|
155
|
+
default:
|
|
156
|
+
console.error(`Unknown command: ${command}`);
|
|
157
|
+
printHelp();
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Dependencies
|
|
2
|
+
node_modules/
|
|
3
|
+
|
|
4
|
+
# Build output
|
|
5
|
+
dist/
|
|
6
|
+
build/
|
|
7
|
+
|
|
8
|
+
# IDE
|
|
9
|
+
.vscode/
|
|
10
|
+
.idea/
|
|
11
|
+
*.swp
|
|
12
|
+
*.swo
|
|
13
|
+
|
|
14
|
+
# Logs
|
|
15
|
+
*.log
|
|
16
|
+
npm-debug.log*
|
|
17
|
+
yarn-debug.log*
|
|
18
|
+
yarn-error.log*
|
|
19
|
+
|
|
20
|
+
# Environment
|
|
21
|
+
.env
|
|
22
|
+
.env.*
|
|
23
|
+
!.env.example
|
|
24
|
+
|
|
25
|
+
# Git
|
|
26
|
+
.git/
|
|
27
|
+
.gitignore
|
|
28
|
+
|
|
29
|
+
# Documentation
|
|
30
|
+
*.md
|
|
31
|
+
!README.md
|
|
32
|
+
|
|
33
|
+
# Test
|
|
34
|
+
coverage/
|
|
35
|
+
__tests__/
|
|
36
|
+
*.test.ts
|
|
37
|
+
*.test.tsx
|
|
38
|
+
*.spec.ts
|
|
39
|
+
*.spec.tsx
|
|
40
|
+
|
|
41
|
+
# TypeScript cache
|
|
42
|
+
*.tsbuildinfo
|
|
43
|
+
|
|
44
|
+
# ESLint cache
|
|
45
|
+
.eslintcache
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# React Frontend (Vite)
|
|
2
|
+
# Development stage
|
|
3
|
+
FROM node:22-alpine AS development
|
|
4
|
+
|
|
5
|
+
WORKDIR /app
|
|
6
|
+
|
|
7
|
+
# Copy package files
|
|
8
|
+
COPY package.json package-lock.json* ./
|
|
9
|
+
|
|
10
|
+
# Install dependencies (npm ci for faster, deterministic installs)
|
|
11
|
+
RUN npm ci
|
|
12
|
+
|
|
13
|
+
# Copy application code
|
|
14
|
+
COPY . .
|
|
15
|
+
|
|
16
|
+
# Port from environment (default 3000)
|
|
17
|
+
ENV VITE_CLIENT_PORT=3000
|
|
18
|
+
|
|
19
|
+
# Expose default port (actual port set via environment)
|
|
20
|
+
EXPOSE 3000
|
|
21
|
+
|
|
22
|
+
# Run the application
|
|
23
|
+
CMD ["npm", "run", "start"]
|
|
24
|
+
|
|
25
|
+
# Build stage
|
|
26
|
+
FROM node:22-alpine AS builder
|
|
27
|
+
|
|
28
|
+
WORKDIR /app
|
|
29
|
+
|
|
30
|
+
# Copy package files
|
|
31
|
+
COPY package.json package-lock.json* ./
|
|
32
|
+
|
|
33
|
+
# Install dependencies (npm ci for faster, deterministic installs)
|
|
34
|
+
RUN npm ci
|
|
35
|
+
|
|
36
|
+
# Copy application code
|
|
37
|
+
COPY . .
|
|
38
|
+
|
|
39
|
+
# Build arguments for Vite environment variables (set at build time)
|
|
40
|
+
ARG VITE_AUTH_ENABLED=true
|
|
41
|
+
ARG VITE_PYTHON_SERVICE_URL=
|
|
42
|
+
ARG VITE_WHATSAPP_SERVICE_URL=
|
|
43
|
+
ARG VITE_ANDROID_RELAY_URL=
|
|
44
|
+
|
|
45
|
+
# Expose build args as environment variables for Vite build
|
|
46
|
+
ENV VITE_AUTH_ENABLED=$VITE_AUTH_ENABLED
|
|
47
|
+
ENV VITE_PYTHON_SERVICE_URL=$VITE_PYTHON_SERVICE_URL
|
|
48
|
+
ENV VITE_WHATSAPP_SERVICE_URL=$VITE_WHATSAPP_SERVICE_URL
|
|
49
|
+
ENV VITE_ANDROID_RELAY_URL=$VITE_ANDROID_RELAY_URL
|
|
50
|
+
|
|
51
|
+
# Increase Node.js memory limit for large builds (GCP e2-micro has limited RAM)
|
|
52
|
+
ENV NODE_OPTIONS="--max-old-space-size=2048"
|
|
53
|
+
|
|
54
|
+
# Build for production
|
|
55
|
+
RUN npm run build
|
|
56
|
+
|
|
57
|
+
# Production stage
|
|
58
|
+
FROM nginx:alpine AS production
|
|
59
|
+
|
|
60
|
+
# Copy built assets
|
|
61
|
+
COPY --from=builder /app/dist /usr/share/nginx/html
|
|
62
|
+
|
|
63
|
+
# Copy nginx config
|
|
64
|
+
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
|
65
|
+
|
|
66
|
+
EXPOSE 80
|
|
67
|
+
|
|
68
|
+
CMD ["nginx", "-g", "daemon off;"]
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import js from '@eslint/js'
|
|
2
|
+
import globals from 'globals'
|
|
3
|
+
import reactHooks from 'eslint-plugin-react-hooks'
|
|
4
|
+
import reactRefresh from 'eslint-plugin-react-refresh'
|
|
5
|
+
import { defineConfig, globalIgnores } from 'eslint/config'
|
|
6
|
+
|
|
7
|
+
export default defineConfig([
|
|
8
|
+
globalIgnores(['dist']),
|
|
9
|
+
{
|
|
10
|
+
files: ['**/*.{js,jsx}'],
|
|
11
|
+
extends: [
|
|
12
|
+
js.configs.recommended,
|
|
13
|
+
reactHooks.configs['recommended-latest'],
|
|
14
|
+
reactRefresh.configs.vite,
|
|
15
|
+
],
|
|
16
|
+
languageOptions: {
|
|
17
|
+
ecmaVersion: 2020,
|
|
18
|
+
globals: globals.browser,
|
|
19
|
+
parserOptions: {
|
|
20
|
+
ecmaVersion: 'latest',
|
|
21
|
+
ecmaFeatures: { jsx: true },
|
|
22
|
+
sourceType: 'module',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
rules: {
|
|
26
|
+
'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }],
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
])
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
+
<title>React Flow Project</title>
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<div id="root"></div>
|
|
11
|
+
<script type="module" src="/src/main.tsx"></script>
|
|
12
|
+
</body>
|
|
13
|
+
</html>
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
server {
|
|
2
|
+
listen 80;
|
|
3
|
+
server_name localhost;
|
|
4
|
+
root /usr/share/nginx/html;
|
|
5
|
+
index index.html;
|
|
6
|
+
|
|
7
|
+
# Gzip compression
|
|
8
|
+
gzip on;
|
|
9
|
+
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
|
|
10
|
+
|
|
11
|
+
# Security headers
|
|
12
|
+
add_header X-Content-Type-Options "nosniff" always;
|
|
13
|
+
add_header X-Frame-Options "SAMEORIGIN" always;
|
|
14
|
+
|
|
15
|
+
# Handle SPA routing
|
|
16
|
+
location / {
|
|
17
|
+
try_files $uri $uri/ /index.html;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
# Proxy API requests to backend
|
|
21
|
+
location /api/ {
|
|
22
|
+
proxy_pass http://backend:3010/api/;
|
|
23
|
+
proxy_http_version 1.1;
|
|
24
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
25
|
+
proxy_set_header Connection 'upgrade';
|
|
26
|
+
proxy_set_header Host $host;
|
|
27
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
28
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
29
|
+
proxy_cache_bypass $http_upgrade;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
# Proxy webhook requests to backend
|
|
33
|
+
location /webhook/ {
|
|
34
|
+
proxy_pass http://backend:3010/webhook/;
|
|
35
|
+
proxy_http_version 1.1;
|
|
36
|
+
proxy_set_header Host $host;
|
|
37
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
38
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
39
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
# Proxy WebSocket requests
|
|
43
|
+
location /ws/ {
|
|
44
|
+
proxy_pass http://backend:3010/ws/;
|
|
45
|
+
proxy_http_version 1.1;
|
|
46
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
47
|
+
proxy_set_header Connection "Upgrade";
|
|
48
|
+
proxy_set_header Host $host;
|
|
49
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
50
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
51
|
+
proxy_read_timeout 86400;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
# Health check endpoint
|
|
55
|
+
location /health {
|
|
56
|
+
proxy_pass http://backend:3010/health;
|
|
57
|
+
proxy_http_version 1.1;
|
|
58
|
+
proxy_set_header Host $host;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
# Cache static assets
|
|
62
|
+
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
|
|
63
|
+
expires 1y;
|
|
64
|
+
add_header Cache-Control "public, immutable";
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "react-flow-client",
|
|
3
|
+
"private": true,
|
|
4
|
+
"version": "0.0.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"start": "vite --host 0.0.0.0 --port ${VITE_CLIENT_PORT:-3000}",
|
|
8
|
+
"dev": "vite",
|
|
9
|
+
"build": "vite build",
|
|
10
|
+
"lint": "eslint .",
|
|
11
|
+
"preview": "vite preview"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@ant-design/icons": "^6.0.2",
|
|
15
|
+
"@lobehub/icons": "^2.45.0",
|
|
16
|
+
"@radix-ui/react-collapsible": "^1.1.12",
|
|
17
|
+
"@radix-ui/react-dialog": "^1.1.15",
|
|
18
|
+
"@types/styled-components": "^5.1.34",
|
|
19
|
+
"antd": "^5.27.4",
|
|
20
|
+
"prismjs": "^1.30.0",
|
|
21
|
+
"react": "^19.1.1",
|
|
22
|
+
"react-dom": "^19.1.1",
|
|
23
|
+
"react-js-cron": "^5.2.0",
|
|
24
|
+
"react-markdown": "^10.1.0",
|
|
25
|
+
"react-simple-code-editor": "^0.14.1",
|
|
26
|
+
"reactflow": "^11.11.4",
|
|
27
|
+
"styled-components": "^6.1.19",
|
|
28
|
+
"zustand": "^5.0.8"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@eslint/js": "^9.33.0",
|
|
32
|
+
"@types/google.maps": "^3.58.1",
|
|
33
|
+
"@types/node": "^24.3.1",
|
|
34
|
+
"@types/prismjs": "^1.26.5",
|
|
35
|
+
"@types/react": "^19.1.10",
|
|
36
|
+
"@types/react-dom": "^19.1.7",
|
|
37
|
+
"@vitejs/plugin-react": "^5.0.0",
|
|
38
|
+
"autoprefixer": "^10.4.21",
|
|
39
|
+
"eslint": "^9.33.0",
|
|
40
|
+
"eslint-plugin-react-hooks": "^7.0.1",
|
|
41
|
+
"eslint-plugin-react-refresh": "^0.4.20",
|
|
42
|
+
"globals": "^16.3.0",
|
|
43
|
+
"postcss": "^8.5.6",
|
|
44
|
+
"tailwindcss": "^4.1.13",
|
|
45
|
+
"typescript": "^5.9.2",
|
|
46
|
+
"vite": "^7.1.2"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ConfigProvider, theme as antdThemeAlgorithm } from 'antd';
|
|
3
|
+
import Dashboard from './Dashboard';
|
|
4
|
+
import ProtectedRoute from './components/auth/ProtectedRoute';
|
|
5
|
+
import { lightTheme, darkTheme } from './config/antdTheme';
|
|
6
|
+
import { useTheme } from './contexts/ThemeContext';
|
|
7
|
+
|
|
8
|
+
const App: React.FC = () => {
|
|
9
|
+
const { isDarkMode } = useTheme();
|
|
10
|
+
|
|
11
|
+
const currentTheme = isDarkMode ? {
|
|
12
|
+
...darkTheme,
|
|
13
|
+
algorithm: antdThemeAlgorithm.darkAlgorithm,
|
|
14
|
+
} : lightTheme;
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<ConfigProvider theme={currentTheme}>
|
|
18
|
+
<ProtectedRoute>
|
|
19
|
+
<div style={{ width: '100vw', height: '100vh', display: 'flex' }}>
|
|
20
|
+
<Dashboard />
|
|
21
|
+
</div>
|
|
22
|
+
</ProtectedRoute>
|
|
23
|
+
</ConfigProvider>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export default App
|