genxai-framework 0.1.0__tar.gz → 0.1.2__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 (260) hide show
  1. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/ARCHITECTURE.md +2 -2
  2. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/CONTRIBUTING.md +2 -2
  3. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/GETTING_STARTED.md +2 -2
  4. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/PKG-INFO +63 -12
  5. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/README.md +62 -11
  6. genxai_framework-0.1.2/cli/commands/__init__.py +8 -0
  7. genxai_framework-0.1.2/cli/commands/connector.py +309 -0
  8. genxai_framework-0.1.2/cli/commands/workflow.py +80 -0
  9. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/cli/main.py +3 -1
  10. genxai_framework-0.1.2/docs/API.md +94 -0
  11. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/API_REFERENCE.md +302 -0
  12. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/BENCHMARKING.md +1 -0
  13. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/CLI_USAGE.md +82 -0
  14. genxai_framework-0.1.2/docs/CONNECTOR_SDK.md +140 -0
  15. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/DOCS_INDEX.md +12 -4
  16. genxai_framework-0.1.2/docs/FLOWS.md +225 -0
  17. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/QUICK_START_TUTORIAL.md +71 -6
  18. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/RELEASE_CHECKLIST.md +1 -0
  19. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/SECURITY_CHECKLIST.md +1 -0
  20. genxai_framework-0.1.2/docs/TOOL_CREATION.md +86 -0
  21. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/WORKFLOW_BEST_PRACTICES.md +51 -0
  22. genxai_framework-0.1.2/docs/WORKFLOW_EXECUTION.md +98 -0
  23. genxai_framework-0.1.2/examples/code/agent_presets_user_proxy_example.py +52 -0
  24. genxai_framework-0.1.2/examples/code/flow_auction_example.py +27 -0
  25. genxai_framework-0.1.2/examples/code/flow_conditional_example.py +32 -0
  26. genxai_framework-0.1.2/examples/code/flow_coordinator_worker_example.py +28 -0
  27. genxai_framework-0.1.2/examples/code/flow_critic_review_example.py +28 -0
  28. genxai_framework-0.1.2/examples/code/flow_ensemble_voting_example.py +27 -0
  29. genxai_framework-0.1.2/examples/code/flow_loop_example.py +26 -0
  30. genxai_framework-0.1.2/examples/code/flow_map_reduce_example.py +28 -0
  31. genxai_framework-0.1.2/examples/code/flow_p2p_example.py +27 -0
  32. genxai_framework-0.1.2/examples/code/flow_parallel_example.py +28 -0
  33. genxai_framework-0.1.2/examples/code/flow_round_robin_example.py +29 -0
  34. genxai_framework-0.1.2/examples/code/flow_router_example.py +32 -0
  35. genxai_framework-0.1.2/examples/code/flow_selector_example.py +33 -0
  36. genxai_framework-0.1.2/examples/code/flow_subworkflow_example.py +33 -0
  37. genxai_framework-0.1.2/examples/code/flow_user_proxy_graph_example.py +59 -0
  38. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/__init__.py +33 -0
  39. genxai_framework-0.1.2/genxai/agents/__init__.py +8 -0
  40. genxai_framework-0.1.2/genxai/agents/presets.py +53 -0
  41. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/connectors/__init__.py +10 -0
  42. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/connectors/base.py +3 -3
  43. genxai_framework-0.1.2/genxai/connectors/config_store.py +106 -0
  44. genxai_framework-0.1.2/genxai/connectors/github.py +117 -0
  45. genxai_framework-0.1.2/genxai/connectors/google_workspace.py +124 -0
  46. genxai_framework-0.1.2/genxai/connectors/jira.py +108 -0
  47. genxai_framework-0.1.2/genxai/connectors/notion.py +97 -0
  48. genxai_framework-0.1.2/genxai/connectors/slack.py +121 -0
  49. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/agent/config_io.py +32 -1
  50. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/agent/runtime.py +41 -4
  51. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/graph/__init__.py +3 -0
  52. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/graph/engine.py +218 -11
  53. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/graph/executor.py +103 -10
  54. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/graph/nodes.py +28 -0
  55. genxai_framework-0.1.2/genxai/core/graph/workflow_io.py +199 -0
  56. genxai_framework-0.1.2/genxai/flows/__init__.py +33 -0
  57. genxai_framework-0.1.2/genxai/flows/auction.py +66 -0
  58. genxai_framework-0.1.2/genxai/flows/base.py +134 -0
  59. genxai_framework-0.1.2/genxai/flows/conditional.py +45 -0
  60. genxai_framework-0.1.2/genxai/flows/coordinator_worker.py +62 -0
  61. genxai_framework-0.1.2/genxai/flows/critic_review.py +62 -0
  62. genxai_framework-0.1.2/genxai/flows/ensemble_voting.py +49 -0
  63. genxai_framework-0.1.2/genxai/flows/loop.py +42 -0
  64. genxai_framework-0.1.2/genxai/flows/map_reduce.py +61 -0
  65. genxai_framework-0.1.2/genxai/flows/p2p.py +146 -0
  66. genxai_framework-0.1.2/genxai/flows/parallel.py +27 -0
  67. genxai_framework-0.1.2/genxai/flows/round_robin.py +24 -0
  68. genxai_framework-0.1.2/genxai/flows/router.py +45 -0
  69. genxai_framework-0.1.2/genxai/flows/selector.py +63 -0
  70. genxai_framework-0.1.2/genxai/flows/subworkflow.py +35 -0
  71. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/factory.py +17 -10
  72. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/providers/anthropic.py +116 -1
  73. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/observability/logging.py +2 -2
  74. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/auth.py +10 -6
  75. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/cost_control.py +6 -6
  76. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/jwt.py +2 -2
  77. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/pii.py +2 -2
  78. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/__init__.py +3 -0
  79. genxai_framework-0.1.2/genxai/tools/builtin/communication/human_input.py +32 -0
  80. genxai_framework-0.1.2/genxai/tools/custom/test-2.py +19 -0
  81. genxai_framework-0.1.2/genxai/tools/custom/test_tool_ui.py +9 -0
  82. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/persistence/service.py +3 -3
  83. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/triggers/schedule.py +2 -2
  84. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/utils/tokens.py +6 -0
  85. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai_framework.egg-info/PKG-INFO +63 -12
  86. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai_framework.egg-info/SOURCES.txt +48 -3
  87. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/pyproject.toml +1 -1
  88. genxai_framework-0.1.0/IMPLEMENTATION_PLAN.md +0 -647
  89. genxai_framework-0.1.0/cli/commands/__init__.py +0 -6
  90. genxai_framework-0.1.0/docs/CONNECTOR_SDK.md +0 -46
  91. genxai_framework-0.1.0/docs/ENTERPRISE_ROADMAP_BACKLOG.md +0 -90
  92. genxai_framework-0.1.0/docs/LAUNCH_PLAN.md +0 -165
  93. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/LICENSE +0 -0
  94. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/MANIFEST.in +0 -0
  95. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/REQUIREMENTS.md +0 -0
  96. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/TOOLS_DESIGN.md +0 -0
  97. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/cli/__init__.py +0 -0
  98. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/cli/commands/approval.py +0 -0
  99. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/cli/commands/audit.py +0 -0
  100. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/cli/commands/metrics.py +0 -0
  101. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/cli/commands/tool.py +0 -0
  102. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/AGENT_TOOL_INTEGRATION.md +0 -0
  103. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/AUDIT_LOGGING.md +0 -0
  104. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/COLLABORATION_PROTOCOLS.md +0 -0
  105. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/COMPETITIVE_MATRIX.md +0 -0
  106. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/GOVERNANCE_POLICY.md +0 -0
  107. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/GRAPH_VISUALIZATION.md +0 -0
  108. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/LLM_INTEGRATION.md +0 -0
  109. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/MCP_SETUP.md +0 -0
  110. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/PUBLISHING.md +0 -0
  111. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/WORKER_QUEUE_ENGINE.md +0 -0
  112. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/agent_registry_example.py +0 -0
  113. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/agent_with_memory_tools_example.py +0 -0
  114. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/agent_with_tools_example.py +0 -0
  115. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/end_to_end_example.py +0 -0
  116. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/function_calling_tools_example.py +0 -0
  117. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/graph_visualization_example.py +0 -0
  118. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/llm_agent_example.py +0 -0
  119. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/memory_system_example.py +0 -0
  120. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/routed_llm_provider_example.py +0 -0
  121. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/simple_workflow.py +0 -0
  122. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/testable_workflow.py +0 -0
  123. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/tool_execution_example.py +0 -0
  124. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/tool_registry_example.py +0 -0
  125. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/workflow_engine_example.py +0 -0
  126. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/graph_visualization_demo.py +0 -0
  127. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/patterns/01_sequential_pattern.py +0 -0
  128. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/patterns/02_conditional_branching.py +0 -0
  129. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/patterns/03_parallel_execution.py +0 -0
  130. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/patterns/04_coordinator_delegator_worker.py +0 -0
  131. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/patterns/05_cyclic_iterative.py +0 -0
  132. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/patterns/06_peer_to_peer.py +0 -0
  133. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/api/__init__.py +0 -0
  134. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/api/app.py +0 -0
  135. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/config/__init__.py +0 -0
  136. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/config/settings.py +0 -0
  137. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/connectors/kafka.py +0 -0
  138. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/connectors/postgres_cdc.py +0 -0
  139. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/connectors/registry.py +0 -0
  140. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/connectors/sqs.py +0 -0
  141. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/connectors/webhook.py +0 -0
  142. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/__init__.py +0 -0
  143. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/agent/__init__.py +0 -0
  144. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/agent/base.py +0 -0
  145. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/agent/registry.py +0 -0
  146. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/communication/__init__.py +0 -0
  147. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/communication/collaboration.py +0 -0
  148. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/communication/message_bus.py +0 -0
  149. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/communication/protocols.py +0 -0
  150. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/execution/__init__.py +0 -0
  151. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/execution/metadata.py +0 -0
  152. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/execution/queue.py +0 -0
  153. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/graph/checkpoints.py +0 -0
  154. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/graph/edges.py +0 -0
  155. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/graph/trigger_runner.py +0 -0
  156. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/__init__.py +0 -0
  157. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/base.py +0 -0
  158. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/embedding.py +0 -0
  159. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/episodic.py +0 -0
  160. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/long_term.py +0 -0
  161. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/manager.py +0 -0
  162. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/persistence.py +0 -0
  163. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/procedural.py +0 -0
  164. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/semantic.py +0 -0
  165. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/shared.py +0 -0
  166. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/short_term.py +0 -0
  167. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/vector_store.py +0 -0
  168. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/working.py +0 -0
  169. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/state/__init__.py +0 -0
  170. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/state/manager.py +0 -0
  171. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/state/schema.py +0 -0
  172. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/__init__.py +0 -0
  173. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/base.py +0 -0
  174. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/providers/__init__.py +0 -0
  175. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/providers/cohere.py +0 -0
  176. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/providers/google.py +0 -0
  177. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/providers/ollama.py +0 -0
  178. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/providers/openai.py +0 -0
  179. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/routing.py +0 -0
  180. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/observability/__init__.py +0 -0
  181. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/observability/metrics.py +0 -0
  182. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/observability/tracing.py +0 -0
  183. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/performance/__init__.py +0 -0
  184. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/performance/cache.py +0 -0
  185. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/performance/pooling.py +0 -0
  186. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/audit.py +0 -0
  187. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/default_policies.py +0 -0
  188. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/oauth.py +0 -0
  189. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/policy_engine.py +0 -0
  190. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/rate_limit.py +0 -0
  191. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/rbac.py +0 -0
  192. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/validation.py +0 -0
  193. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/__init__.py +0 -0
  194. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/base.py +0 -0
  195. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/communication/__init__.py +0 -0
  196. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/communication/email_sender.py +0 -0
  197. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/communication/notification_manager.py +0 -0
  198. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/communication/slack_notifier.py +0 -0
  199. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/communication/sms_sender.py +0 -0
  200. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/communication/webhook_caller.py +0 -0
  201. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/computation/__init__.py +0 -0
  202. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/computation/calculator.py +0 -0
  203. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/computation/code_executor.py +0 -0
  204. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/computation/data_validator.py +0 -0
  205. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/computation/hash_generator.py +0 -0
  206. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/computation/regex_matcher.py +0 -0
  207. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/data/__init__.py +0 -0
  208. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/data/csv_processor.py +0 -0
  209. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/data/data_transformer.py +0 -0
  210. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/data/json_processor.py +0 -0
  211. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/data/text_analyzer.py +0 -0
  212. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/data/xml_processor.py +0 -0
  213. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/database/__init__.py +0 -0
  214. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/database/database_inspector.py +0 -0
  215. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/database/mongodb_query.py +0 -0
  216. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/database/redis_cache.py +0 -0
  217. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/database/sql_query.py +0 -0
  218. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/database/vector_search.py +0 -0
  219. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/file/__init__.py +0 -0
  220. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/file/directory_scanner.py +0 -0
  221. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/file/file_compressor.py +0 -0
  222. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/file/file_reader.py +0 -0
  223. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/file/file_writer.py +0 -0
  224. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/file/image_processor.py +0 -0
  225. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/file/pdf_parser.py +0 -0
  226. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/test/__init__.py +0 -0
  227. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/test/async_simulator.py +0 -0
  228. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/test/data_transformer.py +0 -0
  229. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/test/error_generator.py +0 -0
  230. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/test/simple_math.py +0 -0
  231. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/test/string_processor.py +0 -0
  232. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/web/__init__.py +0 -0
  233. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/web/api_caller.py +0 -0
  234. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/web/html_parser.py +0 -0
  235. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/web/http_client.py +0 -0
  236. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/web/url_validator.py +0 -0
  237. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/web/web_scraper.py +0 -0
  238. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/custom/my_test_tool_2.py +0 -0
  239. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/dynamic.py +0 -0
  240. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/mcp_server.py +0 -0
  241. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/persistence/__init__.py +0 -0
  242. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/persistence/models.py +0 -0
  243. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/registry.py +0 -0
  244. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/security/__init__.py +0 -0
  245. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/security/limits.py +0 -0
  246. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/security/policy.py +0 -0
  247. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/security/sandbox.py +0 -0
  248. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/templates.py +0 -0
  249. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/triggers/__init__.py +0 -0
  250. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/triggers/base.py +0 -0
  251. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/triggers/file_watcher.py +0 -0
  252. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/triggers/queue.py +0 -0
  253. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/triggers/registry.py +0 -0
  254. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/triggers/webhook.py +0 -0
  255. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/utils/__init__.py +0 -0
  256. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai_framework.egg-info/dependency_links.txt +0 -0
  257. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai_framework.egg-info/entry_points.txt +0 -0
  258. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai_framework.egg-info/requires.txt +0 -0
  259. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai_framework.egg-info/top_level.txt +0 -0
  260. {genxai_framework-0.1.0 → genxai_framework-0.1.2}/setup.cfg +0 -0
