stackgen-sdk 0.4.0rc5__tar.gz → 0.4.0rc7__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.0rc5 → stackgen_sdk-0.4.0rc7}/PKG-INFO +1 -1
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/_http.py +21 -2
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/_version.py +2 -2
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/ask.py +38 -21
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/sessions.py +23 -6
- stackgen_sdk-0.4.0rc7/src/stackgen/aiden/subscribe.py +174 -0
- stackgen_sdk-0.4.0rc5/src/stackgen/aiden/subscribe.py +0 -87
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/.gitignore +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/README.md +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/pyproject.toml +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/__init__.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/__init__.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/audit.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/models.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/namespace.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/resources.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/run_status.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/runs.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/steer.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/webhook.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/webhook_ops.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/workflow_builder.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/workflow_publish.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/cli.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/client.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/config.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/errors.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/.openapi-generator/FILES +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/.openapi-generator/VERSION +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/.openapi-generator-ignore +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/__init__.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/api/__init__.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/api/aiden_api.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/api/sre_api.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/api_client.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/api_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/configuration.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/exceptions.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/__init__.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/activate_break_glass_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_app_mcp_binding.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_health_check.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_health_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_info.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_lifecycle_status.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_model_config.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_schedule.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_status.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_analysis_status.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_attention.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_categorization_summary.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_role.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_sort_by.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_status.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_summary.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_sync_run_status.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_v1.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/approval_item.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/artifact_info.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/ask_execution_mode.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/ask_guild_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/ask_guild_route_decision.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/ask_guild_route_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/ask_guild_start_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/attach_policy_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/audit_event.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/audit_event_list_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/audit_facets.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/auto_approve_tool_rule.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/autonomy_budget_config.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/autonomy_budget_snapshot.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/autonomy_budget_tier.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/autonomy_budget_tier_reason.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/break_glass_state.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/candidate_type.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/chat_channel_selector.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/chat_subscription.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/chat_subscription_list_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/chat_subscription_target_type.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/chat_subscription_trigger_type.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/combining_algorithm.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/combining_algorithm_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/container_image.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/cost_band.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_chat_subscription_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_document_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_knowledge_base_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_policy_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_remote_runner_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_remote_runner_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_schedule_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_skill_companion_file.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_skill_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_webhook_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/dag_edge.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/dag_node.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/diary_compression.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/diary_config.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/discovered_tool.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/document_ingest_status.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/document_ingest_workflow_status.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/document_processing_status.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/duration_band.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/entity_ref.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/error_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/eval_config.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/evaluate_policy_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/evaluate_policy_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/execution_list_item.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/execution_meta.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/execution_structured_output.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/execution_tool_call.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/execution_tool_call_list.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/fork_session_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/git_config.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/guild_integration.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/guild_json_error.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/guild_platform_config.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/hal_guard_config.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/health_check_status.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/hitl_config.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/ingested_document.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/ingested_document1.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/integration_availability_reason.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/integration_availability_status.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/integration_mcp_auth_promotion.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/integration_remote_runner.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/integration_scope.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/integration_sidecar_launch.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/integration_test_result.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/integration_type_info.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigate_alert_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigate_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_evidence.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_evidence_kind.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_evidence_source.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_hypothesis.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_plain_summary.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_prior_incident.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_recommended_next_step.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_ref.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_status.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_structured_hypothesis_entry.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_structured_limitation_entry.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_structured_rca.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_triage_metadata.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/knowledge_base.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/knowledge_config.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/knowledge_item.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/knowledge_item_backend.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/knowledge_item_operation.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/knowledge_type.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/list_alerts_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/list_investigations_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/list_remote_runner_tasks_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/list_remote_runners_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/llm_provider_type.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_circuit_breaker.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_concurrency.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_context_mode.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_context_mode_per_tool_value.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_metrics.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_rate_limit.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_retry.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_sanitize.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_timeout.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_tracing.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_validation.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/model_pricing.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/model_provider_config.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/navigation_mode.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/pagination.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/persona_variant_config.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/pii_redaction_config.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/pii_regex_rule.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_evaluation_input.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_evaluation_input_agent.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_evaluation_input_approver.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_evaluation_input_environment.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_evaluation_input_principal.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_evaluation_input_project_membership.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_evaluation_input_requester.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_evaluation_input_tool.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_evaluation_outcome.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_type.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/qualified_candidate.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/rca_config.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/reasoning_effort_setting.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/register_agent_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/registered_model.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/remote_runner_info.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/remote_runner_task_info.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/resolve_approval_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/run_workflow_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/run_workflow_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/runbook_config.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/runner_capability.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/runner_status.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/scan_finding.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/schedule_history.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/schedule_run_list_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/schedule_run_status.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/schedule_source.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/schedule_target_type.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/session.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/session_activity_status.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/session_export.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/session_export_part.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/session_export_part_kind.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/session_list_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/session_responder_kind.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/session_summary.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/sidecar_health_probes.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/signal_severity.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/skill.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/skill_file.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/skill_summary.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/stage_binding.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/stage_expectation.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/start_ask_guild200_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/start_chat_json_body.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/start_chat_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/subagent_spawn_contract.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/sync_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/task_error_category.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/task_status.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/terminate_session_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/toggle_chat_subscription_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/trace_dag_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/trigger_schedule202_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/trigger_webhook202_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/update_agent_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/update_chat_subscription_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/upsert_integration_request.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/version_status.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/webhook.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/webhook_run.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/webhook_run_detail.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/webhook_run_list_response.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow_metadata.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow_output_contract.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow_run_expectations.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow_stage.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow_tool_middleware.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow_tool_middleware_circuit_breaker.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow_tool_middleware_concurrency.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow_trigger.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow_trigger_type.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/rest.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/sre/__init__.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/sre/namespace.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/vault/__init__.py +0 -0
- {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/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.0rc7
|
|
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/
|
|
@@ -12,7 +12,26 @@ from typing import Any, Callable
|
|
|
12
12
|
|
|
13
13
|
from stackgen.errors import HttpError, TimeoutError
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
|
|
16
|
+
def is_retryable_http_status(status: int) -> bool:
|
|
17
|
+
"""GET statuses that self-heal: rate limit and any 5xx (rollout blips, gateway errors)."""
|
|
18
|
+
return status == 429 or 500 <= status <= 599
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def is_transient_http_error(err: BaseException) -> bool:
|
|
22
|
+
"""True for retryable HTTP statuses and transport failures wrapped as HttpError."""
|
|
23
|
+
if not isinstance(err, HttpError):
|
|
24
|
+
return False
|
|
25
|
+
if err.status_code is None:
|
|
26
|
+
return True
|
|
27
|
+
return is_retryable_http_status(err.status_code)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def http_status_snippet(err: BaseException | None) -> str:
|
|
31
|
+
"""Label fragment for TimeoutError / subscribe snippets."""
|
|
32
|
+
if isinstance(err, HttpError) and err.status_code is not None:
|
|
33
|
+
return f"status={err.status_code}"
|
|
34
|
+
return "status=network_error"
|
|
16
35
|
|
|
17
36
|
|
|
18
37
|
def query(org_id: str) -> str:
|
|
@@ -50,7 +69,7 @@ def request(
|
|
|
50
69
|
return json.loads(raw.decode("utf-8"))
|
|
51
70
|
except urllib.error.HTTPError as err:
|
|
52
71
|
detail = err.read().decode("utf-8", errors="replace")
|
|
53
|
-
if method == "GET" and err.code
|
|
72
|
+
if method == "GET" and is_retryable_http_status(err.code) and attempt < retries:
|
|
54
73
|
time.sleep(min(2**attempt, 8))
|
|
55
74
|
continue
|
|
56
75
|
raise HttpError(
|
|
@@ -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.0rc7'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 4, 0, 'rc7')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -12,7 +12,7 @@ from stackgen import _http
|
|
|
12
12
|
from stackgen.aiden import sessions as session_helpers
|
|
13
13
|
from stackgen.aiden.run_status import ExecutionStatus
|
|
14
14
|
from stackgen.config import StackgenConfig
|
|
15
|
-
from stackgen.errors import StackgenError, TimeoutError
|
|
15
|
+
from stackgen.errors import HttpError, StackgenError, TimeoutError
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
@dataclass(frozen=True)
|
|
@@ -150,26 +150,43 @@ class AskArtifactJourney:
|
|
|
150
150
|
f"{cfg.aiden_url()}/api/v1/executions/{trace_id}"
|
|
151
151
|
f"{_http.query(cfg.org_id)}"
|
|
152
152
|
)
|
|
153
|
+
# One attempt per tick: the poll loop owns the deadline. Inner GET
|
|
154
|
+
# backoff would burn a short CI budget. 5xx / 429 / network blips
|
|
155
|
+
# retry on the next tick; 4xx fails immediately.
|
|
156
|
+
last_transient = ""
|
|
153
157
|
while time.monotonic() < deadline:
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
execution = data.get("execution") or {}
|
|
158
|
-
status = ExecutionStatus.parse(_http.text(execution.get("status")))
|
|
159
|
-
# Prefer explicit settle when the mothership sends it. Some builds
|
|
160
|
-
# omit trace_settled on the thin getExecutionTrace summary; treat
|
|
161
|
-
# terminal status alone as done so callers are not stuck forever.
|
|
162
|
-
settled = execution.get("trace_settled")
|
|
163
|
-
ready = (
|
|
164
|
-
status is not None
|
|
165
|
-
and status.is_terminal()
|
|
166
|
-
and settled is not False
|
|
167
|
-
)
|
|
168
|
-
if ready:
|
|
169
|
-
if status in {ExecutionStatus.ERROR, ExecutionStatus.FAILED}:
|
|
158
|
+
try:
|
|
159
|
+
data = _http.request(url, cfg.api_token, retries=1)
|
|
160
|
+
if not isinstance(data, dict):
|
|
170
161
|
raise StackgenError(
|
|
171
|
-
f"
|
|
162
|
+
f"unexpected getExecutionTrace payload: {data!r}"
|
|
172
163
|
)
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
164
|
+
last_transient = ""
|
|
165
|
+
execution = data.get("execution") or {}
|
|
166
|
+
status = ExecutionStatus.parse(_http.text(execution.get("status")))
|
|
167
|
+
# Prefer explicit settle when the mothership sends it. Some builds
|
|
168
|
+
# omit trace_settled on the thin getExecutionTrace summary; treat
|
|
169
|
+
# terminal status alone as done so callers are not stuck forever.
|
|
170
|
+
settled = execution.get("trace_settled")
|
|
171
|
+
ready = (
|
|
172
|
+
status is not None
|
|
173
|
+
and status.is_terminal()
|
|
174
|
+
and settled is not False
|
|
175
|
+
)
|
|
176
|
+
if ready:
|
|
177
|
+
if status in {ExecutionStatus.ERROR, ExecutionStatus.FAILED}:
|
|
178
|
+
raise StackgenError(
|
|
179
|
+
f"execution {trace_id} ended with status {status.value}"
|
|
180
|
+
)
|
|
181
|
+
return data
|
|
182
|
+
except StackgenError as err:
|
|
183
|
+
if isinstance(err, HttpError) and _http.is_transient_http_error(err):
|
|
184
|
+
last_transient = _http.http_status_snippet(err)
|
|
185
|
+
else:
|
|
186
|
+
raise
|
|
187
|
+
remaining = deadline - time.monotonic()
|
|
188
|
+
if remaining <= 0:
|
|
189
|
+
break
|
|
190
|
+
time.sleep(min(cfg.poll_interval_seconds, remaining))
|
|
191
|
+
label = f"execution ({last_transient})" if last_transient else "execution"
|
|
192
|
+
raise TimeoutError(label, cfg.timeout_seconds)
|
|
@@ -9,7 +9,7 @@ from typing import Any
|
|
|
9
9
|
|
|
10
10
|
from stackgen import _http
|
|
11
11
|
from stackgen.config import StackgenConfig
|
|
12
|
-
from stackgen.errors import TimeoutError
|
|
12
|
+
from stackgen.errors import HttpError, TimeoutError
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
def wait_for_artifact(
|
|
@@ -23,12 +23,29 @@ def wait_for_artifact(
|
|
|
23
23
|
)
|
|
24
24
|
want = artifact_name.casefold()
|
|
25
25
|
artifacts: list[dict[str, Any]] = []
|
|
26
|
+
last_transient = ""
|
|
26
27
|
while time.monotonic() < deadline:
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
try:
|
|
29
|
+
artifacts = _http.as_list(
|
|
30
|
+
_http.request(url, config.api_token, retries=1)
|
|
31
|
+
)
|
|
32
|
+
last_transient = ""
|
|
33
|
+
if any(
|
|
34
|
+
_http.text(item.get("name")).casefold() == want for item in artifacts
|
|
35
|
+
):
|
|
36
|
+
return artifacts
|
|
37
|
+
except HttpError as err:
|
|
38
|
+
if not _http.is_transient_http_error(err):
|
|
39
|
+
raise
|
|
40
|
+
last_transient = _http.http_status_snippet(err)
|
|
41
|
+
remaining = deadline - time.monotonic()
|
|
42
|
+
if remaining <= 0:
|
|
43
|
+
break
|
|
44
|
+
time.sleep(min(config.poll_interval_seconds, remaining))
|
|
45
|
+
label = (
|
|
46
|
+
f"{artifact_name} ({last_transient})" if last_transient else artifact_name
|
|
47
|
+
)
|
|
48
|
+
raise TimeoutError(label, config.timeout_seconds)
|
|
32
49
|
|
|
33
50
|
|
|
34
51
|
def download_artifact(
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"""SSE subscribeExecution helper."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import time
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from urllib.error import HTTPError, URLError
|
|
8
|
+
from urllib.request import Request, urlopen
|
|
9
|
+
|
|
10
|
+
from stackgen import _http
|
|
11
|
+
from stackgen.aiden.run_status import ExecutionStatus
|
|
12
|
+
from stackgen.config import StackgenConfig
|
|
13
|
+
from stackgen.errors import HttpError, TimeoutError as SdkTimeoutError
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass
|
|
17
|
+
class SubscribeCompleteResult:
|
|
18
|
+
ok: bool
|
|
19
|
+
event_count: int
|
|
20
|
+
raw_snippet: str
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ExecutionSubscribe:
|
|
24
|
+
def __init__(self, config: StackgenConfig) -> None:
|
|
25
|
+
self._config = config
|
|
26
|
+
|
|
27
|
+
def wait_for_complete(
|
|
28
|
+
self, trace_id: str, *, timeout_ms: int = 10 * 60 * 1000
|
|
29
|
+
) -> SubscribeCompleteResult:
|
|
30
|
+
started = time.monotonic()
|
|
31
|
+
url = (
|
|
32
|
+
f"{self._config.aiden_url()}/api/v1/executions/{trace_id}/subscribe"
|
|
33
|
+
+ _http.query(self._config.org_id)
|
|
34
|
+
)
|
|
35
|
+
req = Request(
|
|
36
|
+
url,
|
|
37
|
+
headers={
|
|
38
|
+
"Authorization": f"Bearer {self._config.api_token}",
|
|
39
|
+
"Accept": "text/event-stream",
|
|
40
|
+
},
|
|
41
|
+
method="GET",
|
|
42
|
+
)
|
|
43
|
+
chunks: list[str] = []
|
|
44
|
+
event_count = 0
|
|
45
|
+
ok = False
|
|
46
|
+
try:
|
|
47
|
+
with urlopen(req, timeout=timeout_ms / 1000) as resp: # noqa: S310
|
|
48
|
+
buffer = ""
|
|
49
|
+
while True:
|
|
50
|
+
line = resp.readline()
|
|
51
|
+
if not line:
|
|
52
|
+
break
|
|
53
|
+
buffer += line.decode("utf-8", errors="replace")
|
|
54
|
+
if "\n\n" not in buffer:
|
|
55
|
+
continue
|
|
56
|
+
frames = buffer.split("\n\n")
|
|
57
|
+
buffer = frames.pop()
|
|
58
|
+
for frame in frames:
|
|
59
|
+
if not frame.strip():
|
|
60
|
+
continue
|
|
61
|
+
event_count += 1
|
|
62
|
+
chunks.append(frame[:500])
|
|
63
|
+
lower = frame.lower()
|
|
64
|
+
if "execution_complete" in lower:
|
|
65
|
+
ok = True
|
|
66
|
+
break
|
|
67
|
+
if "subscribe_end" in lower and "error" not in lower:
|
|
68
|
+
ok = True
|
|
69
|
+
if ok:
|
|
70
|
+
break
|
|
71
|
+
except SdkTimeoutError:
|
|
72
|
+
raise
|
|
73
|
+
except TimeoutError as err:
|
|
74
|
+
raise SdkTimeoutError("subscribeExecution", int(timeout_ms / 1000)) from err
|
|
75
|
+
except HTTPError as err:
|
|
76
|
+
detail = err.read().decode("utf-8", errors="replace") if err.fp else ""
|
|
77
|
+
raise HttpError(
|
|
78
|
+
f"subscribeExecution -> HTTP {err.code}: {detail}",
|
|
79
|
+
status_code=err.code,
|
|
80
|
+
) from err
|
|
81
|
+
except URLError as err:
|
|
82
|
+
raise HttpError(f"subscribeExecution -> {err}") from err
|
|
83
|
+
|
|
84
|
+
stream_snippet = "\n---\n".join(chunks[-5:])
|
|
85
|
+
if not ok:
|
|
86
|
+
return SubscribeCompleteResult(
|
|
87
|
+
ok=False,
|
|
88
|
+
event_count=event_count,
|
|
89
|
+
raw_snippet=stream_snippet,
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
remaining_ms = timeout_ms - int((time.monotonic() - started) * 1000)
|
|
93
|
+
if remaining_ms <= 100:
|
|
94
|
+
return SubscribeCompleteResult(
|
|
95
|
+
ok=False,
|
|
96
|
+
event_count=event_count,
|
|
97
|
+
raw_snippet="execution status=deadline",
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
confirmed = self._confirm_execution_settled(trace_id, remaining_ms)
|
|
101
|
+
if not confirmed.ok:
|
|
102
|
+
return SubscribeCompleteResult(
|
|
103
|
+
ok=False,
|
|
104
|
+
event_count=event_count,
|
|
105
|
+
raw_snippet=confirmed.raw_snippet,
|
|
106
|
+
)
|
|
107
|
+
return SubscribeCompleteResult(
|
|
108
|
+
ok=True,
|
|
109
|
+
event_count=event_count,
|
|
110
|
+
raw_snippet=stream_snippet or "successful run terminal",
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
def _confirm_execution_settled(
|
|
114
|
+
self, trace_id: str, timeout_ms: int
|
|
115
|
+
) -> SubscribeCompleteResult:
|
|
116
|
+
"""Poll GET /executions/{traceId} until settled inside the remaining deadline."""
|
|
117
|
+
deadline = time.monotonic() + timeout_ms / 1000
|
|
118
|
+
url = (
|
|
119
|
+
f"{self._config.aiden_url()}/api/v1/executions/{trace_id}"
|
|
120
|
+
f"{_http.query(self._config.org_id)}"
|
|
121
|
+
)
|
|
122
|
+
poll_interval = self._config.poll_interval_seconds
|
|
123
|
+
last_transient = ""
|
|
124
|
+
while time.monotonic() < deadline:
|
|
125
|
+
try:
|
|
126
|
+
data = _http.request(url, self._config.api_token, retries=1)
|
|
127
|
+
if not isinstance(data, dict):
|
|
128
|
+
last_transient = "execution status=invalid_payload"
|
|
129
|
+
else:
|
|
130
|
+
last_transient = ""
|
|
131
|
+
execution = data.get("execution") or {}
|
|
132
|
+
status = ExecutionStatus.parse(
|
|
133
|
+
_http.text(execution.get("status"))
|
|
134
|
+
)
|
|
135
|
+
settled = execution.get("trace_settled")
|
|
136
|
+
ready = (
|
|
137
|
+
status is not None
|
|
138
|
+
and status.is_terminal()
|
|
139
|
+
and settled is not False
|
|
140
|
+
)
|
|
141
|
+
if ready:
|
|
142
|
+
if status in {
|
|
143
|
+
ExecutionStatus.ERROR,
|
|
144
|
+
ExecutionStatus.FAILED,
|
|
145
|
+
ExecutionStatus.CANCELLED,
|
|
146
|
+
}:
|
|
147
|
+
return SubscribeCompleteResult(
|
|
148
|
+
ok=False,
|
|
149
|
+
event_count=0,
|
|
150
|
+
raw_snippet=f"execution status={status.value}",
|
|
151
|
+
)
|
|
152
|
+
return SubscribeCompleteResult(
|
|
153
|
+
ok=True,
|
|
154
|
+
event_count=0,
|
|
155
|
+
raw_snippet="successful run terminal",
|
|
156
|
+
)
|
|
157
|
+
except HttpError as err:
|
|
158
|
+
if not _http.is_transient_http_error(err):
|
|
159
|
+
code = err.status_code if err.status_code is not None else "error"
|
|
160
|
+
return SubscribeCompleteResult(
|
|
161
|
+
ok=False,
|
|
162
|
+
event_count=0,
|
|
163
|
+
raw_snippet=f"execution status={code}",
|
|
164
|
+
)
|
|
165
|
+
last_transient = f"execution {_http.http_status_snippet(err)}"
|
|
166
|
+
remaining = deadline - time.monotonic()
|
|
167
|
+
if remaining <= 0.1:
|
|
168
|
+
break
|
|
169
|
+
time.sleep(min(poll_interval, remaining - 0.1))
|
|
170
|
+
return SubscribeCompleteResult(
|
|
171
|
+
ok=False,
|
|
172
|
+
event_count=0,
|
|
173
|
+
raw_snippet=last_transient or f"subscribe aborted after {timeout_ms}ms",
|
|
174
|
+
)
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
"""SSE subscribeExecution helper."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
from dataclasses import dataclass
|
|
6
|
-
from urllib.error import HTTPError, URLError
|
|
7
|
-
from urllib.request import Request, urlopen
|
|
8
|
-
|
|
9
|
-
from stackgen import _http
|
|
10
|
-
from stackgen.config import StackgenConfig
|
|
11
|
-
from stackgen.errors import HttpError, TimeoutError as SdkTimeoutError
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
@dataclass
|
|
15
|
-
class SubscribeCompleteResult:
|
|
16
|
-
ok: bool
|
|
17
|
-
event_count: int
|
|
18
|
-
raw_snippet: str
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class ExecutionSubscribe:
|
|
22
|
-
def __init__(self, config: StackgenConfig) -> None:
|
|
23
|
-
self._config = config
|
|
24
|
-
|
|
25
|
-
def wait_for_complete(
|
|
26
|
-
self, trace_id: str, *, timeout_ms: int = 10 * 60 * 1000
|
|
27
|
-
) -> SubscribeCompleteResult:
|
|
28
|
-
url = (
|
|
29
|
-
f"{self._config.aiden_url()}/api/v1/executions/{trace_id}/subscribe"
|
|
30
|
-
+ _http.query(self._config.org_id)
|
|
31
|
-
)
|
|
32
|
-
req = Request(
|
|
33
|
-
url,
|
|
34
|
-
headers={
|
|
35
|
-
"Authorization": f"Bearer {self._config.api_token}",
|
|
36
|
-
"Accept": "text/event-stream",
|
|
37
|
-
},
|
|
38
|
-
method="GET",
|
|
39
|
-
)
|
|
40
|
-
chunks: list[str] = []
|
|
41
|
-
event_count = 0
|
|
42
|
-
ok = False
|
|
43
|
-
try:
|
|
44
|
-
with urlopen(req, timeout=timeout_ms / 1000) as resp: # noqa: S310
|
|
45
|
-
buffer = ""
|
|
46
|
-
while True:
|
|
47
|
-
line = resp.readline()
|
|
48
|
-
if not line:
|
|
49
|
-
break
|
|
50
|
-
buffer += line.decode("utf-8", errors="replace")
|
|
51
|
-
if "\n\n" not in buffer:
|
|
52
|
-
continue
|
|
53
|
-
frames = buffer.split("\n\n")
|
|
54
|
-
buffer = frames.pop()
|
|
55
|
-
for frame in frames:
|
|
56
|
-
if not frame.strip():
|
|
57
|
-
continue
|
|
58
|
-
event_count += 1
|
|
59
|
-
chunks.append(frame[:500])
|
|
60
|
-
lower = frame.lower()
|
|
61
|
-
if "execution_complete" in lower:
|
|
62
|
-
ok = True
|
|
63
|
-
return SubscribeCompleteResult(
|
|
64
|
-
ok=True,
|
|
65
|
-
event_count=event_count,
|
|
66
|
-
raw_snippet="\n---\n".join(chunks[-5:]),
|
|
67
|
-
)
|
|
68
|
-
if "subscribe_end" in lower and "error" not in lower:
|
|
69
|
-
ok = True
|
|
70
|
-
except SdkTimeoutError:
|
|
71
|
-
raise
|
|
72
|
-
except TimeoutError as err:
|
|
73
|
-
raise SdkTimeoutError("subscribeExecution", int(timeout_ms / 1000)) from err
|
|
74
|
-
except HTTPError as err:
|
|
75
|
-
detail = err.read().decode("utf-8", errors="replace") if err.fp else ""
|
|
76
|
-
raise HttpError(
|
|
77
|
-
f"subscribeExecution -> HTTP {err.code}: {detail}",
|
|
78
|
-
status_code=err.code,
|
|
79
|
-
) from err
|
|
80
|
-
except URLError as err:
|
|
81
|
-
raise HttpError(f"subscribeExecution -> {err}") from err
|
|
82
|
-
|
|
83
|
-
return SubscribeCompleteResult(
|
|
84
|
-
ok=ok,
|
|
85
|
-
event_count=event_count,
|
|
86
|
-
raw_snippet="\n---\n".join(chunks[-5:]),
|
|
87
|
-
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/.openapi-generator/FILES
RENAMED
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/.openapi-generator/VERSION
RENAMED
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/.openapi-generator-ignore
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_health_check.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_model_config.py
RENAMED
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_schedule.py
RENAMED
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_status.py
RENAMED
|
File without changes
|
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_attention.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_sort_by.py
RENAMED
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_status.py
RENAMED
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_summary.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/approval_item.py
RENAMED
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/artifact_info.py
RENAMED
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/ask_execution_mode.py
RENAMED
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/ask_guild_request.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/audit_event.py
RENAMED
|
File without changes
|
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/audit_facets.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/break_glass_state.py
RENAMED
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/candidate_type.py
RENAMED
|
File without changes
|
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/chat_subscription.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/combining_algorithm.py
RENAMED
|
File without changes
|
|
File without changes
|
{stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/container_image.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|