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
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useToolSchema Hook - WebSocket-based tool schema management
|
|
3
|
+
*
|
|
4
|
+
* Provides tool schema operations for Android Toolkit and other tool nodes.
|
|
5
|
+
* The database-stored schema is the source of truth for LLM tool configurations.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { useCallback, useState } from 'react';
|
|
9
|
+
import { useWebSocket } from '../contexts/WebSocketContext';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Schema field configuration for tool arguments
|
|
13
|
+
*/
|
|
14
|
+
export interface SchemaFieldConfig {
|
|
15
|
+
type: 'string' | 'number' | 'integer' | 'boolean' | 'object' | 'array';
|
|
16
|
+
description: string;
|
|
17
|
+
required?: boolean;
|
|
18
|
+
default?: any;
|
|
19
|
+
enum?: string[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Full schema configuration stored in database
|
|
24
|
+
*/
|
|
25
|
+
export interface ToolSchemaConfig {
|
|
26
|
+
description: string;
|
|
27
|
+
fields: Record<string, SchemaFieldConfig>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Tool schema as stored in database
|
|
32
|
+
*/
|
|
33
|
+
export interface ToolSchema {
|
|
34
|
+
node_id: string;
|
|
35
|
+
tool_name: string;
|
|
36
|
+
tool_description: string;
|
|
37
|
+
schema_config: ToolSchemaConfig;
|
|
38
|
+
connected_services?: Record<string, any>[];
|
|
39
|
+
created_at?: string;
|
|
40
|
+
updated_at?: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface UseToolSchemaResult {
|
|
44
|
+
// Get tool schema for a node
|
|
45
|
+
getToolSchema: (nodeId: string) => Promise<ToolSchema | null>;
|
|
46
|
+
|
|
47
|
+
// Save tool schema for a node
|
|
48
|
+
saveToolSchema: (
|
|
49
|
+
nodeId: string,
|
|
50
|
+
toolName: string,
|
|
51
|
+
toolDescription: string,
|
|
52
|
+
schemaConfig: ToolSchemaConfig,
|
|
53
|
+
connectedServices?: Record<string, any>[]
|
|
54
|
+
) => Promise<boolean>;
|
|
55
|
+
|
|
56
|
+
// Delete tool schema for a node
|
|
57
|
+
deleteToolSchema: (nodeId: string) => Promise<boolean>;
|
|
58
|
+
|
|
59
|
+
// Get all tool schemas
|
|
60
|
+
getAllToolSchemas: () => Promise<ToolSchema[]>;
|
|
61
|
+
|
|
62
|
+
// State
|
|
63
|
+
isLoading: boolean;
|
|
64
|
+
error: string | null;
|
|
65
|
+
isConnected: boolean;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export const useToolSchema = (): UseToolSchemaResult => {
|
|
69
|
+
const { sendRequest, isConnected } = useWebSocket();
|
|
70
|
+
|
|
71
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
72
|
+
const [error, setError] = useState<string | null>(null);
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Get tool schema for a node from database
|
|
76
|
+
*/
|
|
77
|
+
const getToolSchema = useCallback(async (nodeId: string): Promise<ToolSchema | null> => {
|
|
78
|
+
if (!isConnected) {
|
|
79
|
+
console.warn('[useToolSchema] WebSocket not connected');
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
setIsLoading(true);
|
|
84
|
+
setError(null);
|
|
85
|
+
|
|
86
|
+
try {
|
|
87
|
+
const response = await sendRequest<{ success: boolean; schema: ToolSchema | null }>('get_tool_schema', {
|
|
88
|
+
node_id: nodeId
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
if (response.success) {
|
|
92
|
+
return response.schema;
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
} catch (err) {
|
|
96
|
+
const errorMsg = err instanceof Error ? err.message : 'Failed to get tool schema';
|
|
97
|
+
setError(errorMsg);
|
|
98
|
+
console.error('[useToolSchema] Error getting schema:', errorMsg);
|
|
99
|
+
return null;
|
|
100
|
+
} finally {
|
|
101
|
+
setIsLoading(false);
|
|
102
|
+
}
|
|
103
|
+
}, [isConnected, sendRequest]);
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Save tool schema for a node to database
|
|
107
|
+
*/
|
|
108
|
+
const saveToolSchema = useCallback(async (
|
|
109
|
+
nodeId: string,
|
|
110
|
+
toolName: string,
|
|
111
|
+
toolDescription: string,
|
|
112
|
+
schemaConfig: ToolSchemaConfig,
|
|
113
|
+
connectedServices?: Record<string, any>[]
|
|
114
|
+
): Promise<boolean> => {
|
|
115
|
+
if (!isConnected) {
|
|
116
|
+
console.warn('[useToolSchema] WebSocket not connected');
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
setIsLoading(true);
|
|
121
|
+
setError(null);
|
|
122
|
+
|
|
123
|
+
try {
|
|
124
|
+
const response = await sendRequest<{ success: boolean; saved: boolean }>('save_tool_schema', {
|
|
125
|
+
node_id: nodeId,
|
|
126
|
+
tool_name: toolName,
|
|
127
|
+
tool_description: toolDescription,
|
|
128
|
+
schema_config: schemaConfig,
|
|
129
|
+
connected_services: connectedServices
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
return response.success && response.saved;
|
|
133
|
+
} catch (err) {
|
|
134
|
+
const errorMsg = err instanceof Error ? err.message : 'Failed to save tool schema';
|
|
135
|
+
setError(errorMsg);
|
|
136
|
+
console.error('[useToolSchema] Error saving schema:', errorMsg);
|
|
137
|
+
return false;
|
|
138
|
+
} finally {
|
|
139
|
+
setIsLoading(false);
|
|
140
|
+
}
|
|
141
|
+
}, [isConnected, sendRequest]);
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Delete tool schema for a node from database
|
|
145
|
+
*/
|
|
146
|
+
const deleteToolSchema = useCallback(async (nodeId: string): Promise<boolean> => {
|
|
147
|
+
if (!isConnected) {
|
|
148
|
+
console.warn('[useToolSchema] WebSocket not connected');
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
setIsLoading(true);
|
|
153
|
+
setError(null);
|
|
154
|
+
|
|
155
|
+
try {
|
|
156
|
+
const response = await sendRequest<{ success: boolean }>('delete_tool_schema', {
|
|
157
|
+
node_id: nodeId
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
return response.success;
|
|
161
|
+
} catch (err) {
|
|
162
|
+
const errorMsg = err instanceof Error ? err.message : 'Failed to delete tool schema';
|
|
163
|
+
setError(errorMsg);
|
|
164
|
+
console.error('[useToolSchema] Error deleting schema:', errorMsg);
|
|
165
|
+
return false;
|
|
166
|
+
} finally {
|
|
167
|
+
setIsLoading(false);
|
|
168
|
+
}
|
|
169
|
+
}, [isConnected, sendRequest]);
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Get all tool schemas from database
|
|
173
|
+
*/
|
|
174
|
+
const getAllToolSchemas = useCallback(async (): Promise<ToolSchema[]> => {
|
|
175
|
+
if (!isConnected) {
|
|
176
|
+
console.warn('[useToolSchema] WebSocket not connected');
|
|
177
|
+
return [];
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
setIsLoading(true);
|
|
181
|
+
setError(null);
|
|
182
|
+
|
|
183
|
+
try {
|
|
184
|
+
const response = await sendRequest<{ success: boolean; schemas: ToolSchema[] }>('get_all_tool_schemas', {});
|
|
185
|
+
|
|
186
|
+
if (response.success) {
|
|
187
|
+
return response.schemas || [];
|
|
188
|
+
}
|
|
189
|
+
return [];
|
|
190
|
+
} catch (err) {
|
|
191
|
+
const errorMsg = err instanceof Error ? err.message : 'Failed to get tool schemas';
|
|
192
|
+
setError(errorMsg);
|
|
193
|
+
console.error('[useToolSchema] Error getting schemas:', errorMsg);
|
|
194
|
+
return [];
|
|
195
|
+
} finally {
|
|
196
|
+
setIsLoading(false);
|
|
197
|
+
}
|
|
198
|
+
}, [isConnected, sendRequest]);
|
|
199
|
+
|
|
200
|
+
return {
|
|
201
|
+
getToolSchema,
|
|
202
|
+
saveToolSchema,
|
|
203
|
+
deleteToolSchema,
|
|
204
|
+
getAllToolSchemas,
|
|
205
|
+
isLoading,
|
|
206
|
+
error,
|
|
207
|
+
isConnected
|
|
208
|
+
};
|
|
209
|
+
};
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useWhatsApp Hook - WebSocket-based WhatsApp operations
|
|
3
|
+
*
|
|
4
|
+
* Provides WhatsApp messaging and connection management via WebSocket.
|
|
5
|
+
* This replaces REST-based WhatsApp API calls for real-time operations.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { useCallback, useState } from 'react';
|
|
9
|
+
import { useWebSocket } from '../contexts/WebSocketContext';
|
|
10
|
+
|
|
11
|
+
export interface WhatsAppStatus {
|
|
12
|
+
connected: boolean;
|
|
13
|
+
deviceId?: string;
|
|
14
|
+
data?: any;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface WhatsAppQRResult {
|
|
18
|
+
connected: boolean;
|
|
19
|
+
qr?: string;
|
|
20
|
+
message?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface WhatsAppSendResult {
|
|
24
|
+
success: boolean;
|
|
25
|
+
messageId?: string;
|
|
26
|
+
error?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface UseWhatsAppResult {
|
|
30
|
+
// Get WhatsApp connection status
|
|
31
|
+
getStatus: () => Promise<WhatsAppStatus>;
|
|
32
|
+
|
|
33
|
+
// Get QR code for authentication
|
|
34
|
+
getQRCode: () => Promise<WhatsAppQRResult>;
|
|
35
|
+
|
|
36
|
+
// Send a WhatsApp message
|
|
37
|
+
sendMessage: (phone: string, message: string) => Promise<WhatsAppSendResult>;
|
|
38
|
+
|
|
39
|
+
// Start WhatsApp connection
|
|
40
|
+
startConnection: () => Promise<{ success: boolean; message?: string }>;
|
|
41
|
+
|
|
42
|
+
// Restart WhatsApp connection (stops and starts the service)
|
|
43
|
+
restartConnection: () => Promise<{ success: boolean; message?: string }>;
|
|
44
|
+
|
|
45
|
+
// State
|
|
46
|
+
isLoading: boolean;
|
|
47
|
+
lastError: string | null;
|
|
48
|
+
connectionStatus: WhatsAppStatus | null;
|
|
49
|
+
isConnected: boolean;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const useWhatsApp = (): UseWhatsAppResult => {
|
|
53
|
+
const {
|
|
54
|
+
getWhatsAppStatus: wsGetStatus,
|
|
55
|
+
getWhatsAppQR: wsGetQR,
|
|
56
|
+
sendWhatsAppMessage: wsSendMessage,
|
|
57
|
+
startWhatsAppConnection: wsStartConnection,
|
|
58
|
+
restartWhatsAppConnection: wsRestartConnection,
|
|
59
|
+
isConnected
|
|
60
|
+
} = useWebSocket();
|
|
61
|
+
|
|
62
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
63
|
+
const [lastError, setLastError] = useState<string | null>(null);
|
|
64
|
+
const [connectionStatus, setConnectionStatus] = useState<WhatsAppStatus | null>(null);
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Get WhatsApp connection status
|
|
68
|
+
*/
|
|
69
|
+
const getStatus = useCallback(async (): Promise<WhatsAppStatus> => {
|
|
70
|
+
setIsLoading(true);
|
|
71
|
+
setLastError(null);
|
|
72
|
+
|
|
73
|
+
try {
|
|
74
|
+
const result = await wsGetStatus();
|
|
75
|
+
setConnectionStatus(result);
|
|
76
|
+
return result;
|
|
77
|
+
} catch (error: any) {
|
|
78
|
+
const errorMsg = error.message || 'Failed to get status';
|
|
79
|
+
setLastError(errorMsg);
|
|
80
|
+
return { connected: false };
|
|
81
|
+
} finally {
|
|
82
|
+
setIsLoading(false);
|
|
83
|
+
}
|
|
84
|
+
}, [wsGetStatus]);
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Get QR code for WhatsApp authentication
|
|
88
|
+
*/
|
|
89
|
+
const getQRCode = useCallback(async (): Promise<WhatsAppQRResult> => {
|
|
90
|
+
setIsLoading(true);
|
|
91
|
+
setLastError(null);
|
|
92
|
+
|
|
93
|
+
try {
|
|
94
|
+
const result = await wsGetQR();
|
|
95
|
+
|
|
96
|
+
if (result.connected) {
|
|
97
|
+
setConnectionStatus({ connected: true });
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return result;
|
|
101
|
+
} catch (error: any) {
|
|
102
|
+
const errorMsg = error.message || 'Failed to get QR code';
|
|
103
|
+
setLastError(errorMsg);
|
|
104
|
+
return { connected: false, message: errorMsg };
|
|
105
|
+
} finally {
|
|
106
|
+
setIsLoading(false);
|
|
107
|
+
}
|
|
108
|
+
}, [wsGetQR]);
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Send a WhatsApp message
|
|
112
|
+
*/
|
|
113
|
+
const sendMessage = useCallback(async (
|
|
114
|
+
phone: string,
|
|
115
|
+
message: string
|
|
116
|
+
): Promise<WhatsAppSendResult> => {
|
|
117
|
+
setIsLoading(true);
|
|
118
|
+
setLastError(null);
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
const result = await wsSendMessage(phone, message);
|
|
122
|
+
|
|
123
|
+
if (!result.success && result.error) {
|
|
124
|
+
setLastError(result.error);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return result;
|
|
128
|
+
} catch (error: any) {
|
|
129
|
+
const errorMsg = error.message || 'Failed to send message';
|
|
130
|
+
setLastError(errorMsg);
|
|
131
|
+
return { success: false, error: errorMsg };
|
|
132
|
+
} finally {
|
|
133
|
+
setIsLoading(false);
|
|
134
|
+
}
|
|
135
|
+
}, [wsSendMessage]);
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Start WhatsApp connection
|
|
139
|
+
*/
|
|
140
|
+
const startConnection = useCallback(async (): Promise<{ success: boolean; message?: string }> => {
|
|
141
|
+
setIsLoading(true);
|
|
142
|
+
setLastError(null);
|
|
143
|
+
|
|
144
|
+
try {
|
|
145
|
+
const result = await wsStartConnection();
|
|
146
|
+
|
|
147
|
+
if (!result.success && result.message) {
|
|
148
|
+
setLastError(result.message);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return result;
|
|
152
|
+
} catch (error: any) {
|
|
153
|
+
const errorMsg = error.message || 'Failed to start connection';
|
|
154
|
+
setLastError(errorMsg);
|
|
155
|
+
return { success: false, message: errorMsg };
|
|
156
|
+
} finally {
|
|
157
|
+
setIsLoading(false);
|
|
158
|
+
}
|
|
159
|
+
}, [wsStartConnection]);
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Restart WhatsApp connection (stops and starts the service)
|
|
163
|
+
*/
|
|
164
|
+
const restartConnection = useCallback(async (): Promise<{ success: boolean; message?: string }> => {
|
|
165
|
+
setIsLoading(true);
|
|
166
|
+
setLastError(null);
|
|
167
|
+
|
|
168
|
+
try {
|
|
169
|
+
const result = await wsRestartConnection();
|
|
170
|
+
|
|
171
|
+
if (!result.success && result.message) {
|
|
172
|
+
setLastError(result.message);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return result;
|
|
176
|
+
} catch (error: any) {
|
|
177
|
+
const errorMsg = error.message || 'Failed to restart connection';
|
|
178
|
+
setLastError(errorMsg);
|
|
179
|
+
return { success: false, message: errorMsg };
|
|
180
|
+
} finally {
|
|
181
|
+
setIsLoading(false);
|
|
182
|
+
}
|
|
183
|
+
}, [wsRestartConnection]);
|
|
184
|
+
|
|
185
|
+
return {
|
|
186
|
+
getStatus,
|
|
187
|
+
getQRCode,
|
|
188
|
+
sendMessage,
|
|
189
|
+
startConnection,
|
|
190
|
+
restartConnection,
|
|
191
|
+
isLoading,
|
|
192
|
+
lastError,
|
|
193
|
+
connectionStatus,
|
|
194
|
+
isConnected
|
|
195
|
+
};
|
|
196
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import { useAppStore } from '../store/useAppStore';
|
|
3
|
+
|
|
4
|
+
export const useWorkflowManagement = () => {
|
|
5
|
+
const {
|
|
6
|
+
currentWorkflow,
|
|
7
|
+
hasUnsavedChanges,
|
|
8
|
+
savedWorkflows,
|
|
9
|
+
updateWorkflow,
|
|
10
|
+
saveWorkflow,
|
|
11
|
+
loadWorkflow,
|
|
12
|
+
createNewWorkflow,
|
|
13
|
+
} = useAppStore();
|
|
14
|
+
|
|
15
|
+
const handleWorkflowNameChange = useCallback((name: string) => {
|
|
16
|
+
updateWorkflow({ name });
|
|
17
|
+
}, [updateWorkflow]);
|
|
18
|
+
|
|
19
|
+
const handleSave = useCallback(() => {
|
|
20
|
+
saveWorkflow();
|
|
21
|
+
}, [saveWorkflow]);
|
|
22
|
+
|
|
23
|
+
const handleNew = useCallback(() => {
|
|
24
|
+
createNewWorkflow();
|
|
25
|
+
}, [createNewWorkflow]);
|
|
26
|
+
|
|
27
|
+
const handleOpen = useCallback(() => {
|
|
28
|
+
// Workflow selection is handled by sidebar
|
|
29
|
+
}, []);
|
|
30
|
+
|
|
31
|
+
const handleSelectWorkflow = useCallback((workflow: any) => {
|
|
32
|
+
loadWorkflow(workflow.id);
|
|
33
|
+
}, [loadWorkflow]);
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
currentWorkflow,
|
|
38
|
+
hasUnsavedChanges,
|
|
39
|
+
savedWorkflows,
|
|
40
|
+
handleWorkflowNameChange,
|
|
41
|
+
handleSave,
|
|
42
|
+
handleNew,
|
|
43
|
+
handleOpen,
|
|
44
|
+
handleSelectWorkflow,
|
|
45
|
+
};
|
|
46
|
+
};
|