@@ -1,8 +1,8 @@
1
1
  # GenXAI Framework - Architecture Documentation
2
2
 
3
3
  **Version:** 1.0.0
4
- **Last Updated:** January 28, 2026
5
- **Status:** Design Phase
4
+ **Last Updated:** February 3, 2026
5
+ **Status:** Active Development
6
6
 
7
7
  ---
8
8
 
@@ -40,8 +40,8 @@ Thank you for your interest in contributing to GenXAI! This document provides gu
40
40
 
41
41
  ```bash
42
42
  # Clone the repository
43
- git clone https://github.com/genxai/genxai.git
44
- cd genxai
43
+ git clone https://github.com/irsal2012/GenXAI.git
44
+ cd GenXAI
45
45
 
46
46
  # Create virtual environment
47
47
  python3 -m venv venv
@@ -8,8 +8,8 @@ Welcome to GenXAI - an advanced agentic AI framework with graph-based orchestrat
8
8
 
9
9
  ```bash
10
10
  # Clone the repository
11
- git clone https://github.com/genxai/genxai.git
12
- cd genxai
11
+ git clone https://github.com/irsal2012/GenXAI.git
12
+ cd GenXAI
13
13
 
14
14
  # Install dependencies
15
15
  pip install -e ".[dev,llm]"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: genxai-framework
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: Advanced Agentic AI Framework with Graph-Based Orchestration
5
5
  Author-email: GenXAI Team <team@genxai.dev>
