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.
Files changed (257) hide show
  1. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/PKG-INFO +1 -1
  2. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/_http.py +21 -2
  3. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/_version.py +2 -2
  4. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/ask.py +38 -21
  5. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/sessions.py +23 -6
  6. stackgen_sdk-0.4.0rc7/src/stackgen/aiden/subscribe.py +174 -0
  7. stackgen_sdk-0.4.0rc5/src/stackgen/aiden/subscribe.py +0 -87
  8. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/.gitignore +0 -0
  9. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/README.md +0 -0
  10. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/pyproject.toml +0 -0
  11. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/__init__.py +0 -0
  12. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/__init__.py +0 -0
  13. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/audit.py +0 -0
  14. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/models.py +0 -0
  15. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/namespace.py +0 -0
  16. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/resources.py +0 -0
  17. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/run_status.py +0 -0
  18. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/runs.py +0 -0
  19. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/steer.py +0 -0
  20. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/webhook.py +0 -0
  21. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/webhook_ops.py +0 -0
  22. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/workflow_builder.py +0 -0
  23. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/aiden/workflow_publish.py +0 -0
  24. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/cli.py +0 -0
  25. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/client.py +0 -0
  26. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/config.py +0 -0
  27. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/errors.py +0 -0
  28. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/.openapi-generator/FILES +0 -0
  29. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/.openapi-generator/VERSION +0 -0
  30. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/.openapi-generator-ignore +0 -0
  31. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/__init__.py +0 -0
  32. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/api/__init__.py +0 -0
  33. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/api/aiden_api.py +0 -0
  34. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/api/sre_api.py +0 -0
  35. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/api_client.py +0 -0
  36. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/api_response.py +0 -0
  37. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/configuration.py +0 -0
  38. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/exceptions.py +0 -0
  39. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/__init__.py +0 -0
  40. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/activate_break_glass_request.py +0 -0
  41. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_app_mcp_binding.py +0 -0
  42. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_health_check.py +0 -0
  43. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_health_response.py +0 -0
  44. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_info.py +0 -0
  45. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_lifecycle_status.py +0 -0
  46. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_model_config.py +0 -0
  47. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_schedule.py +0 -0
  48. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/agent_status.py +0 -0
  49. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_analysis_status.py +0 -0
  50. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_attention.py +0 -0
  51. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_categorization_summary.py +0 -0
  52. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_role.py +0 -0
  53. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_sort_by.py +0 -0
  54. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_status.py +0 -0
  55. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_summary.py +0 -0
  56. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_sync_run_status.py +0 -0
  57. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/alert_v1.py +0 -0
  58. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/approval_item.py +0 -0
  59. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/artifact_info.py +0 -0
  60. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/ask_execution_mode.py +0 -0
  61. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/ask_guild_request.py +0 -0
  62. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/ask_guild_route_decision.py +0 -0
  63. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/ask_guild_route_response.py +0 -0
  64. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/ask_guild_start_response.py +0 -0
  65. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/attach_policy_request.py +0 -0
  66. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/audit_event.py +0 -0
  67. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/audit_event_list_response.py +0 -0
  68. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/audit_facets.py +0 -0
  69. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/auto_approve_tool_rule.py +0 -0
  70. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/autonomy_budget_config.py +0 -0
  71. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/autonomy_budget_snapshot.py +0 -0
  72. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/autonomy_budget_tier.py +0 -0
  73. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/autonomy_budget_tier_reason.py +0 -0
  74. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/break_glass_state.py +0 -0
  75. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/candidate_type.py +0 -0
  76. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/chat_channel_selector.py +0 -0
  77. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/chat_subscription.py +0 -0
  78. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/chat_subscription_list_response.py +0 -0
  79. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/chat_subscription_target_type.py +0 -0
  80. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/chat_subscription_trigger_type.py +0 -0
  81. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/combining_algorithm.py +0 -0
  82. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/combining_algorithm_request.py +0 -0
  83. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/container_image.py +0 -0
  84. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/cost_band.py +0 -0
  85. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_chat_subscription_request.py +0 -0
  86. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_document_request.py +0 -0
  87. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_knowledge_base_request.py +0 -0
  88. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_policy_request.py +0 -0
  89. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_remote_runner_request.py +0 -0
  90. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_remote_runner_response.py +0 -0
  91. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_schedule_request.py +0 -0
  92. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_skill_companion_file.py +0 -0
  93. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_skill_request.py +0 -0
  94. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/create_webhook_request.py +0 -0
  95. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/dag_edge.py +0 -0
  96. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/dag_node.py +0 -0
  97. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/diary_compression.py +0 -0
  98. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/diary_config.py +0 -0
  99. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/discovered_tool.py +0 -0
  100. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/document_ingest_status.py +0 -0
  101. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/document_ingest_workflow_status.py +0 -0
  102. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/document_processing_status.py +0 -0
  103. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/duration_band.py +0 -0
  104. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/entity_ref.py +0 -0
  105. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/error_response.py +0 -0
  106. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/eval_config.py +0 -0
  107. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/evaluate_policy_request.py +0 -0
  108. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/evaluate_policy_response.py +0 -0
  109. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/execution_list_item.py +0 -0
  110. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/execution_meta.py +0 -0
  111. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/execution_structured_output.py +0 -0
  112. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/execution_tool_call.py +0 -0
  113. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/execution_tool_call_list.py +0 -0
  114. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/fork_session_request.py +0 -0
  115. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/git_config.py +0 -0
  116. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/guild_integration.py +0 -0
  117. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/guild_json_error.py +0 -0
  118. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/guild_platform_config.py +0 -0
  119. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/hal_guard_config.py +0 -0
  120. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/health_check_status.py +0 -0
  121. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/hitl_config.py +0 -0
  122. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/ingested_document.py +0 -0
  123. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/ingested_document1.py +0 -0
  124. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/integration_availability_reason.py +0 -0
  125. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/integration_availability_status.py +0 -0
  126. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/integration_mcp_auth_promotion.py +0 -0
  127. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/integration_remote_runner.py +0 -0
  128. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/integration_scope.py +0 -0
  129. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/integration_sidecar_launch.py +0 -0
  130. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/integration_test_result.py +0 -0
  131. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/integration_type_info.py +0 -0
  132. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigate_alert_request.py +0 -0
  133. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigate_response.py +0 -0
  134. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation.py +0 -0
  135. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_evidence.py +0 -0
  136. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_evidence_kind.py +0 -0
  137. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_evidence_source.py +0 -0
  138. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_hypothesis.py +0 -0
  139. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_plain_summary.py +0 -0
  140. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_prior_incident.py +0 -0
  141. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_recommended_next_step.py +0 -0
  142. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_ref.py +0 -0
  143. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_status.py +0 -0
  144. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_structured_hypothesis_entry.py +0 -0
  145. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_structured_limitation_entry.py +0 -0
  146. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_structured_rca.py +0 -0
  147. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/investigation_triage_metadata.py +0 -0
  148. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/knowledge_base.py +0 -0
  149. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/knowledge_config.py +0 -0
  150. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/knowledge_item.py +0 -0
  151. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/knowledge_item_backend.py +0 -0
  152. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/knowledge_item_operation.py +0 -0
  153. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/knowledge_type.py +0 -0
  154. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/list_alerts_response.py +0 -0
  155. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/list_investigations_response.py +0 -0
  156. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/list_remote_runner_tasks_response.py +0 -0
  157. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/list_remote_runners_response.py +0 -0
  158. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/llm_provider_type.py +0 -0
  159. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config.py +0 -0
  160. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_circuit_breaker.py +0 -0
  161. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_concurrency.py +0 -0
  162. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_context_mode.py +0 -0
  163. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_context_mode_per_tool_value.py +0 -0
  164. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_metrics.py +0 -0
  165. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_rate_limit.py +0 -0
  166. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_retry.py +0 -0
  167. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_sanitize.py +0 -0
  168. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_timeout.py +0 -0
  169. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_tracing.py +0 -0
  170. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/middleware_config_validation.py +0 -0
  171. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/model_pricing.py +0 -0
  172. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/model_provider_config.py +0 -0
  173. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/navigation_mode.py +0 -0
  174. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/pagination.py +0 -0
  175. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/persona_variant_config.py +0 -0
  176. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/pii_redaction_config.py +0 -0
  177. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/pii_regex_rule.py +0 -0
  178. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy.py +0 -0
  179. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_evaluation_input.py +0 -0
  180. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_evaluation_input_agent.py +0 -0
  181. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_evaluation_input_approver.py +0 -0
  182. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_evaluation_input_environment.py +0 -0
  183. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_evaluation_input_principal.py +0 -0
  184. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_evaluation_input_project_membership.py +0 -0
  185. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_evaluation_input_requester.py +0 -0
  186. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_evaluation_input_tool.py +0 -0
  187. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_evaluation_outcome.py +0 -0
  188. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/policy_type.py +0 -0
  189. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/qualified_candidate.py +0 -0
  190. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/rca_config.py +0 -0
  191. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/reasoning_effort_setting.py +0 -0
  192. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/register_agent_request.py +0 -0
  193. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/registered_model.py +0 -0
  194. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/remote_runner_info.py +0 -0
  195. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/remote_runner_task_info.py +0 -0
  196. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/resolve_approval_request.py +0 -0
  197. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/run_workflow_request.py +0 -0
  198. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/run_workflow_response.py +0 -0
  199. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/runbook_config.py +0 -0
  200. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/runner_capability.py +0 -0
  201. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/runner_status.py +0 -0
  202. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/scan_finding.py +0 -0
  203. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/schedule_history.py +0 -0
  204. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/schedule_run_list_response.py +0 -0
  205. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/schedule_run_status.py +0 -0
  206. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/schedule_source.py +0 -0
  207. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/schedule_target_type.py +0 -0
  208. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/session.py +0 -0
  209. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/session_activity_status.py +0 -0
  210. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/session_export.py +0 -0
  211. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/session_export_part.py +0 -0
  212. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/session_export_part_kind.py +0 -0
  213. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/session_list_response.py +0 -0
  214. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/session_responder_kind.py +0 -0
  215. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/session_summary.py +0 -0
  216. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/sidecar_health_probes.py +0 -0
  217. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/signal_severity.py +0 -0
  218. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/skill.py +0 -0
  219. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/skill_file.py +0 -0
  220. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/skill_summary.py +0 -0
  221. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/stage_binding.py +0 -0
  222. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/stage_expectation.py +0 -0
  223. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/start_ask_guild200_response.py +0 -0
  224. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/start_chat_json_body.py +0 -0
  225. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/start_chat_response.py +0 -0
  226. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/subagent_spawn_contract.py +0 -0
  227. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/sync_response.py +0 -0
  228. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/task_error_category.py +0 -0
  229. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/task_status.py +0 -0
  230. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/terminate_session_response.py +0 -0
  231. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/toggle_chat_subscription_request.py +0 -0
  232. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/trace_dag_response.py +0 -0
  233. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/trigger_schedule202_response.py +0 -0
  234. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/trigger_webhook202_response.py +0 -0
  235. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/update_agent_request.py +0 -0
  236. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/update_chat_subscription_request.py +0 -0
  237. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/upsert_integration_request.py +0 -0
  238. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/version_status.py +0 -0
  239. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/webhook.py +0 -0
  240. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/webhook_run.py +0 -0
  241. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/webhook_run_detail.py +0 -0
  242. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/webhook_run_list_response.py +0 -0
  243. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow.py +0 -0
  244. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow_metadata.py +0 -0
  245. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow_output_contract.py +0 -0
  246. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow_run_expectations.py +0 -0
  247. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow_stage.py +0 -0
  248. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow_tool_middleware.py +0 -0
  249. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow_tool_middleware_circuit_breaker.py +0 -0
  250. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow_tool_middleware_concurrency.py +0 -0
  251. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow_trigger.py +0 -0
  252. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/models/workflow_trigger_type.py +0 -0
  253. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/generated/rest.py +0 -0
  254. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/sre/__init__.py +0 -0
  255. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/sre/namespace.py +0 -0
  256. {stackgen_sdk-0.4.0rc5 → stackgen_sdk-0.4.0rc7}/src/stackgen/vault/__init__.py +0 -0
  257. {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.0rc5
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
- _RETRYABLE = {429, 502, 503, 504}
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 in _RETRYABLE and attempt < retries:
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.0rc5'
22
- __version_tuple__ = version_tuple = (0, 4, 0, 'rc5')
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
- data = _http.request(url, cfg.api_token)
155
- if not isinstance(data, dict):
156
- raise StackgenError(f"unexpected getExecutionTrace payload: {data!r}")
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"execution {trace_id} ended with status {status.value}"
162
+ f"unexpected getExecutionTrace payload: {data!r}"
172
163
  )
173
- return data
174
- time.sleep(cfg.poll_interval_seconds)
175
- raise TimeoutError("execution", cfg.timeout_seconds)
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
- artifacts = _http.as_list(_http.request(url, config.api_token))
28
- if any(_http.text(item.get("name")).casefold() == want for item in artifacts):
29
- return artifacts
30
- time.sleep(config.poll_interval_seconds)
31
- raise TimeoutError(artifact_name, config.timeout_seconds)
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
- )