geenii 0.4.0.dev4__tar.gz → 0.4.0.dev5__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.
Files changed (532) hide show
  1. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/.github/workflows/release.yml +4 -4
  2. geenii-0.4.0.dev5/PKG-INFO +44 -0
  3. geenii-0.4.0.dev5/README.python.md +11 -0
  4. geenii-0.4.0.dev5/VERSION +1 -0
  5. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/cli-reference/index.md +5 -0
  6. geenii-0.4.0.dev5/docs/cli-reference/server.md +91 -0
  7. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/developer-guide/server.md +1 -0
  8. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/pyproject.toml +3 -2
  9. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/cli/main.py +2 -0
  10. geenii-0.4.0.dev5/src/geenii/cli/server_cli.py +402 -0
  11. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/config.py +1 -1
  12. geenii-0.4.0.dev5/tests/geenii/test_server_cli.py +278 -0
  13. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/uv.lock +3 -1
  14. geenii-0.4.0.dev4/PKG-INFO +0 -97
  15. geenii-0.4.0.dev4/VERSION +0 -1
  16. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/.aiignore +0 -0
  17. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/.dockerignore +0 -0
  18. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/.github/workflows/ci.yml +0 -0
  19. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/.github/workflows/publish_image_multiarch.yml +0 -0
  20. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/.github/workflows/release_pypi.yml +0 -0
  21. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/.github/workflows/reposcan.yml +0 -0
  22. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/.gitignore +0 -0
  23. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/.python-version +0 -0
  24. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/DEVELOPER.md +0 -0
  25. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/Dockerfile +0 -0
  26. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/LICENSE +0 -0
  27. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/README.md +0 -0
  28. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/build_bin.sh +0 -0
  29. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/build_image.sh +0 -0
  30. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/build_nuitka.sh +0 -0
  31. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/build_od.sh +0 -0
  32. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/build_wheel.sh +0 -0
  33. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/bump_version.py +0 -0
  34. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/container/entrypoint.sh +0 -0
  35. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/cheatsheet.md +0 -0
  36. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/cli-reference/agent.md +0 -0
  37. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/cli-reference/agents.md +0 -0
  38. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/cli-reference/apps.md +0 -0
  39. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/cli-reference/daemon.md +0 -0
  40. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/cli-reference/flow.md +0 -0
  41. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/cli-reference/info.md +0 -0
  42. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/cli-reference/mcp.md +0 -0
  43. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/cli-reference/models.md +0 -0
  44. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/cli-reference/pm.md +0 -0
  45. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/cli-reference/projects.md +0 -0
  46. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/cli-reference/scheduler.md +0 -0
  47. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/cli-reference/skills.md +0 -0
  48. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/cli-reference/supervisor.md +0 -0
  49. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/cli-reference/tools.md +0 -0
  50. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/developer-guide/agents.md +0 -0
  51. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/developer-guide/apps.md +0 -0
  52. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/developer-guide/architecture.md +0 -0
  53. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/developer-guide/building.md +0 -0
  54. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/developer-guide/caching.md +0 -0
  55. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/developer-guide/flow.md +0 -0
  56. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/developer-guide/mcp.md +0 -0
  57. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/developer-guide/memory.md +0 -0
  58. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/developer-guide/messages.md +0 -0
  59. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/developer-guide/processes.md +0 -0
  60. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/developer-guide/providers.md +0 -0
  61. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/developer-guide/sandbox.md +0 -0
  62. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/developer-guide/skills.md +0 -0
  63. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/developer-guide/tools.md +0 -0
  64. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/developer-guide/usage-tracking.md +0 -0
  65. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/developer-guide/web-ui.md +0 -0
  66. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/developer-guide/widgets.md +0 -0
  67. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/index.md +0 -0
  68. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/user-guide/agents.md +0 -0
  69. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/user-guide/configuration.md +0 -0
  70. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/user-guide/docker.md +0 -0
  71. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/user-guide/installation.md +0 -0
  72. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/docs/user-guide/scheduler.md +0 -0
  73. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/examples/flow_example.yaml +0 -0
  74. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/examples/pm_flow_example.yaml +0 -0
  75. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/.dockerignore +0 -0
  76. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/.gitignore +0 -0
  77. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/.prettierrc.json +0 -0
  78. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/Dockerfile +0 -0
  79. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/README.md +0 -0
  80. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/components.json +0 -0
  81. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/container/nginx.conf +0 -0
  82. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/index.html +0 -0
  83. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/package.json +0 -0
  84. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/pnpm-lock.yaml +0 -0
  85. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/pnpm-workspace.yaml +0 -0
  86. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/public/bot.svg +0 -0
  87. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/public/bot_white.svg +0 -0
  88. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/public/create-task.html +0 -0
  89. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/public/placeholder.svg +0 -0
  90. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/public/pm/index.html +0 -0
  91. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/public/tauri.svg +0 -0
  92. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/public/vite.svg +0 -0
  93. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/shadcn_add.sh +0 -0
  94. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/Animate.scss +0 -0
  95. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/App.scss +0 -0
  96. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/App.tsx +0 -0
  97. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/api/api-error.ts +0 -0
  98. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/api/ollama-api.ts +0 -0
  99. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/api/openai.types.ts +0 -0
  100. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/api/xai-tauri.ts +0 -0
  101. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/api/xai-web.ts +0 -0
  102. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/api/xai.types.ts +0 -0
  103. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/agents/agent-chat.tsx +0 -0
  104. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/agents/agent-page.tsx +0 -0
  105. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/agents/agent-types.ts +0 -0
  106. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/agents/agent.view.tsx +0 -0
  107. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/agents/agents-page.tsx +0 -0
  108. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/agents/agents.view.tsx +0 -0
  109. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/agents/components/agent-config-editor.tsx +0 -0
  110. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/agents/components/agent-env-editor.tsx +0 -0
  111. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/aiassist/AiAssist.scss +0 -0
  112. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/aiassist/AiAssistPanel.tsx +0 -0
  113. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/aiassist/AiAssistVoicePrompt.tsx +0 -0
  114. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/aiassist/AudioFileImporter.tsx +0 -0
  115. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/aiassist/AudioPlayerWithWaveform.tsx +0 -0
  116. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/aiassist/AudioRecorder.tsx +0 -0
  117. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/aiassist/audio-page.tsx +0 -0
  118. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/apps/app-page.tsx +0 -0
  119. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/apps/apps-page.tsx +0 -0
  120. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/apps/apps-view.tsx +0 -0
  121. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/apps/tauri-app-viewer.tsx +0 -0
  122. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/catalog/catalog-page.tsx +0 -0
  123. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/catalog/components/docker-mcp-catalog-config-builder.tsx +0 -0
  124. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/catalog/components/docker-mcp-catalog-oci.tsx +0 -0
  125. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/catalog/components/docker-mcp-catalog-provider.tsx +0 -0
  126. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/catalog/components/docker-mcp-catalog-v3-config-builder.tsx +0 -0
  127. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/catalog/components/docker-mcp-catalog-v3-provider.tsx +0 -0
  128. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/catalog/components/docker-mcp-catalog-v3.tsx +0 -0
  129. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/catalog/docker-mcp-catalog-page.tsx +0 -0
  130. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/catalog/docker-mcp-catalog-view.tsx +0 -0
  131. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/chat/Chat.scss +0 -0
  132. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/chat/completion-chat-page.tsx +0 -0
  133. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/chat/completion-chat.tsx +0 -0
  134. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/chat/components/ChatContext.tsx +0 -0
  135. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/chat/components/ChatContextProvider.tsx +0 -0
  136. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/chat/components/ChatFiles.tsx +0 -0
  137. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/chat/components/ChatFilesUploaderPopup.tsx +0 -0
  138. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/chat/components/ChatInput.tsx +0 -0
  139. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/chat/components/ChatMessages.tsx +0 -0
  140. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/chat/components/ChatModelSelector.tsx +0 -0
  141. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/chat/components/ChatPopup.tsx +0 -0
  142. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/chat/components/ChatPromptSuggestions.tsx +0 -0
  143. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/chat/components/ModelThinkingIndicator.tsx +0 -0
  144. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/chat/components/chat.types.ts +0 -0
  145. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/completion/completions-page.tsx +0 -0
  146. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/completion/components/QuickAudioGenerationPopupButton.tsx +0 -0
  147. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/completion/components/QuickCompletion.tsx +0 -0
  148. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/completion/components/QuickImageGenerationPopupButton.tsx +0 -0
  149. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/completion/components/QuickOllamaTextGenerationPopupButton.tsx +0 -0
  150. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/completion/components/QuickTextGenerationPopupButton.tsx +0 -0
  151. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/components/agents-settings-view.tsx +0 -0
  152. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/components/ai-model-settings-view.tsx +0 -0
  153. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/components/apps-settings.tsx +0 -0
  154. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/components/audio-settings.tsx +0 -0
  155. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/components/mcp-servers-settings-view.tsx +0 -0
  156. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/components/models-settings-view.tsx +0 -0
  157. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/components/ollama-models.tsx +0 -0
  158. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/components/process-manager-view.tsx +0 -0
  159. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/components/process-output.tsx +0 -0
  160. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/components/process-start-dialog.tsx +0 -0
  161. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/components/scheduler-config-view.tsx +0 -0
  162. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/components/scheduler-task-dialog.tsx +0 -0
  163. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/components/settings-form-view.tsx +0 -0
  164. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/components/skills-settings-view.tsx +0 -0
  165. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/components/system-info-view.tsx +0 -0
  166. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/components/usage-stats-view.tsx +0 -0
  167. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/configure-page.tsx +0 -0
  168. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/console-page.tsx +0 -0
  169. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/settings-forms.ts +0 -0
  170. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/settings-navdata.tsx +0 -0
  171. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/settings-view.tsx +0 -0
  172. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/console/system-page.tsx +0 -0
  173. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/dashboard/dashboard.page.tsx +0 -0
  174. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/flows/components/flowgraph-background.tsx +0 -0
  175. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/flows/components/flowgraph-canvas.tsx +0 -0
  176. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/flows/components/flowgraph-edges.tsx +0 -0
  177. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/flows/components/flowgraph-editor-panel.tsx +0 -0
  178. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/flows/components/flowgraph-editor.tsx +0 -0
  179. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/flows/components/flowgraph-nodes.tsx +0 -0
  180. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/flows/components/flowgraph-provider.tsx +0 -0
  181. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/flows/components/flowgraph-selected-node.tsx +0 -0
  182. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/flows/components/flowgraph-types.ts +0 -0
  183. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/flows/components/flowgraph.scss +0 -0
  184. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/flows/components/svgutil.ts +0 -0
  185. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/flows/flows-page.tsx +0 -0
  186. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/launcher/launcher-page.tsx +0 -0
  187. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/launcher/launcher.view.tsx +0 -0
  188. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/mcp-servers/components/mcp-server-actions.tsx +0 -0
  189. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/mcp-servers/components/mcp-server-config-editor.tsx +0 -0
  190. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/mcp-servers/components/mcp-server-provider.tsx +0 -0
  191. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/mcp-servers/components/mcp-server-tool-form.tsx +0 -0
  192. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/mcp-servers/components/mcp-server-view-head.tsx +0 -0
  193. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/mcp-servers/components/mcp-server.tsx +0 -0
  194. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/mcp-servers/components/mcp-servers-provider.tsx +0 -0
  195. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/mcp-servers/types.ts +0 -0
  196. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/tools/tool-types.ts +0 -0
  197. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/tools/tools.page.tsx +0 -0
  198. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/tools/tools.view.tsx +0 -0
  199. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/xchat/xchat-demo-page-1.tsx +0 -0
  200. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app/xchat/xchat-provider.tsx +0 -0
  201. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app-router.tsx +0 -0
  202. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/app-socket.tsx +0 -0
  203. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/assets/react.svg +0 -0
  204. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/Popup.tsx +0 -0
  205. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/TypewriterText.tsx +0 -0
  206. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/file-list/FileList.tsx +0 -0
  207. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/file-list/FileListDemo.tsx +0 -0
  208. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/file-list/README.md +0 -0
  209. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/file-list/index.ts +0 -0
  210. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/filterable-select.tsx +0 -0
  211. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/form/schema-form-dialog.tsx +0 -0
  212. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/header.tsx +0 -0
  213. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/json-debug-view.tsx +0 -0
  214. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/json-view.tsx +0 -0
  215. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/layout/console-layout.tsx +0 -0
  216. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/layout/console-navdata.tsx +0 -0
  217. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/layout/console-sidebar.tsx +0 -0
  218. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/layout/headerbar.tsx +0 -0
  219. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/layout/layout.tsx +0 -0
  220. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/layout/main-content.tsx +0 -0
  221. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/layout/main-layout.tsx +0 -0
  222. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/layout/main-sidebar.tsx +0 -0
  223. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/layout/message-inbox.tsx +0 -0
  224. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/layout/xchat-layout.tsx +0 -0
  225. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/layout/xchat-sidebar.tsx +0 -0
  226. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/nav-user.tsx +0 -0
  227. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/output-data-markdown.tsx +0 -0
  228. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/search-form.tsx +0 -0
  229. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/split-layout-h.tsx +0 -0
  230. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/split-layout-v.tsx +0 -0
  231. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/tauri/TauriCommandButton.tsx +0 -0
  232. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/tauri/TauriCommands.tsx +0 -0
  233. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/tauri/TauriPanel.tsx +0 -0
  234. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/tauri/TauriPanelContext.tsx +0 -0
  235. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/tauri/TauriSettingsPanelItem.tsx +0 -0
  236. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/tauri/TauriUpdaterPanelItem.tsx +0 -0
  237. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/tauri/TauriWrapper.tsx +0 -0
  238. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/tauri/tauri-docker-api.ts +0 -0
  239. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/tauri/tauri.types.ts +0 -0
  240. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/tauri/useTauri.ts +0 -0
  241. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/theme-provider.tsx +0 -0
  242. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/alert-dialog.tsx +0 -0
  243. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/avatar.tsx +0 -0
  244. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/badge.tsx +0 -0
  245. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/breadcrumb.tsx +0 -0
  246. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/button.tsx +0 -0
  247. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/card.tsx +0 -0
  248. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/collapsible.tsx +0 -0
  249. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/command.tsx +0 -0
  250. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/dialog.tsx +0 -0
  251. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/dropdown-menu.tsx +0 -0
  252. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/input.tsx +0 -0
  253. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/label.tsx +0 -0
  254. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/popover.tsx +0 -0
  255. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/scroll-area.tsx +0 -0
  256. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/separator.tsx +0 -0
  257. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/sheet.tsx +0 -0
  258. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/sidebar.tsx +0 -0
  259. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/skeleton.tsx +0 -0
  260. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/switch.tsx +0 -0
  261. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/textarea.tsx +0 -0
  262. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/ui/tooltip.tsx +0 -0
  263. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/uploader/FileUploader.tsx +0 -0
  264. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/uploader/FileUploaderExample.tsx +0 -0
  265. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/voice-recorder/VoiceRecorder.tsx +0 -0
  266. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/voice-recorder/useMicrophone.ts +0 -0
  267. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/backend-switcher.tsx +0 -0
  268. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/backends/agent-backend.ts +0 -0
  269. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/backends/echo-backend.ts +0 -0
  270. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/backends/echo-examples.ts +0 -0
  271. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/chat-command-menu.tsx +0 -0
  272. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/chat-content-part.tsx +0 -0
  273. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/chat-context-provider.tsx +0 -0
  274. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/chat-context.tsx +0 -0
  275. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/chat-error.tsx +0 -0
  276. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/chat-input.tsx +0 -0
  277. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/chat-message-usage.tsx +0 -0
  278. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/chat-message.tsx +0 -0
  279. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/chat-messages.tsx +0 -0
  280. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/chat-model-selector.tsx +0 -0
  281. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/chat-session-list.tsx +0 -0
  282. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/chat-session.ts +0 -0
  283. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/chat-status.tsx +0 -0
  284. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/chat-tool-calls.ts +0 -0
  285. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/chat-voice-input.tsx +0 -0
  286. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/chat.tsx +0 -0
  287. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/chat.types.ts +0 -0
  288. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/index.ts +0 -0
  289. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/index.ts +0 -0
  290. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/media-parts.tsx +0 -0
  291. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/tool-parts.tsx +0 -0
  292. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widget-parts.tsx +0 -0
  293. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/accordion.tsx +0 -0
  294. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/barchart.tsx +0 -0
  295. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/child-content.tsx +0 -0
  296. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/choices.tsx +0 -0
  297. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/clock.tsx +0 -0
  298. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/code.tsx +0 -0
  299. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/copy-button.tsx +0 -0
  300. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/countdown.tsx +0 -0
  301. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/csv.tsx +0 -0
  302. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/dice.tsx +0 -0
  303. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/diff.tsx +0 -0
  304. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/donut.tsx +0 -0
  305. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/errorboundarytest.tsx +0 -0
  306. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/filetree.tsx +0 -0
  307. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/form.tsx +0 -0
  308. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/fortune.tsx +0 -0
  309. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/funnel.tsx +0 -0
  310. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/gauge.tsx +0 -0
  311. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/grid.tsx +0 -0
  312. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/heatmap.tsx +0 -0
  313. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/html.tsx +0 -0
  314. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/iframe.tsx +0 -0
  315. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/index.ts +0 -0
  316. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/json.tsx +0 -0
  317. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/keyvalue.tsx +0 -0
  318. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/linechart.tsx +0 -0
  319. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/links.tsx +0 -0
  320. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/list.tsx +0 -0
  321. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/matrix.tsx +0 -0
  322. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/postbutton.tsx +0 -0
  323. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/progress.tsx +0 -0
  324. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/rating.tsx +0 -0
  325. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/safe-url.ts +0 -0
  326. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/scatter.tsx +0 -0
  327. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/snake.tsx +0 -0
  328. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/sparklines.tsx +0 -0
  329. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/stat.tsx +0 -0
  330. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/status.tsx +0 -0
  331. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/steps.tsx +0 -0
  332. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/table.tsx +0 -0
  333. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/tabs.tsx +0 -0
  334. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/terminal.tsx +0 -0
  335. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/timeline.tsx +0 -0
  336. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/treemap.tsx +0 -0
  337. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/use-chat-reply.ts +0 -0
  338. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/use-now.ts +0 -0
  339. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/use-reduced-motion.ts +0 -0
  340. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/components/xchat/parts/widgets/weather.tsx +0 -0
  341. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/constants.ts +0 -0
  342. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/context/api-context.tsx +0 -0
  343. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/context/app-context-provider.tsx +0 -0
  344. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/context/app-context.tsx +0 -0
  345. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/context/server-context-provider.tsx +0 -0
  346. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/context/server-context.tsx +0 -0
  347. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/convo.ts +0 -0
  348. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/features/errors/forbidden.tsx +0 -0
  349. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/features/errors/general-error.tsx +0 -0
  350. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/features/errors/maintenance-error.tsx +0 -0
  351. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/features/errors/not-found-error.tsx +0 -0
  352. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/features/errors/unauthorized-error.tsx +0 -0
  353. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/hooks/use-mobile.ts +0 -0
  354. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/hooks/use-models.ts +0 -0
  355. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/hooks/useNotification.ts +0 -0
  356. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/init.ts +0 -0
  357. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/lib/utils.ts +0 -0
  358. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/main.tsx +0 -0
  359. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/tailwind.css +0 -0
  360. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/src/vite-env.d.ts +0 -0
  361. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/tsconfig.json +0 -0
  362. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/tsconfig.node.json +0 -0
  363. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/geenii-ui/vite.config.ts +0 -0
  364. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/hooks/hook-geenii.provider.py +0 -0
  365. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/run.sh +0 -0
  366. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/scripts/gen_homebrew_formula_od.py +0 -0
  367. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/scripts/gen_homebrew_formula_of.py +0 -0
  368. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/__init__.py +0 -0
  369. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/agent/__init__.py +0 -0
  370. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/agent/base.py +0 -0
  371. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/agent/base_agent.py +0 -0
  372. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/agent/env.py +0 -0
  373. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/agent/info_commands.py +0 -0
  374. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/agent/registry.py +0 -0
  375. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/agent/tasks.py +0 -0
  376. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/agent/utils.py +0 -0
  377. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/agents.py +0 -0
  378. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/ai.py +0 -0
  379. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/apps.py +0 -0
  380. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/bots.py +0 -0
  381. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/chat_models.py +0 -0
  382. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/cli/__init__.py +0 -0
  383. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/cli/agent_cli.py +0 -0
  384. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/cli/agents_cli.py +0 -0
  385. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/cli/ai_cli.py +0 -0
  386. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/cli/apps_cli.py +0 -0
  387. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/cli/cli_runner.py +0 -0
  388. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/cli/click_helper.py +0 -0
  389. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/cli/daemon_cli.py +0 -0
  390. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/cli/flow_cli.py +0 -0
  391. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/cli/info_cli.py +0 -0
  392. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/cli/mcp_cli.py +0 -0
  393. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/cli/models_cli.py +0 -0
  394. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/cli/pm_cli.py +0 -0
  395. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/cli/projects_cli.py +0 -0
  396. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/cli/scheduler_cli.py +0 -0
  397. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/cli/skills_cli.py +0 -0
  398. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/cli/supervisor_cli.py +0 -0
  399. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/cli/tools_cli.py +0 -0
  400. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/console/__init__.py +0 -0
  401. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/core/__init__.py +0 -0
  402. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/core/process_tools.py +0 -0
  403. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/core/tasks.py +0 -0
  404. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/core/tools.py +0 -0
  405. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/daemon/__init__.py +0 -0
  406. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/daemon/client.py +0 -0
  407. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/daemon/host.py +0 -0
  408. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/daemon/server.py +0 -0
  409. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/datamodels.py +0 -0
  410. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/example_bots.py +0 -0
  411. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/flow/__init__.py +0 -0
  412. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/flow/flow.py +0 -0
  413. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/flow/processor/__init__.py +0 -0
  414. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/flow/processor/echo.py +0 -0
  415. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/flow/processor/execute_command.py +0 -0
  416. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/flow/processor/execute_pm_command.py +0 -0
  417. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/flow/processor/execute_script.py +0 -0
  418. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/flow/processor/read_file.py +0 -0
  419. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/flow/processor/read_http.py +0 -0
  420. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/flows.py +0 -0
  421. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/g.py +0 -0
  422. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/hitl.py +0 -0
  423. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/logs.py +0 -0
  424. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/mcp_client.py +0 -0
  425. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/mcp_config.py +0 -0
  426. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/memory.py +0 -0
  427. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/pm/__init__.py +0 -0
  428. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/pm/process_manager.py +0 -0
  429. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/pm/process_manager_client.py +0 -0
  430. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/pm/process_manager_service.py +0 -0
  431. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/proc.py +0 -0
  432. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/provider/__init__.py +0 -0
  433. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/provider/anthropic/__init__.py +0 -0
  434. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/provider/anthropic/provider.py +0 -0
  435. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/provider/fake/__init__.py +0 -0
  436. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/provider/fake/provider.py +0 -0
  437. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/provider/geenii/__init__.py +0 -0
  438. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/provider/geenii/provider.py +0 -0
  439. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/provider/hf/__init__.py +0 -0
  440. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/provider/hf/provider.py +0 -0
  441. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/provider/interfaces.py +0 -0
  442. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/provider/kokoro/__init__.py +0 -0
  443. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/provider/kokoro/provider.py +0 -0
  444. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/provider/ollama/__init__.py +0 -0
  445. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/provider/ollama/provider.py +0 -0
  446. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/provider/openai/__init__.py +0 -0
  447. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/provider/openai/provider.py +0 -0
  448. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/provider/whisper/__init__.py +0 -0
  449. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/provider/whisper/provider.py +0 -0
  450. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/provider/whisper/whispercpp_ext.py +0 -0
  451. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/sandbox.py +0 -0
  452. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/scheduler.py +0 -0
  453. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/server/__init__.py +0 -0
  454. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/server/agents_routes.py +0 -0
  455. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/server/ai_routes.py +0 -0
  456. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/server/chat_routes.py +0 -0
  457. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/server/chat_sessions.py +0 -0
  458. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/server/daemon_routes.py +0 -0
  459. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/server/flow_routes.py +0 -0
  460. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/server/mcp_routes.py +0 -0
  461. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/server/pm_routes.py +0 -0
  462. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/server/projects_routes.py +0 -0
  463. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/server/public_routes.py +0 -0
  464. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/server/router.py +0 -0
  465. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/server/scheduler_routes.py +0 -0
  466. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/server/security.py +0 -0
  467. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/server/server.py +0 -0
  468. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/server/skills_routes.py +0 -0
  469. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/server/stats_routes.py +0 -0
  470. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/server/tools_routes.py +0 -0
  471. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/server/web_runner.py +0 -0
  472. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/skills.py +0 -0
  473. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/supervisor.py +0 -0
  474. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/tool/__init__.py +0 -0
  475. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/tool/common.py +0 -0
  476. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/tool/computer.py +0 -0
  477. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/tool/mcp_tool.py +0 -0
  478. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/tool/python.py +0 -0
  479. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/tool/registry.py +0 -0
  480. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/tool/sandbox.py +0 -0
  481. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/tool/script.py +0 -0
  482. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/tool/tool_filter.py +0 -0
  483. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/tools.py +0 -0
  484. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/usage_stats.py +0 -0
  485. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/utils/__init__.py +0 -0
  486. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/utils/async_bridge.py +0 -0
  487. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/utils/asyncify.py +0 -0
  488. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/utils/cached.py +0 -0
  489. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/utils/json_util.py +0 -0
  490. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/utils/mdfile.py +0 -0
  491. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/utils/modelstore.py +0 -0
  492. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/utils/mongodb.py +0 -0
  493. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/utils/os_util.py +0 -0
  494. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/utils/redis.py +0 -0
  495. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/utils/system_util.py +0 -0
  496. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/utils/terminal_util.py +0 -0
  497. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/utils/toml_util.py +0 -0
  498. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/src/geenii/utils/tts_util.py +0 -0
  499. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/conftest.py +0 -0
  500. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/flow/test_execute_pm_command.py +0 -0
  501. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/flow/test_flow.py +0 -0
  502. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/flow/test_flow_cli.py +0 -0
  503. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_agent_env.py +0 -0
  504. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_agents_routes.py +0 -0
  505. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_ai_routes.py +0 -0
  506. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_async_bridge.py +0 -0
  507. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_base_agent.py +0 -0
  508. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_chat_routes.py +0 -0
  509. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_computer_tool.py +0 -0
  510. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_daemon.py +0 -0
  511. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_daemon_routes.py +0 -0
  512. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_fake_provider.py +0 -0
  513. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_file_tools.py +0 -0
  514. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_info_commands.py +0 -0
  515. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_mcp_config.py +0 -0
  516. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_mcp_routes.py +0 -0
  517. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_memory.py +0 -0
  518. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_message_usage.py +0 -0
  519. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_modelstore.py +0 -0
  520. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_modelstore_mongo.py +0 -0
  521. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_modelstore_redis.py +0 -0
  522. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_proc.py +0 -0
  523. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_process_manager.py +0 -0
  524. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_python_tool.py +0 -0
  525. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_scheduler.py +0 -0
  526. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_scheduler_routes.py +0 -0
  527. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_sqlite_memory.py +0 -0
  528. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_supervisor.py +0 -0
  529. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_task_context_id.py +0 -0
  530. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_tool_filter.py +0 -0
  531. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/tests/geenii/test_usage_log.py +0 -0
  532. {geenii-0.4.0.dev4 → geenii-0.4.0.dev5}/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-latest
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
- - platform: darwin/amd64
25
- runner: macos-latest
26
- arch_tag: darwin-amd64
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
@@ -0,0 +1,44 @@
1
+ Metadata-Version: 2.5
2
+ Name: geenii
3
+ Version: 0.4.0.dev5
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.dev5
@@ -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.dev4"
3
+ version = "0.4.0.dev5"
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,402 @@
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
+ try:
280
+ uvicorn.run(APP_IMPORT, reload=reload, workers=1, log_level="info", **listen)
281
+ finally:
282
+ _remove_state(pid)
283
+ if sock is not None:
284
+ sock.close()
285
+ _remove_socket_file(endpoint.uds)
286
+
287
+
288
+ def _start_detached(endpoint: Endpoint, reload: bool, log_file: str, wait_s: float) -> None:
289
+ if _is_healthy(endpoint):
290
+ click.echo(f"Error: something is already serving {endpoint}.", err=True)
291
+ raise SystemExit(1)
292
+
293
+ cmd = [*_self_command(), "server", "start", "--log-file", log_file]
294
+ if endpoint.uds:
295
+ cmd += ["--uds", endpoint.uds]
296
+ else:
297
+ cmd += ["--host", endpoint.host, "--port", str(endpoint.port)]
298
+ if reload:
299
+ cmd.append("--reload")
300
+
301
+ os.makedirs(os.path.dirname(os.path.abspath(log_file)), exist_ok=True)
302
+ with open(log_file, "ab") as log:
303
+ proc = subprocess.Popen(
304
+ cmd,
305
+ stdin=subprocess.DEVNULL,
306
+ stdout=log,
307
+ stderr=subprocess.STDOUT,
308
+ start_new_session=True, # survive the terminal closing; own process group
309
+ env={**os.environ, "PYTHONUNBUFFERED": "1"},
310
+ )
311
+
312
+ deadline = time.monotonic() + wait_s
313
+ while time.monotonic() < deadline:
314
+ if proc.poll() is not None:
315
+ click.echo(f"Error: the server exited during startup (code {proc.returncode}).", err=True)
316
+ click.echo(_tail(log_file), err=True)
317
+ raise SystemExit(1)
318
+ if _is_healthy(endpoint):
319
+ click.echo(f"geenii server started (pid {proc.pid}): {endpoint}")
320
+ click.echo(f"Logs: {log_file}")
321
+ return
322
+ time.sleep(0.25)
323
+
324
+ click.echo(
325
+ f"Warning: the server (pid {proc.pid}) did not answer on {endpoint} within {wait_s:g}s; "
326
+ f"it may still be starting. Check {log_file}.",
327
+ err=True,
328
+ )
329
+ raise SystemExit(1)
330
+
331
+
332
+ @server.command(name="stop")
333
+ @click.option(
334
+ "--timeout", "-t", default=10.0, type=float, show_default=True, help="Seconds to wait before killing it."
335
+ )
336
+ def stop(timeout):
337
+ """Stop the running server (SIGTERM, then SIGKILL after --timeout)."""
338
+ state, proc = _current_server()
339
+ if proc is None:
340
+ click.echo("The geenii server is not running.")
341
+ raise SystemExit(1)
342
+
343
+ # With --reload, uvicorn's worker is a child of this process; take the whole tree.
344
+ children = proc.children(recursive=True)
345
+ proc.terminate()
346
+ gone, alive = psutil.wait_procs([proc], timeout=timeout)
347
+ if alive:
348
+ click.echo(f"The server did not stop within {timeout:g}s; killing it.", err=True)
349
+ for p in [proc, *children]:
350
+ try:
351
+ p.kill()
352
+ except psutil.Error:
353
+ pass
354
+ psutil.wait_procs([proc], timeout=5)
355
+ else:
356
+ # Reap any leftover children (e.g. a reload worker) that outlived the parent.
357
+ _, leftover = psutil.wait_procs(children, timeout=2)
358
+ for p in leftover:
359
+ try:
360
+ p.kill()
361
+ except psutil.Error:
362
+ pass
363
+
364
+ _remove_state(state["pid"])
365
+ _remove_socket_file(state.get("uds")) # only left behind if the server was killed
366
+ click.echo(f"geenii server stopped (pid {state['pid']}).")
367
+
368
+
369
+ @server.command(name="status")
370
+ @click.option("--json", "as_json", is_flag=True, help="Print the status as JSON.")
371
+ def status(as_json):
372
+ """Show whether the server is running and responding."""
373
+ state, proc = _current_server()
374
+ if proc is None:
375
+ if as_json:
376
+ click.echo(json.dumps({"running": False}))
377
+ else:
378
+ click.echo("The geenii server is not running.")
379
+ raise SystemExit(1)
380
+
381
+ endpoint = Endpoint.from_state(state)
382
+ info = {
383
+ "running": True,
384
+ "healthy": _is_healthy(endpoint),
385
+ "pid": state["pid"],
386
+ "url": str(endpoint),
387
+ "host": None if endpoint.uds else endpoint.host,
388
+ "port": None if endpoint.uds else endpoint.port,
389
+ "uds": endpoint.uds,
390
+ "uptime_s": round(time.time() - proc.create_time()),
391
+ "log_file": state.get("log_file"),
392
+ }
393
+ if as_json:
394
+ click.echo(json.dumps(info, indent=2))
395
+ return
396
+ health = "healthy" if info["healthy"] else "not responding"
397
+ click.echo(f"geenii server is running ({health})")
398
+ click.echo(f" pid: {info['pid']}")
399
+ click.echo(f" url: {info['url']}")
400
+ click.echo(f" uptime: {info['uptime_s']}s")
401
+ if info["log_file"]:
402
+ 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.dev4"
17
+ APP_VERSION = "0.4.0.dev5"
18
18
 
19
19
  GEENII_USER_HOME = get_user_home_dir()
20
20
  GEENII_WORKING_DIR = realpath(_envvar("GEENII_WORKING_DIR", os.getcwd()))