6
6
  License: MIT
@@ -81,9 +81,9 @@ Dynamic: license-file
81
81
 
82
82
  # GenXAI - Advanced Agentic AI Framework
83
83
 
84
- **Version:** 1.0.0 (Design Phase)
85
- **Status:** Planning & Architecture
86
- **License:** MIT (Planned)
84
+ **Version:** 1.0.0
85
+ **Status:** Active Development
86
+ **License:** MIT
87
87
 
88
88
  ---
89
89
 
@@ -155,7 +155,7 @@ Comprehensive documentation is available in the following files:
155
155
 
156
156
  - **[ARCHITECTURE.md](./ARCHITECTURE.md)** - Complete system architecture and design principles
157
157
  - **[REQUIREMENTS.md](./REQUIREMENTS.md)** - Detailed functional and non-functional requirements
158
- - **[IMPLEMENTATION_PLAN.md](./IMPLEMENTATION_PLAN.md)** - 20-week development roadmap
158
+ - **[IMPLEMENTATION_PLAN.md](./IMPLEMENTATION_PLAN.md)** - Development roadmap
159
159
  - **[TOOLS_DESIGN.md](./TOOLS_DESIGN.md)** - Tool system architecture and 50+ built-in tools
160
160
  - **[MEMORY_DESIGN.md](./MEMORY_DESIGN.md)** - Multi-layered memory system design
