kubiya-control-plane-api 0.9.15__py3-none-any.whl

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 (479) hide show
  1. control_plane_api/LICENSE +676 -0
  2. control_plane_api/README.md +350 -0
  3. control_plane_api/__init__.py +4 -0
  4. control_plane_api/__version__.py +8 -0
  5. control_plane_api/alembic/README +1 -0
  6. control_plane_api/alembic/env.py +121 -0
  7. control_plane_api/alembic/script.py.mako +28 -0
  8. control_plane_api/alembic/versions/2613c65c3dbe_initial_database_setup.py +32 -0
  9. control_plane_api/alembic/versions/2df520d4927d_merge_heads.py +28 -0
  10. control_plane_api/alembic/versions/43abf98d6a01_add_paused_status_to_executions.py +73 -0
  11. control_plane_api/alembic/versions/6289854264cb_merge_multiple_heads.py +28 -0
  12. control_plane_api/alembic/versions/6a4d4dc3d8dc_generate_execution_transitions.py +50 -0
  13. control_plane_api/alembic/versions/87d11cf0a783_add_disconnected_status_to_worker_.py +44 -0
  14. control_plane_api/alembic/versions/add_ephemeral_queue_support.py +85 -0
  15. control_plane_api/alembic/versions/add_model_type_to_llm_models.py +31 -0
  16. control_plane_api/alembic/versions/add_plan_executions_table.py +114 -0
  17. control_plane_api/alembic/versions/add_trace_span_tables.py +154 -0
  18. control_plane_api/alembic/versions/add_user_info_to_traces.py +36 -0
  19. control_plane_api/alembic/versions/adjusting_foreign_keys.py +32 -0
  20. control_plane_api/alembic/versions/b4983d976db2_initial_tables.py +1128 -0
  21. control_plane_api/alembic/versions/d181a3b40e71_rename_custom_metadata_to_metadata_in_.py +50 -0
  22. control_plane_api/alembic/versions/df9117888e82_add_missing_columns.py +82 -0
  23. control_plane_api/alembic/versions/f25de6ad895a_missing_migrations.py +34 -0
  24. control_plane_api/alembic/versions/f71305fb69b9_fix_ephemeral_queue_deletion_foreign_key.py +54 -0
  25. control_plane_api/alembic/versions/mark_local_exec_queues_as_ephemeral.py +68 -0
  26. control_plane_api/alembic.ini +148 -0
  27. control_plane_api/api/index.py +12 -0
  28. control_plane_api/app/__init__.py +11 -0
  29. control_plane_api/app/activities/__init__.py +20 -0
  30. control_plane_api/app/activities/agent_activities.py +384 -0
  31. control_plane_api/app/activities/plan_generation_activities.py +499 -0
  32. control_plane_api/app/activities/team_activities.py +424 -0
  33. control_plane_api/app/activities/temporal_cloud_activities.py +588 -0
  34. control_plane_api/app/config/__init__.py +35 -0
  35. control_plane_api/app/config/api_config.py +469 -0
  36. control_plane_api/app/config/config_loader.py +224 -0
  37. control_plane_api/app/config/model_pricing.py +323 -0
  38. control_plane_api/app/config/storage_config.py +159 -0
  39. control_plane_api/app/config.py +115 -0
  40. control_plane_api/app/controllers/__init__.py +0 -0
  41. control_plane_api/app/controllers/execution_environment_controller.py +1315 -0
  42. control_plane_api/app/database.py +135 -0
  43. control_plane_api/app/exceptions.py +408 -0
  44. control_plane_api/app/lib/__init__.py +11 -0
  45. control_plane_api/app/lib/environment.py +65 -0
  46. control_plane_api/app/lib/event_bus/__init__.py +17 -0
  47. control_plane_api/app/lib/event_bus/base.py +136 -0
  48. control_plane_api/app/lib/event_bus/manager.py +335 -0
  49. control_plane_api/app/lib/event_bus/providers/__init__.py +6 -0
  50. control_plane_api/app/lib/event_bus/providers/http_provider.py +166 -0
  51. control_plane_api/app/lib/event_bus/providers/nats_provider.py +324 -0
  52. control_plane_api/app/lib/event_bus/providers/redis_provider.py +233 -0
  53. control_plane_api/app/lib/event_bus/providers/websocket_provider.py +497 -0
  54. control_plane_api/app/lib/job_executor.py +330 -0
  55. control_plane_api/app/lib/kubiya_client.py +293 -0
  56. control_plane_api/app/lib/litellm_pricing.py +166 -0
  57. control_plane_api/app/lib/mcp_validation.py +163 -0
  58. control_plane_api/app/lib/nats/__init__.py +13 -0
  59. control_plane_api/app/lib/nats/credentials_manager.py +288 -0
  60. control_plane_api/app/lib/nats/listener.py +374 -0
  61. control_plane_api/app/lib/planning_prompt_builder.py +153 -0
  62. control_plane_api/app/lib/planning_tools/__init__.py +41 -0
  63. control_plane_api/app/lib/planning_tools/agents.py +409 -0
  64. control_plane_api/app/lib/planning_tools/agno_toolkit.py +836 -0
  65. control_plane_api/app/lib/planning_tools/base.py +119 -0
  66. control_plane_api/app/lib/planning_tools/cognitive_memory_tools.py +403 -0
  67. control_plane_api/app/lib/planning_tools/context_graph_tools.py +545 -0
  68. control_plane_api/app/lib/planning_tools/environments.py +218 -0
  69. control_plane_api/app/lib/planning_tools/knowledge.py +204 -0
  70. control_plane_api/app/lib/planning_tools/models.py +93 -0
  71. control_plane_api/app/lib/planning_tools/planning_service.py +646 -0
  72. control_plane_api/app/lib/planning_tools/resources.py +242 -0
  73. control_plane_api/app/lib/planning_tools/teams.py +334 -0
  74. control_plane_api/app/lib/policy_enforcer_client.py +1016 -0
  75. control_plane_api/app/lib/redis_client.py +803 -0
  76. control_plane_api/app/lib/sqlalchemy_utils.py +486 -0
  77. control_plane_api/app/lib/state_transition_tools/__init__.py +7 -0
  78. control_plane_api/app/lib/state_transition_tools/execution_context.py +388 -0
  79. control_plane_api/app/lib/storage/__init__.py +20 -0
  80. control_plane_api/app/lib/storage/base_provider.py +274 -0
  81. control_plane_api/app/lib/storage/provider_factory.py +157 -0
  82. control_plane_api/app/lib/storage/vercel_blob_provider.py +468 -0
  83. control_plane_api/app/lib/supabase.py +71 -0
  84. control_plane_api/app/lib/supabase_utils.py +138 -0
  85. control_plane_api/app/lib/task_planning/__init__.py +138 -0
  86. control_plane_api/app/lib/task_planning/agent_factory.py +308 -0
  87. control_plane_api/app/lib/task_planning/agents.py +389 -0
  88. control_plane_api/app/lib/task_planning/cache.py +218 -0
  89. control_plane_api/app/lib/task_planning/entity_resolver.py +273 -0
  90. control_plane_api/app/lib/task_planning/helpers.py +293 -0
  91. control_plane_api/app/lib/task_planning/hooks.py +474 -0
  92. control_plane_api/app/lib/task_planning/models.py +503 -0
  93. control_plane_api/app/lib/task_planning/plan_validator.py +166 -0
  94. control_plane_api/app/lib/task_planning/planning_workflow.py +2911 -0
  95. control_plane_api/app/lib/task_planning/runner.py +656 -0
  96. control_plane_api/app/lib/task_planning/streaming_hook.py +213 -0
  97. control_plane_api/app/lib/task_planning/workflow.py +424 -0
  98. control_plane_api/app/lib/templating/__init__.py +88 -0
  99. control_plane_api/app/lib/templating/compiler.py +278 -0
  100. control_plane_api/app/lib/templating/engine.py +178 -0
  101. control_plane_api/app/lib/templating/parsers/__init__.py +29 -0
  102. control_plane_api/app/lib/templating/parsers/base.py +96 -0
  103. control_plane_api/app/lib/templating/parsers/env.py +85 -0
  104. control_plane_api/app/lib/templating/parsers/graph.py +112 -0
  105. control_plane_api/app/lib/templating/parsers/secret.py +87 -0
  106. control_plane_api/app/lib/templating/parsers/simple.py +81 -0
  107. control_plane_api/app/lib/templating/resolver.py +366 -0
  108. control_plane_api/app/lib/templating/types.py +214 -0
  109. control_plane_api/app/lib/templating/validator.py +201 -0
  110. control_plane_api/app/lib/temporal_client.py +232 -0
  111. control_plane_api/app/lib/temporal_credentials_cache.py +178 -0
  112. control_plane_api/app/lib/temporal_credentials_service.py +203 -0
  113. control_plane_api/app/lib/validation/__init__.py +24 -0
  114. control_plane_api/app/lib/validation/runtime_validation.py +388 -0
  115. control_plane_api/app/main.py +531 -0
  116. control_plane_api/app/middleware/__init__.py +10 -0
  117. control_plane_api/app/middleware/auth.py +645 -0
  118. control_plane_api/app/middleware/exception_handler.py +267 -0
  119. control_plane_api/app/middleware/prometheus_middleware.py +173 -0
  120. control_plane_api/app/middleware/rate_limiting.py +384 -0
  121. control_plane_api/app/middleware/request_id.py +202 -0
  122. control_plane_api/app/models/__init__.py +40 -0
  123. control_plane_api/app/models/agent.py +90 -0
  124. control_plane_api/app/models/analytics.py +206 -0
  125. control_plane_api/app/models/associations.py +107 -0
  126. control_plane_api/app/models/auth_user.py +73 -0
  127. control_plane_api/app/models/context.py +161 -0
  128. control_plane_api/app/models/custom_integration.py +99 -0
  129. control_plane_api/app/models/environment.py +64 -0
  130. control_plane_api/app/models/execution.py +125 -0
  131. control_plane_api/app/models/execution_transition.py +50 -0
  132. control_plane_api/app/models/job.py +159 -0
  133. control_plane_api/app/models/llm_model.py +78 -0
  134. control_plane_api/app/models/orchestration.py +66 -0
  135. control_plane_api/app/models/plan_execution.py +102 -0
  136. control_plane_api/app/models/presence.py +49 -0
  137. control_plane_api/app/models/project.py +61 -0
  138. control_plane_api/app/models/project_management.py +85 -0
  139. control_plane_api/app/models/session.py +29 -0
  140. control_plane_api/app/models/skill.py +155 -0
  141. control_plane_api/app/models/system_tables.py +43 -0
  142. control_plane_api/app/models/task_planning.py +372 -0
  143. control_plane_api/app/models/team.py +86 -0
  144. control_plane_api/app/models/trace.py +257 -0
  145. control_plane_api/app/models/user_profile.py +54 -0
  146. control_plane_api/app/models/worker.py +221 -0
  147. control_plane_api/app/models/workflow.py +161 -0
  148. control_plane_api/app/models/workspace.py +50 -0
  149. control_plane_api/app/observability/__init__.py +177 -0
  150. control_plane_api/app/observability/context_logging.py +475 -0
  151. control_plane_api/app/observability/decorators.py +337 -0
  152. control_plane_api/app/observability/local_span_processor.py +702 -0
  153. control_plane_api/app/observability/metrics.py +303 -0
  154. control_plane_api/app/observability/middleware.py +246 -0
  155. control_plane_api/app/observability/optional.py +115 -0
  156. control_plane_api/app/observability/tracing.py +382 -0
  157. control_plane_api/app/policies/README.md +149 -0
  158. control_plane_api/app/policies/approved_users.rego +62 -0
  159. control_plane_api/app/policies/business_hours.rego +51 -0
  160. control_plane_api/app/policies/rate_limiting.rego +100 -0
  161. control_plane_api/app/policies/tool_enforcement/README.md +336 -0
  162. control_plane_api/app/policies/tool_enforcement/bash_command_validation.rego +71 -0
  163. control_plane_api/app/policies/tool_enforcement/business_hours_enforcement.rego +82 -0
  164. control_plane_api/app/policies/tool_enforcement/mcp_tool_allowlist.rego +58 -0
  165. control_plane_api/app/policies/tool_enforcement/production_safeguards.rego +80 -0
  166. control_plane_api/app/policies/tool_enforcement/role_based_tool_access.rego +44 -0
  167. control_plane_api/app/policies/tool_restrictions.rego +86 -0
  168. control_plane_api/app/routers/__init__.py +4 -0
  169. control_plane_api/app/routers/agents.py +382 -0
  170. control_plane_api/app/routers/agents_v2.py +1598 -0
  171. control_plane_api/app/routers/analytics.py +1310 -0
  172. control_plane_api/app/routers/auth.py +59 -0
  173. control_plane_api/app/routers/client_config.py +57 -0
  174. control_plane_api/app/routers/context_graph.py +561 -0
  175. control_plane_api/app/routers/context_manager.py +577 -0
  176. control_plane_api/app/routers/custom_integrations.py +490 -0
  177. control_plane_api/app/routers/enforcer.py +132 -0
  178. control_plane_api/app/routers/environment_context.py +252 -0
  179. control_plane_api/app/routers/environments.py +761 -0
  180. control_plane_api/app/routers/execution_environment.py +847 -0
  181. control_plane_api/app/routers/executions/__init__.py +28 -0
  182. control_plane_api/app/routers/executions/router.py +286 -0
  183. control_plane_api/app/routers/executions/services/__init__.py +22 -0
  184. control_plane_api/app/routers/executions/services/demo_worker_health.py +156 -0
  185. control_plane_api/app/routers/executions/services/status_service.py +420 -0
  186. control_plane_api/app/routers/executions/services/test_worker_health.py +480 -0
  187. control_plane_api/app/routers/executions/services/worker_health.py +514 -0
  188. control_plane_api/app/routers/executions/streaming/__init__.py +22 -0
  189. control_plane_api/app/routers/executions/streaming/deduplication.py +352 -0
  190. control_plane_api/app/routers/executions/streaming/event_buffer.py +353 -0
  191. control_plane_api/app/routers/executions/streaming/event_formatter.py +964 -0
  192. control_plane_api/app/routers/executions/streaming/history_loader.py +588 -0
  193. control_plane_api/app/routers/executions/streaming/live_source.py +693 -0
  194. control_plane_api/app/routers/executions/streaming/streamer.py +849 -0
  195. control_plane_api/app/routers/executions.py +4888 -0
  196. control_plane_api/app/routers/health.py +165 -0
  197. control_plane_api/app/routers/health_v2.py +394 -0
  198. control_plane_api/app/routers/integration_templates.py +496 -0
  199. control_plane_api/app/routers/integrations.py +287 -0
  200. control_plane_api/app/routers/jobs.py +1809 -0
  201. control_plane_api/app/routers/metrics.py +517 -0
  202. control_plane_api/app/routers/models.py +82 -0
  203. control_plane_api/app/routers/models_v2.py +628 -0
  204. control_plane_api/app/routers/plan_executions.py +1481 -0
  205. control_plane_api/app/routers/plan_generation_async.py +304 -0
  206. control_plane_api/app/routers/policies.py +669 -0
  207. control_plane_api/app/routers/presence.py +234 -0
  208. control_plane_api/app/routers/projects.py +987 -0
  209. control_plane_api/app/routers/runners.py +379 -0
  210. control_plane_api/app/routers/runtimes.py +172 -0
  211. control_plane_api/app/routers/secrets.py +171 -0
  212. control_plane_api/app/routers/skills.py +1010 -0
  213. control_plane_api/app/routers/skills_definitions.py +140 -0
  214. control_plane_api/app/routers/storage.py +456 -0
  215. control_plane_api/app/routers/task_planning.py +611 -0
  216. control_plane_api/app/routers/task_queues.py +650 -0
  217. control_plane_api/app/routers/team_context.py +274 -0
  218. control_plane_api/app/routers/teams.py +1747 -0
  219. control_plane_api/app/routers/templates.py +248 -0
  220. control_plane_api/app/routers/traces.py +571 -0
  221. control_plane_api/app/routers/websocket_client.py +479 -0
  222. control_plane_api/app/routers/websocket_executions_status.py +437 -0
  223. control_plane_api/app/routers/websocket_gateway.py +323 -0
  224. control_plane_api/app/routers/websocket_traces.py +576 -0
  225. control_plane_api/app/routers/worker_queues.py +2555 -0
  226. control_plane_api/app/routers/worker_websocket.py +419 -0
  227. control_plane_api/app/routers/workers.py +1004 -0
  228. control_plane_api/app/routers/workflows.py +204 -0
  229. control_plane_api/app/runtimes/__init__.py +6 -0
  230. control_plane_api/app/runtimes/validation.py +344 -0
  231. control_plane_api/app/schemas/__init__.py +1 -0
  232. control_plane_api/app/schemas/job_schemas.py +302 -0
  233. control_plane_api/app/schemas/mcp_schemas.py +311 -0
  234. control_plane_api/app/schemas/template_schemas.py +133 -0
  235. control_plane_api/app/schemas/trace_schemas.py +168 -0
  236. control_plane_api/app/schemas/worker_queue_observability_schemas.py +165 -0
  237. control_plane_api/app/services/__init__.py +1 -0
  238. control_plane_api/app/services/agno_planning_strategy.py +233 -0
  239. control_plane_api/app/services/agno_service.py +838 -0
  240. control_plane_api/app/services/claude_code_planning_service.py +203 -0
  241. control_plane_api/app/services/context_graph_client.py +224 -0
  242. control_plane_api/app/services/custom_integration_service.py +415 -0
  243. control_plane_api/app/services/integration_resolution_service.py +345 -0
  244. control_plane_api/app/services/litellm_service.py +394 -0
  245. control_plane_api/app/services/plan_generator.py +79 -0
  246. control_plane_api/app/services/planning_strategy.py +66 -0
  247. control_plane_api/app/services/planning_strategy_factory.py +118 -0
  248. control_plane_api/app/services/policy_service.py +615 -0
  249. control_plane_api/app/services/state_transition_service.py +755 -0
  250. control_plane_api/app/services/storage_service.py +593 -0
  251. control_plane_api/app/services/temporal_cloud_provisioning.py +150 -0
  252. control_plane_api/app/services/toolsets/context_graph_skill.py +432 -0
  253. control_plane_api/app/services/trace_retention.py +354 -0
  254. control_plane_api/app/services/worker_queue_metrics_service.py +190 -0
  255. control_plane_api/app/services/workflow_cancellation_manager.py +135 -0
  256. control_plane_api/app/services/workflow_operations_service.py +611 -0
  257. control_plane_api/app/skills/__init__.py +100 -0
  258. control_plane_api/app/skills/base.py +239 -0
  259. control_plane_api/app/skills/builtin/__init__.py +37 -0
  260. control_plane_api/app/skills/builtin/agent_communication/__init__.py +8 -0
  261. control_plane_api/app/skills/builtin/agent_communication/skill.py +246 -0
  262. control_plane_api/app/skills/builtin/code_ingestion/__init__.py +4 -0
  263. control_plane_api/app/skills/builtin/code_ingestion/skill.py +267 -0
  264. control_plane_api/app/skills/builtin/cognitive_memory/__init__.py +4 -0
  265. control_plane_api/app/skills/builtin/cognitive_memory/skill.py +174 -0
  266. control_plane_api/app/skills/builtin/contextual_awareness/__init__.py +4 -0
  267. control_plane_api/app/skills/builtin/contextual_awareness/skill.py +387 -0
  268. control_plane_api/app/skills/builtin/data_visualization/__init__.py +4 -0
  269. control_plane_api/app/skills/builtin/data_visualization/skill.py +154 -0
  270. control_plane_api/app/skills/builtin/docker/__init__.py +4 -0
  271. control_plane_api/app/skills/builtin/docker/skill.py +104 -0
  272. control_plane_api/app/skills/builtin/file_generation/__init__.py +4 -0
  273. control_plane_api/app/skills/builtin/file_generation/skill.py +94 -0
  274. control_plane_api/app/skills/builtin/file_system/__init__.py +4 -0
  275. control_plane_api/app/skills/builtin/file_system/skill.py +110 -0
  276. control_plane_api/app/skills/builtin/knowledge_api/__init__.py +5 -0
  277. control_plane_api/app/skills/builtin/knowledge_api/skill.py +124 -0
  278. control_plane_api/app/skills/builtin/python/__init__.py +4 -0
  279. control_plane_api/app/skills/builtin/python/skill.py +92 -0
  280. control_plane_api/app/skills/builtin/remote_filesystem/__init__.py +5 -0
  281. control_plane_api/app/skills/builtin/remote_filesystem/skill.py +170 -0
  282. control_plane_api/app/skills/builtin/shell/__init__.py +4 -0
  283. control_plane_api/app/skills/builtin/shell/skill.py +161 -0
  284. control_plane_api/app/skills/builtin/slack/__init__.py +3 -0
  285. control_plane_api/app/skills/builtin/slack/skill.py +302 -0
  286. control_plane_api/app/skills/builtin/workflow_executor/__init__.py +4 -0
  287. control_plane_api/app/skills/builtin/workflow_executor/skill.py +469 -0
  288. control_plane_api/app/skills/business_intelligence.py +189 -0
  289. control_plane_api/app/skills/config.py +63 -0
  290. control_plane_api/app/skills/loaders/__init__.py +14 -0
  291. control_plane_api/app/skills/loaders/base.py +73 -0
  292. control_plane_api/app/skills/loaders/filesystem_loader.py +199 -0
  293. control_plane_api/app/skills/registry.py +125 -0
  294. control_plane_api/app/utils/helpers.py +12 -0
  295. control_plane_api/app/utils/workflow_executor.py +354 -0
  296. control_plane_api/app/workflows/__init__.py +11 -0
  297. control_plane_api/app/workflows/agent_execution.py +520 -0
  298. control_plane_api/app/workflows/agent_execution_with_skills.py +223 -0
  299. control_plane_api/app/workflows/namespace_provisioning.py +326 -0
  300. control_plane_api/app/workflows/plan_generation.py +254 -0
  301. control_plane_api/app/workflows/team_execution.py +442 -0
  302. control_plane_api/scripts/seed_models.py +240 -0
  303. control_plane_api/scripts/validate_existing_tool_names.py +492 -0
  304. control_plane_api/shared/__init__.py +8 -0
  305. control_plane_api/shared/version.py +17 -0
  306. control_plane_api/test_deduplication.py +274 -0
  307. control_plane_api/test_executor_deduplication_e2e.py +309 -0
  308. control_plane_api/test_job_execution_e2e.py +283 -0
  309. control_plane_api/test_real_integration.py +193 -0
  310. control_plane_api/version.py +38 -0
  311. control_plane_api/worker/__init__.py +0 -0
  312. control_plane_api/worker/activities/__init__.py +0 -0
  313. control_plane_api/worker/activities/agent_activities.py +1585 -0
  314. control_plane_api/worker/activities/approval_activities.py +234 -0
  315. control_plane_api/worker/activities/job_activities.py +199 -0
  316. control_plane_api/worker/activities/runtime_activities.py +1167 -0
  317. control_plane_api/worker/activities/skill_activities.py +282 -0
  318. control_plane_api/worker/activities/team_activities.py +479 -0
  319. control_plane_api/worker/agent_runtime_server.py +370 -0
  320. control_plane_api/worker/binary_manager.py +333 -0
  321. control_plane_api/worker/config/__init__.py +31 -0
  322. control_plane_api/worker/config/worker_config.py +273 -0
  323. control_plane_api/worker/control_plane_client.py +1491 -0
  324. control_plane_api/worker/examples/analytics_integration_example.py +362 -0
  325. control_plane_api/worker/health_monitor.py +159 -0
  326. control_plane_api/worker/metrics.py +237 -0
  327. control_plane_api/worker/models/__init__.py +1 -0
  328. control_plane_api/worker/models/error_events.py +105 -0
  329. control_plane_api/worker/models/inputs.py +89 -0
  330. control_plane_api/worker/runtimes/__init__.py +35 -0
  331. control_plane_api/worker/runtimes/agent_runtime/runtime.py +485 -0
  332. control_plane_api/worker/runtimes/agno/__init__.py +34 -0
  333. control_plane_api/worker/runtimes/agno/config.py +248 -0
  334. control_plane_api/worker/runtimes/agno/hooks.py +385 -0
  335. control_plane_api/worker/runtimes/agno/mcp_builder.py +195 -0
  336. control_plane_api/worker/runtimes/agno/runtime.py +1063 -0
  337. control_plane_api/worker/runtimes/agno/utils.py +163 -0
  338. control_plane_api/worker/runtimes/base.py +979 -0
  339. control_plane_api/worker/runtimes/claude_code/__init__.py +38 -0
  340. control_plane_api/worker/runtimes/claude_code/cleanup.py +184 -0
  341. control_plane_api/worker/runtimes/claude_code/client_pool.py +529 -0
  342. control_plane_api/worker/runtimes/claude_code/config.py +829 -0
  343. control_plane_api/worker/runtimes/claude_code/hooks.py +482 -0
  344. control_plane_api/worker/runtimes/claude_code/litellm_proxy.py +1702 -0
  345. control_plane_api/worker/runtimes/claude_code/mcp_builder.py +467 -0
  346. control_plane_api/worker/runtimes/claude_code/mcp_discovery.py +558 -0
  347. control_plane_api/worker/runtimes/claude_code/runtime.py +1546 -0
  348. control_plane_api/worker/runtimes/claude_code/tool_mapper.py +403 -0
  349. control_plane_api/worker/runtimes/claude_code/utils.py +149 -0
  350. control_plane_api/worker/runtimes/factory.py +173 -0
  351. control_plane_api/worker/runtimes/model_utils.py +107 -0
  352. control_plane_api/worker/runtimes/validation.py +93 -0
  353. control_plane_api/worker/services/__init__.py +1 -0
  354. control_plane_api/worker/services/agent_communication_tools.py +908 -0
  355. control_plane_api/worker/services/agent_executor.py +485 -0
  356. control_plane_api/worker/services/agent_executor_v2.py +793 -0
  357. control_plane_api/worker/services/analytics_collector.py +457 -0
  358. control_plane_api/worker/services/analytics_service.py +464 -0
  359. control_plane_api/worker/services/approval_tools.py +310 -0
  360. control_plane_api/worker/services/approval_tools_agno.py +207 -0
  361. control_plane_api/worker/services/cancellation_manager.py +177 -0
  362. control_plane_api/worker/services/code_ingestion_tools.py +465 -0
  363. control_plane_api/worker/services/contextual_awareness_tools.py +405 -0
  364. control_plane_api/worker/services/data_visualization.py +834 -0
  365. control_plane_api/worker/services/event_publisher.py +531 -0
  366. control_plane_api/worker/services/jira_tools.py +257 -0
  367. control_plane_api/worker/services/remote_filesystem_tools.py +498 -0
  368. control_plane_api/worker/services/runtime_analytics.py +328 -0
  369. control_plane_api/worker/services/session_service.py +365 -0
  370. control_plane_api/worker/services/skill_context_enhancement.py +181 -0
  371. control_plane_api/worker/services/skill_factory.py +471 -0
  372. control_plane_api/worker/services/system_prompt_enhancement.py +410 -0
  373. control_plane_api/worker/services/team_executor.py +715 -0
  374. control_plane_api/worker/services/team_executor_v2.py +1866 -0
  375. control_plane_api/worker/services/tool_enforcement.py +254 -0
  376. control_plane_api/worker/services/workflow_executor/__init__.py +52 -0
  377. control_plane_api/worker/services/workflow_executor/event_processor.py +287 -0
  378. control_plane_api/worker/services/workflow_executor/event_publisher.py +210 -0
  379. control_plane_api/worker/services/workflow_executor/executors/__init__.py +15 -0
  380. control_plane_api/worker/services/workflow_executor/executors/base.py +270 -0
  381. control_plane_api/worker/services/workflow_executor/executors/json_executor.py +50 -0
  382. control_plane_api/worker/services/workflow_executor/executors/python_executor.py +50 -0
  383. control_plane_api/worker/services/workflow_executor/models.py +142 -0
  384. control_plane_api/worker/services/workflow_executor_tools.py +1748 -0
  385. control_plane_api/worker/skills/__init__.py +12 -0
  386. control_plane_api/worker/skills/builtin/context_graph_search/README.md +213 -0
  387. control_plane_api/worker/skills/builtin/context_graph_search/__init__.py +5 -0
  388. control_plane_api/worker/skills/builtin/context_graph_search/agno_impl.py +808 -0
  389. control_plane_api/worker/skills/builtin/context_graph_search/skill.yaml +67 -0
  390. control_plane_api/worker/skills/builtin/contextual_awareness/__init__.py +4 -0
  391. control_plane_api/worker/skills/builtin/contextual_awareness/agno_impl.py +62 -0
  392. control_plane_api/worker/skills/builtin/data_visualization/agno_impl.py +18 -0
  393. control_plane_api/worker/skills/builtin/data_visualization/skill.yaml +84 -0
  394. control_plane_api/worker/skills/builtin/docker/agno_impl.py +65 -0
  395. control_plane_api/worker/skills/builtin/docker/skill.yaml +60 -0
  396. control_plane_api/worker/skills/builtin/file_generation/agno_impl.py +47 -0
  397. control_plane_api/worker/skills/builtin/file_generation/skill.yaml +64 -0
  398. control_plane_api/worker/skills/builtin/file_system/agno_impl.py +32 -0
  399. control_plane_api/worker/skills/builtin/file_system/skill.yaml +54 -0
  400. control_plane_api/worker/skills/builtin/knowledge_api/__init__.py +4 -0
  401. control_plane_api/worker/skills/builtin/knowledge_api/agno_impl.py +50 -0
  402. control_plane_api/worker/skills/builtin/knowledge_api/skill.yaml +66 -0
  403. control_plane_api/worker/skills/builtin/python/agno_impl.py +25 -0
  404. control_plane_api/worker/skills/builtin/python/skill.yaml +60 -0
  405. control_plane_api/worker/skills/builtin/schema_fix_mixin.py +260 -0
  406. control_plane_api/worker/skills/builtin/shell/agno_impl.py +31 -0
  407. control_plane_api/worker/skills/builtin/shell/skill.yaml +60 -0
  408. control_plane_api/worker/skills/builtin/slack/__init__.py +3 -0
  409. control_plane_api/worker/skills/builtin/slack/agno_impl.py +1282 -0
  410. control_plane_api/worker/skills/builtin/slack/skill.yaml +276 -0
  411. control_plane_api/worker/skills/builtin/workflow_executor/agno_impl.py +62 -0
  412. control_plane_api/worker/skills/builtin/workflow_executor/skill.yaml +79 -0
  413. control_plane_api/worker/skills/loaders/__init__.py +5 -0
  414. control_plane_api/worker/skills/loaders/base.py +23 -0
  415. control_plane_api/worker/skills/loaders/filesystem_loader.py +357 -0
  416. control_plane_api/worker/skills/registry.py +208 -0
  417. control_plane_api/worker/tests/__init__.py +1 -0
  418. control_plane_api/worker/tests/conftest.py +12 -0
  419. control_plane_api/worker/tests/e2e/__init__.py +0 -0
  420. control_plane_api/worker/tests/e2e/test_context_graph_real_api.py +338 -0
  421. control_plane_api/worker/tests/e2e/test_context_graph_templates_e2e.py +523 -0
  422. control_plane_api/worker/tests/e2e/test_enforcement_e2e.py +344 -0
  423. control_plane_api/worker/tests/e2e/test_execution_flow.py +571 -0
  424. control_plane_api/worker/tests/e2e/test_single_execution_mode.py +656 -0
  425. control_plane_api/worker/tests/integration/__init__.py +0 -0
  426. control_plane_api/worker/tests/integration/test_builtin_skills_fixes.py +245 -0
  427. control_plane_api/worker/tests/integration/test_context_graph_search_integration.py +365 -0
  428. control_plane_api/worker/tests/integration/test_control_plane_integration.py +308 -0
  429. control_plane_api/worker/tests/integration/test_hook_enforcement_integration.py +579 -0
  430. control_plane_api/worker/tests/integration/test_scheduled_job_workflow.py +237 -0
  431. control_plane_api/worker/tests/integration/test_system_prompt_enhancement_integration.py +343 -0
  432. control_plane_api/worker/tests/unit/__init__.py +0 -0
  433. control_plane_api/worker/tests/unit/test_builtin_skill_autoload.py +396 -0
  434. control_plane_api/worker/tests/unit/test_context_graph_search.py +450 -0
  435. control_plane_api/worker/tests/unit/test_context_graph_templates.py +403 -0
  436. control_plane_api/worker/tests/unit/test_control_plane_client.py +401 -0
  437. control_plane_api/worker/tests/unit/test_control_plane_client_jobs.py +345 -0
  438. control_plane_api/worker/tests/unit/test_job_activities.py +353 -0
  439. control_plane_api/worker/tests/unit/test_skill_context_enhancement.py +321 -0
  440. control_plane_api/worker/tests/unit/test_system_prompt_enhancement.py +415 -0
  441. control_plane_api/worker/tests/unit/test_tool_enforcement.py +324 -0
  442. control_plane_api/worker/utils/__init__.py +1 -0
  443. control_plane_api/worker/utils/chunk_batcher.py +330 -0
  444. control_plane_api/worker/utils/environment.py +65 -0
  445. control_plane_api/worker/utils/error_publisher.py +260 -0
  446. control_plane_api/worker/utils/event_batcher.py +256 -0
  447. control_plane_api/worker/utils/logging_config.py +335 -0
  448. control_plane_api/worker/utils/logging_helper.py +326 -0
  449. control_plane_api/worker/utils/parameter_validator.py +120 -0
  450. control_plane_api/worker/utils/retry_utils.py +60 -0
  451. control_plane_api/worker/utils/streaming_utils.py +665 -0
  452. control_plane_api/worker/utils/tool_validation.py +332 -0
  453. control_plane_api/worker/utils/workspace_manager.py +163 -0
  454. control_plane_api/worker/websocket_client.py +393 -0
  455. control_plane_api/worker/worker.py +1297 -0
  456. control_plane_api/worker/workflows/__init__.py +0 -0
  457. control_plane_api/worker/workflows/agent_execution.py +909 -0
  458. control_plane_api/worker/workflows/scheduled_job_wrapper.py +332 -0
  459. control_plane_api/worker/workflows/team_execution.py +611 -0
  460. kubiya_control_plane_api-0.9.15.dist-info/METADATA +354 -0
  461. kubiya_control_plane_api-0.9.15.dist-info/RECORD +479 -0
  462. kubiya_control_plane_api-0.9.15.dist-info/WHEEL +5 -0
  463. kubiya_control_plane_api-0.9.15.dist-info/entry_points.txt +5 -0
  464. kubiya_control_plane_api-0.9.15.dist-info/licenses/LICENSE +676 -0
  465. kubiya_control_plane_api-0.9.15.dist-info/top_level.txt +3 -0
  466. scripts/__init__.py +1 -0
  467. scripts/migrations.py +39 -0
  468. scripts/seed_worker_queues.py +128 -0
  469. scripts/setup_agent_runtime.py +142 -0
  470. worker_internal/__init__.py +1 -0
  471. worker_internal/planner/__init__.py +1 -0
  472. worker_internal/planner/activities.py +1499 -0
  473. worker_internal/planner/agent_tools.py +197 -0
  474. worker_internal/planner/event_models.py +148 -0
  475. worker_internal/planner/event_publisher.py +67 -0
  476. worker_internal/planner/models.py +199 -0
  477. worker_internal/planner/retry_logic.py +134 -0
  478. worker_internal/planner/worker.py +300 -0
  479. worker_internal/planner/workflows.py +970 -0
