stackgen-sdk 0.4.0rc13__tar.gz → 0.4.0rc15__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.0rc13 → stackgen_sdk-0.4.0rc15}/.gitignore +3 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/PKG-INFO +1 -1
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/_version.py +2 -2
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/aiden/ask.py +8 -1
- stackgen_sdk-0.4.0rc15/src/stackgen/aiden/integration_secrets.py +316 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/aiden/namespace.py +79 -4
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/aiden/resources.py +28 -3
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/config.py +2 -2
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/.openapi-generator/FILES +39 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/__init__.py +26 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/api/__init__.py +1 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/api/aiden_api.py +284 -0
- stackgen_sdk-0.4.0rc15/src/stackgen/generated/api/vault_api.py +1747 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/__init__.py +12 -0
- stackgen_sdk-0.4.0rc15/src/stackgen/generated/models/external_secret_reference.py +95 -0
- stackgen_sdk-0.4.0rc15/src/stackgen/generated/models/key_definition_type.py +40 -0
- stackgen_sdk-0.4.0rc15/src/stackgen/generated/models/metadata.py +102 -0
- stackgen_sdk-0.4.0rc15/src/stackgen/generated/models/o_auth_support.py +95 -0
- stackgen_sdk-0.4.0rc15/src/stackgen/generated/models/owner_type.py +41 -0
- stackgen_sdk-0.4.0rc15/src/stackgen/generated/models/runtime_approval_binding.py +110 -0
- stackgen_sdk-0.4.0rc15/src/stackgen/generated/models/runtime_approval_item.py +164 -0
- stackgen_sdk-0.4.0rc15/src/stackgen/generated/models/secret.py +149 -0
- stackgen_sdk-0.4.0rc15/src/stackgen/generated/models/secret_sub_category.py +110 -0
- stackgen_sdk-0.4.0rc15/src/stackgen/generated/models/supported_formats.py +115 -0
- stackgen_sdk-0.4.0rc15/src/stackgen/generated/models/supported_formats_keys_inner.py +102 -0
- stackgen_sdk-0.4.0rc15/src/stackgen/generated/models/update_secret_by_id_request.py +113 -0
- stackgen_sdk-0.4.0rc15/src/stackgen/vault/__init__.py +17 -0
- stackgen_sdk-0.4.0rc15/src/stackgen/vault/metadata.py +152 -0
- stackgen_sdk-0.4.0rc15/src/stackgen/vault/namespace.py +227 -0
- stackgen_sdk-0.4.0rc13/src/stackgen/vault/__init__.py +0 -5
- stackgen_sdk-0.4.0rc13/src/stackgen/vault/namespace.py +0 -17
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/README.md +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/pyproject.toml +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/__init__.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/_http.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/aiden/__init__.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/aiden/audit.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/aiden/models.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/aiden/run_status.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/aiden/runs.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/aiden/sessions.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/aiden/steer.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/aiden/subscribe.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/aiden/subscribe_frames.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/aiden/transient.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/aiden/webhook.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/aiden/webhook_ops.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/aiden/workflow_builder.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/aiden/workflow_publish.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/cli.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/client.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/errors.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/.openapi-generator/VERSION +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/.openapi-generator-ignore +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/api/sre_api.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/api_client.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/api_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/configuration.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/exceptions.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/activate_break_glass_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/agent_app_mcp_binding.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/agent_health_check.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/agent_health_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/agent_info.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/agent_lifecycle_status.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/agent_model_config.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/agent_schedule.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/agent_status.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/alert_analysis_status.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/alert_attention.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/alert_categorization_summary.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/alert_role.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/alert_sort_by.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/alert_status.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/alert_summary.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/alert_sync_run_status.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/alert_v1.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/approval_item.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/artifact_info.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/ask_execution_mode.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/ask_guild_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/ask_guild_route_decision.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/ask_guild_route_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/ask_guild_start_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/attach_policy_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/audit_event.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/audit_event_list_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/audit_facets.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/auto_approve_tool_rule.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/autonomy_budget_config.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/autonomy_budget_snapshot.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/autonomy_budget_tier.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/autonomy_budget_tier_reason.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/break_glass_state.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/candidate_type.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/chat_channel_selector.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/chat_subscription.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/chat_subscription_list_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/chat_subscription_target_type.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/chat_subscription_trigger_type.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/combining_algorithm.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/combining_algorithm_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/container_image.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/cost_band.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/create_chat_subscription_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/create_document_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/create_knowledge_base_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/create_policy_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/create_remote_runner_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/create_remote_runner_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/create_schedule_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/create_skill_companion_file.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/create_skill_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/create_webhook_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/dag_edge.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/dag_node.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/diary_compression.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/diary_config.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/discovered_tool.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/document_ingest_status.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/document_ingest_workflow_status.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/document_processing_status.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/duration_band.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/entity_ref.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/error_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/eval_config.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/evaluate_policy_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/evaluate_policy_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/execution_list_item.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/execution_meta.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/execution_structured_output.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/execution_tool_call.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/execution_tool_call_list.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/fork_session_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/git_config.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/guild_integration.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/guild_json_error.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/guild_platform_config.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/hal_guard_config.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/health_check_status.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/hitl_config.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/ingested_document.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/ingested_document1.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/integration_availability_reason.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/integration_availability_status.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/integration_mcp_auth_promotion.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/integration_remote_runner.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/integration_scope.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/integration_sidecar_launch.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/integration_test_result.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/integration_type_info.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/investigate_alert_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/investigate_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/investigation.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/investigation_evidence.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/investigation_evidence_kind.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/investigation_evidence_source.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/investigation_hypothesis.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/investigation_plain_summary.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/investigation_prior_incident.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/investigation_recommended_next_step.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/investigation_ref.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/investigation_status.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/investigation_structured_hypothesis_entry.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/investigation_structured_limitation_entry.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/investigation_structured_rca.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/investigation_triage_metadata.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/judge_execution_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/knowledge_base.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/knowledge_config.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/knowledge_item.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/knowledge_item_backend.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/knowledge_item_operation.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/knowledge_type.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/list_alerts_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/list_investigations_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/list_remote_runner_tasks_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/list_remote_runners_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/llm_provider_type.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/middleware_config.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/middleware_config_circuit_breaker.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/middleware_config_concurrency.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/middleware_config_context_mode.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/middleware_config_context_mode_per_tool_value.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/middleware_config_metrics.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/middleware_config_rate_limit.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/middleware_config_retry.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/middleware_config_sanitize.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/middleware_config_timeout.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/middleware_config_tracing.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/middleware_config_validation.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/model_pricing.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/model_provider_config.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/navigation_mode.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/pagination.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/persona_variant_config.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/pii_redaction_config.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/pii_regex_rule.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/policy.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/policy_evaluation_input.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/policy_evaluation_input_agent.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/policy_evaluation_input_approver.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/policy_evaluation_input_environment.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/policy_evaluation_input_principal.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/policy_evaluation_input_project_membership.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/policy_evaluation_input_requester.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/policy_evaluation_input_tool.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/policy_evaluation_outcome.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/policy_type.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/qualified_candidate.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/rca_config.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/reasoning_effort_setting.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/register_agent_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/registered_model.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/remote_runner_info.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/remote_runner_task_info.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/resolve_approval_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/run_workflow_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/run_workflow_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/runbook_config.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/runner_capability.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/runner_status.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/scan_finding.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/schedule_history.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/schedule_run_list_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/schedule_run_status.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/schedule_source.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/schedule_target_type.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/session.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/session_activity_status.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/session_export.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/session_export_part.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/session_export_part_kind.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/session_list_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/session_responder_kind.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/session_summary.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/sidecar_health_probes.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/signal_severity.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/skill.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/skill_file.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/skill_summary.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/stage_binding.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/stage_expectation.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/start_ask_guild200_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/start_chat_json_body.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/start_chat_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/subagent_spawn_contract.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/sync_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/task_error_category.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/task_status.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/terminate_session_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/toggle_chat_subscription_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/trace_dag_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/trigger_schedule202_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/trigger_webhook202_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/update_agent_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/update_chat_subscription_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/upsert_integration_request.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/version_status.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/webhook.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/webhook_run.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/webhook_run_detail.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/webhook_run_list_response.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/workflow.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/workflow_metadata.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/workflow_output_contract.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/workflow_run_expectations.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/workflow_stage.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/workflow_tool_middleware.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/workflow_tool_middleware_circuit_breaker.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/workflow_tool_middleware_concurrency.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/workflow_trigger.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/models/workflow_trigger_type.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/generated/rest.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/logging.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/orgs/__init__.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/orgs/namespace.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/sre/__init__.py +0 -0
- {stackgen_sdk-0.4.0rc13 → stackgen_sdk-0.4.0rc15}/src/stackgen/sre/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.0rc15
|
|
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/
|
|
@@ -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.0rc15'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 4, 0, 'rc15')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -6,7 +6,7 @@ import json
|
|
|
6
6
|
import time
|
|
7
7
|
from dataclasses import dataclass
|
|
8
8
|
from pathlib import Path
|
|
9
|
-
from typing import Any
|
|
9
|
+
from typing import Any, Literal
|
|
10
10
|
|
|
11
11
|
from stackgen import _http
|
|
12
12
|
from stackgen.aiden import sessions as session_helpers
|
|
@@ -14,6 +14,8 @@ from stackgen.aiden.run_status import ExecutionStatus
|
|
|
14
14
|
from stackgen.config import StackgenConfig
|
|
15
15
|
from stackgen.errors import HttpError, StackgenError, TimeoutError
|
|
16
16
|
|
|
17
|
+
AskMode = Literal["plan", "simple"]
|
|
18
|
+
|
|
17
19
|
|
|
18
20
|
@dataclass(frozen=True)
|
|
19
21
|
class AskArtifactResult:
|
|
@@ -48,6 +50,7 @@ class AskArtifactJourney:
|
|
|
48
50
|
session_id: str | None = None,
|
|
49
51
|
source_app: str | None = None,
|
|
50
52
|
source_metadata: dict[str, str] | None = None,
|
|
53
|
+
mode: AskMode | None = None,
|
|
51
54
|
) -> AskArtifactResult:
|
|
52
55
|
cfg = self._config
|
|
53
56
|
artifact = artifact_name or cfg.artifact_name
|
|
@@ -60,6 +63,7 @@ class AskArtifactJourney:
|
|
|
60
63
|
session_id=session_id,
|
|
61
64
|
source_app=source_app,
|
|
62
65
|
source_metadata=source_metadata,
|
|
66
|
+
mode=mode,
|
|
63
67
|
)
|
|
64
68
|
trace_id = _http.text(start.get("trace_id"))
|
|
65
69
|
if not trace_id:
|
|
@@ -106,6 +110,7 @@ class AskArtifactJourney:
|
|
|
106
110
|
session_id: str | None = None,
|
|
107
111
|
source_app: str | None = None,
|
|
108
112
|
source_metadata: dict[str, str] | None = None,
|
|
113
|
+
mode: AskMode | None = None,
|
|
109
114
|
) -> dict[str, Any]:
|
|
110
115
|
"""POST /guild/api/v1/guild/ask/start."""
|
|
111
116
|
body: dict[str, Any] = {"message": message}
|
|
@@ -119,6 +124,8 @@ class AskArtifactJourney:
|
|
|
119
124
|
body["source_app"] = source_app
|
|
120
125
|
if source_metadata:
|
|
121
126
|
body["source_metadata"] = source_metadata
|
|
127
|
+
if mode:
|
|
128
|
+
body["mode"] = mode
|
|
122
129
|
|
|
123
130
|
url = (
|
|
124
131
|
f"{self._config.aiden_url()}/api/v1/guild/ask/start"
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
"""Compose Vault secret store + integration upsert for operators.
|
|
2
|
+
|
|
3
|
+
Resolves Vault category / subcategory / required keys from Aiden's
|
|
4
|
+
integration catalog and Vault ``GET /support/metadata``, so callers pass a
|
|
5
|
+
plain ``secrets`` map instead of hand-building ``[{key, value}]`` metadata.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import re
|
|
11
|
+
from typing import Any, Literal
|
|
12
|
+
|
|
13
|
+
from stackgen.aiden.resources import AidenResources
|
|
14
|
+
from stackgen.config import StackgenConfig
|
|
15
|
+
from stackgen.errors import StackgenError
|
|
16
|
+
from stackgen.vault.metadata import VaultMetadataKey, find_supported_format
|
|
17
|
+
from stackgen.vault.namespace import VaultNamespace
|
|
18
|
+
|
|
19
|
+
# Deprecated: metadata discovery replaces kind. Kept for call-site / type compat.
|
|
20
|
+
IntegrationSecretKind = Literal["github", "grafana", "kafka", "generic"]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _as_str(value: Any) -> str:
|
|
24
|
+
return value.strip() if isinstance(value, str) else ""
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _norm(value: str) -> str:
|
|
28
|
+
return value.strip().lower()
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _snake_to_camel(key: str) -> str:
|
|
32
|
+
parts = key.split("_")
|
|
33
|
+
if len(parts) < 2:
|
|
34
|
+
return key
|
|
35
|
+
return parts[0] + "".join(p[:1].upper() + p[1:] for p in parts[1:] if p)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _camel_to_snake(key: str) -> str:
|
|
39
|
+
return re.sub(r"([a-z0-9])([A-Z])", r"\1_\2", key).lower()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _pick(secrets: dict[str, str], *keys: str) -> str:
|
|
43
|
+
for key in keys:
|
|
44
|
+
found = _as_str(secrets.get(key))
|
|
45
|
+
if found:
|
|
46
|
+
return found
|
|
47
|
+
camel = _snake_to_camel(key)
|
|
48
|
+
if camel != key:
|
|
49
|
+
found = _as_str(secrets.get(camel))
|
|
50
|
+
if found:
|
|
51
|
+
return found
|
|
52
|
+
snake = _camel_to_snake(key)
|
|
53
|
+
if snake != key:
|
|
54
|
+
found = _as_str(secrets.get(snake))
|
|
55
|
+
if found:
|
|
56
|
+
return found
|
|
57
|
+
return ""
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _find_integration_type(
|
|
61
|
+
catalog: list[dict[str, Any]], type_name: str
|
|
62
|
+
) -> dict[str, Any] | None:
|
|
63
|
+
want = _norm(type_name)
|
|
64
|
+
for row in catalog:
|
|
65
|
+
if _norm(_as_str(row.get("type"))) == want:
|
|
66
|
+
return row
|
|
67
|
+
return None
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _build_value_entries(
|
|
71
|
+
secrets: dict[str, str],
|
|
72
|
+
key_defs: tuple[VaultMetadataKey, ...] | list[VaultMetadataKey],
|
|
73
|
+
) -> list[dict[str, str]]:
|
|
74
|
+
"""Map a plain secrets dict onto Vault metadata keys (with defaults)."""
|
|
75
|
+
entries: list[dict[str, str]] = []
|
|
76
|
+
missing: list[str] = []
|
|
77
|
+
seen: set[str] = set()
|
|
78
|
+
|
|
79
|
+
for key_def in key_defs:
|
|
80
|
+
key = key_def.key
|
|
81
|
+
if not key:
|
|
82
|
+
continue
|
|
83
|
+
seen.add(key)
|
|
84
|
+
value = _pick(secrets, key)
|
|
85
|
+
if not value and key_def.default:
|
|
86
|
+
value = key_def.default
|
|
87
|
+
if not value:
|
|
88
|
+
if key_def.required:
|
|
89
|
+
missing.append(key)
|
|
90
|
+
continue
|
|
91
|
+
entries.append({"key": key, "value": value})
|
|
92
|
+
|
|
93
|
+
if missing:
|
|
94
|
+
raise StackgenError(
|
|
95
|
+
"upsert_integration_with_secrets missing required Vault keys: "
|
|
96
|
+
+ ", ".join(missing)
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
# Preserve extra caller keys not listed in metadata (optional extras).
|
|
100
|
+
for raw_key, raw_val in secrets.items():
|
|
101
|
+
key = _as_str(raw_key)
|
|
102
|
+
val = _as_str(raw_val)
|
|
103
|
+
if not key or not val:
|
|
104
|
+
continue
|
|
105
|
+
snake = _camel_to_snake(key)
|
|
106
|
+
if key in seen or snake in seen:
|
|
107
|
+
continue
|
|
108
|
+
entries.append({"key": snake if snake != key else key, "value": val})
|
|
109
|
+
|
|
110
|
+
if not entries:
|
|
111
|
+
raise StackgenError("upsert_integration_with_secrets requires secrets")
|
|
112
|
+
return entries
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class IntegrationSecretsJourney:
|
|
116
|
+
"""Store Vault credentials, bind ``secret_ref_ids``, upsert an integration."""
|
|
117
|
+
|
|
118
|
+
def __init__(self, config: StackgenConfig) -> None:
|
|
119
|
+
self._config = config
|
|
120
|
+
self._vault = VaultNamespace(config)
|
|
121
|
+
self._resources = AidenResources(config)
|
|
122
|
+
|
|
123
|
+
def upsert(
|
|
124
|
+
self,
|
|
125
|
+
name: str,
|
|
126
|
+
*,
|
|
127
|
+
type: str,
|
|
128
|
+
secrets: dict[str, str],
|
|
129
|
+
description: str | None = None,
|
|
130
|
+
secret_name: str | None = None,
|
|
131
|
+
scope: str = "TENANT",
|
|
132
|
+
enabled: bool = True,
|
|
133
|
+
env: dict[str, str] | None = None,
|
|
134
|
+
runner_id: str | None = None,
|
|
135
|
+
skip_connectivity_check: bool | None = None,
|
|
136
|
+
vault_category: str | None = None,
|
|
137
|
+
vault_subcategory: str | None = None,
|
|
138
|
+
integration: dict[str, Any] | None = None,
|
|
139
|
+
# Deprecated: ignored when metadata resolves; kept for call-site compat.
|
|
140
|
+
kind: str | None = None,
|
|
141
|
+
) -> dict[str, Any]:
|
|
142
|
+
"""Happy path: Vault store → bind ``secret_ref_ids`` → PUT integration.
|
|
143
|
+
|
|
144
|
+
``secrets`` is a plain key/value map. The SDK resolves Vault
|
|
145
|
+
category/subcategory and required keys from Aiden's integration catalog
|
|
146
|
+
and Vault ``GET /support/metadata``. Pass ``vault_category`` /
|
|
147
|
+
``vault_subcategory`` to override discovery.
|
|
148
|
+
|
|
149
|
+
Returns ``{"integration", "secret_ids", "secrets"}``.
|
|
150
|
+
"""
|
|
151
|
+
del kind # metadata-driven; kept only for backward-compatible kwargs
|
|
152
|
+
clean_name = _as_str(name)
|
|
153
|
+
clean_type = _as_str(type)
|
|
154
|
+
if not clean_name:
|
|
155
|
+
raise StackgenError("upsert_integration_with_secrets requires name")
|
|
156
|
+
if not clean_type:
|
|
157
|
+
raise StackgenError("upsert_integration_with_secrets requires type")
|
|
158
|
+
if not isinstance(secrets, dict) or not secrets:
|
|
159
|
+
raise StackgenError("upsert_integration_with_secrets requires secrets")
|
|
160
|
+
|
|
161
|
+
vault_name = _as_str(secret_name) or f"{clean_name}-creds"
|
|
162
|
+
vault_desc = _as_str(description) or f"{clean_type} integration credentials"
|
|
163
|
+
|
|
164
|
+
category, subcategory, value = self._resolve_secret_payload(
|
|
165
|
+
clean_type,
|
|
166
|
+
secrets,
|
|
167
|
+
vault_category=_as_str(vault_category) or None,
|
|
168
|
+
vault_subcategory=_as_str(vault_subcategory) or None,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
skip = skip_connectivity_check
|
|
172
|
+
if skip is None:
|
|
173
|
+
# Connectivity checks often fail for runner-bound / synthetic secrets.
|
|
174
|
+
skip = True
|
|
175
|
+
|
|
176
|
+
shared_with = [self._config.org_id] if self._config.org_id else []
|
|
177
|
+
stored = self._vault.store_secret(
|
|
178
|
+
{
|
|
179
|
+
"name": vault_name,
|
|
180
|
+
"description": vault_desc,
|
|
181
|
+
"category": category,
|
|
182
|
+
"subcategory": subcategory,
|
|
183
|
+
"value": value,
|
|
184
|
+
"sharedWith": shared_with,
|
|
185
|
+
"skip_connectivity_check": skip,
|
|
186
|
+
}
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
secret_id = _as_str(stored.get("id"))
|
|
190
|
+
if not secret_id:
|
|
191
|
+
raise StackgenError(
|
|
192
|
+
"upsert_integration_with_secrets: Vault store did not return id"
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
body: dict[str, Any] = {
|
|
196
|
+
"type": clean_type,
|
|
197
|
+
"description": _as_str(description) or f"{clean_type} integration",
|
|
198
|
+
"scope": scope,
|
|
199
|
+
"enabled": enabled,
|
|
200
|
+
"secret_ref_ids": [secret_id],
|
|
201
|
+
}
|
|
202
|
+
if env is not None:
|
|
203
|
+
body["env"] = env
|
|
204
|
+
if runner_id is not None:
|
|
205
|
+
body["runner_id"] = runner_id
|
|
206
|
+
if integration:
|
|
207
|
+
body.update(integration)
|
|
208
|
+
# Owned credential binding wins over accidental overrides in integration{}
|
|
209
|
+
body["secret_ref_ids"] = [secret_id]
|
|
210
|
+
body["type"] = clean_type
|
|
211
|
+
|
|
212
|
+
integration_row = self._resources.upsert_integration(clean_name, body)
|
|
213
|
+
return {
|
|
214
|
+
"integration": integration_row,
|
|
215
|
+
"secret_ids": [secret_id],
|
|
216
|
+
"secrets": [stored],
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
def _resolve_secret_payload(
|
|
220
|
+
self,
|
|
221
|
+
type_name: str,
|
|
222
|
+
secrets: dict[str, str],
|
|
223
|
+
*,
|
|
224
|
+
vault_category: str | None,
|
|
225
|
+
vault_subcategory: str | None,
|
|
226
|
+
) -> tuple[str, str, list[dict[str, str]]]:
|
|
227
|
+
subcategory = vault_subcategory
|
|
228
|
+
if not subcategory:
|
|
229
|
+
types = self._resources.list_integration_types()
|
|
230
|
+
type_row = _find_integration_type(types, type_name)
|
|
231
|
+
if type_row:
|
|
232
|
+
linked = _as_str(type_row.get("linked_vault_subcategory"))
|
|
233
|
+
subcategory = linked or _as_str(type_row.get("type")) or type_name
|
|
234
|
+
else:
|
|
235
|
+
subcategory = type_name
|
|
236
|
+
|
|
237
|
+
metadata = self._vault.get_supported_metadata()
|
|
238
|
+
row = find_supported_format(metadata, subcategory)
|
|
239
|
+
|
|
240
|
+
if row:
|
|
241
|
+
category = vault_category or row.category
|
|
242
|
+
if not category:
|
|
243
|
+
raise StackgenError(
|
|
244
|
+
f"Vault metadata for subcategory={subcategory!r} has no category"
|
|
245
|
+
)
|
|
246
|
+
subcategory = row.subcategory or subcategory
|
|
247
|
+
value = _build_value_entries(secrets, row.keys)
|
|
248
|
+
return category, subcategory, value
|
|
249
|
+
|
|
250
|
+
if vault_category and vault_subcategory:
|
|
251
|
+
# Explicit overrides without a catalog row: trust the caller.
|
|
252
|
+
value = [
|
|
253
|
+
{"key": _camel_to_snake(k) if k else k, "value": v}
|
|
254
|
+
for k, v in secrets.items()
|
|
255
|
+
if _as_str(k) and _as_str(v)
|
|
256
|
+
]
|
|
257
|
+
if not value:
|
|
258
|
+
raise StackgenError("upsert_integration_with_secrets requires secrets")
|
|
259
|
+
return vault_category, vault_subcategory, value
|
|
260
|
+
|
|
261
|
+
# Fallback for common types when metadata is unavailable (preserves
|
|
262
|
+
# github / grafana / kafka behavior from earlier SDK releases).
|
|
263
|
+
fallback = self._legacy_fallback(type_name, secrets)
|
|
264
|
+
if fallback:
|
|
265
|
+
return fallback
|
|
266
|
+
|
|
267
|
+
raise StackgenError(
|
|
268
|
+
"upsert_integration_with_secrets could not resolve Vault metadata "
|
|
269
|
+
f"for type={type_name!r} subcategory={subcategory!r}. "
|
|
270
|
+
"Pass vault_category and vault_subcategory, or ensure Vault "
|
|
271
|
+
"GET /support/metadata lists that subcategory."
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
def _legacy_fallback(
|
|
275
|
+
self, type_name: str, secrets: dict[str, str]
|
|
276
|
+
) -> tuple[str, str, list[dict[str, str]]] | None:
|
|
277
|
+
kind = _norm(type_name)
|
|
278
|
+
if kind == "github":
|
|
279
|
+
token = _pick(secrets, "token")
|
|
280
|
+
if not token:
|
|
281
|
+
raise StackgenError("github secrets require token")
|
|
282
|
+
return "scm", "github", [{"key": "token", "value": token}]
|
|
283
|
+
if kind == "grafana":
|
|
284
|
+
base_url = _pick(secrets, "base_url", "baseUrl")
|
|
285
|
+
api_token = _pick(secrets, "api_token", "apiToken")
|
|
286
|
+
if not base_url or not api_token:
|
|
287
|
+
raise StackgenError(
|
|
288
|
+
"grafana secrets require base_url (or baseUrl) and "
|
|
289
|
+
"api_token (or apiToken)"
|
|
290
|
+
)
|
|
291
|
+
return (
|
|
292
|
+
"Observability",
|
|
293
|
+
"grafana",
|
|
294
|
+
[
|
|
295
|
+
{"key": "base_url", "value": base_url},
|
|
296
|
+
{"key": "api_token", "value": api_token},
|
|
297
|
+
],
|
|
298
|
+
)
|
|
299
|
+
if kind == "kafka":
|
|
300
|
+
bootstrap = _pick(secrets, "bootstrap_servers", "bootstrapServers")
|
|
301
|
+
if not bootstrap:
|
|
302
|
+
raise StackgenError(
|
|
303
|
+
"kafka secrets require bootstrap_servers (or bootstrapServers)"
|
|
304
|
+
)
|
|
305
|
+
value = [{"key": "bootstrap_servers", "value": bootstrap}]
|
|
306
|
+
for wire, *aliases in (
|
|
307
|
+
("security_protocol", "securityProtocol"),
|
|
308
|
+
("sasl_mechanism", "saslMechanism"),
|
|
309
|
+
("sasl_username", "saslUsername"),
|
|
310
|
+
("sasl_password", "saslPassword"),
|
|
311
|
+
):
|
|
312
|
+
found = _pick(secrets, wire, *aliases)
|
|
313
|
+
if found:
|
|
314
|
+
value.append({"key": wire, "value": found})
|
|
315
|
+
return "Messaging", "kafka", value
|
|
316
|
+
return None
|
|
@@ -3,10 +3,14 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
from typing import Any, Iterator
|
|
6
|
+
from typing import Any, Iterator, Literal
|
|
7
7
|
|
|
8
8
|
from stackgen.aiden.ask import AskArtifactJourney, AskArtifactResult
|
|
9
9
|
from stackgen.aiden.audit import AuditExportJourney, AuditExportResult
|
|
10
|
+
from stackgen.aiden.integration_secrets import (
|
|
11
|
+
IntegrationSecretKind,
|
|
12
|
+
IntegrationSecretsJourney,
|
|
13
|
+
)
|
|
10
14
|
from stackgen.aiden.models import ModelRegistry
|
|
11
15
|
from stackgen.aiden.resources import AidenResources, PolicyConflictRule
|
|
12
16
|
from stackgen.aiden.run_status import RunStatus, build_run_status, require_run_ids
|
|
@@ -29,6 +33,7 @@ class AidenNamespace:
|
|
|
29
33
|
self._workflows = WorkflowPublishJourney(config)
|
|
30
34
|
self._webhook_ops = WebhookOps(config)
|
|
31
35
|
self._resources = AidenResources(config)
|
|
36
|
+
self._integration_secrets = IntegrationSecretsJourney(config)
|
|
32
37
|
self._subscribe = ExecutionSubscribe(config)
|
|
33
38
|
self._audit = AuditExportJourney(config)
|
|
34
39
|
self.models = ModelRegistry(config)
|
|
@@ -160,6 +165,7 @@ class AidenNamespace:
|
|
|
160
165
|
session_id: str | None = None,
|
|
161
166
|
source_app: str | None = None,
|
|
162
167
|
source_metadata: dict[str, str] | None = None,
|
|
168
|
+
mode: Literal["plan", "simple"] | None = None,
|
|
163
169
|
) -> AskArtifactResult:
|
|
164
170
|
"""Start Ask Guild, poll execution, wait for artifact, download it."""
|
|
165
171
|
return self._ask.run(
|
|
@@ -171,6 +177,7 @@ class AidenNamespace:
|
|
|
171
177
|
session_id=session_id,
|
|
172
178
|
source_app=source_app,
|
|
173
179
|
source_metadata=source_metadata,
|
|
180
|
+
mode=mode,
|
|
174
181
|
)
|
|
175
182
|
|
|
176
183
|
def start_ask(
|
|
@@ -182,12 +189,14 @@ class AidenNamespace:
|
|
|
182
189
|
session_id: str | None = None,
|
|
183
190
|
source_app: str | None = None,
|
|
184
191
|
source_metadata: dict[str, str] | None = None,
|
|
192
|
+
mode: Literal["plan", "simple"] | None = None,
|
|
185
193
|
) -> dict[str, Any]:
|
|
186
194
|
"""POST /guild/api/v1/guild/ask/start (fire-and-forget).
|
|
187
195
|
|
|
188
196
|
Returns ``session_id`` / ``trace_id`` immediately. Persist those ids and
|
|
189
197
|
call :meth:`get_run_status` from a separate scheduler — this method does
|
|
190
|
-
not wait for completion.
|
|
198
|
+
not wait for completion. Pass ``mode="plan"`` or ``"simple"`` to pin
|
|
199
|
+
Genie execution for the session.
|
|
191
200
|
"""
|
|
192
201
|
return self._ask.start_ask(
|
|
193
202
|
message,
|
|
@@ -196,6 +205,7 @@ class AidenNamespace:
|
|
|
196
205
|
session_id=session_id,
|
|
197
206
|
source_app=source_app,
|
|
198
207
|
source_metadata=source_metadata,
|
|
208
|
+
mode=mode,
|
|
199
209
|
)
|
|
200
210
|
|
|
201
211
|
def start_workflow_run(
|
|
@@ -286,6 +296,14 @@ class AidenNamespace:
|
|
|
286
296
|
return self._workflows.publish(workflow, agents=agents, approve=approve)
|
|
287
297
|
|
|
288
298
|
# Expanded allowlisted surface (thin REST) — delegated to AidenResources.
|
|
299
|
+
def register_agent(self, body: dict[str, Any]) -> dict[str, Any]:
|
|
300
|
+
"""POST /agents — register with integrations, HITL, runners, and related fields."""
|
|
301
|
+
return self._resources.register_agent(body)
|
|
302
|
+
|
|
303
|
+
def update_agent(self, name: str, body: dict[str, Any]) -> dict[str, Any]:
|
|
304
|
+
"""PUT /agents/{name} — update mutable fields (full-list semantics when provided)."""
|
|
305
|
+
return self._resources.update_agent(name, body)
|
|
306
|
+
|
|
289
307
|
def get_agent(self, name: str) -> dict[str, Any]:
|
|
290
308
|
return self._resources.get_agent(name)
|
|
291
309
|
|
|
@@ -326,12 +344,65 @@ class AidenNamespace:
|
|
|
326
344
|
def list_integration_types(self) -> list[dict[str, Any]]:
|
|
327
345
|
return self._resources.list_integration_types()
|
|
328
346
|
|
|
329
|
-
def get_integration(
|
|
330
|
-
|
|
347
|
+
def get_integration(
|
|
348
|
+
self,
|
|
349
|
+
name: str,
|
|
350
|
+
*,
|
|
351
|
+
include_tools: bool = True,
|
|
352
|
+
) -> dict[str, Any]:
|
|
353
|
+
"""GET integration; defaults to include_tools so discovered_tools populate."""
|
|
354
|
+
return self._resources.get_integration(name, include_tools=include_tools)
|
|
331
355
|
|
|
332
356
|
def upsert_integration(self, name: str, body: dict[str, Any]) -> dict[str, Any]:
|
|
333
357
|
return self._resources.upsert_integration(name, body)
|
|
334
358
|
|
|
359
|
+
def upsert_integration_with_secrets(
|
|
360
|
+
self,
|
|
361
|
+
name: str,
|
|
362
|
+
*,
|
|
363
|
+
type: str,
|
|
364
|
+
secrets: dict[str, str],
|
|
365
|
+
kind: IntegrationSecretKind | None = None,
|
|
366
|
+
description: str | None = None,
|
|
367
|
+
secret_name: str | None = None,
|
|
368
|
+
scope: str = "TENANT",
|
|
369
|
+
enabled: bool = True,
|
|
370
|
+
env: dict[str, str] | None = None,
|
|
371
|
+
runner_id: str | None = None,
|
|
372
|
+
skip_connectivity_check: bool | None = None,
|
|
373
|
+
vault_category: str | None = None,
|
|
374
|
+
vault_subcategory: str | None = None,
|
|
375
|
+
integration: dict[str, Any] | None = None,
|
|
376
|
+
) -> dict[str, Any]:
|
|
377
|
+
"""Store Vault credentials, bind ``secret_ref_ids``, and upsert an integration.
|
|
378
|
+
|
|
379
|
+
Pass a plain ``secrets`` map; the SDK resolves Vault category,
|
|
380
|
+
subcategory, and required keys from Aiden's catalog and Vault
|
|
381
|
+
``GET /support/metadata``. Override with ``vault_category`` /
|
|
382
|
+
``vault_subcategory`` when discovery is wrong or unavailable.
|
|
383
|
+
|
|
384
|
+
Advanced callers can still ``vault.store_*_secret`` then
|
|
385
|
+
``upsert_integration(..., secret_ref_ids=[...])`` themselves.
|
|
386
|
+
|
|
387
|
+
Returns ``{"integration", "secret_ids", "secrets"}``.
|
|
388
|
+
"""
|
|
389
|
+
return self._integration_secrets.upsert(
|
|
390
|
+
name,
|
|
391
|
+
type=type,
|
|
392
|
+
secrets=secrets,
|
|
393
|
+
kind=kind,
|
|
394
|
+
description=description,
|
|
395
|
+
secret_name=secret_name,
|
|
396
|
+
scope=scope,
|
|
397
|
+
enabled=enabled,
|
|
398
|
+
env=env,
|
|
399
|
+
runner_id=runner_id,
|
|
400
|
+
skip_connectivity_check=skip_connectivity_check,
|
|
401
|
+
vault_category=vault_category,
|
|
402
|
+
vault_subcategory=vault_subcategory,
|
|
403
|
+
integration=integration,
|
|
404
|
+
)
|
|
405
|
+
|
|
335
406
|
def delete_integration(self, name: str) -> dict[str, Any]:
|
|
336
407
|
return self._resources.delete_integration(name)
|
|
337
408
|
|
|
@@ -344,6 +415,10 @@ class AidenNamespace:
|
|
|
344
415
|
def list_approvals(self, **params: Any) -> list[dict[str, Any]]:
|
|
345
416
|
return self._resources.list_approvals(**params)
|
|
346
417
|
|
|
418
|
+
def get_approval(self, approval_id: str) -> dict[str, Any]:
|
|
419
|
+
"""GET /approvals/{id}."""
|
|
420
|
+
return self._resources.get_approval(approval_id)
|
|
421
|
+
|
|
347
422
|
def resolve_approval(self, approval_id: str, body: dict[str, Any]) -> dict[str, Any]:
|
|
348
423
|
return self._resources.resolve_approval(approval_id, body)
|
|
349
424
|
|
|
@@ -31,7 +31,11 @@ def _with_org(config: StackgenConfig, params: dict[str, Any] | None = None) -> d
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
def _query_string(params: dict[str, Any]) -> str:
|
|
34
|
-
cleaned
|
|
34
|
+
cleaned: dict[str, Any] = {}
|
|
35
|
+
for k, v in params.items():
|
|
36
|
+
if v is None or v == "":
|
|
37
|
+
continue
|
|
38
|
+
cleaned[k] = "true" if v is True else "false" if v is False else v
|
|
35
39
|
if not cleaned:
|
|
36
40
|
return ""
|
|
37
41
|
return "?" + urllib.parse.urlencode(cleaned)
|
|
@@ -69,6 +73,14 @@ class AidenResources:
|
|
|
69
73
|
kwargs["content_type"] = "application/json"
|
|
70
74
|
return _http.request(self._url(path, params), self._config.api_token, **kwargs)
|
|
71
75
|
|
|
76
|
+
def register_agent(self, body: dict[str, Any]) -> dict[str, Any]:
|
|
77
|
+
"""POST /agents — register with full config (integrations, HITL, runners, …)."""
|
|
78
|
+
return _as_object(self._send("/agents", "POST", body), "registerAgent")
|
|
79
|
+
|
|
80
|
+
def update_agent(self, name: str, body: dict[str, Any]) -> dict[str, Any]:
|
|
81
|
+
"""PUT /agents/{name} — update mutable fields (full-list when provided)."""
|
|
82
|
+
return _as_object(self._send(f"/agents/{name}", "PUT", body), "updateAgent")
|
|
83
|
+
|
|
72
84
|
def get_agent(self, name: str) -> dict[str, Any]:
|
|
73
85
|
return _as_object(self._get(f"/agents/{name}"), "getAgent")
|
|
74
86
|
|
|
@@ -116,8 +128,17 @@ class AidenResources:
|
|
|
116
128
|
def list_integration_types(self) -> list[dict[str, Any]]:
|
|
117
129
|
return _http.as_list(self._get("/integrations/types"))
|
|
118
130
|
|
|
119
|
-
def get_integration(
|
|
120
|
-
|
|
131
|
+
def get_integration(
|
|
132
|
+
self,
|
|
133
|
+
name: str,
|
|
134
|
+
*,
|
|
135
|
+
include_tools: bool = True,
|
|
136
|
+
) -> dict[str, Any]:
|
|
137
|
+
"""GET /integrations/{name}. Defaults to include_tools so discovered_tools populate."""
|
|
138
|
+
return _as_object(
|
|
139
|
+
self._get(f"/integrations/{name}", {"include_tools": include_tools}),
|
|
140
|
+
"getIntegration",
|
|
141
|
+
)
|
|
121
142
|
|
|
122
143
|
def upsert_integration(self, name: str, body: dict[str, Any]) -> dict[str, Any]:
|
|
123
144
|
return _as_object(
|
|
@@ -144,6 +165,10 @@ class AidenResources:
|
|
|
144
165
|
def list_approvals(self, **params: Any) -> list[dict[str, Any]]:
|
|
145
166
|
return _http.as_list(self._get("/approvals", params))
|
|
146
167
|
|
|
168
|
+
def get_approval(self, approval_id: str) -> dict[str, Any]:
|
|
169
|
+
"""GET /approvals/{id} — one pending or historical HITL approval."""
|
|
170
|
+
return _as_object(self._get(f"/approvals/{approval_id}"), "getApproval")
|
|
171
|
+
|
|
147
172
|
def resolve_approval(self, approval_id: str, body: dict[str, Any]) -> dict[str, Any]:
|
|
148
173
|
return _as_object(
|
|
149
174
|
self._send(f"/approvals/{approval_id}", "POST", body), "resolveApproval"
|
|
@@ -52,8 +52,8 @@ class StackgenConfig:
|
|
|
52
52
|
return self.mothership() + "/app/sre"
|
|
53
53
|
|
|
54
54
|
def vault_url(self) -> str:
|
|
55
|
-
"""HTTP prefix for Vault on the mothership edge."""
|
|
56
|
-
return self.mothership() + "/vault/v1"
|
|
55
|
+
"""HTTP prefix for Vault on the mothership edge (``/api/vault/v1``)."""
|
|
56
|
+
return self.mothership() + "/api/vault/v1"
|
|
57
57
|
|
|
58
58
|
def appcd_url(self) -> str:
|
|
59
59
|
"""HTTP prefix for organization (project) management."""
|