geenii 0.4.0.dev4__tar.gz → 0.4.0.dev6__tar.gz
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.
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/.github/workflows/release.yml +4 -4
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/Dockerfile +3 -5
- geenii-0.4.0.dev6/PKG-INFO +44 -0
- geenii-0.4.0.dev6/README.python.md +11 -0
- geenii-0.4.0.dev6/VERSION +1 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/cli-reference/index.md +5 -0
- geenii-0.4.0.dev6/docs/cli-reference/server.md +91 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/developer-guide/server.md +1 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/pyproject.toml +3 -2
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/cli/main.py +2 -0
- geenii-0.4.0.dev6/src/geenii/cli/server_cli.py +407 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/config.py +1 -1
- geenii-0.4.0.dev6/tests/geenii/test_server_cli.py +278 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/uv.lock +3 -1
- geenii-0.4.0.dev4/PKG-INFO +0 -97
- geenii-0.4.0.dev4/VERSION +0 -1
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/.aiignore +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/.dockerignore +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/.github/workflows/ci.yml +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/.github/workflows/publish_image_multiarch.yml +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/.github/workflows/release_pypi.yml +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/.github/workflows/reposcan.yml +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/.gitignore +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/.python-version +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/DEVELOPER.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/LICENSE +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/README.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/build_bin.sh +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/build_image.sh +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/build_nuitka.sh +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/build_od.sh +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/build_wheel.sh +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/bump_version.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/container/entrypoint.sh +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/cheatsheet.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/cli-reference/agent.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/cli-reference/agents.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/cli-reference/apps.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/cli-reference/daemon.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/cli-reference/flow.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/cli-reference/info.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/cli-reference/mcp.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/cli-reference/models.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/cli-reference/pm.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/cli-reference/projects.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/cli-reference/scheduler.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/cli-reference/skills.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/cli-reference/supervisor.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/cli-reference/tools.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/developer-guide/agents.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/developer-guide/apps.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/developer-guide/architecture.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/developer-guide/building.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/developer-guide/caching.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/developer-guide/flow.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/developer-guide/mcp.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/developer-guide/memory.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/developer-guide/messages.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/developer-guide/processes.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/developer-guide/providers.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/developer-guide/sandbox.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/developer-guide/skills.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/developer-guide/tools.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/developer-guide/usage-tracking.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/developer-guide/web-ui.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/developer-guide/widgets.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/index.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/user-guide/agents.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/user-guide/configuration.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/user-guide/docker.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/user-guide/installation.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/docs/user-guide/scheduler.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/examples/flow_example.yaml +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/examples/pm_flow_example.yaml +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/.dockerignore +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/.gitignore +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/.prettierrc.json +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/Dockerfile +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/README.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/components.json +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/container/nginx.conf +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/index.html +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/package.json +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/pnpm-lock.yaml +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/pnpm-workspace.yaml +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/public/bot.svg +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/public/bot_white.svg +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/public/create-task.html +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/public/placeholder.svg +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/public/pm/index.html +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/public/tauri.svg +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/public/vite.svg +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/shadcn_add.sh +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/Animate.scss +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/App.scss +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/App.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/api/api-error.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/api/ollama-api.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/api/openai.types.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/api/xai-tauri.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/api/xai-web.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/api/xai.types.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/agents/agent-chat.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/agents/agent-page.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/agents/agent-types.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/agents/agent.view.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/agents/agents-page.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/agents/agents.view.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/agents/components/agent-config-editor.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/agents/components/agent-env-editor.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/aiassist/AiAssist.scss +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/aiassist/AiAssistPanel.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/aiassist/AiAssistVoicePrompt.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/aiassist/AudioFileImporter.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/aiassist/AudioPlayerWithWaveform.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/aiassist/AudioRecorder.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/aiassist/audio-page.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/apps/app-page.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/apps/apps-page.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/apps/apps-view.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/apps/tauri-app-viewer.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/catalog/catalog-page.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/catalog/components/docker-mcp-catalog-config-builder.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/catalog/components/docker-mcp-catalog-oci.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/catalog/components/docker-mcp-catalog-provider.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/catalog/components/docker-mcp-catalog-v3-config-builder.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/catalog/components/docker-mcp-catalog-v3-provider.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/catalog/components/docker-mcp-catalog-v3.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/catalog/docker-mcp-catalog-page.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/catalog/docker-mcp-catalog-view.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/chat/Chat.scss +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/chat/completion-chat-page.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/chat/completion-chat.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/chat/components/ChatContext.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/chat/components/ChatContextProvider.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/chat/components/ChatFiles.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/chat/components/ChatFilesUploaderPopup.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/chat/components/ChatInput.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/chat/components/ChatMessages.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/chat/components/ChatModelSelector.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/chat/components/ChatPopup.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/chat/components/ChatPromptSuggestions.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/chat/components/ModelThinkingIndicator.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/chat/components/chat.types.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/completion/completions-page.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/completion/components/QuickAudioGenerationPopupButton.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/completion/components/QuickCompletion.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/completion/components/QuickImageGenerationPopupButton.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/completion/components/QuickOllamaTextGenerationPopupButton.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/completion/components/QuickTextGenerationPopupButton.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/components/agents-settings-view.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/components/ai-model-settings-view.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/components/apps-settings.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/components/audio-settings.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/components/mcp-servers-settings-view.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/components/models-settings-view.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/components/ollama-models.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/components/process-manager-view.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/components/process-output.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/components/process-start-dialog.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/components/scheduler-config-view.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/components/scheduler-task-dialog.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/components/settings-form-view.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/components/skills-settings-view.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/components/system-info-view.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/components/usage-stats-view.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/configure-page.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/console-page.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/settings-forms.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/settings-navdata.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/settings-view.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/console/system-page.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/dashboard/dashboard.page.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/flows/components/flowgraph-background.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/flows/components/flowgraph-canvas.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/flows/components/flowgraph-edges.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/flows/components/flowgraph-editor-panel.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/flows/components/flowgraph-editor.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/flows/components/flowgraph-nodes.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/flows/components/flowgraph-provider.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/flows/components/flowgraph-selected-node.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/flows/components/flowgraph-types.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/flows/components/flowgraph.scss +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/flows/components/svgutil.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/flows/flows-page.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/launcher/launcher-page.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/launcher/launcher.view.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/mcp-servers/components/mcp-server-actions.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/mcp-servers/components/mcp-server-config-editor.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/mcp-servers/components/mcp-server-provider.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/mcp-servers/components/mcp-server-tool-form.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/mcp-servers/components/mcp-server-view-head.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/mcp-servers/components/mcp-server.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/mcp-servers/components/mcp-servers-provider.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/mcp-servers/types.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/tools/tool-types.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/tools/tools.page.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/tools/tools.view.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/xchat/xchat-demo-page-1.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app/xchat/xchat-provider.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app-router.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/app-socket.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/assets/react.svg +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/Popup.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/TypewriterText.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/file-list/FileList.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/file-list/FileListDemo.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/file-list/README.md +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/file-list/index.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/filterable-select.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/form/schema-form-dialog.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/header.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/json-debug-view.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/json-view.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/layout/console-layout.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/layout/console-navdata.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/layout/console-sidebar.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/layout/headerbar.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/layout/layout.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/layout/main-content.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/layout/main-layout.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/layout/main-sidebar.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/layout/message-inbox.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/layout/xchat-layout.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/layout/xchat-sidebar.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/nav-user.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/output-data-markdown.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/search-form.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/split-layout-h.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/split-layout-v.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/tauri/TauriCommandButton.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/tauri/TauriCommands.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/tauri/TauriPanel.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/tauri/TauriPanelContext.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/tauri/TauriSettingsPanelItem.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/tauri/TauriUpdaterPanelItem.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/tauri/TauriWrapper.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/tauri/tauri-docker-api.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/tauri/tauri.types.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/tauri/useTauri.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/theme-provider.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/alert-dialog.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/avatar.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/badge.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/breadcrumb.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/button.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/card.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/collapsible.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/command.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/dialog.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/dropdown-menu.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/input.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/label.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/popover.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/scroll-area.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/separator.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/sheet.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/sidebar.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/skeleton.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/switch.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/textarea.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/ui/tooltip.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/uploader/FileUploader.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/uploader/FileUploaderExample.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/voice-recorder/VoiceRecorder.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/voice-recorder/useMicrophone.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/backend-switcher.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/backends/agent-backend.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/backends/echo-backend.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/backends/echo-examples.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/chat-command-menu.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/chat-content-part.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/chat-context-provider.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/chat-context.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/chat-error.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/chat-input.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/chat-message-usage.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/chat-message.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/chat-messages.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/chat-model-selector.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/chat-session-list.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/chat-session.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/chat-status.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/chat-tool-calls.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/chat-voice-input.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/chat.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/chat.types.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/index.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/index.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/media-parts.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/tool-parts.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widget-parts.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/accordion.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/barchart.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/child-content.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/choices.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/clock.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/code.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/copy-button.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/countdown.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/csv.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/dice.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/diff.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/donut.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/errorboundarytest.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/filetree.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/form.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/fortune.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/funnel.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/gauge.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/grid.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/heatmap.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/html.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/iframe.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/index.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/json.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/keyvalue.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/linechart.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/links.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/list.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/matrix.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/postbutton.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/progress.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/rating.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/safe-url.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/scatter.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/snake.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/sparklines.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/stat.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/status.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/steps.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/table.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/tabs.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/terminal.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/timeline.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/treemap.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/use-chat-reply.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/use-now.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/use-reduced-motion.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/components/xchat/parts/widgets/weather.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/constants.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/context/api-context.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/context/app-context-provider.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/context/app-context.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/context/server-context-provider.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/context/server-context.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/convo.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/features/errors/forbidden.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/features/errors/general-error.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/features/errors/maintenance-error.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/features/errors/not-found-error.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/features/errors/unauthorized-error.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/hooks/use-mobile.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/hooks/use-models.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/hooks/useNotification.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/init.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/lib/utils.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/main.tsx +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/tailwind.css +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/src/vite-env.d.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/tsconfig.json +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/tsconfig.node.json +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/geenii-ui/vite.config.ts +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/hooks/hook-geenii.provider.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/run.sh +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/scripts/gen_homebrew_formula_od.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/scripts/gen_homebrew_formula_of.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/agent/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/agent/base.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/agent/base_agent.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/agent/env.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/agent/info_commands.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/agent/registry.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/agent/tasks.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/agent/utils.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/agents.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/ai.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/apps.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/bots.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/chat_models.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/cli/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/cli/agent_cli.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/cli/agents_cli.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/cli/ai_cli.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/cli/apps_cli.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/cli/cli_runner.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/cli/click_helper.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/cli/daemon_cli.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/cli/flow_cli.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/cli/info_cli.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/cli/mcp_cli.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/cli/models_cli.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/cli/pm_cli.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/cli/projects_cli.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/cli/scheduler_cli.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/cli/skills_cli.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/cli/supervisor_cli.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/cli/tools_cli.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/console/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/core/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/core/process_tools.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/core/tasks.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/core/tools.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/daemon/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/daemon/client.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/daemon/host.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/daemon/server.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/datamodels.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/example_bots.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/flow/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/flow/flow.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/flow/processor/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/flow/processor/echo.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/flow/processor/execute_command.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/flow/processor/execute_pm_command.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/flow/processor/execute_script.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/flow/processor/read_file.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/flow/processor/read_http.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/flows.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/g.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/hitl.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/logs.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/mcp_client.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/mcp_config.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/memory.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/pm/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/pm/process_manager.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/pm/process_manager_client.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/pm/process_manager_service.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/proc.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/provider/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/provider/anthropic/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/provider/anthropic/provider.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/provider/fake/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/provider/fake/provider.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/provider/geenii/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/provider/geenii/provider.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/provider/hf/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/provider/hf/provider.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/provider/interfaces.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/provider/kokoro/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/provider/kokoro/provider.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/provider/ollama/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/provider/ollama/provider.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/provider/openai/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/provider/openai/provider.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/provider/whisper/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/provider/whisper/provider.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/provider/whisper/whispercpp_ext.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/sandbox.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/scheduler.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/server/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/server/agents_routes.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/server/ai_routes.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/server/chat_routes.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/server/chat_sessions.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/server/daemon_routes.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/server/flow_routes.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/server/mcp_routes.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/server/pm_routes.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/server/projects_routes.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/server/public_routes.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/server/router.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/server/scheduler_routes.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/server/security.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/server/server.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/server/skills_routes.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/server/stats_routes.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/server/tools_routes.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/server/web_runner.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/skills.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/supervisor.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/tool/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/tool/common.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/tool/computer.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/tool/mcp_tool.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/tool/python.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/tool/registry.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/tool/sandbox.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/tool/script.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/tool/tool_filter.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/tools.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/usage_stats.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/utils/__init__.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/utils/async_bridge.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/utils/asyncify.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/utils/cached.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/utils/json_util.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/utils/mdfile.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/utils/modelstore.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/utils/mongodb.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/utils/os_util.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/utils/redis.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/utils/system_util.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/utils/terminal_util.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/utils/toml_util.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/src/geenii/utils/tts_util.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/conftest.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/flow/test_execute_pm_command.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/flow/test_flow.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/flow/test_flow_cli.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_agent_env.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_agents_routes.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_ai_routes.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_async_bridge.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_base_agent.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_chat_routes.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_computer_tool.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_daemon.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_daemon_routes.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_fake_provider.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_file_tools.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_info_commands.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_mcp_config.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_mcp_routes.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_memory.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_message_usage.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_modelstore.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_modelstore_mongo.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_modelstore_redis.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_proc.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_process_manager.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_python_tool.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_scheduler.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_scheduler_routes.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_sqlite_memory.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_supervisor.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_task_context_id.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_tool_filter.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_usage_log.py +0 -0
- {geenii-0.4.0.dev4 → geenii-0.4.0.dev6}/tests/geenii/test_usage_stats.py +0 -0
|
@@ -16,14 +16,14 @@ jobs:
|
|
|
16
16
|
matrix:
|
|
17
17
|
include:
|
|
18
18
|
- platform: linux/amd64
|
|
19
|
-
runner: ubuntu-
|
|
19
|
+
runner: ubuntu-24.04
|
|
20
20
|
arch_tag: linux-amd64
|
|
21
21
|
- platform: linux/arm64
|
|
22
22
|
runner: ubuntu-24.04-arm
|
|
23
23
|
arch_tag: linux-arm64
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
#- platform: darwin/amd64
|
|
25
|
+
# runner: macos-15-intel
|
|
26
|
+
# arch_tag: darwin-amd64
|
|
27
27
|
- platform: darwin/arm64
|
|
28
28
|
runner: macos-latest
|
|
29
29
|
arch_tag: darwin-arm64
|
|
@@ -16,7 +16,7 @@ COPY ./pyproject.toml ./uv.lock /builder/
|
|
|
16
16
|
RUN uv sync --no-cache-dir --frozen --no-install-project
|
|
17
17
|
|
|
18
18
|
COPY ./src/geenii /builder/src/geenii
|
|
19
|
-
COPY ./README.md /builder/
|
|
19
|
+
COPY ./README.md ./README*.md ./LICENSE /builder/
|
|
20
20
|
|
|
21
21
|
# build using pyinstaller
|
|
22
22
|
COPY ./hooks /builder/hooks
|
|
@@ -63,15 +63,13 @@ RUN apk add --no-cache \
|
|
|
63
63
|
|
|
64
64
|
# Create non-root user and group, set permissions for geenii and home directory
|
|
65
65
|
RUN addgroup --gid 33311 -S geenii && adduser --uid 33311 -S geenii -G geenii && \
|
|
66
|
-
mkdir -p /
|
|
67
|
-
chown -R geenii:geenii /
|
|
66
|
+
mkdir -p /workspace && \
|
|
67
|
+
chown -R geenii:geenii /workspace && \
|
|
68
68
|
mkdir -p /home/geenii && \
|
|
69
69
|
chown -R geenii:geenii /home/geenii
|
|
70
70
|
|
|
71
71
|
# Binaries
|
|
72
|
-
#COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
|
|
73
72
|
COPY --from=docker.io/astral/uv:latest /uv /uvx /bin/
|
|
74
|
-
#COPY --from=builder /builder/dist/geenii /usr/bin/geenii
|
|
75
73
|
COPY --from=builder /builder/dist/geenii /opt/geenii/bin/
|
|
76
74
|
RUN chmod +x /opt/geenii/bin/geenii && ln -sf /opt/geenii/bin/geenii /usr/bin/geenii
|
|
77
75
|
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: geenii
|
|
3
|
+
Version: 0.4.0.dev6
|
|
4
|
+
Summary: A versatile AI agent toolkit
|
|
5
|
+
Project-URL: Homepage, https://github.com/fm-labs/geenii
|
|
6
|
+
Project-URL: Issues, https://github.com/fm-labs/geenii/issues
|
|
7
|
+
Author-email: fm-labs <code@fmlabs.dev>
|
|
8
|
+
License-Expression: MIT
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Requires-Python: <4.0,>=3.14
|
|
13
|
+
Requires-Dist: anthropic>=1.15.0
|
|
14
|
+
Requires-Dist: click>=8.3.1
|
|
15
|
+
Requires-Dist: croniter>=6.0.0
|
|
16
|
+
Requires-Dist: cryptography>=49.0.0
|
|
17
|
+
Requires-Dist: fastapi>=0.146.0
|
|
18
|
+
Requires-Dist: fastmcp>=4.1.0
|
|
19
|
+
Requires-Dist: httpx>=0.28.0
|
|
20
|
+
Requires-Dist: mcp>=2.3.0
|
|
21
|
+
Requires-Dist: ollama>=0.5.1
|
|
22
|
+
Requires-Dist: openai>=3.35.0
|
|
23
|
+
Requires-Dist: psutil>=7.2.2
|
|
24
|
+
Requires-Dist: pydantic>=2.12.5
|
|
25
|
+
Requires-Dist: pymongo>=4.17.0
|
|
26
|
+
Requires-Dist: pyyaml>=6.0
|
|
27
|
+
Requires-Dist: redis>=7.4.0
|
|
28
|
+
Requires-Dist: rich>=14.3.3
|
|
29
|
+
Requires-Dist: tomli-w>=1.2.0
|
|
30
|
+
Requires-Dist: uvicorn>=0.54.0
|
|
31
|
+
Requires-Dist: zttp>=0.0.34
|
|
32
|
+
Description-Content-Type: text/markdown
|
|
33
|
+
|
|
34
|
+
# g33n11 Python SDK
|
|
35
|
+
|
|
36
|
+
Python SDK for the [Geenii Platform](https://github.com/fm-labs/geenii)
|
|
37
|
+
|
|
38
|
+
## Documentation
|
|
39
|
+
|
|
40
|
+
- [User Guide](https://github.com/fm-labs/geenii/tree/main/docs/user-guide/) — installation, configuration, agents,
|
|
41
|
+
scheduler, Docker
|
|
42
|
+
- [CLI Reference](https://github.com/fm-labs/geenii/tree/main/docs/cli-reference/index.md) — every command and option
|
|
43
|
+
- [Developer Guide](https://github.com/fm-labs/geenii/tree/main/docs/developer-guide/) — architecture, internals,
|
|
44
|
+
provider/tool APIs
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# g33n11 Python SDK
|
|
2
|
+
|
|
3
|
+
Python SDK for the [Geenii Platform](https://github.com/fm-labs/geenii)
|
|
4
|
+
|
|
5
|
+
## Documentation
|
|
6
|
+
|
|
7
|
+
- [User Guide](https://github.com/fm-labs/geenii/tree/main/docs/user-guide/) — installation, configuration, agents,
|
|
8
|
+
scheduler, Docker
|
|
9
|
+
- [CLI Reference](https://github.com/fm-labs/geenii/tree/main/docs/cli-reference/index.md) — every command and option
|
|
10
|
+
- [Developer Guide](https://github.com/fm-labs/geenii/tree/main/docs/developer-guide/) — architecture, internals,
|
|
11
|
+
provider/tool APIs
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.4.0.dev6
|
|
@@ -83,6 +83,10 @@ geenii
|
|
|
83
83
|
│ ├── remove NAME # remove a task from the config (reloads the daemon)
|
|
84
84
|
│ ├── reload # make the daemon re-read its config
|
|
85
85
|
│ └── run NAME # run a task now (in the daemon, or --local)
|
|
86
|
+
├── server
|
|
87
|
+
│ ├── start [-d] [-p PORT|--uds] # run the HTTP server (API + web UI); -d to detach
|
|
88
|
+
│ ├── status # pid, url, uptime, health
|
|
89
|
+
│ └── stop # stop the running server
|
|
86
90
|
└── supervisor
|
|
87
91
|
├── status # supervised processes and their state
|
|
88
92
|
├── start NAME CMD # start and keep a process running (ad hoc)
|
|
@@ -110,6 +114,7 @@ geenii
|
|
|
110
114
|
- [pm](pm.md) — manage background processes
|
|
111
115
|
- [projects](projects.md) — list configured projects
|
|
112
116
|
- [scheduler](scheduler.md) — manage and run the task scheduler
|
|
117
|
+
- [server](server.md) — start, stop and inspect the HTTP server (API + web UI)
|
|
113
118
|
- [supervisor](supervisor.md) — keep long-running processes up
|
|
114
119
|
|
|
115
120
|
## Related Entry Points
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# geenii server
|
|
2
|
+
|
|
3
|
+
Start, stop and inspect the geenii HTTP server: the FastAPI API (`/api/v1`)
|
|
4
|
+
plus the web UI it serves (see [server](../developer-guide/server.md)).
|
|
5
|
+
|
|
6
|
+
## Synopsis
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
geenii server <command>
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## State file
|
|
13
|
+
|
|
14
|
+
A running server is recorded in `$GEENII_CACHE_DIR/server.json` (PID, process
|
|
15
|
+
start time, host and port or Unix socket, log file). `start` writes it in both foreground and
|
|
16
|
+
detached mode, so `stop` and `status` work from any terminal. A file left by a
|
|
17
|
+
crashed server is ignored and removed.
|
|
18
|
+
|
|
19
|
+
## Commands
|
|
20
|
+
|
|
21
|
+
### start
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
geenii server start [--host HOST] [--port PORT | --uds [PATH]] [--detach] [--reload] [--log-file PATH] [--wait SECONDS]
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Run the server. Fails if a geenii server is already running.
|
|
28
|
+
|
|
29
|
+
| Option | Short | Default | Description |
|
|
30
|
+
|---|---|---|---|
|
|
31
|
+
| `--host` | | `GEENII_SERVER_HOST`, else `127.0.0.1` | Bind address |
|
|
32
|
+
| `--port` | `-p` | `GEENII_SERVER_PORT`, else `33311` | Port |
|
|
33
|
+
| `--uds` | | `GEENII_SERVER_SOCKET` | Listen on a Unix socket instead of host/port; without a path, `$GEENII_CACHE_DIR/server.sock` |
|
|
34
|
+
| `--detach` | `-d` | | Run in the background; returns once `/api/v1/health` answers |
|
|
35
|
+
| `--reload` | | | Restart on source changes (development) |
|
|
36
|
+
| `--log-file` | | `$GEENII_CACHE_DIR/logs/server.log` | Output of a detached server (appended) |
|
|
37
|
+
| `--wait` | | `60` | With `--detach`: seconds to wait for the server to become healthy |
|
|
38
|
+
|
|
39
|
+
Without `--detach` the server runs in the foreground until Ctrl-C or
|
|
40
|
+
`geenii server stop`. With `--detach`, the command exits with code 1 if the
|
|
41
|
+
server dies during startup (printing the end of its log) or isn't healthy in
|
|
42
|
+
time.
|
|
43
|
+
|
|
44
|
+
### Unix socket
|
|
45
|
+
|
|
46
|
+
With `--uds`, the server listens on a Unix domain socket instead of TCP.
|
|
47
|
+
`--uds` can't be combined with an explicit `--host` or `--port`.
|
|
48
|
+
|
|
49
|
+
- The socket is created with mode `0600`, so only the owner can connect.
|
|
50
|
+
- A leftover socket file from a server that didn't shut down cleanly is
|
|
51
|
+
replaced. If something is still serving on it, or the path is a regular
|
|
52
|
+
file, `start` fails.
|
|
53
|
+
- The socket file is removed when the server stops.
|
|
54
|
+
- Socket paths are limited to about 104 bytes on macOS (108 on Linux).
|
|
55
|
+
|
|
56
|
+
A browser can't open a Unix socket. To use the web UI, put a reverse proxy
|
|
57
|
+
(e.g. nginx `proxy_pass http://unix:/path/server.sock;`) in front of it.
|
|
58
|
+
Clients such as curl can talk to it directly:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
curl --unix-socket ~/.cache/geenii/server.sock http://localhost/api/v1/health
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### stop
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
geenii server stop [--timeout SECONDS]
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Send SIGTERM, wait up to `--timeout` (default 10s), then SIGKILL. With
|
|
71
|
+
`--reload`, the reloader's worker process is stopped too. Exits with code 1 if
|
|
72
|
+
no server is running.
|
|
73
|
+
|
|
74
|
+
### status
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
geenii server status [--json]
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Print PID, URL (`unix:PATH` for a socket), uptime, log file, and whether `/api/v1/health` answers. Exits
|
|
81
|
+
with code 1 if no server is running.
|
|
82
|
+
|
|
83
|
+
## Examples
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
geenii server start # foreground on 127.0.0.1:33311
|
|
87
|
+
geenii server start -d -p 8080 # background on port 8080
|
|
88
|
+
geenii server start -d --uds # background on $GEENII_CACHE_DIR/server.sock
|
|
89
|
+
geenii server status
|
|
90
|
+
geenii server stop
|
|
91
|
+
```
|
|
@@ -8,6 +8,7 @@ files.
|
|
|
8
8
|
## Running
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
|
+
geenii server start [-d] [--reload] # see ../cli-reference/server.md; stop with `geenii server stop`
|
|
11
12
|
uvicorn --app-dir ./src geenii.server.server:app --port 33311 # normal
|
|
12
13
|
uvicorn --app-dir ./src geenii.server.server:app --port 33311 --reload # dev
|
|
13
14
|
python -m geenii.server.server # honours GEENII_SERVER_HOST (127.0.0.1) and GEENII_SERVER_PORT (33311)
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "geenii"
|
|
3
|
-
version = "0.4.0.
|
|
3
|
+
version = "0.4.0.dev6"
|
|
4
4
|
description = "A versatile AI agent toolkit"
|
|
5
5
|
requires-python = ">=3.14,<4.0"
|
|
6
6
|
authors = [
|
|
7
7
|
{ name = "fm-labs", email = "code@fmlabs.dev" },
|
|
8
8
|
]
|
|
9
|
-
readme = "README.md"
|
|
9
|
+
readme = "README.python.md"
|
|
10
10
|
classifiers = [
|
|
11
11
|
"Programming Language :: Python :: 3",
|
|
12
12
|
"Operating System :: OS Independent",
|
|
@@ -33,6 +33,7 @@ dependencies = [
|
|
|
33
33
|
"redis>=7.4.0",
|
|
34
34
|
"rich>=14.3.3",
|
|
35
35
|
"tomli-w>=1.2.0",
|
|
36
|
+
"uvicorn>=0.54.0",
|
|
36
37
|
"zttp>=0.0.34",
|
|
37
38
|
]
|
|
38
39
|
|
|
@@ -15,6 +15,7 @@ from geenii.cli.models_cli import models as models_cli
|
|
|
15
15
|
from geenii.cli.pm_cli import pm as pm_cli
|
|
16
16
|
from geenii.cli.projects_cli import projects as projects_cli
|
|
17
17
|
from geenii.cli.scheduler_cli import scheduler as scheduler_cli
|
|
18
|
+
from geenii.cli.server_cli import server as server_cli
|
|
18
19
|
from geenii.cli.skills_cli import skills as skills_cli
|
|
19
20
|
from geenii.cli.supervisor_cli import supervisor as supervisor_cli
|
|
20
21
|
from geenii.cli.tools_cli import tools as tools_cli
|
|
@@ -120,6 +121,7 @@ geecli.add_command(daemon_cli)
|
|
|
120
121
|
geecli.add_command(pm_cli)
|
|
121
122
|
geecli.add_command(projects_cli)
|
|
122
123
|
geecli.add_command(scheduler_cli)
|
|
124
|
+
geecli.add_command(server_cli)
|
|
123
125
|
geecli.add_command(supervisor_cli)
|
|
124
126
|
geecli.add_command(flow_cli)
|
|
125
127
|
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
"""`geenii server`: start, stop and inspect the HTTP server (FastAPI API + web UI).
|
|
2
|
+
|
|
3
|
+
The running server is tracked in a state file (`$GEENII_CACHE_DIR/server.json`) holding
|
|
4
|
+
its PID, the process create time (so a reused PID is never mistaken for the server),
|
|
5
|
+
and where it listens (host/port or a Unix socket). `start` writes it in both foreground
|
|
6
|
+
and detached mode, so `stop` and `status` work from any terminal.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import logging
|
|
11
|
+
import os
|
|
12
|
+
import socket
|
|
13
|
+
import stat
|
|
14
|
+
import subprocess
|
|
15
|
+
import sys
|
|
16
|
+
import time
|
|
17
|
+
from dataclasses import asdict, dataclass
|
|
18
|
+
|
|
19
|
+
import click
|
|
20
|
+
import httpx
|
|
21
|
+
import psutil
|
|
22
|
+
from click.core import ParameterSource
|
|
23
|
+
|
|
24
|
+
from geenii.config import GEENII_CACHE_DIR
|
|
25
|
+
|
|
26
|
+
DEFAULT_HOST = os.getenv("GEENII_SERVER_HOST", "127.0.0.1")
|
|
27
|
+
DEFAULT_PORT = int(os.getenv("GEENII_SERVER_PORT", "33311"))
|
|
28
|
+
DEFAULT_SOCKET = os.path.join(GEENII_CACHE_DIR, "server.sock")
|
|
29
|
+
STATE_FILE = os.path.join(GEENII_CACHE_DIR, "server.json")
|
|
30
|
+
DEFAULT_LOG_FILE = os.path.join(GEENII_CACHE_DIR, "logs", "server.log")
|
|
31
|
+
HEALTH_PATH = "/api/v1/health"
|
|
32
|
+
APP_IMPORT = "geenii.server.server:app"
|
|
33
|
+
SOCKET_MODE = 0o600
|
|
34
|
+
_USE_DEFAULT_SOCKET = "\0default" # `--uds` without a path; resolved to DEFAULT_SOCKET at call time
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@dataclass(frozen=True)
|
|
38
|
+
class Endpoint:
|
|
39
|
+
"""Where the server listens: a Unix socket (`uds`) or host/port."""
|
|
40
|
+
|
|
41
|
+
host: str = DEFAULT_HOST
|
|
42
|
+
port: int = DEFAULT_PORT
|
|
43
|
+
uds: str | None = None
|
|
44
|
+
|
|
45
|
+
@classmethod
|
|
46
|
+
def from_state(cls, state: dict) -> "Endpoint":
|
|
47
|
+
return cls(host=state.get("host") or DEFAULT_HOST, port=state.get("port") or DEFAULT_PORT, uds=state.get("uds"))
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def url(self) -> str:
|
|
51
|
+
"""Base URL for requests (for a Unix socket, the host part is a placeholder)."""
|
|
52
|
+
if self.uds:
|
|
53
|
+
return "http://localhost"
|
|
54
|
+
host = "127.0.0.1" if self.host in ("0.0.0.0", "", "::") else self.host
|
|
55
|
+
if ":" in host:
|
|
56
|
+
host = f"[{host}]"
|
|
57
|
+
return f"http://{host}:{self.port}"
|
|
58
|
+
|
|
59
|
+
def __str__(self) -> str:
|
|
60
|
+
return f"unix:{self.uds}" if self.uds else self.url
|
|
61
|
+
|
|
62
|
+
def client(self, timeout: float) -> httpx.Client:
|
|
63
|
+
transport = httpx.HTTPTransport(uds=self.uds) if self.uds else None
|
|
64
|
+
return httpx.Client(base_url=self.url, transport=transport, timeout=timeout)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
# --- state file ---------------------------------------------------------------
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _read_state() -> dict | None:
|
|
71
|
+
try:
|
|
72
|
+
with open(STATE_FILE) as f:
|
|
73
|
+
return json.load(f)
|
|
74
|
+
except (OSError, ValueError):
|
|
75
|
+
return None
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _write_state(pid: int, endpoint: Endpoint, log_file: str | None) -> None:
|
|
79
|
+
os.makedirs(os.path.dirname(STATE_FILE), exist_ok=True)
|
|
80
|
+
state = {
|
|
81
|
+
"pid": pid,
|
|
82
|
+
"create_time": psutil.Process(pid).create_time(),
|
|
83
|
+
**asdict(endpoint),
|
|
84
|
+
"log_file": log_file,
|
|
85
|
+
"started_at": time.time(),
|
|
86
|
+
}
|
|
87
|
+
tmp = STATE_FILE + ".tmp"
|
|
88
|
+
with open(tmp, "w") as f:
|
|
89
|
+
json.dump(state, f, indent=2)
|
|
90
|
+
os.replace(tmp, STATE_FILE)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _remove_state(pid: int | None = None) -> None:
|
|
94
|
+
"""Remove the state file (only if it still belongs to `pid`, when given)."""
|
|
95
|
+
if pid is not None:
|
|
96
|
+
state = _read_state()
|
|
97
|
+
if state and state.get("pid") != pid:
|
|
98
|
+
return
|
|
99
|
+
try:
|
|
100
|
+
os.remove(STATE_FILE)
|
|
101
|
+
except FileNotFoundError:
|
|
102
|
+
pass
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def _running_process(state: dict | None) -> psutil.Process | None:
|
|
106
|
+
"""The server process described by `state`, or None if it is gone (or the PID was reused)."""
|
|
107
|
+
if not state or not state.get("pid"):
|
|
108
|
+
return None
|
|
109
|
+
try:
|
|
110
|
+
proc = psutil.Process(state["pid"])
|
|
111
|
+
if abs(proc.create_time() - state.get("create_time", 0)) > 1:
|
|
112
|
+
return None
|
|
113
|
+
if proc.status() == psutil.STATUS_ZOMBIE:
|
|
114
|
+
return None
|
|
115
|
+
return proc
|
|
116
|
+
except psutil.Error:
|
|
117
|
+
return None
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def _current_server() -> tuple[dict | None, psutil.Process | None]:
|
|
121
|
+
"""(state, process) of the running server; clears a stale state file."""
|
|
122
|
+
state = _read_state()
|
|
123
|
+
proc = _running_process(state)
|
|
124
|
+
if state and proc is None:
|
|
125
|
+
_remove_state()
|
|
126
|
+
state = None
|
|
127
|
+
return state, proc
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
# --- helpers ------------------------------------------------------------------
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def _is_healthy(endpoint: Endpoint, timeout: float = 1.0) -> bool:
|
|
134
|
+
# Health probes are routine; keep httpx's per-request INFO lines out of the CLI output.
|
|
135
|
+
httpx_logger = logging.getLogger("httpx")
|
|
136
|
+
if httpx_logger.getEffectiveLevel() <= logging.INFO:
|
|
137
|
+
httpx_logger.setLevel(logging.WARNING)
|
|
138
|
+
if endpoint.uds and not os.path.exists(endpoint.uds):
|
|
139
|
+
return False
|
|
140
|
+
try:
|
|
141
|
+
with endpoint.client(timeout) as client:
|
|
142
|
+
return client.get(HEALTH_PATH).status_code == 200
|
|
143
|
+
except httpx.HTTPError:
|
|
144
|
+
return False
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def _remove_socket_file(path: str | None) -> None:
|
|
148
|
+
if path and os.path.exists(path) and stat.S_ISSOCK(os.stat(path).st_mode):
|
|
149
|
+
os.remove(path)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _bind_unix_socket(path: str) -> socket.socket:
|
|
153
|
+
"""Bind a listening Unix socket at `path`, readable/writable by the owner only.
|
|
154
|
+
|
|
155
|
+
uvicorn's own `uds=` binding makes the socket world-writable (0666) and, with
|
|
156
|
+
reload, refuses to start when a stale socket file exists; binding it here and
|
|
157
|
+
handing uvicorn the fd avoids both.
|
|
158
|
+
"""
|
|
159
|
+
if os.path.lexists(path):
|
|
160
|
+
if not stat.S_ISSOCK(os.lstat(path).st_mode):
|
|
161
|
+
raise click.ClickException(f"{path} exists and is not a socket.")
|
|
162
|
+
if _is_healthy(Endpoint(uds=path)):
|
|
163
|
+
raise click.ClickException(f"something is already serving unix:{path}.")
|
|
164
|
+
os.remove(path) # stale socket from a server that didn't shut down cleanly
|
|
165
|
+
|
|
166
|
+
parent = os.path.dirname(os.path.abspath(path))
|
|
167
|
+
if not os.path.isdir(parent):
|
|
168
|
+
os.makedirs(parent, mode=0o700, exist_ok=True)
|
|
169
|
+
|
|
170
|
+
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
|
171
|
+
old_umask = os.umask(0o177) # no window in which the socket is group/world accessible
|
|
172
|
+
try:
|
|
173
|
+
sock.bind(path)
|
|
174
|
+
except OSError as exc:
|
|
175
|
+
sock.close()
|
|
176
|
+
raise click.ClickException(f"cannot bind unix:{path}: {exc}") from exc
|
|
177
|
+
finally:
|
|
178
|
+
os.umask(old_umask)
|
|
179
|
+
os.chmod(path, SOCKET_MODE)
|
|
180
|
+
sock.set_inheritable(True) # the --reload worker is a separate process
|
|
181
|
+
return sock
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def _self_command() -> list[str]:
|
|
185
|
+
"""Command that runs this CLI again (source install or a frozen/compiled binary)."""
|
|
186
|
+
if getattr(sys, "frozen", False) or "__compiled__" in globals():
|
|
187
|
+
return [sys.executable]
|
|
188
|
+
return [sys.executable, "-m", "geenii.cli.main"]
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def _tail(path: str, lines: int = 20) -> str:
|
|
192
|
+
try:
|
|
193
|
+
with open(path, errors="replace") as f:
|
|
194
|
+
return "".join(f.readlines()[-lines:])
|
|
195
|
+
except OSError:
|
|
196
|
+
return ""
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
# --- commands -----------------------------------------------------------------
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
@click.group()
|
|
203
|
+
def server():
|
|
204
|
+
"""Start, stop and inspect the geenii HTTP server (API + web UI)."""
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
@server.command(name="start")
|
|
208
|
+
@click.option("--host", default=DEFAULT_HOST, show_default=True, help="Bind address (env: GEENII_SERVER_HOST).")
|
|
209
|
+
@click.option(
|
|
210
|
+
"--port", "-p", default=DEFAULT_PORT, type=int, show_default=True, help="Port (env: GEENII_SERVER_PORT)."
|
|
211
|
+
)
|
|
212
|
+
@click.option(
|
|
213
|
+
"--uds",
|
|
214
|
+
is_flag=False,
|
|
215
|
+
flag_value=_USE_DEFAULT_SOCKET,
|
|
216
|
+
default=None,
|
|
217
|
+
envvar="GEENII_SERVER_SOCKET",
|
|
218
|
+
help=f"Listen on a Unix socket instead of host/port (env: GEENII_SERVER_SOCKET). "
|
|
219
|
+
f"Without a path: {DEFAULT_SOCKET}",
|
|
220
|
+
)
|
|
221
|
+
@click.option("--detach", "-d", is_flag=True, help="Run in the background and return once the server is up.")
|
|
222
|
+
@click.option("--reload", is_flag=True, help="Restart the server when source files change (development).")
|
|
223
|
+
@click.option(
|
|
224
|
+
"--log-file",
|
|
225
|
+
default=None,
|
|
226
|
+
help=f"Where a detached server writes its output. Default: {DEFAULT_LOG_FILE}",
|
|
227
|
+
)
|
|
228
|
+
@click.option(
|
|
229
|
+
"--wait",
|
|
230
|
+
"wait_s",
|
|
231
|
+
default=60.0,
|
|
232
|
+
type=float,
|
|
233
|
+
show_default=True,
|
|
234
|
+
help="With --detach: seconds to wait for the server to become healthy.",
|
|
235
|
+
)
|
|
236
|
+
@click.pass_context
|
|
237
|
+
def start(ctx, host, port, uds, detach, reload, log_file, wait_s):
|
|
238
|
+
"""Run the server (in the foreground unless --detach)."""
|
|
239
|
+
if uds:
|
|
240
|
+
explicit = [
|
|
241
|
+
f"--{name}"
|
|
242
|
+
for name in ("host", "port")
|
|
243
|
+
if ctx.get_parameter_source(name) == ParameterSource.COMMANDLINE
|
|
244
|
+
]
|
|
245
|
+
if explicit:
|
|
246
|
+
raise click.UsageError(f"--uds can't be combined with {' / '.join(explicit)}.")
|
|
247
|
+
if uds == _USE_DEFAULT_SOCKET:
|
|
248
|
+
uds = DEFAULT_SOCKET
|
|
249
|
+
endpoint = Endpoint(uds=os.path.abspath(os.path.expanduser(uds)))
|
|
250
|
+
else:
|
|
251
|
+
endpoint = Endpoint(host=host, port=port)
|
|
252
|
+
|
|
253
|
+
state, proc = _current_server()
|
|
254
|
+
if proc is not None:
|
|
255
|
+
click.echo(
|
|
256
|
+
f"Error: the geenii server is already running (pid {proc.pid}, {Endpoint.from_state(state)}).",
|
|
257
|
+
err=True,
|
|
258
|
+
)
|
|
259
|
+
raise SystemExit(1)
|
|
260
|
+
|
|
261
|
+
if detach:
|
|
262
|
+
_start_detached(endpoint, reload, log_file or DEFAULT_LOG_FILE, wait_s)
|
|
263
|
+
else:
|
|
264
|
+
_run_foreground(endpoint, reload, log_file)
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def _run_foreground(endpoint: Endpoint, reload: bool, log_file: str | None) -> None:
|
|
268
|
+
import uvicorn
|
|
269
|
+
|
|
270
|
+
listen: dict = {"host": endpoint.host, "port": endpoint.port}
|
|
271
|
+
sock = None
|
|
272
|
+
if endpoint.uds:
|
|
273
|
+
sock = _bind_unix_socket(endpoint.uds)
|
|
274
|
+
listen = {"fd": sock.fileno()}
|
|
275
|
+
|
|
276
|
+
pid = os.getpid()
|
|
277
|
+
_write_state(pid, endpoint, log_file)
|
|
278
|
+
click.echo(f"Starting geenii server on {endpoint} (pid {pid})")
|
|
279
|
+
# --reload needs the import string. Otherwise pass the app object: a real import
|
|
280
|
+
# statement is what PyInstaller follows, so the frozen build bundles geenii.server.
|
|
281
|
+
app = APP_IMPORT
|
|
282
|
+
if not reload:
|
|
283
|
+
from geenii.server.server import app
|
|
284
|
+
try:
|
|
285
|
+
uvicorn.run(app, reload=reload, workers=1, log_level="info", **listen)
|
|
286
|
+
finally:
|
|
287
|
+
_remove_state(pid)
|
|
288
|
+
if sock is not None:
|
|
289
|
+
sock.close()
|
|
290
|
+
_remove_socket_file(endpoint.uds)
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def _start_detached(endpoint: Endpoint, reload: bool, log_file: str, wait_s: float) -> None:
|
|
294
|
+
if _is_healthy(endpoint):
|
|
295
|
+
click.echo(f"Error: something is already serving {endpoint}.", err=True)
|
|
296
|
+
raise SystemExit(1)
|
|
297
|
+
|
|
298
|
+
cmd = [*_self_command(), "server", "start", "--log-file", log_file]
|
|
299
|
+
if endpoint.uds:
|
|
300
|
+
cmd += ["--uds", endpoint.uds]
|
|
301
|
+
else:
|
|
302
|
+
cmd += ["--host", endpoint.host, "--port", str(endpoint.port)]
|
|
303
|
+
if reload:
|
|
304
|
+
cmd.append("--reload")
|
|
305
|
+
|
|
306
|
+
os.makedirs(os.path.dirname(os.path.abspath(log_file)), exist_ok=True)
|
|
307
|
+
with open(log_file, "ab") as log:
|
|
308
|
+
proc = subprocess.Popen(
|
|
309
|
+
cmd,
|
|
310
|
+
stdin=subprocess.DEVNULL,
|
|
311
|
+
stdout=log,
|
|
312
|
+
stderr=subprocess.STDOUT,
|
|
313
|
+
start_new_session=True, # survive the terminal closing; own process group
|
|
314
|
+
env={**os.environ, "PYTHONUNBUFFERED": "1"},
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
deadline = time.monotonic() + wait_s
|
|
318
|
+
while time.monotonic() < deadline:
|
|
319
|
+
if proc.poll() is not None:
|
|
320
|
+
click.echo(f"Error: the server exited during startup (code {proc.returncode}).", err=True)
|
|
321
|
+
click.echo(_tail(log_file), err=True)
|
|
322
|
+
raise SystemExit(1)
|
|
323
|
+
if _is_healthy(endpoint):
|
|
324
|
+
click.echo(f"geenii server started (pid {proc.pid}): {endpoint}")
|
|
325
|
+
click.echo(f"Logs: {log_file}")
|
|
326
|
+
return
|
|
327
|
+
time.sleep(0.25)
|
|
328
|
+
|
|
329
|
+
click.echo(
|
|
330
|
+
f"Warning: the server (pid {proc.pid}) did not answer on {endpoint} within {wait_s:g}s; "
|
|
331
|
+
f"it may still be starting. Check {log_file}.",
|
|
332
|
+
err=True,
|
|
333
|
+
)
|
|
334
|
+
raise SystemExit(1)
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
@server.command(name="stop")
|
|
338
|
+
@click.option(
|
|
339
|
+
"--timeout", "-t", default=10.0, type=float, show_default=True, help="Seconds to wait before killing it."
|
|
340
|
+
)
|
|
341
|
+
def stop(timeout):
|
|
342
|
+
"""Stop the running server (SIGTERM, then SIGKILL after --timeout)."""
|
|
343
|
+
state, proc = _current_server()
|
|
344
|
+
if proc is None:
|
|
345
|
+
click.echo("The geenii server is not running.")
|
|
346
|
+
raise SystemExit(1)
|
|
347
|
+
|
|
348
|
+
# With --reload, uvicorn's worker is a child of this process; take the whole tree.
|
|
349
|
+
children = proc.children(recursive=True)
|
|
350
|
+
proc.terminate()
|
|
351
|
+
gone, alive = psutil.wait_procs([proc], timeout=timeout)
|
|
352
|
+
if alive:
|
|
353
|
+
click.echo(f"The server did not stop within {timeout:g}s; killing it.", err=True)
|
|
354
|
+
for p in [proc, *children]:
|
|
355
|
+
try:
|
|
356
|
+
p.kill()
|
|
357
|
+
except psutil.Error:
|
|
358
|
+
pass
|
|
359
|
+
psutil.wait_procs([proc], timeout=5)
|
|
360
|
+
else:
|
|
361
|
+
# Reap any leftover children (e.g. a reload worker) that outlived the parent.
|
|
362
|
+
_, leftover = psutil.wait_procs(children, timeout=2)
|
|
363
|
+
for p in leftover:
|
|
364
|
+
try:
|
|
365
|
+
p.kill()
|
|
366
|
+
except psutil.Error:
|
|
367
|
+
pass
|
|
368
|
+
|
|
369
|
+
_remove_state(state["pid"])
|
|
370
|
+
_remove_socket_file(state.get("uds")) # only left behind if the server was killed
|
|
371
|
+
click.echo(f"geenii server stopped (pid {state['pid']}).")
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
@server.command(name="status")
|
|
375
|
+
@click.option("--json", "as_json", is_flag=True, help="Print the status as JSON.")
|
|
376
|
+
def status(as_json):
|
|
377
|
+
"""Show whether the server is running and responding."""
|
|
378
|
+
state, proc = _current_server()
|
|
379
|
+
if proc is None:
|
|
380
|
+
if as_json:
|
|
381
|
+
click.echo(json.dumps({"running": False}))
|
|
382
|
+
else:
|
|
383
|
+
click.echo("The geenii server is not running.")
|
|
384
|
+
raise SystemExit(1)
|
|
385
|
+
|
|
386
|
+
endpoint = Endpoint.from_state(state)
|
|
387
|
+
info = {
|
|
388
|
+
"running": True,
|
|
389
|
+
"healthy": _is_healthy(endpoint),
|
|
390
|
+
"pid": state["pid"],
|
|
391
|
+
"url": str(endpoint),
|
|
392
|
+
"host": None if endpoint.uds else endpoint.host,
|
|
393
|
+
"port": None if endpoint.uds else endpoint.port,
|
|
394
|
+
"uds": endpoint.uds,
|
|
395
|
+
"uptime_s": round(time.time() - proc.create_time()),
|
|
396
|
+
"log_file": state.get("log_file"),
|
|
397
|
+
}
|
|
398
|
+
if as_json:
|
|
399
|
+
click.echo(json.dumps(info, indent=2))
|
|
400
|
+
return
|
|
401
|
+
health = "healthy" if info["healthy"] else "not responding"
|
|
402
|
+
click.echo(f"geenii server is running ({health})")
|
|
403
|
+
click.echo(f" pid: {info['pid']}")
|
|
404
|
+
click.echo(f" url: {info['url']}")
|
|
405
|
+
click.echo(f" uptime: {info['uptime_s']}s")
|
|
406
|
+
if info["log_file"]:
|
|
407
|
+
click.echo(f" logs: {info['log_file']}")
|
|
@@ -14,7 +14,7 @@ def _envvar(var: str, default: str | None = None) -> str | None:
|
|
|
14
14
|
return os.environ.get(var, default)
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
APP_VERSION = "0.4.0.
|
|
17
|
+
APP_VERSION = "0.4.0.dev6"
|
|
18
18
|
|
|
19
19
|
GEENII_USER_HOME = get_user_home_dir()
|
|
20
20
|
GEENII_WORKING_DIR = realpath(_envvar("GEENII_WORKING_DIR", os.getcwd()))
|