iac-code 0.15.0__tar.gz → 0.16.0__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.
- {iac_code-0.15.0 → iac_code-0.16.0}/PKG-INFO +8 -1
- {iac_code-0.15.0 → iac_code-0.16.0}/README.md +7 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/pyproject.toml +3 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/setup.py +2 -0
- iac_code-0.16.0/src/iac_code/__init__.py +2 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/agent_card.py +58 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/app.py +196 -1
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/backup.py +65 -8
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/client.py +135 -1
- iac_code-0.16.0/src/iac_code/a2a/execution_control.py +1533 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/executor.py +1068 -154
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/input_required.py +42 -4
- iac_code-0.16.0/src/iac_code/a2a/metadata_redaction.py +63 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_events.py +34 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_executor.py +328 -17
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_outbound.py +32 -7
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_recovery.py +21 -1
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_snapshot.py +1 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_stream.py +31 -3
- iac_code-0.16.0/src/iac_code/a2a/resource_selector.py +418 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/runtime_overrides.py +54 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/task_store.py +346 -15
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/dispatcher.py +50 -10
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agent/agent_loop.py +375 -136
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agent/agent_tool.py +3 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agui/adapter.py +2 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agui/inputs.py +1 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/effort.py +51 -31
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/config.py +12 -3
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.po +64 -6
- iac_code-0.16.0/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.mo +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.po +208 -38
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.po +64 -6
- iac_code-0.16.0/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.mo +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.po +208 -38
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.po +63 -6
- iac_code-0.16.0/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.mo +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.po +208 -38
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.po +61 -6
- iac_code-0.16.0/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.mo +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.po +202 -38
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.po +64 -6
- iac_code-0.16.0/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.mo +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.po +208 -38
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.po +59 -6
- iac_code-0.16.0/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.mo +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.po +202 -38
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_graph.py +82 -1
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_semantic_planning.py +2 -2
- iac_code-0.16.0/src/iac_code/pipeline/engine/diagram_graph.py +145 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/display_replay.py +13 -11
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/pipeline_runner.py +62 -4
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/session.py +28 -1
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/show_diagram_tool.py +13 -7
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/step_executor.py +31 -3
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/sub_pipeline_executor.py +2 -0
- {iac_code-0.15.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost → iac_code-0.16.0/src/iac_code/pipeline/selling}/references/cloud-products/ecs.md +2 -1
- {iac_code-0.15.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost → iac_code-0.16.0/src/iac_code/pipeline/selling}/references/cloud-products/vpc.md +6 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/solutions/iac-code-web.md +6 -3
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/solutions/iac-code-web.ros.yml +129 -12
- {iac_code-0.15.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost → iac_code-0.16.0/src/iac_code/pipeline/selling}/references/template-parameter-recommendation.md +9 -4
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/SKILL.md +4 -2
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/evals.json +1 -1
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/SKILL.md +3 -2
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/evals.json +21 -3
- {iac_code-0.15.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying → iac_code-0.16.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/cloud-products/ecs.md +2 -1
- {iac_code-0.15.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating → iac_code-0.16.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/cloud-products/vpc.md +6 -0
- {iac_code-0.15.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating → iac_code-0.16.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/solutions/iac-code-web.md +6 -3
- {iac_code-0.15.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying → iac_code-0.16.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/solutions/iac-code-web.ros.yml +129 -12
- {iac_code-0.15.0/src/iac_code/pipeline/selling → iac_code-0.16.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/template-parameter-recommendation.md +9 -4
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/SKILL.md +4 -4
- {iac_code-0.15.0/src/iac_code/pipeline/selling → iac_code-0.16.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying}/references/cloud-products/ecs.md +2 -1
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/vpc.md +6 -0
- {iac_code-0.15.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost → iac_code-0.16.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying}/references/solutions/iac-code-web.md +6 -3
- {iac_code-0.15.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost → iac_code-0.16.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying}/references/solutions/iac-code-web.ros.yml +129 -12
- {iac_code-0.15.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating → iac_code-0.16.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying}/references/template-parameter-recommendation.md +9 -4
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/SKILL.md +1 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/evals.json +21 -3
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/ecs.md +2 -1
- {iac_code-0.15.0/src/iac_code/pipeline/selling → iac_code-0.16.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating}/references/cloud-products/vpc.md +6 -0
- {iac_code-0.15.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying → iac_code-0.16.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating}/references/solutions/iac-code-web.md +6 -3
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/solutions/iac-code-web.ros.yml +129 -12
- {iac_code-0.15.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying → iac_code-0.16.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating}/references/template-parameter-recommendation.md +9 -4
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/tools/infraguard_scan_tool.py +4 -3
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/SKILL.md +3 -3
- iac_code-0.16.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/cloud-products/ecs.md +186 -0
- iac_code-0.16.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/cloud-products/vpc.md +60 -0
- iac_code-0.16.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/solutions/iac-code-web.md +41 -0
- iac_code-0.16.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/solutions/iac-code-web.ros.yml +516 -0
- iac_code-0.16.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/template-parameter-recommendation.md +167 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/SKILL.md +12 -6
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/evals.json +43 -18
- iac_code-0.16.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/references/cloud-products/ecs.md +186 -0
- iac_code-0.16.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/references/cloud-products/vpc.md +60 -0
- iac_code-0.16.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/references/solutions/iac-code-web.md +41 -0
- iac_code-0.16.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/references/solutions/iac-code-web.ros.yml +516 -0
- iac_code-0.16.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/references/template-parameter-recommendation.md +167 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-solution-first/SKILL.md +4 -2
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-solution-first/evals.json +13 -1
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/tools/show_architecture_plan_tool.py +15 -8
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/tools/show_candidate_detail_tool.py +3 -4
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/anthropic_provider.py +5 -2
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/dashscope_provider.py +14 -9
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/kimi_provider.py +5 -2
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/manager.py +22 -7
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/openai_provider.py +9 -7
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/registry.py +34 -17
- iac_code-0.16.0/src/iac_code/providers/request_headers.py +52 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/thinking.py +97 -2
- iac_code-0.16.0/src/iac_code/resource_selector/__init__.py +16 -0
- iac_code-0.16.0/src/iac_code/resource_selector/capability.py +85 -0
- iac_code-0.16.0/src/iac_code/resource_selector/ore-capabilities.json +4028 -0
- iac_code-0.16.0/src/iac_code/resource_selector/ore-operations.json +2272 -0
- iac_code-0.16.0/src/iac_code/resource_selector/ore-response-projections.json +5231 -0
- iac_code-0.16.0/src/iac_code/resource_selector/profiles.py +1291 -0
- iac_code-0.16.0/src/iac_code/resource_selector/query.py +1530 -0
- iac_code-0.16.0/src/iac_code/resource_selector/tools.py +586 -0
- iac_code-0.16.0/src/iac_code/resource_selector/validation.py +174 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/agent_factory.py +31 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/context_manager.py +18 -4
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/permission_wait.py +73 -30
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_backup.py +1 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_backup_staging.py +44 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/constants.py +14 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/SKILL.md +3 -2
- iac_code-0.16.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md +186 -0
- iac_code-0.16.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/vpc.md +60 -0
- iac_code-0.16.0/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.md +41 -0
- iac_code-0.16.0/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.ros.yml +516 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameter-recommendation.md +9 -4
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/base.py +6 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/bash_tool.py +2 -1
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/aliyun_api.py +5 -4
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/api_contract.py +2 -2
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/openmeta.py +2 -1
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_stack.py +128 -16
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_stack_instances.py +37 -11
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/eip_association.py +47 -2
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/glob.py +3 -3
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/grep.py +2 -1
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/tool_executor.py +14 -8
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/types/__init__.py +2 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/types/stream_events.py +20 -1
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/model_picker.py +4 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/app.py +217 -1
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/diagram_cache.py +13 -5
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/diagram_optimizer.py +13 -2
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/diagrams.py +73 -29
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/events.py +5 -1
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/permissions.py +16 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/runtime.py +56 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/session_manager.py +121 -2
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/session_titler.py +2 -2
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/settings.py +32 -3
- iac_code-0.16.0/src/iac_code/web/static/diagram-preview-corpus.json +35 -0
- iac_code-0.16.0/src/iac_code/web/static/diagram-preview.css +332 -0
- iac_code-0.16.0/src/iac_code/web/static/diagram-preview.html +111 -0
- iac_code-0.16.0/src/iac_code/web/static/eraser-frame.html +51 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/index.html +2 -2
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/api.js +34 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/app.js +509 -37
- iac_code-0.16.0/src/iac_code/web/static/js/architecture_diagram.js +377 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/components/blocking.js +262 -1
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/components/composer.js +19 -2
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/components/output_panel.js +61 -13
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/components/pipeline.js +18 -9
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/components/workspace.js +63 -2
- iac_code-0.16.0/src/iac_code/web/static/js/diagram_preview.js +213 -0
- iac_code-0.16.0/src/iac_code/web/static/js/diagram_preview_library.js +33 -0
- iac_code-0.16.0/src/iac_code/web/static/js/eraser_frame.js +195 -0
- iac_code-0.16.0/src/iac_code/web/static/js/eraser_layout_worker.js +711 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/events.js +25 -0
- iac_code-0.16.0/src/iac_code/web/static/js/vendor/eraser-diagrams.LICENSE +21 -0
- iac_code-0.16.0/src/iac_code/web/static/js/vendor/eraser-diagrams.NOTICE +544 -0
- iac_code-0.16.0/src/iac_code/web/static/js/vendor/eraser-diagrams.min.js +826 -0
- iac_code-0.16.0/src/iac_code/web/static/js/vendor/ore-resource-selector.THIRD_PARTY_NOTICES +3214 -0
- iac_code-0.16.0/src/iac_code/web/static/js/vendor/ore-resource-selector.manifest.json +4010 -0
- iac_code-0.16.0/src/iac_code/web/static/js/vendor/ore-resource-selector.min.js +490 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/styles.css +397 -3
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code.egg-info/PKG-INFO +8 -1
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code.egg-info/SOURCES.txt +28 -0
- iac_code-0.15.0/src/iac_code/__init__.py +0 -2
- iac_code-0.15.0/src/iac_code/a2a/metadata_redaction.py +0 -32
- iac_code-0.15.0/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.mo +0 -0
- iac_code-0.15.0/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.mo +0 -0
- iac_code-0.15.0/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.mo +0 -0
- iac_code-0.15.0/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.mo +0 -0
- iac_code-0.15.0/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.mo +0 -0
- iac_code-0.15.0/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.mo +0 -0
- iac_code-0.15.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/cloud-products/ecs.md +0 -185
- iac_code-0.15.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/cloud-products/vpc.md +0 -54
- iac_code-0.15.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/solutions/iac-code-web.md +0 -38
- iac_code-0.15.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/solutions/iac-code-web.ros.yml +0 -399
- iac_code-0.15.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/template-parameter-recommendation.md +0 -162
- iac_code-0.15.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/references/cloud-products/ecs.md +0 -185
- iac_code-0.15.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/references/cloud-products/vpc.md +0 -54
- iac_code-0.15.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/references/solutions/iac-code-web.md +0 -38
- iac_code-0.15.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/references/solutions/iac-code-web.ros.yml +0 -399
- iac_code-0.15.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/references/template-parameter-recommendation.md +0 -162
- iac_code-0.15.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md +0 -185
- iac_code-0.15.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/vpc.md +0 -54
- iac_code-0.15.0/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.md +0 -38
- iac_code-0.15.0/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.ros.yml +0 -399
- {iac_code-0.15.0 → iac_code-0.16.0}/LICENSE +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/MANIFEST.in +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/setup.cfg +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/artifacts.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/events.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/exposure.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/jsonrpc_passthrough.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/metrics.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/parts.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/persistence.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_delta_coalescing.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_flow_monitor.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_journal.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_paths.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_performance.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_transport_delivery.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/projection.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/push.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/push_queue.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/push_secrets.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/push_worker.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/request_mode.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/router.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/runtime_registry.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/signing.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/thinking_metadata.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transport.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/base.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/grpc.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/grpc_jsonrpc.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/http.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/redis_streams.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/stdio.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/unix.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/websocket.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/types.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/convert.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/http_sse.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/mcp.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/metrics.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/runner.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/server.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/session.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/slash_registry.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/state.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/tools.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/types.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/version.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agent/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agent/agent_types.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agent/message.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agent/system_prompt.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agui/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agui/app.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agui/errors.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agui/events.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agui/process.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agui/server.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agui/state.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/cli/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/cli/headless.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/cli/install_git_bash.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/cli/main.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/cli/output_formats.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/cli/process_events.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/cli/process_mode.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/cli/process_protocol.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/cli/update.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/auth.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/clear.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/compact.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/debug.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/exit.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/help.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/mcp.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/memory.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/model.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/prompt.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/registry.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/rename.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/resume.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/skills.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/status.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/tasks.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/thinking_enabled.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/__main__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/control.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/controller.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/diagnostics.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/download_journal.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/external_env.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/git_bash.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/install_lock.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/loop_runner.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/native_preload_manifest.json +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/ports.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/probe_worker.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/runtime.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/tool_paths.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/html_extractor.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/cli.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/client.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/config.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/env_expansion.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/errors.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/manager.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/oauth.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/output.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/progress.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/prompt_dispatch.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/prompts.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/redaction.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/skills.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/storage.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/tools.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/types.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/memory/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/memory/memory_manager.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/memory/memory_tools.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/memory/project_memory.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/memory/recall.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/config.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/constants.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/display_names.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_meta.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_metas/Categories.json +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_metas/config.json +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_metas/products.json +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_resource_inventory.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_rule_candidates.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_rule_drafts.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_rule_facts.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_rules.json +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_rules.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/ask_user_question_tool.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/cleanup.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/complete_step_tool.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/completion_guard_state.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/context.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/events.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/handoff.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/hard_constraints.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/interrupt.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/loader.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/observability.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/prerequisites.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/prompts/interrupt_judge.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/public_errors.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/recovery.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/resume_recovery.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/state_machine.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/step_spec.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/transcript_storage.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/types.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/ui_contract.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/user_input.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/hooks/deploying.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/pipeline.yaml +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/architecture_planning.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/confirm_and_select.a2a.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/confirm_and_select.a2a.rich.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/confirm_and_select.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/cost_estimating.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/deploying.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/evaluate_candidates.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/intent_parsing.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/reviewing.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/template_generating.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/cloud-products/ga.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/cloud-products/oss.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/cloud-products/rds.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/cloud-products/redis.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/cloud-products/slb.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/ros-template.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/template-parameters.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/terraform-template.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/ga.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/oss.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/rds.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/redis.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/slb.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/ros-template.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/template-parameters.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/terraform-template.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/evals.json +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/ga.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/oss.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/rds.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/redis.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/slb.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/ros-template.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameters.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/terraform-template.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/SKILL.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/evals.json +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/SKILL.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/evals.json +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/ga.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/oss.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/rds.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/redis.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/slb.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/ros-template.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/template-parameters.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/terraform-template.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/tools/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/tools/ros_deploy_tool.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/tools/ros_template_tools.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/tools/show_candidate_detail_tool.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/hooks/deploying.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/hooks/materialize_selected_candidate.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/hooks/solution_planning_and_selection.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/pipeline.yaml +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/prompts/deploying.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/prompts/materialize_selected_candidate.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/prompts/solution_planning_and_selection.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/evals.json +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/cloud-products/ga.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/cloud-products/oss.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/cloud-products/rds.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/cloud-products/redis.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/cloud-products/slb.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/ros-template.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/template-parameters.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/terraform-template.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/references/cloud-products/ga.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/references/cloud-products/oss.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/references/cloud-products/rds.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/references/cloud-products/redis.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/references/cloud-products/slb.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/references/ros-template.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/references/template-parameters.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-materialize-selected-candidate/references/terraform-template.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/tools/candidate_planning_records.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/tools/confirmed_ros_deploy_tool.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/tools/reused_selling_tools.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/azure_openai_provider.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/base.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/dashscope_endpoints.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/deepseek_provider.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/gemini_provider.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/lmstudio_provider.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/minimax_provider.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/model_family.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/modelscope_provider.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/ollama_provider.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/openrouter_provider.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/qwen_prompts.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/qwen_provider.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/qwen_tool_call_parser.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/request_lease.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/request_logging.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/request_policy.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/retry.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/schema_compat.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/siliconflow_provider.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/stream_watchdog.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/streaming.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/thinking_intent.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/volcengine_provider.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/zhipu_provider.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/capabilities/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/capabilities/auto_detect.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/capabilities/multimodal.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/cloud_credentials.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/configuration_readiness.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/git_bash.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/permissions/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/permissions/audit.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/permissions/loader.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/permissions/pipeline.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/permissions/rule_scope.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/permissions/storage.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/permissions/trusted_roots.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/providers/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/providers/aliyun.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/providers/aliyun_credentials_runtime.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/providers/aliyun_identity.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/providers/aliyun_oauth.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/qwenpaw_source.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_backup_state.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_index.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_layout.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_logging.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_metadata.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_resolver.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_storage.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_usage.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/attributes.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/client.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/config.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/content_serializer.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/events.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/fallback.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/identity.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/metrics.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/names.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/sanitize.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/scope.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/sink.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/tracing.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/types.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/token_budget.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/token_counter.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/update_checker.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/auto_trigger.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/auto_trigger.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ga.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/oss.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/rds.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/redis.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/slb.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/references/ros-template.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameters.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/references/terraform-template.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/scripts/tf2ros.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/pac_aliyun/SKILL.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/pac_aliyun/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/pac_aliyun/auto_trigger.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/pac_aliyun/references/infraguard-policy-generation.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/simplify.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/discovery.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/frontmatter.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/listing.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/loader.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/management.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/processor.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/renderer.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/settings.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/skill_definition.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/skill_tool.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/state/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/state/app_state.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tasks/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tasks/notification_queue.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tasks/task_state.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tasks/task_tools.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/argv_safety.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/command_parser.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/mode_validation.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/path_validation.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/permissions.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/readonly_commands.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/rule_matching.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/safety_checks.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/acs3_transport.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/aliyun_api_doc.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/aliyun_doc_search.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/api_hooks.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/api_identifiers.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/contract_store.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/README.md +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/catalog.json +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/generation_report.json +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/legacy.yml +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/overrides.yml +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/unavailable.json +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/api_overrides.yml +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/exclusions.yml +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_aliases.yml +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_catalog.json +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/oss/operation_catalog.json +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/validation/judgments.yml +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/validation/overrides.yml +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ecs_credential_errors.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/endpoint_resolver.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/hooks/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/hooks/ros_parameters.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/oss_v4_adapter.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/product_resolver.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/public_errors.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/result_contract.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/retry_policy.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_client.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_lifecycle.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_template_tools.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/action_policy.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/analyzer.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/association_property_specs.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/count.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_association_property_specs.json +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_official_resource_index.json +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_resource_value_specs.json +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_template_body_action_policies.json +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/facts.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/function_specs.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/model.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/outcome.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/parser.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/renderer.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/resource_value_specs.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/association_property.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/base.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/registry.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/symbols.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/template_kind.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/types.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/validator.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_yaml.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/runtime.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/template_source.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/user_agent.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/validation_policy.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/base_api.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/base_stack.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/registry.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/types.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/edit_file.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/list_files.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/path_safety.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/read_file.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/result_storage.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/web_fetch.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/write_file.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/types/permissions.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/types/skill_source.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/types/usage_attribution.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/assets/iac-code-terminal-logo.png +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/banner.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/candidate_selection.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/dialog.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/divider.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/fuzzy_picker.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/parallel_tabs.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/progress_bar.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/search_box.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/select.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/status_icon.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/tabs.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/core/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/core/in_place_render.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/core/input_history.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/core/key_event.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/core/prompt_input.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/core/raw_input.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/core/raw_input_win.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/core/screen.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/diagram_rendering.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/global_search.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/history_search.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/mcp_manager.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/memory.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/memory_editor.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/quick_open.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/resume_picker.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/skills_picker.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/keybindings/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/keybindings/manager.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/pipeline_display_replay.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/pipeline_styles.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/renderer.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/repl.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/spinner.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/stream_accumulator.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/suggestions/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/suggestions/aggregator.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/suggestions/command_provider.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/suggestions/directory_provider.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/suggestions/file_provider.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/suggestions/shell_history_provider.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/suggestions/skill_provider.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/suggestions/token_extractor.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/suggestions/types.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/terminal_image.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/transcript_view.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/async_lifecycle.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/background_housekeeping.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/cleanup.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/console.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/file_security.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/image/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/image/clipboard.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/image/format_detect.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/image/pasted_content.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/image/processor.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/image/resizer.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/image/store.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/json_utils.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/log.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/path_components.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/path_locks.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/platform.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/project_paths.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/public_errors.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/public_paths.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/signals.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/state_io.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/tool_input_parser.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/tool_result_redaction.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/windows_paths.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/__init__.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/cleanup.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/commands.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/files.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/images.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/mcp_settings.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/memory.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/outputs.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/pipeline.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/pipeline_actions.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/pipeline_prerequisites.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/pipeline_transcript.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/security.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/server.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/shell.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/skills.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/icons/iac-code-logo.svg +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/icons/sidebar-new-thread.svg +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/icons/sidebar-project-open.svg +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/icons/sidebar-search.svg +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/icons/sidebar-settings.svg +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/icons/sidebar-skills.svg +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/components/image_lightbox.js +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/components/tool_cards.js +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/i18n.js +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/mermaid_render.js +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/token_transport.js +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/vendor/markdown-it.LICENSE +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/vendor/markdown-it.min.js +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/vendor/mermaid.LICENSE +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/vendor/mermaid.min.js +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/vendor/token-crypto.js +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/token_transport.py +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code.egg-info/dependency_links.txt +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code.egg-info/entry_points.txt +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code.egg-info/requires.txt +0 -0
- {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: iac_code
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.16.0
|
|
4
4
|
Summary: Your AI-powered Infrastructure as Code assistant
|
|
5
5
|
Classifier: Programming Language :: Python :: 3
|
|
6
6
|
Classifier: Programming Language :: Python :: 3.10
|
|
@@ -114,6 +114,13 @@ By default it opens `http://127.0.0.1:8766` in your browser (loopback only). See
|
|
|
114
114
|
<img src="https://raw.githubusercontent.com/aliyun/iac-code/main/website/static/img/screenshots/iac-code-web-en.jpg" alt="IaC Code Web app" width="100%">
|
|
115
115
|
</p>
|
|
116
116
|
|
|
117
|
+
### Agent Skill
|
|
118
|
+
|
|
119
|
+
Add IaC Code to a compatible agent to plan cloud architectures, work with ROS or Terraform templates, estimate costs,
|
|
120
|
+
operate stacks, and deploy Alibaba Cloud resources from the agent conversation. Download the
|
|
121
|
+
[latest stable Skill package](https://ros-public-tools.oss-cn-beijing.aliyuncs.com/github-releases/aliyun/iac-code/skill/stable/iac-code-skill.zip)
|
|
122
|
+
or compare the distributions in [Official IaC Code Skills](https://aliyun.github.io/iac-code/docs/a2a/skill-overview).
|
|
123
|
+
|
|
117
124
|
## Contributing
|
|
118
125
|
|
|
119
126
|
Install [uv](https://docs.astral.sh/uv/getting-started/installation/), then:
|
|
@@ -96,6 +96,13 @@ By default it opens `http://127.0.0.1:8766` in your browser (loopback only). See
|
|
|
96
96
|
<img src="website/static/img/screenshots/iac-code-web-en.jpg" alt="IaC Code Web app" width="100%">
|
|
97
97
|
</p>
|
|
98
98
|
|
|
99
|
+
### Agent Skill
|
|
100
|
+
|
|
101
|
+
Add IaC Code to a compatible agent to plan cloud architectures, work with ROS or Terraform templates, estimate costs,
|
|
102
|
+
operate stacks, and deploy Alibaba Cloud resources from the agent conversation. Download the
|
|
103
|
+
[latest stable Skill package](https://ros-public-tools.oss-cn-beijing.aliyuncs.com/github-releases/aliyun/iac-code/skill/stable/iac-code-skill.zip)
|
|
104
|
+
or compare the distributions in [Official IaC Code Skills](https://aliyun.github.io/iac-code/docs/a2a/skill-overview).
|
|
105
|
+
|
|
99
106
|
## Contributing
|
|
100
107
|
|
|
101
108
|
Install [uv](https://docs.astral.sh/uv/getting-started/installation/), then:
|
|
@@ -127,6 +127,8 @@ version = {attr = "iac_code.__version__"}
|
|
|
127
127
|
"**/*.png",
|
|
128
128
|
"**/*.svg",
|
|
129
129
|
"**/*.LICENSE",
|
|
130
|
+
"**/*.NOTICE",
|
|
131
|
+
"**/*THIRD_PARTY_NOTICES",
|
|
130
132
|
"**/*.rego",
|
|
131
133
|
"**/*.mo",
|
|
132
134
|
"**/*.po",
|
|
@@ -154,6 +156,7 @@ default = true
|
|
|
154
156
|
timeout = 30
|
|
155
157
|
markers = [
|
|
156
158
|
"integration: process-level integration tests that use local services only",
|
|
159
|
+
"resource_selector_live: explicit read-only Alibaba Cloud selector API contract smoke tests",
|
|
157
160
|
]
|
|
158
161
|
|
|
159
162
|
[tool.coverage.run]
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import os
|
|
3
4
|
from typing import Any
|
|
4
5
|
|
|
5
6
|
from a2a.server.request_handlers.response_helpers import agent_card_to_dict
|
|
@@ -29,11 +30,18 @@ from iac_code.a2a.pipeline_outbound import (
|
|
|
29
30
|
from iac_code.a2a.signing import sign_agent_card_dict
|
|
30
31
|
from iac_code.i18n import _
|
|
31
32
|
from iac_code.pipeline.config import RunMode, get_run_mode
|
|
33
|
+
from iac_code.resource_selector.capability import (
|
|
34
|
+
A2A_RESOURCE_SELECTOR_ENV,
|
|
35
|
+
RESOURCE_SELECTOR_EXTENSION_URI,
|
|
36
|
+
env_enabled,
|
|
37
|
+
)
|
|
32
38
|
|
|
33
39
|
IAC_CODE_ARTIFACT_METADATA_EXTENSION_URI = "urn:iac-code:a2a:artifact-metadata:v1"
|
|
40
|
+
IAC_CODE_EXECUTION_CONTROL_EXTENSION_URI = "urn:iac-code:a2a:execution-control:v1"
|
|
34
41
|
IAC_CODE_PIPELINE_EVENTS_EXTENSION_URI = PIPELINE_EVENTS_EXTENSION_URI
|
|
35
42
|
IAC_CODE_THINKING_EXPOSURE_EXTENSION_URI = "urn:iac-code:a2a:thinking-exposure:v1"
|
|
36
43
|
CANONICAL_CALLER_EXTENSION_URIS = {
|
|
44
|
+
IAC_CODE_EXECUTION_CONTROL_EXTENSION_URI,
|
|
37
45
|
IAC_CODE_PIPELINE_EVENTS_EXTENSION_URI,
|
|
38
46
|
}
|
|
39
47
|
|
|
@@ -167,6 +175,56 @@ def build_agent_card(
|
|
|
167
175
|
required=False,
|
|
168
176
|
)
|
|
169
177
|
)
|
|
178
|
+
if env_enabled(os.environ.get(A2A_RESOURCE_SELECTOR_ENV)):
|
|
179
|
+
resource_selector_extension = AgentExtension(
|
|
180
|
+
uri=RESOURCE_SELECTOR_EXTENSION_URI,
|
|
181
|
+
description="Select one Alibaba Cloud resource or one derived value through a compatible ROS frontend.",
|
|
182
|
+
required=False,
|
|
183
|
+
)
|
|
184
|
+
ParseDict(
|
|
185
|
+
{
|
|
186
|
+
"schemaVersion": 1,
|
|
187
|
+
"singleSelection": True,
|
|
188
|
+
"derivedValue": True,
|
|
189
|
+
"queryMode": "ros_api_json",
|
|
190
|
+
},
|
|
191
|
+
resource_selector_extension.params,
|
|
192
|
+
)
|
|
193
|
+
card.capabilities.extensions.append(resource_selector_extension)
|
|
194
|
+
has_http_extension_surface = any(
|
|
195
|
+
interface.url.startswith(("http://", "https://"))
|
|
196
|
+
and interface.protocol_binding.upper() in {"JSONRPC", "HTTP+JSON"}
|
|
197
|
+
for interface in interfaces
|
|
198
|
+
)
|
|
199
|
+
if has_http_extension_surface:
|
|
200
|
+
execution_control_extension = AgentExtension(
|
|
201
|
+
uri=IAC_CODE_EXECUTION_CONTROL_EXTENSION_URI,
|
|
202
|
+
description="Control and recover a live iac-code A2A execution during sandbox reconnects.",
|
|
203
|
+
required=False,
|
|
204
|
+
)
|
|
205
|
+
ParseDict(
|
|
206
|
+
{
|
|
207
|
+
"schemaVersion": "1.0",
|
|
208
|
+
"pauseEndpoint": "/iac-code/execution/pause",
|
|
209
|
+
"stateEndpoint": "/iac-code/execution/state",
|
|
210
|
+
"resumeEndpoint": "/iac-code/execution/resume",
|
|
211
|
+
"terminateEndpoint": "/iac-code/execution/terminate",
|
|
212
|
+
"sessionRecoveryEndpoint": "/iac-code/session/recovery",
|
|
213
|
+
"phases": [
|
|
214
|
+
"running",
|
|
215
|
+
"pausing",
|
|
216
|
+
"pause_committing",
|
|
217
|
+
"paused",
|
|
218
|
+
"resuming",
|
|
219
|
+
"terminating",
|
|
220
|
+
"terminated",
|
|
221
|
+
],
|
|
222
|
+
"toolBatchDrainOnPause": True,
|
|
223
|
+
"transportScope": "http",
|
|
224
|
+
},
|
|
225
|
+
execution_control_extension.params,
|
|
226
|
+
)
|
|
227
|
+
card.capabilities.extensions.append(execution_control_extension)
|
|
170
228
|
if thinking_exposure_types is not None:
|
|
171
229
|
enabled_types = format_a2a_exposure_types(thinking_exposure_types)
|
|
172
230
|
if enabled_types:
|
|
@@ -20,6 +20,7 @@ from a2a.auth.user import User
|
|
|
20
20
|
from a2a.server.context import ServerCallContext
|
|
21
21
|
from a2a.server.routes import create_jsonrpc_routes, create_rest_routes
|
|
22
22
|
from a2a.utils.constants import AGENT_CARD_WELL_KNOWN_PATH
|
|
23
|
+
from google.protobuf.json_format import MessageToDict
|
|
23
24
|
from starlette.applications import Starlette
|
|
24
25
|
from starlette.authentication import AuthCredentials, SimpleUser
|
|
25
26
|
from starlette.middleware.base import BaseHTTPMiddleware
|
|
@@ -29,6 +30,7 @@ from starlette.routing import BaseRoute, Route
|
|
|
29
30
|
|
|
30
31
|
from iac_code import __version__
|
|
31
32
|
from iac_code.a2a.agent_card import agent_card_to_client_dict
|
|
33
|
+
from iac_code.a2a.execution_control import ExecutionControlConflictError, ExecutionControlNotFoundError
|
|
32
34
|
from iac_code.a2a.jsonrpc_passthrough import (
|
|
33
35
|
install_jsonrpc_error_data_passthrough,
|
|
34
36
|
install_v03_jsonrpc_error_data_passthrough,
|
|
@@ -557,6 +559,9 @@ def create_app(
|
|
|
557
559
|
if parse_error is not None:
|
|
558
560
|
return JSONResponse({"error": parse_error}, status_code=400)
|
|
559
561
|
lean = _parse_lean(request.query_params.get("lean"))
|
|
562
|
+
include_snapshot = _parse_include_snapshot(request.query_params.get("includeSnapshot"))
|
|
563
|
+
if not include_snapshot and after_sequence is None:
|
|
564
|
+
return JSONResponse({"error": _("afterSequence must be a non-negative integer")}, status_code=400)
|
|
560
565
|
|
|
561
566
|
call_context = _call_context_from_request(request)
|
|
562
567
|
try:
|
|
@@ -580,7 +585,178 @@ def create_app(
|
|
|
580
585
|
task_id=task_id,
|
|
581
586
|
)
|
|
582
587
|
# 先裁掉不发给客户端的字段,再投影:既少发一大半字节,也少一大半要脱敏的字符串
|
|
583
|
-
return JSONResponse(
|
|
588
|
+
return JSONResponse(
|
|
589
|
+
project_a2a_data(
|
|
590
|
+
client_pipeline_state(
|
|
591
|
+
state,
|
|
592
|
+
lean=lean,
|
|
593
|
+
include_snapshot=include_snapshot,
|
|
594
|
+
after_sequence=after_sequence,
|
|
595
|
+
),
|
|
596
|
+
public_path_roots=roots,
|
|
597
|
+
)
|
|
598
|
+
)
|
|
599
|
+
|
|
600
|
+
def execution_owner(request: Request) -> str:
|
|
601
|
+
return components.task_store.owner_for_context(_call_context_from_request(request))
|
|
602
|
+
|
|
603
|
+
async def execution_control_from_request(request: Request, context_id: str):
|
|
604
|
+
service = components.execution_control_service
|
|
605
|
+
if service is None:
|
|
606
|
+
raise ExecutionControlNotFoundError("Execution control is unavailable")
|
|
607
|
+
return await service.require(
|
|
608
|
+
context_id=validate_protocol_id(context_id),
|
|
609
|
+
owner=execution_owner(request),
|
|
610
|
+
)
|
|
611
|
+
|
|
612
|
+
async def execution_error_response(exc: Exception) -> JSONResponse:
|
|
613
|
+
if isinstance(exc, ExecutionControlNotFoundError):
|
|
614
|
+
return JSONResponse({"error": str(exc)}, status_code=404)
|
|
615
|
+
if isinstance(exc, ExecutionControlConflictError):
|
|
616
|
+
return JSONResponse({"error": str(exc)}, status_code=409)
|
|
617
|
+
if isinstance(exc, (TypeError, ValueError)):
|
|
618
|
+
return JSONResponse({"error": "Invalid execution control request."}, status_code=400)
|
|
619
|
+
logger.exception("A2A execution control request failed")
|
|
620
|
+
return JSONResponse({"error": "Execution control is unavailable."}, status_code=503)
|
|
621
|
+
|
|
622
|
+
async def read_control_payload(request: Request) -> dict[str, Any]:
|
|
623
|
+
payload = await request.json()
|
|
624
|
+
if not isinstance(payload, dict):
|
|
625
|
+
raise ValueError("payload must be an object")
|
|
626
|
+
return payload
|
|
627
|
+
|
|
628
|
+
def required_string(payload: dict[str, Any], name: str) -> str:
|
|
629
|
+
value = payload.get(name)
|
|
630
|
+
if not isinstance(value, str) or not value:
|
|
631
|
+
raise ValueError(f"{name} is required")
|
|
632
|
+
return value
|
|
633
|
+
|
|
634
|
+
def required_epoch(payload: dict[str, Any]) -> int:
|
|
635
|
+
value = payload.get("connectionEpoch")
|
|
636
|
+
if isinstance(value, bool) or not isinstance(value, int):
|
|
637
|
+
raise ValueError("connectionEpoch is required")
|
|
638
|
+
return value
|
|
639
|
+
|
|
640
|
+
async def pause_execution(request: Request) -> JSONResponse:
|
|
641
|
+
try:
|
|
642
|
+
payload = await read_control_payload(request)
|
|
643
|
+
context_id = required_string(payload, "contextId")
|
|
644
|
+
control = await execution_control_from_request(request, context_id)
|
|
645
|
+
timeout = payload.get("reconnectTimeoutSeconds", 300)
|
|
646
|
+
if isinstance(timeout, bool) or not isinstance(timeout, (int, float)):
|
|
647
|
+
raise ValueError("invalid reconnect timeout")
|
|
648
|
+
state = await control.pause(
|
|
649
|
+
task_id=validate_protocol_id(required_string(payload, "taskId")),
|
|
650
|
+
expected_execution_id=validate_protocol_id(required_string(payload, "expectedExecutionId")),
|
|
651
|
+
request_id=validate_protocol_id(required_string(payload, "requestId")),
|
|
652
|
+
connection_epoch=required_epoch(payload),
|
|
653
|
+
reason=required_string(payload, "reason"),
|
|
654
|
+
reconnect_timeout_seconds=float(timeout),
|
|
655
|
+
)
|
|
656
|
+
return JSONResponse(state, status_code=200 if state["phase"] == "paused" else 202)
|
|
657
|
+
except Exception as exc:
|
|
658
|
+
return await execution_error_response(exc)
|
|
659
|
+
|
|
660
|
+
async def get_execution_state(request: Request) -> JSONResponse:
|
|
661
|
+
try:
|
|
662
|
+
context_id = request.query_params.get("contextId")
|
|
663
|
+
if not context_id:
|
|
664
|
+
raise ValueError("contextId is required")
|
|
665
|
+
control = await execution_control_from_request(request, context_id)
|
|
666
|
+
expected_execution_id = request.query_params.get("executionId")
|
|
667
|
+
pause_id = request.query_params.get("pauseId")
|
|
668
|
+
if expected_execution_id is not None and expected_execution_id != control.execution_id:
|
|
669
|
+
raise ExecutionControlConflictError("executionId does not identify the current execution")
|
|
670
|
+
if pause_id is not None and pause_id != control.pause_id:
|
|
671
|
+
raise ExecutionControlConflictError("pauseId does not identify the current pause")
|
|
672
|
+
return JSONResponse(control.snapshot())
|
|
673
|
+
except Exception as exc:
|
|
674
|
+
return await execution_error_response(exc)
|
|
675
|
+
|
|
676
|
+
async def resume_execution(request: Request) -> JSONResponse:
|
|
677
|
+
try:
|
|
678
|
+
payload = await read_control_payload(request)
|
|
679
|
+
context_id = required_string(payload, "contextId")
|
|
680
|
+
control = await execution_control_from_request(request, context_id)
|
|
681
|
+
state = await control.resume(
|
|
682
|
+
execution_id=validate_protocol_id(required_string(payload, "executionId")),
|
|
683
|
+
pause_id=validate_protocol_id(required_string(payload, "pauseId")),
|
|
684
|
+
request_id=validate_protocol_id(required_string(payload, "requestId")),
|
|
685
|
+
connection_epoch=required_epoch(payload),
|
|
686
|
+
)
|
|
687
|
+
return JSONResponse(state, status_code=200 if state["phase"] == "running" else 202)
|
|
688
|
+
except Exception as exc:
|
|
689
|
+
return await execution_error_response(exc)
|
|
690
|
+
|
|
691
|
+
async def terminate_execution(request: Request) -> JSONResponse:
|
|
692
|
+
try:
|
|
693
|
+
payload = await read_control_payload(request)
|
|
694
|
+
context_id = required_string(payload, "contextId")
|
|
695
|
+
control = await execution_control_from_request(request, context_id)
|
|
696
|
+
reason = payload.get("reason", "explicit_terminate")
|
|
697
|
+
if not isinstance(reason, str) or not reason:
|
|
698
|
+
raise ValueError("reason must be a non-empty string")
|
|
699
|
+
pause_id = payload.get("pauseId")
|
|
700
|
+
if pause_id is not None:
|
|
701
|
+
if not isinstance(pause_id, str) or not pause_id:
|
|
702
|
+
raise ValueError("pauseId must be a non-empty string")
|
|
703
|
+
pause_id = validate_protocol_id(pause_id)
|
|
704
|
+
state = await control.terminate(
|
|
705
|
+
execution_id=validate_protocol_id(required_string(payload, "expectedExecutionId")),
|
|
706
|
+
request_id=validate_protocol_id(required_string(payload, "requestId")),
|
|
707
|
+
connection_epoch=required_epoch(payload),
|
|
708
|
+
reason=reason,
|
|
709
|
+
pause_id=pause_id,
|
|
710
|
+
)
|
|
711
|
+
return JSONResponse(state, status_code=200 if state["phase"] == "terminated" else 202)
|
|
712
|
+
except Exception as exc:
|
|
713
|
+
return await execution_error_response(exc)
|
|
714
|
+
|
|
715
|
+
async def get_session_recovery(request: Request) -> JSONResponse:
|
|
716
|
+
try:
|
|
717
|
+
context_id = request.query_params.get("contextId")
|
|
718
|
+
execution_id = request.query_params.get("executionId")
|
|
719
|
+
if not context_id or not execution_id:
|
|
720
|
+
raise ValueError("contextId and executionId are required")
|
|
721
|
+
control = await execution_control_from_request(request, context_id)
|
|
722
|
+
if execution_id != control.execution_id:
|
|
723
|
+
raise ExecutionControlConflictError("executionId does not identify the current execution")
|
|
724
|
+
task_id = control.task_id
|
|
725
|
+
context_record = await components.task_store.get_context_record(context_id)
|
|
726
|
+
session_id = context_record.session_id
|
|
727
|
+
task_record = await components.task_store.get_task_record(task_id)
|
|
728
|
+
task = await components.task_store.get(task_id, _call_context_from_request(request))
|
|
729
|
+
if task is None:
|
|
730
|
+
raise ExecutionControlNotFoundError("Execution was not found")
|
|
731
|
+
messages = await asyncio.to_thread(SessionStorage().load, context_record.cwd, session_id)
|
|
732
|
+
roots = await recovery_path_roots(context_id=context_id, task_id=task_id)
|
|
733
|
+
current_context = await components.task_store.get_context_record(context_id)
|
|
734
|
+
service = components.execution_control_service
|
|
735
|
+
current_control = service.get_for_context(context_id) if service is not None else None
|
|
736
|
+
if (
|
|
737
|
+
current_control is not control
|
|
738
|
+
or control.execution_id != execution_id
|
|
739
|
+
or control.task_id != task_id
|
|
740
|
+
or current_context.session_id != session_id
|
|
741
|
+
or current_context.cwd != context_record.cwd
|
|
742
|
+
):
|
|
743
|
+
raise ExecutionControlConflictError("executionId does not identify the current execution")
|
|
744
|
+
# No awaits after identity validation: rollover must not mix a new
|
|
745
|
+
# execution's control with the task/messages read above.
|
|
746
|
+
recovery = {
|
|
747
|
+
"contextId": context_id,
|
|
748
|
+
"taskId": task_id,
|
|
749
|
+
"executionId": execution_id,
|
|
750
|
+
"revision": control.revision,
|
|
751
|
+
"executionStatus": task_record.state,
|
|
752
|
+
"outputText": list(task_record.output_text),
|
|
753
|
+
"task": MessageToDict(task, preserving_proto_field_name=False),
|
|
754
|
+
"messages": [message.to_dict() for message in messages],
|
|
755
|
+
"executionControl": control.snapshot(),
|
|
756
|
+
}
|
|
757
|
+
return JSONResponse(project_a2a_data(recovery, public_path_roots=roots))
|
|
758
|
+
except Exception as exc:
|
|
759
|
+
return await execution_error_response(exc)
|
|
584
760
|
|
|
585
761
|
routes: list[BaseRoute] = [
|
|
586
762
|
Route("/health", health, methods=["GET"]),
|
|
@@ -588,6 +764,11 @@ def create_app(
|
|
|
588
764
|
Route("/iac-code/readiness", get_readiness, methods=["GET"]),
|
|
589
765
|
Route("/iac-code/session/ensure-restored", ensure_session_restored, methods=["POST"]),
|
|
590
766
|
Route("/iac-code/pipeline/state", get_pipeline_state, methods=["GET"]),
|
|
767
|
+
Route("/iac-code/execution/pause", pause_execution, methods=["POST"]),
|
|
768
|
+
Route("/iac-code/execution/state", get_execution_state, methods=["GET"]),
|
|
769
|
+
Route("/iac-code/execution/resume", resume_execution, methods=["POST"]),
|
|
770
|
+
Route("/iac-code/execution/terminate", terminate_execution, methods=["POST"]),
|
|
771
|
+
Route("/iac-code/session/recovery", get_session_recovery, methods=["GET"]),
|
|
591
772
|
]
|
|
592
773
|
install_jsonrpc_error_data_passthrough()
|
|
593
774
|
jsonrpc_endpoint = create_jsonrpc_routes(components.handler, rpc_url="/", enable_v0_3_compat=True)[0].endpoint
|
|
@@ -600,6 +781,7 @@ def create_app(
|
|
|
600
781
|
routes.append(Route("/", handle_jsonrpc, methods=["POST"]))
|
|
601
782
|
routes.extend(create_rest_routes(components.handler, enable_v0_3_compat=True))
|
|
602
783
|
app = Starlette(routes=routes, lifespan=lifespan)
|
|
784
|
+
app.state.a2a_components = components
|
|
603
785
|
app.add_middleware(A2AProjectionMiddleware, task_store=components.task_store)
|
|
604
786
|
app.add_middleware(
|
|
605
787
|
A2AAuthMiddleware,
|
|
@@ -643,6 +825,19 @@ def _parse_lean(value: str | None) -> bool:
|
|
|
643
825
|
return False
|
|
644
826
|
|
|
645
827
|
|
|
828
|
+
def _parse_include_snapshot(value: str | None) -> bool:
|
|
829
|
+
"""Default to the compatible full response unless omission is explicit."""
|
|
830
|
+
|
|
831
|
+
if value is None or value == "":
|
|
832
|
+
return True
|
|
833
|
+
normalized = value.strip().lower()
|
|
834
|
+
if normalized in {"0", "false"}:
|
|
835
|
+
return False
|
|
836
|
+
if normalized not in _LEAN_TRUTHY_VALUES:
|
|
837
|
+
logger.warning("Ignoring unrecognized pipeline state includeSnapshot value %r", value)
|
|
838
|
+
return True
|
|
839
|
+
|
|
840
|
+
|
|
646
841
|
def _parse_after_sequence(value: str | None) -> tuple[int | None, str | None]:
|
|
647
842
|
if value is None or value == "":
|
|
648
843
|
return None, None
|
|
@@ -1,24 +1,64 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
-
import
|
|
4
|
+
import inspect
|
|
5
5
|
import logging
|
|
6
|
-
from collections.abc import Callable
|
|
7
|
-
from typing import Any
|
|
6
|
+
from collections.abc import Awaitable, Callable
|
|
7
|
+
from typing import Any, ParamSpec, TypeVar, cast
|
|
8
8
|
|
|
9
9
|
from iac_code.i18n import _
|
|
10
10
|
from iac_code.services.session_backup import BackupReason, SessionBackupBlocked
|
|
11
11
|
from iac_code.services.session_backup_state import BackupPublicationProof
|
|
12
12
|
|
|
13
13
|
logger = logging.getLogger(__name__)
|
|
14
|
+
_P = ParamSpec("_P")
|
|
15
|
+
_T = TypeVar("_T")
|
|
14
16
|
|
|
15
17
|
|
|
16
|
-
async def
|
|
18
|
+
async def await_fenced(awaitable: Awaitable[_T]) -> _T:
|
|
19
|
+
"""Finish an owned cleanup/commit before propagating cancellation to its caller."""
|
|
20
|
+
task = asyncio.ensure_future(awaitable)
|
|
21
|
+
try:
|
|
22
|
+
return await asyncio.shield(task)
|
|
23
|
+
except asyncio.CancelledError:
|
|
24
|
+
while not task.done():
|
|
25
|
+
try:
|
|
26
|
+
await asyncio.shield(task)
|
|
27
|
+
except asyncio.CancelledError:
|
|
28
|
+
continue
|
|
29
|
+
except Exception:
|
|
30
|
+
break
|
|
31
|
+
if not task.cancelled():
|
|
32
|
+
task.exception()
|
|
33
|
+
raise
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
async def run_sync_fenced(function: Callable[_P, _T], /, *args: _P.args, **kwargs: _P.kwargs) -> _T:
|
|
17
37
|
"""Delay coroutine cancellation until the synchronous mutation has actually stopped."""
|
|
38
|
+
return await _run_sync_fenced(function, None, args, kwargs)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
async def run_sync_fenced_with_cancel_completion(
|
|
42
|
+
function: Callable[_P, _T],
|
|
43
|
+
on_cancel_completion: Callable[[_T | None, BaseException | None], Awaitable[None] | None],
|
|
44
|
+
/,
|
|
45
|
+
*args: _P.args,
|
|
46
|
+
**kwargs: _P.kwargs,
|
|
47
|
+
) -> _T:
|
|
48
|
+
"""Fence a synchronous mutation and save its late result before propagating cancellation."""
|
|
49
|
+
return cast(_T, await _run_sync_fenced(function, on_cancel_completion, args, kwargs))
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
async def _run_sync_fenced(
|
|
53
|
+
function: Callable[..., _T],
|
|
54
|
+
on_cancel_completion: Callable[[_T | None, BaseException | None], Awaitable[None] | None] | None,
|
|
55
|
+
args: tuple[Any, ...],
|
|
56
|
+
kwargs: dict[str, Any],
|
|
57
|
+
) -> _T:
|
|
18
58
|
thread_task = asyncio.create_task(asyncio.to_thread(function, *args, **kwargs))
|
|
19
59
|
try:
|
|
20
60
|
return await asyncio.shield(thread_task)
|
|
21
|
-
except asyncio.CancelledError:
|
|
61
|
+
except asyncio.CancelledError as cancellation:
|
|
22
62
|
while not thread_task.done():
|
|
23
63
|
try:
|
|
24
64
|
await asyncio.shield(thread_task)
|
|
@@ -26,10 +66,27 @@ async def run_sync_fenced(function: Callable[..., Any], /, *args: Any, **kwargs:
|
|
|
26
66
|
continue
|
|
27
67
|
except Exception:
|
|
28
68
|
break
|
|
69
|
+
result: _T | None = None
|
|
70
|
+
error: BaseException | None = None
|
|
29
71
|
if thread_task.done() and not thread_task.cancelled():
|
|
30
|
-
|
|
31
|
-
thread_task.result()
|
|
32
|
-
|
|
72
|
+
try:
|
|
73
|
+
result = thread_task.result()
|
|
74
|
+
except BaseException as exc:
|
|
75
|
+
error = exc
|
|
76
|
+
if on_cancel_completion is not None:
|
|
77
|
+
try:
|
|
78
|
+
completion = on_cancel_completion(result, error)
|
|
79
|
+
if inspect.isawaitable(completion):
|
|
80
|
+
completion_task = asyncio.ensure_future(completion)
|
|
81
|
+
while not completion_task.done():
|
|
82
|
+
try:
|
|
83
|
+
await asyncio.shield(completion_task)
|
|
84
|
+
except asyncio.CancelledError:
|
|
85
|
+
continue
|
|
86
|
+
completion_task.result()
|
|
87
|
+
except BaseException:
|
|
88
|
+
logger.exception("Failed to record a synchronous mutation result returned during cancellation")
|
|
89
|
+
raise cancellation
|
|
33
90
|
|
|
34
91
|
|
|
35
92
|
async def backup_session_async(
|
|
@@ -108,6 +108,14 @@ def _extract_parts_text(message: Any) -> str:
|
|
|
108
108
|
return "".join(pieces)
|
|
109
109
|
|
|
110
110
|
|
|
111
|
+
def _validated_extension_response(response: Any, name: str) -> dict[str, Any]:
|
|
112
|
+
response.raise_for_status()
|
|
113
|
+
data = response.json()
|
|
114
|
+
if not isinstance(data, dict):
|
|
115
|
+
raise ValueError(f"A2A {name} response must be a JSON object")
|
|
116
|
+
return data
|
|
117
|
+
|
|
118
|
+
|
|
111
119
|
class A2AClient:
|
|
112
120
|
def __init__(
|
|
113
121
|
self,
|
|
@@ -306,11 +314,16 @@ class A2AClient:
|
|
|
306
314
|
*,
|
|
307
315
|
task_id: str,
|
|
308
316
|
after_sequence: int | None = None,
|
|
317
|
+
include_snapshot: bool = True,
|
|
309
318
|
) -> dict[str, Any] | None:
|
|
310
|
-
"""Read
|
|
319
|
+
"""Read an A2A pipeline snapshot or a cursor-based event delta over HTTP."""
|
|
311
320
|
|
|
321
|
+
if not include_snapshot and after_sequence is None:
|
|
322
|
+
raise ValueError("after_sequence is required when include_snapshot is False")
|
|
312
323
|
endpoint = url.rstrip("/") + "/iac-code/pipeline/state"
|
|
313
324
|
params = _without_none({"taskId": task_id, "afterSequence": after_sequence})
|
|
325
|
+
if not include_snapshot:
|
|
326
|
+
params["includeSnapshot"] = "false"
|
|
314
327
|
response = await self._http_client.get(endpoint, params=params, headers=self._jsonrpc_headers())
|
|
315
328
|
if response.status_code == 404:
|
|
316
329
|
return None
|
|
@@ -358,6 +371,127 @@ class A2AClient:
|
|
|
358
371
|
raise ValueError("A2A session restore response must report a ready session")
|
|
359
372
|
return True
|
|
360
373
|
|
|
374
|
+
async def pause_execution(
|
|
375
|
+
self,
|
|
376
|
+
url: str,
|
|
377
|
+
*,
|
|
378
|
+
context_id: str,
|
|
379
|
+
task_id: str,
|
|
380
|
+
execution_id: str,
|
|
381
|
+
request_id: str,
|
|
382
|
+
connection_epoch: int,
|
|
383
|
+
reason: str = "client_disconnected",
|
|
384
|
+
reconnect_timeout_seconds: float = 300,
|
|
385
|
+
) -> dict[str, Any]:
|
|
386
|
+
return await self._execution_control_post(
|
|
387
|
+
url,
|
|
388
|
+
"pause",
|
|
389
|
+
{
|
|
390
|
+
"contextId": context_id,
|
|
391
|
+
"taskId": task_id,
|
|
392
|
+
"expectedExecutionId": execution_id,
|
|
393
|
+
"requestId": request_id,
|
|
394
|
+
"connectionEpoch": connection_epoch,
|
|
395
|
+
"reason": reason,
|
|
396
|
+
"reconnectTimeoutSeconds": reconnect_timeout_seconds,
|
|
397
|
+
},
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
async def get_execution_state(
|
|
401
|
+
self,
|
|
402
|
+
url: str,
|
|
403
|
+
*,
|
|
404
|
+
context_id: str,
|
|
405
|
+
execution_id: str | None = None,
|
|
406
|
+
pause_id: str | None = None,
|
|
407
|
+
) -> dict[str, Any]:
|
|
408
|
+
endpoint = url.rstrip("/") + "/iac-code/execution/state"
|
|
409
|
+
response = await self._http_client.get(
|
|
410
|
+
endpoint,
|
|
411
|
+
params=_without_none(
|
|
412
|
+
{
|
|
413
|
+
"contextId": context_id,
|
|
414
|
+
"executionId": execution_id,
|
|
415
|
+
"pauseId": pause_id,
|
|
416
|
+
}
|
|
417
|
+
),
|
|
418
|
+
headers=self._jsonrpc_headers(),
|
|
419
|
+
)
|
|
420
|
+
return _validated_extension_response(response, "execution state")
|
|
421
|
+
|
|
422
|
+
async def resume_execution(
|
|
423
|
+
self,
|
|
424
|
+
url: str,
|
|
425
|
+
*,
|
|
426
|
+
context_id: str,
|
|
427
|
+
execution_id: str,
|
|
428
|
+
pause_id: str,
|
|
429
|
+
request_id: str,
|
|
430
|
+
connection_epoch: int,
|
|
431
|
+
) -> dict[str, Any]:
|
|
432
|
+
return await self._execution_control_post(
|
|
433
|
+
url,
|
|
434
|
+
"resume",
|
|
435
|
+
{
|
|
436
|
+
"contextId": context_id,
|
|
437
|
+
"executionId": execution_id,
|
|
438
|
+
"pauseId": pause_id,
|
|
439
|
+
"requestId": request_id,
|
|
440
|
+
"connectionEpoch": connection_epoch,
|
|
441
|
+
},
|
|
442
|
+
)
|
|
443
|
+
|
|
444
|
+
async def terminate_execution(
|
|
445
|
+
self,
|
|
446
|
+
url: str,
|
|
447
|
+
*,
|
|
448
|
+
context_id: str,
|
|
449
|
+
execution_id: str,
|
|
450
|
+
request_id: str,
|
|
451
|
+
connection_epoch: int,
|
|
452
|
+
reason: str = "explicit_terminate",
|
|
453
|
+
pause_id: str | None = None,
|
|
454
|
+
) -> dict[str, Any]:
|
|
455
|
+
return await self._execution_control_post(
|
|
456
|
+
url,
|
|
457
|
+
"terminate",
|
|
458
|
+
_without_none(
|
|
459
|
+
{
|
|
460
|
+
"contextId": context_id,
|
|
461
|
+
"expectedExecutionId": execution_id,
|
|
462
|
+
"requestId": request_id,
|
|
463
|
+
"connectionEpoch": connection_epoch,
|
|
464
|
+
"reason": reason,
|
|
465
|
+
"pauseId": pause_id,
|
|
466
|
+
}
|
|
467
|
+
),
|
|
468
|
+
)
|
|
469
|
+
|
|
470
|
+
async def get_session_recovery(
|
|
471
|
+
self,
|
|
472
|
+
url: str,
|
|
473
|
+
*,
|
|
474
|
+
context_id: str,
|
|
475
|
+
execution_id: str,
|
|
476
|
+
) -> dict[str, Any]:
|
|
477
|
+
endpoint = url.rstrip("/") + "/iac-code/session/recovery"
|
|
478
|
+
response = await self._http_client.get(
|
|
479
|
+
endpoint,
|
|
480
|
+
params={"contextId": context_id, "executionId": execution_id},
|
|
481
|
+
headers=self._jsonrpc_headers(),
|
|
482
|
+
)
|
|
483
|
+
return _validated_extension_response(response, "session recovery")
|
|
484
|
+
|
|
485
|
+
async def _execution_control_post(
|
|
486
|
+
self,
|
|
487
|
+
url: str,
|
|
488
|
+
action: str,
|
|
489
|
+
payload: dict[str, Any],
|
|
490
|
+
) -> dict[str, Any]:
|
|
491
|
+
endpoint = url.rstrip("/") + f"/iac-code/execution/{action}"
|
|
492
|
+
response = await self._http_client.post(endpoint, json=payload, headers=self._jsonrpc_headers())
|
|
493
|
+
return _validated_extension_response(response, f"execution {action}")
|
|
494
|
+
|
|
361
495
|
async def list_tasks(
|
|
362
496
|
self,
|
|
363
497
|
url: str,
|