diff --git a/.gitignore b/.gitignore index 5cd5b34..0d64d80 100644 --- a/.gitignore +++ b/.gitignore @@ -25,8 +25,7 @@ coverage/ .DS_Store # Editor directories and files -.vscode/* -!.vscode/extensions.json + .idea/ *.suo *.ntvs* diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..883aa6f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "task.allowAutomaticTasks": "on", + "task.autoDetect": "on", + "task.quickOpen.showAll": true +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..3b30088 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,60 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "planilla-api", + "type": "shell", + "command": "make api", + "problemMatcher": [], + "presentation": { + "panel": "dedicated", + "reveal": "always" + } + }, + { + "label": "planilla-mcp", + "type": "shell", + "command": "make mcp", + "problemMatcher": [], + "presentation": { + "panel": "dedicated", + "reveal": "always" + } + }, + { + "label": "planilla-ui", + "type": "shell", + "command": "make UI", + "problemMatcher": [], + "presentation": { + "panel": "dedicated", + "reveal": "always" + } + }, + { + "label": "planilla-agent", + "type": "shell", + "command": "make agent", + "problemMatcher": [], + "presentation": { + "panel": "dedicated", + "reveal": "always" + } + }, + { + "label": "planilla-dev", + "dependsOn": [ + "planilla-api", + "planilla-mcp", + "planilla-ui", + "planilla-agent" + ], + "dependsOrder": "parallel", + "problemMatcher": [], + "presentation": { + "reveal": "always" + } + } + ] + } + \ No newline at end of file diff --git a/Makefile b/Makefile index efaa16f..9a68ea4 100644 --- a/Makefile +++ b/Makefile @@ -57,3 +57,19 @@ api: # If no name is provided, it defaults to "new_migration". prisma-migrate-dev: cd api && npx prisma migrate deploy + + + +# --- Git helper para cambiar de rama por nombre directo --- + +.PHONY: git-branch + +git-branch: + @if not "$(BRANCH)"=="" ( \ + git fetch github && \ + git checkout $(BRANCH) \ + ) else ( \ + echo USO: make git-branch BRANCH=nombre/rama && exit /b 1 \ + ) + + diff --git a/api/.env.example b/api/.env.example index c97adea..603ed55 100644 --- a/api/.env.example +++ b/api/.env.example @@ -5,4 +5,5 @@ # See the documentation for all the connection string options: https://pris.ly/d/connection-strings DATABASE_URL=postgresql://planilla:planilla@localhost:5434/planilla_db?schema=public +CONVERSATION_LAYER_ROUTER_URL='http://your-router-url:port' diff --git a/docker-compose.yml b/docker-compose.yml index 70d4069..79e6bcf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,6 +21,7 @@ services: restart: unless-stopped environment: DATABASE_URL: "postgresql://planilla:secret@db:5432/planilla_db?schema=public" + CONVERSATION_LAYER_ROUTER_URL: 'http://your-router-url:port' depends_on: - db ports: @@ -34,6 +35,7 @@ services: environment: VITE_API_EVENTS_URL: https://planilla.interno.com/events VITE_API_DB_URL: https://planilla.interno.com + VITE_CONVERSATION_LAYER_ROUTER_URL: 'http://your-router-url:port' ports: - "3008:80" networks: [planilla, principal] diff --git a/estructura.txt b/estructura.txt index 829bb25..eb4ce11 100644 --- a/estructura.txt +++ b/estructura.txt @@ -1,6 +1,5 @@ C:\no guardar\nucleo V3\planilla\agent C:\no guardar\nucleo V3\planilla\api -C:\no guardar\nucleo V3\planilla\core C:\no guardar\nucleo V3\planilla\dev C:\no guardar\nucleo V3\planilla\mcp C:\no guardar\nucleo V3\planilla\ui @@ -10,30 +9,28 @@ C:\no guardar\nucleo V3\planilla\docker-compose.yml C:\no guardar\nucleo V3\planilla\estructura.txt C:\no guardar\nucleo V3\planilla\Makefile C:\no guardar\nucleo V3\planilla\README.md -C:\no guardar\nucleo V3\planilla\agent\example webhooksEvents -C:\no guardar\nucleo V3\planilla\agent\processMessage -C:\no guardar\nucleo V3\planilla\agent\respuestas -C:\no guardar\nucleo V3\planilla\agent\utils -C:\no guardar\nucleo V3\planilla\agent\config.js +C:\no guardar\nucleo V3\planilla\agent\src +C:\no guardar\nucleo V3\planilla\agent\.dockerignore +C:\no guardar\nucleo V3\planilla\agent\.env C:\no guardar\nucleo V3\planilla\agent\Dockerfile -C:\no guardar\nucleo V3\planilla\agent\gemini.js -C:\no guardar\nucleo V3\planilla\agent\handlers.js -C:\no guardar\nucleo V3\planilla\agent\index.js -C:\no guardar\nucleo V3\planilla\agent\logger.js +C:\no guardar\nucleo V3\planilla\agent\package-lock.json C:\no guardar\nucleo V3\planilla\agent\package.json -C:\no guardar\nucleo V3\planilla\agent\routes.js -C:\no guardar\nucleo V3\planilla\agent\whatsapp.js -C:\no guardar\nucleo V3\planilla\agent\example webhooksEvents\exampleOnAnyMessage.txt -C:\no guardar\nucleo V3\planilla\agent\processMessage\processVideoMessage.js -C:\no guardar\nucleo V3\planilla\agent\respuestas\respuestaBrave.js -C:\no guardar\nucleo V3\planilla\agent\respuestas\respuestaMCP.js -C:\no guardar\nucleo V3\planilla\agent\respuestas\respuestaNormal.js -C:\no guardar\nucleo V3\planilla\agent\utils\decryptMediaContent.js -C:\no guardar\nucleo V3\planilla\agent\utils\processMessage.js -C:\no guardar\nucleo V3\planilla\agent\utils\saveMedia.js +C:\no guardar\nucleo V3\planilla\agent\tsconfig.json +C:\no guardar\nucleo V3\planilla\agent\src\cognition +C:\no guardar\nucleo V3\planilla\agent\src\llm +C:\no guardar\nucleo V3\planilla\agent\src\index.ts +C:\no guardar\nucleo V3\planilla\agent\src\systemPrompt copy.ts +C:\no guardar\nucleo V3\planilla\agent\src\systemPrompt.ts +C:\no guardar\nucleo V3\planilla\agent\src\types.ts +C:\no guardar\nucleo V3\planilla\agent\src\cognition\executeTools.ts +C:\no guardar\nucleo V3\planilla\agent\src\cognition\generatePlan.ts +C:\no guardar\nucleo V3\planilla\agent\src\cognition\index.ts +C:\no guardar\nucleo V3\planilla\agent\src\cognition\normalResponse.ts +C:\no guardar\nucleo V3\planilla\agent\src\llm\gemini.ts C:\no guardar\nucleo V3\planilla\api\dev C:\no guardar\nucleo V3\planilla\api\prisma C:\no guardar\nucleo V3\planilla\api\routes +C:\no guardar\nucleo V3\planilla\api\sse C:\no guardar\nucleo V3\planilla\api\.env C:\no guardar\nucleo V3\planilla\api\.env.example C:\no guardar\nucleo V3\planilla\api\Dockerfile @@ -58,6 +55,7 @@ C:\no guardar\nucleo V3\planilla\api\prisma\generated\client\index.d.ts C:\no guardar\nucleo V3\planilla\api\prisma\generated\client\index.js C:\no guardar\nucleo V3\planilla\api\prisma\generated\client\package.json C:\no guardar\nucleo V3\planilla\api\prisma\generated\client\query_engine-windows.dll.node +C:\no guardar\nucleo V3\planilla\api\prisma\generated\client\query_engine-windows.dll.node.tmp26660 C:\no guardar\nucleo V3\planilla\api\prisma\generated\client\schema.prisma C:\no guardar\nucleo V3\planilla\api\prisma\generated\client\wasm.d.ts C:\no guardar\nucleo V3\planilla\api\prisma\generated\client\wasm.js @@ -70,31 +68,62 @@ C:\no guardar\nucleo V3\planilla\api\prisma\generated\client\runtime\library.js C:\no guardar\nucleo V3\planilla\api\prisma\generated\client\runtime\react-native.js C:\no guardar\nucleo V3\planilla\api\prisma\generated\client\runtime\wasm.js C:\no guardar\nucleo V3\planilla\api\prisma\migrations\20250515020056_init +C:\no guardar\nucleo V3\planilla\api\prisma\migrations\20250530222717_init +C:\no guardar\nucleo V3\planilla\api\prisma\migrations\20250609211800_notify_others_sse C:\no guardar\nucleo V3\planilla\api\prisma\migrations\migration_lock.toml C:\no guardar\nucleo V3\planilla\api\prisma\migrations\20250515020056_init\migration.sql +C:\no guardar\nucleo V3\planilla\api\prisma\migrations\20250530222717_init\migration.sql +C:\no guardar\nucleo V3\planilla\api\prisma\migrations\20250609211800_notify_others_sse\migration.sql +C:\no guardar\nucleo V3\planilla\api\routes\asistencias +C:\no guardar\nucleo V3\planilla\api\routes\empleados +C:\no guardar\nucleo V3\planilla\api\routes\planillas +C:\no guardar\nucleo V3\planilla\api\routes\tareas C:\no guardar\nucleo V3\planilla\api\routes\clientesRandom.js +C:\no guardar\nucleo V3\planilla\api\routes\asistencias\asistencias.js +C:\no guardar\nucleo V3\planilla\api\routes\empleados\empleados.js +C:\no guardar\nucleo V3\planilla\api\routes\planillas\planillas.js +C:\no guardar\nucleo V3\planilla\api\routes\tareas\tareas.js +C:\no guardar\nucleo V3\planilla\api\sse\index.js C:\no guardar\nucleo V3\planilla\dev\scripts C:\no guardar\nucleo V3\planilla\dev\scripts\estructura.ps1 +C:\no guardar\nucleo V3\planilla\mcp\lib +C:\no guardar\nucleo V3\planilla\mcp\modules +C:\no guardar\nucleo V3\planilla\mcp\createServer.js C:\no guardar\nucleo V3\planilla\mcp\Dockerfile C:\no guardar\nucleo V3\planilla\mcp\index.js C:\no guardar\nucleo V3\planilla\mcp\package-lock.json C:\no guardar\nucleo V3\planilla\mcp\package.json +C:\no guardar\nucleo V3\planilla\mcp\README.md +C:\no guardar\nucleo V3\planilla\mcp\lib\api.js +C:\no guardar\nucleo V3\planilla\mcp\modules\asistencias.js +C:\no guardar\nucleo V3\planilla\mcp\modules\empleados.js +C:\no guardar\nucleo V3\planilla\mcp\modules\planillas.js +C:\no guardar\nucleo V3\planilla\mcp\modules\tareas.js C:\no guardar\nucleo V3\planilla\ui\public C:\no guardar\nucleo V3\planilla\ui\src +C:\no guardar\nucleo V3\planilla\ui\.env C:\no guardar\nucleo V3\planilla\ui\Dockerfile C:\no guardar\nucleo V3\planilla\ui\index.html +C:\no guardar\nucleo V3\planilla\ui\nginx.conf C:\no guardar\nucleo V3\planilla\ui\package-lock.json C:\no guardar\nucleo V3\planilla\ui\package.json +C:\no guardar\nucleo V3\planilla\ui\postcss.config.js C:\no guardar\nucleo V3\planilla\ui\README.md +C:\no guardar\nucleo V3\planilla\ui\README.ms +C:\no guardar\nucleo V3\planilla\ui\runtime-env.sh +C:\no guardar\nucleo V3\planilla\ui\tailwind.config.js C:\no guardar\nucleo V3\planilla\ui\vite.config.js C:\no guardar\nucleo V3\planilla\ui\public\vite.svg C:\no guardar\nucleo V3\planilla\ui\src\assets C:\no guardar\nucleo V3\planilla\ui\src\components +C:\no guardar\nucleo V3\planilla\ui\src\constants C:\no guardar\nucleo V3\planilla\ui\src\layouts C:\no guardar\nucleo V3\planilla\ui\src\router C:\no guardar\nucleo V3\planilla\ui\src\stores C:\no guardar\nucleo V3\planilla\ui\src\tests +C:\no guardar\nucleo V3\planilla\ui\src\utils C:\no guardar\nucleo V3\planilla\ui\src\views +C:\no guardar\nucleo V3\planilla\ui\src\apiClient.js C:\no guardar\nucleo V3\planilla\ui\src\App.vue C:\no guardar\nucleo V3\planilla\ui\src\main.js C:\no guardar\nucleo V3\planilla\ui\src\style.css @@ -103,40 +132,67 @@ C:\no guardar\nucleo V3\planilla\ui\src\components\asistencias C:\no guardar\nucleo V3\planilla\ui\src\components\chat C:\no guardar\nucleo V3\planilla\ui\src\components\empleados C:\no guardar\nucleo V3\planilla\ui\src\components\planillas +C:\no guardar\nucleo V3\planilla\ui\src\components\realtime C:\no guardar\nucleo V3\planilla\ui\src\components\tareas C:\no guardar\nucleo V3\planilla\ui\src\components\ui C:\no guardar\nucleo V3\planilla\ui\src\components\HelloWorld.vue C:\no guardar\nucleo V3\planilla\ui\src\components\asistencias\cardAsistencia.vue C:\no guardar\nucleo V3\planilla\ui\src\components\asistencias\tablaAsistencias.vue C:\no guardar\nucleo V3\planilla\ui\src\components\chat\CanvasChat.vue +C:\no guardar\nucleo V3\planilla\ui\src\components\chat\FloatingChat.vue C:\no guardar\nucleo V3\planilla\ui\src\components\empleados\cardEmpleado.vue C:\no guardar\nucleo V3\planilla\ui\src\components\empleados\tablaEmpleados.vue C:\no guardar\nucleo V3\planilla\ui\src\components\planillas\cardPlanilla.vue C:\no guardar\nucleo V3\planilla\ui\src\components\planillas\tablaPlanillas.vue +C:\no guardar\nucleo V3\planilla\ui\src\components\realtime\RealtimeEventCard.vue C:\no guardar\nucleo V3\planilla\ui\src\components\tareas\cardTarea.vue C:\no guardar\nucleo V3\planilla\ui\src\components\tareas\tablaTareas.vue -C:\no guardar\nucleo V3\planilla\ui\src\components\ui\navBar.vue -C:\no guardar\nucleo V3\planilla\ui\src\components\ui\sideDrawer.vue +C:\no guardar\nucleo V3\planilla\ui\src\components\ui\NavBar.vue +C:\no guardar\nucleo V3\planilla\ui\src\components\ui\NucleoDataCard.vue +C:\no guardar\nucleo V3\planilla\ui\src\components\ui\NucleoTable.vue +C:\no guardar\nucleo V3\planilla\ui\src\components\ui\README.md +C:\no guardar\nucleo V3\planilla\ui\src\components\ui\SideDrawer.vue +C:\no guardar\nucleo V3\planilla\ui\src\components\ui\SnackbarContainer.vue +C:\no guardar\nucleo V3\planilla\ui\src\components\ui\TopBar.vue +C:\no guardar\nucleo V3\planilla\ui\src\constants\moduleInfo.js C:\no guardar\nucleo V3\planilla\ui\src\router\index.js +C:\no guardar\nucleo V3\planilla\ui\src\stores\__tests__ C:\no guardar\nucleo V3\planilla\ui\src\stores\useAsistencias.js C:\no guardar\nucleo V3\planilla\ui\src\stores\useChat.js C:\no guardar\nucleo V3\planilla\ui\src\stores\useEmpleados.js C:\no guardar\nucleo V3\planilla\ui\src\stores\usePlanillas.js +C:\no guardar\nucleo V3\planilla\ui\src\stores\useRealtime.js +C:\no guardar\nucleo V3\planilla\ui\src\stores\useSnackbar.js C:\no guardar\nucleo V3\planilla\ui\src\stores\useTareas.js +C:\no guardar\nucleo V3\planilla\ui\src\stores\useUi.js +C:\no guardar\nucleo V3\planilla\ui\src\stores\__tests__\useUi.spec.js +C:\no guardar\nucleo V3\planilla\ui\src\utils\formatters.js C:\no guardar\nucleo V3\planilla\ui\src\views\asistencias C:\no guardar\nucleo V3\planilla\ui\src\views\empleados C:\no guardar\nucleo V3\planilla\ui\src\views\planillas C:\no guardar\nucleo V3\planilla\ui\src\views\tareas -C:\no guardar\nucleo V3\planilla\ui\src\views\ChatView.vue +C:\no guardar\nucleo V3\planilla\ui\src\views\__tests__ +C:\no guardar\nucleo V3\planilla\ui\src\views\HomeView.vue +C:\no guardar\nucleo V3\planilla\ui\src\views\NotFound.vue +C:\no guardar\nucleo V3\planilla\ui\src\views\RealtimeFeedView.vue C:\no guardar\nucleo V3\planilla\ui\src\views\SettingsView.vue +C:\no guardar\nucleo V3\planilla\ui\src\views\asistencias\__tests__ C:\no guardar\nucleo V3\planilla\ui\src\views\asistencias\AsistenciaForm.vue C:\no guardar\nucleo V3\planilla\ui\src\views\asistencias\AsistenciasIndex.vue +C:\no guardar\nucleo V3\planilla\ui\src\views\asistencias\__tests__\AsistenciasIndex.spec.js +C:\no guardar\nucleo V3\planilla\ui\src\views\empleados\__tests__ C:\no guardar\nucleo V3\planilla\ui\src\views\empleados\EmpleadoForm.vue C:\no guardar\nucleo V3\planilla\ui\src\views\empleados\EmpleadosIndex.vue +C:\no guardar\nucleo V3\planilla\ui\src\views\empleados\__tests__\EmpleadosIndex.spec.js +C:\no guardar\nucleo V3\planilla\ui\src\views\planillas\__tests__ C:\no guardar\nucleo V3\planilla\ui\src\views\planillas\PlanillaForm.vue C:\no guardar\nucleo V3\planilla\ui\src\views\planillas\PlanillasIndex.vue +C:\no guardar\nucleo V3\planilla\ui\src\views\planillas\__tests__\PlanillasIndex.spec.js +C:\no guardar\nucleo V3\planilla\ui\src\views\tareas\__tests__ C:\no guardar\nucleo V3\planilla\ui\src\views\tareas\TareaForm.vue C:\no guardar\nucleo V3\planilla\ui\src\views\tareas\TareasIndex.vue +C:\no guardar\nucleo V3\planilla\ui\src\views\tareas\__tests__\TareasIndex.spec.js +C:\no guardar\nucleo V3\planilla\ui\src\views\__tests__\SettingsView.spec.js C:\no guardar\nucleo V3\planilla\worker\cron C:\no guardar\nucleo V3\planilla\worker\prisma C:\no guardar\nucleo V3\planilla\worker\.env @@ -144,6 +200,7 @@ C:\no guardar\nucleo V3\planilla\worker\cron-worker.js C:\no guardar\nucleo V3\planilla\worker\Dockerfile C:\no guardar\nucleo V3\planilla\worker\package-lock.json C:\no guardar\nucleo V3\planilla\worker\package.json +C:\no guardar\nucleo V3\planilla\worker\sync-empleados.js C:\no guardar\nucleo V3\planilla\worker\cron\15min C:\no guardar\nucleo V3\planilla\worker\cron\15min\hello.sh C:\no guardar\nucleo V3\planilla\worker\prisma\schema.prisma diff --git a/ui/runtime-env.sh b/ui/runtime-env.sh index 6664c60..a2dbd7d 100644 --- a/ui/runtime-env.sh +++ b/ui/runtime-env.sh @@ -1,5 +1,6 @@ #!/bin/sh echo "window.RUNTIME_CONFIG = {" > /usr/share/nginx/html/config.js echo " VITE_API_EVENTS_URL: '${VITE_API_EVENTS_URL}'," >> /usr/share/nginx/html/config.js -echo " VITE_API_DB_URL: '${VITE_API_DB_URL}'" >> /usr/share/nginx/html/config.js +echo " VITE_API_DB_URL: '${VITE_API_DB_URL}'," >> /usr/share/nginx/html/config.js +echo " VITE_CONVERSATION_LAYER_ROUTER_URL: '${VITE_CONVERSATION_LAYER_ROUTER_URL}'," >> /usr/share/nginx/html/config.js echo "};" >> /usr/share/nginx/html/config.js diff --git a/ui/src/components/chat/CanvasChat.vue b/ui/src/components/chat/CanvasChat.vue index 9846d08..6f3b6b0 100644 --- a/ui/src/components/chat/CanvasChat.vue +++ b/ui/src/components/chat/CanvasChat.vue @@ -28,7 +28,7 @@ function send () { if (!t) return if (t.startsWith('/')) chat.run(t.slice(1)) - else chat.add({ type: 'text', owner: 'yo', text: t }) + else chat.sendMessage(t) msg.value = '' scrollBottom() @@ -43,7 +43,7 @@ function handleKey (e) { onMounted(() => { if (!chat.items.length) { - chat.add({ type: 'text', owner: 'bot', text: '¡Hola! Probá /empleados, /tareas, etc.' }) + chat.add({ type: 'chat', owner: 'bot', text: '¡Hola! Probá /empleados, /tareas, etc.' }) } scrollBottom() }) @@ -58,12 +58,12 @@ watch(() => chat.items.length, scrollBottom)