161
161
 
@@ -229,7 +229,7 @@ See [ARCHITECTURE.md](./ARCHITECTURE.md) for complete details.
229
229
  - Beta testing
230
230
  - Official launch 🚀
231
231
 
232
- See [IMPLEMENTATION_PLAN.md](./IMPLEMENTATION_PLAN.md) for detailed timeline.
232
+ See [IMPLEMENTATION_PLAN.md](./IMPLEMENTATION_PLAN.md) for the timeline.
233
233
 
234
234
  ---
235
235
 
@@ -286,6 +286,48 @@ graph.add_edge(Edge(source="support", target="end"))
286
286
  result = await graph.run(input_data="My app crashed")
287
287
  ```
288
288
 
289
+ ### Flow Orchestrator Examples
290
+
291
+ GenXAI also ships with lightweight flow orchestrators for common patterns:
292
+
293
+ ```python
294
+ from genxai import AgentFactory, RoundRobinFlow, SelectorFlow, P2PFlow
295
+
296
+ agents = [
297
+ AgentFactory.create_agent(id="analyst", role="Analyst", goal="Analyze"),
298
+ AgentFactory.create_agent(id="writer", role="Writer", goal="Write"),
299
+ ]
300
+
301
+ # Round-robin flow
302
+ round_robin = RoundRobinFlow(agents)
303
+
304
+ # Selector flow
305
+ def choose_next(state, agent_ids):
306
+ return agent_ids[state.get("selector_hop", 0) % len(agent_ids)]
307
+
308
+ selector = SelectorFlow(agents, selector=choose_next, max_hops=3)
309
+
310
+ # P2P flow
311
+ p2p = P2PFlow(agents, max_rounds=4, consensus_threshold=0.7)
312
+ ```
313
+
314
+ See runnable examples in:
315
+ - `examples/code/flow_round_robin_example.py`
316
+ - `examples/code/flow_selector_example.py`
317
+ - `examples/code/flow_p2p_example.py`
318
+ - `examples/code/flow_parallel_example.py`
319
+ - `examples/code/flow_conditional_example.py`
320
+ - `examples/code/flow_loop_example.py`
321
+ - `examples/code/flow_router_example.py`
322
+ - `examples/code/flow_ensemble_voting_example.py`
323
+ - `examples/code/flow_critic_review_example.py`
324
+ - `examples/code/flow_coordinator_worker_example.py`
325
+ - `examples/code/flow_map_reduce_example.py`
326
+ - `examples/code/flow_subworkflow_example.py`
327
+ - `examples/code/flow_auction_example.py`
328
+
329
+ Full flow documentation: [docs/FLOWS.md](./docs/FLOWS.md)
330
+
289
331
  ### Trigger SDK Quick Start
290
332
 
291
333
  ```python
