stackgen-sdk 0.4.0rc35__tar.gz → 0.4.0rc37__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.
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/PKG-INFO +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/_http.py +11 -8
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/_version.py +2 -2
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/client.py +4 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/config.py +4 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/devops/__init__.py +5 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/devops/namespace.py +374 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/.openapi-generator/FILES +156 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/__init__.py +105 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/api/__init__.py +1 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/api/aiden_api.py +39 -4
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/api/dev_ops_api.py +5684 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/api/sre_api.py +3884 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/api/vault_api.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/api_client.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/configuration.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/exceptions.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/__init__.py +52 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/activate_break_glass_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/agent_app_mcp_binding.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/agent_health_check.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/agent_health_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/agent_info.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/agent_lifecycle_status.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/agent_model_config.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/agent_schedule.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/agent_status.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/alert_analysis_status.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/alert_attention.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/alert_categorization_summary.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/alert_role.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/alert_sort_by.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/alert_status.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/alert_summary.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/alert_sync_run_status.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/alert_v1.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/app_integration_binding.py +95 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/approval_item.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/approve_request_body.py +89 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/artifact_info.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/ask_execution_mode.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/ask_guild_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/ask_guild_route_decision.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/ask_guild_route_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/ask_guild_start_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/attach_policy_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/audit_event.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/audit_event_list_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/audit_facets.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/auto_approve_tool_rule.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/automation_eligible.py +38 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/autonomy_budget_config.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/autonomy_budget_snapshot.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/autonomy_budget_tier.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/autonomy_budget_tier_reason.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/break_glass_state.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/candidate_type.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/chat_channel_selector.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/chat_subscription.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/chat_subscription_list_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/chat_subscription_target_type.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/chat_subscription_trigger_type.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/combining_algorithm.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/combining_algorithm_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/container_image.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/cost_band.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/create_chat_subscription_request.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/create_discovered_workflow_body.py +91 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/create_discovered_workflow_response.py +87 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/create_document_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/create_knowledge_base_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/create_policy_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/create_remote_runner_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/create_remote_runner_response.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/create_request_workflow_body.py +108 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/create_request_workflow_response.py +93 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/create_schedule_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/create_skill_companion_file.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/create_skill_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/create_webhook_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/dag_edge.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/dag_node.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/devops_request_v1.py +204 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/diary_compression.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/diary_config.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/discovered_tool.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/document_ingest_status.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/document_ingest_workflow_status.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/document_processing_status.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/duration_band.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/eligible_workflow_v1.py +91 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/entity_ref.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/error_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/eval_config.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/evaluate_policy_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/evaluate_policy_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/execution_list_item.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/execution_meta.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/execution_status.py +39 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/execution_structured_output.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/execution_tool_call.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/execution_tool_call_list.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/external_secret_reference.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/fetch_request_by_identifier_body.py +88 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/fork_investigation_request.py +87 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/fork_session_request.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/funnel_metrics_response.py +96 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/funnel_period.py +38 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/git_config.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/guild_integration.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/guild_json_error.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/guild_platform_config.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/hal_guard_config.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/health_check_status.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/hitl_config.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/ingested_document.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/ingested_document1.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/integration_availability_reason.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/integration_availability_status.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/integration_mcp_auth_promotion.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/integration_remote_runner.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/integration_scope.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/integration_sidecar_launch.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/integration_test_result.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/integration_type_info.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/investigate_alert_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/investigate_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/investigation.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/investigation_evidence.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/investigation_evidence_kind.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/investigation_evidence_source.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/investigation_group.py +121 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/investigation_hypothesis.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/investigation_plain_summary.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/investigation_prior_incident.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/investigation_recommended_next_step.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/investigation_ref.py +3 -3
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/investigation_status.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/investigation_structured_hypothesis_entry.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/investigation_structured_limitation_entry.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/investigation_structured_rca.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/investigation_triage_metadata.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/judge_execution_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/key_definition_type.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/knowledge_base.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/knowledge_config.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/knowledge_item.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/knowledge_item_backend.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/knowledge_item_operation.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/knowledge_type.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/list_alerts_response.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/list_eligible_workflows_response.py +95 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/list_investigation_groups_response.py +101 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/list_investigations_response.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/list_post_remediation_verifications_response.py +95 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/list_remote_runner_tasks_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/list_remote_runners_response.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/list_requests_response.py +101 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/list_sync_runs_response.py +97 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/llm_provider_type.py +2 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/metadata.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/middleware_config.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/middleware_config_circuit_breaker.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/middleware_config_concurrency.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/middleware_config_context_mode.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/middleware_config_context_mode_per_tool_value.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/middleware_config_metrics.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/middleware_config_rate_limit.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/middleware_config_retry.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/middleware_config_sanitize.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/middleware_config_timeout.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/middleware_config_tracing.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/middleware_config_validation.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/model_pricing.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/model_provider_config.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/navigation_mode.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/o_auth_support.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/owner_type.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/pagination.py +6 -6
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/persona_variant_config.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/pii_redaction_config.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/pii_regex_rule.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/policy.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/policy_evaluation_input.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/policy_evaluation_input_agent.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/policy_evaluation_input_approver.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/policy_evaluation_input_environment.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/policy_evaluation_input_principal.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/policy_evaluation_input_project_membership.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/policy_evaluation_input_requester.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/policy_evaluation_input_tool.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/policy_evaluation_outcome.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/policy_type.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/post_remediation_verification.py +113 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/post_source_comment_body.py +87 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/qualified_candidate.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/rca_config.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/reasoning_effort_setting.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/register_agent_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/registered_model.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/remote_runner_info.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/remote_runner_task_info.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/reopen_request_body.py +88 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/request_category.py +41 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/request_priority.py +38 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/request_related_pull_request_v1.py +91 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/request_related_ticket_v1.py +94 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/request_status.py +44 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/resolve_approval_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/run_workflow_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/run_workflow_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/runbook_config.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/runner_capability.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/runner_status.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/runtime_approval_binding.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/runtime_approval_item.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/scan_finding.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/schedule_history.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/schedule_run_list_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/schedule_run_status.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/schedule_source.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/schedule_target_type.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/secret.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/secret_sub_category.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/session.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/session_activity_status.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/session_export.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/session_export_part.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/session_export_part_kind.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/session_list_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/session_responder_kind.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/session_summary.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/setup_status.py +101 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/sidecar_health_probes.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/signal_severity.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/skill.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/skill_file.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/skill_summary.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/source_comment_result_v1.py +93 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/stage_binding.py +2 -2
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/stage_expectation.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/start_ask_guild200_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/start_chat_json_body.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/start_chat_response.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/start_workflow_discovery_body.py +96 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/subagent_spawn_contract.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/suggest_request_workflow_body.py +89 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/suggest_request_workflow_response.py +110 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/suggested_workflow_draft_v1.py +117 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/supported_formats.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/supported_formats_keys_inner.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/sync_request.py +99 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/sync_requests_response.py +95 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/sync_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/task_error_category.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/task_status.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/terminate_session_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/test_model_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/test_model_response.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/ticket_source.py +38 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/toggle_chat_subscription_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/trace_dag_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/trigger_schedule202_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/trigger_webhook202_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/update_agent_request.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/update_alert_request.py +119 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/update_alert_status.py +37 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/update_chat_subscription_request.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/update_investigations_status_request.py +91 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/update_investigations_status_response.py +97 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/update_request_body.py +100 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/update_secret_by_id_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/update_session_metadata_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/update_webhook_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/upsert_integration_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/version_status.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/webhook.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/webhook_filter_preview_header.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/webhook_filter_preview_request.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/webhook_filter_preview_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/webhook_run.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/webhook_run_detail.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/webhook_run_list_response.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/workflow.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/workflow_discovery_class_v1.py +138 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/workflow_discovery_evidence_v1.py +104 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/workflow_discovery_plan_step_v1.py +92 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/workflow_discovery_run_v1.py +124 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/workflow_discovery_status.py +38 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/workflow_discovery_ticket_v1.py +104 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/workflow_draft_stage_v1.py +89 -0
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/workflow_integration_hint_v1.py +104 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/workflow_metadata.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/generated/models/workflow_near_miss_v1.py +93 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/workflow_output_contract.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/workflow_run_expectations.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/workflow_stage.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/workflow_tool_middleware.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/workflow_tool_middleware_circuit_breaker.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/workflow_tool_middleware_concurrency.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/workflow_trigger.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/models/workflow_trigger_type.py +1 -1
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/rest.py +1 -1
- stackgen_sdk-0.4.0rc37/src/stackgen/sre/namespace.py +390 -0
- stackgen_sdk-0.4.0rc35/src/stackgen/generated/api/sre_api.py +0 -1613
- stackgen_sdk-0.4.0rc35/src/stackgen/sre/namespace.py +0 -57
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/.gitignore +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/README.md +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/pyproject.toml +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/__init__.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/aiden/__init__.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/aiden/ask.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/aiden/audit.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/aiden/integration_secrets.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/aiden/models.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/aiden/namespace.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/aiden/resources.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/aiden/run_status.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/aiden/runs.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/aiden/sessions.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/aiden/steer.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/aiden/stream_events.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/aiden/subscribe.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/aiden/subscribe_frames.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/aiden/transient.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/aiden/webhook.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/aiden/webhook_ops.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/aiden/workflow_builder.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/aiden/workflow_publish.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/cli.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/errors.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/.openapi-generator/VERSION +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/.openapi-generator-ignore +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/generated/api_response.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/logging.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/orgs/__init__.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/orgs/namespace.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/sre/__init__.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/vault/__init__.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/vault/metadata.py +0 -0
- {stackgen_sdk-0.4.0rc35 → stackgen_sdk-0.4.0rc37}/src/stackgen/vault/namespace.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: stackgen-sdk
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.0rc37
|
|
4
4
|
Summary: StackGen SDK — Aiden, SRE, and Vault from one client
|
|
5
5
|
Project-URL: Homepage, https://appcd-dev.github.io/stackgen-sdk/
|
|
6
6
|
Project-URL: Documentation, https://appcd-dev.github.io/stackgen-sdk/
|
|
@@ -113,16 +113,17 @@ def request(
|
|
|
113
113
|
retries: int = 3,
|
|
114
114
|
timeout_seconds: float | None = None,
|
|
115
115
|
transient_retry_budget_ms: float | int | None = None,
|
|
116
|
-
retry_gateway_outage: bool =
|
|
116
|
+
retry_gateway_outage: bool = True,
|
|
117
|
+
org_id: str | None = None,
|
|
117
118
|
) -> Any:
|
|
118
|
-
"""Bearer HTTP call with retries on transient failures
|
|
119
|
+
"""Bearer HTTP call with retries on transient failures.
|
|
119
120
|
|
|
120
121
|
Gateway 502/503/504 and network errors retry until
|
|
121
|
-
``transient_retry_budget_ms`` elapses (default 120s)
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
122
|
+
``transient_retry_budget_ms`` elapses (default 120s) for every method —
|
|
123
|
+
a CloudFront drop means the edge never delivered the request. Pass
|
|
124
|
+
``retry_gateway_outage=False`` to fail fast on POST/PATCH instead.
|
|
125
|
+
Other retryable statuses (429, 499, application 500, …) still use the
|
|
126
|
+
short ``retries`` attempt budget and only for idempotent methods.
|
|
126
127
|
|
|
127
128
|
``timeout_seconds`` is an optional per-call abort budget. When the deadline
|
|
128
129
|
expires, raises :class:`~stackgen.errors.TimeoutError`. Omit to wait until
|
|
@@ -135,10 +136,12 @@ def request(
|
|
|
135
136
|
method = method.upper()
|
|
136
137
|
budget_ms = resolve_transient_retry_budget_ms(transient_retry_budget_ms)
|
|
137
138
|
idempotent = is_idempotent_http_method(method)
|
|
138
|
-
retry_outage =
|
|
139
|
+
retry_outage = bool(retry_gateway_outage)
|
|
139
140
|
headers = {"Authorization": f"Bearer {token}"}
|
|
140
141
|
if content_type:
|
|
141
142
|
headers["Content-Type"] = content_type
|
|
143
|
+
if org_id:
|
|
144
|
+
headers["X-Appcd-Org"] = org_id
|
|
142
145
|
|
|
143
146
|
started = time.monotonic()
|
|
144
147
|
attempt = 0
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '0.4.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 4, 0, '
|
|
21
|
+
__version__ = version = '0.4.0rc37'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 4, 0, 'rc37')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
"""StackgenClient — one entrypoint for Aiden, SRE, and Vault."""
|
|
1
|
+
"""StackgenClient — one entrypoint for Aiden, SRE, DevOps, and Vault."""
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
from stackgen.aiden import AidenNamespace
|
|
6
6
|
from stackgen.config import StackgenConfig
|
|
7
|
+
from stackgen.devops import DevOpsNamespace
|
|
7
8
|
from stackgen.orgs import OrgsNamespace
|
|
8
9
|
from stackgen.sre import SRENamespace
|
|
9
10
|
from stackgen.vault import VaultNamespace
|
|
@@ -15,6 +16,7 @@ class StackgenClient:
|
|
|
15
16
|
Namespaces:
|
|
16
17
|
- ``aiden`` — platform automations, sessions, session-report download
|
|
17
18
|
- ``sre`` — alerts and investigations
|
|
19
|
+
- ``devops`` — Ops Inbox requests and workflow discovery
|
|
18
20
|
- ``vault`` — secrets (allowlisted separately)
|
|
19
21
|
- ``orgs`` — create and delete disposable projects
|
|
20
22
|
"""
|
|
@@ -25,6 +27,7 @@ class StackgenClient:
|
|
|
25
27
|
self.config = config
|
|
26
28
|
self.aiden = AidenNamespace(config)
|
|
27
29
|
self.sre = SRENamespace(config)
|
|
30
|
+
self.devops = DevOpsNamespace(config)
|
|
28
31
|
self.vault = VaultNamespace(config)
|
|
29
32
|
self.orgs = OrgsNamespace(config)
|
|
30
33
|
|
|
@@ -97,6 +97,10 @@ class StackgenConfig:
|
|
|
97
97
|
"""HTTP prefix for the SRE app."""
|
|
98
98
|
return self.mothership() + "/app/sre"
|
|
99
99
|
|
|
100
|
+
def devops_url(self) -> str:
|
|
101
|
+
"""HTTP prefix for the DevOps Ops Inbox app."""
|
|
102
|
+
return self.mothership() + "/app/devops"
|
|
103
|
+
|
|
100
104
|
def vault_url(self) -> str:
|
|
101
105
|
"""HTTP prefix for Vault on the mothership edge (``/api/vault/v1``)."""
|
|
102
106
|
return self.mothership() + "/api/vault/v1"
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
"""DevOps namespace — Ops Inbox requests and workflow discovery."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import time
|
|
7
|
+
import urllib.parse
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from stackgen import _http
|
|
11
|
+
from stackgen.config import StackgenConfig
|
|
12
|
+
from stackgen.errors import HttpError, StackgenError, TimeoutError
|
|
13
|
+
|
|
14
|
+
_TRIAGE_WAIT = frozenset({"new", "triaging"})
|
|
15
|
+
_EXEC_WAIT_STATUS = frozenset({"approved", "executing"})
|
|
16
|
+
_EXEC_WAIT_EXEC = frozenset({"not_started", "running"})
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def query_string(params: dict[str, Any]) -> str:
|
|
20
|
+
cleaned = {k: v for k, v in params.items() if v is not None}
|
|
21
|
+
if not cleaned:
|
|
22
|
+
return ""
|
|
23
|
+
return "?" + urllib.parse.urlencode(cleaned, doseq=True)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _escape(segment: str) -> str:
|
|
27
|
+
return urllib.parse.quote(str(segment), safe="")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _as_dict(value: Any, label: str) -> dict[str, Any]:
|
|
31
|
+
if not isinstance(value, dict):
|
|
32
|
+
raise StackgenError(f"unexpected {label} payload: {value!r}")
|
|
33
|
+
return value
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class DevOpsNamespace:
|
|
37
|
+
"""Ops Inbox requests and workflow discovery."""
|
|
38
|
+
|
|
39
|
+
def __init__(self, config: StackgenConfig) -> None:
|
|
40
|
+
self._config = config
|
|
41
|
+
|
|
42
|
+
def _url(self, path: str, params: dict[str, Any] | None = None) -> str:
|
|
43
|
+
return f"{self._config.devops_url()}/api/v1{path}{query_string(params or {})}"
|
|
44
|
+
|
|
45
|
+
def _req(self, url: str, **kwargs: Any) -> Any:
|
|
46
|
+
org = (self._config.org_id or "").strip() or None
|
|
47
|
+
return _http.request(url, self._config.api_token, org_id=org, **kwargs)
|
|
48
|
+
|
|
49
|
+
def setup_status(self) -> Any:
|
|
50
|
+
"""GET /app/devops/api/setup"""
|
|
51
|
+
url = f"{self._config.devops_url()}/api/setup"
|
|
52
|
+
return self._req(url)
|
|
53
|
+
|
|
54
|
+
def list_requests(self, **params: Any) -> Any:
|
|
55
|
+
"""GET /app/devops/api/v1/requests"""
|
|
56
|
+
return self._req(self._url("/requests", params))
|
|
57
|
+
|
|
58
|
+
def get_request(self, request_id: str) -> Any:
|
|
59
|
+
"""GET /app/devops/api/v1/requests/{id}"""
|
|
60
|
+
return self._req(self._url(f"/requests/{_escape(request_id)}"),
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
def update_request(self, request_id: str, body: dict[str, Any]) -> Any:
|
|
64
|
+
"""PATCH /app/devops/api/v1/requests/{id}"""
|
|
65
|
+
payload = json.dumps(body).encode("utf-8")
|
|
66
|
+
return self._req(self._url(f"/requests/{_escape(request_id)}"),
|
|
67
|
+
method="PATCH",
|
|
68
|
+
body=payload,
|
|
69
|
+
content_type="application/json",
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
def sync_requests(self) -> Any:
|
|
73
|
+
"""POST /app/devops/api/v1/requests/sync — ticket pull finishes in this call."""
|
|
74
|
+
return self._req(self._url("/requests/sync"),
|
|
75
|
+
method="POST",
|
|
76
|
+
body=b"{}",
|
|
77
|
+
content_type="application/json",
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
def fetch_request(self, identifier: str) -> Any:
|
|
81
|
+
"""POST /app/devops/api/v1/requests/fetch — import one ticket key."""
|
|
82
|
+
payload = json.dumps({"identifier": identifier}).encode("utf-8")
|
|
83
|
+
return self._req(self._url("/requests/fetch"),
|
|
84
|
+
method="POST",
|
|
85
|
+
body=payload,
|
|
86
|
+
content_type="application/json",
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
def wait_for_triage(self, request_id: str) -> dict[str, Any]:
|
|
90
|
+
"""Poll while status is new or triaging. Returns on any other status."""
|
|
91
|
+
cfg = self._config
|
|
92
|
+
deadline = time.monotonic() + cfg.timeout_seconds
|
|
93
|
+
last_transient = ""
|
|
94
|
+
while time.monotonic() < deadline:
|
|
95
|
+
try:
|
|
96
|
+
data = _as_dict(
|
|
97
|
+
self._req(self._url(f"/requests/{_escape(request_id)}"),
|
|
98
|
+
retries=1,
|
|
99
|
+
),
|
|
100
|
+
"getRequest",
|
|
101
|
+
)
|
|
102
|
+
last_transient = ""
|
|
103
|
+
status = _http.text(data.get("status")).casefold()
|
|
104
|
+
if status not in _TRIAGE_WAIT:
|
|
105
|
+
return data
|
|
106
|
+
except StackgenError as err:
|
|
107
|
+
if isinstance(err, HttpError) and _http.is_transient_http_error(err):
|
|
108
|
+
last_transient = _http.http_status_snippet(err)
|
|
109
|
+
else:
|
|
110
|
+
raise
|
|
111
|
+
remaining = deadline - time.monotonic()
|
|
112
|
+
if remaining <= 0:
|
|
113
|
+
break
|
|
114
|
+
time.sleep(min(cfg.poll_interval_seconds, remaining))
|
|
115
|
+
label = f"triage ({last_transient})" if last_transient else "triage"
|
|
116
|
+
raise TimeoutError(label, cfg.timeout_seconds)
|
|
117
|
+
|
|
118
|
+
def fetch_and_wait(self, identifier: str) -> dict[str, Any]:
|
|
119
|
+
"""Fetch one ticket and wait until triage settles."""
|
|
120
|
+
started = _as_dict(self.fetch_request(identifier), "fetchRequest")
|
|
121
|
+
request_id = _http.text(started.get("id"))
|
|
122
|
+
if not request_id:
|
|
123
|
+
raise StackgenError(f"fetch_request missing id: {started!r}")
|
|
124
|
+
return self.wait_for_triage(request_id)
|
|
125
|
+
|
|
126
|
+
def approve_request(
|
|
127
|
+
self,
|
|
128
|
+
request_id: str,
|
|
129
|
+
*,
|
|
130
|
+
workflow_name: str | None = None,
|
|
131
|
+
override_reason: str | None = None,
|
|
132
|
+
) -> Any:
|
|
133
|
+
"""POST /app/devops/api/v1/requests/{id}/approve"""
|
|
134
|
+
body: dict[str, Any] = {}
|
|
135
|
+
if workflow_name is not None:
|
|
136
|
+
body["workflow_name"] = workflow_name
|
|
137
|
+
if override_reason is not None:
|
|
138
|
+
body["override_reason"] = override_reason
|
|
139
|
+
payload = json.dumps(body).encode("utf-8")
|
|
140
|
+
return self._req(self._url(f"/requests/{_escape(request_id)}/approve"),
|
|
141
|
+
method="POST",
|
|
142
|
+
body=payload,
|
|
143
|
+
content_type="application/json",
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
def wait_for_execution(self, request_id: str) -> dict[str, Any]:
|
|
147
|
+
"""Poll while approved/executing with execution not finished."""
|
|
148
|
+
cfg = self._config
|
|
149
|
+
deadline = time.monotonic() + cfg.timeout_seconds
|
|
150
|
+
last_transient = ""
|
|
151
|
+
while time.monotonic() < deadline:
|
|
152
|
+
try:
|
|
153
|
+
data = _as_dict(
|
|
154
|
+
self._req(self._url(f"/requests/{_escape(request_id)}"),
|
|
155
|
+
retries=1,
|
|
156
|
+
),
|
|
157
|
+
"getRequest",
|
|
158
|
+
)
|
|
159
|
+
last_transient = ""
|
|
160
|
+
status = _http.text(data.get("status")).casefold()
|
|
161
|
+
exec_status = _http.text(data.get("execution_status")).casefold()
|
|
162
|
+
if exec_status == "failed":
|
|
163
|
+
raise StackgenError(
|
|
164
|
+
f"request {request_id} execution failed: "
|
|
165
|
+
f"{data.get('execution_result') or 'no detail'}"
|
|
166
|
+
)
|
|
167
|
+
if exec_status == "completed":
|
|
168
|
+
return data
|
|
169
|
+
still_waiting = (
|
|
170
|
+
status in _EXEC_WAIT_STATUS and exec_status in _EXEC_WAIT_EXEC
|
|
171
|
+
)
|
|
172
|
+
if not still_waiting:
|
|
173
|
+
return data
|
|
174
|
+
except StackgenError as err:
|
|
175
|
+
if isinstance(err, HttpError) and _http.is_transient_http_error(err):
|
|
176
|
+
last_transient = _http.http_status_snippet(err)
|
|
177
|
+
else:
|
|
178
|
+
raise
|
|
179
|
+
remaining = deadline - time.monotonic()
|
|
180
|
+
if remaining <= 0:
|
|
181
|
+
break
|
|
182
|
+
time.sleep(min(cfg.poll_interval_seconds, remaining))
|
|
183
|
+
label = f"execution ({last_transient})" if last_transient else "execution"
|
|
184
|
+
raise TimeoutError(label, cfg.timeout_seconds)
|
|
185
|
+
|
|
186
|
+
def approve_and_wait(
|
|
187
|
+
self,
|
|
188
|
+
request_id: str,
|
|
189
|
+
*,
|
|
190
|
+
workflow_name: str | None = None,
|
|
191
|
+
override_reason: str | None = None,
|
|
192
|
+
) -> dict[str, Any]:
|
|
193
|
+
"""Approve a request and wait for the run."""
|
|
194
|
+
self.approve_request(
|
|
195
|
+
request_id,
|
|
196
|
+
workflow_name=workflow_name,
|
|
197
|
+
override_reason=override_reason,
|
|
198
|
+
)
|
|
199
|
+
return self.wait_for_execution(request_id)
|
|
200
|
+
|
|
201
|
+
def defer_request(self, request_id: str) -> Any:
|
|
202
|
+
return self._req(self._url(f"/requests/{_escape(request_id)}/defer"),
|
|
203
|
+
method="POST",
|
|
204
|
+
body=b"{}",
|
|
205
|
+
content_type="application/json",
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
def reopen_request(
|
|
209
|
+
self,
|
|
210
|
+
request_id: str,
|
|
211
|
+
category: str | None = None,
|
|
212
|
+
) -> Any:
|
|
213
|
+
body: dict[str, Any] = {}
|
|
214
|
+
if category is not None:
|
|
215
|
+
body["category"] = category
|
|
216
|
+
payload = json.dumps(body).encode("utf-8")
|
|
217
|
+
return self._req(self._url(f"/requests/{_escape(request_id)}/reopen"),
|
|
218
|
+
method="POST",
|
|
219
|
+
body=payload,
|
|
220
|
+
content_type="application/json",
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
def retriage_request(self, request_id: str) -> Any:
|
|
224
|
+
return self._req(self._url(f"/requests/{_escape(request_id)}/retriage"),
|
|
225
|
+
method="POST",
|
|
226
|
+
body=b"{}",
|
|
227
|
+
content_type="application/json",
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
def stop_triage(self, request_id: str) -> Any:
|
|
231
|
+
return self._req(self._url(f"/requests/{_escape(request_id)}/stop-triage"),
|
|
232
|
+
method="POST",
|
|
233
|
+
body=b"{}",
|
|
234
|
+
content_type="application/json",
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
def post_source_comment(
|
|
238
|
+
self,
|
|
239
|
+
request_id: str,
|
|
240
|
+
body: str | None = None,
|
|
241
|
+
) -> Any:
|
|
242
|
+
"""Post a comment on the upstream ticket (default body when omitted)."""
|
|
243
|
+
payload_obj: dict[str, Any] = {}
|
|
244
|
+
if body is not None:
|
|
245
|
+
payload_obj["body"] = body
|
|
246
|
+
payload = json.dumps(payload_obj).encode("utf-8")
|
|
247
|
+
return self._req(self._url(f"/requests/{_escape(request_id)}/source-comment"),
|
|
248
|
+
method="POST",
|
|
249
|
+
body=payload,
|
|
250
|
+
content_type="application/json",
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
def list_workflows(self) -> Any:
|
|
254
|
+
return self._req(self._url("/workflows"))
|
|
255
|
+
|
|
256
|
+
def suggest_workflow(
|
|
257
|
+
self,
|
|
258
|
+
request_id: str,
|
|
259
|
+
body: dict[str, Any] | None = None,
|
|
260
|
+
) -> Any:
|
|
261
|
+
payload = json.dumps(body or {}).encode("utf-8")
|
|
262
|
+
return self._req(self._url(f"/requests/{_escape(request_id)}/workflow-suggestions"),
|
|
263
|
+
method="POST",
|
|
264
|
+
body=payload,
|
|
265
|
+
content_type="application/json",
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
def create_request_workflow(self, request_id: str, draft: dict[str, Any]) -> Any:
|
|
269
|
+
payload = json.dumps({"draft": draft}).encode("utf-8")
|
|
270
|
+
return self._req(self._url(f"/requests/{_escape(request_id)}/workflows"),
|
|
271
|
+
method="POST",
|
|
272
|
+
body=payload,
|
|
273
|
+
content_type="application/json",
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
def inbox_funnel(self, period: str = "30d", source: str | None = None) -> Any:
|
|
277
|
+
params: dict[str, Any] = {"period": period}
|
|
278
|
+
if source is not None:
|
|
279
|
+
params["source"] = source
|
|
280
|
+
return self._req(self._url("/metrics/funnel", params))
|
|
281
|
+
|
|
282
|
+
def start_workflow_discovery(
|
|
283
|
+
self,
|
|
284
|
+
*,
|
|
285
|
+
window_days: int | None = None,
|
|
286
|
+
ticket_cap: int | None = None,
|
|
287
|
+
apply_inbox_filters: bool | None = None,
|
|
288
|
+
) -> Any:
|
|
289
|
+
"""Start discovery. On 409, return the latest in-progress run."""
|
|
290
|
+
body: dict[str, Any] = {}
|
|
291
|
+
if window_days is not None:
|
|
292
|
+
body["window_days"] = window_days
|
|
293
|
+
if ticket_cap is not None:
|
|
294
|
+
body["ticket_cap"] = ticket_cap
|
|
295
|
+
if apply_inbox_filters is not None:
|
|
296
|
+
body["apply_inbox_filters"] = apply_inbox_filters
|
|
297
|
+
payload = json.dumps(body).encode("utf-8")
|
|
298
|
+
try:
|
|
299
|
+
return self._req(self._url("/discovery/runs"),
|
|
300
|
+
method="POST",
|
|
301
|
+
body=payload,
|
|
302
|
+
content_type="application/json",
|
|
303
|
+
)
|
|
304
|
+
except HttpError as err:
|
|
305
|
+
if err.status_code != 409:
|
|
306
|
+
raise
|
|
307
|
+
return self.latest_workflow_discovery()
|
|
308
|
+
|
|
309
|
+
def latest_workflow_discovery(self) -> Any:
|
|
310
|
+
return self._req(self._url("/discovery/runs/latest"),
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
def wait_for_workflow_discovery(self) -> dict[str, Any]:
|
|
314
|
+
"""Poll the latest discovery run while status is running."""
|
|
315
|
+
cfg = self._config
|
|
316
|
+
deadline = time.monotonic() + cfg.timeout_seconds
|
|
317
|
+
last_transient = ""
|
|
318
|
+
while time.monotonic() < deadline:
|
|
319
|
+
try:
|
|
320
|
+
data = _as_dict(
|
|
321
|
+
self._req(self._url("/discovery/runs/latest"),
|
|
322
|
+
retries=1,
|
|
323
|
+
),
|
|
324
|
+
"getLatestWorkflowDiscovery",
|
|
325
|
+
)
|
|
326
|
+
last_transient = ""
|
|
327
|
+
status = _http.text(data.get("status")).casefold()
|
|
328
|
+
if status == "ready":
|
|
329
|
+
return data
|
|
330
|
+
if status == "failed":
|
|
331
|
+
raise StackgenError(
|
|
332
|
+
f"workflow discovery failed: {data.get('error') or 'no detail'}"
|
|
333
|
+
)
|
|
334
|
+
except StackgenError as err:
|
|
335
|
+
if isinstance(err, HttpError) and _http.is_transient_http_error(err):
|
|
336
|
+
last_transient = _http.http_status_snippet(err)
|
|
337
|
+
else:
|
|
338
|
+
raise
|
|
339
|
+
remaining = deadline - time.monotonic()
|
|
340
|
+
if remaining <= 0:
|
|
341
|
+
break
|
|
342
|
+
time.sleep(min(cfg.poll_interval_seconds, remaining))
|
|
343
|
+
label = (
|
|
344
|
+
f"workflow discovery ({last_transient})"
|
|
345
|
+
if last_transient
|
|
346
|
+
else "workflow discovery"
|
|
347
|
+
)
|
|
348
|
+
raise TimeoutError(label, cfg.timeout_seconds)
|
|
349
|
+
|
|
350
|
+
def create_discovered_workflow(
|
|
351
|
+
self,
|
|
352
|
+
run_id: str,
|
|
353
|
+
class_id: str,
|
|
354
|
+
draft: dict[str, Any],
|
|
355
|
+
) -> Any:
|
|
356
|
+
payload = json.dumps({"draft": draft}).encode("utf-8")
|
|
357
|
+
return self._req(
|
|
358
|
+
self._url(
|
|
359
|
+
f"/discovery/runs/{_escape(run_id)}/classes/{_escape(class_id)}/workflow"
|
|
360
|
+
),
|
|
361
|
+
method="POST",
|
|
362
|
+
body=payload,
|
|
363
|
+
content_type="application/json",
|
|
364
|
+
)
|
|
365
|
+
|
|
366
|
+
def dismiss_discovery_class(self, run_id: str, class_id: str) -> Any:
|
|
367
|
+
return self._req(
|
|
368
|
+
self._url(
|
|
369
|
+
f"/discovery/runs/{_escape(run_id)}/classes/{_escape(class_id)}/dismiss"
|
|
370
|
+
),
|
|
371
|
+
method="POST",
|
|
372
|
+
body=b"{}",
|
|
373
|
+
content_type="application/json",
|
|
374
|
+
)
|