@@ -0,0 +1,63 @@
1
+ """
2
+ Skills Configuration
3
+
4
+ Environment variable based configuration for dynamic skill loading.
5
+ """
6
+
7
+ import os
8
+ from pathlib import Path
9
+ from typing import List
10
+ import logging
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+
15
+ def get_skill_template_paths() -> List[str]:
16
+ """
17
+ Get skill template paths from environment variables.
18
+
19
+ Environment Variables:
20
+ KUBIYA_SKILLS_TEMPLATES_PATH: Primary skills template directory
21
+ KUBIYA_SKILLS_EXTRA_PATHS: Additional paths (colon-separated on Unix, semicolon on Windows)
22
+
23
+ Returns:
24
+ List of paths to search for skill templates
25
+ """
26
+ paths = []
27
+
28
+ # Primary path from environment
29
+ primary_path = os.getenv("KUBIYA_SKILLS_TEMPLATES_PATH")
30
+ if primary_path:
31
+ paths.append(primary_path)
32
+
33
+ # Extra paths (colon-separated on Unix, semicolon on Windows)
34
+ extra_paths_str = os.getenv("KUBIYA_SKILLS_EXTRA_PATHS", "")
35
+ separator = ";" if os.name == "nt" else ":"
36
+ extra_paths = [p.strip() for p in extra_paths_str.split(separator) if p.strip()]
37
+ paths.extend(extra_paths)
38
+
39
+ # Default: ~/.kubiya/skills if nothing configured
40
+ if not paths:
41
+ default_path = Path.home() / ".kubiya" / "skills"
42
+ if default_path.exists():
43
+ paths.append(str(default_path))
44
+
45
+ logger.info(f"Skill template paths configured: {paths}")
46
+ return paths
47
+
48
+
49
+ def is_dynamic_skills_enabled() -> bool:
50
+ """
51
+ Check if dynamic skill loading is enabled.
52
+
53
+ Environment Variable:
54
+ KUBIYA_ENABLE_DYNAMIC_SKILLS: Set to 'true', '1', or 'yes' to enable
55
+
56
+ Returns:
57
+ True if dynamic skills are enabled
58
+ """
59
+ enabled_str = os.getenv("KUBIYA_ENABLE_DYNAMIC_SKILLS", "true").lower()
60
+ enabled = enabled_str in ("true", "1", "yes")
61
+
62
+ logger.info(f"Dynamic skills loading enabled: {enabled}")
63
+ return enabled
@@ -0,0 +1,14 @@
1
+ """
2
+ Skill Template Loaders
3
+
4
+ Loaders for discovering and loading skill templates from various sources.
5
+ Control Plane uses these to dynamically discover available skills.
6
+ """
7
+
8
+ from .base import BaseSkillTemplateLoader
9
+ from .filesystem_loader import FilesystemSkillTemplateLoader
10
+
11
+ __all__ = [
12
+ "BaseSkillTemplateLoader",
13
+ "FilesystemSkillTemplateLoader",
14
+ ]
@@ -0,0 +1,73 @@
1
+ """
2
+ Base Skill Template Loader
3
+
4
+ Abstract interface for all skill template loaders.
5
+ """
6
+
7
+ from abc import ABC, abstractmethod
8
+ from typing import List
9
+ import logging
10
+
11
+ from control_plane_api.app.skills.base import SkillDefinition
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ class BaseSkillTemplateLoader(ABC):
17
+ """
18
+ Abstract base class for skill template loaders.
19
+
20
+ Loaders discover skill templates from various sources and return
21
+ SkillDefinition instances that can be registered in the skill registry.
22
+ """
23
+
24
+ def __init__(self, enabled: bool = True):
25
+ """
26
+ Initialize loader.
27
+
28
+ Args:
29
+ enabled: Whether this loader is enabled
30
+ """
31
+ self.enabled = enabled
32
+ self.logger = logger
33
+
34
+ @abstractmethod
35
+ def discover(self) -> List[SkillDefinition]:
36
+ """
37
+ Discover skill templates from this source.
38
+
39
+ Returns:
40
+ List of SkillDefinition instances
41
+
42
+ Raises:
43
+ Exception: If discovery fails
44
+ """
45
+ pass
46
+
47
+ def get_source_name(self) -> str:
48
+ """
49
+ Get the name of this loader source.
50
+
51
+ Returns:
52
+ Source name for logging
53
+ """
54
+ return self.__class__.__name__
55
+
56
+ def is_enabled(self) -> bool:
57
+ """
58
+ Check if this loader is enabled.
59
+
60
+ Returns:
61
+ True if enabled
62
+ """
63
+ return self.enabled
64
+
65
+ def enable(self) -> None:
66
+ """Enable this loader."""
67
+ self.enabled = True
68
+ self.logger.info(f"{self.get_source_name()} enabled")
69
+
70
+ def disable(self) -> None:
71
+ """Disable this loader."""
72
+ self.enabled = False
73
+ self.logger.info(f"{self.get_source_name()} disabled")
@@ -0,0 +1,199 @@
1
+ """
2
+ Filesystem Skill Template Loader
3
+
4
+ Loads skill templates from filesystem directories containing Python skill definitions.
5
+ """
6
+
7
+ import sys
8
+ import importlib.util
9
+ from pathlib import Path
10
+ from typing import List
11
+ import logging
12
+
13
+ from .base import BaseSkillTemplateLoader
14
+ from control_plane_api.app.skills.base import SkillDefinition
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+
19
+ class FilesystemSkillTemplateLoader(BaseSkillTemplateLoader):
20
+ """
21
+ Loader for filesystem-based skill templates.
22
+
23
+ Discovers skill templates by searching for skill_template.py files
24
+ in configured directories (e.g., ~/.kubiya/skills/).
25
+
26
+ Directory structure:
27
+ ~/.kubiya/skills/
28
+ ├── my_custom_skill/
29
+ │ └── skill_template.py # Contains SkillDefinition subclass
30
+ └── another_skill/
31
+ └── skill_template.py
32
+ """
33
+
34
+ def __init__(
35
+ self,
36
+ base_paths: List[str] = None,
37
+ enabled: bool = True,
38
+ ):
39
+ """
40
+ Initialize filesystem loader.
41
+
42
+ Args:
43
+ base_paths: List of base directories to search
44
+ enabled: Whether this loader is enabled
45
+ """
46
+ super().__init__(enabled=enabled)
47
+
48
+ # Default paths
49
+ if base_paths is None:
50
+ base_paths = []
51
+ # Add .kubiya/skills/ from home directory
52
+ home_skills = Path.home() / ".kubiya" / "skills"
53
+ if home_skills.exists():
54
+ base_paths.append(str(home_skills))
55
+
56
+ self.base_paths = [Path(p) for p in base_paths]
57
+ logger.info(
58
+ f"FilesystemSkillTemplateLoader initialized with paths: {[str(p) for p in self.base_paths]}"
59
+ )
60
+
61
+ def discover(self) -> List[SkillDefinition]:
62
+ """
63
+ Discover skill templates by scanning for skill_template.py files.
64
+
65
+ Returns:
66
+ List of discovered SkillDefinition instances
67
+ """
68
+ discovered = []
69
+
70
+ for base_path in self.base_paths:
71
+ if not base_path.exists():
72
+ logger.warning(f"Base path not found: {base_path}")
73
+ continue
74
+
75
+ # Search for skill template files
76
+ skill_dirs = self._find_skill_directories(base_path)
77
+
78
+ for skill_dir in skill_dirs:
79
+ try:
80
+ skill_def = self._load_skill_template(skill_dir)
81
+ if skill_def:
82
+ discovered.append(skill_def)
83
+ logger.info(
84
+ f"Loaded skill template: {skill_def.name} from {skill_dir}"
85
+ )
86
+ except Exception as e:
87
+ logger.error(
88
+ f"Failed to load skill template from {skill_dir}: {e}",
89
+ exc_info=True
90
+ )
91
+
92
+ logger.info(f"Discovered {len(discovered)} skill templates from filesystem")
93
+ return discovered
94
+
95
+ def _find_skill_directories(self, base_path: Path) -> List[Path]:
96
+ """
97
+ Find all directories containing skill_template.py files.
98
+
99
+ Args:
100
+ base_path: Base directory to search
101
+
102
+ Returns:
103
+ List of directories containing skill templates
104
+ """
105
+ skill_dirs = []
106
+
107
+ for item in base_path.iterdir():
108
+ if item.is_dir():
109
+ skill_template = item / "skill_template.py"
110
+ if skill_template.exists():
111
+ skill_dirs.append(item)
112
+
113
+ return skill_dirs
114
+
115
+ def _load_skill_template(self, skill_dir: Path) -> SkillDefinition:
116
+ """
117
+ Load skill template from a directory.
118
+
119
+ Args:
120
+ skill_dir: Directory containing skill_template.py
121
+
122
+ Returns:
123
+ SkillDefinition instance
124
+
125
+ Raises:
126
+ Exception: If loading fails
127
+ """
128
+ skill_template_path = skill_dir / "skill_template.py"
129
+
130
+ # Add skill directory to path temporarily
131
+ skill_dir_str = str(skill_dir)
132
+ if skill_dir_str not in sys.path:
133
+ sys.path.insert(0, skill_dir_str)
134
+
135
+ try:
136
+ # Load the module dynamically
137
+ module_name = f"skill_template_{skill_dir.name}"
138
+ spec = importlib.util.spec_from_file_location(
139
+ module_name,
140
+ skill_template_path
141
+ )
142
+
143
+ if spec is None or spec.loader is None:
144
+ raise ImportError(f"Could not load module spec from {skill_template_path}")
145
+
146
+ module = importlib.util.module_from_spec(spec)
147
+ sys.modules[module_name] = module
148
+ spec.loader.exec_module(module)
149
+
150
+ # Find SkillDefinition subclass in module
151
+ skill_class = None
152
+ for attr_name in dir(module):
153
+ attr = getattr(module, attr_name)
154
+ if (
155
+ isinstance(attr, type) and
156
+ issubclass(attr, SkillDefinition) and
157
+ attr is not SkillDefinition
158
+ ):
159
+ skill_class = attr
160
+ break
161
+
162
+ if skill_class is None:
163
+ raise ValueError(
164
+ f"No SkillDefinition subclass found in {skill_template_path}"
165
+ )
166
+
167
+ # Instantiate the skill definition
168
+ skill_instance = skill_class()
169
+
170
+ return skill_instance
171
+
172
+ finally:
173
+ # Clean up sys.path
174
+ if skill_dir_str in sys.path:
175
+ sys.path.remove(skill_dir_str)
176
+
177
+ def add_base_path(self, path: str) -> None:
178
+ """
179
+ Add an additional base path to search.
180
+
181
+ Args:
182
+ path: Path to add
183
+ """
184
+ path_obj = Path(path)
185
+ if path_obj not in self.base_paths:
186
+ self.base_paths.append(path_obj)
187
+ logger.info(f"Added base path: {path_obj}")
188
+
189
+ def remove_base_path(self, path: str) -> None:
190
+ """
191
+ Remove a base path from search.
192
+
193
+ Args:
194
+ path: Path to remove
195
+ """
196
+ path_obj = Path(path)
197
+ if path_obj in self.base_paths:
198
+ self.base_paths.remove(path_obj)
199
+ logger.info(f"Removed base path: {path_obj}")
@@ -0,0 +1,125 @@
1
+ """
2
+ Skill Registry
3
+
4
+ Central registry for all available skills. Skills self-register
5
+ when their modules are imported, or can be loaded dynamically from external sources.
6
+ """
7
+ from typing import Dict, List, Optional
8
+ from .base import SkillDefinition, SkillType
9
+ import logging
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class SkillRegistry:
15
+ """Registry for all available skill definitions"""
16
+
17
+ def __init__(self):
18
+ self._skills: Dict[SkillType, SkillDefinition] = {}
19
+ self._dynamic_loaded = False
20
+
21
+ def register(self, skill: SkillDefinition):
22
+ """Register a skill definition"""
23
+ if skill.type in self._skills:
24
+ logger.warning(f"Skill {skill.type} is already registered, overwriting")
25
+
26
+ self._skills[skill.type] = skill
27
+ logger.info(f"Registered skill: {skill.type} - {skill.name}")
28
+
29
+ def load_from_loaders(self, loaders: List) -> int:
30
+ """
31
+ Load skills from multiple loaders.
32
+
33
+ Args:
34
+ loaders: List of BaseSkillTemplateLoader instances
35
+
36
+ Returns:
37
+ Number of skills loaded
38
+ """
39
+ loaded_count = 0
40
+
41
+ for loader in loaders:
42
+ if not loader.is_enabled():
43
+ logger.info(f"Skipping disabled loader: {loader.get_source_name()}")
44
+ continue
45
+
46
+ try:
47
+ logger.info(f"Loading skills from: {loader.get_source_name()}")
48
+ skills = loader.discover()
49
+
50
+ for skill in skills:
51
+ try:
52
+ self.register(skill)
53
+ loaded_count += 1
54
+ except Exception as e:
55
+ logger.error(
56
+ f"Failed to register skill {skill.name}: {e}",
57
+ exc_info=True
58
+ )
59
+
60
+ except Exception as e:
61
+ logger.error(
62
+ f"Loader {loader.get_source_name()} failed: {e}",
63
+ exc_info=True
64
+ )
65
+
66
+ self._dynamic_loaded = True
67
+ logger.info(f"Loaded {loaded_count} skills from {len(loaders)} loaders")
68
+ return loaded_count
69
+
70
+ def get(self, skill_type: SkillType) -> Optional[SkillDefinition]:
71
+ """Get a skill definition by type"""
72
+ return self._skills.get(skill_type)
73
+
74
+ def get_all(self) -> List[SkillDefinition]:
75
+ """Get all registered skills"""
76
+ return list(self._skills.values())
77
+
78
+ def get_by_name(self, name: str) -> Optional[SkillDefinition]:
79
+ """Get a skill by name"""
80
+ for skill in self._skills.values():
81
+ if skill.name.lower() == name.lower():
82
+ return skill
83
+ return None
84
+
85
+ def list_types(self) -> List[SkillType]:
86
+ """List all registered skill types"""
87
+ return list(self._skills.keys())
88
+
89
+ def is_dynamic_loaded(self) -> bool:
90
+ """Check if dynamic skills have been loaded"""
91
+ return self._dynamic_loaded
92
+
93
+ def get_stats(self) -> Dict[str, any]:
94
+ """
95
+ Get registry statistics.
96
+
97
+ Returns:
98
+ Dictionary with registry stats
99
+ """
100
+ return {
101
+ "total_skills": len(self._skills),
102
+ "skill_types": [str(st) for st in self._skills.keys()],
103
+ "skill_names": [skill.name for skill in self._skills.values()],
104
+ "dynamic_loaded": self._dynamic_loaded,
105
+ }
106
+
107
+
108
+ # Global registry instance
109
+ skill_registry = SkillRegistry()
110
+
111
+
112
+ def register_skill(skill: SkillDefinition):
113
+ """Decorator or function to register a skill"""
114
+ skill_registry.register(skill)
115
+ return skill
116
+
117
+
118
+ def get_skill(skill_type: SkillType) -> Optional[SkillDefinition]:
119
+ """Get a skill definition by type"""
120
+ return skill_registry.get(skill_type)
121
+
122
+
123
+ def get_all_skills() -> List[SkillDefinition]:
124
+ """Get all registered skills"""
125
+ return skill_registry.get_all()
@@ -0,0 +1,12 @@
1
+ import os
2
+
3
+
4
+ def is_local_temporal() -> bool:
5
+ """
6
+ Check if the Temporal running temporal is in a docker container or not.
7
+ """
8
+ temporal_host = os.getenv("TEMPORAL_HOST", "us-east-1.aws.api.temporal.io:7233")
9
+ return any([
10
+ temporal_host.startswith("temporal:"),
11
+ temporal_host.startswith("host.docker.internal"),
12
+ ])