@@ -350,6 +392,16 @@ workflow:
350
392
  condition: "category == 'technical'"
351
393
  ```
352
394
 
395
+ Shared memory template:
396
+
397
+ ```bash
398
+ genxai workflow run examples/nocode/shared_memory_workflow.yaml \
399
+ --input '{"task": "Draft a short response"}'
400
+ ```
401
+
402
+ See no-code templates (including a shared memory example) in:
403
+ - `examples/nocode/README.md`
404
+
353
405
  ---
354
406
 
355
407
  ## 🛠️ Technology Stack
@@ -443,10 +495,9 @@ workflow:
443
495
 
444
496
  ## 🤝 Contributing
445
497
 
446
- We welcome contributions! This project is currently in the design phase. Once implementation begins, we'll provide:
498
+ We welcome contributions! This project is in active development. We provide:
447
499
 
448
500
  - Contributing guidelines
449
- - Code of conduct
450
501
  - Development setup instructions
451
502
  - Issue templates
452
503
  - Pull request templates
@@ -455,7 +506,7 @@ We welcome contributions! This project is currently in the design phase. Once im
455
506
 
456
507
  ## 📜 License
457
508
 
458
- MIT License (Planned)
509
+ MIT License
459
510
 
460
511
  ---
461
512
 
@@ -486,9 +537,9 @@ Inspired by:
486
537
 
487
538
  ## 📈 Project Status
488
539
 
489
- **Current Phase**: Design & Planning
490
- **Next Milestone**: Begin Phase 1 implementation
491
- **Expected Launch**: Week 20 (approximately 5 months from start)
540
+ **Current Phase**: Active Development
541
+ **Next Milestone**: Complete visual editor + studio polish
542
+ **Expected Launch**: TBD
492
543
 
493
544
  ---
494
545
 
@@ -1,8 +1,8 @@
1
1
  # GenXAI - Advanced Agentic AI Framework
2
2
 
3
- **Version:** 1.0.0 (Design Phase)
4
- **Status:** Planning & Architecture
5
- **License:** MIT (Planned)
3
+ **Version:** 1.0.0
4
+ **Status:** Active Development
5
+ **License:** MIT
6
6
 
7
7
  ---
8
8
 
@@ -74,7 +74,7 @@ Comprehensive documentation is available in the following files:
74
74
 
75
75
  - **[ARCHITECTURE.md](./ARCHITECTURE.md)** - Complete system architecture and design principles
76
76
  - **[REQUIREMENTS.md](./REQUIREMENTS.md)** - Detailed functional and non-functional requirements
77
- - **[IMPLEMENTATION_PLAN.md](./IMPLEMENTATION_PLAN.md)** - 20-week development roadmap
77
+ - **[IMPLEMENTATION_PLAN.md](./IMPLEMENTATION_PLAN.md)** - Development roadmap
78
78
  - **[TOOLS_DESIGN.md](./TOOLS_DESIGN.md)** - Tool system architecture and 50+ built-in tools
79
79
  - **[MEMORY_DESIGN.md](./MEMORY_DESIGN.md)** - Multi-layered memory system design
80
80
 
@@ -148,7 +148,7 @@ See [ARCHITECTURE.md](./ARCHITECTURE.md) for complete details.
148
148
  - Beta testing
149
149
  - Official launch 🚀
150
150
 
151
- See [IMPLEMENTATION_PLAN.md](./IMPLEMENTATION_PLAN.md) for detailed timeline.
151
+ See [IMPLEMENTATION_PLAN.md](./IMPLEMENTATION_PLAN.md) for the timeline.
152
152
 
153
153
  ---
154
154
 
@@ -205,6 +205,48 @@ graph.add_edge(Edge(source="support", target="end"))
205
205
  result = await graph.run(input_data="My app crashed")
206
206
  ```
207
207
 
208
+ ### Flow Orchestrator Examples
209
+
210
+ GenXAI also ships with lightweight flow orchestrators for common patterns:
211
+
212
+ ```python
213
+ from genxai import AgentFactory, RoundRobinFlow, SelectorFlow, P2PFlow
214
+
215
+ agents = [
216
+ AgentFactory.create_agent(id="analyst", role="Analyst", goal="Analyze"),
217
+ AgentFactory.create_agent(id="writer", role="Writer", goal="Write"),
218
+ ]
219
+
220
+ # Round-robin flow
221
+ round_robin = RoundRobinFlow(agents)
222
+
223
+ # Selector flow
224
+ def choose_next(state, agent_ids):
225
+ return agent_ids[state.get("selector_hop", 0) % len(agent_ids)]
226
+
227
+ selector = SelectorFlow(agents, selector=choose_next, max_hops=3)
228
+
229
+ # P2P flow
230
+ p2p = P2PFlow(agents, max_rounds=4, consensus_threshold=0.7)
231
+ ```
232
+
233
+ See runnable examples in:
234
+ - `examples/code/flow_round_robin_example.py`
235
+ - `examples/code/flow_selector_example.py`
236
+ - `examples/code/flow_p2p_example.py`
237
+ - `examples/code/flow_parallel_example.py`
238
+ - `examples/code/flow_conditional_example.py`
239
+ - `examples/code/flow_loop_example.py`
240
+ - `examples/code/flow_router_example.py`
241
+ - `examples/code/flow_ensemble_voting_example.py`
242
+ - `examples/code/flow_critic_review_example.py`
243
+ - `examples/code/flow_coordinator_worker_example.py`
244
+ - `examples/code/flow_map_reduce_example.py`
245
+ - `examples/code/flow_subworkflow_example.py`
246
+ - `examples/code/flow_auction_example.py`
247
+
248
+ Full flow documentation: [docs/FLOWS.md](./docs/FLOWS.md)
249
+
208
250
  ### Trigger SDK Quick Start
209
251
 
210
252
  ```python
@@ -269,6 +311,16 @@ workflow:
269
311
  condition: "category == 'technical'"
270
312
  ```
271
313
 
314
+ Shared memory template:
315
+
316
+ ```bash
317
+ genxai workflow run examples/nocode/shared_memory_workflow.yaml \
318
+ --input '{"task": "Draft a short response"}'
319
+ ```
320
+
321
+ See no-code templates (including a shared memory example) in:
322
+ - `examples/nocode/README.md`
323
+
272
324
  ---
273
325
 
274
326
  ## 🛠️ Technology Stack
@@ -362,10 +414,9 @@ workflow:
362
414
 
363
415
  ## 🤝 Contributing
364
416
 
365
- We welcome contributions! This project is currently in the design phase. Once implementation begins, we'll provide:
417
+ We welcome contributions! This project is in active development. We provide:
366
418
 
367
419
  - Contributing guidelines
368
- - Code of conduct
369
420
  - Development setup instructions
370
421
  - Issue templates
371
422
  - Pull request templates
@@ -374,7 +425,7 @@ We welcome contributions! This project is currently in the design phase. Once im
374
425
 
375
426
  ## 📜 License
376
427
 
377
- MIT License (Planned)
428
+ MIT License
378
429
 
379
430
  ---
380
431
 
@@ -405,9 +456,9 @@ Inspired by:
405
456
 
406
457
  ## 📈 Project Status
407
458
 
408
- **Current Phase**: Design & Planning
409
- **Next Milestone**: Begin Phase 1 implementation
410
- **Expected Launch**: Week 20 (approximately 5 months from start)
459
+ **Current Phase**: Active Development
460
+ **Next Milestone**: Complete visual editor + studio polish
461
+ **Expected Launch**: TBD
411
462
 
412
463
  ---
413
464
 
@@ -0,0 +1,8 @@
1
+ """CLI commands for GenXAI."""
2
+
3
+ from cli.commands.tool import tool
4
+ from cli.commands.metrics import metrics
5
+ from cli.commands.connector import connector
6
+ from cli.commands.workflow import workflow
7
+
8
+ __all__ = ["tool", "metrics", "connector", "workflow"]
@@ -0,0 +1,309 @@
1
+ """Connector management CLI commands."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import json
7
+ from typing import Any, Dict, Optional
8
+
9
+ import click
10
+ from rich.console import Console
11
+ from rich.table import Table
12
+
13
+ from genxai.connectors import (
14
+ Connector,
15
+ KafkaConnector,
16
+ SQSConnector,
17
+ PostgresCDCConnector,
18
+ WebhookConnector,
19
+ SlackConnector,
20
+ GitHubConnector,
21
+ NotionConnector,
22
+ JiraConnector,
23
+ GoogleWorkspaceConnector,
24
+ )
25
+ from genxai.connectors.config_store import ConnectorConfigEntry, ConnectorConfigStore
26
+
27
+ console = Console()
28
+
29
+
30
+ CONNECTOR_CATALOG: Dict[str, Dict[str, Any]] = {
31
+ "kafka": {
32
+ "class": KafkaConnector,
33
+ "required": ["topic", "bootstrap_servers"],
34
+ "description": "Kafka consumer connector",
35
+ },
36
+ "sqs": {
37
+ "class": SQSConnector,
38
+ "required": ["queue_url"],
39
+ "description": "AWS SQS connector",
40
+ },
41
+ "postgres_cdc": {
42
+ "class": PostgresCDCConnector,
43
+ "required": ["dsn"],
44
+ "description": "Postgres CDC connector",
45
+ },
46
+ "webhook": {
47
+ "class": WebhookConnector,
48
+ "required": [],
49
+ "description": "Inbound webhook connector",
50
+ },
51
+ "slack": {
52
+ "class": SlackConnector,
53
+ "required": ["bot_token"],
54
+ "description": "Slack Web API connector",
55
+ },
56
+ "github": {
57
+ "class": GitHubConnector,
58
+ "required": ["token"],
59
+ "description": "GitHub REST API connector",
60
+ },
61
+ "notion": {
62
+ "class": NotionConnector,
63
+ "required": ["token"],
64
+ "description": "Notion API connector",
65
+ },
66
+ "jira": {
67
+ "class": JiraConnector,
68
+ "required": ["email", "api_token", "base_url"],
69
+ "description": "Jira Cloud REST API connector",
70
+ },
71
+ "google_workspace": {
72
+ "class": GoogleWorkspaceConnector,
73
+ "required": ["access_token"],
74
+ "description": "Google Workspace APIs connector",
75
+ },
76
+ }
77
+
78
+
79
+ @click.group()
80
+ def connector() -> None:
81
+ """Manage GenXAI connectors."""
82
+ pass
83
+
84
+
85
+ @connector.command("list")
86
+ @click.option("--format", "output_format", type=click.Choice(["table", "json"]), default="table")
87
+ def list_connectors(output_format: str) -> None:
88
+ """List available connector types."""
89
+ if output_format == "json":
90
+ payload = {
91
+ name: {
92
+ "required": meta["required"],
93
+ "description": meta["description"],
94
+ }
95
+ for name, meta in CONNECTOR_CATALOG.items()
96
+ }
97
+ click.echo(json.dumps(payload, indent=2))
98
+ return
99
+
100
+ table = Table(title="GenXAI Connectors")
101
+ table.add_column("Type", style="cyan")
102
+ table.add_column("Required Fields", style="green")
103
+ table.add_column("Description", style="white")
104
+ for name, meta in CONNECTOR_CATALOG.items():
105
+ table.add_row(name, ", ".join(meta["required"]) or "(none)", meta["description"])
106
+ console.print(table)
107
+
108
+
109
+ @connector.command("validate")
110
+ @click.option("--type", "connector_type", required=True, help="Connector type")
111
+ @click.option("--connector-id", default="connector", show_default=True)
112
+ @click.option("--config", help="JSON config payload for the connector")
113
+ @click.option("--config-name", help="Use a saved connector config")
114
+ def validate(
115
+ connector_type: str,
116
+ connector_id: str,
117
+ config: Optional[str],
118
+ config_name: Optional[str],
119
+ ) -> None:
120
+ """Validate connector configuration without starting it."""
121
+ connector_meta = CONNECTOR_CATALOG.get(connector_type)
122
+ if not connector_meta:
123
+ raise click.ClickException(
124
+ f"Unknown connector type '{connector_type}'. Use 'genxai connector list' to see options."
125
+ )
126
+
127
+ config_data = _load_config(config, config_name)
128
+ missing = [field for field in connector_meta["required"] if field not in config_data]
129
+ if missing:
130
+ raise click.ClickException(f"Missing required fields: {', '.join(missing)}")
131
+
132
+ connector_instance = _build_connector(connector_id, connector_meta["class"], config_data)
133
+ try:
134
+ asyncio.run(connector_instance.validate_config())
135
+ console.print("[green]✓ Connector configuration valid[/green]")
136
+ except Exception as exc:
137
+ raise click.ClickException(str(exc)) from exc
138
+
139
+
140
+ @connector.command("start")
141
+ @click.option("--type", "connector_type", required=True, help="Connector type")
142
+ @click.option("--connector-id", default="connector", show_default=True)
143
+ @click.option("--config", help="JSON config payload for the connector")
144
+ @click.option("--config-name", help="Use a saved connector config")
145
+ def start(connector_type: str, connector_id: str, config: Optional[str], config_name: Optional[str]) -> None:
146
+ """Start a connector instance for quick validation."""
147
+ connector_instance = _build_from_cli(connector_type, connector_id, config, config_name)
148
+ try:
149
+ asyncio.run(connector_instance.start())
150
+ console.print("[green]✓ Connector started[/green]")
151
+ except Exception as exc:
152
+ raise click.ClickException(str(exc)) from exc
153
+
154
+
155
+ @connector.command("stop")
156
+ @click.option("--type", "connector_type", required=True, help="Connector type")
157
+ @click.option("--connector-id", default="connector", show_default=True)
158
+ @click.option("--config", help="JSON config payload for the connector")
159
+ @click.option("--config-name", help="Use a saved connector config")
160
+ def stop(connector_type: str, connector_id: str, config: Optional[str], config_name: Optional[str]) -> None:
161
+ """Stop a connector instance for quick validation."""
162
+ connector_instance = _build_from_cli(connector_type, connector_id, config, config_name)
163
+ try:
164
+ asyncio.run(connector_instance.stop())
165
+ console.print("[green]✓ Connector stopped[/green]")
166
+ except Exception as exc:
167
+ raise click.ClickException(str(exc)) from exc
168
+
169
+
170
+ @connector.command("health")
171
+ @click.option("--type", "connector_type", required=True, help="Connector type")
172
+ @click.option("--connector-id", default="connector", show_default=True)
173
+ @click.option("--config", help="JSON config payload for the connector")
174
+ @click.option("--format", "output_format", type=click.Choice(["json", "table"]), default="json")
175
+ @click.option("--config-name", help="Use a saved connector config")
176
+ def health(
177
+ connector_type: str,
178
+ connector_id: str,
179
+ config: Optional[str],
180
+ output_format: str,
181
+ config_name: Optional[str],
182
+ ) -> None:
183
+ """Run a connector health check without starting it."""
184
+ connector_instance = _build_from_cli(connector_type, connector_id, config, config_name)
185
+ try:
186
+ payload = asyncio.run(connector_instance.health_check())
187
+ except Exception as exc:
188
+ raise click.ClickException(str(exc)) from exc
189
+
190
+ if output_format == "json":
191
+ click.echo(json.dumps(payload, indent=2))
192
+ return
193
+
194
+ table = Table(title="Connector Health")
195
+ table.add_column("Field", style="cyan")
196
+ table.add_column("Value", style="white")
197
+ for key, value in payload.items():
198
+ table.add_row(str(key), str(value))
199
+ console.print(table)
200
+
201
+
202
+ @connector.command("save")
203
+ @click.option("--name", "config_name", required=True, help="Name for the saved config")
204
+ @click.option("--type", "connector_type", required=True, help="Connector type")
205
+ @click.option("--config", required=True, help="JSON config payload")
206
+ def save(config_name: str, connector_type: str, config: str) -> None:
207
+ """Save a connector config for reuse."""
208
+ connector_meta = CONNECTOR_CATALOG.get(connector_type)
209
+ if not connector_meta:
210
+ raise click.ClickException(
211
+ f"Unknown connector type '{connector_type}'. Use 'genxai connector list' to see options."
212
+ )
213
+ config_data = _load_config(config, None)
214
+ missing = [field for field in connector_meta["required"] if field not in config_data]
215
+ if missing:
216
+ raise click.ClickException(f"Missing required fields: {', '.join(missing)}")
217
+
218
+ store = ConnectorConfigStore()
219
+ store.save(
220
+ ConnectorConfigEntry(
221
+ name=config_name,
222
+ connector_type=connector_type,
223
+ config=config_data,
224
+ )
225
+ )
226
+ console.print(f"[green]✓ Saved connector config '{config_name}'[/green]")
227
+
228
+
229
+ @connector.command("saved")
230
+ @click.option("--format", "output_format", type=click.Choice(["table", "json"]), default="table")
231
+ def list_saved(output_format: str) -> None:
232
+ """List saved connector configs."""
233
+ store = ConnectorConfigStore()
234
+ entries = store.list()
235
+ if output_format == "json":
236
+ payload = {
237
+ name: {"connector_type": entry.connector_type, "config": entry.config}
238
+ for name, entry in entries.items()
239
+ }
240
+ click.echo(json.dumps(payload, indent=2))
241
+ return
242
+
243
+ table = Table(title="Saved Connector Configs")
244
+ table.add_column("Name", style="cyan")
245
+ table.add_column("Type", style="green")
246
+ table.add_column("Config", style="white")
247
+ for name, entry in entries.items():
248
+ table.add_row(name, entry.connector_type, json.dumps(entry.config))
249
+ console.print(table)
250
+
251
+
252
+ @connector.command("remove")
253
+ @click.option("--name", "config_name", required=True, help="Saved config name")
254
+ def remove(config_name: str) -> None:
255
+ """Remove a saved connector config."""
256
+ store = ConnectorConfigStore()
257
+ if not store.delete(config_name):
258
+ raise click.ClickException(f"Config '{config_name}' not found")
259
+ console.print(f"[green]✓ Removed connector config '{config_name}'[/green]")
260
+
261
+
262
+ @connector.command("keygen")
263
+ def keygen() -> None:
264
+ """Generate a Fernet key for encrypted connector configs."""
265
+ try:
266
+ from cryptography.fernet import Fernet
267
+ except ImportError as exc:
268
+ raise click.ClickException(
269
+ "cryptography is required for key generation. Install with: pip install cryptography"
270
+ ) from exc
271
+ key = Fernet.generate_key().decode()
272
+ click.echo(key)
273
+
274
+
275
+ def _build_connector(connector_id: str, connector_class: type[Connector], config: Dict[str, Any]) -> Connector:
276
+ params = {"connector_id": connector_id, **config}
277
+ return connector_class(**params)
278
+
279
+
280
+ def _build_from_cli(
281
+ connector_type: str,
282
+ connector_id: str,
283
+ config: Optional[str],
284
+ config_name: Optional[str],
285
+ ) -> Connector:
286
+ connector_meta = CONNECTOR_CATALOG.get(connector_type)
287
+ if not connector_meta:
288
+ raise click.ClickException(
289
+ f"Unknown connector type '{connector_type}'. Use 'genxai connector list' to see options."
290
+ )
291
+ config_data = _load_config(config, config_name)
292
+ missing = [field for field in connector_meta["required"] if field not in config_data]
293
+ if missing:
294
+ raise click.ClickException(f"Missing required fields: {', '.join(missing)}")
295
+ return _build_connector(connector_id, connector_meta["class"], config_data)
296
+
297
+
298
+ def _load_config(config: Optional[str], config_name: Optional[str]) -> Dict[str, Any]:
299
+ if config_name:
300
+ store = ConnectorConfigStore()
301
+ entry = store.get(config_name)
302
+ if not entry:
303
+ raise click.ClickException(f"Config '{config_name}' not found")
304
+ return entry.config
305
+ return json.loads(config) if config else {}
306
+
307
+
308
+ if __name__ == "__main__":
309
+ connector()